LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KQFJFVEAJCUZjQ2hhclNldCAqCkBGVU5DQAkJRmNDaGFyU2V0Q3JlYXRlCkBUWVBFMUAJCXZvaWQKQFBVUlBPU0VACUNyZWF0ZSBhbiBlbXB0eSBjaGFyYWN0ZXIgc2V0CkBERVNDQAo8ZnVuY3Rpb24+RmNDaGFyU2V0Q3JlYXRlPC9mdW5jdGlvbj4gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyBlbXB0eQpjaGFyYWN0ZXIgc2V0IG9iamVjdC4KQEAKCkBSRVRACQl2b2lkCkBGVU5DQAkJRmNDaGFyU2V0RGVzdHJveQpAVFlQRTFACQlGY0NoYXJTZXQgKgkJQEFSRzFACQlmY3MKQFBVUlBPU0VACURlc3Ryb3kgYSBjaGFyYWN0ZXIgc2V0CkBERVNDQAo8ZnVuY3Rpb24+RmNDaGFyU2V0RGVzdHJveTwvZnVuY3Rpb24+IGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCAKPHBhcmFtZXRlcj5mY3M8L3BhcmFtZXRlcj4uICBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgemVybywgYWxsCm1lbW9yeSByZWZlcmVuY2VkIGlzIGZyZWVkLgpAQAoKQFJFVEAJCUZjQm9vbCAKQEZVTkNACQlGY0NoYXJTZXRBZGRDaGFyCkBUWVBFMUAJCUZjQ2hhclNldCAqCQlAQVJHMUAJCWZjcwpAVFlQRTJACQlGY0NoYXIzMiAJCUBBUkcyQAkJdWNzNCAKQFBVUlBPU0VACUFkZCBhIGNoYXJhY3RlciB0byBhIGNoYXJzZXQKQERFU0NACjxmdW5jdGlvbj5GY0NoYXJTZXRBZGRDaGFyPC9mdW5jdGlvbj4gYWRkcyBhIHNpbmdsZSB1bmljb2RlIGNoYXIgdG8gdGhlIHNldCwKcmV0dXJuaW5nIEZjRmFsc2Ugb24gZmFpbHVyZSwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIGEgY29uc3RhbnQgc2V0IG9yIGZyb20KcnVubmluZyBvdXQgb2YgbWVtb3J5LiAKQEAKCkBSRVRACQlGY0NoYXJTZXQgKgpARlVOQ0AJCUZjQ2hhclNldENvcHkKQFRZUEUxQAkJRmNDaGFyU2V0ICoJCUBBUkcxQAkJc3JjCkBQVVJQT1NFQAlDb3B5IGEgY2hhcnNldApAREVTQ0AKTWFrZXMgYSBjb3B5IG9mIDxwYXJhbWV0ZXI+c3JjPC9wYXJhbWV0ZXI+OyBub3RlIHRoYXQgdGhpcyBtYXkgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIG1vcmUKdGhhbiBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiA8cGFyYW1ldGVyPnNyYzwvcGFyYW1ldGVyPi4gCkBACgpAUkVUQAkJRmNCb29sCkBGVU5DQAkJRmNDaGFyU2V0RXF1YWwKQFRZUEUxQAkJY29uc3QgRmNDaGFyU2V0ICoJQEFSRzFACQlhCkBUWVBFMkAJCWNvbnN0IEZjQ2hhclNldCAqCUBBUkcyQAkJYgpAUFVSUE9TRUAJQ29tcGFyZSB0d28gY2hhcnNldHMKQERFU0NAClJldHVybnMgd2hldGhlciA8cGFyYW1ldGVyPmE8L3BhcmFtZXRlcj4gYW5kIDxwYXJhbWV0ZXI+YjwvcGFyYW1ldGVyPgpjb250YWluIHRoZSBzYW1lIHNldCBvZiB1bmljb2RlIGNoYXJzLgpAQAoKQFJFVEAJCUZjQ2hhclNldCAqCkBGVU5DQAkJRmNDaGFyU2V0SW50ZXJzZWN0CkBUWVBFMUAJCWNvbnN0IEZjQ2hhclNldCAqCUBBUkcxQAkJYQpAVFlQRTJACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMkAJCWIKQFBVUlBPU0VACUludGVyc2VjdCBjaGFyc2V0cwpAREVTQ0AKUmV0dXJucyBhIHNldCBpbmNsdWRpbmcgb25seSB0aG9zZSBjaGFycyBmb3VuZCBpbiBib3RoCjxwYXJhbWV0ZXI+YTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj5iPC9wYXJhbWV0ZXI+LiAKQEAKCkBSRVRACQlGY0NoYXJTZXQgKgpARlVOQ0AJCUZjQ2hhclNldFVuaW9uCkBUWVBFMUAJCWNvbnN0IEZjQ2hhclNldCAqCUBBUkcxQAkJYQpAVFlQRTJACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMkAJCWIKQFBVUlBPU0VACUFkZCBjaGFyc2V0cwpAREVTQ0AKUmV0dXJucyBhIHNldCBpbmNsdWRpbmcgb25seSB0aG9zZSBjaGFycyBmb3VuZCBpbiBlaXRoZXIgPHBhcmFtZXRlcj5hPC9wYXJhbWV0ZXI+IG9yIDxwYXJhbWV0ZXI+YjwvcGFyYW1ldGVyPi4gCkBACgpAUkVUQAkJRmNDaGFyU2V0ICoKQEZVTkNACQlGY0NoYXJTZXRTdWJ0cmFjdApAVFlQRTFACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMUAJCWEKQFRZUEUyQAkJY29uc3QgRmNDaGFyU2V0ICoJQEFSRzJACQliCkBQVVJQT1NFQAlTdWJ0cmFjdCBjaGFyc2V0cwpAREVTQ0AKUmV0dXJucyBhIHNldCBpbmNsdWRpbmcgb25seSB0aG9zZSBjaGFycyBmb3VuZCBpbiA8cGFyYW1ldGVyPmE8L3BhcmFtZXRlcj4gYnV0IG5vdCA8cGFyYW1ldGVyPmI8L3BhcmFtZXRlcj4uIApAQAoKQFJFVEAJCUZjQm9vbCAKQEZVTkNACQlGY0NoYXJTZXRIYXNDaGFyCkBUWVBFMUAJCWNvbnN0IEZjQ2hhclNldCAqCUBBUkcxQAkJZmNzCkBUWVBFMkAJCUZjQ2hhcjMyIAkJQEFSRzJACQl1Y3M0CkBQVVJQT1NFQAlDaGVjayBhIGNoYXJzZXQgZm9yIGEgY2hhcgpAREVTQ0AKUmV0dXJucyB3aGV0aGVyIDxwYXJhbWV0ZXI+ZmNzPC9wYXJhbWV0ZXI+IGNvbnRhaW5zIHRoZSBjaGFyIDxwYXJhbWV0ZXI+dWNzNDwvcGFyYW1ldGVyPi4gCkBACgpAUkVUQAkJRmNDaGFyMzIKQEZVTkNACQlGY0NoYXJTZXRDb3VudApAVFlQRTFACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMUAJCWEKQFBVUlBPU0VACUNvdW50IGVudHJpZXMgaW4gYSBjaGFyc2V0CkBERVNDQApSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5pY29kZSBjaGFycyBpbiA8cGFyYW1ldGVyPmE8L3BhcmFtZXRlcj4uIApAQAoKQFJFVEAJCUZjQ2hhcjMyCkBGVU5DQAkJRmNDaGFyU2V0SW50ZXJzZWN0Q291bnQKQFRZUEUxQAkJY29uc3QgRmNDaGFyU2V0ICoJQEFSRzFACQlhCkBUWVBFMkAJCWNvbnN0IEZjQ2hhclNldCAqCUBBUkcyQAkJYgpAUFVSUE9TRUAJSW50ZXJzZWN0IGFuZCBjb3VudCBjaGFyc2V0cwpAREVTQ0AKUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRoYXQgYXJlIGluIGJvdGggPHBhcmFtZXRlcj5hPC9wYXJhbWV0ZXI+IGFuZCA8cGFyYW1ldGVyPmI8L3BhcmFtZXRlcj4uIApAQAoKQFJFVEAJCUZjQ2hhcjMyCkBGVU5DQAkJRmNDaGFyU2V0U3VidHJhY3RDb3VudApAVFlQRTFACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMUAJCWEKQFRZUEUyQAkJY29uc3QgRmNDaGFyU2V0ICoJQEFSRzJACQliCkBQVVJQT1NFQAlTdWJ0cmFjdCBhbmQgY291bnQgY2hhcnNldHMKQERFU0NAClJldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyB0aGF0IGFyZSBpbiA8cGFyYW1ldGVyPmE8L3BhcmFtZXRlcj4gYnV0IG5vdCBpbiA8cGFyYW1ldGVyPmI8L3BhcmFtZXRlcj4uIApAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjQ2hhclNldElzU3Vic2V0CkBUWVBFMUAJCWNvbnN0IEZjQ2hhclNldCAqCUBBUkcxQAkJYQpAVFlQRTJACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMkAJCWIKQFBVUlBPU0VACVRlc3QgZm9yIGNoYXJzZXQgaW5jbHVzaW9uCkBERVNDQApSZXR1cm5zIHdoZXRoZXIgPHBhcmFtZXRlcj5hPC9wYXJhbWV0ZXI+IGlzIGEgc3Vic2V0IG9mIDxwYXJhbWV0ZXI+YjwvcGFyYW1ldGVyPi4gCkBACgpAUkVUQAkJRmNDaGFyMzIKQEZVTkNACQlGY0NoYXJTZXRGaXJzdFBhZ2UKQFRZUEUxQAkJY29uc3QgRmNDaGFyU2V0ICoJQEFSRzFACQlhCkBUWVBFMkAJCUZjQ2hhcjMyW0ZDX0NIQVJTRVRfTUFQX1NJWkVdCUBBUkcyQAltYXAKQFRZUEUzQAkJRmNDaGFyMzIgKgkJQEFSRzNACQluZXh0CkBQVVJQT1NFQAlTdGFydCBlbnVtZXJhdGluZyBjaGFyc2V0IGNvbnRlbnRzCkBERVNDQApCdWlsZHMgYW4gYXJyYXkgb2YgYml0cyBtYXJraW5nIHRoZSBmaXJzdCBwYWdlIG9mIFVuaWNvZGUgY292ZXJhZ2Ugb2YKPHBhcmFtZXRlcj5hPC9wYXJhbWV0ZXI+LiBSZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBhcnJheS4gPHBhcmFtZXRlcj5uZXh0PC9wYXJhbWV0ZXI+IGNvbnRhaW5zIHRoZSBuZXh0IHBhZ2UgaW4gdGhlCmZvbnQuCkBACgpAUkVUQAkJRmNDaGFyMzIKQEZVTkNACQlGY0NoYXJTZXROZXh0UGFnZQpAVFlQRTFACQljb25zdCBGY0NoYXJTZXQgKglAQVJHMUAJCWEKQFRZUEUyQAkJRmNDaGFyMzJbRkNfQ0hBUlNFVF9NQVBfU0laRV0JQEFSRzJACW1hcApAVFlQRTNACQlGY0NoYXIzMiAqCQlAQVJHM0AJCW5leHQKQFBVUlBPU0VACUNvbnRpbnVlIGVudW1lcmF0aW5nIGNoYXJzZXQgY29udGVudHMKQERFU0NACkJ1aWxkcyBhbiBhcnJheSBvZiBiaXRzIG1hcmtpbmcgdGhlIFVuaWNvZGUgY292ZXJhZ2Ugb2YgPHBhcmFtZXRlcj5hPC9wYXJhbWV0ZXI+IGZvciBwYWdlCjxwYXJhbWV0ZXI+Km5leHQ8L3BhcmFtZXRlcj4uIFJldHVybnMgdGhlIGJhc2Ugb2YgdGhlIGFycmF5LiA8cGFyYW1ldGVyPm5leHQ8L3BhcmFtZXRlcj4gY29udGFpbnMgdGhlIG5leHQgcGFnZSBpbgp0aGUgZm9udC4gCkBACg==