LyoKICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFN0ZWZhbiBMZWljaHRlcgogKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgRGV0bGVmIFJpZWtlbmJlcmcKICogQ29weXJpZ2h0IChDKSAyMDA2IERtaXRyeSBUaW1vc2hrb3YKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgIndpbmUvdGVzdC5oIgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbnNwb29sLmgiCgojZGVmaW5lIE1BR0lDX0RFQUQgIDB4MDBkZWFkMDAKI2RlZmluZSBERUZBVUxUX1BSSU5URVJfU0laRSAxMDAwCgpzdGF0aWMgY2hhciBlbnZfeDg2W10gPSAiV2luZG93cyBOVCB4ODYiOwpzdGF0aWMgY2hhciBlbnZfd2luOXhfY2FzZVtdID0gIndpbmRvd1MgNC4wIjsKc3RhdGljIGNoYXIgd2luZXRlc3RfbW9uaXRvcltdID0gIndpbmV0ZXN0IjsKCnN0YXRpYyBIQU5ETEUgIGh3aW5zcG9vbDsKc3RhdGljIEZBUlBST0MgcEdldERlZmF1bHRQcmludGVyQTsKc3RhdGljIEZBUlBST0MgcFNldERlZmF1bHRQcmludGVyQTsKCnN0cnVjdCBtb25pdG9yX2VudHJ5IHsKICAgIExQU1RSICBlbnY7CiAgICBMUFNUUiAgZGxsbmFtZTsKfTsKCi8qIHJlcG9ydCBjb21tb24gYmVoYXZpb3Igb25seSBvbmNlICovCnN0YXRpYyBEV09SRCByZXBvcnRfZGVhY3RpdmF0ZWRfc3Bvb2xlciA9IDE7CiNkZWZpbmUgUkVUVVJOX09OX0RFQUNUSVZBVEVEX1NQT09MRVIocmVzKSBcCiAgICBpZigocmVzID09IDApICYmIChHZXRMYXN0RXJyb3IoKSA9PSBSUENfU19TRVJWRVJfVU5BVkFJTEFCTEUpKSBcCiAgICB7IFwKICAgICAgICBpZihyZXBvcnRfZGVhY3RpdmF0ZWRfc3Bvb2xlciA+IDApIHsgXAogICAgICAgICAgICByZXBvcnRfZGVhY3RpdmF0ZWRfc3Bvb2xlci0tOyBcCiAgICAgICAgICAgIHRyYWNlKCJUaGUgU2VydmljZSAnU3Bvb2xlcicgaXMgcmVxdWlyZWQgZm9yIG1hbnkgdGVzdFxuIik7IFwKICAgICAgICB9IFwKICAgICAgICByZXR1cm47IFwKICAgIH0KCgpzdGF0aWMgTFBTVFIgZmluZF9kZWZhdWx0X3ByaW50ZXIoVk9JRCkKewogICAgc3RhdGljICBMUFNUUiAgIGRlZmF1bHRfcHJpbnRlciA9IE5VTEw7CiAgICBzdGF0aWMgIGNoYXIgICAgYnVmZmVyW0RFRkFVTFRfUFJJTlRFUl9TSVpFXTsKICAgIERXT1JEICAgbmVlZGVkOwogICAgRFdPUkQgICByZXM7CiAgICBMUFNUUiAgIHB0cjsKCiAgICBpZiAoKGRlZmF1bHRfcHJpbnRlciA9PSBOVUxMKSAmJiAocEdldERlZmF1bHRQcmludGVyQSkpCiAgICB7CiAgICAgICAgLyogdzJrIGFuZCBhYm92ZSAqLwogICAgICAgIG5lZWRlZCA9IHNpemVvZihidWZmZXIpOwogICAgICAgIHJlcyA9IHBHZXREZWZhdWx0UHJpbnRlckEoYnVmZmVyLCAmbmVlZGVkKTsKICAgICAgICBpZihyZXMpICBkZWZhdWx0X3ByaW50ZXIgPSBidWZmZXI7CiAgICAgICAgdHJhY2UoImRlZmF1bHRfcHJpbnRlcjogJyVzJ1xuIiwgZGVmYXVsdF9wcmludGVyKTsKICAgIH0KICAgIGlmIChkZWZhdWx0X3ByaW50ZXIgPT0gTlVMTCkKICAgIHsKICAgICAgICBIS0VZIGh3aW5kb3dzOwogICAgICAgIERXT1JEICAgdHlwZTsKICAgICAgICAvKiBOVCAzLnggYW5kIGFib3ZlICovCiAgICAgICAgaWYgKFJlZ09wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvblxcV2luZG93cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsIEtFWV9RVUVSWV9WQUxVRSwgJmh3aW5kb3dzKSA9PSBOT19FUlJPUikgewoKICAgICAgICAgICAgbmVlZGVkID0gc2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaHdpbmRvd3MsICJkZXZpY2UiLCBOVUxMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZSwgKExQQllURSlidWZmZXIsICZuZWVkZWQpID09IE5PX0VSUk9SKSB7CgogICAgICAgICAgICAgICAgcHRyID0gc3RyY2hyKGJ1ZmZlciwgJywnKTsKICAgICAgICAgICAgICAgIGlmIChwdHIpIHsKICAgICAgICAgICAgICAgICAgICBwdHJbMF0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJpbnRlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBSZWdDbG9zZUtleShod2luZG93cyk7CiAgICAgICAgfQogICAgICAgIHRyYWNlKCJkZWZhdWx0X3ByaW50ZXI6ICclcydcbiIsIGRlZmF1bHRfcHJpbnRlcik7CiAgICB9CiAgICBpZiAoZGVmYXVsdF9wcmludGVyID09IE5VTEwpCiAgICB7CiAgICAgICAgLyogd2luOXggKi8KICAgICAgICBuZWVkZWQgPSBzaXplb2YoYnVmZmVyKTsKICAgICAgICByZXMgPSBHZXRQcm9maWxlU3RyaW5nQSgid2luZG93cyIsICJkZXZpY2UiLCAiKiIsIGJ1ZmZlciwgbmVlZGVkKTsKICAgICAgICBpZihyZXMpIHsKICAgICAgICAgICAgcHRyID0gc3RyY2hyKGJ1ZmZlciwgJywnKTsKICAgICAgICAgICAgaWYgKHB0cikgewogICAgICAgICAgICAgICAgcHRyWzBdID0gJ1wwJzsKICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJpbnRlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cmFjZSgiZGVmYXVsdF9wcmludGVyOiAnJXMnXG4iLCBkZWZhdWx0X3ByaW50ZXIpOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRfcHJpbnRlcjsKfQoKCnN0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9lbnRyeSAqIGZpbmRfaW5zdGFsbGVkX21vbml0b3Iodm9pZCkKewogICAgTU9OSVRPUl9JTkZPXzJBIG1pMmE7IAogICAgc3RhdGljIHN0cnVjdCAgbW9uaXRvcl9lbnRyeSAqIGVudHJ5ID0gTlVMTDsKICAgIERXT1JEICAgcmVzOwogICAgRFdPUkQgICBudW1fdGVzdHM7CiAgICBEV09SRCAgIGkgPSAwOwoKICAgIHN0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9lbnRyeSAgbW9uaXRvcl90YWJsZVtdID0gewogICAgICAgIHtlbnZfd2luOXhfY2FzZSwgImxvY2Fsc3BsLmRsbCJ9LAogICAgICAgIHtlbnZfeDg2LCAgICAgICAgImxvY2Fsc3BsLmRsbCJ9LAogICAgICAgIHtlbnZfd2luOXhfY2FzZSwgImxvY2FsbW9uLmRsbCJ9LAogICAgICAgIHtlbnZfeDg2LCAgICAgICAgImxvY2FsbW9uLmRsbCJ9LAogICAgICAgIHtlbnZfd2luOXhfY2FzZSwgInRjcG1vbi5kbGwifSwKICAgICAgICB7ZW52X3g4NiwgICAgICAgICJ0Y3Btb24uZGxsIn0sCiAgICAgICAge2Vudl93aW45eF9jYXNlLCAidXNibW9uLmRsbCJ9LAogICAgICAgIHtlbnZfeDg2LCAgICAgICAgInVzYm1vbi5kbGwifSwKICAgICAgICB7ZW52X3dpbjl4X2Nhc2UsICJtc3BwMzIuZGxsIn0sCiAgICAgICAge2Vudl94ODYsICAgICAgICAid2luMzJzcGwuZGxsIn0sCiAgICAgICAge2Vudl94ODYsICAgICAgICAicmVkbW9ubnQuZGxsIn0sCiAgICAgICAge2Vudl94ODYsICAgICAgICAicmVkbW9uMzUuZGxsIn0sCiAgICAgICAge2Vudl93aW45eF9jYXNlLCAicmVkbW9uOTUuZGxsIn0sCiAgICAgICAge2Vudl94ODYsICAgICAgICAicGRmY21ubnQuZGxsIn0sCiAgICAgICAge2Vudl93aW45eF9jYXNlLCAicGRmY21uOTUuZGxsIn0sCiAgICB9OwoKICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5OwoKICAgIG51bV90ZXN0cyA9IChzaXplb2YobW9uaXRvcl90YWJsZSkvc2l6ZW9mKHN0cnVjdCBtb25pdG9yX2VudHJ5KSk7CgogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gRGVsZXRlTW9uaXRvckEoTlVMTCwgTlVMTCwgTlVMTCk7CiAgICBpZiAoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpKSB7CiAgICAgICAgdHJhY2UoIkRlbGV0ZU1vbml0b3JBKCkgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gQWRkTW9uaXRvckEoTlVMTCwgMCwgTlVMTCk7CiAgICBpZiAoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpKSB7CiAgICAgICAgdHJhY2UoIkFkZE1vbml0b3JBKCkgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyogY2xlYW51cCAqLwogICAgRGVsZXRlTW9uaXRvckEoTlVMTCwgZW52X3g4Niwgd2luZXRlc3RfbW9uaXRvcik7CiAgICBEZWxldGVNb25pdG9yQShOVUxMLCBlbnZfd2luOXhfY2FzZSwgd2luZXRlc3RfbW9uaXRvcik7CgogICAgLyogZmluZCBhIHVzYWJsZSBtb25pdG9yIGZyb20gdGhlIHRhYmxlICovICAgIAogICAgbWkyYS5wTmFtZSA9IHdpbmV0ZXN0X21vbml0b3I7CiAgICB3aGlsZSAoKGVudHJ5ID09IE5VTEwpICYmIChpIDwgbnVtX3Rlc3RzKSkgewogICAgICAgIGVudHJ5ID0gJm1vbml0b3JfdGFibGVbaV07CiAgICAgICAgaSsrOwogICAgICAgIG1pMmEucEVudmlyb25tZW50ID0gZW50cnktPmVudjsKICAgICAgICBtaTJhLnBETExOYW1lID0gZW50cnktPmRsbG5hbWU7CgogICAgICAgIGlmIChBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSkpIHsKICAgICAgICAgICAgLyogd2UgZ290IG9uZSAqLwogICAgICAgICAgICB0cmFjZSgidXNpbmcgJyVzJywgJyVzJ1xuIiwgZW50cnktPmVudiwgZW50cnktPmRsbG5hbWUpOwogICAgICAgICAgICBEZWxldGVNb25pdG9yQShOVUxMLCBlbnRyeS0+ZW52LCB3aW5ldGVzdF9tb25pdG9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZW50cnkgPSBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbnRyeTsKfQoKLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCgoKc3RhdGljIHZvaWQgdGVzdF9BZGRNb25pdG9yKHZvaWQpCnsKICAgIE1PTklUT1JfSU5GT18yQSBtaTJhOyAKICAgIHN0cnVjdCAgbW9uaXRvcl9lbnRyeSAqIGVudHJ5ID0gTlVMTDsKICAgIERXT1JEICAgcmVzOwoKICAgIGVudHJ5ID0gZmluZF9pbnN0YWxsZWRfbW9uaXRvcigpOwoKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEFkZE1vbml0b3JBKE5VTEwsIDEsIE5VTEwpOwogICAgb2soIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9MRVZFTCksIAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoIEVSUk9SX0lOVkFMSURfTEVWRUwpXG4iLAogICAgICAgIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEFkZE1vbml0b3JBKE5VTEwsIDMsIE5VTEwpOwogICAgb2soIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9MRVZFTCksIAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoIEVSUk9SX0lOVkFMSURfTEVWRUwpXG4iLAogICAgICAgIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEFkZE1vbml0b3JBKE5VTEwsIDIsIE5VTEwpOwogICAgLyogTlQ6IHVuY2hhbmdlZCwgIDl4OiBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTEQgKi8KICAgIG9rKCFyZXMgJiYKICAgICAgICAoKEdldExhc3RFcnJvcigpID09IE1BR0lDX0RFQUQpIHx8CiAgICAgICAgIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTEQpKSwgCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGg6IE1BR0lDX0RFQUQgb3IgIiBcCiAgICAgICAgIkVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRClcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIFplcm9NZW1vcnkoJm1pMmEsIHNpemVvZihNT05JVE9SX0lORk9fMkEpKTsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEFkZE1vbml0b3JBKE5VTEwsIDIsIChMUEJZVEUpICZtaTJhKTsKICAgIFJFVFVSTl9PTl9ERUFDVElWQVRFRF9TUE9PTEVSKHJlcykKCiAgICBpZiAoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkpIHsKICAgICAgICB0cmFjZSgic2tpcCB0ZXN0cyAoQUNDRVNTX0RFTklFRClcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBOVDogRVJST1JfSU5WQUxJRF9QQVJBTUVURVIsICA5eDogRVJST1JfSU5WQUxJRF9FTlZJUk9OTUVOVCAqLwogICAgb2soIXJlcyAmJiAoKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSB8fAogICAgICAgICAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfRU5WSVJPTk1FTlQpKSwgCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGg6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSIG9yICIgXAogICAgICAgICJFUlJPUl9JTlZBTElEX0VOVklST05NRU5UKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKCFlbnRyeSkgewogICAgICAgIHRyYWNlKCJObyB1c2FibGUgTW9uaXRvciBmb3VuZDogU2tpcCB0ZXN0c1xuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKI2lmIDAKICAgIC8qIFRoZSBUZXN0IGlzIGRlYWN0aXZhdGVkLCBiZWNhdXNlIHdoZW4gbWkyYS5wTmFtZSBpcyBOVUxMLCB0aGUgc3Via2V5CiAgICAgICBIS0xNXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXFByaW50XE1vbml0b3JzXEM6XFdJTkRPV1NcU1lTVEVNCiAgICAgICBvciBIS0xNXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXFByaW50XE1vbml0b3JzXOwKICAgICAgIGlzIGNyZWF0ZWQgb24gd2luOXggYW5kIHdlIGRvIG5vdCB3YW50IHRvIGhpdCB0aGlzIGJ1ZyBoZXJlLiAqLwoKICAgIG1pMmEucEVudmlyb25tZW50ID0gZW50cnktPmVudjsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEFkZE1vbml0b3JBKE5VTEwsIDIsIChMUEJZVEUpICZtaTJhKTsKICAgIC8qIE5UOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiwgIDl4OiBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTEQgKi8KI2VuZGlmCgogICAgbWkyYS5wRW52aXJvbm1lbnQgPSBlbnRyeS0+ZW52OwogICAgbWkyYS5wTmFtZSA9ICIiOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gQWRkTW9uaXRvckEoTlVMTCwgMiwgKExQQllURSkgJm1pMmEpOwogICAgLyogTlQ6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLCAgOXg6IEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRCAqLwogICAgb2soICFyZXMgJiYKICAgICAgICAoKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSB8fAogICAgICAgICAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfUFJJVklMRUdFX05PVF9IRUxEKSksIAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBvciAiIFwKICAgICAgICAiRVJST1JfUFJJVklMRUdFX05PVF9IRUxEKVxuIiwKICAgICAgICByZXMsIEdldExhc3RFcnJvcigpKTsKCiAgICBtaTJhLnBOYW1lID0gd2luZXRlc3RfbW9uaXRvcjsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEFkZE1vbml0b3JBKE5VTEwsIDIsIChMUEJZVEUpICZtaTJhKTsKICAgIC8qIE5UOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiwgIDl4OiBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTEQgKi8KICAgIG9rKCAhcmVzICYmCiAgICAgICAgKChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgfHwKICAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRCkpLCAKICAgICAgICAicmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnMCcgd2l0aDogRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgb3IgIiBcCiAgICAgICAgIkVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRClcbiIsCiAgICAgICAgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgbWkyYS5wRExMTmFtZSA9ICIiOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gQWRkTW9uaXRvckEoTlVMTCwgMiwgKExQQllURSkgJm1pMmEpOwogICAgb2soICFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSwKICAgICAgICAicmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnMCcgd2l0aCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUilcbiIsCiAgICAgICAgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgoKICAgIG1pMmEucERMTE5hbWUgPSAiZG9lc19ub3RfZXhpc3RzLmRsbCI7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICAvKiBOVDogRVJST1JfTU9EX05PVF9GT1VORCwgIDl4OiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAqLwogICAgb2soICFyZXMgJiYKICAgICAgICAoKEdldExhc3RFcnJvcigpID09IEVSUk9SX01PRF9OT1RfRk9VTkQpIHx8CiAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGg6IEVSUk9SX01PRF9OT1RfRk9VTkQgb3IgIiBcCiAgICAgICAgIkVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgbWkyYS5wRExMTmFtZSA9ICJ2ZXJzaW9uLmRsbCI7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICAvKiBOVDogRVJST1JfUFJPQ19OT1RfRk9VTkQsICA5eDogRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKi8KICAgIHRvZG9fd2luZSB7CiAgICBvayggIXJlcyAmJgogICAgICAgICgoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfUFJPQ19OT1RfRk9VTkQpIHx8CiAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGg6IEVSUk9SX1BST0NfTk9UX0ZPVU5EIG9yICIgXAogICAgICAgICJFUlJPUl9JTlZBTElEX1BBUkFNRVRFUilcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgaWYgKHJlcykgRGVsZXRlTW9uaXRvckEoTlVMTCwgZW50cnktPmVudiwgd2luZXRlc3RfbW9uaXRvcik7IAogICAgfQoKICAgLyogVGVzdCBBZGRNb25pdG9yIHdpdGggcmVhbCBvcHRpb25zICovCiAgICBtaTJhLnBETExOYW1lID0gZW50cnktPmRsbG5hbWU7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICBvayhyZXMsICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPSAwJylcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgCiAgICAvKiBhZGQgYSBtb25pdG9yIHR3aWNlICovCiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICAvKiBOVDogRVJST1JfUFJJTlRfTU9OSVRPUl9BTFJFQURZX0lOU1RBTExFRCAoMzAwNiksIDl4OiBFUlJPUl9BTFJFQURZX0VYSVNUUyAoMTgzKSAqLwogICAgb2soICFyZXMgJiYKICAgICAgICAoKEdldExhc3RFcnJvcigpID09IEVSUk9SX1BSSU5UX01PTklUT1JfQUxSRUFEWV9JTlNUQUxMRUQpIHx8CiAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKSksIAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoOiAiIFwKICAgICAgICAiRVJST1JfUFJJTlRfTU9OSVRPUl9BTFJFQURZX0lOU1RBTExFRCBvciBFUlJPUl9BTFJFQURZX0VYSVNUUylcbiIsCiAgICAgICAgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgRGVsZXRlTW9uaXRvckEoTlVMTCwgZW50cnktPmVudiwgd2luZXRlc3RfbW9uaXRvcik7IAogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gQWRkTW9uaXRvckEoIiIsIDIsIChMUEJZVEUpICZtaTJhKTsKICAgIG9rKHJlcywgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9IDAnKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgLyogY2xlYW51cCAqLwogICAgRGVsZXRlTW9uaXRvckEoTlVMTCwgZW50cnktPmVudiwgd2luZXRlc3RfbW9uaXRvcik7Cgp9CgovKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KCnN0YXRpYyB2b2lkIHRlc3RfRGVsZXRlTW9uaXRvcih2b2lkKQp7CiAgICBNT05JVE9SX0lORk9fMkEgbWkyYTsgCiAgICBzdHJ1Y3QgIG1vbml0b3JfZW50cnkgKiBlbnRyeSA9IE5VTEw7CiAgICBEV09SRCAgIHJlczsKCiAgICBlbnRyeSA9IGZpbmRfaW5zdGFsbGVkX21vbml0b3IoKTsKCiAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgdHJhY2UoIk5vIHVzYWJsZSBNb25pdG9yIGZvdW5kOiBTa2lwIHRlc3RzXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbWkyYS5wTmFtZSA9IHdpbmV0ZXN0X21vbml0b3I7CiAgICBtaTJhLnBFbnZpcm9ubWVudCA9IGVudHJ5LT5lbnY7CiAgICBtaTJhLnBETExOYW1lID0gZW50cnktPmRsbG5hbWU7CgogICAgLyogVGVzdGluZyBEZWxldGVNb25pdG9yIHdpdGggcmVhbCBvcHRpb25zICovCiAgICBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CgogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gRGVsZXRlTW9uaXRvckEoTlVMTCwgZW50cnktPmVudiwgd2luZXRlc3RfbW9uaXRvcik7CiAgICBvayhyZXMsICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPSAwJylcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIC8qIERlbGV0ZSB0aGUgTW9uaXRvciB0d2ljZSAqLwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gRGVsZXRlTW9uaXRvckEoTlVMTCwgZW50cnktPmVudiwgd2luZXRlc3RfbW9uaXRvcik7CiAgICAvKiBOVDogRVJST1JfVU5LTk9XTl9QUklOVF9NT05JVE9SICgzMDAwKSwgOXg6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICg4NykgKi8KICAgIG9rKCAhcmVzICYmCiAgICAgICAgKChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9VTktOT1dOX1BSSU5UX01PTklUT1IpIHx8CiAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSksIAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoOiBFUlJPUl9VTktOT1dOX1BSSU5UX01PTklUT1IiIFwKICAgICAgICAiIG9yIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgLyogdGhlIGVudmlyb25tZW50ICovCiAgICBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBEZWxldGVNb25pdG9yQShOVUxMLCBOVUxMLCB3aW5ldGVzdF9tb25pdG9yKTsKICAgIG9rKHJlcywgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcpXG4iLCByZXMsIEdldExhc3RFcnJvcigpKTsKCiAgICBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBEZWxldGVNb25pdG9yQShOVUxMLCAiIiwgd2luZXRlc3RfbW9uaXRvcik7CiAgICBvayhyZXMsICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgQWRkTW9uaXRvckEoTlVMTCwgMiwgKExQQllURSkgJm1pMmEpOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gRGVsZXRlTW9uaXRvckEoTlVMTCwgImJhZF9lbnYiLCB3aW5ldGVzdF9tb25pdG9yKTsKICAgIG9rKHJlcywgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcpXG4iLCByZXMsIEdldExhc3RFcnJvcigpKTsKCiAgICAvKiB0aGUgbW9uaXRvci1uYW1lICovCiAgICBBZGRNb25pdG9yQShOVUxMLCAyLCAoTFBCWVRFKSAmbWkyYSk7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBEZWxldGVNb25pdG9yQShOVUxMLCBlbnRyeS0+ZW52LCBOVUxMKTsKICAgIC8qIE5UOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAoODcpLCAgOXg6IEVSUk9SX0lOVkFMSURfTkFNRSAoMTIzKSovCiAgICBvayggIXJlcyAmJgogICAgICAgICgoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIHx8CiAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfTkFNRSkpLAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBvciAiIFwKICAgICAgICAiRVJST1JfSU5WQUxJRF9OQU1FKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgQWRkTW9uaXRvckEoTlVMTCwgMiwgKExQQllURSkgJm1pMmEpOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gRGVsZXRlTW9uaXRvckEoTlVMTCwgZW50cnktPmVudiwgIiIpOwogICAgLyogTlQ6IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICg4NyksICA5eDogRVJST1JfSU5WQUxJRF9OQU1FICgxMjMpKi8KICAgIG9rKCAhcmVzICYmIAogICAgICAgICgoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIHx8CiAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfTkFNRSkpLAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBvciAiIFwKICAgICAgICAiRVJST1JfSU5WQUxJRF9OQU1FKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgQWRkTW9uaXRvckEoTlVMTCwgMiwgKExQQllURSkgJm1pMmEpOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gRGVsZXRlTW9uaXRvckEoIiIsIGVudHJ5LT5lbnYsIHdpbmV0ZXN0X21vbml0b3IpOwogICAgb2socmVzLCAicmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnIT0wJylcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIC8qIGNsZWFudXAgKi8KICAgIERlbGV0ZU1vbml0b3JBKE5VTEwsIGVudHJ5LT5lbnYsIHdpbmV0ZXN0X21vbml0b3IpOwp9CgoKLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCgpzdGF0aWMgdm9pZCB0ZXN0X0VudW1Nb25pdG9ycyh2b2lkKQp7CiAgICBEV09SRCAgIHJlczsKICAgIExQQllURSAgYnVmZmVyOwogICAgRFdPUkQgICBjYkJ1ZjsKICAgIERXT1JEICAgcGNiTmVlZGVkOwogICAgRFdPUkQgICBwY1JldHVybmVkOwogICAgRFdPUkQgICBsZXZlbDsKCiAgICAvKiB2YWxpZCBsZXZlbHMgYXJlIDEgYW5kIDIgKi8KICAgIGZvcihsZXZlbCA9IDA7IGxldmVsIDwgNDsgbGV2ZWwrKykgewogICAgICAgIGNiQnVmID0gTUFHSUNfREVBRDsKICAgICAgICBwY1JldHVybmVkID0gTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gRW51bU1vbml0b3JzQShOVUxMLCBsZXZlbCwgTlVMTCwgMCwgJmNiQnVmLCAmcGNSZXR1cm5lZCk7CgogICAgICAgIFJFVFVSTl9PTl9ERUFDVElWQVRFRF9TUE9PTEVSKHJlcykKCiAgICAgICAgLyogbm90IGltcGxlbWVudGVkIHlldCBpbiB3aW5lICovCiAgICAgICAgaWYgKCFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKSkgY29udGludWU7CgoKICAgICAgICAvKiB1c2Ugb25seSBhIHNob3J0IHRlc3QsIHdoZW4gd2UgdGVzdCB3aXRoIGFuIGludmFsaWQgbGV2ZWwgKi8KICAgICAgICBpZighbGV2ZWwgfHwgKGxldmVsID4gMikpIHsKICAgICAgICAgICAgb2soICghcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0xFVkVMKSkgfHwKICAgICAgICAgICAgICAgIChyZXMgJiYgKHBjUmV0dXJuZWQgPT0gMCkpLAogICAgICAgICAgICAgICAgIiglbGQpIHJldHVybmVkICVsZCB3aXRoICVsZCBhbmQgMHglMDhseCAoZXhwZWN0ZWQgJzAnIHdpdGggIiBcCiAgICAgICAgICAgICAgICAiRVJST1JfSU5WQUxJRF9MRVZFTCBvciAnIT0wJyBhbmQgMHgwKVxuIiwKICAgICAgICAgICAgICAgIGxldmVsLCByZXMsIEdldExhc3RFcnJvcigpLCBwY1JldHVybmVkKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfSAgICAgICAgCgogICAgICAgIC8qIExldmVsIDIgaXMgbm90IHN1cHBvcnRlZCBvbiB3aW45eCAqLwogICAgICAgIGlmICghcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0xFVkVMKSkgewogICAgICAgICAgICB0cmFjZSgiTGV2ZWwgJWxkIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIHRlc3RzXG4iLCBsZXZlbCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgb2soKCFyZXMpICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSwKICAgICAgICAgICAgIiglbGQpIHJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGggIiBcCiAgICAgICAgICAgICJFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKVxuIiwgbGV2ZWwsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgICAgICBpZiAoIWNiQnVmKSB7CiAgICAgICAgICAgIHRyYWNlKCJubyB2YWxpZCBidWZmZXIgc2l6ZSByZXR1cm5lZCwgc2tpcHBpbmcgdGVzdHNcbiIpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGJ1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBjYkJ1ZiAqMik7CiAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSBjb250aW51ZTsKCiAgICAgICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgICAgIHBjYk5lZWRlZCA9IE1BR0lDX0RFQUQ7CiAgICAgICAgcmVzID0gRW51bU1vbml0b3JzQShOVUxMLCBsZXZlbCwgYnVmZmVyLCBjYkJ1ZiwgJnBjYk5lZWRlZCwgJnBjUmV0dXJuZWQpOwogICAgICAgIG9rKHJlcywgIiglbGQpIHJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcpXG4iLAogICAgICAgICAgICAgICAgbGV2ZWwsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIG9rKHBjYk5lZWRlZCA9PSBjYkJ1ZiwgIiglbGQpIHJldHVybmVkICVsZCAoZXhwZWN0ZWQgJWxkKVxuIiwKICAgICAgICAgICAgICAgIGxldmVsLCBwY2JOZWVkZWQsIGNiQnVmKTsKICAgICAgICAvKiBXZSBjYW4gdmFsaWRhdGUgdGhlIHJldHVybmVkIERhdGEgd2l0aCB0aGUgUmVnaXN0cnkgaGVyZSAqLwoKCiAgICAgICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgICAgIHBjUmV0dXJuZWQgPSBNQUdJQ19ERUFEOwogICAgICAgIHBjYk5lZWRlZCA9IE1BR0lDX0RFQUQ7CiAgICAgICAgcmVzID0gRW51bU1vbml0b3JzQShOVUxMLCBsZXZlbCwgYnVmZmVyLCBjYkJ1ZisxLCAmcGNiTmVlZGVkLCAmcGNSZXR1cm5lZCk7CiAgICAgICAgb2socmVzLCAiKCVsZCkgcmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnIT0wJylcbiIsIGxldmVsLAogICAgICAgICAgICAgICAgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgb2socGNiTmVlZGVkID09IGNiQnVmLCAiKCVsZCkgcmV0dXJuZWQgJWxkIChleHBlY3RlZCAlbGQpXG4iLCBsZXZlbCwKICAgICAgICAgICAgICAgIHBjYk5lZWRlZCwgY2JCdWYpOwoKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcGNiTmVlZGVkID0gTUFHSUNfREVBRDsKICAgICAgICByZXMgPSBFbnVtTW9uaXRvcnNBKE5VTEwsIGxldmVsLCBidWZmZXIsIGNiQnVmLTEsICZwY2JOZWVkZWQsICZwY1JldHVybmVkKTsKICAgICAgICBvayggIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiksCiAgICAgICAgICAgICIoJWxkKSByZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoICIgXAogICAgICAgICAgICAiRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUilcbiIsIGxldmVsLCByZXMsIEdldExhc3RFcnJvcigpKTsKCiAgICAgICAgb2socGNiTmVlZGVkID09IGNiQnVmLCAiKCVsZCkgcmV0dXJuZWQgJWxkIChleHBlY3RlZCAlbGQpXG4iLCBsZXZlbCwKICAgICAgICAgICAgICAgIHBjYk5lZWRlZCwgY2JCdWYpOwoKLyoKICAgICAgRG8gbm90IGFkZCB0aGUgbmV4dCB0ZXN0OgogICAgICB3MmsrOiAgUlBDX1hfTlVMTF9SRUZfUE9JTlRFUiAKICAgICAgTlQzLjU6IEVSUk9SX0lOVkFMSURfVVNFUl9CVUZGRVIKICAgICAgd2luOXg6IGNyYXNoIGluIHdpbnNwb29sLmRydgoKICAgICAgcmVzID0gRW51bU1vbml0b3JzQShOVUxMLCBsZXZlbCwgTlVMTCwgY2JCdWYsICZwY2JOZWVkZWQsICZwY1JldHVybmVkKTsKKi8KCiAgICAgICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgICAgIHBjYk5lZWRlZCA9IE1BR0lDX0RFQUQ7CiAgICAgICAgcGNSZXR1cm5lZCA9IE1BR0lDX0RFQUQ7CiAgICAgICAgcmVzID0gRW51bU1vbml0b3JzQShOVUxMLCBsZXZlbCwgYnVmZmVyLCBjYkJ1ZiwgTlVMTCwgJnBjUmV0dXJuZWQpOwogICAgICAgIG9rKCByZXMgfHwgKCFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IFJQQ19YX05VTExfUkVGX1BPSU5URVIpKSAsCiAgICAgICAgICAgICIoJWxkKSByZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnIG9yICcwJyB3aXRoICJcCiAgICAgICAgICAgICJSUENfWF9OVUxMX1JFRl9QT0lOVEVSKVxuIiwgbGV2ZWwsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgICAgICBwY2JOZWVkZWQgPSBNQUdJQ19ERUFEOwogICAgICAgIHBjUmV0dXJuZWQgPSBNQUdJQ19ERUFEOwogICAgICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgICAgICByZXMgPSBFbnVtTW9uaXRvcnNBKE5VTEwsIGxldmVsLCBidWZmZXIsIGNiQnVmLCAmcGNiTmVlZGVkLCBOVUxMKTsKICAgICAgICBvayggcmVzIHx8ICghcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBSUENfWF9OVUxMX1JFRl9QT0lOVEVSKSkgLAogICAgICAgICAgICAiKCVsZCkgcmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnIT0wJyBvciAnMCcgd2l0aCAiXAogICAgICAgICAgICAiUlBDX1hfTlVMTF9SRUZfUE9JTlRFUilcbiIsIGxldmVsLCByZXMsIEdldExhc3RFcnJvcigpKTsKCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmZmVyKTsKICAgIH0gLyogZm9yKGxldmVsIC4uLiAqLwp9CgoKc3RhdGljIHZvaWQgdGVzdF9HZXREZWZhdWx0UHJpbnRlcih2b2lkKQp7CiAgICBCT09MICAgIHJldHZhbDsKICAgIERXT1JEICAgZXhhY3QgPSBERUZBVUxUX1BSSU5URVJfU0laRTsKICAgIERXT1JEICAgc2l6ZTsKICAgIGNoYXIgICAgYnVmZmVyW0RFRkFVTFRfUFJJTlRFUl9TSVpFXTsKCiAgICBpZiAoIXBHZXREZWZhdWx0UHJpbnRlckEpICByZXR1cm47CgkvKiBvbmx5IHN1cHBvcnRlZCBvbiBOVCBsaWtlIE9TZXMgc3RhcnRpbmcgd2l0aCB3aW4yayAqLwoKICAgIFNldExhc3RFcnJvcihFUlJPUl9TVUNDRVNTKTsKICAgIHJldHZhbCA9IHBHZXREZWZhdWx0UHJpbnRlckEoYnVmZmVyLCAmZXhhY3QpOwogICAgaWYgKCFyZXR2YWwgfHwgIWV4YWN0IHx8ICFzdHJsZW4oYnVmZmVyKSB8fAoJKEVSUk9SX1NVQ0NFU1MgIT0gR2V0TGFzdEVycm9yKCkpKSB7CglpZiAoKEVSUk9SX0ZJTEVfTk9UX0ZPVU5EID09IEdldExhc3RFcnJvcigpKSB8fAoJICAgIChFUlJPUl9JTlZBTElEX05BTUUgPT0gR2V0TGFzdEVycm9yKCkpKQoJICAgIHRyYWNlKCJ0aGlzIHRlc3QgcmVxdWlyZXMgYSBkZWZhdWx0IHByaW50ZXIgdG8gYmUgc2V0XG4iKTsKCWVsc2UgewoJCW9rKCAwLCAiZnVuY3Rpb24gY2FsbCBHZXREZWZhdWx0UHJpbnRlckEgZmFpbGVkIHVuZXhwZWN0ZWQhXG4iCgkJImZ1bmN0aW9uIHJldHVybmVkICVzXG4iCgkJImxhc3QgZXJyb3IgMHglMDhseFxuIgoJCSJyZXR1cm5lZCBidWZmZXIgc2l6ZSAweCUwOGx4XG4iCgkJInJldHVybmVkIGJ1ZmZlciBjb250ZW50ICVzXG4iLAoJCXJldHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIsIEdldExhc3RFcnJvcigpLCBleGFjdCwgYnVmZmVyKTsKCX0KCXJldHVybjsKICAgIH0KICAgIFNldExhc3RFcnJvcihFUlJPUl9TVUNDRVNTKTsKICAgIHJldHZhbCA9IHBHZXREZWZhdWx0UHJpbnRlckEoTlVMTCwgTlVMTCk7IAogICAgb2soICFyZXR2YWwsICJmdW5jdGlvbiByZXN1bHQgd3JvbmchIEZhbHNlIGV4cGVjdGVkXG4iKTsKICAgIG9rKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiA9PSBHZXRMYXN0RXJyb3IoKSwKCSJMYXN0IGVycm9yIHdyb25nISBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBleHBlY3RlZCwgZ290IDB4JTA4bHhcbiIsCglHZXRMYXN0RXJyb3IoKSk7CgogICAgU2V0TGFzdEVycm9yKEVSUk9SX1NVQ0NFU1MpOwogICAgcmV0dmFsID0gcEdldERlZmF1bHRQcmludGVyQShidWZmZXIsIE5VTEwpOyAKICAgIG9rKCAhcmV0dmFsLCAiZnVuY3Rpb24gcmVzdWx0IHdyb25nISBGYWxzZSBleHBlY3RlZFxuIik7CiAgICBvayggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgPT0gR2V0TGFzdEVycm9yKCksCgkiTGFzdCBlcnJvciB3cm9uZyEgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgZXhwZWN0ZWQsIGdvdCAweCUwOGx4XG4iLAoJR2V0TGFzdEVycm9yKCkpOwoKICAgIFNldExhc3RFcnJvcihFUlJPUl9TVUNDRVNTKTsKICAgIHNpemUgPSAwOwogICAgcmV0dmFsID0gcEdldERlZmF1bHRQcmludGVyQShOVUxMLCAmc2l6ZSk7IAogICAgb2soICFyZXR2YWwsICJmdW5jdGlvbiByZXN1bHQgd3JvbmchIEZhbHNlIGV4cGVjdGVkXG4iKTsKICAgIG9rKCBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSID09IEdldExhc3RFcnJvcigpLAoJIkxhc3QgZXJyb3Igd3JvbmchIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgZXhwZWN0ZWQsIGdvdCAweCUwOGx4XG4iLAoJR2V0TGFzdEVycm9yKCkpOwogICAgb2soIHNpemUgPT0gZXhhY3QsICJQYXJhbWV0ZXIgc2l6ZSB3cm9uZyEgJWxkIGV4cGVjdGVkIGdvdCAlbGRcbiIsCglleGFjdCwgc2l6ZSk7CgogICAgU2V0TGFzdEVycm9yKEVSUk9SX1NVQ0NFU1MpOwogICAgc2l6ZSA9IERFRkFVTFRfUFJJTlRFUl9TSVpFOwogICAgcmV0dmFsID0gcEdldERlZmF1bHRQcmludGVyQShOVUxMLCAmc2l6ZSk7IAogICAgb2soICFyZXR2YWwsICJmdW5jdGlvbiByZXN1bHQgd3JvbmchIEZhbHNlIGV4cGVjdGVkXG4iKTsKICAgIG9rKCBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSID09IEdldExhc3RFcnJvcigpLAoJIkxhc3QgZXJyb3Igd3JvbmchIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgZXhwZWN0ZWQsIGdvdCAweCUwOGx4XG4iLAoJR2V0TGFzdEVycm9yKCkpOwogICAgb2soIHNpemUgPT0gZXhhY3QsICJQYXJhbWV0ZXIgc2l6ZSB3cm9uZyEgJWxkIGV4cGVjdGVkIGdvdCAlbGRcbiIsCglleGFjdCwgc2l6ZSk7CgogICAgc2l6ZSA9IDA7CiAgICByZXR2YWwgPSBwR2V0RGVmYXVsdFByaW50ZXJBKGJ1ZmZlciwgJnNpemUpOyAKICAgIG9rKCAhcmV0dmFsLCAiZnVuY3Rpb24gcmVzdWx0IHdyb25nISBGYWxzZSBleHBlY3RlZFxuIik7CiAgICBvayggRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiA9PSBHZXRMYXN0RXJyb3IoKSwKCSJMYXN0IGVycm9yIHdyb25nISBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGV4cGVjdGVkLCBnb3QgMHglMDhseFxuIiwKCUdldExhc3RFcnJvcigpKTsKICAgIG9rKCBzaXplID09IGV4YWN0LCAiUGFyYW1ldGVyIHNpemUgd3JvbmchICVsZCBleHBlY3RlZCBnb3QgJWxkXG4iLAoJZXhhY3QsIHNpemUpOwoKICAgIHNpemUgPSBleGFjdDsKICAgIHJldHZhbCA9IHBHZXREZWZhdWx0UHJpbnRlckEoYnVmZmVyLCAmc2l6ZSk7IAogICAgb2soIHJldHZhbCwgImZ1bmN0aW9uIHJlc3VsdCB3cm9uZyEgVHJ1ZSBleHBlY3RlZFxuIik7CiAgICBvayggc2l6ZSA9PSBleGFjdCwgIlBhcmFtZXRlciBzaXplIHdyb25nISAlbGQgZXhwZWN0ZWQgZ290ICVsZFxuIiwKCWV4YWN0LCBzaXplKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9HZXRQcmludGVyRHJpdmVyRGlyZWN0b3J5KHZvaWQpCnsKICAgIExQQllURSBidWZmZXIgPSBOVUxMOwogICAgRFdPUkQgIGNiQnVmID0gMCwgcGNiTmVlZGVkID0gMDsKICAgIEJPT0wgICByZXM7CgogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gR2V0UHJpbnRlckRyaXZlckRpcmVjdG9yeUEoIE5VTEwsIE5VTEwsIDEsIE5VTEwsIDAsICZjYkJ1Zik7CiAgICB0cmFjZSgiZmlyc3QgY2FsbCByZXR1cm5lZCAweCUwNHgsIHdpdGggJWxkOiBidWZmZXIgc2l6ZSAweCUwOGx4XG4iLAogICAgcmVzLCBHZXRMYXN0RXJyb3IoKSwgY2JCdWYpOwoKICAgIFJFVFVSTl9PTl9ERUFDVElWQVRFRF9TUE9PTEVSKHJlcykKICAgIG9rKChyZXMgPT0gMCkgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpLAogICAgICAgICJyZXR1cm5lZCAlZCB3aXRoIGxhc3RlcnJvcj0lbGQgKGV4cGVjdGVkICcwJyB3aXRoICIgXAogICAgICAgICJFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgaWYgKCFjYkJ1ZikgewogICAgICAgIHRyYWNlKCJubyB2YWxpZCBidWZmZXIgc2l6ZSByZXR1cm5lZCwgc2tpcHBpbmcgdGVzdHNcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBidWZmZXIgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNiQnVmKjIpOwogICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSAgcmV0dXJuIDsKCiAgICByZXMgPSBHZXRQcmludGVyRHJpdmVyRGlyZWN0b3J5QShOVUxMLCBOVUxMLCAxLCBidWZmZXIsIGNiQnVmLCAmcGNiTmVlZGVkKTsKICAgIG9rKCByZXMsICJleHBlY3RlZCByZXN1bHQgIT0gMCwgZ290ICVkXG4iLCByZXMpOwogICAgb2soIGNiQnVmID09IHBjYk5lZWRlZCwgInBjYk5lZWRlZCBzZXQgdG8gJWxkIGluc3RlYWQgb2YgJWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiTmVlZGVkLCBjYkJ1Zik7CgogICAgcmVzID0gR2V0UHJpbnRlckRyaXZlckRpcmVjdG9yeUEoTlVMTCwgTlVMTCwgMSwgYnVmZmVyLCBjYkJ1ZioyLCAmcGNiTmVlZGVkKTsKICAgIG9rKCByZXMsICJleHBlY3RlZCByZXN1bHQgIT0gMCwgZ290ICVkXG4iLCByZXMpOwogICAgb2soIGNiQnVmID09IHBjYk5lZWRlZCwgInBjYk5lZWRlZCBzZXQgdG8gJWxkIGluc3RlYWQgb2YgJWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNiTmVlZGVkLCBjYkJ1Zik7CiAKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByaW50ZXJEcml2ZXJEaXJlY3RvcnlBKCBOVUxMLCBOVUxMLCAxLCBidWZmZXIsIGNiQnVmLTEsICZwY2JOZWVkZWQpOwogICAgb2soICFyZXMgLCAiZXhwZWN0ZWQgcmVzdWx0ID09IDAsIGdvdCAlZFxuIiwgcmVzKTsKICAgIG9rKCBjYkJ1ZiA9PSBwY2JOZWVkZWQsICJwY2JOZWVkZWQgc2V0IHRvICVsZCBpbnN0ZWFkIG9mICVsZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjYk5lZWRlZCwgY2JCdWYpOwogICAgCiAgICBvayggRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiA9PSBHZXRMYXN0RXJyb3IoKSwKICAgICAgICAibGFzdCBlcnJvciBzZXQgdG8gJWxkIGluc3RlYWQgb2YgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUlxuIiwKICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CgovKgogICAgRG8gbm90IGFkZCB0aGUgbmV4dCB0ZXN0OgogICAgWFBzcDI6IGNyYXNoIGluIHRoaXMgYXBwLCB3aGVuIHRoZSBzcG9vbGVyIGlzIG5vdCBydW5uaW5nIAogICAgTlQzLjU6IEVSUk9SX0lOVkFMSURfVVNFUl9CVUZGRVIKICAgIHdpbjl4OiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUgoKICAgIHBjYk5lZWRlZCA9IE1BR0lDX0RFQUQ7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBHZXRQcmludGVyRHJpdmVyRGlyZWN0b3J5QSggTlVMTCwgTlVMTCwgMSwgTlVMTCwgY2JCdWYsICZwY2JOZWVkZWQpOwoqLwoKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByaW50ZXJEcml2ZXJEaXJlY3RvcnlBKCBOVUxMLCBOVUxMLCAxLCBidWZmZXIsIGNiQnVmLCBOVUxMKTsKICAgIG9rKCAoIXJlcyAmJiBSUENfWF9OVUxMX1JFRl9QT0lOVEVSID09IEdldExhc3RFcnJvcigpKSB8fCByZXMsCiAgICAgICAgICJleHBlY3RlZCBlaXRoZXIgcmVzdWx0ID09IDAgYW5kICIKICAgICAgICAgImxhc3QgZXJyb3IgPT0gUlBDX1hfTlVMTF9SRUZfUE9JTlRFUiBvciByZXN1bHQgIT0gMCAiCiAgICAgICAgICJnb3QgcmVzdWx0ICVkIGFuZCBsYXN0IGVycm9yID09ICVsZFxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gR2V0UHJpbnRlckRyaXZlckRpcmVjdG9yeUEoIE5VTEwsIE5VTEwsIDEsIE5VTEwsIGNiQnVmLCBOVUxMKTsKICAgIG9rKHJlcyB8fCAoR2V0TGFzdEVycm9yKCkgPT0gUlBDX1hfTlVMTF9SRUZfUE9JTlRFUiksCiAgICAgICAgInJldHVybmVkICVkIHdpdGggJWxkIChleHBlY3RlZCAnIT0wJyBvciAnMCcgd2l0aCAiIFwKICAgICAgICAiUlBDX1hfTlVMTF9SRUZfUE9JTlRFUilcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogCiAKICAgIC8qIHdpdGggYSB2YWxpZCBidWZmZXIsIGJ1dCBsZXZlbCBpcyB0b28gbGFyZ2UgKi8KICAgIGJ1ZmZlclswXSA9ICdcMCc7CiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBHZXRQcmludGVyRHJpdmVyRGlyZWN0b3J5QShOVUxMLCBOVUxMLCAyLCBidWZmZXIsIGNiQnVmLCAmcGNiTmVlZGVkKTsKCiAgICAvKiBMZXZlbCBub3QgY2hlY2tlZCBpbiB3aW45eCBhbmQgd2luZToqLwogICAgaWYoKHJlcyAhPSBGQUxTRSkgJiYgYnVmZmVyWzBdKQogICAgewogICAgICAgIHRyYWNlKCJMZXZlbCAnMicgbm90IGNoZWNrZWQgJyVzJ1xuIiwgYnVmZmVyKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBvayggIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9MRVZFTCksCiAgICAgICAgInJldHVybmVkICVkIHdpdGggbGFzdGVycm9yPSVsZCAoZXhwZWN0ZWQgJzAnIHdpdGggIiBcCiAgICAgICAgIkVSUk9SX0lOVkFMSURfTEVWRUwpXG4iLCByZXMsIEdldExhc3RFcnJvcigpKTsKICAgIH0KCiAgICAvKiBwcmludGluZyBlbnZpcm9ubWVudHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUgKi8KICAgIC8qICJXaW5kb3dzIDQuMCIgaXMgdmFsaWQgZm9yIHdpbjl4IGFuZCBOVCAqLwogICAgYnVmZmVyWzBdID0gJ1wwJzsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByaW50ZXJEcml2ZXJEaXJlY3RvcnlBKE5VTEwsIGVudl93aW45eF9jYXNlLCAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgY2JCdWYqMiwgJnBjYk5lZWRlZCk7CgogICAgaWYoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikpIHsKICAgICAgICBjYkJ1ZiA9IHBjYk5lZWRlZDsKICAgICAgICBidWZmZXIgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIsIGNiQnVmKjIpOwogICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgIHJldHVybiA7CgogICAgICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgICAgICByZXMgPSBHZXRQcmludGVyRHJpdmVyRGlyZWN0b3J5QShOVUxMLCBlbnZfd2luOXhfY2FzZSwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGNiQnVmKjIsICZwY2JOZWVkZWQpOwogICAgfQoKICAgIG9rKHJlcyAmJiBidWZmZXJbMF0sICJyZXR1cm5lZCAlZCB3aXRoICIgXAogICAgICAgICJsYXN0ZXJyb3I9JWxkIGFuZCBsZW49JWQgKGV4cGVjdGVkICcxJyB3aXRoICdsZW4gPiAwJylcbiIsIAogICAgICAgIHJlcywgR2V0TGFzdEVycm9yKCksIGxzdHJsZW5BKChjaGFyICopYnVmZmVyKSk7CgogICAgYnVmZmVyWzBdID0gJ1wwJzsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByaW50ZXJEcml2ZXJEaXJlY3RvcnlBKE5VTEwsIGVudl94ODYsIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBjYkJ1ZioyLCAmcGNiTmVlZGVkKTsKCiAgICBpZighcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSkgewogICAgICAgIGNiQnVmID0gcGNiTmVlZGVkOwogICAgICAgIGJ1ZmZlciA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciwgY2JCdWYqMik7CiAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSAgcmV0dXJuIDsKCiAgICAgICAgYnVmZmVyWzBdID0gJ1wwJzsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gR2V0UHJpbnRlckRyaXZlckRpcmVjdG9yeUEoTlVMTCwgZW52X3g4NiwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGNiQnVmKjIsICZwY2JOZWVkZWQpOwogICAgfQoKICAgIC8qICJXaW5kb3dzIE5UIHg4NiIgaXMgaW52YWxpZCBmb3Igd2luOXggKi8KICAgIG9rKCAocmVzICYmIGJ1ZmZlclswXSkgfHwKICAgICAgICAoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9FTlZJUk9OTUVOVCkpLCAKICAgICAgICAicmV0dXJuZWQgJWQgd2l0aCBsYXN0ZXJyb3I9JWxkIGFuZCBsZW49JWQgKGV4cGVjdGVkICchPSAwJyB3aXRoICIgXAogICAgICAgICInbGVuID4gMCcgb3IgJzAnIHdpdGggRVJST1JfSU5WQUxJRF9FTlZJUk9OTUVOVClcbiIsCiAgICAgICAgcmVzLCBHZXRMYXN0RXJyb3IoKSwgbHN0cmxlbkEoKGNoYXIgKilidWZmZXIpKTsKCiAgICAvKiBBIFNldHVwLVByb2dyYW1tIChQREZDcmVhdG9yXzAuOC4wKSB1c2UgZW1wdHkgc3RyaW5ncyAqLwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gR2V0UHJpbnRlckRyaXZlckRpcmVjdG9yeUEoIiIsICIiLCAxLCBidWZmZXIsIGNiQnVmKjIsICZwY2JOZWVkZWQpOwogICAgb2socmVzLCAicmV0dXJuZWQgJWQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSApOwoKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByaW50ZXJEcml2ZXJEaXJlY3RvcnlBKE5VTEwsICIiLCAxLCBidWZmZXIsIGNiQnVmKjIsICZwY2JOZWVkZWQpOwogICAgb2socmVzLCAicmV0dXJuZWQgJWQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSApOwoKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByaW50ZXJEcml2ZXJEaXJlY3RvcnlBKCIiLCBOVUxMLCAxLCBidWZmZXIsIGNiQnVmKjIsICZwY2JOZWVkZWQpOwogICAgb2socmVzLCAicmV0dXJuZWQgJWQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSApOwoKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X09wZW5QcmludGVyKHZvaWQpCnsKICAgIFBSSU5URVJfREVGQVVMVFNBIGRlZmF1bHRzOwogICAgSEFORExFICBocHJpbnRlcjsKICAgIExQU1RSICAgZGVmYXVsdF9wcmludGVyOwogICAgRFdPUkQgICByZXM7CiAgICBEV09SRCAgIHNpemU7CiAgICBDSEFSICAgIGJ1ZmZlcltERUZBVUxUX1BSSU5URVJfU0laRV07CiAgICBMUFNUUiAgIHB0cjsKCiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBPcGVuUHJpbnRlcihOVUxMLCBOVUxMLCBOVUxMKTsgICAgCiAgICAvKiBUaGUgZGVhY3RpdmF0ZWQgU3Bvb2xlciBpcyBjYXRjaGVkIGhlcmUgb24gTlQzLjUxICovCiAgICBSRVRVUk5fT05fREVBQ1RJVkFURURfU1BPT0xFUihyZXMpCiAgICBvayghcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpXG4iLAogICAgICAgIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKCiAgICAvKiBHZXQgSGFuZGxlIGZvciB0aGUgbG9jYWwgUHJpbnRzZXJ2ZXIgKE5UIG9ubHkpKi8KICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IE9wZW5QcmludGVyKE5VTEwsICZocHJpbnRlciwgTlVMTCk7CiAgICAvKiBUaGUgZGVhY3RpdmF0ZWQgU3Bvb2xlciBpcyBjYXRjaGVkIGhlcmUgb24gWFBzcDIgKi8KICAgIFJFVFVSTl9PTl9ERUFDVElWQVRFRF9TUE9PTEVSKHJlcykKICAgIG9rKHJlcyB8fCAoIXJlcyAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpXG4iLAogICAgICAgIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgaWYocmVzKSB7CiAgICAgICAgQ2xvc2VQcmludGVyKGhwcmludGVyKTsKCiAgICAgICAgZGVmYXVsdHMucERhdGF0eXBlPU5VTEw7CiAgICAgICAgZGVmYXVsdHMucERldk1vZGU9TlVMTDsKCiAgICAgICAgZGVmYXVsdHMuRGVzaXJlZEFjY2Vzcz0wOwogICAgICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gT3BlblByaW50ZXIoTlVMTCwgJmhwcmludGVyLCAmZGVmYXVsdHMpOwogICAgICAgIG9rKHJlcywgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcpXG4iLCByZXMsIEdldExhc3RFcnJvcigpKTsKICAgICAgICBpZiAocmVzKSBDbG9zZVByaW50ZXIoaHByaW50ZXIpOwoKICAgICAgICBkZWZhdWx0cy5EZXNpcmVkQWNjZXNzPS0xOwogICAgICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gT3BlblByaW50ZXIoTlVMTCwgJmhwcmludGVyLCAmZGVmYXVsdHMpOwogICAgICAgIG9rKCFyZXMgJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQUNDRVNTX0RFTklFRCwKICAgICAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGggRVJST1JfQUNDRVNTX0RFTklFRClcbiIsIAogICAgICAgICAgICByZXMsIEdldExhc3RFcnJvcigpKTsKICAgICAgICBpZiAocmVzKSBDbG9zZVByaW50ZXIoaHByaW50ZXIpOwoKICAgIH0KCiAgICBzaXplID0gc2l6ZW9mKGJ1ZmZlcikgLSAzIDsKICAgIHB0ciA9IGJ1ZmZlcjsKICAgIHB0clswXSA9ICdcXCc7CiAgICBwdHIrKzsKICAgIHB0clswXSA9ICdcXCc7CiAgICBwdHIrKzsKICAgIGlmIChHZXRDb21wdXRlck5hbWVBKHB0ciwgJnNpemUpKSB7CgogICAgICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gT3BlblByaW50ZXIoYnVmZmVyLCAmaHByaW50ZXIsIE5VTEwpOwogICAgICAgIHRvZG9fd2luZSB7CiAgICAgICAgb2socmVzIHx8ICghcmVzICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSwKICAgICAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpXG4iLAogICAgICAgICAgICByZXMsIEdldExhc3RFcnJvcigpKTsKICAgICAgICB9CiAgICAgICAgaWYocmVzKSBDbG9zZVByaW50ZXIoaHByaW50ZXIpOwogICAgfQoKICAgIC8qIEludmFsaWQgUHJpbnRlcm5hbWUgKi8KICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IE9wZW5QcmludGVyKCJpbGxlZ2FsLG5hbWUiLCAmaHByaW50ZXIsIE5VTEwpOwogICAgb2soIXJlcyAmJiAoKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKSB8fCAKICAgICAgICAgICAgICAgIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgKSwKICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoOiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBvciIgXAogICAgICAgIkVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CiAgICBpZihyZXMpIENsb3NlUHJpbnRlcihocHJpbnRlcik7CgoKICAgIC8qIEdldCBIYW5kbGUgZm9yIHRoZSBkZWZhdWx0IFByaW50ZXIgKi8KICAgIGlmICgoZGVmYXVsdF9wcmludGVyID0gZmluZF9kZWZhdWx0X3ByaW50ZXIoKSkpCiAgICB7CiAgICAgICAgaHByaW50ZXIgPSAoSEFORExFKSBNQUdJQ19ERUFEOwogICAgICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgICAgICByZXMgPSBPcGVuUHJpbnRlcihkZWZhdWx0X3ByaW50ZXIsICZocHJpbnRlciwgTlVMTCk7CiAgICAgICAgaWYoKCFyZXMpICYmIChHZXRMYXN0RXJyb3IoKSA9PSBSUENfU19TRVJWRVJfVU5BVkFJTEFCTEUpKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHRyYWNlKCJUaGUgU2VydmljZSAnU3Bvb2xlcicgaXMgcmVxdWlyZWQgZm9yICclcydcbiIsIGRlZmF1bHRfcHJpbnRlcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgb2socmVzLCAicmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnIT0wJylcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIGlmKHJlcykgQ2xvc2VQcmludGVyKGhwcmludGVyKTsKCiAgICAgICAgZGVmYXVsdHMucERhdGF0eXBlPU5VTEw7CiAgICAgICAgZGVmYXVsdHMucERldk1vZGU9TlVMTDsKICAgICAgICBkZWZhdWx0cy5EZXNpcmVkQWNjZXNzPTA7CgogICAgICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gT3BlblByaW50ZXIoZGVmYXVsdF9wcmludGVyLCAmaHByaW50ZXIsICZkZWZhdWx0cyk7CiAgICAgICAgb2socmVzIHx8IEdldExhc3RFcnJvcigpID09IEVSUk9SX0FDQ0VTU19ERU5JRUQsCiAgICAgICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnIG9yICcwJyB3aXRoICIgXAogICAgICAgICAgICAiRVJST1JfQUNDRVNTX0RFTklFRClcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIGlmKHJlcykgQ2xvc2VQcmludGVyKGhwcmludGVyKTsKCiAgICAgICAgZGVmYXVsdHMucERhdGF0eXBlPSIiOwoKICAgICAgICBocHJpbnRlciA9IChIQU5ETEUpIE1BR0lDX0RFQUQ7CiAgICAgICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgICAgIHJlcyA9IE9wZW5QcmludGVyKGRlZmF1bHRfcHJpbnRlciwgJmhwcmludGVyLCAmZGVmYXVsdHMpOwogICAgICAgIC8qIHN0b3AgaGVyZSwgd2hlbiBhIHJlbW90ZSBQcmludHNlcnZlciBoYXMgbm8gUlBDLVNlcnZpY2UgcnVubmluZyAqLwogICAgICAgIFJFVFVSTl9PTl9ERUFDVElWQVRFRF9TUE9PTEVSKHJlcykKICAgICAgICBvayhyZXMgfHwgKChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0RBVEFUWVBFKSB8fAogICAgICAgICAgICAgICAgICAgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0FDQ0VTU19ERU5JRUQpKSwKICAgICAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGg6ICIgXAogICAgICAgICAgICAiRVJST1JfSU5WQUxJRF9EQVRBVFlQRSBvciBFUlJPUl9BQ0NFU1NfREVOSUVEKVxuIiwKICAgICAgICAgICAgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgaWYocmVzKSBDbG9zZVByaW50ZXIoaHByaW50ZXIpOwoKCiAgICAgICAgZGVmYXVsdHMucERhdGF0eXBlPU5VTEw7CiAgICAgICAgZGVmYXVsdHMuRGVzaXJlZEFjY2Vzcz1QUklOVEVSX0FDQ0VTU19VU0U7CgogICAgICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gT3BlblByaW50ZXIoZGVmYXVsdF9wcmludGVyLCAmaHByaW50ZXIsICZkZWZhdWx0cyk7CiAgICAgICAgb2socmVzIHx8IEdldExhc3RFcnJvcigpID09IEVSUk9SX0FDQ0VTU19ERU5JRUQsCiAgICAgICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnIG9yICcwJyB3aXRoICIgXAogICAgICAgICAgICAiRVJST1JfQUNDRVNTX0RFTklFRClcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIGlmKHJlcykgQ2xvc2VQcmludGVyKGhwcmludGVyKTsKCgogICAgICAgIGRlZmF1bHRzLkRlc2lyZWRBY2Nlc3M9UFJJTlRFUl9BTExfQUNDRVNTOwogICAgICAgIGhwcmludGVyID0gKEhBTkRMRSkgTUFHSUNfREVBRDsKICAgICAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICAgICAgcmVzID0gT3BlblByaW50ZXIoZGVmYXVsdF9wcmludGVyLCAmaHByaW50ZXIsICZkZWZhdWx0cyk7CiAgICAgICAgb2socmVzIHx8IEdldExhc3RFcnJvcigpID09IEVSUk9SX0FDQ0VTU19ERU5JRUQsCiAgICAgICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnIG9yICcwJyB3aXRoICIgXAogICAgICAgICAgICAiRVJST1JfQUNDRVNTX0RFTklFRClcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIGlmKHJlcykgQ2xvc2VQcmludGVyKGhwcmludGVyKTsKICAgIH0KCn0KCgpzdGF0aWMgdm9pZCB0ZXN0X1NldERlZmF1bHRQcmludGVyKHZvaWQpCnsKICAgIERXT1JEICAgcmVzOwogICAgTFBTVFIgICBkZWZhdWx0X3ByaW50ZXI7CiAgICBEV09SRCAgIHNpemUgPSBERUZBVUxUX1BSSU5URVJfU0laRTsKICAgIENIQVIgICAgYnVmZmVyW0RFRkFVTFRfUFJJTlRFUl9TSVpFXTsKICAgIENIQVIgICAgb3JnX3ZhbHVlW0RFRkFVTFRfUFJJTlRFUl9TSVpFXTsKCgogICAgaWYgKCFwU2V0RGVmYXVsdFByaW50ZXJBKSAgcmV0dXJuOwoJLyogb25seSBzdXBwb3J0ZWQgb24gd2luMmsgYW5kIGFib3ZlICovCgogICAgZGVmYXVsdF9wcmludGVyID0gZmluZF9kZWZhdWx0X3ByaW50ZXIoKTsKCiAgICAvKiBiYWNrdXAgdGhlIG9yaWdpbmFsIHZhbHVlICovCiAgICBvcmdfdmFsdWVbMF0gPSAnXDAnOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gR2V0UHJvZmlsZVN0cmluZ0EoIndpbmRvd3MiLCAiZGV2aWNlIiwgTlVMTCwgb3JnX3ZhbHVlLCBzaXplKTsKCiAgICAvKiBmaXJzdCBwYXJ0OiB3aXRoIHRoZSBkZWZhdWx0IFByaW50ZXIgKi8KICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IHBTZXREZWZhdWx0UHJpbnRlckEoIm5vX3ByaW50ZXJfd2l0aF90aGlzX25hbWUiKTsKCiAgICBSRVRVUk5fT05fREVBQ1RJVkFURURfU1BPT0xFUihyZXMpCiAgICAvKiBzcG9vbGVyIGlzIHJ1bm5pbmcgb3Igd2UgaGF2ZSBubyBzcG9vbGVyIGhlcmUqLwoKICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiB3aW5lICovCiAgICBpZiAoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpKSB7CiAgICAgICAgdHJhY2UoIlNldERlZmF1bHRQcmludGVyQSgpIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgb2soIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9QUklOVEVSX05BTUUpLAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICcwJyB3aXRoICIgXAogICAgICAgICJFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSlcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIFdyaXRlUHJvZmlsZVN0cmluZ0EoIndpbmRvd3MiLCAiZGV2aWNlIiwgb3JnX3ZhbHVlKTsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IHBTZXREZWZhdWx0UHJpbnRlckEoIiIpOwogICAgb2socmVzIHx8ICghcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSkpLAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnIG9yICcwJyB3aXRoICIgXAogICAgICAgICJFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSlcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIFdyaXRlUHJvZmlsZVN0cmluZ0EoIndpbmRvd3MiLCAiZGV2aWNlIiwgb3JnX3ZhbHVlKTsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IHBTZXREZWZhdWx0UHJpbnRlckEoTlVMTCk7CiAgICBvayhyZXMgfHwgKCFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKSksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGggIiBcCiAgICAgICAgIkVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgV3JpdGVQcm9maWxlU3RyaW5nQSgid2luZG93cyIsICJkZXZpY2UiLCBvcmdfdmFsdWUpOwogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gcFNldERlZmF1bHRQcmludGVyQShkZWZhdWx0X3ByaW50ZXIpOwogICAgb2socmVzIHx8ICghcmVzICYmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSkpLAogICAgICAgICJyZXR1cm5lZCAlbGQgd2l0aCAlbGQgKGV4cGVjdGVkICchPTAnIG9yICcwJyB3aXRoICIgXAogICAgICAgICJFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSlcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKCiAgICAvKiBzZWNvbmQgcGFydDogYWx3YXlzIHdpdGhvdXQgYSBkZWZhdWx0IFByaW50ZXIgKi8KICAgIFdyaXRlUHJvZmlsZVN0cmluZ0EoIndpbmRvd3MiLCAiZGV2aWNlIiwgTlVMTCk7ICAgIAogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gcFNldERlZmF1bHRQcmludGVyQSgibm9fcHJpbnRlcl93aXRoX3RoaXNfbmFtZSIpOwoKICAgIG9rKCFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKSwKICAgICAgICAicmV0dXJuZWQgJWxkIHdpdGggJWxkIChleHBlY3RlZCAnMCcgd2l0aCAiIFwKICAgICAgICAiRVJST1JfSU5WQUxJRF9QUklOVEVSX05BTUUpXG4iLCByZXMsIEdldExhc3RFcnJvcigpKTsKCiAgICBXcml0ZVByb2ZpbGVTdHJpbmdBKCJ3aW5kb3dzIiwgImRldmljZSIsIE5VTEwpOyAgICAKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IHBTZXREZWZhdWx0UHJpbnRlckEoIiIpOwogICAgLyogd2UgZ2V0IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FIHdoZW4gbm8gcHJpbnRlciBpcyBpbnN0YWxsZWQgKi8KICAgIG9rKHJlcyB8fCAoIXJlcyAmJiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5WQUxJRF9QUklOVEVSX05BTUUpKSwKICAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGggIiBcCiAgICAgICAgICJFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSlcbiIsIHJlcywgR2V0TGFzdEVycm9yKCkpOwoKICAgIFdyaXRlUHJvZmlsZVN0cmluZ0EoIndpbmRvd3MiLCAiZGV2aWNlIiwgTlVMTCk7ICAgIAogICAgU2V0TGFzdEVycm9yKE1BR0lDX0RFQUQpOwogICAgcmVzID0gcFNldERlZmF1bHRQcmludGVyQShOVUxMKTsKICAgIC8qIHdlIGdldCBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSB3aGVuIG5vIHByaW50ZXIgaXMgaW5zdGFsbGVkICovCiAgICBvayhyZXMgfHwgKCFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKSksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGggIiBcCiAgICAgICAgIkVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgV3JpdGVQcm9maWxlU3RyaW5nQSgid2luZG93cyIsICJkZXZpY2UiLCBOVUxMKTsgICAgCiAgICBTZXRMYXN0RXJyb3IoTUFHSUNfREVBRCk7CiAgICByZXMgPSBwU2V0RGVmYXVsdFByaW50ZXJBKGRlZmF1bHRfcHJpbnRlcik7CiAgICBvayhyZXMgfHwgKCFyZXMgJiYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKSksCiAgICAgICAgInJldHVybmVkICVsZCB3aXRoICVsZCAoZXhwZWN0ZWQgJyE9MCcgb3IgJzAnIHdpdGggIiBcCiAgICAgICAgIkVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FKVxuIiwgcmVzLCBHZXRMYXN0RXJyb3IoKSk7CgogICAgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWUgKi8KICAgIHJlcyA9IHBTZXREZWZhdWx0UHJpbnRlckEoZGVmYXVsdF9wcmludGVyKTsgICAgICAgICAgLyogdGhlIG5pY2Ugd2F5ICovCiAgICBXcml0ZVByb2ZpbGVTdHJpbmdBKCJ3aW5kb3dzIiwgImRldmljZSIsIG9yZ192YWx1ZSk7IC8qIHRoZSBvbGQgd2F5ICovCgogICAgYnVmZmVyWzBdID0gJ1wwJzsKICAgIFNldExhc3RFcnJvcihNQUdJQ19ERUFEKTsKICAgIHJlcyA9IEdldFByb2ZpbGVTdHJpbmdBKCJ3aW5kb3dzIiwgImRldmljZSIsIE5VTEwsIGJ1ZmZlciwgc2l6ZSk7CiAgICBvayghbHN0cmNtcEEob3JnX3ZhbHVlLCBidWZmZXIpLCAiJyVzJyAoZXhwZWN0ZWQgJyVzJylcbiIsIGJ1ZmZlciwgb3JnX3ZhbHVlKTsKCn0KCnN0YXRpYyB2b2lkIHRlc3RfR2V0UHJpbnRlckRyaXZlcih2b2lkKQp7CiAgICBMUFNUUiBkZWZhdWx0X3ByaW50ZXI7CiAgICBIQU5ETEUgaHBybjsKICAgIEJPT0wgcmV0OwogICAgQllURSAqYnVmOwogICAgSU5UIGxldmVsOwogICAgRFdPUkQgbmVlZGVkLCBmaWxsZWQ7CgogICAgZGVmYXVsdF9wcmludGVyID0gZmluZF9kZWZhdWx0X3ByaW50ZXIoKTsKICAgIGlmICghZGVmYXVsdF9wcmludGVyKQogICAgewogICAgICAgIHRyYWNlKCJUaGVyZSBpcyBubyBkZWZhdWx0IHByaW50ZXIgaW5zdGFsbGVkLCBza2lwaW5nIHRoZSB0ZXN0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaHBybiA9IDA7CiAgICByZXQgPSBPcGVuUHJpbnRlcihkZWZhdWx0X3ByaW50ZXIsICZocHJuLCBOVUxMKTsKICAgIGlmICghcmV0KQogICAgewogICAgICAgIHRyYWNlKCJUaGVyZSBpcyBubyBwcmludGVycyBpbnN0YWxsZWQsIHNraXBpbmcgdGhlIHRlc3RcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG9rKGhwcm4gIT0gMCwgIndyb25nIGhwcm4gJXBcbiIsIGhwcm4pOwoKICAgIGZvciAobGV2ZWwgPSAtMTsgbGV2ZWwgPD0gNzsgbGV2ZWwrKykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoMHhkZWFkYmVlZik7CiAgICAgICAgbmVlZGVkID0gKERXT1JEKS0xOwogICAgICAgIHJldCA9IEdldFByaW50ZXJEcml2ZXIoaHBybiwgTlVMTCwgbGV2ZWwsIE5VTEwsIDAsICZuZWVkZWQpOwogICAgICAgIG9rKCFyZXQsICJsZXZlbCAlZDogR2V0UHJpbnRlckRyaXZlciBzaG91bGQgZmFpbFxuIiwgbGV2ZWwpOwogICAgICAgIGlmIChsZXZlbCA+PSAxICYmIGxldmVsIDw9IDYpCiAgICAgICAgewogICAgICAgICAgICAvKiBOb3QgYWxsIGxldmVscyBhcmUgc3VwcG9ydGVkIG9uIGFsbCBXaW5kb3dzLVZlcnNpb25zICovCiAgICAgICAgICAgIGlmKEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOVkFMSURfTEVWRUwpIGNvbnRpbnVlOwogICAgICAgICAgICBvayhHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSLCAid3JvbmcgZXJyb3IgJWxkXG4iLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgICAgIG9rKG5lZWRlZCA+IDAsIm5vdCBleHBlY3RlZCBuZWVkZWQgYnVmZmVyIHNpemUgJWxkXG4iLCBuZWVkZWQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBFUlJPUl9PVVRPRk1FTU9SWSBmb3VuZCBvbiB3aW45eCAqLwogICAgICAgICAgICBvayggKChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0xFVkVMKSB8fAogICAgICAgICAgICAgICAgIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9PVVRPRk1FTU9SWSkpLAogICAgICAgICAgICAgICAgIiVkOiByZXR1cm5lZCAlZCB3aXRoICVsZCAoZXhwZWN0ZWQgJzAnIHdpdGg6ICIgXAogICAgICAgICAgICAgICAgIkVSUk9SX0lOVkFMSURfTEVWRUwgb3IgRVJST1JfT1VUT0ZNRU1PUlkpXG4iLAogICAgICAgICAgICAgICAgbGV2ZWwsIHJldCwgR2V0TGFzdEVycm9yKCkpOwogICAgICAgICAgICAvKiBuZWVkZWQgaXMgbW9kaWZpZWQgaW4gd2luOXguIFRoZSBtb2RpZmllZCBWYWx1ZSBkZXBlbmRzIG9uIHRoZQogICAgICAgICAgICAgICBkZWZhdWx0IFByaW50ZXIuIHRlc3RpbmcgZm9yICJuZWVkZWQgPT0gKERXT1JEKS0xIiB3aWxsIGZhaWwgKi8KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBidWYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmVlZGVkKTsKCiAgICAgICAgU2V0TGFzdEVycm9yKDB4ZGVhZGJlZWYpOwogICAgICAgIGZpbGxlZCA9IC0xOwogICAgICAgIHJldCA9IEdldFByaW50ZXJEcml2ZXIoaHBybiwgTlVMTCwgbGV2ZWwsIGJ1ZiwgbmVlZGVkLCAmZmlsbGVkKTsKICAgICAgICBvayhyZXQsICJsZXZlbCAlZDogR2V0UHJpbnRlckRyaXZlciBlcnJvciAlbGRcbiIsIGxldmVsLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgb2sobmVlZGVkID09IGZpbGxlZCwgIm5lZWRlZCAlbGQgIT0gZmlsbGVkICVsZFxuIiwgbmVlZGVkLCBmaWxsZWQpOwoKICAgICAgICBpZiAobGV2ZWwgPT0gMikKICAgICAgICB7CiAgICAgICAgICAgIERSSVZFUl9JTkZPXzIgKmRpXzIgPSAoRFJJVkVSX0lORk9fMiAqKWJ1ZjsKICAgICAgICAgICAgRFdPUkQgY2FsY3VsYXRlZCA9IHNpemVvZigqZGlfMik7CgogICAgICAgICAgICAvKiBNU0ROIGlzIHdyb25nOiBUaGUgRHJpdmVycyBvbiB0aGUgd2luOXgtQ0QncyBoYXZlIGNWZXJzaW9uPTB4MDQwMAogICAgICAgICAgICAgICBOVDM1MTogMSwgTlQ0LjArdzJrKEtlcm5lbG1vZGUpOiAyLCB3MmsgYW5kIGFib3ZlKFVzZXJtb2RlKTogMyAgKi8KICAgICAgICAgICAgb2soKGRpXzItPmNWZXJzaW9uID49IDAgJiYgZGlfMi0+Y1ZlcnNpb24gPD0gMykgfHwKICAgICAgICAgICAgICAgIChkaV8yLT5jVmVyc2lvbiA9PSAweDA0MDApLCAiZGlfMi0+Y1ZlcnNpb24gPSAlbGRcbiIsIGRpXzItPmNWZXJzaW9uKTsKICAgICAgICAgICAgb2soZGlfMi0+cE5hbWUgIT0gTlVMTCwgIm5vdCBleHBlY3RlZCBOVUxMIHB0clxuIik7CiAgICAgICAgICAgIG9rKGRpXzItPnBFbnZpcm9ubWVudCAhPSBOVUxMLCAibm90IGV4cGVjdGVkIE5VTEwgcHRyXG4iKTsKICAgICAgICAgICAgb2soZGlfMi0+cERyaXZlclBhdGggIT0gTlVMTCwgIm5vdCBleHBlY3RlZCBOVUxMIHB0clxuIik7CiAgICAgICAgICAgIG9rKGRpXzItPnBEYXRhRmlsZSAhPSBOVUxMLCAibm90IGV4cGVjdGVkIE5VTEwgcHRyXG4iKTsKICAgICAgICAgICAgb2soZGlfMi0+cENvbmZpZ0ZpbGUgIT0gTlVMTCwgIm5vdCBleHBlY3RlZCBOVUxMIHB0clxuIik7CgogICAgICAgICAgICB0cmFjZSgiY1ZlcnNpb24gJWxkXG4iLCBkaV8yLT5jVmVyc2lvbik7CiAgICAgICAgICAgIHRyYWNlKCJwTmFtZSAlc1xuIiwgZGlfMi0+cE5hbWUpOwogICAgICAgICAgICBjYWxjdWxhdGVkICs9IHN0cmxlbihkaV8yLT5wTmFtZSkgKyAxOwogICAgICAgICAgICB0cmFjZSgicEVudmlyb25tZW50ICVzXG4iLCBkaV8yLT5wRW52aXJvbm1lbnQpOwogICAgICAgICAgICBjYWxjdWxhdGVkICs9IHN0cmxlbihkaV8yLT5wRW52aXJvbm1lbnQpICsgMTsKICAgICAgICAgICAgdHJhY2UoInBEcml2ZXJQYXRoICVzXG4iLCBkaV8yLT5wRHJpdmVyUGF0aCk7CiAgICAgICAgICAgIGNhbGN1bGF0ZWQgKz0gc3RybGVuKGRpXzItPnBEcml2ZXJQYXRoKSArIDE7CiAgICAgICAgICAgIHRyYWNlKCJwRGF0YUZpbGUgJXNcbiIsIGRpXzItPnBEYXRhRmlsZSk7CiAgICAgICAgICAgIGNhbGN1bGF0ZWQgKz0gc3RybGVuKGRpXzItPnBEYXRhRmlsZSkgKyAxOwogICAgICAgICAgICB0cmFjZSgicENvbmZpZ0ZpbGUgJXNcbiIsIGRpXzItPnBDb25maWdGaWxlKTsKICAgICAgICAgICAgY2FsY3VsYXRlZCArPSBzdHJsZW4oZGlfMi0+cENvbmZpZ0ZpbGUpICsgMTsKCiAgICAgICAgICAgIC8qIFhQIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGJvdGggQU5TSSBhbmQgdW5pY29kZSBuYW1lcyAqLwogICAgICAgICAgICBvayhmaWxsZWQgPj0gY2FsY3VsYXRlZCwiY2FsY3VsYXRlZCAlbGQgIT0gZmlsbGVkICVsZFxuIiwgY2FsY3VsYXRlZCwgZmlsbGVkKTsKICAgICAgICB9CgogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1Zik7CiAgICB9CgogICAgU2V0TGFzdEVycm9yKDB4ZGVhZGJlZWYpOwogICAgcmV0ID0gQ2xvc2VQcmludGVyKGhwcm4pOwogICAgb2socmV0LCAiQ2xvc2VQcmludGVyIGVycm9yICVsZFxuIiwgR2V0TGFzdEVycm9yKCkpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X0RFVk1PREUoY29uc3QgREVWTU9ERSAqZG0sIExPTkcgZG1TaXplLCBMUENTVFIgZXhwX3Bybl9uYW1lKQp7CiAgICAvKiBPbiBOVDMuNTEsIHNvbWUgZmllbGRzIGluIERFVk1PREUgYXJlIGVtcHR5L3plcm8KICAgICAgKGRtRGV2aWNlTmFtZSwgZG1TcGVjVmVyc2lvbiwgZG1Ecml2ZXJWZXJzaW9uIGFuZCBkbURyaXZlckV4dHJhKQogICAgICAgV2Ugc2tpcCB0aGUgVGVzdHMgb24gdGhpcyBQbGF0Zm9ybSAqLwogICAgaWYgKGRtLT5kbVNwZWNWZXJzaW9uIHx8IGRtLT5kbURyaXZlclZlcnNpb24gfHwgZG0tPmRtRHJpdmVyRXh0cmEpIHsKICAgICAgICAvKiBUaGUgUHJpbnRlcm5hbWUgY2FuIGJlIGxhcmdlciAoTUFYX1BBVEgpIHRoYW4gQ0NIREVWSUNFTkFNRSAgKi8KICAgICAgICBvayghc3RybmNtcChleHBfcHJuX25hbWUsIChMUENTVFIpZG0tPmRtRGV2aWNlTmFtZSwgQ0NIREVWSUNFTkFNRSksIAogICAgICAgICAgICAiZXhwZWN0ZWQgJyVzJywgZ290ICclcydcbiIsIGV4cF9wcm5fbmFtZSwgZG0tPmRtRGV2aWNlTmFtZSk7CiAgICAgICAgb2soZG0tPmRtU2l6ZSArIGRtLT5kbURyaXZlckV4dHJhID09IGRtU2l6ZSwKICAgICAgICAgICAgIiV1ICE9ICVsZFxuIiwgZG0tPmRtU2l6ZSArIGRtLT5kbURyaXZlckV4dHJhLCBkbVNpemUpOwogICAgfQogICAgdHJhY2UoImRtRmllbGRzICUwOGx4XG4iLCBkbS0+ZG1GaWVsZHMpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X0RvY3VtZW50UHJvcGVydGllcyh2b2lkKQp7CiAgICBMUFNUUiBkZWZhdWx0X3ByaW50ZXI7CiAgICBIQU5ETEUgaHBybjsKICAgIExPTkcgZG1fc2l6ZSwgcmV0OwogICAgREVWTU9ERSAqZG07CgogICAgZGVmYXVsdF9wcmludGVyID0gZmluZF9kZWZhdWx0X3ByaW50ZXIoKTsKICAgIGlmICghZGVmYXVsdF9wcmludGVyKQogICAgewogICAgICAgIHRyYWNlKCJUaGVyZSBpcyBubyBkZWZhdWx0IHByaW50ZXIgaW5zdGFsbGVkLCBza2lwaW5nIHRoZSB0ZXN0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaHBybiA9IDA7CiAgICByZXQgPSBPcGVuUHJpbnRlcihkZWZhdWx0X3ByaW50ZXIsICZocHJuLCBOVUxMKTsKICAgIGlmICghcmV0KQogICAgewogICAgICAgIHRyYWNlKCJUaGVyZSBpcyBubyBwcmludGVycyBpbnN0YWxsZWQsIHNraXBpbmcgdGhlIHRlc3RcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG9rKGhwcm4gIT0gMCwgIndyb25nIGhwcm4gJXBcbiIsIGhwcm4pOwoKICAgIGRtX3NpemUgPSBEb2N1bWVudFByb3BlcnRpZXMoMCwgaHBybiwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CiAgICB0cmFjZSgiREVWTU9ERSByZXF1aXJlZCBzaXplICVsZFxuIiwgZG1fc2l6ZSk7CiAgICBvayhkbV9zaXplID49IHNpemVvZihERVZNT0RFKSwgInVuZXhwZWN0ZWQgRG9jdW1lbnRQcm9wZXJ0aWVzIHJldCB2YWx1ZSAlbGRcbiIsIGRtX3NpemUpOwoKICAgIGRtID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIGRtX3NpemUpOwoKICAgIHJldCA9IERvY3VtZW50UHJvcGVydGllcygwLCBocHJuLCBOVUxMLCBkbSwgZG0sIERNX09VVF9CVUZGRVIpOwogICAgb2socmV0ID09IElET0ssICJEb2N1bWVudFByb3BlcnRpZXMgcmV0IHZhbHVlICVsZCAhPSBleHBlY3RlZCBJRE9LXG4iLCByZXQpOwoKICAgIHRlc3RfREVWTU9ERShkbSwgZG1fc2l6ZSwgZGVmYXVsdF9wcmludGVyKTsKCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkbSk7CgogICAgU2V0TGFzdEVycm9yKDB4ZGVhZGJlZWYpOwogICAgcmV0ID0gQ2xvc2VQcmludGVyKGhwcm4pOwogICAgb2socmV0LCAiQ2xvc2VQcmludGVyIGVycm9yICVsZFxuIiwgR2V0TGFzdEVycm9yKCkpOwp9CgpTVEFSVF9URVNUKGluZm8pCnsKICAgIGh3aW5zcG9vbCA9IEdldE1vZHVsZUhhbmRsZUEoIndpbnNwb29sLmRydiIpOwogICAgcEdldERlZmF1bHRQcmludGVyQSA9ICh2b2lkICopIEdldFByb2NBZGRyZXNzKGh3aW5zcG9vbCwgIkdldERlZmF1bHRQcmludGVyQSIpOwogICAgcFNldERlZmF1bHRQcmludGVyQSA9ICh2b2lkICopIEdldFByb2NBZGRyZXNzKGh3aW5zcG9vbCwgIlNldERlZmF1bHRQcmludGVyQSIpOwoKICAgIGZpbmRfZGVmYXVsdF9wcmludGVyKCk7CgogICAgdGVzdF9BZGRNb25pdG9yKCk7CiAgICB0ZXN0X0RlbGV0ZU1vbml0b3IoKTsKICAgIHRlc3RfRG9jdW1lbnRQcm9wZXJ0aWVzKCk7CiAgICB0ZXN0X0VudW1Nb25pdG9ycygpOyAKICAgIHRlc3RfR2V0RGVmYXVsdFByaW50ZXIoKTsKICAgIHRlc3RfR2V0UHJpbnRlckRyaXZlckRpcmVjdG9yeSgpOwogICAgdGVzdF9PcGVuUHJpbnRlcigpOwogICAgdGVzdF9HZXRQcmludGVyRHJpdmVyKCk7CiAgICB0ZXN0X1NldERlZmF1bHRQcmludGVyKCk7Cn0K