LyoKICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgU3RlZmFuIET2c2luZ2VyKEZvciBDb2RlV2VhdmVycykKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2RlZmluZSBDT0JKTUFDUk9TCiNpbmNsdWRlIDxkM2Q5Lmg+CiNpbmNsdWRlIDxkeGVycjkuaD4KI2luY2x1ZGUgIndpbmUvdGVzdC5oIgoKc3RhdGljIElEaXJlY3QzRDkgKihXSU5BUEkgKnBEaXJlY3QzRENyZWF0ZTkpKFVJTlQpOwoKc3RydWN0IHF1ZXJ5SW5mbwp7CiAgICBEM0RRVUVSWVRZUEUgdHlwZTsgICAgICAvKiBRdWVyeSB0byB0ZXN0ICovCiAgICBCT09MIGZvdW5kU3VwcG9ydGVkOyAgICAvKiBJZiBhdCBsZWFzdCBvbmUgd2luZG93cyBkcml2ZXIgaGFzIGJlZW4gZm91bmQgc3VwcG9ydGluZyB0aGlzIHF1ZXJ5ICovCiAgICBCT09MIGZvdW5kVW5zdXBwb3J0ZWQ7ICAvKiBJZiBhdCBsZWFzdCBvbmUgd2luZG93cyBkcml2ZXIgaGFzIGJlZW4gZm91bmQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHF1ZXJ5ICovCn07CgovKiBXaGVuIHJ1bm5pbmcgcnVubmluZyB0aGlzIHRlc3Qgb24gd2luZG93cyByZXZlYWxzIGFueSBkaWZmZXJlbmNlcyByZWdhcmRpbmcga25vd24gc3VwcG9ydGVkIC8gdW5zdXBwb3J0ZWQgcXVlcmllcywKICogY2hhbmdlIHRoaXMgdGFibGUuCiAqCiAqIFdoZW4gbWFya2luZyBhIHF1ZXJ5IGtub3duIHN1cHBvcnRlZCBvciBrbm93biB1bnN1cHBvcnRlZCBwbGVhc2Ugd3JpdGUgb25lIGNhcmQgd2hpY2ggc3VwcG9ydHMgLyBkb2VzIG5vdCBzdXBwb3J0CiAqIHRoZSBxdWVyeS4KICovCnN0YXRpYyBzdHJ1Y3QgcXVlcnlJbmZvIHF1ZXJpZXNbXSA9CnsKICAgIHtEM0RRVUVSWVRZUEVfVkNBQ0hFLCAgICAgICAgICAgICAgIFRSVUUgLyogZ2Vmb3JjZSA2NjAwICovLCAgICBUUlVFIC8qIGdlZm9yY2UgMiBteCAqLyB9LAogICAge0QzRFFVRVJZVFlQRV9SRVNPVVJDRU1BTkFHRVIsICAgICAgRkFMU0UsICAgICAgICAgICAgICAgICAgICAgIFRSVUUgLyogZ2Vmb3JjZSAyIG14ICovIH0sCiAgICB7RDNEUVVFUllUWVBFX1ZFUlRFWFNUQVRTLCAgICAgICAgICBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgVFJVRSAvKiBnZWZvcmNlIDIgbXggKi8gfSwKICAgIHtEM0RRVUVSWVRZUEVfRVZFTlQsICAgICAgICAgICAgICAgIFRSVUUgLyogZ2Vmb3JjZSAyIG14ICovLCAgICBUUlVFIC8qIGF0aSBtYWNoNjQgKi8gICB9LAogICAge0QzRFFVRVJZVFlQRV9PQ0NMVVNJT04sICAgICAgICAgICAgVFJVRSAvKiByYWRlb24gTTkgKi8sICAgICAgIFRSVUUgLyogZ2Vmb3JjZSAyIG14ICovIH0sCiAgICB7RDNEUVVFUllUWVBFX1RJTUVTVEFNUCwgICAgICAgICAgICBUUlVFIC8qIGdlZm9yY2UgNjYwMCAqLywgICAgVFJVRSAvKiBnZWZvcmNlIDIgbXggKi8gfSwKICAgIHtEM0RRVUVSWVRZUEVfVElNRVNUQU1QRElTSk9JTlQsICAgIFRSVUUgLyogZ2Vmb3JjZSA2NjAwICovLCAgICBUUlVFIC8qIGdlZm9yY2UgMiBteCAqLyB9LAogICAge0QzRFFVRVJZVFlQRV9USU1FU1RBTVBGUkVRLCAgICAgICAgVFJVRSAvKiBnZWZvcmNlIDY2MDAgKi8sICAgIFRSVUUgLyogZ2Vmb3JjZSAyIG14ICovIH0sCiAgICB7RDNEUVVFUllUWVBFX1BJUEVMSU5FVElNSU5HUywgICAgICBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgVFJVRSAvKiBnZWZvcmNlIDIgbXggKi8gfSwKICAgIHtEM0RRVUVSWVRZUEVfSU5URVJGQUNFVElNSU5HUywgICAgIEZBTFNFLCAgICAgICAgICAgICAgICAgICAgICBUUlVFIC8qIGdlZm9yY2UgMiBteCAqLyB9LAogICAge0QzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTLCAgICAgICAgRkFMU0UsICAgICAgICAgICAgICAgICAgICAgIFRSVUUgLyogZ2Vmb3JjZSAyIG14ICovIH0sCiAgICB7RDNEUVVFUllUWVBFX1BJWEVMVElNSU5HUywgICAgICAgICBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgVFJVRSAvKiBnZWZvcmNlIDIgbXggKi8gfSwKICAgIHtEM0RRVUVSWVRZUEVfQkFORFdJRFRIVElNSU5HUywgICAgIEZBTFNFLCAgICAgICAgICAgICAgICAgICAgICBUUlVFIC8qIGdlZm9yY2UgMiBteCAqLyB9LAogICAge0QzRFFVRVJZVFlQRV9DQUNIRVVUSUxJWkFUSU9OLCAgICAgRkFMU0UsICAgICAgICAgICAgICAgICAgICAgIFRSVUUgLyogZ2Vmb3JjZSAyIG14ICovIH0sCn07CgpzdGF0aWMgY29uc3QgY2hhciAqcXVlcnlOYW1lKEQzRFFVRVJZVFlQRSB0eXBlKQp7CiAgICBzd2l0Y2godHlwZSkKICAgIHsKICAgICAgICBjYXNlIEQzRFFVRVJZVFlQRV9WQ0FDSEU6ICAgICAgICAgICAgICAgcmV0dXJuICJEM0RRVUVSWVRZUEVfVkNBQ0hFIjsKICAgICAgICBjYXNlIEQzRFFVRVJZVFlQRV9SRVNPVVJDRU1BTkFHRVI6ICAgICAgcmV0dXJuICJEM0RRVUVSWVRZUEVfUkVTT1VSQ0VNQU5BR0VSIjsKICAgICAgICBjYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhTVEFUUzogICAgICAgICAgcmV0dXJuICJEM0RRVUVSWVRZUEVfVkVSVEVYU1RBVFMiOwogICAgICAgIGNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOiAgICAgICAgICAgICAgICByZXR1cm4gIkQzRFFVRVJZVFlQRV9FVkVOVCI7CiAgICAgICAgY2FzZSBEM0RRVUVSWVRZUEVfT0NDTFVTSU9OOiAgICAgICAgICAgIHJldHVybiAiRDNEUVVFUllUWVBFX09DQ0xVU0lPTiI7CiAgICAgICAgY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QOiAgICAgICAgICAgIHJldHVybiAiRDNEUVVFUllUWVBFX1RJTUVTVEFNUCI7CiAgICAgICAgY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QRElTSk9JTlQ6ICAgIHJldHVybiAiRDNEUVVFUllUWVBFX1RJTUVTVEFNUERJU0pPSU5UIjsKICAgICAgICBjYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBGUkVROiAgICAgICAgcmV0dXJuICJEM0RRVUVSWVRZUEVfVElNRVNUQU1QRlJFUSI7CiAgICAgICAgY2FzZSBEM0RRVUVSWVRZUEVfUElQRUxJTkVUSU1JTkdTOiAgICAgIHJldHVybiAiRDNEUVVFUllUWVBFX1BJUEVMSU5FVElNSU5HUyI7CiAgICAgICAgY2FzZSBEM0RRVUVSWVRZUEVfSU5URVJGQUNFVElNSU5HUzogICAgIHJldHVybiAiRDNEUVVFUllUWVBFX0lOVEVSRkFDRVRJTUlOR1MiOwogICAgICAgIGNhc2UgRDNEUVVFUllUWVBFX1ZFUlRFWFRJTUlOR1M6ICAgICAgICByZXR1cm4gIkQzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTIjsKICAgICAgICBjYXNlIEQzRFFVRVJZVFlQRV9QSVhFTFRJTUlOR1M6ICAgICAgICAgcmV0dXJuICJEM0RRVUVSWVRZUEVfUElYRUxUSU1JTkdTIjsKICAgICAgICBjYXNlIEQzRFFVRVJZVFlQRV9CQU5EV0lEVEhUSU1JTkdTOiAgICAgcmV0dXJuICJEM0RRVUVSWVRZUEVfQkFORFdJRFRIVElNSU5HUyI7CiAgICAgICAgY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjogICAgIHJldHVybiAiRDNEUVVFUllUWVBFX0NBQ0hFVVRJTElaQVRJT04iOwogICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVW5leHBlY3RlZCBxdWVyeSB0eXBlIjsKICAgIH0KfQoKc3RhdGljIHZvaWQgdGVzdF9xdWVyeV9zdXBwb3J0KElEaXJlY3QzRDkgKnBEM2QsIEhXTkQgaHduZCkKewoKICAgIEhSRVNVTFQgICAgICAgICAgICAgICBocjsKCiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgKnBEZXZpY2UgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgIGQzZGRtOwogICAgaW50ICAgICAgICAgICAgICAgICAgIGk7CiAgICBJRGlyZWN0M0RRdWVyeTkgICAgICAgKnBRdWVyeSA9IE5VTEw7CiAgICBCT09MIHN1cHBvcnRlZDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKFNVQ0NFRURFRChocikgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOURldmljZSAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYgKEZBSUxFRChocikpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIGQzZCBkZXZpY2VcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YocXVlcmllcykgLyBzaXplb2YocXVlcmllc1swXSk7IGkrKykKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUXVlcnkocERldmljZSwgcXVlcmllc1tpXS50eXBlLCBOVUxMKTsKICAgICAgICBvayhociA9PSBEM0RfT0sgfHwgRDNERVJSX05PVEFWQUlMQUJMRSwKICAgICAgICAgICAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVRdWVyeSByZXR1cm5lZCB1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSAlcyBmb3IgcXVlcnkgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSwgcXVlcnlOYW1lKHF1ZXJpZXNbaV0udHlwZSkpOwoKICAgICAgICBzdXBwb3J0ZWQgPSAoaHIgPT0gRDNEX09LID8gVFJVRSA6IEZBTFNFKTsKICAgICAgICB0cmFjZSgicXVlcnkgJXMgaXMgJXNcbiIsIHF1ZXJ5TmFtZShxdWVyaWVzW2ldLnR5cGUpLCBzdXBwb3J0ZWQgPyAic3VwcG9ydGVkIiA6ICJub3Qgc3VwcG9ydGVkIik7CgogICAgICAgIG9rKCEoc3VwcG9ydGVkID09IFRSVUUgJiYgcXVlcmllc1tpXS5mb3VuZFN1cHBvcnRlZCA9PSBGQUxTRSksCiAgICAgICAgICAgICJRdWVyeSAlcyBpcyBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0sIGJ1dCB3YXMgbm90IGZvdW5kIHN1cHBvcnRlZCBiZWZvcmVcbiIsCiAgICAgICAgICAgIHF1ZXJ5TmFtZShxdWVyaWVzW2ldLnR5cGUpKTsKICAgICAgICBvayghKHN1cHBvcnRlZCA9PSBGQUxTRSAmJiBxdWVyaWVzW2ldLmZvdW5kVW5zdXBwb3J0ZWQgPT0gRkFMU0UpLAogICAgICAgICAgICAiUXVlcnkgJXMgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSwgYnV0IHdhcyBmb3VuZCB0byBiZSBzdXBwb3J0ZWQgb24gYWxsIG90aGVyIHN5c3RlbXMgdGVzdGVkIGJlZm9yZVxuIiwKICAgICAgICAgICAgcXVlcnlOYW1lKHF1ZXJpZXNbaV0udHlwZSkpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUXVlcnkocERldmljZSwgcXVlcmllc1tpXS50eXBlLCAmcFF1ZXJ5KTsKICAgICAgICBvayhociA9PSBEM0RfT0sgfHwgRDNERVJSX05PVEFWQUlMQUJMRSwKICAgICAgICAgICAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVRdWVyeSByZXR1cm5lZCB1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSAlcyBmb3IgcXVlcnkgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSwgcXVlcnlOYW1lKHF1ZXJpZXNbaV0udHlwZSkpOwogICAgICAgIG9rKCEoc3VwcG9ydGVkICYmICFwUXVlcnkpLCAiUXVlcnkgJXMgd2FzIGNsYWltZWQgdG8gYmUgc3VwcG9ydGVkLCBidXQgY2FuJ3QgYmUgY3JlYXRlZFxuIiwgcXVlcnlOYW1lKHF1ZXJpZXNbaV0udHlwZSkpOwogICAgICAgIG9rKCEoIXN1cHBvcnRlZCAmJiBwUXVlcnkpLCAiUXVlcnkgJXMgd2FzIGNsYWltZWQgbm90IHRvIGJlIHN1cHBvcnRlZCwgYnV0IGNhbiBiZSBjcmVhdGVkXG4iLCBxdWVyeU5hbWUocXVlcmllc1tpXS50eXBlKSk7CiAgICAgICAgaWYocFF1ZXJ5KQogICAgICAgIHsKICAgICAgICAgICAgSURpcmVjdDNEUXVlcnk5X1JlbGVhc2UocFF1ZXJ5KTsKICAgICAgICAgICAgcFF1ZXJ5ID0gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAgY2xlYW51cDoKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShwRGV2aWNlKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9vY2NsdXNpb25fcXVlcnlfc3RhdGVzKElEaXJlY3QzRDkgKnBEM2QsIEhXTkQgaHduZCkKewoKICAgIEhSRVNVTFQgICAgICAgICAgICAgICBocjsKCiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgKnBEZXZpY2UgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgIGQzZGRtOwogICAgSURpcmVjdDNEUXVlcnk5ICAgICAgICpwUXVlcnkgPSBOVUxMOwogICAgQllURSAqZGF0YSA9IE5VTEw7CiAgICBmbG9hdCBwb2ludFszXSA9IHswLjAsIDAuMCwgMC4wfTsKICAgIHVuc2lnbmVkIGludCBjb3VudCA9IDA7CgogICAgSURpcmVjdDNEOV9HZXRBZGFwdGVyRGlzcGxheU1vZGUoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgJmQzZGRtICk7CiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CgogICAgaHIgPSBJRGlyZWN0M0Q5X0NyZWF0ZURldmljZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCBEM0RERVZUWVBFX0hBTCwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpIHx8IGhyID09IEQzREVSUl9OT1RBVkFJTEFCTEUsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDlEZXZpY2UgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmIChGQUlMRUQoaHIpKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgYSBkM2QgZGV2aWNlXG4iKTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVF1ZXJ5KHBEZXZpY2UsIEQzRFFVRVJZVFlQRV9PQ0NMVVNJT04sICZwUXVlcnkpOwogICAgb2soaHIgPT0gRDNEX09LIHx8IEQzREVSUl9OT1RBVkFJTEFCTEUsCiAgICAgICAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVRdWVyeSByZXR1cm5lZCB1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKCFwUXVlcnkpIHsKICAgICAgICBza2lwKCJPY2NsdXNpb24gcXVlcmllcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CgogICAgZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBJRGlyZWN0M0RRdWVyeTlfR2V0RGF0YVNpemUocFF1ZXJ5KSk7CgogICAgaHIgPSBJRGlyZWN0M0RRdWVyeTlfR2V0RGF0YShwUXVlcnksIE5VTEwsIDAsIEQzREdFVERBVEFfRkxVU0gpOwogICAgb2soaHIgPT0gU19PSywgIklEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhKE5VTEwpIG9uIGEgbmV3IHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhKHBRdWVyeSwgZGF0YSwgSURpcmVjdDNEUXVlcnk5X0dldERhdGFTaXplKHBRdWVyeSksIEQzREdFVERBVEFfRkxVU0gpOwogICAgb2soaHIgPT0gU19PSywgIklEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhIG9uIGEgbmV3IHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0RRdWVyeTlfSXNzdWUocFF1ZXJ5LCBEM0RJU1NVRV9FTkQpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEUXVlcnk5X0lzc3VlKEQzRElTU1VFX0VORCkgb24gYSBuZXcgbm90IHlldCBzdGFydGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRFF1ZXJ5OV9Jc3N1ZShwUXVlcnksIEQzRElTU1VFX0JFR0lOKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFF1ZXJ5OV9Jc3N1ZShEM0RJU1NVRV9CRUdJTikgb24gYSBuZXcgbm90IHlldCBzdGFydGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRFF1ZXJ5OV9Jc3N1ZShwUXVlcnksIEQzRElTU1VFX0JFR0lOKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFF1ZXJ5OV9Jc3N1ZShEM0RRVUVSWV9CRUdJTikgb24gYSBzdGFydGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBociA9IElEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhKHBRdWVyeSwgTlVMTCwgMCwgRDNER0VUREFUQV9GTFVTSCk7CiAgICBvayhociA9PSBTX0ZBTFNFLCAiSURpcmVjdDNEUXVlcnk5X0dldERhdGEoTlVMTCkgb24gYSBzdGFydGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhKHBRdWVyeSwgZGF0YSwgSURpcmVjdDNEUXVlcnk5X0dldERhdGFTaXplKHBRdWVyeSksIEQzREdFVERBVEFfRkxVU0gpOwogICAgb2soaHIgPT0gU19GQUxTRSwgIklEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhIG9uIGEgc3RhcnRlZCBxdWVyeSByZXR1cm5lZCAlc1xuIiwKICAgICAgICBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRGVkYocERldmljZSwgRDNERlZGX1hZWik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEZWRiByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKHBEZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9EcmF3UHJpbWl0aXZlVVAocERldmljZSwgRDNEUFRfUE9JTlRMSVNULCAxLCBwb2ludCwgMyAqIHNpemVvZihmbG9hdCkpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZVVQIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShwRGV2aWNlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNEUXVlcnk5X0lzc3VlKHBRdWVyeSwgRDNESVNTVUVfRU5EKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFF1ZXJ5OV9Jc3N1ZShEM0RJU1NVRV9FTkQpIG9uIGEgc3RhcnRlZCBxdWVyeSByZXR1cm5lZCAlc1xuIiwKICAgICAgIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBTX0ZBTFNFOwogICAgd2hpbGUoaHIgPT0gU19GQUxTRSAmJiBjb3VudCA8IDUwMCkgewogICAgICAgIGhyID0gSURpcmVjdDNEUXVlcnk5X0dldERhdGEocFF1ZXJ5LCBOVUxMLCAwLCBEM0RHRVREQVRBX0ZMVVNIKTsKICAgICAgICBvayhociA9PSBTX09LIHx8IGhyID09IFNfRkFMU0UsICJJRGlyZWN0M0RRdWVyeTlfR2V0RGF0YSBvbiBhIGVuZGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgICAgICBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGNvdW50Kys7CiAgICAgICAgaWYoaHIgPT0gU19GQUxTRSkgU2xlZXAoMTApOwogICAgfQogICAgb2soaHIgPT0gU19PSywgIk9jY2x1c2lvbiBxdWVyeSBkaWQgbm90IGZpbmlzaFxuIik7CgogICAgaHIgPSBJRGlyZWN0M0RRdWVyeTlfR2V0RGF0YShwUXVlcnksIGRhdGEsIElEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhU2l6ZShwUXVlcnkpLCBEM0RHRVREQVRBX0ZMVVNIKTsKICAgIG9rKGhyID09IFNfT0ssICJJRGlyZWN0M0RRdWVyeTlfR2V0RGF0YSBvbiBhIGVuZGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhKHBRdWVyeSwgZGF0YSwgSURpcmVjdDNEUXVlcnk5X0dldERhdGFTaXplKHBRdWVyeSksIEQzREdFVERBVEFfRkxVU0gpOwogICAgb2soaHIgPT0gU19PSywgIklEaXJlY3QzRFF1ZXJ5OV9HZXREYXRhIGEgMm5kIHRpbWUgb24gYSBlbmRlZCBxdWVyeSByZXR1cm5lZCAlc1xuIiwKICAgICAgICBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNEUXVlcnk5X0lzc3VlKHBRdWVyeSwgRDNESVNTVUVfQkVHSU4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEUXVlcnk5X0lzc3VlKEQzRElTU1VFX0JFR0lOKSBvbiBhIG5ldyBub3QgeWV0IHN0YXJ0ZWQgcXVlcnkgcmV0dXJuZWQgJXNcbiIsCiAgICAgICBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0RRdWVyeTlfSXNzdWUocFF1ZXJ5LCBEM0RJU1NVRV9FTkQpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNEUXVlcnk5X0lzc3VlKEQzRElTU1VFX0VORCkgb24gYSBzdGFydGVkIHF1ZXJ5IHJldHVybmVkICVzXG4iLAogICAgICAgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNEUXVlcnk5X0lzc3VlKHBRdWVyeSwgRDNESVNTVUVfRU5EKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRFF1ZXJ5OV9Jc3N1ZShEM0RJU1NVRV9FTkQpIG9uIGEgZW5kZWQgcXVlcnkgcmV0dXJuZWQgJXNcbiIsCiAgICAgICBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGNsZWFudXA6CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkYXRhKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShwRGV2aWNlKTsKfQoKU1RBUlRfVEVTVChxdWVyeSkKewogICAgSE1PRFVMRSBkM2Q5X2hhbmRsZSA9IExvYWRMaWJyYXJ5QSggImQzZDkuZGxsIiApOwogICAgaWYgKCFkM2Q5X2hhbmRsZSkKICAgIHsKICAgICAgICBza2lwKCJDb3VsZCBub3QgbG9hZCBkM2Q5LmRsbFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHBEaXJlY3QzRENyZWF0ZTkgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKCBkM2Q5X2hhbmRsZSwgIkRpcmVjdDNEQ3JlYXRlOSIgKTsKICAgIG9rKHBEaXJlY3QzRENyZWF0ZTkgIT0gTlVMTCwgIkZhaWxlZCB0byBnZXQgYWRkcmVzcyBvZiBEaXJlY3QzRENyZWF0ZTlcbiIpOwogICAgaWYgKHBEaXJlY3QzRENyZWF0ZTkpCiAgICB7CiAgICAgICAgSURpcmVjdDNEOSAgICAgICAgICAgICpwRDNkID0gTlVMTDsKICAgICAgICBIV05EICAgICAgICAgICAgICAgICAgaHduZCA9IE5VTEw7CgogICAgICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgICAgICBpZighcEQzZCkKICAgICAgICB7CiAgICAgICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgRGlyZWN0M0Q5IG9iamVjdCwgbm90IHJ1bm5pbmcgdGVzdHNcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICAgICAgaWYoIWh3bmQpCiAgICAgICAgewogICAgICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICAgICAgICAgIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGVzdF9xdWVyeV9zdXBwb3J0KHBEM2QsIGh3bmQpOwogICAgICAgIHRlc3Rfb2NjbHVzaW9uX3F1ZXJ5X3N0YXRlcyhwRDNkLCBod25kKTsKCiAgICAgICAgRGVzdHJveVdpbmRvdyhod25kKTsKICAgICAgICBJRGlyZWN0M0Q5X1JlbGVhc2UocEQzZCk7CiAgICB9Cn0K