LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAyMi5sb2NhbGUubW9uZXkuZ2V0LmNwcAogKgogKiAkSWQkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSAgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogKiBjb250cmlidXRvciAgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlICB0aGUgTk9USUNFICBmaWxlIGRpc3RyaWJ1dGVkCiAqIHdpdGggIHRoaXMgIHdvcmsgIGZvciAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgcmVnYXJkaW5nICBjb3B5cmlnaHQKICogb3duZXJzaGlwLiAgIFRoZSBBU0YgIGxpY2Vuc2VzIHRoaXMgIGZpbGUgdG8gIHlvdSB1bmRlciAgdGhlIEFwYWNoZQogKiBMaWNlbnNlLCBWZXJzaW9uICAyLjAgKHRoZSAgIkxpY2Vuc2UiKTsgeW91IG1heSAgbm90IHVzZSAgdGhpcyBmaWxlCiAqIGV4Y2VwdCBpbiAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgIFlvdSBtYXkgb2J0YWluICBhIGNvcHkgb2YKICogdGhlIExpY2Vuc2UgYXQKICoKICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgIE9GIEFOWSAgS0lORCwgZWl0aGVyICBleHByZXNzIG9yCiAqIGltcGxpZWQuICAgU2VlICB0aGUgTGljZW5zZSAgZm9yICB0aGUgIHNwZWNpZmljIGxhbmd1YWdlICBnb3Zlcm5pbmcKICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBDb3B5cmlnaHQgMjAwMS0yMDA2IFJvZ3VlIFdhdmUgU29mdHdhcmUuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8aW9zPgojaW5jbHVkZSA8bG9jYWxlPgoKI2luY2x1ZGUgPGNzdGRpbz4gICAgIC8vIGZvciBzc2NhbmYoKQoKI2luY2x1ZGUgPHJ3X2NtZG9wdC5oPiAgIC8vIGZvciByd19lbmFibGVkKCkKI2luY2x1ZGUgPHJ3X2RyaXZlci5oPiAgIC8vIGZvciByd19hc3NlcnQoKSwgcndfdGVzdCgpLCAuLi4KI2luY2x1ZGUgPHJ3X2NoYXIuaD4gICAgIC8vIGZvciByd19leHBhbmQoKQojaW5jbHVkZSA8cndfdmFsY21wLmg+ICAgLy8gZm9yIHJ3X2xkYmxjbXAoKQoKCiNpZm5kZWYgX1JXU1REX05PX0xPTkdfRE9VQkxFCiMgIGRlZmluZSBMb25nRG91YmxlIGxvbmcgZG91YmxlCiNlbHNlCiMgIGRlZmluZSBMb25nRG91YmxlICAgZG91YmxlCiMgIGRlZmluZSByd19sZGJsY21wICAgcndfZGJsY21wCiNlbmRpZiAgIC8vIF9SV1NURF9OT19MT05HX0RPVUJMRQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gc2V0IHRvIG5vbi16ZXJvIHZhbHVlIHdoZW4gdGhlIGJhc2ljX3N0cmluZyBvdmVybG9hZHMKLy8gb2YgbW9uZVktcHV0OjpwdXQoKSBzaG91bGRuJ3QgYmUgZXhlcmNpc2VkCnN0YXRpYyBpbnQgbm9fYmFzaWNfc3RyaW5nOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gcmVwbGFjZW1lbnQgY3R5cGUgZmFjZXQKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kc3RydWN0IEN0eXBlOiBzdGQ6OmN0eXBlPGNoYXJUPgp7CiAgICB0eXBlZGVmIHN0ZDo6Y3R5cGU8Y2hhclQ+IEJhc2U7CgogICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpjaGFyX3R5cGUgY2hhcl90eXBlOwoKICAgIHN0YXRpYyBpbnQgbl93aWRlbl87CgogICAgQ3R5cGUgKCk6IEJhc2UgKDAsIDAsIDEpIHsgfQoKICAgIHZpcnR1YWwgY2hhcl90eXBlIGRvX3dpZGVuIChjaGFyIGMpIGNvbnN0IHsKICAgICAgICArK25fd2lkZW5fOwoKICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlICcwJzogYyA9ICc5JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnMSc6IGMgPSAnOCc7IGJyZWFrOwogICAgICAgIGNhc2UgJzInOiBjID0gJzcnOyBicmVhazsKICAgICAgICBjYXNlICczJzogYyA9ICc2JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnNCc6IGMgPSAnNSc7IGJyZWFrOwogICAgICAgIGNhc2UgJzUnOiBjID0gJzQnOyBicmVhazsKICAgICAgICBjYXNlICc2JzogYyA9ICczJzsgYnJlYWs7CiAgICAgICAgY2FzZSAnNyc6IGMgPSAnMic7IGJyZWFrOwogICAgICAgIGNhc2UgJzgnOiBjID0gJzEnOyBicmVhazsKICAgICAgICBjYXNlICc5JzogYyA9ICcwJzsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2hhcl90eXBlIChjKTsKICAgIH0KCiAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKICAgIGRvX3dpZGVuIChjb25zdCBjaGFyICpsbywgY29uc3QgY2hhciAqaGksIGNoYXJfdHlwZSAqZHN0KSBjb25zdCB7CiAgICAgICAgcmV0dXJuIEJhc2U6OmRvX3dpZGVuIChsbywgaGksIGRzdCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CmludCBDdHlwZTxjaGFyVD46Om5fd2lkZW5fOwoKaW50IGZvbyAoKQp7CiAgICBzdGF0aWMgaW50IGk7CgogICAgcmV0dXJuICsraTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpzdHJ1Y3QgUHVuY3REYXRhCnsKICAgIHN0YXRpYyBjaGFyVCAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWxfcG9pbnRfIFsyXTsKICAgIHN0YXRpYyBjaGFyVCAgICAgICAgICAgICAgICAgICAgIHRob3VzYW5kc19zZXBfIFsyXTsKICAgIHN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgKmdyb3VwaW5nXyBbMl07CiAgICBzdGF0aWMgY29uc3QgY2hhclQgICAgICAgICAgICAgICpjdXJyX3N5bWJvbF8gWzJdOwogICAgc3RhdGljIGNvbnN0IGNoYXJUICAgICAgICAgICAgICAqcG9zaXRpdmVfc2lnbl8gWzJdOwogICAgc3RhdGljIGNvbnN0IGNoYXJUICAgICAgICAgICAgICAqbmVnYXRpdmVfc2lnbl8gWzJdOwogICAgc3RhdGljIHN0ZDo6bW9uZXlfYmFzZTo6cGF0dGVybiAgZm9ybWF0XyBbMl1bMl07CiAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICBmcmFjX2RpZ2l0c18gWzJdOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY29uc3QgY2hhcioKUHVuY3REYXRhPGNoYXJUPjo6Z3JvdXBpbmdfIFsyXSA9IHsgIiIsICIiIH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CmNoYXJUClB1bmN0RGF0YTxjaGFyVD46OmRlY2ltYWxfcG9pbnRfIFsyXSA9IHsgJy4nLCAnLicgfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY2hhclQKUHVuY3REYXRhPGNoYXJUPjo6dGhvdXNhbmRzX3NlcF8gWzJdID0geyAnLCcsICcsJyB9OwoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpjb25zdCBjaGFyVCoKUHVuY3REYXRhPGNoYXJUPjo6Y3Vycl9zeW1ib2xfIFsyXTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY29uc3QgY2hhclQqClB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFsyXTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY29uc3QgY2hhclQqClB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFsyXTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kc3RkOjptb25leV9iYXNlOjpwYXR0ZXJuIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gWzJdWzJdID0gewogICAgeyAgIC8vIGxvY2FsCiAgICAgICAgeyB7IC8vIHBvc2l0aXZlCiAgICAgICAgICAgICAgICBzdGQ6Om1vbmV5X2Jhc2U6OnN5bWJvbCwgc3RkOjptb25leV9iYXNlOjpzaWduLAogICAgICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpub25lLCAgIHN0ZDo6bW9uZXlfYmFzZTo6dmFsdWUKICAgICAgICAgICAgfSB9LAogICAgICAgIHsgeyAvLyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwKICAgICAgICAgICAgICAgIHN0ZDo6bW9uZXlfYmFzZTo6bm9uZSwgICBzdGQ6Om1vbmV5X2Jhc2U6OnZhbHVlCiAgICAgICAgICAgIH0gfQogICAgfSwKCiAgICB7ICAgLy8gaW50ZXJuYXRpb25hbAogICAgICAgIHsgeyAvLyBwb3NpdGl2ZQogICAgICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwKICAgICAgICAgICAgICAgIHN0ZDo6bW9uZXlfYmFzZTo6bm9uZSwgICBzdGQ6Om1vbmV5X2Jhc2U6OnZhbHVlCiAgICAgICAgICAgIH0gfSwKICAgICAgICB7IHsgLy8gbmVnYXRpdmUKICAgICAgICAgICAgICAgIHN0ZDo6bW9uZXlfYmFzZTo6c3ltYm9sLCBzdGQ6Om1vbmV5X2Jhc2U6OnNpZ24sCiAgICAgICAgICAgICAgICBzdGQ6Om1vbmV5X2Jhc2U6Om5vbmUsICAgc3RkOjptb25leV9iYXNlOjp2YWx1ZQogICAgICAgICAgICB9IH0KICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KaW50IFB1bmN0RGF0YTxjaGFyVD46OmZyYWNfZGlnaXRzXyBbMl07CgoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBib29sIEludGw+CnN0cnVjdCBQdW5jdDogc3RkOjptb25leXB1bmN0PGNoYXJULCBJbnRsPiwgUHVuY3REYXRhPGNoYXJUPgp7CiAgICB0eXBlZGVmIHN0ZDo6bW9uZXlwdW5jdDxjaGFyVCwgSW50bD4gQmFzZTsKICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Y2hhcl90eXBlICAgICBjaGFyX3R5cGU7CiAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OnN0cmluZ190eXBlICAgc3RyaW5nX3R5cGU7CgogICAgc3RhdGljIGludCBuX3Rob3VzYW5kc19zZXBfOyAgIC8vIG51bWJlciBvZiBjYWxscyB0byBkb190aG91c2FuZHNfc2VwKCkKCiAgICBQdW5jdCAoc3RkOjpzaXplX3QgcmVmKTogQmFzZSAocmVmKSB7IH0KCiAgICBjaGFyX3R5cGUgZG9fZGVjaW1hbF9wb2ludCAoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHRoaXMtPmRlY2ltYWxfcG9pbnRfIFtJbnRsXTsKICAgIH0KCiAgICBpbnQgZG9fZnJhY19kaWdpdHMgKCkgY29uc3QgewogICAgICAgIHJldHVybiB0aGlzLT5mcmFjX2RpZ2l0c18gW0ludGxdOwogICAgfQoKICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fY3Vycl9zeW1ib2wgKCkgY29uc3QgewogICAgICAgIGZvbyAoKTsKICAgICAgICByZXR1cm4gdGhpcy0+Y3Vycl9zeW1ib2xfIFtJbnRsXSA/CiAgICAgICAgICAgIHRoaXMtPmN1cnJfc3ltYm9sXyBbSW50bF0gOiBzdHJpbmdfdHlwZSAoKTsKICAgIH0KCiAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRvX2dyb3VwaW5nICgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gdGhpcy0+Z3JvdXBpbmdfIFtJbnRsXSA/IHRoaXMtPmdyb3VwaW5nXyBbSW50bF0gOiAiIjsKICAgIH0KCiAgICB2aXJ0dWFsIGNoYXJfdHlwZSBkb190aG91c2FuZHNfc2VwICgpIGNvbnN0IHsKICAgICAgICArK25fdGhvdXNhbmRzX3NlcF87CiAgICAgICAgcmV0dXJuIHRoaXMtPnRob3VzYW5kc19zZXBfIFtJbnRsXTsKICAgIH0KCiAgICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24gKCkgY29uc3QgewogICAgICAgIHJldHVybiB0aGlzLT5wb3NpdGl2ZV9zaWduXyAgW0ludGxdID8KICAgICAgICAgICAgdGhpcy0+cG9zaXRpdmVfc2lnbl8gW0ludGxdIDogc3RyaW5nX3R5cGUgKCk7CiAgICB9CgogICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduICgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gdGhpcy0+bmVnYXRpdmVfc2lnbl8gW0ludGxdID8KICAgICAgICAgICAgdGhpcy0+bmVnYXRpdmVfc2lnbl8gW0ludGxdIDogc3RyaW5nX3R5cGUgKCk7CiAgICB9CgogICAgdmlydHVhbCBzdGQ6Om1vbmV5X2Jhc2U6OnBhdHRlcm4gZG9fcG9zX2Zvcm1hdCAoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHRoaXMtPmZvcm1hdF8gW0ludGxdWzBdOwogICAgfQoKICAgIHZpcnR1YWwgc3RkOjptb25leV9iYXNlOjpwYXR0ZXJuIGRvX25lZ19mb3JtYXQgKCkgY29uc3QgewogICAgICAgIHJldHVybiB0aGlzLT5mb3JtYXRfIFtJbnRsXVsxXTsKICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgYm9vbCBJbnRsPgppbnQgUHVuY3Q8Y2hhclQsIEludGw+OjpuX3Rob3VzYW5kc19zZXBfOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kc3RydWN0IElvczogc3RkOjpiYXNpY19pb3M8Y2hhclQ+CnsKICAgIElvcyAoKSB7IHRoaXMtPmluaXQgKDApOyB9Cn07CgoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpzdHJ1Y3QgTW9uZXlHZXQ6IHN0ZDo6bW9uZXlfZ2V0PGNoYXJULCBjb25zdCBjaGFyVCo+IHsgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0ZDo6bW9uZXlfYmFzZTo6cGF0dGVybgpzZXRfcGF0dGVybiAoY29uc3QgY2hhciAqZm9ybWF0KQp7CiAgICBzdGQ6Om1vbmV5X2Jhc2U6OnBhdHRlcm4gcGF0OwoKICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gc2l6ZW9mIHBhdC5maWVsZCAvIHNpemVvZiAqcGF0LmZpZWxkOyArK2kpIHsKICAgICAgICBzd2l0Y2ggKGZvcm1hdCBbaV0pIHsKICAgICAgICBjYXNlICdcMCc6IGNhc2UgJ0AnOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjpub25lOyBicmVhazsKICAgICAgICBjYXNlICdcMSc6IGNhc2UgJyAnOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjpzcGFjZTsgYnJlYWs7CiAgICAgICAgY2FzZSAnXDInOiBjYXNlICckJzogcGF0LmZpZWxkIFtpXSA9IHN0ZDo6bW9uZXlfYmFzZTo6c3ltYm9sOyBicmVhazsKICAgICAgICBjYXNlICdcMyc6IGNhc2UgJy0nOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjpzaWduOyBicmVhazsKICAgICAgICBjYXNlICdcNCc6IGNhc2UgJzEnOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjp2YWx1ZTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgX1JXU1REX0FTU0VSVCAoISEiYmFkIGZvcm1hdCBzcGVjaWZpZXIiKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHBhdDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kdm9pZCBkb190ZXN0IChib29sICAgICAgICBpbnRsLCAgICAvLyBpbnRlcm5hdGlvbmFsPwogICAgICAgICAgICAgIGNoYXJUICAgICAgIHdoaWNoLCAgIC8vIHdoaWNoIG92ZXJsb2FkIHRvIGV4ZXJjaXNlCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqY25hbWUsICAgLy8gdGhlIG5hbWUgb2YgdGhlIGNoYXJUIHR5cGUKICAgICAgICAgICAgICBjb25zdCBjaGFyICp0bmFtZSwgICAvLyB0aGUgbmFtZSBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgdHlwZQogICAgICAgICAgICAgIGludCAgICAgICAgIGxpbmVubywgIC8vIGxpbmUgbnVtYmVyCiAgICAgICAgICAgICAgTG9uZ0RvdWJsZSAgdmFsLCAgICAgLy8gdGhlIGV4cGVjdGVkIGV4dHJhY3RlZCB2YWx1ZQogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgICAgIC8vIHRoZSBzZXF1ZW5jZSB0byBleHRyYWN0IGZyb20KICAgICAgICAgICAgICBpbnQgICAgICAgICBjb25zdW1lZCA9IC0xLCAgIC8vIGV4cGVjdGVkIG51bWJlciBleHRyYWN0aW9ucwogICAgICAgICAgICAgIGludCAgICAgICAgIGZsYWdzID0gMCwgICAgICAgLy8gaW5pdGlhbCBpb3MgZmxhZ3MKICAgICAgICAgICAgICBpbnQgICAgICAgICBlcnJfZXhwZWN0ID0gLTEsIC8vIGV4cGVjdGVkIGZpbmFsIHN0YXRlCiAgICAgICAgICAgICAgaW50ICAgICAgICAgZnJhY19kaWdpdHMgPSAwLCAvLyBmcmFjdGlvbmFsIGRpZ2l0cwogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtYXQgPSAwLCAgICAgICAgLy8gbW9uZXlfYmFzZTo6cGF0dGVybgogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmN1cnN5bSA9IDAsICAgICAgLy8gY3VycmVuY3kgc3ltYm9sCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3JvdXBpbmcgPSAiIikgICAvLyBncm91cGluZyBzdHJpbmcKewogICAgaWYgKCFyd19lbmFibGVkIChsaW5lbm8pKSB7CiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLCAidGVzdCBvbiBsaW5lICVkIGRpc2FibGVkIiwgbGluZW5vKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFmbWF0KSB7CiAgICAgICAgLy8gaWYgZm1hdCBpc24ndCBzZXQsIHVzZSB0aGUgZGVmYXVsdCBwYXR0ZXJuCiAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bW9uZXlfYmFzZTo6cGF0dGVybiBwYXQgPSB7IHsKICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwKICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpub25lLCAgIHN0ZDo6bW9uZXlfYmFzZTo6dmFsdWUKICAgICAgICB9IH07CgogICAgICAgIGZtYXQgPSBwYXQuZmllbGQ7CiAgICB9CiAgICBlbHNlCiAgICAgICAgZm1hdCA9IHNldF9wYXR0ZXJuIChmbWF0KS5maWVsZDsKCiAgICAvLyBsb2NhbCBmb3JtYXQ/ICh0aGUgb3Bwb3NpdGUgb2YgaW50ZXJhbnRpb25hbCkKICAgIGNvbnN0IGJvb2wgbG9jbCA9ICFpbnRsOwoKICAgIC8vIHRha2UgY2FyZSB0byBpbml0aWFsaXplIFB1bmN0IHN0YXRpYyBkYXRhIGJlZm9yZSBpbnN0YWxsaW5nCiAgICAvLyB0aGUgZmFjZXQgaW4gY2FzZSBsb2NhbGUgb3IgdGhlIGJhc2UgZmFjZXQgY2FsbHMgdGhlIG92ZXJyaWRkZW4KICAgIC8vIHZpcnR1YWxzIGVhcmx5IHRvIGNhY2hlIHRoZSByZXN1bHRzCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtpbnRsXVsxXS5maWVsZCBbMF0gPSBmbWF0IFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gW2ludGxdWzFdLmZpZWxkIFsxXSA9IGZtYXQgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Zm9ybWF0XyBbaW50bF1bMV0uZmllbGQgWzJdID0gZm1hdCBbMl07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtpbnRsXVsxXS5maWVsZCBbM10gPSBmbWF0IFszXTsKCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtsb2NsXVsxXS5maWVsZCBbMF0gPSBmbWF0IFszXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gW2xvY2xdWzFdLmZpZWxkIFsxXSA9IGZtYXQgWzJdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Zm9ybWF0XyBbbG9jbF1bMV0uZmllbGQgWzJdID0gZm1hdCBbMV07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtsb2NsXVsxXS5maWVsZCBbM10gPSBmbWF0IFswXTsKCiAgICAvLyB6ZXJvIG91dCBwb3NpdGl2ZSBmb3JtYXQgKG5vdCB1c2VkIGJ5IG1vbmV5X2dldCkKICAgIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gW2ludGxdWzBdID0gc3RkOjptb25leV9iYXNlOjpwYXR0ZXJuICgpOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Zm9ybWF0XyBbbG9jbF1bMF0gPSBzdGQ6Om1vbmV5X2Jhc2U6OnBhdHRlcm4gKCk7CgogICAgLy8gZXhwYW5kICh3aWRlbikgY3VycmVuY3kgc3ltYm9sCiAgICBQdW5jdERhdGE8Y2hhclQ+OjpjdXJyX3N5bWJvbF8gW2ludGxdID0gcndfZXhwYW5kICgoY2hhclQqKTAsIGN1cnN5bSk7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpjdXJyX3N5bWJvbF8gW2xvY2xdID0gMDsKICAgIAogICAgUHVuY3REYXRhPGNoYXJUPjo6Z3JvdXBpbmdfIFtpbnRsXSA9IGdyb3VwaW5nOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Z3JvdXBpbmdfIFtsb2NsXSA9IDA7CgogICAgUHVuY3REYXRhPGNoYXJUPjo6ZnJhY19kaWdpdHNfIFtpbnRsXSA9IGZyYWNfZGlnaXRzOwogICAgUHVuY3REYXRhPGNoYXJUPjo6ZnJhY19kaWdpdHNfIFtsb2NsXSA9IGZyYWNfZGlnaXRzICsgMTsKCiAgICBJb3M8Y2hhclQ+IGlvOwogICAgTW9uZXlHZXQ8Y2hhclQ+IG1nOwoKICAgIC8vIGNyZWF0ZSBkaXN0aW5jdCBwdW5jdHVhdGlvbiBmYWNldHMgZm9yIGVhY2ggaXRlcmF0aW9uIHRvIG1ha2Ugc3VyZQogICAgLy8gYW55IGRhdGEgY2FjaGVkIGluIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGUgZmFjZXQncyBwdWJsaWMKICAgIC8vIG1lbWJlciBmdW5jdGlvbnMgYXJlIGZsdXNoZWQKICAgIGlmIChpbnRsKSB7CiAgICAgICAgY29uc3Qgc3RkOjptb25leXB1bmN0PGNoYXJULCB0cnVlPiAqcGYgPSBuZXcgUHVuY3Q8Y2hhclQsIHRydWU+KDApOwogICAgICAgIGlvLmltYnVlIChzdGQ6OmxvY2FsZSAoaW8uZ2V0bG9jICgpLCBwZikpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3Qgc3RkOjptb25leXB1bmN0PGNoYXJULCBmYWxzZT4gKnBmID0gbmV3IFB1bmN0PGNoYXJULCBmYWxzZT4oMCk7CiAgICAgICAgaW8uaW1idWUgKHN0ZDo6bG9jYWxlIChpby5nZXRsb2MgKCksIHBmKSk7CiAgICB9CgogICAgaW8uZmxhZ3MgKHN0ZDo6aW9zX2Jhc2U6OmZtdGZsYWdzIChmbGFncykpOwoKICAgIC8vIGV4cGFuZCAod2lkZW4pIGlucHV0IHNlcXVlbmNlCiAgICBjb25zdCBjaGFyVCogY29uc3QgbmV4dCA9IHJ3X2V4cGFuZCAoKGNoYXJUKikwLCBzdHIpOwoKICAgIHN0ZDo6aW9zX2Jhc2U6Omlvc3RhdGUgZXJyID0gc3RkOjppb3NfYmFzZTo6Z29vZGJpdDsKCiAgICBjb25zdCBjaGFyVCAqbGFzdDsKCiAgICBpZiAoMCA9PSB3aGljaCkgeyAgIC8vIGV4ZXJjaXNlIGdldCAoLi4uLCBsb25nIGRvdWJsZSkKCiAgICAgICAgbGFzdCA9IG5leHQgKyBzdGQ6OmNoYXJfdHJhaXRzPGNoYXJUPjo6bGVuZ3RoIChuZXh0KTsKCiAgICAgICAgTG9uZ0RvdWJsZSB4ID0gMDsKCiAgICAgICAgbGFzdCA9IG1nLmdldCAobmV4dCwgbGFzdCwgaW50bCwgaW8sIGVyciwgeCk7CgogICAgICAgIGlmICgtMSA9PSBlcnJfZXhwZWN0KQogICAgICAgICAgICBlcnJfZXhwZWN0ID0gZXJyOwoKICAgICAgICBjb25zdCBpbnQgc3VjY2VzcyA9CiAgICAgICAgICAgICEoKC0xICE9IGNvbnN1bWVkICYmIGxhc3QgLSBuZXh0ICE9IGNvbnN1bWVkKSB8fCBlcnIgIT0gZXJyX2V4cGVjdCk7CgogICAgICAgIHJ3X2Fzc2VydCAoc3VjY2VzcywgX19GSUxFX18sIGxpbmVubywKICAgICAgICAgICAgICAgICAgICJtb25leV9nZXQ8JXM+OjpnZXQgKCV7KkFjfSwgLi4uLCAlYiwgLi4uLCAlcyYpLCAiCiAgICAgICAgICAgICAgICAgICAiYXRlICVkLCBleHBlY3RlZCAlZCwgZnJhY19kaWdpdHMgPSAlZCwgIgogICAgICAgICAgICAgICAgICAgImZsYWdzID0gJXtJZn0sIGdyb3VwaW5nID0gJSNzLCBwYXR0ZXJuID0gJXtMTX0sICIKICAgICAgICAgICAgICAgICAgICJzdGF0ZSA9ICV7SXN9LCBleHBlY3RlZCAle0lzfSIsCiAgICAgICAgICAgICAgICAgICBjbmFtZSwgaW50IChzaXplb2YgKm5leHQpLCBuZXh0LCBpbnRsLCB0bmFtZSwKICAgICAgICAgICAgICAgICAgIGxhc3QgLSBuZXh0LCBjb25zdW1lZCwgZnJhY19kaWdpdHMsCiAgICAgICAgICAgICAgICAgICBmbGFncywgZ3JvdXBpbmcsIGZtYXQsCiAgICAgICAgICAgICAgICAgICBlcnIsIGVycl9leHBlY3QpOwoKICAgICAgICByd19hc3NlcnQgKDIgPiByd19sZGJsY21wICh4LCB2YWwpLCBfX0ZJTEVfXywgbGluZW5vLAogICAgICAgICAgICAgICAgICAgIm1vbmV5X2dldDwlcz46OmdldCAoJXsqQWN9LCAuLi4sICViLCAuLi4sICVzJiksICIKICAgICAgICAgICAgICAgICAgICJnb3QgJUxnLCBleHBlY3RlZCAlTGcsIGZyYWNfZGlnaXRzID0gJWQsICIKICAgICAgICAgICAgICAgICAgICJmbGFncyA9ICV7SWZ9cywgZ3JvdXBpbmcgPSAlI3MsIHBhdHRlcm4gPSAle0xNfSwgIgogICAgICAgICAgICAgICAgICAgInN0YXRlID0gJXtJc30sIGV4cGVjdGVkICV7SXN9IiwKICAgICAgICAgICAgICAgICAgIGNuYW1lLCBpbnQgKHNpemVvZiAqbmV4dCksIG5leHQsIGludGwsIHRuYW1lLAogICAgICAgICAgICAgICAgICAgeCwgdmFsLCBmcmFjX2RpZ2l0cywKICAgICAgICAgICAgICAgICAgIGZsYWdzLCBncm91cGluZywgZm1hdCwKICAgICAgICAgICAgICAgICAgIGVyciwgZXJyX2V4cGVjdCk7CiAgICB9CiAgICBlbHNlIHsgICAvLyBleGVyY2lzZSBnZXQgKC4uLiwgc3RyaW5nX3R5cGUpCgogICAgICAgIHN0YXRpYyBjb25zdCBjaGFyVCBpbml0aWFsW10gPSB7ICcqJywgJyonLCAnKicsICdcMCcgfTsKICAgICAgICB0eXBlbmFtZSBzdGQ6Om1vbmV5X2dldDxjaGFyVCwgY29uc3QgY2hhclQqPjo6c3RyaW5nX3R5cGUgYnMgKGluaXRpYWwpOwoKICAgICAgICBsYXN0ID0gbmV4dCArIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhclQ+OjpsZW5ndGggKG5leHQpOwoKICAgICAgICBsYXN0ID0gbWcuZ2V0IChuZXh0LCBsYXN0LCBpbnRsLCBpbywgZXJyLCBicyk7CgogICAgICAgIGludCBzdWNjZXNzID0KICAgICAgICAgICAgISgoLTEgIT0gY29uc3VtZWQgJiYgbGFzdCAtIG5leHQgIT0gY29uc3VtZWQpIHx8IGVyciAhPSBlcnJfZXhwZWN0KTsKCiAgICAgICAgcndfYXNzZXJ0IChzdWNjZXNzLCBfX0ZJTEVfXywgbGluZW5vLAogICAgICAgICAgICAgICAgICAgIm1vbmV5X2dldDwlcz46OmdldCAoJXsqQWN9LCAuLi4sICViLCAuLi4sICIKICAgICAgICAgICAgICAgICAgICJiYXNpY19zdHJpbmc8JXM+JiksIGF0ZSAlZCwgZXhwZWN0ZWQgJWQsICIKICAgICAgICAgICAgICAgICAgICJmcmFjX2RpZ2l0cyA9ICVkLCBmbGFncyA9ICV7SWZ9LCBncm91cGluZyA9ICUjcyIKICAgICAgICAgICAgICAgICAgICIsIGZvcm1hdCA9ICV7TE19LCBzdGF0ZSA9ICV7SXN9LCBleHBlY3RlZCAle0lzfSIsCiAgICAgICAgICAgICAgICAgICBjbmFtZSwgaW50IChzaXplb2YgKm5leHQpLCBuZXh0LCBpbnRsLAogICAgICAgICAgICAgICAgICAgY25hbWUsIGxhc3QgLSBuZXh0LCBjb25zdW1lZCwKICAgICAgICAgICAgICAgICAgIGZyYWNfZGlnaXRzLCBmbGFncywgZ3JvdXBpbmcsCiAgICAgICAgICAgICAgICAgICBmbWF0LCBlcnIsIGVycl9leHBlY3QpOwoKICAgICAgICBpZiAoc3VjY2VzcykgewoKICAgICAgICAgICAgY2hhciBuYXJyb3dfYnVmIFs0MDk2XTsKICAgICAgICAgICAgcndfbmFycm93IChuYXJyb3dfYnVmLCBicy5jX3N0ciAoKSk7CgogICAgICAgICAgICBMb25nRG91YmxlIHggPSAwOwoKICAgICAgICAgICAgLy8gcHJldmVudCBnY2Mgd2FybmluZzogQU5TSSBDIGRvZXMgbm90IHN1cHBvcnQKICAgICAgICAgICAgLy8gdGhlIGBMJyBsZW5ndGggbW9kaWZpZXIKICAgICAgICAgICAgY29uc3QgY2hhciBmbXRbXSA9ICIlIiBfUldTVERfTERCTF9QUklOVEZfUFJFRklYICJnIjsKICAgICAgICAgICAgaW50IG4gPSBzdGQ6OnNzY2FuZiAobmFycm93X2J1ZiwgZm10LCAmeCk7CgogICAgICAgICAgICBzdWNjZXNzID0gCiAgICAgICAgICAgICAgICAhKCAgICggICBlcnJfZXhwZWN0ICYgc3RkOjppb3M6OmZhaWxiaXQgJiYgISpncm91cGluZwogICAgICAgICAgICAgICAgICAgICAgJiYgKDEgPT0gbiB8fCBicyAhPSBpbml0aWFsKSkKICAgICAgICAgICAgICAgICAgfHwgKCAgICEoZXJyX2V4cGVjdCAmIHN0ZDo6aW9zOjpmYWlsYml0KQogICAgICAgICAgICAgICAgICAgICAgJiYgMSA8IHJ3X2xkYmxjbXAgKHgsIHZhbCkpKTsKCiAgICAgICAgICAgIHJ3X2Fzc2VydCAoc3VjY2VzcywgX19GSUxFX18sIGxpbmVubywKICAgICAgICAgICAgICAgICAgICAgICAibW9uZXlfZ2V0PCVzPjo6Z2V0ICgleypBY30sIC4uLiwgJWIsIC4uLiwgIgogICAgICAgICAgICAgICAgICAgICAgICJiYXNpY19zdHJpbmc8JXM+JiksIGdvdCAlcywgZXhwZWN0ZWQgJUxnLCAiCiAgICAgICAgICAgICAgICAgICAgICAgImZyYWNfZGlnaXRzID0gJWQsIGZsYWdzID0gJXtJZn0sIGdyb3VwaW5nID0gJSNzLCIKICAgICAgICAgICAgICAgICAgICAgICAiIHBhdHRlcm4gPSAle0xNfSwgaW9zdGF0ZSA9ICV7SXN9LCBleHBlY3RlZCAle0lzfSIsCiAgICAgICAgICAgICAgICAgICAgICAgY25hbWUsIGludCAoc2l6ZW9mICpuZXh0KSwgbmV4dCwgaW50bCwKICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSwgYnMuY19zdHIgKCksIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICBmcmFjX2RpZ2l0cywgZmxhZ3MsIGdyb3VwaW5nLAogICAgICAgICAgICAgICAgICAgICAgIGZtYXQsIGVyciwgZXJyX2V4cGVjdCk7CiAgICAgICAgfQogICAgfQoKICAgIGRlbGV0ZVtdIFB1bmN0RGF0YTxjaGFyVD46OmN1cnJfc3ltYm9sXyBbaW50bF07CiAgICBkZWxldGVbXSBuZXh0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLyBmb3IgY29udmVuaWVuY2UKI2RlZmluZSBib29sYWxwaGEgICBzdGQ6Omlvc19iYXNlOjpib29sYWxwaGEKI2RlZmluZSBkZWMgICAgICAgICBzdGQ6Omlvc19iYXNlOjpkZWMKI2RlZmluZSBmaXhlZCAgICAgICBzdGQ6Omlvc19iYXNlOjpmaXhlZAojZGVmaW5lIGhleCAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OmhleAojZGVmaW5lIGludGVybmFsICAgIHN0ZDo6aW9zX2Jhc2U6OmludGVybmFsCiNkZWZpbmUgbGVmdCAgICAgICAgc3RkOjppb3NfYmFzZTo6bGVmdAojZGVmaW5lIG9jdCAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9jdAojZGVmaW5lIHJpZ2h0ICAgICAgIHN0ZDo6aW9zX2Jhc2U6OnJpZ2h0CiNkZWZpbmUgc2NpZW50aWZpYyAgc3RkOjppb3NfYmFzZTo6c2NpZW50aWZpYwojZGVmaW5lIHNob3diYXNlICAgIHN0ZDo6aW9zX2Jhc2U6OnNob3diYXNlCiNkZWZpbmUgc2hvd3BvaW50ICAgc3RkOjppb3NfYmFzZTo6c2hvd3BvaW50CiNkZWZpbmUgc2hvd3BvcyAgICAgc3RkOjppb3NfYmFzZTo6c2hvd3BvcwojZGVmaW5lIHNraXB3cyAgICAgIHN0ZDo6aW9zX2Jhc2U6OnNraXB3cwojZGVmaW5lIHVuaXRidWYgICAgIHN0ZDo6aW9zX2Jhc2U6OnVuaXRidWYKI2RlZmluZSB1cHBlcmNhc2UgICBzdGQ6Omlvc19iYXNlOjp1cHBlcmNhc2UKI2RlZmluZSBiaW4gICAgICAgICBzdGQ6Omlvc19iYXNlOjpiaW4KI2RlZmluZSBhZGp1c3RmaWVsZCBzdGQ6Omlvc19iYXNlOjphZGp1c3RmaWVsZAojZGVmaW5lIGJhc2VmaWVsZCAgIHN0ZDo6aW9zX2Jhc2U6OmJhc2VmaWVsZAojZGVmaW5lIGZsb2F0ZmllbGQgIHN0ZDo6aW9zX2Jhc2U6OmZsb2F0ZmllbGQKI2RlZmluZSBub2xvY2sgICAgICBzdGQ6Omlvc19iYXNlOjpub2xvY2sKI2RlZmluZSBub2xvY2tidWYgICBzdGQ6Omlvc19iYXNlOjpub2xvY2tidWYKCiNkZWZpbmUgYmFkYml0ICAgICAgc3RkOjppb3NfYmFzZTo6YmFkYml0CiNkZWZpbmUgZW9mYml0ICAgICAgc3RkOjppb3NfYmFzZTo6ZW9mYml0CiNkZWZpbmUgZmFpbGJpdCAgICAgc3RkOjppb3NfYmFzZTo6ZmFpbGJpdAojZGVmaW5lIGdvb2RiaXQgICAgIHN0ZDo6aW9zX2Jhc2U6Omdvb2RiaXQKCgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CnZvaWQgdGVzdF9nZXQgKGNoYXJUIG9wdCwgY29uc3QgY2hhciAqY25hbWUsIGNvbnN0IGNoYXIgKnRuYW1lLCBib29sIGludGwpCnsKI2RlZmluZSBUICAgICAgaW50bCwgb3B0LCBjbmFtZSwgdG5hbWUsIF9fTElORV9fCiNkZWZpbmUgVEVTVCAgIGRvX3Rlc3QKCiAgICBjb25zdCBib29sIGxvY2wgPSAhaW50bDsKCiAgICByd19pbmZvICgwLCAwLCAwLAogICAgICAgICAgICAgIm1vbmV5X2dldDwlcywgaXN0cmVhbWJ1Zl9pdGVyYXRvcjwlcz4gPjo6Z2V0ICIKICAgICAgICAgICAgICIoLi4uLCAlcyYpIGNvbnN0IiwgY25hbWUsIGNuYW1lLCB0bmFtZSk7CgogICAgLy8gMjIuMi42LjMsIHAzOgogICAgLy8gVGhlIGZvcm1hdCBvZiB0aGUgbnVtZXJpYyBtb25ldGFyeSB2YWx1ZSBpcyBhIGRlY2ltYWwgbnVtYmVyOgogICAgLy8gICAgIHZhbHVlIDo6PSB1bml0cyBbIGRlY2ltYWxwb2ludCBbIGRpZ2l0cyBdXSB8IGRlY2ltYWxwb2ludCBkaWdpdHMKICAgIC8vIElmIGZyYWNfZGlnaXRzKCkgcmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlLCBvcgogICAgLy8gICAgIHZhbHVlIDo6PSB1bml0cwogICAgLy8gb3RoZXJ3aXNlLiBUaGUgc3ltYm9sIGRlY2ltYWxwb2ludCBpbmRpY2F0ZXMgdGhlIGNoYXJhY3RlciByZXR1cm5lZAogICAgLy8gYnkgZGVjaW1hbF9wb2ludCgpLiBUaGUgb3RoZXIgc3ltYm9scyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgogICAgLy8gICAgIHVuaXRzIDo6PSBkaWdpdHMgWyB0aG91c2FuZHNzZXAgdW5pdHMgXSBkaWdpdHMgOjo9IGFkaWdpdCBbIGRpZ2l0cyBdCgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnRob3VzYW5kc19zZXBfIFtpbnRsXSA9ICdcMCc7CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojp0aG91c2FuZHNfc2VwXyBbbG9jbF0gPSAnXDAnOwoKICAgIC8vIHBhcnNpbmcgemVybywgbm8gY3Vycl9zeW1ib2wgb3Igc2lnbiwgZGVmYXVsdCBwYXR0ZXJuLCAwIGZyYWNfZGlnaXRzCiAgICBURVNUIChULCAwLjAsICIwIiwgICAxLCAwLCBlb2ZiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiMCAiLCAgMSwgMCwgZ29vZGJpdCk7CiAgICBURVNUIChULCAwLjAsICIwMCIsICAyLCAwLCBlb2ZiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiMDAwIiwgMywgMCwgZW9mYml0KTsKCiAgICAvLyBvcHRpb25hbCB3aGl0ZXNwYWNlIGlzIGNvbnN1bWVkIHdoZXJlIG5vbmUgb3Igc3BhY2UgYXBwZWFycwogICAgVEVTVCAoVCwgMC4wLCAiIDAiLCAgIDIsIDAsIGVvZmJpdCk7CiAgICBURVNUIChULCAwLjAsICIgIDAgIiwgMywgMCwgZ29vZGJpdCk7CgogICAgLy8gdmVyaWZ5IHRoYXQgZGVjaW1hbCBwb2ludCBpc24ndCBleHRyYWN0ZWQgKGZyYWNfZGlnaXRzID09IDApCiAgICBURVNUIChULCAwLjAsICIwLiIsICAgIDEsIDAsIGdvb2RiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiMC4wIiwgICAxLCAwLCBnb29kYml0KTsKICAgIFRFU1QgKFQsIDAuMCwgIjAuMDAiLCAgMSwgMCwgZ29vZGJpdCk7CiAgICBURVNUIChULCAwLjAsICIwMC4wIiwgIDIsIDAsIGdvb2RiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiMDAwLjAiLCAzLCAwLCBnb29kYml0KTsKCiAgICAvLyBwYXJzaW5nIHplcm8sIG5vbi16ZXJvIGZyYWNfZGlnaXRzCiAgICBURVNUIChULCAwLjAsICIwLiIsICAgIDIsIDAsIGVvZmJpdCwgIDEpOwogICAgVEVTVCAoVCwgMC4wLCAiMC4gIiwgICAyLCAwLCBnb29kYml0LCAyKTsKICAgIFRFU1QgKFQsIDAuMCwgIi4wIiwgICAgMiwgMCwgZW9mYml0LCAgMyk7CiAgICBURVNUIChULCAwLjAsICIwLjAiLCAgIDMsIDAsIGVvZmJpdCwgIDQpOwogICAgVEVTVCAoVCwgMC4wLCAiMC4wMCIsICA0LCAwLCBlb2ZiaXQsICA1KTsKICAgIFRFU1QgKFQsIDAuMCwgIjAwLjAiLCAgNCwgMCwgZW9mYml0LCAgNik7CiAgICBURVNUIChULCAwLjAsICIwMC4wMCIsIDUsIDAsIGVvZmJpdCwgIDcpOwoKICAgIC8vIHBhcnNpbmcgemVybywgYmFkIGZvcm1hdAogICAgVEVTVCAoVCwgMC4wLCAiJDAiLCAgIDAsIDAsIGZhaWxiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiKzAiLCAgIDAsIDAsIGZhaWxiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiLTAiLCAgIDAsIDAsIGZhaWxiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiLjAiLCAgIDAsIDAsIGZhaWxiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiLjEiLCAgIDAsIDAsIGZhaWxiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiLiIsICAgIDAsIDAsIGZhaWxiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiIiwgICAgIDAsIDAsIGVvZmJpdCB8IGZhaWxiaXQpOwoKICAgIC8vIHBhcnNpbmcgbm9uLXplcm8sIG5vIGN1cnJfc3ltYm9sIG9yIHNpZ24sIGRlZmF1bHQgcGF0dGVybiwgMCBmcmFjX2RpZ2l0cwogICAgVEVTVCAoVCwgICAxLjAsICIxIiwgICAgMSwgMCwgZW9mYml0KTsKICAgIFRFU1QgKFQsICAgMi4wLCAiMiIsICAgIDEsIDAsIGVvZmJpdCk7CiAgICBURVNUIChULCAgIDMuMCwgIjMiLCAgICAxLCAwLCBlb2ZiaXQpOwogICAgVEVTVCAoVCwgICA0LjAsICI0IiwgICAgMSwgMCwgZW9mYml0KTsKICAgIFRFU1QgKFQsICAgNS4wLCAiNS4xIiwgIDEsIDAsIGdvb2RiaXQpOwogICAgVEVTVCAoVCwgICA2LjAsICI2LjIzIiwgMSwgMCwgZ29vZGJpdCk7CiAgICBURVNUIChULCAgNzMuMCwgIjczLjQiLCAyLCAwLCBnb29kYml0KTsKICAgIFRFU1QgKFQsIDg0NS4wLCAiODQ1LiIsIDMsIDAsIGdvb2RiaXQpOwoKICAgIC8vIHBhcnNpbmcgbm9uLXplcm8sIGZyYWNfZGlnaXRzID09IDEKICAgIFRFU1QgKFQsIDEwMC4wLCAiMTAiLCAgIDIsIDAsIGVvZmJpdCwgMSk7CiAgICBURVNUIChULCAgOTAuMCwgIjkiLCAgICAxLCAwLCBlb2ZiaXQsIDEpOwogICAgVEVTVCAoVCwgIDgwLjAsICI4LiIsICAgMiwgMCwgZW9mYml0LCAxKTsKICAgIFRFU1QgKFQsICAgNy4wLCAiMC43IiwgIDMsIDAsIGVvZmJpdCwgMSk7CiAgICBURVNUIChULCAgIDYuMCwgIi42IiwgICAyLCAwLCBlb2ZiaXQsIDEpOwogICAgVEVTVCAoVCwgICAwLjAsICIuMDUiLCAgMywgMCwgZW9mYml0LCAxKTsKCiAgICAvLyBwYXJzaW5nIG5vbi16ZXJvLCBmcmFjX2RpZ2l0cyA+IDEKICAgIFRFU1QgKFQsICAgICAgICAgNC4wLCAiLjA0IiwgICAgICAgMywgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgICAgICAzMi4wLCAiLjMyIiwgICAgICAgMywgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgICAgIDIxMC4wLCAiMi4xMCIsICAgICAgNCwgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgICAgMTA5OC4wLCAiMTAuOTgiLCAgICAgNSwgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgICAgIDk4Ny4wLCAiMDkuODc2IiwgICAgNiwgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgICAgOTg3Ni4wLCAiOTguNzY1IiwgICAgNiwgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgICA4NzY1NC4wLCAiODc2LjU0MzIiLCAgOCwgMCwgZW9mYml0LCAyKTsKICAgIFRFU1QgKFQsICAgIDc2NTQzMi4wLCAiNzY1LjQzMjEiLCAgOCwgMCwgZW9mYml0LCAzKTsKICAgIFRFU1QgKFQsICAgNjU0MzIxMC4wLCAiNjU0LjMyMTA5IiwgOSwgMCwgZW9mYml0LCA0KTsKICAgIFRFU1QgKFQsICA1NDMyMTA5OC4wLCAiNTQzMi4xMDk4IiwgOSwgMCwgZW9mYml0LCA0KTsKICAgIFRFU1QgKFQsIDQzMjEwOTg3MC4wLCAiNDMyMTAuOTg3IiwgOSwgMCwgZW9mYml0LCA0KTsKCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojp0aG91c2FuZHNfc2VwXyBbaW50bF0gPSAnLCc7CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojp0aG91c2FuZHNfc2VwXyBbbG9jbF0gPSAnOyc7CgogICAgLy8gcGFyc2luZyB3aXRoIHRob3VzYW5kc19zZXAgYW5kL29yIGdyb3VwaW5nCiAgICBURVNUIChULCAgICAgIDAuMCwgIjAiLCAgICAgICAgMSwgMCwgZW9mYml0LCAgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgICAgICAwLjAsICIwLDAiLCAgICAgIDMsIDAsIGVvZmJpdCwgIDAsIDAsICIiLCAiXDEiKTsKICAgIFRFU1QgKFQsICAgICAgMC4wLCAiMCwiLCAgICAgICAxLCAwLCBnb29kYml0LCAwLCAwLCAiIiwgIlwwIik7CiAgICBURVNUIChULCAgICAgIDAuMCwgIjAsMCwwIiwgICAgNSwgMCwgZW9mYml0LCAgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgICAgICAxLjAsICIwLDAsMSIsICAgIDUsIDAsIGVvZmJpdCwgIDAsIDAsICIiLCAiXDEiKTsKICAgIFRFU1QgKFQsICAgICAgMi4wLCAiMCwwLDIuIiwgICA1LCAwLCBnb29kYml0LCAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgICAgMzAuMCwgIjAsMCwzLiIsICAgNiwgMCwgZW9mYml0LCAgMSwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgICAgICA0LjAsICIwLDAuNCIsICAgIDUsIDAsIGVvZmJpdCwgIDEsIDAsICIiLCAiXDEiKTsKICAgIFRFU1QgKFQsICAgNTY3MC4wLCAiNSw2Ny4wIiwgICA2LCAwLCBlb2ZiaXQsICAxLCAwLCAiIiwgIlwyIik7CiAgICBURVNUIChULCAgIDY3ODkuMCwgIjY3OC45IiwgICAgNSwgMCwgZW9mYml0LCAgMSwgMCwgIiIsICJcMyIpOwogICAgVEVTVCAoVCwgNzg5MDEyLjAsICI3LDg5MC4xMiIsIDgsIDAsIGVvZmJpdCwgIDIsIDAsICIiLCAiXDMiKTsKCiAgICAvLyAyMi4yLjYuMS4yLCBwMTogdGhvdXNhbmRzX3NlcC1hcmF0b3JzIGFyZSBvcHRpb25hbAogICAgVEVTVCAoVCwgODkwMTIzLjAsICI4OTAuMTIzIiwgNywgMCwgZW9mYml0LCAzLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCA5MDEyMzQuMCwgIjkwMS4yMzQiLCA3LCAwLCBlb2ZiaXQsIDMsIDAsICIiLCAiXDIiKTsKICAgIFRFU1QgKFQsIDEyMzQ1MC4wLCAiMDEyMy40NSIsIDcsIDAsIGVvZmJpdCwgMywgMCwgIiIsICJcMyIpOwoKICAgIC8vIGludmFsaWQgdXNlIG9mIHRob3VzYW5kc19zZXAgd2l0aCBlbXB0eSBncm91cGluZwogICAgLy8gdGhlIGZpcnN0IHRob3VzYW5kc19zZXAgdGVybWluYXRlcyBwYXJzaW5nIGluIGdyb3VwaW5nIGlzIGVtcHR5CiAgICBURVNUIChULCAgMC4wLCAiLCIsICAgICAwLCAwLCBmYWlsYml0LCAgICAgICAgICAwLCAwLCAiIiwgIlwwIik7CiAgICBURVNUIChULCAgMC4wLCAiLDAiLCAgICAwLCAwLCBmYWlsYml0LCAgICAgICAgICAwLCAwLCAiIiwgIlwwIik7CgogICAgLy8gaW52YWxpZCBncm91cGluZwogICAgVEVTVCAoVCwgIDEuMCwgIiwxIiwgICAgMiwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgIDIuMCwgIjIsIiwgICAgMiwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgIDMuMCwgIiwzLCIsICAgMywgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgIDQuMCwgIiwsNCIsICAgMywgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgIDUuMCwgIjUsLCIsICAgMywgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgIDYuMCwgIiw2LCwiLCAgNCwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMiIpOwogICAgVEVTVCAoVCwgIDcuMCwgIiwsNywiLCAgNCwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMiIpOwogICAgVEVTVCAoVCwgIDguMCwgIjAsLDgiLCAgNCwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMiIpOwogICAgVEVTVCAoVCwgIDkuMCwgIjAsMCw5IiwgNSwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMiIpOwogICAgVEVTVCAoVCwgMTAuMCwgIjAsMTAsIiwgNSwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiIsICJcMiIpOwoKCiAgICAvLyBkZWZhdWx0IHBhdHRlcm46IHsgc3ltYm9sIHNpZ24gbm9uZSB2YWx1ZSB9LCBlLmcuLCAiJC0xIgoKICAgIC8vIHBhcnNpbmcgd2l0aCBhIHJlcXVpcmVkIGN1cnJfc3ltYm9sLCBubyBzaWduLCBhbmQgZGVmYXVsdCBwYXR0ZXJuCiAgICBURVNUIChULCAgIDAuMCwgIiQwIiwgICAgICAyLCBzaG93YmFzZSwgZW9mYml0LCAgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsICAgMS4wLCAiJDEiLCAgICAgIDIsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgICAyLjAsICIkIDIiLCAgICAgMywgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICIkIik7CiAgICBURVNUIChULCAgIDMuMCwgIiQgIDMiLCAgICA0LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsIDQ1Ni4wLCAiJDQ1NiIsICAgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgIDU2LjAsICIkNTYkIiwgICAgMywgc2hvd2Jhc2UsIGdvb2RiaXQsIDAsIDAsICIkIik7CiAgICBURVNUIChULCAgIDYuMCwgIiQ2JDciLCAgICAyLCBzaG93YmFzZSwgZ29vZGJpdCwgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsICAgNy4wLCAiTDciLCAgICAgIDIsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAwLCAiTCIpOwogICAgVEVTVCAoVCwgICA4LjAsICJETSAgOCIsICAgNSwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICJETSIpOwogICAgVEVTVCAoVCwgICA5LjAsICJVU0Q5IiwgICAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICJVU0QiKTsKICAgIFRFU1QgKFQsICAxMC4wLCAiWUVOIDEwIiwgIDYsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAwLCAiWUVOIik7CiAgICBURVNUIChULCAgMTEuMCwgIiRDQU4xMSQiLCA2LCBzaG93YmFzZSwgZ29vZGJpdCwgMCwgMCwgIiRDQU4iKTsKICAgIFRFU1QgKFQsIDEyMS4wLCAia3IxMi4xIiwgIDYsIHNob3diYXNlLCBlb2ZiaXQsICAxLCAwLCAia3IiKTsKICAgIFRFU1QgKFQsIDEzMi4wLCAiRlQxMy4yMSIsIDcsIHNob3diYXNlLCBlb2ZiaXQsICAxLCAwLCAiRlQiKTsKCiAgICAvLyBpbnZhbGlkIGlucHV0IHdpdGggYSByZXF1aXJlZCAoc2hvd2Jhc2Ugc2V0KSBjdXJyX3N5bWJvbAogICAgVEVTVCAoVCwgMC4wLCAiRkxVIiwgICAgMywgc2hvd2Jhc2UsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICJGTFVYIik7CiAgICBURVNUIChULCAwLjAsICJGci4gKzEiLCA0LCBzaG93YmFzZSwgZmFpbGJpdCwgMCwgMCwgIkZyLiIpOwogICAgVEVTVCAoVCwgMC4wLCAiUHRzMSIsICAgMywgc2hvd2Jhc2UsIGZhaWxiaXQsIDAsIDAsICJQdHMuIik7CiAgICBURVNUIChULCAwLjAsICIgS24xIiwgICAwLCBzaG93YmFzZSwgZmFpbGJpdCwgMCwgMCwgIktuIik7CiAgICBURVNUIChULCAwLjAsICJMLjEiLCAgICAyLCBzaG93YmFzZSwgZmFpbGJpdCwgMCwgMCwgIkwuICIpOwogICAgVEVTVCAoVCwgMC4wLCAiMSIsICAgICAgMCwgc2hvd2Jhc2UsIGZhaWxiaXQsIDAsIDAsICJUTCIpOwoKICAgIC8vIHBhcnNpbmcgd2l0aCBhbiBvcHRpb25hbCAoc2hvd2Jhc2UgY2xlYXIpIGN1cnJfc3ltYm9sCiAgICBURVNUIChULCAxMi4wLCAiMTIiLCAgICAgMiwgMCwgZW9mYml0LCAwLCAwLCAibWsiKTsKICAgIFRFU1QgKFQsIDEzLjAsICJkaW4xMyIsICA1LCAwLCBlb2ZiaXQsIDAsIDAsICJkaW4iKTsKICAgIFRFU1QgKFQsIDE0LjAsICJFc2MgMTQiLCA2LCAwLCBlb2ZiaXQsIDAsIDAsICJFc2MiKTsKCiAgICAvLyBwYXJzaW5nIHdpdGggYSBzaW1wbGUgbm9uLWVtcHR5IHNpZ24KCiAgICBzdGF0aWMgY29uc3QgY2hhclQgcGx1c1tdWzJdICA9IHsgeyAnKycsICdcMCcgfSwgeyAnXDAnIH0gfTsKICAgIHN0YXRpYyBjb25zdCBjaGFyVCBtaW51c1tdWzJdID0geyB7ICctJywgJ1wwJyB9LCB7ICdcMCcgfSB9OwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IHBsdXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gbWludXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2xvY2xdID0gcGx1cyBbMV07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSBtaW51cyBbMV07CgogICAgVEVTVCAoVCwgIDE1LjAsICIrMTUiLCAgICAgMywgMCwgZW9mYml0LCAgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDE2LjAsICIrIDE2IiwgICAgNCwgMCwgZW9mYml0LCAgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDE3LjAsICIrICAxNy4wIiwgNSwgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDE4LjAsICIrICAxOCsiLCAgNSwgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDE5LjAsICIxOSsiLCAgICAgMiwgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwoKICAgIFRFU1QgKFQsIC0yMC4wLCAiLTIwIiwgICAgIDMsIDAsIGVvZmJpdCwgIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIC0yMS4wLCAiLSAyMSIsICAgIDQsIDAsIGVvZmJpdCwgIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIC0yMi4wLCAiLSAgMjIuMSIsIDUsIDAsIGdvb2RiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIC0yMy4wLCAiLSAyMy0iLCAgIDQsIDAsIGdvb2RiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsICAyNC4wLCAiMjQrIiwgICAgIDIsIDAsIGdvb2RiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIC0yNS4wLCAiLTI1KyIsICAgIDMsIDAsIGdvb2RiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsICAyNi4wLCAiKzI2LSIsICAgIDMsIDAsIGdvb2RiaXQsIDAsIDAsICIiKTsKCiAgICAvLyBpbnZhbGlkIGlucHV0CiAgICBURVNUIChULCAwLjAsICIrKzEuMjMiLCAgICAxLCAwLCBmYWlsYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAwLjAsICItLTIuMzQiLCAgICAxLCAwLCBmYWlsYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAwLjAsICIrLTMuNDUiLCAgICAxLCAwLCBmYWlsYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAwLjAsICItKzQuNTYiLCAgICAxLCAwLCBmYWlsYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAwLjAsICItICs1LjY3IiwgICAyLCAwLCBmYWlsYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAwLjAsICIrIiwgICAgICAgICAxLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAwLjAsICItIiwgICAgICAgICAxLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIik7CgogICAgLy8gcGFyc2luZyB3aXRoIGEgbXVsdGktY2hhciBub24tZW1wdHkgc2lnbgoKICAgIHN0YXRpYyBjb25zdCBjaGFyVCBwbHVzX3BsdXNbXVszXSAgID0geyB7ICcrJywgJysnLCAnXDAnIH0sIHsgJ1wwJyB9IH07CiAgICBzdGF0aWMgY29uc3QgY2hhclQgbWludXNfbWludXNbXVszXSA9IHsgeyAnLScsICctJywgJ1wwJyB9LCB7ICdcMCcgfSB9OwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IHBsdXNfcGx1cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSBtaW51c19taW51cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSBwbHVzX3BsdXMgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gbWludXNfbWludXMgWzFdOwoKICAgIFRFU1QgKFQsICAyNy4wLCAiKzI3KyIsICAgIDQsIDAsIGVvZmJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDI4LjAsICIrICAyOCsiLCAgNiwgMCwgZW9mYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAtMjkuMCwgIi0yLjk5LSIsICA2LCAwLCBlb2ZiaXQsIDEsIDAsICIiKTsKICAgIFRFU1QgKFQsIC0zMC4wLCAiLSAzLjA5LSIsIDcsIDAsIGVvZmJpdCwgMSwgMCwgIiIpOwoKICAgIC8vIHdpdGggYSBzaW1wbGUgY3VycmVuY3kgc3ltYm9sCiAgICBURVNUIChULCAgMzEuMCwgIiQrMzErIiwgICAgNSwgMCwgZW9mYml0LCAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgIDMyLjAsICIkKyAgMzIrIiwgIDcsIDAsIGVvZmJpdCwgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsIC0zMy4wLCAiJC0zLjMwLSIsICA3LCAwLCBlb2ZiaXQsIDEsIDAsICIkIik7CiAgICBURVNUIChULCAtMzQuMCwgIiQtIDMuNDEtIiwgOCwgMCwgZW9mYml0LCAxLCAwLCAiJCIpOwoKICAgIC8vIHdpdGggYSBtdWx0aS1jaGFyIGN1cnJlbmN5IHN5bWJvbAogICAgVEVTVCAoVCwgIDM1LjAsICJVU0QrMzUrIiwgICAgIDcsIDAsIGVvZmJpdCwgMCwgMCwgIlVTRCIpOwogICAgVEVTVCAoVCwgIDM2LjAsICJVU0QrICAzNisiLCAgIDksIDAsIGVvZmJpdCwgMCwgMCwgIlVTRCIpOwogICAgVEVTVCAoVCwgLTM3LjAsICJVU0QtMy43MC0iLCAgIDksIDAsIGVvZmJpdCwgMSwgMCwgIlVTRCIpOwogICAgVEVTVCAoVCwgLTM4LjAsICJVU0QtIDMuODEtIiwgMTAsIDAsIGVvZmJpdCwgMSwgMCwgIlVTRCIpOwoKICAgIC8vIGludmFsaWQgaW5wdXQKICAgIFRFU1QgKFQsIDAuMCwgIiszMSArIiwgICAgIDMsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIisgIDMyICsiLCAgIDUsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIi0zMy45IC0iLCAgIDMsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIi0gMy40OSAtIiwgIDYsIDAsIGZhaWxiaXQsIDEsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQrMzUgKyIsICAgIDQsIDAsIGZhaWxiaXQsIDAsIDAsICIkIik7CiAgICAvLyB0aGUgc3BhY2UgYmVsb3cgaXMgcmVhZCBzaW5jZSB0aGUgb3B0aW9uYWwgc2lnbiBpcyBjb25zaWRlcmVkIG1pc3NpbmcKICAgIFRFU1QgKFQsIDAuMCwgIiQgKzM2KyIsICAgIDIsIDAsIGZhaWxiaXQsIDAsIDAsICIkIik7CiAgICBURVNUIChULCAwLjAsICIkKyAgMzcgKyIsICA2LCAwLCBmYWlsYml0LCAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgMC4wLCAiJC0zLjgwIC0iLCAgMywgMCwgZmFpbGJpdCwgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQtIDMuOTEgLSIsIDcsIDAsIGZhaWxiaXQsIDEsIDAsICIkIik7CgogICAgc3RhdGljIGNvbnN0IGNoYXJUIHBsdXNfbWludXNbXVszXSA9IHsgeyAnKycsICctJywgJ1wwJyB9LCB7ICdcMCcgfSB9OwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IHBsdXNfcGx1cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSBwbHVzX3BsdXMgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gcGx1c19taW51cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSBwbHVzX21pbnVzIFsxXTsKCiAgICAvLyAyMi4yLjYuMS4yLCBwMzogaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBwb3NpdGl2ZQogICAgLy8gYW5kIG5lZ2F0aXZlIHNpZ24gaXMgdGhlIHNhbWUsIHRoZSByZXN1bHQgaXMgcG9zaXRpdmUKICAgIFRFU1QgKFQsIDQwLjAsICAgIis0MCsiLCA0LCAwLCAgICAgICAgZW9mYml0LCAgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgNDEuMCwgICAiKzQxLSIsIDQsIDAsICAgICAgICBlb2ZiaXQsICAwLCAwLCAiIik7CiAgICBURVNUIChULCA0Mi4wLCAgIis0MisgIiwgNCwgMCwgICAgICAgIGdvb2RiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDQzLjAsICAiKzQzLSAiLCA0LCAwLCAgICAgICAgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgNDQuMCwgIis0NCAkKyIsIDYsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CiAgICBURVNUIChULCA0NS4wLCAiKzQ1ICQtIiwgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsIDQ2LjAsICIrNDYkKyAiLCA1LCBzaG93YmFzZSwgZ29vZGJpdCwgMCwgIi0xJEAiLCAiJCIpOwogICAgVEVTVCAoVCwgNDcuMCwgIis0NyQtICIsIDUsIHNob3diYXNlLCBnb29kYml0LCAwLCAiLTEkQCIsICIkIik7CgogICAgLy8gbm9uZSA9IDAsIHNwYWNlID0gMSwgc3ltYm9sID0gMiwgc2lnbiA9IDMsIHZhbHVlID0gNAoKICAgIC8vIHRlc3QgdmFyaW91cyBwYXR0ZXJucwogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSBwbHVzIFsxXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IG1pbnVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IG1pbnVzIFsxXTsKCiAgICBURVNUIChULCAgLTEwMC4wLCAiJC0xIiwgICAzLCBzaG93YmFzZSwgZW9mYml0LCAgMiwgIiQtMUAiLCAiJCIpOwogICAgVEVTVCAoVCwgIC0yMDAuMCwgIiQtMiAiLCAgMywgc2hvd2Jhc2UsIGdvb2RiaXQsIDIsICIkLTFAIiwgIiQiKTsKICAgIC8vIHdoZXJlIG5vbmUgYXBwZWFycyBpbiB0aGUgcGF0dGVybiwgd2hpdGVzcGFjZSBpcyBvcHRpb25hbAogICAgVEVTVCAoVCwgIC0zMDAuMCwgIi0zJCIsICAgMywgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsICAtNDAwLjAsICItNCAkIiwgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiLTFAJCIsICIkIik7CiAgICAvLyB3aGVyZSBzcGFjZSBhcHBlYXJzIGluIHRoZSBwYXR0ZXJuLCBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHJlcXVpcmVkCiAgICBURVNUIChULCAgICAwLjAsICItNSQiLCAgICAyLCBzaG93YmFzZSwgZmFpbGJpdCwgMiwgIi0xICQiLCAiJCIpOwogICAgVEVTVCAoVCwgIC02MDAuMCwgIi02ICQiLCAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICItMSAkIiwgIiQiKTsKICAgIFRFU1QgKFQsICAtNzAwLjAsICItN1x0JCIsIDQsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiLTEgJCIsICIkIik7CgogICAgVEVTVCAoVCwgICAgIDAuMCwgIi04JCIsICAgMSwgc2hvd2Jhc2UsIGZhaWxiaXQsIDIsICItIDEkIiwgIiQiKTsKICAgIFRFU1QgKFQsICAtOTAwLjAsICItXG45JCIsIDQsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiLSAxJCIsICIkIik7CiAgICBURVNUIChULCAtMTAwMC4wLCAiLSAxMCQiLCA1LCBzaG93YmFzZSwgZW9mYml0LCAgMiwgIi0gMSQiLCAiJCIpOwogICAgLy8gd2hpdGUgc3BhY2UgaXMgcmVxdWlyZWQgZXZlbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGlucHV0CiAgICAvLyAoaWYgdGhlIG9wdGlvbmFsIHNpZ24gb3Igc3ltYm9sIGlzIG1pc3NpbmcpCiAgICBURVNUIChULCAgICAgMC4wLCAiMTEkIiwgICAwLCBzaG93YmFzZSwgZmFpbGJpdCwgMiwgIi0gMSQiLCAiJCIpOwoKICAgIFRFU1QgKFQsIC0xMjAwLjAsICIxMiQtIiwgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiMUAkLSIsICIkIik7CiAgICBURVNUIChULCAtMTMwMC4wLCAiMTMgJC0iLCA1LCBzaG93YmFzZSwgZW9mYml0LCAgMiwgIjFAJC0iLCAiJCIpOwogICAgVEVTVCAoVCwgICAgIDAuMCwgIjE0JC0iLCAgMiwgc2hvd2Jhc2UsIGZhaWxiaXQsIDIsICIxICQtIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xNTAwLjAsICIxNSAkLSIsIDUsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiMSAkLSIsICIkIik7CgogICAgY29uc3QgY2hhclQgcGFyZW5zW11bM10gPSB7IHsgJygnLCAnKScsICdcMCcgfSwgeyAnXDAnIH0gfTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IHBhcmVucyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSBwYXJlbnMgWzFdOwoKICAgIC8vIHsgc2lnbiwgc3BhY2UsIHZhbHVlLCBzeW1ib2wgfSwgd2l0aCBzeW1ib2wgcmVxdWlyZWQKICAgIFRFU1QgKFQsIC05MC4wLCAiKCA5JCkiLCAgICA1LCBzaG93YmFzZSwgZW9mYml0LCAxLCAiLSAxJCIsICIkIik7CiAgICBURVNUIChULCAtODAuMCwgIiggOFNJVCkiLCAgNywgc2hvd2Jhc2UsIGVvZmJpdCwgMSwgIi0gMSQiLCAiU0lUIik7CiAgICBURVNUIChULCAtODEuMCwgIiggOC4xRnIpIiwgOCwgc2hvd2Jhc2UsIGVvZmJpdCwgMSwgIi0gMSQiLCAiRnIiKTsKICAgIFRFU1QgKFQsICA3MC4wLCAiIDdQdGFzIiwgICA2LCBzaG93YmFzZSwgZW9mYml0LCAxLCAiLSAxJCIsICJQdGFzIik7CiAgICBURVNUIChULCAgNjEuMCwgIiA2LjFMZWsiLCAgNywgc2hvd2Jhc2UsIGVvZmJpdCwgMSwgIi0gMSQiLCAiTGVrIik7CgogICAgLy8geyBzaWduLCB2YWx1ZSwgbm9uZSwgc3ltYm9sIH0KICAgIFRFU1QgKFQsICAxMDEuMCwgIjEwMSAgICAiLCAzLCAwLCAgICAgICAgZ29vZGJpdCwgMCwgIi0xQCQiLCAiIik7CiAgICAvLyB0cmFpbGluZyBzcGFjZSBub3QgZXh0cmFjdGVkIHNpbmNlIGN1cnJlbmN5IHN5bWJvbCBpcyBvcHRpb25hbAogICAgVEVTVCAoVCwgIDEwMi4wLCAiMTAyICIsIDMsIDAsIGdvb2RiaXQsIDAsICItMUAkIiwgIiAiKTsKICAgIC8vIGFsbCBzcGFjZXMgZXh0cmFjdGVkIHNpbmNlIGN1cnJlbmN5IHN5bWJvbCAobGFzdCkgaXMgbWFuZGF0b3J5CiAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgZmFjZXQgZG9lc24ndCBleHRyYWN0IHRvbyBtYW55IG9wdGlvbmFsIHNwYWNlcwogICAgLy8gbGVhdmluZyBub25lIGZvciB0aGUgZmluYWwgcmVxdWlyZWQgY3VycmVuY3kgc3ltYm9sCiAgICBURVNUIChULCAgMTAzLjAsICIxMDMgIiwgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgMCwgIi0xQCQiLCAiICIpOwoKICAgIC8vIDIyLjIuNi4xLjIsIHAzOiBbRXhhbXBsZTogSWYgc2hvd2Jhc2UgaXMgb2ZmLCB0aGVuIGZvcgogICAgLy8gYSBuZWdhdGl2ZSBzaWduIHZhbHVlIG9mICIoKSIgYW5kIGEgY3VycmVuY3kgc3ltYm9sIG9mICJMIiwKICAgIC8vIGluICIoMTAwIEwpIiB0aGUgIkwiIGlzIGNvbnN1bWVkOyBidXQgaWYgbmVnYXRpdmUgc2lnbiBpcyAirSIsCiAgICAvLyB0aGUgIkwiIGluICKtMTAwIEwiIGlzIG5vdCBjb25zdW1lZC4gXQogICAgVEVTVCAoVCwgLTEwNC4wLCAiKDEwNCBMKSIsIDcsIDAsICAgICAgICBlb2ZiaXQsICAwLCAiLTFAJCIsICJMIik7CiAgICBURVNUIChULCAtMTA1LjAsICIoMTA1IEwpIiwgNywgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIkwiKTsKCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbaW50bF0gPSBwbHVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IG1pbnVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IHBsdXMgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gbWludXMgWzFdOwoKICAgIC8vIHsgc2lnbiwgdmFsdWUsIG5vbmUsIHN5bWJvbCB9CiAgICAvLyB0cmFpbGluZyBvcHRpb25hbCBjdXJyX3N5bWJvbCBvciB3aGl0ZXNwYWNlIHByZWNlZGluZyBpdCAocmVnYXJkbGVzcwogICAgLy8gb2Ygd2hldGhlciB0aGUgbGF0dGVyIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsKSBpcyBub3QgY29uc3VtZWQpCiAgICBURVNUIChULCAtMTAxLjAsICItMTAxICQiLCA0LCAwLCAgICAgICAgZ29vZGJpdCwgMCwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgLTEwMi4wLCAiLTEwMiAkIiwgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgMCwgIi0xQCQiLCAiJCIpOwoKICAgIFRFU1QgKFQsIC0xMDMuMCwgIi0xMDMgJCIsIDQsIDAsICAgICAgICBnb29kYml0LCAwLCAiLTEgJCIsICIkIik7CiAgICBURVNUIChULCAtMTA0LjAsICItMTA0ICQiLCA2LCBzaG93YmFzZSwgZW9mYml0LCAwLCAiLTEgJCIsICIkIik7CgogICAgLy8geyBzaWduLCB2YWx1ZSwgc3ltYm9sLCBub25lIH0KICAgIFRFU1QgKFQsIC0xMDUuMCwgIi0xMDUgJCIsIDQsIDAsICAgICAgICBnb29kYml0LCAwLCAiLTEkQCIsICIkIik7CiAgICBURVNUIChULCAtMTA2LjAsICItMTA2JCAiLCA1LCBzaG93YmFzZSwgZ29vZGJpdCwgMCwgIi0xJEAiLCAiJCIpOwoKICAgIC8vIHsgdmFsdWUsIG5vbmUsIHNpZ24sIHN5bWJvbCB9CiAgICAvLyB0cmFpbGluZyB3aGl0ZXNwYWNlIG1heSBuZWVkIHRvIGJlIGV4dHJhY3RlZCBpZiBjaGFyYWN0ZXJzIG1heQogICAgLy8gYmUgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBwYXR0ZXJuIChlLmcuLCBzaWduIG9yIHN5bWJvbCkKICAgIFRFU1QgKFQsICAxMDcuMCwgIjEwNyAkIiwgIDQsIDAsICAgICAgICBnb29kYml0LCAwLCAiMUAtJCIsICIkIik7CiAgICAvLyB0cmFpbGluZyBvcHRpb25hbCBjdXJyX3N5bWJvbCBpcyBub3QgY29uc3VtZWQKICAgIFRFU1QgKFQsIC0xMDguMCwgIjEwOC0kIiwgIDQsIDAsICAgICAgICBnb29kYml0LCAwLCAiMUAtJCIsICIkIik7CiAgICAvLyB0cmFpbGluZyByZXF1aXJlZCBjdXJyX3N5bWJvbCBpcyBjb25zdW1lZAogICAgVEVTVCAoVCwgLTEwOS4wLCAiMTA5LSQiLCAgNSwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICIxQC0kIiwgIiQiKTsKCiAgICBjb25zdCBjaGFyVCBtaW51c19zcGFjZVtdWzNdID0geyB7ICctJywgJyAnLCAnXDAnIH0sIHsgJ1wwJyB9IH07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSBtaW51c19zcGFjZSBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSBtaW51c19zcGFjZSBbMV07CgogICAgLy8geyBzaWduLCB2YWx1ZSwgbm9uZSwgc3ltYm9sIH0KICAgIC8vIG5lZ2F0aXZlX3NpZ24gaXMgIi0gIiwgKG5vdGUgdGhlIHNpbmdsZSB0cmFpbGluZyBzcGFjZSkKICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBleHRyYWN0aW9uIHN1Y2VlZHMsIGkuZS4sIHRoYXQgdGhlIG1vbmV5X2Jhc2U6Om5vbmUKICAgIC8vIHNwZWNpZmllciB0aGF0J3MgbGFzdCBpbiB0aGUgcGF0dGVybiBkb2Vzbid0IGNvbmZ1c2UgdGhlIGZhY2V0IGludG8KICAgIC8vIGV4dHJhY3RpbmcgYWxsIHRoZSBvcHRpb25hbCB3aGl0ZXNwYWNlLCBsZWF2aW5nIG5vbmUgdG8gY29tcGxldGUKICAgIC8vIHRoZSBuZWdhdGl2ZV9zaWduCiAgICBURVNUIChULCAtMTA5LjEsICItMTA5ICAiLCA2LCAwLCBlb2ZiaXQsIDAsICItMUAkIiwgIiIpOwoKICAgIC8vIHZlcmlmeSB0aGF0IG9wdGlvbmFsIHNwYWNlIGFmdGVyIHZhbHVlIGFuZCBiZWZvcmUgY3VycmVuY3kKICAgIC8vIHN5bWJvbCBpcyB0cmVhdGVkIGNvcnJlY3RseQogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1c19wbHVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKCiAgICAvLyB7IHNpZ24sIHZhbHVlLCBub25lLCBzeW1ib2wgfQogICAgVEVTVCAoVCwgIDEwOTAuMCwgIjEwOTAgJCIsICAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsICAxMDkxLjAsICIxMDkxICQiLCAgIDYsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CiAgICBURVNUIChULCArMTA5Mi4wLCAiKzEwOTIgJCsiLCA4LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gcGFyZW5zIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CgogICAgVEVTVCAoVCwgIDEwOTMuMCwgIjEwOTMgJCIsICAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsICAxMDk0LjAsICIxMDk0ICQiLCAgIDYsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CiAgICBURVNUIChULCAtMTA5NS4wLCAiKDEwOTUgJCkiLCA4LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwoKICAgIC8vIHZlcmlmeSBhIHNpbmdsZS1jaGFyIHNpZ24gd2l0aCBhIG11bHRpY2hhciBvbmUgKHNlZSBidWcgIzQyOCkKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IHBsdXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IHBhcmVucyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSAwOwoKICAgIC8vIHsgc2lnbiwgdmFsdWUsIG5vbmUsIHN5bWJvbCB9CiAgICBURVNUIChULCAgMTA5Ni4wLCAiMTA5NiAkIiwgICA2LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgIDEwOTcuMCwgIjEwOTcgJCIsICAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsICsxMDk4LjAsICIrMTA5OCAkIiwgIDcsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CiAgICBURVNUIChULCAtMTA5OS4wLCAiKDEwOTkgJCkiLCA4LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CgogICAgLy8geyB2YWx1ZSwgbm9uZSwgc3ltYm9sLCBzaWduIH0KICAgIC8vIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgbm90IGV4dHJhY3RlZCAoZXZlbiBpZiByZXF1aXJlZCBieSB0aGUgZm9ybWF0KQogICAgLy8gaWYgaXQgY2FuIGJlIGRldGVybWluZWQgdGhhdCBubyBvdGhlciBjaGFyYWN0ZXJzIGNhbiBwb3NzaWJseSBjb21wbGV0ZQogICAgLy8gdGhlIGZvcm1hdCAoZS5nLiwgaWYgYm90aCBzaWducyBhbmQgc3ltYm9sIGFyZSBlbXB0eSBvciBpZiBzaWducyBhcmUKICAgIC8vIGVtcHR5IGFuZCBzeW1ib2wgaXMgb3B0aW9uYWwpCiAgICBURVNUIChULCAgMTEwLjAsICIxMTAgJCIsICAzLCAwLCAgICAgICAgZ29vZGJpdCwgMCwgIjFALSQiLCAiJCIpOwogICAgVEVTVCAoVCwgIDExMS4wLCAiMTExICQiLCAgMywgMCwgICAgICAgIGdvb2RiaXQsIDAsICIxIC0kIiwgIiQiKTsKICAgIFRFU1QgKFQsICAxMTIuMCwgIjExMiQiLCAgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiMUAtJCIsICIkIik7CiAgICBURVNUIChULCAgMTEzLjAsICIxMTMkIiwgICA0LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIjFALSQiLCAiJCIpOwogICAgVEVTVCAoVCwgIDExNC4wLCAiMTE0ICQiLCAgNSwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICIxIC0kIiwgIiQiKTsKCiAgICBURVNUIChULCAgMTE1LjAsICIxMTUgJCIsICAzLCAwLCAgICAgICAgZ29vZGJpdCwgMCwgIjFAJC0iLCAiJCIpOwogICAgVEVTVCAoVCwgIDExNi4wLCAiMTE2ICQiLCAgMywgMCwgICAgICAgIGdvb2RiaXQsIDAsICIxICQtIiwgIiQiKTsKICAgIFRFU1QgKFQsICAxMTcuMCwgIjExNyQiLCAgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiMUAkLSIsICIkIik7CiAgICBURVNUIChULCAgMTE4LjAsICIxMTgkIiwgICA0LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIjFAJC0iLCAiJCIpOwogICAgVEVTVCAoVCwgIDExOS4wLCAiMTE5ICQiLCAgNSwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICIxICQtIiwgIiQiKTsKCgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSBwbHVzIFsxXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IG1pbnVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IG1pbnVzIFsxXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnRob3VzYW5kc19zZXBfIFtpbnRsXSA9ICc7JzsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnRob3VzYW5kc19zZXBfIFtsb2NsXSA9ICcqJzsKCiAgICAvLyB0ZXN0IGdyb3VwaW5nLCBkZWZhdWx0IHBhdHRlcm4geyBzeW1ib2wgc2lnbiBub25lIHZhbHVlIH0KICAgIFRFU1QgKFQsIDAuMCwgIiQwIiwgICAgIDIsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQwOzAiLCAgIDQsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQwOzA7MCIsIDYsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCAwLjAsICIkKzAiLCAgICAgMywgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJCswOzAiLCAgIDUsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQrMDswOzAiLCA3LCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgMC4wLCAiJC0wLjAiLCAgICAgICAgNSwgMCwgZW9mYml0LCAxLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJC0wOzAuMDAiLCAgICAgOCwgMCwgZW9mYml0LCAyLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJC0wOzA7MC4wMDAiLCAxMSwgMCwgZW9mYml0LCAzLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsICAgICAtMTAuMCwgIiQtMS4iLCAgICAgICAgICAgNCwgMCwgZW9mYml0LCAxLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgICAtMjAwMC4wLCAiJC0yOzAuMDAwMCIsICAgIDEwLCAwLCBlb2ZiaXQsIDIsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAtMzAwMDAwLjAsICIkLTM7MDswLjAwMDAwIiwgMTMsIDAsIGVvZmJpdCwgMywgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIC0zMDAwMDEuMCwgIiQtMzswOzAuMDAxMjMiLCAxMywgMCwgZW9mYml0LCAzLCAwLCAiJCIsICJcMSIpOwoKICAgIC8vIGludmFsaWQgZ3JvdXBpbmc6IHN0b3JlIHZhbHVlIGFuZCBzZXQgZmFpbGJpdAogICAgVEVTVCAoVCwgMC4wLCAiJDA7IiwgICAzLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDswOzAiLCA1LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDA7OzAiLCA1LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDsuMCIsICA0LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAxLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDs7LjAiLCA1LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAxLCAwLCAiJCIsICJcMSIpOwogICAgLy8gZGVjaW1hbF9wb2ludCBhbG9uZSBpcyBub3QgYSB2YWxpZCBudW1iZXIKICAgIFRFU1QgKFQsIDAuMCwgIiQuOzEiLCAgMiwgMCwgZmFpbGJpdCwgICAgICAgICAgMSwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQ7LjsyIiwgMywgMCwgZmFpbGJpdCwgICAgICAgICAgMSwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCAwLjAsICIkKzA7IiwgICA0LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJCs7MDswIiwgNiwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQrMDs7MCIsIDYsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkKzsuMDsiLCA1LCAwLCBmYWlsYml0LCAgICAgICAgICAxLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsICAgICAtNDAuMCwgIiQtNDsuICIsICAgICAgICAgICA1LCAwLCBmYWlsYml0LCAxLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgICAtNTAwMC4wLCAiJC07NTswLjAwMDAgIiwgICAgMTEsIDAsIGZhaWxiaXQsIDIsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAtNjAwMDAwLjAsICIkLTY7MDs7MC4wMDAwMCAiLCAxNCwgMCwgZmFpbGJpdCwgMywgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIC03MDAwMDQuMCwgIiQtNzs7MDswLjAwNDU2ICIsIDE0LCAwLCBmYWlsYml0LCAzLCAwLCAiJCIsICJcMSIpOwoKI2lmbmRlZiBfUldTVERfTk9fTE9OR19ET1VCTEUKIyAgZGVmaW5lIExEQkwoeCkgICB4ICMjIEwKI2Vsc2UKIyAgZGVmaW5lIExEQkwoeCkgICB4CiNlbmRpZgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkMTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDIwLCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkMDsxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjIsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCBMREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQwOzA7MTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDI0LCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkKzE7MjszOzQ7NTs2Ozc7ODs5OzAiLCAyMSwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsIExEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJCswOzE7MjszOzQ7NTs2Ozc7ODs5OzAiLCAyMywgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsIExEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJCswOzA7MTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDI1LCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkKzA7MTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDIzLCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgLUxEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJC0xOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjEsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCAtTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkLTA7MTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDIzLCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgLUxEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJC0wOzA7MTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDI1LCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgoKICAgIFRFU1QgKFQsIExEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJDEyOzM0OzU2Ozc4OzkwIiwgMTUsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDIiKTsKCiAgICBURVNUIChULCBMREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQrMTI7MzQ7NTY7Nzg7OTAiLCAxNiwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMiIpOwoKICAgIFRFU1QgKFQsIC1MREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQtMTI7MzQ7NTY7Nzg7OTAiLCAxNiwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMiIpOwoKI3VuZGVmIFQKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kdm9pZAp0ZXN0X2dldCAoY2hhclQgb3B0LCBjb25zdCBjaGFyICpjbmFtZSwgY29uc3QgY2hhciAqdG5hbWUpCnsKICAgIC8vIHRlc3QgbG9jYWwgbW9uZXkgZm9ybWF0CiAgICB0ZXN0X2dldCAob3B0LCBjbmFtZSwgdG5hbWUsIGZhbHNlKTsKCiAgICAvLyB0ZXN0IGludGVybmF0aW9uYWwgbW9uZXkgZm9ybWF0CiAgICB0ZXN0X2dldCAob3B0LCBjbmFtZSwgdG5hbWUsIHRydWUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CnZvaWQKdGVzdF9sb25nX2RvdWJsZSAoY2hhclQsIGNvbnN0IGNoYXIgKmNuYW1lKQp7CiAgICBpZiAocndfZW5hYmxlZCAoImxvbmcgZG91YmxlIikpCiAgICAgICAgdGVzdF9nZXQgKGNoYXJUICgwIC8qIGxvbmcgZG91YmxlIGFyZ3VtZW50ICovKSwKICAgICAgICAgICAgICAgICAgY25hbWUsICJsb25nIGRvdWJsZSIpOwogICAgZWxzZQogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgImxvbmcgZG91YmxlIHRlc3QgZGlzYWJsZWQiKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgp2b2lkCnRlc3Rfc3RyaW5nIChjaGFyVCwgY29uc3QgY2hhciAqY25hbWUpCnsKICAgIGlmIChyd19lbmFibGVkICgiYmFzaWNfc3RyaW5nIikpCiAgICAgICAgdGVzdF9nZXQgKGNoYXJUICgxIC8qIGJhc2ljX3N0cmluZyBhcmd1bWVudCAqLyksCiAgICAgICAgICAgICAgICAgIGNuYW1lLCAiYmFzaWNfc3RyaW5nIik7CiAgICBlbHNlCiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLAogICAgICAgICAgICAgICAgICJiYXNpY19zdHJpbmc8JXM+IHRlc3QgZGlzYWJsZWQiLCBjbmFtZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQKcnVuX3Rlc3QgKGludCwgY2hhcipbXSkKewogICAgLy8gY2hlY2sgdGhlIHByZXNjcmliZWQgdmFsdWVzIG9mIHRoZSByZXF1aXJlZCBjb25zdGFudHMKICAgIHJ3X2ZhdGFsICgnXDAnID09IHN0ZDo6bW9uZXlfYmFzZTo6bm9uZSwgMCwgMCwKICAgICAgICAgICAgICAiJ1xcMCcgPT0gbW9uZXlfYmFzZTo6bm9uZSwgZ290ICVkIiwgc3RkOjptb25leV9iYXNlOjpub25lKTsKCiAgICByd19mYXRhbCAoJ1wxJyA9PSBzdGQ6Om1vbmV5X2Jhc2U6OnNwYWNlLCAwLCAwLAogICAgICAgICAgICAgICInXFwxJyA9PSBtb25leV9iYXNlOjpzcGFjZSwgZ290ICVkIiwgc3RkOjptb25leV9iYXNlOjpzcGFjZSk7CgogICAgcndfZmF0YWwgKCdcMicgPT0gc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIDAsIDAsCiAgICAgICAgICAgICAgIidcXDInID09IG1vbmV5X2Jhc2U6OnN5bWJvbCwgZ290ICVkIiwgc3RkOjptb25leV9iYXNlOjpzeW1ib2wpOwoKICAgIHJ3X2ZhdGFsICgnXDMnID09IHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwgMCwgMCwKICAgICAgICAgICAgICAiJ1xcMycgPT0gbW9uZXlfYmFzZTo6c2lnbiwgZ290ICVkIiwgc3RkOjptb25leV9iYXNlOjpzaWduKTsKCiAgICByd19mYXRhbCAoJ1w0JyA9PSBzdGQ6Om1vbmV5X2Jhc2U6OnZhbHVlLCAwLCAwLAogICAgICAgICAgICAgICInXFw0JyA9PSBtb25leV9iYXNlOjp2YWx1ZSwgZ290ICVkIiwgc3RkOjptb25leV9iYXNlOjp2YWx1ZSk7CiAgICAgICAgICAgICAgIAogICAgaWYgKHJ3X2VuYWJsZWQgKCJjaGFyIikpIHsKICAgICAgICB0ZXN0X2xvbmdfZG91YmxlIChjaGFyICgpLCAiY2hhciIpOwogICAgICAgIHRlc3Rfc3RyaW5nIChjaGFyICgpLCAiY2hhciIpOwogICAgfQogICAgZWxzZQogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgImNoYXIgdGVzdCBkaXNhYmxlZCIpOwoKI2lmbmRlZiBfUldTVERfTk9fV0NIQVJfVAoKICAgIGlmIChyd19lbmFibGVkICgid2NoYXJfdCIpKSB7CiAgICAgICAgdGVzdF9sb25nX2RvdWJsZSAod2NoYXJfdCAoKSwgIndjaGFyX3QiKTsKICAgICAgICB0ZXN0X3N0cmluZyAod2NoYXJfdCAoKSwgIndjaGFyX3QiKTsKICAgIH0KICAgIGVsc2UKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICJ3Y2hhcl90IHRlc3QgZGlzYWJsZWQiKTsKCiNlbmRpZiAgIC8vIF9SV1NURF9OT19XQ0hBUl9UCgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludCBtYWluIChpbnQgYXJnYywgY2hhciogYXJndiBbXSkKewogICAgcmV0dXJuIHJ3X3Rlc3QgKGFyZ2MsIGFyZ3YsIF9fRklMRV9fLAogICAgICAgICAgICAgICAgICAgICJsaWIubG9jYWxlLm1vbmV5LmdldCIsCiAgICAgICAgICAgICAgICAgICAgMCAvKiBubyBjb21tZW50ICovLCBydW5fdGVzdCwKICAgICAgICAgICAgICAgICAgICAifC1uby1iYXNpY19zdHJpbmcjIiwKICAgICAgICAgICAgICAgICAgICAmbm9fYmFzaWNfc3RyaW5nKTsKfQo=