From 2acdf44a7f3085e53fc035faeb57c9dde8ae3a58 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 11 May 2026 08:42:36 -0500 Subject: [PATCH] chore: import from github.com/twx284558/ledcontrol --- .../serialport/utils/SerialCardControl.java | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 serialport/src/main/java/android/serialport/utils/SerialCardControl.java diff --git a/serialport/src/main/java/android/serialport/utils/SerialCardControl.java b/serialport/src/main/java/android/serialport/utils/SerialCardControl.java new file mode 100644 index 0000000..1dea8b2 --- /dev/null +++ b/serialport/src/main/java/android/serialport/utils/SerialCardControl.java @@ -0,0 +1,200 @@ +cGFja2FnZSBhbmRyb2lkLnNlcmlhbHBvcnQudXRpbHM7CgppbXBvcnQgc3RhdGljIGFuZHJvaWQu +c2VyaWFscG9ydC51dGlscy5CeXRlVXRpbC5yZWFkQmluYXJ5RmlsZTsKaW1wb3J0IHN0YXRpYyBh +bmRyb2lkLnNlcmlhbHBvcnQudXRpbHMuQnl0ZVV0aWwudW5ib3VuZGVkUXVldWU7CgppbXBvcnQg +YW5kcm9pZC5hcHAuQXBwbGljYXRpb247CmltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CmltcG9y +dCBhbmRyb2lkLm9zLk1lc3NhZ2U7CmltcG9ydCBhbmRyb2lkLnNlcmlhbHBvcnQuU2VyaWFsUG9y +dDsKaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CmltcG9ydCBhbmRyb2lkLnV0aWwuTG9n +OwoKaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKCmltcG9ydCBqYXZhLmlvLkZp +bGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVh +bTsKaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVn +ZXI7CmltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CmltcG9ydCBqYXZh +LnNlY3VyaXR5LkludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJy +YXlMaXN0OwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsK +CnB1YmxpYyBjbGFzcyBTZXJpYWxDYXJkQ29udHJvbCB7CiAgICBzdGF0aWMgQXBwbGljYXRpb24g +bUFwcGxpY2F0aW9uOwogICAgcHJpdmF0ZSBzdGF0aWMgU2VyaWFsQ2FyZENvbnRyb2wgc2VyaWFs +Q2FyZENvbnRyb2w7CiAgICBwcml2YXRlIHN0YXRpYyBIYW5kbGVyIG1IYW5kbGVyOwogICAgc3Rh +dGljIGludCBNU0dfUmRBc3luQ21kU3RhdHVzID0gMTAwOwogICAgU3RyaW5nIEdldEluc1Byb3Bz +ID0gIi9HZXRJbnNQcm9wczpoLDE7IjsKICAgIFN0cmluZyBXZElucyA9ICIvV2RJbnM6aCwwLCI7 +CiAgICBTdHJpbmcgSW5zUGFyYW1zID0gIi9JbnNQYXJhbXM6aCwwLDMsZjsiOwogICAgc3RhdGlj +IFN0cmluZyBSZEFzeW5DbWRTdGF0dXMgPSAiL1JkQXN5bkNtZFN0YXR1czpoLDE7IjsKCiAgICBT +dHJpbmcgY3VycmVudENtZCA9ICIiOwogICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbU91dHB1dFN0 +cmVhbSA9IG51bGw7CiAgICBwcml2YXRlIElucHV0U3RyZWFtIG1JbnB1dFN0cmVhbSA9IG51bGw7 +CiAgICBwcml2YXRlIFJlYWRUaHJlYWQgbVJlYWRUaHJlYWQgPSBudWxsOwogICAgU3RyaW5nQnVm +ZmVyIGRhdGFCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBTdHJpbmdbXSBjb250ZW50 +cyA9bnVsbDsKICAgIFN0cmluZyBhZGRyZXNzSW5kZXggPSAiIjsKICAgIHByaXZhdGUgU2VyaWFs +UG9ydCBtU2VyaWFsUG9ydCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUYXNrIGV4Y3V0ZSByZXN1 +bHQKICAgICAqLwogICAgcHJpdmF0ZSBUYXNrRXhjdXRlUmVzdWx0IHRhc2tFeGN1dGVSZXN1bHQ7 + +ICAgIC8qKgogICAgICogZmluZCB0aGUgYXZhaWxhYmxlIHBvcnQKICAgICAqLwogICAgU3RyaW5n +IGF2YWlsYWJsZVBvcnQgPSAiIjsKCiAgICAvKioKICAgICAqIGZvciBjb25zdHJ1Y3QgbXV0aS1j +b21tYW5kIGFuZCBieSBvcmRlcgogICAgICogKi8KICAgIExpbmtlZEJsb2NraW5nUXVldWU8U3Ry +aW5nPiBjb21tYW5kUXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxTdHJpbmc+KCk7Cgog +ICAgLyoqCiAgICAgKiBnZXQgdGhlIFNlcmlhbCBpbnN0YW5jZQogICAgICogQHBhcmFtIGFwcGxp +Y2F0aW9uCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU2VyaWFsQ2Fy +ZENvbnRyb2wgZ2V0U2VyaWFsSW5zdGFuY2UoQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKICAg +ICAgICBtQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKICAgICAgICBpZiAobnVsbCA9PSBzZXJp +YWxDYXJkQ29udHJvbCkgewogICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BcHBs +aWNhdGlvbi5nZXRNYWluTG9vcGVyKCkpewogICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAg +ICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKEBOb25OdWxsIE1lc3NhZ2UgbXNn +KSB7CiAgICAgICAgICAgICAgICAgICAgaWYobXNnLndoYXQgPT0gTVNHX1JkQXN5bkNtZFN0YXR1 +cyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sLnNlbmRUb1Nlcmlh +bENvbW1hbmQoc2VyaWFsQ2FyZENvbnRyb2wuZ2V0UHJvdG9jb2xCeXRlcyhSZEFzeW5DbWRTdGF0 +dXMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg +IH07CiAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sID0gbmV3IFNlcmlhbENhcmRDb250cm9s +KCk7CiAgICAgICAgICAgIHNlcmlhbENhcmRDb250cm9sLmluaXRTZXJpYWxQb3J0KHRydWUpOwog +ICAgICAgIH0KICAgICAgICByZXR1cm4gc2VyaWFsQ2FyZENvbnRyb2w7CiAgICB9CgoKICAgIC8q +KgogICAgICogc2VuZCBjb25maWcgZmlsZSB0byBjb250cm9sIGNhcmQKICAgICAqIEBwYXJhbSBm +aWxlUGF0aAogICAgICogQHBhcmFtIHRhc2tFeGN1dGVSZXN1bHQKICAgICAqLwogICAgcHVibGlj +IHZvaWQgc2VuZENvbmZpZ0ZpbGVUb0NvbnRyb2xDYXJkKFN0cmluZyBmaWxlUGF0aCxUYXNrRXhj +dXRlUmVzdWx0IHRhc2tFeGN1dGVSZXN1bHQpewogICAgICAgIHRoaXMudGFza0V4Y3V0ZVJlc3Vs +dCA9IHRhc2tFeGN1dGVSZXN1bHQ7CiAgICAgICAgaWYoIW5ldyBGaWxlKGZpbGVQYXRoKS5leGlz +dHMoKSB8fCBuZXcgRmlsZShmaWxlUGF0aCkubGVuZ3RoKCkgPD0gMTAyNCl7CiAgICAgICAgICAg +IExvZy5pKCJSb2NreSIsImZpbGUgaXMgbm90IGV4c2l0Iik7CiAgICAgICAgICAgIGlmKG51bGwg +IT0gdGFza0V4Y3V0ZVJlc3VsdCkgewogICAgICAgICAgICAgICAgdGFza0V4Y3V0ZVJlc3VsdC5m +YWlsKCJmaWxlIGlzIG5vdCBleHNpdCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVy +bjsKICAgICAgICB9CiAgICAgICAgaWYoVGV4dFV0aWxzLmlzRW1wdHkoYXZhaWxhYmxlUG9ydCkp +ewogICAgICAgICAgICBMb2cuaSgiUm9ja3kiLCJwb3J0IGlzIG5vdCBleHNpdCIpOwogICAgICAgI +CAgICBpZihudWxsICE9IHRhc2tFeGN1dGVSZXN1bHQpIHsKICAgICAgICAgICAgICAgIHRhc2tF +eGN1dGVSZXN1bHQuZmFpbCgicG9ydCBpcyBub3QgZXhzaXQiKTsKICAgICAgICAgICAgfQogICAg +ICAgIH0KICAgICAgICByZWFkQmluYXJ5RmlsZShmaWxlUGF0aCk7CiAgICAgICAgY29tbWFuZFF1 +ZXVlLmFkZChHZXRJbnNQcm9wcyk7CiAgICAgICAgZm9yKGludCBpPSAwIDtpPHVuYm91bmRlZFF1 +ZXVlLnNpemUoKTtpKyspIHsKICAgICAgICAgICAgY29tbWFuZFF1ZXVlLmFkZChXZElucyk7CiAg +ICAgICAgfQogICAgICAgIGNvbW1hbmRRdWV1ZS5hZGQoSW5zUGFyYW1zKTsKICAgICAgICBTdHJp +bmcgY21kID0gY29tbWFuZFF1ZXVlLnBvbGwoKTsKICAgICAgICBzZW5kVG9TZXJpYWxDb21tYW5k +KGdldFByb3RvY29sQnl0ZXMoY21kKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBpbml0IHNlcmlh +bCBwb3J0CiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBpbml0U2VyaWFsUG9ydChCb29sZWFuIG5l +ZWRTdGFydFRocmVhZCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG1TZXJpYWxQb3J0ID0g +Z2V0U2VyaWFsUG9ydCgpOwogICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gbVNlcmlhbFBvcnQu +Z2V0T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgIG1JbnB1dFN0cmVhbSA9IG1TZXJpYWxQb3J0 +LmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgICAgIGlmIChuZWVkU3RhcnRUaHJlYWQpIHsKICAg +ICAgICAgICAgICAgIG1SZWFkVGhyZWFkID0gbmV3IFJlYWRUaHJlYWQoKTsKICAgICAgICAgICAg +ICAgIG1SZWFkVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChT +ZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAg +ICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tU +cmFjZSgpOwogICAgICAgIH0gY2F0Y2ggKEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24gZSkgewog +ICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioK +ICAgICAqIGdldCBhdmFpbGFibGUgcG9ydAogICAgICogQHJldHVybgogICAgICogQHRocm93cyBJ +T0V4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIFNlcmlhbFBvcnQgZ2V0U2VyaWFsUG9ydCgp +IHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaWYgKG1TZXJpYWxQb3J0ID09IG51bGwpIHsK +ICAgICAgICAgICAgLyogUmVhZCBzZXJpYWwgcG9ydCBwYXJhbWV0ZXJzICovCiAgICAgICAgICAg +IGF2YWlsYWJsZVBvcnQgPSAiIjsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTxJbnRlZ2VyLk1B +WF9WQUxVRTtpKyspewogICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoImRldi90 +dHlVU0IiK2kpOwogICAgICAgICAgICAgICAgaWYoZmlsZS5leGlzdHMoKSl7CiAgICAgICAgICAg +ICAgICAgICAgYXZhaWxhYmxlUG9ydCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAg +ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg +ICAgICAgU3RyaW5nIHBhdGggPSBhdmFpbGFibGVQb3J0OwogICAgICAgICAgICBTZXJpYWxQb3J0 +IHNlcmlhbFBvcnQgPQogICAgICAgICAgICAgICAgICAgIFNlcmlhbFBvcnQgLy8KICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIC5uZXdCdWlsZGVyKHBhdGgsIDExNTIwMCkucGFyaXR5KDApLmRh +dGFCaXRzKDgpLnN0b3BCaXRzKDEpLmJ1aWxkKCk7CiAgICAgICAgICAgIG1TZXJpYWxQb3J0ID0g +c2VyaWFsUG9ydDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1TZXJpYWxQb3J0OwogICAgfQoK +CiAgICAvKioKICAgICAqIHJlYWQgdGhlIGRhdGEgZnJvbSBzZXJpYWwgcG9ydAogICAgICovCiAg +ICBjbGFzcyBSZWFkVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICAgICBAT3ZlcnJpZGUKICAg +ICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgIHN1cGVyLnJ1bigpOwogICAgICAg +ICAgICB3aGlsZSAoIWlzSW50ZXJydXB0ZWQoKSkgewogICAgICAgICAgICAgICAgaW50IHNpemU7 +CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIg +PSBuZXcgYnl0ZVsxMjhdOwogICAgICAgICAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0g +bnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gbUlucHV0U3RyZWFtLnJlYWQo +YnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExv +Z2dlci5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50ID4+ +PiBTZW5kIGNvbW1hbmQgMTExIHJlY2VpdmVyIDogIiwgQnl0ZVV0aWwuYnl0ZXNUb0hleFdpdGhT +cGFjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVm +ZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBT +dHJpbmcgdGVtcCA9IEJ5dGVVdGlsLmJ5dGVzVG9IZXhXaXRoU3BhY2UoYnVmZmVyKTsKICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWdub3JlWmVybyA9IHRlbXAuc3Vic3Ry +aW5nKDAsIHRlbXAuaW5kZXhPZigiMDAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgTG9nZ2VyLmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJp +bnQgPj4+IFNlbmQgY29tbWFuZCBlZ25vcmVaZXJvIHJlY2VpdmVyIDogJGVnbm9yZVplcm8iCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICBpZiAoZWdub3JlWmVyby5jb250YWlucygiM0IiKSkgewogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hvbGVSZXN1bHQgPSBkYXRhQnVmZmVyLnRvU3Ry +aW5nKCkgKyBlZ25vcmVaZXJvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM +b2dnZXIuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJp +bnQgPj4+IFNlbmQgY29tbWFuZCAyMjIgcmVjZWl2ZXIgOiAkd2hvbGVSZXN1bHQiCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIHBhcnNlUmVzdWx0KHdob2xlUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgZGF0YUJ1ZmZlci5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI +CAgZGF0YUJ1ZmZlci5hcHBlbmQoZWdub3JlWmVybyk7CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv +biBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2Uo +KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQog +ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9u +IGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQg +c2VuZFRvU2VyaWFsQ29tbWFuZChieXRlW10gY29tbWFuZCkgewogICAgICAgIHRyeSB7CiAgICAg +ICAgICAgIExvZ2dlci5kKAogICAgICAgICAgICAgICAgICAgICJQcmludCA+Pj4gU2VuZCBjb21t +YW5kIDExMSBoZWFydGJlYXQ6IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlVXRp +bC5ieXRlc1RvSGV4V2l0aFNwYWNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgdHJ5 +IHsKICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtID09IG51bGwpIHsKICAgICAgICAg +ICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gbVNlcmlhbFBvcnQuZ2V0T3V0cHV0U3RyZWFtKCk7 +CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtT3V0cHV0U3Ry +ZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShjb21tYW5kKTsK +ICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLmZsdXNoKCk7CiAgICAgICAgICAgICAg +ICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBl +LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSAgY2F0Y2ggKEV4Y2Vw +dGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQoKICAg +IH0KCiAgICAvKioKICAgICAqIHBhcnNlIHRoZSByZXN1bHQgZnJvbSB0aGUgc2VyaWFsIHBvcnQK +ICAgICAqIEBwYXJhbSB3aG9sZVJlc3VsdAogICAgICovCiAgICBwcml2YXRlIHZvaWQgcGFyc2VS +ZXN1bHQoU3RyaW5nIHdob2xlUmVzdWx0KSB7CiAgICAgICAgU3RyaW5nW10gY29udGVudD1udWxs +OwogICAgICAgIFN0cmluZyBzdHIgPSAiIjsKICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJp +bmcgaW5mbyA9IHdob2xlUmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGJ5dGVbXSBieXRl +cyA9IG5ldyBCaWdJbnRlZ2VyKGluZm8sIDE2KS50b0J5dGVBcnJheSgpOwogICAgICAgICAgICBz +dHIgPSBuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAg +ICAgY29udGVudCA9IHN0ci5zcGxpdCgiLCIpOwogICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGUp +e2UucHJpbnRTdGFja1RyYWNlKCk7fQogICAgICAgIExvZy5pKCJSb2NreSIsImFjayBkYXRhIGlz +ICIrc3RyKyIgY3VycmVudENtZCAiK2N1cnJlbnRDbWQpOwogICAgICAgIGlmKFRleHRVdGlscy5l +cXVhbHMoR2V0SW5zUHJvcHMsY3VycmVudENtZCkpewogICAgICAgICAgICBjb250ZW50cyA9IGNv +bnRlbnQ7CiAgICAgICAgICAgIGFkZHJlc3NJbmRleCA9IGNvbnRlbnRzWzRdOwogICAgICAgIH0g +ZWxzZSBpZihUZXh0VXRpbHMuZXF1YWxzKFJkQXN5bkNtZFN0YXR1cyxjdXJyZW50Q21kKSl7CiAg +ICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoIjAi +LCBjb250ZW50WzJdKSkgewogICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1l +c3NhZ2VEZWxheWVkKE1TR19SZEFzeW5DbWRTdGF0dXMsIDIwMDApOwogICAgICAgICAgICAgICAg +fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBMb2cuaSgiUm9ja3kiLCAiTVNHX1JkQXN5bkNt +ZFN0YXR1cyBzdWNjZXNzPj4+Iik7CiAgICAgICAgICAgICAgICAgICAgaWYobnVsbCAhPSB0YXNr +RXhjdXRlUmVzdWx0KQogICAgICAgICAgICAgICAgICAgICAgICB0YXNrRXhjdXRlUmVzdWx0LnN1 +Y2Nlc3MoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWNhdGNoIChFeGNlcHRpb24g +ZSl7CiAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0df +UmRBc3luQ21kU3RhdHVzLCAyMDAwKTsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNl +KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoY3VycmVudENtZC5zdGFydHNX +aXRoKCIvV2RJbnMiKSAmJiB1bmJvdW5kZWRRdWV1ZS5zaXplKCk8PTApewogICAgICAgICAgICBM +b2cuaSgiUm9ja3kiLCJzZW5kIHdkaW5zIGNvbW1hbmQgZG9uZSB3ZSBjaGVjayB0aGUgcmVzdWx0 +IG9mIHdkaW5zID4+Pj4+Iik7CiAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VE +ZWxheWVkKE1TR19SZEFzeW5DbWRTdGF0dXMsMjAwMCk7CiAgICAgICAgfQogICAgICAgIE9iamVj +dCBjb21tYW5kID0gY29tbWFuZFF1ZXVlLnBvbGwoKTsKICAgICAgICBpZihudWxsID09IGNvbW1h +bmQpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIExvZy5pKCJSb2NreSIs +ImNvbW1hbmRRdWV1ZSAiK2NvbW1hbmQgKyAiIGNvbW1hbmQgc3RhcnQgIit1bmJvdW5kZWRRdWV1 +ZS5zaXplKCkpOwogICAgICAgIGlmKGNvbW1hbmQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCIvV2RJ +bnMiKSAmJiB1bmJvdW5kZWRRdWV1ZS5zaXplKCkgPjApewogICAgICAgICAgICBTdHJpbmdCdWZm +ZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+ +IGMgPSB1bmJvdW5kZWRRdWV1ZS5wb2xsKCk7CiAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7aTxj +LnNpemUoKTtpKyspewogICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMuZ2V0KGkpKTsKICAgICAg +ICAgICAgICAgIGlmKGkgIT0gYy5zaXplKCktMSl7CiAgICAgICAgICAgICAgICAgICAgc2IuYXBw +ZW5kKCIsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3Ry +aW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoYy5zaXplKCkpLnRvVXBwZXJDYXNl +KCk7CiAgICAgICAgICAgIGludCBzaXpldGFnID0gSW50ZWdlci5wYXJzZUludChoZXhTdHJpbmcs +MTYpOwogICAgICAgICAgICBXZElucyA9IGNvbW1hbmQrYWRkcmVzc0luZGV4KyIsIitoZXhTdHJp +bmcrIiwiKyBzYiArIjsiOwogICAgICAgICAgICBzZW5kVG9TZXJpYWxDb21tYW5kKGdldFByb3Rv +Y29sQnl0ZXMoV2RJbnMpKTsKICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGFkZEhleChhZGRy +ZXNzSW5kZXgsaGV4U3RyaW5nKTsKICAgICAgICAgICAgaW50IGZpcnN0QWRkcmVzcyA9IEludGVn +ZXIucGFyc2VJbnQoYWRkcmVzc0luZGV4LDE2KTsKICAgICAgICAgICAgaW50IGZpbmFsQWRkcmVz +cyA9IGZpcnN0QWRkcmVzcyArIGMuc2l6ZSgpOwogICAgICAgICAgICBTdHJpbmcgcmVzdWx0SGV4 +ID0gSW50ZWdlci50b0hleFN0cmluZyhmaW5hbEFkZHJlc3MpLnRvVXBwZXJDYXNlKCk7CiAgICAg +ICAgICAgIGFkZHJlc3NJbmRleCA9IFN0cmluZy52YWx1ZU9mKHJlc3VsdEhleCk7CiAgICAgICAg +ICAgIExvZy5pKCJSb2NreSIsIj4+PldkSW5zMjIyICIrV2RJbnMrIiBhZGRyZXNzSW5kZXggIith +ZGRyZXNzSW5kZXggKyIgc2l6ZSBpcyAiK2Muc2l6ZSgpKTsKICAgICAgICB9CiAgICAgICAgZWxz +ZSBpZihjb21tYW5kLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiL0luc1BhcmFtcyIpKXsKICAgICAg +ICAgICAgc2VuZFRvU2VyaWFsQ29tbWFuZChnZXRQcm90b2NvbEJ5dGVzKEluc1BhcmFtcykpOwog +ICAgICAgIH0KICAgIH0KICAgIHB1YmxpYyBieXRlW10gZ2V0UHJvdG9jb2xCeXRlcyhTdHJpbmcg +Y21kKXsKICAgICAgICBjdXJyZW50Q21kID0gY21kOwogICAgICAgIGJ5dGVbXSBieXRlQXJyYXkg +PSBjdXJyZW50Q21kLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgICAgIHJl +dHVybiBieXRlQXJyYXk7CiAgICB9CiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRIZXgoU3Ry +aW5nIGhleDEgLFN0cmluZyBoZXgyKSB7CiAgICAgICAgQmlnSW50ZWdlciBudW0xID0gbmV3IEJp +Z0ludGVnZXIoaGV4MS5zdWJzdHJpbmcoMiksIDE2KTsKICAgICAgICBCaWdJbnRlZ2VyIG51bTIg +PSBuZXcgQmlnSW50ZWdlcihoZXgyLnN1YnN0cmluZygyKSwgMTYpOwogICAgICAgIEJpZ0ludGVn +ZXIgc3VtID0gbnVtMS5hZGQobnVtMik7CiAgICAgICAgU3RyaW5nIHJlc3VsdEhleCA9IHN1bS50 +b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJl +c3VsdDogIiArICIweCIgKyByZXN1bHRIZXgpOwogICAgICAgIHJldHVybiByZXN1bHRIZXg7CiAg +ICB9Cn0K \ No newline at end of file