LyoKICoJdzgzNjI3aGYvdGhmIFdEVCBkcml2ZXIKICoKICoJKGMpIENvcHlyaWdodCAyMDA3IFZsYWQgRHJ1a2tlciA8dmxhZEBzdG9yZXdpei5jb20+CiAqCQlhZGRlZCBzdXBwb3J0IGZvciBXODM2MjdUSEYuCiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMyBQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPgogKgogKglCYXNlZCBvbiBhZHZhbnRlY2h3ZHQuYyB3aGljaCBpcyBiYXNlZCBvbiB3ZHQuYy4KICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgogKgogKgkoYykgQ29weXJpZ2h0IDIwMDAtMjAwMSBNYXJlayBNaWNoYWxraWV3aWN6IDxtYXJla21AbGludXgub3JnLnBsPgogKgogKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQogKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KCiNkZWZpbmUgV0FUQ0hET0dfTkFNRSAidzgzNjI3aGYvdGhmIFdEVCIKI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCiNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CnN0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsKCi8qIFlvdSBtdXN0IHNldCB0aGlzIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuICovCnN0YXRpYyBpbnQgd2R0X2lvID0gMHgyRTsKbW9kdWxlX3BhcmFtKHdkdF9pbywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh3ZHRfaW8sICJ3ODM2MjdoZi90aGYgV0RUIGlvIHBvcnQgKGRlZmF1bHQgMHgyRSkiKTsKCnN0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMgKi8KbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMTw9IHRpbWVvdXQgPD02MywgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiLiIpOwoKc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwptb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CgovKgogKglLZXJuZWwgbWV0aG9kcy4KICovCgojZGVmaW5lIFdEVF9FRkVSICh3ZHRfaW8rMCkgICAvKiBFeHRlbmRlZCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXJzICovCiNkZWZpbmUgV0RUX0VGSVIgKHdkdF9pbyswKSAgIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIEluZGV4IFJlZ2lzdGVyIChzYW1lIGFzIEVGRVIpICovCiNkZWZpbmUgV0RUX0VGRFIgKFdEVF9FRklSKzEpIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIERhdGEgUmVnaXN0ZXIgKi8KCnN0YXRpYyB2b2lkCnc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQp7Cgl1bnNpZ25lZCBjaGFyIGM7CglvdXRiX3AoMHg4NywgV0RUX0VGRVIpOyAvKiBFbnRlciBleHRlbmRlZCBmdW5jdGlvbiBtb2RlICovCglvdXRiX3AoMHg4NywgV0RUX0VGRVIpOyAvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCgoJb3V0YigweDIwLCBXRFRfRUZFUik7IAkvKiBjaGVjayBjaGlwIHZlcnNpb24JKi8KCWMgPSBpbmIoV0RUX0VGRFIpOwoJaWYgKGMgPT0gMHg4MikgewkvKiBXODM2MjdUSEYgCQkqLwoJCW91dGJfcCgweDJiLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBHUElPMyAqLwoJCWMgPSAoKGluYl9wKFdEVF9FRkRSKSAmIDB4ZjcpIHwgMHgwNCk7IC8qIHNlbGVjdCBXRFQwICovCgkJb3V0Yl9wKDB4MmIsIFdEVF9FRkVSKTsKCQlvdXRiX3AoYywgV0RUX0VGRFIpOwkvKiBzZXQgR1BJTzMgdG8gV0RUMCAqLwoJfQoKCW91dGJfcCgweDA3LCBXRFRfRUZFUik7IC8qIHBvaW50IHRvIGxvZ2ljYWwgZGV2aWNlIG51bWJlciByZWcgKi8KCW91dGJfcCgweDA4LCBXRFRfRUZEUik7IC8qIHNlbGVjdCBsb2dpY2FsIGRldmljZSA4IChHUElPMikgKi8KCW91dGJfcCgweDMwLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBDUjMwICovCglvdXRiX3AoMHgwMSwgV0RUX0VGRFIpOyAvKiBzZXQgYml0IDAgdG8gYWN0aXZhdGUgR1BJTzIgKi8KfQoKc3RhdGljIHZvaWQKdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIodm9pZCkKewoJb3V0Yl9wKDB4QUEsIFdEVF9FRkVSKTsgLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLwp9CgovKiB0eWFuIG1vdGhlcmJvYXJkcyBzZWVtIHRvIHNldCBGNSB0byAweDRDID8KICogU28gZXhwbGljaXRseSBpbml0IHRvIGFwcHJvcHJpYXRlIHZhbHVlLiAqLwpzdGF0aWMgdm9pZAp3ODM2MjdoZl9pbml0KHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgdDsKCgl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKCglvdXRiX3AoMHhGNiwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNiAqLwoJdD1pbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY2ICovCglpZiAodCAhPSAwKSB7CgkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJXYXRjaGRvZyBhbHJlYWR5IHJ1bm5pbmcuIFJlc2V0dGluZyB0aW1lb3V0IHRvICVkIHNlY1xuIiwgdGltZW91dCk7CgkJb3V0Yl9wKHRpbWVvdXQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY2ICovCgl9CglvdXRiX3AoMHhGNSwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNSAqLwoJdD1pbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY1ICovCgl0Jj1+MHgwQzsgICAgICAgICAgICAgICAvKiBzZXQgc2Vjb25kIG1vZGUgJiBkaXNhYmxlIGtleWJvYXJkIHR1cm5pbmcgb2ZmIHdhdGNoZG9nICovCglvdXRiX3AodCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjUgKi8KCgl3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3RlcigpOwp9CgpzdGF0aWMgdm9pZAp3ZHRfY3RybChpbnQgdGltZW91dCkKewoJc3Bpbl9sb2NrKCZpb19sb2NrKTsKCQoJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgICAgLyogU2VsZWN0IENSRjYgKi8KCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7IC8qIFdyaXRlIFRpbWVvdXQgY291bnRlciB0byBDUkY2ICovCgoJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKCglzcGluX3VubG9jaygmaW9fbG9jayk7Cn0KCnN0YXRpYyBpbnQKd2R0X3Bpbmcodm9pZCkKewoJd2R0X2N0cmwodGltZW91dCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp3ZHRfZGlzYWJsZSh2b2lkKQp7Cgl3ZHRfY3RybCgwKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CndkdF9zZXRfaGVhcnRiZWF0KGludCB0KQp7CglpZiAoKHQgPCAxKSB8fCAodCA+IDYzKSkKCQlyZXR1cm4gLUVJTlZBTDsKCgl0aW1lb3V0ID0gdDsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3NpemVfdAp3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CglpZiAoY291bnQpIHsKCQlpZiAoIW5vd2F5b3V0KSB7CgkJCXNpemVfdCBpOwoKCQkJZXhwZWN0X2Nsb3NlID0gMDsKCgkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgewoJCQkJY2hhciBjOwoJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZitpKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCWlmIChjID09ICdWJykKCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKCQkJfQoJCX0KCQl3ZHRfcGluZygpOwoJfQoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgaW50CndkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKCSAgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwoJaW50IF9fdXNlciAqcCA9IGFyZ3A7CglpbnQgbmV3X3RpbWVvdXQ7CglzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CgkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCgkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAoJCS5pZGVudGl0eSA9ICJXODM2MjdIRiBXRFQiLAoJfTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgoJICBpZiAoY29weV90b191c2VyKGFyZ3AsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCgkgICAgcmV0dXJuIC1FRkFVTFQ7CgkgIGJyZWFrOwoKCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgoJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgoJICByZXR1cm4gcHV0X3VzZXIoMCwgcCk7CgoJY2FzZSBXRElPQ19LRUVQQUxJVkU6CgkgIHdkdF9waW5nKCk7CgkgIGJyZWFrOwoKCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKCSAgaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKCQkgIHJldHVybiAtRUZBVUxUOwoJICBpZiAod2R0X3NldF9oZWFydGJlYXQobmV3X3RpbWVvdXQpKQoJCSAgcmV0dXJuIC1FSU5WQUw7CgkgIHdkdF9waW5nKCk7CgkgIC8qIEZhbGwgKi8KCgljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CgkgIHJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKCgljYXNlIFdESU9DX1NFVE9QVElPTlM6Cgl7CgkgIGludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOwoKCSAgaWYgKGdldF91c2VyKG9wdGlvbnMsIHApKQoJICAgIHJldHVybiAtRUZBVUxUOwoKCSAgaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgewoJICAgIHdkdF9kaXNhYmxlKCk7CgkgICAgcmV0dmFsID0gMDsKCSAgfQoKCSAgaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CgkgICAgd2R0X3BpbmcoKTsKCSAgICByZXR2YWwgPSAwOwoJICB9CgoJICByZXR1cm4gcmV0dmFsOwoJfQoKCWRlZmF1bHQ6CgkgIHJldHVybiAtRU5PVFRZOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCgkJcmV0dXJuIC1FQlVTWTsKCS8qCgkgKglBY3RpdmF0ZQoJICovCgoJd2R0X3BpbmcoKTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludAp3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKCQl3ZHRfZGlzYWJsZSgpOwoJfSBlbHNlIHsKCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CgkJd2R0X3BpbmcoKTsKCX0KCWV4cGVjdF9jbG9zZSA9IDA7CgljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKCXJldHVybiAwOwp9CgovKgogKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KICovCgpzdGF0aWMgaW50CndkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAoJdm9pZCAqdW51c2VkKQp7CglpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSB7CgkJLyogVHVybiB0aGUgV0RUIG9mZiAqLwoJCXdkdF9kaXNhYmxlKCk7Cgl9CglyZXR1cm4gTk9USUZZX0RPTkU7Cn0KCi8qCiAqCUtlcm5lbCBJbnRlcmZhY2VzCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubGxzZWVrCQk9IG5vX2xsc2VlaywKCS53cml0ZQkJPSB3ZHRfd3JpdGUsCgkuaW9jdGwJCT0gd2R0X2lvY3RsLAoJLm9wZW4JCT0gd2R0X29wZW4sCgkucmVsZWFzZQk9IHdkdF9jbG9zZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAoJLm5hbWUgPSAid2F0Y2hkb2ciLAoJLmZvcHMgPSAmd2R0X2ZvcHMsCn07CgovKgogKglUaGUgV0RUIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCiAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCiAqLwoKc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXIgPSB7Cgkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAp9OwoKc3RhdGljIGludCBfX2luaXQKd2R0X2luaXQodm9pZCkKewoJaW50IHJldDsKCglzcGluX2xvY2tfaW5pdCgmaW9fbG9jayk7CgoJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzYyN0hGL1RIRiBTdXBlciBJL08gY2hpcCBpbml0aWFsaXNpbmcuXG4iKTsKCglpZiAod2R0X3NldF9oZWFydGJlYXQodGltZW91dCkpIHsKCQl3ZHRfc2V0X2hlYXJ0YmVhdChXQVRDSERPR19USU1FT1VUKTsKCQlwcmludGsgKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD10aW1lb3V0PD02MywgdXNpbmcgJWRcbiIsCgkJCVdBVENIRE9HX1RJTUVPVVQpOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24od2R0X2lvLCAxLCBXQVRDSERPR19OQU1FKSkgewoJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCgkJCXdkdF9pbyk7CgkJcmV0ID0gLUVJTzsKCQlnb3RvIG91dDsKCX0KCgl3ODM2MjdoZl9pbml0KCk7CgoJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwoJaWYgKHJldCAhPSAwKSB7CgkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCgkJCXJldCk7CgkJZ290byB1bnJlZ19yZWdpb25zOwoJfQoKCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKCWlmIChyZXQgIT0gMCkgewoJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKCQkJV0FUQ0hET0dfTUlOT1IsIHJldCk7CgkJZ290byB1bnJlZ19yZWJvb3Q7Cgl9CgoJcHJpbnRrIChLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKCQl0aW1lb3V0LCBub3dheW91dCk7CgpvdXQ6CglyZXR1cm4gcmV0Owp1bnJlZ19yZWJvb3Q6Cgl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKdW5yZWdfcmVnaW9uczoKCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7Cglnb3RvIG91dDsKfQoKc3RhdGljIHZvaWQgX19leGl0CndkdF9leGl0KHZvaWQpCnsKCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOwoJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CglyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sMSk7Cn0KCm1vZHVsZV9pbml0KHdkdF9pbml0KTsKbW9kdWxlX2V4aXQod2R0X2V4aXQpOwoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQVVUSE9SKCJQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oInc4MzYyN2hmL3RoZiBXRFQgZHJpdmVyIik7Ck1PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsK