CVRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIFdpbmUgZGVidWdnZXIuICBNYW55IHBpZWNlcyBoYXZlIGJlZW4Kc2hhbWVsZXNzbHkgc3RvbGVuIC0gdGhlIHJldmVyc2UgYXNzZW1iZXIgd2FzIHN0b2xlbiBmcm9tIE1hY2ggbW9yZSBvcgpsZXNzIGludGFjdC4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGFyZSB0d28gdmFyaWFibGVzIHRoYXQgYXJlIHNldApkaWZmZXJlbnRseSBpZiB5b3UgYXJlIHJldmVyc2UgYXNzZW1ibGluZyAxNiBiaXQgY29kZSwgYW5kIG9uIHRoZQp3aG9sZSBpdCBzZWVtcyB0byB3b3JrLgoKTkVXUzoKCglUaGUgaW50ZXJuYWwgZGVidWdnZXIgaGFzICp0b25zKiBtb3JlIGNhcGFiaWxpdHkgdGhhbiBpdCBkaWQgYmVmb3JlLgpJIGhhdmUgZW5jbG9zZWQgc29tZSBleGFtcGxlcyB0aGF0IHNob3cgdXNhZ2UgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCk5ldyBmZWF0dXJlcyBpbmNsdWRlOgoKCTEpIEFiaWxpdHkgb2YgZGVidWdnZXIgdG8gcmVhZCBkZWJ1ZyBpbmZvcm1hdGlvbiBmcm9tIHdpbmUgZXhlY3V0YWJsZQoqYW5kKiBmcm9tIFdpbjMyIGV4ZWN1dGFibGVzLiAgTG9jYWwgdmFyaWFibGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzCmFsc28gcmVhZCBhbmQgcHJvY2Vzc2VkLgoKCTIpIFRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBpcyBjYXBhYmxlIG9mICdzdGVwcGluZycgdG8gdGhlIG5leHQKbGluZSBudW1iZXIsIGp1c3QgbGlrZSBnZGIuICBFeGFtcGxlcyBvZiB0aGUgY29tbWFuZHMgYXJlOgoKCXN0ZXAKCXN0ZXBpCglzaQoJc3RlcCAzCglzaSA1CgluZXh0CgluZXh0aQoJY29udCA0CglmaW5pc2gKCkFsbCBvZiB0aGVzZSBzaG91bGQgYmUgZXhhY3RseSBsaWtlIGhvdyBnZGIgZG9lcyB0aGluZ3MuCgoJMykgVGhlIGludGVybmFsIGRlYnVnZ2VyIG5vdyBoYXMgYSBzZW5zZSBvZiB3aGF0IHNvdXJjZSBmaWxlIGFuZCBsaW5lCm51bWJlciBhIGdpdmVuIFBDIGlzIGF0LiAgTmV3IGNvbW1hbmRzIHRvIHN1cHBvcnQgdGhpcyBhcmUganVzdCBsaWtlIGdkYiwKYW5kIGluY2x1ZGU6CgoJbGlzdAoJZGlyCglzaG93IGRpcgoKdGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBmb3JtYXRzIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGxpc3QgY29tbWFuZC4gIEFsbApwZXJtdXRhdGlvbnMgc3VwcG9ydGVkIGJ5IGdkYiBzaG91bGQgYWxzbyBiZSBzdXBwb3J0ZWQuCgoJNCkgVGhlIGludGVybmFsIGRlYnVnZ2VyIGtub3dzIGFib3V0IGRhdGF0eXBlcyBvZiB2YXJpb3VzIG9iamVjdHMsCmZvciBib3RoIFdpbjMyICphbmQqIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHdpbmUgZXhlY3V0YWJsZSBpdHNlbGYuCkkgaGF2ZSBlbmNsb3NlZCBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIHdvcmtzIGF0IHRoZSBlbmQuCgoJNSkgVGhlcmUgYXJlIG1vcmUgd2F5cyB0aGUgJ2InIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gc2V0IGJyZWFrcG9pbnRzLgpFeGFtcGxlcyBhcmU6CgoJYiAqMHg4MTkwMDAwCgliIDExMDAKCWIgVXNhZ2UKCWIKCkkgZG9uJ3QgdGhpbmsgdGhpcyBjb3ZlcnMgYWxsIG9mIHRoZSBwZXJtdXRhdGlvbnMgdGhhdCBnZGIgYWNjZXB0cyAodGhpcyBzaG91bGQKYmUgY2xlYW5lZCB1cCBzb21lZGF5IHNvIHRoYXQgYWxsIHBvc3NpYmlsaXRpZXMgYXJlIGFjY2VwdGFibGUpLgoKCTYpICBUaGUgJ3ByaW50JyBhbmQgJ3gnIGNvbW1hbmRzIHNob3VsZCBiZWhhdmUgbW9yZSBvciBsZXNzIGV4YWN0bHkKYXMgdGhleSBkbyB1bmRlciBnZGIuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSB3YXkgdGhlIGRhdGEgaXMgcHJlc2VudGVkCndpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50LCBidXQgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIGZ1bmRhbWVudGFsbHkgdGhlIHNhbWUuCgoJNykgVGhlIGludGVybmFsIGRlYnVnZ2VyIG5vdyBzdXBwb3J0cyBjb25kaXRpb25hbCBicmVha3BvaW50cywgYW5kCmF1dG9tYXRpYyBkaXNwbGF5IGV4cHJlc3Npb25zLiAgQW4gZXhhbXBsZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gIFRoZQpzeW50YXggYW5kIHVzYWdlIHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhhdCBvZiBnZGIuCgpOT1RFUzoKCglJZiBpdCB3ZXJlbid0IGZvciB0aGUgZmFjdCB0aGF0IGdkYiBkb2Vzbid0IGdyb2sgdGhlIFdpbjMyIGRlYnVnCmluZm9ybWF0aW9uLCB5b3UgY291bGQganVzdCB1c2UgZ2RiLiAgVGhlIGludGVybmFsIGRlYnVnZ2VyIHNob3VsZCBiZSBhYmxlCnRvIHJlYWQgYW5kIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGJvdGggV2luMzIgYW5kIGFsc28gZm9yIHRoZQpXaW5lIGV4ZWN1dGFibGUsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBkZWJ1ZyB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3bwp0b2dldGhlciBhcyBpZiBpdCB3ZXJlIG9uZSBsYXJnZSAodmVyeSBsYXJnZSkgZW50aXR5LgoKTElNSVRBVElPTlMgQU5EIERJRkZFUkVOQ0VTIEZST00gR0RCOgoKCVlvdSBjYW5ub3QgdXNlIHR5cGUgY2FzdHMgaW4gZXhwcmVzc2lvbnMgdGhhdCB5b3UgZ2l2ZSB0byB0aGUKZGVidWdnZXIuICBUaGUgaGFyZGVzdCBwYXJ0IGFib3V0IGFkZGluZyBzdXBwb3J0IGZvciB0aGlzIGlzIGZpeGluZwp0aGUgcGFyc2VyL2xleGVyIHRvIGtub3cgd2hlbiBpdCBpcyBoYW5kbGluZyBhIHR5cGUgY2FzdCwgYW5kIHdoZW4gaXQKaXMgaGFuZGxpbmcgYW55IG90aGVyIHR5cGUgb2YgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLiAgV2l0aCBsZXhlcgpzdGF0ZXMsIGl0IG1heSBiZSBwb3NzaWJsZSB0byBrZWVwIHRyYWNrIG9mIHdoYXQgd2Ugd291bGQgZXhwZWN0IGF0CmFueSBnaXZlbiBtb21lbnQsIGJ1dCBpdCB3b3VsZCBiZSB0ZWRpb3VzIHRvIGdvIHRocm91Z2ggYW5kIG1ha2Ugc3VyZQp0aGF0IHRoZSBzdGF0ZSBpcyBzZXQgdXAgY29ycmVjdGx5IGZvciBhbGwgb2YgdGhlIGRpZmZlcmVudCBvcGVyYXRvcnMKYW5kIGNoYXJhY3RlcnMgdGhhdCB3ZSBhY2NlcHQsIGFuZCBJIGFtIG5vdCB5ZXQgY29udmluY2VkIHRoYXQgdGhpcyB3b3VsZApldmVuIHdvcmsuCgoJWW91IGNhbm5vdCBzZXQgYSBicmVha3BvaW50IGJ5IGZpbGUgYW5kIGxpbmUgbnVtYmVyIGFzIHlvdSBjYW4Kd2l0aCBnZGIuICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhpcyB3b3VsZG4ndCBiZSBhbGwgdGhhdCB0b3VnaCwgSSBndWVzcywgYnV0Cml0IHdvdWxkIGJlIGEgbnVpc2FuY2UuICAgWW91IGNhbiBzZXQgYSBicmVha3BvaW50IGdpdmVuIGEgZnVuY3Rpb24gYW5kCmxpbmUgbnVtYmVyLCBob3dldmVyLiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAnYiBtYWluOjI5OTMnLiAgSXQgdHVybnMgb3V0CnRoYXQgdGhlIHdheSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhcnJhbmdlZCBpdCBpcyBhIHdob2xlIGxvdAplYXNpZXIgdG8gZG8gdGhpbmdzIGluIHRoaXMgd2F5IHRoYW4gaXQgd291bGQgYmUgdG8gdHJ5IGFuZCBnZXQgdGhlCnNvdXJjZTpsaW5lIHR5cGUgb2YgYnJlYWtwb2ludCB3b3JraW5nLCBidXQgaXQgd291bGQgcHJvYmFibHkgYmUgd29ydGggaXQKdG8gdHJ5LgoKCUdldHRpbmcgc3RhY2sgdHJhY2VzIHRocm91Z2ggV2luZSBpdHNlbGYgY2FuIGJlIGEgYml0IHRyaWNreS4KVGhpcyBpcyBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIHRoaW5nIGlzIGJ1aWx0IHdpdGggb3B0aW1pemF0aW9uCmVuYWJsZWQsIGFuZCBhcyBhIHJlc3VsdCBzb21ldGltZXMgZnVuY3Rpb25zIGRvbid0IGdldCBmcmFtZXMsIGFuZApsb3RzIG9mIHZhcmlhYmxlcyBhcmUgb3B0aW1pemVkIGludG8gcmVnaXN0ZXJzLiAgWW91IGNhbiB0dXJuIG9mZgpvcHRpbWl6YXRpb24gZm9yIGEgZmV3IGtleSBzb3VyY2UgZmlsZXMgaWYgaXQgd2lsbCBoZWxwIHlvdS4KCglNZW1vcnkgY29uc3VtcHRpb24gaXMgZ2V0dGluZyB0byBiZSBhIHJlYWwgcHJvYmxlbS4gIEkgdGhpbmsgMzJNYiBpcwpubyBsb25nZXIgc3VmZmljaWVudCB0byBkZWJ1ZyB3aW5lIC0gNDggb3IgNjQgaXMgcHJvYmFibHkgYSB3aG9sZSBsb3QgYmV0dGVyLgpVbmZvcnR1bmF0ZWx5IEkgY2Fubm90IHNodXQgZG93biBYIHRvIHNhdmUgbWVtb3J5IDotKS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRVhBTVBMRVM6CgoJSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyBJIHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBXaW5lLiAgVGhlIHByb2dyYW0KaXMgc29tZXRoaW5nIHRoYXQganVzdCBtYXBzIGFuZCBkdW1wcyB0aGUgY29udGVudHMgb2YgYSBXaW4zMiBleGVjdXRhYmxlLgpJdCB3YXMgZHlpbmcgZm9yIHNvbWUgcmVhc29uLgoKU3RhcnQgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaC4KCmJhc2gkIGxzIC1sIGR1bXBleGUuZXhlIAotcnctcnctci0tICAgMSBlcmljICAgICBkZXZlbCAgICAgIDE2ODQ0OCBKYW4gIDQgMTM6NTEgZHVtcGV4ZS5leGUKYmFzaCQgLi93aW5lIC1kZWJ1ZyAnLi9kdW1wZXhlLmV4ZSAtc3ltYm9sIC4vZHVtcGV4ZS5leGUnCldhcm5pbmc6IGludmFsaWQgZGlyICdlOlx0ZXN0JyBpbiBwYXRoLCBkZWxldGluZyBpdC4KV2luMzIgdGFzayAnVzMyU1hYWFgnOiBCcmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MApMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAuL3dpbmUuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWHBtLnNvLjQuNi4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJTTS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliSUNFLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYZXh0LnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYMTEuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGlibS5zby41LjAuNS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvbGliL2xpYmMuc28uNS4yLjE4Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGQtbGludXguc28uMS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBXaW4zMiBmaWxlIC4vZHVtcGV4ZS5leGUuLi4KU3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKQpJbiAzMiBiaXQgbW9kZS4KKioqIEludmFsaWQgYWRkcmVzcyAweDQxNGM1ZmY4ICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzkzMGVlNmMpCjB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCk6ICBtb3ZsCSVmczowLCVlYXgKV2luZS1kYmc+YiBEdW1wRmlsZQpCcmVha3BvaW50IDIgYXQgMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pCldpbmUtZGJnPmMKRHVtcCBGaWxlOiAuL2R1bXBleGUuZXhlClN0b3BwZWQgb24gYnJlYWtwb2ludCAyIGF0IDB4MDgxYTAwNzggKER1bXBGaWxlKzB4OSBbZHVtcGV4ZS5jOjI3MjNdKQpFbnRlciBwYXRoIHRvIGZpbGUgZHVtcGV4ZS5jOiAuLi9kZQoyNzIzCQlIQU5ETEUJCQkgIGhGaWxlID0gTlVMTDsKMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pOiAgbW92bAkkMHgwLDB4ZmZmZmZmZjQoJWVicCkKV2luZS1kYmc+bGlzdAoyNzIzCQlIQU5ETEUJCQkgIGhGaWxlID0gTlVMTDsKMjcyNAkJSEFORExFCQkJICBoTWFwICA9IE5VTEw7CjI3MjUJCVBTVFIJCQkgIGxwTWFwID0gTlVMTDsKMjcyNgkJRFdPUkQJCQkgIGR3RmlsZVNpemUgICAgID0gMDsKMjcyNwkJRFdPUkQJCQkgIGR3RmlsZVNpemVIaWdoID0gMDsKMjcyOAkKMjcyOQkJUElNQUdFX0RPU19IRUFERVIJICBscEltYWdlRE9TICA9IE5VTEw7CjI3MzAJCVBJTUFHRV9GSUxFX0hFQURFUgkgIGxwSW1hZ2VGaWxlID0gTlVMTDsKMjczMQkJUElNQUdFX05UX0hFQURFUlMJICBscEltYWdlTlQgICA9IE5VTEw7CjI3MzIJCjI3MzMJCS8qCldpbmUtZGJnPm4gMTAKMjc0NwkJZHdGaWxlU2l6ZSA9IEdldEZpbGVTaXplKGhGaWxlLCAmZHdGaWxlU2l6ZUhpZ2gpOwoweDA4MWEwMGVhIChEdW1wRmlsZSsweDdiIFtkdW1wZXhlLmM6Mjc0N10pOiAgbGVhbAkweGZmZmZmZmYwKCVlYnApLCVlYXgKV2luZS1kYmc+bgoyNzQ5CQkgICAgJiYgKEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKSApDQoweDA4MWEwMGZiIChEdW1wRmlsZSsweDhjIFtkdW1wZXhlLmM6Mjc0OV0pOiAgY21wbAkkLTEsMHhmZmZmZmZlOCglZWJwKQpXaW5lLWRiZz54L2QgZHdGaWxlU2l6ZQp4L2QgZHdGaWxlU2l6ZQ0KIDE2ODQ0OApXaW5lLWRiZz5uCjI3NTgJCQkJCSBQQUdFX1JFQURPTkxZLCAwLCAwLCAoTFBTVFIpIE5VTEwpOwoweDA4MWEwMTI0IChEdW1wRmlsZSsweGI1IFtkdW1wZXhlLmM6Mjc1OF0pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5saXN0IDI3NTAKbGlzdCAyNzUwDQoyNzUwCQl7CjI3NTEJCQlGYXRhbCgiQ2Fubm90IGdldCBzaXplIG9mIGZpbGUgJXMiLCBscEZpbGVOYW1lKTsKMjc1MgkJfQoyNzUzCQkKMjc1NAkJLyoKMjc1NQkJICogbWFwIHRoZSBmaWxlCjI3NTYJCSAqLwoyNzU3CQloTWFwID0gQ3JlYXRlRmlsZU1hcHBpbmcoaEZpbGUsIChMUFNFQ1VSSVRZX0FUVFJJQlVURVMpIE5VTEwsCjI3NTgJCQkJCSBQQUdFX1JFQURPTkxZLCAwLCAwLCAoTFBTVFIpIE5VTEwpOwoyNzU5CQlpZiggaE1hcCA9PSBOVUxMICkKMjc2MAkJewpXaW5lLWRiZz5uCjI3NTkJCWlmKCBoTWFwID09IE5VTEwgKQoweDA4MWEwMTNiIChEdW1wRmlsZSsweGNjIFtkdW1wZXhlLmM6Mjc1OV0pOiAgY21wbAkkMCwweGZmZmZmZmZjKCVlYnApCldpbmUtZGJnPnggaE1hcAogMDhlNDhjMzAKV2luZS1kYmc+bgoyNzY3CQlscE1hcCA9IChMUFNUUikgTWFwVmlld09mRmlsZShoTWFwLCBGSUxFX01BUF9SRUFELCAwLCAwLCAwKTsKMHgwODFhMDE1NiAoRHVtcEZpbGUrMHhlNyBbZHVtcGV4ZS5jOjI3NjddKTogIHB1c2hsCSQweDAKV2luZS1kYmc+bgoyNzY4CQlpZiggbHBNYXAgPT0gTlVMTCApCjB4MDgxYTAxNmIgKER1bXBGaWxlKzB4ZmMgW2R1bXBleGUuYzoyNzY4XSk6ICBjbXBsCSQwLDB4ZmZmZmZmZTAoJWVicCkKV2luZS1kYmc+cHJpbnQgbHBNYXAKMHg0MTRjNWY0MApXaW5lLWRiZz54IGxwTWFwCiA0MDAwNzAwMApXaW5lLWRiZz4geC8xMHggMHg0MDAwNzAwMAogeC8xMHggMHg0MDAwNzAwMA0KMHg0MDAwNzAwMCAof0tFUk5FTDMyX05VTExfVEhVTktfREFUQSsweDM3ZTRmZTc0KTogKioqIEludmFsaWQgYWRkcmVzcyAweDQwMDA3MDAwICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzdlNGZlNzQpCldpbmUtZGJnPnF1aXQKJAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpUaGUgZmlyc3QgdGltZSB0aHJvdWdoLCB3ZSBmaW5kIHRoYXQgTWFwVmlld09mRmlsZSBpc24ndCBtYXBwaW5nIHRoZSBmaWxlCmNvcnJlY3RseSBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuICBUcnkgcnVubmluZyBhZ2FpbiwgYW5kIHN0ZXAgaW50bwpNYXBWaWV3T2ZGaWxlIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZW50IHdyb25nLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKYmFzaCQgLi93aW5lIC1kZWJ1ZyAnLi9kdW1wZXhlLmV4ZSAtc3ltYm9sIC4vZHVtcGV4ZS5leGUnCldhcm5pbmc6IGludmFsaWQgZGlyICdlOlx0ZXN0JyBpbiBwYXRoLCBkZWxldGluZyBpdC4KV2luMzIgdGFzayAnVzMyU1hYWFgnOiBCcmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MApMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAuL3dpbmUuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWHBtLnNvLjQuNi4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJTTS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliSUNFLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYZXh0LnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYMTEuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGlibS5zby41LjAuNS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvbGliL2xpYmMuc28uNS4yLjE4Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGQtbGludXguc28uMS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBXaW4zMiBmaWxlIC4vZHVtcGV4ZS5leGUuLi4KU3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKQpJbiAzMiBiaXQgbW9kZS4KKioqIEludmFsaWQgYWRkcmVzcyAweDQxNGM1ZmY4ICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzkzMGVlNmMpCjB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCk6ICBtb3ZsCSVmczowLCVlYXgKV2luZS1kYmc+YiBEdW1wRmlsZToyNzY3CkJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCldpbmUtZGJnPmMKRHVtcCBGaWxlOiAuL2R1bXBleGUuZXhlDQpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCkVudGVyIHBhdGggdG8gZmlsZSBkdW1wZXhlLmM6IC4uL2RlCjI3NjcJCWxwTWFwID0gKExQU1RSKSBNYXBWaWV3T2ZGaWxlKGhNYXAsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOwoweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5zdGVwCjM5MAkwMzg1IHN0ZGNhbGwgTWFwVmlld09mRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1hcFZpZXdPZkZpbGUKMHgwODBkNzkzYyAoS0VSTkVMMzJfMzg1IFtrZXJuZWwzMi5zcGVjOjM5MF0pOiAgcHVzaGwJJWVicApXaW5lLWRiZz5zdGVwCjIyMwkgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKMHgwODBjODNkYyAoUkVMQVlfRGVidWdDYWxsRnJvbTMyKzB4YyBbcmVsYXkuYzoyMjNdKTogIGNtcHcJJDAsMHg2NDRhCldpbmUtZGJnPgoyNDQJfQoweDA4MGM4NDhlIChSRUxBWV9EZWJ1Z0NhbGxGcm9tMzIrMHhiZSBbcmVsYXkuYzoyNDRdKTogIGxlYWwJMHhmZmZmZmZmNCglZWJwKSwlZXNwCldpbmUtZGJnPgoxMDMJICAgIHJldHVybiBNYXBWaWV3T2ZGaWxlRXgoaGFuZGxlLGFjY2VzcyxvZmZoaSxvZmZsbyxzaXplLDApOwoweDA4MDkxMWE0IChNYXBWaWV3T2ZGaWxlKzB4MTQgW2ZpbGUuYzoxMDNdKTogIHB1c2hsCSQweDAKV2luZS1kYmc+CjExMwkgICAgRklMRU1BUF9PQkpFQ1QgKmZtYXAgPSAoRklMRU1BUF9PQkpFQ1QqKWhhbmRsZTsKMHgwODA5MTFjZiAoTWFwVmlld09mRmlsZUV4KzB4ZiBbZmlsZS5jOjExM10pOiAgbW92bAkweDgoJWVicCksJWVzaQpXaW5lLWRiZz5uCjExNQkgICAgaWYgKCFzaXplKSBzaXplID0gZm1hcC0+c2l6ZTsKMHgwODA5MTFkMiAoTWFwVmlld09mRmlsZUV4KzB4MTIgW2ZpbGUuYzoxMTVdKTogIHRlc3RsCSVlYngsJWVieApXaW5lLWRiZz5saXN0Cmxpc3QNCjExNQkgICAgaWYgKCFzaXplKSBzaXplID0gZm1hcC0+c2l6ZTsKMTE2CSAgICBpZiAoIXNpemUpIHNpemUgPSAxOwoxMTcJICAgIHJldHVybiBtbWFwICgoY2FkZHJfdClzdCwgc2l6ZSwgZm1hcC0+cHJvdCwgCjExOAkgICAgICAgICAgICAgICAgIE1BUF9BTk9OfE1BUF9QUklWQVRFLCAKMTE5CQkJIEZJTEVfR2V0VW5peEhhbmRsZShmbWFwLT5oZmlsZSksCjEyMAkJCSBvZmZsbyk7CjEyMQl9CjEyMgkKMTIzCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoxMjQJICogICAgICAgICAgIFVubWFwVmlld09mRmlsZSAgICAgICAgICAgICAgICAgIChLRVJORUwzMi4zODUpCjEyNQkgKi8KV2luZS1kYmc+eCBzaXplCiAwMDAwMDAwMApXaW5lLWRiZz5uCjExNgkgICAgaWYgKCFzaXplKSBzaXplID0gMTsKMHgwODA5MTFkOSAoTWFwVmlld09mRmlsZUV4KzB4MTkgW2ZpbGUuYzoxMTZdKTogIHRlc3RsCSVlYngsJWVieApXaW5lLWRiZz54IHNpemUKIDAwMDAwMDAwCldpbmUtZGJnPm4KMTE3CSAgICByZXR1cm4gbW1hcCAoKGNhZGRyX3Qpc3QsIHNpemUsIGZtYXAtPnByb3QsIAoweDA4MDkxMWUyIChNYXBWaWV3T2ZGaWxlRXgrMHgyMiBbZmlsZS5jOjExN10pOiAgcHVzaGwJJWVheApXaW5lLWRiZz54IHNpemUKIDAwMDAwMDAwCldpbmUtZGJnPmluZm8gbG9jYWwKTWFwVmlld09mRmlsZUV4OmhhbmRsZSA9PSAweDA4ZTQ4YzkwCk1hcFZpZXdPZkZpbGVFeDphY2Nlc3MgPT0gMHgwMDAwMDAwNApNYXBWaWV3T2ZGaWxlRXg6b2ZmaGkgPT0gMHgwMDAwMDAwMApNYXBWaWV3T2ZGaWxlRXg6b2ZmbG8gPT0gMHgwMDAwMDAwMApNYXBWaWV3T2ZGaWxlRXg6c2l6ZSA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpzdCA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpvZmZsbyBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWF4IApNYXBWaWV3T2ZGaWxlRXg6c2l6ZSBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWJ4IApNYXBWaWV3T2ZGaWxlRXg6c3Qgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJGVkaSAKTWFwVmlld09mRmlsZUV4OmZtYXAgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJGVzaSAKV2luZS1kYmc+cHJpbnQgJGVieAoweDAwMDEKV2luZS1kYmc+YnQKYnQNCkJhY2t0cmFjZToKPT4wIDB4MDgwOTExZTIgKE1hcFZpZXdPZkZpbGVFeCsweDIyIFtmaWxlLmM6MTE3XSkKICAxIDB4MDgwOTExYjAgKE1hcFZpZXdPZkZpbGUrMHgyMChoYW5kbGU9MHg4ZTQ4YzkwLCBhY2Nlc3M9MHg0LCBvZmZoaT0weDAsIG9mZmxvPTB4MCwgc2l6ZT0weDApIFtmaWxlLmM6MTA0XSkKICAyIDB4MDgxMDRhYjUgKENhbGxGcm9tMzJfc3RkY2FsbF81KzB4MjUgW2NhbGxmcm9tMzIuc10pCiAgMyAweDA4MWEwMTY4IChEdW1wRmlsZSsweGY5KGxwRmlsZU5hbWU9MHg0MTRjNjFlZCkgW2R1bXBleGUuYzoyNzY3XSkKICA0IDB4MDgxYTBjMzUgKG1haW4rMHg0MTAoYXJnYz0weDMsIGFyZ3Y9MHg0MTRjNjFjYykgW2R1bXBleGUuYzozMDc4XSkKICA1IDB4MDgxYTM1MTQgKF9tYWluQ1JUU3RhcnR1cCsweGM0KQogIDYgMHgwODEwNTQ5ZiAoQ29kZV9TdGFydCsweDEzIFtjYWxsdG8zMi5zXSkKICA3IDB4MDgwMmZkYWMgKFRBU0tfQ2FsbFRvU3RhcnQrMHg4YyBbdGFzay5jOjM3M10pCgpXaW5lLWRiZz4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKTm90aWNlIHRoYXQgeW91IGNhbiBzdGVwIHRocm91Z2ggdGhlIHRodW5rcyBpbnRvIG91ciBvd24gdHJhbnNmZXIKcm91dGluZXMuICAgWW91IHdpbGwgbm90aWNlIHRoYXQgdGhlIHNvdXJjZSBsaW5lIGRpc3BsYXlzIGFzIHNvbWV0aGluZwpsaWtlOgoKMzkwCTAzODUgc3RkY2FsbCBNYXBWaWV3T2ZGaWxlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTWFwVmlld09mRmlsZQoKVGhpcyBpcyBqdXN0IHRoZSBzb3VyY2UgbGluZSBmcm9tIHRoZSBzcGVjIGZpbGUgdGhhdCBjYXVzZWQgdGhlIHRyYW5zZmVyCnJvdXRpbmUgdG8gYmUgZ2VuZXJhdGVkLiAgRnJvbSB0aGlzIHlvdSBjYW4gc3RlcCBhZ2FpbiwgYW5kIHlvdSBzdGVwCmludG8gdGhlIHJlbGF5IGxvZ2dpbmcgY29kZSAtIGtlZXAgc3RlcHBpbmcgYW5kIHlvdSBldmVudHVhbGx5IHN0ZXAgaW50bwp0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgZGlydHkgd29yay4KCglBdCB0aGlzIHBvaW50IGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBzb3VyY2UgdG8gdGhlIFdpbjMyIHByb2dyYW0KYW5kIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBzb3VyY2UgdG8gd2luMzIvZmlsZS5zIHNob3dlZCB3aGVyZSB0aGUgcHJvYmxlbQp3YXMuICBXaGVuIHlvdSBzcGVjaWZ5IDAgZm9yIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gQ3JlYXRlRmlsZU1hcHBpbmcsCml0IGlzIHN1cHBvc2VkIHRvIHVzZSB0aGUgZW50aXJlIHNpemUgb2YgdGhlIGZpbGUgYXMgdGhlIHNpemUgb2YgdGhlCm9iamVjdC4gIEluc3RlYWQgd2Ugd2VyZSBqdXN0IGJsaW5kbHkgY29weWluZyB0aGUgbnVtYmVyIG92ZXIuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpXaW5lLWRiZz5iIG1haW4KQnJlYWtwb2ludCAxIGF0IDB4MDgwMTA4YzAgKG1haW4gW2RiZ21haW4uYzoyMTNdKQpXaW5lLWRiZz5wcmludCBicmVha3BvaW50c1sxXQp7YWRkcj17dHlwZT0weDA4MDQzMDAwLCBzZWc9MCwgb2ZmPTEzNDI4NTUwNH0sIGFkZHJsZW49JyAnLCBvcGNvZGU9J1UnLCBlbmFibGVkPTEsIHNraXBjb3VudD0wLCBpbl91c2U9MX0KCldpbmUtZGJnPiBwcmludCBicmVha3BvaW50c1sxXS5lbmFibGVkCjEKV2luZS1kYmc+c2V0IGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQgPSAwCldpbmUtZGJnPnByaW50IGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQKMAoKV2luZS1kYmc+cHJpbnQgdHlwZV9oYXNoX3RhYmxlWzFdLT50eXBlClNUUlVDVAoKV2luZS1kYmc+cHJpbnQgdHlwZV9oYXNoX3RhYmxlWzFdCjB4MDgwNzIwMjAKV2luZS1kYmc+cHJpbnQgKnR5cGVfaGFzaF90YWJsZVsxXQpwcmludCAqdHlwZV9oYXNoX3RhYmxlWzFdDQp7dHlwZT1TVFJVQ1QsIG5leHQ9MHgwMDAwMDAwMCwgbmFtZT0iTE9HUEFMRVRURSIsIHVuPXtiYXNpYz17YmFzaWNfdHlwZT04LCBvdXRwdXRfZm9ybWF0PSKgVh0IoE0dCCIsIGJhc2ljX3NpemU9LTEyOCwgYl9zaWduZWQ9MH0sIGJpdGZpZWxkPXtiaXRvZmY9OCwgbmJpdHM9MCwgYmFzZXR5cGU9MHgwODFkNTZjMH0sIHBvaW50ZXI9e3BvaW50c3RvPTB4MDAwMDAwMDh9LCBmdW5jdD17cmV0dHlwZT0weDAwMDAwMDA4fSwgYXJyYXk9e3N0YXJ0PTgsIGVuZD0xMzYxNDA0ODAsIGJhc2ljdHlwZT0weDA4MDQzZTgwfSwgc3RydWN0dXJlPXtzaXplPTgsIG1lbWJlcnM9MHgwODFkNTZjMH0sIGVudW1lcmF0aW9uPXttZW1iZXJzPTB4MDAwMDAwMDh9fX0KV2luZS1kYmc+CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB5b3UgY2FuIHByaW50IG91dCB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4KTm90ZSB0aGF0IGVudW1lcmF0ZWQgdHlwZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgc3ltYm9saWMgZm9ybSwgYW5kIHN0cmluZ3MKYXJlIGRpc3BsYXllZCBpbiB0aGUgZXhwZWN0ZWQgbWFubmVyLgoKCVlvdSBjYW4gdXNlIHRoZSBzZXQgY29tbWFuZCB0byBzZXQgbW9yZSBvciBsZXNzIGFueXRoaW5nLiAgTm90ZQpob3dldmVyIHRoYXQgeW91IGNhbm5vdCB1c2UgZW51bWVyYXRlZCB0eXBlcyBvbiB0aGUgUkhTIG9mIHRoZSBleHByZXNzaW9uLgoKCUZpbmFsbHksIHR5cGUgY2FzdHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIHRoZSBleHByZXNzaW9uCmhhbmRsaW5nLiAgVGhlcmUgaXMgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBzdG9yZWQgaW50ZXJuYWxseSB0byBiZQphYmxlIHRvIGhhbmRsZSB0aGlzIC0gdGhlIG1haW4gY2hhbGxlbmdlIGlzIHRoYXQgdGhlIHBhcnNlciB3b3VsZApuZWVkIHRvIGJlIGZpeGVkIHRvIGNvcnJlY3RseSBwYXJzZSB0aGUgdHlwZSBjYXN0LgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCldpbmUtZGJnPmxpc3QKMjk4NiAgICAgICAgICAgIGlmKCBhcmdjIDw9IDEgKQoyOTg3ICAgICAgICAgICAgewoyOTg4ICAgICAgICAgICAgICAgICAgICBVc2FnZShhcmd2WzBdKTsKMjk4OSAgICAgICAgICAgIH0KMjk5MAoyOTkxICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7IGkrKyApCjI5OTIgICAgICAgICAgICB7CjI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKMjk5NCAgICAgICAgICAgICAgICAgICAgewoyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERtcEN0cmwuYkR1bXBET1NIZWFkZXIgPSBUUlVFOwoyOTk2ICAgICAgICAgICAgICAgICAgICB9CldpbmUtZGJnPmIgMjk5MwpCcmVha3BvaW50IDMgYXQgMHgwODFhODg2MSAobWFpbisweDNjIFtkdW1wZXhlLmM6Mjk5M10pCldpbmUtZGJnPmNvbmRpdGlvbiAzIGkgPT0gMgpXaW5lLWRiZz5jClN0b3BwZWQgb24gYnJlYWtwb2ludCAzIGF0IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQoyOTkzICAgICAgICAgICAgICAgICAgICBpZiggc3RybmNtcChhcmd2W2ldLCAiLWRvcyIsIHNpemVvZigiLWRvcyIpIC0gMSkgPT0gMCApCjB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKTogIHB1c2hsICQweDQKV2luZS1kYmc+cHJpbnQgaQoyCldpbmUtZGJnPnByaW50IGFyZ3ZbaV0KIi4vZHVtcGV4ZS5leGUiCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMuCglIZXJlIGlzIGFub3RoZXIgb25lIHRoYXQgZGVtb25zdHJhdGVzIGFub3RoZXIgY29vbCBmZWF0dXJlCgljb25kaXRpb25hbCBicmVha3BvaW50cyB0aGF0IGludm9sdmUgYSBmdW5jdGlvbiBjYWxsOgoKCQljb25kaXRpb24gMyBzdHJjbXAoYXJndltpXSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKV2luZS1kYmc+bGlzdAoyOTg2ICAgICAgICAgICAgaWYoIGFyZ2MgPD0gMSApCjI5ODcgICAgICAgICAgICB7CjI5ODggICAgICAgICAgICAgICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwoyOTg5ICAgICAgICAgICAgfQoyOTkwCjI5OTEgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgYXJnYzsgaSsrICkKMjk5MiAgICAgICAgICAgIHsKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoyOTk0ICAgICAgICAgICAgICAgICAgICB7CjI5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG1wQ3RybC5iRHVtcERPU0hlYWRlciA9IFRSVUU7CjI5OTYgICAgICAgICAgICAgICAgICAgIH0KV2luZS1kYmc+YiAyOTkzCkJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKV2luZS1kYmc+Y29uZGl0aW9uIDMgc3RyY21wKGFyZ3ZbaV0sICIuL2R1bXBleGUuZXhlIikgPT0gMApXaW5lLWRiZz5pbmZvIGJyZWFrCkJyZWFrcG9pbnRzOgoxOiB5IDB4MDgxYWI0NTAgKF9tYWluQ1JUU3RhcnR1cCkKMjogeSAweDA4MWE4ODJlIChtYWluKzB4OSBbZHVtcGV4ZS5jOjI5ODZdKQozOiB5IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQogICAgICAgICAgICAgICAgc3RvcCB3aGVuICAoIHN0cmNtcCgoIGFyZ3ZbaV0gKSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwICkKV2luZS1kYmc+YwpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSk6ICBwdXNobCAkMHg0CldpbmUtZGJnPnByaW50IGkKMgpXaW5lLWRiZz5wcmludCBhcmd2W2ldICAKIi4vZHVtcGV4ZS5leGUiCldpbmUtZGJnPgo=