XHNlY3Rpb257XG1vZHVsZXtwb3BlbjJ9IC0tLQogICAgICAgICBTdWJwcm9jZXNzZXMgd2l0aCBhY2Nlc3NpYmxlIEkvTyBzdHJlYW1zfQoKXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3BvcGVuMn0KICBccGxhdGZvcm17VW5peCwgV2luZG93c30KXG1vZHVsZXN5bm9wc2lze1N1YnByb2Nlc3NlcyB3aXRoIGFjY2Vzc2libGUgc3RhbmRhcmQgSS9PIHN0cmVhbXMufQpcc2VjdGlvbmF1dGhvcntEcmV3IENzaWxsYWd9e2RyZXdfY3NpbGxhZ0BnZW9jaXRpZXMuY29tfQoKClRoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gc3Bhd24gcHJvY2Vzc2VzIGFuZCBjb25uZWN0IHRvIHRoZWlyCmlucHV0L291dHB1dC9lcnJvciBwaXBlcyBhbmQgb2J0YWluIHRoZWlyIHJldHVybiBjb2RlcyB1bmRlcgpcVU5JWHt9IGFuZCBXaW5kb3dzLgoKTm90ZSB0aGF0IHN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMCwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZQp1c2luZyBmdW5jdGlvbnMgZnJvbSB0aGUgXHJlZm1vZHVsZXtvc30gbW9kdWxlIHdoaWNoIGhhdmUgdGhlIHNhbWUKbmFtZXMgYXMgdGhlIGZhY3RvcnkgZnVuY3Rpb25zIGhlcmUsIGJ1dCB0aGUgb3JkZXIgb2YgdGhlIHJldHVybgp2YWx1ZXMgaXMgbW9yZSBpbnR1aXRpdmUgaW4gdGhlIFxyZWZtb2R1bGV7b3N9IG1vZHVsZSB2YXJpYW50cy4KClRoZSBwcmltYXJ5IGludGVyZmFjZSBvZmZlcmVkIGJ5IHRoaXMgbW9kdWxlIGlzIGEgdHJpbyBvZiBmYWN0b3J5CmZ1bmN0aW9ucy4gIEZvciBlYWNoIG9mIHRoZXNlLCBpZiBcdmFye2J1ZnNpemV9IGlzIHNwZWNpZmllZCwgCml0IHNwZWNpZmllcyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuICBcdmFye21vZGV9LCBpZgpwcm92aWRlZCwgc2hvdWxkIGJlIHRoZSBzdHJpbmcgXGNvZGV7J2InfSBvciBcY29kZXsndCd9OyBvbiBXaW5kb3dzCnRoaXMgaXMgbmVlZGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBmaWxlIG9iamVjdHMgc2hvdWxkIGJlIG9wZW5lZAppbiBiaW5hcnkgb3IgdGV4dCBtb2RlLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIFx2YXJ7bW9kZX0gaXMKXGNvZGV7J3QnfS4KCk9uIFxVTklYLCBcdmFye2NtZH0gbWF5IGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkCmRpcmVjdGx5IHRvIHRoZSBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoClxmdW5jdGlvbntvcy5zcGF3bnYoKX0pLiBJZiBcdmFye2NtZH0gaXMgYSBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCnNoZWxsIChhcyB3aXRoIFxmdW5jdGlvbntvcy5zeXN0ZW0oKX0pLgoKVGhlIG9ubHkgd2F5IHRvIHJldHJpZXZlIHRoZSByZXR1cm4gY29kZXMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzZXMgaXMKYnkgdXNpbmcgdGhlIFxtZXRob2R7cG9sbCgpfSBvciBcbWV0aG9ke3dhaXQoKX0gbWV0aG9kcyBvbiB0aGUKXGNsYXNze1BvcGVuM30gYW5kIFxjbGFzc3tQb3BlbjR9IGNsYXNzZXM7IHRoZXNlIGFyZSBvbmx5IGF2YWlsYWJsZSBvbgpcVU5JWC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB3aGVuIHVzaW5nIHRoZQpcZnVuY3Rpb257cG9wZW4yKCl9LCBcZnVuY3Rpb257cG9wZW4zKCl9LCBhbmQgXGZ1bmN0aW9ue3BvcGVuNCgpfQpmdW5jdGlvbnMsIG9yIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9ucyBpbiB0aGUgXHJlZm1vZHVsZXtvc30gbW9kdWxlLgooTm90ZSB0aGF0IHRoZSB0dXBsZXMgcmV0dXJuZWQgYnkgdGhlIFxyZWZtb2R1bGV7b3N9IG1vZHVsZSdzIGZ1bmN0aW9ucwphcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIgZnJvbSB0aGUgb25lcyByZXR1cm5lZCBieSB0aGUgXG1vZHVsZXtwb3BlbjJ9Cm1vZHVsZS4pCgpcYmVnaW57ZnVuY2Rlc2N9e3BvcGVuMn17Y21kXG9wdGlvbmFseywgYnVmc2l6ZVxvcHRpb25hbHssIG1vZGV9fX0KRXhlY3V0ZXMgXHZhcntjbWR9IGFzIGEgc3ViLXByb2Nlc3MuICBSZXR1cm5zIHRoZSBmaWxlIG9iamVjdHMKXGNvZGV7KFx2YXJ7Y2hpbGRfc3Rkb3V0fSwgXHZhcntjaGlsZF9zdGRpbn0pfS4KXGVuZHtmdW5jZGVzY30KClxiZWdpbntmdW5jZGVzY317cG9wZW4zfXtjbWRcb3B0aW9uYWx7LCBidWZzaXplXG9wdGlvbmFseywgbW9kZX19fQpFeGVjdXRlcyBcdmFye2NtZH0gYXMgYSBzdWItcHJvY2Vzcy4gIFJldHVybnMgdGhlIGZpbGUgb2JqZWN0cwpcY29kZXsoXHZhcntjaGlsZF9zdGRvdXR9LCBcdmFye2NoaWxkX3N0ZGlufSwgXHZhcntjaGlsZF9zdGRlcnJ9KX0uClxlbmR7ZnVuY2Rlc2N9CgpcYmVnaW57ZnVuY2Rlc2N9e3BvcGVuNH17Y21kXG9wdGlvbmFseywgYnVmc2l6ZVxvcHRpb25hbHssIG1vZGV9fX0KRXhlY3V0ZXMgXHZhcntjbWR9IGFzIGEgc3ViLXByb2Nlc3MuICBSZXR1cm5zIHRoZSBmaWxlIG9iamVjdHMKXGNvZGV7KFx2YXJ7Y2hpbGRfc3Rkb3V0X2FuZF9zdGRlcnJ9LCBcdmFye2NoaWxkX3N0ZGlufSl9LgpcdmVyc2lvbmFkZGVkezIuMH0KXGVuZHtmdW5jZGVzY30KCgpPbiBcVU5JWCwgYSBjbGFzcyBkZWZpbmluZyB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgZmFjdG9yeQpmdW5jdGlvbnMgaXMgYWxzbyBhdmFpbGFibGUuICBUaGVzZSBhcmUgbm90IHVzZWQgZm9yIHRoZSBXaW5kb3dzCmltcGxlbWVudGF0aW9uLCBhbmQgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhhdCBwbGF0Zm9ybS4KClxiZWdpbntjbGFzc2Rlc2N9e1BvcGVuM317Y21kXG9wdGlvbmFseywgY2FwdHVyZXN0ZGVyclxvcHRpb25hbHssIGJ1ZnNpemV9fX0KVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY2hpbGQgcHJvY2Vzcy4gIE5vcm1hbGx5LCBcY2xhc3N7UG9wZW4zfQppbnN0YW5jZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIFxmdW5jdGlvbntwb3BlbjIoKX0gYW5kClxmdW5jdGlvbntwb3BlbjMoKX0gZmFjdG9yeSBmdW5jdGlvbnMgZGVzY3JpYmVkIGFib3ZlLgoKSWYgbm90IHVzaW5nIG9uZSBvZiB0aGUgaGVscGVyIGZ1bmN0aW9ucyB0byBjcmVhdGUgXGNsYXNze1BvcGVuM30Kb2JqZWN0cywgdGhlIHBhcmFtZXRlciBcdmFye2NtZH0gaXMgdGhlIHNoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZSBpbiBhCnN1Yi1wcm9jZXNzLiAgVGhlIFx2YXJ7Y2FwdHVyZXN0ZGVycn0gZmxhZywgaWYgdHJ1ZSwgc3BlY2lmaWVzIHRoYXQKdGhlIG9iamVjdCBzaG91bGQgY2FwdHVyZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgb2YgdGhlIGNoaWxkIHByb2Nlc3MuClRoZSBkZWZhdWx0IGlzIGZhbHNlLiAgSWYgdGhlIFx2YXJ7YnVmc2l6ZX0gcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgaXQKc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBJL08gYnVmZmVycyB0by9mcm9tIHRoZSBjaGlsZCBwcm9jZXNzLgpcZW5ke2NsYXNzZGVzY30KClxiZWdpbntjbGFzc2Rlc2N9e1BvcGVuNH17Y21kXG9wdGlvbmFseywgYnVmc2l6ZX19ClNpbWlsYXIgdG8gXGNsYXNze1BvcGVuM30sIGJ1dCBhbHdheXMgY2FwdHVyZXMgc3RhbmRhcmQgZXJyb3IgaW50byB0aGUKc2FtZSBmaWxlIG9iamVjdCBhcyBzdGFuZGFyZCBvdXRwdXQuICBUaGVzZSBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQKdXNpbmcgXGZ1bmN0aW9ue3BvcGVuNCgpfS4KXHZlcnNpb25hZGRlZHsyLjB9ClxlbmR7Y2xhc3NkZXNjfQoKXHN1YnNlY3Rpb257UG9wZW4zIGFuZCBQb3BlbjQgT2JqZWN0cyBcbGFiZWx7cG9wZW4zLW9iamVjdHN9fQoKSW5zdGFuY2VzIG9mIHRoZSBcY2xhc3N7UG9wZW4zfSBhbmQgXGNsYXNze1BvcGVuNH0gY2xhc3NlcyBoYXZlIHRoZQpmb2xsb3dpbmcgbWV0aG9kczoKClxiZWdpbnttZXRob2RkZXNjfXtwb2xsfXt9ClJldHVybnMgXGNvZGV7LTF9IGlmIGNoaWxkIHByb2Nlc3MgaGFzbid0IGNvbXBsZXRlZCB5ZXQsIG9yIGl0cyByZXR1cm4gCmNvZGUgb3RoZXJ3aXNlLgpcZW5ke21ldGhvZGRlc2N9CgpcYmVnaW57bWV0aG9kZGVzY317d2FpdH17fQpXYWl0cyBmb3IgYW5kIHJldHVybnMgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiAgVGhlCnN0YXR1cyBjb2RlIGVuY29kZXMgYm90aCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIHByb2Nlc3MgYW5kCmluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgaXQgZXhpdGVkIHVzaW5nIHRoZSBcY2Z1bmN0aW9ue2V4aXQoKX0Kc3lzdGVtIGNhbGwgb3IgZGllZCBkdWUgdG8gYSBzaWduYWwuICBGdW5jdGlvbnMgdG8gaGVscCBpbnRlcnByZXQgdGhlCnN0YXR1cyBjb2RlIGFyZSBkZWZpbmVkIGluIHRoZSBccmVmbW9kdWxle29zfSBtb2R1bGU7IHNlZSBzZWN0aW9uClxyZWZ7b3MtcHJvY2Vzc30gZm9yIHRoZSBcZnVuY3Rpb257V1x2YXJ7Kn0oKX0gZmFtaWx5IG9mIGZ1bmN0aW9ucy4KXGVuZHttZXRob2RkZXNjfQoKClRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYWxzbyBhdmFpbGFibGU6IAoKXGJlZ2lue21lbWJlcmRlc2N9e2Zyb21jaGlsZH0KQSBmaWxlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG91dHB1dCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLiAgRm9yClxjbGFzc3tQb3BlbjR9IGluc3RhbmNlcywgdGhpcyB3aWxsIHByb3ZpZGUgYm90aCB0aGUgc3RhbmRhcmQgb3V0cHV0CmFuZCBzdGFuZGFyZCBlcnJvciBzdHJlYW1zLgpcZW5ke21lbWJlcmRlc2N9CgpcYmVnaW57bWVtYmVyZGVzY317dG9jaGlsZH0KQSBmaWxlIG9iamVjdCB0aGF0IHByb3ZpZGVzIGlucHV0IHRvIHRoZSBjaGlsZCBwcm9jZXNzLgpcZW5ke21lbWJlcmRlc2N9CgpcYmVnaW57bWVtYmVyZGVzY317Y2hpbGRlcnJ9CkEgZmlsZSBvYmplY3QgdGhhdCBwcm92aWRlcyBlcnJvciBvdXRwdXQgZnJvbSB0aGUgY2hpbGQgcHJvY2VzcywgaWYKXHZhcntjYXB0dXJlc3RkZXJyfSB3YXMgdHJ1ZSBmb3IgdGhlIGNvbnN0cnVjdG9yLCBvdGhlcndpc2UKXGNvZGV7Tm9uZX0uICBUaGlzIHdpbGwgYWx3YXlzIGJlIFxjb2Rle05vbmV9IGZvciBcY2xhc3N7UG9wZW40fQppbnN0YW5jZXMuClxlbmR7bWVtYmVyZGVzY30KClxiZWdpbnttZW1iZXJkZXNjfXtwaWR9ClRoZSBwcm9jZXNzIElEIG9mIHRoZSBjaGlsZCBwcm9jZXNzLgpcZW5ke21lbWJlcmRlc2N9CgoKXHN1YnNlY3Rpb257RmxvdyBDb250cm9sIElzc3VlcyBcbGFiZWx7cG9wZW4yLWZsb3ctY29udHJvbH19CgpBbnkgdGltZSB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhbnkgZm9ybSBvZiBpbnRlci1wcm9jZXNzIGNvbW11bmljYXRpb24sCmNvbnRyb2wgZmxvdyBuZWVkcyB0byBiZSBjYXJlZnVsbHkgdGhvdWdodCBvdXQuICBUaGlzIHJlbWFpbnMgdGhlIGNhc2UKd2l0aCB0aGUgZmlsZSBvYmplY3RzIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlIChvciB0aGUgXHJlZm1vZHVsZXtvc30KbW9kdWxlIGVxdWl2YWxlbnRzKS4KCiUgRXhhbXBsZSBleHBsYW5hdGlvbiBhbmQgc3VnZ2VzdGVkIHdvcmstYXJvdW5kcyBzdWJzdGFudGlhbGx5IHN0b2xlbgolIGZyb20gTWFydGluIHZvbiBM9ndpczoKJSBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDAtU2VwdGVtYmVyLzAwOTQ2MC5odG1sCgpXaGVuIHJlYWRpbmcgb3V0cHV0IGZyb20gYSBjaGlsZCBwcm9jZXNzIHRoYXQgd3JpdGVzIGEgbG90IG9mIGRhdGEgdG8Kc3RhbmRhcmQgZXJyb3Igd2hpbGUgdGhlIHBhcmVudCBpcyByZWFkaW5nIGZyb20gdGhlIGNoaWxkJ3Mgc3RhbmRhcmQKb3V0cHV0LCBhIGRlYWRsb2NrIGNhbiBvY2N1ci4gIEEgc2ltaWxhciBzaXR1YXRpb24gY2FuIG9jY3VyIHdpdGggb3RoZXIKY29tYmluYXRpb25zIG9mIHJlYWRzIGFuZCB3cml0ZXMuICBUaGUgZXNzZW50aWFsIGZhY3RvcnMgYXJlIHRoYXQgbW9yZQp0aGFuIFxjb25zdGFudHtfUENfUElQRV9CVUZ9IGJ5dGVzIGFyZSBiZWluZyB3cml0dGVuIGJ5IG9uZSBwcm9jZXNzIGluCmEgYmxvY2tpbmcgZmFzaGlvbiwgd2hpbGUgdGhlIG90aGVyIHByb2Nlc3MgaXMgcmVhZGluZyBmcm9tIHRoZSBvdGhlcgpwcm9jZXNzLCBhbHNvIGluIGEgYmxvY2tpbmcgZmFzaGlvbi4KClRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gZGVhbCB3aXRoIHRoaXMgc2l0dWF0aW9uLgoKVGhlIHNpbXBsZXN0IGFwcGxpY2F0aW9uIGNoYW5nZSwgaW4gbWFueSBjYXNlcywgd2lsbCBiZSB0byBmb2xsb3cgdGhpcwptb2RlbCBpbiB0aGUgcGFyZW50IHByb2Nlc3M6CgpcYmVnaW57dmVyYmF0aW19CmltcG9ydCBwb3BlbjIKCnIsIHcsIGUgPSBwb3BlbjIucG9wZW4zKCdweXRob24gc2xhdmUucHknKQplLnJlYWRsaW5lcygpCnIucmVhZGxpbmVzKCkKci5jbG9zZSgpCmUuY2xvc2UoKQp3LmNsb3NlKCkKXGVuZHt2ZXJiYXRpbX0KCndpdGggY29kZSBsaWtlIHRoaXMgaW4gdGhlIGNoaWxkOgoKXGJlZ2lue3ZlcmJhdGltfQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKIyBub3RlIHRoYXQgZWFjaCBvZiB0aGVzZSBwcmludCBzdGF0ZW1lbnRzCiMgd3JpdGVzIGEgc2luZ2xlIGxvbmcgc3RyaW5nCgpwcmludCA+PnN5cy5zdGRlcnIsIDQwMCAqICd0aGlzIGlzIGEgdGVzdFxuJwpvcy5jbG9zZShzeXMuc3RkZXJyLmZpbGVubygpKQpwcmludCA+PnN5cy5zdGRvdXQsIDQwMCAqICd0aGlzIGlzIGFub3RoZXIgdGVzdFxuJwpcZW5ke3ZlcmJhdGltfQoKSW4gcGFydGljdWxhciwgbm90ZSB0aGF0IFxjb2Rle3N5cy5zdGRlcnJ9IG11c3QgYmUgY2xvc2VkIGFmdGVyCndyaXRpbmcgYWxsIGRhdGEsIG9yIFxtZXRob2R7cmVhZGxpbmVzKCl9IHdvbid0IHJldHVybi4gIEFsc28gbm90ZQp0aGF0IFxmdW5jdGlvbntvcy5jbG9zZSgpfSBtdXN0IGJlIHVzZWQsIGFzIFxjb2Rle3N5cy5zdGRlcnIuY2xvc2UoKX0Kd29uJ3QgY2xvc2UgXGNvZGV7c3RkZXJyfSAob3RoZXJ3aXNlIGFzc2lnbmluZyB0byBcY29kZXtzeXMuc3RkZXJyfQp3aWxsIHNpbGVudGx5IGNsb3NlIGl0LCBzbyBubyBmdXJ0aGVyIGVycm9ycyBjYW4gYmUgcHJpbnRlZCkuCgpBcHBsaWNhdGlvbnMgd2hpY2ggbmVlZCB0byBzdXBwb3J0IGEgbW9yZSBnZW5lcmFsIGFwcHJvYWNoIHNob3VsZAppbnRlZ3JhdGUgSS9PIG92ZXIgcGlwZXMgd2l0aCB0aGVpciBcZnVuY3Rpb257c2VsZWN0KCl9IGxvb3BzLCBvciB1c2UKc2VwYXJhdGUgdGhyZWFkcyB0byByZWFkIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZmlsZXMgcHJvdmlkZWQgYnkKd2hpY2hldmVyIFxmdW5jdGlvbntwb3BlbiooKX0gZnVuY3Rpb24gb3IgXGNsYXNze1BvcGVuKn0gY2xhc3Mgd2FzCnVzZWQuCg==