Mw0NCgxae2MevQAA4wAAAAAAAAAAAAAAAAwAAABAAAAAc8gBAABkAFoAZAFkAmwBWgFkAWQCbAJaAmQBZAJsA1oDZAFkAmwEWgRkAWQCbAVaBWQBZAJsBloGZAFkAmwHWgdkAWQCbAhaCGQBZAJsCVoJZANaCmUEagtqDGQEZAWDAloNZQRqC2oMZAZkB4MCWg5kCFoPZAlkCmkBWhBkCmQKZAtkC2QLZAycBVoRZA1kC2kBWhJlBWoTZA6DAVoUZQVqE2QPgwFaFWQQZBFkEmUPZBNkFGQVZgdaFmRGZBdkGIQBWhdkGWQahABaGGRHZBxkHYQBWhlkSGQeZB+EAVoaZElkIGQhhAFaG2RKZCJkI4QBWhxkS2QkZCWEAVodZExkJmQnhAFaHmQoZCmEAFofZCpkK4QAWiBkTWQsZC2EAVohZC5kL4QAWiJkMGQxhABaI2QyZDOEAFokZDRkNYQAWiVkNmQ3hABaJmQ4ZDmEAFonZDpkO4QAWihkPGQ9hABaKXkQZAFkPmwqbStaKwEAVwBuJgQAZSxrCpABcpQBAAEAAQBHAGQ/ZECEAGRAZS2DA1orWQBuAlgARwBkQWRChABkQmUtgwNaLmUugwBaL2RDZESEAFowZTFkRWsCkAFyxGUwgwABAGQCUwApTmH7AgAAClRoZSBgYGRpc3Ryb2BgIHBhY2thZ2UgKGBgZGlzdHJvYGAgc3RhbmRzIGZvciBMaW51eCBEaXN0cmlidXRpb24pIHByb3ZpZGVzCmluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBkaXN0cmlidXRpb24gaXQgcnVucyBvbiwgc3VjaCBhcyBhIHJlbGlhYmxlCm1hY2hpbmUtcmVhZGFibGUgZGlzdHJvIElELCBvciB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKSXQgaXMgdGhlIHJlY29tbWVuZGVkIHJlcGxhY2VtZW50IGZvciBQeXRob24ncyBvcmlnaW5hbAo6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgYnV0IGl0IHByb3ZpZGVzIG11Y2ggbW9yZQpmdW5jdGlvbmFsaXR5LiBBbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBiZWNhbWUgbmVjZXNzYXJ5IGJlY2F1c2UgUHl0aG9uCjMuNSBkZXByZWNhdGVkIHRoaXMgZnVuY3Rpb24sIGFuZCBQeXRob24gMy44IHJlbW92ZWQgaXQgYWx0b2dldGhlci4gSXRzCnByZWRlY2Vzc29yIGZ1bmN0aW9uIDpweTpmdW5jOmBwbGF0Zm9ybS5kaXN0YCB3YXMgYWxyZWFkeSBkZXByZWNhdGVkIHNpbmNlClB5dGhvbiAyLjYgYW5kIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4gU3RpbGwsIHRoZXJlIGFyZSBtYW55IGNhc2VzIGluIHdoaWNoCmFjY2VzcyB0byBPUyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24gaXMgbmVlZGVkLiBTZWUgYFB5dGhvbiBpc3N1ZSAxMzIyCjxodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjI+YF8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCukAAAAATnoFMS42LjBaC1VOSVhDT05GRElSegQvZXRjWg1VTklYVVNSTElCRElSeggvdXNyL2xpYnoKb3MtcmVsZWFzZdoCb2zaBm9yYWNsZdoEcmhlbCkFWhZlbnRlcnByaXNlZW50ZXJwcmlzZWFzWhplbnRlcnByaXNlZW50ZXJwcmlzZXNlcnZlctobcmVkaGF0ZW50ZXJwcmlzZXdvcmtzdGF0aW9uWhZyZWRoYXRlbnRlcnByaXNlc2VydmVyWhtyZWRoYXRlbnRlcnByaXNlY29tcHV0ZW5vZGXaBnJlZGhhdHpBKD86W14pXSpcKSguKilcKCk/ICooPzpTVEwgKT8oW1xkLitcLWEtel0qXGQpICooPzplc2FlbGVyICopPyguKyl6GyhcdyspWy1fXShyZWxlYXNlfHZlcnNpb24pJNoOZGViaWFuX3ZlcnNpb256C2xzYi1yZWxlYXNlegtvZW0tcmVsZWFzZXoOc3lzdGVtLXJlbGVhc2V6DXBsZXNrLXJlbGVhc2V6EGlyZWRtYWlsLXJlbGVhc2VUYwEAAAAAAAAAAQAAAAUAAABDAAAAcxoAAAB0AGoBZAF0AmQCZAONAwEAdANqBHwAgwFTACkEYUcFAAAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAxLjYuMAoKICAgICAgICA6ZnVuYzpgZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbigpYCBpcyBkZXByZWNhdGVkLiBJdCBzaG91bGQgb25seSBiZQogICAgICAgIHVzZWQgYXMgYSBjb21wYXRpYmlsaXR5IHNoaW0gd2l0aCBQeXRob24ncwogICAgICAgIDpweTpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb24oKWAuIFBsZWFzZSB1c2UgOmZ1bmM6YGRpc3Ryby5pZGAsCiAgICAgICAgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYCBhbmQgOmZ1bmM6YGRpc3Ryby5uYW1lYCBpbnN0ZWFkLgoKICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24gYXMgYSB0dXBsZQogICAgYGAoaWRfbmFtZSwgdmVyc2lvbiwgY29kZW5hbWUpYGAgd2l0aCBpdGVtcyBhcyBmb2xsb3dzOgoKICAgICogYGBpZF9uYW1lYGA6ICBJZiAqZnVsbF9kaXN0cmlidXRpb25fbmFtZSogaXMgZmFsc2UsIHRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5pZGAuIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm5hbWVgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIFRoZSBpbnRlcmZhY2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsCiAgICA6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgc3VwcG9ydGluZyBhIHN1YnNldCBvZgogICAgaXRzIHBhcmFtZXRlcnMuCgogICAgVGhlIGRhdGEgaXQgcmV0dXJucyBtYXkgbm90IGV4YWN0bHkgYmUgdGhlIHNhbWUsIGJlY2F1c2UgaXQgdXNlcyBtb3JlIGRhdGEKICAgIHNvdXJjZXMgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGFuZCB0aGF0IG1heSBsZWFkIHRvIGRpZmZlcmVudCBkYXRhIGlmCiAgICB0aGUgT1MgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBtdWx0aXBsZSBkYXRhIHNvdXJjZXMgaXQKICAgIHByb3ZpZGVzICh0aGVyZSBhcmUgaW5kZWVkIHN1Y2ggZGlzdHJpYnV0aW9ucyAuLi4pLgoKICAgIEFub3RoZXIgcmVhc29uIGZvciBkaWZmZXJlbmNlcyBpcyB0aGUgZmFjdCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYAogICAgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIGRpc3RybyBJRCBzdHJpbmcgdG8gYSByZWxpYWJsZSBtYWNoaW5lLXJlYWRhYmxlIHZhbHVlCiAgICBmb3IgYSBudW1iZXIgb2YgcG9wdWxhciBPUyBkaXN0cmlidXRpb25zLgogICAgespkaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uKCkgaXMgZGVwcmVjYXRlZC4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGNvbXBhdGliaWxpdHkgc2hpbSB3aXRoIFB5dGhvbidzIHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbigpLiBQbGVhc2UgdXNlIGRpc3Ryby5pZCgpLCBkaXN0cm8udmVyc2lvbigpIGFuZCBkaXN0cm8ubmFtZSgpIGluc3RlYWQu6QIAAAApAdoKc3RhY2tsZXZlbCkF2gh3YXJuaW5nc9oEd2FybtoSRGVwcmVjYXRpb25XYXJuaW5n2gdfZGlzdHJv2hJsaW51eF9kaXN0cmlidXRpb24pAdoWZnVsbF9kaXN0cmlidXRpb25fbmFtZakAchAAAAD6MS90bXAvcGlwLWJ1aWxkLTFmaWNvajRzL3BpcC9waXAvX3ZlbmRvci9kaXN0cm8ucHlyDgAAAIgAAABzCgAAAAAhBAECAwIBCAJyDgAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMIAAAAdABqAYMAUwApAWFECwAACiAgICBSZXR1cm4gdGhlIGRpc3RybyBJRCBvZiB0aGUgY3VycmVudCBkaXN0cmlidXRpb24sIGFzIGEKICAgIG1hY2hpbmUtcmVhZGFibGUgc3RyaW5nLgoKICAgIEZvciBhIG51bWJlciBvZiBPUyBkaXN0cmlidXRpb25zLCB0aGUgcmV0dXJuZWQgZGlzdHJvIElEIHZhbHVlIGlzCiAgICAqcmVsaWFibGUqLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBkb2N1bWVudGVkIGFuZCB0aGF0IGl0IGRvZXMgbm90IGNoYW5nZQogICAgYWNyb3NzIHJlbGVhc2VzIG9mIHRoZSBkaXN0cmlidXRpb24uCgogICAgVGhpcyBwYWNrYWdlIG1haW50YWlucyB0aGUgZm9sbG93aW5nIHJlbGlhYmxlIGRpc3RybyBJRCB2YWx1ZXM6CgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBEaXN0cm8gSUQgICAgICAgRGlzdHJpYnV0aW9uCiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICJ1YnVudHUiICAgICAgICBVYnVudHUKICAgICJkZWJpYW4iICAgICAgICBEZWJpYW4KICAgICJyaGVsIiAgICAgICAgICBSZWRIYXQgRW50ZXJwcmlzZSBMaW51eAogICAgImNlbnRvcyIgICAgICAgIENlbnRPUwogICAgImZlZG9yYSIgICAgICAgIEZlZG9yYQogICAgInNsZXMiICAgICAgICAgIFNVU0UgTGludXggRW50ZXJwcmlzZSBTZXJ2ZXIKICAgICJvcGVuc3VzZSIgICAgICBvcGVuU1VTRQogICAgImFtYXpvbiIgICAgICAgIEFtYXpvbiBMaW51eAogICAgImFyY2giICAgICAgICAgIEFyY2ggTGludXgKICAgICJjbG91ZGxpbnV4IiAgICBDbG91ZExpbnV4IE9TCiAgICAiZXhoZXJibyIgICAgICAgRXhoZXJibyBMaW51eAogICAgImdlbnRvbyIgICAgICAgIEdlblRvbyBMaW51eAogICAgImlibV9wb3dlcmt2bSIgIElCTSBQb3dlcktWTQogICAgImt2bWlibSIgICAgICAgIEtWTSBmb3IgSUJNIHogU3lzdGVtcwogICAgImxpbnV4bWludCIgICAgIExpbnV4IE1pbnQKICAgICJtYWdlaWEiICAgICAgICBNYWdlaWEKICAgICJtYW5kcml2YSIgICAgICBNYW5kcml2YSBMaW51eAogICAgInBhcmFsbGVscyIgICAgIFBhcmFsbGVscwogICAgInBpZG9yYSIgICAgICAgIFBpZG9yYQogICAgInJhc3BiaWFuIiAgICAgIFJhc3BiaWFuCiAgICAib3JhY2xlIiAgICAgICAgT3JhY2xlIExpbnV4IChhbmQgT3JhY2xlIEVudGVycHJpc2UgTGludXgpCiAgICAic2NpZW50aWZpYyIgICAgU2NpZW50aWZpYyBMaW51eAogICAgInNsYWNrd2FyZSIgICAgIFNsYWNrd2FyZQogICAgInhlbnNlcnZlciIgICAgIFhlblNlcnZlcgogICAgIm9wZW5ic2QiICAgICAgIE9wZW5CU0QKICAgICJuZXRic2QiICAgICAgICBOZXRCU0QKICAgICJmcmVlYnNkIiAgICAgICBGcmVlQlNECiAgICAibWlkbmlnaHRic2QiICAgTWlkbmlnaHRCU0QKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIElmIHlvdSBoYXZlIGEgbmVlZCB0byBnZXQgZGlzdHJvcyBmb3IgcmVsaWFibGUgSURzIGFkZGVkIGludG8gdGhpcyBzZXQsCiAgICBvciBpZiB5b3UgZmluZCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBmdW5jdGlvbiByZXR1cm5zIGEgZGlmZmVyZW50CiAgICBkaXN0cm8gSUQgZm9yIG9uZSBvZiB0aGUgbGlzdGVkIGRpc3Ryb3MsIHBsZWFzZSBjcmVhdGUgYW4gaXNzdWUgaW4gdGhlCiAgICBgZGlzdHJvIGlzc3VlIHRyYWNrZXJgXy4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHkgYW5kIHRyYW5zZm9ybWF0aW9uczoqKgoKICAgIEZpcnN0LCB0aGUgSUQgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMsIGluIHRoZSBzcGVjaWZpZWQKICAgIG9yZGVyLiBUaGUgZmlyc3QgYXZhaWxhYmxlIGFuZCBub24tZW1wdHkgdmFsdWUgaXMgdXNlZDoKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIklEIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLAoKICAgIFRoZSBzbyBkZXRlcm1pbmVkIElEIHZhbHVlIHRoZW4gcGFzc2VzIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb25zLAogICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kOgoKICAgICogaXQgaXMgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLAoKICAgICogYmxhbmtzICh3aGljaCBzaG91bGQgbm90IGJlIHRoZXJlIGFueXdheSkgYXJlIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMsCgogICAgKiBhIG5vcm1hbGl6YXRpb24gb2YgdGhlIElEIGlzIHBlcmZvcm1lZCwgYmFzZWQgdXBvbgogICAgICBgbm9ybWFsaXphdGlvbiB0YWJsZXNgXy4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBub3JtYWxpemF0aW9uIGlzIHRvIGVuc3VyZQogICAgICB0aGF0IHRoZSBJRCBpcyBhcyByZWxpYWJsZSBhcyBwb3NzaWJsZSwgZXZlbiBhY3Jvc3MgaW5jb21wYXRpYmxlIGNoYW5nZXMKICAgICAgaW4gdGhlIE9TIGRpc3RyaWJ1dGlvbnMuIEEgY29tbW9uIHJlYXNvbiBmb3IgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSBpcwogICAgICB0aGUgYWRkaXRpb24gb2YgYW4gb3MtcmVsZWFzZSBmaWxlLCBvciB0aGUgYWRkaXRpb24gb2YgdGhlIGxzYl9yZWxlYXNlCiAg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IGRpZmZlcmVudCBwcmVjaXNpb25zIGluCiAgICB0aGUgZGlmZmVyZW50IHNvdXJjZXMgb2YgZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uLiBFeGFtaW5pbmcgdGhlIGRpZmZlcmVudAogICAgc291cmNlcyBpbiBhIGZpeGVkIHByaW9yaXR5IG9yZGVyIGRvZXMgbm90IGFsd2F5cyB5aWVsZCB0aGUgbW9zdCBwcmVjaXNlCiAgICB2ZXJzaW9uIChlLmcuIGZvciBEZWJpYW4gOC4yLCBvciBDZW50T1MgNy4xKS4KCiAgICBUaGUgKmJlc3QqIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBhcHByb2FjaCBmb3IgdGhlIHJldHVybmVkCiAgICB2ZXJzaW9uOgoKICAgIElmICpiZXN0KiBpcyBmYWxzZSwgdGhlIGZpcnN0IG5vbi1lbXB0eSB2ZXJzaW9uIG51bWJlciBpbiBwcmlvcml0eSBvcmRlciBvZgogICAgdGhlIGV4YW1pbmVkIHNvdXJjZXMgaXMgcmV0dXJuZWQuCgogICAgSWYgKmJlc3QqIGlzIHRydWUsIHRoZSBtb3N0IHByZWNpc2UgdmVyc2lvbiBudW1iZXIgb3V0IG9mIGFsbCBleGFtaW5lZAogICAgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBJbiBhbGwgY2FzZXMsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcy4KICAgIElmICpiZXN0KiBpcyBmYWxzZSwgdGhpcyBvcmRlciByZXByZXNlbnRzIHRoZSBwcmlvcml0eSBvcmRlcjoKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlZFUlNJT05fSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJSZWxlYXNlIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIjx2ZXJzaW9uX2lkPiIgZmllbGQgb2YgdGhlIGZpcnN0IGxpbmUKICAgICAgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIlBSRVRUWV9OQU1FIiBhdHRyaWJ1dGUgb2YgdGhlCiAgICAgIG9zLXJlbGVhc2UgZmlsZSwgaWYgaXQgZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlcy4KICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiRGVzY3JpcHRpb24iIGF0dHJpYnV0ZSByZXR1cm5lZCBieQogICAgICB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCwgaWYgaXQgZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBkaXN0cm8gcmVsZWFzZQogICAgICBmaWxlcy4KICAgICkCcg0AAADaB3ZlcnNpb24pAnIUAAAA2gRiZXN0chAAAAByEAAAAHIRAAAAchUAAAArAQAAcwIAAAAAKnIVAAAAYwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB0AGoBfACDAVMAKQFhoAEAAAogICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbiBhcyBhIHR1cGxlCiAgICBgYChtYWpvciwgbWlub3IsIGJ1aWxkX251bWJlcilgYCB3aXRoIGl0ZW1zIGFzIGZvbGxvd3M6CgogICAgKiBgYG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYG1pbm9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCgogICAgKiBgYGJ1aWxkX251bWJlcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgKQJyDQAAANoNdmVyc2lvbl9wYXJ0cykBchYAAAByEAAAAHIQAAAAchEAAAByFwAAAFgBAABzAgAAAAAPchcAAABjAQAAAAAAAAABAAAAAgAAAEMAAABzCgAAAHQAagF8AIMBUwApAWE1AQAACiAgICBSZXR1cm4gdGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgbWFqb3IgdmVyc2lvbiBpcyB0aGUgZmlyc3QKICAgIHBhcnQgb2YgdGhlIGRvdC1zZXBhcmF0ZWQgdmVyc2lvbiBzdHJpbmcuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgKQJyDQAAANoNbWFqb3JfdmVyc2lvbikBchYAAAByEAAAAHIQAAAAchEAAAByGAAAAGoBAABzAgAAAAALchgAAABjAQAAAAAAAAABAAAAAgAAAEMAAABzCgAAAHQAagF8AIMBUwApAWE2AQAACiAgICBSZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgbWlub3IgdmVyc2lvbiBpcyB0aGUgc2Vjb25kCiAgICBwYXJ0IG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICkCcg0AAADaDW1pbm9yX3ZlcnNpb24pAXIWAAAAchAAAAByEAAAAHIRAAAAchkAAAB4AQAAcwIAAAAAC3IZAAAAYwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB0AGoBfACDAVMAKQFhMwEAAAogICAgUmV0dXJuIHRoZSBidWlsZCBudW1iZXIgb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgYnVpbGQgbnVtYmVyIGlzIHRoZSB0aGlyZCBwYXJ0CiAgICBvZiB0aGUgZG90LXNlcGFyYXRlZCB2ZXJzaW9uIHN0cmluZy4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICApAnINAAAA2gxidWlsZF9udW1iZXIpAXIWAAAAchAAAAByEAAAAHIRAAAAchoAAACGAQAAcwIAAAAAC3IaAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBYQ8CAAAKICAgIFJldHVybiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGRpc3RybyBJRHMgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZQogICAgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbiBpbiByZWdhcmRzIHRvIHBhY2thZ2luZwogICAgYW5kIHByb2dyYW1taW5nIGludGVyZmFjZXMsIGZvciBleGFtcGxlIGRpc3RyaWJ1dGlvbnMgdGhlIGN1cnJlbnQKICAgIGRpc3RyaWJ1dGlvbiBpcyBhIGRlcml2YXRpdmUgZnJvbS4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBUaGlzIGluZm9ybWF0aW9uIGl0ZW0gaXMgb25seSBwcm92aWRlZCBieSB0aGUgb3MtcmVsZWFzZSBmaWxlLgogICAgRm9yIGRldGFpbHMsIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJJRF9MSUtFIiBhdHRyaWJ1dGUgaW4gdGhlCiAgICBgb3MtcmVsZWFzZSBtYW4gcGFnZQogICAgPGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL3N5c3RlbWQvbWFuL29zLXJlbGVhc2UuaHRtbD5gXy4KICAgICkCcg0AAADaBGxpa2VyEAAAAHIQAAAAchAAAAByEQAAAHIbAAAAlAEAAHMCAAAAAA9yGwAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMIAAAAdABqAYMAUwApAWGmAgAACiAgICBSZXR1cm4gdGhlIGNvZGVuYW1lIGZvciB0aGUgcmVsZWFzZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24sCiAgICBhcyBhIHN0cmluZy4KCiAgICBJZiB0aGUgZGlzdHJpYnV0aW9uIGRvZXMgbm90IGhhdmUgYSBjb2RlbmFtZSwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoKICAgIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgY29kZW5hbWUgaXMgbm90IGFsd2F5cyByZWFsbHkgYSBjb2RlbmFtZS4gRm9yCiAgICBleGFtcGxlLCBvcGVuU1VTRSByZXR1cm5zICJ4ODZfNjQiLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBzdWNoCiAgICBjYXNlcyBpbiBhbnkgc3BlY2lhbCB3YXkgYW5kIGp1c3QgcmV0dXJucyB0aGUgc3RyaW5nIGl0IGZpbmRzLCBpZiBhbnkuCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgKiB0aGUgY29kZW5hbWUgd2l0aGluIHRoZSAiVkVSU0lPTiIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsIGlmCiAgICAgIHByb3ZpZGVkLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiQ29kZW5hbWUiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIjxjb2RlbmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgogICAgKQJyDQAAANoIY29kZW5h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kwEAAAogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlCiAgICBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICApAnINAAAA2g9vc19yZWxlYXNlX2F0dHIpAdoJYXR0cmlidXRlchAAAAByEAAAAHIRAAAAciIAAAAXAgAAcwIAAAAAEXIiAAAAYwEAAAAAAAAAAQAAAAIAAABDAAAAcwoAAAB0AGoBfACDAVMAKQFhrQEAAAogICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXQKICAgIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLgoKICAgIFJldHVybnM6CgogICAgKiAoc3RyaW5nKTogVmFsdWUgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0sIGlmIHRoZSBpdGVtIGV4aXN0cy4KICAgICAgVGhlIGVtcHR5IHN0cmluZywgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QuCgogICAgU2VlIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBf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X19kb2NfX3ItAAAAcjQAAAByEAAAAHIQAAAAchAAAAByEQAAAHInAAAAagIAAHMGAAAACAQEAggFcicAAABjAAAAAAAAAAAAAAAABQAAAEAAAABzPgEAAGUAWgFkAFoCZAFaA2REZAVkBoQBWgRkB2QIhABaBWRFZAlkCoQBWgZkC2QMhABaB2RGZA5kD4QBWghkR2QQZBGEAVoJZEhkEmQThAFaCmRJZBRkFYQBWgtkSmQWZBeEAVoMZEtkGGQZhAFaDWQaZBuEAFoOZBxkHYQAWg9kTGQeZB+EAVoQZCBkIYQAWhFkImQjhABaEmQkZCWEAFoTZCZkJ4QAWhRkKGQphABaFWQqZCuEAFoWZCxkLYQAWhdkLmQvhABaGGUZZDBkMYQAgwFaGmUbZDJkM4QAgwFaHGUZZDRkNYQAgwFaHWUbZDZkN4QAgwFaHmUZZDhkOYQAgwFaH2UbZDpkO4QAgwFaIGUbZDxkPYQAgwFaIWUZZD5kP4QAgwFaImRAZEGEAFojZRtkQmRDhACDAVokZARTAClN2hFMaW51eERpc3RyaWJ1dGlvbmEMAwAACiAgICBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIE9TIGRpc3RyaWJ1dGlvbi4KCiAgICBUaGlzIHBhY2thZ2UgY3JlYXRlcyBhIHByaXZhdGUgbW9kdWxlLWdsb2JhbCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGgKICAgIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzLCB0aGF0IGlzIHVzZWQgYnkgdGhlCiAgICBgY29uc29saWRhdGVkIGFjY2Vzc29yIGZ1bmN0aW9uc2BfIGFuZCBgc2luZ2xlIHNvdXJjZSBhY2Nlc3NvciBmdW5jdGlvbnNgXy4KICAgIEJ5IHVzaW5nIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzLCB0aGF0IG1vZHVsZS1nbG9iYWwgaW5zdGFuY2UKICAgIHJldHVybnMgZGF0YSBhYm91dCB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24gKGkuZS4gdGhlIGRpc3RybyB0aGlzCiAgICBwYWNrYWdlIHJ1bnMgb24pLgoKICAgIE5vcm1hbGx5LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgogICAgSG93ZXZlciwgaW4gc2l0dWF0aW9ucyB3aGVyZSBjb250cm9sIGlzIG5lZWRlZCBvdmVyIHRoZSBleGFjdCBkYXRhIHNvdXJjZXMKICAgIHRoYXQgYXJlIHVzZWQsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGNhbiBiZSBjcmVhdGVkIHdpdGggYSBzcGVjaWZpYwogICAgZGlzdHJvIHJlbGVhc2UgZmlsZSwgb3IgYSBzcGVjaWZpYyBvcy1yZWxlYXNlIGZpbGUsIG9yIHdpdGhvdXQgaW52b2tpbmcgdGhlCiAgICBsc2JfcmVsZWFzZSBjb21tYW5kLgogICAgVNoATmMGAAAAAAAAAAgAAAADAAAAQwAAAHOkAAAAfAV8AF8AfAVyGHQBagJqA3wFZAGDAm4CdAR8AF8FfAVyMHQBagJqA3wFZAKDAm4CdAZ8AF8HfAJyQnwCfABfCG5IdAFqAmoDfABqBXQJgwJ9BnQBagJqA3wAagd0CYMCfQd0AWoCagp8BoMBc3x0AWoCagp8B4MBDAByhHwGfABfCG4GfAd8AF8IfANwkGQDfABfC3wBfABfDHwEfABfDWQEUwApBWH1CwAACiAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIG1ldGhvZCBvZiB0aGlzIGNsYXNzIGdhdGhlcnMgaW5mb3JtYXRpb24gZnJvbSB0aGUKICAgICAgICBhdmFpbGFibGUgZGF0YSBzb3VyY2VzLCBhbmQgc3RvcmVzIHRoYXQgaW4gcHJpdmF0ZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgogICAgICAgIFN1YnNlcXVlbnQgYWNjZXNzIHRvIHRoZSBpbmZvcm1hdGlvbiBpdGVtcyB1c2VzIHRoZXNlIHByaXZhdGUgaW5zdGFuY2UKICAgICAgICBhdHRyaWJ1dGVzLCBzbyB0aGF0IHRoZSBkYXRhIHNvdXJjZXMgYXJlIHJlYWQgb25seSBvbmNlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGBgaW5jbHVkZV9sc2JgYCAoYm9vbCk6IENvbnRyb2xzIHdoZXRoZXIgdGhlCiAgICAgICAgICBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBpcyBpbmNsdWRlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIElmIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIHRoZSBkZWZhdWx0IHBhdGggbmFtZSB0bwogICAgICAgICAgYmUgdXNlZCAoc2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgb3MtcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUKICAgICAgICAgIGRhdGEgc291cmNlIGZvciB0aGUgb3MtcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgYSBkZWZhdWx0IHNlYXJjaCBhbGdvcml0aG0KICAgICAgICAgIHRvIGJlIHVzZWQgKHNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIGlmIG5vIGRlZmF1bHQKICAgICAgICAgIGRpc3RybyByZWxlYXNlIGZpbGUgY2FuIGJlIGZvdW5kLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgaW5jbHVkZV91bmFtZWBgIChib29sKTogQ29udHJvbHMgd2hldGhlciB1bmFtZSBjb21tYW5kIG91dHB1dCBpcwogICAgICAgICAgaW5jbHVkZWQgYXMgYSBkYXRhIHNvdXJjZS4gSWYgdGhlIHVuYW1lIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbgogICAgICAgICAgdGhlIHByb2dyYW0gZXhlY3V0aW9uIHBhdGggdGhlIGRhdGEgc291cmNlIGZvciB0aGUgdW5hbWUgY29tbWFuZCB3aWxsCiAgICAgICAgICBiZSBlbXB0eS4KCiAgICAgICAgKiBgYHJvb3RfZGlyYGAgKHN0cmluZyk6IFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byB1c2UKICAgICAgICAgIHRvIGZpbmQgZGlzdHJvLXJlbGF0ZWQgaW5mb3JtYXRpb24gZmlsZXMuCgogICAgICAgIFB1YmxpYyBpbnN0YW5jZSBhdHRyaWJ1dGVzOgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICogYGBpbmNsdWRlX2xzYmBgIChib29sKTogVGhlIHJlc3VsdCBvZiB0aGUgYGBpbmNsdWRlX2xzYmBgIHBhcmFtZXRlci4KICAgICAgICAgIFRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgbHNiIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9hZGVkLgoKICAgICAgICAqIGBgaW5jbHVkZV91bmFtZWBgIChib29sKTogVGhlIHJlc3VsdCBvZiB0aGUgYGBpbmNsdWRlX3VuYW1lYGAKICAgICAgICAgIHBhcmFtZXRlci4gVGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSB1bmFtZSBpbmZvcm1hdGlvbiB3aWxsCiAgICAgICAgICBiZSBsb2FkZWQuCgogICAgICAgIFJhaXNlczoKCiAgICAgICAgKiA6cHk6ZXhjOmBJT0Vycm9yYDogU29tZSBJL08gaXNzdWUgd2l0aCBhbiBvcy1yZWxlYXNlIGZpbGUgb3IgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUuCgogICAgICAgICogOnB5OmV4Yzpgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3JgOiBUaGUgbHNiX3JlbGVhc2UgY29tbWFuZCBoYWQKICAgICAgICAgIHNvbWUgaXNzdWUgKG90aGVyIHRoYW4gbm90IGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgpLgoKICAgICAgICAqIDpweTpleGM6YFVuaWNvZGVFcnJvcmA6IEEgZGF0YSBzb3VyY2UgaGFzIHVuZXhwZWN0ZWQgY2hhcmFjdGVycyBvcgogICAgICAgICAgdXNlcyBhbiB1bmV4cGVjdGVkIGVuY29kaW5nLgogICAgICAgINoDZXRjegd1c3IvbGlicjkAAABOKQ7aCHJvb3RfZGly2gJvc9oEcGF0aNoEam9pbtoMX1VOSVhDT05GRElS2gdldGNfZGly2g5fVU5JWFVTUkxJQkRJUloLdXNyX2xpYl9kaXLaD29zX3JlbGVhc2VfZmlsZdoUX09TX1JFTEVBU0VfQkFTRU5BTUXaBmlzZmlsZdoTZGlzdHJvX3JlbGVhc2VfZmlsZdoLaW5jbHVkZV9sc2LaDWluY2x1ZGVfdW5hbWUpCHIrAAAAckYAAAByQgAAAHJFAAAAckcAAAByOwAAAFoXZXRjX2Rpcl9vc19yZWxlYXNlX2ZpbGVaF3Vzcl9saWJfb3NfcmVsZWFzZV9maWxlchAAAAByEAAAAHIRAAAAci0AAACOAgAAcx4AAAAATwYBGAIYAwQBCAIQAQYBCgUSAQgCCAIGAgoBBgF6GkxpbnV4RGlzdHJpYnV0aW9uLl9faW5pdF9fYwEAAAAAAAAAAQAAAAMAAABDAAAAcwwAAABkAWoAfABkAo0BUwApA3oXUmV0dXJuIHJlcHIgb2YgYWxsIGluZm9hZQEAAExpbnV4RGlzdHJpYnV0aW9uKG9zX3JlbGVhc2VfZmlsZT17c2VsZi5vc19yZWxlYXNlX2ZpbGUhcn0sIGRpc3Ryb19yZWxlYXNlX2ZpbGU9e3NlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSFyfSwgaW5jbHVkZV9sc2I9e3NlbGYuaW5jbHVkZV9sc2Ihcn0sIGluY2x1ZGVfdW5hbWU9e3NlbGYuaW5jbHVkZV91bmFtZSFyfSwgX29zX3JlbGVhc2VfaW5mbz17c2VsZi5fb3NfcmVsZWFzZV9pbmZvIXJ9LCBfbHNiX3JlbGVhc2VfaW5mbz17c2VsZi5fbHNiX3JlbGVhc2VfaW5mbyFyfSwgX2Rpc3Ryb19yZWxlYXNlX2luZm89e3NlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8hcn0sIF91bmFtZV9pbmZvPXtzZWxmLl91bmFtZV9pbmZvIXJ9KSkBcisAAAApAXIvAAAAKQFyKwAAAHIQAAAAchAAAAByEQAAANoIX19yZXByX1/4AgAAcwQAAAAABAQIehpMaW51eERpc3RyaWJ1dGlvbi5fX3JlcHJfX2MCAAAAAAAAAAIAAAADAAAAQwAAAHMiAAAAfAFyDHwAagCDAG4GfABqAYMAfABq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ZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBPUyBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5vc19yZWxlYXNlX2luZm9gLgogICAgICAgICkBcmkAAAApAXIrAAAAchAAAAByEAAAAHIRAAAAch4AAADMAwAAcwIAAAAACHohTGludXhEaXN0cmlidXRpb24ub3NfcmVsZWFzZV9pbmZvYwEAAAAAAAAAAQAAAAEAAABDAAAAcwYAAAB8AGoAUwApAXrmCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBkYXRhIHNvdXJjZSBvZiB0aGUgT1MKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5sc2JfcmVsZWFzZV9pbmZvYC4KICAgICAgICApAdoRX2xzYl9yZWxlYXNlX2luZm8pAXIrAAAAchAAAAByEAAAAHIRAAAAch8AAADWAwAAcwIAAAAACXoiTGludXhEaXN0cmlidXRpb24ubHNiX3JlbGVhc2VfaW5mb2MBAAAAAAAAAAEAAAABAAAAQwAAAHMGAAAAfABqAFMAKQF66QogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIE9TCiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uZGlzdHJvX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgKQHaFF9kaXN0cm9fcmVsZWFzZV9pbmZvKQFyKwAAAHIQAAAAchAAAAByEQAAAHIgAAAA4QMAAHMCAAAAAAl6JUxpbnV4RGlzdHJpYnV0aW9u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ZA9kEGQRZBJkE2cPfQRZAG4CWAB4eHwERABdcH0CfAJ0DWsGcsZxuHQFagZ8AoMBfQN8A3K4dAJqA2oOfABqCnwCgwJ9BXwAagF8BYMBfQFkAXwBawZyuHwFfABfAHwDaghkBIMBfAFkAzwAZAJ8AWQBGQBqB4MAawaQAXIkZAJ8AWQDPAB8AVMAcbhXAGkAUwBkFFMAKRV6oAogICAgICAgIEdldCB0aGUgaW5mb3JtYXRpb24gaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICByEwAAAFoKY2xvdWRsaW51eHISAAAAcmcAAAB6DFN1U0UtcmVsZWFzZXoMYXJjaC1yZWxlYXNlegxiYXNlLXJlbGVhc2V6DmNlbnRvcy1yZWxlYXNleg5mZWRvcmEtcmVsZWFzZXoOZ2VudG9vLXJlbGVhc2V6Dm1hZ2VpYS1yZWxlYXNlehBtYW5kcmFrZS1yZWxlYXNlehBtYW5kcml2YS1yZWxlYXNlehVtYW5kcml2YWxpbnV4LXJlbGVhc2V6D21hbmphcm8tcmVsZWFzZXoOb3JhY2xlLXJlbGVhc2V6DnJlZGhhdC1yZWxlYXNlegpzbC1yZWxlYXNlehFzbGFja3dhcmUtdmVyc2lvbk4pD3JFAAAA2hpfcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZXI8AAAAcj0AAADaCGJhc2VuYW1l2iBfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTnJgAAAAcksAAABygAAAANoHbGlzdGRpcnJAAAAA2gRzb3J0co8AAADaIF9ESVNUUk9fUkVMRUFTRV9JR05PUkVfQkFTRU5BTUVTcj4AAAApBnIrAAAA2gtkaXN0cm9faW5mb3KpAAAAcmAAAADaCWJhc2VuYW1lc9oIZmlsZXBhdGhyEAAAAHIQAAAAchEAAABybQAAAMkEAABzVAAAAAAJBgMMAQ4FCgEYAQoBBAEOAQQCAgEMBAwBDgYCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBDAIKAQgBAgEK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