LyoKICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIAogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIAogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIAogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgPGNvbmZpZy5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJiYXNlNjQuaCIKCi8qIFRoZSBsYXN0ICNpbmNsdWRlIGZpbGUgc2hvdWxkIGJlOiAqLwojaWZkZWYgTUFMTE9DREVCVUcKI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiNlbmRpZgoKc3RhdGljIGNoYXIgYmFzZTY0W10gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CgpzdGF0aWMgaW50IHBvcyhjaGFyIGMpCnsKICBjaGFyICpwOwogIGZvcihwID0gYmFzZTY0OyAqcDsgcCsrKQogICAgaWYoKnAgPT0gYykKICAgICAgcmV0dXJuIHAgLSBiYXNlNjQ7CiAgcmV0dXJuIC0xOwp9CgojaWYgMQppbnQgYmFzZTY0X2VuY29kZShjb25zdCB2b2lkICpkYXRhLCBpbnQgc2l6ZSwgY2hhciAqKnN0cikKewogIGNoYXIgKnMsICpwOwogIGludCBpOwogIGludCBjOwogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7CgogIHAgPSBzID0gKGNoYXIqKW1hbGxvYyhzaXplKjQvMys0KTsKICBpZiAocCA9PSBOVUxMKQogICAgICByZXR1cm4gLTE7CiAgcSA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilkYXRhOwogIGk9MDsKICBmb3IoaSA9IDA7IGkgPCBzaXplOyl7CiAgICBjPXFbaSsrXTsKICAgIGMqPTI1NjsKICAgIGlmKGkgPCBzaXplKQogICAgICBjKz1xW2ldOwogICAgaSsrOwogICAgYyo9MjU2OwogICAgaWYoaSA8IHNpemUpCiAgICAgIGMrPXFbaV07CiAgICBpKys7CiAgICBwWzBdPWJhc2U2NFsoYyYweDAwZmMwMDAwKSA+PiAxOF07CiAgICBwWzFdPWJhc2U2NFsoYyYweDAwMDNmMDAwKSA+PiAxMl07CiAgICBwWzJdPWJhc2U2NFsoYyYweDAwMDAwZmMwKSA+PiA2XTsKICAgIHBbM109YmFzZTY0WyhjJjB4MDAwMDAwM2YpID4+IDBdOwogICAgaWYoaSA+IHNpemUpCiAgICAgIHBbM109Jz0nOwogICAgaWYoaSA+IHNpemUrMSkKICAgICAgcFsyXT0nPSc7CiAgICBwKz00OwogIH0KICAqcD0wOwogICpzdHIgPSBzOwogIHJldHVybiBzdHJsZW4ocyk7Cn0KI2VuZGlmCgppbnQgYmFzZTY0X2RlY29kZShjb25zdCBjaGFyICpzdHIsIHZvaWQgKmRhdGEpCnsKICBjb25zdCBjaGFyICpwOwogIHVuc2lnbmVkIGNoYXIgKnE7CiAgaW50IGM7CiAgaW50IHg7CiAgaW50IGRvbmUgPSAwOwogIHE9KHVuc2lnbmVkIGNoYXIqKWRhdGE7CiAgZm9yKHA9c3RyOyAqcCAmJiAhZG9uZTsgcCs9NCl7CiAgICB4ID0gcG9zKHBbMF0pOwogICAgaWYoeCA+PSAwKQogICAgICBjID0geDsKICAgIGVsc2V7CiAgICAgIGRvbmUgPSAzOwogICAgICBicmVhazsKICAgIH0KICAgIGMqPTY0OwogICAgCiAgICB4ID0gcG9zKHBbMV0pOwogICAgaWYoeCA+PSAwKQogICAgICBjICs9IHg7CiAgICBlbHNlCiAgICAgIHJldHVybiAtMTsKICAgIGMqPTY0OwogICAgCiAgICBpZihwWzJdID09ICc9JykKICAgICAgZG9uZSsrOwogICAgZWxzZXsKICAgICAgeCA9IHBvcyhwWzJdKTsKICAgICAgaWYoeCA+PSAwKQoJYyArPSB4OwogICAgICBlbHNlCglyZXR1cm4gLTE7CiAgICB9CiAgICBjKj02NDsKICAgIAogICAgaWYocFszXSA9PSAnPScpCiAgICAgIGRvbmUrKzsKICAgIGVsc2V7CiAgICAgIGlmKGRvbmUpCglyZXR1cm4gLTE7CiAgICAgIHggPSBwb3MocFszXSk7CiAgICAgIGlmKHggPj0gMCkKCWMgKz0geDsKICAgICAgZWxzZQoJcmV0dXJuIC0xOwogICAgfQogICAgaWYoZG9uZSA8IDMpCiAgICAgICpxKys9KGMmMHgwMGZmMDAwMCk+PjE2OwogICAgICAKICAgIGlmKGRvbmUgPCAyKQogICAgICAqcSsrPShjJjB4MDAwMGZmMDApPj44OwogICAgaWYoZG9uZSA8IDEpCiAgICAgICpxKys9KGMmMHgwMDAwMDBmZik+PjA7CiAgfQogIHJldHVybiBxIC0gKHVuc2lnbmVkIGNoYXIqKWRhdGE7Cn0K