LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KQFJFVEAJCUZjQ29uZmlnICoKQEZVTkNACQlGY0luaXRMb2FkQ29uZmlnCkBUWVBFMUAJCXZvaWQKQFBVUlBPU0VACWxvYWQgY29uZmlndXJhdGlvbgpAREVTQ0AKTG9hZHMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbi4KRG9lcyBub3QgbG9hZCBhbnkgZm9udCBpbmZvcm1hdGlvbi4KQEAKCkBSRVRAICAgICAgICAgICBGY0NvbmZpZyAqICAgICAgCkBGVU5DQCAgICAgICAgICBGY0luaXRMb2FkQ29uZmlnQW5kRm9udHMgCkBUWVBFMUAJCXZvaWQKQFBVUlBPU0VACWxvYWQgY29uZmlndXJhdGlvbiBhbmQgZm9udCBkYXRhCkBERVNDQApMb2FkcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGJ1aWxkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKYXZhaWxhYmxlIGZvbnRzLiAgUmV0dXJucyB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24uCkBACgpAUkVUQCAgICAgICAgICAgRmNCb29sICAgICAgIApARlVOQ0AgICAgICAgICAgRmNJbml0IApAVFlQRTFACQl2b2lkCkBQVVJQT1NFQAlpbml0aWFsaXplIGZvbnRjb25maWcgbGlicmFyeQpAREVTQ0AKTG9hZHMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgZm9udHMgcmVmZXJlbmNlZCB0aGVyZWluIGFuZApzZXRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gdGhhdCByZXN1bHQuICBSZXR1cm5zIHdoZXRoZXIgdGhpcwpwcm9jZXNzIHN1Y2NlZWRlZCBvciBub3QuICBJZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGhhcyBhbHJlYWR5CmJlZW4gbG9hZGVkLCB0aGlzIHJvdXRpbmUgZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIEZjVHJ1ZS4KQEAKCkBSRVRAICAgICAgICAgICBpbnQgICAgICAgCkBGVU5DQCAgICAgICAgICBGY0dldFZlcnNpb24gCkBUWVBFMUAJCXZvaWQKQFBVUlBPU0VACWxpYnJhcnkgdmVyc2lvbiBudW1iZXIKQERFU0NAClJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5LgpAQAoKQFJFVEAgICAgICAgICAgIEZjQm9vbCAgICAgICAKQEZVTkNAICAgICAgICAgIEZjSW5pdFJlaW5pdGlhbGl6ZSAKQFRZUEUxQAkJdm9pZApAUFVSUE9TRUAJcmUtaW5pdGlhbGl6ZSBsaWJyYXJ5CkBERVNDQApGb3JjZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIHRvIGJlIHJlbG9hZGVkIGFuZCByZXNldHMgdGhlIGRlZmF1bHQKY29uZmlndXJhdGlvbi4KQEAKCkBSRVRAICAgICAgICAgICBGY0Jvb2wgICAgICAgCkBGVU5DQCAgICAgICAgICBGY0luaXRCcmluZ1VwdG9EYXRlIApAVFlQRTFACQl2b2lkCkBQVVJQT1NFQAlyZWxvYWQgY29uZmlndXJhdGlvbiBmaWxlcyBpZiBuZWVkZWQKQERFU0NACkNoZWNrcyB0aGUgcmVzY2FuIGludGVydmFsIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNoZWNraW5nIHRoZQpjb25maWd1cmF0aW9uIGlmIHRoZSBpbnRlcnZhbCBoYXMgcGFzc2VkIGFuZCByZWxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaWYKd2hlbiBhbnkgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCkBACg==