LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgezE5OTYtMjAwMX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEZpbGUgdW5vcm0uaAoqCiogQ3JlYXRlZCBieTogVmxhZGltaXIgV2VpbnN0ZWluIDEyMDUyMDAwCioKKiBNb2RpZmljYXRpb24gaGlzdG9yeSA6CioKKiBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqIDAyLzAxLzAxICAgIHN5bndlZSAgICAgIEFkZGVkIG5vcm1hbGl6YXRpb24gcXVpY2tjaGVjayBlbnVtIGFuZCBtZXRob2QuCiovCiNpZm5kZWYgVU5PUk1fSAojZGVmaW5lIFVOT1JNX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgoKLyoqCiAqIFxmaWxlCiAqIFxicmllZiBDIEFQSTogVW5pY29kZSBOb3JtYWxpemF0aW9uIAogKgogKiA8aDI+ICBVbmljb2RlIG5vcm1hbGl6YXRpb24gQVBJIDwvaDI+CiAqCiAqIDx0dD51bm9ybV9ub3JtYWxpemU8L3R0PiB0cmFuc2Zvcm1zIFVuaWNvZGUgdGV4dCBpbnRvIGFuIGVxdWl2YWxlbnQgY29tcG9zZWQgb3IKICogZGVjb21wb3NlZCBmb3JtLCBhbGxvd2luZyBmb3IgZWFzaWVyIHNvcnRpbmcgYW5kIHNlYXJjaGluZyBvZiB0ZXh0LgogKiA8dHQ+dW5vcm1fbm9ybWFsaXplPC90dD4gc3VwcG9ydHMgdGhlIHN0YW5kYXJkIG5vcm1hbGl6YXRpb24gZm9ybXMgZGVzY3JpYmVkIGluCiAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTUvIiB0YXJnZXQ9InVuaWNvZGUiPgogKiBVbmljb2RlIFRlY2huaWNhbCBSZXBvcnQgIzE1PC9hPi4KICogPHA+CiAqIENoYXJhY3RlcnMgd2l0aCBhY2NlbnRzIG9yIG90aGVyIGFkb3JubWVudHMgY2FuIGJlIGVuY29kZWQgaW4KICogc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyBpbiBVbmljb2RlLiAgRm9yIGV4YW1wbGUsIHRha2UgdGhlIGNoYXJhY3RlciAiwSIKICogKEEtYWN1dGUpLiAgIEluIFVuaWNvZGUsIHRoaXMgY2FuIGJlIGVuY29kZWQgYXMgYSBzaW5nbGUgY2hhcmFjdGVyICh0aGUKICogImNvbXBvc2VkIiBmb3JtKToKICogPHByZT4KICogXGNvZGUKICogICAgICAwMEMxICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQogKiBcZW5kY29kZQogKiA8L3ByZT4KICogb3IgYXMgdHdvIHNlcGFyYXRlIGNoYXJhY3RlcnMgKHRoZSAiZGVjb21wb3NlZCIgZm9ybSk6CiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgICAgMDA0MSAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCiAqICAgICAgMDMwMSAgICBDT01CSU5JTkcgQUNVVEUgQUNDRU5UPC9wcmU+CiAqIFxlbmRjb2RlCiAqIDxwPgogKiBUbyBhIHVzZXIgb2YgeW91ciBwcm9ncmFtLCBob3dldmVyLCBib3RoIG9mIHRoZXNlIHNlcXVlbmNlcyBzaG91bGQgYmUKICogdHJlYXRlZCBhcyB0aGUgc2FtZSAidXNlci1sZXZlbCIgY2hhcmFjdGVyICJBIHdpdGggYWN1dGUgYWNjZW50Ii4gIFdoZW4geW91IGFyZSBzZWFyY2hpbmcgb3IKICogY29tcGFyaW5nIHRleHQsIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZXNlIHR3byBzZXF1ZW5jZXMgYXJlIHRyZWF0ZWQgCiAqIGVxdWl2YWxlbnRseS4gIEluIGFkZGl0aW9uLCB5b3UgbXVzdCBoYW5kbGUgY2hhcmFjdGVycyB3aXRoIG1vcmUgdGhhbiBvbmUKICogYWNjZW50LiAgU29tZXRpbWVzIHRoZSBvcmRlciBvZiBhIGNoYXJhY3RlcidzIGNvbWJpbmluZyBhY2NlbnRzIGlzCiAqIHNpZ25pZmljYW50LCB3aGlsZSBpbiBvdGhlciBjYXNlcyBhY2NlbnQgc2VxdWVuY2VzIGluIGRpZmZlcmVudCBvcmRlcnMgYXJlCiAqIHJlYWxseSBlcXVpdmFsZW50LgogKiA8cD4KICogU2ltaWxhcmx5LCB0aGUgc3RyaW5nICJmZmkiIGNhbiBiZSBlbmNvZGVkIGFzIHRocmVlIHNlcGFyYXRlIGxldHRlcnM6CiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgICAgMDA2NiAgICBMQVRJTiBTTUFMTCBMRVRURVIgRgogKiAgICAgIDAwNjYgICAgTEFUSU4gU01BTEwgTEVUVEVSIEYKICogICAgICAwMDY5ICAgIExBVElOIFNNQUxMIExFVFRFUiBJCiAqIFxlbmRjb2RlCiAqIDwvcHJlPgogKiBvciBhcyB0aGUgc2luZ2xlIGNoYXJhY3RlcgogKiA8cHJlPgogKiBcY29kZQogKiAgICAgIEZCMDMgICAgTEFUSU4gU01BTEwgTElHQVRVUkUgRkZJPC9wcmU+CiAqIFxlbmRjb2RlCiAqIDxwPgogKiBUaGUgZmZpIGxpZ2F0dXJlIGlzIG5vdCBhIGRpc3RpbmN0IHNlbWFudGljIGNoYXJhY3RlciwgYW5kIHN0cmljdGx5IHNwZWFraW5nCiAqIGl0IHNob3VsZG4ndCBiZSBpbiBVbmljb2RlIGF0IGFsbCwgYnV0IGl0IHdhcyBpbmNsdWRlZCBmb3IgY29tcGF0aWJpbGl0eQogKiB3aXRoIGV4aXN0aW5nIGNoYXJhY3RlciBzZXRzIHRoYXQgYWxyZWFkeSBwcm92aWRlZCBpdC4gIFRoZSBVbmljb2RlIHN0YW5kYXJkCiAqIGlkZW50aWZpZXMgc3VjaCBjaGFyYWN0ZXJzIGJ5IGdpdmluZyB0aGVtICJjb21wYXRpYmlsaXR5IiBkZWNvbXBvc2l0aW9ucwogKiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHNlbWFudGljIGNoYXJhY3RlcnMuICBXaGVuIHNvcnRpbmcgYW5kIHNlYXJjaGluZywgeW91CiAqIHdpbGwgb2Z0ZW4gd2FudCB0byB1c2UgdGhlc2UgbWFwcGluZ3MuCiAqIDxwPgogKiA8dHQ+dW5vcm1fbm9ybWFsaXplPC90dD4gaGVscHMgc29sdmUgdGhlc2UgcHJvYmxlbXMgYnkgdHJhbnNmb3JtaW5nIHRleHQgaW50byB0aGUKICogY2Fub25pY2FsIGNvbXBvc2VkIGFuZCBkZWNvbXBvc2VkIGZvcm1zIGFzIHNob3duIGluIHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlLiAgCiAqIEluIGFkZGl0aW9uLCB5b3UgY2FuIGhhdmUgaXQgcGVyZm9ybSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb25zIHNvIHRoYXQgCiAqIHlvdSBjYW4gdHJlYXQgY29tcGF0aWJpbGl0eSBjaGFyYWN0ZXJzIHRoZSBzYW1lIGFzIHRoZWlyIGVxdWl2YWxlbnRzLgogKiBGaW5hbGx5LCA8dHQ+dW5vcm1fbm9ybWFsaXplPC90dD4gcmVhcnJhbmdlcyBhY2NlbnRzIGludG8gdGhlIHByb3BlciBjYW5vbmljYWwKICogb3JkZXIsIHNvIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFjY2VudCByZWFycmFuZ2VtZW50IG9uIHlvdXIKICogb3duLgogKiA8cD4KICogPHR0PnVub3JtX25vcm1hbGl6ZTwvdHQ+IGFkZHMgb25lIG9wdGlvbmFsIGJlaGF2aW9yLCB7QGxpbmsgI1VDT0xfSUdOT1JFX0hBTkdVTH0sCiAqIHRoYXQgZGlmZmVycyBmcm9tCiAqIHRoZSBzdGFuZGFyZCBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybXMuIAogKiovCgogIC8qKgogICAgKiBVQ09MX05PX05PUk1BTElaQVRJT04gOiBBY2NlbnRlZCBjaGFyYWN0ZXJzIHdpbGwgbm90IGJlIGRlY29tcG9zZWQgZm9yIHNvcnRpbmcuICAKICAgICogVUNPTF9ERUNPTV9DQU4gICAgICAgICAgOiBDaGFyYWN0ZXJzIHRoYXQgYXJlIGNhbm9uaWNhbCB2YXJpYW50cyBhY2NvcmRpbmcgCiAgICAqIHRvIFVuaWNvZGUgMi4wIHdpbGwgYmUgZGVjb21wb3NlZCBmb3Igc29ydGluZy4gCiAgICAqIFVDT0xfREVDT01QX0NPTVBBVCAgICA6IENoYXJhY3RlcnMgdGhhdCBhcmUgY29tcGF0aWJpbGl0eSB2YXJpYW50cyB3aWxsIGJlCiAgICAqIGRlY29tcG9zZWQgZm9yIHNvcnRpbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQgbm9ybWFsaXphdGlvbiBtb2RlIHVzZWQuCiAgICAqIFVDT0xfREVDT01QX0NBTl9DT01QX0NPTVBBVCA6IENhbm9uaWNhbCBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbiAKICAgICogVUNPTF9ERUNPTVBfQ09NUEFUX0NPTVBfQ0FOIDogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbgogICAgKgogICAgKiovCgp0eXBlZGVmIGVudW0gewogIC8qKiBObyBkZWNvbXBvc2l0aW9uL2NvbXBvc2l0aW9uICovCiAgVUNPTF9OT19OT1JNQUxJWkFUSU9OID0gMSwKICAvKiogQ2Fub25pY2FsIGRlY29tcG9zaXRpb24gKi8KICBVQ09MX0RFQ09NUF9DQU4gPSAyLAogIC8qKiBDb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKi8KICBVQ09MX0RFQ09NUF9DT01QQVQgPSAzLAogIC8qKiBEZWZhdWx0IG5vcm1hbGl6YXRpb24gKi8KICBVQ09MX0RFRkFVTFRfTk9STUFMSVpBVElPTiA9IFVDT0xfREVDT01QX0NPTVBBVCwgCiAgLyoqIENhbm9uaWNhbCBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbiAqLwogIFVDT0xfREVDT01QX0NBTl9DT01QX0NPTVBBVCA9IDQsCiAgLyoqIENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gKi8KICBVQ09MX0RFQ09NUF9DT01QQVRfQ09NUF9DQU4gPTUsCiAgLyoqIE5vIGRlY29tcG9zaXRpb24vY29tcG9zaXRpb24gKi8KICBVTk9STV9OT05FID0gMSwgCiAgLyoqIENhbm9uaWNhbCBkZWNvbXBvc2l0aW9uICovCiAgVU5PUk1fTkZEID0gMiwKICAvKiogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uICovCiAgVU5PUk1fTkZLRCA9IDMsCiAgLyoqIENhbm9uaWNhbCBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GQyA9IDQsCiAgLyoqIERlZmF1bHQgbm9ybWFsaXphdGlvbiAqLwogIFVOT1JNX0RFRkFVTFQgPSBVTk9STV9ORkMsIAogIC8qKiBDb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uICovCiAgVU5PUk1fTkZLQyA9NSwKCiAgVU5PUk1fTU9ERV9DT1VOVCwKCiAgLyoqCiAgICogRG8gbm90IG5vcm1hbGl6ZSBIYW5ndWwuCiAgICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCB3aXRob3V0IHJlcGxhY2VtZW50IGFmdGVyIDIwMDItbWFyLTMxLgogICAqLwogIFVDT0xfSUdOT1JFX0hBTkdVTCAgICA9IDE2LAogIC8qKgogICAqIERvIG5vdCBub3JtYWxpemUgSGFuZ3VsLgogICAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgd2l0aG91dCByZXBsYWNlbWVudCBhZnRlciAyMDAyLW1hci0zMS4KICAgKi8KICBVTk9STV9JR05PUkVfSEFOR1VMICAgID0gMTYKfSBVTm9ybWFsaXphdGlvbk1vZGU7CgovKiogUG9zc2libGUgbm9ybWFsaXphdGlvbiBvcHRpb25zICovCnR5cGVkZWYgVU5vcm1hbGl6YXRpb25Nb2RlIFVOb3JtYWxpemF0aW9uT3B0aW9uOwoKLyoqCiAqIE5vcm1hbGl6ZSBhIHN0cmluZy4KICogVGhlIHN0cmluZyB3aWxsIGJlIG5vcm1hbGl6ZWQgYWNjb3JkaW5nIHRoZSB0aGUgc3BlY2lmaWVkIG5vcm1hbGl6YXRpb24gbW9kZQogKiBhbmQgb3B0aW9ucy4KICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyaW5nIHRvIG5vcm1hbGl6ZS4KICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gbW9kZSBUaGUgbm9ybWFsaXphdGlvbiBtb2RlOyBvbmUgb2YgVU5PUk1fTk9ORSwgCiAqIFVOT1JNX05GRCwgVU5PUk1fTkZDLCBVTk9STV9ORktDLCBVTk9STV9ORktELCBVTk9STV9ERUZBVUxUCiAqIEBwYXJhbSBvcHRpb25zIFRoZSBub3JtYWxpemF0aW9uIG9wdGlvbnMsIE9SZWQgdG9nZXRoZXI7IHBvc3NpYmxlIHZhbHVlcwogKiBhcmUgVU5PUk1fSUdOT1JFX0hBTkdVTAogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gVGhlIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZDsgaWYgZ3JlYXRlciB0aGFuIHJlc3VsdExlbmd0aCwKICogdGhlIG91dHB1dCB3YXMgdHJ1bmNhdGVkLgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgaW50MzJfdAp1bm9ybV9ub3JtYWxpemUoY29uc3QgVUNoYXIqICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgc291cmNlTGVuZ3RoLCAKICAgICAgICBVTm9ybWFsaXphdGlvbk1vZGUgICAgICBtb2RlLCAKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgb3B0aW9ucywKICAgICAgICBVQ2hhciogICAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgIFVFcnJvckNvZGUqICAgICAgICAgICAgIHN0YXR1cyk7ICAgIAoKLyoqCiAqIFRoZSBmdW5jdGlvbiB1X25vcm1hbGl6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gdW5vcm1fbm9ybWFsaXplKCkKICogZm9yIGNvbnNpc3RlbmN5LiBUaGUgb2xkIG5hbWUgaXMgZGVwcmVjYXRlZC4KICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBhZnRlciAyMDAyLW1hci0zMS4KICovCiNkZWZpbmUgdV9ub3JtYWxpemUgdW5vcm1fbm9ybWFsaXplCgp0eXBlZGVmIGVudW0gVU5vcm1hbGl6YXRpb25DaGVja1Jlc3VsdCB7CiAgLyoqIAogICogSW5kaWNhdGVzIHRoYXQgc3RyaW5nIGlzIG5vdCBpbiB0aGUgbm9ybWFsaXplZCBmb3JtYXQKICAqLwogIFVOT1JNX05PLAogIC8qKiAKICAqIEluZGljYXRlcyB0aGF0IHN0cmluZyBpcyBpbiB0aGUgbm9ybWFsaXplZCBmb3JtYXQKICAqLwogIFVOT1JNX1lFUywKICAvKiogCiAgKiBJbmRpY2F0ZXMgdGhhdCBzdHJpbmcgY2Fubm90IGJlIGRldGVybWluZWQgaWYgaXQgaXMgaW4gdGhlIG5vcm1hbGl6ZWQgCiAgKiBmb3JtYXQgd2l0aG91dCBmdXJ0aGVyIHRob3JvdWdoIGNoZWNrcy4KICAqLwogIFVOT1JNX01BWUJFCn0gVU5vcm1hbGl6YXRpb25DaGVja1Jlc3VsdDsKCi8qKgogKiBQZXJmb3JtaW5nIHF1aWNrIGNoZWNrIG9uIGEgc3RyaW5nLCB0byBxdWlja2x5IGRldGVybWluZSBpZiB0aGUgc3RyaW5nIGlzIAogKiBpbiBhIHBhcnRpY3VsYXIgbm9ybWFsaXphdGlvbiBmb3JtYXQuCiAqIFRocmVlIHR5cGVzIG9mIHJlc3VsdCBjYW4gYmUgcmV0dXJuZWQgVU5PUk1fWUVTLCBVTk9STV9OTyBvcgogKiBVTk9STV9NQVlCRS4gUmVzdWx0IFVOT1JNX1lFUyBpbmRpY2F0ZXMgdGhhdCB0aGUgYXJndW1lbnQKICogc3RyaW5nIGlzIGluIHRoZSBkZXNpcmVkIG5vcm1hbGl6ZWQgZm9ybWF0LCBVTk9STV9OTyBkZXRlcm1pbmVzIHRoYXQKICogYXJndW1lbnQgc3RyaW5nIGlzIG5vdCBpbiB0aGUgZGVzaXJlZCBub3JtYWxpemVkIGZvcm1hdC4gQSAKICogVU5PUk1fTUFZQkUgcmVzdWx0IGluZGljYXRlcyB0aGF0IGEgbW9yZSB0aG9yb3VnaCBjaGVjayBpcyByZXF1aXJlZCwgCiAqIHRoZSB1c2VyIG1heSBoYXZlIHRvIHB1dCB0aGUgc3RyaW5nIGluIGl0cyBub3JtYWxpemVkIGZvcm0gYW5kIGNvbXBhcmUgdGhlIAogKiByZXN1bHRzLgogKiBAcGFyYW0gc291cmNlICAgICAgIHN0cmluZyBmb3IgZGV0ZXJtaW5pbmcgaWYgaXQgaXMgaW4gYSBub3JtYWxpemVkIGZvcm1hdAogKiBAcGFyYW0gc291cmNlbGVuZ3RoIGxlbmd0aCBvZiBzb3VyY2UgdG8gdGVzdAogKiBAcGFyYW4gbW9kZSAgICAgICAgIG5vcm1hbGl6YXRpb24gZm9ybWF0IGZyb20gdGhlIGVudW0gVU5vcm1hbGl6YXRpb25Nb2RlCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gVU5PUk1fWUVTLCBVTk9STV9OTyBvciBVTk9STV9NQVlCRQogKi8KVV9DQVBJIFVOb3JtYWxpemF0aW9uQ2hlY2tSZXN1bHQgVV9FWFBPUlQyCnVub3JtX3F1aWNrQ2hlY2soY29uc3QgVUNoYXIqICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBzb3VyY2VsZW5ndGgsIAogICAgICAgICAgICAgVU5vcm1hbGl6YXRpb25Nb2RlIG1vZGUsIAogICAgICAgICAgICAgVUVycm9yQ29kZSogICAgICAgIHN0YXR1cyk7CgojZW5kaWYK