Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vIC0gSmFuaSBLYWphbGEgKGphbmlrQHJlbWVkeS5maSkKLy8gLSBLYXJsLUhlaW56IEJ1c3NpYW4gKGtoYnVzc2lhbkBtb3NzLmRlKQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgaW50ZXJuYWwgY29udmVyc2lvbnMgWCB0byA4IGJpdHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvOChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgewoJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykKCQl0YXJnZXRbY29sc10gPSAoc291cmNlW2NvbHMgPj4gM10gJiAoMHg4MCA+PiAoY29scyAmIDB4MDcpKSkgIT0gMCA/IDI1NSA6IDA7CQp9Cgp2b2lkIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ29udmVydExpbmU0VG84KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7CglpbnQgY291bnRfbmV3ID0gMDsKCWludCBjb3VudF9vcmcgPSAwOwoJQk9PTCBoaW5pYmJsZSA9IFRSVUU7CgoJd2hpbGUgKGNvdW50X25ldyA8IHdpZHRoX2luX3BpeGVscykgewoJCWlmIChoaW5pYmJsZSkgewoJCQl0YXJnZXRbY291bnRfbmV3XSA9IChzb3VyY2VbY291bnRfb3JnXSAmIDB4RjApID4+IDQ7CgkJfSBlbHNlIHsKCQkJdGFyZ2V0W2NvdW50X25ld10gPSAoc291cmNlW2NvdW50X29yZ10gJiAweDBGKTsKCgkJCWNvdW50X29yZysrOwoJCX0KCgkJaGluaWJibGUgPSAhaGluaWJibGU7CgoJCWNvdW50X25ldysrOwoJfQp9Cgp2b2lkIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvOF81NTUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCVdPUkQgKmJpdHMgPSAoV09SRCAqKXNvdXJjZTsKCglmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CgkJdGFyZ2V0W2NvbHNdID0gR1JFWSgoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfUkVEX01BU0spID4+IEZJMTZfNTU1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYsCgkJCSAgICAgICAgICAgICAgICAoKChiaXRzW2NvbHNdICYgRkkxNl81NTVfR1JFRU5fTUFTSykgPj4gRkkxNl81NTVfR1JFRU5fU0hJRlQpICogMHhGRikgLyAweDFGLAoJCQkJCQkJKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X0JMVUVfTUFTSykgPj4gRkkxNl81NTVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpOwoJfQp9Cgp2b2lkIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvOF81NjUoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCVdPUkQgKmJpdHMgPSAoV09SRCAqKXNvdXJjZTsKCglmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKQoJCXRhcmdldFtjb2xzXSA9IEdSRVkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X1JFRF9NQVNLKSA+PiBGSTE2XzU2NV9SRURfU0hJRlQpICogMHhGRikgLyAweDFGLAoJCQkgICAgICAgICgoKGJpdHNbY29sc10gJiBGSTE2XzU2NV9HUkVFTl9NQVNLKSA+PiBGSTE2XzU2NV9HUkVFTl9TSElGVCkgKiAweEZGKSAvIDB4M0YsCgkJCQkJKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0JMVUVfTUFTSykgPj4gRkkxNl81NjVfQkxVRV9TSElGVCkgKiAweEZGKSAvIDB4MUYpOwkKfQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzgoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKCQl0YXJnZXRbY29sc10gPSBHUkVZKHNvdXJjZVtGSV9SR0JBX1JFRF0sIHNvdXJjZVtGSV9SR0JBX0dSRUVOXSwgc291cmNlW0ZJX1JHQkFfQkxVRV0pOwoKCQlzb3VyY2UgKz0gMzsKCX0KfQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzgoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCWZvciAoaW50IGNvbHMgPSAwOyBjb2xzIDwgd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKCQl0YXJnZXRbY29sc10gPSBHUkVZKHNvdXJjZVtGSV9SR0JBX1JFRF0sIHNvdXJjZVtGSV9SR0JBX0dSRUVOXSwgc291cmNlW0ZJX1JHQkFfQkxVRV0pOwoKCQlzb3VyY2UgKz0gNDsKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgIHNtYXJ0IGNvbnZlcnQgWCB0byA4IGJpdHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRklCSVRNQVAgKiBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKEZJQklUTUFQICpkaWIpIHsKCWlmKCFkaWIpIHJldHVybiBOVUxMOwoKCWNvbnN0IGludCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKGRpYik7CgoJY29uc3QgRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKGRpYik7CglpZigoaW1hZ2VfdHlwZSAhPSBGSVRfQklUTUFQKSAmJiAoaW1hZ2VfdHlwZSAhPSBGSVRfVUlOVDE2KSkgewoJCXJldHVybiBOVUxMOwoJfQoKCWlmKGJwcCAhPSA4KSB7CgkJY29uc3QgaW50IHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOwoJCWNvbnN0IGludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CgkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CgoJCWlmKG5ld19kaWIgPT0gTlVMTCkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CgkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKCgkJLy8gQnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZSAoKmFsd2F5cyogbmVlZGVkIGZvciBpbWFnZSBwcm9jZXNzaW5nKQoKCQlSR0JRVUFEICpuZXdfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUobmV3X2RpYik7CgoJCWZvcihpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJCQluZXdfcGFsW2ldLnJnYlJlZAk9IChCWVRFKWk7CgkJCW5ld19wYWxbaV0ucmdiR3JlZW4gPSAoQllURSlpOwoJCQluZXdfcGFsW2ldLnJnYkJsdWUJPSAoQllURSlpOwoJCX0KCgkJaWYoaW1hZ2VfdHlwZSA9PSBGSVRfQklUTUFQKSB7CgoJCQlzd2l0Y2goYnBwKSB7CgkJCQljYXNlIDE6CgkJCQl7CgkJCQkJaWYoRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpID09IEZJQ19QQUxFVFRFKSB7CgoJCQkJCQkvLyBDb3B5IHRoZSBwYWxldHRlCgoJCQkJCQlSR0JRVUFEICpvbGRfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKCQkJCQkJbWVtY3B5KCZuZXdfcGFsWzBdLCAmb2xkX3BhbFswXSwgc2l6ZW9mKFJHQlFVQUQpKTsKCQkJCQkJbWVtY3B5KCZuZXdfcGFsWzI1NV0sICZvbGRfcGFsWzFdLCBzaXplb2YoUkdCUVVBRCkpOwoKCQkJCQl9CgkJCQkJZWxzZSBpZihGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX01JTklTV0hJVEUpIHsKCQkJCQkJCgkJCQkJCS8vIFJldmVyc2UgdGhlIGdyYXlzY2FsZSBwYWxldHRlCgoJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKCQkJCQkJCW5ld19wYWxbaV0ucmdiUmVkID0gbmV3X3BhbFtpXS5yZ2JHcmVlbiA9IG5ld19wYWxbaV0ucmdiQmx1ZSA9IChCWVRFKSgyNTUgLSBpKTsKCQkJCQkJfQoJCQkJCX0KCgoJCQkJCS8vIEV4cGFuZCBhbmQgY29weSB0aGUgYml0bWFwIGRhdGEKCgkJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxVG84KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKCQkJCQl9CgkJCQkJcmV0dXJuIG5ld19kaWI7CgkJCQl9CgoJCQkJY2FzZSA0IDoKCQkJCXsKCQkJCQlpZihGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYikgPT0gRklDX1BBTEVUVEUpIHsKCgkJCQkJCS8vIENvcHkgdGhlIHBhbGV0dGUKCgkJCQkJCVJHQlFVQUQgKm9sZF9wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOwoKCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CgkJCQkJCQluZXdfcGFsW2ldLnJnYlJlZAk9IG9sZF9wYWxbaV0ucmdiUmVkOwoJCQkJCQkJbmV3X3BhbFtpXS5yZ2JHcmVlbiA9IG9sZF9wYWxbaV0ucmdiR3JlZW47CgkJCQkJCQluZXdfcGFsW2ldLnJnYkJsdWUJPSBvbGRfcGFsW2ldLnJnYkJsdWU7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIEV4cGFuZCBhbmQgY29weSB0aGUgYml0bWFwIGRhdGEKCgkJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmU0VG84KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsJCQkJCQoJCQkJCX0KCQkJCQlyZXR1cm4gbmV3X2RpYjsKCQkJCX0KCgkJCQljYXNlIDE2IDoKCQkJCXsKCQkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCgoJCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCQkJaWYgKChGcmVlSW1hZ2VfR2V0UmVkTWFzayhkaWIpID09IEZJMTZfNTY1X1JFRF9NQVNLKSAmJiAoRnJlZUltYWdlX0dldEdyZWVuTWFzayhkaWIpID09IEZJMTZfNTY1X0dSRUVOX01BU0spICYmIChGcmVlSW1hZ2VfR2V0Qmx1ZU1hc2soZGliKSA9PSBGSTE2XzU2NV9CTFVFX01BU0spKSB7CgkJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUxNlRvOF81NjUoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzhfNTU1KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkKCQkJCQlyZXR1cm4gbmV3X2RpYjsKCQkJCX0KCgkJCQljYXNlIDI0IDoKCQkJCXsKCQkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCgoJCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzgoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgpOwkJCQkJCgkJCQkJfQoJCQkJCXJldHVybiBuZXdfZGliOwoJCQkJfQoKCQkJCWNhc2UgMzIgOgoJCQkJewoJCQkJCS8vIEV4cGFuZCBhbmQgY29weSB0aGUgYml0bWFwIGRhdGEKCgkJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvOChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CgkJCQkJfQoJCQkJCXJldHVybiBuZXdfZGliOwoJCQkJfQoJCQl9CgoJCX0gZWxzZSBpZihpbWFnZV90eXBlID09IEZJVF9VSU5UMTYpIHsKCgkJCWNvbnN0IHVuc2lnbmVkIHNyY19waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoJCQljb25zdCB1bnNpZ25lZCBkc3RfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2gobmV3X2RpYik7CgkJCWNvbnN0IEJZVEUgKnNyY19iaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKTsKCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhuZXdfZGliKTsKCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJY29uc3QgV09SRCAqc3JjX3BpeGVsID0gKFdPUkQqKXNyY19iaXRzOwoJCQkJQllURSAqZHN0X3BpeGVsID0gKEJZVEUqKWRzdF9iaXRzOwoJCQkJZm9yKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoOyBjb2xzKyspIHsKCQkJCQlkc3RfcGl4ZWxbY29sc10gPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdID4+IDgpOwoJCQkJfQoJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOwoJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOwoJCQl9CgoJCQlyZXR1cm4gbmV3X2RpYjsKCgkJfSAKCgl9IC8vIGJwcCAhPSA4CgoJcmV0dXJuIEZyZWVJbWFnZV9DbG9uZShkaWIpOwp9CgpGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ29udmVydFRvR3JleXNjYWxlKEZJQklUTUFQICpkaWIpIHsKCWlmKCFkaWIpIHJldHVybiBOVUxMOwoKCWNvbnN0IEZSRUVfSU1BR0VfQ09MT1JfVFlQRSBjb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOwoJY29uc3QgaW50IGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKCglpZigoY29sb3JfdHlwZSA9PSBGSUNfUEFMRVRURSkgfHwgKGNvbG9yX3R5cGUgPT0gRklDX01JTklTV0hJVEUpKSB7CgkJY29uc3QgaW50IHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOwoJCWNvbnN0IGludCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CgkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CgoJCWlmKG5ld19kaWIgPT0gTlVMTCkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CgkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKCgkJLy8gQnVpbGQgYSBncmV5c2NhbGUgcGFsZXR0ZQoKCQlSR0JRVUFEICpuZXdfcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUobmV3X2RpYik7CgoJCWZvcihpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJCQluZXdfcGFsW2ldLnJnYlJlZAk9IChCWVRFKWk7CgkJCW5ld19wYWxbaV0ucmdiR3JlZW4gPSAoQllURSlpOwoJCQluZXdfcGFsW2ldLnJnYkJsdWUJPSAoQllURSlpOwoJCX0KCgkJLy8gYWxsb2NhdGUgYSAyNC1iaXQgYnVmZmVyCgoJCUJZVEUgKmJ1ZmZlciA9IChCWVRFKiltYWxsb2MoIENhbGN1bGF0ZVBpdGNoKENhbGN1bGF0ZUxpbmUod2lkdGgsIDI0KSkgKTsKCQlpZihOVUxMID09IGJ1ZmZlcikgewoJCQlGcmVlSW1hZ2VfVW5sb2FkKG5ld19kaWIpOwoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vIENvbnZlcnQgdGhlIHBhbGV0dGUgdG8gMjQtYml0LCB0aGVuIHRvIDgtYml0CgoJCXN3aXRjaChicHApIHsKCQkJY2FzZSAxOgoJCQl7CgkJCQlmb3IgKGludCByb3dzID0gMDsgcm93cyA8IGhlaWdodDsgcm93cysrKSB7CgkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvMjQoYnVmZmVyLCBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCByb3dzKSwgd2lkdGgsIEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYikpOwoJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG84KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgYnVmZmVyLCB3aWR0aCk7CgkJCQl9CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlIDQ6CgkJCXsKCQkJCWZvciAoaW50IHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmU0VG8yNChidWZmZXIsIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSk7CgkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMjRUbzgoRnJlZUltYWdlX0dldFNjYW5MaW5lKG5ld19kaWIsIHJvd3MpLCBidWZmZXIsIHdpZHRoKTsKCQkJCX0KCQkJfQoJCQlicmVhazsKCgkJCWNhc2UgODoKCQkJewoJCQkJZm9yIChpbnQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZThUbzI0KGJ1ZmZlciwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoLCBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpKTsKCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUyNFRvOChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIGJ1ZmZlciwgd2lkdGgpOwoJCQkJfQoJCQl9CgkJCWJyZWFrOwoKCQl9CgkJZnJlZShidWZmZXIpOwoKCQlyZXR1cm4gbmV3X2RpYjsKCgl9IAoJCgkvLyBDb252ZXJ0IHRoZSBiaXRtYXAgdG8gOC1iaXQgZ3JleXNjYWxlCglyZXR1cm4gRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKGRpYik7Cn0K