LyoKICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAwIEJyYWRsZXkgQmFldHoKICogQ29weXJpZ2h0IDIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogRklYTUU6IFRoaXMgYWxsIGFzc3VtZXMgMzIgYml0IGNvZGVjcwogKgkJV2luOTUgYXBwZWFycyB0byBwcmVmZXIgMzIgYml0IGNvZGVjcywgZXZlbiBmcm9tIDE2IGJpdCBjb2RlLgogKgkJVGhlcmUgaXMgdGhlIElDT3BlbkZ1bmN0aW9uMTYgdG8gd29ycnkgYWJvdXQgc3RpbGwsIHRob3VnaC4KICogICAgICAKICogVE9ETwogKiAgICAgIC0gbm8gdGhyZWFkIHNhZmV0eQogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAibXN2aWRlb19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgoKI2luY2x1ZGUgIndpbmRvd3N4LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN2aWRlbyk7CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKndpbmVfZGJnc3RyX2ZjYyggRFdPUkQgZmNjICkKewogICAgcmV0dXJuIHdpbmVfZGJnX3NwcmludGYoIiVjJWMlYyVjIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0JZVEUoTE9XT1JEKGZjYykpLCBISUJZVEUoTE9XT1JEKGZjYykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9CWVRFKEhJV09SRChmY2MpKSwgSElCWVRFKEhJV09SRChmY2MpKSk7Cn0KCkxSRVNVTFQgKENBTExCQUNLICpwRm5DYWxsVG8xNikoSERSVlIsIEhJQywgVUlOVCwgTFBBUkFNLCBMUEFSQU0pID0gTlVMTDsKCnN0YXRpYyBXSU5FX0hJQyogICAgICAgIE1TVklERU9fRmlyc3RIaWMgLyogPSBOVUxMICovOwoKdHlwZWRlZiBzdHJ1Y3QgX3JlZ19kcml2ZXIgcmVnX2RyaXZlcjsKc3RydWN0IF9yZWdfZHJpdmVyCnsKICAgIERXT1JEICAgICAgIGZjY1R5cGU7CiAgICBEV09SRCAgICAgICBmY2NIYW5kbGVyOwogICAgRFJJVkVSUFJPQyAgcHJvYzsKICAgIExQV1NUUiAgICAgIG5hbWU7CiAgICByZWdfZHJpdmVyKiBuZXh0Owp9OwoKc3RhdGljIHJlZ19kcml2ZXIqIHJlZ19kcml2ZXJfbGlzdCA9IE5VTEw7CgpzdGF0aWMgaW50IGNvbXBhcmVfZm91cmNjKERXT1JEIGZjYzEsIERXT1JEIGZjYzIpCnsKICBjaGFyIGZjY19zdHIxWzVdOwogIGNoYXIgZmNjX3N0cjJbNV07CiAgZmNjX3N0cjFbMF0gPSBMT0JZVEUoTE9XT1JEKGZjYzEpKTsKICBmY2Nfc3RyMVsxXSA9IEhJQllURShMT1dPUkQoZmNjMSkpOwogIGZjY19zdHIxWzJdID0gTE9CWVRFKEhJV09SRChmY2MxKSk7CiAgZmNjX3N0cjFbM10gPSBISUJZVEUoSElXT1JEKGZjYzEpKTsKICBmY2Nfc3RyMVs0XSA9IDA7CiAgZmNjX3N0cjJbMF0gPSBMT0JZVEUoTE9XT1JEKGZjYzIpKTsKICBmY2Nfc3RyMlsxXSA9IEhJQllURShMT1dPUkQoZmNjMikpOwogIGZjY19zdHIyWzJdID0gTE9CWVRFKEhJV09SRChmY2MyKSk7CiAgZmNjX3N0cjJbM10gPSBISUJZVEUoSElXT1JEKGZjYzIpKTsKICBmY2Nfc3RyMls0XSA9IDA7CgogIHJldHVybiBzdHJjYXNlY21wKGZjY19zdHIxLGZjY19zdHIyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTVNWSURFT19HZXRIaWNQdHIKICoKICoKICovCldJTkVfSElDKiAgIE1TVklERU9fR2V0SGljUHRyKEhJQyBoaWMpCnsKICAgIFdJTkVfSElDKiAgIHdoaWM7CgogICAgZm9yICh3aGljID0gTVNWSURFT19GaXJzdEhpYzsgd2hpYyAmJiB3aGljLT5oaWMgIT0gaGljOyB3aGljID0gd2hpYy0+bmV4dCk7CiAgICByZXR1cm4gd2hpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWaWRlb0ZvcldpbmRvd3NWZXJzaW9uCQlbTVNWRlczMi4yXQogKgkJVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgkJW01TVklERU8uMl0KICogUmV0dXJucyB0aGUgdmVyc2lvbiBpbiBtYWpvci5taW5vciBmb3JtLgogKiBJbiBXaW5kb3dzOTUgdGhpcyByZXR1cm5zIDB4MDQwMDAzYjYgKDQuOTUwKQogKi8KRFdPUkQgV0lOQVBJIFZpZGVvRm9yV2luZG93c1ZlcnNpb24odm9pZCkgCnsKICAgIHJldHVybiAweDA0MDAwM0I2OyAvKiA0Ljk1MCAqLwp9CgovKiBzeXN0ZW0uaW5pOiBbZHJpdmVyc10gKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbmZvCQkJCVtNU1ZGVzMyLkBdCiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnN0YWxsYWJsZSBjb21wcmVzc29yLiBSZXR1cm4gVFJVRSBpZiB0aGVyZQogKiBpcyBvbmUuCiAqLwpCT09MIFZGV0FQSSBJQ0luZm8oCglEV09SRCBmY2NUeXBlLAkJLyogW2luXSB0eXBlIG9mIGNvbXByZXNzb3IgKCd2aWRjJykgKi8KCURXT1JEIGZjY0hhbmRsZXIsCS8qIFtpbl0gcmVhbCBmY2MgZm9yIGhhbmRsZXIgb3IgPG4+dGggY29tcHJlc3NvciAqLwoJSUNJTkZPICpscGljaW5mbykJLyogW291dF0gaW5mb3JtYXRpb24gYWJvdXQgY29tcHJlc3NvciAqLwp7CiAgICBjaGFyCWJ1ZlsyMDAwXTsKCiAgICBUUkFDRSgiKCVzLCVzLyUwOGx4LCVwKVxuIiwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgZmNjSGFuZGxlciwgbHBpY2luZm8pOwoKICAgIGlmIChHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BKCJkcml2ZXJzMzIiLCBidWYsIHNpemVvZihidWYpLCAic3lzdGVtLmluaSIpKSAKICAgIHsKICAgICAgICBjaGFyICAgIGZjY1R5cGVTdHJbNF07CiAgICAgICAgY2hhciAgICBmY2NIYW5kbGVyU3RyWzRdOwogICAgICAgIGNoYXIqICAgczsKCiAgICAgICAgZmNjVHlwZVN0clswXSA9IExPQllURShMT1dPUkQoZmNjVHlwZSkpOwogICAgICAgIGZjY1R5cGVTdHJbMV0gPSBISUJZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICBmY2NUeXBlU3RyWzJdID0gTE9CWVRFKEhJV09SRChmY2NUeXBlKSk7CiAgICAgICAgZmNjVHlwZVN0clszXSA9IEhJQllURShISVdPUkQoZmNjVHlwZSkpOwoKICAgICAgICBmY2NIYW5kbGVyU3RyWzBdID0gTE9CWVRFKExPV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgZmNjSGFuZGxlclN0clsxXSA9IEhJQllURShMT1dPUkQoZmNjSGFuZGxlcikpOwogICAgICAgIGZjY0hhbmRsZXJTdHJbMl0gPSBMT0JZVEUoSElXT1JEKGZjY0hhbmRsZXIpKTsKICAgICAgICBmY2NIYW5kbGVyU3RyWzNdID0gSElCWVRFKEhJV09SRChmY2NIYW5kbGVyKSk7CgogICAgICAgIGZvciAocyA9IGJ1ZjsgKnM7IHMgKz0gc3RybGVuKHMpICsgMSkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGZjY1R5cGVTdHIsIHMsIDQpICYmIHNbNF0gPT0gJy4nICYmIHNbOV0gPT0gJz0nICYmCiAgICAgICAgICAgICAgICAoIWZjY0hhbmRsZXItLSB8fCAhc3RybmNhc2VjbXAoZmNjSGFuZGxlclN0ciwgcyArIDUsIDQpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogZXhhY3QgbWF0Y2ggb2YgZmNjSGFuZGxlciBvciBudGggZHJpdmVyIGZvdW5kID8/ICovCiAgICAgICAgICAgICAgICBscGljaW5mby0+ZmNjVHlwZSA9IGZjY1R5cGU7CiAgICAgICAgICAgICAgICBscGljaW5mby0+ZmNjSGFuZGxlciA9IG1taW9TdHJpbmdUb0ZPVVJDQ0EocyArIDUsIDApOwogICAgICAgICAgICAgICAgbHBpY2luZm8tPmR3RmxhZ3MgPSAwOwogICAgICAgICAgICAgICAgbHBpY2luZm8tPmR3VmVyc2lvbiA9IDA7CiAgICAgICAgICAgICAgICBscGljaW5mby0+ZHdWZXJzaW9uSUNNID0gMHgxMDQ7CiAgICAgICAgICAgICAgICBscGljaW5mby0+c3pOYW1lWzBdID0gMDsKICAgICAgICAgICAgICAgIGxwaWNpbmZvLT5zekRlc2NyaXB0aW9uWzBdID0gMDsKICAgICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzICsgMTAsIC0xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBpY2luZm8tPnN6RHJpdmVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxwaWNpbmZvLT5zekRyaXZlcikvc2l6ZW9mKFdDSEFSKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIERXT1JEIElDX0hhbmRsZVJlZiA9IDE7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW5zdGFsbAkJCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFZGV0FQSSBJQ0luc3RhbGwoRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgTFBBUkFNIGxQYXJhbSwgTFBTVFIgc3pEZXNjLCBVSU5UIHdGbGFncykgCnsKICAgIHJlZ19kcml2ZXIqIGRyaXZlcjsKICAgIHVuc2lnbmVkIGxlbjsKCiAgICBUUkFDRSgiKCVzLCVzLCVwLCVwLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCAodm9pZCopbFBhcmFtLCBzekRlc2MsIHdGbGFncyk7CgogICAgLyogQ2hlY2sgaWYgYSBkcml2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCiAgICBmb3IgKGRyaXZlciA9IHJlZ19kcml2ZXJfbGlzdDsgZHJpdmVyOyBkcml2ZXIgPSBkcml2ZXItPm5leHQpCiAgICB7CiAgICAgICAgaWYgKCFjb21wYXJlX2ZvdXJjYyhmY2NUeXBlLCBkcml2ZXItPmZjY1R5cGUpICYmCiAgICAgICAgICAgICFjb21wYXJlX2ZvdXJjYyhmY2NIYW5kbGVyLCBkcml2ZXItPmZjY0hhbmRsZXIpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChkcml2ZXIpIHJldHVybiBGQUxTRTsKCiAgICAvKiBSZWdpc3RlciB0aGUgZHJpdmVyICovCiAgICBkcml2ZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKHJlZ19kcml2ZXIpKTsKICAgIGlmICghZHJpdmVyKSBnb3RvIG9vbTsKICAgIGRyaXZlci0+ZmNjVHlwZSA9IGZjY1R5cGU7CiAgICBkcml2ZXItPmZjY0hhbmRsZXIgPSBmY2NIYW5kbGVyOwoKICAgIHN3aXRjaCh3RmxhZ3MpCiAgICB7CiAgICBjYXNlIElDSU5TVEFMTF9GVU5DVElPTjoKICAgICAgICBkcml2ZXItPnByb2MgPSAoRFJJVkVSUFJPQylsUGFyYW07Cglkcml2ZXItPm5hbWUgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ0lOU1RBTExfRFJJVkVSOgoJZHJpdmVyLT5wcm9jID0gTlVMTDsKICAgICAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgKGNoYXIqKWxQYXJhbSwgLTEsIE5VTEwsIDApOwogICAgICAgIGRyaXZlci0+bmFtZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpKTsKICAgICAgICBpZiAoIWRyaXZlci0+bmFtZSkgZ290byBvb207CiAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIChjaGFyKilsUGFyYW0sIC0xLCBkcml2ZXItPm5hbWUsIGxlbik7CglicmVhazsKICAgIGRlZmF1bHQ6CglFUlIoIkludmFsaWQgZmxhZ3MhXG4iKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRyaXZlcik7CglyZXR1cm4gRkFMU0U7CiAgIH0KCiAgIC8qIEluc2VydCBvdXIgZHJpdmVyIGluIHRoZSBsaXN0Ki8KICAgZHJpdmVyLT5uZXh0ID0gcmVnX2RyaXZlcl9saXN0OwogICByZWdfZHJpdmVyX2xpc3QgPSBkcml2ZXI7CiAgICAKICAgcmV0dXJuIFRSVUU7CiBvb206CiAgIGlmIChkcml2ZXIpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRyaXZlcik7CiAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ1JlbW92ZQkJCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFZGV0FQSSBJQ1JlbW92ZShEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdGbGFncykgCnsKICAgIHJlZ19kcml2ZXIqKiBwZHJpdmVyOwogICAgCiAgICBUUkFDRSgiKCVzLCVzLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCB3RmxhZ3MpOwoKICAgIC8qIENoZWNrIGlmIGEgZHJpdmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLwogICAgZm9yIChwZHJpdmVyID0gJnJlZ19kcml2ZXJfbGlzdDsgKnBkcml2ZXI7IHBkcml2ZXIgPSAmKCpwZHJpdmVyKS0+bmV4dCkKICAgIHsKICAgICAgICBpZiAoIWNvbXBhcmVfZm91cmNjKGZjY1R5cGUsICgqcGRyaXZlciktPmZjY1R5cGUpICYmCiAgICAgICAgICAgICFjb21wYXJlX2ZvdXJjYyhmY2NIYW5kbGVyLCAoKnBkcml2ZXIpLT5mY2NIYW5kbGVyKSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoISpwZHJpdmVyKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBSZW1vdmUgdGhlIGRyaXZlciBmcm9tIHRoZSBsaXN0ICovCiAgICAqcGRyaXZlciA9ICgqcGRyaXZlciktPm5leHQ7CiAgICBpZiAoKCpwZHJpdmVyKS0+bmFtZSkKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKnBkcml2ZXIpLT5uYW1lKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICpwZHJpdmVyKTsKICAgIAogICAgcmV0dXJuIFRSVUU7ICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNPcGVuCQkJCVtNU1ZGVzMyLkBdCiAqIE9wZW5zIGFuIGluc3RhbGxhYmxlIGNvbXByZXNzb3IuIFJldHVybiBzcGVjaWFsIGhhbmRsZS4KICovCkhJQyBWRldBUEkgSUNPcGVuKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUpIAp7CiAgICBXQ0hBUgkJY29kZWNuYW1lWzEwXTsKICAgIElDT1BFTgkJaWNvcGVuOwogICAgSERSVlIJCWhkcnY7CiAgICBXSU5FX0hJQyogICAgICAgICAgIHdoaWM7CiAgICBCT09MICAgICAgICAgICAgICAgIGJJczE2OwogICAgc3RhdGljIFdDSEFSICAgICAgICBkcnYzMldbXSA9IHsnZCcsJ3InLCdpJywndicsJ2UnLCdyJywncycsJzMnLCcyJywnXDAnfTsKICAgIHJlZ19kcml2ZXIqICAgICAgICAgZHJpdmVyOwoKICAgIFRSQUNFKCIoJXMsJXMsMHglMDh4KVxuIiwgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdNb2RlKTsKCiAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJlZ2lzdGVyZWQgZHJpdmVyIHRoYXQgbWF0Y2hlcyAqLwogICAgZHJpdmVyID0gcmVnX2RyaXZlcl9saXN0OwogICAgd2hpbGUoZHJpdmVyKQogICAgICAgIGlmICghY29tcGFyZV9mb3VyY2MoZmNjVHlwZSwgZHJpdmVyLT5mY2NUeXBlKSAmJgogICAgICAgICAgICAhY29tcGFyZV9mb3VyY2MoZmNjSGFuZGxlciwgZHJpdmVyLT5mY2NIYW5kbGVyKSkKCSAgICBicmVhazsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGRyaXZlciA9IGRyaXZlci0+bmV4dDsKCiAgICBpZiAoZHJpdmVyICYmIGRyaXZlci0+cHJvYykKCS8qIFRoZSBkcml2ZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhdCBydW50aW1lIHdpdGggaXRzIGRyaXZlcnByb2MgKi8KICAgICAgICByZXR1cm4gTVNWSURFT19PcGVuRnVuY3Rpb24oZmNjVHlwZSwgZmNjSGFuZGxlciwgd01vZGUsIChEUklWRVJQUk9DKWRyaXZlci0+cHJvYywgKERXT1JEKU5VTEwpOwogIAogICAgLyogV2VsbCwgbFBhcmFtMiBpcyBpbiBmYWN0IGEgTFBWSURFT19PUEVOX1BBUk1TLCBidXQgaXQgaGFzIHRoZQogICAgICogc2FtZSBsYXlvdXQgYXMgSUNPUEVOCiAgICAgKi8KICAgIGljb3Blbi5kd1NpemUJCT0gc2l6ZW9mKElDT1BFTik7CiAgICBpY29wZW4uZmNjVHlwZQkJPSBmY2NUeXBlOwogICAgaWNvcGVuLmZjY0hhbmRsZXIJICAgICAgICA9IGZjY0hhbmRsZXI7CiAgICBpY29wZW4uZHdWZXJzaW9uICAgICAgICAgICAgPSAweDAwMDAxMDAwOyAvKiBGSVhNRSAqLwogICAgaWNvcGVuLmR3RmxhZ3MJCT0gd01vZGU7CiAgICBpY29wZW4uZHdFcnJvciAgICAgICAgICAgICAgPSAwOwogICAgaWNvcGVuLnBWMVJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5wVjJSZXNlcnZlZCAgICAgICAgICA9IE5VTEw7CiAgICBpY29wZW4uZG5EZXZOb2RlICAgICAgICAgICAgPSAwOyAvKiBGSVhNRSAqLwoJCiAgICBpZiAoIWRyaXZlcikgewogICAgICAgIC8qIFRoZSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgKi8KICAgICAgICBjb2RlY25hbWVbMF0gPSBMT0JZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbMV0gPSBISUJZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbMl0gPSBMT0JZVEUoSElXT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbM10gPSBISUJZVEUoSElXT1JEKGZjY1R5cGUpKTsKICAgICAgICBjb2RlY25hbWVbNF0gPSAnLic7CiAgICAgICAgY29kZWNuYW1lWzVdID0gTE9CWVRFKExPV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzZdID0gSElCWVRFKExPV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzddID0gTE9CWVRFKEhJV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzhdID0gSElCWVRFKEhJV09SRChmY2NIYW5kbGVyKSk7CiAgICAgICAgY29kZWNuYW1lWzldID0gJ1wwJzsKCiAgICAgICAgaGRydiA9IE9wZW5Ecml2ZXIoY29kZWNuYW1lLCBkcnYzMlcsIChMUEFSQU0pJmljb3Blbik7CiAgICAgICAgaWYgKCFoZHJ2KSAKICAgICAgICB7CiAgICAgICAgICAgIGlmIChmY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTykgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVswXSA9ICd2JzsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVsxXSA9ICdpJzsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVsyXSA9ICdkJzsKICAgICAgICAgICAgICAgIGNvZGVjbmFtZVszXSA9ICdjJzsKCgkJZmNjVHlwZSA9IElDVFlQRV9WSURFTzsKICAgICAgICAgICAgICAgIGhkcnYgPSBPcGVuRHJpdmVyKGNvZGVjbmFtZSwgZHJ2MzJXLCAoTFBBUkFNKSZpY29wZW4pOwoJICAgIH0KICAgICAgICAgICAgaWYgKCFoZHJ2KQogICAgICAgICAgICAgICAgcmV0dXJuIDA7Cgl9CiAgICB9IGVsc2UgewogICAgICAgIC8qIFRoZSBkcml2ZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhdCBydW50aW1lIHdpdGggaXRzIG5hbWUgKi8KICAgICAgICBoZHJ2ID0gT3BlbkRyaXZlcihkcml2ZXItPm5hbWUsIE5VTEwsIChMUEFSQU0pJmljb3Blbik7CiAgICAgICAgaWYgKCFoZHJ2KSAKICAgICAgICAgICAgcmV0dXJuIDA7IAogICAgfQogICAgYklzMTYgPSBHZXREcml2ZXJGbGFncyhoZHJ2KSAmIDB4MTAwMDAwMDA7IC8qIHVuZG9jdW1lbnRlZCBmbGFnOiBXSU5FX0dERl8xNkJJVCAqLwoKICAgIGlmIChiSXMxNiAmJiAhcEZuQ2FsbFRvMTYpCiAgICB7CiAgICAgICAgRklYTUUoIkdvdCBhIDE2IGJpdCBkcml2ZXIsIGJ1dCBubyAxNiBiaXQgc3VwcG9ydCBpbiBtc3Zmd1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB3aGljID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihXSU5FX0hJQykpOwogICAgaWYgKCF3aGljKQogICAgewogICAgICAgIENsb3NlRHJpdmVyKGhkcnYsIDAsIDApOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHdoaWMtPmhkcnYgICAgICAgICAgPSBoZHJ2OwogICAgLyogRklYTUU6IGlzIHRoZSBzaWduYXR1cmUgdGhlIHJlYWwgb25lID8gKi8KICAgIHdoaWMtPmRyaXZlcnByb2MgICAgPSBiSXMxNiA/IChEUklWRVJQUk9DKXBGbkNhbGxUbzE2IDogTlVMTDsKICAgIHdoaWMtPmRyaXZlcnByb2MxNiAgPSAwOwogICAgd2hpYy0+dHlwZSAgICAgICAgICA9IGZjY1R5cGU7CiAgICB3aGljLT5oYW5kbGVyICAgICAgID0gZmNjSGFuZGxlcjsKICAgIHdoaWxlIChNU1ZJREVPX0dldEhpY1B0cihISUNfMzIoSUNfSGFuZGxlUmVmKSkgIT0gTlVMTCkgSUNfSGFuZGxlUmVmKys7CiAgICB3aGljLT5oaWMgICAgICAgICAgID0gSElDXzMyKElDX0hhbmRsZVJlZisrKTsKICAgIHdoaWMtPm5leHQgICAgICAgICAgPSBNU1ZJREVPX0ZpcnN0SGljOwogICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWM7CgogICAgVFJBQ0UoIj0+ICVwXG4iLCB3aGljLT5oaWMpOwogICAgcmV0dXJuIHdoaWMtPmhpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNU1ZJREVPX09wZW5GdW5jdGlvbgogKi8KSElDIE1TVklERU9fT3BlbkZ1bmN0aW9uKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgRFJJVkVSUFJPQyBscGZuSGFuZGxlciwgRFdPUkQgbHBmbkhhbmRsZXIxNikgCnsKICAgIElDT1BFTiAgICAgIGljb3BlbjsKICAgIFdJTkVfSElDKiAgIHdoaWM7CgogICAgVFJBQ0UoIiglcywlcywlZCwlcCwlMDhseClcbiIsIAogICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdNb2RlLCBscGZuSGFuZGxlciwgbHBmbkhhbmRsZXIxNik7CgogICAgaWNvcGVuLmR3U2l6ZQkJPSBzaXplb2YoSUNPUEVOKTsKICAgIGljb3Blbi5mY2NUeXBlCQk9IGZjY1R5cGU7CiAgICBpY29wZW4uZmNjSGFuZGxlcgkgICAgICAgID0gZmNjSGFuZGxlcjsKICAgIGljb3Blbi5kd1ZlcnNpb24gICAgICAgICAgICA9IDB4MDAwMDEwMDA7IC8qIEZJWE1FICovCiAgICBpY29wZW4uZHdGbGFncwkJPSB3TW9kZTsKICAgIGljb3Blbi5kd0Vycm9yICAgICAgICAgICAgICA9IDA7CiAgICBpY29wZW4ucFYxUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLnBWMlJlc2VydmVkICAgICAgICAgID0gTlVMTDsKICAgIGljb3Blbi5kbkRldk5vZGUgICAgICAgICAgICA9IDA7IC8qIEZJWE1FICovCgogICAgd2hpYyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoV0lORV9ISUMpKTsKICAgIGlmICghd2hpYykgcmV0dXJuIDA7CgogICAgd2hpYy0+ZHJpdmVycHJvYyAgID0gbHBmbkhhbmRsZXI7CiAgICB3aGljLT5kcml2ZXJwcm9jMTYgPSBscGZuSGFuZGxlcjE2OwogICAgd2hpbGUgKE1TVklERU9fR2V0SGljUHRyKEhJQ18zMihJQ19IYW5kbGVSZWYpKSAhPSBOVUxMKSBJQ19IYW5kbGVSZWYrKzsKICAgIHdoaWMtPmhpYyAgICAgICAgICA9IEhJQ18zMihJQ19IYW5kbGVSZWYrKyk7CiAgICB3aGljLT5uZXh0ICAgICAgICAgPSBNU1ZJREVPX0ZpcnN0SGljOwogICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWM7CgogICAgLyogTm93IHRyeSBvcGVuaW5nL2xvYWRpbmcgdGhlIGRyaXZlci4gVGFrZW4gZnJvbSBEUklWRVJfQWRkVG9MaXN0ICovCiAgICAvKiBXaGF0IGlmIHRoZSBmdW5jdGlvbiBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlPyAqLwoKICAgIGlmIChNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9MT0FELCAwTCwgMEwpICE9IERSVl9TVUNDRVNTKSAKICAgIHsKICAgICAgICBXQVJOKCJEUlZfTE9BRCBmYWlsZWQgZm9yIGhpYyAlcFxuIiwgd2hpYy0+aGljKTsKICAgICAgICBNU1ZJREVPX0ZpcnN0SGljID0gd2hpYy0+bmV4dDsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aGljKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIC8qIHJldHVybiB2YWx1ZSBpcyBub3QgY2hlY2tlZCAqLwogICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfRU5BQkxFLCAwTCwgMEwpOwoKICAgIHdoaWMtPmRyaXZlcklkID0gKERXT1JEKU1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX09QRU4sIDAsIChEV09SRCkmaWNvcGVuKTsKICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBwdXQgaGVyZT8gKi8KICAgIHdoaWMtPmhkcnYgPSAoSERSVlIpMDsKICAgIAogICAgaWYgKHdoaWMtPmRyaXZlcklkID09IDApIAogICAgewogICAgICAgIFdBUk4oIkRSVl9PUEVOIGZhaWxlZCBmb3IgaGljICVwXG4iLCB3aGljLT5oaWMpOwogICAgICAgIE1TVklERU9fRmlyc3RIaWMgPSB3aGljLT5uZXh0OwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdoaWMpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIFRSQUNFKCI9PiAlcFxuIiwgd2hpYy0+aGljKTsKICAgIHJldHVybiB3aGljLT5oaWM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNPcGVuRnVuY3Rpb24JCQlbTVNWRlczMi5AXQogKi8KSElDIFZGV0FQSSBJQ09wZW5GdW5jdGlvbihEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdNb2RlLCBGQVJQUk9DIGxwZm5IYW5kbGVyKSAKewogICAgcmV0dXJuIE1TVklERU9fT3BlbkZ1bmN0aW9uKGZjY1R5cGUsIGZjY0hhbmRsZXIsIHdNb2RlLCAoRFJJVkVSUFJPQylscGZuSGFuZGxlciwgMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNHZXRJbmZvCQkJW01TVkZXMzIuQF0KICovCkxSRVNVTFQgVkZXQVBJIElDR2V0SW5mbyhISUMgaGljLCBJQ0lORk8gKnBpY2luZm8sIERXT1JEIGNiKSAKewogICAgTFJFU1VMVAlyZXQ7CiAgICBXSU5FX0hJQyogICB3aGljID0gTVNWSURFT19HZXRIaWNQdHIoaGljKTsKCiAgICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIGhpYywgcGljaW5mbywgY2IpOwoKICAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwogICAgaWYgKCF3aGljKSByZXR1cm4gSUNFUlJfQkFESEFORExFOwogICAgaWYgKCFwaWNpbmZvKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICAvKiAoV1MpIFRoZSBmaWVsZCBzekRyaXZlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVjYXVzZSB0aGUgZHJpdmVyIAogICAgICogaXMgbm90IG9ibGlnZWQgYW5kIG9mdGVuIHdpbGwgbm90IGRvIGl0LiBTb21lIGFwcGxpY2F0aW9ucywgbGlrZQogICAgICogVmlydHVhbER1YiwgcmVseSBvbiB0aGlzIGZpZWxkIGFuZCB3aWxsIG9jY2FzaW9uYWxseSBjcmFzaCBpZiBpdAogICAgICogZ29lcyB1bml0aWFsaXplZC4KICAgICAqLwogICAgaWYgKGNiID49IHNpemVvZihJQ0lORk8pKSBwaWNpbmZvLT5zekRyaXZlclswXSA9ICdcMCc7CgogICAgcmV0ID0gSUNTZW5kTWVzc2FnZShoaWMsIElDTV9HRVRJTkZPLCAoRFdPUkQpcGljaW5mbywgY2IpOwoKICAgIC8qIChXUykgV2hlbiBzekRyaXZlciB3YXMgbm90IHN1cHBsaWVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLCBhcHBhcmVudGx5IAogICAgICogV2luZG93cyB3aWxsIHNldCBpdHMgdmFsdWUgZXF1YWwgdG8gdGhlIGRyaXZlciBmaWxlIG5hbWUuIFRoaXMgY2FuCiAgICAgKiBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSBhcyB3ZSBkbyBoZXJlLgogICAgICovCiAgICBpZiAoY2IgPj0gc2l6ZW9mKElDSU5GTykgJiYgcGljaW5mby0+c3pEcml2ZXJbMF0gPT0gMCkKICAgIHsKICAgICAgICBJQ0lORk8gIGlpOwoKICAgICAgICBtZW1zZXQoJmlpLCAwLCBzaXplb2YoaWkpKTsKICAgICAgICBpaS5kd1NpemUgPSBzaXplb2YoaWkpOwogICAgICAgIElDSW5mbyhwaWNpbmZvLT5mY2NUeXBlLCBwaWNpbmZvLT5mY2NIYW5kbGVyLCAmaWkpOwogICAgICAgIGxzdHJjcHlXKHBpY2luZm8tPnN6RHJpdmVyLCBpaS5zekRyaXZlcik7CiAgICB9CgogICAgVFJBQ0UoIgktPiAweCUwOGx4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0xvY2F0ZQkJCVtNU1ZGVzMyLkBdCiAqLwpISUMgVkZXQVBJIElDTG9jYXRlKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCiAgICAgICAgICAgICAgICAgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQsIFdPUkQgd01vZGUpCnsKICAgIEhJQyAgICAgICAgIGhpYzsKICAgIERXT1JECXF1ZXJ5bXNnOwogICAgTFBTVFIgICAgICAgcHN6QnVmZmVyOwoKICAgIFRSQUNFKCIoJXMsJXMsJXAsJXAsMHglMDR4KVxuIiwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgbHBiaUluLCBscGJpT3V0LCB3TW9kZSk7CgogICAgc3dpdGNoICh3TW9kZSkgCiAgICB7CiAgICBjYXNlIElDTU9ERV9GQVNUQ09NUFJFU1M6CiAgICBjYXNlIElDTU9ERV9DT01QUkVTUzoKICAgICAgICBxdWVyeW1zZyA9IElDTV9DT01QUkVTU19RVUVSWTsKICAgICAgICBicmVhazsKICAgIGNhc2UgSUNNT0RFX0ZBU1RERUNPTVBSRVNTOgogICAgY2FzZSBJQ01PREVfREVDT01QUkVTUzoKICAgICAgICBxdWVyeW1zZyA9IElDTV9ERUNPTVBSRVNTX1FVRVJZOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ01PREVfRFJBVzoKICAgICAgICBxdWVyeW1zZyA9IElDTV9EUkFXX1FVRVJZOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBXQVJOKCJVbmtub3duIG1vZGUgKCVkKVxuIiwgd01vZGUpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIEVhc3kgY2FzZTogaGFuZGxlci90eXBlIG1hdGNoLCB3ZSBqdXN0IGZpcmUgYSBxdWVyeSBhbmQgcmV0dXJuICovCiAgICBoaWMgPSBJQ09wZW4oZmNjVHlwZSwgZmNjSGFuZGxlciwgd01vZGUpOwogICAgaWYgKGhpYykgCiAgICB7CiAgICAgICAgaWYgKCFJQ1NlbmRNZXNzYWdlKGhpYywgcXVlcnltc2csIChEV09SRClscGJpSW4sIChEV09SRClscGJpT3V0KSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCI9PiAlcFxuIiwgaGljKTsKICAgICAgICAgICAgcmV0dXJuIGhpYzsKICAgICAgICB9CiAgICAgICAgSUNDbG9zZShoaWMpOwogICAgfQoKICAgIC8qIE5vdyB0cnkgZWFjaCBkcml2ZXIgaW4gdHVybi4gMzIgYml0IGNvZGVjcyBvbmx5LiAqLwogICAgLyogRklYTUU6IE1vdmUgdGhpcyB0byBhbiBpbml0IHJvdXRpbmU/ICovCiAgICAKICAgIHBzekJ1ZmZlciA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMTAyNCk7CiAgICBpZiAoR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uQSgiZHJpdmVyczMyIiwgcHN6QnVmZmVyLCAxMDI0LCAic3lzdGVtLmluaSIpKSAKICAgIHsKICAgICAgICBjaGFyKiBzID0gcHN6QnVmZmVyOwogICAgICAgIGNoYXIgIGZjY1s0XTsKCiAgICAgICAgd2hpbGUgKCpzKSAKICAgICAgICB7CiAgICAgICAgICAgIGZjY1swXSA9IExPQllURShMT1dPUkQoZmNjVHlwZSkpOwogICAgICAgICAgICBmY2NbMV0gPSBISUJZVEUoTE9XT1JEKGZjY1R5cGUpKTsKICAgICAgICAgICAgZmNjWzJdID0gTE9CWVRFKEhJV09SRChmY2NUeXBlKSk7CiAgICAgICAgICAgIGZjY1szXSA9IEhJQllURShISVdPUkQoZmNjVHlwZSkpOwogICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGZjYywgcywgNCkgJiYgc1s0XSA9PSAnLicgJiYgc1s5XSA9PSAnPScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIgKnMyID0gczsKICAgICAgICAgICAgICAgIHdoaWxlICgqczIgIT0gJ1wwJyAmJiAqczIgIT0gJy4nKSBzMisrOwogICAgICAgICAgICAgICAgaWYgKCpzMisrKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBoaWMgPSBJQ09wZW4oZmNjVHlwZSwgbW1pb1N0cmluZ1RvRk9VUkNDQShzMiwgMCksIHdNb2RlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGljKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSUNTZW5kTWVzc2FnZShoaWMsIHF1ZXJ5bXNnLCAoRFdPUkQpbHBiaUluLCAoRFdPUkQpbHBiaU91dCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBzekJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiPT4gJXBcbiIsIGhpYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGljOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIElDQ2xvc2UoaGljKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcyArPSBzdHJsZW4ocykgKyAxOwogICAgICAgIH0KICAgIH0KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBzekJ1ZmZlcik7CgogICAgaWYgKGZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSAKICAgICAgICByZXR1cm4gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBmY2NIYW5kbGVyLCBscGJpSW4sIGxwYmlPdXQsIHdNb2RlKTsKICAgIAogICAgV0FSTigiKCVzLCVzLCVwLCVwLDB4JTA0eCkgbm90IGZvdW5kIVxuIiwKICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIGxwYmlJbiwgbHBiaU91dCwgd01vZGUpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNHZXREaXNwbGF5Rm9ybWF0CQkJW01TVkZXMzIuQF0KICovCkhJQyBWRldBUEkgSUNHZXREaXNwbGF5Rm9ybWF0KAoJSElDIGhpYyxMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LAoJSU5UIGRlcHRoLElOVCBkeCxJTlQgZHkpCnsKCUhJQwl0bXBoaWMgPSBoaWM7CgoJRklYTUUoIiglcCwlcCwlcCwlZCwlZCwlZCksc3R1YiFcbiIsaGljLGxwYmlJbixscGJpT3V0LGRlcHRoLGR4LGR5KTsKCWlmICghdG1waGljKSB7CgkJdG1waGljPUlDTG9jYXRlKElDVFlQRV9WSURFTywwLGxwYmlJbixOVUxMLElDTU9ERV9ERUNPTVBSRVNTKTsKCQlpZiAoIXRtcGhpYykKCQkJcmV0dXJuIHRtcGhpYzsKCX0KCWlmICgoZHkgPT0gbHBiaUluLT5iaUhlaWdodCkgJiYgKGR4ID09IGxwYmlJbi0+YmlXaWR0aCkpCgkJZHkgPSBkeCA9IDA7IC8qIG5vIHJlc2l6ZSBuZWVkZWQgKi8KCgkvKiBDYW4gd2UgZGVjb21wcmVzcyBpdCA/ICovCglpZiAoSUNEZWNvbXByZXNzUXVlcnkodG1waGljLGxwYmlJbixOVUxMKSAhPSAwKQoJCWdvdG8gZXJyb3V0OyAvKiBubywgc29ycnkgKi8KCglJQ0RlY29tcHJlc3NHZXRGb3JtYXQodG1waGljLGxwYmlJbixscGJpT3V0KTsKCglpZiAobHBiaU91dC0+YmlDb21wcmVzc2lvbiAhPSAwKSB7CgkgICBGSVhNRSgiT29jaCwgaG93IGNvbWUgZGVjb21wcmVzc29yIG91dHB1dHMgY29tcHJlc3NlZCBkYXRhICglbGQpPz9cbiIsCgkJCSBscGJpT3V0LT5iaUNvbXByZXNzaW9uKTsKCX0KCWlmIChscGJpT3V0LT5iaVNpemUgPCBzaXplb2YoKmxwYmlPdXQpKSB7CgkgICBGSVhNRSgiT29jaCwgc2l6ZSBvZiBvdXRwdXQgQklIIGlzIHRvbyBzbWFsbCAoJWxkKVxuIiwKCQkJIGxwYmlPdXQtPmJpU2l6ZSk7CgkgICBscGJpT3V0LT5iaVNpemUgPSBzaXplb2YoKmxwYmlPdXQpOwoJfQoJaWYgKCFkZXB0aCkgewoJCUhEQwloZGM7CgoJCWhkYyA9IEdldERDKDApOwoJCWRlcHRoID0gR2V0RGV2aWNlQ2FwcyhoZGMsQklUU1BJWEVMKSpHZXREZXZpY2VDYXBzKGhkYyxQTEFORVMpOwoJCVJlbGVhc2VEQygwLGhkYyk7CgkJaWYgKGRlcHRoPT0xNSkJZGVwdGggPSAxNjsKCQlpZiAoZGVwdGg8OCkJZGVwdGggPSAgODsKCX0KCWlmIChscGJpSW4tPmJpQml0Q291bnQgPT0gOCkKCQlkZXB0aCA9IDg7CgoJVFJBQ0UoIj0+ICVwXG4iLCB0bXBoaWMpOwoJcmV0dXJuIHRtcGhpYzsKZXJyb3V0OgoJaWYgKGhpYyE9dG1waGljKQoJCUlDQ2xvc2UodG1waGljKTsKCglUUkFDRSgiPT4gMFxuIik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0NvbXByZXNzCQkJW01TVkZXMzIuQF0KICovCkRXT1JEIFZGV0FQSVYKSUNDb21wcmVzcygKCUhJQyBoaWMsRFdPUkQgZHdGbGFncyxMUEJJVE1BUElORk9IRUFERVIgbHBiaU91dHB1dCxMUFZPSUQgbHBEYXRhLAoJTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlJbnB1dCxMUFZPSUQgbHBCaXRzLExQRFdPUkQgbHBja2lkLAoJTFBEV09SRCBscGR3RmxhZ3MsTE9ORyBsRnJhbWVOdW0sRFdPUkQgZHdGcmFtZVNpemUsRFdPUkQgZHdRdWFsaXR5LAoJTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlQcmV2LExQVk9JRCBscFByZXYpCnsKCUlDQ09NUFJFU1MJaWNjbXA7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJXAsJXAsLi4uKVxuIixoaWMsZHdGbGFncyxscGJpT3V0cHV0LGxwRGF0YSxscGJpSW5wdXQsbHBCaXRzKTsKCglpY2NtcC5kd0ZsYWdzCQk9IGR3RmxhZ3M7CgoJaWNjbXAubHBiaU91dHB1dAk9IGxwYmlPdXRwdXQ7CglpY2NtcC5scE91dHB1dAkJPSBscERhdGE7CglpY2NtcC5scGJpSW5wdXQJCT0gbHBiaUlucHV0OwoJaWNjbXAubHBJbnB1dAkJPSBscEJpdHM7CgoJaWNjbXAubHBja2lkCQk9IGxwY2tpZDsKCWljY21wLmxwZHdGbGFncwkJPSBscGR3RmxhZ3M7CglpY2NtcC5sRnJhbWVOdW0JCT0gbEZyYW1lTnVtOwoJaWNjbXAuZHdGcmFtZVNpemUJPSBkd0ZyYW1lU2l6ZTsKCWljY21wLmR3UXVhbGl0eQkJPSBkd1F1YWxpdHk7CglpY2NtcC5scGJpUHJldgkJPSBscGJpUHJldjsKCWljY21wLmxwUHJldgkJPSBscFByZXY7CglyZXR1cm4gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0NPTVBSRVNTLChEV09SRCkmaWNjbXAsc2l6ZW9mKGljY21wKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEZWNvbXByZXNzCQkJW01TVkZXMzIuQF0KICovCkRXT1JEIFZGV0FQSVYgIElDRGVjb21wcmVzcyhISUMgaGljLERXT1JEIGR3RmxhZ3MsTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlGb3JtYXQsCgkJCQlMUFZPSUQgbHBEYXRhLExQQklUTUFQSU5GT0hFQURFUiBscGJpLExQVk9JRCBscEJpdHMpCnsKCUlDREVDT01QUkVTUwlpY2Q7CglEV09SRCByZXQ7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJXAsJXApXG4iLGhpYyxkd0ZsYWdzLGxwYmlGb3JtYXQsbHBEYXRhLGxwYmksbHBCaXRzKTsKCglUUkFDRSgibHBCaXRzWzBdID09ICVseFxuIiwoKExQRFdPUkQpbHBCaXRzKVswXSk7CgoJaWNkLmR3RmxhZ3MJPSBkd0ZsYWdzOwoJaWNkLmxwYmlJbnB1dAk9IGxwYmlGb3JtYXQ7CglpY2QubHBJbnB1dAk9IGxwRGF0YTsKCglpY2QubHBiaU91dHB1dAk9IGxwYmk7CglpY2QubHBPdXRwdXQJPSBscEJpdHM7CglpY2QuY2tpZAk9IDA7CglyZXQgPSBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fREVDT01QUkVTUywoRFdPUkQpJmljZCxzaXplb2YoSUNERUNPTVBSRVNTKSk7CgoJVFJBQ0UoImxwQml0c1swXSA9PSAlbHhcbiIsKChMUERXT1JEKWxwQml0cylbMF0pOwoKCVRSQUNFKCItPiAlbGRcbiIscmV0KTsKCglyZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0NvbXByZXNzb3JDaG9vc2UgICBbTVNWRlczMi5AXQogKi8KQk9PTCBWRldBUEkgSUNDb21wcmVzc29yQ2hvb3NlKEhXTkQgaHduZCwgVUlOVCB1aUZsYWdzLCBMUFZPSUQgcHZJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscERhdGEsIFBDT01QVkFSUyBwYywgTFBTVFIgbHBzelRpdGxlKQp7CiAgRklYTUUoIiglcCwweCVYLCVwLCVwLCVwLCVzKSxzdHViIVxuIixod25kLHVpRmxhZ3MscHZJbixscERhdGEscGMsbHBzelRpdGxlKTsKCiAgaWYgKHBjID09IE5VTEwgfHwgcGMtPmNiU2l6ZSAhPSBzaXplb2YoQ09NUFZBUlMpKQogICAgcmV0dXJuIEZBTFNFOwoKICBpZiAoKHBjLT5kd0ZsYWdzICYgSUNNRl9DT01QVkFSU19WQUxJRCkgPT0gMCkgewogICAgcGMtPmR3RmxhZ3MgICA9IDA7CiAgICBwYy0+ZmNjVHlwZSAgID0gcGMtPmZjY0hhbmRsZXIgPSAwOwogICAgcGMtPmhpYyAgICAgICA9IE5VTEw7CiAgICBwYy0+bHBiaU91dCAgID0gTlVMTDsKICAgIHBjLT5scEJpdHNPdXQgPSBwYy0+bHBCaXRzUHJldiA9IHBjLT5scFN0YXRlID0gTlVMTDsKICAgIHBjLT5sUSAgICAgICAgPSBJQ1FVQUxJVFlfREVGQVVMVDsKICAgIHBjLT5sS2V5ICAgICAgPSAtMTsKICAgIHBjLT5sRGF0YVJhdGUgPSAzMDA7IC8qIGtCICovCiAgICBwYy0+bHBTdGF0ZSAgID0gTlVMTDsKICAgIHBjLT5jYlN0YXRlICAgPSAwOwogIH0KICBpZiAocGMtPmZjY1R5cGUgPT0gMCkKICAgIHBjLT5mY2NUeXBlID0gSUNUWVBFX1ZJREVPOwoKICAvKiBGSVhNRSAqLwogIAogIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNDb21wcmVzc29yRnJlZSAgIFtNU1ZGVzMyLkBdCiAqLwp2b2lkIFZGV0FQSSBJQ0NvbXByZXNzb3JGcmVlKFBDT01QVkFSUyBwYykKewogIFRSQUNFKCIoJXApXG4iLHBjKTsKCiAgaWYgKHBjICE9IE5VTEwgJiYgcGMtPmNiU2l6ZSA9PSBzaXplb2YoQ09NUFZBUlMpKSB7CiAgICBpZiAocGMtPmhpYyAhPSBOVUxMKSB7CiAgICAgIElDQ2xvc2UocGMtPmhpYyk7CiAgICAgIHBjLT5oaWMgPSBOVUxMOwogICAgfQogICAgaWYgKHBjLT5scGJpT3V0ICE9IE5VTEwpIHsKICAgICAgR2xvYmFsRnJlZVB0cihwYy0+bHBiaU91dCk7CiAgICAgIHBjLT5scGJpT3V0ID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBCaXRzT3V0ICE9IE5VTEwpIHsKICAgICAgR2xvYmFsRnJlZVB0cihwYy0+bHBCaXRzT3V0KTsKICAgICAgcGMtPmxwQml0c091dCA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwQml0c1ByZXYgIT0gTlVMTCkgewogICAgICBHbG9iYWxGcmVlUHRyKHBjLT5scEJpdHNQcmV2KTsKICAgICAgcGMtPmxwQml0c1ByZXYgPSBOVUxMOwogICAgfQogICAgaWYgKHBjLT5scFN0YXRlICE9IE5VTEwpIHsKICAgICAgR2xvYmFsRnJlZVB0cihwYy0+bHBCaXRzUHJldik7CiAgICAgIHBjLT5scFN0YXRlID0gTlVMTDsKICAgIH0KICAgIHBjLT5kd0ZsYWdzID0gMDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNU1ZJREVPX1NlbmRNZXNzYWdlCiAqCiAqCiAqLwpMUkVTVUxUIE1TVklERU9fU2VuZE1lc3NhZ2UoV0lORV9ISUMqIHdoaWMsIFVJTlQgbXNnLCBEV09SRCBsUGFyYW0xLCBEV09SRCBsUGFyYW0yKQp7CiAgICBMUkVTVUxUICAgICByZXQ7CiAgICAKI2RlZmluZSBYWCh4KSBjYXNlIHg6IFRSQUNFKCIoJXAsIiN4IiwweCUwOGx4LDB4JTA4bHgpXG4iLHdoaWMsbFBhcmFtMSxsUGFyYW0yKTsgYnJlYWs7CiAgICAKICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgLyogRFJWXyogKi8KICAgICAgICBYWChEUlZfTE9BRCk7CiAgICAgICAgWFgoRFJWX0VOQUJMRSk7CiAgICAgICAgWFgoRFJWX09QRU4pOwogICAgICAgIFhYKERSVl9DTE9TRSk7CiAgICAgICAgWFgoRFJWX0RJU0FCTEUpOwogICAgICAgIFhYKERSVl9GUkVFKTsKICAgICAgICAvKiBJQ01fUkVTRVJWRUQrWCAqLwogICAgICAgIFhYKElDTV9BQk9VVCk7CiAgICAgICAgWFgoSUNNX0NPTkZJR1VSRSk7CiAgICAgICAgWFgoSUNNX0dFVCk7CiAgICAgICAgWFgoSUNNX0dFVElORk8pOwogICAgICAgIFhYKElDTV9HRVRERUZBVUxUUVVBTElUWSk7CiAgICAgICAgWFgoSUNNX0dFVFFVQUxJVFkpOwogICAgICAgIFhYKElDTV9HRVRTVEFURSk7CiAgICAgICAgWFgoSUNNX1NFVFFVQUxJVFkpOwogICAgICAgIFhYKElDTV9TRVQpOwogICAgICAgIFhYKElDTV9TRVRTVEFURSk7CiAgICAgICAgLyogSUNNX1VTRVIrWCAqLwogICAgICAgIFhYKElDTV9DT01QUkVTU19GUkFNRVNfSU5GTyk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0dFVF9GT1JNQVQpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19HRVRfU0laRSk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX1FVRVJZKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfQkVHSU4pOwogICAgICAgIFhYKElDTV9DT01QUkVTUyk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0VORCk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfR0VUX0ZPUk1BVCk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfUVVFUlkpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX0JFR0lOKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTUyk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfRU5EKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19TRVRfUEFMRVRURSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfR0VUX1BBTEVUVEUpOwogICAgICAgIFhYKElDTV9EUkFXX1FVRVJZKTsKICAgICAgICBYWChJQ01fRFJBV19CRUdJTik7CiAgICAgICAgWFgoSUNNX0RSQVdfR0VUX1BBTEVUVEUpOwogICAgICAgIFhYKElDTV9EUkFXX1NUQVJUKTsKICAgICAgICBYWChJQ01fRFJBV19TVE9QKTsKICAgICAgICBYWChJQ01fRFJBV19FTkQpOwogICAgICAgIFhYKElDTV9EUkFXX0dFVFRJTUUpOwogICAgICAgIFhYKElDTV9EUkFXKTsKICAgICAgICBYWChJQ01fRFJBV19XSU5ET1cpOwogICAgICAgIFhYKElDTV9EUkFXX1NFVFRJTUUpOwogICAgICAgIFhYKElDTV9EUkFXX1JFQUxJWkUpOwogICAgICAgIFhYKElDTV9EUkFXX0ZMVVNIKTsKICAgICAgICBYWChJQ01fRFJBV19SRU5ERVJCVUZGRVIpOwogICAgICAgIFhYKElDTV9EUkFXX1NUQVJUX1BMQVkpOwogICAgICAgIFhYKElDTV9EUkFXX1NUT1BfUExBWSk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1VHR0VTVEZPUk1BVCk7CiAgICAgICAgWFgoSUNNX0RSQVdfQ0hBTkdFUEFMRVRURSk7CiAgICAgICAgWFgoSUNNX0dFVEJVRkZFUlNXQU5URUQpOwogICAgICAgIFhYKElDTV9HRVRERUZBVUxUS0VZRlJBTUVSQVRFKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU0VYX0JFR0lOKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU0VYX1FVRVJZKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU0VYKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU0VYX0VORCk7CiAgICAgICAgWFgoSUNNX1NFVF9TVEFUVVNfUFJPQyk7CiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCIoJXAsMHglMDhseCwweCUwOGx4LDB4JTA4bHgpIHVua25vd24gbWVzc2FnZVxuIix3aGljLChEV09SRCltc2csbFBhcmFtMSxsUGFyYW0yKTsKICAgIH0KICAgIAojdW5kZWYgWFgKICAgIAogICAgaWYgKHdoaWMtPmRyaXZlcnByb2MpIHsKCS8qIGR3RHJpdmVySWQgcGFyYW1ldGVyIGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgRFJWX09QRU4gKi8KICAgICAgICByZXQgPSB3aGljLT5kcml2ZXJwcm9jKHdoaWMtPmRyaXZlcklkLCB3aGljLT5oZHJ2LCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOwogICAgfSBlbHNlIHsKICAgICAgICByZXQgPSBTZW5kRHJpdmVyTWVzc2FnZSh3aGljLT5oZHJ2LCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOwogICAgfQoKICAgIFRSQUNFKCIJLT4gMHglMDhseFxuIiwgcmV0KTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNTZW5kTWVzc2FnZQkJCVtNU1ZGVzMyLkBdCiAqLwpMUkVTVUxUIFZGV0FQSSBJQ1NlbmRNZXNzYWdlKEhJQyBoaWMsIFVJTlQgbXNnLCBEV09SRCBsUGFyYW0xLCBEV09SRCBsUGFyYW0yKSAKewogICAgV0lORV9ISUMqICAgd2hpYyA9IE1TVklERU9fR2V0SGljUHRyKGhpYyk7CgogICAgaWYgKCF3aGljKSByZXR1cm4gSUNFUlJfQkFESEFORExFOwogICAgcmV0dXJuIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0RyYXdCZWdpbgkJW01TVkZXMzIuQF0KICovCkRXT1JEIFZGV0FQSVYgSUNEcmF3QmVnaW4oCglISUMgICAgICAgICAgICAgICAgaGljLCAgICAgLyogW2luXSAqLwoJRFdPUkQgICAgICAgICAgICAgIGR3RmxhZ3MsIC8qIFtpbl0gZmxhZ3MgKi8KCUhQQUxFVFRFICAgICAgICAgICBocGFsLCAgICAvKiBbaW5dIHBhbGV0dGUgdG8gZHJhdyB3aXRoICovCglIV05EICAgICAgICAgICAgICAgaHduZCwgICAgLyogW2luXSB3aW5kb3cgdG8gZHJhdyB0byAqLwoJSERDICAgICAgICAgICAgICAgIGhkYywgICAgIC8qIFtpbl0gSERDIHRvIGRyYXcgdG8gKi8KCUlOVCAgICAgICAgICAgICAgICB4RHN0LCAgICAvKiBbaW5dIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSAqLwoJSU5UICAgICAgICAgICAgICAgIHlEc3QsICAgIC8qIFtpbl0gKi8KCUlOVCAgICAgICAgICAgICAgICBkeERzdCwgICAvKiBbaW5dICovCglJTlQgICAgICAgICAgICAgICAgZHlEc3QsICAgLyogW2luXSAqLwoJTFBCSVRNQVBJTkZPSEVBREVSIGxwYmksICAgIC8qIFtpbl0gZm9ybWF0IG9mIGZyYW1lIHRvIGRyYXcgKi8KCUlOVCAgICAgICAgICAgICAgICB4U3JjLCAgICAvKiBbaW5dIHNvdXJjZSByZWN0YW5nbGUgKi8KCUlOVCAgICAgICAgICAgICAgICB5U3JjLCAgICAvKiBbaW5dICovCglJTlQgICAgICAgICAgICAgICAgZHhTcmMsICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR5U3JjLCAgIC8qIFtpbl0gKi8KCURXT1JEICAgICAgICAgICAgICBkd1JhdGUsICAvKiBbaW5dIGZyYW1lcy9zZWNvbmQgPSAoZHdSYXRlL2R3U2NhbGUpICovCglEV09SRCAgICAgICAgICAgICAgZHdTY2FsZSkgLyogW2luXSAqLwp7CgoJSUNEUkFXQkVHSU4JaWNkYjsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlcCwldSwldSwldSwldSwlcCwldSwldSwldSwldSwlbGQsJWxkKVxuIiwKCQkgIGhpYywgZHdGbGFncywgaHBhbCwgaHduZCwgaGRjLCB4RHN0LCB5RHN0LCBkeERzdCwgZHlEc3QsCgkJICBscGJpLCB4U3JjLCB5U3JjLCBkeFNyYywgZHlTcmMsIGR3UmF0ZSwgZHdTY2FsZSk7CgoJaWNkYi5kd0ZsYWdzID0gZHdGbGFnczsKCWljZGIuaHBhbCA9IGhwYWw7CglpY2RiLmh3bmQgPSBod25kOwoJaWNkYi5oZGMgPSBoZGM7CglpY2RiLnhEc3QgPSB4RHN0OwoJaWNkYi55RHN0ID0geURzdDsKCWljZGIuZHhEc3QgPSBkeERzdDsKCWljZGIuZHlEc3QgPSBkeURzdDsKCWljZGIubHBiaSA9IGxwYmk7CglpY2RiLnhTcmMgPSB4U3JjOwoJaWNkYi55U3JjID0geVNyYzsKCWljZGIuZHhTcmMgPSBkeFNyYzsKCWljZGIuZHlTcmMgPSBkeVNyYzsKCWljZGIuZHdSYXRlID0gZHdSYXRlOwoJaWNkYi5kd1NjYWxlID0gZHdTY2FsZTsKCXJldHVybiBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fRFJBV19CRUdJTiwoRFdPUkQpJmljZGIsc2l6ZW9mKGljZGIpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0RyYXcJCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJViBJQ0RyYXcoSElDIGhpYywgRFdPUkQgZHdGbGFncywgTFBWT0lEIGxwRm9ybWF0LCBMUFZPSUQgbHBEYXRhLCBEV09SRCBjYkRhdGEsIExPTkcgbFRpbWUpIHsKCUlDRFJBVwlpY2Q7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJWxkLCVsZClcbiIsaGljLGR3RmxhZ3MsbHBGb3JtYXQsbHBEYXRhLGNiRGF0YSxsVGltZSk7CgoJaWNkLmR3RmxhZ3MgPSBkd0ZsYWdzOwoJaWNkLmxwRm9ybWF0ID0gbHBGb3JtYXQ7CglpY2QubHBEYXRhID0gbHBEYXRhOwoJaWNkLmNiRGF0YSA9IGNiRGF0YTsKCWljZC5sVGltZSA9IGxUaW1lOwoKCXJldHVybiBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fRFJBVywoRFdPUkQpJmljZCxzaXplb2YoaWNkKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNDbG9zZQkJCVtNU1ZGVzMyLkBdCiAqLwpMUkVTVUxUIFdJTkFQSSBJQ0Nsb3NlKEhJQyBoaWMpCnsKICAgIFdJTkVfSElDKiB3aGljID0gTVNWSURFT19HZXRIaWNQdHIoaGljKTsKICAgIFdJTkVfSElDKiogcDsKCiAgICBUUkFDRSgiKCVwKVxuIixoaWMpOwoKICAgIGlmICghd2hpYykgcmV0dXJuIElDRVJSX0JBREhBTkRMRTsKCiAgICBpZiAod2hpYy0+ZHJpdmVycHJvYykgCiAgICB7CiAgICAgICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfQ0xPU0UsIDAsIDApOwogICAgICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0RJU0FCTEUsIDAsIDApOwogICAgICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0ZSRUUsIDAsIDApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIENsb3NlRHJpdmVyKHdoaWMtPmhkcnYsIDAsIDApOwogICAgfQoKICAgIC8qIHJlbW92ZSB3aGljIGZyb20gbGlzdCAqLwogICAgZm9yIChwID0gJk1TVklERU9fRmlyc3RIaWM7ICpwICE9IE5VTEw7IHAgPSAmKCgqcCktPm5leHQpKQogICAgewogICAgICAgIGlmICgoKnApID09IHdoaWMpCiAgICAgICAgewogICAgICAgICAgICAqcCA9IHdoaWMtPm5leHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aGljKTsKICAgIHJldHVybiAwOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbWFnZUNvbXByZXNzCVtNU1ZGVzMyLkBdCiAqLwpIQU5ETEUgVkZXQVBJIElDSW1hZ2VDb21wcmVzcygKCUhJQyBoaWMsIFVJTlQgdWlGbGFncywKCUxQQklUTUFQSU5GTyBscGJpSW4sIExQVk9JRCBscEJpdHMsCglMUEJJVE1BUElORk8gbHBiaU91dCwgTE9ORyBsUXVhbGl0eSwKCUxPTkcqIHBsU2l6ZSkKewoJRklYTUUoIiglcCwlMDh4LCVwLCVwLCVwLCVsZCwlcClcbiIsCgkJaGljLCB1aUZsYWdzLCBscGJpSW4sIGxwQml0cywgbHBiaU91dCwgbFF1YWxpdHksIHBsU2l6ZSk7CgoJcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbWFnZURlY29tcHJlc3MJW01TVkZXMzIuQF0KICovCgpIQU5ETEUgVkZXQVBJIElDSW1hZ2VEZWNvbXByZXNzKAoJSElDIGhpYywgVUlOVCB1aUZsYWdzLCBMUEJJVE1BUElORk8gbHBiaUluLAoJTFBWT0lEIGxwQml0cywgTFBCSVRNQVBJTkZPIGxwYmlPdXQpCnsKCUhHTE9CQUwJaE1lbSA9IE5VTEw7CglCWVRFKglwTWVtID0gTlVMTDsKCUJPT0wJYlJlbGVhc2VJQyA9IEZBTFNFOwoJQllURSoJcEhkciA9IE5VTEw7CglMT05HCWNiSGRyID0gMDsKCUJPT0wJYlN1Y2NlZWRlZCA9IEZBTFNFOwoJQk9PTAliSW5EZWNvbXByZXNzID0gRkFMU0U7CglEV09SRAliaVNpemVJbWFnZTsKCglUUkFDRSgiKCVwLCUwOHgsJXAsJXAsJXApXG4iLAoJCWhpYywgdWlGbGFncywgbHBiaUluLCBscEJpdHMsIGxwYmlPdXQpOwoKCWlmICggaGljID09IE5VTEwgKQoJewoJCWhpYyA9IElDRGVjb21wcmVzc09wZW4oIElDVFlQRV9WSURFTywgMCwgJmxwYmlJbi0+Ym1pSGVhZGVyLCAobHBiaU91dCAhPSBOVUxMKSA/ICZscGJpT3V0LT5ibWlIZWFkZXIgOiBOVUxMICk7CgkJaWYgKCBoaWMgPT0gTlVMTCApCgkJewoJCQlXQVJOKCJubyBoYW5kbGVyXG4iICk7CgkJCWdvdG8gZXJyOwoJCX0KCQliUmVsZWFzZUlDID0gVFJVRTsKCX0KCWlmICggdWlGbGFncyAhPSAwICkKCXsKCQlGSVhNRSggInVua25vd24gZmxhZyAlMDh4XG4iLCB1aUZsYWdzICk7CgkJZ290byBlcnI7Cgl9CglpZiAoIGxwYmlJbiA9PSBOVUxMIHx8IGxwQml0cyA9PSBOVUxMICkKCXsKCQlXQVJOKCJpbnZhbGlkIGFyZ3VtZW50XG4iKTsKCQlnb3RvIGVycjsKCX0KCglpZiAoIGxwYmlPdXQgIT0gTlVMTCApCgl7CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlTaXplICE9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSApCgkJCWdvdG8gZXJyOwoJCWNiSGRyID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwoJCWlmICggbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPT0gMyApCgkJCWNiSGRyICs9IHNpemVvZihEV09SRCkqMzsKCQllbHNlCgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCA8PSA4ICkKCQl7CgkJCWlmICggbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCA9PSAwICkKCQkJCWNiSGRyICs9IHNpemVvZihSR0JRVUFEKSAqICgxPDxscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCk7CgkJCWVsc2UKCQkJCWNiSGRyICs9IHNpemVvZihSR0JRVUFEKSAqIGxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQ7CgkJfQoJfQoJZWxzZQoJewoJCVRSQUNFKCAiZ2V0IGZvcm1hdFxuIiApOwoKCQljYkhkciA9IElDRGVjb21wcmVzc0dldEZvcm1hdFNpemUoaGljLGxwYmlJbik7CgkJaWYgKCBjYkhkciA8IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSApCgkJCWdvdG8gZXJyOwoJCXBIZHIgPSAoQllURSopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxjYkhkcitzaXplb2YoUkdCUVVBRCkqMjU2KTsKCQlpZiAoIHBIZHIgPT0gTlVMTCApCgkJCWdvdG8gZXJyOwoJCVplcm9NZW1vcnkoIHBIZHIsIGNiSGRyK3NpemVvZihSR0JRVUFEKSoyNTYgKTsKCQlpZiAoIElDRGVjb21wcmVzc0dldEZvcm1hdCggaGljLCBscGJpSW4sIChCSVRNQVBJTkZPKilwSGRyICkgIT0gSUNFUlJfT0sgKQoJCQlnb3RvIGVycjsKCQlscGJpT3V0ID0gKEJJVE1BUElORk8qKXBIZHI7CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCA8PSA4ICYmCgkJCSBJQ0RlY29tcHJlc3NHZXRQYWxldHRlKCBoaWMsIGxwYmlJbiwgbHBiaU91dCApICE9IElDRVJSX09LICYmCgkJCSBscGJpSW4tPmJtaUhlYWRlci5iaUJpdENvdW50ID09IGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50ICkKCQl7CgkJCWlmICggbHBiaUluLT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQkJbWVtY3B5KCBscGJpT3V0LT5ibWlDb2xvcnMsIGxwYmlJbi0+Ym1pQ29sb3JzLCBzaXplb2YoUkdCUVVBRCkqKDE8PGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50KSApOwoJCQllbHNlCgkJCQltZW1jcHkoIGxwYmlPdXQtPmJtaUNvbG9ycywgbHBiaUluLT5ibWlDb2xvcnMsIHNpemVvZihSR0JRVUFEKSpscGJpSW4tPmJtaUhlYWRlci5iaUNsclVzZWQgKTsKCQl9CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCA8PSA4ICYmCgkJCSBscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQlscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID0gMTw8bHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQ7CgoJCWxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CgkJY2JIZHIgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyBzaXplb2YoUkdCUVVBRCkqbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ2xyVXNlZDsKCX0KCgliaVNpemVJbWFnZSA9IGxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemVJbWFnZTsKCWlmICggYmlTaXplSW1hZ2UgPT0gMCApCgkJYmlTaXplSW1hZ2UgPSAoKCgobHBiaU91dC0+Ym1pSGVhZGVyLmJpV2lkdGggKiBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDcpID4+IDMpICsgMykgJiAofjMpKSAqIGFicyhscGJpT3V0LT5ibWlIZWFkZXIuYmlIZWlnaHQpOwoKCVRSQUNFKCAiY2FsbCBJQ0RlY29tcHJlc3NCZWdpblxuIiApOwoKCWlmICggSUNEZWNvbXByZXNzQmVnaW4oIGhpYywgbHBiaUluLCBscGJpT3V0ICkgIT0gSUNFUlJfT0sgKQoJCWdvdG8gZXJyOwoJYkluRGVjb21wcmVzcyA9IFRSVUU7CgoJVFJBQ0UoICJjYkhkciAlbGQsIGJpU2l6ZUltYWdlICVsZFxuIiwgY2JIZHIsIGJpU2l6ZUltYWdlICk7CgoJaE1lbSA9IEdsb2JhbEFsbG9jKCBHTUVNX01PVkVBQkxFfEdNRU1fWkVST0lOSVQsIGNiSGRyICsgYmlTaXplSW1hZ2UgKTsKCWlmICggaE1lbSA9PSBOVUxMICkKCXsKCQlXQVJOKCAib3V0IG9mIG1lbW9yeVxuIiApOwoJCWdvdG8gZXJyOwoJfQoJcE1lbSA9IChCWVRFKilHbG9iYWxMb2NrKCBoTWVtICk7CglpZiAoIHBNZW0gPT0gTlVMTCApCgkJZ290byBlcnI7CgltZW1jcHkoIHBNZW0sIGxwYmlPdXQsIGNiSGRyICk7CgoJVFJBQ0UoICJjYWxsIElDRGVjb21wcmVzc1xuIiApOwoJaWYgKCBJQ0RlY29tcHJlc3MoIGhpYywgMCwgJmxwYmlJbi0+Ym1pSGVhZGVyLCBscEJpdHMsICZscGJpT3V0LT5ibWlIZWFkZXIsIHBNZW0rY2JIZHIgKSAhPSBJQ0VSUl9PSyApCgkJZ290byBlcnI7CgoJYlN1Y2NlZWRlZCA9IFRSVUU7CmVycjoKCWlmICggYkluRGVjb21wcmVzcyApCgkJSUNEZWNvbXByZXNzRW5kKCBoaWMgKTsKCWlmICggYlJlbGVhc2VJQyApCgkJSUNDbG9zZShoaWMpOwoJaWYgKCBwSGRyICE9IE5VTEwgKQoJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxwSGRyKTsKCWlmICggcE1lbSAhPSBOVUxMICkKCQlHbG9iYWxVbmxvY2soIGhNZW0gKTsKCWlmICggIWJTdWNjZWVkZWQgJiYgaE1lbSAhPSBOVUxMICkKCXsKCQlHbG9iYWxGcmVlKGhNZW0pOyBoTWVtID0gTlVMTDsKCX0KCglyZXR1cm4gKEhBTkRMRSloTWVtOwp9CgpzdGF0aWMgQk9PTCBHZXRGaWxlTmFtZVByZXZpZXcoTFBWT0lEIGxwb2ZuLEJPT0wgYlNhdmUsQk9PTCBiVW5pY29kZSkKewogIENIQVIgICAgc3pGdW5jdGlvbk5hbWVbMjBdOwogIEJPT0wgICAgKCpmbkdldEZpbGVOYW1lKShMUFZPSUQpOwogIEhNT0RVTEUgaENvbWRsZzMyOwogIEJPT0wgICAgcmV0OwoKICBGSVhNRSgiKCVwLCVkLCVkKSwgc2VtaS1zdHViIVxuIixscG9mbixiU2F2ZSxiVW5pY29kZSk7CgogIGxzdHJjcHlBKHN6RnVuY3Rpb25OYW1lLCAoYlNhdmUgPyAiR2V0U2F2ZUZpbGVOYW1lIiA6ICJHZXRPcGVuRmlsZU5hbWUiKSk7CiAgbHN0cmNhdEEoc3pGdW5jdGlvbk5hbWUsIChiVW5pY29kZSA/ICJXIiA6ICJBIikpOwoKICBoQ29tZGxnMzIgPSBMb2FkTGlicmFyeUEoIkNPTURMRzMyLkRMTCIpOwogIGlmIChoQ29tZGxnMzIgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgZm5HZXRGaWxlTmFtZSA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaENvbWRsZzMyLCBzekZ1bmN0aW9uTmFtZSk7CiAgaWYgKGZuR2V0RmlsZU5hbWUgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgLyogRklYTUU6IG5lZWQgdG8gYWRkIE9GTl9FTkFCTEVIT09LIGFuZCBvdXIgb3duIGhhbmRsZXIgKi8KICByZXQgPSBmbkdldEZpbGVOYW1lKGxwb2ZuKTsKCiAgRnJlZUxpYnJhcnkoaENvbWRsZzMyKTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldE9wZW5GaWxlTmFtZVByZXZpZXdBCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRPcGVuRmlsZU5hbWVQcmV2aWV3QShMUE9QRU5GSUxFTkFNRUEgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBGQUxTRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldE9wZW5GaWxlTmFtZVByZXZpZXdXCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRPcGVuRmlsZU5hbWVQcmV2aWV3VyhMUE9QRU5GSUxFTkFNRVcgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBGQUxTRSwgVFJVRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U2F2ZUZpbGVOYW1lUHJldmlld0EJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldFNhdmVGaWxlTmFtZVByZXZpZXdBKExQT1BFTkZJTEVOQU1FQSBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIFRSVUUsIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTYXZlRmlsZU5hbWVQcmV2aWV3VwlbTVNWRlczMi5AXQogKi8KQk9PTCBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lUHJldmlld1coTFBPUEVORklMRU5BTUVXIGxwb2ZuKQp7CiAgRklYTUUoIiglcCksIHNlbWktc3R1YiFcbiIsIGxwb2ZuKTsKCiAgcmV0dXJuIEdldEZpbGVOYW1lUHJldmlldyhscG9mbiwgVFJVRSwgVFJVRSk7Cn0K