Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IDIwMjEgLCBEaW5lc2ggQW5uYXl5YSAgICAgICAgICAgICAgICAgICAgICAgICAgCi8vIAovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKLy8gU1BEWC1GaWxlQ29udHJpYnV0b3I6IENyZWF0ZWQgYnkgRGluZXNoIEFubmF5eWEgPGRpbmVzaGFAb3BlbmNvcmVzLm9yZz4KLy8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBzZHJhbSBjb250cm9sbGVyIHByb2plY3QgICAgICAgICAgIAogIGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5lc2hhbm5heXlhL3lpZml2ZV9yMC5naXQKICBodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvY29yZXMveWlmaXZlLyAgICAgICAgICAgICAgCiAgaHR0cDovL3d3dy5vcGVuY29yZXMub3JnL2NvcmVzL3Nkcl9jdHJsLyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgRGVzY3JpcHRpb246IFdJU0hCT05FIHRvIFNEUkFNIENvbnRyb2xsZXIgQnVzIFRyYW5zYWxhdG9yCiAgICAgMS4gVGhpcyBtb2R1bGUgdHJhbnNsYXRlIHRoZSBXSVNIQk9ORSBwcm90b2NvbCB0byBjdXN0b20gc2RyYW0gY29udHJvbGxlciBpL2YgCiAgICAgMi4gQWxzbyBIYW5kbGUgdGhlIGNsb2NrIGRvbWFpbiBjaGFuZ2UgZnJvbSBBcHBsaWNhdGlvbiBsYXllciB0byBTZHJhbSBsYXllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFRvIERvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIEF1dGhvcihzKTogIERpbmVzaCBBbm5heXlhLCBkaW5lc2hhQG9wZW5jb3Jlcy5vcmcgICAgICAgICAgICAgICAgIAogIFZlcnNpb24gIDogMC4wIC0gSW5pdGlhbCBSZWxlYXNlCiAgICAgICAgICAgICAwLjEgLSAybmQgRmViIDIwMTIKCSAgICAgICAgICAgQXN5bmMgRmlmbyB0b3dhcmRzIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpcyBzZWxlY3RlZCAKCQkgICB3aXRoIFJlZ2lzdGVyZWQgRnVsbCBHZW5lcmF0aW9uCiAgICAgICAgICAgICAwLjIgLSAybmQgRmViIDIwMTIKCSAgICAgICAgICAgUGVuZGluZyBSZWFkIGdlbmVyYXRpb24gYnVnIGZpeCBkb25lIHRvIGhhbmRsZSBiYWNrdG8gYmFjayB3cml0ZSAKCQkgICBmb2xsb3dlZCBieSByZWFkIHJlcXVlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogQ29weXJpZ2h0IChDKSAyMDAwIEF1dGhvcnMgYW5kIE9QRU5DT1JFUy5PUkcgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiBUaGlzIHNvdXJjZSBmaWxlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB3aXRob3V0ICAgICAgICAgCiByZXN0cmljdGlvbiBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IHN0YXRlbWVudCBpcyBub3QgICAgCiByZW1vdmVkIGZyb20gdGhlIGZpbGUgYW5kIHRoYXQgYW55IGRlcml2YXRpdmUgd29yayBjb250YWlucyAgCiB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGFzc29jaWF0ZWQgZGlzY2xhaW1lci4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBUaGlzIHNvdXJjZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0ICAgCiBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsICAgCiBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgCiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55ICAgCmxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSAgICAgICAKIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgICAKIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgICAgICAKIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSAKIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCAgICAKIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBzb3VyY2U7IGlmIG5vdCwgZG93bmxvYWQgaXQgICAKIGZyb20gaHR0cDovL3d3dy5vcGVuY29yZXMub3JnL2xncGwuc2h0bWwgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgptb2R1bGUgd2Iyc2RyYyAoCiAgICAgIC8vIFdCIGJ1cwogICAgICAgICAgICAgICAgICAgIHdiX3JzdF9uICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHdiX2Nsa19pICAgICAgICAgICAgLAoKICAgICAgICAgICAgICAgICAgICB3Yl9zdGJfaSAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9hY2tfbyAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9hZGRyX2kgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl93ZV9pICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9kYXRfaSAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9zZWxfaSAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9kYXRfbyAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9jeWNfaSAgICAgICAgICAgICwKCgogICAgICAvL1NEUkFNIENvbnRyb2xsZXIgSGFuZC1TaGFrZSBTaWduYWwgCiAgICAgICAgICAgICAgICAgICAgc2RyYW1fY2xrICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyYW1fcmVzZXRuICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JlcSAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JlcV9hZGRyICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JlcV9sZW4gICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JlcV93cl9uICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JlcV9hY2sgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX2J1c3lfbiAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3dyX2VuX24gICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3dyX25leHQgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JkX3ZhbGlkICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX2xhc3RfcmQgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3dyX2RhdGEgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgc2RyX3JkX2RhdGEgICAgICAgIAoKICAgICAgKTsgCgpwYXJhbWV0ZXIgICAgICBkdyAgICAgICAgICAgICAgPSAzMjsgIC8vIGRhdGEgd2lkdGgKcGFyYW1ldGVyICAgICAgdHcgICAgICAgICAgICAgID0gODsgICAvLyB0YWcgaWQgd2lkdGgKcGFyYW1ldGVyICAgICAgYmwgICAgICAgICAgICAgID0gOTsgICAvLyBidXJzdF9sZW5naHRfd2lkdGggCnBhcmFtZXRlciAgICAgIEFQUF9BVyAgICAgICAgICA9IDI2OyAgLy8gQXBwbGljYXRpb24gQWRkcmVzcyBXaWR0aAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdpc2ggQm9uZSBJbnRlcmZhY2UKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgIAppbnB1dCAgICAgICAgICAgICAgICAgICB3Yl9yc3RfbiAgICAgICAgICAgOwppbnB1dCAgICAgICAgICAgICAgICAgICB3Yl9jbGtfaSAgICAgICAgICAgOwoKaW5wdXQgICAgICAgICAgICAgICAgICAgd2Jfc3RiX2kgICAgICAgICAgIDsKb3V0cHV0ICAgICAgICAgICAgICAgICAgd2JfYWNrX28gICAgICAgICAgIDsKaW5wdXQgW0FQUF9BVy0xOjBdICAgICAgd2JfYWRkcl9pICAgICAgICAgIDsKaW5wdXQgICAgICAgICAgICAgICAgICAgd2Jfd2VfaSAgICAgICAgICAgIDsgLy8gMSAtIFdyaXRlICwgMCAtIFJlYWQKaW5wdXQgW2R3LTE6MF0gICAgICAgICAgd2JfZGF0X2kgICAgICAgICAgIDsKaW5wdXQgW2R3LzgtMTowXSAgICAgICAgd2Jfc2VsX2kgICAgICAgICAgIDsgLy8gQnl0ZSBlbmFibGUKb3V0cHV0IFtkdy0xOjBdICAgICAgICAgd2JfZGF0X28gICAgICAgICAgIDsKaW5wdXQgICAgICAgICAgICAgICAgICAgd2JfY3ljX2kgICAgICAgICAgIDsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpUaGUgQ3ljbGUgVHlwZSBJZGVuZmllciBbQ1RJX0lPKCldIEFkZHJlc3MgVGFnIHByb3ZpZGVzIAphZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGN5Y2xlLiAKVGhlIE1BU1RFUiBzZW5kcyB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBTTEFWRS4gVGhlIFNMQVZFIGNhbiB1c2UgdGhpcwppbmZvcm1hdGlvbiB0byBwcmVwYXJlIHRoZSByZXNwb25zZSBmb3IgdGhlIG5leHQgY3ljbGUuClRhYmxlIDQtMiBDeWNsZSBUeXBlIElkZW50aWZpZXJzCkNUSV9PKDI6MCkgRGVzY3JpcHRpb24KkTAwMJIgQ2xhc3NpYyBjeWNsZS4KkTAwMZIgQ29uc3RhbnQgYWRkcmVzcyBidXJzdCBjeWNsZQqRMDEwkiBJbmNyZW1lbnRpbmcgYnVyc3QgY3ljbGUKkTAxMZIgUmVzZXJ2ZWQKkTEwMJIgUmVzZXJ2ZWQKkTEwMSBSZXNlcnZlZAqRMTEwkiBSZXNlcnZlZAqRMTExkiBFbmQtb2YtQnVyc3QKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTRFJBTSBjb250cm9sbGVyIEludGVyZmFjZSAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJhbV9jbGsgICAgICAgICAgOyAvLyBzZHJhbSBjbG9jawppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJhbV9yZXNldG4gICAgICAgOyAvLyBzZHJhbSByZXNldApvdXRwdXQgICAgICAgICAgICAgICAgICBzZHJfcmVxICAgICAgICAgICAgOyAvLyBTRFJBTSByZXF1ZXN0Cm91dHB1dCBbQVBQX0FXLTE6MF0gICAgIHNkcl9yZXFfYWRkciAgICAgICA7IC8vIFNEUkFNIFJlcXVlc3QgQWRkcmVzcwpvdXRwdXQgW2JsLTE6MF0gICAgICAgICBzZHJfcmVxX2xlbiAgICAgICAgOwpvdXRwdXQgICAgICAgICAgICAgICAgICBzZHJfcmVxX3dyX24gICAgICAgOyAvLyAwIC0gV3JpdGUsIDEgLT4gUmVhZAppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJfcmVxX2FjayAgICAgICAgOyAvLyBTRFJBTSByZXF1ZXN0IEFjY2VwdGVkCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcl9idXN5X24gICAgICAgICA7IC8vIDAgLT4gc2RyIGJ1c3kKb3V0cHV0IFtkdy84LTE6MF0gICAgICAgc2RyX3dyX2VuX24gICAgICAgIDsgLy8gQWN0aXZlIGxvdyBzZHIgYnl0ZS13aXNlIHdyaXRlIGRhdGEgdmFsaWQKaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyX3dyX25leHQgICAgICAgIDsgLy8gUmVhZHkgdG8gYWNjZXB0IHRoZSBuZXh0IHdyaXRlCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcl9yZF92YWxpZCAgICAgICA7IC8vIHNkciByZWFkIHZhbGlkCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcl9sYXN0X3JkICAgICAgICA7IC8vIEluZGljYXRlIGxhc3QgUmVhZCBvZiBCdXJzdCBUcmFuc2ZlcgpvdXRwdXQgW2R3LTE6MF0gICAgICAgICBzZHJfd3JfZGF0YSAgICAgICAgOyAvLyBzZHIgd3JpdGUgZGF0YQppbnB1dCAgW2R3LTE6MF0gICAgICAgICBzZHJfcmRfZGF0YSAgICAgICAgOyAvLyBzZHIgcmVhZCBkYXRhCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gV2lyZSBEZWNsZXJhdGlvbgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kd2lyZSAgICAgICAgICAgICAgICAgICAgY21kZmlmb19mdWxsICAgICAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgY21kZmlmb19lbXB0eSAgICAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgd3JkYXRhZmlmb19mdWxsICAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgd3JkYXRhZmlmb19lbXB0eSAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgdGFnZmlmb19mdWxsICAgICAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgdGFnZmlmb19lbXB0eSAgICAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgcmRkYXRhZmlmb19lbXB0eSAgIDsKd2lyZSAgICAgICAgICAgICAgICAgICAgcmRkYXRhZmlmb19mdWxsICAgIDsKCnJlZyAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfcmVhZCAgICAgICA7CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBY2sgR2VuZXJhbHRpb24gTG9naWMKLy8gIElmIFdyaXRlIFJlcXVlc3QgLSBBY2tub3dsZWRnZSBpZiB0aGUgY29tbWFuZCBhbmQgd3JpdGUgRklGTyBhcmUgbm90IGZ1bGwKLy8gIElmIFJlYWQgUmVxdWVzdCAgLSBHZW5lcmF0ZSB0aGUgQWNrbm93bGVkZ21lbnQgb25jZSByZWFkIGZpZm8gaGFzIGRhdGEKLy8gICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYXNzaWduIHdiX2Fja19vID0gKHdiX3N0Yl9pICYmIHdiX2N5Y19pICYmIHdiX3dlX2kpID8gIC8vIFdyaXRlIFBoYXNlCgkgICAgICAgICAgICAgICAgICAoKCFjbWRmaWZvX2Z1bGwpICYmICghd3JkYXRhZmlmb19mdWxsKSkgOgoJCSAgKHdiX3N0Yl9pICYmIHdiX2N5Y19pICYmICF3Yl93ZV9pKSA/IC8vIFJlYWQgUGhhc2UgCgkJICAgICAgICAgICAhcmRkYXRhZmlmb19lbXB0eSA6IDEnYjA7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb21tYW5kIEZJRk8gV3JpdGUgR2VuZXJhdGlvbgovLyAgICBJZiBXcml0ZSBSZXF1ZXN0IC0gR2VuZXJhdGUgd3JpdGUsIHdoZW4gV3JpdGUgZmlmbyBhbmQgY29tbWFuZCBmaWZvIGlzCi8vICAgICAgICAgICAgICAgICAgICAgICBub3QgZnVsbAovLyAgICBJZiBSZWFkIFJlcXVlc3QgLSBHZW5lcmF0ZSB3cml0ZSwgd2hlbiBjb21tYW5kIGZpZm8gbm90IGZ1bGwgYW5kIHRoZXJlCi8vICAgICAgICAgICAgICAgICAgICAgIGlzIG5vIHBlbmRpbmcgcmVhZCByZXF1ZXN0LgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3aXJlICAgICAgICAgICBjbWRmaWZvX3dyICAgPSAod2Jfc3RiX2kgJiYgd2JfY3ljX2kgJiYgd2Jfd2VfaSAmJiAoIWNtZGZpZm9fZnVsbCkgKSA/IHdiX2Fja19vIDoKCSAgICAgICAgICAgICAgICAgICAgICAod2Jfc3RiX2kgJiYgd2JfY3ljX2kgJiYgIXdiX3dlX2kgJiYgKCFjbWRmaWZvX2Z1bGwpKSA/ICFwZW5kaW5nX3JlYWQ6IDEnYjAgOyAKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGNvbW1hbmQgZmlmbyByZWFkIGdlbmVyYXRpb24KLy8gICAgQ29tbWFuZCBGSUZvIHJlYWQgd2lsbCBiZSBnZW5lcmF0ZWQsIHdoZW5ldmVyIFNEUkFNIENvbnRyb2xsZXIKLy8gICAgQWNrbm93bGRnZSB0aGUgUmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCndpcmUgICAgICAgICAgIGNtZGZpZm9fcmQgICA9IHNkcl9yZXFfYWNrOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXBwbGljYXRpb24gbGF5ZXIgcmVxdWVzdCBpcyBnZW5lcmF0ZWQgdG93YXJkcyB0aGUgY29udHJvbGxlciwgd2hlbmV2ZXIKLy8gQ29tbWFuZCBGSUZPIGlzIG5vdCBmdWxsCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmFzc2lnbiAgICAgICAgIHNkcl9yZXEgICAgICA9ICFjbWRmaWZvX2VtcHR5OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNpbmNlIEJ1cnN0IGxlbmd0aCBpcyBub3Qga25vd24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBCdXJzdCwgSXQncyBhc3N1bWVkIGFzCi8vIFNpbmdsZSBDeWNsZSBCdXJzdC4gV2UgbmVlZCB0byBpbXByb3Zpc2UgdGhpcyAuLi4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kd2lyZSBbYmwtMTowXSAgYnVyc3RfbGVuZ3RoICA9IDE7ICAvLyAwIE1lYW4gMSBUcmFuc2ZlcgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJbiBXaXNoIEJvbmUgU3BlYywgRm9yIFJlYWQgUmVxdWVzdCBoYXMgdG8gYmUgYWNrZWQgYWxvbmcgd2l0aCBkYXRhLgovLyBXZSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBwZW5kaW5nIHJlYWQgcmVxdWVzdC4KLy8gT25jZSB3ZSBhY2NlcHQgdGhlIHJlYWQgcmVxdWVzdCwgd2Ugc2hvdWxkIG5vdCBhY2NlcHQgb25lIG1vcmUgcmVhZAovLyByZXF1ZXN0LCB1bnRpbGwgd2UgaGF2ZSB0cmFuc21pdHRlZCB0aGUgcmVhZCBkYXRhLgovLyAgUGVuZGluZyBSZWFkIHdpbGwgCi8vICAgICBzZXQgLSB3aXRoIFJlYWQgUmVxdWVzdCAKLy8gICAgIHJlc2V0IC0gd2l0aCBSZWFkIFJlcXVlc3QgKyBBY2sKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphbHdheXMgQChuZWdlZGdlIHdiX3JzdF9uIG9yIHBvc2VkZ2Ugd2JfY2xrX2kpIGJlZ2luCiAgIGlmKCF3Yl9yc3RfbikgYmVnaW4KICAgICAgIHBlbmRpbmdfcmVhZCA8PSAxJ2IwOwogICBlbmQgZWxzZSBiZWdpbgogICAgICAvL3BlbmRpbmdfcmVhZCA8PSAgd2Jfc3RiX2kgJiB3Yl9jeWNfaSAmICF3Yl93ZV9pICYgIXdiX2Fja19vOwogICAgICBwZW5kaW5nX3JlYWQgPD0gICAoY21kZmlmb193ciAmJiAhd2Jfd2VfaSkgPyAxJ2IxOgoJICAgICAgICAgICAgICAgICh3Yl9zdGJfaSAmIHdiX2N5Y19pICYgIXdiX3dlX2kgJiB3Yl9hY2tfbykgPyAxJ2IwOiBwZW5kaW5nX3JlYWQ7CiAgIGVuZAplbmQKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzeW5jIENvbW1hbmQgRklGTy4gVGhpcyBibG9jayBoYW5kbGUgdGhlIGNsb2NrIGRvbWFpbiBjaGFuZ2UgZnJvbQovLyBBcHBsaWNhdGlvbiBsYXllciB0byBTRFJBTSBDb250cm9sbGVyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBBZGRyZXNzICsgQnVyc3QgTGVuZ3RoICsgVy9SIFJlcXVlc3QgCiAgICBhc3luY19maWZvICMoLlcoQVBQX0FXK2JsKzEpLC5EUCg0KSwuV1JfRkFTVCgxJ2IwKSwgLlJEX0ZBU1QoMSdiMCkpIHVfY21kZmlmbyAoCiAgICAgLy8gV3JpdGUgUGF0aCBTeXMgQ0xvY2sgRG9tYWluCiAgICAgICAgICAud3JfY2xrICAgICAgICAgICAgICh3Yl9jbGtfaSAgICAgICAgICAgKSwKICAgICAgICAgIC53cl9yZXNldF9uICAgICAgICAgKHdiX3JzdF9uICAgICAgICAgICApLAogICAgICAgICAgLndyX2VuICAgICAgICAgICAgICAoY21kZmlmb193ciAgICAgICAgICksCiAgICAgICAgICAud3JfZGF0YSAgICAgICAgICAgICh7YnVyc3RfbGVuZ3RoLCAKCSAgICAgICAgICAgICAgICAgICAgICAgICF3Yl93ZV9pLCAKCQkJCXdiX2FkZHJfaX0gICAgICAgICksCiAgICAgICAgICAuYWZ1bGwgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgIC5mdWxsICAgICAgICAgICAgICAgKGNtZGZpZm9fZnVsbCAgICAgICApLAoKICAgICAvLyBSZWFkIFBhdGgsIFNEUkFNIGNsb2NrIGRvbWFpbgogICAgICAgICAgLnJkX2NsayAgICAgICAgICAgICAoc2RyYW1fY2xrICAgICAgICAgICksCiAgICAgICAgICAucmRfcmVzZXRfbiAgICAgICAgIChzZHJhbV9yZXNldG4gICAgICAgKSwKICAgICAgICAgIC5hZW1wdHkgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmVtcHR5ICAgICAgICAgICAgICAoY21kZmlmb19lbXB0eSAgICAgICksCiAgICAgICAgICAucmRfZW4gICAgICAgICAgICAgIChjbWRmaWZvX3JkICAgICAgICAgKSwKICAgICAgICAgIC5yZF9kYXRhICAgICAgICAgICAgKHtzZHJfcmVxX2xlbiwKCSAgICAgICAgICAgICAgICAgICAgICAgIHNkcl9yZXFfd3JfbiwKCQkgICAgICAgICAgICAgICAgc2RyX3JlcV9hZGRyfSAgICAgKQogICAgICk7CgovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb2ZmCmFsd2F5cyBAKHBvc2VkZ2Ugd2JfY2xrX2kpIGJlZ2luCiAgaWYgKGNtZGZpZm9fZnVsbCA9PSAxJ2IxICYmIGNtZGZpZm9fd3IgPT0gMSdiMSkgIGJlZ2luCiAgICAgJGRpc3BsYXkoIkVSUk9SOiVtIENPTU1BTkQgRklGTyBXUklURSBPVkVSRkxPVyIpOwogIGVuZCAKZW5kIAovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb24KLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHNkcmFtX2NsaykgYmVnaW4KICAgaWYgKGNtZGZpZm9fZW1wdHkgPT0gMSdiMSAmJiBjbWRmaWZvX3JkID09IDEnYjEpIGJlZ2luCiAgICAgICRkaXNwbGF5KCJFUlJPUjolbSBDT01NQU5EIEZJRk8gUkVBRCBPVkVSRkxPVyIpOwogICBlbmQKZW5kIAovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb24KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdyaXRlIERhdGEgRklGTyBXcml0ZSBHZW5lcmF0aW9uLCB3aGVuIGV2ZXIgQWNrZWQgKyBXcml0ZSBSZXF1ZXN0Ci8vICAgTm90ZTogQWNrIHNpZ25hbCBnZW5lcmF0aW9uIGFscmVhZHkgdGFraW5nIGFjY291bnQgb2YgRklGTyBmdWxsIGNvbmRpdGlvbgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCndpcmUgIHdyZGF0YWZpZm9fd3IgID0gd2JfYWNrX28gJiB3Yl93ZV9pIDsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdyaXRlIERhdGEgRklGTyBSZWFkIEdlbmVyYXRpb24sIFdoZW4gZXZlciBOZXh0IFdyaXRlIHJlcXVlc3QgZ2VuZXJhdGVkCi8vIGZyb20gU0RSQU0gQ29udHJvbGxlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kd2lyZSAgd3JkYXRhZmlmb19yZCAgPSBzZHJfd3JfbmV4dDsKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3luYyBXcml0ZSBEYXRhIEZJRk8KLy8gICAgVGhpcyBibG9jayBoYW5kbGUgdGhlIGNsb2NrIGRvbWFpbiBjaGFuZ2Ugb3ZlciArIFdyaXRlIERhdGEgKyBCeXRlIG1hc2sgCi8vICAgIEZyb20gQXBwbGljYXRpb24gbGF5ZXIgdG8gU0RSQU0gY29udHJvbGxlciBsYXllcgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgLy8gV3JpdGUgREFUQSArIERhdGEgTWFzayBGSUZPCiAgICBhc3luY19maWZvICMoLlcoZHcrKGR3LzgpKSwgLkRQKDgpLCAuV1JfRkFTVCgxJ2IwKSwgLlJEX0ZBU1QoMSdiMSkpIHVfd3JkYXRhZmlmbyAoCiAgICAgICAvLyBXcml0ZSBQYXRoICwgU3lzdGVtIGNsb2NrIGRvbWFpbgogICAgICAgICAgLndyX2NsayAgICAgICAgICAgICAod2JfY2xrX2kgICAgICAgICAgICksCiAgICAgICAgICAud3JfcmVzZXRfbiAgICAgICAgICh3Yl9yc3RfbiAgICAgICAgICAgKSwKICAgICAgICAgIC53cl9lbiAgICAgICAgICAgICAgKHdyZGF0YWZpZm9fd3IgICAgICApLAogICAgICAgICAgLndyX2RhdGEgICAgICAgICAgICAoe353Yl9zZWxfaSwgCgkgICAgICAgICAgICAgICAgICAgICAgICAgd2JfZGF0X2l9ICAgICAgICApLAogICAgICAgICAgLmFmdWxsICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAuZnVsbCAgICAgICAgICAgICAgICh3cmRhdGFmaWZvX2Z1bGwgICAgKSwKCgogICAgICAgLy8gUmVhZCBQYXRoICwgU0RSQU0gY2xvY2sgZG9tYWluCiAgICAgICAgICAucmRfY2xrICAgICAgICAgICAgIChzZHJhbV9jbGsgICAgICAgICAgKSwKICAgICAgICAgIC5yZF9yZXNldF9uICAgICAgICAgKHNkcmFtX3Jlc2V0biAgICAgICApLAogICAgICAgICAgLmFlbXB0eSAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAuZW1wdHkgICAgICAgICAgICAgICh3cmRhdGFmaWZvX2VtcHR5ICAgKSwKICAgICAgICAgIC5yZF9lbiAgICAgICAgICAgICAgKHdyZGF0YWZpZm9fcmQgICAgICApLAogICAgICAgICAgLnJkX2RhdGEgICAgICAgICAgICAoe3Nkcl93cl9lbl9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkcl93cl9kYXRhfSAgICAgICkKICAgICApOwovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb2ZmCmFsd2F5cyBAKHBvc2VkZ2Ugd2JfY2xrX2kpIGJlZ2luCiAgaWYgKHdyZGF0YWZpZm9fZnVsbCA9PSAxJ2IxICYmIHdyZGF0YWZpZm9fd3IgPT0gMSdiMSkgIGJlZ2luCiAgICAgJGRpc3BsYXkoIkVSUk9SOiVtIFdSSVRFIERBVEEgRklGTyBXUklURSBPVkVSRkxPVyIpOwogIGVuZCAKZW5kIAoKYWx3YXlzIEAocG9zZWRnZSBzZHJhbV9jbGspIGJlZ2luCiAgIGlmICh3cmRhdGFmaWZvX2VtcHR5ID09IDEnYjEgJiYgd3JkYXRhZmlmb19yZCA9PSAxJ2IxKSBiZWdpbgogICAgICAkZGlzcGxheSgiRVJST1I6JW0gV1JJVEUgREFUQSBGSUZPIFJFQUQgT1ZFUkZMT1ciKTsKICAgZW5kCmVuZCAKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29uCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICBSRUFEIERBVEEgRklGTwovLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpcmUgICAgcmRfZW9wOyAvLyBsYXN0IHJlYWQgaW5kaWNhdGlvbgoKLy8gUmVhZCBGSUZPIHdyaXRlIGdlbmVyYXRpb24sIHdoZW4gZXZlciBTRFJBTSBjb250cm9sbGVyIGlzc3VlcyB0aGUgcmVhZAovLyB2YWxpZCBzaWduYWwKd2lyZSAgICByZGRhdGFmaWZvX3dyID0gc2RyX3JkX3ZhbGlkOwoKLy8gUmVhZCBGSUZPIHJlYWQgZ2VuZXJhdGlvbiwgd2hlbiBldmVyIGFjayBpcyBnZW5lcmF0ZWQgYWxvbmcgd2l0aCByZWFkCi8vIHJlcXVlc3QuCi8vIE5vdGU6IEFjayBnZW5lcmF0aW9uIGlzIGFscmVhZHkgYWNjb3VudGVkIHRoZSB3cml0ZSBGSUZPIE5vdCBFbXB0eQovLyAgICAgICBjb25kaXRpb24Kd2lyZSAgICByZGRhdGFmaWZvX3JkID0gd2JfYWNrX28gJiAhd2Jfd2VfaTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3luYyBSZWFkIEZJRk8KLy8gVGhpcyBibG9jayBoYW5kbGVzIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIG92ZXIgKyBSZWFkIGRhdGEgZnJvbSBTRFJBTQovLyBjb250cm9sbGVyIHRvIEFwcGxpY2F0aW9uIGxheWVyLgovLyAgTm90ZTogCi8vICAgIDEuIFJFQUQgREFUQSBGSUZPIGRlcHRoIGlzIGtlcHQgc21hbGwsIGFzc3VtaW5nIHRoYXQgU3lzLUNMb2NrID4gU0RSQU0gQ2xvY2sKLy8gICAgICAgUkVBRCBEQVRBICsgRU9QCi8vICAgIDIuIEVPUCBpbmRpY2F0ZSwgbGFzdCB0cmFuc2ZlciBvZiBCdXJzdCBSZWFkIEFjY2Vzcy4gdXNlLWZ1bGwgZm9yIGZ1dHVyZQovLyAgICAgICBUYWcgaGFuZGxpbmcgcGVyIGJ1cnN0Ci8vCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgYXN5bmNfZmlmbyAjKC5XKGR3KzEpLCAuRFAoNCksIC5XUl9GQVNUKDEnYjApLCAuUkRfRkFTVCgxJ2IxKSApIHVfcmRkYXRhZmlmbyAoCiAgICAgICAvLyBXcml0ZSBQYXRoICwgU0RSQU0gY2xvY2sgZG9tYWluCiAgICAgICAgICAud3JfY2xrICAgICAgICAgICAgIChzZHJhbV9jbGsgICAgICAgICAgKSwKICAgICAgICAgIC53cl9yZXNldF9uICAgICAgICAgKHNkcmFtX3Jlc2V0biAgICAgICApLAogICAgICAgICAgLndyX2VuICAgICAgICAgICAgICAocmRkYXRhZmlmb193ciAgICAgICksCiAgICAgICAgICAud3JfZGF0YSAgICAgICAgICAgICh7c2RyX2xhc3RfcmQsCgkgICAgICAgICAgICAgICAgICAgICAgICBzZHJfcmRfZGF0YX0gICAgICApLAogICAgICAgICAgLmFmdWxsICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAuZnVsbCAgICAgICAgICAgICAgIChyZGRhdGFmaWZvX2Z1bGwgICAgKSwKCgogICAgICAgLy8gUmVhZCBQYXRoICwgU1lTIGNsb2NrIGRvbWFpbgogICAgICAgICAgLnJkX2NsayAgICAgICAgICAgICAod2JfY2xrX2kgICAgICAgICAgICksCiAgICAgICAgICAucmRfcmVzZXRfbiAgICAgICAgICh3Yl9yc3RfbiAgICAgICAgICAgKSwKICAgICAgICAgIC5lbXB0eSAgICAgICAgICAgICAgKHJkZGF0YWZpZm9fZW1wdHkgICApLAogICAgICAgICAgLmFlbXB0eSAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAucmRfZW4gICAgICAgICAgICAgIChyZGRhdGFmaWZvX3JkICAgICAgKSwKICAgICAgICAgIC5yZF9kYXRhICAgICAgICAgICAgKHtyZF9lb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JfZGF0X299ICAgICAgICAgKQogICAgICk7CgovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb2ZmCmFsd2F5cyBAKHBvc2VkZ2Ugc2RyYW1fY2xrKSBiZWdpbgogIGlmIChyZGRhdGFmaWZvX2Z1bGwgPT0gMSdiMSAmJiByZGRhdGFmaWZvX3dyID09IDEnYjEpICBiZWdpbgogICAgICRkaXNwbGF5KCJFUlJPUjolbSBSRUFEIERBVEEgRklGTyBXUklURSBPVkVSRkxPVyIpOwogIGVuZCAKZW5kIAoKYWx3YXlzIEAocG9zZWRnZSB3Yl9jbGtfaSkgYmVnaW4KICAgaWYgKHJkZGF0YWZpZm9fZW1wdHkgPT0gMSdiMSAmJiByZGRhdGFmaWZvX3JkID09IDEnYjEpIGJlZ2luCiAgICAgICRkaXNwbGF5KCJFUlJPUjolbSBSRUFEIERBVEEgRklGTyBSRUFEIE9WRVJGTE9XIik7CiAgIGVuZAplbmQgCi8vIHN5bm9wc3lzIHRyYW5zbGF0ZV9vbgoKIAplbmRtb2R1bGUK