LyoKICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAwIEJyYWRsZXkgQmFldHoKICogQ29weXJpZ2h0IDIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogRklYTUU6IFRoaXMgYWxsIGFzc3VtZXMgMzIgYml0IGNvZGVjcwogKgkJV2luOTUgYXBwZWFycyB0byBwcmVmZXIgMzIgYml0IGNvZGVjcywgZXZlbiBmcm9tIDE2IGJpdCBjb2RlLgogKgkJVGhlcmUgaXMgdGhlIElDT3BlbkZ1bmN0aW9uMTYgdG8gd29ycnkgYWJvdXQgc3RpbGwsIHRob3VnaC4KICogICAgICAKICogVE9ETwogKiAgICAgIC0gbm8gdGhyZWFkIHNhZmV0eQogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAibXN2aWRlb19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgoKI2luY2x1ZGUgIndpbmRvd3N4LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN2aWRlbyk7CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKndpbmVfZGJnc3RyX2ZjYyggRFdPUkQgZmNjICkKewogICAgcmV0dXJuIHdpbmVfZGJnX3NwcmludGYoIiVjJWMlYyVjIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0JZVEUoTE9XT1JEKGZjYykpLCBISUJZVEUoTE9XT1JEKGZjYykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9CWVRFKEhJV09SRChmY2MpKSwgSElCWVRFKEhJV09SRChmY2MpKSk7Cn0KCkxSRVNVTFQgKENBTExCQUNLICpwRm5DYWxsVG8xNikoSERSVlIsIEhJQywgVUlOVCwgTFBBUkFNLCBMUEFSQU0pID0gTlVMTDsKCnN0YXRpYyBXSU5FX0hJQyogICAgICAgIE1TVklERU9fRmlyc3RIaWMgLyogPSBOVUxMICovOwoKdHlwZWRlZiBzdHJ1Y3QgX3JlZ19kcml2ZXIgcmVnX2RyaXZlcjsKc3RydWN0IF9yZWdfZHJpdmVyCnsKICAgIERXT1JEICAgICAgIGZjY1R5cGU7CiAgICBEV09SRCAgICAgICBmY2NIYW5kbGVyOwogICAgRFJJVkVSUFJPQyAgcHJvYzsKICAgIExQV1NUUiAgICAgIG5hbWU7CiAgICByZWdfZHJpdmVyKiBuZXh0Owp9OwoKc3RhdGljIHJlZ19kcml2ZXIqIHJlZ19kcml2ZXJfbGlzdCA9IE5VTEw7CgpITU9EVUxFIE1TVkZXMzJfaE1vZHVsZTsKCkJPT0wgV0lOQVBJIERsbE1haW4oIEhJTlNUQU5DRSBoaW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQgKQp7CiAgICBUUkFDRSgiJXAsJWx4LCVwXG4iLCBoaW5zdCwgcmVhc29uLCByZXNlcnZlZCk7CgogICAgc3dpdGNoKHJlYXNvbikKICAgIHsKICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKICAgICAgICAgICAgRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscyhoaW5zdCk7CiAgICAgICAgICAgIE1TVkZXMzJfaE1vZHVsZSA9IChITU9EVUxFKWhpbnN0OwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgaW50IGNvbXBhcmVfZm91cmNjKERXT1JEIGZjYzEsIERXT1JEIGZjYzIpCnsKICBjaGFyIGZjY19zdHIxWzVdOwogIGNoYXIgZmNjX3N0cjJbNV07CiAgZmNjX3N0cjFbMF0gPSBMT0JZVEUoTE9XT1JEKGZjYzEpKTsKICBmY2Nfc3RyMVsxXSA9IEhJQllURShMT1dPUkQoZmNjMSkpOwogIGZjY19zdHIxWzJdID0gTE9CWVRFKEhJV09SRChmY2MxKSk7CiAgZmNjX3N0cjFbM10gPSBISUJZVEUoSElXT1JEKGZjYzEpKTsKICBmY2Nfc3RyMVs0XSA9IDA7CiAgZmNjX3N0cjJbMF0gPSBMT0JZVEUoTE9XT1JEKGZjYzIpKTsKICBmY2Nfc3RyMlsxXSA9IEhJQllURShMT1dPUkQoZmNjMikpOwogIGZjY19zdHIyWzJdID0gTE9CWVRFKEhJV09SRChmY2MyKSk7CiAgZmNjX3N0cjJbM10gPSBISUJZVEUoSElXT1JEKGZjYzIpKTsKICBmY2Nfc3RyMls0XSA9IDA7CgogIHJldHVybiBzdHJjYXNlY21wKGZjY19zdHIxLGZjY19zdHIyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTVNWSURFT19HZXRIaWNQdHIKICoKICoKICovCldJTkVfSElDKiAgIE1TVklERU9fR2V0SGljUHRyKEhJQyBoaWMpCnsKICAgIFdJTkVfSElDKiAgIHdoaWM7CgogICAgZm9yICh3aGljID0gTVNWSURFT19GaXJzdEhpYzsgd2hpYyAmJiB3aGljLT5oaWMgIT0gaGljOyB3aGljID0gd2hpYy0+bmV4dCk7CiAgICByZXR1cm4gd2hpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWaWRlb0ZvcldpbmRvd3NWZXJzaW9uCQlbTVNWRlczMi4yXQogKgkJVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgkJW01TVklERU8uMl0KICogUmV0dXJucyB0aGUgdmVyc2lvbiBpbiBtYWpvci5taW5vciBmb3JtLgogKiBJbiBXaW5kb3dzOTUgdGhpcyByZXR1cm5zIDB4MDQwMDAzYjYgKDQuOTUwKQogKi8KRFdPUkQgV0lOQVBJIFZpZGVvRm9yV2luZG93c1ZlcnNpb24odm9pZCkgCnsKICAgIHJldHVybiAweDA0MDAwM0I2OyAvKiA0Ljk1MCAqLwp9CgovKiBzeXN0ZW0uaW5pOiBbZHJpdmVyc10gKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbmZvCQkJCVtNU1ZGVzMyLkBdCiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnN0YWxsYWJsZSBjb21wcmVzc29yLiBSZXR1cm4gVFJVRSBpZiB0aGVyZQogKiBpcyBvbmUuCiAqLwpCT09MIFZGV0FQSSBJQ0luZm8oCglEV09SRCBmY2NUeXBlLAkJLyogW2luXSB0eXBlIG9mIGNvbXByZXNzb3IgKCd2aWRjJykgKi8KCURXT1JEIGZjY0hhbmRsZXIsCS8qIFtpbl0gcmVhbCBmY2MgZm9yIGhhbmRsZXIgb3IgPG4+dGggY29tcHJlc3NvciAqLwoJSUNJTkZPICpscGljaW5mbykJLyogW291dF0gaW5mb3JtYXRpb24gYWJvdXQgY29tcHJlc3NvciAqLwp7CiAgICBjaGFyCWJ1ZlsyMDAwXTsKCiAgICBUUkFDRSgiKCVzLCVzLyUwOGx4LCVwKVxuIiwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgZmNjSGFuZGxlciwgbHBpY2luZm8pOwoKICAgIGlmIChHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BKCJkcml2ZXJzMzIiLCBidWYsIHNpemVvZihidWYpLCAic3lzdGVtLmluaSIpKSAKICAgIHsKICAgICAgICBjaGFyICAgIGZjY1R5cGVTdHJbNF07CiAgICAgICAgY2hhciAgICBmY2NIYW5kbGVyU3RyWzRdOwogICAgICAgIGNoYXIqICAgczsKCiAgICAgICAgZmNjVHlwZVN0clswXSA9IExPQllURShMT1dPUkQoZmNjVHlwZSkpOwogICAgICAgIGZjY1R5cGVTdHJbMV0gPSBISUJZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICBmY2NUeXBlU3RyWzJdID0gTE9CWVRFKEhJV09SRChmY2NUeXBlKSk7CiAgICAgICAgZmNjVHlwZVN0clszXSA9IEhJQllURShISVdPUkQoZmNjVHlwZSkpOwoKICAgICAgICBmY2NIYW5kbGVyU3RyWzBdID0gTE9CWVRFKExPV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgZmNjSGFuZGxlclN0clsxXSA9IEhJQllURShMT1dPUkQoZmNjSGFuZGxlcikpOwogICAgICAgIGZjY0hhbmRsZXJTdHJbMl0gPSBMT0JZVEUoSElXT1JEKGZjY0hhbmRsZXIpKTsKICAgICAgICBmY2NIYW5kbGVyU3RyWzNdID0gSElCWVRFKEhJV09SRChmY2NIYW5kbGVyKSk7CgogICAgICAgIGZvciAocyA9IGJ1ZjsgKnM7IHMgKz0gc3RybGVuKHMpICsgMSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGZjY1R5cGVTdHIsIHMsIDQpICYmIHNbNF0gPT0gJy4nICYmIHNbOV0gPT0gJz0nICYmCiAgICAgICAgICAgICAgICAoIWZjY0hhbmRsZXItLSB8fCAhc3RybmNhc2VjbXAoZmNjSGFuZGxlclN0ciwgcyArIDUsIDQpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogZXhhY3QgbWF0Y2ggb2YgZmNjSGFuZGxlciBvciBudGggZHJpdmVyIGZvdW5kID8/ICovCiAgICAgICAgICAgICAgICBscGljaW5mby0+ZmNjVHlwZSA9IGZjY1R5cGU7CiAgICAgICAgICAgICAgICBscGljaW5mby0+ZmNjSGFuZGxlciA9IG1taW9TdHJpbmdUb0ZPVVJDQ0EocyArIDUsIDApOwogICAgICAgICAgICAgICAgbHBpY2luZm8tPmR3RmxhZ3MgPSAwOwogICAgICAgICAgICAgICAgbHBpY2luZm8tPmR3VmVyc2lvbiA9IDA7CiAgICAgICAgICAgICAgICBscGljaW5mby0+ZHdWZXJzaW9uSUNNID0gMHgxMDQ7CiAgICAgICAgICAgICAgICBscGljaW5mby0+c3pOYW1lWzBdID0gMDsKICAgICAgICAgICAgICAgIGxwaWNpbmZvLT5zekRlc2NyaXB0aW9uWzBdID0gMDsKICAgICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzICsgMTAsIC0xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBpY2luZm8tPnN6RHJpdmVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxwaWNpbmZvLT5zekRyaXZlcikvc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIERXT1JEIElDX0hhbmRsZVJlZiA9IDE7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW5zdGFsbAkJCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFZGV0FQSSBJQ0luc3RhbGwoRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgTFBBUkFNIGxQYXJhbSwgTFBTVFIgc3pEZXNjLCBVSU5UIHdGbGFncykgCnsKICAgIHJlZ19kcml2ZXIqIGRyaXZlcjsKICAgIHVuc2lnbmVkIGxlbjsKCiAgICBUUkFDRSgiKCVzLCVzLCVwLCVwLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCAodm9pZCopbFBhcmFtLCBzekRlc2MsIHdGbGFncyk7CgogICAgLyogQ2hlY2sgaWYgYSBkcml2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCiAgICBmb3IgKGRyaXZlciA9IHJlZ19kcml2ZXJfbGlzdDsgZHJpdmVyOyBkcml2ZXIgPSBkcml2ZXItPm5leHQpCiAgICB7CiAgICAgICAgaWYgKCFjb21wYXJlX2ZvdXJjYyhmY2NUeXBlLCBkcml2ZXItPmZjY1R5cGUpICYmCiAgICAgICAgICAgICFjb21wYXJlX2ZvdXJjYyhmY2NIYW5kbGVyLCBkcml2ZXItPmZjY0hhbmRsZXIpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChkcml2ZXIpIHJldHVybiBGQUxTRTsKCiAgICAvKiBSZWdpc3RlciB0aGUgZHJpdmVyICovCiAgICBkcml2ZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKHJlZ19kcml2ZXIpKTsKICAgIGlmICghZHJpdmVyKSBnb3RvIG9vbTsKICAgIGRyaXZlci0+ZmNjVHlwZSA9IGZjY1R5cGU7CiAgICBkcml2ZXItPmZjY0hhbmRsZXIgPSBmY2NIYW5kbGVyOwoKICAgIHN3aXRjaCh3RmxhZ3MpCiAgICB7CiAgICBjYXNlIElDSU5TVEFMTF9GVU5DVElPTjoKICAgICAgICBkcml2ZXItPnByb2MgPSAoRFJJVkVSUFJPQylsUGFyYW07Cglkcml2ZXItPm5hbWUgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ0lOU1RBTExfRFJJVkVSOgoJZHJpdmVyLT5wcm9jID0gTlVMTDsKICAgICAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgKGNoYXIqKWxQYXJhbSwgLTEsIE5VTEwsIDApOwogICAgICAgIGRyaXZlci0+bmFtZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpKTsKICAgICAgICBpZiAoIWRyaXZlci0+bmFtZSkgZ290byBvb207CiAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIChjaGFyKilsUGFyYW0sIC0xLCBkcml2ZXItPm5hbWUsIGxlbik7CglicmVhazsKICAgIGRlZmF1bHQ6CglFUlIoIkludmFsaWQgZmxhZ3MhXG4iKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRyaXZlcik7CglyZXR1cm4gRkFMU0U7CiAgIH0KCiAgIC8qIEluc2VydCBvdXIgZHJpdmVyIGluIHRoZSBsaXN0Ki8KICAgZHJpdmVyLT5uZXh0ID0gcmVnX2RyaXZlcl9saXN0OwogICByZWdfZHJpdmVyX2xpc3QgPSBkcml2ZXI7CiAgICAKICAgcmV0dXJuIFRSVUU7CiBvb206CiAgIGlmIChkcml2ZXIpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRyaXZlcik7CiAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ1JlbW92ZQkJCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFZGV0FQSSBJQ1JlbW92ZShEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdGbGFncykgCnsKICAgIHJlZ19kcml2ZXIqKiBwZHJpdmVyOwogICAgCiAgICBUUkFDRSgiKCVzLCVzLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCB3RmxhZ3MpOwoKICAgIC8qIENoZWNrIGlmIGEgZHJpdmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLwogICAgZm9yIChwZHJpdmVyID0gJnJlZ19kcml2ZXJfbGlzdDsgKnBkcml2ZXI7IHBkcml2ZXIgPSAmKCpwZHJpdmVyKS0+bmV4dCkKICAgIHsKICAgICAgICBpZiAoIWNvbXBhcmVfZm91cmNjKGZjY1R5cGUsICgqcGRyaXZlciktPmZjY1R5cGUpICYmCiAgICAgICAgICAgICFjb21wYXJlX2ZvdXJjYyhmY2NIYW5kbGVyLCAoKnBkcml2ZXIpLT5mY2NIYW5kbGVyKSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoISpwZHJpdmVyKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBSZW1vdmUgdGhlIGRyaXZlciBmcm9tIHRoZSBsaXN0ICovCiAgICAqcGRyaXZlciA9ICgqcGRyaXZlciktPm5leHQ7CiAgICBpZiAoKCpwZHJpdmVyKS0+bmFtZSkKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKnBkcml2ZXIpLT5uYW1lKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICpwZHJpdmVyKTsKICAgIAogICAgcmV0dXJuIFRSVUU7ICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNPcGVuCQkJCVtNU1ZGVzMyLkBdCiAqIE9wZW5zIGFuIGluc3RhbGxhYmxlIGNvbXByZXNzb3IuIFJldHVybiBzcGVjaWFsIGhhbmRsZS4KICovCkhJQyBWRldBUEkgSUNPcGVuKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUpIAp7CiAgICBXQ0hBUgkJY29kZWNuYW1lWzEwXTsKICAgIElDT1BFTgkJaWNvcGVuOwogICAgSERSVlIJCWhkcnY7CiAgICBXSU5FX0hJQyogICAgICAgICAgIHdoaWM7CiAgICBCT09MICAgICAgICAgICAgICAgIGJJczE2OwogICAgc3RhdGljIGNvbnN0IFdDSEFSICBkcnYzMldbXSA9IHsnZCcsJ3InLCdpJywndicsJ2UnLCdyJywncycsJzMnLCcyJywnXDAnfTsKICAgIHJlZ19kcml2ZXIqICAgICAgICAgZHJpdmVyOwoKICAgIFRSQUNFKCIoJXMsJXMsMHglMDh4KVxuIiwgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdNb2RlKTsKCiAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJlZ2lzdGVyZWQgZHJpdmVyIHRoYXQgbWF0Y2hlcyAqLwogICAgZHJpdmVyID0gcmVnX2RyaXZlcl9saXN0OwogICAgd2hpbGUoZHJpdmVyKQogICAgICAgIGlmICghY29tcGFyZV9mb3VyY2MoZmNjVHlwZSwgZHJpdmVyLT5mY2NUeXBlKSAmJgogICAgICAgICAgICAhY29tcGFyZV9mb3VyY2MoZmNjSGFuZGxlciwgZHJpdmVyLT5mY2NIYW5kbGVyKSkKCSAgICBicmVhazsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGRyaXZlciA9IGRyaXZlci0+bmV4dDsKCiAgICBpZiAoZHJpdmVyICYmIGRyaXZlci0+cHJvYykKCS8qIFRoZSBkcml2ZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhdCBydW50aW1lIHdpdGggaXRzIGRyaXZlcnByb2MgKi8KICAgICAgICByZXR1cm4gTVNWSURFT19PcGVuRnVuY3Rpb24oZmNjVHlwZSwgZmNjSGFuZGxlciwgd01vZGUsIChEUklWRVJQUk9DKWRyaXZlci0+cHJvYywgKERXT1JEKU5VTEwpOwogIAogICAgLyogV2VsbCwgbFBhcmFtMiBpcyBpbiBmYWN0IGEgTFBWSURFT19PUEVOX1BBUk1TLCBidXQgaXQgaGFzIHRoZQogICAgICogc2FtZSBsYXlvdXQgYXMgSUNPUEVOCiAgICAgKi8KICAgIGljb3Blbi5kd1NpemUJCT0gc2l6ZW9mKElDT1BFTik7CiAgICBpY29wZW4uZmNjVHlwZQkJPSBmY2NUeXBlOwogICAgaWNvcGVuLmZjY0hhbmRsZXIJICAgICAgICA9IGZjY0hhbmRsZXI7CiAgICBpY29wZW4uZHdWZXJzaW9uICAgICAgICAgICAgPSAweDAwMDAxMDAwOyAvKiBGSVhNRSAqLwogICAgaWNvcGVuLmR3RmxhZ3MJCT0gd01vZGU7CiAgICBpY29wZW4uZHdFcnJvciAgICAgICAgICAgICAgPSAwOwogICAgaWNvcGVuLnBWMVJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5wVjJSZXNlcnZlZCAgICAgICAgICA9IE5VTEw7CiAgICBpY29wZW4uZG5EZXZOb2RlICAgICAgICAgICAgPSAwOyAvKiBGSVhNRSAqLwoJCiAgICBpZiAoIWRyaXZlcikgewogICAgICAgIC8qIFRoZSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgKi8KICAgICAgICBjb2RlY25hbWVbMF0gPSBMT0JZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbMV0gPSBISUJZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbMl0gPSBMT0JZVEUoSElXT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbM10gPSBISUJZVEUoSElXT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbNF0gPSAnLic7CiAgICAgICAgY29kZWNuYW1lWzVdID0gTE9CWVRFKExPV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzZdID0gSElCWVRFKExPV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzddID0gTE9CWVRFKEhJV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzhdID0gSElCWVRFKEhJV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzldID0gJ1wwJzsKCiAgICAgICAgaGRydiA9IE9wZW5Ecml2ZXIoY29kZWNuYW1lLCBkcnYzMlcsIChMUEFSQU0pJmljb3Blbik7CiAgICAgICAgaWYgKCFoZHJ2KSAKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTykgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVswXSA9ICd2JzsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVsxXSA9ICdpJzsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVsyXSA9ICdkJzsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVszXSA9ICdjJzsKCgkJZmNjVHlwZSA9IElDVFlQRV9WSURFTzsKICAgICAgICAgICAgICAgIGhkcnYgPSBPcGVuRHJpdmVyKGNvZGVjbmFtZSwgZHJ2MzJXLCAoTFBBUkFNKSZpY29wZW4pOwoJICAgIH0KICAgICAgICAgICAgaWYgKCFoZHJ2KQogICAgICAgICAgICAgICAgcmV0dXJuIDA7Cgl9CiAgICB9IGVsc2UgewogICAgICAgIC8qIFRoZSBkcml2ZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhdCBydW50aW1lIHdpdGggaXRzIG5hbWUgKi8KICAgICAgICBoZHJ2ID0gT3BlbkRyaXZlcihkcml2ZXItPm5hbWUsIE5VTEwsIChMUEFSQU0pJmljb3Blbik7CiAgICAgICAgaWYgKCFoZHJ2KSAKICAgICAgICAgICAgcmV0dXJuIDA7IAogICAgfQogICAgYklzMTYgPSBHZXREcml2ZXJGbGFncyhoZHJ2KSAmIDB4MTAwMDAwMDA7IC8qIHVuZG9jdW1lbnRlZCBmbGFnOiBXSU5FX0dERl8xNkJJVCAqLwoKICAgIGlmIChiSXMxNiAmJiAhcEZuQ2FsbFRvMTYpCiAgICB7CiAgICAgICAgRklYTUUoIkdvdCBhIDE2IGJpdCBkcml2ZXIsIGJ1dCBubyAxNiBiaXQgc3VwcG9ydCBpbiBtc3Zmd1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB3aGljID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihXSU5FX0hJQykpOwogICAgaWYgKCF3aGljKQogICAgewogICAgICAgIENsb3NlRHJpdmVyKGhkcnYsIDAsIDApOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHdoaWMtPmhkcnYgICAgICAgICAgPSBoZHJ2OwogICAgLyogRklYTUU6IGlzIHRoZSBzaWduYXR1cmUgdGhlIHJlYWwgb25lID8gKi8KICAgIHdoaWMtPmRyaXZlcnByb2MgICAgPSBiSXMxNiA/IChEUklWRVJQUk9DKXBGbkNhbGxUbzE2IDogTlVMTDsKICAgIHdoaWMtPmRyaXZlcnByb2MxNiAgPSAwOwogICAgd2hpYy0+dHlwZSAgICAgICAgICA9IGZjY1R5cGU7CiAgICB3aGljLT5oYW5kbGVyICAgICAgID0gZmNjSGFuZGxlcjsKICAgIHdoaWxlIChNU1ZJREVPX0dldEhpY1B0cihISUNfMzIoSUNfSGFuZGxlUmVmKSkgIT0gTlVMTCkgSUNfSGFuZGxlUmVmKys7CiAgICB3aGljLT5oaWMgICAgICAgICAgID0gSElDXzMyKElDX0hhbmRsZVJlZisrKTsKICAgIHdoaWMtPm5leHQgICAgICAgICAgPSBNU1ZJREVPX0ZpcnN0SGljOwogICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWM7CgogICAgVFJBQ0UoIj0+ICVwXG4iLCB3aGljLT5oaWMpOwogICAgcmV0dXJuIHdoaWMtPmhpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNU1ZJREVPX09wZW5GdW5jdGlvbgogKi8KSElDIE1TVklERU9fT3BlbkZ1bmN0aW9uKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgRFJJVkVSUFJPQyBscGZuSGFuZGxlciwgRFdPUkQgbHBmbkhhbmRsZXIxNikgCnsKICAgIElDT1BFTiAgICAgIGljb3BlbjsKICAgIFdJTkVfSElDKiAgIHdoaWM7CgogICAgVFJBQ0UoIiglcywlcywlZCwlcCwlMDhseClcbiIsIAogICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdNb2RlLCBscGZuSGFuZGxlciwgbHBmbkhhbmRsZXIxNik7CgogICAgaWNvcGVuLmR3U2l6ZQkJPSBzaXplb2YoSUNPUEVOKTsKICAgIGljb3Blbi5mY2NUeXBlCQk9IGZjY1R5cGU7CiAgICBpY29wZW4uZmNjSGFuZGxlcgkgICAgICAgID0gZmNjSGFuZGxlcjsKICAgIGljb3Blbi5kd1ZlcnNpb24gICAgICAgICAgICA9IDB4MDAwMDEwMDA7IC8qIEZJWE1FICovCiAgICBpY29wZW4uZHdGbGFncwkJPSB3TW9kZTsKICAgIGljb3Blbi5kd0Vycm9yICAgICAgICAgICAgICA9IDA7CiAgICBpY29wZW4ucFYxUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLnBWMlJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5kbkRldk5vZGUgICAgICAgICAgICA9IDA7IC8qIEZJWE1FICovCgogICAgd2hpYyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoV0lORV9ISUMpKTsKICAgIGlmICghd2hpYykgcmV0dXJuIDA7CgogICAgd2hpYy0+ZHJpdmVycHJvYyAgID0gbHBmbkhhbmRsZXI7CiAgICB3aGljLT5kcml2ZXJwcm9jMTYgPSBscGZuSGFuZGxlcjE2OwogICAgd2hpbGUgKE1TVklERU9fR2V0SGljUHRyKEhJQ18zMihJQ19IYW5kbGVSZWYpKSAhPSBOVUxMKSBJQ19IYW5kbGVSZWYrKzsKICAgIHdoaWMtPmhpYyAgICAgICAgICA9IEhJQ18zMihJQ19IYW5kbGVSZWYrKyk7CiAgICB3aGljLT5uZXh0ICAgICAgICAgPSBNU1ZJREVPX0ZpcnN0SGljOwogICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWM7CgogICAgLyogTm93IHRyeSBvcGVuaW5nL2xvYWRpbmcgdGhlIGRyaXZlci4gVGFrZW4gZnJvbSBEUklWRVJfQWRkVG9MaXN0ICovCiAgICAvKiBXaGF0IGlmIHRoZSBmdW5jdGlvbiBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlPyAqLwoKICAgIGlmIChNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9MT0FELCAwTCwgMEwpICE9IERSVl9TVUNDRVNTKSAKICAgIHsKICAgICAgICBXQVJOKCJEUlZfTE9BRCBmYWlsZWQgZm9yIGhpYyAlcFxuIiwgd2hpYy0+aGljKTsKICAgICAgICBNU1ZJREVPX0ZpcnN0SGljID0gd2hpYy0+bmV4dDsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aGljKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIC8qIHJldHVybiB2YWx1ZSBpcyBub3QgY2hlY2tlZCAqLwogICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfRU5BQkxFLCAwTCwgMEwpOwoKICAgIHdoaWMtPmRyaXZlcklkID0gKERXT1JEKU1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX09QRU4sIDAsIChEV09SRCkmaWNvcGVuKTsKICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBwdXQgaGVyZT8gKi8KICAgIHdoaWMtPmhkcnYgPSAoSERSVlIpMDsKICAgIAogICAgaWYgKHdoaWMtPmRyaXZlcklkID09IDApIAogICAgewogICAgICAgIFdBUk4oIkRSVl9PUEVOIGZhaWxlZCBmb3IgaGljICVwXG4iLCB3aGljLT5oaWMpOwogICAgICAgIE1TVklERU9fRmlyc3RIaWMgPSB3aGljLT5uZXh0OwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdoaWMpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIFRSQUNFKCI9PiAlcFxuIiwgd2hpYy0+aGljKTsKICAgIHJldHVybiB3aGljLT5oaWM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNPcGVuRnVuY3Rpb24JCQlbTVNWRlczMi5AXQogKi8KSElDIFZGV0FQSSBJQ09wZW5GdW5jdGlvbihEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdNb2RlLCBGQVJQUk9DIGxwZm5IYW5kbGVyKSAKewogICAgcmV0dXJuIE1TVklERU9fT3BlbkZ1bmN0aW9uKGZjY1R5cGUsIGZjY0hhbmRsZXIsIHdNb2RlLCAoRFJJVkVSUFJPQylscGZuSGFuZGxlciwgMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNHZXRJbmZvCQkJW01TVkZXMzIuQF0KICovCkxSRVNVTFQgVkZXQVBJIElDR2V0SW5mbyhISUMgaGljLCBJQ0lORk8gKnBpY2luZm8sIERXT1JEIGNiKSAKewogICAgTFJFU1VMVAlyZXQ7CiAgICBXSU5FX0hJQyogICB3aGljID0gTVNWSURFT19HZXRIaWNQdHIoaGljKTsKCiAgICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIGhpYywgcGljaW5mbywgY2IpOwoKICAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwogICAgaWYgKCF3aGljKSByZXR1cm4gSUNFUlJfQkFESEFORExFOwogICAgaWYgKCFwaWNpbmZvKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICAvKiAoV1MpIFRoZSBmaWVsZCBzekRyaXZlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVjYXVzZSB0aGUgZHJpdmVyIAogICAgICogaXMgbm90IG9ibGlnZWQgYW5kIG9mdGVuIHdpbGwgbm90IGRvIGl0LiBTb21lIGFwcGxpY2F0aW9ucywgbGlrZQogICAgICogVmlydHVhbER1YiwgcmVseSBvbiB0aGlzIGZpZWxkIGFuZCB3aWxsIG9jY2FzaW9uYWxseSBjcmFzaCBpZiBpdAogICAgICogZ29lcyB1bml0aWFsaXplZC4KICAgICAqLwogICAgaWYgKGNiID49IHNpemVvZihJQ0lORk8pKSBwaWNpbmZvLT5zekRyaXZlclswXSA9ICdcMCc7CgogICAgcmV0ID0gSUNTZW5kTWVzc2FnZShoaWMsIElDTV9HRVRJTkZPLCAoRFdPUkQpcGljaW5mbywgY2IpOwoKICAgIC8qIChXUykgV2hlbiBzekRyaXZlciB3YXMgbm90IHN1cHBsaWVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLCBhcHBhcmVudGx5IAogICAgICogV2luZG93cyB3aWxsIHNldCBpdHMgdmFsdWUgZXF1YWwgdG8gdGhlIGRyaXZlciBmaWxlIG5hbWUuIFRoaXMgY2FuCiAgICAgKiBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSBhcyB3ZSBkbyBoZXJlLgogICAgICovCiAgICBpZiAoY2IgPj0gc2l6ZW9mKElDSU5GTykgJiYgcGljaW5mby0+c3pEcml2ZXJbMF0gPT0gMCkKICAgIHsKICAgICAgICBJQ0lORk8gIGlpOwoKICAgICAgICBtZW1zZXQoJmlpLCAwLCBzaXplb2YoaWkpKTsKICAgICAgICBpaS5kd1NpemUgPSBzaXplb2YoaWkpOwogICAgICAgIElDSW5mbyhwaWNpbmZvLT5mY2NUeXBlLCBwaWNpbmZvLT5mY2NIYW5kbGVyLCAmaWkpOwogICAgICAgIGxzdHJjcHlXKHBpY2luZm8tPnN6RHJpdmVyLCBpaS5zekRyaXZlcik7CiAgICB9CgogICAgVFJBQ0UoIgktPiAweCUwOGx4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0xvY2F0ZQkJCVtNU1ZGVzMyLkBdCiAqLwpISUMgVkZXQVBJIElDTG9jYXRlKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCiAgICAgICAgICAgICAgICAgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQsIFdPUkQgd01vZGUpCnsKICAgIEhJQyAgICAgICAgIGhpYzsKICAgIERXT1JECXF1ZXJ5bXNnOwogICAgTFBTVFIgICAgICAgcHN6QnVmZmVyOwoKICAgIFRSQUNFKCIoJXMsJXMsJXAsJXAsMHglMDR4KVxuIiwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgbHBiaUluLCBscGJpT3V0LCB3TW9kZSk7CgogICAgc3dpdGNoICh3TW9kZSkgCiAgICB7CiAgICBjYXNlIElDTU9ERV9GQVNUQ09NUFJFU1M6CiAgICBjYXNlIElDTU9ERV9DT01QUkVTUzoKICAgICAgICBxdWVyeW1zZyA9IElDTV9DT01QUkVTU19RVUVSWTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSUNNT0RFX0ZBU1RERUNPTVBSRVNTOgogICAgY2FzZSBJQ01PREVfREVDT01QUkVTUzoKICAgICAgICBxdWVyeW1zZyA9IElDTV9ERUNPTVBSRVNTX1FVRVJZOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ01PREVfRFJBVzoKICAgICAgICBxdWVyeW1zZyA9IElDTV9EUkFXX1FVRVJZOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBXQVJOKCJVbmtub3duIG1vZGUgKCVkKVxuIiwgd01vZGUpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIEVhc3kgY2FzZTogaGFuZGxlci90eXBlIG1hdGNoLCB3ZSBqdXN0IGZpcmUgYSBxdWVyeSBhbmQgcmV0dXJuICovCiAgICBoaWMgPSBJQ09wZW4oZmNjVHlwZSwgZmNjSGFuZGxlciwgd01vZGUpOwogICAgaWYgKGhpYykgCiAgICB7CiAgICAgICAgaWYgKCFJQ1NlbmRNZXNzYWdlKGhpYywgcXVlcnltc2csIChEV09SRClscGJpSW4sIChEV09SRClscGJpT3V0KSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCI9PiAlcFxuIiwgaGljKTsKICAgICAgICAgICAgcmV0dXJuIGhpYzsKICAgICAgICB9CiAgICAgICAgSUNDbG9zZShoaWMpOwogICAgfQoKICAgIC8qIE5vdyB0cnkgZWFjaCBkcml2ZXIgaW4gdHVybi4gMzIgYml0IGNvZGVjcyBvbmx5LiAqLwogICAgLyogRklYTUU6IE1vdmUgdGhpcyB0byBhbiBpbml0IHJvdXRpbmU/ICovCiAgICAKICAgIHBzekJ1ZmZlciA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMTAyNCk7CiAgICBpZiAoR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uQSgiZHJpdmVyczMyIiwgcHN6QnVmZmVyLCAxMDI0LCAic3lzdGVtLmluaSIpKSAKICAgIHsKICAgICAgICBjaGFyKiBzID0gcHN6QnVmZmVyOwogICAgICAgIGNoYXIgIGZjY1s0XTsKCiAgICAgICAgd2hpbGUgKCpzKSAKICAgICAgICB7CiAgICAgICAgICAgIGZjY1swXSA9IExPQllURShMT1dPUkQoZmNjVHlwZSkpOwogICAgICAgICAgICBmY2NbMV0gPSBISUJZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICAgICAgZmNjWzJdID0gTE9CWVRFKEhJV09SRChmY2NUeXBlKSk7CiAgICAgICAgICAgIGZjY1szXSA9IEhJQllURShISVdPUkQoZmNjVHlwZSkpOwogICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGZjYywgcywgNCkgJiYgc1s0XSA9PSAnLicgJiYgc1s5XSA9PSAnPScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIgKnMyID0gczsKICAgICAgICAgICAgICAgIHdoaWxlICgqczIgIT0gJ1wwJyAmJiAqczIgIT0gJy4nKSBzMisrOwogICAgICAgICAgICAgICAgaWYgKCpzMisrKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBoaWMgPSBJQ09wZW4oZmNjVHlwZSwgbW1pb1N0cmluZ1RvRk9VUkNDQShzMiwgMCksIHdNb2RlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGljKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSUNTZW5kTWVzc2FnZShoaWMsIHF1ZXJ5bXNnLCAoRFdPUkQpbHBiaUluLCAoRFdPUkQpbHBiaU91dCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBzekJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiPT4gJXBcbiIsIGhpYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGljOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIElDQ2xvc2UoaGljKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcyArPSBzdHJsZW4ocykgKyAxOwogICAgICAgIH0KICAgIH0KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBzekJ1ZmZlcik7CgogICAgaWYgKGZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSAKICAgICAgICByZXR1cm4gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBmY2NIYW5kbGVyLCBscGJpSW4sIGxwYmlPdXQsIHdNb2RlKTsKICAgIAogICAgV0FSTigiKCVzLCVzLCVwLCVwLDB4JTA0eCkgbm90IGZvdW5kIVxuIiwKICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIGxwYmlJbiwgbHBiaU91dCwgd01vZGUpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNHZXREaXNwbGF5Rm9ybWF0CQkJW01TVkZXMzIuQF0KICovCkhJQyBWRldBUEkgSUNHZXREaXNwbGF5Rm9ybWF0KAoJSElDIGhpYyxMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LAoJSU5UIGRlcHRoLElOVCBkeCxJTlQgZHkpCnsKCUhJQwl0bXBoaWMgPSBoaWM7CgoJVFJBQ0UoIiglcCwlcCwlcCwlZCwlZCwlZCkhXG4iLGhpYyxscGJpSW4sbHBiaU91dCxkZXB0aCxkeCxkeSk7CgoJaWYgKCF0bXBoaWMpIHsKCQl0bXBoaWM9SUNMb2NhdGUoSUNUWVBFX1ZJREVPLDAsbHBiaUluLE5VTEwsSUNNT0RFX0RFQ09NUFJFU1MpOwoJCWlmICghdG1waGljKQoJCQlyZXR1cm4gdG1waGljOwoJfQoJaWYgKChkeSA9PSBscGJpSW4tPmJpSGVpZ2h0KSAmJiAoZHggPT0gbHBiaUluLT5iaVdpZHRoKSkKCQlkeSA9IGR4ID0gMDsgLyogbm8gcmVzaXplIG5lZWRlZCAqLwoKCS8qIENhbiB3ZSBkZWNvbXByZXNzIGl0ID8gKi8KCWlmIChJQ0RlY29tcHJlc3NRdWVyeSh0bXBoaWMsbHBiaUluLE5VTEwpICE9IDApCgkJZ290byBlcnJvdXQ7IC8qIG5vLCBzb3JyeSAqLwoKCUlDRGVjb21wcmVzc0dldEZvcm1hdCh0bXBoaWMsbHBiaUluLGxwYmlPdXQpOwoKCWlmIChscGJpT3V0LT5iaUNvbXByZXNzaW9uICE9IDApIHsKCSAgIEZJWE1FKCJPb2NoLCBob3cgY29tZSBkZWNvbXByZXNzb3Igb3V0cHV0cyBjb21wcmVzc2VkIGRhdGEgKCVsZCk/P1xuIiwKCQkJIGxwYmlPdXQtPmJpQ29tcHJlc3Npb24pOwoJfQoJaWYgKGxwYmlPdXQtPmJpU2l6ZSA8IHNpemVvZigqbHBiaU91dCkpIHsKCSAgIEZJWE1FKCJPb2NoLCBzaXplIG9mIG91dHB1dCBCSUggaXMgdG9vIHNtYWxsICglbGQpXG4iLAoJCQkgbHBiaU91dC0+YmlTaXplKTsKCSAgIGxwYmlPdXQtPmJpU2l6ZSA9IHNpemVvZigqbHBiaU91dCk7Cgl9CglpZiAoIWRlcHRoKSB7CgkJSERDCWhkYzsKCgkJaGRjID0gR2V0REMoMCk7CgkJZGVwdGggPSBHZXREZXZpY2VDYXBzKGhkYyxCSVRTUElYRUwpKkdldERldmljZUNhcHMoaGRjLFBMQU5FUyk7CgkJUmVsZWFzZURDKDAsaGRjKTsKCQlpZiAoZGVwdGg9PTE1KQlkZXB0aCA9IDE2OwoJCWlmIChkZXB0aDw4KQlkZXB0aCA9ICA4OwoJfQoJaWYgKGxwYmlJbi0+YmlCaXRDb3VudCA9PSA4KQoJCWRlcHRoID0gODsKCglUUkFDRSgiPT4gJXBcbiIsIHRtcGhpYyk7CglyZXR1cm4gdG1waGljOwplcnJvdXQ6CglpZiAoaGljIT10bXBoaWMpCgkJSUNDbG9zZSh0bXBoaWMpOwoKCVRSQUNFKCI9PiAwXG4iKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ29tcHJlc3MJCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJVgpJQ0NvbXByZXNzKAoJSElDIGhpYyxEV09SRCBkd0ZsYWdzLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0cHV0LExQVk9JRCBscERhdGEsCglMUEJJVE1BUElORk9IRUFERVIgbHBiaUlucHV0LExQVk9JRCBscEJpdHMsTFBEV09SRCBscGNraWQsCglMUERXT1JEIGxwZHdGbGFncyxMT05HIGxGcmFtZU51bSxEV09SRCBkd0ZyYW1lU2l6ZSxEV09SRCBkd1F1YWxpdHksCglMUEJJVE1BUElORk9IRUFERVIgbHBiaVByZXYsTFBWT0lEIGxwUHJldikKewoJSUNDT01QUkVTUwlpY2NtcDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlcCwlcCwuLi4pXG4iLGhpYyxkd0ZsYWdzLGxwYmlPdXRwdXQsbHBEYXRhLGxwYmlJbnB1dCxscEJpdHMpOwoKCWljY21wLmR3RmxhZ3MJCT0gZHdGbGFnczsKCglpY2NtcC5scGJpT3V0cHV0CT0gbHBiaU91dHB1dDsKCWljY21wLmxwT3V0cHV0CQk9IGxwRGF0YTsKCWljY21wLmxwYmlJbnB1dAkJPSBscGJpSW5wdXQ7CglpY2NtcC5scElucHV0CQk9IGxwQml0czsKCglpY2NtcC5scGNraWQJCT0gbHBja2lkOwoJaWNjbXAubHBkd0ZsYWdzCQk9IGxwZHdGbGFnczsKCWljY21wLmxGcmFtZU51bQkJPSBsRnJhbWVOdW07CglpY2NtcC5kd0ZyYW1lU2l6ZQk9IGR3RnJhbWVTaXplOwoJaWNjbXAuZHdRdWFsaXR5CQk9IGR3UXVhbGl0eTsKCWljY21wLmxwYmlQcmV2CQk9IGxwYmlQcmV2OwoJaWNjbXAubHBQcmV2CQk9IGxwUHJldjsKCXJldHVybiBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fQ09NUFJFU1MsKERXT1JEKSZpY2NtcCxzaXplb2YoaWNjbXApKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0RlY29tcHJlc3MJCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJViAgSUNEZWNvbXByZXNzKEhJQyBoaWMsRFdPUkQgZHdGbGFncyxMUEJJVE1BUElORk9IRUFERVIgbHBiaUZvcm1hdCwKCQkJCUxQVk9JRCBscERhdGEsTFBCSVRNQVBJTkZPSEVBREVSIGxwYmksTFBWT0lEIGxwQml0cykKewoJSUNERUNPTVBSRVNTCWljZDsKCURXT1JEIHJldDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsaGljLGR3RmxhZ3MsbHBiaUZvcm1hdCxscERhdGEsbHBiaSxscEJpdHMpOwoKCVRSQUNFKCJscEJpdHNbMF0gPT0gJWx4XG4iLCgoTFBEV09SRClscEJpdHMpWzBdKTsKCglpY2QuZHdGbGFncwk9IGR3RmxhZ3M7CglpY2QubHBiaUlucHV0CT0gbHBiaUZvcm1hdDsKCWljZC5scElucHV0CT0gbHBEYXRhOwoKCWljZC5scGJpT3V0cHV0CT0gbHBiaTsKCWljZC5scE91dHB1dAk9IGxwQml0czsKCWljZC5ja2lkCT0gMDsKCXJldCA9IElDU2VuZE1lc3NhZ2UoaGljLElDTV9ERUNPTVBSRVNTLChEV09SRCkmaWNkLHNpemVvZihJQ0RFQ09NUFJFU1MpKTsKCglUUkFDRSgibHBCaXRzWzBdID09ICVseFxuIiwoKExQRFdPUkQpbHBCaXRzKVswXSk7CgoJVFJBQ0UoIi0+ICVsZFxuIixyZXQpOwoKCXJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ29tcHJlc3NvckNob29zZSAgIFtNU1ZGVzMyLkBdCiAqLwpCT09MIFZGV0FQSSBJQ0NvbXByZXNzb3JDaG9vc2UoSFdORCBod25kLCBVSU5UIHVpRmxhZ3MsIExQVk9JRCBwdkluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwRGF0YSwgUENPTVBWQVJTIHBjLCBMUFNUUiBscHN6VGl0bGUpCnsKICBGSVhNRSgiKCVwLDB4JVgsJXAsJXAsJXAsJXMpLHN0dWIhXG4iLGh3bmQsdWlGbGFncyxwdkluLGxwRGF0YSxwYyxscHN6VGl0bGUpOwoKICBpZiAocGMgPT0gTlVMTCB8fCBwYy0+Y2JTaXplICE9IHNpemVvZihDT01QVkFSUykpCiAgICByZXR1cm4gRkFMU0U7CgogIGlmICgocGMtPmR3RmxhZ3MgJiBJQ01GX0NPTVBWQVJTX1ZBTElEKSA9PSAwKSB7CiAgICBwYy0+ZHdGbGFncyAgID0gMDsKICAgIHBjLT5mY2NUeXBlICAgPSBwYy0+ZmNjSGFuZGxlciA9IDA7CiAgICBwYy0+aGljICAgICAgID0gTlVMTDsKICAgIHBjLT5scGJpT3V0ICAgPSBOVUxMOwogICAgcGMtPmxwQml0c091dCA9IHBjLT5scEJpdHNQcmV2ID0gcGMtPmxwU3RhdGUgPSBOVUxMOwogICAgcGMtPmxRICAgICAgICA9IElDUVVBTElUWV9ERUZBVUxUOwogICAgcGMtPmxLZXkgICAgICA9IC0xOwogICAgcGMtPmxEYXRhUmF0ZSA9IDMwMDsgLyoga0IgKi8KICAgIHBjLT5scFN0YXRlICAgPSBOVUxMOwogICAgcGMtPmNiU3RhdGUgICA9IDA7CiAgfQogIGlmIChwYy0+ZmNjVHlwZSA9PSAwKQogICAgcGMtPmZjY1R5cGUgPSBJQ1RZUEVfVklERU87CgogIC8qIEZJWE1FICovCiAgCiAgcmV0dXJuIEZBTFNFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0NvbXByZXNzb3JGcmVlICAgW01TVkZXMzIuQF0KICovCnZvaWQgVkZXQVBJIElDQ29tcHJlc3NvckZyZWUoUENPTVBWQVJTIHBjKQp7CiAgVFJBQ0UoIiglcClcbiIscGMpOwoKICBpZiAocGMgIT0gTlVMTCAmJiBwYy0+Y2JTaXplID09IHNpemVvZihDT01QVkFSUykpIHsKICAgIGlmIChwYy0+aGljICE9IE5VTEwpIHsKICAgICAgSUNDbG9zZShwYy0+aGljKTsKICAgICAgcGMtPmhpYyA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwYmlPdXQgIT0gTlVMTCkgewogICAgICBHbG9iYWxGcmVlUHRyKHBjLT5scGJpT3V0KTsKICAgICAgcGMtPmxwYmlPdXQgPSBOVUxMOwogICAgfQogICAgaWYgKHBjLT5scEJpdHNPdXQgIT0gTlVMTCkgewogICAgICBHbG9iYWxGcmVlUHRyKHBjLT5scEJpdHNPdXQpOwogICAgICBwYy0+bHBCaXRzT3V0ID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBCaXRzUHJldiAhPSBOVUxMKSB7CiAgICAgIEdsb2JhbEZyZWVQdHIocGMtPmxwQml0c1ByZXYpOwogICAgICBwYy0+bHBCaXRzUHJldiA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwU3RhdGUgIT0gTlVMTCkgewogICAgICBHbG9iYWxGcmVlUHRyKHBjLT5scEJpdHNQcmV2KTsKICAgICAgcGMtPmxwU3RhdGUgPSBOVUxMOwogICAgfQogICAgcGMtPmR3RmxhZ3MgPSAwOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1TVklERU9fU2VuZE1lc3NhZ2UKICoKICoKICovCkxSRVNVTFQgTVNWSURFT19TZW5kTWVzc2FnZShXSU5FX0hJQyogd2hpYywgVUlOVCBtc2csIERXT1JEIGxQYXJhbTEsIERXT1JEIGxQYXJhbTIpCnsKICAgIExSRVNVTFQgICAgIHJldDsKICAgIAojZGVmaW5lIFhYKHgpIGNhc2UgeDogVFJBQ0UoIiglcCwiI3giLDB4JTA4bHgsMHglMDhseClcbiIsd2hpYyxsUGFyYW0xLGxQYXJhbTIpOyBicmVhazsKICAgIAogICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAvKiBEUlZfKiAqLwogICAgICAgIFhYKERSVl9MT0FEKTsKICAgICAgICBYWChEUlZfRU5BQkxFKTsKICAgICAgICBYWChEUlZfT1BFTik7CiAgICAgICAgWFgoRFJWX0NMT1NFKTsKICAgICAgICBYWChEUlZfRElTQUJMRSk7CiAgICAgICAgWFgoRFJWX0ZSRUUpOwogICAgICAgIC8qIElDTV9SRVNFUlZFRCtYICovCiAgICAgICAgWFgoSUNNX0FCT1VUKTsKICAgICAgICBYWChJQ01fQ09ORklHVVJFKTsKICAgICAgICBYWChJQ01fR0VUKTsKICAgICAgICBYWChJQ01fR0VUSU5GTyk7CiAgICAgICAgWFgoSUNNX0dFVERFRkFVTFRRVUFMSVRZKTsKICAgICAgICBYWChJQ01fR0VUUVVBTElUWSk7CiAgICAgICAgWFgoSUNNX0dFVFNUQVRFKTsKICAgICAgICBYWChJQ01fU0VUUVVBTElUWSk7CiAgICAgICAgWFgoSUNNX1NFVCk7CiAgICAgICAgWFgoSUNNX1NFVFNUQVRFKTsKICAgICAgICAvKiBJQ01fVVNFUitYICovCiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0ZSQU1FU19JTkZPKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfR0VUX0ZPUk1BVCk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0dFVF9TSVpFKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfUVVFUlkpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19CRUdJTik7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfRU5EKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19HRVRfRk9STUFUKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19RVUVSWSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfQkVHSU4pOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19FTkQpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX1NFVF9QQUxFVFRFKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19HRVRfUEFMRVRURSk7CiAgICAgICAgWFgoSUNNX0RSQVdfUVVFUlkpOwogICAgICAgIFhYKElDTV9EUkFXX0JFR0lOKTsKICAgICAgICBYWChJQ01fRFJBV19HRVRfUEFMRVRURSk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RBUlQpOwogICAgICAgIFhYKElDTV9EUkFXX1NUT1ApOwogICAgICAgIFhYKElDTV9EUkFXX0VORCk7CiAgICAgICAgWFgoSUNNX0RSQVdfR0VUVElNRSk7CiAgICAgICAgWFgoSUNNX0RSQVcpOwogICAgICAgIFhYKElDTV9EUkFXX1dJTkRPVyk7CiAgICAgICAgWFgoSUNNX0RSQVdfU0VUVElNRSk7CiAgICAgICAgWFgoSUNNX0RSQVdfUkVBTElaRSk7CiAgICAgICAgWFgoSUNNX0RSQVdfRkxVU0gpOwogICAgICAgIFhYKElDTV9EUkFXX1JFTkRFUkJVRkZFUik7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RBUlRfUExBWSk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RPUF9QTEFZKTsKICAgICAgICBYWChJQ01fRFJBV19TVUdHRVNURk9STUFUKTsKICAgICAgICBYWChJQ01fRFJBV19DSEFOR0VQQUxFVFRFKTsKICAgICAgICBYWChJQ01fR0VUQlVGRkVSU1dBTlRFRCk7CiAgICAgICAgWFgoSUNNX0dFVERFRkFVTFRLRVlGUkFNRVJBVEUpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVhfQkVHSU4pOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVhfUVVFUlkpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVgpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVhfRU5EKTsKICAgICAgICBYWChJQ01fU0VUX1NUQVRVU19QUk9DKTsKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIiglcCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCkgdW5rbm93biBtZXNzYWdlXG4iLHdoaWMsKERXT1JEKW1zZyxsUGFyYW0xLGxQYXJhbTIpOwogICAgfQogICAgCiN1bmRlZiBYWAogICAgCiAgICBpZiAod2hpYy0+ZHJpdmVycHJvYykgewoJLyogZHdEcml2ZXJJZCBwYXJhbWV0ZXIgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBEUlZfT1BFTiAqLwogICAgICAgIHJldCA9IHdoaWMtPmRyaXZlcnByb2Mod2hpYy0+ZHJpdmVySWQsIHdoaWMtPmhkcnYsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiAgICB9IGVsc2UgewogICAgICAgIHJldCA9IFNlbmREcml2ZXJNZXNzYWdlKHdoaWMtPmhkcnYsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiAgICB9CgogICAgVFJBQ0UoIgktPiAweCUwOGx4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ1NlbmRNZXNzYWdlCQkJW01TVkZXMzIuQF0KICovCkxSRVNVTFQgVkZXQVBJIElDU2VuZE1lc3NhZ2UoSElDIGhpYywgVUlOVCBtc2csIERXT1JEIGxQYXJhbTEsIERXT1JEIGxQYXJhbTIpIAp7CiAgICBXSU5FX0hJQyogICB3aGljID0gTVNWSURFT19HZXRIaWNQdHIoaGljKTsKCiAgICBpZiAoIXdoaWMpIHJldHVybiBJQ0VSUl9CQURIQU5ETEU7CiAgICByZXR1cm4gTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDRHJhd0JlZ2luCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJViBJQ0RyYXdCZWdpbigKCUhJQyAgICAgICAgICAgICAgICBoaWMsICAgICAvKiBbaW5dICovCglEV09SRCAgICAgICAgICAgICAgZHdGbGFncywgLyogW2luXSBmbGFncyAqLwoJSFBBTEVUVEUgICAgICAgICAgIGhwYWwsICAgIC8qIFtpbl0gcGFsZXR0ZSB0byBkcmF3IHdpdGggKi8KCUhXTkQgICAgICAgICAgICAgICBod25kLCAgICAvKiBbaW5dIHdpbmRvdyB0byBkcmF3IHRvICovCglIREMgICAgICAgICAgICAgICAgaGRjLCAgICAgLyogW2luXSBIREMgdG8gZHJhdyB0byAqLwoJSU5UICAgICAgICAgICAgICAgIHhEc3QsICAgIC8qIFtpbl0gZGVzdGluYXRpb24gcmVjdGFuZ2xlICovCglJTlQgICAgICAgICAgICAgICAgeURzdCwgICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR4RHN0LCAgIC8qIFtpbl0gKi8KCUlOVCAgICAgICAgICAgICAgICBkeURzdCwgICAvKiBbaW5dICovCglMUEJJVE1BUElORk9IRUFERVIgbHBiaSwgICAgLyogW2luXSBmb3JtYXQgb2YgZnJhbWUgdG8gZHJhdyAqLwoJSU5UICAgICAgICAgICAgICAgIHhTcmMsICAgIC8qIFtpbl0gc291cmNlIHJlY3RhbmdsZSAqLwoJSU5UICAgICAgICAgICAgICAgIHlTcmMsICAgIC8qIFtpbl0gKi8KCUlOVCAgICAgICAgICAgICAgICBkeFNyYywgICAvKiBbaW5dICovCglJTlQgICAgICAgICAgICAgICAgZHlTcmMsICAgLyogW2luXSAqLwoJRFdPUkQgICAgICAgICAgICAgIGR3UmF0ZSwgIC8qIFtpbl0gZnJhbWVzL3NlY29uZCA9IChkd1JhdGUvZHdTY2FsZSkgKi8KCURXT1JEICAgICAgICAgICAgICBkd1NjYWxlKSAvKiBbaW5dICovCnsKCglJQ0RSQVdCRUdJTglpY2RiOwoKCVRSQUNFKCIoJXAsJWxkLCVwLCVwLCVwLCV1LCV1LCV1LCV1LCVwLCV1LCV1LCV1LCV1LCVsZCwlbGQpXG4iLAoJCSAgaGljLCBkd0ZsYWdzLCBocGFsLCBod25kLCBoZGMsIHhEc3QsIHlEc3QsIGR4RHN0LCBkeURzdCwKCQkgIGxwYmksIHhTcmMsIHlTcmMsIGR4U3JjLCBkeVNyYywgZHdSYXRlLCBkd1NjYWxlKTsKCglpY2RiLmR3RmxhZ3MgPSBkd0ZsYWdzOwoJaWNkYi5ocGFsID0gaHBhbDsKCWljZGIuaHduZCA9IGh3bmQ7CglpY2RiLmhkYyA9IGhkYzsKCWljZGIueERzdCA9IHhEc3Q7CglpY2RiLnlEc3QgPSB5RHN0OwoJaWNkYi5keERzdCA9IGR4RHN0OwoJaWNkYi5keURzdCA9IGR5RHN0OwoJaWNkYi5scGJpID0gbHBiaTsKCWljZGIueFNyYyA9IHhTcmM7CglpY2RiLnlTcmMgPSB5U3JjOwoJaWNkYi5keFNyYyA9IGR4U3JjOwoJaWNkYi5keVNyYyA9IGR5U3JjOwoJaWNkYi5kd1JhdGUgPSBkd1JhdGU7CglpY2RiLmR3U2NhbGUgPSBkd1NjYWxlOwoJcmV0dXJuIElDU2VuZE1lc3NhZ2UoaGljLElDTV9EUkFXX0JFR0lOLChEV09SRCkmaWNkYixzaXplb2YoaWNkYikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDRHJhdwkJCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWIElDRHJhdyhISUMgaGljLCBEV09SRCBkd0ZsYWdzLCBMUFZPSUQgbHBGb3JtYXQsIExQVk9JRCBscERhdGEsIERXT1JEIGNiRGF0YSwgTE9ORyBsVGltZSkgewoJSUNEUkFXCWljZDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlbGQsJWxkKVxuIixoaWMsZHdGbGFncyxscEZvcm1hdCxscERhdGEsY2JEYXRhLGxUaW1lKTsKCglpY2QuZHdGbGFncyA9IGR3RmxhZ3M7CglpY2QubHBGb3JtYXQgPSBscEZvcm1hdDsKCWljZC5scERhdGEgPSBscERhdGE7CglpY2QuY2JEYXRhID0gY2JEYXRhOwoJaWNkLmxUaW1lID0gbFRpbWU7CgoJcmV0dXJuIElDU2VuZE1lc3NhZ2UoaGljLElDTV9EUkFXLChEV09SRCkmaWNkLHNpemVvZihpY2QpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0Nsb3NlCQkJW01TVkZXMzIuQF0KICovCkxSRVNVTFQgV0lOQVBJIElDQ2xvc2UoSElDIGhpYykKewogICAgV0lORV9ISUMqIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwogICAgV0lORV9ISUMqKiBwOwoKICAgIFRSQUNFKCIoJXApXG4iLGhpYyk7CgogICAgaWYgKCF3aGljKSByZXR1cm4gSUNFUlJfQkFESEFORExFOwoKICAgIGlmICh3aGljLT5kcml2ZXJwcm9jKSAKICAgIHsKICAgICAgICBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9DTE9TRSwgMCwgMCk7CiAgICAgICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfRElTQUJMRSwgMCwgMCk7CiAgICAgICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfRlJFRSwgMCwgMCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgQ2xvc2VEcml2ZXIod2hpYy0+aGRydiwgMCwgMCk7CiAgICB9CgogICAgLyogcmVtb3ZlIHdoaWMgZnJvbSBsaXN0ICovCiAgICBmb3IgKHAgPSAmTVNWSURFT19GaXJzdEhpYzsgKnAgIT0gTlVMTDsgcCA9ICYoKCpwKS0+bmV4dCkpCiAgICB7CiAgICAgICAgaWYgKCgqcCkgPT0gd2hpYykKICAgICAgICB7CiAgICAgICAgICAgICpwID0gd2hpYy0+bmV4dDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdoaWMpOwogICAgcmV0dXJuIDA7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0ltYWdlQ29tcHJlc3MJW01TVkZXMzIuQF0KICovCkhBTkRMRSBWRldBUEkgSUNJbWFnZUNvbXByZXNzKAoJSElDIGhpYywgVUlOVCB1aUZsYWdzLAoJTFBCSVRNQVBJTkZPIGxwYmlJbiwgTFBWT0lEIGxwQml0cywKCUxQQklUTUFQSU5GTyBscGJpT3V0LCBMT05HIGxRdWFsaXR5LAoJTE9ORyogcGxTaXplKQp7CglGSVhNRSgiKCVwLCUwOHgsJXAsJXAsJXAsJWxkLCVwKVxuIiwKCQloaWMsIHVpRmxhZ3MsIGxwYmlJbiwgbHBCaXRzLCBscGJpT3V0LCBsUXVhbGl0eSwgcGxTaXplKTsKCglyZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0ltYWdlRGVjb21wcmVzcwlbTVNWRlczMi5AXQogKi8KCkhBTkRMRSBWRldBUEkgSUNJbWFnZURlY29tcHJlc3MoCglISUMgaGljLCBVSU5UIHVpRmxhZ3MsIExQQklUTUFQSU5GTyBscGJpSW4sCglMUFZPSUQgbHBCaXRzLCBMUEJJVE1BUElORk8gbHBiaU91dCkKewoJSEdMT0JBTAloTWVtID0gTlVMTDsKCUJZVEUqCXBNZW0gPSBOVUxMOwoJQk9PTAliUmVsZWFzZUlDID0gRkFMU0U7CglCWVRFKglwSGRyID0gTlVMTDsKCUxPTkcJY2JIZHIgPSAwOwoJQk9PTAliU3VjY2VlZGVkID0gRkFMU0U7CglCT09MCWJJbkRlY29tcHJlc3MgPSBGQUxTRTsKCURXT1JECWJpU2l6ZUltYWdlOwoKCVRSQUNFKCIoJXAsJTA4eCwlcCwlcCwlcClcbiIsCgkJaGljLCB1aUZsYWdzLCBscGJpSW4sIGxwQml0cywgbHBiaU91dCk7CgoJaWYgKCBoaWMgPT0gTlVMTCApCgl7CgkJaGljID0gSUNEZWNvbXByZXNzT3BlbiggSUNUWVBFX1ZJREVPLCAwLCAmbHBiaUluLT5ibWlIZWFkZXIsIChscGJpT3V0ICE9IE5VTEwpID8gJmxwYmlPdXQtPmJtaUhlYWRlciA6IE5VTEwgKTsKCQlpZiAoIGhpYyA9PSBOVUxMICkKCQl7CgkJCVdBUk4oIm5vIGhhbmRsZXJcbiIgKTsKCQkJZ290byBlcnI7CgkJfQoJCWJSZWxlYXNlSUMgPSBUUlVFOwoJfQoJaWYgKCB1aUZsYWdzICE9IDAgKQoJewoJCUZJWE1FKCAidW5rbm93biBmbGFnICUwOHhcbiIsIHVpRmxhZ3MgKTsKCQlnb3RvIGVycjsKCX0KCWlmICggbHBiaUluID09IE5VTEwgfHwgbHBCaXRzID09IE5VTEwgKQoJewoJCVdBUk4oImludmFsaWQgYXJndW1lbnRcbiIpOwoJCWdvdG8gZXJyOwoJfQoKCWlmICggbHBiaU91dCAhPSBOVUxMICkKCXsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemUgIT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkKCQkJZ290byBlcnI7CgkJY2JIZHIgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9PSAzICkKCQkJY2JIZHIgKz0gc2l6ZW9mKERXT1JEKSozOwoJCWVsc2UKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggKQoJCXsKCQkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQkJY2JIZHIgKz0gc2l6ZW9mKFJHQlFVQUQpICogKDE8PGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50KTsKCQkJZWxzZQoJCQkJY2JIZHIgKz0gc2l6ZW9mKFJHQlFVQUQpICogbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ2xyVXNlZDsKCQl9Cgl9CgllbHNlCgl7CgkJVFJBQ0UoICJnZXQgZm9ybWF0XG4iICk7CgoJCWNiSGRyID0gSUNEZWNvbXByZXNzR2V0Rm9ybWF0U2l6ZShoaWMsbHBiaUluKTsKCQlpZiAoIGNiSGRyIDwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkKCQkJZ290byBlcnI7CgkJcEhkciA9IChCWVRFKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGNiSGRyK3NpemVvZihSR0JRVUFEKSoyNTYpOwoJCWlmICggcEhkciA9PSBOVUxMICkKCQkJZ290byBlcnI7CgkJWmVyb01lbW9yeSggcEhkciwgY2JIZHIrc2l6ZW9mKFJHQlFVQUQpKjI1NiApOwoJCWlmICggSUNEZWNvbXByZXNzR2V0Rm9ybWF0KCBoaWMsIGxwYmlJbiwgKEJJVE1BUElORk8qKXBIZHIgKSAhPSBJQ0VSUl9PSyApCgkJCWdvdG8gZXJyOwoJCWxwYmlPdXQgPSAoQklUTUFQSU5GTyopcEhkcjsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggJiYKCQkJIElDRGVjb21wcmVzc0dldFBhbGV0dGUoIGhpYywgbHBiaUluLCBscGJpT3V0ICkgIT0gSUNFUlJfT0sgJiYKCQkJIGxwYmlJbi0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gbHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKQoJCXsKCQkJaWYgKCBscGJpSW4tPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCQltZW1jcHkoIGxwYmlPdXQtPmJtaUNvbG9ycywgbHBiaUluLT5ibWlDb2xvcnMsIHNpemVvZihSR0JRVUFEKSooMTw8bHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQpICk7CgkJCWVsc2UKCQkJCW1lbWNweSggbHBiaU91dC0+Ym1pQ29sb3JzLCBscGJpSW4tPmJtaUNvbG9ycywgc2l6ZW9mKFJHQlFVQUQpKmxwYmlJbi0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCApOwoJCX0KCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50IDw9IDggJiYKCQkJIGxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCWxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPSAxPDxscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKCgkJbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKCQljYkhkciA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIHNpemVvZihSR0JRVUFEKSpscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkOwoJfQoKCWJpU2l6ZUltYWdlID0gbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlOwoJaWYgKCBiaVNpemVJbWFnZSA9PSAwICkKCQliaVNpemVJbWFnZSA9ICgoKChscGJpT3V0LT5ibWlIZWFkZXIuYmlXaWR0aCAqIGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50ICsgNykgPj4gMykgKyAzKSAmICh+MykpICogYWJzKGxwYmlPdXQtPmJtaUhlYWRlci5iaUhlaWdodCk7CgoJVFJBQ0UoICJjYWxsIElDRGVjb21wcmVzc0JlZ2luXG4iICk7CgoJaWYgKCBJQ0RlY29tcHJlc3NCZWdpbiggaGljLCBscGJpSW4sIGxwYmlPdXQgKSAhPSBJQ0VSUl9PSyApCgkJZ290byBlcnI7CgliSW5EZWNvbXByZXNzID0gVFJVRTsKCglUUkFDRSggImNiSGRyICVsZCwgYmlTaXplSW1hZ2UgJWxkXG4iLCBjYkhkciwgYmlTaXplSW1hZ2UgKTsKCgloTWVtID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEV8R01FTV9aRVJPSU5JVCwgY2JIZHIgKyBiaVNpemVJbWFnZSApOwoJaWYgKCBoTWVtID09IE5VTEwgKQoJewoJCVdBUk4oICJvdXQgb2YgbWVtb3J5XG4iICk7CgkJZ290byBlcnI7Cgl9CglwTWVtID0gKEJZVEUqKUdsb2JhbExvY2soIGhNZW0gKTsKCWlmICggcE1lbSA9PSBOVUxMICkKCQlnb3RvIGVycjsKCW1lbWNweSggcE1lbSwgbHBiaU91dCwgY2JIZHIgKTsKCglUUkFDRSggImNhbGwgSUNEZWNvbXByZXNzXG4iICk7CglpZiAoIElDRGVjb21wcmVzcyggaGljLCAwLCAmbHBiaUluLT5ibWlIZWFkZXIsIGxwQml0cywgJmxwYmlPdXQtPmJtaUhlYWRlciwgcE1lbStjYkhkciApICE9IElDRVJSX09LICkKCQlnb3RvIGVycjsKCgliU3VjY2VlZGVkID0gVFJVRTsKZXJyOgoJaWYgKCBiSW5EZWNvbXByZXNzICkKCQlJQ0RlY29tcHJlc3NFbmQoIGhpYyApOwoJaWYgKCBiUmVsZWFzZUlDICkKCQlJQ0Nsb3NlKGhpYyk7CglpZiAoIHBIZHIgIT0gTlVMTCApCgkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHBIZHIpOwoJaWYgKCBwTWVtICE9IE5VTEwgKQoJCUdsb2JhbFVubG9jayggaE1lbSApOwoJaWYgKCAhYlN1Y2NlZWRlZCAmJiBoTWVtICE9IE5VTEwgKQoJewoJCUdsb2JhbEZyZWUoaE1lbSk7IGhNZW0gPSBOVUxMOwoJfQoKCXJldHVybiAoSEFORExFKWhNZW07Cn0KCnN0YXRpYyBCT09MIEdldEZpbGVOYW1lUHJldmlldyhMUFZPSUQgbHBvZm4sQk9PTCBiU2F2ZSxCT09MIGJVbmljb2RlKQp7CiAgQ0hBUiAgICBzekZ1bmN0aW9uTmFtZVsyMF07CiAgQk9PTCAgICAoKmZuR2V0RmlsZU5hbWUpKExQVk9JRCk7CiAgSE1PRFVMRSBoQ29tZGxnMzI7CiAgQk9PTCAgICByZXQ7CgogIEZJWE1FKCIoJXAsJWQsJWQpLCBzZW1pLXN0dWIhXG4iLGxwb2ZuLGJTYXZlLGJVbmljb2RlKTsKCiAgbHN0cmNweUEoc3pGdW5jdGlvbk5hbWUsIChiU2F2ZSA/ICJHZXRTYXZlRmlsZU5hbWUiIDogIkdldE9wZW5GaWxlTmFtZSIpKTsKICBsc3RyY2F0QShzekZ1bmN0aW9uTmFtZSwgKGJVbmljb2RlID8gIlciIDogIkEiKSk7CgogIGhDb21kbGczMiA9IExvYWRMaWJyYXJ5QSgiQ09NRExHMzIuRExMIik7CiAgaWYgKGhDb21kbGczMiA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICBmbkdldEZpbGVOYW1lID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoQ29tZGxnMzIsIHN6RnVuY3Rpb25OYW1lKTsKICBpZiAoZm5HZXRGaWxlTmFtZSA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBGSVhNRTogbmVlZCB0byBhZGQgT0ZOX0VOQUJMRUhPT0sgYW5kIG91ciBvd24gaGFuZGxlciAqLwogIHJldCA9IGZuR2V0RmlsZU5hbWUobHBvZm4pOwoKICBGcmVlTGlicmFyeShoQ29tZGxnMzIpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0T3BlbkZpbGVOYW1lUHJldmlld0EJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldE9wZW5GaWxlTmFtZVByZXZpZXdBKExQT1BFTkZJTEVOQU1FQSBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIEZBTFNFLCBGQUxTRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0T3BlbkZpbGVOYW1lUHJldmlld1cJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldE9wZW5GaWxlTmFtZVByZXZpZXdXKExQT1BFTkZJTEVOQU1FVyBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIEZBTFNFLCBUUlVFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTYXZlRmlsZU5hbWVQcmV2aWV3QQlbTVNWRlczMi5AXQogKi8KQk9PTCBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lUHJldmlld0EoTFBPUEVORklMRU5BTUVBIGxwb2ZuKQp7CiAgRklYTUUoIiglcCksIHNlbWktc3R1YiFcbiIsIGxwb2ZuKTsKCiAgcmV0dXJuIEdldEZpbGVOYW1lUHJldmlldyhscG9mbiwgVFJVRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFNhdmVGaWxlTmFtZVByZXZpZXdXCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRTYXZlRmlsZU5hbWVQcmV2aWV3VyhMUE9QRU5GSUxFTkFNRVcgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBUUlVFLCBUUlVFKTsKfQo=