LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgQXJ0ZW0gVGlraG9taXJvdiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgTWljaGFlbCBHb2x1YmV2IChCb3JsYW5kKSAtIEdyaWRMYXlvdXQgYXR0cmlidXRlcwogKi8KCqtJTVBPUlQgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDYvR3JhcGhpY2FsRGVmaW5pdGlvbiK7CqtJTVBPUlQgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiuwqrRVhURU5TSU9OIFV0aWy7CgqrREVGSU5FIEluaXQoRVN0cmluZyBvd25pbmdGaWd1cmVWYXJpYWJsZSkgRk9SIGdtZmdyYXBoOjpMYXlvdXQtuwqrb3duaW5nRmlndXJlVmFyaWFibGW7LnNldExheW91dE1hbmFnZXIoq0VYUEFORCBSdW50aW1lOjpuZXdJbnN0YW5jZbspOwqrRU5EREVGSU5FuwoKq0RFRklORSBJbml0KEVTdHJpbmcgb3duaW5nRmlndXJlVmFyaWFibGUpIEZPUiBnbWZncmFwaDo6TGF5b3V0UmVmLbsKq0VYUEFORCBJbml0KG93bmluZ0ZpZ3VyZVZhcmlhYmxlKSBGT1IgYWN0dWFsLbsKq0VORERFRklORbsKCqtERUZJTkUgSW5pdChFU3RyaW5nIG93bmluZ0ZpZ3VyZVZhcmlhYmxlKSBGT1IgZ21mZ3JhcGg6OkJvcmRlckxheW91dC27CqtMRVQgImxheW91dCIgKyBvd25pbmdGaWd1cmVWYXJpYWJsZS50b0ZpcnN0VXBwZXIoKSBBUyBsYXlvdXRWYXJOYW1luwoJq0VYUEFORCBSdW50aW1lOjpuZXdJbnN0YW5jZShsYXlvdXRWYXJOYW1lKbsKq0lGIG51bGwgIT0gc3BhY2luZy27CgmrbGF5b3V0VmFyTmFtZbsuc2V0SG9yaXpvbnRhbFNwYWNpbmcoq3NwYWNpbmcuZHi7KTsvLyBUT0RPIG1hcE1vZGU/CgmrbGF5b3V0VmFyTmFtZbsuc2V0VmVydGljYWxTcGFjaW5nKKtzcGFjaW5nLmR5uyk7CqtFTkRJRi27Cgmrb3duaW5nRmlndXJlVmFyaWFibGW7LnNldExheW91dE1hbmFnZXIoq2xheW91dFZhck5hbWW7KTsKq0VORExFVLsKq0VORERFRklORbsKCqtERUZJTkUgSW5pdChFU3RyaW5nIG93bmluZ0ZpZ3VyZVZhcmlhYmxlKSBGT1IgZ21mZ3JhcGg6OkdyaWRMYXlvdXQtuwqrTEVUICJsYXlvdXQiICsgb3duaW5nRmlndXJlVmFyaWFibGUudG9GaXJzdFVwcGVyKCkgQVMgbGF5b3V0VmFyTmFtZbsKCatFWFBBTkQgUnVudGltZTo6bmV3SW5zdGFuY2UobGF5b3V0VmFyTmFtZSm7CgmrbGF5b3V0VmFyTmFtZbsubnVtQ29sdW1ucyA9IKtudW1Db2x1bW5zuzsKCatsYXlvdXRWYXJOYW1luy5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSCrZXF1YWxXaWR0aLs7CqtJRiBudWxsICE9IHNwYWNpbmctuwoJq2xheW91dFZhck5hbWW7Lmhvcml6b250YWxTcGFjaW5nID0gq3NwYWNpbmcuZHi7OwoJq2xheW91dFZhck5hbWW7LnZlcnRpY2FsU3BhY2luZyA9IKtzcGFjaW5nLmR5uzsKq0VORElGLbsKq0lGIG51bGwgIT0gbWFyZ2lucy27CgmrbGF5b3V0VmFyTmFtZbsubWFyZ2luV2lkdGggPSCrbWFyZ2lucy5keLs7CgmrbGF5b3V0VmFyTmFtZbsubWFyZ2luSGVpZ2h0ID0gq21hcmdpbnMuZHm7OwqrRU5ESUYtuwoJq293bmluZ0ZpZ3VyZVZhcmlhYmxluy5zZXRMYXlvdXRNYW5hZ2VyKKtsYXlvdXRWYXJOYW1luyk7CqtFTkRMRVS7CqtFTkRERUZJTkW7CgqrREVGSU5FIEluaXQoRVN0cmluZyBvd25pbmdGaWd1cmVWYXJpYWJsZSkgRk9SIGdtZmdyYXBoOjpGbG93TGF5b3V0LbsKq0xFVCAibGF5b3V0IiArIG93bmluZ0ZpZ3VyZVZhcmlhYmxlLnRvRmlyc3RVcHBlcigpIEFTIGxheW91dFZhck5hbWW7CgmrRVhQQU5EIFJ1bnRpbWU6Om5ld0luc3RhbmNlKGxheW91dFZhck5hbWUpuwoJq2xheW91dFZhck5hbWW7LnNldFN0cmV0Y2hNaW5vckF4aXMoq21hdGNoTWlub3JTaXpluyk7CgmrbGF5b3V0VmFyTmFtZbsuc2V0TWlub3JBbGlnbm1lbnQoq0VYUEFORCBSdW50aW1lOjpmcW67LqtFWFBBTkQgYWxpZ25tZW50KGZvcmNlU2luZ2xlTGluZSkgRk9SIG1pbm9yQWxpZ25tZW50uyk7CqtJRiBmb3JjZVNpbmdsZUxpbmW7CgmrbGF5b3V0VmFyTmFtZbsuc2V0U3BhY2luZyirbWFqb3JTcGFjaW5nuyk7CgmrbGF5b3V0VmFyTmFtZbsuc2V0VmVydGljYWwoq3ZlcnRpY2Fsuyk7CqtFTFNFuwoJq2xheW91dFZhck5hbWW7LnNldE1ham9yQWxpZ25tZW50KKtFWFBBTkQgUnVudGltZTo6ZnFuuy6rRVhQQU5EIGFsaWdubWVudChmb3JjZVNpbmdsZUxpbmUpIEZPUiBtYWpvckFsaWdubWVudLspOwoJq2xheW91dFZhck5hbWW7LnNldE1ham9yU3BhY2luZyirbWFqb3JTcGFjaW5nuyk7CgmrbGF5b3V0VmFyTmFtZbsuc2V0TWlub3JTcGFjaW5nKKttaW5vclNwYWNpbme7KTsKCatsYXlvdXRWYXJOYW1luy5zZXRIb3Jpem9udGFsKKshdmVydGljYWy7KTsKq0VORElGuwoJq293bmluZ0ZpZ3VyZVZhcmlhYmxluy5zZXRMYXlvdXRNYW5hZ2VyKKtsYXlvdXRWYXJOYW1luyk7CqtFTkRMRVS7CqtFTkRERUZJTkW7CgqrREVGSU5FIEluaXQoRVN0cmluZyBvd25pbmdGaWd1cmVWYXJpYWJsZSkgRk9SIGdtZmdyYXBoOjpDdXN0b21MYXlvdXQtuwqrTEVUICJsYXlvdXQiICsgb3duaW5nRmlndXJlVmFyaWFibGUudG9GaXJzdFVwcGVyKCkgQVMgbGF5b3V0VmFyTmFtZbsKCatFWFBBTkQgUnVudGltZTo6bmV3SW5zdGFuY2UobGF5b3V0VmFyTmFtZSm7CqtFWFBBTkQgYXR0cjo6Q3VzdG9tQ2xhc3M6OkluaXQobGF5b3V0VmFyTmFtZSktuwoJq293bmluZ0ZpZ3VyZVZhcmlhYmxluy5zZXRMYXlvdXRNYW5hZ2VyKKtsYXlvdXRWYXJOYW1luyk7CqtFTkRMRVS7CqtFTkRERUZJTkW7CgqrREVGSU5FIGFsaWdubWVudChFQm9vbGVhbiBmb3JjZVNpbmdsZUxpbmUpIEZPUiBnbWZncmFwaDo6QWxpZ25tZW50LbsKq0lGIHZhbHVlID09IEFsaWdubWVudDo6QkVHSU5OSU5HLnZhbHVlLbsKq0lGIGZvcmNlU2luZ2xlTGluZbtBTElHTl9UT1BMRUZUq0VMU0W7QUxJR05fTEVGVFRPUKtFTkRJRi27CqtFTFNFSUYgdmFsdWUgPT0gQWxpZ25tZW50OjpFTkQudmFsdWUtuwqrSUYgZm9yY2VTaW5nbGVMaW5lu0FMSUdOX0JPVFRPTVJJR0hUq0VMU0W7QUxJR05fUklHSFRCT1RUT02rRU5ESUYtuwqrRUxTRS27CkFMSUdOX0NFTlRFUqtFTkRJRi27CqtSRU27WFhYIGltcGxlbWVudCBhcyBleHRlbnNpb24Kc3dpdGNoICh2YWx1ZSkgewogIGNhc2UgQWxpZ25tZW50LkJFR0lOTklORyA6ICIiCiAgZGVmYXVsdCA6ICIiCn2rRU5EUkVNuwqrRU5EREVGSU5Fuwo=