LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogqSAyMDE1IE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuCiogWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGRlcml2YXRpdmVzIGV4Y2x1c2l2ZWx5IHdpdGgKKiBNaWNyb2NoaXAgcHJvZHVjdHMuCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4KKiBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQgT1IgU1RBVFVUT1JZLCBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLAoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwKKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUAoqIFBST0RVQ1RTLCBDT01CSU5BVElPTiBXSVRIIEFOWSBPVEhFUiBQUk9EVUNUUywgT1IgVVNFIElOIEFOWSBBUFBMSUNBVElPTi4KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5ECiogV0hBVFNPRVZFUiBSRUxBVEVEIFRPIFRIRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQsIEVWRU4gSUYgTUlDUk9DSElQIEhBUwoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLgoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTAoqIENMQUlNUyBJTiBBTlkgV0FZIFJFTEFURUQgVE8gVEhJUyBTT0ZUV0FSRSBXSUxMIE5PVCBFWENFRUQgVEhFIEFNT1VOVCBPRgoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFCiogT0YgVEhFU0UgVEVSTVMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiBDb250cm9sIEluZm9ybWF0aW9uIChQZXJmb3JjZSkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiRSZXZpc2lvbjogIzEgJCAKJERhdGVUaW1lOiAyMDE2LzA0LzA4IDEwOjE4OjI4ICQgCiRBdXRob3I6IHByYW1hbnMgJApMYXN0IENoYW5nZToJVXBkYXRlZCBmb3IgdGFicwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiBAZmlsZSBwY3JfYXBpLmMKKiBcYnJpZWYgUG93ZXIsIENsb2NrcywgYW5kIFJlc2V0cyBBUEkgU291cmNlIGZpbGUKKiBcYXV0aG9yIGp2YXNhbnRoCiogCiogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBDUiBBUElzICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqIEBkZWZncm91cCBQQ1IKICogIEB7CiAqLwoKI2luY2x1ZGUgImNvbW1vbl9saWIuaCIKI2luY2x1ZGUgInBjci5oIgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogIEZ1bmN0aW9ucyB0byBwcm9ncmFtIFNsZWVwIEVuYWJsZSwgQ0xLIFJlcWQgU3RhdHVzLCBSZXNldCBFbmFibGUgZm9yIGEgYmxvY2sgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogU2V0cyBvciBDbGVhcnMgYmxvY2sgc3BlY2lmaWMgYml0IGluIFBDUiBTbGVlcCBFbmFibGUgUmVnaXN0ZXIKICogQHBhcmFtIHBjcl9ibG9ja19pZCAtIHBjciBibG9jayBpZCBlbmNvZGVkIHVzaW5nIFBDUnhfUkVHU19CSVQgCiAqIEBwYXJhbSBzZXRfY2xyX2ZsYWcgLSBGbGFnIHRvIHNldCAoMSkgb3IgY2xlYXIgKDApIGJpdCBpbiB0aGUgUENSIFNsZWVwIEVuYWJsZSBSZWdpc3RlcgogKi8Kdm9pZCBwY3Jfc2xlZXBfZW5hYmxlKHVpbnQzMl90IHBjcl9ibG9ja19pZCwgdWludDhfdCBzZXRfY2xyX2ZsYWcpCnsKICAgIHVpbnQzMl90IGJpdF9tYXNrOwogICAgdWludDhfdCBwY3JfcmVnX2lkOwkKIAogICAgYml0X21hc2sgPSAxVUw8PChwY3JfYmxvY2tfaWQgJiAweEZGdSk7CiAgICBwY3JfcmVnX2lkID0gKHVpbnQ4X3QpKChwY3JfYmxvY2tfaWQgPj4gUENSeF9SRUdTX1BPU19TTEVFUF9FTkFCTEUpICYgMHhGRnUpOwoKICAgIHBfcGNyX3JlZ191cGRhdGUocGNyX3JlZ19pZCwgYml0X21hc2ssIHNldF9jbHJfZmxhZyk7CQp9CgoKLyoqIEdldCBDbG9jayBSZXF1aXJlZCBTdGF0dXMgZm9yIHRoZSBibG9jawogKiBAcGFyYW0gcGNyX2Jsb2NrX2lkIC0gcGNyIGJsb2NrIGlkIGVuY29kZWQgdXNpbmcgUENSeF9SRUdTX0JJVCAKICogQHJldHVybiB1aW50OF90IC0gMSBpZiBDbG9jayBSZXF1aXJlZCBTdGF0dXMgc2V0LCBlbHNlIDAKICovCnVpbnQ4X3QgcGNyX2Nsb2NrX3JlcWRfc3RhdHVzX2dldCh1aW50MzJfdCBwY3JfYmxvY2tfaWQpCnsKICAgIHVpbnQzMl90IGJpdF9tYXNrOwogICAgdWludDhfdCBwY3JfcmVnX2lkLCByZXRWYWw7CQogCiAgICBiaXRfbWFzayA9IDFVTDw8KHBjcl9ibG9ja19pZCAmIDB4RkZ1KTsKICAgIHBjcl9yZWdfaWQgPSAodWludDhfdCkoKHBjcl9ibG9ja19pZCA+PiBQQ1J4X1JFR1NfUE9TX0NMS19SRVFEX1NUUykgJiAweEZGdSk7CgogICAgcmV0VmFsID0gMDsKICAgIGlmIChwX3Bjcl9yZWdfZ2V0KHBjcl9yZWdfaWQsIGJpdF9tYXNrKSkKICAgIHsKICAgICAgICByZXRWYWwgPSAxOwogICAgfQogICAgCiAgICByZXR1cm4gcmV0VmFsOwp9CgovKiogU2V0cyBvciBDbGVhcnMgUmVzZXQgRW5hYmxlIHJlZ2lzdGVyIGJpdCBmb3IgdGhlIGJsb2NrCiAqIEBwYXJhbSBwY3JfYmxvY2tfaWQgLSBwY3IgYmxvY2sgaWQgZW5jb2RlZCB1c2luZyBQQ1J4X1JFR1NfQklUIAogKiBAcGFyYW0gc2V0X2Nscl9mbGFnIC0gRmxhZyB0byBzZXQgKDEpIG9yIGNsZWFyICgwKSBiaXQgaW4gdGhlIFBDUiBSZXNldCBFbmFibGUgUmVnaXN0ZXIKICovCnZvaWQgcGNyX3Jlc2V0X2VuYWJsZSh1aW50MzJfdCBwY3JfYmxvY2tfaWQsIHVpbnQ4X3Qgc2V0X2Nscl9mbGFnKQp7CiAgICB1aW50MzJfdCBiaXRfbWFzazsKICAgIHVpbnQ4X3QgcGNyX3JlZ19pZDsJCiAKICAgIGJpdF9tYXNrID0gMVVMPDwocGNyX2Jsb2NrX2lkICYgMHhGRnUpOwogICAgcGNyX3JlZ19pZCA9ICh1aW50OF90KSgocGNyX2Jsb2NrX2lkID4+IFBDUnhfUkVHU19QT1NfUkVTRVRfRU5BQkxFKSAmIDB4RkZ1KTsKCiAgICBwX3Bjcl9yZWdfdXBkYXRlKHBjcl9yZWdfaWQsIGJpdF9tYXNrLCBzZXRfY2xyX2ZsYWcpOwkJCQkJCn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zIGZvciBlbnRlcmluZyBsb3cgcG93ZXIgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIEluc3RydWN0cyBhbGwgYmxvY2tzIHRvIHNsZWVwIGJ5IHNldHRpbmcgdGhlIFNsZWVwIEVuYWJsZSBiaXRzICovCnZvaWQgcGNyX2FsbF9ibG9ja3Nfc2xlZXAodm9pZCkKewoJcF9wY3JfcmVnX3dyaXRlKFBDUl9SRUdfQ0hJUF9TTEVFUF9FTkFCTEUsIDB4RkZGRkZGRkYpOwoJcF9wY3JfcmVnX3dyaXRlKFBDUl9SRUdfRUNfU0xFRVBfRU5BQkxFLCAweEZGRkZGRkZGKTsKCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0hPU1RfU0xFRVBfRU5BQkxFLCAweEZGRkZGRkZGKTsKCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV8yLCAweEZGRkZGRkZGKTsJCQp9CgovKiogQ2xlYXJzIHRoZSBTbGVlcCBFbmFibGUgYml0cyBmb3IgYWxsIGJsb2NrcyAqLwogdm9pZCBwY3JfYWxsX2Jsb2Nrc193YWtlKHZvaWQpCnsKCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0NISVBfU0xFRVBfRU5BQkxFLCAwKTsKCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRSwgMCk7CglwX3Bjcl9yZWdfd3JpdGUoUENSX1JFR19IT1NUX1NMRUVQX0VOQUJMRSwgMCk7CglwX3Bjcl9yZWdfd3JpdGUoUENSX1JFR19FQ19TTEVFUF9FTkFCTEVfMiwgMCk7CQkKfQoKLyoqIFByb2dyYW1zIHJlcXVpcmVkIHNsZWVwIG1vZGUgaW4gU3lzdGVtIFNsZWVwIENvbnRyb2wgUmVnaXN0ZXIKICogQHBhcmFtIHNsZWVwX21vZGUgLSBzZWUgZW51bSBTWVNURU1fU0xFRVBfTU9ERVMKICovCnZvaWQgcGNyX3N5c3RlbV9zbGVlcCh1aW50OF90IHNsZWVwX21vZGUpCnsKICAgIHBfcGNyX3N5c3RlbV9zbGVlcF9jdHJsX3dyaXRlKHNsZWVwX21vZGUpOwp9CgoKLyogZW5kIHBjcl9hcGkuYyAqLwovKiogICBAfQogKi8K