LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgIEFsZXhhbmRlciBTaGF0YWxpbiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICovCgqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA4L0dlbk1vZGVsIrsKq0VYVEVOU0lPTiB4cHQ6OmRpYWdyYW06OmVkaXRwYXJ0czo6VXRpbHO7CgqrREVGSU5FIE1haW4gRk9SIGdtZmdlbjo6R2VuQ29tcGFydG1lbnQtuwqrRVhQQU5EIHhwdDo6Q29tbW9uOjpjb3B5cmlnaHQgRk9SIGdldERpYWdyYW0oKS5lZGl0b3JHZW4tuwpwYWNrYWdlIKtnZXREaWFncmFtKCkuZWRpdFBhcnRzUGFja2FnZU5hbWW7OwoKq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkQ2xhc3NDb21tZW50uwpwdWJsaWMgY2xhc3Mgq2VkaXRQYXJ0Q2xhc3NOYW1luyCrRVhQQU5EIGV4dGVuZHNMaXN0uyCrRVhQQU5EIGltcGxlbWVudHNMaXN0uyB7CgoJq0VYUEFORCBhdHRyaWJ1dGVzLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkNvbXBhcnRtZW50RWRpdFBhcnQ6OmNvbnRzcnVjdG9yLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkNvbXBhcnRtZW50RWRpdFBhcnQ6Omhhc01vZGVsQ2hpbGRyZW5DaGFuZ2VkLbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkNvbXBhcnRtZW50RWRpdFBhcnQ6OmdldENvbXBhcnRtZW50TmFtZS27CgkKCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpDb21wYXJ0bWVudEVkaXRQYXJ0OjpjcmVhdGVGaWd1cmUtuwoJCgmrRVhQQU5EIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Q29tcGFydG1lbnRFZGl0UGFydDo6cmVmcmVzaFZpc3VhbHMtuwoJCgmrRVhQQU5EIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50LbsKCQoJq0VYUEFORCBpbXBsOjpkaWFncmFtOjplZGl0cGFydHM6OkNvbXBhcnRtZW50RWRpdFBhcnQ6OnJlZnJlc2hCb3VuZHMtuwoJCgmrRVhQQU5EIGltcGw6OmRpYWdyYW06OmVkaXRwYXJ0czo6Q29tcGFydG1lbnRFZGl0UGFydDo6c2V0UmF0aW8tuwoJCgmrRVhQQU5EIGFkZGl0aW9ucy27Cn0Kq0VORERFRklORbsKCqtERUZJTkUgZXh0ZW5kc0xpc3QgRk9SIGdtZmdlbjo6R2VuQ29tcGFydG1lbnQtuwpleHRlbmRzIKtJRiBsaXN0TGF5b3V0u29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0q0VMU0W7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0q0VORElGLbsKq0VORERFRklORbsKCqtERUZJTkUgaW1wbGVtZW50c0xpc3QgRk9SIGdtZmdlbjo6R2VuQ29tcGFydG1lbnS7q0VORERFRklORbsKCqtERUZJTkUgYXR0cmlidXRlcyBGT1IgZ21mZ2VuOjpHZW5Db21wYXJ0bWVudC27CgmrRVhQQU5EIHhwdDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpDb21tb246OnZpc3VhbElEQ29uc3RhbnQgRk9SIHRoaXMtuwqrRU5EREVGSU5FuwoKq0RFRklORSBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzIEZPUiBnbWZnZW46OkdlbkNvbXBhcnRtZW50LbsKCatFWFBBTkQgeHB0OjpDb21tb246OmdlbmVyYXRlZE1lbWJlckNvbW1lbnS7Cglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewoJCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpDb21wYXJ0bWVudEVkaXRQYXJ0OjpjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzQm9keS27Cgl9CqtFTkRERUZJTkW7CgqrREVGSU5FIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50IEZPUiBnbWZnZW46OkdlbkNvbXBhcnRtZW50LbsKCatJRiBpc1N0b3JpbmdDaGlsZFBvc2l0aW9ucyhub2RlKS27CgkJq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkTWVtYmVyQ29tbWVudLsKCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CgkJCatFWFBBTkQgaW1wbDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpDb21wYXJ0bWVudEVkaXRQYXJ0OjpoYW5kbGVOb3RpZmljYXRpb25FdmVudEJvZHktuwoJCX0KCatFTkRJRi27CqtFTkRERUZJTkW7CgqrREVGSU5FIGFkZGl0aW9ucyBGT1IgZ21mZ2VuOjpHZW5Db21wYXJ0bWVudLurRU5EREVGSU5Fuw==