LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCiogICAgICAgICAgICAgICBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRmlsZSB1bm9ybS5oCioKKiBDcmVhdGVkIGJ5OiBWbGFkaW1pciBXZWluc3RlaW4gMTIwNTIwMDAKKgoqIE1vZGlmaWNhdGlvbiBoaXN0b3J5IDoKKgoqIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogMDIvMDEvMDEgICAgc3lud2VlICAgICAgQWRkZWQgbm9ybWFsaXphdGlvbiBxdWlja2NoZWNrIGVudW0gYW5kIG1ldGhvZC4KKi8KI2lmbmRlZiBVTk9STV9ICiNkZWZpbmUgVU5PUk1fSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCgovKioKICogXGZpbGUKICogXGJyaWVmIEMgQVBJOiBVbmljb2RlIE5vcm1hbGl6YXRpb24gCiAqCiAqIDxoMj4gIFVuaWNvZGUgbm9ybWFsaXphdGlvbiBBUEkgPC9oMj4KICoKICogPHR0PnVub3JtX25vcm1hbGl6ZTwvdHQ+IHRyYW5zZm9ybXMgVW5pY29kZSB0ZXh0IGludG8gYW4gZXF1aXZhbGVudCBjb21wb3NlZCBvcgogKiBkZWNvbXBvc2VkIGZvcm0sIGFsbG93aW5nIGZvciBlYXNpZXIgc29ydGluZyBhbmQgc2VhcmNoaW5nIG9mIHRleHQuCiAqIDx0dD51bm9ybV9ub3JtYWxpemU8L3R0PiBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgbm9ybWFsaXphdGlvbiBmb3JtcyBkZXNjcmliZWQgaW4KICogPGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxNS8iIHRhcmdldD0idW5pY29kZSI+CiAqIFVuaWNvZGUgVGVjaG5pY2FsIFJlcG9ydCAjMTU8L2E+LgogKiA8cD4KICogQ2hhcmFjdGVycyB3aXRoIGFjY2VudHMgb3Igb3RoZXIgYWRvcm5tZW50cyBjYW4gYmUgZW5jb2RlZCBpbgogKiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzIGluIFVuaWNvZGUuICBGb3IgZXhhbXBsZSwgdGFrZSB0aGUgY2hhcmFjdGVyICLBIgogKiAoQS1hY3V0ZSkuICAgSW4gVW5pY29kZSwgdGhpcyBjYW4gYmUgZW5jb2RlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIgKHRoZQogKiAiY29tcG9zZWQiIGZvcm0pOgogKiA8cHJlPgogKiBcY29kZQogKiAgICAgIDAwQzEgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCiAqIFxlbmRjb2RlCiAqIDwvcHJlPgogKiBvciBhcyB0d28gc2VwYXJhdGUgY2hhcmFjdGVycyAodGhlICJkZWNvbXBvc2VkIiBmb3JtKToKICogPHByZT4KICogXGNvZGUKICogICAgICAwMDQxICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEKICogICAgICAwMzAxICAgIENPTUJJTklORyBBQ1VURSBBQ0NFTlQ8L3ByZT4KICogXGVuZGNvZGUKICogPHA+CiAqIFRvIGEgdXNlciBvZiB5b3VyIHByb2dyYW0sIGhvd2V2ZXIsIGJvdGggb2YgdGhlc2Ugc2VxdWVuY2VzIHNob3VsZCBiZQogKiB0cmVhdGVkIGFzIHRoZSBzYW1lICJ1c2VyLWxldmVsIiBjaGFyYWN0ZXIgIkEgd2l0aCBhY3V0ZSBhY2NlbnQiLiAgV2hlbiB5b3UgYXJlIHNlYXJjaGluZyBvcgogKiBjb21wYXJpbmcgdGV4dCwgeW91IG11c3QgZW5zdXJlIHRoYXQgdGhlc2UgdHdvIHNlcXVlbmNlcyBhcmUgdHJlYXRlZCAKICogZXF1aXZhbGVudGx5LiAgSW4gYWRkaXRpb24sIHlvdSBtdXN0IGhhbmRsZSBjaGFyYWN0ZXJzIHdpdGggbW9yZSB0aGFuIG9uZQogKiBhY2NlbnQuICBTb21ldGltZXMgdGhlIG9yZGVyIG9mIGEgY2hhcmFjdGVyJ3MgY29tYmluaW5nIGFjY2VudHMgaXMKICogc2lnbmlmaWNhbnQsIHdoaWxlIGluIG90aGVyIGNhc2VzIGFjY2VudCBzZXF1ZW5jZXMgaW4gZGlmZmVyZW50IG9yZGVycyBhcmUKICogcmVhbGx5IGVxdWl2YWxlbnQuCiAqIDxwPgogKiBTaW1pbGFybHksIHRoZSBzdHJpbmcgImZmaSIgY2FuIGJlIGVuY29kZWQgYXMgdGhyZWUgc2VwYXJhdGUgbGV0dGVyczoKICogPHByZT4KICogXGNvZGUKICogICAgICAwMDY2ICAgIExBVElOIFNNQUxMIExFVFRFUiBGCiAqICAgICAgMDA2NiAgICBMQVRJTiBTTUFMTCBMRVRURVIgRgogKiAgICAgIDAwNjkgICAgTEFUSU4gU01BTEwgTEVUVEVSIEkKICogXGVuZGNvZGUKICogPC9wcmU+CiAqIG9yIGFzIHRoZSBzaW5nbGUgY2hhcmFjdGVyCiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgICAgRkIwMyAgICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGRkk8L3ByZT4KICogXGVuZGNvZGUKICogPHA+CiAqIFRoZSBmZmkgbGlnYXR1cmUgaXMgbm90IGEgZGlzdGluY3Qgc2VtYW50aWMgY2hhcmFjdGVyLCBhbmQgc3RyaWN0bHkgc3BlYWtpbmcKICogaXQgc2hvdWxkbid0IGJlIGluIFVuaWNvZGUgYXQgYWxsLCBidXQgaXQgd2FzIGluY2x1ZGVkIGZvciBjb21wYXRpYmlsaXR5CiAqIHdpdGggZXhpc3RpbmcgY2hhcmFjdGVyIHNldHMgdGhhdCBhbHJlYWR5IHByb3ZpZGVkIGl0LiAgVGhlIFVuaWNvZGUgc3RhbmRhcmQKICogaWRlbnRpZmllcyBzdWNoIGNoYXJhY3RlcnMgYnkgZ2l2aW5nIHRoZW0gImNvbXBhdGliaWxpdHkiIGRlY29tcG9zaXRpb25zCiAqIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc2VtYW50aWMgY2hhcmFjdGVycy4gIFdoZW4gc29ydGluZyBhbmQgc2VhcmNoaW5nLCB5b3UKICogd2lsbCBvZnRlbiB3YW50IHRvIHVzZSB0aGVzZSBtYXBwaW5ncy4KICogPHA+CiAqIDx0dD51bm9ybV9ub3JtYWxpemU8L3R0PiBoZWxwcyBzb2x2ZSB0aGVzZSBwcm9ibGVtcyBieSB0cmFuc2Zvcm1pbmcgdGV4dCBpbnRvIHRoZQogKiBjYW5vbmljYWwgY29tcG9zZWQgYW5kIGRlY29tcG9zZWQgZm9ybXMgYXMgc2hvd24gaW4gdGhlIGZpcnN0IGV4YW1wbGUgYWJvdmUuICAKICogSW4gYWRkaXRpb24sIHlvdSBjYW4gaGF2ZSBpdCBwZXJmb3JtIGNvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbnMgc28gdGhhdCAKICogeW91IGNhbiB0cmVhdCBjb21wYXRpYmlsaXR5IGNoYXJhY3RlcnMgdGhlIHNhbWUgYXMgdGhlaXIgZXF1aXZhbGVudHMuCiAqIEZpbmFsbHksIDx0dD51bm9ybV9ub3JtYWxpemU8L3R0PiByZWFycmFuZ2VzIGFjY2VudHMgaW50byB0aGUgcHJvcGVyIGNhbm9uaWNhbAogKiBvcmRlciwgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgYWNjZW50IHJlYXJyYW5nZW1lbnQgb24geW91cgogKiBvd24uCiAqIDxwPgogKiA8dHQ+dW5vcm1fbm9ybWFsaXplPC90dD4gYWRkcyBvbmUgb3B0aW9uYWwgYmVoYXZpb3IsIHtAbGluayAjVUNPTF9JR05PUkVfSEFOR1VMfSwKICogdGhhdCBkaWZmZXJzIGZyb20KICogdGhlIHN0YW5kYXJkIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGb3Jtcy4gCiAqKi8KCiAgLyoqCiAgICAqIFVDT0xfTk9fTk9STUFMSVpBVElPTiA6IEFjY2VudGVkIGNoYXJhY3RlcnMgd2lsbCBub3QgYmUgZGVjb21wb3NlZCBmb3Igc29ydGluZy4gIAogICAgKiBVQ09MX0RFQ09NX0NBTiAgICAgICAgICA6IENoYXJhY3RlcnMgdGhhdCBhcmUgY2Fub25pY2FsIHZhcmlhbnRzIGFjY29yZGluZyAKICAgICogdG8gVW5pY29kZSAyLjAgd2lsbCBiZSBkZWNvbXBvc2VkIGZvciBzb3J0aW5nLiAKICAgICogVUNPTF9ERUNPTVBfQ09NUEFUICAgIDogQ2hhcmFjdGVycyB0aGF0IGFyZSBjb21wYXRpYmlsaXR5IHZhcmlhbnRzIHdpbGwgYmUKICAgICogZGVjb21wb3NlZCBmb3Igc29ydGluZy4gVGhpcyBpcyB0aGUgZGVmYXVsdCBub3JtYWxpemF0aW9uIG1vZGUgdXNlZC4KICAgICogVUNPTF9ERUNPTVBfQ0FOX0NPTVBfQ09NUEFUIDogQ2Fub25pY2FsIGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uIAogICAgKiBVQ09MX0RFQ09NUF9DT01QQVRfQ09NUF9DQU4gOiBDb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uCiAgICAqCiAgICAqKi8KCnR5cGVkZWYgZW51bSB7CiAgLyoqIE5vIGRlY29tcG9zaXRpb24vY29tcG9zaXRpb24gKi8KICBVQ09MX05PX05PUk1BTElaQVRJT04gPSAxLAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiAqLwogIFVDT0xfREVDT01QX0NBTiA9IDIsCiAgLyoqIENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiAqLwogIFVDT0xfREVDT01QX0NPTVBBVCA9IDMsCiAgLyoqIERlZmF1bHQgbm9ybWFsaXphdGlvbiAqLwogIFVDT0xfREVGQVVMVF9OT1JNQUxJWkFUSU9OID0gVUNPTF9ERUNPTVBfQ09NUEFULCAKICAvKiogQ2Fub25pY2FsIGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ0FOX0NPTVBfQ09NUEFUID0gNCwKICAvKiogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbiAqLwogIFVDT0xfREVDT01QX0NPTVBBVF9DT01QX0NBTiA9NSwKICAvKiogTm8gZGVjb21wb3NpdGlvbi9jb21wb3NpdGlvbiAqLwogIFVOT1JNX05PTkUgPSAxLCAKICAvKiogQ2Fub25pY2FsIGRlY29tcG9zaXRpb24gKi8KICBVTk9STV9ORkQgPSAyLAogIC8qKiBDb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKi8KICBVTk9STV9ORktEID0gMywKICAvKiogQ2Fub25pY2FsIGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uICovCiAgVU5PUk1fTkZDID0gNCwKICAvKiogRGVmYXVsdCBub3JtYWxpemF0aW9uICovCiAgVU5PUk1fREVGQVVMVCA9IFVOT1JNX05GQywgCiAgLyoqIENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gKi8KICBVTk9STV9ORktDID01LAoKICBVTk9STV9NT0RFX0NPVU5ULAoKICAvKioKICAgKiBEbyBub3Qgbm9ybWFsaXplIEhhbmd1bC4KICAgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIHdpdGhvdXQgcmVwbGFjZW1lbnQgYWZ0ZXIgMjAwMi1tYXItMzEuCiAgICovCiAgVUNPTF9JR05PUkVfSEFOR1VMICAgID0gMTYsCiAgLyoqCiAgICogRG8gbm90IG5vcm1hbGl6ZSBIYW5ndWwuCiAgICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCB3aXRob3V0IHJlcGxhY2VtZW50IGFmdGVyIDIwMDItbWFyLTMxLgogICAqLwogIFVOT1JNX0lHTk9SRV9IQU5HVUwgICAgPSAxNgp9IFVOb3JtYWxpemF0aW9uTW9kZTsKCi8qKiBQb3NzaWJsZSBub3JtYWxpemF0aW9uIG9wdGlvbnMgKi8KdHlwZWRlZiBVTm9ybWFsaXphdGlvbk1vZGUgVU5vcm1hbGl6YXRpb25PcHRpb247CgovKioKICogTm9ybWFsaXplIGEgc3RyaW5nLgogKiBUaGUgc3RyaW5nIHdpbGwgYmUgbm9ybWFsaXplZCBhY2NvcmRpbmcgdGhlIHRoZSBzcGVjaWZpZWQgbm9ybWFsaXphdGlvbiBtb2RlCiAqIGFuZCBvcHRpb25zLgogKiBAcGFyYW0gc291cmNlIFRoZSBzdHJpbmcgdG8gbm9ybWFsaXplLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBtb2RlIFRoZSBub3JtYWxpemF0aW9uIG1vZGU7IG9uZSBvZiBVTk9STV9OT05FLCAKICogVU5PUk1fTkZELCBVTk9STV9ORkMsIFVOT1JNX05GS0MsIFVOT1JNX05GS0QsIFVOT1JNX0RFRkFVTFQKICogQHBhcmFtIG9wdGlvbnMgVGhlIG5vcm1hbGl6YXRpb24gb3B0aW9ucywgT1JlZCB0b2dldGhlcjsgcG9zc2libGUgdmFsdWVzCiAqIGFyZSBVTk9STV9JR05PUkVfSEFOR1VMCiAqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGF0dHJpYnV0ZS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLAogKiB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiAqIEBzdGFibGUKICovClVfQ0FQSSBpbnQzMl90CnVub3JtX25vcm1hbGl6ZShjb25zdCBVQ2hhciogICAgICAgICAgIHNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBzb3VyY2VMZW5ndGgsIAogICAgICAgIFVOb3JtYWxpemF0aW9uTW9kZSAgICAgIG1vZGUsIAogICAgICAgIGludDMyX3QgICAgICAgICAgICBvcHRpb25zLAogICAgICAgIFVDaGFyKiAgICAgICAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICByZXN1bHRMZW5ndGgsCiAgICAgICAgVUVycm9yQ29kZSogICAgICAgICAgICAgc3RhdHVzKTsgICAgCgovKioKICogVGhlIGZ1bmN0aW9uIHVfbm9ybWFsaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byB1bm9ybV9ub3JtYWxpemUoKQogKiBmb3IgY29uc2lzdGVuY3kuIFRoZSBvbGQgbmFtZSBpcyBkZXByZWNhdGVkLgogKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGFmdGVyIDIwMDItbWFyLTMxLgogKi8KI2RlZmluZSB1X25vcm1hbGl6ZSB1bm9ybV9ub3JtYWxpemUKCnR5cGVkZWYgZW51bSBVTm9ybWFsaXphdGlvbkNoZWNrUmVzdWx0IHsKICAvKiogCiAgKiBJbmRpY2F0ZXMgdGhhdCBzdHJpbmcgaXMgbm90IGluIHRoZSBub3JtYWxpemVkIGZvcm1hdAogICovCiAgVU5PUk1fTk8sCiAgLyoqIAogICogSW5kaWNhdGVzIHRoYXQgc3RyaW5nIGlzIGluIHRoZSBub3JtYWxpemVkIGZvcm1hdAogICovCiAgVU5PUk1fWUVTLAogIC8qKiAKICAqIEluZGljYXRlcyB0aGF0IHN0cmluZyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBpcyBpbiB0aGUgbm9ybWFsaXplZCAKICAqIGZvcm1hdCB3aXRob3V0IGZ1cnRoZXIgdGhvcm91Z2ggY2hlY2tzLgogICovCiAgVU5PUk1fTUFZQkUKfSBVTm9ybWFsaXphdGlvbkNoZWNrUmVzdWx0OwoKLyoqCiAqIFBlcmZvcm1pbmcgcXVpY2sgY2hlY2sgb24gYSBzdHJpbmcsIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHRoZSBzdHJpbmcgaXMgCiAqIGluIGEgcGFydGljdWxhciBub3JtYWxpemF0aW9uIGZvcm1hdC4KICogVGhyZWUgdHlwZXMgb2YgcmVzdWx0IGNhbiBiZSByZXR1cm5lZCBVTk9STV9ZRVMsIFVOT1JNX05PIG9yCiAqIFVOT1JNX01BWUJFLiBSZXN1bHQgVU5PUk1fWUVTIGluZGljYXRlcyB0aGF0IHRoZSBhcmd1bWVudAogKiBzdHJpbmcgaXMgaW4gdGhlIGRlc2lyZWQgbm9ybWFsaXplZCBmb3JtYXQsIFVOT1JNX05PIGRldGVybWluZXMgdGhhdAogKiBhcmd1bWVudCBzdHJpbmcgaXMgbm90IGluIHRoZSBkZXNpcmVkIG5vcm1hbGl6ZWQgZm9ybWF0LiBBIAogKiBVTk9STV9NQVlCRSByZXN1bHQgaW5kaWNhdGVzIHRoYXQgYSBtb3JlIHRob3JvdWdoIGNoZWNrIGlzIHJlcXVpcmVkLCAKICogdGhlIHVzZXIgbWF5IGhhdmUgdG8gcHV0IHRoZSBzdHJpbmcgaW4gaXRzIG5vcm1hbGl6ZWQgZm9ybSBhbmQgY29tcGFyZSB0aGUgCiAqIHJlc3VsdHMuCiAqIEBwYXJhbSBzb3VyY2UgICAgICAgc3RyaW5nIGZvciBkZXRlcm1pbmluZyBpZiBpdCBpcyBpbiBhIG5vcm1hbGl6ZWQgZm9ybWF0CiAqIEBwYXJhbSBzb3VyY2VsZW5ndGggbGVuZ3RoIG9mIHNvdXJjZSB0byB0ZXN0CiAqIEBwYXJhbiBtb2RlICAgICAgICAgbm9ybWFsaXphdGlvbiBmb3JtYXQgZnJvbSB0aGUgZW51bSBVTm9ybWFsaXphdGlvbk1vZGUKICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHJldHVybiBVTk9STV9ZRVMsIFVOT1JNX05PIG9yIFVOT1JNX01BWUJFCiAqLwpVX0NBUEkgVU5vcm1hbGl6YXRpb25DaGVja1Jlc3VsdCBVX0VYUE9SVDIKdW5vcm1fcXVpY2tDaGVjayhjb25zdCBVQ2hhciogICAgICAgc291cmNlLAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHNvdXJjZWxlbmd0aCwgCiAgICAgICAgICAgICBVTm9ybWFsaXphdGlvbk1vZGUgbW9kZSwgCiAgICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgc3RhdHVzKTsKCiNlbmRpZgo=