LyoKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQUFAgICBEREREICAgRkZGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCAgIFAgIEQgICBEICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFBQICAgRCAgIEQgIEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgICAgICBEICAgRCAgRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCAgICAgIEREREQgICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgUmVhZC9Xcml0ZSBQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgRGVzaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaG4gQ3Jpc3R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bHkgMTk5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgQ29weXJpZ2h0IDE5OTktMjAxMiBJbWFnZU1hZ2ljayBTdHVkaW8gTExDLCBhIG5vbi1wcm9maXQgb3JnYW5pemF0aW9uICAgICAgJQolICBkZWRpY2F0ZWQgdG8gbWFraW5nIHNvZnR3YXJlIGltYWdpbmcgc29sdXRpb25zIGZyZWVseSBhdmFpbGFibGUuICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSAgJQolICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZy9zY3JpcHQvbGljZW5zZS5waHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICUKJSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgJQolICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAlCiUgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICUKJSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJQolCiovCgwKLyoKICBJbmNsdWRlIGRlY2xhcmF0aW9ucy4KKi8KI2luY2x1ZGUgIk1hZ2lja0NvcmUvc3R1ZGlvLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2F0dHJpYnV0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9ibG9iLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2Jsb2ItcHJpdmF0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9jYWNoZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9jb2xvci5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9jb2xvci1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbG9yc3BhY2UuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvY29sb3JzcGFjZS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbXByZXNzLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2NvbnN0aXR1dGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvZGVsZWdhdGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvZGVsZWdhdGUtcHJpdmF0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9kcmF3LmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2V4Y2VwdGlvbi5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9leGNlcHRpb24tcHJpdmF0ZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9nZW9tZXRyeS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9pbWFnZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9pbWFnZS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL2xpc3QuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvbWFnaWNrLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL21lbW9yeV8uaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvbW9uaXRvci5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9tb25pdG9yLXByaXZhdGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvb3B0aW9uLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3BpeGVsLWFjY2Vzc29yLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3Byb2ZpbGUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvcHJvcGVydHkuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvcXVhbnR1bS1wcml2YXRlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3Jlc291cmNlXy5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9yZXNpemUuaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvc2lnbmF0dXJlLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL3N0YXRpYy5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9zdHJpbmdfLmgiCiNpbmNsdWRlICJNYWdpY2tDb3JlL21vZHVsZS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS90b2tlbi5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS90cmFuc2Zvcm0uaCIKI2luY2x1ZGUgIk1hZ2lja0NvcmUvdXRpbGl0eS5oIgojaW5jbHVkZSAiTWFnaWNrQ29yZS9tb2R1bGUuaCIKDAovKgogIERlZmluZSBkZWNsYXJhdGlvbnMuCiovCiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfVElGRl9ERUxFR0FURSkKI2RlZmluZSBDQ0lUVFBhcmFtICAiLTEiCiNlbHNlCiNkZWZpbmUgQ0NJVFRQYXJhbSAgIjAiCiNlbmRpZgoMCi8qCiAgRm9yd2FyZCBkZWNsYXJhdGlvbnMuCiovCnN0YXRpYyBNYWdpY2tCb29sZWFuVHlwZQogIFdyaXRlUERGSW1hZ2UoY29uc3QgSW1hZ2VJbmZvICosSW1hZ2UgKixFeGNlcHRpb25JbmZvICopOwoMCi8qCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgIEkgbiB2IG8gayBlIFAgRCBGIEQgZSBsIGUgZyBhIHQgZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUKJSAgSW52b2tlUERGRGVsZWdhdGUoKSBleGVjdXRlcyB0aGUgUERGIGludGVycHJldGVyIHdpdGggdGhlIHNwZWNpZmllZCBjb21tYW5kLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIEludm9rZVBERkRlbGVnYXRlIG1ldGhvZCBpczoKJQolICAgICAgTWFnaWNrQm9vbGVhblR5cGUgSW52b2tlUERGRGVsZWdhdGUoY29uc3QgTWFnaWNrQm9vbGVhblR5cGUgdmVyYm9zZSwKJSAgICAgICAgY29uc3QgY2hhciAqY29tbWFuZCxFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCiUKJSAgQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHBhcmFtZXRlciBmb2xsb3dzOgolCiUgICAgbyB2ZXJib3NlOiBBIHZhbHVlIG90aGVyIHRoYW4gemVybyBkaXNwbGF5cyB0aGUgY29tbWFuZCBwcmlvciB0bwolICAgICAgZXhlY3V0aW5nIGl0LgolCiUgICAgbyBjb21tYW5kOiB0aGUgYWRkcmVzcyBvZiBhIGNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWFuZCB0bwolICAgICAgZXhlY3V0ZS4KJQolICAgIG8gZXhjZXB0aW9uOiByZXR1cm4gYW55IGVycm9ycyBvciB3YXJuaW5ncyBpbiB0aGlzIHN0cnVjdHVyZS4KJQoqLwpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSW52b2tlUERGRGVsZWdhdGUoY29uc3QgTWFnaWNrQm9vbGVhblR5cGUgdmVyYm9zZSwKICBjb25zdCBjaGFyICpjb21tYW5kLEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKewogIGludAogICAgc3RhdHVzOwoKI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9HU19ERUxFR0FURSkgfHwgZGVmaW5lZChNQUdJQ0tDT1JFX1dJTkRPV1NfU1VQUE9SVCkKICBjaGFyCiAgICAqKmFyZ3Y7CgogIGNvbnN0IEdob3N0SW5mbwogICAgKmdob3N0X2luZm87CgogIGdzX21haW5faW5zdGFuY2UKICAgICppbnRlcnByZXRlcjsKCiAgaW50CiAgICBhcmdjLAogICAgY29kZTsKCiAgcmVnaXN0ZXIgc3NpemVfdAogICAgaTsKCiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfV0lORE9XU19TVVBQT1JUKQogIGdob3N0X2luZm89TlRHaG9zdHNjcmlwdERMTFZlY3RvcnMoKTsKI2Vsc2UKICBHaG9zdEluZm8KICAgIGdob3N0X2luZm9fc3RydWN0OwoKICBnaG9zdF9pbmZvPSgmZ2hvc3RfaW5mb19zdHJ1Y3QpOwogICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeSgmZ2hvc3RfaW5mbywwLHNpemVvZihnaG9zdF9pbmZvKSk7CiAgZ2hvc3RfaW5mb19zdHJ1Y3QubmV3X2luc3RhbmNlPShpbnQgKCopKGdzX21haW5faW5zdGFuY2UgKiosdm9pZCAqKSkKICAgIGdzYXBpX25ld19pbnN0YW5jZTsKICBnaG9zdF9pbmZvX3N0cnVjdC5pbml0X3dpdGhfYXJncz0oaW50ICgqKShnc19tYWluX2luc3RhbmNlICosaW50LGNoYXIgKiopKQogICAgZ3NhcGlfaW5pdF93aXRoX2FyZ3M7CiAgZ2hvc3RfaW5mb19zdHJ1Y3QucnVuX3N0cmluZz0oaW50ICgqKShnc19tYWluX2luc3RhbmNlICosY29uc3QgY2hhciAqLGludCwKICAgIGludCAqKSkgZ3NhcGlfcnVuX3N0cmluZzsKICBnaG9zdF9pbmZvX3N0cnVjdC5kZWxldGVfaW5zdGFuY2U9KHZvaWQgKCopKGdzX21haW5faW5zdGFuY2UgKikpCiAgICBnc2FwaV9kZWxldGVfaW5zdGFuY2U7CiAgZ2hvc3RfaW5mb19zdHJ1Y3QuZXhpdD0oaW50ICgqKShnc19tYWluX2luc3RhbmNlICopKSBnc2FwaV9leGl0OwojZW5kaWYKICBpZiAoZ2hvc3RfaW5mbyA9PSAoR2hvc3RJbmZvICopIE5VTEwpCiAgICB7CiAgICAgIHN0YXR1cz1TeXN0ZW1Db21tYW5kKE1hZ2lja0ZhbHNlLHZlcmJvc2UsY29tbWFuZCxleGNlcHRpb24pOwogICAgICByZXR1cm4oc3RhdHVzID09IDAgPyBNYWdpY2tUcnVlIDogTWFnaWNrRmFsc2UpOwogICAgfQogIGlmICh2ZXJib3NlICE9IE1hZ2lja0ZhbHNlKQogICAgewogICAgICAodm9pZCkgZnB1dHMoIltnaG9zdHNjcmlwdCBsaWJyYXJ5XSIsc3Rkb3V0KTsKICAgICAgKHZvaWQpIGZwdXRzKHN0cmNocihjb21tYW5kLCcgJyksc3Rkb3V0KTsKICAgIH0KICBzdGF0dXM9KGdob3N0X2luZm8tPm5ld19pbnN0YW5jZSkoJmludGVycHJldGVyLCh2b2lkICopIE5VTEwpOwogIGlmIChzdGF0dXMgPCAwKQogICAgewogICAgICBzdGF0dXM9U3lzdGVtQ29tbWFuZChNYWdpY2tGYWxzZSx2ZXJib3NlLGNvbW1hbmQsZXhjZXB0aW9uKTsKICAgICAgcmV0dXJuKHN0YXR1cyA9PSAwID8gTWFnaWNrVHJ1ZSA6IE1hZ2lja0ZhbHNlKTsKICAgIH0KICBjb2RlPTA7CiAgYXJndj1TdHJpbmdUb0FyZ3YoY29tbWFuZCwmYXJnYyk7CiAgc3RhdHVzPShnaG9zdF9pbmZvLT5pbml0X3dpdGhfYXJncykoaW50ZXJwcmV0ZXIsYXJnYy0xLGFyZ3YrMSk7CiAgaWYgKHN0YXR1cyA9PSAwKQogICAgc3RhdHVzPShnaG9zdF9pbmZvLT5ydW5fc3RyaW5nKShpbnRlcnByZXRlciwic3lzdGVtZGljdCAvc3RhcnQgZ2V0IGV4ZWNcbiIsCiAgICAgIDAsJmNvZGUpOwogIChnaG9zdF9pbmZvLT5leGl0KShpbnRlcnByZXRlcik7CiAgKGdob3N0X2luZm8tPmRlbGV0ZV9pbnN0YW5jZSkoaW50ZXJwcmV0ZXIpOwojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX1dJTkRPV1NfU1VQUE9SVCkKICBOVEdob3N0c2NyaXB0VW5Mb2FkRExMKCk7CiNlbmRpZgogIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGFyZ2M7IGkrKykKICAgIGFyZ3ZbaV09RGVzdHJveVN0cmluZyhhcmd2W2ldKTsKICBhcmd2PShjaGFyICoqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KGFyZ3YpOwogIGlmICgoc3RhdHVzICE9IDApICYmIChzdGF0dXMgIT0gLTEwMSkpCiAgICB7CiAgICAgIGNoYXIKICAgICAgICAqbWVzc2FnZTsKCiAgICAgIG1lc3NhZ2U9R2V0RXhjZXB0aW9uTWVzc2FnZShlcnJubyk7CiAgICAgICh2b2lkKSBUaHJvd01hZ2lja0V4Y2VwdGlvbihleGNlcHRpb24sR2V0TWFnaWNrTW9kdWxlKCksRGVsZWdhdGVFcnJvciwKICAgICAgICAiYCVzJzogJXMiLGNvbW1hbmQsbWVzc2FnZSk7CiAgICAgIG1lc3NhZ2U9RGVzdHJveVN0cmluZyhtZXNzYWdlKTsKICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgIkdob3N0c2NyaXB0IHJldHVybnMgc3RhdHVzICVkLCBleGl0IGNvZGUgJWQiLHN0YXR1cyxjb2RlKTsKICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgIH0KICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiNlbHNlCiAgc3RhdHVzPVN5c3RlbUNvbW1hbmQoTWFnaWNrRmFsc2UsdmVyYm9zZSxjb21tYW5kLGV4Y2VwdGlvbik7CiAgcmV0dXJuKHN0YXR1cyA9PSAwID8gTWFnaWNrVHJ1ZSA6IE1hZ2lja0ZhbHNlKTsKI2VuZGlmCn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBJIHMgUCBEIEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIElzUERGKCkgcmV0dXJucyBNYWdpY2tUcnVlIGlmIHRoZSBpbWFnZSBmb3JtYXQgdHlwZSwgaWRlbnRpZmllZCBieSB0aGUKJSAgbWFnaWNrIHN0cmluZywgaXMgUERGLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIElzUERGIG1ldGhvZCBpczoKJQolICAgICAgTWFnaWNrQm9vbGVhblR5cGUgSXNQREYoY29uc3QgdW5zaWduZWQgY2hhciAqbWFnaWNrLGNvbnN0IHNpemVfdCBvZmZzZXQpCiUKJSAgQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHBhcmFtZXRlciBmb2xsb3dzOgolCiUgICAgbyBtYWdpY2s6IGNvbXBhcmUgaW1hZ2UgZm9ybWF0IHBhdHRlcm4gYWdhaW5zdCB0aGVzZSBieXRlcy4KJQolICAgIG8gb2Zmc2V0OiBTcGVjaWZpZXMgdGhlIG9mZnNldCBvZiB0aGUgbWFnaWNrIHN0cmluZy4KJQoqLwpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSXNQREYoY29uc3QgdW5zaWduZWQgY2hhciAqbWFnaWNrLGNvbnN0IHNpemVfdCBvZmZzZXQpCnsKICBpZiAob2Zmc2V0IDwgNSkKICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgaWYgKExvY2FsZU5Db21wYXJlKChjb25zdCBjaGFyICopIG1hZ2ljaywiJVBERi0iLDUpID09IDApCiAgICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKfQoMCi8qCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgIFIgZSBhIGQgUCBEIEYgSSBtIGEgZyBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUKJSAgUmVhZFBERkltYWdlKCkgcmVhZHMgYSBQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQgaW1hZ2UgZmlsZSBhbmQKJSAgcmV0dXJucyBpdC4gIEl0IGFsbG9jYXRlcyB0aGUgbWVtb3J5IG5lY2Vzc2FyeSBmb3IgdGhlIG5ldyBJbWFnZSBzdHJ1Y3R1cmUKJSAgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXcgaW1hZ2UuCiUKJSAgVGhlIGZvcm1hdCBvZiB0aGUgUmVhZFBERkltYWdlIG1ldGhvZCBpczoKJQolICAgICAgSW1hZ2UgKlJlYWRQREZJbWFnZShjb25zdCBJbWFnZUluZm8gKmltYWdlX2luZm8sRXhjZXB0aW9uSW5mbyAqZXhjZXB0aW9uKQolCiUgIEEgZGVzY3JpcHRpb24gb2YgZWFjaCBwYXJhbWV0ZXIgZm9sbG93czoKJQolICAgIG8gaW1hZ2VfaW5mbzogdGhlIGltYWdlIGluZm8uCiUKJSAgICBvIGV4Y2VwdGlvbjogcmV0dXJuIGFueSBlcnJvcnMgb3Igd2FybmluZ3MgaW4gdGhpcyBzdHJ1Y3R1cmUuCiUKKi8KCnN0YXRpYyBNYWdpY2tCb29sZWFuVHlwZSBJc1BERlJlbmRlcmVkKGNvbnN0IGNoYXIgKnBhdGgpCnsKICBNYWdpY2tCb29sZWFuVHlwZQogICAgc3RhdHVzOwoKICBzdHJ1Y3Qgc3RhdAogICAgYXR0cmlidXRlczsKCiAgaWYgKChwYXRoID09IChjb25zdCBjaGFyICopIE5VTEwpIHx8ICgqcGF0aCA9PSAnXDAnKSkKICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgc3RhdHVzPUdldFBhdGhBdHRyaWJ1dGVzKHBhdGgsJmF0dHJpYnV0ZXMpOwogIGlmICgoc3RhdHVzICE9IE1hZ2lja0ZhbHNlKSAmJiBTX0lTUkVHKGF0dHJpYnV0ZXMuc3RfbW9kZSkgJiYKICAgICAgKGF0dHJpYnV0ZXMuc3Rfc2l6ZSA+IDApKQogICAgcmV0dXJuKE1hZ2lja1RydWUpOwogIHJldHVybihNYWdpY2tGYWxzZSk7Cn0KCnN0YXRpYyBJbWFnZSAqUmVhZFBERkltYWdlKGNvbnN0IEltYWdlSW5mbyAqaW1hZ2VfaW5mbyxFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCnsKI2RlZmluZSBDTVlLUHJvY2Vzc0NvbG9yICAiQ01ZS1Byb2Nlc3NDb2xvciIKI2RlZmluZSBDcm9wQm94ICAiQ3JvcEJveCIKI2RlZmluZSBEZWZhdWx0Q01ZSyAgIkRlZmF1bHRDTVlLIgojZGVmaW5lIERldmljZUNNWUsgICJEZXZpY2VDTVlLIgojZGVmaW5lIE1lZGlhQm94ICAiTWVkaWFCb3giCiNkZWZpbmUgUmVuZGVyUG9zdHNjcmlwdFRleHQgICJSZW5kZXJpbmcgUG9zdHNjcmlwdC4uLiAgIgojZGVmaW5lIFBERlJvdGF0ZSAgIlJvdGF0ZSIKI2RlZmluZSBTcG90Q29sb3IgICJTZXBhcmF0aW9uIgojZGVmaW5lIFRyaW1Cb3ggICJUcmltQm94IgojZGVmaW5lIFBERlZlcnNpb24gICJQREYtIgoKICBjaGFyCiAgICBjb21tYW5kW01heFRleHRFeHRlbnRdLAogICAgZGVuc2l0eVtNYXhUZXh0RXh0ZW50XSwKICAgIGZpbGVuYW1lW01heFRleHRFeHRlbnRdLAogICAgZ2VvbWV0cnlbTWF4VGV4dEV4dGVudF0sCiAgICBvcHRpb25zW01heFRleHRFeHRlbnRdLAogICAgaW5wdXRfZmlsZW5hbWVbTWF4VGV4dEV4dGVudF0sCiAgICBwb3N0c2NyaXB0X2ZpbGVuYW1lW01heFRleHRFeHRlbnRdOwoKICBjb25zdCBjaGFyCiAgICAqb3B0aW9uOwoKICBjb25zdCBEZWxlZ2F0ZUluZm8KICAgICpkZWxlZ2F0ZV9pbmZvOwoKICBkb3VibGUKICAgIGFuZ2xlOwoKICBHZW9tZXRyeUluZm8KICAgIGdlb21ldHJ5X2luZm87CgogIEltYWdlCiAgICAqaW1hZ2UsCiAgICAqbmV4dCwKICAgICpwZGZfaW1hZ2U7CgogIEltYWdlSW5mbwogICAgKnJlYWRfaW5mbzsKCiAgaW50CiAgICBjLAogICAgZmlsZTsKCiAgTWFnaWNrQm9vbGVhblR5cGUKICAgIGNteWssCiAgICBjcm9wYm94LAogICAgdHJpbWJveCwKICAgIHN0YXR1czsKCiAgTWFnaWNrU3RhdHVzVHlwZQogICAgZmxhZ3M7CgogIFBvaW50SW5mbwogICAgZGVsdGE7CgogIFJlY3RhbmdsZUluZm8KICAgIGJvdW5kaW5nX2JveCwKICAgIHBhZ2U7CgogIHJlZ2lzdGVyIGNoYXIKICAgICpwOwoKICByZWdpc3RlciBzc2l6ZV90CiAgICBpOwoKICBTZWdtZW50SW5mbwogICAgYm91bmRzLAogICAgaGlyZXNfYm91bmRzOwoKICBzaXplX3QKICAgIHNjZW5lLAogICAgc3BvdGNvbG9yOwoKICBzc2l6ZV90CiAgICBjb3VudDsKCiAgYXNzZXJ0KGltYWdlX2luZm8gIT0gKGNvbnN0IEltYWdlSW5mbyAqKSBOVUxMKTsKICBhc3NlcnQoaW1hZ2VfaW5mby0+c2lnbmF0dXJlID09IE1hZ2lja1NpZ25hdHVyZSk7CiAgaWYgKGltYWdlX2luZm8tPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFRyYWNlRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIiwKICAgICAgaW1hZ2VfaW5mby0+ZmlsZW5hbWUpOwogIGFzc2VydChleGNlcHRpb24gIT0gKEV4Y2VwdGlvbkluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGV4Y2VwdGlvbi0+c2lnbmF0dXJlID09IE1hZ2lja1NpZ25hdHVyZSk7CiAgLyoKICAgIE9wZW4gaW1hZ2UgZmlsZS4KICAqLwogIGltYWdlPUFjcXVpcmVJbWFnZShpbWFnZV9pbmZvLGV4Y2VwdGlvbik7CiAgc3RhdHVzPU9wZW5CbG9iKGltYWdlX2luZm8saW1hZ2UsUmVhZEJpbmFyeUJsb2JNb2RlLGV4Y2VwdGlvbik7CiAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgIHsKICAgICAgaW1hZ2U9RGVzdHJveUltYWdlTGlzdChpbWFnZSk7CiAgICAgIHJldHVybigoSW1hZ2UgKikgTlVMTCk7CiAgICB9CiAgc3RhdHVzPUFjcXVpcmVVbmlxdWVTeW1ib2xpY0xpbmsoaW1hZ2VfaW5mby0+ZmlsZW5hbWUsaW5wdXRfZmlsZW5hbWUpOwogIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICB7CiAgICAgIFRocm93RmlsZUV4Y2VwdGlvbihleGNlcHRpb24sRmlsZU9wZW5FcnJvciwiVW5hYmxlVG9DcmVhdGVUZW1wb3JhcnlGaWxlIiwKICAgICAgICBpbWFnZV9pbmZvLT5maWxlbmFtZSk7CiAgICAgIGltYWdlPURlc3Ryb3lJbWFnZUxpc3QoaW1hZ2UpOwogICAgICByZXR1cm4oKEltYWdlICopIE5VTEwpOwogICAgfQogIC8qCiAgICBTZXQgdGhlIHBhZ2UgZGVuc2l0eS4KICAqLwogIGRlbHRhLng9RGVmYXVsdFJlc29sdXRpb247CiAgZGVsdGEueT1EZWZhdWx0UmVzb2x1dGlvbjsKICBpZiAoKGltYWdlLT5yZXNvbHV0aW9uLnggPT0gMC4wKSB8fCAoaW1hZ2UtPnJlc29sdXRpb24ueSA9PSAwLjApKQogICAgewogICAgICBmbGFncz1QYXJzZUdlb21ldHJ5KFBTRGVuc2l0eUdlb21ldHJ5LCZnZW9tZXRyeV9pbmZvKTsKICAgICAgaW1hZ2UtPnJlc29sdXRpb24ueD1nZW9tZXRyeV9pbmZvLnJobzsKICAgICAgaW1hZ2UtPnJlc29sdXRpb24ueT1nZW9tZXRyeV9pbmZvLnNpZ21hOwogICAgICBpZiAoKGZsYWdzICYgU2lnbWFWYWx1ZSkgPT0gMCkKICAgICAgICBpbWFnZS0+cmVzb2x1dGlvbi55PWltYWdlLT5yZXNvbHV0aW9uLng7CiAgICB9CiAgaWYgKGltYWdlX2luZm8tPmRlbnNpdHkgIT0gKGNoYXIgKikgTlVMTCkKICAgIHsKICAgICAgZmxhZ3M9UGFyc2VHZW9tZXRyeShpbWFnZV9pbmZvLT5kZW5zaXR5LCZnZW9tZXRyeV9pbmZvKTsKICAgICAgaW1hZ2UtPnJlc29sdXRpb24ueD1nZW9tZXRyeV9pbmZvLnJobzsKICAgICAgaW1hZ2UtPnJlc29sdXRpb24ueT1nZW9tZXRyeV9pbmZvLnNpZ21hOwogICAgICBpZiAoKGZsYWdzICYgU2lnbWFWYWx1ZSkgPT0gMCkKICAgICAgICBpbWFnZS0+cmVzb2x1dGlvbi55PWltYWdlLT5yZXNvbHV0aW9uLng7CiAgICB9CiAgKHZvaWQpIFBhcnNlQWJzb2x1dGVHZW9tZXRyeShQU1BhZ2VHZW9tZXRyeSwmcGFnZSk7CiAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICh2b2lkKSBQYXJzZUFic29sdXRlR2VvbWV0cnkoaW1hZ2VfaW5mby0+cGFnZSwmcGFnZSk7CiAgcGFnZS53aWR0aD0oc2l6ZV90KSBjZWlsKChkb3VibGUpIChwYWdlLndpZHRoKmltYWdlLT5yZXNvbHV0aW9uLngvZGVsdGEueCktCiAgICAwLjUpOwogIHBhZ2UuaGVpZ2h0PShzaXplX3QpIGNlaWwoKGRvdWJsZSkgKHBhZ2UuaGVpZ2h0KmltYWdlLT5yZXNvbHV0aW9uLnkvZGVsdGEueSktCiAgICAwLjUpOwogIC8qCiAgICBEZXRlcm1pbmUgcGFnZSBnZW9tZXRyeSBmcm9tIHRoZSBQREYgbWVkaWEgYm94LgogICovCiAgY215az1pbWFnZV9pbmZvLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlID8gTWFnaWNrVHJ1ZSA6IE1hZ2lja0ZhbHNlOwogIGNyb3Bib3g9SXNTdHJpbmdUcnVlKEdldEltYWdlT3B0aW9uKGltYWdlX2luZm8sInBkZjp1c2UtY3JvcGJveCIpKTsKICB0cmltYm94PUlzU3RyaW5nVHJ1ZShHZXRJbWFnZU9wdGlvbihpbWFnZV9pbmZvLCJwZGY6dXNlLXRyaW1ib3giKSk7CiAgY291bnQ9MDsKICBzcG90Y29sb3I9MDsKICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoJmJvdW5kaW5nX2JveCwwLHNpemVvZihib3VuZGluZ19ib3gpKTsKICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoJmJvdW5kcywwLHNpemVvZihib3VuZHMpKTsKICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoJmhpcmVzX2JvdW5kcywwLHNpemVvZihoaXJlc19ib3VuZHMpKTsKICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoY29tbWFuZCwwLHNpemVvZihjb21tYW5kKSk7CiAgYW5nbGU9MC4wOwogIHA9Y29tbWFuZDsKICBmb3IgKGM9UmVhZEJsb2JCeXRlKGltYWdlKTsgYyAhPSBFT0Y7IGM9UmVhZEJsb2JCeXRlKGltYWdlKSkKICB7CiAgICAvKgogICAgICBOb3RlIFBERiBlbGVtZW50cy4KICAgICovCiAgICBpZiAoYyA9PSAnXG4nKQogICAgICBjPScgJzsKICAgICpwKys9KGNoYXIpIGM7CiAgICBpZiAoKGMgIT0gKGludCkgJy8nKSAmJiAoYyAhPSAoaW50KSAnJScpICYmCiAgICAgICAgKChzaXplX3QpIChwLWNvbW1hbmQpIDwgKE1heFRleHRFeHRlbnQtMSkpKQogICAgICBjb250aW51ZTsKICAgICooLS1wKT0nXDAnOwogICAgcD1jb21tYW5kOwogICAgaWYgKExvY2FsZU5Db21wYXJlKFBERlJvdGF0ZSxjb21tYW5kLHN0cmxlbihQREZSb3RhdGUpKSA9PSAwKQogICAgICBjb3VudD0oc3NpemVfdCkgc3NjYW5mKGNvbW1hbmQsIlJvdGF0ZSAlbGYiLCZhbmdsZSk7CiAgICAvKgogICAgICBJcyB0aGlzIGEgQ01ZSyBkb2N1bWVudD8KICAgICovCiAgICBpZiAoTG9jYWxlTkNvbXBhcmUoRGVmYXVsdENNWUssY29tbWFuZCxzdHJsZW4oRGVmYXVsdENNWUspKSA9PSAwKQogICAgICBjbXlrPU1hZ2lja1RydWU7CiAgICBpZiAoTG9jYWxlTkNvbXBhcmUoRGV2aWNlQ01ZSyxjb21tYW5kLHN0cmxlbihEZXZpY2VDTVlLKSkgPT0gMCkKICAgICAgY215az1NYWdpY2tUcnVlOwogICAgaWYgKExvY2FsZU5Db21wYXJlKENNWUtQcm9jZXNzQ29sb3IsY29tbWFuZCxzdHJsZW4oQ01ZS1Byb2Nlc3NDb2xvcikpID09IDApCiAgICAgIGNteWs9TWFnaWNrVHJ1ZTsKICAgIGlmIChMb2NhbGVOQ29tcGFyZShTcG90Q29sb3IsY29tbWFuZCxzdHJsZW4oU3BvdENvbG9yKSkgPT0gMCkKICAgICAgewogICAgICAgIGNoYXIKICAgICAgICAgIG5hbWVbTWF4VGV4dEV4dGVudF0sCiAgICAgICAgICBwcm9wZXJ0eVtNYXhUZXh0RXh0ZW50XSwKICAgICAgICAgICp2YWx1ZTsKCiAgICAgICAgcmVnaXN0ZXIgc3NpemVfdAogICAgICAgICAgaTsKCiAgICAgICAgLyoKICAgICAgICAgIE5vdGUgc3BvdCBuYW1lcy4KICAgICAgICAqLwogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcocHJvcGVydHksTWF4VGV4dEV4dGVudCwicGRmOlNwb3RDb2xvci0lLjIwZyIsCiAgICAgICAgICAoZG91YmxlKSBzcG90Y29sb3IrKyk7CiAgICAgICAgaT0wOwogICAgICAgIGZvciAoYz1SZWFkQmxvYkJ5dGUoaW1hZ2UpOyBjICE9IEVPRjsgYz1SZWFkQmxvYkJ5dGUoaW1hZ2UpKQogICAgICAgIHsKICAgICAgICAgIGlmICgoaXNzcGFjZShjKSAhPSAwKSB8fCAoYyA9PSAnLycpIHx8ICgoaSsxKSA9PSBNYXhUZXh0RXh0ZW50KSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBuYW1lW2krK109KGNoYXIpIGM7CiAgICAgICAgfQogICAgICAgIG5hbWVbaV09J1wwJzsKICAgICAgICB2YWx1ZT1BY3F1aXJlU3RyaW5nKG5hbWUpOwogICAgICAgICh2b2lkKSBTdWJzdGl0dXRlU3RyaW5nKCZ2YWx1ZSwiIzIwIiwiICIpOwogICAgICAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KGltYWdlLHByb3BlcnR5LHZhbHVlLGV4Y2VwdGlvbik7CiAgICAgICAgdmFsdWU9RGVzdHJveVN0cmluZyh2YWx1ZSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIGlmIChMb2NhbGVOQ29tcGFyZShQREZWZXJzaW9uLGNvbW1hbmQsc3RybGVuKFBERlZlcnNpb24pKSA9PSAwKQogICAgICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwicGRmOlZlcnNpb24iLGNvbW1hbmQsZXhjZXB0aW9uKTsKICAgIGlmIChpbWFnZV9pbmZvLT5wYWdlICE9IChjaGFyICopIE5VTEwpCiAgICAgIGNvbnRpbnVlOwogICAgY291bnQ9MDsKICAgIGlmIChjcm9wYm94ICE9IE1hZ2lja0ZhbHNlKQogICAgICB7CiAgICAgICAgaWYgKExvY2FsZU5Db21wYXJlKENyb3BCb3gsY29tbWFuZCxzdHJsZW4oQ3JvcEJveCkpID09IDApCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgTm90ZSByZWdpb24gZGVmaW5lZCBieSBjcm9wIGJveC4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgY291bnQ9KHNzaXplX3QpIHNzY2FuZihjb21tYW5kLCJDcm9wQm94IFslbGYgJWxmICVsZiAlbGYiLAogICAgICAgICAgICAgICZib3VuZHMueDEsJmJvdW5kcy55MSwmYm91bmRzLngyLCZib3VuZHMueTIpOwogICAgICAgICAgICBpZiAoY291bnQgIT0gNCkKICAgICAgICAgICAgICBjb3VudD0oc3NpemVfdCkgc3NjYW5mKGNvbW1hbmQsIkNyb3BCb3hbJWxmICVsZiAlbGYgJWxmIiwKICAgICAgICAgICAgICAgICZib3VuZHMueDEsJmJvdW5kcy55MSwmYm91bmRzLngyLCZib3VuZHMueTIpOwogICAgICAgICAgfQogICAgICB9CiAgICBlbHNlCiAgICAgIGlmICh0cmltYm94ICE9IE1hZ2lja0ZhbHNlKQogICAgICAgIHsKICAgICAgICAgIGlmIChMb2NhbGVOQ29tcGFyZShUcmltQm94LGNvbW1hbmQsc3RybGVuKFRyaW1Cb3gpKSA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIE5vdGUgcmVnaW9uIGRlZmluZWQgYnkgdHJpbSBib3guCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBjb3VudD0oc3NpemVfdCkgc3NjYW5mKGNvbW1hbmQsIlRyaW1Cb3ggWyVsZiAlbGYgJWxmICVsZiIsCiAgICAgICAgICAgICAgICAmYm91bmRzLngxLCZib3VuZHMueTEsJmJvdW5kcy54MiwmYm91bmRzLnkyKTsKICAgICAgICAgICAgICBpZiAoY291bnQgIT0gNCkKICAgICAgICAgICAgICAgIGNvdW50PShzc2l6ZV90KSBzc2NhbmYoY29tbWFuZCwiVHJpbUJveFslbGYgJWxmICVsZiAlbGYiLAogICAgICAgICAgICAgICAgICAmYm91bmRzLngxLCZib3VuZHMueTEsJmJvdW5kcy54MiwmYm91bmRzLnkyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIGlmIChMb2NhbGVOQ29tcGFyZShNZWRpYUJveCxjb21tYW5kLHN0cmxlbihNZWRpYUJveCkpID09IDApCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgTm90ZSByZWdpb24gZGVmaW5lZCBieSBtZWRpYSBib3guCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvdW50PShzc2l6ZV90KSBzc2NhbmYoY29tbWFuZCwiTWVkaWFCb3ggWyVsZiAlbGYgJWxmICVsZiIsCiAgICAgICAgICAgICAgJmJvdW5kcy54MSwmYm91bmRzLnkxLCZib3VuZHMueDIsJmJvdW5kcy55Mik7CiAgICAgICAgICAgIGlmIChjb3VudCAhPSA0KQogICAgICAgICAgICAgIGNvdW50PShzc2l6ZV90KSBzc2NhbmYoY29tbWFuZCwiTWVkaWFCb3hbJWxmICVsZiAlbGYgJWxmIiwKICAgICAgICAgICAgICAgICZib3VuZHMueDEsJmJvdW5kcy55MSwmYm91bmRzLngyLCZib3VuZHMueTIpOwogICAgICAgICAgfQogICAgaWYgKGNvdW50ICE9IDQpCiAgICAgIGNvbnRpbnVlOwogICAgaWYgKChmYWJzKGJvdW5kcy54Mi1ib3VuZHMueDEpIDw9IGZhYnMoaGlyZXNfYm91bmRzLngyLWhpcmVzX2JvdW5kcy54MSkpIHx8CiAgICAgICAgKGZhYnMoYm91bmRzLnkyLWJvdW5kcy55MSkgPD0gZmFicyhoaXJlc19ib3VuZHMueTItaGlyZXNfYm91bmRzLnkxKSkpCiAgICAgIGNvbnRpbnVlOwogICAgaGlyZXNfYm91bmRzPWJvdW5kczsKICB9CiAgaWYgKChmYWJzKGhpcmVzX2JvdW5kcy54Mi1oaXJlc19ib3VuZHMueDEpID49IE1hZ2lja0Vwc2lsb24pICYmIAogICAgICAoZmFicyhoaXJlc19ib3VuZHMueTItaGlyZXNfYm91bmRzLnkxKSA+PSBNYWdpY2tFcHNpbG9uKSkKICAgIHsKICAgICAgLyoKICAgICAgICBTZXQgUERGIHJlbmRlciBnZW9tZXRyeS4KICAgICAgKi8KICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlZ3glZyUrLjE1ZyUrLjE1ZyIsCiAgICAgICAgaGlyZXNfYm91bmRzLngyLWJvdW5kcy54MSxoaXJlc19ib3VuZHMueTItaGlyZXNfYm91bmRzLnkxLAogICAgICAgIGhpcmVzX2JvdW5kcy54MSxoaXJlc19ib3VuZHMueTEpOwogICAgICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwicGRmOkhpUmVzQm91bmRpbmdCb3giLGdlb21ldHJ5LGV4Y2VwdGlvbik7CiAgICAgIHBhZ2Uud2lkdGg9KHNpemVfdCkgY2VpbCgoZG91YmxlKSAoKGhpcmVzX2JvdW5kcy54Mi1oaXJlc19ib3VuZHMueDEpKgogICAgICAgIGltYWdlLT5yZXNvbHV0aW9uLngvZGVsdGEueCktMC41KTsKICAgICAgcGFnZS5oZWlnaHQ9KHNpemVfdCkgY2VpbCgoZG91YmxlKSAoKGhpcmVzX2JvdW5kcy55Mi1oaXJlc19ib3VuZHMueTEpKgogICAgICAgIGltYWdlLT5yZXNvbHV0aW9uLnkvZGVsdGEueSktMC41KTsKICAgIH0KICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICBpZiAoKGZhYnMoYW5nbGUpID09IDkwLjApIHx8IChmYWJzKGFuZ2xlKSA9PSAyNzAuMCkpCiAgICB7CiAgICAgIHNpemVfdAogICAgICAgIHN3YXA7CgogICAgICBzd2FwPXBhZ2Uud2lkdGg7CiAgICAgIHBhZ2Uud2lkdGg9cGFnZS5oZWlnaHQ7CiAgICAgIHBhZ2UuaGVpZ2h0PXN3YXA7CiAgICB9CiAgaWYgKElzc1JHQkNvbXBhdGlibGVDb2xvcnNwYWNlKGltYWdlX2luZm8tPmNvbG9yc3BhY2UpICE9IE1hZ2lja0ZhbHNlKQogICAgY215az1NYWdpY2tGYWxzZTsKICAvKgogICAgQ3JlYXRlIEdob3N0c2NyaXB0IGNvbnRyb2wgZmlsZS4KICAqLwogIGZpbGU9QWNxdWlyZVVuaXF1ZUZpbGVSZXNvdXJjZShwb3N0c2NyaXB0X2ZpbGVuYW1lKTsKICBpZiAoZmlsZSA9PSAtMSkKICAgIHsKICAgICAgVGhyb3dGaWxlRXhjZXB0aW9uKGV4Y2VwdGlvbixGaWxlT3BlbkVycm9yLCJVbmFibGVUb0NyZWF0ZVRlbXBvcmFyeUZpbGUiLAogICAgICAgIGltYWdlX2luZm8tPmZpbGVuYW1lKTsKICAgICAgaW1hZ2U9RGVzdHJveUltYWdlKGltYWdlKTsKICAgICAgcmV0dXJuKChJbWFnZSAqKSBOVUxMKTsKICAgIH0KICBjb3VudD13cml0ZShmaWxlLCIgIiwxKTsKICBmaWxlPWNsb3NlKGZpbGUpLTE7CiAgLyoKICAgIFJlbmRlciBQb3N0c2NyaXB0IHdpdGggdGhlIEdob3N0c2NyaXB0IGRlbGVnYXRlLgogICovCiAgaWYgKChpbWFnZV9pbmZvLT5waW5nICE9IE1hZ2lja0ZhbHNlKSB8fAogICAgICAoaW1hZ2VfaW5mby0+bW9ub2Nocm9tZSAhPSBNYWdpY2tGYWxzZSkpCiAgICBkZWxlZ2F0ZV9pbmZvPUdldERlbGVnYXRlSW5mbygicHM6bW9ubyIsKGNoYXIgKikgTlVMTCxleGNlcHRpb24pOwogIGVsc2UKICAgICBpZiAoY215ayAhPSBNYWdpY2tGYWxzZSkKICAgICAgIGRlbGVnYXRlX2luZm89R2V0RGVsZWdhdGVJbmZvKCJwczpjbXlrIiwoY2hhciAqKSBOVUxMLGV4Y2VwdGlvbik7CiAgICAgZWxzZQogICAgICAgZGVsZWdhdGVfaW5mbz1HZXREZWxlZ2F0ZUluZm8oInBzOmFscGhhIiwoY2hhciAqKSBOVUxMLGV4Y2VwdGlvbik7CiAgaWYgKGRlbGVnYXRlX2luZm8gPT0gKGNvbnN0IERlbGVnYXRlSW5mbyAqKSBOVUxMKQogICAgewogICAgICAodm9pZCkgUmVsaW5xdWlzaFVuaXF1ZUZpbGVSZXNvdXJjZShwb3N0c2NyaXB0X2ZpbGVuYW1lKTsKICAgICAgaW1hZ2U9RGVzdHJveUltYWdlKGltYWdlKTsKICAgICAgcmV0dXJuKChJbWFnZSAqKSBOVUxMKTsKICAgIH0KICAqb3B0aW9ucz0nXDAnOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoZGVuc2l0eSxNYXhUZXh0RXh0ZW50LCIlZ3glZyIsaW1hZ2UtPnJlc29sdXRpb24ueCwKICAgIGltYWdlLT5yZXNvbHV0aW9uLnkpOwogIGlmIChpbWFnZV9pbmZvLT5wYWdlICE9IChjaGFyICopIE5VTEwpCiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclLjIwZ3glLjIwZyAiLChkb3VibGUpCiAgICAgICBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICBpZiAoY215ayAhPSBNYWdpY2tGYWxzZSkKICAgICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyhvcHRpb25zLCItZFVzZUNJRUNvbG9yICIsTWF4VGV4dEV4dGVudCk7CiAgaWYgKGNyb3Bib3ggIT0gTWFnaWNrRmFsc2UpCiAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucywiLWRVc2VDcm9wQm94ICIsTWF4VGV4dEV4dGVudCk7CiAgaWYgKHRyaW1ib3ggIT0gTWFnaWNrRmFsc2UpCiAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucywiLWRVc2VUcmltQm94ICIsTWF4VGV4dEV4dGVudCk7CiAgcmVhZF9pbmZvPUNsb25lSW1hZ2VJbmZvKGltYWdlX2luZm8pOwogICpyZWFkX2luZm8tPm1hZ2ljaz0nXDAnOwogIGlmIChyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMCkKICAgIHsKICAgICAgY2hhcgogICAgICAgIHBhZ2VzW01heFRleHRFeHRlbnRdOwoKICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhwYWdlcyxNYXhUZXh0RXh0ZW50LCItZEZpcnN0UGFnZT0lLjIwZyAiCiAgICAgICAgIi1kTGFzdFBhZ2U9JS4yMGciLChkb3VibGUpIHJlYWRfaW5mby0+c2NlbmUrMSwoZG91YmxlKQogICAgICAgIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucyxwYWdlcyxNYXhUZXh0RXh0ZW50KTsKICAgICAgcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzPTA7CiAgICAgIGlmIChyZWFkX2luZm8tPnNjZW5lcyAhPSAoY2hhciAqKSBOVUxMKQogICAgICAgICpyZWFkX2luZm8tPnNjZW5lcz0nXDAnOwogICAgfQogIG9wdGlvbj1HZXRJbWFnZU9wdGlvbihyZWFkX2luZm8sImF1dGhlbnRpY2F0ZSIpOwogIGlmIChvcHRpb24gIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcob3B0aW9ucytzdHJsZW4ob3B0aW9ucyksTWF4VGV4dEV4dGVudCwKICAgICAgIiAtc1BDTFBhc3N3b3JkPSVzIixvcHRpb24pOwogICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGZpbGVuYW1lLHJlYWRfaW5mby0+ZmlsZW5hbWUsTWF4VGV4dEV4dGVudCk7CiAgKHZvaWQpIEFjcXVpcmVVbmlxdWVGaWxlbmFtZShmaWxlbmFtZSk7CiAgKHZvaWQpIENvbmNhdGVuYXRlTWFnaWNrU3RyaW5nKGZpbGVuYW1lLCItJTA4ZCIsTWF4VGV4dEV4dGVudCk7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhjb21tYW5kLE1heFRleHRFeHRlbnQsCiAgICBHZXREZWxlZ2F0ZUNvbW1hbmRzKGRlbGVnYXRlX2luZm8pLAogICAgcmVhZF9pbmZvLT5hbnRpYWxpYXMgIT0gTWFnaWNrRmFsc2UgPyA0IDogMSwKICAgIHJlYWRfaW5mby0+YW50aWFsaWFzICE9IE1hZ2lja0ZhbHNlID8gNCA6IDEsZGVuc2l0eSxvcHRpb25zLGZpbGVuYW1lLAogICAgcG9zdHNjcmlwdF9maWxlbmFtZSxpbnB1dF9maWxlbmFtZSk7CiAgc3RhdHVzPUludm9rZVBERkRlbGVnYXRlKHJlYWRfaW5mby0+dmVyYm9zZSxjb21tYW5kLGV4Y2VwdGlvbik7CiAgKHZvaWQpIFJlbGlucXVpc2hVbmlxdWVGaWxlUmVzb3VyY2UocG9zdHNjcmlwdF9maWxlbmFtZSk7CiAgKHZvaWQpIFJlbGlucXVpc2hVbmlxdWVGaWxlUmVzb3VyY2UoaW5wdXRfZmlsZW5hbWUpOwogIHBkZl9pbWFnZT0oSW1hZ2UgKikgTlVMTDsKICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgZm9yIChpPTE7IDsgaSsrKQogICAgewogICAgICAodm9pZCkgSW50ZXJwcmV0SW1hZ2VGaWxlbmFtZShpbWFnZV9pbmZvLGltYWdlLGZpbGVuYW1lLChpbnQpIGksCiAgICAgICAgcmVhZF9pbmZvLT5maWxlbmFtZSxleGNlcHRpb24pOwogICAgICBpZiAoSXNQREZSZW5kZXJlZChyZWFkX2luZm8tPmZpbGVuYW1lKSA9PSBNYWdpY2tGYWxzZSkKICAgICAgICBicmVhazsKICAgICAgKHZvaWQpIFJlbGlucXVpc2hVbmlxdWVGaWxlUmVzb3VyY2UocmVhZF9pbmZvLT5maWxlbmFtZSk7CiAgICB9CiAgZWxzZQogICAgZm9yIChpPTE7IDsgaSsrKQogICAgewogICAgICAodm9pZCkgSW50ZXJwcmV0SW1hZ2VGaWxlbmFtZShpbWFnZV9pbmZvLGltYWdlLGZpbGVuYW1lLChpbnQpIGksCiAgICAgICAgcmVhZF9pbmZvLT5maWxlbmFtZSxleGNlcHRpb24pOwogICAgICBpZiAoSXNQREZSZW5kZXJlZChyZWFkX2luZm8tPmZpbGVuYW1lKSA9PSBNYWdpY2tGYWxzZSkKICAgICAgICBicmVhazsKICAgICAgcmVhZF9pbmZvLT5ibG9iPU5VTEw7CiAgICAgIHJlYWRfaW5mby0+bGVuZ3RoPTA7CiAgICAgIG5leHQ9UmVhZEltYWdlKHJlYWRfaW5mbyxleGNlcHRpb24pOwogICAgICAodm9pZCkgUmVsaW5xdWlzaFVuaXF1ZUZpbGVSZXNvdXJjZShyZWFkX2luZm8tPmZpbGVuYW1lKTsKICAgICAgaWYgKG5leHQgPT0gKEltYWdlICopIE5VTEwpCiAgICAgICAgYnJlYWs7CiAgICAgIEFwcGVuZEltYWdlVG9MaXN0KCZwZGZfaW1hZ2UsbmV4dCk7CiAgICB9CiAgcmVhZF9pbmZvPURlc3Ryb3lJbWFnZUluZm8ocmVhZF9pbmZvKTsKICBpZiAocGRmX2ltYWdlID09IChJbWFnZSAqKSBOVUxMKQogICAgewogICAgICBUaHJvd0ZpbGVFeGNlcHRpb24oZXhjZXB0aW9uLERlbGVnYXRlRXJyb3IsIlBvc3RzY3JpcHREZWxlZ2F0ZUZhaWxlZCIsCiAgICAgICAgaW1hZ2VfaW5mby0+ZmlsZW5hbWUpOwogICAgICBpbWFnZT1EZXN0cm95SW1hZ2UoaW1hZ2UpOwogICAgICByZXR1cm4oKEltYWdlICopIE5VTEwpOwogICAgfQogIGlmIChMb2NhbGVDb21wYXJlKHBkZl9pbWFnZS0+bWFnaWNrLCJCTVAiKSA9PSAwKQogICAgewogICAgICBJbWFnZQogICAgICAgICpjbXlrX2ltYWdlOwoKICAgICAgY215a19pbWFnZT1Db25zb2xpZGF0ZUNNWUtJbWFnZXMocGRmX2ltYWdlLGV4Y2VwdGlvbik7CiAgICAgIGlmIChjbXlrX2ltYWdlICE9IChJbWFnZSAqKSBOVUxMKQogICAgICAgIHsKICAgICAgICAgIHBkZl9pbWFnZT1EZXN0cm95SW1hZ2VMaXN0KHBkZl9pbWFnZSk7CiAgICAgICAgICBwZGZfaW1hZ2U9Y215a19pbWFnZTsKICAgICAgICB9CiAgICB9CiAgaWYgKGltYWdlX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMCkKICAgIHsKICAgICAgSW1hZ2UKICAgICAgICAqY2xvbmVfaW1hZ2U7CgogICAgICByZWdpc3RlciBzc2l6ZV90CiAgICAgICAgaTsKCiAgICAgIC8qCiAgICAgICAgQWRkIHBsYWNlIGhvbGRlciBpbWFnZXMgdG8gbWVldCB0aGUgc3ViaW1hZ2Ugc3BlY2lmaWNhdGlvbiByZXF1aXJlbWVudC4KICAgICAgKi8KICAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgaW1hZ2VfaW5mby0+c2NlbmU7IGkrKykKICAgICAgewogICAgICAgIGNsb25lX2ltYWdlPUNsb25lSW1hZ2UocGRmX2ltYWdlLDEsMSxNYWdpY2tUcnVlLGV4Y2VwdGlvbik7CiAgICAgICAgaWYgKGNsb25lX2ltYWdlICE9IChJbWFnZSAqKSBOVUxMKQogICAgICAgICAgUHJlcGVuZEltYWdlVG9MaXN0KCZwZGZfaW1hZ2UsY2xvbmVfaW1hZ2UpOwogICAgICB9CiAgICB9CiAgZG8KICB7CiAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhwZGZfaW1hZ2UtPmZpbGVuYW1lLGZpbGVuYW1lLE1heFRleHRFeHRlbnQpOwogICAgcGRmX2ltYWdlLT5wYWdlPXBhZ2U7CiAgICAodm9pZCkgQ2xvbmVJbWFnZVByb2ZpbGVzKHBkZl9pbWFnZSxpbWFnZSk7CiAgICAodm9pZCkgQ2xvbmVJbWFnZVByb3BlcnRpZXMocGRmX2ltYWdlLGltYWdlKTsKICAgIG5leHQ9U3luY05leHRJbWFnZUluTGlzdChwZGZfaW1hZ2UpOwogICAgaWYgKG5leHQgIT0gKEltYWdlICopIE5VTEwpCiAgICAgIHBkZl9pbWFnZT1uZXh0OwogIH0gd2hpbGUgKG5leHQgIT0gKEltYWdlICopIE5VTEwpOwogIGltYWdlPURlc3Ryb3lJbWFnZShpbWFnZSk7CiAgc2NlbmU9MDsKICBmb3IgKG5leHQ9R2V0Rmlyc3RJbWFnZUluTGlzdChwZGZfaW1hZ2UpOyBuZXh0ICE9IChJbWFnZSAqKSBOVUxMOyApCiAgewogICAgbmV4dC0+c2NlbmU9c2NlbmUrKzsKICAgIG5leHQ9R2V0TmV4dEltYWdlSW5MaXN0KG5leHQpOwogIH0KICByZXR1cm4oR2V0Rmlyc3RJbWFnZUluTGlzdChwZGZfaW1hZ2UpKTsKfQoMCi8qCiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgIFIgZSBnIGkgcyB0IGUgciBQIEQgRiBJIG0gYSBnIGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUKJSAgUmVnaXN0ZXJQREZJbWFnZSgpIGFkZHMgcHJvcGVydGllcyBmb3IgdGhlIFBERiBpbWFnZSBmb3JtYXQgdG8KJSAgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuICBUaGUgcHJvcGVydGllcyBpbmNsdWRlIHRoZSBpbWFnZSBmb3JtYXQKJSAgdGFnLCBhIG1ldGhvZCB0byByZWFkIGFuZC9vciB3cml0ZSB0aGUgZm9ybWF0LCB3aGV0aGVyIHRoZSBmb3JtYXQKJSAgc3VwcG9ydHMgdGhlIHNhdmluZyBvZiBtb3JlIHRoYW4gb25lIGZyYW1lIHRvIHRoZSBzYW1lIGZpbGUgb3IgYmxvYiwKJSAgd2hldGhlciB0aGUgZm9ybWF0IHN1cHBvcnRzIG5hdGl2ZSBpbi1tZW1vcnkgSS9PLCBhbmQgYSBicmllZgolICBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0LgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIFJlZ2lzdGVyUERGSW1hZ2UgbWV0aG9kIGlzOgolCiUgICAgICBzaXplX3QgUmVnaXN0ZXJQREZJbWFnZSh2b2lkKQolCiovCk1vZHVsZUV4cG9ydCBzaXplX3QgUmVnaXN0ZXJQREZJbWFnZSh2b2lkKQp7CiAgTWFnaWNrSW5mbwogICAgKmVudHJ5OwoKICBlbnRyeT1TZXRNYWdpY2tJbmZvKCJBSSIpOwogIGVudHJ5LT5kZWNvZGVyPShEZWNvZGVJbWFnZUhhbmRsZXIgKikgUmVhZFBERkltYWdlOwogIGVudHJ5LT5lbmNvZGVyPShFbmNvZGVJbWFnZUhhbmRsZXIgKikgV3JpdGVQREZJbWFnZTsKICBlbnRyeS0+YWRqb2luPU1hZ2lja0ZhbHNlOwogIGVudHJ5LT5ibG9iX3N1cHBvcnQ9TWFnaWNrRmFsc2U7CiAgZW50cnktPnNlZWthYmxlX3N0cmVhbT1NYWdpY2tUcnVlOwogIGVudHJ5LT50aHJlYWRfc3VwcG9ydD1FbmNvZGVyVGhyZWFkU3VwcG9ydDsKICBlbnRyeS0+ZGVzY3JpcHRpb249Q29uc3RhbnRTdHJpbmcoIkFkb2JlIElsbHVzdHJhdG9yIENTMiIpOwogIGVudHJ5LT5tb2R1bGU9Q29uc3RhbnRTdHJpbmcoIlBERiIpOwogICh2b2lkKSBSZWdpc3Rlck1hZ2lja0luZm8oZW50cnkpOwogIGVudHJ5PVNldE1hZ2lja0luZm8oIkVQREYiKTsKICBlbnRyeS0+ZGVjb2Rlcj0oRGVjb2RlSW1hZ2VIYW5kbGVyICopIFJlYWRQREZJbWFnZTsKICBlbnRyeS0+ZW5jb2Rlcj0oRW5jb2RlSW1hZ2VIYW5kbGVyICopIFdyaXRlUERGSW1hZ2U7CiAgZW50cnktPmFkam9pbj1NYWdpY2tGYWxzZTsKICBlbnRyeS0+YmxvYl9zdXBwb3J0PU1hZ2lja0ZhbHNlOwogIGVudHJ5LT5zZWVrYWJsZV9zdHJlYW09TWFnaWNrVHJ1ZTsKICBlbnRyeS0+dGhyZWFkX3N1cHBvcnQ9RW5jb2RlclRocmVhZFN1cHBvcnQ7CiAgZW50cnktPmRlc2NyaXB0aW9uPUNvbnN0YW50U3RyaW5nKCJFbmNhcHN1bGF0ZWQgUG9ydGFibGUgRG9jdW1lbnQgRm9ybWF0Iik7CiAgZW50cnktPm1vZHVsZT1Db25zdGFudFN0cmluZygiUERGIik7CiAgKHZvaWQpIFJlZ2lzdGVyTWFnaWNrSW5mbyhlbnRyeSk7CiAgZW50cnk9U2V0TWFnaWNrSW5mbygiUERGIik7CiAgZW50cnktPmRlY29kZXI9KERlY29kZUltYWdlSGFuZGxlciAqKSBSZWFkUERGSW1hZ2U7CiAgZW50cnktPmVuY29kZXI9KEVuY29kZUltYWdlSGFuZGxlciAqKSBXcml0ZVBERkltYWdlOwogIGVudHJ5LT5tYWdpY2s9KElzSW1hZ2VGb3JtYXRIYW5kbGVyICopIElzUERGOwogIGVudHJ5LT5ibG9iX3N1cHBvcnQ9TWFnaWNrRmFsc2U7CiAgZW50cnktPnNlZWthYmxlX3N0cmVhbT1NYWdpY2tUcnVlOwogIGVudHJ5LT50aHJlYWRfc3VwcG9ydD1FbmNvZGVyVGhyZWFkU3VwcG9ydDsKICBlbnRyeS0+ZGVzY3JpcHRpb249Q29uc3RhbnRTdHJpbmcoIlBvcnRhYmxlIERvY3VtZW50IEZvcm1hdCIpOwogIGVudHJ5LT5tb2R1bGU9Q29uc3RhbnRTdHJpbmcoIlBERiIpOwogICh2b2lkKSBSZWdpc3Rlck1hZ2lja0luZm8oZW50cnkpOwogIGVudHJ5PVNldE1hZ2lja0luZm8oIlBERkEiKTsKICBlbnRyeS0+ZGVjb2Rlcj0oRGVjb2RlSW1hZ2VIYW5kbGVyICopIFJlYWRQREZJbWFnZTsKICBlbnRyeS0+ZW5jb2Rlcj0oRW5jb2RlSW1hZ2VIYW5kbGVyICopIFdyaXRlUERGSW1hZ2U7CiAgZW50cnktPm1hZ2ljaz0oSXNJbWFnZUZvcm1hdEhhbmRsZXIgKikgSXNQREY7CiAgZW50cnktPmJsb2Jfc3VwcG9ydD1NYWdpY2tGYWxzZTsKICBlbnRyeS0+c2Vla2FibGVfc3RyZWFtPU1hZ2lja1RydWU7CiAgZW50cnktPnRocmVhZF9zdXBwb3J0PUVuY29kZXJUaHJlYWRTdXBwb3J0OwogIGVudHJ5LT5kZXNjcmlwdGlvbj1Db25zdGFudFN0cmluZygiUG9ydGFibGUgRG9jdW1lbnQgQXJjaGl2ZSBGb3JtYXQiKTsKICBlbnRyeS0+bW9kdWxlPUNvbnN0YW50U3RyaW5nKCJQREYiKTsKICAodm9pZCkgUmVnaXN0ZXJNYWdpY2tJbmZvKGVudHJ5KTsKICByZXR1cm4oTWFnaWNrSW1hZ2VDb2RlclNpZ25hdHVyZSk7Cn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBVIG4gciBlIGcgaSBzIHQgZSByIFAgRCBGIEkgbSBhIGcgZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFVucmVnaXN0ZXJQREZJbWFnZSgpIHJlbW92ZXMgZm9ybWF0IHJlZ2lzdHJhdGlvbnMgbWFkZSBieSB0aGUKJSAgUERGIG1vZHVsZSBmcm9tIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzLgolCiUgIFRoZSBmb3JtYXQgb2YgdGhlIFVucmVnaXN0ZXJQREZJbWFnZSBtZXRob2QgaXM6CiUKJSAgICAgIFVucmVnaXN0ZXJQREZJbWFnZSh2b2lkKQolCiovCk1vZHVsZUV4cG9ydCB2b2lkIFVucmVnaXN0ZXJQREZJbWFnZSh2b2lkKQp7CiAgKHZvaWQpIFVucmVnaXN0ZXJNYWdpY2tJbmZvKCJBSSIpOwogICh2b2lkKSBVbnJlZ2lzdGVyTWFnaWNrSW5mbygiRVBERiIpOwogICh2b2lkKSBVbnJlZ2lzdGVyTWFnaWNrSW5mbygiUERGIik7CiAgKHZvaWQpIFVucmVnaXN0ZXJNYWdpY2tJbmZvKCJQREZBIik7Cn0KDAovKgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICBXIHIgaSB0IGUgUCBEIEYgSSBtIGEgZyBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJQolICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlCiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUKJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQolCiUgIFdyaXRlUERGSW1hZ2UoKSB3cml0ZXMgYW4gaW1hZ2UgaW4gdGhlIFBvcnRhYmxlIERvY3VtZW50IGltYWdlCiUgIGZvcm1hdC4KJQolICBUaGUgZm9ybWF0IG9mIHRoZSBXcml0ZVBERkltYWdlIG1ldGhvZCBpczoKJQolICAgICAgTWFnaWNrQm9vbGVhblR5cGUgV3JpdGVQREZJbWFnZShjb25zdCBJbWFnZUluZm8gKmltYWdlX2luZm8sCiUgICAgICAgIEltYWdlICppbWFnZSxFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCiUKJSAgQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHBhcmFtZXRlciBmb2xsb3dzLgolCiUgICAgbyBpbWFnZV9pbmZvOiB0aGUgaW1hZ2UgaW5mby4KJQolICAgIG8gaW1hZ2U6ICBUaGUgaW1hZ2UuCiUKJSAgICBvIGV4Y2VwdGlvbjogcmV0dXJuIGFueSBlcnJvcnMgb3Igd2FybmluZ3MgaW4gdGhpcyBzdHJ1Y3R1cmUuCiUKKi8KCnN0YXRpYyBpbmxpbmUgc2l6ZV90IE1hZ2lja01heChjb25zdCBzaXplX3QgeCxjb25zdCBzaXplX3QgeSkKewogIGlmICh4ID4geSkKICAgIHJldHVybih4KTsKICByZXR1cm4oeSk7Cn0KCnN0YXRpYyBpbmxpbmUgc2l6ZV90IE1hZ2lja01pbihjb25zdCBzaXplX3QgeCxjb25zdCBzaXplX3QgeSkKewogIGlmICh4IDwgeSkKICAgIHJldHVybih4KTsKICByZXR1cm4oeSk7Cn0KCnN0YXRpYyBjaGFyICpFc2NhcGVQYXJlbnRoZXNpcyhjb25zdCBjaGFyICp0ZXh0KQp7CiAgcmVnaXN0ZXIgY2hhcgogICAgKnA7CgogIHJlZ2lzdGVyIHNzaXplX3QKICAgIGk7CgogIHNpemVfdAogICAgZXNjYXBlczsKCiAgc3RhdGljIGNoYXIKICAgIGJ1ZmZlcltNYXhUZXh0RXh0ZW50XTsKCiAgZXNjYXBlcz0wOwogIHA9YnVmZmVyOwogIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIE1hZ2lja01pbihzdHJsZW4odGV4dCksKE1heFRleHRFeHRlbnQtZXNjYXBlcy0xKSk7IGkrKykKICB7CiAgICBpZiAoKHRleHRbaV0gPT0gJygnKSB8fCAodGV4dFtpXSA9PSAnKScpKQogICAgICB7CiAgICAgICAgKnArKz0nXFwnOwogICAgICAgIGVzY2FwZXMrKzsKICAgICAgfQogICAgKnArKz10ZXh0W2ldOwogIH0KICAqcD0nXDAnOwogIHJldHVybihidWZmZXIpOwp9CgpzdGF0aWMgTWFnaWNrQm9vbGVhblR5cGUgSHVmZm1hbjJERW5jb2RlSW1hZ2UoY29uc3QgSW1hZ2VJbmZvICppbWFnZV9pbmZvLAogIEltYWdlICppbWFnZSxJbWFnZSAqaW5qZWN0X2ltYWdlLEV4Y2VwdGlvbkluZm8gKmV4Y2VwdGlvbikKewogIEltYWdlCiAgICAqZ3JvdXA0X2ltYWdlOwoKICBJbWFnZUluZm8KICAgICp3cml0ZV9pbmZvOwoKICBNYWdpY2tCb29sZWFuVHlwZQogICAgc3RhdHVzOwoKICBzaXplX3QKICAgIGxlbmd0aDsKCiAgdW5zaWduZWQgY2hhcgogICAgKmdyb3VwNDsKCiAgc3RhdHVzPU1hZ2lja1RydWU7CiAgd3JpdGVfaW5mbz1DbG9uZUltYWdlSW5mbyhpbWFnZV9pbmZvKTsKICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyh3cml0ZV9pbmZvLT5maWxlbmFtZSwiR1JPVVA0OiIsTWF4VGV4dEV4dGVudCk7CiAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcod3JpdGVfaW5mby0+bWFnaWNrLCJHUk9VUDQiLE1heFRleHRFeHRlbnQpOwogIGdyb3VwNF9pbWFnZT1DbG9uZUltYWdlKGluamVjdF9pbWFnZSwwLDAsTWFnaWNrVHJ1ZSxleGNlcHRpb24pOwogIGlmIChncm91cDRfaW1hZ2UgPT0gKEltYWdlICopIE5VTEwpCiAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogIGdyb3VwND0odW5zaWduZWQgY2hhciAqKSBJbWFnZVRvQmxvYih3cml0ZV9pbmZvLGdyb3VwNF9pbWFnZSwmbGVuZ3RoLAogICAgZXhjZXB0aW9uKTsKICBncm91cDRfaW1hZ2U9RGVzdHJveUltYWdlKGdyb3VwNF9pbWFnZSk7CiAgaWYgKGdyb3VwNCA9PSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQogICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICB3cml0ZV9pbmZvPURlc3Ryb3lJbWFnZUluZm8od3JpdGVfaW5mbyk7CiAgaWYgKFdyaXRlQmxvYihpbWFnZSxsZW5ndGgsZ3JvdXA0KSAhPSAoc3NpemVfdCkgbGVuZ3RoKQogICAgc3RhdHVzPU1hZ2lja0ZhbHNlOwogIGdyb3VwND0odW5zaWduZWQgY2hhciAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KGdyb3VwNCk7CiAgcmV0dXJuKHN0YXR1cyk7Cn0KCnN0YXRpYyBNYWdpY2tCb29sZWFuVHlwZSBXcml0ZVBERkltYWdlKGNvbnN0IEltYWdlSW5mbyAqaW1hZ2VfaW5mbyxJbWFnZSAqaW1hZ2UsCiAgRXhjZXB0aW9uSW5mbyAqZXhjZXB0aW9uKQp7CiNkZWZpbmUgQ0Zvcm1hdCAgIi9GaWx0ZXIgWyAvJXMgXVxuIgojZGVmaW5lIE9iamVjdHNQZXJJbWFnZSAgMTQKCiAgc3RhdGljIGNvbnN0IGNoYXIKICAgIFhNUFByb2ZpbGVbXT0KICAgIHsKICAgICAgIjw/eHBhY2tldCBiZWdpbj1cIiVzXCIgaWQ9XCJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWRcIj8+XG4iCiAgICAgICI8eDp4bXBtZXRhIHhtbG5zOng9XCJhZG9iZTpuczptZXRhL1wiIHg6eG1wdGs9XCJBZG9iZSBYTVAgQ29yZSA0LjAtYzMxNiA0NC4yNTM5MjEsIFN1biBPY3QgMDEgMjAwNiAxNzowODoyM1wiPlxuIgogICAgICAiICAgPHJkZjpSREYgeG1sbnM6cmRmPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1wiPlxuIgogICAgICAiICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCJcIlxuIgogICAgICAiICAgICAgICAgICAgeG1sbnM6eGFwPVwiaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL1wiPlxuIgogICAgICAiICAgICAgICAgPHhhcDpNb2RpZnlEYXRlPiVzPC94YXA6TW9kaWZ5RGF0ZT5cbiIKICAgICAgIiAgICAgICAgIDx4YXA6Q3JlYXRlRGF0ZT4lczwveGFwOkNyZWF0ZURhdGU+XG4iCiAgICAgICIgICAgICAgICA8eGFwOk1ldGFkYXRhRGF0ZT4lczwveGFwOk1ldGFkYXRhRGF0ZT5cbiIKICAgICAgIiAgICAgICAgIDx4YXA6Q3JlYXRvclRvb2w+JXM8L3hhcDpDcmVhdG9yVG9vbD5cbiIKICAgICAgIiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPlxuIgogICAgICAiICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCJcIlxuIgogICAgICAiICAgICAgICAgICAgeG1sbnM6ZGM9XCJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL1wiPlxuIgogICAgICAiICAgICAgICAgPGRjOmZvcm1hdD5hcHBsaWNhdGlvbi9wZGY8L2RjOmZvcm1hdD5cbiIKICAgICAgIiAgICAgICAgIDxkYzp0aXRsZT5cbiIKICAgICAgIiAgICAgICAgICAgPHJkZjpBbHQ+XG4iCiAgICAgICIgICAgICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9XCJ4LWRlZmF1bHRcIj4lczwvcmRmOmxpPlxuIgogICAgICAiICAgICAgICAgICA8L3JkZjpBbHQ+XG4iCiAgICAgICIgICAgICAgICA8L2RjOnRpdGxlPlxuIgogICAgICAiICAgICAgPC9yZGY6RGVzY3JpcHRpb24+XG4iCiAgICAgICIgICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD1cIlwiXG4iCiAgICAgICIgICAgICAgICAgICB4bWxuczp4YXBNTT1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS9cIj5cbiIKICAgICAgIiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6NmVjMTE5ZDctNzk4Mi00ZjU2LTgwOGQtZGZlNjRmNWIzNWNmPC94YXBNTTpEb2N1bWVudElEPlxuIgogICAgICAiICAgICAgICAgPHhhcE1NOkluc3RhbmNlSUQ+dXVpZDphNzliOTliNC02MjM1LTQ0N2YtOWY2Yy1lYzE4ZWY3NTU1Y2I8L3hhcE1NOkluc3RhbmNlSUQ+XG4iCiAgICAgICIgICAgICA8L3JkZjpEZXNjcmlwdGlvbj5cbiIKICAgICAgIiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PVwiXCJcbiIKICAgICAgIiAgICAgICAgICAgIHhtbG5zOnBkZj1cImh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy9cIj5cbiIKICAgICAgIiAgICAgICAgIDxwZGY6UHJvZHVjZXI+JXM8L3BkZjpQcm9kdWNlcj5cbiIKICAgICAgIiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPlxuIgogICAgICAiICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCJcIlxuIgogICAgICAiICAgICAgICAgICAgeG1sbnM6cGRmYWlkPVwiaHR0cDovL3d3dy5haWltLm9yZy9wZGZhL25zL2lkL1wiPlxuIgogICAgICAiICAgICAgICAgPHBkZmFpZDpwYXJ0PjI8L3BkZmFpZDpwYXJ0PlxuIgogICAgICAiICAgICAgICAgPHBkZmFpZDpjb25mb3JtYW5jZT5CPC9wZGZhaWQ6Y29uZm9ybWFuY2U+XG4iCiAgICAgICIgICAgICA8L3JkZjpEZXNjcmlwdGlvbj5cbiIKICAgICAgIiAgIDwvcmRmOlJERj5cbiIKICAgICAgIjwveDp4bXBtZXRhPlxuIgogICAgICAiPD94cGFja2V0IGVuZD1cIndcIj8+XG4iCiAgICB9LAogICAgWE1QUHJvZmlsZU1hZ2lja1s0XT0geyAoY2hhcikgMHhlZiwgKGNoYXIpIDB4YmIsIChjaGFyKSAweGJmLCAoY2hhcikgMHgwMCB9OwoKICBjaGFyCiAgICBiYXNlbmFtZVtNYXhUZXh0RXh0ZW50XSwKICAgIGJ1ZmZlcltNYXhUZXh0RXh0ZW50XSwKICAgIGRhdGVbTWF4VGV4dEV4dGVudF0sCiAgICAqKmxhYmVscywKICAgIHBhZ2VfZ2VvbWV0cnlbTWF4VGV4dEV4dGVudF07CgogIENvbXByZXNzaW9uVHlwZQogICAgY29tcHJlc3Npb247CgogIGNvbnN0IGNoYXIKICAgICp2YWx1ZTsKCiAgZG91YmxlCiAgICBwb2ludHNpemU7CgogIEdlb21ldHJ5SW5mbwogICAgZ2VvbWV0cnlfaW5mbzsKCiAgSW1hZ2UKICAgICpuZXh0LAogICAgKnRpbGVfaW1hZ2U7CgogIE1hZ2lja0Jvb2xlYW5UeXBlCiAgICBzdGF0dXM7CgogIE1hZ2lja09mZnNldFR5cGUKICAgIG9mZnNldCwKICAgIHNjZW5lLAogICAgKnhyZWY7CgogIE1hZ2lja1NpemVUeXBlCiAgICBudW1iZXJfcGl4ZWxzOwoKICBNYWdpY2tTdGF0dXNUeXBlCiAgICBmbGFnczsKCiAgUG9pbnRJbmZvCiAgICBkZWx0YSwKICAgIHJlc29sdXRpb24sCiAgICBzY2FsZTsKCiAgUmVjdGFuZ2xlSW5mbwogICAgZ2VvbWV0cnksCiAgICBtZWRpYV9pbmZvLAogICAgcGFnZV9pbmZvOwoKICByZWdpc3RlciBjb25zdCBRdWFudHVtCiAgICAqcDsKCiAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhcgogICAgKnE7CgogIHJlZ2lzdGVyIHNzaXplX3QKICAgIGksCiAgICB4OwoKICBzaXplX3QKICAgIGluZm9faWQsCiAgICBsZW5ndGgsCiAgICBvYmplY3QsCiAgICBwYWdlc19pZCwKICAgIHJvb3RfaWQsCiAgICB0ZXh0X3NpemUsCiAgICB2ZXJzaW9uOwoKICBzc2l6ZV90CiAgICBjb3VudCwKICAgIHk7CgogIHN0cnVjdCB0bQogICAgbG9jYWxfdGltZTsKCiAgdGltZV90CiAgICBzZWNvbmRzOwoKICB1bnNpZ25lZCBjaGFyCiAgICAqcGl4ZWxzOwoKICAvKgogICAgT3BlbiBvdXRwdXQgaW1hZ2UgZmlsZS4KICAqLwogIGFzc2VydChpbWFnZV9pbmZvICE9IChjb25zdCBJbWFnZUluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGltYWdlX2luZm8tPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwogIGFzc2VydChpbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCk7CiAgYXNzZXJ0KGltYWdlLT5zaWduYXR1cmUgPT0gTWFnaWNrU2lnbmF0dXJlKTsKICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFRyYWNlRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIixpbWFnZS0+ZmlsZW5hbWUpOwogIGFzc2VydChleGNlcHRpb24gIT0gKEV4Y2VwdGlvbkluZm8gKikgTlVMTCk7CiAgYXNzZXJ0KGV4Y2VwdGlvbi0+c2lnbmF0dXJlID09IE1hZ2lja1NpZ25hdHVyZSk7CiAgc3RhdHVzPU9wZW5CbG9iKGltYWdlX2luZm8saW1hZ2UsV3JpdGVCaW5hcnlCbG9iTW9kZSxleGNlcHRpb24pOwogIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICByZXR1cm4oc3RhdHVzKTsKICAvKgogICAgQWxsb2NhdGUgWCByZWYgbWVtb3J5LgogICovCiAgeHJlZj0oTWFnaWNrT2Zmc2V0VHlwZSAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeSgyMDQ4VUwsc2l6ZW9mKCp4cmVmKSk7CiAgaWYgKHhyZWYgPT0gKE1hZ2lja09mZnNldFR5cGUgKikgTlVMTCkKICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeSh4cmVmLDAsMjA0OFVMKnNpemVvZigqeHJlZikpOwogIC8qCiAgICBXcml0ZSBJbmZvIG9iamVjdC4KICAqLwogIG9iamVjdD0wOwogIHZlcnNpb249MzsKICBpZiAoaW1hZ2VfaW5mby0+Y29tcHJlc3Npb24gPT0gSlBFRzIwMDBDb21wcmVzc2lvbikKICAgIHZlcnNpb249KHNpemVfdCkgTWFnaWNrTWF4KHZlcnNpb24sNSk7CiAgZm9yIChuZXh0PWltYWdlOyBuZXh0ICE9IChJbWFnZSAqKSBOVUxMOyBuZXh0PUdldE5leHRJbWFnZUluTGlzdChuZXh0KSkKICAgIGlmIChuZXh0LT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkKICAgICAgdmVyc2lvbj0oc2l6ZV90KSBNYWdpY2tNYXgodmVyc2lvbiw0KTsKICBpZiAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERkEiKSA9PSAwKQogICAgdmVyc2lvbj0oc2l6ZV90KSBNYWdpY2tNYXgodmVyc2lvbiw2KTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJVBERi0xLiUuMjBnIFxuIiwoZG91YmxlKQogICAgdmVyc2lvbik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogIGlmIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGQSIpID09IDApCiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIl4uPP01xuIik7CiAgLyoKICAgIFdyaXRlIENhdGFsb2cgb2JqZWN0LgogICovCiAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogIHJvb3RfaWQ9b2JqZWN0OwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICBvYmplY3QpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgIT0gMCkKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9QYWdlcyAlLjIwZyAwIFJcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KzEpOwogIGVsc2UKICAgIHsKICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL01ldGFkYXRhICUuMjBnIDAgUlxuIiwKICAgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhZ2VzICUuMjBnIDAgUlxuIiwKICAgICAgICAoZG91YmxlKSBvYmplY3QrMik7CiAgICB9CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9DYXRhbG9nXG4iKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICBHZXRQYXRoQ29tcG9uZW50KGltYWdlLT5maWxlbmFtZSxCYXNlUGF0aCxiYXNlbmFtZSk7CiAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgPT0gMCkKICAgIHsKICAgICAgY2hhcgogICAgICAgIGNyZWF0ZV9kYXRlW01heFRleHRFeHRlbnRdLAogICAgICAgIG1vZGlmeV9kYXRlW01heFRleHRFeHRlbnRdLAogICAgICAgIHRpbWVzdGFtcFtNYXhUZXh0RXh0ZW50XSwKICAgICAgICB4bXBfcHJvZmlsZVtNYXhUZXh0RXh0ZW50XTsKCiAgICAgIHNpemVfdAogICAgICAgIHZlcnNpb247CgogICAgICAvKgogICAgICAgIFdyaXRlIFhNUCBvYmplY3QuCiAgICAgICovCiAgICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgICBvYmplY3QpOwogICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1N1YnR5cGUgL1hNTFxuIik7CiAgICAgICptb2RpZnlfZGF0ZT0nXDAnOwogICAgICB2YWx1ZT1HZXRJbWFnZVByb3BlcnR5KGltYWdlLCJkYXRlOm1vZGlmeSIsZXhjZXB0aW9uKTsKICAgICAgaWYgKHZhbHVlICE9IChjb25zdCBjaGFyICopIE5VTEwpCiAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcobW9kaWZ5X2RhdGUsdmFsdWUsTWF4VGV4dEV4dGVudCk7CiAgICAgICpjcmVhdGVfZGF0ZT0nXDAnOwogICAgICB2YWx1ZT1HZXRJbWFnZVByb3BlcnR5KGltYWdlLCJkYXRlOmNyZWF0ZSIsZXhjZXB0aW9uKTsKICAgICAgaWYgKHZhbHVlICE9IChjb25zdCBjaGFyICopIE5VTEwpCiAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoY3JlYXRlX2RhdGUsdmFsdWUsTWF4VGV4dEV4dGVudCk7CiAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tUaW1lKHRpbWUoKHRpbWVfdCAqKSBOVUxMKSxNYXhUZXh0RXh0ZW50LHRpbWVzdGFtcCk7CiAgICAgIGk9Rm9ybWF0TG9jYWxlU3RyaW5nKHhtcF9wcm9maWxlLE1heFRleHRFeHRlbnQsWE1QUHJvZmlsZSwKICAgICAgICBYTVBQcm9maWxlTWFnaWNrLG1vZGlmeV9kYXRlLGNyZWF0ZV9kYXRlLHRpbWVzdGFtcCwKICAgICAgICBHZXRNYWdpY2tWZXJzaW9uKCZ2ZXJzaW9uKSxFc2NhcGVQYXJlbnRoZXNpcyhiYXNlbmFtZSksCiAgICAgICAgR2V0TWFnaWNrVmVyc2lvbigmdmVyc2lvbikpOwogICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnXG4iLChkb3VibGUpCiAgICAgICAgaSk7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL01ldGFkYXRhXG4iKTsKICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbnN0cmVhbVxuIik7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UseG1wX3Byb2ZpbGUpOwogICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJcbmVuZHN0cmVhbVxuIik7CiAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICB9CiAgLyoKICAgIFdyaXRlIFBhZ2VzIG9iamVjdC4KICAqLwogIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICBwYWdlc19pZD1vYmplY3Q7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgIG9iamVjdCk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvUGFnZXNcbiIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9LaWRzIFsgJS4yMGcgMCBSICIsKGRvdWJsZSkKICAgIG9iamVjdCsxKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgY291bnQ9KHNzaXplX3QpIChwYWdlc19pZCtPYmplY3RzUGVySW1hZ2UrMSk7CiAgaWYgKGltYWdlX2luZm8tPmFkam9pbiAhPSBNYWdpY2tGYWxzZSkKICAgIHsKICAgICAgSW1hZ2UKICAgICAgICAqa2lkX2ltYWdlOwoKICAgICAgLyoKICAgICAgICBQcmVkaWN0IHBhZ2Ugb2JqZWN0IGlkJ3MuCiAgICAgICovCiAgICAgIGtpZF9pbWFnZT1pbWFnZTsKICAgICAgZm9yICggOyBHZXROZXh0SW1hZ2VJbkxpc3Qoa2lkX2ltYWdlKSAhPSAoSW1hZ2UgKikgTlVMTDsgY291bnQrPU9iamVjdHNQZXJJbWFnZSkKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgUiAiLChkb3VibGUpCiAgICAgICAgICBjb3VudCk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgIGtpZF9pbWFnZT1HZXROZXh0SW1hZ2VJbkxpc3Qoa2lkX2ltYWdlKTsKICAgICAgfQogICAgICB4cmVmPShNYWdpY2tPZmZzZXRUeXBlICopIFJlc2l6ZVF1YW50dW1NZW1vcnkoeHJlZiwoc2l6ZV90KSBjb3VudCsyMDQ4VUwsCiAgICAgICAgc2l6ZW9mKCp4cmVmKSk7CiAgICAgIGlmICh4cmVmID09IChNYWdpY2tPZmZzZXRUeXBlICopIE5VTEwpCiAgICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLCJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICB9CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXVxuIik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvdW50ICUuMjBnXG4iLChkb3VibGUpCiAgICAoKGNvdW50LXBhZ2VzX2lkKS9PYmplY3RzUGVySW1hZ2UpKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgc2NlbmU9MDsKICBkbwogIHsKICAgIGNvbXByZXNzaW9uPWltYWdlLT5jb21wcmVzc2lvbjsKICAgIGlmIChpbWFnZV9pbmZvLT5jb21wcmVzc2lvbiAhPSBVbmRlZmluZWRDb21wcmVzc2lvbikKICAgICAgY29tcHJlc3Npb249aW1hZ2VfaW5mby0+Y29tcHJlc3Npb247CiAgICBzd2l0Y2ggKGNvbXByZXNzaW9uKQogICAgewogICAgICBjYXNlIEZheENvbXByZXNzaW9uOgogICAgICBjYXNlIEdyb3VwNENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgaWYgKChJc0ltYWdlTW9ub2Nocm9tZShpbWFnZSxleGNlcHRpb24pID09IE1hZ2lja0ZhbHNlKSB8fAogICAgICAgICAgICAoaW1hZ2UtPm1hdHRlICE9IE1hZ2lja0ZhbHNlKSkKICAgICAgICAgIGNvbXByZXNzaW9uPVJMRUNvbXByZXNzaW9uOwogICAgICAgIGJyZWFrOwogICAgICB9CiNpZiAhZGVmaW5lZChNQUdJQ0tDT1JFX0pQRUdfREVMRUdBVEUpCiAgICAgIGNhc2UgSlBFR0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgY29tcHJlc3Npb249UkxFQ29tcHJlc3Npb247CiAgICAgICAgKHZvaWQpIFRocm93TWFnaWNrRXhjZXB0aW9uKGV4Y2VwdGlvbixHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgIE1pc3NpbmdEZWxlZ2F0ZUVycm9yLCJEZWxlZ2F0ZUxpYnJhcnlTdXBwb3J0Tm90QnVpbHRJbiIsImAlcycgKEpQRUcpIiwKICAgICAgICAgIGltYWdlLT5maWxlbmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KI2VuZGlmCiNpZiAhZGVmaW5lZChNQUdJQ0tDT1JFX0pQMl9ERUxFR0FURSkKICAgICAgY2FzZSBKUEVHMjAwMENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgY29tcHJlc3Npb249UkxFQ29tcHJlc3Npb247CiAgICAgICAgKHZvaWQpIFRocm93TWFnaWNrRXhjZXB0aW9uKGV4Y2VwdGlvbixHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgIE1pc3NpbmdEZWxlZ2F0ZUVycm9yLCJEZWxlZ2F0ZUxpYnJhcnlTdXBwb3J0Tm90QnVpbHRJbiIsImAlcycgKEpQMikiLAogICAgICAgICAgaW1hZ2UtPmZpbGVuYW1lKTsKICAgICAgICBicmVhazsKICAgICAgfQojZW5kaWYKI2lmICFkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgY2FzZSBaaXBDb21wcmVzc2lvbjoKICAgICAgewogICAgICAgIGNvbXByZXNzaW9uPVJMRUNvbXByZXNzaW9uOwogICAgICAgICh2b2lkKSBUaHJvd01hZ2lja0V4Y2VwdGlvbihleGNlcHRpb24sR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICBNaXNzaW5nRGVsZWdhdGVFcnJvciwiRGVsZWdhdGVMaWJyYXJ5U3VwcG9ydE5vdEJ1aWx0SW4iLCJgJXMnIChaTElCKSIsCiAgICAgICAgICBpbWFnZS0+ZmlsZW5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiNlbmRpZgogICAgICBjYXNlIExaV0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgaWYgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgPT0gMCkKICAgICAgICAgIGNvbXByZXNzaW9uPVJMRUNvbXByZXNzaW9uOyAgLyogTFpXIGNvbXByZXNzaW9uIGlzIGZvcmJpZGRlbiAqLwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgTm9Db21wcmVzc2lvbjoKICAgICAgewogICAgICAgIGlmIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGQSIpID09IDApCiAgICAgICAgICBjb21wcmVzc2lvbj1STEVDb21wcmVzc2lvbjsgLyogQVNDSUkgODUgY29tcHJlc3Npb24gaXMgZm9yYmlkZGVuICovCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChjb21wcmVzc2lvbiA9PSBKUEVHMjAwMENvbXByZXNzaW9uKQogICAgICB7CiAgICAgICAgaWYgKElzc1JHQkNvbXBhdGlibGVDb2xvcnNwYWNlKGltYWdlLT5jb2xvcnNwYWNlKSA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICh2b2lkKSBUcmFuc2Zvcm1JbWFnZUNvbG9yc3BhY2UoaW1hZ2Usc1JHQkNvbG9yc3BhY2UsZXhjZXB0aW9uKTsKICAgICAgfQogICAgLyoKICAgICAgU2NhbGUgcmVsYXRpdmUgdG8gZG90cy1wZXItaW5jaC4KICAgICovCiAgICBkZWx0YS54PURlZmF1bHRSZXNvbHV0aW9uOwogICAgZGVsdGEueT1EZWZhdWx0UmVzb2x1dGlvbjsKICAgIHJlc29sdXRpb24ueD1pbWFnZS0+cmVzb2x1dGlvbi54OwogICAgcmVzb2x1dGlvbi55PWltYWdlLT5yZXNvbHV0aW9uLnk7CiAgICBpZiAoKHJlc29sdXRpb24ueCA9PSAwLjApIHx8IChyZXNvbHV0aW9uLnkgPT0gMC4wKSkKICAgICAgewogICAgICAgIGZsYWdzPVBhcnNlR2VvbWV0cnkoUFNEZW5zaXR5R2VvbWV0cnksJmdlb21ldHJ5X2luZm8pOwogICAgICAgIHJlc29sdXRpb24ueD1nZW9tZXRyeV9pbmZvLnJobzsKICAgICAgICByZXNvbHV0aW9uLnk9Z2VvbWV0cnlfaW5mby5zaWdtYTsKICAgICAgICBpZiAoKGZsYWdzICYgU2lnbWFWYWx1ZSkgPT0gMCkKICAgICAgICAgIHJlc29sdXRpb24ueT1yZXNvbHV0aW9uLng7CiAgICAgIH0KICAgIGlmIChpbWFnZV9pbmZvLT5kZW5zaXR5ICE9IChjaGFyICopIE5VTEwpCiAgICAgIHsKICAgICAgICBmbGFncz1QYXJzZUdlb21ldHJ5KGltYWdlX2luZm8tPmRlbnNpdHksJmdlb21ldHJ5X2luZm8pOwogICAgICAgIHJlc29sdXRpb24ueD1nZW9tZXRyeV9pbmZvLnJobzsKICAgICAgICByZXNvbHV0aW9uLnk9Z2VvbWV0cnlfaW5mby5zaWdtYTsKICAgICAgICBpZiAoKGZsYWdzICYgU2lnbWFWYWx1ZSkgPT0gMCkKICAgICAgICAgIHJlc29sdXRpb24ueT1yZXNvbHV0aW9uLng7CiAgICAgIH0KICAgIGlmIChpbWFnZS0+dW5pdHMgPT0gUGl4ZWxzUGVyQ2VudGltZXRlclJlc29sdXRpb24pCiAgICAgIHsKICAgICAgICByZXNvbHV0aW9uLng9KGRvdWJsZSkgKChzaXplX3QpICgxMDAuMCoyLjU0KnJlc29sdXRpb24ueCswLjUpLzEwMC4wKTsKICAgICAgICByZXNvbHV0aW9uLnk9KGRvdWJsZSkgKChzaXplX3QpICgxMDAuMCoyLjU0KnJlc29sdXRpb24ueSswLjUpLzEwMC4wKTsKICAgICAgfQogICAgU2V0R2VvbWV0cnkoaW1hZ2UsJmdlb21ldHJ5KTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsKGRvdWJsZSkKICAgICAgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxpbWFnZV9pbmZvLT5wYWdlLE1heFRleHRFeHRlbnQpOwogICAgZWxzZQogICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApICYmIChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCiAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGclKy4yMGciLChkb3VibGUpIGltYWdlLT5wYWdlLndpZHRoLChkb3VibGUpCiAgICAgICAgICBpbWFnZS0+cGFnZS5oZWlnaHQsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKICAgICAgZWxzZQogICAgICAgIGlmICgoaW1hZ2UtPmdyYXZpdHkgIT0gVW5kZWZpbmVkR3Jhdml0eSkgJiYKICAgICAgICAgICAgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREYiKSA9PSAwKSkKICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksUFNQYWdlR2VvbWV0cnksTWF4VGV4dEV4dGVudCk7CiAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSwiPiIsTWF4VGV4dEV4dGVudCk7CiAgICAodm9pZCkgUGFyc2VNZXRhR2VvbWV0cnkocGFnZV9nZW9tZXRyeSwmZ2VvbWV0cnkueCwmZ2VvbWV0cnkueSwKICAgICAgJmdlb21ldHJ5LndpZHRoLCZnZW9tZXRyeS5oZWlnaHQpOwogICAgc2NhbGUueD0oZG91YmxlKSAoZ2VvbWV0cnkud2lkdGgqZGVsdGEueCkvcmVzb2x1dGlvbi54OwogICAgZ2VvbWV0cnkud2lkdGg9KHNpemVfdCkgZmxvb3Ioc2NhbGUueCswLjUpOwogICAgc2NhbGUueT0oZG91YmxlKSAoZ2VvbWV0cnkuaGVpZ2h0KmRlbHRhLnkpL3Jlc29sdXRpb24ueTsKICAgIGdlb21ldHJ5LmhlaWdodD0oc2l6ZV90KSBmbG9vcihzY2FsZS55KzAuNSk7CiAgICAodm9pZCkgUGFyc2VBYnNvbHV0ZUdlb21ldHJ5KHBhZ2VfZ2VvbWV0cnksJm1lZGlhX2luZm8pOwogICAgKHZvaWQpIFBhcnNlR3Jhdml0eUdlb21ldHJ5KGltYWdlLHBhZ2VfZ2VvbWV0cnksJnBhZ2VfaW5mbyxleGNlcHRpb24pOwogICAgaWYgKGltYWdlLT5ncmF2aXR5ICE9IFVuZGVmaW5lZEdyYXZpdHkpCiAgICAgIHsKICAgICAgICBnZW9tZXRyeS54PSgtcGFnZV9pbmZvLngpOwogICAgICAgIGdlb21ldHJ5Lnk9KHNzaXplX3QpIChtZWRpYV9pbmZvLmhlaWdodCtwYWdlX2luZm8ueS1pbWFnZS0+cm93cyk7CiAgICAgIH0KICAgIHBvaW50c2l6ZT0xMi4wOwogICAgaWYgKGltYWdlX2luZm8tPnBvaW50c2l6ZSAhPSAwLjApCiAgICAgIHBvaW50c2l6ZT1pbWFnZV9pbmZvLT5wb2ludHNpemU7CiAgICB0ZXh0X3NpemU9MDsKICAgIHZhbHVlPUdldEltYWdlUHJvcGVydHkoaW1hZ2UsImxhYmVsIixleGNlcHRpb24pOwogICAgaWYgKHZhbHVlICE9IChjb25zdCBjaGFyICopIE5VTEwpCiAgICAgIHRleHRfc2l6ZT0oc2l6ZV90KSAoTXVsdGlsaW5lQ2Vuc3VzKHZhbHVlKSpwb2ludHNpemUrMTIpOwogICAgKHZvaWQpIHRleHRfc2l6ZTsKICAgIC8qCiAgICAgIFdyaXRlIFBhZ2Ugb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvUGFnZVxuIik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvUGFyZW50ICUuMjBnIDAgUlxuIiwKICAgICAgKGRvdWJsZSkgcGFnZXNfaWQpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1Jlc291cmNlcyA8PFxuIik7CiAgICBsYWJlbHM9KGNoYXIgKiopIE5VTEw7CiAgICB2YWx1ZT1HZXRJbWFnZVByb3BlcnR5KGltYWdlLCJsYWJlbCIsZXhjZXB0aW9uKTsKICAgIGlmICh2YWx1ZSAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQogICAgICBsYWJlbHM9U3RyaW5nVG9MaXN0KHZhbHVlKTsKICAgIGlmIChsYWJlbHMgIT0gKGNoYXIgKiopIE5VTEwpCiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAgICAgIi9Gb250IDw8IC9GJS4yMGcgJS4yMGcgMCBSID4+XG4iLChkb3VibGUpIGltYWdlLT5zY2VuZSwoZG91YmxlKQogICAgICAgICAgb2JqZWN0KzQpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgfQogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKICAgICAgIi9YT2JqZWN0IDw8IC9JbSUuMjBnICUuMjBnIDAgUiA+PlxuIiwoZG91YmxlKSBpbWFnZS0+c2NlbmUsKGRvdWJsZSkKICAgICAgb2JqZWN0KzUpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1Byb2NTZXQgJS4yMGcgMCBSID4+XG4iLAogICAgICAoZG91YmxlKSBvYmplY3QrMyk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAiL01lZGlhQm94IFswIDAgJWcgJWddXG4iLDcyLjAqbWVkaWFfaW5mby53aWR0aC9yZXNvbHV0aW9uLngsCiAgICAgIDcyLjAqbWVkaWFfaW5mby5oZWlnaHQvcmVzb2x1dGlvbi55KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgICIvQ3JvcEJveCBbMCAwICVnICVnXVxuIiw3Mi4wKm1lZGlhX2luZm8ud2lkdGgvcmVzb2x1dGlvbi54LAogICAgICA3Mi4wKm1lZGlhX2luZm8uaGVpZ2h0L3Jlc29sdXRpb24ueSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29udGVudHMgJS4yMGcgMCBSXG4iLAogICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvVGh1bWIgJS4yMGcgMCBSXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCs4KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAvKgogICAgICBXcml0ZSBDb250ZW50cyBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGcgMCBSXG4iLAogICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwogICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInFcbiIpOwogICAgaWYgKGxhYmVscyAhPSAoY2hhciAqKikgTlVMTCkKICAgICAgZm9yIChpPTA7IGxhYmVsc1tpXSAhPSAoY2hhciAqKSBOVUxMOyBpKyspCiAgICAgIHsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJCVFxuIik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0YlLjIwZyAlZyBUZlxuIiwKICAgICAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSxwb2ludHNpemUpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZyBUZFxuIiwKICAgICAgICAgIChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgKGdlb21ldHJ5LnkrZ2VvbWV0cnkuaGVpZ2h0K2kqcG9pbnRzaXplKwogICAgICAgICAgMTIpKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiKCVzKSBUalxuIixsYWJlbHNbaV0pOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJFVFxuIik7CiAgICAgICAgbGFiZWxzW2ldPURlc3Ryb3lTdHJpbmcobGFiZWxzW2ldKTsKICAgICAgfQogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWcgMCAwICVnICUuMjBnICUuMjBnIGNtXG4iLAogICAgICBzY2FsZS54LHNjYWxlLnksKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9JbSUuMjBnIERvXG4iLChkb3VibGUpCiAgICAgIGltYWdlLT5zY2VuZSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJRXG4iKTsKICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSktb2Zmc2V0OwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXG5lbmRzdHJlYW1cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgUHJvY3NldCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgIGlmICgoaW1hZ2UtPnN0b3JhZ2VfY2xhc3MgPT0gRGlyZWN0Q2xhc3MpIHx8IChpbWFnZS0+Y29sb3JzID4gMjU2KSkKICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCJbIC9QREYgL1RleHQgL0ltYWdlQyIsTWF4VGV4dEV4dGVudCk7CiAgICBlbHNlCiAgICAgIGlmICgoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikpCiAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCJbIC9QREYgL1RleHQgL0ltYWdlQiIsTWF4VGV4dEV4dGVudCk7CiAgICAgIGVsc2UKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIlsgL1BERiAvVGV4dCAvSW1hZ2VJIixNYXhUZXh0RXh0ZW50KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiBdXG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAvKgogICAgICBXcml0ZSBGb250IG9iamVjdC4KICAgICovCiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgaWYgKGxhYmVscyAhPSAoY2hhciAqKikgTlVMTCkKICAgICAgewogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9Gb250XG4iKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvU3VidHlwZSAvVHlwZTFcbiIpOwogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9OYW1lIC9GJS4yMGdcbiIsCiAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvQmFzZUZvbnQgL0hlbHZldGljYVxuIik7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nXG4iKTsKICAgICAgICBsYWJlbHM9KGNoYXIgKiopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkobGFiZWxzKTsKICAgICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIFhPYmplY3Qgb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvWE9iamVjdFxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvU3VidHlwZSAvSW1hZ2VcbiIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL0ltJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgaW1hZ2UtPnNjZW5lKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICB7CiAgICAgIGNhc2UgTm9Db21wcmVzc2lvbjoKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwiQVNDSUk4NURlY29kZSIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgSlBFR0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJEQ1REZWNvZGUiKTsKICAgICAgICBpZiAoaW1hZ2UtPmNvbG9yc3BhY2UgIT0gQ01ZS0NvbG9yc3BhY2UpCiAgICAgICAgICBicmVhazsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCIvRGVjb2RlIFsxIDAgMSAwIDEgMCAxIDBdXG4iLAogICAgICAgICAgTWF4VGV4dEV4dGVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBKUEVHMjAwMENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJKUFhEZWNvZGUiKTsKICAgICAgICBpZiAoaW1hZ2UtPmNvbG9yc3BhY2UgIT0gQ01ZS0NvbG9yc3BhY2UpCiAgICAgICAgICBicmVhazsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCIvRGVjb2RlIFsxIDAgMSAwIDEgMCAxIDBdXG4iLAogICAgICAgICAgTWF4VGV4dEV4dGVudCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBMWldDb21wcmVzc2lvbjoKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwiTFpXRGVjb2RlIik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBaaXBDb21wcmVzc2lvbjoKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwiRmxhdGVEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIEZheENvbXByZXNzaW9uOgogICAgICBjYXNlIEdyb3VwNENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCIvRmlsdGVyIFsgL0NDSVRURmF4RGVjb2RlIF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0RlY29kZVBhcm1zIFsgPDwgIgogICAgICAgICAgIi9LICVzIC9CbGFja0lzMSBmYWxzZSAvQ29sdW1ucyAlLjIwZyAvUm93cyAlLjIwZyA+PiBdXG4iLENDSVRUUGFyYW0sCiAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVmYXVsdDoKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwKICAgICAgICAgICJSdW5MZW5ndGhEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICUuMjBnXG4iLChkb3VibGUpCiAgICAgIGltYWdlLT5jb2x1bW5zKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9IZWlnaHQgJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgaW1hZ2UtPnJvd3MpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvbG9yU3BhY2UgJS4yMGcgMCBSXG4iLAogICAgICAoZG91YmxlKSBvYmplY3QrMik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQml0c1BlckNvbXBvbmVudCAlZFxuIiwKICAgICAgKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fCAoY29tcHJlc3Npb24gPT0gR3JvdXA0Q29tcHJlc3Npb24pID8KICAgICAgMSA6IDgpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgaWYgKGltYWdlLT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9TTWFzayAlLjIwZyAwIFJcbiIsCiAgICAgICAgICAoZG91YmxlKSBvYmplY3QrNyk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICB9CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKICAgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwic3RyZWFtXG4iKTsKICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSk7CiAgICBudW1iZXJfcGl4ZWxzPShNYWdpY2tTaXplVHlwZSkgaW1hZ2UtPmNvbHVtbnMqaW1hZ2UtPnJvd3M7CiAgICBpZiAoKDQqbnVtYmVyX3BpeGVscykgIT0gKE1hZ2lja1NpemVUeXBlKSAoKHNpemVfdCkgKDQqbnVtYmVyX3BpeGVscykpKQogICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgIGlmICgoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgfHwKICAgICAgICAoKGltYWdlX2luZm8tPnR5cGUgIT0gVHJ1ZUNvbG9yVHlwZSkgJiYKICAgICAgICAgKElzSW1hZ2VHcmF5KGltYWdlLGV4Y2VwdGlvbikgIT0gTWFnaWNrRmFsc2UpKSkKICAgICAgewogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBGYXhDb21wcmVzc2lvbjoKICAgICAgICAgIGNhc2UgR3JvdXA0Q29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChMb2NhbGVDb21wYXJlKENDSVRUUGFyYW0sIjAiKSA9PSAwKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBIdWZmbWFuRW5jb2RlSW1hZ2UoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSxleGNlcHRpb24pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAodm9pZCkgSHVmZm1hbjJERW5jb2RlSW1hZ2UoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSxleGNlcHRpb24pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgSlBFR0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICBzdGF0dXM9SW5qZWN0SW1hZ2VCbG9iKGltYWdlX2luZm8saW1hZ2UsaW1hZ2UsImpwZWciLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSwianAyIixleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgQWxsb2NhdGUgcGl4ZWwgYXJyYXkuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICBwaXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkobGVuZ3RoLAogICAgICAgICAgICAgIHNpemVvZigqcGl4ZWxzKSk7CiAgICAgICAgICAgIGlmIChwaXhlbHMgPT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKICAgICAgICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIFJ1bmxlbmd0aCBlbmNvZGVkIHBpeGVscy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIGltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHMoaW1hZ2UsMCx5LGltYWdlLT5jb2x1bW5zLDEsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBpZiAocCA9PSAoY29uc3QgUXVhbnR1bSAqKSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgaW1hZ2UtPmNvbHVtbnM7IHgrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEludGVuc2l0eShpbWFnZSxwKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgc3RhdHVzPVNldEltYWdlUHJvZ3Jlc3MoaW1hZ2UsU2F2ZUltYWdlVGFnLChNYWdpY2tPZmZzZXRUeXBlKQogICAgICAgICAgICAgICAgICAgIHksaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IFppcENvbXByZXNzaW9uKQogICAgICAgICAgICAgIHN0YXR1cz1aTElCRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBMWldDb21wcmVzc2lvbikKICAgICAgICAgICAgICAgIHN0YXR1cz1MWldFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3RhdHVzPVBhY2tiaXRzRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBwaXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShwaXhlbHMpOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgdW5jb21wcmVzc2VkIFBzZXVkb0NvbG9yIHBhY2tldHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKAogICAgICAgICAgICAgICAgICBHZXRQaXhlbEludGVuc2l0eShpbWFnZSxwKSkpOwogICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyhpbWFnZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChpbWFnZS0+cHJldmlvdXMgPT0gKEltYWdlICopIE5VTEwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHN0YXR1cz1TZXRJbWFnZVByb2dyZXNzKGltYWdlLFNhdmVJbWFnZVRhZywoTWFnaWNrT2Zmc2V0VHlwZSkKICAgICAgICAgICAgICAgICAgICB5LGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBBc2NpaTg1Rmx1c2goaW1hZ2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIGVsc2UKICAgICAgaWYgKChpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBEaXJlY3RDbGFzcykgfHwgKGltYWdlLT5jb2xvcnMgPiAyNTYpIHx8CiAgICAgICAgICAoY29tcHJlc3Npb24gPT0gSlBFR0NvbXByZXNzaW9uKSB8fAogICAgICAgICAgKGNvbXByZXNzaW9uID09IEpQRUcyMDAwQ29tcHJlc3Npb24pKQogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSxpbWFnZSwianBlZyIsZXhjZXB0aW9uKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgSlBFRzIwMDBDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhdHVzPUluamVjdEltYWdlQmxvYihpbWFnZV9pbmZvLGltYWdlLGltYWdlLCJqcDIiLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIFJMRUNvbXByZXNzaW9uOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBBbGxvY2F0ZSBwaXhlbCBhcnJheS4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIG51bWJlcl9waXhlbHM7CiAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeShsZW5ndGgsCiAgICAgICAgICAgICAgNCpzaXplb2YoKnBpeGVscykpOwogICAgICAgICAgICBsZW5ndGgqPWltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlID8gNFVMIDogM1VMOwogICAgICAgICAgICBpZiAocGl4ZWxzID09ICh1bnNpZ25lZCBjaGFyICopIE5VTEwpCiAgICAgICAgICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLCJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgRHVtcCBydW5vZmZzZXQgZW5jb2RlZCBwaXhlbHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcD1HZXRWaXJ0dWFsUGl4ZWxzKGltYWdlLDAseSxpbWFnZS0+Y29sdW1ucywxLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxSZWQoaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxHcmVlbihpbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEJsdWUoaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgaWYgKGltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlKQogICAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEJsYWNrKGltYWdlLHApKTsKICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1hZ2UtPnByZXZpb3VzID09IChJbWFnZSAqKSBOVUxMKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBzdGF0dXM9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZSxTYXZlSW1hZ2VUYWcsKE1hZ2lja09mZnNldFR5cGUpCiAgICAgICAgICAgICAgICAgICAgeSxpbWFnZS0+cm93cyk7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9aTElCX0RFTEVHQVRFKQogICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gWmlwQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgc3RhdHVzPVpMSUJFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IExaV0NvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgc3RhdHVzPUxaV0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzdGF0dXM9UGFja2JpdHNFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KHBpeGVscyk7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE5vQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgRHVtcCB1bmNvbXByZXNzZWQgRGlyZWN0Q29sb3IgcGFja2V0cy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgQXNjaWk4NUluaXRpYWxpemUoaW1hZ2UpOwogICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcD1HZXRWaXJ0dWFsUGl4ZWxzKGltYWdlLDAseSxpbWFnZS0+Y29sdW1ucywxLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxSZWQoaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsR3JlZW4oaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsQmx1ZShpbWFnZSxwKSkpOwogICAgICAgICAgICAgICAgaWYgKGltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlKQogICAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcigKICAgICAgICAgICAgICAgICAgICBHZXRQaXhlbEJsYWNrKGltYWdlLHApKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgc3RhdHVzPVNldEltYWdlUHJvZ3Jlc3MoaW1hZ2UsU2F2ZUltYWdlVGFnLChNYWdpY2tPZmZzZXRUeXBlKQogICAgICAgICAgICAgICAgICAgIHksaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8qCiAgICAgICAgICAgIER1bXAgbnVtYmVyIG9mIGNvbG9ycyBhbmQgY29sb3JtYXAuCiAgICAgICAgICAqLwogICAgICAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBBbGxvY2F0ZSBwaXhlbCBhcnJheS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeShsZW5ndGgsCiAgICAgICAgICAgICAgICBzaXplb2YoKnBpeGVscykpOwogICAgICAgICAgICAgIGlmIChwaXhlbHMgPT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKICAgICAgICAgICAgICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwKICAgICAgICAgICAgICAgICAgIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgRHVtcCBSdW5sZW5ndGggZW5jb2RlZCBwaXhlbHMuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBxPXBpeGVsczsKICAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAqcSsrPSh1bnNpZ25lZCBjaGFyKSBHZXRQaXhlbEluZGV4KGltYWdlLHApOwogICAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKGltYWdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+cHJldmlvdXMgPT0gKEltYWdlICopIE5VTEwpCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZSxTYXZlSW1hZ2VUYWcsCiAgICAgICAgICAgICAgICAgICAgICAoTWFnaWNrT2Zmc2V0VHlwZSkgeSxpbWFnZS0+cm93cyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX1pMSUJfREVMRUdBVEUpCiAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IFppcENvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgc3RhdHVzPVpMSUJFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBMWldDb21wcmVzc2lvbikKICAgICAgICAgICAgICAgICAgc3RhdHVzPUxaV0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgc3RhdHVzPVBhY2tiaXRzRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KHBpeGVscyk7CiAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIER1bXAgdW5jb21wcmVzc2VkIFBzZXVkb0NvbG9yIHBhY2tldHMuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBBc2NpaTg1SW5pdGlhbGl6ZShpbWFnZSk7CiAgICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHMoaW1hZ2UsMCx5LGltYWdlLT5jb2x1bW5zLDEsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgaW1hZ2UtPmNvbHVtbnM7IHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSwodW5zaWduZWQgY2hhcikgR2V0UGl4ZWxJbmRleChpbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGltYWdlLT5wcmV2aW91cyA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0YXR1cz1TZXRJbWFnZVByb2dyZXNzKGltYWdlLFNhdmVJbWFnZVRhZywKICAgICAgICAgICAgICAgICAgICAgIChNYWdpY2tPZmZzZXRUeXBlKSB5LGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgQXNjaWk4NUZsdXNoKGltYWdlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgIG9mZnNldD1UZWxsQmxvYihpbWFnZSktb2Zmc2V0OwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXG5lbmRzdHJlYW1cbiIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgQ29sb3JzcGFjZSBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkKICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCIvRGV2aWNlQ01ZS1xuIixNYXhUZXh0RXh0ZW50KTsKICAgIGVsc2UKICAgICAgaWYgKChjb21wcmVzc2lvbiA9PSBGYXhDb21wcmVzc2lvbikgfHwKICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgfHwKICAgICAgICAgICgoaW1hZ2VfaW5mby0+dHlwZSAhPSBUcnVlQ29sb3JUeXBlKSAmJgogICAgICAgICAgIChJc0ltYWdlR3JheShpbWFnZSxleGNlcHRpb24pICE9IE1hZ2lja0ZhbHNlKSkpCiAgICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZXZpY2VHcmF5XG4iLE1heFRleHRFeHRlbnQpOwogICAgICBlbHNlCiAgICAgICAgaWYgKChpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBEaXJlY3RDbGFzcykgfHwgKGltYWdlLT5jb2xvcnMgPiAyNTYpIHx8CiAgICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBKUEVHQ29tcHJlc3Npb24pIHx8CiAgICAgICAgICAgIChjb21wcmVzc2lvbiA9PSBKUEVHMjAwMENvbXByZXNzaW9uKSkKICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGJ1ZmZlciwiL0RldmljZVJHQlxuIixNYXhUZXh0RXh0ZW50KTsKICAgICAgICBlbHNlCiAgICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAgICAgICAiWyAvSW5kZXhlZCAvRGV2aWNlUkdCICUuMjBnICUuMjBnIDAgUiBdXG4iLChkb3VibGUpIGltYWdlLT5jb2xvcnMtCiAgICAgICAgICAgIDEsKGRvdWJsZSkgb2JqZWN0KzMpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIFRodW1iIG9iamVjdC4KICAgICovCiAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwogICAgKHZvaWQpIFBhcnNlTWV0YUdlb21ldHJ5KCIxMDZ4MTA2KzArMD4iLCZnZW9tZXRyeS54LCZnZW9tZXRyeS55LAogICAgICAmZ2VvbWV0cnkud2lkdGgsJmdlb21ldHJ5LmhlaWdodCk7CiAgICB0aWxlX2ltYWdlPVRodW1ibmFpbEltYWdlKGltYWdlLGdlb21ldHJ5LndpZHRoLGdlb21ldHJ5LmhlaWdodCxleGNlcHRpb24pOwogICAgaWYgKHRpbGVfaW1hZ2UgPT0gKEltYWdlICopIE5VTEwpCiAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgIHsKICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJBU0NJSTg1RGVjb2RlIik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkRDVERlY29kZSIpOwogICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgIGJyZWFrOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkpQWERlY29kZSIpOwogICAgICAgIGlmIChpbWFnZS0+Y29sb3JzcGFjZSAhPSBDTVlLQ29sb3JzcGFjZSkKICAgICAgICAgIGJyZWFrOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF1cbiIsCiAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIExaV0NvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJMWldEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIFppcENvbXByZXNzaW9uOgogICAgICB7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCxDRm9ybWF0LCJGbGF0ZURlY29kZSIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgRmF4Q29tcHJlc3Npb246CiAgICAgIGNhc2UgR3JvdXA0Q29tcHJlc3Npb246CiAgICAgIHsKICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9GaWx0ZXIgWyAvQ0NJVFRGYXhEZWNvZGUgXVxuIiwKICAgICAgICAgIE1heFRleHRFeHRlbnQpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRGVjb2RlUGFybXMgWyA8PCAiCiAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICUuMjBnIC9Sb3dzICUuMjBnID4+IF1cbiIsQ0NJVFRQYXJhbSwKICAgICAgICAgIChkb3VibGUpIHRpbGVfaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgdGlsZV9pbWFnZS0+cm93cyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVmYXVsdDoKICAgICAgewogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwKICAgICAgICAgICJSdW5MZW5ndGhEZWNvZGUiKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICUuMjBnXG4iLChkb3VibGUpCiAgICAgIHRpbGVfaW1hZ2UtPmNvbHVtbnMpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlLjIwZ1xuIiwoZG91YmxlKQogICAgICB0aWxlX2ltYWdlLT5yb3dzKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db2xvclNwYWNlICUuMjBnIDAgUlxuIiwKICAgICAgKGRvdWJsZSkgb2JqZWN0LTEpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0JpdHNQZXJDb21wb25lbnQgJWRcbiIsCiAgICAgIChjb21wcmVzc2lvbiA9PSBGYXhDb21wcmVzc2lvbikgfHwgKGNvbXByZXNzaW9uID09IEdyb3VwNENvbXByZXNzaW9uKSA/CiAgICAgIDEgOiA4KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGcgMCBSXG4iLAogICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwogICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKTsKICAgIG51bWJlcl9waXhlbHM9KE1hZ2lja1NpemVUeXBlKSB0aWxlX2ltYWdlLT5jb2x1bW5zKnRpbGVfaW1hZ2UtPnJvd3M7CiAgICBpZiAoKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fAogICAgICAgIChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikgfHwKICAgICAgICAoKGltYWdlX2luZm8tPnR5cGUgIT0gVHJ1ZUNvbG9yVHlwZSkgJiYKICAgICAgICAgKElzSW1hZ2VHcmF5KHRpbGVfaW1hZ2UsZXhjZXB0aW9uKSAhPSBNYWdpY2tGYWxzZSkpKQogICAgICB7CiAgICAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICAgICB7CiAgICAgICAgICBjYXNlIEZheENvbXByZXNzaW9uOgogICAgICAgICAgY2FzZSBHcm91cDRDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKExvY2FsZUNvbXBhcmUoQ0NJVFRQYXJhbSwiMCIpID09IDApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIEh1ZmZtYW5FbmNvZGVJbWFnZShpbWFnZV9pbmZvLGltYWdlLHRpbGVfaW1hZ2UsCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICh2b2lkKSBIdWZmbWFuMkRFbmNvZGVJbWFnZShpbWFnZV9pbmZvLGltYWdlLHRpbGVfaW1hZ2UsZXhjZXB0aW9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEpQRUdDb21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgc3RhdHVzPUluamVjdEltYWdlQmxvYihpbWFnZV9pbmZvLGltYWdlLHRpbGVfaW1hZ2UsImpwZWciLAogICAgICAgICAgICAgIGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEpQRUcyMDAwQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSx0aWxlX2ltYWdlLCJqcDIiLGV4Y2VwdGlvbik7CiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIENsb3NlQmxvYihpbWFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4oTWFnaWNrRmFsc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIFJMRUNvbXByZXNzaW9uOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBBbGxvY2F0ZSBwaXhlbCBhcnJheS4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIG51bWJlcl9waXhlbHM7CiAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeShsZW5ndGgsCiAgICAgICAgICAgICAgc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgaWYgKHBpeGVscyA9PSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRpbGVfaW1hZ2U9RGVzdHJveUltYWdlKHRpbGVfaW1hZ2UpOwogICAgICAgICAgICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLAogICAgICAgICAgICAgICAgICAiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIFJ1bmxlbmd0aCBlbmNvZGVkIHBpeGVscy4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgcT1waXhlbHM7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyh0aWxlX2ltYWdlLDAseSx0aWxlX2ltYWdlLT5jb2x1bW5zLDEsCiAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKnErKz1TY2FsZVF1YW50dW1Ub0NoYXIoR2V0UGl4ZWxJbnRlbnNpdHkodGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKHRpbGVfaW1hZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX1pMSUJfREVMRUdBVEUpCiAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBaaXBDb21wcmVzc2lvbikKICAgICAgICAgICAgICBzdGF0dXM9WkxJQkVuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTFpXQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgICBzdGF0dXM9TFpXRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHN0YXR1cz1QYWNrYml0c0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgcGl4ZWxzPSh1bnNpZ25lZCBjaGFyICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkocGl4ZWxzKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgTm9Db21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIHVuY29tcHJlc3NlZCBQc2V1ZG9Db2xvciBwYWNrZXRzLgogICAgICAgICAgICAqLwogICAgICAgICAgICBBc2NpaTg1SW5pdGlhbGl6ZShpbWFnZSk7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyh0aWxlX2ltYWdlLDAseSx0aWxlX2ltYWdlLT5jb2x1bW5zLDEsCiAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSwKICAgICAgICAgICAgICAgICAgU2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsSW50ZW5zaXR5KHRpbGVfaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHModGlsZV9pbWFnZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgZWxzZQogICAgICBpZiAoKHRpbGVfaW1hZ2UtPnN0b3JhZ2VfY2xhc3MgPT0gRGlyZWN0Q2xhc3MpIHx8CiAgICAgICAgICAodGlsZV9pbWFnZS0+Y29sb3JzID4gMjU2KSB8fCAoY29tcHJlc3Npb24gPT0gSlBFR0NvbXByZXNzaW9uKSB8fAogICAgICAgICAgKGNvbXByZXNzaW9uID09IEpQRUcyMDAwQ29tcHJlc3Npb24pKQogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBKUEVHQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cz1JbmplY3RJbWFnZUJsb2IoaW1hZ2VfaW5mbyxpbWFnZSx0aWxlX2ltYWdlLCJqcGVnIiwKICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBKUEVHMjAwMENvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICBzdGF0dXM9SW5qZWN0SW1hZ2VCbG9iKGltYWdlX2luZm8saW1hZ2UsdGlsZV9pbWFnZSwianAyIixleGNlcHRpb24pOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgQWxsb2NhdGUgcGl4ZWwgYXJyYXkuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICBwaXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkobGVuZ3RoLDQqCiAgICAgICAgICAgICAgc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgbGVuZ3RoKj10aWxlX2ltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlID8gNFVMIDogM1VMOwogICAgICAgICAgICBpZiAocGl4ZWxzID09ICh1bnNpZ25lZCBjaGFyICopIE5VTEwpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGlsZV9pbWFnZT1EZXN0cm95SW1hZ2UodGlsZV9pbWFnZSk7CiAgICAgICAgICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsCiAgICAgICAgICAgICAgICAgICJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgcnVub2Zmc2V0IGVuY29kZWQgcGl4ZWxzLgogICAgICAgICAgICAqLwogICAgICAgICAgICBxPXBpeGVsczsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgdGlsZV9pbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcD1HZXRWaXJ0dWFsUGl4ZWxzKHRpbGVfaW1hZ2UsMCx5LHRpbGVfaW1hZ2UtPmNvbHVtbnMsMSwKICAgICAgICAgICAgICAgIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPmNvbHVtbnM7IHgrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbFJlZCh0aWxlX2ltYWdlLHApKTsKICAgICAgICAgICAgICAgICpxKys9U2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsR3JlZW4odGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAqcSsrPVNjYWxlUXVhbnR1bVRvQ2hhcihHZXRQaXhlbEJsdWUodGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UpCiAgICAgICAgICAgICAgICAgICpxKys9U2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsQmxhY2sodGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICBwKz1HZXRQaXhlbENoYW5uZWxzKHRpbGVfaW1hZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX1pMSUJfREVMRUdBVEUpCiAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBaaXBDb21wcmVzc2lvbikKICAgICAgICAgICAgICBzdGF0dXM9WkxJQkVuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTFpXQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgICBzdGF0dXM9TFpXRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHN0YXR1cz1QYWNrYml0c0VuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgcGl4ZWxzPSh1bnNpZ25lZCBjaGFyICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkocGl4ZWxzKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgIHJldHVybihNYWdpY2tGYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgTm9Db21wcmVzc2lvbjoKICAgICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBEdW1wIHVuY29tcHJlc3NlZCBEaXJlY3RDb2xvciBwYWNrZXRzLgogICAgICAgICAgICAqLwogICAgICAgICAgICBBc2NpaTg1SW5pdGlhbGl6ZShpbWFnZSk7CiAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyh0aWxlX2ltYWdlLDAseSx0aWxlX2ltYWdlLT5jb2x1bW5zLDEsCiAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoCiAgICAgICAgICAgICAgICAgIEdldFBpeGVsUmVkKHRpbGVfaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKAogICAgICAgICAgICAgICAgICBHZXRQaXhlbEdyZWVuKHRpbGVfaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKAogICAgICAgICAgICAgICAgICBHZXRQaXhlbEJsdWUodGlsZV9pbWFnZSxwKSkpOwogICAgICAgICAgICAgICAgaWYgKGltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlKQogICAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcigKICAgICAgICAgICAgICAgICAgICBHZXRQaXhlbEJsYWNrKHRpbGVfaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHModGlsZV9pbWFnZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8qCiAgICAgICAgICAgIER1bXAgbnVtYmVyIG9mIGNvbG9ycyBhbmQgY29sb3JtYXAuCiAgICAgICAgICAqLwogICAgICAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBSTEVDb21wcmVzc2lvbjoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBBbGxvY2F0ZSBwaXhlbCBhcnJheS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIGxlbmd0aD0oc2l6ZV90KSBudW1iZXJfcGl4ZWxzOwogICAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeShsZW5ndGgsCiAgICAgICAgICAgICAgICBzaXplb2YoKnBpeGVscykpOwogICAgICAgICAgICAgIGlmIChwaXhlbHMgPT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdGlsZV9pbWFnZT1EZXN0cm95SW1hZ2UodGlsZV9pbWFnZSk7CiAgICAgICAgICAgICAgICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwKICAgICAgICAgICAgICAgICAgICAiTWVtb3J5QWxsb2NhdGlvbkZhaWxlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBEdW1wIFJ1bmxlbmd0aCBlbmNvZGVkIHBpeGVscy4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICAgIGZvciAoeT0wOyB5IDwgKHNzaXplX3QpIHRpbGVfaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwPUdldFZpcnR1YWxQaXhlbHModGlsZV9pbWFnZSwwLHksdGlsZV9pbWFnZS0+Y29sdW1ucywxLAogICAgICAgICAgICAgICAgICBleGNlcHRpb24pOwogICAgICAgICAgICAgICAgaWYgKHAgPT0gKGNvbnN0IFF1YW50dW0gKikgTlVMTCkKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICpxKys9KHVuc2lnbmVkIGNoYXIpIEdldFBpeGVsSW5kZXgodGlsZV9pbWFnZSxwKTsKICAgICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyh0aWxlX2ltYWdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gWmlwQ29tcHJlc3Npb24pCiAgICAgICAgICAgICAgICBzdGF0dXM9WkxJQkVuY29kZUltYWdlKGltYWdlLGxlbmd0aCxwaXhlbHMsZXhjZXB0aW9uKTsKICAgICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IExaV0NvbXByZXNzaW9uKQogICAgICAgICAgICAgICAgICBzdGF0dXM9TFpXRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBzdGF0dXM9UGFja2JpdHNFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgcGl4ZWxzPSh1bnNpZ25lZCBjaGFyICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkocGl4ZWxzKTsKICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIE5vQ29tcHJlc3Npb246CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgRHVtcCB1bmNvbXByZXNzZWQgUHNldWRvQ29sb3IgcGFja2V0cy4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSB0aWxlX2ltYWdlLT5yb3dzOyB5KyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcD1HZXRWaXJ0dWFsUGl4ZWxzKHRpbGVfaW1hZ2UsMCx5LHRpbGVfaW1hZ2UtPmNvbHVtbnMsMSwKICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZm9yICh4PTA7IHggPCAoc3NpemVfdCkgdGlsZV9pbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLCh1bnNpZ25lZCBjaGFyKQogICAgICAgICAgICAgICAgICAgIEdldFBpeGVsSW5kZXgodGlsZV9pbWFnZSxwKSk7CiAgICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBBc2NpaTg1Rmx1c2goaW1hZ2UpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgdGlsZV9pbWFnZT1EZXN0cm95SW1hZ2UodGlsZV9pbWFnZSk7CiAgICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLW9mZnNldDsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuZW5kc3RyZWFtXG4iKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAvKgogICAgICBXcml0ZSBMZW5ndGggb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKSBvZmZzZXQpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICBpZiAoKGltYWdlLT5zdG9yYWdlX2NsYXNzICE9IERpcmVjdENsYXNzKSAmJiAoaW1hZ2UtPmNvbG9ycyA8PSAyNTYpICYmCiAgICAgICAgKGNvbXByZXNzaW9uICE9IEZheENvbXByZXNzaW9uKSAmJiAoY29tcHJlc3Npb24gIT0gR3JvdXA0Q29tcHJlc3Npb24pKQogICAgICB7CiAgICAgICAgLyoKICAgICAgICAgIFdyaXRlIENvbG9ybWFwIG9iamVjdC4KICAgICAgICAqLwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZSBdXG4iKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKICAgICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CiAgICAgICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKTsKICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBpbWFnZS0+Y29sb3JzOyBpKyspCiAgICAgICAgewogICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IE5vQ29tcHJlc3Npb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBBc2NpaTg1RW5jb2RlKGltYWdlLFNjYWxlUXVhbnR1bVRvQ2hhcihpbWFnZS0+Y29sb3JtYXBbaV0ucmVkKSk7CiAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoaW1hZ2UtPmNvbG9ybWFwW2ldLmdyZWVuKSk7CiAgICAgICAgICAgICAgQXNjaWk4NUVuY29kZShpbWFnZSxTY2FsZVF1YW50dW1Ub0NoYXIoaW1hZ2UtPmNvbG9ybWFwW2ldLmJsdWUpKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYkJ5dGUoaW1hZ2UsCiAgICAgICAgICAgIFNjYWxlUXVhbnR1bVRvQ2hhcihpbWFnZS0+Y29sb3JtYXBbaV0ucmVkKSk7CiAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iQnl0ZShpbWFnZSwKICAgICAgICAgICAgU2NhbGVRdWFudHVtVG9DaGFyKGltYWdlLT5jb2xvcm1hcFtpXS5ncmVlbikpOwogICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYkJ5dGUoaW1hZ2UsCiAgICAgICAgICAgIFNjYWxlUXVhbnR1bVRvQ2hhcihpbWFnZS0+Y29sb3JtYXBbaV0uYmx1ZSkpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgIEFzY2lpODVGbHVzaChpbWFnZSk7CiAgICAgICBvZmZzZXQ9VGVsbEJsb2IoaW1hZ2UpLW9mZnNldDsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlxuZW5kc3RyZWFtXG4iKTsKICAgICAgfQogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgIC8qCiAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAqLwogICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgb2JqZWN0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpCiAgICAgIG9mZnNldCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgc29mdG1hc2sgb2JqZWN0LgogICAgKi8KICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgIG9iamVjdCk7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICBpZiAoaW1hZ2UtPm1hdHRlID09IE1hZ2lja0ZhbHNlKQogICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICBlbHNlCiAgICAgIHsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvWE9iamVjdFxuIik7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1N1YnR5cGUgL0ltYWdlXG4iKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTmFtZSAvTWElLjIwZ1xuIiwKICAgICAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSk7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgICAgewogICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsCiAgICAgICAgICAgICAgIkFTQ0lJODVEZWNvZGUiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIExaV0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsIkxaV0RlY29kZSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgWmlwQ29tcHJlc3Npb246CiAgICAgICAgICB7CiAgICAgICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsQ0Zvcm1hdCwKICAgICAgICAgICAgICAiRmxhdGVEZWNvZGUiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgewogICAgICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LENGb3JtYXQsCiAgICAgICAgICAgICAgIlJ1bkxlbmd0aERlY29kZSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9XaWR0aCAlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgICAgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSGVpZ2h0ICUuMjBnXG4iLAogICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvQ29sb3JTcGFjZSAvRGV2aWNlR3JheVxuIik7CiAgICAgICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0JpdHNQZXJDb21wb25lbnQgJWRcbiIsCiAgICAgICAgICAoY29tcHJlc3Npb24gPT0gRmF4Q29tcHJlc3Npb24pIHx8IChjb21wcmVzc2lvbiA9PSBHcm91cDRDb21wcmVzc2lvbikKICAgICAgICAgID8gMSA6IDgpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKICAgICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CiAgICAgICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKTsKICAgICAgICBudW1iZXJfcGl4ZWxzPShNYWdpY2tTaXplVHlwZSkgaW1hZ2UtPmNvbHVtbnMqaW1hZ2UtPnJvd3M7CiAgICAgICAgc3dpdGNoIChjb21wcmVzc2lvbikKICAgICAgICB7CiAgICAgICAgICBjYXNlIFJMRUNvbXByZXNzaW9uOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICBBbGxvY2F0ZSBwaXhlbCBhcnJheS4KICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIG51bWJlcl9waXhlbHM7CiAgICAgICAgICAgIHBpeGVscz0odW5zaWduZWQgY2hhciAqKSBBY3F1aXJlUXVhbnR1bU1lbW9yeShsZW5ndGgsCiAgICAgICAgICAgICAgc2l6ZW9mKCpwaXhlbHMpKTsKICAgICAgICAgICAgaWYgKHBpeGVscyA9PSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGltYWdlPURlc3Ryb3lJbWFnZShpbWFnZSk7CiAgICAgICAgICAgICAgICBUaHJvd1dyaXRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsCiAgICAgICAgICAgICAgICAgICJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgUnVubGVuZ3RoIGVuY29kZWQgcGl4ZWxzLgogICAgICAgICAgICAqLwogICAgICAgICAgICBxPXBpeGVsczsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICpxKys9U2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsQWxwaGEoaW1hZ2UscCkpOwogICAgICAgICAgICAgICAgcCs9R2V0UGl4ZWxDaGFubmVscyhpbWFnZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfWkxJQl9ERUxFR0FURSkKICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IFppcENvbXByZXNzaW9uKQogICAgICAgICAgICAgIHN0YXR1cz1aTElCRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBlbHNlCiNlbmRpZgogICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBMWldDb21wcmVzc2lvbikKICAgICAgICAgICAgICAgIHN0YXR1cz1MWldFbmNvZGVJbWFnZShpbWFnZSxsZW5ndGgscGl4ZWxzLGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3RhdHVzPVBhY2tiaXRzRW5jb2RlSW1hZ2UoaW1hZ2UsbGVuZ3RoLHBpeGVscyxleGNlcHRpb24pOwogICAgICAgICAgICBwaXhlbHM9KHVuc2lnbmVkIGNoYXIgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShwaXhlbHMpOwogICAgICAgICAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICh2b2lkKSBDbG9zZUJsb2IoaW1hZ2UpOwogICAgICAgICAgICAgICAgcmV0dXJuKE1hZ2lja0ZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgIER1bXAgdW5jb21wcmVzc2VkIFBzZXVkb0NvbG9yIHBhY2tldHMuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIEFzY2lpODVJbml0aWFsaXplKGltYWdlKTsKICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgIHA9R2V0VmlydHVhbFBpeGVscyhpbWFnZSwwLHksaW1hZ2UtPmNvbHVtbnMsMSxleGNlcHRpb24pOwogICAgICAgICAgICAgIGlmIChwID09IChjb25zdCBRdWFudHVtICopIE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzY2lpODVFbmNvZGUoaW1hZ2UsU2NhbGVRdWFudHVtVG9DaGFyKEdldFBpeGVsQWxwaGEoaW1hZ2UscCkpKTsKICAgICAgICAgICAgICAgIHArPUdldFBpeGVsQ2hhbm5lbHMoaW1hZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBBc2NpaTg1Rmx1c2goaW1hZ2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKS1vZmZzZXQ7CiAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXG5lbmRzdHJlYW1cbiIpOwogICAgICB9CiAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgLyoKICAgICAgV3JpdGUgTGVuZ3RoIG9iamVjdC4KICAgICovCiAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICBvYmplY3QpOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkgb2Zmc2V0KTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICBpZiAoR2V0TmV4dEltYWdlSW5MaXN0KGltYWdlKSA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgYnJlYWs7CiAgICBpbWFnZT1TeW5jTmV4dEltYWdlSW5MaXN0KGltYWdlKTsKICAgIHN0YXR1cz1TZXRJbWFnZVByb2dyZXNzKGltYWdlLFNhdmVJbWFnZXNUYWcsc2NlbmUrKywKICAgICAgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CiAgICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgICBicmVhazsKICB9IHdoaWxlIChpbWFnZV9pbmZvLT5hZGpvaW4gIT0gTWFnaWNrRmFsc2UpOwogIC8qCiAgICBXcml0ZSBNZXRhZGF0YSBvYmplY3QuCiAgKi8KICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgaW5mb19pZD1vYmplY3Q7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgIG9iamVjdCk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvVGl0bGUgKCVzKVxuIiwKICAgIEVzY2FwZVBhcmVudGhlc2lzKGJhc2VuYW1lKSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogIHNlY29uZHM9dGltZSgodGltZV90ICopIE5VTEwpOwojaWYgZGVmaW5lZChNQUdJQ0tDT1JFX0hBVkVfTE9DQUxUSU1FX1IpCiAgKHZvaWQpIGxvY2FsdGltZV9yKCZzZWNvbmRzLCZsb2NhbF90aW1lKTsKI2Vsc2UKICAodm9pZCkgbWVtY3B5KCZsb2NhbF90aW1lLGxvY2FsdGltZSgmc2Vjb25kcyksc2l6ZW9mKGxvY2FsX3RpbWUpKTsKI2VuZGlmCiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhkYXRlLE1heFRleHRFeHRlbnQsIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwKICAgIGxvY2FsX3RpbWUudG1feWVhcisxOTAwLGxvY2FsX3RpbWUudG1fbW9uKzEsbG9jYWxfdGltZS50bV9tZGF5LAogICAgbG9jYWxfdGltZS50bV9ob3VyLGxvY2FsX3RpbWUudG1fbWluLGxvY2FsX3RpbWUudG1fc2VjKTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ3JlYXRpb25EYXRlICglcylcbiIsZGF0ZSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Nb2REYXRlICglcylcbiIsZGF0ZSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Qcm9kdWNlciAoJXMpXG4iLAogICAgRXNjYXBlUGFyZW50aGVzaXMoR2V0TWFnaWNrVmVyc2lvbigoc2l6ZV90ICopIE5VTEwpKSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogIC8qCiAgICBXcml0ZSBYcmVmIG9iamVjdC4KICAqLwogIG9mZnNldD1UZWxsQmxvYihpbWFnZSkteHJlZlswXSsKICAgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQREZBIikgPT0gMCA/IDYgOiAwKSsxMDsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJ4cmVmXG4iKTsKICAodm9pZCkgRm9ybWF0TG9jYWxlU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIwICUuMjBnXG4iLChkb3VibGUpCiAgICBvYmplY3QrMSk7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjAwMDAwMDAwMDAgNjU1MzUgZiBcbiIpOwogIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIG9iamVjdDsgaSsrKQogIHsKICAgICh2b2lkKSBGb3JtYXRMb2NhbGVTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUwMTBsdSAwMDAwMCBuIFxuIiwKICAgICAgKHVuc2lnbmVkIGxvbmcpIHhyZWZbaV0pOwogICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogIH0KICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJ0cmFpbGVyXG4iKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1NpemUgJS4yMGdcbiIsKGRvdWJsZSkKICAgIG9iamVjdCsxKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0luZm8gJS4yMGcgMCBSXG4iLChkb3VibGUpCiAgICBpbmZvX2lkKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1Jvb3QgJS4yMGcgMCBSXG4iLChkb3VibGUpCiAgICByb290X2lkKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIFNpZ25hdHVyZUltYWdlKGltYWdlLGV4Y2VwdGlvbik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0lEIFs8JXM+IDwlcz5dXG4iLAogICAgR2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwic2lnbmF0dXJlIixleGNlcHRpb24pLAogICAgR2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwic2lnbmF0dXJlIixleGNlcHRpb24pKTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0YXJ0eHJlZlxuIik7CiAgKHZvaWQpIEZvcm1hdExvY2FsZVN0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkgb2Zmc2V0KTsKICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVFT0ZcbiIpOwogIHhyZWY9KE1hZ2lja09mZnNldFR5cGUgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeSh4cmVmKTsKICAodm9pZCkgQ2xvc2VCbG9iKGltYWdlKTsKICByZXR1cm4oTWFnaWNrVHJ1ZSk7Cn0K