LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaWZuZGVmIF9TVlhfQk9YSVRFTV9IWFgKI2RlZmluZSBfU1ZYX0JPWElURU1fSFhYCgojaW5jbHVkZSA8c3ZsL3Bvb2xpdGVtLmh4eD4KI2luY2x1ZGUgPGVkaXRlbmcvYm9yZGVybGluZS5oeHg+CiNpbmNsdWRlIDxlZGl0ZW5nL2VkaXRlbmdkbGxhcGkuaD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci90YWJsZS9Cb3JkZXJMaW5lLmhwcD4KCm5hbWVzcGFjZSBydGwgeyBjbGFzcyBPVVN0cmluZzsgfQoKLy8gY2xhc3MgU3Z4Qm94SXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qCltCZXNjaHJlaWJ1bmddCkRpZXNlcyBJdGVtIGJlc2NocmVpYnQgZWluIFVtcmFuZHVuZ3NhdHRyaWJ1dCAoYWxsZSB2aWVyIEthbnRlbiB1bmQKQWJzdGFuZCBuYWNoIGlubmVuLgoqLwoKI2RlZmluZSBCT1hfTElORV9UT1AJKChzYWxfdUludDE2KTApCiNkZWZpbmUgQk9YX0xJTkVfQk9UVE9NCSgoc2FsX3VJbnQxNikxKQojZGVmaW5lIEJPWF9MSU5FX0xFRlQJKChzYWxfdUludDE2KTIpCiNkZWZpbmUgQk9YX0xJTkVfUklHSFQJKChzYWxfdUludDE2KTMpCgojZGVmaW5lIEJPWF80RElTVFNfVkVSU0lPTiAoKHNhbF91SW50MTYpMSkKCmNsYXNzIEVESVRFTkdfRExMUFVCTElDIFN2eEJveEl0ZW0gOiBwdWJsaWMgU2Z4UG9vbEl0ZW0KewoJU3Z4Qm9yZGVyTGluZSAgKnBUb3AsCgkJCQkgICAqcEJvdHRvbSwKCQkJCSAgICpwTGVmdCwKCQkJCSAgICpwUmlnaHQ7CglzYWxfdUludDE2CQkJblRvcERpc3QsCgkJCQkJbkJvdHRvbURpc3QsCgkJCQkJbkxlZnREaXN0LAoJCQkJCW5SaWdodERpc3Q7CgpwdWJsaWM6CglUWVBFSU5GTygpOwoKICAgIFN2eEJveEl0ZW0oIGNvbnN0IHNhbF91SW50MTYgbklkICk7CglTdnhCb3hJdGVtKCBjb25zdCBTdnhCb3hJdGVtICZyQ3B5ICk7Cgl+U3Z4Qm94SXRlbSgpOwoJU3Z4Qm94SXRlbSAmb3BlcmF0b3I9KCBjb25zdCBTdnhCb3hJdGVtJiByQm94ICk7CgoJLy8gInB1cmUgdmlydHVhbCBNZXRob2RlbiIgdm9tIFNmeFBvb2xJdGVtCgl2aXJ0dWFsIGludCAJCQkgb3BlcmF0b3I9PSggY29uc3QgU2Z4UG9vbEl0ZW0mICkgY29uc3Q7Cgl2aXJ0dWFsCXNhbF9Cb29sICAgICAgICAJIFF1ZXJ5VmFsdWUoIGNvbTo6c3VuOjpzdGFyOjp1bm86OkFueSYgclZhbCwgc2FsX3VJbnQ4IG5NZW1iZXJJZCA9IDAgKSBjb25zdDsKCXZpcnR1YWwJc2FsX0Jvb2wJCQkgUHV0VmFsdWUoIGNvbnN0IGNvbTo6c3VuOjpzdGFyOjp1bm86OkFueSYgclZhbCwgc2FsX3VJbnQ4IG5NZW1iZXJJZCA9IDAgKTsKCgl2aXJ0dWFsIFNmeEl0ZW1QcmVzZW50YXRpb24gR2V0UHJlc2VudGF0aW9uKCBTZnhJdGVtUHJlc2VudGF0aW9uIGVQcmVzLAoJCQkJCQkJCQlTZnhNYXBVbml0IGVDb3JlTWV0cmljLAoJCQkJCQkJCQlTZnhNYXBVbml0IGVQcmVzTWV0cmljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgJnJUZXh0LCBjb25zdCBJbnRsV3JhcHBlciAqID0gMCApIGNvbnN0OwoKCXZpcnR1YWwgU2Z4UG9vbEl0ZW0qCSBDbG9uZSggU2Z4SXRlbVBvb2wgKnBQb29sID0gMCApIGNvbnN0OwoJdmlydHVhbCBTZnhQb29sSXRlbSoJIENyZWF0ZShTdlN0cmVhbSAmLCBzYWxfdUludDE2KSBjb25zdDsKCXZpcnR1YWwgU3ZTdHJlYW0mCQkgU3RvcmUoU3ZTdHJlYW0gJiwgc2FsX3VJbnQxNiBuSXRlbVZlcnNpb24gKSBjb25zdDsKCXZpcnR1YWwgc2FsX3VJbnQxNgkJCSBHZXRWZXJzaW9uKCBzYWxfdUludDE2IG5GaWxlVmVyc2lvbiApIGNvbnN0OwoKCXZpcnR1YWwgaW50CQkJCSBTY2FsZU1ldHJpY3MoIGxvbmcgbk11bHQsIGxvbmcgbkRpdiApOwoJdmlydHVhbAlpbnQJCQkJIEhhc01ldHJpY3MoKSBjb25zdDsKCgljb25zdAlTdnhCb3JkZXJMaW5lKiBHZXRUb3AoKSAgICBjb25zdCB7IHJldHVybiBwVG9wOyB9Cgljb25zdAlTdnhCb3JkZXJMaW5lKiBHZXRCb3R0b20oKSBjb25zdCB7IHJldHVybiBwQm90dG9tOyB9Cgljb25zdAlTdnhCb3JkZXJMaW5lKiBHZXRMZWZ0KCkgICBjb25zdCB7IHJldHVybiBwTGVmdDsgfQoJY29uc3QJU3Z4Qm9yZGVyTGluZSogR2V0UmlnaHQoKSAgY29uc3QgeyByZXR1cm4gcFJpZ2h0OyB9CgoJY29uc3QJU3Z4Qm9yZGVyTGluZSogR2V0TGluZSggc2FsX3VJbnQxNiBuTGluZSApIGNvbnN0OwoKCQkvL0RpZSBQb2ludGVyIHdlcmRlbiBrb3BpZXJ0IQoJdm9pZAlTZXRMaW5lKCBjb25zdCBTdnhCb3JkZXJMaW5lKiBwTmV3LCBzYWxfdUludDE2IG5MaW5lICk7CgoJc2FsX3VJbnQxNglHZXREaXN0YW5jZSggc2FsX3VJbnQxNiBuTGluZSApIGNvbnN0OwoJc2FsX3VJbnQxNglHZXREaXN0YW5jZSgpIGNvbnN0OwoKCXZvaWQgCVNldERpc3RhbmNlKCBzYWxfdUludDE2IG5OZXcsIHNhbF91SW50MTYgbkxpbmUgKTsKCWlubGluZSB2b2lkIFNldERpc3RhbmNlKCBzYWxfdUludDE2IG5OZXcgKTsKCgkJLy9CcmVpdGUgZGVyIExpbmllbiBwbHVzIFp3aXNjaGVucmF1bSBwbHVzIEFic3RhbmQgbmFjaCBpbm5lbi4KCQkvL0pQIDA5LjA2Ljk5OiBiSWdub3JlTGluZSA9IHNhbF9UcnVlIC0+IERpc3RhbmNlIGF1Y2ggcmV0dXJuZW4sIHdlbm4KCQkvLwkJCQkJCQlrZWluZSBMaW5lIGdlc2V0enQgaXN0CglzYWxfdUludDE2IAlDYWxjTGluZVNwYWNlKCBzYWxfdUludDE2IG5MaW5lLCBzYWxfQm9vbCBiSWdub3JlTGluZSA9IHNhbF9GYWxzZSApIGNvbnN0OwogICAgc3RhdGljIGNvbTo6c3VuOjpzdGFyOjp0YWJsZTo6Qm9yZGVyTGluZSBTdnhMaW5lVG9MaW5lKCBjb25zdCBTdnhCb3JkZXJMaW5lKiBwTGluZSwgc2FsX0Jvb2wgYkNvbnZlcnQgKTsKICAgIHN0YXRpYyBzYWxfQm9vbCBMaW5lVG9TdnhMaW5lKGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnRhYmxlOjpCb3JkZXJMaW5lJiByTGluZSwgU3Z4Qm9yZGVyTGluZSYgclN2eExpbmUsIHNhbF9Cb29sIGJDb252ZXJ0KTsKfTsKCmlubGluZSB2b2lkIFN2eEJveEl0ZW06OlNldERpc3RhbmNlKCBzYWxfdUludDE2IG5OZXcgKQp7CgluVG9wRGlzdCA9IG5Cb3R0b21EaXN0ID0gbkxlZnREaXN0ID0gblJpZ2h0RGlzdCA9IG5OZXc7Cn0KCi8vIGNsYXNzIFN2eEJveEluZm9JdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKgpbQmVzY2hyZWlidW5nXQpOb2NoIGVpbiBJdGVtIGZ1ZXIgZGllIFVtcmFuZHVuZy4gRGllc2VzIEl0ZW0gaGF0IGxlZGlnbGljaCBTUy1GdW5rdGlvbmFsaXRhZXQuCkVpbmVyc2VpdHMgd2lyZCBkZW0gYWxsZ2VtZWluZW4gRGlhbG9nIG1pdCBkaWVzZW0gSXRlbSBtaXRnZXRlaWx0LCB3ZWxjaGUKTW9lZ2xpY2hrZWl0ZW4gZXIgYW5iaWV0ZW4gc29sbC4KQW5kZXJlcnNlaXRzIHdlcmRlbiB1ZWJlciBkaWVzZXMgQXR0cmlidXQgZ2dmLiBkaWUgQm9yZGVyTGluZXMgZnVlciBkaWUKaG9yaXpvbnRhbGVuIHVuZCB2ZXJ0aWthbGVuIGlubmVyZXJuIExpbmllbiB0cmFuc3BvcnRpZXJ0LgoqLwoKI2RlZmluZSBCT1hJTkZPX0xJTkVfSE9SSQkoKHNhbF91SW50MTYpMCkKI2RlZmluZSBCT1hJTkZPX0xJTkVfVkVSVAkoKHNhbF91SW50MTYpMSkKCiNkZWZpbmUgVkFMSURfVE9QCQkJMHgwMQojZGVmaW5lIFZBTElEX0JPVFRPTQkJMHgwMgojZGVmaW5lIFZBTElEX0xFRlQJCQkweDA0CiNkZWZpbmUgVkFMSURfUklHSFQJCQkweDA4CiNkZWZpbmUgVkFMSURfSE9SSQkJCTB4MTAKI2RlZmluZSBWQUxJRF9WRVJUCQkJMHgyMAojZGVmaW5lIFZBTElEX0RJU1RBTkNFCQkweDQwCiNkZWZpbmUgVkFMSURfRElTQUJMRQkJMHg4MAoKY2xhc3MgRURJVEVOR19ETExQVUJMSUMgU3Z4Qm94SW5mb0l0ZW0gOiBwdWJsaWMgU2Z4UG9vbEl0ZW0KewoJU3Z4Qm9yZGVyTGluZSogcEhvcmk7ICAgLy9pbm5lcmUgaG9yaXpvbnRhbGUgTGluaWUKCVN2eEJvcmRlckxpbmUqIHBWZXJ0OyAgIC8vaW5uZXJlIHZlcnRpa2FsZSBMaW5pZQoKICAgIGJvb2wgICAgICAgICAgICAgICAgbWJFbmFibGVIb3I7ICAgLy8vIHRydWUgPSBFbmFibGUgaW5uZXIgaG9yaXpvbmFsIGxpbmUuCiAgICBib29sICAgICAgICAgICAgICAgIG1iRW5hYmxlVmVyOyAgIC8vLyB0cnVlID0gRW5hYmxlIGlubmVyIHZlcnRpY2FsIGxpbmUuCgoJLyoKCSB6LlouIG51ciBmdWVyIFN0YXJXcml0ZXI6IEFic3RhbmQgbmFjaCBpbm5lbiB2b24gU3Z4Qm94SXRlbS4KCSBXZW5uIGRlciBBYnN0YW5kIGdld3VlbnNjaHQgaXN0LCBzbyBtdXNzIGRhcyBGZWxkIGZ1ZXIgZGVuIEFic3RhbmQgdm9tCgkgRGlhbG9nIGZyZWlnZXNjaGFsdGV0IHdlcmRlbi4gbkRlZkRpc3QgaXN0IGFscyBEZWZhdWx0d2VydCBhbnp1c2VoZW4uCgkgV2VubiBpcmdlbmRlaW5lCUxpbmllIGVpbmdlc2NoYWx0IGlzdCBvZGVyIHdpcmQsIHNvIG11c3MgZGllc2VyCgkgQWJzdGFuZCBkZWZhdWx0ZXQgd2VyZGVuLiBiTWluRGlzdCBnaWJ0IGFuLCBvYiBkZXIgV2VydCBkdXJjaCBkZW4KCSBBbndlbmRlciB1bnRlcnNjaHJpdHRlbiB3ZXJkZW4gZGFyZi4gTWl0IG5EaXN0IHdpcmQgZGVyIGFrdHVlbGxlCgkgQWJzdGFuZCB2b24gZGVyIEFwcCB6dW0gRGlhbG9nIHVuZCB6dXJ1ZWNrIHRyYW5zcG9ydGllcnQuCgkqLwoKCXNhbF9Cb29sCWJEaXN0ICAgICAgOjE7ICAvLyBzYWxfVHJ1ZSwgQWJzdGFuZCBmcmVpc2NoYWx0ZW4uCglzYWxfQm9vbAliTWluRGlzdCAgIDoxOyAgLy8gc2FsX1RydWUsIEFic3RhbmQgZGFyZiBuaWNodCB1bnRlcnNjaHJpdHRlbiB3ZXJkZW4uCgoJc2FsX3VJbnQ4CW5WYWxpZEZsYWdzOwkvLyAwMDAwIDAwMDAKCQkJCQkJCS8vILOzs7Mgs7OzwMQgVkFMSURfVE9QCgkJCQkJCQkvLyCzs7OzILOzwMTEIFZBTElEX0JPVFRPTQoJCQkJCQkJLy8gs7OzsyCzwMTExCBWQUxJRF9MRUZUCgkJCQkJCQkvLyCzs7OzIMDExMTEIFZBTElEX1JJR0hUCgkJCQkJCQkvLyCzs7PAxMTExMTEIFZBTElEX0hPUkkKCQkJCQkJCS8vILOzwMTExMTExMQgVkFMSURfVkVSVAoJCQkJCQkJLy8gs8DExMTExMTExCBWQUxJRF9ESVNUCgkJCQkJCQkvLyDAxMTExMTExMTEIFZBTElEX0RJU0FCTEUKCglzYWxfdUludDE2CW5EZWZEaXN0OyAgICAgICAvLyBEZXIgRGVmYXVsdC0gYnp3LiBNaW5pbWFsYWJzdGFuZC4KCnB1YmxpYzoKCVRZUEVJTkZPKCk7CgogICAgU3Z4Qm94SW5mb0l0ZW0oIGNvbnN0IHNhbF91SW50MTYgbklkICk7CglTdnhCb3hJbmZvSXRlbSggY29uc3QgU3Z4Qm94SW5mb0l0ZW0gJnJDcHkgKTsKCX5TdnhCb3hJbmZvSXRlbSgpOwoJU3Z4Qm94SW5mb0l0ZW0gJm9wZXJhdG9yPSggY29uc3QgU3Z4Qm94SW5mb0l0ZW0gJnJDcHkgKTsKCgkvLyAicHVyZSB2aXJ0dWFsIE1ldGhvZGVuIiB2b20gU2Z4UG9vbEl0ZW0KCXZpcnR1YWwgaW50IAkJCSBvcGVyYXRvcj09KCBjb25zdCBTZnhQb29sSXRlbSYgKSBjb25zdDsKCXZpcnR1YWwgU2Z4SXRlbVByZXNlbnRhdGlvbiBHZXRQcmVzZW50YXRpb24oIFNmeEl0ZW1QcmVzZW50YXRpb24gZVByZXMsCgkJCQkJCQkJCVNmeE1hcFVuaXQgZUNvcmVNZXRyaWMsCgkJCQkJCQkJCVNmeE1hcFVuaXQgZVByZXNNZXRyaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAmclRleHQsIGNvbnN0IEludGxXcmFwcGVyICogPSAwICkgY29uc3Q7Cgl2aXJ0dWFsCXNhbF9Cb29sICAgICAgICAJIFF1ZXJ5VmFsdWUoIGNvbTo6c3VuOjpzdGFyOjp1bm86OkFueSYgclZhbCwgc2FsX3VJbnQ4IG5NZW1iZXJJZCA9IDAgKSBjb25zdDsKCXZpcnR1YWwJc2FsX0Jvb2wJCQkgUHV0VmFsdWUoIGNvbnN0IGNvbTo6c3VuOjpzdGFyOjp1bm86OkFueSYgclZhbCwgc2FsX3VJbnQ4IG5NZW1iZXJJZCA9IDAgKTsKCgl2aXJ0dWFsIFNmeFBvb2xJdGVtKglDbG9uZSggU2Z4SXRlbVBvb2wgKnBQb29sID0gMCApIGNvbnN0OwoJdmlydHVhbCBTZnhQb29sSXRlbSoJQ3JlYXRlKFN2U3RyZWFtICYsIHNhbF91SW50MTYpIGNvbnN0OwoJdmlydHVhbCBTdlN0cmVhbSYJCVN0b3JlKFN2U3RyZWFtICYsIHNhbF91SW50MTYgbkl0ZW1WZXJzaW9uICkgY29uc3Q7Cgl2aXJ0dWFsIGludAkJCQkgU2NhbGVNZXRyaWNzKCBsb25nIG5NdWx0LCBsb25nIG5EaXYgKTsKCXZpcnR1YWwJaW50CQkJCSBIYXNNZXRyaWNzKCkgY29uc3Q7CgoJY29uc3QgU3Z4Qm9yZGVyTGluZSoJR2V0SG9yaSgpIGNvbnN0IHsgcmV0dXJuIHBIb3JpOyB9Cgljb25zdCBTdnhCb3JkZXJMaW5lKglHZXRWZXJ0KCkgY29uc3QgeyByZXR1cm4gcFZlcnQ7IH0KCgkvL0RpZSBQb2ludGVyIHdlcmRlbiBrb3BpZXJ0IQoJdm9pZAkJCQkJU2V0TGluZSggY29uc3QgU3Z4Qm9yZGVyTGluZSogcE5ldywgc2FsX3VJbnQxNiBuTGluZSApOwoKICAgIHNhbF9Cb29sICAgIElzVGFibGUoKSBjb25zdCAgICAgICAgICAgICB7IHJldHVybiBtYkVuYWJsZUhvciAmJiBtYkVuYWJsZVZlcjsgfQogICAgdm9pZCAgICBTZXRUYWJsZSggc2FsX0Jvb2wgYk5ldyApICAgICAgIHsgbWJFbmFibGVIb3IgPSBtYkVuYWJsZVZlciA9IGJOZXc7IH0KCiAgICBpbmxpbmUgYm9vbCAgICAgICAgIElzSG9yRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1iRW5hYmxlSG9yOyB9CiAgICBpbmxpbmUgdm9pZCAgICAgICAgIEVuYWJsZUhvciggYm9vbCBiRW5hYmxlICkgeyBtYkVuYWJsZUhvciA9IGJFbmFibGU7IH0KICAgIGlubGluZSBib29sICAgICAgICAgSXNWZXJFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbWJFbmFibGVWZXI7IH0KICAgIGlubGluZSB2b2lkICAgICAgICAgRW5hYmxlVmVyKCBib29sIGJFbmFibGUgKSB7IG1iRW5hYmxlVmVyID0gYkVuYWJsZTsgfQoKCXNhbF9Cb29sIAlJc0Rpc3QoKSBjb25zdAkJCQl7IHJldHVybiBiRGlzdDsgfQoJdm9pZCAJU2V0RGlzdCggc2FsX0Jvb2wgYk5ldyApCQl7IGJEaXN0ID0gYk5ldzsgfQoJc2FsX0Jvb2wgCUlzTWluRGlzdCgpIGNvbnN0CQkJeyByZXR1cm4gYk1pbkRpc3Q7IH0KCXZvaWQgCVNldE1pbkRpc3QoIHNhbF9Cb29sIGJOZXcgKQkJeyBiTWluRGlzdCA9IGJOZXc7IH0KCXNhbF91SW50MTYJR2V0RGVmRGlzdCgpIGNvbnN0CQkJeyByZXR1cm4gbkRlZkRpc3Q7IH0KCXZvaWQgCVNldERlZkRpc3QoIHNhbF91SW50MTYgbk5ldyApCXsgbkRlZkRpc3QgPSBuTmV3OyB9CgoJc2FsX0Jvb2wJCQkJCUlzVmFsaWQoIHNhbF91SW50OCBuVmFsaWQgKSBjb25zdAoJCQkJCQkJCXsgcmV0dXJuICggblZhbGlkRmxhZ3MgJiBuVmFsaWQgKSA9PSBuVmFsaWQ7IH0KCXZvaWQgCQkJCQlTZXRWYWxpZCggc2FsX3VJbnQ4IG5WYWxpZCwgc2FsX0Jvb2wgYlZhbGlkID0gc2FsX1RydWUgKQoJCQkJCQkJCXsgYlZhbGlkID8gKCBuVmFsaWRGbGFncyB8PSBuVmFsaWQgKQoJCQkJCQkJCQkJIDogKCBuVmFsaWRGbGFncyAmPSB+blZhbGlkICk7IH0KCXZvaWQJCQkJCVJlc2V0RmxhZ3MoKTsKfTsKI2VuZGlmCgo=