LyoKICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAwIEJyYWRsZXkgQmFldHoKICogQ29weXJpZ2h0IDIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogRklYTUU6IFRoaXMgYWxsIGFzc3VtZXMgMzIgYml0IGNvZGVjcwogKgkJV2luOTUgYXBwZWFycyB0byBwcmVmZXIgMzIgYml0IGNvZGVjcywgZXZlbiBmcm9tIDE2IGJpdCBjb2RlLgogKgkJVGhlcmUgaXMgdGhlIElDT3BlbkZ1bmN0aW9uMTYgdG8gd29ycnkgYWJvdXQgc3RpbGwsIHRob3VnaC4KICogICAgICAKICogVE9ETwogKiAgICAgIC0gbm8gdGhyZWFkIHNhZmV0eQogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAibXN2aWRlb19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAid2luZG93c3guaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBEcml2ZXJzMzIgc2V0dGluZ3MgKi8KI2RlZmluZSBIS0xNX0RSSVZFUlMzMiAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb25cXERyaXZlcnMzMiIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG1zdmlkZW8pOwoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp3aW5lX2RiZ3N0cl9mY2MoIERXT1JEIGZjYyApCnsKICAgIHJldHVybiB3aW5lX2RiZ19zcHJpbnRmKCIlYyVjJWMlYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9CWVRFKExPV09SRChmY2MpKSwgSElCWVRFKExPV09SRChmY2MpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQllURShISVdPUkQoZmNjKSksIEhJQllURShISVdPUkQoZmNjKSkpOwp9CgpMUkVTVUxUIChDQUxMQkFDSyAqcEZuQ2FsbFRvMTYpKEhEUlZSLCBISUMsIFVJTlQsIExQQVJBTSwgTFBBUkFNKSA9IE5VTEw7CgpzdGF0aWMgV0lORV9ISUMqICAgICAgICBNU1ZJREVPX0ZpcnN0SGljIC8qID0gTlVMTCAqLzsKCnR5cGVkZWYgc3RydWN0IF9yZWdfZHJpdmVyIHJlZ19kcml2ZXI7CnN0cnVjdCBfcmVnX2RyaXZlcgp7CiAgICBEV09SRCAgICAgICBmY2NUeXBlOwogICAgRFdPUkQgICAgICAgZmNjSGFuZGxlcjsKICAgIERSSVZFUlBST0MgIHByb2M7CiAgICBMUFdTVFIgICAgICBuYW1lOwogICAgcmVnX2RyaXZlciogbmV4dDsKfTsKCnN0YXRpYyByZWdfZHJpdmVyKiByZWdfZHJpdmVyX2xpc3QgPSBOVUxMOwoKLyogVGhpcyBvbmUgaXMgYSBtYWNybyBzdWNoIHRoYXQgaXQgd29ya3MgZm9yIGJvdGggQVNDSUkgYW5kIFVuaWNvZGUgKi8KI2RlZmluZSBmb3VyY2NfdG9fc3RyaW5nKHN0ciwgZmNjKSBkbyB7IFwKCShzdHIpWzBdID0gTE9CWVRFKExPV09SRChmY2MpKTsgXAoJKHN0cilbMV0gPSBISUJZVEUoTE9XT1JEKGZjYykpOyBcCgkoc3RyKVsyXSA9IExPQllURShISVdPUkQoZmNjKSk7IFwKCShzdHIpWzNdID0gSElCWVRFKEhJV09SRChmY2MpKTsgXAoJfSB3aGlsZSgwKQoKSE1PRFVMRSBNU1ZGVzMyX2hNb2R1bGU7CgpCT09MIFdJTkFQSSBEbGxNYWluKCBISU5TVEFOQ0UgaGluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkICkKewogICAgVFJBQ0UoIiVwLCVseCwlcFxuIiwgaGluc3QsIHJlYXNvbiwgcmVzZXJ2ZWQpOwoKICAgIHN3aXRjaChyZWFzb24pCiAgICB7CiAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CiAgICAgICAgICAgIERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaGluc3QpOwogICAgICAgICAgICBNU1ZGVzMyX2hNb2R1bGUgPSAoSE1PRFVMRSloaW5zdDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIGludCBjb21wYXJlX2ZvdXJjYyhEV09SRCBmY2MxLCBEV09SRCBmY2MyKQp7CiAgY2hhciBmY2Nfc3RyMVs0XTsKICBjaGFyIGZjY19zdHIyWzRdOwogIGZvdXJjY190b19zdHJpbmcoZmNjX3N0cjEsIGZjYzEpOwogIGZvdXJjY190b19zdHJpbmcoZmNjX3N0cjIsIGZjYzIpOwogIHJldHVybiBzdHJuY2FzZWNtcChmY2Nfc3RyMSwgZmNjX3N0cjIsIDQpOwp9Cgp0eXBlZGVmIEJPT0wgKCplbnVtX2hhbmRsZXJfdCkoY29uc3QgY2hhciosIGludCwgdm9pZCopOwoKc3RhdGljIEJPT0wgZW51bV9kcml2ZXJzKERXT1JEIGZjY1R5cGUsIGVudW1faGFuZGxlcl90IGhhbmRsZXIsIHZvaWQqIHBhcmFtKQp7CiAgICBDSEFSIGJ1ZlsyMDQ4XSwgZmNjVHlwZVN0cls1XSwgKnM7CiAgICBEV09SRCBpLCBjbnQgPSAwLCBidWZMZW4sIGxSZXQ7CiAgICBCT09MIHJlc3VsdCA9IEZBTFNFOwogICAgRklMRVRJTUUgbGFzdFdyaXRlOwogICAgSEtFWSBoS2V5OwoKICAgIGZvdXJjY190b19zdHJpbmcoZmNjVHlwZVN0ciwgZmNjVHlwZSk7CiAgICBmY2NUeXBlU3RyWzRdID0gJy4nOwoKICAgIC8qIGZpcnN0LCBnbyB0aHJvdWdoIHRoZSByZWdpc3RyeSBlbnRyaWVzICovCiAgICBsUmV0ID0gUmVnT3BlbktleUV4QShIS0VZX0xPQ0FMX01BQ0hJTkUsIEhLTE1fRFJJVkVSUzMyLCAwLCBLRVlfUVVFUllfVkFMVUUsICZoS2V5KTsKICAgIGlmIChsUmV0ID09IEVSUk9SX1NVQ0NFU1MpIAogICAgewoJRFdPUkQgbnVta2V5czsKCVJlZ1F1ZXJ5SW5mb0tleUEoIGhLZXksIDAsIDAsIDAsICZudW1rZXlzLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKCWZvciAoaSA9IDA7IGkgPCBudW1rZXlzOyBpKyspIAoJewoJICAgIGJ1ZkxlbiA9IHNpemVvZihidWYpIC8gc2l6ZW9mKGJ1ZlswXSk7CgkgICAgbFJldCA9IFJlZ0VudW1LZXlFeEEoaEtleSwgaSwgYnVmLCAmYnVmTGVuLCAwLCAwLCAwLCAmbGFzdFdyaXRlKTsKCSAgICBpZiAobFJldCAhPSBFUlJPUl9TVUNDRVNTKSBjb250aW51ZTsKCSAgICBpZiAoc3RybmNhc2VjbXAoYnVmLCBmY2NUeXBlU3RyLCA1KSB8fCBidWZbOV0gIT0gJz0nKSBjb250aW51ZTsKCSAgICBpZiAoKHJlc3VsdCA9IGhhbmRsZXIoYnVmLCBjbnQrKywgcGFyYW0pKSkgYnJlYWs7Cgl9CiAgICAJUmVnQ2xvc2VLZXkoIGhLZXkgKTsKICAgIH0KICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7CgogICAgLyogaWYgdGhhdCBkaWRuJ3Qgd29yaywgZ28gdGhyb3VnaCB0aGUgdmFsdWVzIGluIHN5c3RlbS5pbmkgKi8KICAgIGlmIChHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BKCJkcml2ZXJzMzIiLCBidWYsIHNpemVvZihidWYpLCAic3lzdGVtLmluaSIpKSAKICAgIHsKCWZvciAocyA9IGJ1ZjsgKnM7IHMgKz0gc3RybGVuKHMpICsgMSkKCXsKCSAgICBpZiAoc3RybmNhc2VjbXAocywgZmNjVHlwZVN0ciwgNSkgfHwgc1s5XSAhPSAnPScpIGNvbnRpbnVlOwoJICAgIGlmICgocmVzdWx0ID0gaGFuZGxlcihzLCBjbnQrKywgcGFyYW0pKSkgYnJlYWs7Cgl9CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTVNWSURFT19HZXRIaWNQdHIKICoKICoKICovCldJTkVfSElDKiAgIE1TVklERU9fR2V0SGljUHRyKEhJQyBoaWMpCnsKICAgIFdJTkVfSElDKiAgIHdoaWM7CgogICAgZm9yICh3aGljID0gTVNWSURFT19GaXJzdEhpYzsgd2hpYyAmJiB3aGljLT5oaWMgIT0gaGljOyB3aGljID0gd2hpYy0+bmV4dCk7CiAgICByZXR1cm4gd2hpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWaWRlb0ZvcldpbmRvd3NWZXJzaW9uCQlbTVNWRlczMi4yXQogKgkJVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgkJW01TVklERU8uMl0KICogUmV0dXJucyB0aGUgdmVyc2lvbiBpbiBtYWpvci5taW5vciBmb3JtLgogKiBJbiBXaW5kb3dzOTUgdGhpcyByZXR1cm5zIDB4MDQwMDAzYjYgKDQuOTUwKQogKi8KRFdPUkQgV0lOQVBJIFZpZGVvRm9yV2luZG93c1ZlcnNpb24odm9pZCkgCnsKICAgIHJldHVybiAweDA0MDAwM0I2OyAvKiA0Ljk1MCAqLwp9CgpzdGF0aWMgQk9PTCBJQ0luZm9fZW51bV9oYW5kbGVyKGNvbnN0IGNoYXIgKmRydiwgaW50IG5yLCB2b2lkICpwYXJhbSkKewogICAgSUNJTkZPICpscGljaW5mbyA9IChJQ0lORk8gKilwYXJhbTsKICAgIERXT1JEIGZjY0hhbmRsZXIgPSBtbWlvU3RyaW5nVG9GT1VSQ0NBKGRydiArIDUsIDApOwoKICAgIC8qIGV4YWN0IG1hdGNoIG9mIGZjY0hhbmRsZXIgb3IgbnRoIGRyaXZlciBmb3VuZCAqLwogICAgaWYgKChscGljaW5mby0+ZmNjSGFuZGxlciAhPSBucikgJiYgKGxwaWNpbmZvLT5mY2NIYW5kbGVyICE9IGZjY0hhbmRsZXIpKQoJcmV0dXJuIEZBTFNFOwoKICAgIGxwaWNpbmZvLT5mY2NUeXBlID0gbW1pb1N0cmluZ1RvRk9VUkNDQShkcnYsIDApOwogICAgbHBpY2luZm8tPmZjY0hhbmRsZXIgPSBmY2NIYW5kbGVyOwogICAgbHBpY2luZm8tPmR3RmxhZ3MgPSAwOwogICAgbHBpY2luZm8tPmR3VmVyc2lvbiA9IDA7CiAgICBscGljaW5mby0+ZHdWZXJzaW9uSUNNID0gMHgxMDQ7CiAgICBscGljaW5mby0+c3pOYW1lWzBdID0gMDsKICAgIGxwaWNpbmZvLT5zekRlc2NyaXB0aW9uWzBdID0gMDsKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBkcnYgKyAxMCwgLTEsIGxwaWNpbmZvLT5zekRyaXZlciwgCgkJCXNpemVvZihscGljaW5mby0+c3pEcml2ZXIpL3NpemVvZihXQ0hBUikpOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW5mbwkJCQlbTVNWRlczMi5AXQogKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5zdGFsbGFibGUgY29tcHJlc3Nvci4gUmV0dXJuIFRSVUUgaWYgdGhlcmUKICogaXMgb25lLgogKgogKiBQQVJBTVMKICogICBmY2NUeXBlICAgICBbSV0gdHlwZSBvZiBjb21wcmVzc29yIChlLmcuICd2aWRjJykKICogICBmY2NIYW5kbGVyICBbSV0gcmVhbCBmY2MgZm9yIGhhbmRsZXIgb3IgPG4+dGggY29tcHJlc3NvcgogKiAgIGxwaWNpbmZvICAgIFtPXSBpbmZvcm1hdGlvbiBhYm91dCBjb21wcmVzc29yCiAqLwpCT09MIFZGV0FQSSBJQ0luZm8oIERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIElDSU5GTyAqbHBpY2luZm8pCnsKICAgIFRSQUNFKCIoJXMsJXMvJTA4bHgsJXApXG4iLCAKICAgICAgICAgIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCBmY2NIYW5kbGVyLCBscGljaW5mbyk7CgogICAgbHBpY2luZm8tPmZjY0hhbmRsZXIgPSBmY2NIYW5kbGVyOwogICAgcmV0dXJuIGVudW1fZHJpdmVycyhmY2NUeXBlLCBJQ0luZm9fZW51bV9oYW5kbGVyLCBscGljaW5mbyk7Cn0KCnN0YXRpYyBEV09SRCBJQ19IYW5kbGVSZWYgPSAxOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0luc3RhbGwJCQlbTVNWRlczMi5AXQogKi8KQk9PTCBWRldBUEkgSUNJbnN0YWxsKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIExQQVJBTSBsUGFyYW0sIExQU1RSIHN6RGVzYywgVUlOVCB3RmxhZ3MpIAp7CiAgICByZWdfZHJpdmVyKiBkcml2ZXI7CiAgICB1bnNpZ25lZCBsZW47CgogICAgVFJBQ0UoIiglcywlcywlcCwlcCwweCUwOHgpXG4iLCB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgKHZvaWQqKWxQYXJhbSwgc3pEZXNjLCB3RmxhZ3MpOwoKICAgIC8qIENoZWNrIGlmIGEgZHJpdmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLwogICAgZm9yIChkcml2ZXIgPSByZWdfZHJpdmVyX2xpc3Q7IGRyaXZlcjsgZHJpdmVyID0gZHJpdmVyLT5uZXh0KQogICAgewogICAgICAgIGlmICghY29tcGFyZV9mb3VyY2MoZmNjVHlwZSwgZHJpdmVyLT5mY2NUeXBlKSAmJgogICAgICAgICAgICAhY29tcGFyZV9mb3VyY2MoZmNjSGFuZGxlciwgZHJpdmVyLT5mY2NIYW5kbGVyKSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoZHJpdmVyKSByZXR1cm4gRkFMU0U7CgogICAgLyogUmVnaXN0ZXIgdGhlIGRyaXZlciAqLwogICAgZHJpdmVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihyZWdfZHJpdmVyKSk7CiAgICBpZiAoIWRyaXZlcikgZ290byBvb207CiAgICBkcml2ZXItPmZjY1R5cGUgPSBmY2NUeXBlOwogICAgZHJpdmVyLT5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKCiAgICBzd2l0Y2god0ZsYWdzKQogICAgewogICAgY2FzZSBJQ0lOU1RBTExfRlVOQ1RJT046CiAgICAgICAgZHJpdmVyLT5wcm9jID0gKERSSVZFUlBST0MpbFBhcmFtOwoJZHJpdmVyLT5uYW1lID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIGNhc2UgSUNJTlNUQUxMX0RSSVZFUjoKCWRyaXZlci0+cHJvYyA9IE5VTEw7CiAgICAgICAgbGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIChjaGFyKilsUGFyYW0sIC0xLCBOVUxMLCAwKTsKICAgICAgICBkcml2ZXItPm5hbWUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuICogc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgaWYgKCFkcml2ZXItPm5hbWUpIGdvdG8gb29tOwogICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCAoY2hhciopbFBhcmFtLCAtMSwgZHJpdmVyLT5uYW1lLCBsZW4pOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJRVJSKCJJbnZhbGlkIGZsYWdzIVxuIik7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkcml2ZXIpOwoJcmV0dXJuIEZBTFNFOwogICB9CgogICAvKiBJbnNlcnQgb3VyIGRyaXZlciBpbiB0aGUgbGlzdCovCiAgIGRyaXZlci0+bmV4dCA9IHJlZ19kcml2ZXJfbGlzdDsKICAgcmVnX2RyaXZlcl9saXN0ID0gZHJpdmVyOwogICAgCiAgIHJldHVybiBUUlVFOwogb29tOgogICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkcml2ZXIpOwogICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNSZW1vdmUJCQlbTVNWRlczMi5AXQogKi8KQk9PTCBWRldBUEkgSUNSZW1vdmUoRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgVUlOVCB3RmxhZ3MpIAp7CiAgICByZWdfZHJpdmVyKiogcGRyaXZlcjsKICAgIAogICAgVFJBQ0UoIiglcywlcywweCUwOHgpXG4iLCB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgd0ZsYWdzKTsKCiAgICAvKiBDaGVjayBpZiBhIGRyaXZlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KICAgIGZvciAocGRyaXZlciA9ICZyZWdfZHJpdmVyX2xpc3Q7ICpwZHJpdmVyOyBwZHJpdmVyID0gJigqcGRyaXZlciktPm5leHQpCiAgICB7CiAgICAgICAgaWYgKCFjb21wYXJlX2ZvdXJjYyhmY2NUeXBlLCAoKnBkcml2ZXIpLT5mY2NUeXBlKSAmJgogICAgICAgICAgICAhY29tcGFyZV9mb3VyY2MoZmNjSGFuZGxlciwgKCpwZHJpdmVyKS0+ZmNjSGFuZGxlcikpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKCEqcGRyaXZlcikKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgLyogUmVtb3ZlIHRoZSBkcml2ZXIgZnJvbSB0aGUgbGlzdCAqLwogICAgKnBkcml2ZXIgPSAoKnBkcml2ZXIpLT5uZXh0OwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKCpwZHJpdmVyKS0+bmFtZSk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAqcGRyaXZlcik7CiAgICAKICAgIHJldHVybiBUUlVFOyAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDT3BlbgkJCQlbTVNWRlczMi5AXQogKiBPcGVucyBhbiBpbnN0YWxsYWJsZSBjb21wcmVzc29yLiBSZXR1cm4gc3BlY2lhbCBoYW5kbGUuCiAqLwpISUMgVkZXQVBJIElDT3BlbihEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdNb2RlKSAKewogICAgV0NIQVIJCWNvZGVjbmFtZVsxMF07CiAgICBJQ09QRU4JCWljb3BlbjsKICAgIEhEUlZSCQloZHJ2OwogICAgV0lORV9ISUMqICAgICAgICAgICB3aGljOwogICAgQk9PTCAgICAgICAgICAgICAgICBiSXMxNjsKICAgIHN0YXRpYyBjb25zdCBXQ0hBUiAgZHJ2MzJXW10gPSB7J2QnLCdyJywnaScsJ3YnLCdlJywncicsJ3MnLCczJywnMicsJ1wwJ307CiAgICByZWdfZHJpdmVyKiAgICAgICAgIGRyaXZlcjsKCiAgICBUUkFDRSgiKCVzLCVzLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCB3TW9kZSk7CgogICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSByZWdpc3RlcmVkIGRyaXZlciB0aGF0IG1hdGNoZXMgKi8KICAgIGRyaXZlciA9IHJlZ19kcml2ZXJfbGlzdDsKICAgIHdoaWxlKGRyaXZlcikKICAgICAgICBpZiAoIWNvbXBhcmVfZm91cmNjKGZjY1R5cGUsIGRyaXZlci0+ZmNjVHlwZSkgJiYKICAgICAgICAgICAgIWNvbXBhcmVfZm91cmNjKGZjY0hhbmRsZXIsIGRyaXZlci0+ZmNjSGFuZGxlcikpCgkgICAgYnJlYWs7CiAgICAgICAgZWxzZQogICAgICAgICAgICBkcml2ZXIgPSBkcml2ZXItPm5leHQ7CgogICAgaWYgKGRyaXZlciAmJiBkcml2ZXItPnByb2MpCgkvKiBUaGUgZHJpdmVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYXQgcnVudGltZSB3aXRoIGl0cyBkcml2ZXJwcm9jICovCiAgICAgICAgcmV0dXJuIE1TVklERU9fT3BlbkZ1bmN0aW9uKGZjY1R5cGUsIGZjY0hhbmRsZXIsIHdNb2RlLCAoRFJJVkVSUFJPQylkcml2ZXItPnByb2MsIChEV09SRClOVUxMKTsKICAKICAgIC8qIFdlbGwsIGxQYXJhbTIgaXMgaW4gZmFjdCBhIExQVklERU9fT1BFTl9QQVJNUywgYnV0IGl0IGhhcyB0aGUKICAgICAqIHNhbWUgbGF5b3V0IGFzIElDT1BFTgogICAgICovCiAgICBpY29wZW4uZHdTaXplCQk9IHNpemVvZihJQ09QRU4pOwogICAgaWNvcGVuLmZjY1R5cGUJCT0gZmNjVHlwZTsKICAgIGljb3Blbi5mY2NIYW5kbGVyCSAgICAgICAgPSBmY2NIYW5kbGVyOwogICAgaWNvcGVuLmR3VmVyc2lvbiAgICAgICAgICAgID0gMHgwMDAwMTAwMDsgLyogRklYTUUgKi8KICAgIGljb3Blbi5kd0ZsYWdzCQk9IHdNb2RlOwogICAgaWNvcGVuLmR3RXJyb3IgICAgICAgICAgICAgID0gMDsKICAgIGljb3Blbi5wVjFSZXNlcnZlZCAgICAgICAgICA9IE5VTEw7CiAgICBpY29wZW4ucFYyUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLmRuRGV2Tm9kZSAgICAgICAgICAgID0gMDsgLyogRklYTUUgKi8KCQogICAgaWYgKCFkcml2ZXIpIHsKICAgICAgICAvKiBUaGUgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHJlZ2lzdHJ5ICovCglmb3VyY2NfdG9fc3RyaW5nKGNvZGVjbmFtZSwgZmNjVHlwZSk7CiAgICAgICAgY29kZWNuYW1lWzRdID0gJy4nOwoJZm91cmNjX3RvX3N0cmluZyhjb2RlY25hbWUgKyA1LCBmY2NIYW5kbGVyKTsKICAgICAgICBjb2RlY25hbWVbOV0gPSAnXDAnOwoKICAgICAgICBoZHJ2ID0gT3BlbkRyaXZlcihjb2RlY25hbWUsIGRydjMyVywgKExQQVJBTSkmaWNvcGVuKTsKICAgICAgICBpZiAoIWhkcnYpIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSAKICAgICAgICAgICAgewoJCWNvZGVjbmFtZVswXSA9ICd2JzsKCQljb2RlY25hbWVbMV0gPSAnaSc7CgkJY29kZWNuYW1lWzJdID0gJ2QnOwoJCWNvZGVjbmFtZVszXSA9ICdjJzsKCgkJZmNjVHlwZSA9IElDVFlQRV9WSURFTzsKICAgICAgICAgICAgICAgIGhkcnYgPSBPcGVuRHJpdmVyKGNvZGVjbmFtZSwgZHJ2MzJXLCAoTFBBUkFNKSZpY29wZW4pOwoJICAgIH0KICAgICAgICAgICAgaWYgKCFoZHJ2KQogICAgICAgICAgICAgICAgcmV0dXJuIDA7Cgl9CiAgICB9IGVsc2UgewogICAgICAgIC8qIFRoZSBkcml2ZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhdCBydW50aW1lIHdpdGggaXRzIG5hbWUgKi8KICAgICAgICBoZHJ2ID0gT3BlbkRyaXZlcihkcml2ZXItPm5hbWUsIE5VTEwsIChMUEFSQU0pJmljb3Blbik7CiAgICAgICAgaWYgKCFoZHJ2KSAKICAgICAgICAgICAgcmV0dXJuIDA7IAogICAgfQogICAgYklzMTYgPSBHZXREcml2ZXJGbGFncyhoZHJ2KSAmIDB4MTAwMDAwMDA7IC8qIHVuZG9jdW1lbnRlZCBmbGFnOiBXSU5FX0dERl8xNkJJVCAqLwoKICAgIGlmIChiSXMxNiAmJiAhcEZuQ2FsbFRvMTYpCiAgICB7CiAgICAgICAgRklYTUUoIkdvdCBhIDE2IGJpdCBkcml2ZXIsIGJ1dCBubyAxNiBiaXQgc3VwcG9ydCBpbiBtc3Zmd1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB3aGljID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihXSU5FX0hJQykpOwogICAgaWYgKCF3aGljKQogICAgewogICAgICAgIENsb3NlRHJpdmVyKGhkcnYsIDAsIDApOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHdoaWMtPmhkcnYgICAgICAgICAgPSBoZHJ2OwogICAgLyogRklYTUU6IGlzIHRoZSBzaWduYXR1cmUgdGhlIHJlYWwgb25lID8gKi8KICAgIHdoaWMtPmRyaXZlcnByb2MgICAgPSBiSXMxNiA/IChEUklWRVJQUk9DKXBGbkNhbGxUbzE2IDogTlVMTDsKICAgIHdoaWMtPmRyaXZlcnByb2MxNiAgPSAwOwogICAgd2hpYy0+dHlwZSAgICAgICAgICA9IGZjY1R5cGU7CiAgICB3aGljLT5oYW5kbGVyICAgICAgID0gZmNjSGFuZGxlcjsKICAgIHdoaWxlIChNU1ZJREVPX0dldEhpY1B0cihISUNfMzIoSUNfSGFuZGxlUmVmKSkgIT0gTlVMTCkgSUNfSGFuZGxlUmVmKys7CiAgICB3aGljLT5oaWMgICAgICAgICAgID0gSElDXzMyKElDX0hhbmRsZVJlZisrKTsKICAgIHdoaWMtPm5leHQgICAgICAgICAgPSBNU1ZJREVPX0ZpcnN0SGljOwogICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWM7CgogICAgVFJBQ0UoIj0+ICVwXG4iLCB3aGljLT5oaWMpOwogICAgcmV0dXJuIHdoaWMtPmhpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNU1ZJREVPX09wZW5GdW5jdGlvbgogKi8KSElDIE1TVklERU9fT3BlbkZ1bmN0aW9uKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgRFJJVkVSUFJPQyBscGZuSGFuZGxlciwgRFdPUkQgbHBmbkhhbmRsZXIxNikgCnsKICAgIElDT1BFTiAgICAgIGljb3BlbjsKICAgIFdJTkVfSElDKiAgIHdoaWM7CgogICAgVFJBQ0UoIiglcywlcywlZCwlcCwlMDhseClcbiIsIAogICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdNb2RlLCBscGZuSGFuZGxlciwgbHBmbkhhbmRsZXIxNik7CgogICAgaWNvcGVuLmR3U2l6ZQkJPSBzaXplb2YoSUNPUEVOKTsKICAgIGljb3Blbi5mY2NUeXBlCQk9IGZjY1R5cGU7CiAgICBpY29wZW4uZmNjSGFuZGxlcgkgICAgICAgID0gZmNjSGFuZGxlcjsKICAgIGljb3Blbi5kd1ZlcnNpb24gICAgICAgICAgICA9IDB4MDAwMDEwMDA7IC8qIEZJWE1FICovCiAgICBpY29wZW4uZHdGbGFncwkJPSB3TW9kZTsKICAgIGljb3Blbi5kd0Vycm9yICAgICAgICAgICAgICA9IDA7CiAgICBpY29wZW4ucFYxUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLnBWMlJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5kbkRldk5vZGUgICAgICAgICAgICA9IDA7IC8qIEZJWE1FICovCgogICAgd2hpYyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoV0lORV9ISUMpKTsKICAgIGlmICghd2hpYykgcmV0dXJuIDA7CgogICAgd2hpYy0+ZHJpdmVycHJvYyAgID0gbHBmbkhhbmRsZXI7CiAgICB3aGljLT5kcml2ZXJwcm9jMTYgPSBscGZuSGFuZGxlcjE2OwogICAgd2hpbGUgKE1TVklERU9fR2V0SGljUHRyKEhJQ18zMihJQ19IYW5kbGVSZWYpKSAhPSBOVUxMKSBJQ19IYW5kbGVSZWYrKzsKICAgIHdoaWMtPmhpYyAgICAgICAgICA9IEhJQ18zMihJQ19IYW5kbGVSZWYrKyk7CiAgICB3aGljLT5uZXh0ICAgICAgICAgPSBNU1ZJREVPX0ZpcnN0SGljOwogICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWM7CgogICAgLyogTm93IHRyeSBvcGVuaW5nL2xvYWRpbmcgdGhlIGRyaXZlci4gVGFrZW4gZnJvbSBEUklWRVJfQWRkVG9MaXN0ICovCiAgICAvKiBXaGF0IGlmIHRoZSBmdW5jdGlvbiBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlPyAqLwoKICAgIGlmIChNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9MT0FELCAwTCwgMEwpICE9IERSVl9TVUNDRVNTKSAKICAgIHsKICAgICAgICBXQVJOKCJEUlZfTE9BRCBmYWlsZWQgZm9yIGhpYyAlcFxuIiwgd2hpYy0+aGljKTsKICAgICAgICBNU1ZJREVPX0ZpcnN0SGljID0gd2hpYy0+bmV4dDsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aGljKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIC8qIHJldHVybiB2YWx1ZSBpcyBub3QgY2hlY2tlZCAqLwogICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfRU5BQkxFLCAwTCwgMEwpOwoKICAgIHdoaWMtPmRyaXZlcklkID0gKERXT1JEKU1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX09QRU4sIDAsIChEV09SRCkmaWNvcGVuKTsKICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBwdXQgaGVyZT8gKi8KICAgIHdoaWMtPmhkcnYgPSBOVUxMOwogICAgCiAgICBpZiAod2hpYy0+ZHJpdmVySWQgPT0gMCkgCiAgICB7CiAgICAgICAgV0FSTigiRFJWX09QRU4gZmFpbGVkIGZvciBoaWMgJXBcbiIsIHdoaWMtPmhpYyk7CiAgICAgICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWMtPm5leHQ7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2hpYyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgVFJBQ0UoIj0+ICVwXG4iLCB3aGljLT5oaWMpOwogICAgcmV0dXJuIHdoaWMtPmhpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ09wZW5GdW5jdGlvbgkJCVtNU1ZGVzMyLkBdCiAqLwpISUMgVkZXQVBJIElDT3BlbkZ1bmN0aW9uKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUsIEZBUlBST0MgbHBmbkhhbmRsZXIpIAp7CiAgICByZXR1cm4gTVNWSURFT19PcGVuRnVuY3Rpb24oZmNjVHlwZSwgZmNjSGFuZGxlciwgd01vZGUsIChEUklWRVJQUk9DKWxwZm5IYW5kbGVyLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0dldEluZm8JCQlbTVNWRlczMi5AXQogKi8KTFJFU1VMVCBWRldBUEkgSUNHZXRJbmZvKEhJQyBoaWMsIElDSU5GTyAqcGljaW5mbywgRFdPUkQgY2IpIAp7CiAgICBMUkVTVUxUCXJldDsKICAgIFdJTkVfSElDKiAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwoKICAgIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgaGljLCBwaWNpbmZvLCBjYik7CgogICAgd2hpYyA9IE1TVklERU9fR2V0SGljUHRyKGhpYyk7CiAgICBpZiAoIXdoaWMpIHJldHVybiBJQ0VSUl9CQURIQU5ETEU7CiAgICBpZiAoIXBpY2luZm8pIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIC8qIChXUykgVGhlIGZpZWxkIHN6RHJpdmVyIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWNhdXNlIHRoZSBkcml2ZXIgCiAgICAgKiBpcyBub3Qgb2JsaWdlZCBhbmQgb2Z0ZW4gd2lsbCBub3QgZG8gaXQuIFNvbWUgYXBwbGljYXRpb25zLCBsaWtlCiAgICAgKiBWaXJ0dWFsRHViLCByZWx5IG9uIHRoaXMgZmllbGQgYW5kIHdpbGwgb2NjYXNpb25hbGx5IGNyYXNoIGlmIGl0CiAgICAgKiBnb2VzIHVuaXRpYWxpemVkLgogICAgICovCiAgICBpZiAoY2IgPj0gc2l6ZW9mKElDSU5GTykpIHBpY2luZm8tPnN6RHJpdmVyWzBdID0gJ1wwJzsKCiAgICByZXQgPSBJQ1NlbmRNZXNzYWdlKGhpYywgSUNNX0dFVElORk8sIChEV09SRClwaWNpbmZvLCBjYik7CgogICAgLyogKFdTKSBXaGVuIHN6RHJpdmVyIHdhcyBub3Qgc3VwcGxpZWQgYnkgdGhlIGRyaXZlciBpdHNlbGYsIGFwcGFyZW50bHkgCiAgICAgKiBXaW5kb3dzIHdpbGwgc2V0IGl0cyB2YWx1ZSBlcXVhbCB0byB0aGUgZHJpdmVyIGZpbGUgbmFtZS4gVGhpcyBjYW4KICAgICAqIGJlIG9idGFpbmVkIGZyb20gdGhlIHJlZ2lzdHJ5IGFzIHdlIGRvIGhlcmUuCiAgICAgKi8KICAgIGlmIChjYiA+PSBzaXplb2YoSUNJTkZPKSAmJiBwaWNpbmZvLT5zekRyaXZlclswXSA9PSAwKQogICAgewogICAgICAgIElDSU5GTyAgaWk7CgogICAgICAgIG1lbXNldCgmaWksIDAsIHNpemVvZihpaSkpOwogICAgICAgIGlpLmR3U2l6ZSA9IHNpemVvZihpaSk7CiAgICAgICAgSUNJbmZvKHBpY2luZm8tPmZjY1R5cGUsIHBpY2luZm8tPmZjY0hhbmRsZXIsICZpaSk7CiAgICAgICAgbHN0cmNweVcocGljaW5mby0+c3pEcml2ZXIsIGlpLnN6RHJpdmVyKTsKICAgIH0KCiAgICBUUkFDRSgiCS0+IDB4JTA4bHhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBEV09SRCBmY2NUeXBlOwogICAgRFdPUkQgZmNjSGFuZGxlcjsKICAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW47CiAgICBMUEJJVE1BUElORk9IRUFERVIgbHBiaU91dDsKICAgIFdPUkQgd01vZGU7CiAgICBEV09SRCBxdWVyeW1zZzsKICAgIEhJQyBoaWM7Cn0gZHJpdmVyX2luZm9fdDsKCnN0YXRpYyBISUMgdHJ5X2RyaXZlcihkcml2ZXJfaW5mb190ICppbmZvKQp7CiAgICBISUMgICBoaWM7CgogICAgaWYgKChoaWMgPSBJQ09wZW4oaW5mby0+ZmNjVHlwZSwgaW5mby0+ZmNjSGFuZGxlciwgaW5mby0+d01vZGUpKSkgCiAgICB7CglpZiAoIUlDU2VuZE1lc3NhZ2UoaGljLCBpbmZvLT5xdWVyeW1zZywgKERXT1JEKWluZm8tPmxwYmlJbiwgKERXT1JEKWluZm8tPmxwYmlPdXQpKQoJICAgIHJldHVybiBoaWM7CglJQ0Nsb3NlKGhpYyk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEJPT0wgSUNMb2NhdGVfZW51bV9oYW5kbGVyKGNvbnN0IGNoYXIgKmRydiwgaW50IG5yLCB2b2lkICpwYXJhbSkKewogICAgZHJpdmVyX2luZm9fdCAqaW5mbyA9IChkcml2ZXJfaW5mb190ICopcGFyYW07CiAgICBpbmZvLT5mY2NIYW5kbGVyID0gbW1pb1N0cmluZ1RvRk9VUkNDQShkcnYgKyA1LCAwKTsKICAgIGluZm8tPmhpYyA9IHRyeV9kcml2ZXIoaW5mbyk7CiAgICByZXR1cm4gaW5mby0+aGljICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNMb2NhdGUJCQlbTVNWRlczMi5AXQogKi8KSElDIFZGV0FQSSBJQ0xvY2F0ZShEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLAogICAgICAgICAgICAgICAgICAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LCBXT1JEIHdNb2RlKQp7CiAgICBkcml2ZXJfaW5mb190IGluZm87CgogICAgVFJBQ0UoIiglcywlcywlcCwlcCwweCUwNHgpXG4iLCAKICAgICAgICAgIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCBscGJpSW4sIGxwYmlPdXQsIHdNb2RlKTsKCiAgICBpbmZvLmZjY1R5cGUgPSBmY2NUeXBlOwogICAgaW5mby5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKICAgIGluZm8ubHBiaUluID0gbHBiaUluOwogICAgaW5mby5scGJpT3V0ID0gbHBiaU91dDsKICAgIGluZm8ud01vZGUgPSB3TW9kZTsKCiAgICBzd2l0Y2ggKHdNb2RlKSAKICAgIHsKICAgIGNhc2UgSUNNT0RFX0ZBU1RDT01QUkVTUzoKICAgIGNhc2UgSUNNT0RFX0NPTVBSRVNTOgogICAgICAgIGluZm8ucXVlcnltc2cgPSBJQ01fQ09NUFJFU1NfUVVFUlk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElDTU9ERV9GQVNUREVDT01QUkVTUzoKICAgIGNhc2UgSUNNT0RFX0RFQ09NUFJFU1M6CiAgICAgICAgaW5mby5xdWVyeW1zZyA9IElDTV9ERUNPTVBSRVNTX1FVRVJZOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ01PREVfRFJBVzoKICAgICAgICBpbmZvLnF1ZXJ5bXNnID0gSUNNX0RSQVdfUVVFUlk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIlVua25vd24gbW9kZSAoJWQpXG4iLCB3TW9kZSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogRWFzeSBjYXNlOiBoYW5kbGVyL3R5cGUgbWF0Y2gsIHdlIGp1c3QgZmlyZSBhIHF1ZXJ5IGFuZCByZXR1cm4gKi8KICAgIGluZm8uaGljID0gdHJ5X2RyaXZlcigmaW5mbyk7CiAgICAvKiBJZiBpdCBkaWRuJ3Qgd29yaywgdHJ5IGVhY2ggZHJpdmVyIGluIHR1cm4uIDMyIGJpdCBjb2RlY3Mgb25seS4gKi8KICAgIC8qIEZJWE1FOiBNb3ZlIHRoaXMgdG8gYW4gaW5pdCByb3V0aW5lPyAqLwogICAgaWYgKCFpbmZvLmhpYykgZW51bV9kcml2ZXJzKGZjY1R5cGUsIElDTG9jYXRlX2VudW1faGFuZGxlciwgJmluZm8pOwoKICAgIGlmIChpbmZvLmhpYykgCiAgICB7CiAgICAgICAgVFJBQ0UoIj0+ICVwXG4iLCBpbmZvLmhpYyk7CglyZXR1cm4gaW5mby5oaWM7CiAgICB9CgogICAgaWYgKGZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSAKICAgICAgICByZXR1cm4gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBmY2NIYW5kbGVyLCBscGJpSW4sIGxwYmlPdXQsIHdNb2RlKTsKICAgIAogICAgV0FSTigiKCVzLCVzLCVwLCVwLDB4JTA0eCkgbm90IGZvdW5kIVxuIiwKICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIGxwYmlJbiwgbHBiaU91dCwgd01vZGUpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNHZXREaXNwbGF5Rm9ybWF0CQkJW01TVkZXMzIuQF0KICovCkhJQyBWRldBUEkgSUNHZXREaXNwbGF5Rm9ybWF0KAoJSElDIGhpYyxMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LAoJSU5UIGRlcHRoLElOVCBkeCxJTlQgZHkpCnsKCUhJQwl0bXBoaWMgPSBoaWM7CgoJVFJBQ0UoIiglcCwlcCwlcCwlZCwlZCwlZCkhXG4iLGhpYyxscGJpSW4sbHBiaU91dCxkZXB0aCxkeCxkeSk7CgoJaWYgKCF0bXBoaWMpIHsKCQl0bXBoaWM9SUNMb2NhdGUoSUNUWVBFX1ZJREVPLDAsbHBiaUluLE5VTEwsSUNNT0RFX0RFQ09NUFJFU1MpOwoJCWlmICghdG1waGljKQoJCQlyZXR1cm4gdG1waGljOwoJfQoJaWYgKChkeSA9PSBscGJpSW4tPmJpSGVpZ2h0KSAmJiAoZHggPT0gbHBiaUluLT5iaVdpZHRoKSkKCQlkeSA9IGR4ID0gMDsgLyogbm8gcmVzaXplIG5lZWRlZCAqLwoKCS8qIENhbiB3ZSBkZWNvbXByZXNzIGl0ID8gKi8KCWlmIChJQ0RlY29tcHJlc3NRdWVyeSh0bXBoaWMsbHBiaUluLE5VTEwpICE9IDApCgkJZ290byBlcnJvdXQ7IC8qIG5vLCBzb3JyeSAqLwoKCUlDRGVjb21wcmVzc0dldEZvcm1hdCh0bXBoaWMsbHBiaUluLGxwYmlPdXQpOwoKCWlmIChscGJpT3V0LT5iaUNvbXByZXNzaW9uICE9IDApIHsKCSAgIEZJWE1FKCJPb2NoLCBob3cgY29tZSBkZWNvbXByZXNzb3Igb3V0cHV0cyBjb21wcmVzc2VkIGRhdGEgKCVsZCk/P1xuIiwKCQkJIGxwYmlPdXQtPmJpQ29tcHJlc3Npb24pOwoJfQoJaWYgKGxwYmlPdXQtPmJpU2l6ZSA8IHNpemVvZigqbHBiaU91dCkpIHsKCSAgIEZJWE1FKCJPb2NoLCBzaXplIG9mIG91dHB1dCBCSUggaXMgdG9vIHNtYWxsICglbGQpXG4iLAoJCQkgbHBiaU91dC0+YmlTaXplKTsKCSAgIGxwYmlPdXQtPmJpU2l6ZSA9IHNpemVvZigqbHBiaU91dCk7Cgl9CglpZiAoIWRlcHRoKSB7CgkJSERDCWhkYzsKCgkJaGRjID0gR2V0REMoMCk7CgkJZGVwdGggPSBHZXREZXZpY2VDYXBzKGhkYyxCSVRTUElYRUwpKkdldERldmljZUNhcHMoaGRjLFBMQU5FUyk7CgkJUmVsZWFzZURDKDAsaGRjKTsKCQlpZiAoZGVwdGg9PTE1KQlkZXB0aCA9IDE2OwoJCWlmIChkZXB0aDw4KQlkZXB0aCA9ICA4OwoJfQoJaWYgKGxwYmlJbi0+YmlCaXRDb3VudCA9PSA4KQoJCWRlcHRoID0gODsKCglUUkFDRSgiPT4gJXBcbiIsIHRtcGhpYyk7CglyZXR1cm4gdG1waGljOwplcnJvdXQ6CglpZiAoaGljIT10bXBoaWMpCgkJSUNDbG9zZSh0bXBoaWMpOwoKCVRSQUNFKCI9PiAwXG4iKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ29tcHJlc3MJCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJVgpJQ0NvbXByZXNzKAoJSElDIGhpYyxEV09SRCBkd0ZsYWdzLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0cHV0LExQVk9JRCBscERhdGEsCglMUEJJVE1BUElORk9IRUFERVIgbHBiaUlucHV0LExQVk9JRCBscEJpdHMsTFBEV09SRCBscGNraWQsCglMUERXT1JEIGxwZHdGbGFncyxMT05HIGxGcmFtZU51bSxEV09SRCBkd0ZyYW1lU2l6ZSxEV09SRCBkd1F1YWxpdHksCglMUEJJVE1BUElORk9IRUFERVIgbHBiaVByZXYsTFBWT0lEIGxwUHJldikKewoJSUNDT01QUkVTUwlpY2NtcDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlcCwlcCwuLi4pXG4iLGhpYyxkd0ZsYWdzLGxwYmlPdXRwdXQsbHBEYXRhLGxwYmlJbnB1dCxscEJpdHMpOwoKCWljY21wLmR3RmxhZ3MJCT0gZHdGbGFnczsKCglpY2NtcC5scGJpT3V0cHV0CT0gbHBiaU91dHB1dDsKCWljY21wLmxwT3V0cHV0CQk9IGxwRGF0YTsKCWljY21wLmxwYmlJbnB1dAkJPSBscGJpSW5wdXQ7CglpY2NtcC5scElucHV0CQk9IGxwQml0czsKCglpY2NtcC5scGNraWQJCT0gbHBja2lkOwoJaWNjbXAubHBkd0ZsYWdzCQk9IGxwZHdGbGFnczsKCWljY21wLmxGcmFtZU51bQkJPSBsRnJhbWVOdW07CglpY2NtcC5kd0ZyYW1lU2l6ZQk9IGR3RnJhbWVTaXplOwoJaWNjbXAuZHdRdWFsaXR5CQk9IGR3UXVhbGl0eTsKCWljY21wLmxwYmlQcmV2CQk9IGxwYmlQcmV2OwoJaWNjbXAubHBQcmV2CQk9IGxwUHJldjsKCXJldHVybiBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fQ09NUFJFU1MsKERXT1JEKSZpY2NtcCxzaXplb2YoaWNjbXApKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0RlY29tcHJlc3MJCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJViAgSUNEZWNvbXByZXNzKEhJQyBoaWMsRFdPUkQgZHdGbGFncyxMUEJJVE1BUElORk9IRUFERVIgbHBiaUZvcm1hdCwKCQkJCUxQVk9JRCBscERhdGEsTFBCSVRNQVBJTkZPSEVBREVSIGxwYmksTFBWT0lEIGxwQml0cykKewoJSUNERUNPTVBSRVNTCWljZDsKCURXT1JEIHJldDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsaGljLGR3RmxhZ3MsbHBiaUZvcm1hdCxscERhdGEsbHBiaSxscEJpdHMpOwoKCVRSQUNFKCJscEJpdHNbMF0gPT0gJWx4XG4iLCgoTFBEV09SRClscEJpdHMpWzBdKTsKCglpY2QuZHdGbGFncwk9IGR3RmxhZ3M7CglpY2QubHBiaUlucHV0CT0gbHBiaUZvcm1hdDsKCWljZC5scElucHV0CT0gbHBEYXRhOwoKCWljZC5scGJpT3V0cHV0CT0gbHBiaTsKCWljZC5scE91dHB1dAk9IGxwQml0czsKCWljZC5ja2lkCT0gMDsKCXJldCA9IElDU2VuZE1lc3NhZ2UoaGljLElDTV9ERUNPTVBSRVNTLChEV09SRCkmaWNkLHNpemVvZihJQ0RFQ09NUFJFU1MpKTsKCglUUkFDRSgibHBCaXRzWzBdID09ICVseFxuIiwoKExQRFdPUkQpbHBCaXRzKVswXSk7CgoJVFJBQ0UoIi0+ICVsZFxuIixyZXQpOwoKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNDb21wcmVzc29yQ2hvb3NlICAgW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDQ29tcHJlc3NvckNob29zZShIV05EIGh3bmQsIFVJTlQgdWlGbGFncywgTFBWT0lEIHB2SW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBEYXRhLCBQQ09NUFZBUlMgcGMsIExQU1RSIGxwc3pUaXRsZSkKewogIEZJWE1FKCIoJXAsMHglWCwlcCwlcCwlcCwlcyksc3R1YiFcbiIsaHduZCx1aUZsYWdzLHB2SW4sbHBEYXRhLHBjLGxwc3pUaXRsZSk7CgogIGlmIChwYyA9PSBOVUxMIHx8IHBjLT5jYlNpemUgIT0gc2l6ZW9mKENPTVBWQVJTKSkKICAgIHJldHVybiBGQUxTRTsKCiAgaWYgKChwYy0+ZHdGbGFncyAmIElDTUZfQ09NUFZBUlNfVkFMSUQpID09IDApIHsKICAgIHBjLT5kd0ZsYWdzICAgPSAwOwogICAgcGMtPmZjY1R5cGUgICA9IHBjLT5mY2NIYW5kbGVyID0gMDsKICAgIHBjLT5oaWMgICAgICAgPSBOVUxMOwogICAgcGMtPmxwYmlPdXQgICA9IE5VTEw7CiAgICBwYy0+bHBCaXRzT3V0ID0gcGMtPmxwQml0c1ByZXYgPSBwYy0+bHBTdGF0ZSA9IE5VTEw7CiAgICBwYy0+bFEgICAgICAgID0gSUNRVUFMSVRZX0RFRkFVTFQ7CiAgICBwYy0+bEtleSAgICAgID0gLTE7CiAgICBwYy0+bERhdGFSYXRlID0gMzAwOyAvKiBrQiAqLwogICAgcGMtPmxwU3RhdGUgICA9IE5VTEw7CiAgICBwYy0+Y2JTdGF0ZSAgID0gMDsKICB9CiAgaWYgKHBjLT5mY2NUeXBlID09IDApCiAgICBwYy0+ZmNjVHlwZSA9IElDVFlQRV9WSURFTzsKCiAgLyogRklYTUUgKi8KICAKICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ29tcHJlc3NvckZyZWUgICBbTVNWRlczMi5AXQogKi8Kdm9pZCBWRldBUEkgSUNDb21wcmVzc29yRnJlZShQQ09NUFZBUlMgcGMpCnsKICBUUkFDRSgiKCVwKVxuIixwYyk7CgogIGlmIChwYyAhPSBOVUxMICYmIHBjLT5jYlNpemUgPT0gc2l6ZW9mKENPTVBWQVJTKSkgewogICAgaWYgKHBjLT5oaWMgIT0gTlVMTCkgewogICAgICBJQ0Nsb3NlKHBjLT5oaWMpOwogICAgICBwYy0+aGljID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBiaU91dCAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwYmlPdXQpOwogICAgICBwYy0+bHBiaU91dCA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwQml0c091dCAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwQml0c091dCk7CiAgICAgIHBjLT5scEJpdHNPdXQgPSBOVUxMOwogICAgfQogICAgaWYgKHBjLT5scEJpdHNQcmV2ICE9IE5VTEwpIHsKICAgICAgR2xvYmFsRnJlZVB0cihwYy0+bHBCaXRzUHJldik7CiAgICAgIHBjLT5scEJpdHNQcmV2ID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBTdGF0ZSAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwQml0c1ByZXYpOwogICAgICBwYy0+bHBTdGF0ZSA9IE5VTEw7CiAgICB9CiAgICBwYy0+ZHdGbGFncyA9IDA7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTVNWSURFT19TZW5kTWVzc2FnZQogKgogKgogKi8KTFJFU1VMVCBNU1ZJREVPX1NlbmRNZXNzYWdlKFdJTkVfSElDKiB3aGljLCBVSU5UIG1zZywgRFdPUkQgbFBhcmFtMSwgRFdPUkQgbFBhcmFtMikKewogICAgTFJFU1VMVCAgICAgcmV0OwogICAgCiNkZWZpbmUgWFgoeCkgY2FzZSB4OiBUUkFDRSgiKCVwLCIjeCIsMHglMDhseCwweCUwOGx4KVxuIix3aGljLGxQYXJhbTEsbFBhcmFtMik7IGJyZWFrOwogICAgCiAgICBzd2l0Y2ggKG1zZykgewogICAgICAgIC8qIERSVl8qICovCiAgICAgICAgWFgoRFJWX0xPQUQpOwogICAgICAgIFhYKERSVl9FTkFCTEUpOwogICAgICAgIFhYKERSVl9PUEVOKTsKICAgICAgICBYWChEUlZfQ0xPU0UpOwogICAgICAgIFhYKERSVl9ESVNBQkxFKTsKICAgICAgICBYWChEUlZfRlJFRSk7CiAgICAgICAgLyogSUNNX1JFU0VSVkVEK1ggKi8KICAgICAgICBYWChJQ01fQUJPVVQpOwogICAgICAgIFhYKElDTV9DT05GSUdVUkUpOwogICAgICAgIFhYKElDTV9HRVQpOwogICAgICAgIFhYKElDTV9HRVRJTkZPKTsKICAgICAgICBYWChJQ01fR0VUREVGQVVMVFFVQUxJVFkpOwogICAgICAgIFhYKElDTV9HRVRRVUFMSVRZKTsKICAgICAgICBYWChJQ01fR0VUU1RBVEUpOwogICAgICAgIFhYKElDTV9TRVRRVUFMSVRZKTsKICAgICAgICBYWChJQ01fU0VUKTsKICAgICAgICBYWChJQ01fU0VUU1RBVEUpOwogICAgICAgIC8qIElDTV9VU0VSK1ggKi8KICAgICAgICBYWChJQ01fQ09NUFJFU1NfRlJBTUVTX0lORk8pOwogICAgICAgIFhYKElDTV9DT01QUkVTU19HRVRfRk9STUFUKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfR0VUX1NJWkUpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19RVUVSWSk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0JFR0lOKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1MpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19FTkQpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0dFVF9GT1JNQVQpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX1FVRVJZKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19CRUdJTik7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1MpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0VORCk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfU0VUX1BBTEVUVEUpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0dFVF9QQUxFVFRFKTsKICAgICAgICBYWChJQ01fRFJBV19RVUVSWSk7CiAgICAgICAgWFgoSUNNX0RSQVdfQkVHSU4pOwogICAgICAgIFhYKElDTV9EUkFXX0dFVF9QQUxFVFRFKTsKICAgICAgICBYWChJQ01fRFJBV19TVEFSVCk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RPUCk7CiAgICAgICAgWFgoSUNNX0RSQVdfRU5EKTsKICAgICAgICBYWChJQ01fRFJBV19HRVRUSU1FKTsKICAgICAgICBYWChJQ01fRFJBVyk7CiAgICAgICAgWFgoSUNNX0RSQVdfV0lORE9XKTsKICAgICAgICBYWChJQ01fRFJBV19TRVRUSU1FKTsKICAgICAgICBYWChJQ01fRFJBV19SRUFMSVpFKTsKICAgICAgICBYWChJQ01fRFJBV19GTFVTSCk7CiAgICAgICAgWFgoSUNNX0RSQVdfUkVOREVSQlVGRkVSKTsKICAgICAgICBYWChJQ01fRFJBV19TVEFSVF9QTEFZKTsKICAgICAgICBYWChJQ01fRFJBV19TVE9QX1BMQVkpOwogICAgICAgIFhYKElDTV9EUkFXX1NVR0dFU1RGT1JNQVQpOwogICAgICAgIFhYKElDTV9EUkFXX0NIQU5HRVBBTEVUVEUpOwogICAgICAgIFhYKElDTV9HRVRCVUZGRVJTV0FOVEVEKTsKICAgICAgICBYWChJQ01fR0VUREVGQVVMVEtFWUZSQU1FUkFURSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWF9CRUdJTik7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWF9RVUVSWSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWCk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NFWF9FTkQpOwogICAgICAgIFhYKElDTV9TRVRfU1RBVFVTX1BST0MpOwogICAgZGVmYXVsdDoKICAgICAgICBGSVhNRSgiKCVwLDB4JTA4bHgsMHglMDhseCwweCUwOGx4KSB1bmtub3duIG1lc3NhZ2VcbiIsd2hpYywoRFdPUkQpbXNnLGxQYXJhbTEsbFBhcmFtMik7CiAgICB9CiAgICAKI3VuZGVmIFhYCiAgICAKICAgIGlmICh3aGljLT5kcml2ZXJwcm9jKSB7CgkvKiBkd0RyaXZlcklkIHBhcmFtZXRlciBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIERSVl9PUEVOICovCiAgICAgICAgcmV0ID0gd2hpYy0+ZHJpdmVycHJvYyh3aGljLT5kcml2ZXJJZCwgd2hpYy0+aGRydiwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0ID0gU2VuZERyaXZlck1lc3NhZ2Uod2hpYy0+aGRydiwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgIH0KCiAgICBUUkFDRSgiCS0+IDB4JTA4bHhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDU2VuZE1lc3NhZ2UJCQlbTVNWRlczMi5AXQogKi8KTFJFU1VMVCBWRldBUEkgSUNTZW5kTWVzc2FnZShISUMgaGljLCBVSU5UIG1zZywgRFdPUkQgbFBhcmFtMSwgRFdPUkQgbFBhcmFtMikgCnsKICAgIFdJTkVfSElDKiAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwoKICAgIGlmICghd2hpYykgcmV0dXJuIElDRVJSX0JBREhBTkRMRTsKICAgIHJldHVybiBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEcmF3QmVnaW4JCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWIElDRHJhd0JlZ2luKAoJSElDICAgICAgICAgICAgICAgIGhpYywgICAgIC8qIFtpbl0gKi8KCURXT1JEICAgICAgICAgICAgICBkd0ZsYWdzLCAvKiBbaW5dIGZsYWdzICovCglIUEFMRVRURSAgICAgICAgICAgaHBhbCwgICAgLyogW2luXSBwYWxldHRlIHRvIGRyYXcgd2l0aCAqLwoJSFdORCAgICAgICAgICAgICAgIGh3bmQsICAgIC8qIFtpbl0gd2luZG93IHRvIGRyYXcgdG8gKi8KCUhEQyAgICAgICAgICAgICAgICBoZGMsICAgICAvKiBbaW5dIEhEQyB0byBkcmF3IHRvICovCglJTlQgICAgICAgICAgICAgICAgeERzdCwgICAgLyogW2luXSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgKi8KCUlOVCAgICAgICAgICAgICAgICB5RHN0LCAgICAvKiBbaW5dICovCglJTlQgICAgICAgICAgICAgICAgZHhEc3QsICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR5RHN0LCAgIC8qIFtpbl0gKi8KCUxQQklUTUFQSU5GT0hFQURFUiBscGJpLCAgICAvKiBbaW5dIGZvcm1hdCBvZiBmcmFtZSB0byBkcmF3ICovCglJTlQgICAgICAgICAgICAgICAgeFNyYywgICAgLyogW2luXSBzb3VyY2UgcmVjdGFuZ2xlICovCglJTlQgICAgICAgICAgICAgICAgeVNyYywgICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR4U3JjLCAgIC8qIFtpbl0gKi8KCUlOVCAgICAgICAgICAgICAgICBkeVNyYywgICAvKiBbaW5dICovCglEV09SRCAgICAgICAgICAgICAgZHdSYXRlLCAgLyogW2luXSBmcmFtZXMvc2Vjb25kID0gKGR3UmF0ZS9kd1NjYWxlKSAqLwoJRFdPUkQgICAgICAgICAgICAgIGR3U2NhbGUpIC8qIFtpbl0gKi8KewoKCUlDRFJBV0JFR0lOCWljZGI7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJXAsJXUsJXUsJXUsJXUsJXAsJXUsJXUsJXUsJXUsJWxkLCVsZClcbiIsCgkJICBoaWMsIGR3RmxhZ3MsIGhwYWwsIGh3bmQsIGhkYywgeERzdCwgeURzdCwgZHhEc3QsIGR5RHN0LAoJCSAgbHBiaSwgeFNyYywgeVNyYywgZHhTcmMsIGR5U3JjLCBkd1JhdGUsIGR3U2NhbGUpOwoKCWljZGIuZHdGbGFncyA9IGR3RmxhZ3M7CglpY2RiLmhwYWwgPSBocGFsOwoJaWNkYi5od25kID0gaHduZDsKCWljZGIuaGRjID0gaGRjOwoJaWNkYi54RHN0ID0geERzdDsKCWljZGIueURzdCA9IHlEc3Q7CglpY2RiLmR4RHN0ID0gZHhEc3Q7CglpY2RiLmR5RHN0ID0gZHlEc3Q7CglpY2RiLmxwYmkgPSBscGJpOwoJaWNkYi54U3JjID0geFNyYzsKCWljZGIueVNyYyA9IHlTcmM7CglpY2RiLmR4U3JjID0gZHhTcmM7CglpY2RiLmR5U3JjID0gZHlTcmM7CglpY2RiLmR3UmF0ZSA9IGR3UmF0ZTsKCWljZGIuZHdTY2FsZSA9IGR3U2NhbGU7CglyZXR1cm4gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0RSQVdfQkVHSU4sKERXT1JEKSZpY2RiLHNpemVvZihpY2RiKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEcmF3CQkJW01TVkZXMzIuQF0KICovCkRXT1JEIFZGV0FQSVYgSUNEcmF3KEhJQyBoaWMsIERXT1JEIGR3RmxhZ3MsIExQVk9JRCBscEZvcm1hdCwgTFBWT0lEIGxwRGF0YSwgRFdPUkQgY2JEYXRhLCBMT05HIGxUaW1lKSB7CglJQ0RSQVcJaWNkOwoKCVRSQUNFKCIoJXAsJWxkLCVwLCVwLCVsZCwlbGQpXG4iLGhpYyxkd0ZsYWdzLGxwRm9ybWF0LGxwRGF0YSxjYkRhdGEsbFRpbWUpOwoKCWljZC5kd0ZsYWdzID0gZHdGbGFnczsKCWljZC5scEZvcm1hdCA9IGxwRm9ybWF0OwoJaWNkLmxwRGF0YSA9IGxwRGF0YTsKCWljZC5jYkRhdGEgPSBjYkRhdGE7CglpY2QubFRpbWUgPSBsVGltZTsKCglyZXR1cm4gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0RSQVcsKERXT1JEKSZpY2Qsc2l6ZW9mKGljZCkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ2xvc2UJCQlbTVNWRlczMi5AXQogKi8KTFJFU1VMVCBXSU5BUEkgSUNDbG9zZShISUMgaGljKQp7CiAgICBXSU5FX0hJQyogd2hpYyA9IE1TVklERU9fR2V0SGljUHRyKGhpYyk7CiAgICBXSU5FX0hJQyoqIHA7CgogICAgVFJBQ0UoIiglcClcbiIsaGljKTsKCiAgICBpZiAoIXdoaWMpIHJldHVybiBJQ0VSUl9CQURIQU5ETEU7CgogICAgaWYgKHdoaWMtPmRyaXZlcnByb2MpIAogICAgewogICAgICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0NMT1NFLCAwLCAwKTsKICAgICAgICBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9ESVNBQkxFLCAwLCAwKTsKICAgICAgICBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9GUkVFLCAwLCAwKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBDbG9zZURyaXZlcih3aGljLT5oZHJ2LCAwLCAwKTsKICAgIH0KCiAgICAvKiByZW1vdmUgd2hpYyBmcm9tIGxpc3QgKi8KICAgIGZvciAocCA9ICZNU1ZJREVPX0ZpcnN0SGljOyAqcCAhPSBOVUxMOyBwID0gJigoKnApLT5uZXh0KSkKICAgIHsKICAgICAgICBpZiAoKCpwKSA9PSB3aGljKQogICAgICAgIHsKICAgICAgICAgICAgKnAgPSB3aGljLT5uZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2hpYyk7CiAgICByZXR1cm4gMDsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW1hZ2VDb21wcmVzcwlbTVNWRlczMi5AXQogKi8KSEFORExFIFZGV0FQSSBJQ0ltYWdlQ29tcHJlc3MoCglISUMgaGljLCBVSU5UIHVpRmxhZ3MsCglMUEJJVE1BUElORk8gbHBiaUluLCBMUFZPSUQgbHBCaXRzLAoJTFBCSVRNQVBJTkZPIGxwYmlPdXQsIExPTkcgbFF1YWxpdHksCglMT05HKiBwbFNpemUpCnsKCUZJWE1FKCIoJXAsJTA4eCwlcCwlcCwlcCwlbGQsJXApXG4iLAoJCWhpYywgdWlGbGFncywgbHBiaUluLCBscEJpdHMsIGxwYmlPdXQsIGxRdWFsaXR5LCBwbFNpemUpOwoKCXJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW1hZ2VEZWNvbXByZXNzCVtNU1ZGVzMyLkBdCiAqLwoKSEFORExFIFZGV0FQSSBJQ0ltYWdlRGVjb21wcmVzcygKCUhJQyBoaWMsIFVJTlQgdWlGbGFncywgTFBCSVRNQVBJTkZPIGxwYmlJbiwKCUxQVk9JRCBscEJpdHMsIExQQklUTUFQSU5GTyBscGJpT3V0KQp7CglIR0xPQkFMCWhNZW0gPSBOVUxMOwoJQllURSoJcE1lbSA9IE5VTEw7CglCT09MCWJSZWxlYXNlSUMgPSBGQUxTRTsKCUJZVEUqCXBIZHIgPSBOVUxMOwoJVUxPTkcJY2JIZHIgPSAwOwoJQk9PTAliU3VjY2VlZGVkID0gRkFMU0U7CglCT09MCWJJbkRlY29tcHJlc3MgPSBGQUxTRTsKCURXT1JECWJpU2l6ZUltYWdlOwoKCVRSQUNFKCIoJXAsJTA4eCwlcCwlcCwlcClcbiIsCgkJaGljLCB1aUZsYWdzLCBscGJpSW4sIGxwQml0cywgbHBiaU91dCk7CgoJaWYgKCBoaWMgPT0gTlVMTCApCgl7CgkJaGljID0gSUNEZWNvbXByZXNzT3BlbiggSUNUWVBFX1ZJREVPLCAwLCAmbHBiaUluLT5ibWlIZWFkZXIsIChscGJpT3V0ICE9IE5VTEwpID8gJmxwYmlPdXQtPmJtaUhlYWRlciA6IE5VTEwgKTsKCQlpZiAoIGhpYyA9PSBOVUxMICkKCQl7CgkJCVdBUk4oIm5vIGhhbmRsZXJcbiIgKTsKCQkJZ290byBlcnI7CgkJfQoJCWJSZWxlYXNlSUMgPSBUUlVFOwoJfQoJaWYgKCB1aUZsYWdzICE9IDAgKQoJewoJCUZJWE1FKCAidW5rbm93biBmbGFnICUwOHhcbiIsIHVpRmxhZ3MgKTsKCQlnb3RvIGVycjsKCX0KCWlmICggbHBiaUluID09IE5VTEwgfHwgbHBCaXRzID09IE5VTEwgKQoJewoJCVdBUk4oImludmFsaWQgYXJndW1lbnRcbiIpOwoJCWdvdG8gZXJyOwoJfQoKCWlmICggbHBiaU91dCAhPSBOVUxMICkKCXsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemUgIT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkKCQkJZ290byBlcnI7CgkJY2JIZHIgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9PSAzICkKCQkJY2JIZHIgKz0gc2l6ZW9mKERXT1JEKSozOwoJCWVsc2UKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggKQoJCXsKCQkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQkJY2JIZHIgKz0gc2l6ZW9mKFJHQlFVQUQpICogKDE8PGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50KTsKCQkJZWxzZQoJCQkJY2JIZHIgKz0gc2l6ZW9mKFJHQlFVQUQpICogbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ2xyVXNlZDsKCQl9Cgl9CgllbHNlCgl7CgkJVFJBQ0UoICJnZXQgZm9ybWF0XG4iICk7CgoJCWNiSGRyID0gSUNEZWNvbXByZXNzR2V0Rm9ybWF0U2l6ZShoaWMsbHBiaUluKTsKCQlpZiAoIGNiSGRyIDwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkKCQkJZ290byBlcnI7CgkJcEhkciA9IChCWVRFKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGNiSGRyK3NpemVvZihSR0JRVUFEKSoyNTYpOwoJCWlmICggcEhkciA9PSBOVUxMICkKCQkJZ290byBlcnI7CgkJWmVyb01lbW9yeSggcEhkciwgY2JIZHIrc2l6ZW9mKFJHQlFVQUQpKjI1NiApOwoJCWlmICggSUNEZWNvbXByZXNzR2V0Rm9ybWF0KCBoaWMsIGxwYmlJbiwgKEJJVE1BUElORk8qKXBIZHIgKSAhPSBJQ0VSUl9PSyApCgkJCWdvdG8gZXJyOwoJCWxwYmlPdXQgPSAoQklUTUFQSU5GTyopcEhkcjsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggJiYKCQkJIElDRGVjb21wcmVzc0dldFBhbGV0dGUoIGhpYywgbHBiaUluLCBscGJpT3V0ICkgIT0gSUNFUlJfT0sgJiYKCQkJIGxwYmlJbi0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gbHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKQoJCXsKCQkJaWYgKCBscGJpSW4tPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCQltZW1jcHkoIGxwYmlPdXQtPmJtaUNvbG9ycywgbHBiaUluLT5ibWlDb2xvcnMsIHNpemVvZihSR0JRVUFEKSooMTw8bHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQpICk7CgkJCWVsc2UKCQkJCW1lbWNweSggbHBiaU91dC0+Ym1pQ29sb3JzLCBscGJpSW4tPmJtaUNvbG9ycywgc2l6ZW9mKFJHQlFVQUQpKmxwYmlJbi0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCApOwoJCX0KCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggJiYKCQkJIGxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCWxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPSAxPDxscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKCgkJbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKCQljYkhkciA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIHNpemVvZihSR0JRVUFEKSpscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkOwoJfQoKCWJpU2l6ZUltYWdlID0gbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlOwoJaWYgKCBiaVNpemVJbWFnZSA9PSAwICkKCQliaVNpemVJbWFnZSA9ICgoKChscGJpT3V0LT5ibWlIZWFkZXIuYmlXaWR0aCAqIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50ICsgNykgPj4gMykgKyAzKSAmICh+MykpICogYWJzKGxwYmlPdXQtPmJtaUhlYWRlci5iaUhlaWdodCk7CgoJVFJBQ0UoICJjYWxsIElDRGVjb21wcmVzc0JlZ2luXG4iICk7CgoJaWYgKCBJQ0RlY29tcHJlc3NCZWdpbiggaGljLCBscGJpSW4sIGxwYmlPdXQgKSAhPSBJQ0VSUl9PSyApCgkJZ290byBlcnI7CgliSW5EZWNvbXByZXNzID0gVFJVRTsKCglUUkFDRSggImNiSGRyICVsZCwgYmlTaXplSW1hZ2UgJWxkXG4iLCBjYkhkciwgYmlTaXplSW1hZ2UgKTsKCgloTWVtID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEV8R01FTV9aRVJPSU5JVCwgY2JIZHIgKyBiaVNpemVJbWFnZSApOwoJaWYgKCBoTWVtID09IE5VTEwgKQoJewoJCVdBUk4oICJvdXQgb2YgbWVtb3J5XG4iICk7CgkJZ290byBlcnI7Cgl9CglwTWVtID0gKEJZVEUqKUdsb2JhbExvY2soIGhNZW0gKTsKCWlmICggcE1lbSA9PSBOVUxMICkKCQlnb3RvIGVycjsKCW1lbWNweSggcE1lbSwgbHBiaU91dCwgY2JIZHIgKTsKCglUUkFDRSggImNhbGwgSUNEZWNvbXByZXNzXG4iICk7CglpZiAoIElDRGVjb21wcmVzcyggaGljLCAwLCAmbHBiaUluLT5ibWlIZWFkZXIsIGxwQml0cywgJmxwYmlPdXQtPmJtaUhlYWRlciwgcE1lbStjYkhkciApICE9IElDRVJSX09LICkKCQlnb3RvIGVycjsKCgliU3VjY2VlZGVkID0gVFJVRTsKZXJyOgoJaWYgKCBiSW5EZWNvbXByZXNzICkKCQlJQ0RlY29tcHJlc3NFbmQoIGhpYyApOwoJaWYgKCBiUmVsZWFzZUlDICkKCQlJQ0Nsb3NlKGhpYyk7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHBIZHIpOwoJaWYgKCBwTWVtICE9IE5VTEwgKQoJCUdsb2JhbFVubG9jayggaE1lbSApOwoJaWYgKCAhYlN1Y2NlZWRlZCAmJiBoTWVtICE9IE5VTEwgKQoJewoJCUdsb2JhbEZyZWUoaE1lbSk7IGhNZW0gPSBOVUxMOwoJfQoKCXJldHVybiAoSEFORExFKWhNZW07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIElDU2VxQ29tcHJlc3NGcmFtZSAgIFtNU1ZGVzMyLkBdCiAqLwpMUFZPSUQgVkZXQVBJIElDU2VxQ29tcHJlc3NGcmFtZShQQ09NUFZBUlMgcGMsIFVJTlQgdWlGbGFncywgTFBWT0lEIGxwQml0cywgQk9PTCAqcGZLZXksIExPTkcgKnBsU2l6ZSkKewogICAgRklYTUUoIiglcCwgMHglMDh4LCAlcCwgJXAsICVwKSwgc3R1YiFcbiIsIHBjLCB1aUZsYWdzLCBscEJpdHMsIHBmS2V5LCBwbFNpemUpOwogICAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIElDU2VxQ29tcHJlc3NGcmFtZUVuZCAgIFtNU1ZGVzMyLkBdCiAqLwp2b2lkIFZGV0FQSSBJQ1NlcUNvbXByZXNzRnJhbWVFbmQoUENPTVBWQVJTIHBjKQp7CiAgICBGSVhNRSgiKCVwKSwgc3R1YiFcbiIsIHBjKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgSUNTZXFDb21wcmVzc0ZyYW1lRW5kICAgW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDU2VxQ29tcHJlc3NGcmFtZVN0YXJ0KFBDT01QVkFSUyBwYywgTFBCSVRNQVBJTkZPIGxwYmlJbikKewogICAgRklYTUUoIiglcCwgJXApLCBzdHViIVxuIiwgcGMsIGxwYmlJbik7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgR2V0RmlsZU5hbWVQcmV2aWV3ICAgW01TVkZXMzIuQF0KICovCnN0YXRpYyBCT09MIEdldEZpbGVOYW1lUHJldmlldyhMUFZPSUQgbHBvZm4sQk9PTCBiU2F2ZSxCT09MIGJVbmljb2RlKQp7CiAgQ0hBUiAgICBzekZ1bmN0aW9uTmFtZVsyMF07CiAgQk9PTCAgICAoKmZuR2V0RmlsZU5hbWUpKExQVk9JRCk7CiAgSE1PRFVMRSBoQ29tZGxnMzI7CiAgQk9PTCAgICByZXQ7CgogIEZJWE1FKCIoJXAsJWQsJWQpLCBzZW1pLXN0dWIhXG4iLGxwb2ZuLGJTYXZlLGJVbmljb2RlKTsKCiAgbHN0cmNweUEoc3pGdW5jdGlvbk5hbWUsIChiU2F2ZSA/ICJHZXRTYXZlRmlsZU5hbWUiIDogIkdldE9wZW5GaWxlTmFtZSIpKTsKICBsc3RyY2F0QShzekZ1bmN0aW9uTmFtZSwgKGJVbmljb2RlID8gIlciIDogIkEiKSk7CgogIGhDb21kbGczMiA9IExvYWRMaWJyYXJ5QSgiQ09NRExHMzIuRExMIik7CiAgaWYgKGhDb21kbGczMiA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICBmbkdldEZpbGVOYW1lID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoQ29tZGxnMzIsIHN6RnVuY3Rpb25OYW1lKTsKICBpZiAoZm5HZXRGaWxlTmFtZSA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBGSVhNRTogbmVlZCB0byBhZGQgT0ZOX0VOQUJMRUhPT0sgYW5kIG91ciBvd24gaGFuZGxlciAqLwogIHJldCA9IGZuR2V0RmlsZU5hbWUobHBvZm4pOwoKICBGcmVlTGlicmFyeShoQ29tZGxnMzIpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0T3BlbkZpbGVOYW1lUHJldmlld0EJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldE9wZW5GaWxlTmFtZVByZXZpZXdBKExQT1BFTkZJTEVOQU1FQSBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIEZBTFNFLCBGQUxTRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0T3BlbkZpbGVOYW1lUHJldmlld1cJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldE9wZW5GaWxlTmFtZVByZXZpZXdXKExQT1BFTkZJTEVOQU1FVyBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIEZBTFNFLCBUUlVFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTYXZlRmlsZU5hbWVQcmV2aWV3QQlbTVNWRlczMi5AXQogKi8KQk9PTCBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lUHJldmlld0EoTFBPUEVORklMRU5BTUVBIGxwb2ZuKQp7CiAgRklYTUUoIiglcCksIHNlbWktc3R1YiFcbiIsIGxwb2ZuKTsKCiAgcmV0dXJuIEdldEZpbGVOYW1lUHJldmlldyhscG9mbiwgVFJVRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFNhdmVGaWxlTmFtZVByZXZpZXdXCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRTYXZlRmlsZU5hbWVQcmV2aWV3VyhMUE9QRU5GSUxFTkFNRVcgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBUUlVFLCBUUlVFKTsKfQo=