Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCiAqCQkJCUdVSS9Nb3RpZiBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCiAqCQkJCU1hY2ludG9zaCBwb3J0IGJ5IERhbnkgU3QtQW1hbnQKICoJCQkJCSAgICAgIGFuZCBBeGVsIEtpZWxob3JuCiAqCQkJCVBvcnQgdG8gTVBXIGJ5IEJlcm5oYXJkIFByn21tZXIKICoJCQkJSW5pdGlhbCBDYXJib24gcG9ydCBieSBBbW1vbiBTa2lkbW9yZQogKgogKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCiAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgogKi8KCi8qCiAqIE5PVEU6IENvbW1lbnQgbWVudGlvbm5pbmcgRkFRIHJlZmVyIHRvIHRoZSBib29rOgogKiAgICAgICAiTWFjd29ybGQgTWFjIFByb2dyYW1taW5nIEZBUXMiIGZyb20gIklERyBCb29rcyIKICovCgovKgogKiBXQVJOSU5HOiBWaW0gbXVzdCBiZSBhYmxlIHRvIGNvbXBpbGUgd2l0aG91dCBDYXJib24KICoJICAgIEFzIHRoZSBkZXNpcmVkIG1pbmltdW0gcmVxdWlyZW1lbnQgYXJlIGNpcmNhIFN5c3RlbSA3CiAqCSAgICAoSSB3YW50IHRvIHJ1biBpdCBvbiBteSBNYWMgQ2xhc3NpYykgKERhbnkpCiAqLwoKLyoKICogVE9ETzogQ2hhbmdlIHN0aWxsIHRvIG1lcmdlIGZyb20gdGhlIG1hY3ZpbSdzIGlEaXNrCiAqCiAqIGVycm9yX2dhLCBtY2hfZXJybXNnLCBOYXZpZ2F0aW9uJ3MgY2hhbmdlcyBpbiBndWlfbWNoX2Jyb3dzZQogKiB1c2VzIG9mIE1lbnVJdGVtSW5kZXgsIGNoYW5nZXMgaW4gZ3VpX21jaF9zZXRfc2hlbGxzaXplLAogKiBTY3JhcE1hbmFnZXIgZXJyb3IgaGFuZGxpbmcuCiAqIENvbW1lbnRzIGFib3V0IGZ1bmN0aW9uIHJlbWFpbmluZyB0byBDYXJib25pemUuCiAqCiAqLwoKLyogVE9ETzogZmluZCB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyAoRGFueSkgKi8KI2lmIDAKIyAgaWYgISBUQVJHRVRfQVBJX01BQ19DQVJCT04KLyogRW5hYmxlIHRoZSBuZXcgQVBJIGZ1bmN0aW9ucyBldmVuIHdoZW4gbm90IGNvbXBpbGluZyBmb3IgQ2FyYm9uICovCi8qIEFwcGxlIHJlY29tZW5kcyBVbml2ZXJzYWwgSW50ZXJmYWNlIDMuMy4yIG9yIGxhdGVyICovCiMgIGRlZmluZSBPUEFRVUVfVE9PTEJPWF9TVFJVQ1RTCQkxCiMgIGRlZmluZSBBQ0NFU1NPUl9DQUxMU19BUkVfRlVOQ1RJT05TCTEKLyogSGVscCBNZW51IG5vdCBzdXBwb3J0ZWQgYnkgQ2FyYm9uICovCiMgIGRlZmluZSBVU0VfSEVMUE1FTlUKIyBlbmRpZgojZW5kaWYKCiNpbmNsdWRlIDxEZXZpY2VzLmg+IC8qIGluY2x1ZGVkIGZpcnN0IHRvIGF2b2lkIENSIHByb2JsZW1zICovCiNpbmNsdWRlICJ2aW0uaCIKCi8qIEVuYWJsZSBDb250ZXh0dWFsIE1lbnUgU3VwcG9ydCAqLwojaWYgVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+PSAweDAzMjAKIyBkZWZpbmUgVVNFX0NUUkxDTElDS01FTlUKI2VuZGlmCgovKiBQdXQgVmltIEhlbHAgaW4gTWFjT1MgSGVscCAqLwojZGVmaW5lIFVTRV9IRUxQTUVOVQoKLyogRW5hYmxlIEFFVkVOVCAqLwojZGVmaW5lIFVTRV9BRVZFTlQKCi8qIENvbXBpbGUgYXMgQ29kZVdhcmlvciBFeHRlcm5hbCBFZGl0b3IgKi8KI2lmIGRlZmluZWQoRkVBVF9DV19FRElUT1IpICYmICFkZWZpbmVkKFVTRV9BRVZFTlQpCiMgZGVmaW5lIFVTRV9BRVZFTlQgLyogTmVlZCBBcHBsZSBFdmVudCBTdXBwb3J0ICovCiNlbmRpZgoKLyogVGhlIFZJTSBjcmVhdG9yIGlzIENvZGVXYXJpb3Igc3BlY2lmaWMgKi8KI2lmICEoZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgfHwgZGVmaW5lZChfX0FQUExFX0NDX18pKQojIGRlZmluZSBVU0VfVklNX0NSRUFUT1JfSUQKI2Vsc2UKIyBpZiAwIC8qIFdhcyB0aGlzIHVzZWZ1bGwgZm9yIHNvbWUgY29tcGlsZXI/IChEYW55KSAqLwpzdGF0aWMgICAgT1NUeXBlCV9mY3JlYXRvciA9ICdWSU0hJzsKc3RhdGljICAgIE9TVHlwZQlfZnR5cGUgPSAnVEVYVCc7CiMgZW5kaWYKI2VuZGlmCgovKiBWaW0ncyBTY3JhcCBmbGF2b3IuICovCiNkZWZpbmUgVklNU0NSQVBGTEFWT1IgJ1ZJTSEnCgovKiBDQVJCT04gdmVyc2lvbiBvbmx5IHRlc3RlZCB3aXRoIFByb2plY3QgQnVpbGRlciB1bmRlciBNYWNPUyBYICovCiN1bmRlZiBVU0VfQ0FSQk9OSVpFRAojaWYgKGRlZmluZWQoX19BUFBMRV9DQ19fKSB8fCBkZWZpbmVkKF9fTVJDX18pKSAmJiBkZWZpbmVkKFRBUkdFVF9BUElfTUFDX0NBUkJPTikKIyBpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KIyAgZGVmaW5lIFVTRV9DQVJCT05JWkVECiMgZW5kaWYKI2VuZGlmCgojdW5kZWYgVVNFX01PVVNFV0hFRUwKI2lmIGRlZmluZWQoTUFDT1NfWCkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKIyBkZWZpbmUgVVNFX01PVVNFV0hFRUwKc3RhdGljIEV2ZW50SGFuZGxlclVQUCBtb3VzZVdoZWVsSGFuZGxlclVQUCA9IE5VTEw7CiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKIyBkZWZpbmUgVVNFX0NBUkJPTktFWUhBTkRMRVIKc3RhdGljIEV2ZW50SGFuZGxlclVQUCBrZXlFdmVudEhhbmRsZXJVUFAgPSBOVUxMOwovKiBEZWZpbmVkIGluIG9zX21hY19jb252LmMgKi8KZXh0ZXJuIGNoYXJfdSAqbWFjX3V0ZjE2X3RvX2VuYyBfX0FSR1MoKFVuaUNoYXIgKmZyb20sIHNpemVfdCBmcm9tTGVuLCBzaXplX3QgKmFjdHVhbExlbikpOwpleHRlcm4gVW5pQ2hhciAqbWFjX2VuY190b191dGYxNiBfX0FSR1MoKGNoYXJfdSAqZnJvbSwgc2l6ZV90IGZyb21MZW4sIHNpemVfdCAqYWN0dWFsTGVuKSk7CmV4dGVybiBDRlN0cmluZ1JlZiBtYWNfZW5jX3RvX2Nmc3RyaW5nIF9fQVJHUygoY2hhcl91ICpmcm9tLCBzaXplX3QgZnJvbUxlbikpOwojZW5kaWYKCiNpZmRlZiBNQUNPU19YClNJbnQzMiBnTWFjU3lzdGVtVmVyc2lvbjsKI2VuZGlmCgovKiBEZWJ1Z2dpbmcgZmVhdHVyZTogc3RhcnQgVmltIHdpbmRvdyBPRkZTRVRlZCAqLwojdW5kZWYgVVNFX09GRlNFVEVEX1dJTkRPVwoKLyogRGVidWdnaW5nIGZlYXR1cmU6IHVzZSBDb2RlV2FyaW9yIFNJT1VYICovCiN1bmRlZiBVU0VfU0lPVVgKCgovKiBJbmNsdWRlIHNvbWUgZmlsZS4gVE9ETzogbW92ZSBpbnRvIG9zX21hYy5oICovCiNpbmNsdWRlIDxNZW51cy5oPgojaW5jbHVkZSA8UmVzb3VyY2VzLmg+CiNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCiNpbmNsdWRlIDxTdGFuZGFyZEZpbGUuaD4KI2luY2x1ZGUgPFRyYXBzLmg+CiNlbmRpZgojaW5jbHVkZSA8QmFsbG9vbnMuaD4KI2luY2x1ZGUgPFByb2Nlc3Nlcy5oPgojaWZkZWYgVVNFX0FFVkVOVAojIGluY2x1ZGUgPEFwcGxlRXZlbnRzLmg+CiMgaW5jbHVkZSA8QUVSZWdpc3RyeS5oPgojZW5kaWYKI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCiMgaW5jbHVkZSA8R2VzdGFsdC5oPgojZW5kaWYKI2lmZGVmIFVTRV9TSU9VWAojIGluY2x1ZGUgPHN0ZGlvLmg+CiMgaW5jbHVkZSA8c2lvdXguaD4KIyBpbmNsdWRlIDxjb25zb2xlLmg+CiNlbmRpZgojaWYgVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+PSAweDAzMzAKIyBpbmNsdWRlIDxDb250cm9sRGVmaW5pdGlvbnMuaD4KIyBpbmNsdWRlIDxOYXZpZ2F0aW9uLmg+ICAvKiBOYXZpZ2F0aW9uIG9ubHkgcGFydCBvZiA/PyAqLwojZW5kaWYKCiNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgMAovKiBOZXcgSGVscCBJbnRlcmZhY2UgZm9yIE1hYywgbm90IGltcGxlbWVudGVkIHlldC4qLwojIGluY2x1ZGUgPE1hY0hlbHAuaD4KI2VuZGlmCgovKgogKiBUcmFuc2xhdGUgbmV3IG5hbWUgdG8gb2xkIG9uZXMKICogTmV3IGZ1bmN0aW9uIG9ubHkgYXZhaWxhYmxlIGluIE1hY09TIDguNSwKICogU28gdXNlIG9sZCBvbmUgdG8gYmUgY29tcGF0aWJsZSBiYWNrIHRvIFN5c3RlbSA3CiAqLwojaWZuZGVmIFVTRV9DQVJCT05JWkVECiMgdW5kZWYgIEVuYWJsZU1lbnVJdGVtCiMgZGVmaW5lIEVuYWJsZU1lbnVJdGVtIEVuYWJsZUl0ZW0KIyB1bmRlZiAgRGlzYWJsZU1lbnVJdGVtCiMgZGVmaW5lIERpc2FibGVNZW51SXRlbSBEaXNhYmxlSXRlbQojZW5kaWYKCi8qIENhcmJvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBHZXQvU2V0Q29udHJvbGwgZnVuY3Rpb25zLAogKiB1c2UgR2V0L1NldENvbnRyb2wzMkJpdCBpbnN0ZWFkIGFuZCByZW5hbWUgZm9yIG5vbi1jYXJib24KICogc3lzdGVtcy4KICovCgojaWZuZGVmIFVTRV9DQVJCT05JWkVECiMgdW5kZWYgICAgU2V0Q29udHJvbDMyQml0TWF4aW11bQojIGRlZmluZSAgIFNldENvbnRyb2wzMkJpdE1heGltdW0gU2V0Q29udHJvbE1heGltdW0KIyB1bmRlZiAgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtCiMgZGVmaW5lICAgU2V0Q29udHJvbDMyQml0TWluaW11bSBTZXRDb250cm9sTWluaW11bQojIHVuZGVmICAgIFNldENvbnRyb2wzMkJpdFZhbHVlCiMgZGVmaW5lICAgU2V0Q29udHJvbDMyQml0VmFsdWUgU2V0Q29udHJvbFZhbHVlCiMgdW5kZWYgICAgR2V0Q29udHJvbDMyQml0VmFsdWUKIyBkZWZpbmUgICBHZXRDb250cm9sMzJCaXRWYWx1ZSBHZXRDb250cm9sVmFsdWUKI2VuZGlmCgovKgogKiA/Pz8KICovCgojZGVmaW5lIGtOb3RoaW5nIDAKI2RlZmluZSBrQ3JlYXRlRW1wdHkgMiAvKjEqLwojZGVmaW5lIGtDcmVhdGVSZWN0IDIKI2RlZmluZSBrRGVzdHJveSAzCgovKgogKiBEYW55OiBEb24ndCBsaWtlIHRob3NlLi4uCiAqLwoKI2RlZmluZSB0b3BMZWZ0KHIpCSgoKFBvaW50KikmKHIpKVswXSkKI2RlZmluZSBib3RSaWdodChyKQkoKChQb2ludCopJihyKSlbMV0pCgoKLyogVGltZSBvZiBsYXN0IG1vdXNlIGNsaWNrLCB0byBkZXRlY3QgZG91YmxlLWNsaWNrICovCnN0YXRpYyBsb25nIGxhc3RNb3VzZVRpY2sgPSAwOwoKLyogPz8/ICovCnN0YXRpYyBSZ25IYW5kbGUgY3Vyc29yUmduOwpzdGF0aWMgUmduSGFuZGxlIGRyYWdSZ247CnN0YXRpYyBSZWN0IGRyYWdSZWN0OwpzdGF0aWMgc2hvcnQgZHJhZ1JlY3RFbmJsOwpzdGF0aWMgc2hvcnQgZHJhZ1JlY3RDb250cm9sOwoKLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgd2hlbiB3YWl0aW5nIGZvciBhbiBldmVudCwgd2hpY2ggaXMgdGhlIG9ubHkgbW9tZW50CiAqIHNjcm9sbGJhciBkcmFnZ2luZyBjYW4gYmUgZG9uZSBkaXJlY3RseS4gIEl0J3Mgbm90IGFsbG93ZWQgd2hpbGUgY29tbWFuZHMKICogYXJlIGV4ZWN1dGVkLCBiZWNhdXNlIGl0IG1heSBtb3ZlIHRoZSBjdXJzb3IgYW5kIHRoYXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQKICogcHJvYmxlbXMgKGUuZy4sIHdoaWxlICI6cyIgaXMgd29ya2luZykuCiAqLwpzdGF0aWMgaW50IGFsbG93X3Njcm9sbGJhciA9IEZBTFNFOwoKLyogTGFzdCBtb3VzZSBjbGljayBjYXVzZWQgY29udGV4dHVhbCBtZW51LCAodG8gcHJvdmlkZSBwcm9wZXIgcmVsZWFzZSkgKi8KI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCnN0YXRpYyBzaG9ydCBjbGlja0lzUG9wdXA7CiNlbmRpZgoKLyogRmVlZGJhY2sgQWN0aW9uIGZvciBTY3JvbGxiYXIgKi8KQ29udHJvbEFjdGlvblVQUCBnU2Nyb2xsQWN0aW9uOwpDb250cm9sQWN0aW9uVVBQIGdTY3JvbGxEcmFnOwoKLyogS2VlcGluZyB0cmFjayBvZiB3aGljaCBzY3JvbGxiYXIgaXMgYmVpbmcgZHJhZ2dlZCAqLwpzdGF0aWMgQ29udHJvbEhhbmRsZSBkcmFnZ2VkX3NiID0gTlVMTDsKCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKE1BQ09TX1gpCnN0YXRpYyBzdHJ1Y3QKewogICAgRk1Gb250RmFtaWx5IGZhbWlseTsKICAgIEZNRm9udFNpemUgc2l6ZTsKICAgIEZNRm9udFN0eWxlIHN0eWxlOwogICAgQm9vbGVhbiBpc1BhbmVsVmlzaWJsZTsKfSBnRm9udFBhbmVsSW5mbyA9IHsgMCwgMCwgMCwgZmFsc2UgfTsKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQojIGRlZmluZSBVU0VfQVRTVUlfRFJBV0lORwpBVFNVU3R5bGUgICBnRm9udFN0eWxlOwpCb29sZWFuCSAgICBnSXNGb250RmFsbGJhY2tTZXQ7CiNlbmRpZgoKLyoKICogVGhlIFF1aWNrZHJhdyBnbG9iYWwgaXMgcHJlZGVmaW5lZCBpbiBDb2RlV2FyaW9yCiAqIGJ1dCBpcyBub3QgaW4gQXBwbGUgTVBXCiAqLwojaWYgKGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pKQojIGlmICEoZGVmaW5lZChUQVJHRVRfQVBJX01BQ19DQVJCT04pICYmIFRBUkdFVF9BUElfTUFDX0NBUkJPTikKUURHbG9iYWxzIHFkOwojIGVuZGlmCiNlbmRpZgoKLyogQ29sb3JzIE1hY3JvcyAqLwojZGVmaW5lIFJHQihyLGcsYikJKChyKSA8PCAxNikgKyAoKGcpIDw8IDgpICsgKGIpCiNkZWZpbmUgUmVkKGMpCQkoKGMgJiAweDAwRkYwMDAwKSA+PiAxNikKI2RlZmluZSBHcmVlbihjKQkoKGMgJiAweDAwMDBGRjAwKSA+PiAgOCkKI2RlZmluZSBCbHVlKGMpCQkoKGMgJiAweDAwMDAwMEZGKSA+PiAgMCkKCi8qIEtleSBtYXBwaW5nICovCgojZGVmaW5lIHZrX0VzYwkJMHgzNQkvKiAtPiAxQiAqLwoKI2RlZmluZSB2a19GMQkJMHg3QQkvKiAtPiAxMCAqLwojZGVmaW5lIHZrX0YyCQkweDc4ICAvKjB4NjMqLwojZGVmaW5lIHZrX0YzCQkweDYzICAvKjB4NzYqLwojZGVmaW5lIHZrX0Y0CQkweDc2ICAvKjB4NjAqLwojZGVmaW5lIHZrX0Y1CQkweDYwICAvKjB4NjEqLwojZGVmaW5lIHZrX0Y2CQkweDYxICAvKjB4NjIqLwojZGVmaW5lIHZrX0Y3CQkweDYyICAvKjB4NjMqLyAgLyo/Ki8KI2RlZmluZSB2a19GOAkJMHg2NAojZGVmaW5lIHZrX0Y5CQkweDY1CiNkZWZpbmUgdmtfRjEwCQkweDZECiNkZWZpbmUgdmtfRjExCQkweDY3CiNkZWZpbmUgdmtfRjEyCQkweDZGCiNkZWZpbmUgdmtfRjEzCQkweDY5CiNkZWZpbmUgdmtfRjE0CQkweDZCCiNkZWZpbmUgdmtfRjE1CQkweDcxCgojZGVmaW5lIHZrX0NscgkJMHg0NwkvKiAtPiAxQiAoRVNDKSAqLwojZGVmaW5lIHZrX0VudGVyCTB4NEMJLyogLT4gMDMgKi8KCiNkZWZpbmUgdmtfU3BhY2UJMHgzMQkvKiAtPiAyMCAqLwojZGVmaW5lIHZrX1RhYgkJMHgzMAkvKiAtPiAwOSAqLwojZGVmaW5lIHZrX1JldHVybgkweDI0CS8qIC0+IDBEICovCi8qIFRoaXMgaXMgd3JvbmcgZm9yIE9TWCwgd2hhdCBpcyBpdCBmb3I/ICovCiNkZWZpbmUgdmtfRGVsZXRlCTBYMDgJLyogLT4gMDggQmFja1NwYWNlICovCgojZGVmaW5lIHZrX0hlbHAJCTB4NzIJLyogLT4gMDUgKi8KI2RlZmluZSB2a19Ib21lCQkweDczCS8qIC0+IDAxICovCiNkZWZpbmUJdmtfUGFnZVVwCTB4NzQJLyogLT4gMEQgKi8KI2RlZmluZSB2a19Gd2REZWxldGUJMHg3NQkvKiAtPiA3RiAqLwojZGVmaW5lCXZrX0VuZAkJMHg3NwkvKiAtPiAwNCAqLwojZGVmaW5lIHZrX1BhZ2VEb3duCTB4NzkJLyogLT4gMEMgKi8KCiNkZWZpbmUgdmtfVXAJCTB4N0UJLyogLT4gMUUgKi8KI2RlZmluZSB2a19Eb3duCQkweDdECS8qIC0+IDFGICovCiNkZWZpbmUJdmtfTGVmdAkJMHg3QgkvKiAtPiAxQyAqLwojZGVmaW5lIHZrX1JpZ2h0CTB4N0MJLyogLT4gMUQgKi8KCiNkZWZpbmUgdmtfVW5kbwkJdmtfRjEKI2RlZmluZSB2a19DdXQJCXZrX0YyCiNkZWZpbmUJdmtfQ29weQkJdmtfRjMKI2RlZmluZQl2a19QYXN0ZQl2a19GNAojZGVmaW5lIHZrX1ByaW50U2NyZWVuCXZrX0YxMwojZGVmaW5lIHZrX1NDcm9sbExvY2sJdmtfRjE0CiNkZWZpbmUJdmtfUGF1c2UJdmtfRjE1CiNkZWZpbmUJdmtfTnVtTG9jawl2a19DbHIKI2RlZmluZSB2a19JbnNlcnQJdmtfSGVscAoKI2RlZmluZSBLZXlTeW0JY2hhcgoKc3RhdGljIHN0cnVjdAp7CiAgICBLZXlTeW0gIGtleV9zeW07CiAgICBjaGFyX3UgIHZpbV9jb2RlMDsKICAgIGNoYXJfdSAgdmltX2NvZGUxOwp9IHNwZWNpYWxfa2V5c1tdID0KewogICAge3ZrX1VwLAkJJ2snLCAndSd9LAogICAge3ZrX0Rvd24sCQknaycsICdkJ30sCiAgICB7dmtfTGVmdCwJCSdrJywgJ2wnfSwKICAgIHt2a19SaWdodCwJCSdrJywgJ3InfSwKCiAgICB7dmtfRjEsCQknaycsICcxJ30sCiAgICB7dmtfRjIsCQknaycsICcyJ30sCiAgICB7dmtfRjMsCQknaycsICczJ30sCiAgICB7dmtfRjQsCQknaycsICc0J30sCiAgICB7dmtfRjUsCQknaycsICc1J30sCiAgICB7dmtfRjYsCQknaycsICc2J30sCiAgICB7dmtfRjcsCQknaycsICc3J30sCiAgICB7dmtfRjgsCQknaycsICc4J30sCiAgICB7dmtfRjksCQknaycsICc5J30sCiAgICB7dmtfRjEwLAkJJ2snLCAnOyd9LAoKICAgIHt2a19GMTEsCQknRicsICcxJ30sCiAgICB7dmtfRjEyLAkJJ0YnLCAnMid9LAogICAge3ZrX0YxMywJCSdGJywgJzMnfSwKICAgIHt2a19GMTQsCQknRicsICc0J30sCiAgICB7dmtfRjE1LAkJJ0YnLCAnNSd9LAoKLyogIHtYS19IZWxwLAkJJyUnLCAnMSd9LCAqLwovKiAge1hLX1VuZG8sCQknJicsICc4J30sICovCi8qICB7WEtfQmFja1NwYWNlLAknaycsICdiJ30sICovCiNpZm5kZWYgTUFDT1NfWAogICAge3ZrX0RlbGV0ZSwJCSdrJywgJ2InfSwKI2VuZGlmCiAgICB7dmtfSW5zZXJ0LAkJJ2snLCAnSSd9LAogICAge3ZrX0Z3ZERlbGV0ZSwJJ2snLCAnRCd9LAogICAge3ZrX0hvbWUsCQknaycsICdoJ30sCiAgICB7dmtfRW5kLAkJJ0AnLCAnNyd9LAovKiAge1hLX1ByaW9yLAkJJ2snLCAnUCd9LCAqLwovKiAge1hLX05leHQsCQknaycsICdOJ30sICovCi8qICB7WEtfUHJpbnQsCQknJScsICc5J30sICovCgogICAge3ZrX1BhZ2VVcCwJCSdrJywgJ1AnfSwKICAgIHt2a19QYWdlRG93biwJJ2snLCAnTid9LAoKICAgIC8qIEVuZCBvZiBsaXN0IG1hcmtlcjogKi8KICAgIHsoS2V5U3ltKTAsCQkwLCAwfQp9OwoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEZvcndhcmQgZGVjbGFyYXRpb24gKGZvciB0aG9zZSBuZWVkZWQpCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCiNpZmRlZiBVU0VfQUVWRU5UCk9TRXJyIEhhbmRsZVVudXNlZFBhcm1zKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCk7CiNlbmRpZgoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvbnZlcnNpb24gVXRpbGl0eQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBDMlBhc2NhbF9zYXZlCiAqCiAqIEFsbG9jYXRlIG1lbW9yeSBhbmQgY29udmVydCB0aGUgQy1TdHJpbmcgcGFzc2VkIGluCiAqIGludG8gYSBwYXNjYWwgc3RyaW5nCiAqCiAqLwoKY2hhcl91ICpDMlBhc2NhbF9zYXZlKGNoYXJfdSAqQ3N0cmluZykKewogICAgY2hhcl91ICAqUGFzY2FsU3RyaW5nOwogICAgaW50CSAgICBsZW47CgogICAgaWYgKENzdHJpbmcgPT0gTlVMTCkKCXJldHVybiBOVUxMOwoKICAgIGxlbiA9IFNUUkxFTihDc3RyaW5nKTsKCiAgICBpZiAobGVuID4gMjU1KSAvKiBUcnVuY2F0ZSBpZiBuZWNlc3NhcnkgKi8KCWxlbiA9IDI1NTsKCiAgICBQYXNjYWxTdHJpbmcgPSBhbGxvYyhsZW4gKyAxKTsKICAgIGlmIChQYXNjYWxTdHJpbmcgIT0gTlVMTCkKICAgIHsKCW1jaF9tZW1tb3ZlKFBhc2NhbFN0cmluZyArIDEsIENzdHJpbmcsIGxlbik7CglQYXNjYWxTdHJpbmdbMF0gPSBsZW47CiAgICB9CgogICAgcmV0dXJuIFBhc2NhbFN0cmluZzsKfQoKLyoKICogQzJQYXNjYWxfc2F2ZV9hbmRfcmVtb3ZlX2JhY2tzbGFzaAogKgogKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIGNvbnZlcnQgdGhlIEMtU3RyaW5nIHBhc3NlZCBpbgogKiBpbnRvIGEgcGFzY2FsIHN0cmluZy4gQWxzbyByZW1vdmUgdGhlIGJhY2tzbGFzaCBhdCB0aGUgc2FtZSB0aW1lCiAqCiAqLwoKY2hhcl91ICpDMlBhc2NhbF9zYXZlX2FuZF9yZW1vdmVfYmFja3NsYXNoKGNoYXJfdSAqQ3N0cmluZykKewogICAgY2hhcl91ICAqUGFzY2FsU3RyaW5nOwogICAgaW50CSAgICBsZW47CiAgICBjaGFyX3UgICpwLCAqYzsKCiAgICBsZW4gPSBTVFJMRU4oQ3N0cmluZyk7CgogICAgaWYgKGxlbiA+IDI1NSkgLyogVHJ1bmNhdGUgaWYgbmVjZXNzYXJ5ICovCglsZW4gPSAyNTU7CgogICAgUGFzY2FsU3RyaW5nID0gYWxsb2MobGVuICsgMSk7CiAgICBpZiAoUGFzY2FsU3RyaW5nICE9IE5VTEwpCiAgICB7Cglmb3IgKGMgPSBDc3RyaW5nLCBwID0gUGFzY2FsU3RyaW5nKzEsIGxlbiA9IDA7ICgqYyAhPSAwKSAmJiAobGVuIDwgMjU1KTsgYysrKQoJewoJICAgIGlmICgoKmMgPT0gJ1xcJykgJiYgKGNbMV0gIT0gMCkpCgkgICAgewoJCWMrKzsKCSAgICB9CgkgICAgKnAgPSAqYzsKCSAgICBwKys7CgkgICAgbGVuKys7Cgl9CglQYXNjYWxTdHJpbmdbMF0gPSBsZW47CiAgICB9CgogICAgcmV0dXJuIFBhc2NhbFN0cmluZzsKfQoKLyoKICogQ29udmVydCB0aGUgbW9kaWZpZXJzIG9mIGFuIEV2ZW50IGludG8gdmltJ3MgbW9kaWZpZXJzIChtb3VzZSkKICovCgogICAgaW50X3UKRXZlbnRNb2RpZmllcnMyVmltTW91c2VNb2RpZmllcnMoRXZlbnRNb2RpZmllcnMgbWFjTW9kaWZpZXJzKQp7CiAgICBpbnRfdSB2aW1Nb2RpZmllcnMgPSAweDAwOwoKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoc2hpZnRLZXkgfCByaWdodFNoaWZ0S2V5KSkKCXZpbU1vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoY29udHJvbEtleSB8IHJpZ2h0Q29udHJvbEtleSkpCgl2aW1Nb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAob3B0aW9uS2V5IHwgcmlnaHRPcHRpb25LZXkpKQoJdmltTW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKI2lmIDAKICAgIC8qIE5vdCB5ZXQgc3VwcG9ydGVkICovCiAgICBpZiAobWFjTW9kaWZpZXJzICYgKGNtZEtleSkpIC8qIFRoZXJlJ3Mgbm8gcmlnaHRDbWRLZXkgKi8KCXZpbU1vZGlmaWVycyB8PSBNT1VTRV9DTUQ7CiNlbmRpZgogICAgcmV0dXJuICh2aW1Nb2RpZmllcnMpOwp9CgovKgogKiBDb252ZXJ0IHRoZSBtb2RpZmllcnMgb2YgYW4gRXZlbnQgaW50byB2aW0ncyBtb2RpZmllcnMgKGtleXMpCiAqLwoKICAgIHN0YXRpYyBpbnRfdQpFdmVudE1vZGlmaWVyczJWaW1Nb2RpZmllcnMoRXZlbnRNb2RpZmllcnMgbWFjTW9kaWZpZXJzKQp7CiAgICBpbnRfdSB2aW1Nb2RpZmllcnMgPSAweDAwOwoKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoc2hpZnRLZXkgfCByaWdodFNoaWZ0S2V5KSkKCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoY29udHJvbEtleSB8IHJpZ2h0Q29udHJvbEtleSkpCgl2aW1Nb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAob3B0aW9uS2V5IHwgcmlnaHRPcHRpb25LZXkpKQoJdmltTW9kaWZpZXJzIHw9IE1PRF9NQVNLX0FMVDsKI2lmZGVmIFVTRV9DTURfS0VZCiAgICBpZiAobWFjTW9kaWZpZXJzICYgKGNtZEtleSkpIC8qIFRoZXJlJ3Mgbm8gcmlnaHRDbWRLZXkgKi8KCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19DTUQ7CiNlbmRpZgogICAgcmV0dXJuICh2aW1Nb2RpZmllcnMpOwp9CgovKiBDb252ZXJ0IGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIHBvaW50IHNpemUgaW50byBwaXhlbHMuIFRoZSBzdHJpbmcgc2hvdWxkCiAqIGJlIGEgcG9zaXRpdmUgZGVjaW1hbCBudW1iZXIsIHdpdGggYW4gb3B0aW9uYWwgZGVjaW1hbCBwb2ludCAoZWcsICIxMiIsIG9yCiAqICIxMC41IikuIFRoZSBwaXhlbCB2YWx1ZSBpcyByZXR1cm5lZCwgYW5kIGEgcG9pbnRlciB0byB0aGUgbmV4dCB1bmNvbnZlcnRlZAogKiBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluICplbmQuIFRoZSBmbGFnICJ2ZXJ0aWNhbCIgc2F5cyB3aGV0aGVyIHRoaXMKICogY2FsY3VsYXRpb24gaXMgZm9yIGEgdmVydGljYWwgKGhlaWdodCkgc2l6ZSBvciBhIGhvcml6b250YWwgKHdpZHRoKSBvbmUuCiAqCiAqIEZyb20gZ3VpX3c0OC5jCiAqLwogICAgc3RhdGljIGludApwb2ludHNfdG9fcGl4ZWxzKGNoYXJfdSAqc3RyLCBjaGFyX3UgKiplbmQsIGludCB2ZXJ0aWNhbCkKewogICAgaW50CQlwaXhlbHM7CiAgICBpbnQJCXBvaW50cyA9IDA7CiAgICBpbnQJCWRpdmlzb3IgPSAwOwoKICAgIHdoaWxlICgqc3RyKQogICAgewoJaWYgKCpzdHIgPT0gJy4nICYmIGRpdmlzb3IgPT0gMCkKCXsKCSAgICAvKiBTdGFydCBrZWVwaW5nIGEgZGl2aXNvciwgZm9yIGxhdGVyICovCgkgICAgZGl2aXNvciA9IDE7CgkgICAgY29udGludWU7Cgl9CgoJaWYgKCFpc2RpZ2l0KCpzdHIpKQoJICAgIGJyZWFrOwoKCXBvaW50cyAqPSAxMDsKCXBvaW50cyArPSAqc3RyIC0gJzAnOwoJZGl2aXNvciAqPSAxMDsKCgkrK3N0cjsKICAgIH0KCiAgICBpZiAoZGl2aXNvciA9PSAwKQoJZGl2aXNvciA9IDE7CgogICAgcGl4ZWxzID0gcG9pbnRzL2Rpdmlzb3I7CiAgICAqZW5kID0gc3RyOwogICAgcmV0dXJuIHBpeGVsczsKfQoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKLyoKICogRGVsZXRlcyBhbGwgdHJhY2VzIG9mIGFueSBXaW5kb3dzLXN0eWxlIG1uZW1vbmljIHRleHQgKGluY2x1ZGluZyBhbnkKICogcGFyZW50aGVzZXMpIGZyb20gYSBtZW51IGl0ZW0gYW5kIHJldHVybnMgdGhlIGNsZWFuZWQgbWVudSBpdGVtIHRpdGxlLgogKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIHJldHVybmVkIHN0cmluZy4KICovCiAgICBzdGF0aWMgQ0ZTdHJpbmdSZWYKbWVudV90aXRsZV9yZW1vdmluZ19tbmVtb25pYyhtZW51KQogICAgdmltbWVudV9UCSptZW51Owp7CiAgICBDRlN0cmluZ1JlZgkJbmFtZTsKICAgIHNpemVfdAkJbWVudVRpdGxlTGVuOwogICAgQ0ZJbmRleAkJZGlzcGxheUxlbjsKICAgIENGUmFuZ2UJCW1uZW1vbmljU3RhcnQ7CiAgICBDRlJhbmdlCQltbmVtb25pY0VuZDsKICAgIENGTXV0YWJsZVN0cmluZ1JlZgljbGVhbmVkTmFtZTsKCiAgICBtZW51VGl0bGVMZW4gPSBTVFJMRU4obWVudS0+ZG5hbWUpOwogICAgbmFtZSA9IG1hY19lbmNfdG9fY2ZzdHJpbmcobWVudS0+ZG5hbWUsIG1lbnVUaXRsZUxlbik7CgogICAgaWYgKG5hbWUpCiAgICB7CgkvKiBTaW1wbGUgbW5lbW9uaWMtcmVtb3ZhbCBhbGdvcml0aG0sIGFzc3VtZXMgc2luZ2xlIHBhcmVudGhlc2l6ZWQKCSAqIG1uZW1vbmljIGNoYXJhY3RlciB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIG1lbnUgdGV4dCAqLwoJbW5lbW9uaWNTdGFydCA9IENGU3RyaW5nRmluZChuYW1lLCBDRlNUUigiKCIpLCBrQ0ZDb21wYXJlQmFja3dhcmRzKTsKCWRpc3BsYXlMZW4gPSBDRlN0cmluZ0dldExlbmd0aChuYW1lKTsKCglpZiAobW5lbW9uaWNTdGFydC5sb2NhdGlvbiAhPSBrQ0ZOb3RGb3VuZAoJCSYmIChtbmVtb25pY1N0YXJ0LmxvY2F0aW9uICsgMikgPCBkaXNwbGF5TGVuCgkJJiYgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJBdEluZGV4KG5hbWUsCgkJICAgICAgIG1uZW1vbmljU3RhcnQubG9jYXRpb24gKyAxKSA9PSAoVW5pQ2hhciltZW51LT5tbmVtb25pYykKCXsKCSAgICBpZiAoQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMobmFtZSwgQ0ZTVFIoIikiKSwKCQkJQ0ZSYW5nZU1ha2UobW5lbW9uaWNTdGFydC5sb2NhdGlvbiArIDEsCgkJCSAgICBkaXNwbGF5TGVuIC0gbW5lbW9uaWNTdGFydC5sb2NhdGlvbiAtIDEpLAoJCQlrQ0ZDb21wYXJlQmFja3dhcmRzLCAmbW5lbW9uaWNFbmQpICYmCgkJICAgIChtbmVtb25pY1N0YXJ0LmxvY2F0aW9uICsgMikgPT0gbW5lbW9uaWNFbmQubG9jYXRpb24pCgkgICAgewoJCWNsZWFuZWROYW1lID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBuYW1lKTsKCQlpZiAoY2xlYW5lZE5hbWUpCgkJewoJCSAgICBDRlN0cmluZ0RlbGV0ZShjbGVhbmVkTmFtZSwKCQkJICAgIENGUmFuZ2VNYWtlKG1uZW1vbmljU3RhcnQubG9jYXRpb24sCgkJCQltbmVtb25pY0VuZC5sb2NhdGlvbiArIDEgLQoJCQkJbW5lbW9uaWNTdGFydC5sb2NhdGlvbikpOwoKCQkgICAgQ0ZSZWxlYXNlKG5hbWUpOwoJCSAgICBuYW1lID0gY2xlYW5lZE5hbWU7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICByZXR1cm4gbmFtZTsKfQojZW5kaWYKCi8qCiAqIENvbnZlcnQgYSBsaXN0IG9mIEZTU3BlYyBhbGlhc2VzIGludG8gYSBsaXN0IG9mIGZ1bGxwYXRobmFtZQogKiBjaGFyYWN0ZXIgc3RyaW5ncy4KICovCgpjaGFyX3UgKipuZXdfZm5hbWVzX2Zyb21fQUVEZXNjKEFFRGVzYyAqdGhlTGlzdCwgbG9uZyAqbnVtRmlsZXMsIE9TRXJyICplcnJvcikKewogICAgY2hhcl91CSoqZm5hbWVzID0gTlVMTDsKICAgIE9TRXJyCW5ld0Vycm9yOwogICAgbG9uZwlmaWxlQ291bnQ7CiAgICBGU1NwZWMJZmlsZVRvT3BlbjsKICAgIGxvbmcJYWN0dWFsU2l6ZTsKICAgIEFFS2V5d29yZAlkdW1teUtleXdvcmQ7CiAgICBEZXNjVHlwZQlkdW1teVR5cGU7CgogICAgLyogR2V0IG51bWJlciBvZiBmaWxlcyBpbiBsaXN0ICovCiAgICAqZXJyb3IgPSBBRUNvdW50SXRlbXModGhlTGlzdCwgbnVtRmlsZXMpOwogICAgaWYgKCplcnJvcikKICAgIHsKI2lmZGVmIFVTRV9TSU9VWAoJcHJpbnRmKCJmbmFtZV9mcm9tX0FFRGVzYzogQUVDb3VudEl0ZW1zIGVycm9yOiAlZFxuIiwgZXJyb3IpOwojZW5kaWYKCXJldHVybihmbmFtZXMpOwogICAgfQoKICAgIC8qIEFsbG9jYXRlIHRoZSBwb2ludGVyIGxpc3QgKi8KICAgIGZuYW1lcyA9IChjaGFyX3UgKiopIGFsbG9jKCpudW1GaWxlcyAqIHNpemVvZihjaGFyX3UgKikpOwoKICAgIC8qIEVtcHR5IG91dCB0aGUgbGlzdCAqLwogICAgZm9yIChmaWxlQ291bnQgPSAwOyBmaWxlQ291bnQgPCAqbnVtRmlsZXM7IGZpbGVDb3VudCsrKQoJZm5hbWVzW2ZpbGVDb3VudF0gPSBOVUxMOwoKICAgIC8qIFNjYW4gdGhlIGxpc3Qgb2YgRlNTcGVjICovCiAgICBmb3IgKGZpbGVDb3VudCA9IDE7IGZpbGVDb3VudCA8PSAqbnVtRmlsZXM7IGZpbGVDb3VudCsrKQogICAgewoJLyogR2V0IHRoZSBhbGlhcyBmb3IgdGhlIG50aCBmaWxlLCBjb252ZXJ0IHRvIGFuIEZTU3BlYyAqLwoJbmV3RXJyb3IgPSBBRUdldE50aFB0cih0aGVMaXN0LCBmaWxlQ291bnQsIHR5cGVGU1MsCgkJCQkmZHVtbXlLZXl3b3JkLCAmZHVtbXlUeXBlLAoJCQkJKFB0cikgJmZpbGVUb09wZW4sIHNpemVvZihGU1NwZWMpLCAmYWN0dWFsU2l6ZSk7CglpZiAobmV3RXJyb3IpCgl7CgkgICAgLyogQ2FsbGVyIGlzIGFibGUgdG8gY2xlYW4gdXAgKi8KCSAgICAvKiBUT0RPOiBTaG91bGQgYmUgY2xlYW4gdXAgb3Igbm90PyBGb3Igc2FmZXR5LiAqLwojaWZkZWYgVVNFX1NJT1VYCgkgICAgcHJpbnRmKCJhZXZ0X29kb2M6IEFFR2V0TnRoUHRyIGVycm9yOiAlbGRcbiIsIChsb25nKW5ld0Vycm9yKTsKI2VuZGlmCgkgICAgcmV0dXJuKGZuYW1lcyk7Cgl9CgoJLyogQ29udmVydCB0aGUgRlNTcGVjIHRvIGEgcGF0aG5hbWUgKi8KCWZuYW1lc1tmaWxlQ291bnQgLSAxXSA9IEZ1bGxQYXRoRnJvbUZTU3BlY19zYXZlKGZpbGVUb09wZW4pOwogICAgfQoKICAgIHJldHVybiAoZm5hbWVzKTsKfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvZGVXYXJyaW9yIEV4dGVybmFsIEVkaXRvciBTdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmZGVmIEZFQVRfQ1dfRURJVE9SCgovKgogKiBIYW5kbGUgdGhlIFdpbmRvdyBTZWFyY2ggZXZlbnQgZnJvbSBDb2RlV2FycmlvcgogKgogKiBEZXNjcmlwdGlvbgogKiAtLS0tLS0tLS0tLQogKgogKiBUaGUgSURFIHNlbmRzIHRoZSBXaW5kb3cgU2VhcmNoIEFwcGxlRXZlbnQgdG8gdGhlIGVkaXRvciB3aGVuIGl0CiAqIG5lZWRzIHRvIGtub3cgd2hldGhlciBhIHBhcnRpY3VsYXIgZmlsZSBpcyBvcGVuIGluIHRoZSBlZGl0b3IuCiAqCiAqIEV2ZW50IFJlcGx5CiAqIC0tLS0tLS0tLS0tCiAqCiAqIE5vbmUuIFB1dCBkYXRhIGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZSByZWNlaXZlZC4KICoKICogUmVtYXJrcwogKiAtLS0tLS0tCiAqCiAqIFdoZW4gdGhlIGVkaXRvciByZWNlaXZlcyB0aGlzIGV2ZW50LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkCiAqIGZpbGUgaXMgb3Blbi4gSWYgaXQgaXMsIHJldHVybiB0aGUgbW9kaWZpY2F0aW9uIGRhdGUvdGltZSBmb3IgdGhhdCBmaWxlCiAqIGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZS4gSWYgdGhlIGZpbGUgaXMKICogbm90IG9wZW5lZCwgcHV0IHRoZSB2YWx1ZSBmbmZFcnIoZmlsZSBub3QgZm91bmQpIGluIHRoYXQgbG9jYXRpb24uCiAqCiAqLwoKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKI2VuZGlmCnR5cGVkZWYgc3RydWN0IFdpbmRvd1NlYXJjaCBXaW5kb3dTZWFyY2g7CnN0cnVjdCBXaW5kb3dTZWFyY2ggLyogZm9yIGhhbmRsaW5nIGNsYXNzICdLQUhMJywgZXZlbnQgJ1NSQ0gnLCBrZXlEaXJlY3RPYmplY3QgdHlwZUNoYXIqLwp7CiAgICBGU1NwZWMgdGhlRmlsZTsgLy8gaWRlbnRpZmllcyB0aGUgZmlsZQogICAgbG9uZyAqdGhlRGF0ZTsgLy8gd2hlcmUgdG8gcHV0IHRoZSBtb2RpZmljYXRpb24gZGF0ZS90aW1lCn07CiNpZiBkZWZpbmVkKF9fTVdFUktTX18pICAvKiBvbmx5IGluIENvZGV3YXJyaW9yICovCiMgcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKI2VuZGlmCgogICAgcGFzY2FsIE9TRXJyCkhhbmRsZV9LQUhMX1NSQ0hfQUUoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCnsKICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CiAgICBidWZfVAkqYnVmOwogICAgaW50CQlmb3VuZEZpbGUgPSBmYWxzZTsKICAgIERlc2NUeXBlCXR5cGVDb2RlOwogICAgV2luZG93U2VhcmNoIFNlYXJjaERhdGE7CiAgICBTaXplCWFjdHVhbFNpemU7CgogICAgZXJyb3IgPSBBRUdldFBhcmFtUHRyKHRoZUFFdmVudCwga2V5RGlyZWN0T2JqZWN0LCB0eXBlQ2hhciwgJnR5cGVDb2RlLCAoUHRyKSAmU2VhcmNoRGF0YSwgc2l6ZW9mKFdpbmRvd1NlYXJjaCksICZhY3R1YWxTaXplKTsKICAgIGlmIChlcnJvcikKICAgIHsKI2lmZGVmIFVTRV9TSU9VWAoJcHJpbnRmKCJLQUhMX1NSQ0g6IEFFR2V0UGFyYW1QdHIgZXJyb3I6ICVkXG4iLCBlcnJvcik7CiNlbmRpZgoJcmV0dXJuKGVycm9yKTsKICAgIH0KCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9TUkNIOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwKCQkmJiBTZWFyY2hEYXRhLnRoZUZpbGUucGFySUQgPT0gYnVmLT5iX0ZTU3BlYy5wYXJJRAoJCSYmIFNlYXJjaERhdGEudGhlRmlsZS5uYW1lWzBdID09IGJ1Zi0+Yl9GU1NwZWMubmFtZVswXQoJCSYmIFNUUk5DTVAoU2VhcmNoRGF0YS50aGVGaWxlLm5hbWUsIGJ1Zi0+Yl9GU1NwZWMubmFtZSwgYnVmLT5iX0ZTU3BlYy5uYW1lWzBdICsgMSkgPT0gMCkKCSAgICB7CgkJZm91bmRGaWxlID0gdHJ1ZTsKCQlicmVhazsKCSAgICB9CgogICAgaWYgKGZvdW5kRmlsZSA9PSBmYWxzZSkKCSpTZWFyY2hEYXRhLnRoZURhdGUgPSBmbmZFcnI7CiAgICBlbHNlCgkqU2VhcmNoRGF0YS50aGVEYXRlID0gYnVmLT5iX210aW1lOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJLQUhMX1NSQ0g6IGZpbGUgXCIlI3NcIiB7JWR9IiwgU2VhcmNoRGF0YS50aGVGaWxlLm5hbWUsU2VhcmNoRGF0YS50aGVGaWxlLnBhcklEKTsKICAgIGlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCglwcmludGYoIiBOT1QiKTsKICAgIHByaW50ZigiIGZvdW5kLiBbZGF0ZSAlbHgsICVseF1cbiIsICpTZWFyY2hEYXRhLnRoZURhdGUsIGJ1Zi0+Yl9tdGltZV9yZWFkKTsKI2VuZGlmCgogICAgcmV0dXJuIGVycm9yOwp9OwoKLyoKICogSGFuZGxlIHRoZSBNb2RpZmllZCAoZnJvbSBJREUgdG8gRWRpdG9yKSBldmVudCBmcm9tIENvZGVXYXJyaW9yCiAqCiAqIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tCiAqCiAqIFRoZSBJREUgc2VuZHMgdGhpcyBldmVudCB0byB0aGUgZXh0ZXJuYWwgZWRpdG9yIHdoZW4gaXQgd2FudHMgdG8KICoga25vdyB3aGljaCBmaWxlcyB0aGF0IGFyZSBvcGVuIGluIHRoZSBlZGl0b3IgaGF2ZSBiZWVuIG1vZGlmaWVkLgogKgogKiBQYXJhbWV0ZXJzICAgTm9uZS4KICogLS0tLS0tLS0tLQogKgogKiBFdmVudCBSZXBseQogKiAtLS0tLS0tLS0tLQogKiBUaGUgcmVwbHkgZm9yIHRoaXMgZXZlbnQgaXM6CiAqCiAqIGtleURpcmVjdE9iamVjdCB0eXBlQUVMaXN0IHJlcXVpcmVkCiAqICBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3QgaXMgYSBzdHJ1Y3R1cmUgb2YgdHlwZUNoYXIKICoKICogUmVtYXJrcwogKiAtLS0tLS0tCiAqCiAqIFdoZW4gYnVpbGRpbmcgdGhlIHJlcGx5IGV2ZW50LCBpbmNsdWRlIG9uZSBlbGVtZW50IGluIHRoZSBsaXN0IGZvcgogKiBlYWNoIG9wZW4gZmlsZSB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkLgogKgogKi8KCiNpZiBkZWZpbmVkKF9fTVdFUktTX18pICAvKiBvbmx5IGluIENvZGV3YXJyaW9yICovCiMgcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCiNlbmRpZgp0eXBlZGVmIHN0cnVjdCBNb2RpZmljYXRpb25JbmZvIE1vZGlmaWNhdGlvbkluZm87CnN0cnVjdCBNb2RpZmljYXRpb25JbmZvIC8qIGZvciByZXBseWluZyB0byBjbGFzcyAnS0FITCcsIGV2ZW50ICdNT0QgJywga2V5RGlyZWN0T2JqZWN0IHR5cGVBRUxpc3QqLwp7CiAgICBGU1NwZWMgdGhlRmlsZTsgLy8gaWRlbnRpZmllcyB0aGUgZmlsZQogICAgbG9uZyB0aGVEYXRlOyAvLyB0aGUgZGF0ZS90aW1lIHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkCiAgICBzaG9ydCBzYXZlZDsgLy8gc2V0IHRoaXMgdG8gemVybyB3aGVuIHJlcGx5aW5nLCB1bnVzZWQKfTsKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAojZW5kaWYKCiAgICBwYXNjYWwgT1NFcnIKSGFuZGxlX0tBSExfTU9EX0FFKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQp7CiAgICBPU0VycgllcnJvciA9IG5vRXJyOwogICAgQUVEZXNjTGlzdAlyZXBseUxpc3Q7CiAgICBsb25nCW51bUZpbGVzOwogICAgTW9kaWZpY2F0aW9uSW5mbyB0aGVGaWxlOwogICAgYnVmX1QJKmJ1ZjsKCiAgICB0aGVGaWxlLnNhdmVkID0gMDsKCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9NT0Q6IEhhbmRsZVVudXNlZFBhcm1zIGVycm9yOiAlZFxuIiwgZXJyb3IpOwojZW5kaWYKCXJldHVybihlcnJvcik7CiAgICB9CgogICAgLyogU2VuZCB0aGUgcmVwbHkgKi8KLyogIHJlcGx5T2JqZWN0LmRlc2NyaXB0b3JUeXBlID0gdHlwZU51bGw7CiAgICByZXBseU9iamVjdC5kYXRhSGFuZGxlICAgICA9IG5pbDsqLwoKLyogQUVDcmVhdGVEZXNjKHR5cGVDaGFyLCAoUHRyKSZ0aXRsZVsxXSwgdGl0bGVbMF0sICZkYXRhKSAqLwogICAgZXJyb3IgPSBBRUNyZWF0ZUxpc3QobmlsLCAwLCBmYWxzZSwgJnJlcGx5TGlzdCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9NT0Q6IEFFQ3JlYXRlTGlzdCBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKI2lmIDAKICAgIGVycm9yID0gQUVDb3VudEl0ZW1zKCZyZXBseUxpc3QsICZudW1GaWxlcyk7CiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiS0FITF9NT0QgUmVwbHlMaXN0OiAleCAleFxuIiwgcmVwbHlMaXN0LmRlc2NyaXB0b3JUeXBlLCByZXBseUxpc3QuZGF0YUhhbmRsZSk7CiAgICBwcmludGYoIktBSExfTU9EIEl0ZW1Jbkxpc3Q6ICVkXG4iLCBudW1GaWxlcyk7CiNlbmRpZgoKICAgIC8qIEFFUHV0S2V5RGVzYygmcmVwbHlMaXN0LCBrZXlBRVBuamVjdCwgJmFEZXNjKQogICAgICogQUVQdXRLZXlQdHIoJnJlcGx5TGlzdCwga2V5QUVQb3NpdGlvbiwgdHlwZUNoYXIsIChQdHIpJnRoZVR5cGUsCiAgICAgKiBzaXplb2YoRGVzY1R5cGUpKQogICAgICovCgogICAgLyogQUVQdXREZXNjICovCiNlbmRpZgoKICAgIG51bUZpbGVzID0gMDsKICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCgl7CgkgICAgLyogQWRkIHRoaXMgZmlsZSB0byB0aGUgbGlzdCAqLwoJICAgIHRoZUZpbGUudGhlRmlsZSA9IGJ1Zi0+Yl9GU1NwZWM7CgkgICAgdGhlRmlsZS50aGVEYXRlID0gYnVmLT5iX210aW1lOwovKgkgICAgdGhlRmlsZS50aGVEYXRlID0gdGltZShOVUxMKSAmICh0aW1lX3QpIDB4RkZGRkZGRjA7ICovCgkgICAgZXJyb3IgPSBBRVB1dFB0cigmcmVwbHlMaXN0LCBudW1GaWxlcywgdHlwZUNoYXIsIChQdHIpICZ0aGVGaWxlLCBzaXplb2YodGhlRmlsZSkpOwojaWZkZWYgVVNFX1NJT1VYCgkgICAgaWYgKG51bUZpbGVzID09IDApCgkJcHJpbnRmKCJLQUhMX01PRDogIik7CgkgICAgZWxzZQoJCXByaW50ZigiLCAiKTsKCSAgICBwcmludGYoIlwiJSNzXCIgeyVkfSBbZGF0ZSAlbHgsICVseF0iLCB0aGVGaWxlLnRoZUZpbGUubmFtZSwgdGhlRmlsZS50aGVGaWxlLnBhcklELCB0aGVGaWxlLnRoZURhdGUsIGJ1Zi0+Yl9tdGltZV9yZWFkKTsKCSAgICBpZiAoZXJyb3IpCgkJcHJpbnRmKCIgKCVkKSIsIGVycm9yKTsKCSAgICBudW1GaWxlcysrOwojZW5kaWYKCX07CgojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoIlxuIik7CiNlbmRpZgoKI2lmIDAKICAgIGVycm9yID0gQUVDb3VudEl0ZW1zKCZyZXBseUxpc3QsICZudW1GaWxlcyk7CiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiS0FITF9NT0QgSXRlbUluTGlzdDogJWRcbiIsIG51bUZpbGVzKTsKI2VuZGlmCiNlbmRpZgoKICAgIC8qIFdlIGNhbiBhZGQgZGF0YSBvbmx5IGlmIHNvbWV0aGluZyB0byByZXBseSAqLwogICAgZXJyb3IgPSBBRVB1dFBhcmFtRGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCAmcmVwbHlMaXN0KTsKCiNpZmRlZiBVU0VfU0lPVVgKICAgIGlmIChlcnJvcikKCXByaW50ZigiS0FITF9NT0Q6IEFFUHV0UGFyYW1EZXNjIGVycm9yOiAlZFxuIiwgZXJyb3IpOwojZW5kaWYKCiAgICBpZiAocmVwbHlMaXN0LmRhdGFIYW5kbGUpCglBRURpc3Bvc2VEZXNjKCZyZXBseUxpc3QpOwoKICAgIHJldHVybiBlcnJvcjsKfTsKCi8qCiAqIEhhbmRsZSB0aGUgR2V0IFRleHQgZXZlbnQgZnJvbSBDb2RlV2FycmlvcgogKgogKiBEZXNjcmlwdGlvbgogKiAtLS0tLS0tLS0tLQogKgogKiBUaGUgSURFIHNlbmRzIHRoZSBHZXQgVGV4dCBBcHBsZUV2ZW50IHRvIHRoZSBlZGl0b3Igd2hlbiBpdCBuZWVkcwogKiB0aGUgc291cmNlIGNvZGUgZnJvbSBhIGZpbGUuIEZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyIGlzc3VlcyBhCiAqIENoZWNrIFN5bnRheCBvciBDb21waWxlIGNvbW1hbmQsIHRoZSBjb21waWxlciBuZWVkcyBhY2Nlc3MgdG8KICogdGhlIHNvdXJjZSBjb2RlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZS4KICoKICogRXZlbnQgUmVwbHkKICogLS0tLS0tLS0tLS0KICoKICogTm9uZS4gUHV0IGRhdGEgaW4gbG9jYXRpb25zIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0dXJlIHJlY2VpdmVkLgogKgogKiBSZW1hcmtzCiAqIC0tLS0tLS0KICoKICogV2hlbiB0aGUgZWRpdG9yIHJlY2VpdmVzIHRoaXMgZXZlbnQsIGl0IG11c3Qgc2V0IHRoZSBzaXplIG9mIHRoZSBoYW5kbGUKICogaW4gdGhlVGV4dCB0byBmaXQgdGhlIGRhdGEgaW4gdGhlIGZpbGUuIEl0IG11c3QgdGhlbiBjb3B5IHRoZSBlbnRpcmUKICogY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gdGhlIG1lbW9yeSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4KICogdGhlVGV4dC4KICoKICovCgojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awojZW5kaWYKdHlwZWRlZiBzdHJ1Y3QgQ1dfR2V0VGV4dCBDV19HZXRUZXh0OwpzdHJ1Y3QgQ1dfR2V0VGV4dCAvKiBmb3IgaGFuZGxpbmcgY2xhc3MgJ0tBSEwnLCBldmVudCAnR1RUWCcsIGtleURpcmVjdE9iamVjdCB0eXBlQ2hhciovCnsKICAgIEZTU3BlYyB0aGVGaWxlOyAvKiBpZGVudGlmaWVzIHRoZSBmaWxlICovCiAgICBIYW5kbGUgdGhlVGV4dDsgLyogdGhlIGxvY2F0aW9uIHdoZXJlIHlvdSByZXR1cm4gdGhlIHRleHQgKG11c3QgYmUgcmVzaXplZCBwcm9wZXJseSkgKi8KICAgIGxvbmcgKnVudXNlZDsgICAvKiAwIChub3QgdXNlZCkgKi8KICAgIGxvbmcgKnRoZURhdGU7ICAvKiB3aGVyZSB0byBwdXQgdGhlIG1vZGlmaWNhdGlvbiBkYXRlL3RpbWUgKi8KfTsKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAojZW5kaWYKCiAgICBwYXNjYWwgT1NFcnIKSGFuZGxlX0tBSExfR1RUWF9BRShjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbikKewogICAgT1NFcnIJZXJyb3IgPSBub0VycjsKICAgIGJ1Zl9UCSpidWY7CiAgICBpbnQJCWZvdW5kRmlsZSA9IGZhbHNlOwogICAgRGVzY1R5cGUJdHlwZUNvZGU7CiAgICBDV19HZXRUZXh0CUdldFRleHREYXRhOwogICAgU2l6ZQlhY3R1YWxTaXplOwogICAgY2hhcl91CSpsaW5lOwogICAgY2hhcl91CSpmdWxsYnVmZmVyID0gTlVMTDsKICAgIGxvbmcJbGluZXNpemU7CiAgICBsb25nCWxpbmVTdGFydDsKICAgIGxvbmcJQnVmZmVyU2l6ZTsKICAgIGxvbmcJbGluZW5vOwoKICAgIGVycm9yID0gQUVHZXRQYXJhbVB0cih0aGVBRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUNoYXIsICZ0eXBlQ29kZSwgKFB0cikgJkdldFRleHREYXRhLCBzaXplb2YoR2V0VGV4dERhdGEpLCAmYWN0dWFsU2l6ZSk7CgogICAgaWYgKGVycm9yKQogICAgewojaWZkZWYgVVNFX1NJT1VYCglwcmludGYoIktBSExfR1RUWDogQUVHZXRQYXJhbVB0ciBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCgkgICAgaWYgKEdldFRleHREYXRhLnRoZUZpbGUucGFySUQgPT0gYnVmLT5iX0ZTU3BlYy5wYXJJRCkKCSAgICB7CgkJZm91bmRGaWxlID0gdHJ1ZTsKCQlicmVhazsKCSAgICB9CgogICAgaWYgKGZvdW5kRmlsZSkKICAgIHsKCUJ1ZmZlclNpemUgPSAwOyAvKiBHZXRIYW5kbGVTaXplKEdldFRleHREYXRhLnRoZVRleHQpOyAqLwoJZm9yIChsaW5lbm8gPSAwOyBsaW5lbm8gPD0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7IGxpbmVubysrKQoJewoJICAgIC8qIE11c3QgdXNlIHRoZSByaWdodCBidWZmZXIgKi8KCSAgICBsaW5lID0gbWxfZ2V0X2J1ZihidWYsIChsaW5lbnJfVCkgbGluZW5vLCBGQUxTRSk7CgkgICAgbGluZXNpemUgPSBTVFJMRU4obGluZSkgKyAxOwoJICAgIGxpbmVTdGFydCA9IEJ1ZmZlclNpemU7CgkgICAgQnVmZmVyU2l6ZSArPSBsaW5lc2l6ZTsKCSAgICAvKiBSZXNpemUgaGFuZGxlIHRvIGxpbmVzaXplKzEgdG8gaW5jbHVkZSB0aGUgbGluZWZlZWQgKi8KCSAgICBTZXRIYW5kbGVTaXplKEdldFRleHREYXRhLnRoZVRleHQsIEJ1ZmZlclNpemUpOwoJICAgIGlmIChHZXRIYW5kbGVTaXplKEdldFRleHREYXRhLnRoZVRleHQpICE9IEJ1ZmZlclNpemUpCgkgICAgewoJI2lmZGVmIFVTRV9TSU9VWAoJCXByaW50ZigiS0FITF9HVFRYOiBTZXRIYW5kbGVTaXplIGluY3JlYXNlOiAlZCwgc2l6ZSAlZFxuIiwKCQkJbGluZXNpemUsIEJ1ZmZlclNpemUpOwoJI2VuZGlmCgkJYnJlYWs7IC8qIFNpbXBsZSBoYW5kbGluZyBmb3Igbm93ICovCgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJSExvY2soR2V0VGV4dERhdGEudGhlVGV4dCk7CgkJZnVsbGJ1ZmZlciA9IChjaGFyX3UgKikgKkdldFRleHREYXRhLnRoZVRleHQ7CgkJU1RSQ1BZKChjaGFyX3UgKikoZnVsbGJ1ZmZlciArIGxpbmVTdGFydCksIGxpbmUpOwoJCWZ1bGxidWZmZXJbQnVmZmVyU2l6ZS0xXSA9ICdccic7CgkJSFVubG9jayhHZXRUZXh0RGF0YS50aGVUZXh0KTsKCSAgICB9Cgl9CglpZiAoZnVsbGJ1ZmZlciAhPSBOVUxMKQoJewoJICAgIEhMb2NrKEdldFRleHREYXRhLnRoZVRleHQpOwoJICAgIGZ1bGxidWZmZXJbQnVmZmVyU2l6ZS0xXSA9IDA7CgkgICAgSFVubG9jayhHZXRUZXh0RGF0YS50aGVUZXh0KTsKCX0KCWlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCgkgICAgKkdldFRleHREYXRhLnRoZURhdGUgPSBmbmZFcnI7CgllbHNlCi8qCSAgICAqR2V0VGV4dERhdGEudGhlRGF0ZSA9IHRpbWUoTlVMTCkgJiAodGltZV90KSAweEZGRkZGRkYwOyovCgkgICAgKkdldFRleHREYXRhLnRoZURhdGUgPSBidWYtPmJfbXRpbWU7CiAgICB9CiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiS0FITF9HVFRYOiBmaWxlIFwiJSNzXCIgeyVkfSBbZGF0ZSAlbHgsICVseF0iLCBHZXRUZXh0RGF0YS50aGVGaWxlLm5hbWUsIEdldFRleHREYXRhLnRoZUZpbGUucGFySUQsICpHZXRUZXh0RGF0YS50aGVEYXRlLCBidWYtPmJfbXRpbWVfcmVhZCk7CiAgICBpZiAoZm91bmRGaWxlID09IGZhbHNlKQoJcHJpbnRmKCIgTk9UIik7CiAgICBwcmludGYoIiBmb3VuZC4gKEJ1ZmZlclNpemUgPSAlZClcbiIsIEJ1ZmZlclNpemUpOwojZW5kaWYKCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9HVFRYOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIHJldHVybihlcnJvcik7Cn0KCi8qCiAqCiAqLwoKLyogVGFrZW4gZnJvbSBNb3JlQXBwbGVFdmVudHM6UHJvY2Vzc0hlbHBlcnMqLwpwYXNjYWwJT1NFcnIJRmluZFByb2Nlc3NCeVNpZ25hdHVyZShjb25zdCBPU1R5cGUgdGFyZ2V0VHlwZSwKCQkJCQljb25zdCBPU1R5cGUgdGFyZ2V0Q3JlYXRvciwKCQkJCQkgICAgICBQcm9jZXNzU2VyaWFsTnVtYmVyUHRyIHBzblB0cikKewogICAgT1NFcnIJYW5FcnIgPSBub0VycjsKICAgIEJvb2xlYW4JbG9va2luZ0ZvclByb2Nlc3MgPSB0cnVlOwoKICAgIFByb2Nlc3NJbmZvUmVjICBpbmZvUmVjOwoKICAgIGluZm9SZWMucHJvY2Vzc0luZm9MZW5ndGggPSBzaXplb2YoUHJvY2Vzc0luZm9SZWMpOwogICAgaW5mb1JlYy5wcm9jZXNzTmFtZSA9IG5pbDsKICAgIGluZm9SZWMucHJvY2Vzc0FwcFNwZWMgPSBuaWw7CgogICAgcHNuUHRyLT5sb3dMb25nT2ZQU04gPSBrTm9Qcm9jZXNzOwogICAgcHNuUHRyLT5oaWdoTG9uZ09mUFNOID0ga05vUHJvY2VzczsKCiAgICB3aGlsZSAobG9va2luZ0ZvclByb2Nlc3MpCiAgICB7CglhbkVyciA9IEdldE5leHRQcm9jZXNzKHBzblB0cik7CglpZiAoYW5FcnIgIT0gbm9FcnIpCgkgICAgbG9va2luZ0ZvclByb2Nlc3MgPSBmYWxzZTsKCWVsc2UKCXsKCSAgICBhbkVyciA9IEdldFByb2Nlc3NJbmZvcm1hdGlvbihwc25QdHIsICZpbmZvUmVjKTsKCSAgICBpZiAoKGFuRXJyID09IG5vRXJyKQoJCSAgICAmJiAoaW5mb1JlYy5wcm9jZXNzVHlwZSA9PSB0YXJnZXRUeXBlKQoJCSAgICAmJiAoaW5mb1JlYy5wcm9jZXNzU2lnbmF0dXJlID09IHRhcmdldENyZWF0b3IpKQoJCWxvb2tpbmdGb3JQcm9jZXNzID0gZmFsc2U7Cgl9CiAgICB9CgogICAgcmV0dXJuIGFuRXJyOwp9Ly9lbmQgRmluZFByb2Nlc3NCeVNpZ25hdHVyZQoKICAgIHZvaWQKU2VuZF9LQUhMX01PRF9BRShidWZfVCAqYnVmKQp7CiAgICBPU0VycglhbkVyciA9IG5vRXJyOwogICAgQUVEZXNjCXRhcmdldEFwcERlc2MgPSB7IHR5cGVOdWxsLCBuaWwgfTsKICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIJICAgIHBzbiA9IHsga05vUHJvY2Vzcywga05vUHJvY2VzcyB9OwogICAgQXBwbGVFdmVudAl0aGVSZXBseSA9IHsgdHlwZU51bGwsIG5pbCB9OwogICAgQUVTZW5kTW9kZQlzZW5kTW9kZTsKICAgIEFwcGxlRXZlbnQgIHRoZUV2ZW50ID0ge3R5cGVOdWxsLCBuaWwgfTsKICAgIEFFSWRsZVVQUCAgIGlkbGVQcm9jVVBQID0gbmlsOwogICAgTW9kaWZpY2F0aW9uSW5mbyBNb2REYXRhOwoKCiAgICBhbkVyciA9IEZpbmRQcm9jZXNzQnlTaWduYXR1cmUoJ0FQUEwnLCAnQ1dJRScsICZwc24pOwojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoIkNvZGVXYXJyaW9yIGlzIik7CiAgICBpZiAoYW5FcnIgIT0gbm9FcnIpCglwcmludGYoIiBOT1QiKTsKICAgIHByaW50ZigiIHJ1bm5pbmdcbiIpOwojZW5kaWYKICAgIGlmIChhbkVyciA9PSBub0VycikKICAgIHsKCWFuRXJyID0gQUVDcmVhdGVEZXNjKHR5cGVQcm9jZXNzU2VyaWFsTnVtYmVyLCAmcHNuLAoJCQkgICAgICBzaXplb2YoUHJvY2Vzc1NlcmlhbE51bWJlciksICZ0YXJnZXRBcHBEZXNjKTsKCglpZiAoYW5FcnIgPT0gbm9FcnIpCgl7CgkgICAgYW5FcnIgPSBBRUNyZWF0ZUFwcGxlRXZlbnQoICdLQUhMJywgJ01PRCAnLCAmdGFyZ2V0QXBwRGVzYywKCQkJCQlrQXV0b0dlbmVyYXRlUmV0dXJuSUQsIGtBbnlUcmFuc2FjdGlvbklELCAmdGhlRXZlbnQpOwoJfQoKCUFFRGlzcG9zZURlc2MoJnRhcmdldEFwcERlc2MpOwoKCS8qIEFkZCB0aGUgcGFybXMgKi8KCU1vZERhdGEudGhlRmlsZSA9IGJ1Zi0+Yl9GU1NwZWM7CglNb2REYXRhLnRoZURhdGUgPSBidWYtPmJfbXRpbWU7CgoJaWYgKGFuRXJyID09IG5vRXJyKQoJICAgIGFuRXJyID0gQUVQdXRQYXJhbVB0cigmdGhlRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUNoYXIsICZNb2REYXRhLCBzaXplb2YoTW9kRGF0YSkpOwoKCWlmIChpZGxlUHJvY1VQUCA9PSBuaWwpCgkgICAgc2VuZE1vZGUgPSBrQUVOb1JlcGx5OwoJZWxzZQoJICAgIHNlbmRNb2RlID0ga0FFV2FpdFJlcGx5OwoKCWlmIChhbkVyciA9PSBub0VycikKCSAgICBhbkVyciA9IEFFU2VuZCgmdGhlRXZlbnQsICZ0aGVSZXBseSwgc2VuZE1vZGUsIGtBRU5vcm1hbFByaW9yaXR5LCBrTm9UaW1lT3V0LCBpZGxlUHJvY1VQUCwgbmlsKTsKCWlmIChhbkVyciA9PSBub0VyciAgJiYgIHNlbmRNb2RlID09IGtBRVdhaXRSZXBseSkKCXsKI2lmZGVmIFVTRV9TSU9VWAoJICAgIHByaW50ZigiS0FITF9NT0Q6IFNlbmQgZXJyb3I6ICVkXG4iLCBhbkVycik7CiNlbmRpZgovKgkgICAgYW5FcnIgPSAgQUVIR2V0SGFuZGxlckVycm9yKCZ0aGVSZXBseSk7Ki8KCX0KCSh2b2lkKSBBRURpc3Bvc2VEZXNjKCZ0aGVSZXBseSk7CiAgICB9Cn0KI2VuZGlmIC8qIEZFQVRfQ1dfRURJVE9SICovCgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQXBwbGUgRXZlbnQgSGFuZGxpbmcgcHJvY2VkdXJlCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmZGVmIFVTRV9BRVZFTlQKCi8qCiAqIEhhbmRsZSB0aGUgVW51c2VkIHBhcm1zIG9mIGFuIEFwcGxlRXZlbnQKICovCgogICAgT1NFcnIKSGFuZGxlVW51c2VkUGFybXMoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50KQp7CiAgICBPU0VycgllcnJvcjsKICAgIGxvbmcJYWN0dWFsU2l6ZTsKICAgIERlc2NUeXBlCWR1bW15VHlwZTsKICAgIEFFS2V5d29yZAltaXNzZWRLZXl3b3JkOwoKICAgIC8qIEdldCB0aGUgIm1pc3NlZCBrZXl3b3JkIiBhdHRyaWJ1dGUgZnJvbSB0aGUgQXBwbGVFdmVudC4gKi8KICAgIGVycm9yID0gQUVHZXRBdHRyaWJ1dGVQdHIodGhlQUV2ZW50LCBrZXlNaXNzZWRLZXl3b3JkQXR0ciwKCQkJICAgICAgdHlwZUtleXdvcmQsICZkdW1teVR5cGUsCgkJCSAgICAgIChQdHIpJm1pc3NlZEtleXdvcmQsIHNpemVvZihtaXNzZWRLZXl3b3JkKSwKCQkJICAgICAgJmFjdHVhbFNpemUpOwoKICAgIC8qIElmIHRoZSBkZXNjcmlwdG9yIGlzbid0IGZvdW5kLCB0aGVuIHdlIGdvdCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy4gKi8KICAgIGlmIChlcnJvciA9PSBlcnJBRURlc2NOb3RGb3VuZCkKICAgIHsKCWVycm9yID0gbm9FcnI7CiAgICB9CiAgICBlbHNlCiAgICB7CiNpZiAwCgkvKiBXaHkgaXMgdGhpcyByZW1vdmVkPyAqLwoJZXJyb3IgPSBlcnJBRUV2ZW50Tm90SGFuZGxlZDsKI2VuZGlmCiAgICB9CgogICAgcmV0dXJuIGVycm9yOwp9CgoKLyoKICogSGFuZGxlIHRoZSBPRG9jIEFwcGxlRXZlbnQKICoKICogRGVhbHMgd2l0aCBhbGwgZmlsZXMgZHJhZ2dlZCB0byB0aGUgYXBwbGljYXRpb24gaWNvbi4KICoKICovCgojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awojZW5kaWYKdHlwZWRlZiBzdHJ1Y3QgU2VsZWN0aW9uUmFuZ2UgU2VsZWN0aW9uUmFuZ2U7CnN0cnVjdCBTZWxlY3Rpb25SYW5nZSAvKiBmb3IgaGFuZGxpbmcga0NvcmVDbGFzc0V2ZW50OmtPcGVuRG9jdW1lbnRzOmtleUFFUG9zaXRpb24gdHlwZUNoYXIgKi8KewogICAgc2hvcnQgdW51c2VkMTsgLy8gMCAobm90IHVzZWQpCiAgICBzaG9ydCBsaW5lTnVtOyAvLyBsaW5lIHRvIHNlbGVjdCAoPDAgdG8gc3BlY2lmeSByYW5nZSkKICAgIGxvbmcgc3RhcnRSYW5nZTsgLy8gc3RhcnQgb2Ygc2VsZWN0aW9uIHJhbmdlIChpZiBsaW5lIDwgMCkKICAgIGxvbmcgZW5kUmFuZ2U7IC8vIGVuZCBvZiBzZWxlY3Rpb24gcmFuZ2UgKGlmIGxpbmUgPCAwKQogICAgbG9uZyB1bnVzZWQyOyAvLyAwIChub3QgdXNlZCkKICAgIGxvbmcgdGhlRGF0ZTsgLy8gbW9kaWZpY2F0aW9uIGRhdGUvdGltZQp9OwojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CiNlbmRpZgoKLyogVGhlIElERSB1c2VzIHRoZSBvcHRpb25hbCBrZXlBRVBvc2l0aW9uIHBhcmFtZXRlciB0byB0ZWxsIHRoZSBlZC0KICAgaXRvciB0aGUgc2VsZWN0aW9uIHJhbmdlLiBJZiBsaW5lTnVtIGlzIHplcm8gb3IgZ3JlYXRlciwgc2Nyb2xsIHRoZSB0ZXh0CiAgIHRvIHRoZSBzcGVjaWZpZWQgbGluZS4gSWYgbGluZU51bSBpcyBsZXNzIHRoYW4gemVybywgdXNlIHRoZSB2YWx1ZXMgaW4KICAgc3RhcnRSYW5nZSBhbmQgZW5kUmFuZ2UgdG8gc2VsZWN0IHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycy4gU2Nyb2xsCiAgIHRoZSB0ZXh0IHRvIGRpc3BsYXkgdGhlIHNlbGVjdGlvbi4gSWYgbGluZU51bSwgc3RhcnRSYW5nZSwgYW5kCiAgIGVuZFJhbmdlIGFyZSBhbGwgbmVnYXRpdmUsIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiByYW5nZSBzcGVjaWZpZWQuCiAqLwoKICAgIHBhc2NhbCBPU0VycgpIYW5kbGVPRG9jQUUoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCnsKICAgIC8qCiAgICAgKiBUT0RPOiBDbGVhbiB1cCB0aGUgY29kZSB3aXRoIGNvbnZlcnQgdGhlIEFwcGxlRXZlbnQgaW50bwogICAgICogICAgICAgYSAiOmFyZ3MiCiAgICAgKi8KICAgIE9TRXJyCWVycm9yID0gbm9FcnI7Ci8vICAgIE9TRXJyCWZpcnN0RXJyb3IgPSBub0VycjsKLy8gICAgc2hvcnQJbnVtRXJyb3JzID0gMDsKICAgIEFFRGVzYwl0aGVMaXN0OwogICAgRGVzY1R5cGUJdHlwZUNvZGU7CiAgICBsb25nCW51bUZpbGVzOwogLy8gICBsb25nCSBmaWxlQ291bnQ7CiAgICBjaGFyX3UJKipmbmFtZXM7Ci8vICAgIGNoYXJfdQlmbmFtZVsyNTZdOwogICAgU2l6ZQlhY3R1YWxTaXplOwogICAgU2VsZWN0aW9uUmFuZ2UgdGhlUG9zaXRpb247CiAgICBzaG9ydAlnb3RQb3NpdGlvbiA9IGZhbHNlOwogICAgbG9uZwlsbnVtOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJhZXZ0X29kb2M6XG4iKTsKI2VuZGlmCgogICAgLyogdGhlIGRpcmVjdCBvYmplY3QgcGFyYW1ldGVyIGlzIHRoZSBsaXN0IG9mIGFsaWFzZXMgdG8gZmlsZXMgKG9uZSBvciBtb3JlKSAqLwogICAgZXJyb3IgPSBBRUdldFBhcmFtRGVzYyh0aGVBRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUFFTGlzdCwgJnRoZUxpc3QpOwogICAgaWYgKGVycm9yKQogICAgewojaWZkZWYgVVNFX1NJT1VYCglwcmludGYoImFldnRfb2RvYzogQUVHZXRQYXJhbURlc2MgZXJyb3I6ICVsZFxuIiwgKGxvbmcpZXJyb3IpOwojZW5kaWYKCXJldHVybihlcnJvcik7CiAgICB9CgoKICAgIGVycm9yID0gQUVHZXRQYXJhbVB0cih0aGVBRXZlbnQsIGtleUFFUG9zaXRpb24sIHR5cGVDaGFyLCAmdHlwZUNvZGUsIChQdHIpICZ0aGVQb3NpdGlvbiwgc2l6ZW9mKFNlbGVjdGlvblJhbmdlKSwgJmFjdHVhbFNpemUpOwogICAgaWYgKGVycm9yID09IG5vRXJyKQoJZ290UG9zaXRpb24gPSB0cnVlOwogICAgaWYgKGVycm9yID09IGVyckFFRGVzY05vdEZvdW5kKQoJZXJyb3IgPSBub0VycjsKICAgIGlmIChlcnJvcikKICAgIHsKI2lmZGVmIFVTRV9TSU9VWAoJcHJpbnRmKCJhZXZ0X29kb2M6IEFFR2V0UGFyYW1QdHIgZXJyb3I6ICVsZFxuIiwgKGxvbmcpZXJyb3IpOwojZW5kaWYKCXJldHVybihlcnJvcik7CiAgICB9CgojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoImFldnRfb2RvYzogbGluZU51bTogJWQsIHN0YXJ0UmFuZ2UgJWxkLCBlbmRSYW5nZSAlbGQsIFtkYXRlICVseF1cbiIsCgkgICAgKGludCl0aGVQb3NpdGlvbi5saW5lTnVtLAoJICAgIChsb25nKXRoZVBvc2l0aW9uLnN0YXJ0UmFuZ2UsIChsb25nKXRoZVBvc2l0aW9uLmVuZFJhbmdlLAoJICAgIChsb25nKXRoZVBvc2l0aW9uLnRoZURhdGUpOwojZW5kaWYKLyoKICAgIGVycm9yID0gQUVHZXRQYXJhbURlc2ModGhlQUV2ZW50LCBrZXlBRVBvc2l0aW9uLCB0eXBlQ2hhciwgJnRoZVBvc2l0aW9uKTsKCiAgICBpZiAoXmVycm9yKSB0aGVuCiAgICB7CglpZiAodGhlUG9zaXRpb24ubGluZU51bSA+PSAwKQoJewoJICAvLyBHb3RvIHRoaXMgbGluZQoJfQoJZWxzZQoJewoJICAvLyBTZXQgdGhlIHJhbmdlIGNoYXIgd2lzZQoJfQogICAgfQogKi8KCgojaWZkZWYgRkVBVF9WSVNVQUwKICAgIHJlc2V0X1ZJc3VhbCgpOwojZW5kaWYKCiAgICBmbmFtZXMgPSBuZXdfZm5hbWVzX2Zyb21fQUVEZXNjKCZ0aGVMaXN0LCAmbnVtRmlsZXMsICZlcnJvcik7CgogICAgaWYgKGVycm9yKQogICAgewogICAgICAvKiBUT0RPOiBlbXB0eSBmbmFtZXNbXSBmaXJzdCAqLwogICAgICB2aW1fZnJlZShmbmFtZXMpOwogICAgICByZXR1cm4gKGVycm9yKTsKICAgIH0KCiAgICBpZiAoc3RhcnRpbmcgPiAwKQogICAgewoJaW50IGk7CgljaGFyX3UgKnA7CgoJLyogdGhlc2UgYXJlIHRoZSBpbml0aWFsIGZpbGVzIGRyb3BwZWQgb24gdGhlIFZpbSBpY29uICovCglmb3IgKGkgPSAwIDsgaSA8IG51bUZpbGVzOyBpKyspCgl7CgkgICAgaWYgKGdhX2dyb3coJmdsb2JhbF9hbGlzdC5hbF9nYSwgMSkgPT0gRkFJTAoJCQkJICAgICAgfHwgKHAgPSB2aW1fc3Ryc2F2ZShmbmFtZXNbaV0pKSA9PSBOVUxMKQoJCW1jaF9leGl0KDIpOwoJICAgIGVsc2UKCQlhbGlzdF9hZGQoJmdsb2JhbF9hbGlzdCwgcCwgMik7Cgl9Cglnb3RvIGZpbmlzaGVkOwogICAgfQoKICAgIC8qIEhhbmRsZSB0aGUgZHJvcCwgOmVkaXQgdG8gZ2V0IHRvIHRoZSBmaWxlICovCiAgICBoYW5kbGVfZHJvcChudW1GaWxlcywgZm5hbWVzLCBGQUxTRSk7CgogICAgLyogVE9ETzogSGFuZGxlIHRoZSBnb3RvL3NlbGVjdCBsaW5lIG1vcmUgY2xlYW5seSAqLwogICAgaWYgKChudW1GaWxlcyA9PSAxKSAmIChnb3RQb3NpdGlvbikpCiAgICB7CglpZiAodGhlUG9zaXRpb24ubGluZU51bSA+PSAwKQoJewoJICAgIGxudW0gPSB0aGVQb3NpdGlvbi5saW5lTnVtICsgMTsKCS8qICBvYXAtPm1vdGlvbl90eXBlID0gTUxJTkU7CgkgICAgc2V0cGNtYXJrKCk7Ki8KCSAgICBpZiAobG51bSA8IDFMKQoJCWxudW0gPSAxTDsKCSAgICBlbHNlIGlmIChsbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCgkJbG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OwoJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CgkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOwoJLyogIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOyovCgl9CgllbHNlCgkgICAgZ290b19ieXRlKHRoZVBvc2l0aW9uLnN0YXJ0UmFuZ2UgKyAxKTsKICAgIH0KCiAgICAvKiBVcGRhdGUgdGhlIHNjcmVlbiBkaXNwbGF5ICovCiAgICB1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CiNpZmRlZiBGRUFUX1ZJU1VBTAogICAgLyogU2VsZWN0IHRoZSB0ZXh0IGlmIHBvc3NpYmxlICovCiAgICBpZiAoZ290UG9zaXRpb24pCiAgICB7CglWSXN1YWxfYWN0aXZlID0gVFJVRTsKCVZJc3VhbF9zZWxlY3QgPSBGQUxTRTsKCVZJc3VhbCA9IGN1cndpbi0+d19jdXJzb3I7CglpZiAodGhlUG9zaXRpb24ubGluZU51bSA8IDApCgl7CgkgICAgVklzdWFsX21vZGUgPSAndic7CgkgICAgZ290b19ieXRlKHRoZVBvc2l0aW9uLmVuZFJhbmdlKTsKCX0KCWVsc2UKCXsKCSAgICBWSXN1YWxfbW9kZSA9ICdWJzsKCSAgICBWSXN1YWwuY29sID0gMDsKCX0KICAgIH0KI2VuZGlmCiAgICBzZXRjdXJzb3IoKTsKICAgIG91dF9mbHVzaCgpOwoKICAgIC8qIEZha2UgbW91c2UgZXZlbnQgdG8gd2FrZSBmcm9tIHN0YWxsICovCiAgICBQb3N0RXZlbnQobW91c2VVcCwgMCk7CgogIGZpbmlzaGVkOgogICAgQUVEaXNwb3NlRGVzYygmdGhlTGlzdCk7IC8qIGRpc3Bvc2Ugd2hhdCB3ZSBhbGxvY2F0ZWQgKi8KCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiYWV2dF9vZG9jOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWxkXG4iLCAobG9uZyllcnJvcik7CiNlbmRpZgoJcmV0dXJuKGVycm9yKTsKICAgIH0KICAgIHJldHVybihlcnJvcik7Cn0KCi8qCiAqCiAqLwoKICAgIHBhc2NhbCBPU0VycgpIYW5kbGVfYWV2dF9vYXBwX0FFKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQp7CiAgICBPU0VycgllcnJvciA9IG5vRXJyOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJhZXZ0X29hcHA6XG4iKTsKI2VuZGlmCgogICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyh0aGVBRXZlbnQpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuKGVycm9yKTsKICAgIH0KCiAgICByZXR1cm4oZXJyb3IpOwp9CgovKgogKgogKi8KCiAgICBwYXNjYWwgT1NFcnIKSGFuZGxlX2FldnRfcXVpdF9BRShjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbikKewogICAgT1NFcnIJZXJyb3IgPSBub0VycjsKCiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiYWV2dF9xdWl0XG4iKTsKI2VuZGlmCgogICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyh0aGVBRXZlbnQpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuKGVycm9yKTsKICAgIH0KCiAgICAvKiBOZWVkIHRvIGZha2UgYSA6Y29uZmlybSBxYSAqLwogICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJjb25maXJtIHFhIik7CgogICAgcmV0dXJuKGVycm9yKTsKfQoKLyoKICoKICovCgogICAgcGFzY2FsIE9TRXJyCkhhbmRsZV9hZXZ0X3Bkb2NfQUUoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCnsKICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CgojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoImFldnRfcGRvYzpcbiIpOwojZW5kaWYKCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIHJldHVybihlcnJvcik7Cn0KCi8qCiAqIEhhbmRsaW5nIG9mIHVua25vd24gQXBwbGVFdmVudAogKgogKiAoSnVzdCBnZXQgcmlkIG9mIGFsbCB0aGUgcGFybXMpCiAqLwogICAgcGFzY2FsIE9TRXJyCkhhbmRsZV91bmtub3duX0FFKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQp7CiAgICBPU0VycgllcnJvciA9IG5vRXJyOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJVbmtub3duIEV2ZW50OiAleFxuIiwgdGhlQUV2ZW50LT5kZXNjcmlwdG9yVHlwZSk7CiNlbmRpZgoKICAgIGVycm9yID0gSGFuZGxlVW51c2VkUGFybXModGhlQUV2ZW50KTsKICAgIGlmIChlcnJvcikKICAgIHsKCXJldHVybihlcnJvcik7CiAgICB9CgogICAgcmV0dXJuKGVycm9yKTsKfQoKCgojaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCiMgZGVmaW5lIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyh4KSBOZXdBRUV2ZW50SGFuZGxlclVQUCh4KQojZW5kaWYKCi8qCiAqIEluc3RhbGwgdGhlIHZhcmlvdXMgQXBwbGVFdmVudCBIYW5kbGVycwogKi8KICAgIE9TRXJyCkluc3RhbGxBRUhhbmRsZXJzKHZvaWQpCnsKICAgIE9TRXJyICAgZXJyb3I7CgogICAgLyogaW5zdGFsbCBvcGVuIGFwcGxpY2F0aW9uIGhhbmRsZXIgKi8KICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtDb3JlRXZlbnRDbGFzcywga0FFT3BlbkFwcGxpY2F0aW9uLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX2FldnRfb2FwcF9BRSksIDAsIGZhbHNlKTsKICAgIGlmIChlcnJvcikKICAgIHsKCXJldHVybiBlcnJvcjsKICAgIH0KCiAgICAvKiBpbnN0YWxsIHF1aXQgYXBwbGljYXRpb24gaGFuZGxlciAqLwogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0NvcmVFdmVudENsYXNzLCBrQUVRdWl0QXBwbGljYXRpb24sCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfYWV2dF9xdWl0X0FFKSwgMCwgZmFsc2UpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuIGVycm9yOwogICAgfQoKICAgIC8qIGluc3RhbGwgb3BlbiBkb2N1bWVudCBoYW5kbGVyICovCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRU9wZW5Eb2N1bWVudHMsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVPRG9jQUUpLCAwLCBmYWxzZSk7CiAgICBpZiAoZXJyb3IpCiAgICB7CglyZXR1cm4gZXJyb3I7CiAgICB9CgogICAgLyogaW5zdGFsbCBwcmludCBkb2N1bWVudCBoYW5kbGVyICovCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRVByaW50RG9jdW1lbnRzLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX2FldnRfcGRvY19BRSksIDAsIGZhbHNlKTsKCi8qIEluc3RhbGwgQ29yZSBTdWl0ZSAqLwovKiAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDbG9uZSwKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CgogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDbG9zZSwKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CgogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDb3VudEVsZW1lbnRzLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUNyZWF0ZUVsZW1lbnQsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOwoKICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFRGVsZXRlLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRURvT2JqZWN0c0V4aXN0LAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldERhdGEsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIGtBRUdldERhdGEsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldERhdGFTaXplLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBrQUVHZXREYXRhU2l6ZSwgZmFsc2UpOwoKICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFR2V0Q2xhc3NJbmZvLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldEV2ZW50SW5mbywKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CgogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVNb3ZlLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRVNhdmUsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOwoKICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFU2V0RGF0YSwKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CiovCgojaWZkZWYgRkVBVF9DV19FRElUT1IKICAgIC8qCiAgICAgKiBCaW5kIGNvZGV3YXJyaW9yIHN1cHBvcnQgaGFuZGxlcnMKICAgICAqLwogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnR1RUWCcsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfS0FITF9HVFRYX0FFKSwgMCwgZmFsc2UpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuIGVycm9yOwogICAgfQogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnU1JDSCcsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfS0FITF9TUkNIX0FFKSwgMCwgZmFsc2UpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuIGVycm9yOwogICAgfQogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnTU9EICcsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfS0FITF9NT0RfQUUpLCAwLCBmYWxzZSk7CiAgICBpZiAoZXJyb3IpCiAgICB7CglyZXR1cm4gZXJyb3I7CiAgICB9CiNlbmRpZgoKICAgIHJldHVybiBlcnJvcjsKCn0KI2VuZGlmIC8qIFVTRV9BRVZFTlQgKi8KCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChNQUNPU19YKQovKgogKiBDYWxsYmFjayBmdW5jdGlvbiwgaW5zdGFsbGVkIGJ5IEluc3RhbGxGb250UGFuZWxIYW5kbGVyKCksIGJlbG93LAogKiB0byBoYW5kbGUgRm9udCBQYW5lbCBldmVudHMuCiAqLwogICAgc3RhdGljIE9TU3RhdHVzCkZvbnRQYW5lbEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpbkhhbmRsZXJDYWxsUmVmLCBFdmVudFJlZiBpbkV2ZW50LAogICAgdm9pZCAqaW5Vc2VyRGF0YSkKewogICAgaWYgKEdldEV2ZW50S2luZChpbkV2ZW50KSA9PSBrRXZlbnRGb250UGFuZWxDbG9zZWQpCiAgICB7CglnRm9udFBhbmVsSW5mby5pc1BhbmVsVmlzaWJsZSA9IGZhbHNlOwoJcmV0dXJuIG5vRXJyOwogICAgfQoKICAgIGlmIChHZXRFdmVudEtpbmQoaW5FdmVudCkgPT0ga0V2ZW50Rm9udFNlbGVjdGlvbikKICAgIHsKCU9TU3RhdHVzIHN0YXR1czsKCUZNRm9udEZhbWlseSBuZXdGYW1pbHk7CglGTUZvbnRTaXplIG5ld1NpemU7CglGTUZvbnRTdHlsZSBuZXdTdHlsZTsKCgkvKiBSZXRyaWV2ZSB0aGUgZm9udCBmYW1pbHkgSUQgbnVtYmVyLiAqLwoJc3RhdHVzID0gR2V0RXZlbnRQYXJhbWV0ZXIoaW5FdmVudCwga0V2ZW50UGFyYW1GTUZvbnRGYW1pbHksCgkJLyppbkRlc2lyZWRUeXBlPSovdHlwZUZNRm9udEZhbWlseSwgLypvdXRBY3R1YWxUeXBlPSovTlVMTCwKCQkvKmluQnVmZmVyU2l6ZT0qL3NpemVvZihGTUZvbnRGYW1pbHkpLCAvKm91dEFjdHVhbFNpemU9Ki9OVUxMLAoJCSZuZXdGYW1pbHkpOwoJaWYgKHN0YXR1cyA9PSBub0VycikKCSAgICBnRm9udFBhbmVsSW5mby5mYW1pbHkgPSBuZXdGYW1pbHk7CgoJLyogUmV0cmlldmUgdGhlIGZvbnQgc2l6ZS4gKi8KCXN0YXR1cyA9IEdldEV2ZW50UGFyYW1ldGVyKGluRXZlbnQsIGtFdmVudFBhcmFtRk1Gb250U2l6ZSwKCQl0eXBlRk1Gb250U2l6ZSwgTlVMTCwgc2l6ZW9mKEZNRm9udFNpemUpLCBOVUxMLCAmbmV3U2l6ZSk7CglpZiAoc3RhdHVzID09IG5vRXJyKQoJICAgIGdGb250UGFuZWxJbmZvLnNpemUgPSBuZXdTaXplOwoKCS8qIFJldHJpZXZlIHRoZSBmb250IHN0eWxlIChib2xkLCBldGMuKS4gIEN1cnJlbnRseSB1bnVzZWQuICovCglzdGF0dXMgPSBHZXRFdmVudFBhcmFtZXRlcihpbkV2ZW50LCBrRXZlbnRQYXJhbUZNRm9udFN0eWxlLAoJCXR5cGVGTUZvbnRTdHlsZSwgTlVMTCwgc2l6ZW9mKEZNRm9udFN0eWxlKSwgTlVMTCwgJm5ld1N0eWxlKTsKCWlmIChzdGF0dXMgPT0gbm9FcnIpCgkgICAgZ0ZvbnRQYW5lbEluZm8uc3R5bGUgPSBuZXdTdHlsZTsKICAgIH0KICAgIHJldHVybiBub0VycjsKfQoKCiAgICBzdGF0aWMgdm9pZApJbnN0YWxsRm9udFBhbmVsSGFuZGxlcigpCnsKICAgIEV2ZW50VHlwZVNwZWMgZXZlbnRUeXBlc1syXTsKICAgIEV2ZW50SGFuZGxlclVQUCBoYW5kbGVyVVBQOwogICAgLyogRXZlbnRIYW5kbGVyUmVmIGhhbmRsZXJSZWY7ICovCgogICAgZXZlbnRUeXBlc1swXS5ldmVudENsYXNzID0ga0V2ZW50Q2xhc3NGb250OwogICAgZXZlbnRUeXBlc1swXS5ldmVudEtpbmQgID0ga0V2ZW50Rm9udFNlbGVjdGlvbjsKICAgIGV2ZW50VHlwZXNbMV0uZXZlbnRDbGFzcyA9IGtFdmVudENsYXNzRm9udDsKICAgIGV2ZW50VHlwZXNbMV0uZXZlbnRLaW5kICA9IGtFdmVudEZvbnRQYW5lbENsb3NlZDsKCiAgICBoYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKEZvbnRQYW5lbEhhbmRsZXIpOwoKICAgIEluc3RhbGxBcHBsaWNhdGlvbkV2ZW50SGFuZGxlcihoYW5kbGVyVVBQLCAvKm51bVR5cGVzPSovMiwgZXZlbnRUeXBlcywKCSAgICAvKnVzZXJEYXRhPSovTlVMTCwgLypoYW5kbGVyUmVmPSovTlVMTCk7Cn0KCgovKgogKiBGaWxsIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBvdXROYW1lIHdpdGggdGhlIG5hbWUgYW5kIHNpemUKICogb2YgdGhlIGZvbnQgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBGb250IFBhbmVsLgogKi8KI2RlZmluZSBGT05UX1NUWUxFX0JVRkZFUl9TSVpFIDMyCiAgICBzdGF0aWMgdm9pZApHZXRGb250UGFuZWxTZWxlY3Rpb24oY2hhcl91KiBvdXROYW1lKQp7CiAgICBTdHIyNTUJICAgIGJ1ZjsKICAgIEJ5dGVDb3VudAkgICAgZm9udE5hbWVMZW4gPSAwOwogICAgQVRTVUZvbnRJRAkgICAgZmlkOwogICAgY2hhcl91CSAgICBzdHlsZVN0cmluZ1tGT05UX1NUWUxFX0JVRkZFUl9TSVpFXTsKCiAgICBpZiAoIW91dE5hbWUpCglyZXR1cm47CgogICAgaWYgKEZNR2V0Rm9udEZhbWlseU5hbWUoZ0ZvbnRQYW5lbEluZm8uZmFtaWx5LCBidWYpID09IG5vRXJyKQogICAgewoJLyogQ2Fub25pY2FsaXplIGxvY2FsaXplZCBmb250IG5hbWVzICovCglpZiAoRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZShnRm9udFBhbmVsSW5mby5mYW1pbHksCgkJICAgIGdGb250UGFuZWxJbmZvLnN0eWxlLCAmZmlkLCBOVUxMKSAhPSBub0VycikKCSAgICByZXR1cm47CgoJLyogUmVxdWVzdCBmb250IG5hbWUgd2l0aCBNYWMgZW5jb2RpbmcgKG90aGVyd2lzZSB3ZSBjb3VsZAoJICogZ2V0IGFuIHVud2FudGVkIHV0Zi0xNiBuYW1lKSAqLwoJaWYgKEFUU1VGaW5kRm9udE5hbWUoZmlkLCBrRm9udEZ1bGxOYW1lLCBrRm9udE1hY2ludG9zaFBsYXRmb3JtLAoJCSAgICBrRm9udE5vU2NyaXB0Q29kZSwga0ZvbnROb0xhbmd1YWdlQ29kZSwKCQkgICAgMjU1LCBvdXROYW1lLCAmZm9udE5hbWVMZW4sIE5VTEwpICE9IG5vRXJyKQoJICAgIHJldHVybjsKCgkvKiBPbmx5IGVuY29kZSBmb250IHNpemUsIGJlY2F1c2Ugc3R5bGUgKGJvbGQsIGl0YWxpYywgZXRjKSBpcwoJICogYWxyZWFkeSBwYXJ0IG9mIHRoZSBmb250IGZ1bGwgbmFtZSAqLwoJc25wcmludGYoc3R5bGVTdHJpbmcsIEZPTlRfU1RZTEVfQlVGRkVSX1NJWkUsICI6aCVkIiwKCQlnRm9udFBhbmVsSW5mby5zaXplLyosCgkJKChnRm9udFBhbmVsSW5mby5zdHlsZSAmIGJvbGQpIT0wID8gIjpiIiA6ICIiKSwKCQkoKGdGb250UGFuZWxJbmZvLnN0eWxlICYgaXRhbGljKSE9MCA/ICI6aSIgOiAiIiksCgkJKChnRm9udFBhbmVsSW5mby5zdHlsZSAmIHVuZGVybGluZSkhPTAgPyAiOnUiIDogIiIpKi8pOwoKCWlmICgoZm9udE5hbWVMZW4gKyBTVFJMRU4oc3R5bGVTdHJpbmcpKSA8IDI1NSkKCSAgICBTVFJDUFkob3V0TmFtZSArIGZvbnROYW1lTGVuLCBzdHlsZVN0cmluZyk7CiAgICB9CiAgICBlbHNlCiAgICB7Cgkqb3V0TmFtZSA9IE5VTEw7CiAgICB9Cn0KI2VuZGlmCgoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFVuZmlsZWQgeWV0CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qCiAqICBndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXgKICoKICogIFJldHVybnMgdGhlIGluZGV4IGluc2lkZSB0aGUgbWVudSB3aGVyCiAqLwogICAgc2hvcnQgLyogU2hvdWxkZSB3ZSByZXR1cm4gTWVudUl0ZW1JbmRleD8gKi8KZ3VpX21hY19nZXRfbWVudV9pdGVtX2luZGV4KHBNZW51KQogICAgdmltbWVudV9UICpwTWVudTsKewogICAgc2hvcnQJaW5kZXg7CiAgICBzaG9ydAlpdGVtSW5kZXggPSAtMTsKICAgIHZpbW1lbnVfVAkqcEJyb3RoZXI7CgogICAgLyogT25seSBtZW51IHdpdGhvdXQgcGFyZW50IGFyZSB0aGU6CiAgICAgKiAtbWVudSBpbiB0aGUgbWVudWJhcgogICAgICogLXBvcHVwIG1lbnUKICAgICAqIC10b29sYmFyIChndWVzcykKICAgICAqCiAgICAgKiBXaGljaCBhcmUgbm90IGl0ZW1zIGFueXdheS4KICAgICAqLwogICAgaWYgKHBNZW51LT5wYXJlbnQpCiAgICB7CgkvKiBTdGFydCBmcm9tIHRoZSBPbGRlc3QgQnJvdGhlciAqLwoJcEJyb3RoZXIgPSBwTWVudS0+cGFyZW50LT5jaGlsZHJlbjsKCWluZGV4ID0gMTsKCXdoaWxlICgocEJyb3RoZXIpICYmIChpdGVtSW5kZXggPT0gLTEpKQoJewoJICAgIGlmIChwQnJvdGhlciA9PSBwTWVudSkKCQlpdGVtSW5kZXggPSBpbmRleDsKCSAgICBpbmRleCsrOwoJICAgIHBCcm90aGVyID0gcEJyb3RoZXItPm5leHQ7Cgl9CiNpZmRlZiBVU0VfSEVMUE1FTlUKCS8qIEFkanVzdCBpbmRleCBpbiBoZWxwIG1lbnUgKGZvciBwcmVkZWZpbmVkIG9uZXMpICovCglpZiAoaXRlbUluZGV4ICE9IC0xKQoJICAgIGlmIChwTWVudS0+cGFyZW50LT5zdWJtZW51X2lkID09IGtITUhlbHBNZW51SUQpCgkJaXRlbUluZGV4ICs9IGd1aS5NYWNPU0hlbHBJdGVtczsKI2VuZGlmCiAgICB9CiAgICByZXR1cm4gaXRlbUluZGV4Owp9CgogICAgc3RhdGljIHZpbW1lbnVfVCAqCmd1aV9tYWNfZ2V0X3ZpbV9tZW51KG1lbnVJRCwgaXRlbUluZGV4LCBwTWVudSkKICAgIHNob3J0CW1lbnVJRDsKICAgIHNob3J0CWl0ZW1JbmRleDsKICAgIHZpbW1lbnVfVAkqcE1lbnU7CnsKICAgIHNob3J0CWluZGV4OwogICAgdmltbWVudV9UCSpwQ2hpbGRNZW51OwogICAgdmltbWVudV9UCSpwRWxkZXIgPSBwTWVudS0+cGFyZW50OwoKCiAgICAvKiBPbmx5IG1lbnUgd2l0aG91dCBwYXJlbnQgYXJlIHRoZToKICAgICAqIC1tZW51IGluIHRoZSBtZW51YmFyCiAgICAgKiAtcG9wdXAgbWVudQogICAgICogLXRvb2xiYXIgKGd1ZXNzKQogICAgICoKICAgICAqIFdoaWNoIGFyZSBub3QgaXRlbXMgYW55d2F5LgogICAgICovCgogICAgaWYgKChwRWxkZXIpICYmIChwRWxkZXItPnN1Ym1lbnVfaWQgPT0gbWVudUlEKSkKICAgIHsKI2lmZGVmIFVTRV9IRUxQTUVOVQoJaWYgKG1lbnVJRCA9PSBrSE1IZWxwTWVudUlEKQoJICAgIGl0ZW1JbmRleCAtPSBndWkuTWFjT1NIZWxwSXRlbXM7CiNlbmRpZgoKCWZvciAoaW5kZXggPSAxOyAoaW5kZXggIT0gaXRlbUluZGV4KSAmJiAocE1lbnUgIT0gTlVMTCk7IGluZGV4KyspCgkgICAgcE1lbnUgPSBwTWVudS0+bmV4dDsKICAgIH0KICAgIGVsc2UKICAgIHsKCWZvciAoOyBwTWVudSAhPSBOVUxMOyBwTWVudSA9IHBNZW51LT5uZXh0KQoJewoJICAgIGlmIChwTWVudS0+Y2hpbGRyZW4gIT0gTlVMTCkKCSAgICB7CgkJcENoaWxkTWVudSA9IGd1aV9tYWNfZ2V0X3ZpbV9tZW51CgkJCSAgIChtZW51SUQsIGl0ZW1JbmRleCwgcE1lbnUtPmNoaWxkcmVuKTsKCQlpZiAocENoaWxkTWVudSkKCQl7CgkJICAgIHBNZW51ID0gcENoaWxkTWVudTsKCQkgICAgYnJlYWs7CgkJfQoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiBwTWVudTsKfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIE1hY09TIEZlZWRiYWNrIHByb2NlZHVyZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogICAgcGFzY2FsCiAgICB2b2lkCmd1aV9tYWNfZHJhZ190aHVtYihDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wsIHNob3J0IHBhcnRDb2RlKQp7CiAgICBzY3JvbGxiYXJfVAkJKnNiOwogICAgaW50CQkJdmFsdWUsIGRyYWdnaW5nOwogICAgQ29udHJvbEhhbmRsZQl0aGVDb250cm9sVG9Vc2U7CiAgICBpbnQJCQlkb250X3Njcm9sbF9zYXZlID0gZG9udF9zY3JvbGw7CgogICAgdGhlQ29udHJvbFRvVXNlID0gZHJhZ2dlZF9zYjsKCiAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZykgR2V0Q29udHJvbFJlZmVyZW5jZSh0aGVDb250cm9sVG9Vc2UpKTsKCiAgICBpZiAoc2IgPT0gTlVMTCkKCXJldHVybjsKCiAgICAvKiBOZWVkIHRvIGZpbmQgdmFsdWUgYnkgZGlmZiBiZXR3ZWVuIE9sZCBQb3NzIE5ldyBQb3MgKi8KICAgIHZhbHVlID0gR2V0Q29udHJvbDMyQml0VmFsdWUodGhlQ29udHJvbFRvVXNlKTsKICAgIGRyYWdnaW5nID0gKHBhcnRDb2RlICE9IDApOwoKICAgIC8qIFdoZW4gImFsbG93X3Njcm9sbGJhciIgaXMgRkFMU0Ugc3RpbGwgbmVlZCB0byByZW1lbWJlciB0aGUgbmV3CiAgICAgKiBwb3NpdGlvbiwgYnV0IGRvbid0IGFjdHVhbGx5IHNjcm9sbCBieSBzZXR0aW5nICJkb250X3Njcm9sbCIuICovCiAgICBkb250X3Njcm9sbCA9ICFhbGxvd19zY3JvbGxiYXI7CiAgICBndWlfZHJhZ19zY3JvbGxiYXIoc2IsIHZhbHVlLCBkcmFnZ2luZyk7CiAgICBkb250X3Njcm9sbCA9IGRvbnRfc2Nyb2xsX3NhdmU7Cn0KCiAgICBwYXNjYWwKICAgIHZvaWQKZ3VpX21hY19zY3JvbGxfYWN0aW9uKENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCwgc2hvcnQgcGFydENvZGUpCnsKICAgIC8qIFRPRE86IGhhdmUgbGl2ZSBzdXBwb3J0ICovCiAgICBzY3JvbGxiYXJfVCAqc2IsICpzYl9pbmZvOwogICAgbG9uZwlkYXRhOwogICAgbG9uZwl2YWx1ZTsKICAgIGludAkJcGFnZTsKICAgIGludAkJZHJhZ2dpbmcgPSBGQUxTRTsKICAgIGludAkJZG9udF9zY3JvbGxfc2F2ZSA9IGRvbnRfc2Nyb2xsOwoKICAgIHNiID0gZ3VpX2ZpbmRfc2Nyb2xsYmFyKChsb25nKUdldENvbnRyb2xSZWZlcmVuY2UodGhlQ29udHJvbCkpOwoKICAgIGlmIChzYiA9PSBOVUxMKQoJcmV0dXJuOwoKICAgIGlmIChzYi0+d3AgIT0gTlVMTCkJCS8qIExlZnQgb3IgcmlnaHQgc2Nyb2xsYmFyICovCiAgICB7CgkvKgoJICogQ2FyZWZ1bDogbmVlZCB0byBnZXQgc2Nyb2xsYmFyIGluZm8gb3V0IG9mIGZpcnN0IChsZWZ0KSBzY3JvbGxiYXIKCSAqIGZvciB3aW5kb3csIGJ1dCBrZWVwIHJlYWwgc2Nyb2xsYmFyIHRvbyBiZWNhdXNlIHdlIG11c3QgcGFzcyBpdCB0bwoJICogZ3VpX2RyYWdfc2Nyb2xsYmFyKCkuCgkgKi8KCXNiX2luZm8gPSAmc2ItPndwLT53X3Njcm9sbGJhcnNbMF07CgoJaWYgKHNiX2luZm8tPnNpemUgPiA1KQoJICAgIHBhZ2UgPSBzYl9pbmZvLT5zaXplIC0gMjsJLyogdXNlIHR3byBsaW5lcyBvZiBjb250ZXh0ICovCgllbHNlCgkgICAgcGFnZSA9IHNiX2luZm8tPnNpemU7CiAgICB9CiAgICBlbHNlCQkJLyogQm90dG9tIHNjcm9sbGJhciAqLwogICAgewoJc2JfaW5mbyA9IHNiOwoJcGFnZSA9IFdfV0lEVEgoY3Vyd2luKSAtIDU7CiAgICB9CgogICAgc3dpdGNoIChwYXJ0Q29kZSkKICAgIHsKCWNhc2UgIGtDb250cm9sVXBCdXR0b25QYXJ0OiAgIGRhdGEgPSAtMTsgICAgYnJlYWs7CgljYXNlICBrQ29udHJvbERvd25CdXR0b25QYXJ0OiBkYXRhID0gMTsgICAgIGJyZWFrOwoJY2FzZSAga0NvbnRyb2xQYWdlRG93blBhcnQ6ICAgZGF0YSA9IHBhZ2U7ICBicmVhazsKCWNhc2UgIGtDb250cm9sUGFnZVVwUGFydDogICAgIGRhdGEgPSAtcGFnZTsgYnJlYWs7CgkJICAgIGRlZmF1bHQ6IGRhdGEgPSAwOyBicmVhazsKICAgIH0KCiAgICB2YWx1ZSA9IHNiX2luZm8tPnZhbHVlICsgZGF0YTsKLyogIGlmICh2YWx1ZSA+IHNiX2luZm8tPm1heCkKCXZhbHVlID0gc2JfaW5mby0+bWF4OwogICAgZWxzZSBpZiAodmFsdWUgPCAwKQoJdmFsdWUgPSAwOyovCgogICAgLyogV2hlbiAiYWxsb3dfc2Nyb2xsYmFyIiBpcyBGQUxTRSBzdGlsbCBuZWVkIHRvIHJlbWVtYmVyIHRoZSBuZXcKICAgICAqIHBvc2l0aW9uLCBidXQgZG9uJ3QgYWN0dWFsbHkgc2Nyb2xsIGJ5IHNldHRpbmcgImRvbnRfc2Nyb2xsIi4gKi8KICAgIGRvbnRfc2Nyb2xsID0gIWFsbG93X3Njcm9sbGJhcjsKICAgIGd1aV9kcmFnX3Njcm9sbGJhcihzYiwgdmFsdWUsIGRyYWdnaW5nKTsKICAgIGRvbnRfc2Nyb2xsID0gZG9udF9zY3JvbGxfc2F2ZTsKCiAgICBvdXRfZmx1c2goKTsKICAgIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYihzYiwgdmFsdWUsIHNiX2luZm8tPnNpemUsIHNiX2luZm8tPm1heCk7CgovKiAgaWYgKHNiX2luZm8tPndwICE9IE5VTEwpCiAgICB7Cgl3aW5fVAkqd3A7CglpbnQJc2JfbnVtOwoKCXNiX251bSA9IDA7Cglmb3IgKHdwID0gZmlyc3R3aW47IHdwICE9IHNiLT53cCAmJiB3cCAhPSBOVUxMOyB3cCA9IFdfTkVYVCh3cCkpCglzYl9udW0rKzsKCglpZiAod3AgIT0gTlVMTCkKCXsKCSAgICBjdXJyZW50X3Njcm9sbGJhciA9IHNiX251bTsKCSAgICBzY3JvbGxiYXJfdmFsdWUgPSB2YWx1ZTsKCSAgICBndWlfZG9fc2Nyb2xsKCk7CgkgICAgZ3VpX21jaF9zZXRfc2Nyb2xsYmFyX3RodW1iKHNiLCB2YWx1ZSwgc2JfaW5mby0+c2l6ZSwgc2JfaW5mby0+bWF4KTsKCX0KICAgIH0qLwp9CgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogTWFjT1MgQ2xpY2sgSGFuZGxpbmcgcHJvY2VkdXJlcwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgoKLyoKICogSGFuZGxlIGEgY2xpY2sgaW5zaWRlIHRoZSB3aW5kb3csIGl0IG1heSBoYXBwZW5zIGluIHRoZQogKiBzY3JvbGxiYXIgb3IgdGhlIGNvbnRlbnRzLgogKgogKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgcG90ZW50aWFsIFRPT0xCQVIKICovCiAgICB2b2lkCmd1aV9tYWNfZG9JbkNvbnRlbnRDbGljayh0aGVFdmVudCwgd2hpY2hXaW5kb3cpCiAgICBFdmVudFJlY29yZCAqdGhlRXZlbnQ7CiAgICBXaW5kb3dQdHIJIHdoaWNoV2luZG93Owp7CiAgICBQb2ludAkJdGhlUG9pbnQ7CiAgICBpbnRfdQkJdmltTW9kaWZpZXJzOwogICAgc2hvcnQJCXRoZVBvcnRpb247CiAgICBDb250cm9sSGFuZGxlCXRoZUNvbnRyb2w7CiAgICBpbnQJCQl2aW1Nb3VzZUJ1dHRvbjsKICAgIHNob3J0CQlkYmxDbGljazsKCiAgICB0aGVQb2ludCA9IHRoZUV2ZW50LT53aGVyZTsKICAgIEdsb2JhbFRvTG9jYWwoJnRoZVBvaW50KTsKICAgIFNlbGVjdFdpbmRvdyh3aGljaFdpbmRvdyk7CgogICAgdGhlUG9ydGlvbiA9IEZpbmRDb250cm9sKHRoZVBvaW50LCB3aGljaFdpbmRvdywgJnRoZUNvbnRyb2wpOwoKICAgIGlmICh0aGVDb250cm9sICE9IE5VTCkKICAgIHsKCS8qIFdlIGhpdCBhIHNjb2xsYmFyICovCgoJaWYgKHRoZVBvcnRpb24gIT0ga0NvbnRyb2xJbmRpY2F0b3JQYXJ0KQoJewoJICAgIGRyYWdnZWRfc2IgPSB0aGVDb250cm9sOwoJICAgIFRyYWNrQ29udHJvbCh0aGVDb250cm9sLCB0aGVQb2ludCwgZ1Njcm9sbEFjdGlvbik7CgkgICAgZHJhZ2dlZF9zYiA9IE5VTEw7Cgl9CgllbHNlCgl7CgkgICAgZHJhZ2dlZF9zYiA9IHRoZUNvbnRyb2w7CiNpZiAxCgkgICAgVHJhY2tDb250cm9sKHRoZUNvbnRyb2wsIHRoZVBvaW50LCBnU2Nyb2xsRHJhZyk7CiNlbHNlCgkgICAgVHJhY2tDb250cm9sKHRoZUNvbnRyb2wsIHRoZVBvaW50LCBOVUxMKTsKI2VuZGlmCgkgICAgLyogcGFzcyAwIGFzIHRoZSBwYXJ0IHRvIHRlbGwgZ3VpX21hY19kcmFnX3RodW1iLCB0aGF0IHRoZSBtb3VzZQoJICAgICAqIGJ1dHRvbiBoYXMgYmVlbiByZWxlYXNlZCAqLwoJICAgIGd1aV9tYWNfZHJhZ190aHVtYih0aGVDb250cm9sLCAwKTsgLyogU2hvdWxkIGl0IGJlIHRoZVBvcnRpb24gPyAoRGFueSkgKi8KCSAgICBkcmFnZ2VkX3NiID0gTlVMTDsKCX0KICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIFdlIGFyZSBpbnNpZGUgdGhlIGNvbnRlbnRzICovCgoJLyogQ29udmVydCB0aGUgQ1RSTCwgT1BUSU9OLCBTSElGVCBhbmQgQ01EIGtleSAqLwoJdmltTW9kaWZpZXJzID0gRXZlbnRNb2RpZmllcnMyVmltTW91c2VNb2RpZmllcnModGhlRXZlbnQtPm1vZGlmaWVycyk7CgoJLyogRGVmYXVsdHMgdG8gTU9VU0VfTEVGVCBhcyB0aGVyZSdzIG9ubHkgb25lIG1vdXNlIGJ1dHRvbiAqLwoJdmltTW91c2VCdXR0b24gPSBNT1VTRV9MRUZUOwoKI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCgkvKiBDb252ZXJ0IHRoZSBDVFJMX01PVVNFX0xFRlQgdG8gTU9VU0VfUklHSFQgKi8KCWNsaWNrSXNQb3B1cCA9IEZBTFNFOwoKCWlmICgoZ3VpLk1hY09TSGF2ZUNudHhNZW51KSAmJiAobW91c2VfbW9kZWxfcG9wdXAoKSkpCgkgICAgaWYgKElzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2sodGhlRXZlbnQpKQoJICAgIHsKCQl2aW1Nb3VzZUJ1dHRvbiA9IE1PVVNFX1JJR0hUOwoJCXZpbU1vZGlmaWVycyAmPSB+TU9VU0VfQ1RSTDsKCQljbGlja0lzUG9wdXAgPSBUUlVFOwoJICAgIH0KI2VuZGlmCgoJLyogSXMgaXQgYSBkb3VibGUgY2xpY2sgPyAqLwoJZGJsQ2xpY2sgPSAoKHRoZUV2ZW50LT53aGVuIC0gbGFzdE1vdXNlVGljaykgPCBHZXREYmxUaW1lKCkpOwoKCS8qIFNlbmQgdGhlIG1vdXNlIGNsaWNqIHRvIFZpbSAqLwoJZ3VpX3NlbmRfbW91c2VfZXZlbnQodmltTW91c2VCdXR0b24sIHRoZVBvaW50LmgsCgkJCQkJICB0aGVQb2ludC52LCBkYmxDbGljaywgdmltTW9kaWZpZXJzKTsKCgkvKiBDcmVhdGUgdGhlIHJlY3RhbmdsZSBhcm91bmQgdGhlIGN1cnNvciB0byBkZXRlY3QKCSAqIHRoZSBtb3VzZSBkcmFnZ2luZwoJICovCiNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQojaWYgMAoJLyogVE9ETzogRG8gd2UgbmVlZCB0byB0aGlzIGV2ZW4gZm9yIHRoZSBjb250ZXh0dWFsIG1lbnU/CgkgKiBJdCBtYXkgYmUgcmVxdWlyZSBmb3IgcG9wdXBfc2V0cG9zLCBidXQgZm9yIHBvcHVwPwoJICovCglpZiAodmltTW91c2VCdXR0b24gPT0gTU9VU0VfTEVGVCkKI2VuZGlmCiNlbmRpZgoJewoJICAgIFNldFJlY3QoJmRyYWdSZWN0LCBGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSksCgkJCQlGSUxMX1koWV8yX1JPVyh0aGVQb2ludC52KSksCgkJCQlGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSsxKSwKCQkJCUZJTExfWShZXzJfUk9XKHRoZVBvaW50LnYpKzEpKTsKCgkgICAgZHJhZ1JlY3RFbmJsID0gVFJVRTsKCSAgICBkcmFnUmVjdENvbnRyb2wgPSBrQ3JlYXRlUmVjdDsKCX0KICAgIH0KfQoKLyoKICogSGFuZGxlIHRoZSBjbGljayBpbiB0aGUgdGl0bGViYXIgKHRvIG1vdmUgdGhlIHdpbmRvdykKICovCiAgICB2b2lkCmd1aV9tYWNfZG9JbkRyYWdDbGljayh3aGVyZSwgd2hpY2hXaW5kb3cpCiAgICBQb2ludAl3aGVyZTsKICAgIFdpbmRvd1B0cgl3aGljaFdpbmRvdzsKewogICAgUmVjdAltb3ZpbmdMaW1pdHM7CiAgICBSZWN0CSptb3ZpbmdMaW1pdHNQdHIgPSAmbW92aW5nTGltaXRzOwoKICAgIC8qIFRPRE86IG1heSB0cnkgdG8gcHJldmVudCBtb3ZlIG91dHNpZGUgc2NyZWVuPyAqLwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIG1vdmluZ0xpbWl0c1B0ciA9IEdldFJlZ2lvbkJvdW5kcyhHZXRHcmF5UmduKCksICZtb3ZpbmdMaW1pdHMpOwojZWxzZQogICAgbW92aW5nTGltaXRzUHRyID0gJigqR2V0R3JheVJnbigpKS0+cmduQkJveDsKI2VuZGlmCiAgICBEcmFnV2luZG93KHdoaWNoV2luZG93LCB3aGVyZSwgbW92aW5nTGltaXRzUHRyKTsKfQoKLyoKICogSGFuZGxlIHRoZSBjbGljayBpbiB0aGUgZ3JvdyBib3gKICovCiAgICB2b2lkCmd1aV9tYWNfZG9Jbkdyb3dDbGljayh3aGVyZSwgd2hpY2hXaW5kb3cpCiAgICBQb2ludAl3aGVyZTsKICAgIFdpbmRvd1B0cgl3aGljaFdpbmRvdzsKewoKICAgIGxvbmcJICAgIG5ld1NpemU7CiAgICB1bnNpZ25lZCBzaG9ydCAgbmV3V2lkdGg7CiAgICB1bnNpZ25lZCBzaG9ydCAgbmV3SGVpZ2h0OwogICAgUmVjdAkgICAgcmVzaXplTGltaXRzOwogICAgUmVjdAkgICAgKnJlc2l6ZUxpbWl0c1B0ciA9ICZyZXNpemVMaW1pdHM7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgUmVjdAkgICAgTmV3Q29udGVudFJlY3Q7CgogICAgcmVzaXplTGltaXRzUHRyID0gR2V0UmVnaW9uQm91bmRzKEdldEdyYXlSZ24oKSwgJnJlc2l6ZUxpbWl0cyk7CiNlbHNlCiAgICByZXNpemVMaW1pdHMgPSBxZC5zY3JlZW5CaXRzLmJvdW5kczsKI2VuZGlmCgogICAgLyogU2V0IHRoZSBtaW5pbXVuIHNpemUgKi8KICAgIC8qIFRPRE86IFNob3VsZCB0aGlzIGNvbWUgZnJvbSBWaW0/ICovCiAgICByZXNpemVMaW1pdHMudG9wID0gMTAwOwogICAgcmVzaXplTGltaXRzLmxlZnQgPSAxMDA7CgojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIG5ld1NpemUgPSBSZXNpemVXaW5kb3cod2hpY2hXaW5kb3csIHdoZXJlLCAmcmVzaXplTGltaXRzLCAmTmV3Q29udGVudFJlY3QpOwogICAgbmV3V2lkdGggID0gTmV3Q29udGVudFJlY3QucmlnaHQgLSBOZXdDb250ZW50UmVjdC5sZWZ0OwogICAgbmV3SGVpZ2h0ID0gTmV3Q29udGVudFJlY3QuYm90dG9tIC0gTmV3Q29udGVudFJlY3QudG9wOwogICAgZ3VpX3Jlc2l6ZV9zaGVsbChuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKICAgIGd1aV9zZXRfc2hlbGxzaXplKFRSVUUsIEZBTFNFKTsKI2Vsc2UKICAgIG5ld1NpemUgPSBHcm93V2luZG93KHdoaWNoV2luZG93LCB3aGVyZSwgJnJlc2l6ZUxpbWl0cyk7CiAgICBpZiAobmV3U2l6ZSAhPSAwKQogICAgewoJbmV3V2lkdGggID0gbmV3U2l6ZSAmIDB4MDAwMEZGRkY7CgluZXdIZWlnaHQgPSAobmV3U2l6ZSA+PiAxNikgJiAweDAwMDBGRkZGOwoKCWd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKCglndWlfcmVzaXplX3NoZWxsKG5ld1dpZHRoLCBuZXdIZWlnaHQpOwoKCS8qCgkgKiBXZSBuZWVkIHRvIGNhbGwgZ3VpX3NldF9zaGVsbHNpemUgYXMgdGhlIHNpemUKCSAqIHVzZWQgYnkgVmltIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHNpemUgc2VsZWN0ZWQKCSAqIGJ5IHRoZSB1c2VyLiBUaGlzIGNhdXNlIHNvbWUgb3ZlcmhlYWQKCSAqIFRPRE86IGFkZCBhIGNoZWNrIGluc2lkZSBndWlfcmVzaXplX3NoZWxsPwoJICovCglndWlfc2V0X3NoZWxsc2l6ZShUUlVFLCBGQUxTRSk7CgoJLyoKCSAqIE9yaWdpbiBvZiB0aGUgY29kZSBiZWxvdyBpcyB1bmtub3duLgoJICogRnVuY3Rpb25hbGl0eSBpcyB1bmtub3duLgoJICogVGltZSBvZiBjb21tZW50ZWQgb3V0IGlzIHVua25vd24uCgkgKi8KLyoJU2V0UG9ydCh3cCk7CglJbnZhbFJlY3QoJndwLT5wb3J0UmVjdCk7CglpZiAoaXNVc2VyV2luZG93KHdwKSkgewoJICAgIERyYXdpbmdXaW5kb3dQZWVrCWFXaW5kb3cgPSAoRHJhd2luZ1dpbmRvd1BlZWspd3A7CgoJICAgIGlmIChhV2luZG93LT50b29sUm91dGluZXMudG9vbFdpbmRvd1Jlc2l6ZWRQcm9jKQoJCUNhbGxUb29sV2luZG93UmVzaXplZFByb2MoYVdpbmRvdy0+dG9vbFJvdXRpbmVzLnRvb2xXaW5kb3dSZXNpemVkUHJvYywgd3ApOwoJfSovCiAgICB9OwojZW5kaWYKCn0KCi8qCiAqIEhhbmRsZSB0aGUgY2xpY2sgaW4gdGhlIHpvb20gYm94CiAqLwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIHN0YXRpYyB2b2lkCmd1aV9tYWNfZG9Jblpvb21DbGljayh0aGVFdmVudCwgd2hpY2hXaW5kb3cpCiAgICBFdmVudFJlY29yZAkqdGhlRXZlbnQ7CiAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7CnsKICAgIFJlY3QJcjsKICAgIFBvaW50CXA7CiAgICBzaG9ydAl0aGVQYXJ0OwoKICAgIC8qIGlkZWFsIHdpZHRoIGlzIGN1cnJlbnQgKi8KICAgIHAuaCA9IENvbHVtbnMgKiBndWkuY2hhcl93aWR0aCArIDIgKiBndWkuYm9yZGVyX29mZnNldDsKICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQoJcC5oICs9IGd1aS5zY3JvbGxiYXJfd2lkdGg7CiAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9SSUdIVF0pCglwLmggKz0gZ3VpLnNjcm9sbGJhcl93aWR0aDsKICAgIC8qIGlkZWFsIGhlaWdodCBpcyBhcyBoZWlnaCBhcyB3ZSBjYW4gZ2V0ICovCiAgICBwLnYgPSAxNSAqIDEwMjQ7CgogICAgdGhlUGFydCA9IElzV2luZG93SW5TdGFuZGFyZFN0YXRlKHdoaWNoV2luZG93LCAmcCwgJnIpCgkJCQkJCSAgICAgICA/IGluWm9vbUluIDogaW5ab29tT3V0OwoKICAgIGlmICghVHJhY2tCb3god2hpY2hXaW5kb3csIHRoZUV2ZW50LT53aGVyZSwgdGhlUGFydCkpCglyZXR1cm47CgogICAgLyogdXNlIHJldHVybmVkIHdpZHRoICovCiAgICBwLmggPSByLnJpZ2h0IC0gci5sZWZ0OwogICAgLyogYWRqdXN0IHJldHVybmVkIGhlaWdodCAqLwogICAgcC52ID0gci5ib3R0b20gLSByLnRvcCAtIDIgKiBndWkuYm9yZGVyX29mZnNldDsKICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0JPVFRPTV0pCglwLnYgLT0gZ3VpLnNjcm9sbGJhcl9oZWlnaHQ7CiAgICBwLnYgLT0gcC52ICUgZ3VpLmNoYXJfaGVpZ2h0OwogICAgcC52ICs9IDIgKiBndWkuYm9yZGVyX3dpZHRoOwogICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfQk9UVE9NXSk7CglwLnYgKz0gZ3VpLnNjcm9sbGJhcl9oZWlnaHQ7CgogICAgWm9vbVdpbmRvd0lkZWFsKHdoaWNoV2luZG93LCB0aGVQYXJ0LCAmcCk7CgogICAgR2V0V2luZG93Qm91bmRzKHdoaWNoV2luZG93LCBrV2luZG93Q29udGVudFJnbiwgJnIpOwogICAgZ3VpX3Jlc2l6ZV9zaGVsbChyLnJpZ2h0IC0gci5sZWZ0LCByLmJvdHRvbSAtIHIudG9wKTsKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKICAgIGd1aV9zZXRfc2hlbGxzaXplKFRSVUUsIEZBTFNFKTsKfQojZW5kaWYgLyogZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgKi8KCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBNYWNPUyBFdmVudCBIYW5kbGluZyBwcm9jZWR1cmUKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoKICogSGFuZGxlIHRoZSBVcGRhdGUgRXZlbnQKICovCgogICAgdm9pZApndWlfbWFjX2RvVXBkYXRlRXZlbnQoZXZlbnQpCiAgICBFdmVudFJlY29yZAkqZXZlbnQ7CnsKICAgIFdpbmRvd1B0cgl3aGljaFdpbmRvdzsKICAgIEdyYWZQdHIJc2F2ZVBvcnQ7CiAgICBSZ25IYW5kbGUJdXBkYXRlUmduOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFJlY3QJdXBkYXRlUmVjdDsKI2VuZGlmCiAgICBSZWN0CSp1cGRhdGVSZWN0UHRyOwogICAgUmVjdAlyYzsKICAgIFJlY3QJZ3Jvd1JlY3Q7CiAgICBSZ25IYW5kbGUJc2F2ZVJnbjsKCgojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIHVwZGF0ZVJnbiA9IE5ld1JnbigpOwogICAgaWYgKHVwZGF0ZVJnbiA9PSBOVUxMKQoJcmV0dXJuOwojZW5kaWYKCiAgICAvKiBUaGlzIGNvdWxkIGJlIGRvbmUgYnkgdGhlIGNhbGxlciBhcyB3ZQogICAgICogZG9uJ3QgcmVxdWlyZSBhbnl0aGluZyBlbHNlIG91dCBvZiB0aGUgZXZlbnQKICAgICAqLwogICAgd2hpY2hXaW5kb3cgPSAoV2luZG93UHRyKSBldmVudC0+bWVzc2FnZTsKCiAgICAvKiBTYXZlIEN1cnJlbnQgUG9ydCAqLwogICAgR2V0UG9ydCgmc2F2ZVBvcnQpOwoKICAgIC8qIFNlbGVjdCB0aGUgV2luZG93J3MgUG9ydCAqLwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFNldFBvcnRXaW5kb3dQb3J0KHdoaWNoV2luZG93KTsKI2Vsc2UKICAgIFNldFBvcnQod2hpY2hXaW5kb3cpOwojZW5kaWYKCiAgICAvKiBMZXQncyB1cGRhdGUgdGhlIHdpbmRvdyAqLwogICAgICBCZWdpblVwZGF0ZSh3aGljaFdpbmRvdyk7CgkvKiBSZWRyYXcgdGhlIGJpZ2dlc3QgcmVjdGFuZ2xlIGNvdmVyaW5nIHRoZSBhcmVhCgkgKiB0byBiZSB1cGRhdGVkLgoJICovCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAoJR2V0UG9ydFZpc2libGVSZWdpb24oR2V0V2luZG93UG9ydCh3aGljaFdpbmRvdyksIHVwZGF0ZVJnbik7CiMgaWYgMAoJLyogV291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byB1c2UgdGhlIGZvbGx3aW5nIGJ1dCBkb2Vzbid0CgkgKiBzZWVtIHRvIHdvcmsgdW5kZXIgTWFjT1MgWCAoRGFueSkKCSAqLwoJR2V0V2luZG93UmVnaW9uKHdoaWNoV2luZG93LCBrV2luZG93VXBkYXRlUmduLCB1cGRhdGVSZ24pOwojIGVuZGlmCiNlbHNlCgl1cGRhdGVSZ24gPSB3aGljaFdpbmRvdy0+dmlzUmduOwojZW5kaWYKCS8qIFVzZSB0aGUgSExvY2sgdXNlbGVzcyBpbiBDYXJib24/IElzIGl0IGhhcm1mdWw/Ki8KCUhMb2NrKChIYW5kbGUpIHVwZGF0ZVJnbik7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAoJICB1cGRhdGVSZWN0UHRyID0gR2V0UmVnaW9uQm91bmRzKHVwZGF0ZVJnbiwgJnVwZGF0ZVJlY3QpOwojIGlmIDAKCSAgLyogQ29kZSBmcm9tIG9yaWdpbmFsIENhcmJvbiBQb3J0ICh1c2luZyBHZXRXaW5kb3dSZWdpb24uCgkgICAqIEkgYmVsaWV2ZSB0aGUgVXBkYXRlUmduIGlzIGFscmVhZHkgaW4gbG9jYWwgKERhbnkpCgkgICAqLwoJICBHbG9iYWxUb0xvY2FsKCZ0b3BMZWZ0KHVwZGF0ZVJlY3QpKTsgLyogcHJlQ2FyYm9uPyAqLwoJICBHbG9iYWxUb0xvY2FsKCZib3RSaWdodCh1cGRhdGVSZWN0KSk7CiMgZW5kaWYKI2Vsc2UKCSAgdXBkYXRlUmVjdFB0ciA9ICYoKnVwZGF0ZVJnbiktPnJnbkJCb3g7CiNlbmRpZgoJICAvKiBVcGRhdGUgdGhlIGNvbnRlbnQgKGkuZS4gdGhlIHRleHQpICovCgkgIGd1aV9yZWRyYXcodXBkYXRlUmVjdFB0ci0+bGVmdCwgdXBkYXRlUmVjdFB0ci0+dG9wLAoJCSAgICAgIHVwZGF0ZVJlY3RQdHItPnJpZ2h0IC0gdXBkYXRlUmVjdFB0ci0+bGVmdCwKCQkgICAgICB1cGRhdGVSZWN0UHRyLT5ib3R0b20gICAtIHVwZGF0ZVJlY3RQdHItPnRvcCk7CgkgIC8qIENsZWFyIHRoZSBib3JkZXIgYXJlYXMgaWYgbmVlZGVkICovCgkgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKCSAgaWYgKHVwZGF0ZVJlY3RQdHItPmxlZnQgPCBGSUxMX1goMCkpCgkgIHsKCSAgICBTZXRSZWN0KCZyYywgMCwgMCwgRklMTF9YKDApLCBGSUxMX1koUm93cykpOwoJICAgIEVyYXNlUmVjdCgmcmMpOwoJICB9CgkgIGlmICh1cGRhdGVSZWN0UHRyLT50b3AgPCBGSUxMX1koMCkpCgkgIHsKCSAgICBTZXRSZWN0KCZyYywgMCwgMCwgRklMTF9YKENvbHVtbnMpLCBGSUxMX1koMCkpOwoJICAgIEVyYXNlUmVjdCgmcmMpOwoJICB9CgkgIGlmICh1cGRhdGVSZWN0UHRyLT5yaWdodCA+IEZJTExfWChDb2x1bW5zKSkKCSAgewoJICAgIFNldFJlY3QoJnJjLCBGSUxMX1goQ29sdW1ucyksIDAsCgkJCSAgIEZJTExfWChDb2x1bW5zKSArIGd1aS5ib3JkZXJfb2Zmc2V0LCBGSUxMX1koUm93cykpOwoJICAgIEVyYXNlUmVjdCgmcmMpOwoJICB9CgkgIGlmICh1cGRhdGVSZWN0UHRyLT5ib3R0b20gPiBGSUxMX1koUm93cykpCgkgIHsKCSAgICBTZXRSZWN0KCZyYywgMCwgRklMTF9ZKFJvd3MpLCBGSUxMX1goQ29sdW1ucykgKyBndWkuYm9yZGVyX29mZnNldCwKCQkJCQkgICAgRklMTF9ZKFJvd3MpICsgZ3VpLmJvcmRlcl9vZmZzZXQpOwoJICAgIEVyYXNlUmVjdCgmcmMpOwoJICB9CglIVW5sb2NrKChIYW5kbGUpIHVwZGF0ZVJnbik7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAoJRGlzcG9zZVJnbih1cGRhdGVSZ24pOwojZW5kaWYKCgkvKiBVcGRhdGUgc2Nyb2xsYmFycyAqLwoJRHJhd0NvbnRyb2xzKHdoaWNoV2luZG93KTsKCgkvKiBVcGRhdGUgdGhlIEdyb3dCb3ggKi8KCS8qIFRha2VuIGZyb20gRkFRIDMzLTI3ICovCglzYXZlUmduID0gTmV3UmduKCk7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAoJR2V0V2luZG93Qm91bmRzKHdoaWNoV2luZG93LCBrV2luZG93R3Jvd1JnbiwgJmdyb3dSZWN0KTsKI2Vsc2UKCWdyb3dSZWN0ID0gd2hpY2hXaW5kb3ctPnBvcnRSZWN0OwoJZ3Jvd1JlY3QudG9wICA9IGdyb3dSZWN0LmJvdHRvbSAtIDE1OwoJZ3Jvd1JlY3QubGVmdCA9IGdyb3dSZWN0LnJpZ2h0ICAtIDE1OwojZW5kaWYKCUdldENsaXAoc2F2ZVJnbik7CglDbGlwUmVjdCgmZ3Jvd1JlY3QpOwoJRHJhd0dyb3dJY29uKHdoaWNoV2luZG93KTsKCVNldENsaXAoc2F2ZVJnbik7CglEaXNwb3NlUmduKHNhdmVSZ24pOwogICAgICBFbmRVcGRhdGUod2hpY2hXaW5kb3cpOwoKICAgIC8qIFJlc3RvcmUgb3JpZ2luYWwgUG9ydCAqLwogICAgU2V0UG9ydChzYXZlUG9ydCk7Cn0KCi8qCiAqIEhhbmRsZSB0aGUgYWN0aXZhdGUvZGVhY3RpdmF0ZSBldmVudAogKiAoYXBwbHkgdG8gYSB3aW5kb3cpCiAqLwogICAgdm9pZApndWlfbWFjX2RvQWN0aXZhdGVFdmVudChldmVudCkKICAgIEV2ZW50UmVjb3JkCSpldmVudDsKewogICAgV2luZG93UHRyCXdoaWNoV2luZG93OwoKICAgIHdoaWNoV2luZG93ID0gKFdpbmRvd1B0cikgZXZlbnQtPm1lc3NhZ2U7CiAgICBpZiAoKGV2ZW50LT5tb2RpZmllcnMpICYgYWN0aXZlRmxhZykKCS8qIEFjdGl2YXRlICovCglndWlfZm9jdXNfY2hhbmdlKFRSVUUpOwogICAgZWxzZQogICAgewoJLyogRGVhY3RpdmF0ZSAqLwoJZ3VpX2ZvY3VzX2NoYW5nZShGQUxTRSk7Ci8qCURPTidUIEtOT1cgd2hhdCB0aGUgY29kZSBiZWxvdyB3YXMgZG9pbmcKCWZvdW5kIGluIHRoZSBkZWFjdGl2YXRlIGNsYXVzZSwgYnV0IHRoZQoJY2xhdXNlIHdyaXR0aW5nIFRSVUUgaW50byBpbl9mb2N1cyAoQlVHKQogKi8KCiNpZiAwCS8qIFJlbW92ZWQgYnkgRGFueSBhcyBwZXIgYWJvdmUgSnVuZSAyMDAxICovCglhX2Jvb2wgPSBmYWxzZTsKCVNldFByZXNlcnZlR2x5cGgoYV9ib29sKTsKCVNldE91dGxpbmVQcmVmZXJyZWQoYV9ib29sKTsKI2VuZGlmCiAgICB9Cn0KCgovKgogKiBIYW5kbGUgdGhlIHN1c3BlbmQvcmVzdW1lIGV2ZW50CiAqIChhcHBseSB0byB0aGUgYXBwbGljYXRpb24pCiAqLwogICAgdm9pZApndWlfbWFjX2RvU3VzcGVuZEV2ZW50KGV2ZW50KQogICAgRXZlbnRSZWNvcmQJKmV2ZW50Owp7CiAgICAvKiBUaGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uIGp1c3QgY2hhbmdlZCAqLwoKICAgIC8qIE5PVEU6IHRoZSBzdXNwZW5kIG1heSBoYXBwZW4gYmVmb3JlIHRoZSBkZWFjdGl2YXRlCiAgICAgKiAgICAgICBzZWVuIG9uIE1hY09TIFgKICAgICAqLwoKICAgIC8qIE1heSBub3QgbmVlZCB0byBjaGFuZ2UgZm9jdXMgYXMgdGhlIHdpbmRvdyB3aWxsCiAgICAgKiBnZXQgYW4gYWN0aXZhdGUvZGVzYWN0aXZhdGUgZXZlbnQKICAgICAqLwogICAgaWYgKGV2ZW50LT5tZXNzYWdlICYgMSkKCS8qIFJlc3VtZSAqLwoJZ3VpX2ZvY3VzX2NoYW5nZShUUlVFKTsKICAgIGVsc2UKCS8qIFN1c3BlbmQgKi8KCWd1aV9mb2N1c19jaGFuZ2UoRkFMU0UpOwp9CgovKgogKiBIYW5kbGUgdGhlIGtleQogKi8KI2lmZGVmIFVTRV9DQVJCT05LRVlIQU5ETEVSCiMgZGVmaW5lIElOTElORV9LRVlfQlVGRkVSX1NJWkUgODAKICAgIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMKZ3VpX21hY19kb0tleUV2ZW50Q2FyYm9uKEV2ZW50SGFuZGxlckNhbGxSZWYgbmV4dEhhbmRsZXIsIEV2ZW50UmVmIHRoZUV2ZW50LAoJdm9pZCAqZGF0YSkKewogICAgLyogTXVsdGlieXRlLWZyaWVuZGx5IGtleSBldmVudCBoYW5kbGVyICovCiAgICBPU1N0YXR1cwllID0gLTE7CiAgICBVSW50MzIJYWN0dWFsU2l6ZTsKICAgIFVuaUNoYXIJKnRleHQ7CiAgICBjaGFyX3UJcmVzdWx0W0lOTElORV9LRVlfQlVGRkVSX1NJWkVdOwogICAgc2hvcnQJbGVuID0gMDsKICAgIFVJbnQzMglrZXlfc3ltOwogICAgY2hhcgljaGFyY29kZTsKICAgIGludAkJa2V5X2NoYXI7CiAgICBVSW50MzIJbW9kaWZpZXJzOwogICAgc2l6ZV90CWVuY0xlbjsKICAgIGNoYXJfdQkqdG8gPSBOVUxMOwogICAgQm9vbGVhbglpc1NwZWNpYWwgPSBGQUxTRTsKICAgIGludAkJaTsKCiAgICAvKiBNYXNrIHRoZSBtb3VzZSAoYXMgcGVyIHVzZXIgc2V0dGluZykgKi8KICAgIGlmIChwX21oKQoJT2JzY3VyZUN1cnNvcigpOwoKICAgIGRvCiAgICB7CglpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsIGtFdmVudFBhcmFtVGV4dElucHV0U2VuZFRleHQsCgkJICAgIHR5cGVVbmljb2RlVGV4dCwgTlVMTCwgMCwgJmFjdHVhbFNpemUsIE5VTEwpKQoJICAgIGJyZWFrOwoKCXRleHQgPSAoVW5pQ2hhciAqKWFsbG9jKGFjdHVhbFNpemUpOwoKCWlmICh0ZXh0KQoJewoJICAgIGRvCgkgICAgewoJCWlmIChub0VyciAhPSBHZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwKCQkJICAgIGtFdmVudFBhcmFtVGV4dElucHV0U2VuZFRleHQsCgkJCSAgICB0eXBlVW5pY29kZVRleHQsIE5VTEwsIGFjdHVhbFNpemUsIE5VTEwsIHRleHQpKQoJCSAgICBicmVhazsKCQlFdmVudFJlZiBrZXlFdmVudDsKCQlpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsCgkJCSAgICBrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRLZXlib2FyZEV2ZW50LAoJCQkgICAgdHlwZUV2ZW50UmVmLCBOVUxMLCBzaXplb2YoRXZlbnRSZWYpLCBOVUxMLCAma2V5RXZlbnQpKQoJCSAgICBicmVhazsKCQlpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIoa2V5RXZlbnQsCgkJCSAgICBrRXZlbnRQYXJhbUtleU1vZGlmaWVycywKCQkJICAgIHR5cGVVSW50MzIsIE5VTEwsIHNpemVvZihVSW50MzIpLCBOVUxMLCAmbW9kaWZpZXJzKSkKCQkgICAgYnJlYWs7CgkJaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKGtleUV2ZW50LAoJCQkgICAga0V2ZW50UGFyYW1LZXlDb2RlLAoJCQkgICAgdHlwZVVJbnQzMiwgTlVMTCwgc2l6ZW9mKFVJbnQzMiksIE5VTEwsICZrZXlfc3ltKSkKCQkgICAgYnJlYWs7CgkJaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKGtleUV2ZW50LAoJCQkgICAga0V2ZW50UGFyYW1LZXlNYWNDaGFyQ29kZXMsCgkJCSAgICB0eXBlQ2hhciwgTlVMTCwgc2l6ZW9mKGNoYXIpLCBOVUxMLCAmY2hhcmNvZGUpKQoJCSAgICBicmVhazsKCgkJa2V5X2NoYXIgPSBjaGFyY29kZTsKCgkJaWYgKG1vZGlmaWVycyAmIGNvbnRyb2xLZXkpCgkJewoJCSAgICBpZiAoKG1vZGlmaWVycyAmIH4oY29udHJvbEtleXxzaGlmdEtleSkpID09IDAKCQkJICAgICYmIChrZXlfY2hhciA9PSAnMicgfHwga2V5X2NoYXIgPT0gJzYnKSkKCQkgICAgewoJCQkvKiBDVFJMLV4gYW5kIENUUkwtQCBkb24ndCB3b3JrIGluIHRoZSBub3JtYWwgd2F5LiAqLwoJCQlpZiAoa2V5X2NoYXIgPT0gJzInKQoJCQkgICAga2V5X2NoYXIgPSBDdHJsX0FUOwoJCQllbHNlCgkJCSAgICBrZXlfY2hhciA9IEN0cmxfSEFUOwoKCQkJdGV4dFswXSA9IChVbmlDaGFyKWtleV9jaGFyOwoJCQltb2RpZmllcnMgPSAwOwoJCSAgICB9CgkJfQoKCQlpZiAobW9kaWZpZXJzICYgY21kS2V5KQojaWZuZGVmIFVTRV9DTURfS0VZCgkJICAgIGJyZWFrOyAgLyogTGV0IHN5c3RlbSBoYW5kbGUgQ21kKy4uLiAqLwojZWxzZQoJCXsKCQkgICAgLyogSW50ZXJjZXB0IENNRC0uICovCgkJICAgIGlmIChrZXlfY2hhciA9PSAnLicpCgkJCWdvdF9pbnQgPSBUUlVFOwoKCQkgICAgLyogQ29udmVydCB0aGUgbW9kaWZpZXJzICovCgkJICAgIG1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vZGlmaWVycyhtb2RpZmllcnMpOwoKCQkgICAgLyogRm9sbG93aW5nIGNvZGUgdG8gc2ltcGxpZnkgYW5kIGNvbnNvbGlkYXRlIG1vZGlmaWVycwoJCSAgICAgKiB0YWtlbiBsaWJlcmFsbHkgZnJvbSBndWlfdzQ4LmMgKi8KCgkJICAgIGtleV9jaGFyID0gc2ltcGxpZnlfa2V5KGtleV9jaGFyLCAoaW50ICopJm1vZGlmaWVycyk7CgoJCSAgICAvKiByZW1vdmUgU0hJRlQgZm9yIGtleXMgdGhhdCBhcmUgYWxyZWFkeSBzaGlmdGVkLCBlLmcuLAoJCSAgICAgKiAnKCcgYW5kICcqJyAqLwoJCSAgICBpZiAoa2V5X2NoYXIgPCAweDEwMCAmJgoJCQkgICAgIWlzYWxwaGEoa2V5X2NoYXIpICYmIGlzcHJpbnQoa2V5X2NoYXIpKQoJCQltb2RpZmllcnMgJj0gfk1PRF9NQVNLX1NISUZUOwoKCQkgICAgLyogSW50ZXJwcmV0IE1FVEEsIGluY2x1ZGUgU0hJRlQsIGV0Yy4gKi8KCQkgICAga2V5X2NoYXIgPSBleHRyYWN0X21vZGlmaWVycyhrZXlfY2hhciwgKGludCAqKSZtb2RpZmllcnMpOwoJCSAgICBpZiAoa2V5X2NoYXIgPT0gQ1NJKQoJCQlrZXlfY2hhciA9IEtfQ1NJOwoKCQkgICAgaWYgKG1vZGlmaWVycykKCQkgICAgewoJCQlyZXN1bHRbbGVuKytdID0gQ1NJOwoJCQlyZXN1bHRbbGVuKytdID0gS1NfTU9ESUZJRVI7CgkJCXJlc3VsdFtsZW4rK10gPSBtb2RpZmllcnM7CgkJICAgIH0KCgkJICAgIGlzU3BlY2lhbCA9IFRSVUU7CgkJfQojZW5kaWYKCQllbHNlCgkJewoJCSAgICAvKiBGaW5kIHRoZSBzcGVjaWFsIGtleSAoZWcuLCBmb3IgY3Vyc29yIGtleXMpICovCgkJICAgIGlmICghKGFjdHVhbFNpemUgPiBzaXplb2YoVW5pQ2hhcikpICYmCgkJCSAgICAoKHRleHRbMF0gPCAweDIwKSB8fCAodGV4dFswXSA9PSAweDdmKSkpCgkJICAgIHsKCQkJZm9yIChpID0gMDsgc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gIT0gKEtleVN5bSkwOyArK2kpCgkJCSAgICBpZiAoc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gPT0ga2V5X3N5bSkKCQkJICAgIHsKCQkJCWtleV9jaGFyID0gVE9fU1BFQ0lBTChzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwLAoJCQkJCXNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEpOwoJCQkJa2V5X2NoYXIgPSBzaW1wbGlmeV9rZXkoa2V5X2NoYXIsCgkJCQkJKGludCAqKSZtb2RpZmllcnMpOwoJCQkJaXNTcGVjaWFsID0gVFJVRTsKCQkJCWJyZWFrOwoJCQkgICAgfQoJCSAgICB9CgkJfQoKCQlpZiAoaXNTcGVjaWFsICYmIElTX1NQRUNJQUwoa2V5X2NoYXIpKQoJCXsKCQkgICAgcmVzdWx0W2xlbisrXSA9IENTSTsKCQkgICAgcmVzdWx0W2xlbisrXSA9IEtfU0VDT05EKGtleV9jaGFyKTsKCQkgICAgcmVzdWx0W2xlbisrXSA9IEtfVEhJUkQoa2V5X2NoYXIpOwoJCX0KCQllbHNlCgkJewoJCSAgICBlbmNMZW4gPSBhY3R1YWxTaXplOwoJCSAgICB0byA9IG1hY191dGYxNl90b19lbmModGV4dCwgYWN0dWFsU2l6ZSwgJmVuY0xlbik7CgkJfQoKCQlpZiAodG8pCgkJewoJCSAgICAvKiBUaGlzIGlzIGJhc2ljYWxseSBhZGRfdG9faW5wdXRfYnVmX2NzaSgpICovCgkJICAgIGZvciAoaSA9IDA7IGkgPCBlbmNMZW4gJiYgbGVuIDwgKElOTElORV9LRVlfQlVGRkVSX1NJWkUtMSk7ICsraSkKCQkgICAgewoJCQlyZXN1bHRbbGVuKytdID0gdG9baV07CgkJCWlmICh0b1tpXSA9PSBDU0kpCgkJCXsKCQkJICAgIHJlc3VsdFtsZW4rK10gPSBLU19FWFRSQTsKCQkJICAgIHJlc3VsdFtsZW4rK10gPSAoaW50KUtFX0NTSTsKCQkJfQoJCSAgICB9CgkJICAgIHZpbV9mcmVlKHRvKTsKCQl9CgoJCWFkZF90b19pbnB1dF9idWYocmVzdWx0LCBsZW4pOwoJCWUgPSBub0VycjsKCSAgICB9CgkgICAgd2hpbGUgKDApOwoKCSAgICB2aW1fZnJlZSh0ZXh0KTsKCSAgICBpZiAoZSA9PSBub0VycikKCSAgICB7CgkJLyogRmFrZSBldmVudCB0byB3YWtlIHVwIFdORSAocmVxdWlyZWQgdG8gZ2V0CgkJICoga2V5IHJlcGVhdCB3b3JraW5nICovCgkJUG9zdEV2ZW50KGtleVVwLCAwKTsKCQlyZXR1cm4gbm9FcnI7CgkgICAgfQoJfQogICAgfQogICAgd2hpbGUgKDApOwoKICAgIHJldHVybiBDYWxsTmV4dEV2ZW50SGFuZGxlcihuZXh0SGFuZGxlciwgdGhlRXZlbnQpOwp9CiNlbHNlCiAgICB2b2lkCmd1aV9tYWNfZG9LZXlFdmVudChFdmVudFJlY29yZCAqdGhlRXZlbnQpCnsKICAgIC8qIFRPRE86IGFkZCBzdXBwb3J0IGZvciBDT01NQU5EIEtFWSAqLwogICAgbG9uZwkJbWVudTsKICAgIHVuc2lnbmVkIGNoYXIJc3RyaW5nWzIwXTsKICAgIHNob3J0CQludW0sIGk7CiAgICBzaG9ydAkJbGVuID0gMDsKICAgIEtleVN5bQkJa2V5X3N5bTsKICAgIGludAkJCWtleV9jaGFyOwogICAgaW50CQkJbW9kaWZpZXJzOwogICAgaW50CQkJc2ltcGxpZnkgPSBGQUxTRTsKCiAgICAvKiBNYXNrIHRoZSBtb3VzZSAoYXMgcGVyIHVzZXIgc2V0dGluZykgKi8KICAgIGlmIChwX21oKQoJT2JzY3VyZUN1cnNvcigpOwoKICAgIC8qIEdldCB0aGUga2V5IGNvZGUgYW5kIGl0J3MgQVNDSUkgcmVwcmVzZW50YXRpb24gKi8KICAgIGtleV9zeW0gPSAoKHRoZUV2ZW50LT5tZXNzYWdlICYga2V5Q29kZU1hc2spID4+IDgpOwogICAga2V5X2NoYXIgPSB0aGVFdmVudC0+bWVzc2FnZSAmIGNoYXJDb2RlTWFzazsKICAgIG51bSA9IDE7CgogICAgLyogSW50ZXJjZXB0IENUUkwtQyAqLwogICAgaWYgKHRoZUV2ZW50LT5tb2RpZmllcnMgJiBjb250cm9sS2V5KQogICAgewoJaWYgKGtleV9jaGFyID09IEN0cmxfQyAmJiBjdHJsX2NfaW50ZXJydXB0cykKCSAgICBnb3RfaW50ID0gVFJVRTsKCWVsc2UgaWYgKCh0aGVFdmVudC0+bW9kaWZpZXJzICYgfihjb250cm9sS2V5fHNoaWZ0S2V5KSkgPT0gMAoJCSYmIChrZXlfY2hhciA9PSAnMicgfHwga2V5X2NoYXIgPT0gJzYnKSkKCXsKCSAgICAvKiBDVFJMLV4gYW5kIENUUkwtQCBkb24ndCB3b3JrIGluIHRoZSBub3JtYWwgd2F5LiAqLwoJICAgIGlmIChrZXlfY2hhciA9PSAnMicpCgkJa2V5X2NoYXIgPSBDdHJsX0FUOwoJICAgIGVsc2UKCQlrZXlfY2hhciA9IEN0cmxfSEFUOwoJICAgIHRoZUV2ZW50LT5tb2RpZmllcnMgPSAwOwoJfQogICAgfQoKICAgIC8qIEludGVyY2VwdCBDTUQtLiAqLwogICAgaWYgKHRoZUV2ZW50LT5tb2RpZmllcnMgJiBjbWRLZXkpCglpZiAoa2V5X2NoYXIgPT0gJy4nKQoJICAgIGdvdF9pbnQgPSBUUlVFOwoKICAgIC8qIEhhbmRsZSBjb21tYW5kIGtleSBhcyBwZXIgbWVudSAqLwogICAgLyogVE9ETzogc2hvdWxkIG92ZXJyaWRlIGJlIGFsbG93ZWQ/IFJlcXVpcmUgWUFPIG9yIGNvdWxkIHVzZSAnd2luYWx0a2V5JyAqLwogICAgaWYgKHRoZUV2ZW50LT5tb2RpZmllcnMgJiBjbWRLZXkpCgkvKiBPbmx5IGFjY2VwdCBDTUQgYWxvbmUgb3Igd2l0aCBDQVBMT0NLUyBhbmQgdGhlIG1vdXNlIGJ1dHRvbi4KCSAqIFdoeSB0aGUgbW91c2UgYnV0dG9uPyAqLwoJaWYgKCh0aGVFdmVudC0+bW9kaWZpZXJzICYgKH4oY21kS2V5IHwgYnRuU3RhdGUgfCBhbHBoYUxvY2spKSkgPT0gMCkKCXsKCSAgICBtZW51ID0gTWVudUtleShrZXlfY2hhcik7CgkgICAgaWYgKEhpV29yZChtZW51KSkKCSAgICB7CgkJZ3VpX21hY19oYW5kbGVfbWVudShtZW51KTsKCQlyZXR1cm47CgkgICAgfQoJfQoKICAgIC8qIENvbnZlcnQgdGhlIG1vZGlmaWVycyAqLwogICAgbW9kaWZpZXJzID0gRXZlbnRNb2RpZmllcnMyVmltTW9kaWZpZXJzKHRoZUV2ZW50LT5tb2RpZmllcnMpOwoKCiAgICAvKiBIYW5kbGUgc3BlY2lhbCBrZXlzLiAqLwojaWYgMAogICAgLyogV2h5IGhhcyB0aGlzIGJlZW4gcmVtb3ZlZD8gKi8KICAgIGlmCSghKHRoZUV2ZW50LT5tb2RpZmllcnMgJiAoY21kS2V5IHwgY29udHJvbEtleSB8IHJpZ2h0Q29udHJvbEtleSkpKQojZW5kaWYKICAgIHsKCS8qIEZpbmQgdGhlIHNwZWNpYWwga2V5IChmb3Igbm9uLXByaW50YWJsZSBrZXl0X2NoYXIpICovCglpZiAgKChrZXlfY2hhciA8IDB4MjApIHx8IChrZXlfY2hhciA9PSAweDdmKSkKCSAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX2tleXNbaV0ua2V5X3N5bSAhPSAoS2V5U3ltKTA7IGkrKykKCQlpZiAoc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gPT0ga2V5X3N5bSkKCQl7CiMgaWYgMAoJCSAgICAvKiBXZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSBub3Qgc28gc3BlY2lhbCBrZXkgKi8KCQkgICAgaWYgKHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEgPT0gTlVMKQoJCQlrZXlfY2hhciA9IHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTA7CgkJICAgIGVsc2UKIyBlbmRpZgoJCQlrZXlfY2hhciA9IFRPX1NQRUNJQUwoc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMCwKCQkJCQkJc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSk7CgkJICAgIHNpbXBsaWZ5ID0gVFJVRTsKCQkgICAgYnJlYWs7CgkJfQogICAgfQoKICAgIC8qIEZvciBzb21lIGtleXMgdGhlIG1vZGlmaWVyIGlzIGluY2x1ZGVkIGluIHRoZSBjaGFyIGl0c2VsZi4gKi8KICAgIGlmIChzaW1wbGlmeSB8fCBrZXlfY2hhciA9PSBUQUIgfHwga2V5X2NoYXIgPT0gJyAnKQoJa2V5X2NoYXIgPSBzaW1wbGlmeV9rZXkoa2V5X2NoYXIsICZtb2RpZmllcnMpOwoKICAgIC8qIEFkZCB0aGUgbW9kaWZpZXIgdG8gdGhlIGlucHV0IGJ1IGlmIG5lZWRlZCAqLwogICAgLyogRG8gbm90IHdhbnQgU0hJRlQtQSBvciBDVFJMLUEgd2l0aCBtb2RpZmllciAqLwogICAgaWYgKCFJU19TUEVDSUFMKGtleV9jaGFyKQoJICAgICYmIGtleV9zeW0gIT0gdmtfU3BhY2UKCSAgICAmJiBrZXlfc3ltICE9IHZrX1RhYgoJICAgICYmIGtleV9zeW0gIT0gdmtfUmV0dXJuCgkgICAgJiYga2V5X3N5bSAhPSB2a19FbnRlcgoJICAgICYmIGtleV9zeW0gIT0gdmtfRXNjKQogICAgewojaWYgMQogICAgLyogQ2xlYXIgbW9kaWZpZXJzIHdoZW4gb25seSBvbmUgbW9kaWZpZXIgaXMgc2V0ICovCglpZiAoKG1vZGlmaWVycyA9PSBNT0RfTUFTS19TSElGVCkKCQl8fCAobW9kaWZpZXJzID09IE1PRF9NQVNLX0NUUkwpCgkJfHwgKG1vZGlmaWVycyA9PSBNT0RfTUFTS19BTFQpKQoJICAgIG1vZGlmaWVycyA9IDA7CiNlbHNlCglpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfQ1RSTCkKCSAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMgJiB+TU9EX01BU0tfQ1RSTDsKCWlmIChtb2RpZmllcnMgJiBNT0RfTUFTS19BTFQpCgkgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzICYgfk1PRF9NQVNLX0FMVDsKCWlmIChtb2RpZmllcnMgJiBNT0RfTUFTS19TSElGVCkKCSAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMgJiB+TU9EX01BU0tfU0hJRlQ7CiNlbmRpZgogICAgfQoJaWYgKG1vZGlmaWVycykKCXsKCSAgICBzdHJpbmdbbGVuKytdID0gQ1NJOwoJICAgIHN0cmluZ1tsZW4rK10gPSBLU19NT0RJRklFUjsKCSAgICBzdHJpbmdbbGVuKytdID0gbW9kaWZpZXJzOwoJfQoKCWlmIChJU19TUEVDSUFMKGtleV9jaGFyKSkKCXsKCSAgICBzdHJpbmdbbGVuKytdID0gQ1NJOwoJICAgIHN0cmluZ1tsZW4rK10gPSBLX1NFQ09ORChrZXlfY2hhcik7CgkgICAgc3RyaW5nW2xlbisrXSA9IEtfVEhJUkQoa2V5X2NoYXIpOwoJfQoJZWxzZQoJewojaWZkZWYgRkVBVF9NQllURQoJICAgIC8qIENvbnZlcnQgY2hhcmFjdGVycyB3aGVuIG5lZWRlZCAoZS5nLiwgZnJvbSBNYWNSb21hbiB0byBsYXRpbjEpLgoJICAgICAqIFRoaXMgZG9lc24ndCB3b3JrIGZvciB0aGUgTlVMIGJ5dGUuICovCgkgICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUgJiYga2V5X2NoYXIgPiAwKQoJICAgIHsKCQljaGFyX3UJZnJvbVsyXSwgKnRvOwoJCWludAlsOwoKCQlmcm9tWzBdID0ga2V5X2NoYXI7CgkJZnJvbVsxXSA9IE5VTDsKCQlsID0gMTsKCQl0byA9IHN0cmluZ19jb252ZXJ0KCZpbnB1dF9jb252LCBmcm9tLCAmbCk7CgkJaWYgKHRvICE9IE5VTEwpCgkJewoJCSAgICBmb3IgKGkgPSAwOyBpIDwgbCAmJiBsZW4gPCAxOTsgaSsrKQoJCSAgICB7CgkJCWlmICh0b1tpXSA9PSBDU0kpCgkJCXsKCQkJICAgIHN0cmluZ1tsZW4rK10gPSBLU19FWFRSQTsKCQkJICAgIHN0cmluZ1tsZW4rK10gPSBLRV9DU0k7CgkJCX0KCQkJZWxzZQoJCQkgICAgc3RyaW5nW2xlbisrXSA9IHRvW2ldOwoJCSAgICB9CgkJICAgIHZpbV9mcmVlKHRvKTsKCQl9CgkJZWxzZQoJCSAgICBzdHJpbmdbbGVuKytdID0ga2V5X2NoYXI7CgkgICAgfQoJICAgIGVsc2UKI2VuZGlmCgkJc3RyaW5nW2xlbisrXSA9IGtleV9jaGFyOwoJfQoKCWlmIChsZW4gPT0gMSAmJiBzdHJpbmdbMF0gPT0gQ1NJKQoJewoJICAgIC8qIFR1cm4gQ1NJIGludG8gS19DU0kuICovCgkgICAgc3RyaW5nWyBsZW4rKyBdID0gS1NfRVhUUkE7CgkgICAgc3RyaW5nWyBsZW4rKyBdID0gS0VfQ1NJOwoJfQoKICAgIGFkZF90b19pbnB1dF9idWYoc3RyaW5nLCBsZW4pOwp9CiNlbmRpZgoKLyoKICogSGFuZGxlIE1vdXNlQ2xpY2sKICovCiAgICB2b2lkCmd1aV9tYWNfZG9Nb3VzZURvd25FdmVudCh0aGVFdmVudCkKICAgIEV2ZW50UmVjb3JkICp0aGVFdmVudDsKewogICAgc2hvcnQJCXRoZVBhcnQ7CiAgICBXaW5kb3dQdHIJCXdoaWNoV2luZG93OwoKICAgIHRoZVBhcnQgPSBGaW5kV2luZG93KHRoZUV2ZW50LT53aGVyZSwgJndoaWNoV2luZG93KTsKCiAgICBzd2l0Y2ggKHRoZVBhcnQpCiAgICB7CgljYXNlIChpbkRlc2spOgoJICAgIC8qIFRPRE86IHdoYXQgdG8gZG8/ICovCgkgICAgYnJlYWs7CgoJY2FzZSAoaW5NZW51QmFyKToKCSAgICBndWlfbWFjX2hhbmRsZV9tZW51KE1lbnVTZWxlY3QodGhlRXZlbnQtPndoZXJlKSk7CgkgICAgYnJlYWs7CgoJY2FzZSAoaW5Db250ZW50KToKCSAgICBndWlfbWFjX2RvSW5Db250ZW50Q2xpY2sodGhlRXZlbnQsIHdoaWNoV2luZG93KTsKCSAgICBicmVhazsKCgljYXNlIChpbkRyYWcpOgoJICAgIGd1aV9tYWNfZG9JbkRyYWdDbGljayh0aGVFdmVudC0+d2hlcmUsIHdoaWNoV2luZG93KTsKCSAgICBicmVhazsKCgljYXNlIChpbkdyb3cpOgoJICAgIGd1aV9tYWNfZG9Jbkdyb3dDbGljayh0aGVFdmVudC0+d2hlcmUsIHdoaWNoV2luZG93KTsKCSAgICBicmVhazsKCgljYXNlIChpbkdvQXdheSk6CgkgICAgaWYgKFRyYWNrR29Bd2F5KHdoaWNoV2luZG93LCB0aGVFdmVudC0+d2hlcmUpKQoJCWd1aV9zaGVsbF9jbG9zZWQoKTsKCSAgICBicmVhazsKCgljYXNlIChpblpvb21Jbik6CgljYXNlIChpblpvb21PdXQpOgojaWZkZWYgVVNFX0NBUkJPTklaRUQKCSAgICBndWlfbWFjX2RvSW5ab29tQ2xpY2sodGhlRXZlbnQsIHdoaWNoV2luZG93KTsKI2VuZGlmCgkgICAgYnJlYWs7CiAgICB9Cn0KCi8qCiAqIEhhbmRsZSBNb3VzZU1vdmVkCiAqIFt0aGlzIGV2ZW50IGlzIGEgbW92aW5nIGluIGFuZCBvdXQgb2YgYSByZWdpb25dCiAqLwogICAgdm9pZApndWlfbWFjX2RvTW91c2VNb3ZlZEV2ZW50KGV2ZW50KQogICAgRXZlbnRSZWNvcmQgKmV2ZW50Owp7CiAgICBQb2ludCAgIHRoZVBvaW50OwogICAgaW50X3UgICB2aW1Nb2RpZmllcnM7CgogICAgdGhlUG9pbnQgPSBldmVudC0+d2hlcmU7CiAgICBHbG9iYWxUb0xvY2FsKCZ0aGVQb2ludCk7CiAgICB2aW1Nb2RpZmllcnMgPSBFdmVudE1vZGlmaWVyczJWaW1Nb3VzZU1vZGlmaWVycyhldmVudC0+bW9kaWZpZXJzKTsKCiAgICBpZiAoIUJ1dHRvbigpKQoJZ3VpX21vdXNlX21vdmVkKHRoZVBvaW50LmgsIHRoZVBvaW50LnYpOwogICAgZWxzZQojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKCWlmICghY2xpY2tJc1BvcHVwKQojZW5kaWYKCSAgICBndWlfc2VuZF9tb3VzZV9ldmVudChNT1VTRV9EUkFHLCB0aGVQb2ludC5oLAoJCQkJCSAgICAgdGhlUG9pbnQudiwgRkFMU0UsIHZpbU1vZGlmaWVycyk7CgogICAgLyogUmVzZXQgdGhlIHJlZ2lvbiBmcm9tIHdoaWNoIHdlIG1vdmUgaW4gYW5kIG91dCAqLwogICAgU2V0UmVjdCgmZHJhZ1JlY3QsIEZJTExfWChYXzJfQ09MKHRoZVBvaW50LmgpKSwKCQkJRklMTF9ZKFlfMl9ST1codGhlUG9pbnQudikpLAoJCQlGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSsxKSwKCQkJRklMTF9ZKFlfMl9ST1codGhlUG9pbnQudikrMSkpOwoKICAgIGlmIChkcmFnUmVjdEVuYmwpCglkcmFnUmVjdENvbnRyb2wgPSBrQ3JlYXRlUmVjdDsKCn0KCi8qCiAqIEhhbmRsZSB0aGUgbW91c2UgcmVsZWFzZQogKi8KICAgIHZvaWQKZ3VpX21hY19kb01vdXNlVXBFdmVudCh0aGVFdmVudCkKICAgIEV2ZW50UmVjb3JkICp0aGVFdmVudDsKewogICAgUG9pbnQgICB0aGVQb2ludDsKICAgIGludF91ICAgdmltTW9kaWZpZXJzOwoKICAgIC8qIFRPRE86IFByb3Blcmx5IGNvbnZlcnQgdGhlIENvbnRleHR1YWwgbWVudSBtb3VzZS11cCAqLwogICAgLyogICAgICAgUG90ZW50aWFsIHNvdXJjZSBvZiB0aGUgZG91YmxlIG1lbnUgKi8KICAgIGxhc3RNb3VzZVRpY2sgPSB0aGVFdmVudC0+d2hlbjsKICAgIGRyYWdSZWN0RW5ibCA9IEZBTFNFOwogICAgZHJhZ1JlY3RDb250cm9sID0ga0NyZWF0ZUVtcHR5OwogICAgdGhlUG9pbnQgPSB0aGVFdmVudC0+d2hlcmU7CiAgICBHbG9iYWxUb0xvY2FsKCZ0aGVQb2ludCk7CgogICAgdmltTW9kaWZpZXJzID0gRXZlbnRNb2RpZmllcnMyVmltTW91c2VNb2RpZmllcnModGhlRXZlbnQtPm1vZGlmaWVycyk7CiNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQogICAgaWYgKGNsaWNrSXNQb3B1cCkKICAgIHsKCXZpbU1vZGlmaWVycyAmPSB+TU9VU0VfQ1RSTDsKCWNsaWNrSXNQb3B1cCA9IEZBTFNFOwogICAgfQojZW5kaWYKICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KE1PVVNFX1JFTEVBU0UsIHRoZVBvaW50LmgsIHRoZVBvaW50LnYsIEZBTFNFLCB2aW1Nb2RpZmllcnMpOwp9CgojaWZkZWYgVVNFX01PVVNFV0hFRUwKICAgIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMKZ3VpX21hY19tb3VzZV93aGVlbChFdmVudEhhbmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiB0aGVFdmVudCwKCQkJCQkJCQkgICB2b2lkICpkYXRhKQp7CiAgICBFdmVudFJlZglib2d1c0V2ZW50OwogICAgUG9pbnQJcG9pbnQ7CiAgICBSZWN0CWJvdW5kczsKICAgIFVJbnQzMgltb2Q7CiAgICBTSW50MzIJZGVsdGE7CiAgICBpbnRfdQl2aW1fbW9kOwoKICAgIGlmIChub0VyciAhPSBHZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwga0V2ZW50UGFyYW1Nb3VzZVdoZWVsRGVsdGEsCgkJCSAgICAgIHR5cGVTSW50MzIsIE5VTEwsIHNpemVvZihTSW50MzIpLCBOVUxMLCAmZGVsdGEpKQoJZ290byBiYWlsOwogICAgaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBrRXZlbnRQYXJhbU1vdXNlTG9jYXRpb24sCgkJCSAgICAgIHR5cGVRRFBvaW50LCBOVUxMLCBzaXplb2YoUG9pbnQpLCBOVUxMLCAmcG9pbnQpKQoJZ290byBiYWlsOwogICAgaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBrRXZlbnRQYXJhbUtleU1vZGlmaWVycywKCQkJCXR5cGVVSW50MzIsIE5VTEwsIHNpemVvZihVSW50MzIpLCBOVUxMLCAmbW9kKSkKCWdvdG8gYmFpbDsKCiAgICB2aW1fbW9kID0gMDsKICAgIGlmIChtb2QgJiBzaGlmdEtleSkKCXZpbV9tb2QgfD0gTU9VU0VfU0hJRlQ7CiAgICBpZiAobW9kICYgY29udHJvbEtleSkKCXZpbV9tb2QgfD0gTU9VU0VfQ1RSTDsKICAgIGlmIChtb2QgJiBvcHRpb25LZXkpCgl2aW1fbW9kIHw9IE1PVVNFX0FMVDsKCiAgICAvKiBwb3N0IGEgYm9ndXMgZXZlbnQgdG8gd2FrZSB1cCBXYWl0TmV4dEV2ZW50ICovCiAgICBpZiAobm9FcnIgIT0gQ3JlYXRlRXZlbnQoTlVMTCwga0V2ZW50Q2xhc3NNb3VzZSwga0V2ZW50TW91c2VNb3ZlZCwgMCwKCQkJCQkgICAga0V2ZW50QXR0cmlidXRlTm9uZSwgJmJvZ3VzRXZlbnQpKQoJZ290byBiYWlsOwogICAgaWYgKG5vRXJyICE9IFBvc3RFdmVudFRvUXVldWUoR2V0TWFpbkV2ZW50UXVldWUoKSwgYm9ndXNFdmVudCwKCQkJCQkJCSAgIGtFdmVudFByaW9yaXR5TG93KSkKCWdvdG8gYmFpbDsKCiAgICBSZWxlYXNlRXZlbnQoYm9ndXNFdmVudCk7CgogICAgaWYgKG5vRXJyID09IEdldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93Q29udGVudFJnbiwgJmJvdW5kcykpCiAgICB7Cglwb2ludC5oIC09IGJvdW5kcy5sZWZ0OwoJcG9pbnQudiAtPSBib3VuZHMudG9wOwogICAgfQoKICAgIGd1aV9zZW5kX21vdXNlX2V2ZW50KChkZWx0YSA+IDApID8gTU9VU0VfNCA6IE1PVVNFXzUsCgkJCQkJICAgIHBvaW50LmgsIHBvaW50LnYsIEZBTFNFLCB2aW1fbW9kKTsKCiAgICByZXR1cm4gbm9FcnI7CgogIGJhaWw6CiAgICAvKgogICAgICogd2hlbiB3ZSBmYWlsIGdpdmUgYW55IGFkZGl0aW9uYWwgY2FsbGJhY2sgaGFuZGxlciBhIGNoYW5jZSB0byBwZXJmb3JtCiAgICAgKiBpdCdzIGFjdGlvbnMKICAgICAqLwogICAgcmV0dXJuIENhbGxOZXh0RXZlbnRIYW5kbGVyKG5leHRIYW5kbGVyLCB0aGVFdmVudCk7Cn0KI2VuZGlmIC8qIGRlZmluZWQoVVNFX01PVVNFV0hFRUwpICovCgojaWYgMAoKLyoKICogVGhpcyB3b3VsZCBiZSB0aGUgbm9ybWFsIHdheSBvZiBpbnZva2luZyB0aGUgY29udGV4dHVhbCBtZW51CiAqIGJ1dCB0aGUgVmltIEFQSSBkb2Vzbid0IHNlZW0gdG8gYSBzdXBwb3J0IGEgcmVxdWVzdCB0byBnZXQKICogdGhlIG1lbnUgdGhhdCB3ZSBzaG91bGQgZGlzcGxheQogKi8KICAgIHZvaWQKZ3VpX21hY19oYW5kbGVfY29udGV4dHVhbF9tZW51KGV2ZW50KQogICAgRXZlbnRSZWNvcmQgKmV2ZW50Owp7Ci8qCiAqICBDbG9uZSBQb3BVcCB0byB1c2UgbWVudQogKiAgQ3JlYXRlIGEgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbgogKiAgQ2FsbCB0aGUgcHJvY2VkdXJlCiAqLwoKLy8gIENhbGwgdG8gSGFuZGxlIFBvcHVwCiAgICBPU1N0YXR1cyBzdGF0dXMgPSBDb250ZXh0dWFsTWVudVNlbGVjdChDbnR4TWVudSwgZXZlbnQtPndoZXJlLCBmYWxzZSwga0NNSGVscEl0ZW1Ob0hlbHAsICIiLCBOVUxMLCAmQ250eFR5cGUsICZDbnR4TWVudUlELCAmQ250eE1lbnVJdGVtKTsKCiAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQoJcmV0dXJuOwoKICAgIGlmIChDbnR4VHlwZSA9PSBrQ01NZW51SXRlbVNlbGVjdGVkKQogICAgewoJLyogSGFuZGxlIHRoZSBtZW51IENudHhNZW51SUQsIENudHhNZW51SXRlbSAqLwoJLyogVGhlIHN1Ym1lbnUgY2FuIGJlIGhhbmRsZSBkaXJlY3RseSBieSBndWlfbWFjX2hhbmRsZV9tZW51ICovCgkvKiBCdXQgd2hhdCBhYm91dCB0aGUgY3VycmVudCBtZW51LCBpcyB0aGUgbWVueSBjaGFuZ2VkIGJ5IENvbnRleHR1YWxNZW51U2VsZWN0ICovCglndWlfbWFjX2hhbmRsZV9tZW51KChDbnR4TWVudUlEIDw8IDE2KSArIENudHhNZW51SXRlbSk7CiAgICB9CiAgICBlbHNlIGlmIChDbnR4TWVudUlEID09IGtDTVNob3dIZWxwU2VsZWN0ZWQpCiAgICB7CgkvKiBTaG91bGQgY29tZSB1cCB3aXRoIHRoZSBoZWxwICovCiAgICB9Cgp9CiNlbmRpZgoKLyoKICogSGFuZGxlIG1lbnViYXIgc2VsZWN0aW9uCiAqLwogICAgdm9pZApndWlfbWFjX2hhbmRsZV9tZW51KG1lbnVDaG9pY2UpCiAgICBsb25nIG1lbnVDaG9pY2U7CnsKICAgIHNob3J0CW1lbnUgPSBIaVdvcmQobWVudUNob2ljZSk7CiAgICBzaG9ydAlpdGVtID0gTG9Xb3JkKG1lbnVDaG9pY2UpOwogICAgdmltbWVudV9UCSp0aGVWaW1NZW51ID0gcm9vdF9tZW51OwojaWZuZGVmIFVTRV9DQVJCT05JWkVECiAgICBNZW51SGFuZGxlCWFwcGxlTWVudTsKICAgIFN0cjI1NQlpdGVtTmFtZTsKI2VuZGlmCgogICAgaWYgKG1lbnUgPT0gMjU2KSAgLyogVE9ETzogdXNlIGNvbnN0YW50IG9yIGd1aS54eXogKi8KICAgIHsKCWlmIChpdGVtID09IDEpCgkgICAgZ3VpX21jaF9iZWVwKCk7IC8qIFRPRE86IFBvcHVwIGRpYWxvZyBvciBkbyA6aW50cm8gKi8KCWVsc2UKCXsKI2lmbmRlZiBVU0VfQ0FSQk9OSVpFRAoJICAgIC8qIERlc2sgQWNjZXNzb3J5IGRvZXNuJ3QgZXhpc3QgaW4gQ2FyYm9uICovCgkgICAgYXBwbGVNZW51ID0gR2V0TWVudUhhbmRsZShtZW51KTsKCSAgICBHZXRNZW51SXRlbVRleHQoYXBwbGVNZW51LCBpdGVtLCBpdGVtTmFtZSk7CgkgICAgKHZvaWQpIE9wZW5EZXNrQWNjKGl0ZW1OYW1lKTsKI2VuZGlmCgl9CiAgICB9CiAgICBlbHNlIGlmIChpdGVtICE9IDApCiAgICB7Cgl0aGVWaW1NZW51ID0gZ3VpX21hY19nZXRfdmltX21lbnUobWVudSwgaXRlbSwgcm9vdF9tZW51KTsKCglpZiAodGhlVmltTWVudSkKCSAgICBndWlfbWVudV9jYih0aGVWaW1NZW51KTsKICAgIH0KICAgIEhpbGl0ZU1lbnUoMCk7Cn0KCi8qCiAqIERpc3BhdGNoIHRoZSBldmVudCB0byBwcm9wZXIgaGFuZGxlcgogKi8KCiAgICB2b2lkCmd1aV9tYWNfaGFuZGxlX2V2ZW50KGV2ZW50KQogICAgRXZlbnRSZWNvcmQgKmV2ZW50Owp7CiAgICBPU0VycgllcnJvcjsKCiAgICAvKiBIYW5kbGUgY29udGV4dHVhbCBtZW51IHJpZ2h0IG5vdyAoaWYgbmVlZGVkKSAqLwojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKICAgIGlmIChndWkuTWFjT1NIYXZlQ250eE1lbnUpCglpZiAoSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayhldmVudCkpCgl7CiMgaWYgMAoJICAgIGd1aV9tYWNfaGFuZGxlX2NvbnRleHR1YWxfbWVudShldmVudCk7CiMgZWxzZQoJICAgIGd1aV9tYWNfZG9Nb3VzZURvd25FdmVudChldmVudCk7CiMgZW5kaWYKCSAgICByZXR1cm47Cgl9CiNlbmRpZgoKICAgIC8qIEhhbmRsZSBub3JtYWwgZXZlbnQgKi8KICAgIHN3aXRjaCAoZXZlbnQtPndoYXQpCiAgICB7CiNpZm5kZWYgVVNFX0NBUkJPTktFWUhBTkRMRVIKCWNhc2UgKGtleURvd24pOgoJY2FzZSAoYXV0b0tleSk6CgkgICAgZ3VpX21hY19kb0tleUV2ZW50KGV2ZW50KTsKCSAgICBicmVhazsKI2VuZGlmCgljYXNlIChrZXlVcCk6CgkgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB3aGVuIHRoZSBrZXkgZ2V0IHJlbGVhc2UgKi8KCSAgICBicmVhazsKCgljYXNlIChtb3VzZURvd24pOgoJICAgIGd1aV9tYWNfZG9Nb3VzZURvd25FdmVudChldmVudCk7CgkgICAgYnJlYWs7CgoJY2FzZSAobW91c2VVcCk6CgkgICAgZ3VpX21hY19kb01vdXNlVXBFdmVudChldmVudCk7CgkgICAgYnJlYWs7CgoJY2FzZSAodXBkYXRlRXZ0KToKCSAgICBndWlfbWFjX2RvVXBkYXRlRXZlbnQoZXZlbnQpOwoJICAgIGJyZWFrOwoKCWNhc2UgKGRpc2tFdnQpOgoJICAgIC8qIFdlIGRvbid0IG5lZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IgZGlzayBpbnNlcnRpb24gKi8KCSAgICBicmVhazsKCgljYXNlIChhY3RpdmF0ZUV2dCk6CgkgICAgZ3VpX21hY19kb0FjdGl2YXRlRXZlbnQoZXZlbnQpOwoJICAgIGJyZWFrOwoKCWNhc2UgKG9zRXZ0KToKCSAgICBzd2l0Y2ggKChldmVudC0+bWVzc2FnZSA+PiAyNCkgJiAweEZGKQoJICAgIHsKCQljYXNlICgweEZBKTogLyogbW91c2VNb3ZlZE1lc3NhZ2UgKi8KCQkgICAgZ3VpX21hY19kb01vdXNlTW92ZWRFdmVudChldmVudCk7CgkJICAgIGJyZWFrOwoJCWNhc2UgKDB4MDEpOiAvKiBzdXNwZW5kUmVzdW1lTWVzc2FnZSAqLwoJCSAgICBndWlfbWFjX2RvU3VzcGVuZEV2ZW50KGV2ZW50KTsKCQkgICAgYnJlYWs7CgkgICAgfQoJICAgIGJyZWFrOwoKI2lmZGVmIFVTRV9BRVZFTlQKCWNhc2UgKGtIaWdoTGV2ZWxFdmVudCk6CgkgICAgLyogU29tZW9uZSdzIHRhbGtpbmcgdG8gdXMsIHRocm91Z2ggQXBwbGVFdmVudHMgKi8KCSAgICBlcnJvciA9IEFFUHJvY2Vzc0FwcGxlRXZlbnQoZXZlbnQpOyAvKiBUT0RPOiBFcnJvciBIYW5kbGluZyAqLwoJICAgIGJyZWFrOwojZW5kaWYKICAgIH0KfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFVua25vd24gU3R1ZmYKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKCiAgICBHdWlGb250Cmd1aV9tYWNfZmluZF9mb250KGZvbnRfbmFtZSkKICAgIGNoYXJfdSAqZm9udF9uYW1lOwp7CiAgICBjaGFyX3UJYzsKICAgIGNoYXJfdQkqcDsKICAgIGNoYXJfdQlwRm9udE5hbWVbMjU2XTsKICAgIFN0cjI1NQlzeXN0ZW1Gb250bmFtZTsKICAgIHNob3J0CWZvbnRfaWQ7CiAgICBzaG9ydAlzaXplPTk7CiAgICBHdWlGb250CWZvbnQ7CiNpZiAwCiAgICBjaGFyX3UgICAgICAqZm9udE5hbWVQdHI7CiNlbmRpZgoKICAgIGZvciAocCA9IGZvbnRfbmFtZTsgKCgqcCAhPSAwKSAmJiAoKnAgIT0gJzonKSk7IHArKykKCTsKCiAgICBjID0gKnA7CiAgICAqcCA9IDA7CgojaWYgMQogICAgU1RSQ1BZKCZwRm9udE5hbWVbMV0sIGZvbnRfbmFtZSk7CiAgICBwRm9udE5hbWVbMF0gPSBTVFJMRU4oZm9udF9uYW1lKTsKICAgICpwID0gYzsKCiAgICAvKiBHZXQgdGhlIGZvbnQgbmFtZSwgbWludXMgdGhlIHN0eWxlIHN1ZmZpeCAoOmgsIGV0YykgKi8KI2lmIGRlZmluZWQoTUFDT1NfWCkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKICAgIGNoYXJfdSBmb250TmFtZVsyNTZdOwogICAgY2hhcl91ICpzdHlsZVN0YXJ0ID0gdmltX3N0cmNocihmb250X25hbWUsICc6Jyk7CiAgICBzaXplX3QgZm9udE5hbWVMZW4gPSBzdHlsZVN0YXJ0ID8gc3R5bGVTdGFydCAtIGZvbnRfbmFtZSA6IFNUUkxFTihmb250TmFtZSk7CiAgICB2aW1fc3RybmNweShmb250TmFtZSwgZm9udF9uYW1lLCBmb250TmFtZUxlbik7CgogICAgQVRTVUZvbnRJRCBmb250UmVmOwogICAgRk1Gb250U3R5bGUgZm9udFN0eWxlOwogICAgZm9udF9pZCA9IDA7CgogICAgaWYgKEFUU1VGaW5kRm9udEZyb21OYW1lKCZwRm9udE5hbWVbMV0sIHBGb250TmFtZVswXSwga0ZvbnRGdWxsTmFtZSwKCQlrRm9udE1hY2ludG9zaFBsYXRmb3JtLCBrRm9udE5vU2NyaXB0Q29kZSwga0ZvbnROb0xhbmd1YWdlQ29kZSwKCQkmZm9udFJlZikgPT0gbm9FcnIpCiAgICB7CglpZiAoRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udChmb250UmVmLCAmZm9udF9pZCwgJmZvbnRTdHlsZSkgIT0gbm9FcnIpCgkgICAgZm9udF9pZCA9IDA7CiAgICB9CiNlbHNlCiAgICBHZXRGTnVtKHBGb250TmFtZSwgJmZvbnRfaWQpOwojZW5kaWYKCiAgICBpZiAoZm9udF9pZCA9PSAwKQogICAgewoJLyoKCSAqIFRyeSBhZ2FpbiwgdGhpcyB0aW1lIHJlcGxhY2luZyB1bmRlcnNjb3JlcyBpbiB0aGUgZm9udCBuYW1lCgkgKiB3aXRoIHNwYWNlcyAoOnNldCBndWlmb250IGFsbG93cyB0aGUgdHdvIHRvIGJlIHVzZWQKCSAqIGludGVyY2hhbmdlYWJseTsgdGhlIEZvbnQgTWFuYWdlciBkb2Vzbid0KS4KCSAqLwoJaW50IGksIGNoYW5nZWQgPSBGQUxTRTsKCglmb3IgKGkgPSBwRm9udE5hbWVbMF07IGkgPiAwOyAtLWkpCgl7CgkgICAgaWYgKHBGb250TmFtZVtpXSA9PSAnXycpCgkgICAgewoJCXBGb250TmFtZVtpXSA9ICcgJzsKCQljaGFuZ2VkID0gVFJVRTsKCSAgICB9Cgl9CglpZiAoY2hhbmdlZCkKI2lmIGRlZmluZWQoTUFDT1NfWCkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKCSAgICBpZiAoQVRTVUZpbmRGb250RnJvbU5hbWUoJnBGb250TmFtZVsxXSwgcEZvbnROYW1lWzBdLAoJCQlrRm9udEZ1bGxOYW1lLCBrRm9udE5vUGxhdGZvcm1Db2RlLCBrRm9udE5vU2NyaXB0Q29kZSwKCQkJa0ZvbnROb0xhbmd1YWdlQ29kZSwgJmZvbnRSZWYpID09IG5vRXJyKQoJICAgIHsKCQlpZiAoRk1HZXRGb250RmFtaWx5SW5zdGFuY2VGcm9tRm9udChmb250UmVmLCAmZm9udF9pZCwgJmZvbnRTdHlsZSkgIT0gbm9FcnIpCgkJICAgIGZvbnRfaWQgPSAwOwoJICAgIH0KI2Vsc2UKCSAgICBHZXRGTnVtKHBGb250TmFtZSwgJmZvbnRfaWQpOwojZW5kaWYKICAgIH0KCiNlbHNlCiAgICAvKiBuYW1lID0gQzJQYXNjYWxfc2F2ZShtZW51LT5kbmFtZSk7ICovCiAgICBmb250TmFtZVB0ciA9IEMyUGFzY2FsX3NhdmVfYW5kX3JlbW92ZV9iYWNrc2xhc2goZm9udF9uYW1lKTsKCiAgICBHZXRGTnVtKGZvbnROYW1lUHRyLCAmZm9udF9pZCk7CiNlbmRpZgoKCiAgICBpZiAoZm9udF9pZCA9PSAwKQogICAgewoJLyogT3VwcywgdGhlIHN5c3RlbSBmb250IHdhcyBpdCB0aGUgb25lIHRoZSB1c2VyIHdhbnQgKi8KCiNpZiBkZWZpbmVkKE1BQ09TX1gpICYmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpCglpZiAoRk1HZXRGb250RmFtaWx5TmFtZShzeXN0ZW1Gb250LCBzeXN0ZW1Gb250bmFtZSkgIT0gbm9FcnIpCgkgICAgcmV0dXJuIE5PRk9OVDsKI2Vsc2UKCUdldEZvbnROYW1lKDAsIHN5c3RlbUZvbnRuYW1lKTsKI2VuZGlmCglpZiAoIUVxdWFsU3RyaW5nKHBGb250TmFtZSwgc3lzdGVtRm9udG5hbWUsIGZhbHNlLCBmYWxzZSkpCgkgICAgcmV0dXJuIE5PRk9OVDsKICAgIH0KICAgIGlmICgqcCA9PSAnOicpCiAgICB7CglwKys7CgkvKiBTZXQgdGhlIHZhbHVlcyBmb3VuZCBhZnRlciAnOicgKi8KCXdoaWxlICgqcCkKCXsKCSAgICBzd2l0Y2ggKCpwKyspCgkgICAgewoJCWNhc2UgJ2gnOgoJCSAgICBzaXplID0gcG9pbnRzX3RvX3BpeGVscyhwLCAmcCwgVFJVRSk7CgkJICAgIGJyZWFrOwoJCSAgICAvKgoJCSAgICAgKiBUT0RPOiBNYXliZSBhY2NlcHQgd2lkdGggYW5kIHN0eWxlcwoJCSAgICAgKi8KCSAgICB9CgkgICAgd2hpbGUgKCpwID09ICc6JykKCQlwKys7Cgl9CiAgICB9CgogICAgaWYgKHNpemUgPCAxKQoJc2l6ZSA9IDE7ICAgLyogQXZvaWQgaGF2aW5nIGEgc2l6ZSBvZiAwIHdpdGggc3lzdGVtIGZvbnQgKi8KCiAgICBmb250ID0gKHNpemUgPDwgMTYpICsgKChsb25nKSBmb250X2lkICYgMHhGRkZGKTsKCiAgICByZXR1cm4gZm9udDsKfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEdVSV9NQ0ggZnVuY3Rpb25uYWxpdHkKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLyoKICogUGFyc2UgdGhlIEdVSSByZWxhdGVkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICBBbnkgYXJndW1lbnRzIHVzZWQgYXJlCiAqIGRlbGV0ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQgYWNjb3JkaW5nbHkuICBUaGlzIGlzIGNhbGxlZAogKiB3aGVuIHZpbSBpcyBzdGFydGVkLCB3aGV0aGVyIG9yIG5vdCB0aGUgR1VJIGhhcyBiZWVuIHN0YXJ0ZWQuCiAqLwogICAgdm9pZApndWlfbWNoX3ByZXBhcmUoYXJnYywgYXJndikKICAgIGludAkJKmFyZ2M7CiAgICBjaGFyCSoqYXJndjsKewogICAgLyogVE9ETzogTW92ZSBtb3N0IG9mIHRoaXMgc3R1ZmYgdG93YXJkIGd1aV9tY2hfaW5pdCAqLwojaWZkZWYgVVNFX0VYRV9OQU1FCiAgICBGU1NwZWMJYXBwbERpcjsKIyBpZm5kZWYgVVNFX0ZJTkRfQlVORExFX1BBVEgKICAgIHNob3J0CWFwcGxWUmVmTnVtOwogICAgbG9uZwlhcHBsRGlySUQ7CiAgICBTdHIyNTUJdm9sTmFtZTsKIyBlbHNlCiAgICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKICAgIEZTUmVmCWFwcGxGU1JlZjsKIyBlbmRpZgojZW5kaWYKCiNpZm5kZWYgVVNFX0NBUkJPTklaRUQKICAgIE1heEFwcGxab25lKCk7CSAgICAvKiBXaGF0IGNvdWxkIHJlcGxhY2UgdGhvcyAqLwogICAgLyogSW4gQ2FyYm9uLCBhbGwgc2hhcmVkIGxpYnJhcnkgYXJlIGF1dG9tYXRpY2FsbHkgbG9hZCBpbgogICAgICogdGhlcmUncyBubyBuZWVkIHRvIGluaXQgdGhlbQogICAgICovCiAgICBJbml0R3JhZigmcWQudGhlUG9ydCk7CiAgICBJbml0Rm9udHMoKTsKICAgIEluaXRXaW5kb3dzKCk7CiAgICBJbml0TWVudXMoKTsKICAgIFRFSW5pdCgpOwogICAgSW5pdERpYWxvZ3MobmlsKTsKI2Vsc2UKICAgIC8qIFdoeSBkaWQgSSBwdXQgdGhhdCBpbj8gKERhbnkpICovCiAgICBNb3JlTWFzdGVyUG9pbnRlcnMgKDB4NDAgKiAzKTsgLyogd2UgbG92ZSBoYW5kbGVzICovCiNlbmRpZgoKI2lmIDAKICAgIEluaXRDdXJzb3IoKTsKCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7CiNlbmRpZgoKI2lmZGVmIFVTRV9BRVZFTlQKICAgICh2b2lkKSBJbnN0YWxsQUVIYW5kbGVycygpOwojZW5kaWYKCiNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQogICAgaWYgKEdlc3RhbHQoZ2VzdGFsdENvbnRleHR1YWxNZW51QXR0ciwgJmdlc3RhbHRfcmMpID09IG5vRXJyKQoJZ3VpLk1hY09TSGF2ZUNudHhNZW51ID0gQml0VHN0KCZnZXN0YWx0X3JjLCAzMS1nZXN0YWx0Q29udGV4dHVhbE1lbnVUcmFwQXZhaWxhYmxlKTsKICAgIGVsc2UKCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IGZhbHNlOwoKICAgIGlmIChndWkuTWFjT1NIYXZlQ250eE1lbnUpCglndWkuTWFjT1NIYXZlQ250eE1lbnUgPSAoSW5pdENvbnRleHR1YWxNZW51cygpPT1ub0Vycik7CiNlbmRpZgoKI2lmZGVmIFVTRV9TSU9VWAogICAgU0lPVVhTZXR0aW5ncy5zdGFuZGFsb25lID0gZmFsc2U7CiAgICBTSU9VWFNldHRpbmdzLmluaXRpYWxpemVUQiA9IGZhbHNlOwogICAgU0lPVVhTZXR0aW5ncy5zZXR1cG1lbnVzID0gZmFsc2U7CiAgICBTSU9VWFNldHRpbmdzLmFza3Rvc2F2ZW9uY2xvc2UgPSBmYWxzZTsKICAgIFNJT1VYU2V0dGluZ3Muc2hvd3N0YXR1c2xpbmUgPSB0cnVlOwogICAgU0lPVVhTZXR0aW5ncy50b3BwaXhlbCA9IDMwMDsKICAgIFNJT1VYU2V0dGluZ3MubGVmdHBpeGVsID0gMTA7CiAgICBJbnN0YWxsQ29uc29sZSgxKTsgLyogZmlsZW5vKHN0ZG91dCkgPSAxLCBvbiBwYWdlIDQzMCBvZiBNU0wgQyAqLwogICAgcHJpbnRmKCJEZWJ1Z2dpbmcgY29uc29sZSBlbmFibGVkXG4iKTsKICAgIC8qCVNJT1VYU2V0VGl0bGUoKGNoYXJfdSAqKSAiVmltIFN0ZG91dCIpOyAqLwojZW5kaWYKCiAgICBwb21tZSA9IE5ld01lbnUoMjU2LCAiXHBcMDI0Iik7IC8qIDB4MTQ9ID0gQXBwbGUgTWVudSAqLwoKICAgIEFwcGVuZE1lbnUocG9tbWUsICJccEFib3V0IFZJTSIpOwojaWZuZGVmIFVTRV9DQVJCT05JWkVECiAgICBBcHBlbmRNZW51KHBvbW1lLCAiXHAtIik7CiAgICBBcHBlbmRSZXNNZW51KHBvbW1lLCAnRFJWUicpOwojZW5kaWYKCiAgICBJbnNlcnRNZW51KHBvbW1lLCAwKTsKCiAgICBEcmF3TWVudUJhcigpOwoKCiNpZm5kZWYgVVNFX09GRlNFVEVEX1dJTkRPVwogICAgU2V0UmVjdCgmd2luZFJlY3QsIDEwLCA0OCwgMTArODAqNyArIDE2LCA0OCsyNCoxMSk7CiNlbHNlCiAgICBTZXRSZWN0KCZ3aW5kUmVjdCwgMzAwLCA0MCwgMzAwKzgwKjcgKyAxNiwgNDArMjQqMTEpOwojZW5kaWYKCgojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIENyZWF0ZU5ld1dpbmRvdyhrRG9jdW1lbnRXaW5kb3dDbGFzcywKCQlrV2luZG93UmVzaXphYmxlQXR0cmlidXRlIHwga1dpbmRvd0NvbGxhcHNlQm94QXR0cmlidXRlLAoJCSZ3aW5kUmVjdCwgJmd1aS5WaW1XaW5kb3cpOwogICAgU2V0UG9ydFdpbmRvd1BvcnQoZ3VpLlZpbVdpbmRvdyk7CiNlbHNlCiAgICBndWkuVmltV2luZG93ID0gTmV3Q1dpbmRvdyhuaWwsICZ3aW5kUmVjdCwgIlxwZ1ZpbSBvbiBNYWNpbnRvc2giLCB0cnVlLCBkb2N1bWVudFByb2MsCgkJCShXaW5kb3dQdHIpIC0xTCwgZmFsc2UsIDApOwogICAgU2V0UG9ydChndWkuVmltV2luZG93KTsKI2VuZGlmCgogICAgZ3VpLmNoYXJfd2lkdGggPSA3OwogICAgZ3VpLmNoYXJfaGVpZ2h0ID0gMTE7CiAgICBndWkuY2hhcl9hc2NlbnQgPSA2OwogICAgZ3VpLm51bV9yb3dzID0gMjQ7CiAgICBndWkubnVtX2NvbHMgPSA4MDsKICAgIGd1aS5pbl9mb2N1cyA9IFRSVUU7IC8qIEZvciB0aGUgbW9tZW50IC0+IHN5bi4gb2YgZnJvbnQgYXBwbGljYXRpb24gKi8KCiNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KICAgIGdTY3JvbGxBY3Rpb24gPSBOZXdDb250cm9sQWN0aW9uVVBQKGd1aV9tYWNfc2Nyb2xsX2FjdGlvbik7CiAgICBnU2Nyb2xsRHJhZyAgID0gTmV3Q29udHJvbEFjdGlvblVQUChndWlfbWFjX2RyYWdfdGh1bWIpOwojZWxzZQogICAgZ1Njcm9sbEFjdGlvbiA9IE5ld0NvbnRyb2xBY3Rpb25Qcm9jKGd1aV9tYWNfc2Nyb2xsX2FjdGlvbik7CiAgICBnU2Nyb2xsRHJhZyAgID0gTmV3Q29udHJvbEFjdGlvblByb2MoZ3VpX21hY19kcmFnX3RodW1iKTsKI2VuZGlmCgogICAgLyogR2V0dGluZyBhIGhhbmRsZSB0byB0aGUgSGVscCBtZW51ICovCiNpZmRlZiBVU0VfSEVMUE1FTlUKIyBpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgSE1HZXRIZWxwTWVudSgmZ3VpLk1hY09TSGVscE1lbnUsIE5VTEwpOwojIGVsc2UKICAgICh2b2lkKSBITUdldEhlbHBNZW51SGFuZGxlKCZndWkuTWFjT1NIZWxwTWVudSk7CiMgZW5kaWYKCiAgICBpZiAoZ3VpLk1hY09TSGVscE1lbnUgIT0gbmlsKQoJZ3VpLk1hY09TSGVscEl0ZW1zID0gQ291bnRNZW51SXRlbXMoZ3VpLk1hY09TSGVscE1lbnUpOwogICAgZWxzZQoJZ3VpLk1hY09TSGVscEl0ZW1zID0gMDsKI2VuZGlmCgogICAgZHJhZ1JlY3RFbmJsID0gRkFMU0U7CiAgICBkcmFnUmduID0gTlVMTDsKICAgIGRyYWdSZWN0Q29udHJvbCA9IGtDcmVhdGVFbXB0eTsKICAgIGN1cnNvclJnbiA9IE5ld1JnbigpOwojZW5kaWYKI2lmZGVmIFVTRV9FWEVfTkFNRQojIGlmbmRlZiBVU0VfRklORF9CVU5ETEVfUEFUSAogICAgSEdldFZvbCh2b2xOYW1lLCAmYXBwbFZSZWZOdW0sICZhcHBsRGlySUQpOwogICAgLyogVE4yMDE1OiBtZW50aW9uIGEgcG9zc2libGUgYmFkIFZSZWZOdW0gKi8KICAgIEZTTWFrZUZTU3BlYyhhcHBsVlJlZk51bSwgYXBwbERpcklELCAiXHAiLCAmYXBwbERpcik7CiMgZWxzZQogICAgLyogT1NFcnIgR2V0QXBwbGljYXRpb25CdW5kbGVGU1NwZWMoRlNTcGVjUHRyIHRoZUZTU3BlY1B0cikKICAgICAqIG9mIFROMjAxNQogICAgICogVGhpcyB0ZWNobmljIHJlbW92ZSB0aGUgLi4vQ29udGVudHMvTWFjT1MvZXRjIHBhcnQKICAgICAqLwogICAgKHZvaWQpR2V0Q3VycmVudFByb2Nlc3MoJnBzbik7CiAgICAvKiBpZiAoZXJyICE9IG5vRXJyKSByZXR1cm4gZXJyOyAqLwoKICAgICh2b2lkKUdldFByb2Nlc3NCdW5kbGVMb2NhdGlvbigmcHNuLCAmYXBwbEZTUmVmKTsKICAgIC8qIGlmIChlcnIgIT0gbm9FcnIpIHJldHVybiBlcnI7ICovCgogICAgKHZvaWQpRlNHZXRDYXRhbG9nSW5mbygmYXBwbEZTUmVmLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgTlVMTCwgJmFwcGxEaXIsIE5VTEwpOwoKICAgIC8qIFRoaXMgdGVjaG5pYyByZXR1cm4gTklMIHdoZW4gd2UgZGlzYWxsb3dfZ3VpICovCiMgZW5kaWYKICAgIGV4ZV9uYW1lID0gRnVsbFBhdGhGcm9tRlNTcGVjX3NhdmUoYXBwbERpcik7CiNlbmRpZgoKI2lmZGVmIFVTRV9WSU1fQ1JFQVRPUl9JRAogICAgX2ZjcmVhdG9yID0gJ1ZJTSEnOwogICAgX2Z0eXBlID0gJ1RFWFQnOwojZW5kaWYKfQoKI2lmbmRlZiBBTFdBWVNfVVNFX0dVSQovKgogKiBDaGVjayBpZiB0aGUgR1VJIGNhbiBiZSBzdGFydGVkLiAgQ2FsbGVkIGJlZm9yZSBndmltcmMgaXMgc291cmNlZC4KICogUmV0dXJuIE9LIG9yIEZBSUwuCiAqLwogICAgaW50Cmd1aV9tY2hfaW5pdF9jaGVjayh2b2lkKQp7CiAgICAvKiBUT0RPOiBGb3IgTWFjT1MgWCBmaW5kIGEgd2F5IHRvIHJldHVybiBGQUlMLCBpZiB0aGUgdXNlciBsb2dnZWQgaW4KICAgICAqIHVzaW5nIHRoZSA+Y29uc29sZQogICAgICovCiAgICBpZiAoZGlzYWxsb3dfZ3VpKSAvKiBzZWUgbWFpbi5jIGZvciByZWFzb24gdG8gZGlzYWxsb3cgKi8KCXJldHVybiBGQUlMOwogICAgcmV0dXJuIE9LOwp9CiNlbmRpZgoKICAgIHN0YXRpYyBPU0VycgpyZWNlaXZlSGFuZGxlcihXaW5kb3dSZWYgdGhlV2luZG93LCB2b2lkKiBoYW5kbGVyUmVmQ29uLCBEcmFnUmVmIHRoZURyYWcpCnsKICAgIGludAkJeCwgeTsKICAgIGludF91CW1vZGlmaWVyczsKICAgIGNoYXJfdQkqKmZuYW1lcyA9IE5VTEw7CiAgICBpbnQJCWNvdW50OwogICAgaW50CQlpLCBqOwoKICAgIC8qIEdldCBkcm9wIHBvc2l0aW9uLCBtb2RpZmllcnMgYW5kIGNvdW50IG9mIGl0ZW1zICovCiAgICB7CglQb2ludAlwb2ludDsKCVNJbnQxNgltb3VzZVVwTW9kaWZpZXJzOwoJVUludDE2CWNvdW50SXRlbTsKCglHZXREcmFnTW91c2UodGhlRHJhZywgJnBvaW50LCBOVUxMKTsKCUdsb2JhbFRvTG9jYWwoJnBvaW50KTsKCXggPSBwb2ludC5oOwoJeSA9IHBvaW50LnY7CglHZXREcmFnTW9kaWZpZXJzKHRoZURyYWcsIE5VTEwsIE5VTEwsICZtb3VzZVVwTW9kaWZpZXJzKTsKCW1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKG1vdXNlVXBNb2RpZmllcnMpOwoJQ291bnREcmFnSXRlbXModGhlRHJhZywgJmNvdW50SXRlbSk7Cgljb3VudCA9IGNvdW50SXRlbTsKICAgIH0KCiAgICBmbmFtZXMgPSAoY2hhcl91ICoqKWFsbG9jKGNvdW50ICogc2l6ZW9mKGNoYXJfdSAqKSk7CiAgICBpZiAoZm5hbWVzID09IE5VTEwpCglyZXR1cm4gZHJhZ05vdEFjY2VwdGVkRXJyOwoKICAgIC8qIEdldCBmaWxlIG5hbWVzIGRyb3BwZWQgKi8KICAgIGZvciAoaSA9IGogPSAwOyBpIDwgY291bnQ7ICsraSkKICAgIHsKCURyYWdJdGVtUmVmCWl0ZW07CglPU0VycgkJZXJyOwoJU2l6ZQkJc2l6ZTsKCUZsYXZvclR5cGUJdHlwZSA9IGZsYXZvclR5cGVIRlM7CglIRlNGbGF2b3IJaGZzRmxhdm9yOwoKCWZuYW1lc1tpXSA9IE5VTEw7CglHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcih0aGVEcmFnLCBpICsgMSwgJml0ZW0pOwoJZXJyID0gR2V0Rmxhdm9yRGF0YVNpemUodGhlRHJhZywgaXRlbSwgdHlwZSwgJnNpemUpOwoJaWYgKGVyciAhPSBub0VyciB8fCBzaXplID4gc2l6ZW9mKGhmc0ZsYXZvcikpCgkgICAgY29udGludWU7CgllcnIgPSBHZXRGbGF2b3JEYXRhKHRoZURyYWcsIGl0ZW0sIHR5cGUsICZoZnNGbGF2b3IsICZzaXplLCAwKTsKCWlmIChlcnIgIT0gbm9FcnIpCgkgICAgY29udGludWU7CglmbmFtZXNbaisrXSA9IEZ1bGxQYXRoRnJvbUZTU3BlY19zYXZlKGhmc0ZsYXZvci5maWxlU3BlYyk7CiAgICB9CiAgICBjb3VudCA9IGo7CgogICAgZ3VpX2hhbmRsZV9kcm9wKHgsIHksIG1vZGlmaWVycywgZm5hbWVzLCBjb3VudCk7CgogICAgLyogRmFrZSBtb3VzZSBldmVudCB0byB3YWtlIGZyb20gc3RhbGwgKi8KICAgIFBvc3RFdmVudChtb3VzZVVwLCAwKTsKCiAgICByZXR1cm4gbm9FcnI7Cn0KCi8qCiAqIEluaXRpYWxpc2UgdGhlIEdVSS4gIENyZWF0ZSBhbGwgdGhlIHdpbmRvd3MsIHNldCB1cCBhbGwgdGhlIGNhbGwtYmFja3MKICogZXRjLgogKi8KICAgIGludApndWlfbWNoX2luaXQoKQp7CiAgICAvKiBUT0RPOiBNb3ZlIG1vc3Qgb2YgdGhpcyBzdHVmZiB0b3dhcmQgZ3VpX21jaF9pbml0ICovCiAgICBSZWN0CXdpbmRSZWN0OwogICAgTWVudUhhbmRsZQlwb21tZTsKI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCiAgICBsb25nCWdlc3RhbHRfcmM7CiNlbmRpZgojaWZkZWYgVVNFX01PVVNFV0hFRUwKICAgIEV2ZW50VHlwZVNwZWMgICBldmVudFR5cGVTcGVjOwogICAgRXZlbnRIYW5kbGVyUmVmIG1vdXNlV2hlZWxIYW5kbGVyUmVmOwojZW5kaWYKI2lmZGVmIFVTRV9DQVJCT05LRVlIQU5ETEVSCiAgICBFdmVudEhhbmRsZXJSZWYga2V5RXZlbnRIYW5kbGVyUmVmOwojZW5kaWYKCiNpZmRlZiBNQUNPU19YCiAgICBpZiAoR2VzdGFsdChnZXN0YWx0U3lzdGVtVmVyc2lvbiwgJmdNYWNTeXN0ZW1WZXJzaW9uKSAhPSBub0VycikKCWdNYWNTeXN0ZW1WZXJzaW9uID0gMHgxMDAwOyAvKiBEZWZhdWx0IHRvIG1pbmltdW0gc2Vuc2libGUgdmFsdWUgKi8KI2VuZGlmCgojaWYgMQogICAgSW5pdEN1cnNvcigpOwoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKI2VuZGlmCgojaWZkZWYgVVNFX0FFVkVOVAogICAgKHZvaWQpIEluc3RhbGxBRUhhbmRsZXJzKCk7CiNlbmRpZgoKI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCiAgICBpZiAoR2VzdGFsdChnZXN0YWx0Q29udGV4dHVhbE1lbnVBdHRyLCAmZ2VzdGFsdF9yYykgPT0gbm9FcnIpCglndWkuTWFjT1NIYXZlQ250eE1lbnUgPSBCaXRUc3QoJmdlc3RhbHRfcmMsIDMxLWdlc3RhbHRDb250ZXh0dWFsTWVudVRyYXBBdmFpbGFibGUpOwogICAgZWxzZQoJZ3VpLk1hY09TSGF2ZUNudHhNZW51ID0gZmFsc2U7CgogICAgaWYgKGd1aS5NYWNPU0hhdmVDbnR4TWVudSkKCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IChJbml0Q29udGV4dHVhbE1lbnVzKCk9PW5vRXJyKTsKI2VuZGlmCgojaWZkZWYgVVNFX1NJT1VYCiAgICBTSU9VWFNldHRpbmdzLnN0YW5kYWxvbmUgPSBmYWxzZTsKICAgIFNJT1VYU2V0dGluZ3MuaW5pdGlhbGl6ZVRCID0gZmFsc2U7CiAgICBTSU9VWFNldHRpbmdzLnNldHVwbWVudXMgPSBmYWxzZTsKICAgIFNJT1VYU2V0dGluZ3MuYXNrdG9zYXZlb25jbG9zZSA9IGZhbHNlOwogICAgU0lPVVhTZXR0aW5ncy5zaG93c3RhdHVzbGluZSA9IHRydWU7CiAgICBTSU9VWFNldHRpbmdzLnRvcHBpeGVsID0gMzAwOwogICAgU0lPVVhTZXR0aW5ncy5sZWZ0cGl4ZWwgPSAxMDsKICAgIEluc3RhbGxDb25zb2xlKDEpOyAvKiBmaWxlbm8oc3Rkb3V0KSA9IDEsIG9uIHBhZ2UgNDMwIG9mIE1TTCBDICovCiAgICBwcmludGYoIkRlYnVnZ2luZyBjb25zb2xlIGVuYWJsZWRcbiIpOwogICAgLyoJU0lPVVhTZXRUaXRsZSgoY2hhcl91ICopICJWaW0gU3Rkb3V0Iik7ICovCiNlbmRpZgoKICAgIHBvbW1lID0gTmV3TWVudSgyNTYsICJccFwwMjQiKTsgLyogMHgxND0gPSBBcHBsZSBNZW51ICovCgogICAgQXBwZW5kTWVudShwb21tZSwgIlxwQWJvdXQgVklNIik7CiNpZm5kZWYgVVNFX0NBUkJPTklaRUQKICAgIEFwcGVuZE1lbnUocG9tbWUsICJccC0iKTsKICAgIEFwcGVuZFJlc01lbnUocG9tbWUsICdEUlZSJyk7CiNlbmRpZgoKICAgIEluc2VydE1lbnUocG9tbWUsIDApOwoKICAgIERyYXdNZW51QmFyKCk7CgoKI2lmbmRlZiBVU0VfT0ZGU0VURURfV0lORE9XCiAgICBTZXRSZWN0KCZ3aW5kUmVjdCwgMTAsIDQ4LCAxMCs4MCo3ICsgMTYsIDQ4KzI0KjExKTsKI2Vsc2UKICAgIFNldFJlY3QoJndpbmRSZWN0LCAzMDAsIDQwLCAzMDArODAqNyArIDE2LCA0MCsyNCoxMSk7CiNlbmRpZgoKICAgIGd1aS5WaW1XaW5kb3cgPSBOZXdDV2luZG93KG5pbCwgJndpbmRSZWN0LCAiXHBnVmltIG9uIE1hY2ludG9zaCIsIHRydWUsCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAoJCQl6b29tRG9jUHJvYywKI2Vsc2UKCQkJZG9jdW1lbnRQcm9jLAojZW5kaWYKCQkJKFdpbmRvd1B0ciktMUwsIHRydWUsIDApOwogICAgSW5zdGFsbFJlY2VpdmVIYW5kbGVyKChEcmFnUmVjZWl2ZUhhbmRsZXJVUFApcmVjZWl2ZUhhbmRsZXIsCgkgICAgZ3VpLlZpbVdpbmRvdywgTlVMTCk7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgU2V0UG9ydFdpbmRvd1BvcnQoZ3VpLlZpbVdpbmRvdyk7CiNlbHNlCiAgICBTZXRQb3J0KGd1aS5WaW1XaW5kb3cpOwojZW5kaWYKCiAgICBndWkuY2hhcl93aWR0aCA9IDc7CiAgICBndWkuY2hhcl9oZWlnaHQgPSAxMTsKICAgIGd1aS5jaGFyX2FzY2VudCA9IDY7CiAgICBndWkubnVtX3Jvd3MgPSAyNDsKICAgIGd1aS5udW1fY29scyA9IDgwOwogICAgZ3VpLmluX2ZvY3VzID0gVFJVRTsgLyogRm9yIHRoZSBtb21lbnQgLT4gc3luLiBvZiBmcm9udCBhcHBsaWNhdGlvbiAqLwoKI2lmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgogICAgZ1Njcm9sbEFjdGlvbiA9IE5ld0NvbnRyb2xBY3Rpb25VUFAoZ3VpX21hY19zY3JvbGxfYWN0aW9uKTsKICAgIGdTY3JvbGxEcmFnICAgPSBOZXdDb250cm9sQWN0aW9uVVBQKGd1aV9tYWNfZHJhZ190aHVtYik7CiNlbHNlCiAgICBnU2Nyb2xsQWN0aW9uID0gTmV3Q29udHJvbEFjdGlvblByb2MoZ3VpX21hY19zY3JvbGxfYWN0aW9uKTsKICAgIGdTY3JvbGxEcmFnICAgPSBOZXdDb250cm9sQWN0aW9uUHJvYyhndWlfbWFjX2RyYWdfdGh1bWIpOwojZW5kaWYKCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKE1BQ09TX1gpCiAgICAvKiBJbnN0YWxsIENhcmJvbiBldmVudCBjYWxsYmFja3MuICovCiAgICAodm9pZClJbnN0YWxsRm9udFBhbmVsSGFuZGxlcigpOwojZW5kaWYKCiAgICAvKiBHZXR0aW5nIGEgaGFuZGxlIHRvIHRoZSBIZWxwIG1lbnUgKi8KI2lmZGVmIFVTRV9IRUxQTUVOVQojIGlmZGVmIFVTRV9DQVJCT05JWkVECiAgICBITUdldEhlbHBNZW51KCZndWkuTWFjT1NIZWxwTWVudSwgTlVMTCk7CiMgZWxzZQogICAgKHZvaWQpIEhNR2V0SGVscE1lbnVIYW5kbGUoJmd1aS5NYWNPU0hlbHBNZW51KTsKIyBlbmRpZgoKICAgIGlmIChndWkuTWFjT1NIZWxwTWVudSAhPSBuaWwpCglndWkuTWFjT1NIZWxwSXRlbXMgPSBDb3VudE1lbnVJdGVtcyhndWkuTWFjT1NIZWxwTWVudSk7CiAgICBlbHNlCglndWkuTWFjT1NIZWxwSXRlbXMgPSAwOwojZW5kaWYKCiAgICBkcmFnUmVjdEVuYmwgPSBGQUxTRTsKICAgIGRyYWdSZ24gPSBOVUxMOwogICAgZHJhZ1JlY3RDb250cm9sID0ga0NyZWF0ZUVtcHR5OwogICAgY3Vyc29yUmduID0gTmV3UmduKCk7CiNlbmRpZgogICAgLyogRGlzcGxheSBhbnkgcGVuZGluZyBlcnJvciBtZXNzYWdlcyAqLwogICAgZGlzcGxheV9lcnJvcnMoKTsKCiAgICAvKiBHZXQgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIGNvbG9ycyBmcm9tIHN5c3RlbSAqLwogICAgLyogVE9ETzogZG8gdGhlIGFwcHJvcmlhdGUgY2FsbCB0byBnZXQgcmVhbCBkZWZhdWx0cyAqLwogICAgZ3VpLm5vcm1fcGl4ZWwgPSAweDAwMDAwMDAwOwogICAgZ3VpLmJhY2tfcGl4ZWwgPSAweDAwRkZGRkZGOwoKICAgIC8qIEdldCB0aGUgY29sb3JzIGZyb20gdGhlICJOb3JtYWwiIGdyb3VwIChzZXQgaW4gc3ludGF4LmMgb3IgaW4gYSB2aW1yYwogICAgICogZmlsZSkuICovCiAgICBzZXRfbm9ybWFsX2NvbG9ycygpOwoKICAgIC8qCiAgICAgKiBDaGVjayB0aGF0IG5vbmUgb2YgdGhlIGNvbG9ycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGJhY2tncm91bmQgY29sb3IuCiAgICAgKiBUaGVuIHN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBhcyB0aGUgZGVmYXVsdHMuCiAgICAgKi8KICAgIGd1aV9jaGVja19jb2xvcnMoKTsKICAgIGd1aS5kZWZfbm9ybV9waXhlbCA9IGd1aS5ub3JtX3BpeGVsOwogICAgZ3VpLmRlZl9iYWNrX3BpeGVsID0gZ3VpLmJhY2tfcGl4ZWw7CgogICAgLyogR2V0IHRoZSBjb2xvcnMgZm9yIHRoZSBoaWdobGlnaHQgZ3JvdXBzIChndWlfY2hlY2tfY29sb3JzKCkgbWlnaHQgaGF2ZQogICAgICogY2hhbmdlZCB0aGVtKSAqLwogICAgaGlnaGxpZ2h0X2d1aV9zdGFydGVkKCk7CgogICAgLyoKICAgICAqIFNldHRpbmcgdGhlIGd1aSBjb25zdGFudHMKICAgICAqLwojaWZkZWYgRkVBVF9NRU5VCiAgICBndWkubWVudV9oZWlnaHQgPSAwOwojZW5kaWYKICAgIGd1aS5zY3JvbGxiYXJfaGVpZ2h0ID0gZ3VpLnNjcm9sbGJhcl93aWR0aCA9IDE1OyAvKiBjaGVhdCAxIG92ZXJsYXAgKi8KICAgIGd1aS5ib3JkZXJfb2Zmc2V0ID0gZ3VpLmJvcmRlcl93aWR0aCA9IDI7CgojaWYgZGVmaW5lZChGRUFUX0dVSSkgJiYgZGVmaW5lZChNQUNPU19YKQogICAgLyogSWYgUXVhcnR6LXN0eWxlIHRleHQgYW50aWFsaWFzaW5nIGlzIGF2YWlsYWJsZSAoc2VlCiAgICAgICBndWlfbWNoX2RyYXdfc3RyaW5nKCkgYmVsb3cpLCBlbmFibGUgaXQgZm9yIGFsbCBmb250IHNpemVzLiAqLwogICAgdmltX3NldGVudigoY2hhcl91ICopIlFEVEVYVF9NSU5TSVpFIiwgKGNoYXJfdSAqKSIxIik7CiNlbmRpZgoKI2lmZGVmIFVTRV9NT1VTRVdIRUVMCiAgICBldmVudFR5cGVTcGVjLmV2ZW50Q2xhc3MgPSBrRXZlbnRDbGFzc01vdXNlOwogICAgZXZlbnRUeXBlU3BlYy5ldmVudEtpbmQgPSBrRXZlbnRNb3VzZVdoZWVsTW92ZWQ7CiAgICBtb3VzZVdoZWVsSGFuZGxlclVQUCA9IE5ld0V2ZW50SGFuZGxlclVQUChndWlfbWFjX21vdXNlX3doZWVsKTsKICAgIGlmIChub0VyciAhPSBJbnN0YWxsQXBwbGljYXRpb25FdmVudEhhbmRsZXIobW91c2VXaGVlbEhhbmRsZXJVUFAsIDEsCgkJCQkgJmV2ZW50VHlwZVNwZWMsIE5VTEwsICZtb3VzZVdoZWVsSGFuZGxlclJlZikpCiAgICB7Cgltb3VzZVdoZWVsSGFuZGxlclJlZiA9IE5VTEw7CglEaXNwb3NlRXZlbnRIYW5kbGVyVVBQKG1vdXNlV2hlZWxIYW5kbGVyVVBQKTsKCW1vdXNlV2hlZWxIYW5kbGVyVVBQID0gTlVMTDsKICAgIH0KI2VuZGlmCgojaWZkZWYgVVNFX0NBUkJPTktFWUhBTkRMRVIKICAgIGV2ZW50VHlwZVNwZWMuZXZlbnRDbGFzcyA9IGtFdmVudENsYXNzVGV4dElucHV0OwogICAgZXZlbnRUeXBlU3BlYy5ldmVudEtpbmQgPSBrRXZlbnRVbmljb2RlRm9yS2V5RXZlbnQ7CiAgICBrZXlFdmVudEhhbmRsZXJVUFAgPSBOZXdFdmVudEhhbmRsZXJVUFAoZ3VpX21hY19kb0tleUV2ZW50Q2FyYm9uKTsKICAgIGlmIChub0VyciAhPSBJbnN0YWxsQXBwbGljYXRpb25FdmVudEhhbmRsZXIoa2V5RXZlbnRIYW5kbGVyVVBQLCAxLAoJCSZldmVudFR5cGVTcGVjLCBOVUxMLCAma2V5RXZlbnRIYW5kbGVyUmVmKSkKICAgIHsKCWtleUV2ZW50SGFuZGxlclJlZiA9IE5VTEw7CglEaXNwb3NlRXZlbnRIYW5kbGVyVVBQKGtleUV2ZW50SGFuZGxlclVQUCk7CglrZXlFdmVudEhhbmRsZXJVUFAgPSBOVUxMOwogICAgfQojZW5kaWYKCi8qCiNpZmRlZiBGRUFUX01CWVRFCiAgICBzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikiZW5jb2RpbmciLCAwTCwgKGNoYXJfdSAqKSJ1dGYtOCIsIDApOwojZW5kaWYKKi8KCiAgICAvKiBUT0RPOiBMb2FkIGJpdG1hcCBpZiB1c2luZyBUT09MQkFSICovCiAgICByZXR1cm4gT0s7Cn0KCi8qCiAqIENhbGxlZCB3aGVuIHRoZSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQgY29sb3IgaGFzIGJlZW4gY2hhbmdlZC4KICovCiAgICB2b2lkCmd1aV9tY2hfbmV3X2NvbG9ycygpCnsKICAgIC8qIFRPRE86CiAgICAgKiBUaGlzIHByb2MgaXMgY2FsbGVkIHdoZW4gTm9ybWFsIGlzIHNldCB0byBhIHZhbHVlCiAgICAgKiBzbyB3aGF0IG1zdXQgYmUgZG9uZT8gSSBkb24ndCBrbm93CiAgICAgKi8KfQoKLyoKICogT3BlbiB0aGUgR1VJIHdpbmRvdyB3aGljaCB3YXMgY3JlYXRlZCBieSBhIGNhbGwgdG8gZ3VpX21jaF9pbml0KCkuCiAqLwogICAgaW50Cmd1aV9tY2hfb3BlbigpCnsKICAgIFNob3dXaW5kb3coZ3VpLlZpbVdpbmRvdyk7CgogICAgaWYgKGd1aV93aW5feCAhPSAtMSAmJiBndWlfd2luX3kgIT0gLTEpCglndWlfbWNoX3NldF93aW5wb3MoZ3VpX3dpbl94LCBndWlfd2luX3kpOwoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICAvKgogICAgICogTWFrZSB0aGUgR1VJIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgKGluIGNhc2UgaXQgd2FzIGxhdW5jaGVkCiAgICAgKiBmcm9tIHRoZSBUZXJtaW5hbCBvciB2aWEgOmd1aSkuCiAgICAgKi8KICAgIHsKCVByb2Nlc3NTZXJpYWxOdW1iZXIgcHNuOwoJaWYgKEdldEN1cnJlbnRQcm9jZXNzKCZwc24pID09IG5vRXJyKQoJICAgIFNldEZyb250UHJvY2VzcygmcHNuKTsKICAgIH0KI2VuZGlmCgogICAgcmV0dXJuIE9LOwp9CgogICAgdm9pZApndWlfbWNoX2V4aXQoaW50IHJjKQp7CiAgICAvKiBUT0RPOiBmaW5kIG91dCBhbGwgd2hhdCBpcyBtaXNzaW5nIGhlcmU/ICovCiAgICBEaXNwb3NlUmduKGN1cnNvclJnbik7CgojaWZkZWYgVVNFX0NBUkJPTktFWUhBTkRMRVIKICAgIGlmIChrZXlFdmVudEhhbmRsZXJVUFApCglEaXNwb3NlRXZlbnRIYW5kbGVyVVBQKGtleUV2ZW50SGFuZGxlclVQUCk7CiNlbmRpZgoKI2lmZGVmIFVTRV9NT1VTRVdIRUVMCiAgICBpZiAobW91c2VXaGVlbEhhbmRsZXJVUFAgIT0gTlVMTCkKCURpc3Bvc2VFdmVudEhhbmRsZXJVUFAobW91c2VXaGVlbEhhbmRsZXJVUFApOwojZW5kaWYKCiNpZmRlZiBVU0VfQVRTVUlfRFJBV0lORwogICAgaWYgKGdGb250U3R5bGUpCglBVFNVRGlzcG9zZVN0eWxlKGdGb250U3R5bGUpOwojZW5kaWYKCiAgICAvKiBFeGl0IHRvIHNoZWxsPyAqLwogICAgZXhpdChyYyk7Cn0KCi8qCiAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93LgogKi8KICAgIGludApndWlfbWNoX2dldF93aW5wb3MoaW50ICp4LCBpbnQgKnkpCnsKICAgIC8qIFRPRE8gKi8KI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBSZWN0CWJvdW5kczsKICAgIE9TU3RhdHVzCXN0YXR1czsKCiAgICAvKiBDYXJib24gPj0gMS4wLjIsIE1hY09TID49IDguNSAqLwogICAgc3RhdHVzID0gR2V0V2luZG93Qm91bmRzKGd1aS5WaW1XaW5kb3csIGtXaW5kb3dTdHJ1Y3R1cmVSZ24sICZib3VuZHMpOwoKICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCglyZXR1cm4gRkFJTDsKICAgICp4ID0gYm91bmRzLmxlZnQ7CiAgICAqeSA9IGJvdW5kcy50b3A7CiAgICByZXR1cm4gT0s7CiNlbmRpZgogICAgcmV0dXJuIEZBSUw7Cn0KCi8qCiAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93IHRvIHRoZSBnaXZlbgogKiBjb29yZGluYXRlcy4KICovCiAgICB2b2lkCmd1aV9tY2hfc2V0X3dpbnBvcyhpbnQgeCwgaW50IHkpCnsKICAgIC8qIFRPRE86ICBTaG91bGQgbWFrZSBzdXJlIHRoZSB3aW5kb3cgaXMgbW92ZSB3aXRoaW4gcmFuZ2UKICAgICAqCSAgICAgIGUuZy46IHkgPiB+MTYgW01lbnUgYmFyXSwgeCA+IDAsIHggPCBzY3JlZW4gd2lkdGgKICAgICAqLwogICAgTW92ZVdpbmRvdyhndWkuVmltV2luZG93LCB4LCB5LCBUUlVFKTsKfQoKICAgIHZvaWQKZ3VpX21jaF9zZXRfc2hlbGxzaXplKAogICAgaW50CQl3aWR0aCwKICAgIGludAkJaGVpZ2h0LAogICAgaW50CQltaW5fd2lkdGgsCiAgICBpbnQJCW1pbl9oZWlnaHQsCiAgICBpbnQJCWJhc2Vfd2lkdGgsCiAgICBpbnQJCWJhc2VfaGVpZ2h0KQp7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgQ0dyYWZQdHIJVmltUG9ydDsKICAgIFJlY3QJVmltQm91bmQ7CiNlbmRpZgoKICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQogICAgewojaWZkZWYgVVNFX0NBUkJPTklaRUQKCVZpbVBvcnQgPSBHZXRXaW5kb3dQb3J0KGd1aS5WaW1XaW5kb3cpOwoJR2V0UG9ydEJvdW5kcyhWaW1Qb3J0LCAmVmltQm91bmQpOwoJVmltQm91bmQubGVmdCA9IC1ndWkuc2Nyb2xsYmFyX3dpZHRoOyAvKiArIDE7Ki8KCVNldFBvcnRCb3VuZHMoVmltUG9ydCwgJlZpbUJvdW5kKTsKICAgIC8qCUdldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93R2xvYmFsUG9ydFJnbiwgJndpblBvcnRSZWN0KTsgPz8qLwojZWxzZQoJZ3VpLlZpbVdpbmRvdy0+cG9ydFJlY3QubGVmdCA9IC1ndWkuc2Nyb2xsYmFyX3dpZHRoOyAvKiArIDE7Ki8KICAgIC8qCVNldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93R2xvYmFsUG9ydFJnbiwgJndpblBvcnRSZWN0KTsgPz8qLwojZW5kaWYKICAgIH0KICAgIGVsc2UKICAgIHsKI2lmZGVmIFVTRV9DQVJCT05JWkVECglWaW1Qb3J0ID0gR2V0V2luZG93UG9ydChndWkuVmltV2luZG93KTsKCUdldFBvcnRCb3VuZHMoVmltUG9ydCwgJlZpbUJvdW5kKTsKCVZpbUJvdW5kLmxlZnQgPSAwOwoJU2V0UG9ydEJvdW5kcyhWaW1Qb3J0LCAmVmltQm91bmQpOwojZWxzZQoJZ3VpLlZpbVdpbmRvdy0+cG9ydFJlY3QubGVmdCA9IDA7CiNlbmRpZjsKICAgIH0KCiAgICBTaXplV2luZG93KGd1aS5WaW1XaW5kb3csIHdpZHRoLCBoZWlnaHQsIFRSVUUpOwoKICAgIGd1aV9yZXNpemVfc2hlbGwod2lkdGgsIGhlaWdodCk7Cn0KCi8qCiAqIEdldCB0aGUgc2NyZWVuIGRpbWVuc2lvbnMuCiAqIEFsbG93IDEwIHBpeGVscyBmb3IgaG9yaXpvbnRhbCBib3JkZXJzLCA0MCBmb3IgdmVydGljYWwgYm9yZGVycy4KICogSXMgdGhlcmUgbm8gd2F5IHRvIGZpbmQgb3V0IGhvdyB3aWRlIHRoZSBib3JkZXJzIHJlYWxseSBhcmU/CiAqIFRPRE86IEFkZCBsaXZlIHVkYXRlIG9mIHRob3NlIHZhbHVlIG9uIHN1c3BlbmQvcmVzdW1lLgogKi8KICAgIHZvaWQKZ3VpX21jaF9nZXRfc2NyZWVuX2RpbWVuc2lvbnMoc2NyZWVuX3csIHNjcmVlbl9oKQogICAgaW50CQkqc2NyZWVuX3c7CiAgICBpbnQJCSpzY3JlZW5faDsKewogICAgR0RIYW5kbGUJZG9taW5hbnREZXZpY2UgPSBHZXRNYWluRGV2aWNlKCk7CiAgICBSZWN0CXNjcmVlblJlY3QgPSAoKipkb21pbmFudERldmljZSkuZ2RSZWN0OwoKICAgICpzY3JlZW5fdyA9IHNjcmVlblJlY3QucmlnaHQgLSAxMDsKICAgICpzY3JlZW5faCA9IHNjcmVlblJlY3QuYm90dG9tIC0gNDA7Cn0KCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChNQUNPU19YKQovKgogKiBPcGVuIHRoZSBGb250IFBhbmVsIGFuZCB3YWl0IGZvciB0aGUgdXNlciB0byBzZWxlY3QgYSBmb250IGFuZAogKiBjbG9zZSB0aGUgcGFuZWwuICBUaGVuIGZpbGwgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGZvbnRfbmFtZSB3aXRoCiAqIHRoZSBuYW1lIGFuZCBzaXplIG9mIHRoZSBzZWxlY3RlZCBmb250IGFuZCByZXR1cm4gdGhlIGZvbnQncyBoYW5kbGUsCiAqIG9yIE5PRk9OVCBpbiBjYXNlIG9mIGFuIGVycm9yLgogKi8KICAgIHN0YXRpYyBHdWlGb250Cmd1aV9tYWNfc2VsZWN0X2ZvbnQoY2hhcl91ICpmb250X25hbWUpCnsKICAgIEd1aUZvbnQJCSAgICBzZWxlY3RlZF9mb250ID0gTk9GT05UOwogICAgT1NTdGF0dXMJCSAgICBzdGF0dXM7CiAgICBGb250U2VsZWN0aW9uUURTdHlsZSAgICBjdXJyX2ZvbnQ7CgogICAgLyogSW5pdGlhbGl6ZSB0aGUgRm9udCBQYW5lbCB3aXRoIHRoZSBjdXJyZW50IGZvbnQuICovCiAgICBjdXJyX2ZvbnQuaW5zdGFuY2UuZm9udEZhbWlseSA9IGd1aS5ub3JtX2ZvbnQgJiAweEZGRkY7CiAgICBjdXJyX2ZvbnQuc2l6ZSA9IChndWkubm9ybV9mb250ID4+IDE2KTsKICAgIC8qIFRPRE86IHNldCBmb250U3R5bGUgb25jZSBzdHlsZXMgYXJlIHN1cHBvcnRlZCBpbiBndWlfbWFjX2ZpbmRfZm9udCgpICovCiAgICBjdXJyX2ZvbnQuaW5zdGFuY2UuZm9udFN0eWxlID0gMDsKICAgIGN1cnJfZm9udC5oYXNDb2xvciA9IGZhbHNlOwogICAgY3Vycl9mb250LnZlcnNpb24gPSAwOyAvKiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgc3R5bGUgc3RydWN0dXJlICovCiAgICBzdGF0dXMgPSBTZXRGb250SW5mb0ZvclNlbGVjdGlvbihrRm9udFNlbGVjdGlvblFEVHlwZSwKCSAgICAvKm51bVN0eWxlcz0qLzEsICZjdXJyX2ZvbnQsIC8qZXZlbnRUYXJnZXQ9Ki9OVUxMKTsKCiAgICBnRm9udFBhbmVsSW5mby5mYW1pbHkgPSBjdXJyX2ZvbnQuaW5zdGFuY2UuZm9udEZhbWlseTsKICAgIGdGb250UGFuZWxJbmZvLnN0eWxlID0gY3Vycl9mb250Lmluc3RhbmNlLmZvbnRTdHlsZTsKICAgIGdGb250UGFuZWxJbmZvLnNpemUgPSBjdXJyX2ZvbnQuc2l6ZTsKCiAgICAvKiBQb3AgdXAgdGhlIEZvbnQgUGFuZWwuICovCiAgICBzdGF0dXMgPSBGUFNob3dIaWRlRm9udFBhbmVsKCk7CiAgICBpZiAoc3RhdHVzID09IG5vRXJyKQogICAgewoJLyoKCSAqIFRoZSBGb250IFBhbmVsIGlzIG1vZGVsZXNzLiAgV2UgcmVhbGx5IG5lZWQgaXQgdG8gYmUgbW9kYWwsCgkgKiBzbyB3ZSBzcGluIGluIGFuIGV2ZW50IGxvb3AgdW50aWwgdGhlIHBhbmVsIGlzIGNsb3NlZC4KCSAqLwoJZ0ZvbnRQYW5lbEluZm8uaXNQYW5lbFZpc2libGUgPSB0cnVlOwoJd2hpbGUgKGdGb250UGFuZWxJbmZvLmlzUGFuZWxWaXNpYmxlKQoJewoJICAgIEV2ZW50UmVjb3JkIGU7CgkgICAgV2FpdE5leHRFdmVudChldmVyeUV2ZW50LCAmZSwgLypzbGVlcD0qLzIwLCAvKm1vdXNlUmduPSovTlVMTCk7Cgl9CgoJR2V0Rm9udFBhbmVsU2VsZWN0aW9uKGZvbnRfbmFtZSk7CglzZWxlY3RlZF9mb250ID0gZ3VpX21hY19maW5kX2ZvbnQoZm9udF9uYW1lKTsKICAgIH0KICAgIHJldHVybiBzZWxlY3RlZF9mb250Owp9CiNlbmRpZgoKCi8qCiAqIEluaXRpYWxpc2UgdmltIHRvIHVzZSB0aGUgZm9udCB3aXRoIHRoZSBnaXZlbiBuYW1lLglSZXR1cm4gRkFJTCBpZiB0aGUgZm9udAogKiBjb3VsZCBub3QgYmUgbG9hZGVkLCBPSyBvdGhlcndpc2UuCiAqLwogICAgaW50Cmd1aV9tY2hfaW5pdF9mb250KGZvbnRfbmFtZSwgZm9udHNldCkKICAgIGNoYXJfdQkqZm9udF9uYW1lOwogICAgaW50CQlmb250c2V0OwkgICAgLyogbm90IHVzZWQgKi8KewogICAgLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIGJvbGQgaXRhbGljIHVuZGVybGluZSBwcm9wb3J0aW9uYWwgZXRjLi4uICovCiAgICBTdHIyNTUJc3VnZ2VzdGVkRm9udCA9ICJccE1vbmFjbyI7CiAgICBpbnQJCXN1Z2dlc3RlZFNpemUgPSA5OwogICAgRm9udEluZm8JZm9udF9pbmZvOwogICAgc2hvcnQJZm9udF9pZDsKICAgIEd1aUZvbnQJZm9udDsKICAgIGNoYXJfdQl1c2VkX2ZvbnRfbmFtZVs1MTJdOwoKI2lmZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICBpZiAoZ0ZvbnRTdHlsZSA9PSBOVUxMKQogICAgewoJaWYgKEFUU1VDcmVhdGVTdHlsZSgmZ0ZvbnRTdHlsZSkgIT0gbm9FcnIpCgkgICAgZ0ZvbnRTdHlsZSA9IE5VTEw7CiAgICB9CiNlbmRpZgoKICAgIGlmIChmb250X25hbWUgPT0gTlVMTCkKICAgIHsKCS8qIEZpcnN0IHRyeSB0byBnZXQgdGhlIHN1Z2dlc3RlZCBmb250ICovCglHZXRGTnVtKHN1Z2dlc3RlZEZvbnQsICZmb250X2lkKTsKCglpZiAoZm9udF9pZCA9PSAwKQoJewoJICAgIC8qIFRoZW4gcGlja3VwIHRoZSBzdGFuZGFyZCBhcHBsaWNhdGlvbiBmb250ICovCgkgICAgZm9udF9pZCA9IEdldEFwcEZvbnQoKTsKCSAgICBTVFJDUFkodXNlZF9mb250X25hbWUsICJkZWZhdWx0Iik7Cgl9CgllbHNlCgkgICAgU1RSQ1BZKHVzZWRfZm9udF9uYW1lLCAiTW9uYWNvIik7Cglmb250ID0gKHN1Z2dlc3RlZFNpemUgPDwgMTYpICsgKChsb25nKSBmb250X2lkICYgMHhGRkZGKTsKICAgIH0KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoTUFDT1NfWCkKICAgIGVsc2UgaWYgKFNUUkNNUChmb250X25hbWUsICIqIikgPT0gMCkKICAgIHsKCWNoYXJfdSAqbmV3X3BfZ3VpZm9udDsKCglmb250ID0gZ3VpX21hY19zZWxlY3RfZm9udCh1c2VkX2ZvbnRfbmFtZSk7CglpZiAoZm9udCA9PSBOT0ZPTlQpCgkgICAgcmV0dXJuIEZBSUw7CgoJLyogU2V0IGd1aWZvbnQgdG8gdGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGZvbnQuICovCgluZXdfcF9ndWlmb250ID0gYWxsb2MoU1RSTEVOKHVzZWRfZm9udF9uYW1lKSArIDEpOwoJaWYgKG5ld19wX2d1aWZvbnQgIT0gTlVMTCkKCXsKCSAgICBTVFJDUFkobmV3X3BfZ3VpZm9udCwgdXNlZF9mb250X25hbWUpOwoJICAgIHZpbV9mcmVlKHBfZ3VpZm9udCk7CgkgICAgcF9ndWlmb250ID0gbmV3X3BfZ3VpZm9udDsKCSAgICAvKiBSZXBsYWNlIHNwYWNlcyBpbiB0aGUgZm9udCBuYW1lIHdpdGggdW5kZXJzY29yZXMuICovCgkgICAgZm9yICggOyAqbmV3X3BfZ3VpZm9udDsgKytuZXdfcF9ndWlmb250KQoJICAgIHsKCQlpZiAoKm5ld19wX2d1aWZvbnQgPT0gJyAnKQoJCSAgICAqbmV3X3BfZ3VpZm9udCA9ICdfJzsKCSAgICB9Cgl9CiAgICB9CiNlbmRpZgogICAgZWxzZQogICAgewoJZm9udCA9IGd1aV9tYWNfZmluZF9mb250KGZvbnRfbmFtZSk7CglTVFJOQ1BZKHVzZWRfZm9udF9uYW1lLCBmb250X25hbWUsIHNpemVvZih1c2VkX2ZvbnRfbmFtZSkpOwoJdXNlZF9mb250X25hbWVbc2l6ZW9mKHVzZWRfZm9udF9uYW1lKSAtIDFdID0gTlVMOwoKCWlmIChmb250ID09IE5PRk9OVCkKCSAgICByZXR1cm4gRkFJTDsKICAgIH0KCiAgICBndWkubm9ybV9mb250ID0gZm9udDsKCiAgICBobF9zZXRfZm9udF9uYW1lKHVzZWRfZm9udF9uYW1lKTsKCiAgICBUZXh0U2l6ZShmb250ID4+IDE2KTsKICAgIFRleHRGb250KGZvbnQgJiAweEZGRkYpOwoKI2lmZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICBBVFNVRm9udElECQkJZm9udElEOwogICAgRml4ZWQJCQlmb250U2l6ZTsKICAgIEFUU1N0eWxlUmVuZGVyaW5nT3B0aW9ucwlmb250T3B0aW9uczsKCiAgICBpZiAoZ0ZvbnRTdHlsZSkKICAgIHsKCWZvbnRJRCA9IGZvbnQgJiAweEZGRkY7Cglmb250U2l6ZSA9IExvbmcyRml4KGZvbnQgPj4gMTYpOwoKCS8qIE5vIGFudGlhbGlhc2luZyBieSBkZWZhdWx0IChkbyBub3QgYXR0ZW1wdCB0byB0b3VjaCBhbnRpYWxpc2luZwoJICogb3B0aW9ucyBvbiBwcmUtSmFndWFyKSAqLwoJZm9udE9wdGlvbnMgPQojaWZkZWYgTUFDT1NfWAoJICAgIChnTWFjU3lzdGVtVmVyc2lvbiA+PSAweDEwMjApID8KCSAgICBrQVRTU3R5bGVOb0FudGlBbGlhc2luZyA6CiNlbmRpZgoJICAgIGtBVFNTdHlsZU5vT3B0aW9uczsKCglBVFNVQXR0cmlidXRlVGFnIGF0dHJpYlRhZ3NbXSA9Cgl7CgkgICAga0FUU1VGb250VGFnLCBrQVRTVVNpemVUYWcsIGtBVFNVU3R5bGVSZW5kZXJpbmdPcHRpb25zVGFnLAoJICAgIGtBVFNVTWF4QVRTVUlUYWdWYWx1ZSsxCgl9OwoJQnl0ZUNvdW50IGF0dHJpYlNpemVzW10gPQoJewoJICAgIHNpemVvZihBVFNVRm9udElEKSwgc2l6ZW9mKEZpeGVkKSwKCSAgICBzaXplb2YoQVRTU3R5bGVSZW5kZXJpbmdPcHRpb25zKSwgc2l6ZW9mIGZvbnQKCX07CglBVFNVQXR0cmlidXRlVmFsdWVQdHIgYXR0cmliVmFsdWVzW10gPQoJewoJICAgICZmb250SUQsICZmb250U2l6ZSwgJmZvbnRPcHRpb25zLCAmZm9udAoJfTsKCgkvKiBDb252ZXJ0IGZvbnQgaWQgdG8gQVRTVUZvbnRJRCAqLwoJaWYgKEZNR2V0Rm9udEZyb21Gb250RmFtaWx5SW5zdGFuY2UoZm9udElELCAwLCAmZm9udElELCBOVUxMKSA9PSBub0VycikKCXsKCSAgICBpZiAoQVRTVVNldEF0dHJpYnV0ZXMoZ0ZvbnRTdHlsZSwKCQkJKHNpemVvZiBhdHRyaWJUYWdzKS9zaXplb2YoQVRTVUF0dHJpYnV0ZVRhZyksCgkJCWF0dHJpYlRhZ3MsIGF0dHJpYlNpemVzLCBhdHRyaWJWYWx1ZXMpICE9IG5vRXJyKQoJICAgIHsKCQlBVFNVRGlzcG9zZVN0eWxlKGdGb250U3R5bGUpOwoJCWdGb250U3R5bGUgPSBOVUxMOwoJICAgIH0KCX0KICAgIH0KI2VuZGlmCgogICAgR2V0Rm9udEluZm8oJmZvbnRfaW5mbyk7CgogICAgZ3VpLmNoYXJfYXNjZW50ID0gZm9udF9pbmZvLmFzY2VudDsKICAgIGd1aS5jaGFyX3dpZHRoICA9IENoYXJXaWR0aCgnXycpOwogICAgZ3VpLmNoYXJfaGVpZ2h0ID0gZm9udF9pbmZvLmFzY2VudCArIGZvbnRfaW5mby5kZXNjZW50ICsgcF9saW5lc3BhY2U7CgogICAgcmV0dXJuIE9LOwoKfQoKICAgIGludApndWlfbWNoX2FkanVzdF9jaGFyc2l6ZSgpCnsKICAgIEZvbnRJbmZvICAgIGZvbnRfaW5mbzsKCiAgICBHZXRGb250SW5mbygmZm9udF9pbmZvKTsKICAgIGd1aS5jaGFyX2hlaWdodCA9IGZvbnRfaW5mby5hc2NlbnQgKyBmb250X2luZm8uZGVzY2VudCArIHBfbGluZXNwYWNlOwogICAgZ3VpLmNoYXJfYXNjZW50ID0gZm9udF9pbmZvLmFzY2VudCArIHBfbGluZXNwYWNlIC8gMjsKICAgIHJldHVybiBPSzsKfQoKLyoKICogR2V0IGEgZm9udCBzdHJ1Y3R1cmUgZm9yIGhpZ2hsaWdodGluZy4KICovCiAgICBHdWlGb250Cmd1aV9tY2hfZ2V0X2ZvbnQobmFtZSwgZ2l2ZUVycm9ySWZNaXNzaW5nKQogICAgY2hhcl91CSpuYW1lOwogICAgaW50CQlnaXZlRXJyb3JJZk1pc3Npbmc7CnsKICAgIEd1aUZvbnQgZm9udDsKCiAgICBmb250ID0gZ3VpX21hY19maW5kX2ZvbnQobmFtZSk7CgogICAgaWYgKGZvbnQgPT0gTk9GT05UKQogICAgewoJaWYgKGdpdmVFcnJvcklmTWlzc2luZykKCSAgICBFTVNHMihfKGVfZm9udCksIG5hbWUpOwoJcmV0dXJuIE5PRk9OVDsKICAgIH0KICAgIC8qCiAgICAgKiBUT0RPIDogQWNjZXB0IG9ubHkgbW9ub3NwYWNlCiAgICAgKi8KCiAgICByZXR1cm4gZm9udDsKfQoKI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBSZXR1cm4gdGhlIG5hbWUgb2YgZm9udCAiZm9udCIgaW4gYWxsb2NhdGVkIG1lbW9yeS4KICogRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBhY3R1YWwgbmFtZSwgdGh1cyB1c2UgdGhlIHByb3ZpZGVkIG5hbWUuCiAqLwogICAgY2hhcl91ICoKZ3VpX21jaF9nZXRfZm9udG5hbWUoZm9udCwgbmFtZSkKICAgIEd1aUZvbnQgZm9udDsKICAgIGNoYXJfdSAgKm5hbWU7CnsKICAgIGlmIChuYW1lID09IE5VTEwpCglyZXR1cm4gTlVMTDsKICAgIHJldHVybiB2aW1fc3Ryc2F2ZShuYW1lKTsKfQojZW5kaWYKCi8qCiAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvbnQuCiAqLwogICAgdm9pZApndWlfbWNoX3NldF9mb250KGZvbnQpCiAgICBHdWlGb250CWZvbnQ7CnsKI2lmZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICBHdWlGb250CQkJY3VyckZvbnQ7CiAgICBCeXRlQ291bnQJCQlhY3R1YWxGb250Qnl0ZUNvdW50OwogICAgQVRTVUZvbnRJRAkJCWZvbnRJRDsKICAgIEZpeGVkCQkJZm9udFNpemU7CiAgICBBVFNTdHlsZVJlbmRlcmluZ09wdGlvbnMJZm9udE9wdGlvbnM7CgogICAgaWYgKGdGb250U3R5bGUpCiAgICB7CgkvKiBBdm9pZCBzZXR0aW5nIHNhbWUgZm9udCBhZ2FpbiAqLwoJaWYgKEFUU1VHZXRBdHRyaWJ1dGUoZ0ZvbnRTdHlsZSwga0FUU1VNYXhBVFNVSVRhZ1ZhbHVlKzEsIHNpemVvZiBmb250LAoJCSAgICAmY3VyckZvbnQsICZhY3R1YWxGb250Qnl0ZUNvdW50KSA9PSBub0VyciAmJgoJCWFjdHVhbEZvbnRCeXRlQ291bnQgPT0gKHNpemVvZiBmb250KSkKCXsKCSAgICBpZiAoY3VyckZvbnQgPT0gZm9udCkKCQlyZXR1cm47Cgl9CgoJZm9udElEID0gZm9udCAmIDB4RkZGRjsKCWZvbnRTaXplID0gTG9uZzJGaXgoZm9udCA+PiAxNik7CgkvKiBSZXNwZWN0IHBfYW50aWFsaWFzIHNldHRpbmcgb25seSBmb3Igd2lkZSBmb250LgoJICogVGhlIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBhdCB0aGUgbW9tZW50IGlzIGEgYml0IGNvbXBsaWNhdGVkLAoJICogYnV0IGl0J3MgbWFpbmx5IGJlY2F1c2UgYSkgbGF0aW4gKG5vbi13aWRlKSBhbGlhc2VkIGZvbnRzCgkgKiBsb29rIGJhZCBpbiBPUyBYIDEwLjMueCBhbmQgYmVsb3cgKGR1ZSB0byBhIGJ1ZyBpbiBBVFMpLCBhbmQKCSAqIGIpIHdpZGUgbXVsdGlieXRlIGlucHV0IGRvZXMgbm90IHN1ZmZlciBmcm9tIHRoYXQgcHJvYmxlbS4gKi8KCWZvbnRPcHRpb25zID0KI2lmZGVmIE1BQ09TX1gKCSAgICAocF9hbnRpYWxpYXMgJiYgKGZvbnQgPT0gZ3VpLndpZGVfZm9udCkpID8KCSAgICBrQVRTU3R5bGVOb09wdGlvbnMgOiBrQVRTU3R5bGVOb0FudGlBbGlhc2luZzsKI2Vsc2UKCSAgICBrQVRTU3R5bGVOb09wdGlvbnM7CiNlbmRpZgoKCUFUU1VBdHRyaWJ1dGVUYWcgYXR0cmliVGFnc1tdID0KCXsKCSAgICBrQVRTVUZvbnRUYWcsIGtBVFNVU2l6ZVRhZywga0FUU1VTdHlsZVJlbmRlcmluZ09wdGlvbnNUYWcsCgkgICAga0FUU1VNYXhBVFNVSVRhZ1ZhbHVlKzEKCX07CglCeXRlQ291bnQgYXR0cmliU2l6ZXNbXSA9Cgl7CgkgICAgc2l6ZW9mKEFUU1VGb250SUQpLCBzaXplb2YoRml4ZWQpLAoJICAgIHNpemVvZihBVFNTdHlsZVJlbmRlcmluZ09wdGlvbnMpLCBzaXplb2YgZm9udAoJfTsKCUFUU1VBdHRyaWJ1dGVWYWx1ZVB0ciBhdHRyaWJWYWx1ZXNbXSA9Cgl7CgkgICAgJmZvbnRJRCwgJmZvbnRTaXplLCAmZm9udE9wdGlvbnMsICZmb250Cgl9OwoKCWlmIChGTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlKGZvbnRJRCwgMCwgJmZvbnRJRCwgTlVMTCkgPT0gbm9FcnIpCgl7CgkgICAgaWYgKEFUU1VTZXRBdHRyaWJ1dGVzKGdGb250U3R5bGUsCgkJCShzaXplb2YgYXR0cmliVGFncykvc2l6ZW9mKEFUU1VBdHRyaWJ1dGVUYWcpLAoJCQlhdHRyaWJUYWdzLCBhdHRyaWJTaXplcywgYXR0cmliVmFsdWVzKSAhPSBub0VycikKCSAgICB7CiNpZm5kZWYgTkRFQlVHCgkJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBzZXQgZm9udCBzdHlsZVxuIik7CiNlbmRpZgoJCUFUU1VEaXNwb3NlU3R5bGUoZ0ZvbnRTdHlsZSk7CgkJZ0ZvbnRTdHlsZSA9IE5VTEw7CgkgICAgfQoJfQoKICAgIH0KCiAgICBpZiAoIWdJc0ZvbnRGYWxsYmFja1NldCkKICAgIHsKCS8qIFNldHVwIGF1dG9tYXRpYyBmb250IHN1YnN0aXR1dGlvbi4gVGhlIHVzZXIncyBndWlmb250d2lkZQoJICogaXMgdHJpZWQgZmlyc3QsIHRoZW4gdGhlIHN5c3RlbSB0cmllcyBvdGhlciBmb250cy4gKi8KLyoKCUFUU1VBdHRyaWJ1dGVUYWcgZmFsbGJhY2tUYWdzW10gPSB7IGtBVFNVTGluZUZvbnRGYWxsYmFja3NUYWcgfTsKCUJ5dGVDb3VudCBmYWxsYmFja1NpemVzW10gPSB7IHNpemVvZihBVFNVRm9udEZhbGxiYWNrcykgfTsKCUFUU1VDcmVhdGVGb250RmFsbGJhY2tzKCZnRm9udEZhbGxiYWNrcyk7CglBVFNVU2V0T2JqRm9udEZhbGxiYWNrcyhnRm9udEZhbGxiYWNrcywgKTsKKi8KCWlmIChndWkud2lkZV9mb250KQoJewoJICAgIEFUU1VGb250SUQgZmFsbGJhY2tGb250czsKCSAgICBnSXNGb250RmFsbGJhY2tTZXQgPSBUUlVFOwoKCSAgICBpZiAoRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZSgKCQkJKGd1aS53aWRlX2ZvbnQgJiAweEZGRkYpLAoJCQkwLAoJCQkmZmFsbGJhY2tGb250cywKCQkJTlVMTCkgPT0gbm9FcnIpCgkgICAgewoJCUFUU1VTZXRGb250RmFsbGJhY2tzKChzaXplb2YgZmFsbGJhY2tGb250cykvc2l6ZW9mKEFUU1VGb250SUQpLCAmZmFsbGJhY2tGb250cywga0FUU1VTZXF1ZW50aWFsRmFsbGJhY2tzUHJlZmVycmVkKTsKCSAgICB9Ci8qCglBVFNVQXR0cmlidXRlVmFsdWVQdHIgZmFsbGJhY2tWYWx1ZXNbXSA9IHsgfTsKKi8KCX0KICAgIH0KI2VuZGlmCiAgICBUZXh0U2l6ZShmb250ID4+IDE2KTsKICAgIFRleHRGb250KGZvbnQgJiAweEZGRkYpOwp9CgojaWYgMCAvKiBub3QgdXNlZCAqLwovKgogKiBSZXR1cm4gVFJVRSBpZiB0aGUgdHdvIGZvbnRzIGdpdmVuIGFyZSBlcXVpdmFsZW50LgogKi8KICAgIGludApndWlfbWNoX3NhbWVfZm9udChmMSwgZjIpCiAgICBHdWlGb250CWYxOwogICAgR3VpRm9udAlmMjsKewogICAgcmV0dXJuIGYxID09IGYyOwp9CiNlbmRpZgoKLyoKICogSWYgYSBmb250IGlzIG5vdCBnb2luZyB0byBiZSB1c2VkLCBmcmVlIGl0cyBzdHJ1Y3R1cmUuCiAqLwogICAgdm9pZApndWlfbWNoX2ZyZWVfZm9udChmb250KQogICAgR3VpRm9udAlmb250Owp7CiAgICAvKgogICAgICogRnJlZSBmb250IHdoZW4gImZvbnQiIGlzIG5vdCAwLgogICAgICogTm90aGluZyB0byBkbyBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgc2luY2UKICAgICAqIG5vdGhpbmcgaXMgYWxsb2NhdGVkIGZvciBlYWNoIGZvbnQgdXNlZC4KICAgICAqLwp9CgogICAgc3RhdGljIGludApoZXhfZGlnaXQoYykKICAgIGludAkJYzsKewogICAgaWYgKGlzZGlnaXQoYykpCglyZXR1cm4gYyAtICcwJzsKICAgIGMgPSBUT0xPV0VSX0FTQyhjKTsKICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKCXJldHVybiBjIC0gJ2EnICsgMTA7CiAgICByZXR1cm4gLTEwMDA7Cn0KCi8qCiAqIFJldHVybiB0aGUgUGl4ZWwgdmFsdWUgKGNvbG9yKSBmb3IgdGhlIGdpdmVuIGNvbG9yIG5hbWUuICBUaGlzIHJvdXRpbmUgd2FzCiAqIHByZXR0eSBtdWNoIHRha2VuIGZyb20gZXhhbXBsZSBjb2RlIGluIHRoZSBTaWxpY29uIEdyYXBoaWNzIE9TRi9Nb3RpZgogKiBQcm9ncmFtbWVyJ3MgR3VpZGUuCiAqIFJldHVybiBJTlZBTENPTE9SIHdoZW4gZmFpbGVkLgogKi8KICAgIGd1aWNvbG9yX1QKZ3VpX21jaF9nZXRfY29sb3IobmFtZSkKICAgIGNoYXJfdSAqbmFtZTsKewogICAgLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgbmFtZWQgY29sb3Igb2YgTWFjT1MgOAogICAgICovCiAgICBSR0JDb2xvcglNYWNDb2xvcjsKLy8gICAgZ3VpY29sb3JfVAljb2xvciA9IDA7CgogICAgdHlwZWRlZiBzdHJ1Y3QgZ3VpY29sb3JfdFRhYmxlCiAgICB7CgljaGFyCSAgICAqbmFtZTsKCWd1aWNvbG9yX1QgIGNvbG9yOwogICAgfSBndWljb2xvcl90VGFibGU7CgogICAgLyoKICAgICAqIFRoZSBjb21tZW50IGF0IHRoZSBlbmQgb2YgZWFjaCBsaW5lIGlzIHRoZSBzb3VyY2UKICAgICAqIChNYWMsIFdpbmRvdywgVW5peCkgYW5kIHRoZSBudW1iZXIgaXMgdGhlIHVuaXggcmdiLnR4dCB2YWx1ZQogICAgICovCiAgICBzdGF0aWMgZ3VpY29sb3JfdFRhYmxlIHRhYmxlW10gPQogICAgewoJeyJCbGFjayIsCVJHQigweDAwLCAweDAwLCAweDAwKX0sCgl7ImRhcmtncmF5IiwJUkdCKDB4ODAsIDB4ODAsIDB4ODApfSwgLypXKi8KCXsiZGFya2dyZXkiLAlSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LCAvKlcqLwoJeyJHcmF5IiwJUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwgLypXKi8KCXsiR3JleSIsCVJHQigweEMwLCAweEMwLCAweEMwKX0sIC8qVyovCgl7ImxpZ2h0Z3JheSIsCVJHQigweEUwLCAweEUwLCAweEUwKX0sIC8qVyovCgl7ImxpZ2h0Z3JleSIsCVJHQigweEUwLCAweEUwLCAweEUwKX0sIC8qVyovCgl7IndoaXRlIiwJUkdCKDB4RkYsIDB4RkYsIDB4RkYpfSwKCXsiZGFya3JlZCIsCVJHQigweDgwLCAweDAwLCAweDAwKX0sIC8qVyovCgl7InJlZCIsCQlSR0IoMHhERCwgMHgwOCwgMHgwNil9LCAvKk0qLwoJeyJsaWdodHJlZCIsCVJHQigweEZGLCAweEEwLCAweEEwKX0sIC8qVyovCgl7IkRhcmtCbHVlIiwJUkdCKDB4MDAsIDB4MDAsIDB4ODApfSwgLypXKi8KCXsiQmx1ZSIsCVJHQigweDAwLCAweDAwLCAweEQ0KX0sIC8qTSovCgl7ImxpZ2h0Ymx1ZSIsCVJHQigweEEwLCAweEEwLCAweEZGKX0sIC8qVyovCgl7IkRhcmtHcmVlbiIsCVJHQigweDAwLCAweDgwLCAweDAwKX0sIC8qVyovCgl7IkdyZWVuIiwJUkdCKDB4MDAsIDB4NjQsIDB4MTEpfSwgLypNKi8KCXsibGlnaHRncmVlbiIsCVJHQigweEEwLCAweEZGLCAweEEwKX0sIC8qVyovCgl7IkRhcmtDeWFuIiwJUkdCKDB4MDAsIDB4ODAsIDB4ODApfSwgLypXID8weDMwN0Q3RSAqLwoJeyJjeWFuIiwJUkdCKDB4MDIsIDB4QUIsIDB4RUEpfSwgLypNKi8KCXsibGlnaHRjeWFuIiwJUkdCKDB4QTAsIDB4RkYsIDB4RkYpfSwgLypXKi8KCXsiZGFya21hZ2VudGEiLAlSR0IoMHg4MCwgMHgwMCwgMHg4MCl9LCAvKlcqLwoJeyJtYWdlbnRhIiwJUkdCKDB4RjIsIDB4MDgsIDB4ODQpfSwgLypNKi8KCXsibGlnaHRtYWdlbnRhIixSR0IoMHhGMCwgMHhBMCwgMHhGMCl9LCAvKlcqLwoJeyJicm93biIsCVJHQigweDgwLCAweDQwLCAweDQwKX0sIC8qVyovCgl7InllbGxvdyIsCVJHQigweEZDLCAweEYzLCAweDA1KX0sIC8qTSovCgl7ImxpZ2h0eWVsbG93IiwJUkdCKDB4RkYsIDB4RkYsIDB4QTApfSwgLypNKi8KCXsiU2VhR3JlZW4iLAlSR0IoMHgyRSwgMHg4QiwgMHg1Nyl9LCAvKlcgMHg0RTg5NzUgKi8KCXsib3JhbmdlIiwJUkdCKDB4RkMsIDB4ODAsIDB4MDApfSwgLypXIDB4Rjg3QTE3ICovCgl7IlB1cnBsZSIsCVJHQigweEEwLCAweDIwLCAweEYwKX0sIC8qVyAweDhlMzVlNSAqLwoJeyJTbGF0ZUJsdWUiLAlSR0IoMHg2QSwgMHg1QSwgMHhDRCl9LCAvKlcgMHg3MzdDQTEgKi8KCXsiVmlvbGV0IiwJUkdCKDB4OEQsIDB4MzgsIDB4QzkpfSwgLypVKi8KICAgIH07CgogICAgaW50CQlyLCBnLCBiOwogICAgaW50CQlpOwoKICAgIGlmIChuYW1lWzBdID09ICcjJyAmJiBzdHJsZW4oKGNoYXIgKikgbmFtZSkgPT0gNykKICAgIHsKCS8qIE5hbWUgaXMgaW4gIiNycmdnYmIiIGZvcm1hdCAqLwoJciA9IGhleF9kaWdpdChuYW1lWzFdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbMl0pOwoJZyA9IGhleF9kaWdpdChuYW1lWzNdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNF0pOwoJYiA9IGhleF9kaWdpdChuYW1lWzVdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNl0pOwoJaWYgKHIgPCAwIHx8IGcgPCAwIHx8IGIgPCAwKQoJICAgIHJldHVybiBJTlZBTENPTE9SOwoJcmV0dXJuIFJHQihyLCBnLCBiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmIChTVFJJQ01QKG5hbWUsICJoaWxpdGUiKSA9PSAwKQoJewoJICAgIExNR2V0SGlsaXRlUkdCKCZNYWNDb2xvcik7CgkgICAgcmV0dXJuIChSR0IoTWFjQ29sb3IucmVkID4+IDgsIE1hY0NvbG9yLmdyZWVuID4+IDgsIE1hY0NvbG9yLmJsdWUgPj4gOCkpOwoJfQoJLyogQ2hlY2sgaWYgdGhlIG5hbWUgaXMgb25lIG9mIHRoZSBjb2xvcnMgd2Uga25vdyAqLwoJZm9yIChpID0gMDsgaSA8IHNpemVvZih0YWJsZSkgLyBzaXplb2YodGFibGVbMF0pOyBpKyspCgkgICAgaWYgKFNUUklDTVAobmFtZSwgdGFibGVbaV0ubmFtZSkgPT0gMCkKCQlyZXR1cm4gdGFibGVbaV0uY29sb3I7CiAgICB9CgoKICAgIC8qCiAgICAgKiBMYXN0IGF0dGVtcHQuIExvb2sgaW4gdGhlIGZpbGUgIiRWSU0vcmdiLnR4dCIuCiAgICAgKi8KICAgIHsKI2RlZmluZSBMSU5FX0xFTiAxMDAKCUZJTEUJKmZkOwoJY2hhcglsaW5lW0xJTkVfTEVOXTsKCWNoYXJfdQkqZm5hbWU7CgojaWZkZWYgQ09MT05fQVNfUEFUSFNFUAoJZm5hbWUgPSBleHBhbmRfZW52X3NhdmUoKGNoYXJfdSAqKSIkVklNUlVOVElNRTpyZ2IudHh0Iik7CiNlbHNlCglmbmFtZSA9IGV4cGFuZF9lbnZfc2F2ZSgoY2hhcl91ICopIiRWSU1SVU5USU1FL3JnYi50eHQiKTsKI2VuZGlmCglpZiAoZm5hbWUgPT0gTlVMTCkKCSAgICByZXR1cm4gSU5WQUxDT0xPUjsKCglmZCA9IGZvcGVuKChjaGFyICopZm5hbWUsICJydCIpOwoJdmltX2ZyZWUoZm5hbWUpOwoJaWYgKGZkID09IE5VTEwpCgkgICAgcmV0dXJuIElOVkFMQ09MT1I7CgoJd2hpbGUgKCFmZW9mKGZkKSkKCXsKCSAgICBpbnQJCWxlbjsKCSAgICBpbnQJCXBvczsKCSAgICBjaGFyCSpjb2xvcjsKCgkgICAgZmdldHMobGluZSwgTElORV9MRU4sIGZkKTsKCSAgICBsZW4gPSBzdHJsZW4obGluZSk7CgoJICAgIGlmIChsZW4gPD0gMSB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQoJCWNvbnRpbnVlOwoKCSAgICBsaW5lW2xlbi0xXSA9ICdcMCc7CgoJICAgIGkgPSBzc2NhbmYobGluZSwgIiVkICVkICVkICVuIiwgJnIsICZnLCAmYiwgJnBvcyk7CgkgICAgaWYgKGkgIT0gMykKCQljb250aW51ZTsKCgkgICAgY29sb3IgPSBsaW5lICsgcG9zOwoKCSAgICBpZiAoU1RSSUNNUChjb2xvciwgbmFtZSkgPT0gMCkKCSAgICB7CgkJZmNsb3NlKGZkKTsKCQlyZXR1cm4gKGd1aWNvbG9yX1QpIFJHQihyLCBnLCBiKTsKCSAgICB9Cgl9CglmY2xvc2UoZmQpOwogICAgfQoKICAgIHJldHVybiBJTlZBTENPTE9SOwp9CgovKgogKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLgogKi8KICAgIHZvaWQKZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpCiAgICBndWljb2xvcl9UCWNvbG9yOwp7CiAgICBSR0JDb2xvciBUaGVDb2xvcjsKCiAgICBUaGVDb2xvci5yZWQgPSBSZWQoY29sb3IpICogMHgwMTAxOwogICAgVGhlQ29sb3IuZ3JlZW4gPSBHcmVlbihjb2xvcikgKiAweDAxMDE7CiAgICBUaGVDb2xvci5ibHVlID0gQmx1ZShjb2xvcikgKiAweDAxMDE7CgogICAgUkdCRm9yZUNvbG9yKCZUaGVDb2xvcik7Cn0KCi8qCiAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGJhY2tncm91bmQgY29sb3IuCiAqLwogICAgdm9pZApndWlfbWNoX3NldF9iZ19jb2xvcihjb2xvcikKICAgIGd1aWNvbG9yX1QJY29sb3I7CnsKICAgIFJHQkNvbG9yIFRoZUNvbG9yOwoKICAgIFRoZUNvbG9yLnJlZCA9IFJlZChjb2xvcikgKiAweDAxMDE7CiAgICBUaGVDb2xvci5ncmVlbiA9IEdyZWVuKGNvbG9yKSAqIDB4MDEwMTsKICAgIFRoZUNvbG9yLmJsdWUgPSBCbHVlKGNvbG9yKSAqIDB4MDEwMTsKCiAgICBSR0JCYWNrQ29sb3IoJlRoZUNvbG9yKTsKfQoKICAgIHZvaWQKZ3VpX21jaF9kcmF3X3N0cmluZyhyb3csIGNvbCwgcywgbGVuLCBmbGFncykKICAgIGludAkJcm93OwogICAgaW50CQljb2w7CiAgICBjaGFyX3UJKnM7CiAgICBpbnQJCWxlbjsKICAgIGludAkJZmxhZ3M7CnsKI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoTUFDT1NfWCkKI2lmbmRlZiBVU0VfQVRTVUlfRFJBV0lORwogICAgU0ludDMyCXN5c192ZXJzaW9uOwojZW5kaWYKI2VuZGlmCiNpZmRlZiBGRUFUX01CWVRFCiNpZmRlZiBVU0VfQVRTVUlfRFJBV0lORwogICAgLyogQVRTVUkgcmVxdWlyZXMgdXRmLTE2IHN0cmluZ3MgKi8KICAgIFVuaUNoYXJDb3VudCB1dGYxNl9sZW47CiAgICBVbmlDaGFyICp0b2ZyZWUgPSBtYWNfZW5jX3RvX3V0ZjE2KHMsIGxlbiwgKHNpemVfdCAqKSZ1dGYxNl9sZW4pOwogICAgdXRmMTZfbGVuIC89IHNpemVvZihVbmlDaGFyKTsKI2Vsc2UKICAgIGNoYXJfdQkqdG9mcmVlID0gTlVMTDsKCiAgICBpZiAob3V0cHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCiAgICB7Cgl0b2ZyZWUgPSBzdHJpbmdfY29udmVydCgmb3V0cHV0X2NvbnYsIHMsICZsZW4pOwoJaWYgKHRvZnJlZSAhPSBOVUxMKQoJICAgIHMgPSB0b2ZyZWU7CiAgICB9CiNlbmRpZgojZW5kaWYKCiNpZiBkZWZpbmVkKEZFQVRfR1VJKSAmJiBkZWZpbmVkKE1BQ09TX1gpCiAgICAvKiBBVFNVSSBhdXRvbWF0aWNhbGx5IGFudGlhbGlhc2VzIHRleHQgKi8KI2lmbmRlZiBVU0VfQVRTVUlfRFJBV0lORwogICAgLyoKICAgICAqIE9uIE9TIFgsIHRyeSB1c2luZyBRdWFydHotc3R5bGUgdGV4dCBhbnRpYWxpYXNpbmcuCiAgICAgKi8KICAgIHN5c192ZXJzaW9uID0gMDsKCiAgICBHZXN0YWx0KGdlc3RhbHRTeXN0ZW1WZXJzaW9uLCAmc3lzX3ZlcnNpb24pOwogICAgaWYgKHN5c192ZXJzaW9uID49IDB4MTAyMCkKICAgIHsKCS8qIFF1YXJ0eiBhbnRpYWxpYXNpbmcgaXMgYXZhaWxhYmxlIG9ubHkgaW4gT1MgMTAuMiBhbmQgbGF0ZXIuICovCglVSW50MzIgcWRfZmxhZ3MgPSAocF9hbnRpYWxpYXMgPwoJCQkgICAgIGtRRFVzZUNHVGV4dFJlbmRlcmluZyB8IGtRRFVzZUNHVGV4dE1ldHJpY3MgOiAwKTsKCVFEU3dhcFRleHRGbGFncyhxZF9mbGFncyk7CiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBXaGVuIGFudGlhbGlhc2luZyB3ZSdyZSB1c2luZyBzcmNPciBtb2RlLCB3ZSBoYXZlIHRvIGNsZWFyIHRoZSBibG9jawogICAgICogYmVmb3JlIGRyYXdpbmcgdGhlIHRleHQuCiAgICAgKiBBbHNvIG5lZWRlZCB3aGVuICdsaW5lc3BhY2UnIGlzIG5vbi16ZXJvIHRvIHJlbW92ZSB0aGUgY3Vyc29yIGFuZAogICAgICogdW5kZXJsaW5pbmcuCiAgICAgKiBCdXQgbm90IHdoZW4gZHJhd2luZyB0cmFuc3BhcmVudGx5LgogICAgICogVGhlIGZvbGxvd2luZyBpcyBsaWtlIGNhbGxpbmcgZ3VpX21jaF9jbGVhcl9ibG9jayhyb3csIGNvbCwgcm93LCBjb2wgKwogICAgICogbGVuIC0gMSksIGJ1dCB3aXRob3V0IHNldHRpbmcgdGhlIGJnIGNvbG9yIHRvIGd1aS5iYWNrX3BpeGVsLgogICAgICovCiNpZmRlZiBVU0VfQVRTVUlfRFJBV0lORwogICAgaWYgKChmbGFncyAmIERSQVdfVFJBTlNQKSA9PSAwKQojZWxzZQogICAgaWYgKCgoc3lzX3ZlcnNpb24gPj0gMHgxMDIwICYmIHBfYW50aWFsaWFzKSB8fCBwX2xpbmVzcGFjZSAhPSAwKQoJICAgICYmICEoZmxhZ3MgJiBEUkFXX1RSQU5TUCkpCiNlbmRpZgogICAgewoJUmVjdCByYzsKCglyYy5sZWZ0ID0gRklMTF9YKGNvbCk7CglyYy50b3AgPSBGSUxMX1kocm93KTsKI2lmZGVmIEZFQVRfTUJZVEUKCS8qIE11bHRpYnl0ZSBjb21wdXRhdGlvbiB0YWtlbiBmcm9tIGd1aV93MzIuYyAqLwoJaWYgKGhhc19tYnl0ZSkKCXsKCSAgICBpbnQgY2VsbF9sZW4gPSAwOwoJICAgIGludCBuOwoKCSAgICAvKiBDb21wdXRlIHRoZSBsZW5ndGggaW4gZGlzcGxheSBjZWxscy4gKi8KCSAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuICs9IE1CX0JZVEUyTEVOKHNbbl0pKQoJCWNlbGxfbGVuICs9ICgqbWJfcHRyMmNlbGxzKShzICsgbik7CgkgICAgcmMucmlnaHQgPSBGSUxMX1goY29sICsgY2VsbF9sZW4pOwoJfQoJZWxzZQojZW5kaWYKCXJjLnJpZ2h0ID0gRklMTF9YKGNvbCArIGxlbikgKyAoY29sICsgbGVuID09IENvbHVtbnMpOwoJcmMuYm90dG9tID0gRklMTF9ZKHJvdyArIDEpOwoJRXJhc2VSZWN0KCZyYyk7CiAgICB9CgojaWZuZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICBpZiAoc3lzX3ZlcnNpb24gPj0gMHgxMDIwICYmIHBfYW50aWFsaWFzKQogICAgewoJU3R5bGVQYXJhbWV0ZXIgZmFjZTsKCglmYWNlID0gbm9ybWFsOwoJaWYgKGZsYWdzICYgRFJBV19CT0xEKQoJICAgIGZhY2UgfD0gYm9sZDsKCWlmIChmbGFncyAmIERSQVdfVU5ERVJMKQoJICAgIGZhY2UgfD0gdW5kZXJsaW5lOwoJVGV4dEZhY2UoZmFjZSk7CgoJLyogUXVhcnR6IGFudGlhbGlhc2luZyB3b3JrcyBvbmx5IGluIHNyY09yIHRyYW5zZmVyIG1vZGUuICovCglUZXh0TW9kZShzcmNPcik7CgoJTW92ZVRvKFRFWFRfWChjb2wpLCBURVhUX1kocm93KSk7CglEcmF3VGV4dCgoY2hhciopcywgMCwgbGVuKTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiNlbmRpZgogICAgewoJLyogVXNlIG9sZC1zdHlsZSwgbm9uLWFudGlhbGlhc2VkIFF1aWNrRHJhdyB0ZXh0IHJlbmRlcmluZy4gKi8KCVRleHRNb2RlKHNyY0NvcHkpOwoJVGV4dEZhY2Uobm9ybWFsKTsKCiAgICAvKiAgU2VsZWN0Rm9udChoZGMsIGd1aS5jdXJyRm9udCk7ICovCgoJaWYgKGZsYWdzICYgRFJBV19UUkFOU1ApCgl7CgkgICAgVGV4dE1vZGUoc3JjT3IpOwoJfQoKCU1vdmVUbyhURVhUX1goY29sKSwgVEVYVF9ZKHJvdykpOwojaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKCUFUU1VUZXh0TGF5b3V0IHRleHRMYXlvdXQ7CgoJaWYgKEFUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHIodG9mcmVlLAoJCSAgICBrQVRTVUZyb21UZXh0QmVnaW5uaW5nLCBrQVRTVVRvVGV4dEVuZCwKCQkgICAgdXRmMTZfbGVuLAoJCSAgICAoZ0ZvbnRTdHlsZSA/IDEgOiAwKSwgJnV0ZjE2X2xlbiwKCQkgICAgKGdGb250U3R5bGUgPyAmZ0ZvbnRTdHlsZSA6IE5VTEwpLAoJCSAgICAmdGV4dExheW91dCkgPT0gbm9FcnIpCgl7CgkgICAgQVRTVVNldFRyYW5zaWVudEZvbnRNYXRjaGluZyh0ZXh0TGF5b3V0LCBUUlVFKTsKCgkgICAgQVRTVURyYXdUZXh0KHRleHRMYXlvdXQsCgkJICAgIGtBVFNVRnJvbVRleHRCZWdpbm5pbmcsIGtBVFNVVG9UZXh0RW5kLAoJCSAgICBrQVRTVVVzZUdyYWZQb3J0UGVuTG9jLCBrQVRTVVVzZUdyYWZQb3J0UGVuTG9jKTsKCgkgICAgQVRTVURpc3Bvc2VUZXh0TGF5b3V0KHRleHRMYXlvdXQpOwoJfQojZWxzZQoJRHJhd1RleHQoKGNoYXIgKilzLCAwLCBsZW4pOwoKCglpZiAoZmxhZ3MgJiBEUkFXX0JPTEQpCgl7CgkgICAgVGV4dE1vZGUoc3JjT3IpOwoJICAgIE1vdmVUbyhURVhUX1goY29sKSArIDEsIFRFWFRfWShyb3cpKTsKCSAgICBEcmF3VGV4dCgoY2hhciAqKXMsIDAsIGxlbik7Cgl9CgoJaWYgKGZsYWdzICYgRFJBV19VTkRFUkwpCgl7CgkgICAgTW92ZVRvKEZJTExfWChjb2wpLCBGSUxMX1kocm93ICsgMSkgLSAxKTsKCSAgICBMaW5lVG8oRklMTF9YKGNvbCArIGxlbikgLSAxLCBGSUxMX1kocm93ICsgMSkgLSAxKTsKCX0KI2VuZGlmCiAgICB9CgojaWZkZWYgRkVBVF9NQllURQogICAgdmltX2ZyZWUodG9mcmVlKTsKI2VuZGlmCn0KCi8qCiAqIFJldHVybiBPSyBpZiB0aGUga2V5IHdpdGggdGhlIHRlcm1jYXAgbmFtZSAibmFtZSIgaXMgc3VwcG9ydGVkLgogKi8KICAgIGludApndWlfbWNoX2hhc2tleShuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgaW50IGk7CgogICAgZm9yIChpID0gMDsgc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gIT0gKEtleVN5bSkwOyBpKyspCglpZiAobmFtZVswXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwICYmCgkJCQkJIG5hbWVbMV0gPT0gc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSkKCSAgICByZXR1cm4gT0s7CiAgICByZXR1cm4gRkFJTDsKfQoKICAgIHZvaWQKZ3VpX21jaF9iZWVwKCkKewogICAgU3lzQmVlcCgxKTsgLyogU2hvdWxkIHRoaXMgYmUgMD8gKD8/Pz8pICovCn0KCiAgICB2b2lkCmd1aV9tY2hfZmxhc2gobXNlYykKICAgIGludAkgICAgbXNlYzsKewogICAgLyogRG8gYSB2aXN1YWwgYmVlcCBieSByZXZlcnNpbmcgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzICovCiAgICBSZWN0ICAgIHJjOwoKICAgIC8qCiAgICAgKiBOb3RlOiBJbnZlcnRSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCiAgICAgKi8KICAgIHJjLmxlZnQgPSAwOwogICAgcmMudG9wID0gMDsKICAgIHJjLnJpZ2h0ID0gZ3VpLm51bV9jb2xzICogZ3VpLmNoYXJfd2lkdGg7CiAgICByYy5ib3R0b20gPSBndWkubnVtX3Jvd3MgKiBndWkuY2hhcl9oZWlnaHQ7CiAgICBJbnZlcnRSZWN0KCZyYyk7CgogICAgdWlfZGVsYXkoKGxvbmcpbXNlYywgVFJVRSk7CQkvKiB3YWl0IGZvciBzb21lIG1zZWMgKi8KCiAgICBJbnZlcnRSZWN0KCZyYyk7Cn0KCi8qCiAqIEludmVydCBhIHJlY3RhbmdsZSBmcm9tIHJvdyByLCBjb2x1bW4gYywgZm9yIG5yIHJvd3MgYW5kIG5jIGNvbHVtbnMuCiAqLwogICAgdm9pZApndWlfbWNoX2ludmVydF9yZWN0YW5nbGUociwgYywgbnIsIG5jKQogICAgaW50CQlyOwogICAgaW50CQljOwogICAgaW50CQlucjsKICAgIGludAkJbmM7CnsKICAgIFJlY3QJcmM7CgogICAgLyoKICAgICAqIE5vdGU6IEludmVydFJlY3QoKSBleGNsdWRlcyByaWdodCBhbmQgYm90dG9tIG9mIHJlY3RhbmdsZS4KICAgICAqLwogICAgcmMubGVmdCA9IEZJTExfWChjKTsKICAgIHJjLnRvcCA9IEZJTExfWShyKTsKICAgIHJjLnJpZ2h0ID0gcmMubGVmdCArIG5jICogZ3VpLmNoYXJfd2lkdGg7CiAgICByYy5ib3R0b20gPSByYy50b3AgKyBuciAqIGd1aS5jaGFyX2hlaWdodDsKICAgIEludmVydFJlY3QoJnJjKTsKCn0KCi8qCiAqIEljb25pZnkgdGhlIEdVSSB3aW5kb3cuCiAqLwogICAgdm9pZApndWlfbWNoX2ljb25pZnkoKQp7CiAgICAvKiBUT0RPOiBmaW5kIG91dCB3aGF0IGNvdWxkIHJlcGxhY2UgaWNvbmlmeQogICAgICoJICAgICAtd2luZG93IHNoYWRlPwogICAgICoJICAgICAtaGlkZSBhcHBsaWNhdGlvbj8KICAgICAqLwp9CgojaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIEJyaW5nIHRoZSBWaW0gd2luZG93IHRvIHRoZSBmb3JlZ3JvdW5kLgogKi8KICAgIHZvaWQKZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCgpCnsKICAgIC8qIFRPRE8gKi8KfQojZW5kaWYKCi8qCiAqIERyYXcgYSBjdXJzb3Igd2l0aG91dCBmb2N1cy4KICovCiAgICB2b2lkCmd1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGNvbG9yKQogICAgZ3VpY29sb3JfVAljb2xvcjsKewogICAgUmVjdCByYzsKCiAgICAvKgogICAgICogTm90ZTogRnJhbWVSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCiAgICAgKi8KICAgIHJjLmxlZnQgPSBGSUxMX1goZ3VpLmNvbCk7CiAgICByYy50b3AgPSBGSUxMX1koZ3VpLnJvdyk7CiAgICByYy5yaWdodCA9IHJjLmxlZnQgKyBndWkuY2hhcl93aWR0aDsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGlmIChtYl9sZWZ0aGFsdmUoZ3VpLnJvdywgZ3VpLmNvbCkpCglyYy5yaWdodCArPSBndWkuY2hhcl93aWR0aDsKI2VuZGlmCiAgICByYy5ib3R0b20gPSByYy50b3AgKyBndWkuY2hhcl9oZWlnaHQ7CgogICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOwoKICAgIEZyYW1lUmVjdCgmcmMpOwp9CgovKgogKiBEcmF3IHBhcnQgb2YgYSBjdXJzb3IsIG9ubHkgdyBwaXhlbHMgd2lkZSwgYW5kIGggcGl4ZWxzIGhpZ2guCiAqLwogICAgdm9pZApndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IodywgaCwgY29sb3IpCiAgICBpbnQJCXc7CiAgICBpbnQJCWg7CiAgICBndWljb2xvcl9UCWNvbG9yOwp7CiAgICBSZWN0IHJjOwoKI2lmZGVmIEZFQVRfUklHSFRMRUZUCiAgICAvKiB2ZXJ0aWNhbCBsaW5lIHNob3VsZCBiZSBvbiB0aGUgcmlnaHQgb2YgY3VycmVudCBwb2ludCAqLwogICAgaWYgKENVUlNPUl9CQVJfUklHSFQpCglyYy5sZWZ0ID0gRklMTF9YKGd1aS5jb2wgKyAxKSAtIHc7CiAgICBlbHNlCiNlbmRpZgoJcmMubGVmdCA9IEZJTExfWChndWkuY29sKTsKICAgIHJjLnRvcCA9IEZJTExfWShndWkucm93KSArIGd1aS5jaGFyX2hlaWdodCAtIGg7CiAgICByYy5yaWdodCA9IHJjLmxlZnQgKyB3OwogICAgcmMuYm90dG9tID0gcmMudG9wICsgaDsKCiAgICBndWlfbWNoX3NldF9mZ19jb2xvcihjb2xvcik7CgogICAgRnJhbWVSZWN0KCZyYyk7Ci8vICAgIFBhaW50UmVjdCgmcmMpOwp9CgoKCi8qCiAqIENhdGNoIHVwIHdpdGggYW55IHF1ZXVlZCBYIGV2ZW50cy4gIFRoaXMgbWF5IHB1dCBrZXlib2FyZCBpbnB1dCBpbnRvIHRoZQogKiBpbnB1dCBidWZmZXIsIGNhbGwgcmVzaXplIGNhbGwtYmFja3MsIHRyaWdnZXIgdGltZXJzIGV0Yy4gIElmIHRoZXJlIGlzCiAqIG5vdGhpbmcgaW4gdGhlIFggZXZlbnQgcXVldWUgKCYgbm8gdGltZXJzIHBlbmRpbmcpLCB0aGVuIHdlIHJldHVybgogKiBpbW1lZGlhdGVseS4KICovCiAgICB2b2lkCmd1aV9tY2hfdXBkYXRlKCkKewogICAgLyogVE9ETzogZmluZCB3aGF0IHRvIGRvCiAgICAgKgkgICAgIG1heWJlIGNhbGwgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyAoMCkKICAgICAqCSAgICAgbW9yZSBsaWtlIGxvb2sgYXQgRXZlbnRRdWV1ZSB0aGVuCiAgICAgKgkgICAgIGNhbGwgaGVhcnQgb2YgZ3VpX21jaF93YWl0X2Zvcl9jaGFyczsKICAgICAqCiAgICAgKglpZiAoZXZlbnR0aGVyKQogICAgICoJICAgIGd1aV9tYWNfaGFuZGxlX2V2ZW50KCZldmVudCk7CiAgICAgKi8KICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwoKICAgIGlmIChFdmVudEF2YWlsKGV2ZXJ5RXZlbnQsICZ0aGVFdmVudCkpCglpZiAodGhlRXZlbnQud2hhdCAhPSBudWxsRXZlbnQpCgkgICAgZ3VpX21jaF93YWl0X2Zvcl9jaGFycygwKTsKfQoKLyoKICogU2ltcGxlIHdyYXBwZXIgdG8gbmVnbGVjdCBtb3JlIGVhc2lseSB0aGUgdGltZQogKiBzcGVudCBpbnNpZGUgV2FpdE5leHRFdmVudCB3aGlsZSBwcm9maWxpbmcuCiAqLwoKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgcHJvZmlsZSByZXNldAojZW5kaWYKICAgIHBhc2NhbAogICAgQm9vbGVhbgpXYWl0TmV4dEV2ZW50V3JwKEV2ZW50TWFzayBldmVudE1hc2ssIEV2ZW50UmVjb3JkICp0aGVFdmVudCwgVUludDMyIHNsZWVwLCBSZ25IYW5kbGUgbW91c2VSZ24pCnsKICAgIGlmICgoKGxvbmcpIHNsZWVwKSA8IC0xKQoJc2xlZXAgPSAzMjc2NzsKICAgIHJldHVybiBXYWl0TmV4dEV2ZW50KGV2ZW50TWFzaywgdGhlRXZlbnQsIHNsZWVwLCBtb3VzZVJnbik7Cn0KCi8qCiAqIEdVSSBpbnB1dCByb3V0aW5lIGNhbGxlZCBieSBndWlfd2FpdF9mb3JfY2hhcnMoKS4gIFdhaXRzIGZvciBhIGNoYXJhY3RlcgogKiBmcm9tIHRoZSBrZXlib2FyZC4KICogIHd0aW1lID09IC0xCSAgICBXYWl0IGZvcmV2ZXIuCiAqICB3dGltZSA9PSAwCSAgICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCiAqICB3dGltZSA+IDAJICAgIFdhaXQgd3RpbWUgbWlsbGlzZWNvbmRzIGZvciBhIGNoYXJhY3Rlci4KICogUmV0dXJucyBPSyBpZiBhIGNoYXJhY3RlciB3YXMgZm91bmQgdG8gYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwKICogb3IgRkFJTCBvdGhlcndpc2UuCiAqLwojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBwcm9maWxlIHJlc2V0CiNlbmRpZgogICAgaW50Cmd1aV9tY2hfd2FpdF9mb3JfY2hhcnMod3RpbWUpCiAgICBpbnQJICAgIHd0aW1lOwp7CiAgICBFdmVudE1hc2sJbWFzayAgPSAoZXZlcnlFdmVudCk7CiAgICBFdmVudFJlY29yZCBldmVudDsKICAgIGxvbmcJZW50cnlUaWNrOwogICAgbG9uZwljdXJyZW50VGljazsKICAgIGxvbmcJc2xlZXBweVRpY2s7CgogICAgLyogSWYgd2UgYXJlIHByb3ZpZGluZyBsaWZlIGZlZWRiYWNrIHdpdGggdGhlIHNjcm9sbGJhciwKICAgICAqIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHRvIHdhaXQgZm9yIGFuIGV2ZW50LCBvciBlbHNlCiAgICAgKiB0aGVyZSB3b24ndCBiZSBhbnkgbGlmZSBmZWVkYmFjay4KICAgICAqLwogICAgaWYgKGRyYWdnZWRfc2IgIT0gTlVMTCkKCXJldHVybiBGQUlMOwoJLyogVE9ETzogQ2hlY2sgaWYgRkFJTCBpcyB0aGUgcHJvcGVyIHJldHVybiBjb2RlICovCgogICAgZW50cnlUaWNrID0gVGlja0NvdW50KCk7CgogICAgYWxsb3dfc2Nyb2xsYmFyID0gVFJVRTsKCiAgICBkbwogICAgewovKglpZiAoZHJhZ1JlY3RDb250cm9sID09IGtDcmVhdGVFbXB0eSkKCXsKCSAgICBkcmFnUmduID0gTlVMTDsKCSAgICBkcmFnUmVjdENvbnRyb2wgPSBrTm90aGluZzsKCX0KCWVsc2UqLyBpZiAoZHJhZ1JlY3RDb250cm9sID09IGtDcmVhdGVSZWN0KQoJewoJICAgIGRyYWdSZ24gPSBjdXJzb3JSZ247CgkgICAgUmVjdFJnbihkcmFnUmduLCAmZHJhZ1JlY3QpOwoJICAgIGRyYWdSZWN0Q29udHJvbCA9IGtOb3RoaW5nOwoJfQoJLyoKCSAqIERvbid0IHVzZSBndWlfbWNoX3VwZGF0ZSgpIGJlY2F1c2UgdGhlbiB3ZSB3aWxsIHNwaW4tbG9jayB1bnRpbCBhCgkgKiBjaGFyIGFycml2ZXMsIGluc3RlYWQgd2UgdXNlIFdhaXROZXh0RXZlbnRXcnAoKSB0byBoYW5nIHVudGlsIGFuCgkgKiBldmVudCBhcnJpdmVzLiAgTm8gbmVlZCB0byBjaGVjayBmb3IgaW5wdXRfYnVmX2Z1bGwgYmVjYXVzZSB3ZSBhcmUKCSAqIHJldHVybmluZyBhcyBzb29uIGFzIGl0IGNvbnRhaW5zIGEgc2luZ2xlIGNoYXIuCgkgKi8KCS8qIFRPRE86IHJlZHVjZSB3dGltZSBhY2NvcmRpbmx5Pz8/ICAqLwoJaWYgKHd0aW1lID4gLTEpCgkgICAgc2xlZXBweVRpY2sgPSA2MCp3dGltZS8xMDAwOwoJZWxzZQoJICAgIHNsZWVwcHlUaWNrID0gMzI3Njc7CglpZiAoV2FpdE5leHRFdmVudFdycChtYXNrLCAmZXZlbnQsIHNsZWVwcHlUaWNrLCBkcmFnUmduKSkKCXsKI2lmZGVmIFVTRV9TSU9VWAoJICAgIGlmICghU0lPVVhIYW5kbGVPbmVFdmVudCgmZXZlbnQpKQojZW5kaWYKCQlndWlfbWFjX2hhbmRsZV9ldmVudCgmZXZlbnQpOwoJICAgIGlmIChpbnB1dF9hdmFpbGFibGUoKSkKCSAgICB7CgkJYWxsb3dfc2Nyb2xsYmFyID0gRkFMU0U7CgkJcmV0dXJuIE9LOwoJICAgIH0KCX0KCWN1cnJlbnRUaWNrID0gVGlja0NvdW50KCk7CiAgICB9CiAgICB3aGlsZSAoKHd0aW1lID09IC0xKSB8fCAoKGN1cnJlbnRUaWNrIC0gZW50cnlUaWNrKSA8IDYwKnd0aW1lLzEwMDApKTsKCiAgICBhbGxvd19zY3JvbGxiYXIgPSBGQUxTRTsKICAgIHJldHVybiBGQUlMOwp9CgojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBwcm9maWxlIHJlc2V0CiNlbmRpZgoKLyoKICogT3V0cHV0IHJvdXRpbmVzLgogKi8KCi8qIEZsdXNoIGFueSBvdXRwdXQgdG8gdGhlIHNjcmVlbiAqLwogICAgdm9pZApndWlfbWNoX2ZsdXNoKCkKewogICAgLyogVE9ETzogSXMgYW55dGhpbmcgbmVlZGVkIGhlcmU/ICovCn0KCi8qCiAqIENsZWFyIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHRoZSBzY3JlZW4gZnJvbSB0ZXh0IHBvcyAocm93MSwgY29sMSkgdG8KICogKHJvdzIsIGNvbDIpIGluY2x1c2l2ZS4KICovCiAgICB2b2lkCmd1aV9tY2hfY2xlYXJfYmxvY2socm93MSwgY29sMSwgcm93MiwgY29sMikKICAgIGludAkJcm93MTsKICAgIGludAkJY29sMTsKICAgIGludAkJcm93MjsKICAgIGludAkJY29sMjsKewogICAgUmVjdCByYzsKCiAgICAvKgogICAgICogQ2xlYXIgb25lIGV4dHJhIHBpeGVsIGF0IHRoZSBmYXIgcmlnaHQsIGZvciB3aGVuIGJvbGQgY2hhcmFjdGVycyBoYXZlCiAgICAgKiBzcGlsbGVkIG92ZXIgdG8gdGhlIG5leHQgY29sdW1uLgogICAgICovCiAgICByYy5sZWZ0ID0gRklMTF9YKGNvbDEpOwogICAgcmMudG9wID0gRklMTF9ZKHJvdzEpOwogICAgcmMucmlnaHQgPSBGSUxMX1goY29sMiArIDEpICsgKGNvbDIgPT0gQ29sdW1ucyAtIDEpOwogICAgcmMuYm90dG9tID0gRklMTF9ZKHJvdzIgKyAxKTsKCiAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CiAgICBFcmFzZVJlY3QoJnJjKTsKfQoKLyoKICogQ2xlYXIgdGhlIHdob2xlIHRleHQgd2luZG93LgogKi8KICAgIHZvaWQKZ3VpX21jaF9jbGVhcl9hbGwoKQp7CiAgICBSZWN0CXJjOwoKICAgIHJjLmxlZnQgPSAwOwogICAgcmMudG9wID0gMDsKICAgIHJjLnJpZ2h0ID0gQ29sdW1ucyAqIGd1aS5jaGFyX3dpZHRoICsgMiAqIGd1aS5ib3JkZXJfd2lkdGg7CiAgICByYy5ib3R0b20gPSBSb3dzICogZ3VpLmNoYXJfaGVpZ2h0ICsgMiAqIGd1aS5ib3JkZXJfd2lkdGg7CgogICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOwogICAgRXJhc2VSZWN0KCZyYyk7Ci8qICBndWlfbWNoX3NldF9mZ19jb2xvcihndWkubm9ybV9waXhlbCk7CiAgICBGcmFtZVJlY3QoJnJjKTsKKi8KfQoKLyoKICogRGVsZXRlIHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgdXAgYW55CiAqIHRleHQgZnVydGhlciBkb3duIHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KICovCiAgICB2b2lkCmd1aV9tY2hfZGVsZXRlX2xpbmVzKHJvdywgbnVtX2xpbmVzKQogICAgaW50CQlyb3c7CiAgICBpbnQJCW51bV9saW5lczsKewogICAgUmVjdAlyYzsKCiAgICAvKiBjaGFuZ2VkIHdpdGhvdXQgY2hlY2tpbmchICovCiAgICByYy5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOwogICAgcmMucmlnaHQgPSBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgKyAxKTsKICAgIHJjLnRvcCA9IEZJTExfWShyb3cpOwogICAgcmMuYm90dG9tID0gRklMTF9ZKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCArIDEpOwoKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKICAgIFNjcm9sbFJlY3QoJnJjLCAwLCAtbnVtX2xpbmVzICogZ3VpLmNoYXJfaGVpZ2h0LCAoUmduSGFuZGxlKSBuaWwpOwoKICAgIGd1aV9jbGVhcl9ibG9jayhndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMgKyAxLAoJCQkJCQkgICAgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKCWd1aS5zY3JvbGxfcmVnaW9uX2JvdCwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOwp9CgovKgogKiBJbnNlcnQgdGhlIGdpdmVuIG51bWJlciBvZiBsaW5lcyBiZWZvcmUgdGhlIGdpdmVuIHJvdywgc2Nyb2xsaW5nIGRvd24gYW55CiAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KICovCiAgICB2b2lkCmd1aV9tY2hfaW5zZXJ0X2xpbmVzKHJvdywgbnVtX2xpbmVzKQogICAgaW50CQlyb3c7CiAgICBpbnQJCW51bV9saW5lczsKewogICAgUmVjdCByYzsKCiAgICByYy5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOwogICAgcmMucmlnaHQgPSBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgKyAxKTsKICAgIHJjLnRvcCA9IEZJTExfWShyb3cpOwogICAgcmMuYm90dG9tID0gRklMTF9ZKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCArIDEpOwoKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKCiAgICBTY3JvbGxSZWN0KCZyYywgMCwgZ3VpLmNoYXJfaGVpZ2h0ICogbnVtX2xpbmVzLCAoUmduSGFuZGxlKSBuaWwpOwoKICAgIC8qIFVwZGF0ZSBndWkuY3Vyc29yX3JvdyBpZiB0aGUgY3Vyc29yIHNjcm9sbGVkIG9yIGNvcGllZCBvdmVyICovCiAgICBpZiAoZ3VpLmN1cnNvcl9yb3cgPj0gZ3VpLnJvdwoJICAgICYmIGd1aS5jdXJzb3JfY29sID49IGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQKCSAgICAmJiBndWkuY3Vyc29yX2NvbCA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCkKICAgIHsKCWlmIChndWkuY3Vyc29yX3JvdyA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMpCgkgICAgZ3VpLmN1cnNvcl9yb3cgKz0gbnVtX2xpbmVzOwoJZWxzZSBpZiAoZ3VpLmN1cnNvcl9yb3cgPD0gZ3VpLnNjcm9sbF9yZWdpb25fYm90KQoJICAgIGd1aS5jdXJzb3JfaXNfdmFsaWQgPSBGQUxTRTsKICAgIH0KCiAgICBndWlfY2xlYXJfYmxvY2socm93LCBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0LAoJCQkJcm93ICsgbnVtX2xpbmVzIC0gMSwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOwp9CgogICAgLyoKICAgICAqIFRPRE86IGFkZCBhIHZpbSBmb3JtYXQgdG8gdGhlIGNsaXBib2FyZCB3aGljaCByZW1lbWJlcgogICAgICoJICAgICBMSU5FV0lTRSwgQ0hBUldJU0UsIEJMT0NLV0lTRQogICAgICovCgogICAgdm9pZApjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihjYmQpCiAgICBWaW1DbGlwYm9hcmQgKmNiZDsKewoKICAgIEhhbmRsZQl0ZXh0T2ZDbGlwOwogICAgaW50CQlmbGF2b3IgPSAwOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFNpemUJc2NyYXBTaXplOwogICAgU2NyYXBGbGF2b3JGbGFncwlzY3JhcEZsYWdzOwogICAgU2NyYXBSZWYgICAgc2NyYXAgPSBuaWw7CiAgICBPU1N0YXR1cwllcnJvcjsKI2Vsc2UKICAgIGxvbmcJc2NyYXBPZmZzZXQ7CiAgICBsb25nCXNjcmFwU2l6ZTsKI2VuZGlmCiAgICBpbnQJCXR5cGU7CiAgICBjaGFyCSpzZWFyY2hDUjsKICAgIGNoYXJfdQkqdGVtcGNsaXA7CgoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBlcnJvciA9IEdldEN1cnJlbnRTY3JhcCgmc2NyYXApOwogICAgaWYgKGVycm9yICE9IG5vRXJyKQoJcmV0dXJuOwoKICAgIGVycm9yID0gR2V0U2NyYXBGbGF2b3JGbGFncyhzY3JhcCwgVklNU0NSQVBGTEFWT1IsICZzY3JhcEZsYWdzKTsKICAgIGlmIChlcnJvciA9PSBub0VycikKICAgIHsKCWVycm9yID0gR2V0U2NyYXBGbGF2b3JTaXplKHNjcmFwLCBWSU1TQ1JBUEZMQVZPUiwgJnNjcmFwU2l6ZSk7CglpZiAoZXJyb3IgPT0gbm9FcnIgJiYgc2NyYXBTaXplID4gMSkKCSAgICBmbGF2b3IgPSAxOwogICAgfQoKICAgIGlmIChmbGF2b3IgPT0gMCkKICAgIHsKCWVycm9yID0gR2V0U2NyYXBGbGF2b3JGbGFncyhzY3JhcCwga1NjcmFwRmxhdm9yVHlwZVVuaWNvZGUsICZzY3JhcEZsYWdzKTsKCWlmIChlcnJvciAhPSBub0VycikKCSAgICByZXR1cm47CgoJZXJyb3IgPSBHZXRTY3JhcEZsYXZvclNpemUoc2NyYXAsIGtTY3JhcEZsYXZvclR5cGVVbmljb2RlLCAmc2NyYXBTaXplKTsKCWlmIChlcnJvciAhPSBub0VycikKCSAgICByZXR1cm47CiAgICB9CgogICAgUmVzZXJ2ZU1lbShzY3JhcFNpemUpOwojZWxzZQogICAgLyogQ2FsbCB0byBMb2FkU2NyYXAgc2VlbSB0byBhdm9pZCBwcm9ibGVtIHdpdGggY3Jhc2ggb24gZmlyc3QgcGFzdGUgKi8KICAgIHNjcmFwU2l6ZSA9IExvYWRTY3JhcCgpOwogICAgc2NyYXBTaXplID0gR2V0U2NyYXAobmlsLCAnVEVYVCcsICZzY3JhcE9mZnNldCk7CgogICAgaWYgKHNjcmFwU2l6ZSA+IDApCiNlbmRpZgogICAgewojaWZkZWYgVVNFX0NBUkJPTklaRUQKCS8qIEluIENBUkJPTiB3ZSBkb24ndCBuZWVkIGEgSGFuZGxlLCBhIHBvaW50ZXIgaXMgZ29vZCAqLwoJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZShzY3JhcFNpemUpOwoJLyogdGVtcGNsaXAgPSBsYWxsb2Moc2NyYXBTaXplKzEsIFRSVUUpOyAqLwojZWxzZQoJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZSgwKTsKI2VuZGlmCglITG9jayh0ZXh0T2ZDbGlwKTsKI2lmZGVmIFVTRV9DQVJCT05JWkVECgllcnJvciA9IEdldFNjcmFwRmxhdm9yRGF0YShzY3JhcCwKCQlmbGF2b3IgPyBWSU1TQ1JBUEZMQVZPUiA6IGtTY3JhcEZsYXZvclR5cGVVbmljb2RlLAoJCSZzY3JhcFNpemUsICp0ZXh0T2ZDbGlwKTsKI2Vsc2UKCXNjcmFwU2l6ZSA9IEdldFNjcmFwKHRleHRPZkNsaXAsICdURVhUJywgJnNjcmFwT2Zmc2V0KTsKI2VuZGlmCglzY3JhcFNpemUgLT0gZmxhdm9yOwoKCWlmIChmbGF2b3IpCgkgICAgdHlwZSA9ICoqdGV4dE9mQ2xpcDsKCWVsc2UKCSAgICB0eXBlID0gKHN0cmNocigqdGV4dE9mQ2xpcCwgJ1xyJykgIT0gTlVMTCkgPyBNTElORSA6IE1DSEFSOwoKCXRlbXBjbGlwID0gbGFsbG9jKHNjcmFwU2l6ZSArIDEsIFRSVUUpOwojaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKQoJbWNoX21lbW1vdmUodGVtcGNsaXAsICp0ZXh0T2ZDbGlwICsgZmxhdm9yLCBzY3JhcFNpemUpOwojZWxzZQoJU1RSTkNQWSh0ZW1wY2xpcCwgKnRleHRPZkNsaXAgKyBmbGF2b3IsIHNjcmFwU2l6ZSk7CiNlbmRpZgoJdGVtcGNsaXBbc2NyYXBTaXplXSA9IDA7CgoJc2VhcmNoQ1IgPSAoY2hhciAqKXRlbXBjbGlwOwoJd2hpbGUgKHNlYXJjaENSICE9IE5VTEwpCgl7CgkgICAgc2VhcmNoQ1IgPSBzdHJjaHIoc2VhcmNoQ1IsICdccicpOwoKCSAgICBpZiAoc2VhcmNoQ1IgIT0gTlVMTCkKCQlzZWFyY2hDUlswXSA9ICdcbic7CgoJfQoKI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKCS8qIENvbnZlcnQgZnJvbSB1dGYtMTYgKGNsaXBib2FyZCkgKi8KCXNpemVfdCBlbmNMZW4gPSAwOwoJY2hhcl91ICp0byA9IG1hY191dGYxNl90b19lbmMoKFVuaUNoYXIgKil0ZW1wY2xpcCwgc2NyYXBTaXplLCAmZW5jTGVuKTsKCWlmICh0bykKCXsKCSAgICBzY3JhcFNpemUgPSBlbmNMZW47CgkgICAgdmltX2ZyZWUodGVtcGNsaXApOwoJICAgIHRlbXBjbGlwID0gdG87Cgl9CiNlbmRpZgoJY2xpcF95YW5rX3NlbGVjdGlvbih0eXBlLCB0ZW1wY2xpcCwgc2NyYXBTaXplLCBjYmQpOwoKCXZpbV9mcmVlKHRlbXBjbGlwKTsKCUhVbmxvY2sodGV4dE9mQ2xpcCk7CgoJRGlzcG9zZUhhbmRsZSh0ZXh0T2ZDbGlwKTsKICAgIH0KfQoKICAgIHZvaWQKY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oY2JkKQogICAgVmltQ2xpcGJvYXJkICpjYmQ7CnsKICAgIC8qCiAgICAgKiBUT0RPOiBSZWFsbHkgbm90aGluZyB0byBkbz8KICAgICAqLwp9CgogICAgaW50CmNsaXBfbWNoX293bl9zZWxlY3Rpb24oY2JkKQogICAgVmltQ2xpcGJvYXJkICpjYmQ7CnsKICAgIHJldHVybiBPSzsKfQoKLyoKICogU2VuZCB0aGUgY3VycmVudCBzZWxlY3Rpb24gdG8gdGhlIGNsaXBib2FyZC4KICovCiAgICB2b2lkCmNsaXBfbWNoX3NldF9zZWxlY3Rpb24oY2JkKQogICAgVmltQ2xpcGJvYXJkICpjYmQ7CnsKICAgIEhhbmRsZQl0ZXh0T2ZDbGlwOwogICAgbG9uZwlzY3JhcFNpemU7CiAgICBpbnQJCXR5cGU7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgU2NyYXBSZWYgICAgc2NyYXA7CiNlbmRpZgoKICAgIGNoYXJfdQkqc3RyID0gTlVMTDsKCiAgICBpZiAoIWNiZC0+b3duZWQpCglyZXR1cm47CgogICAgY2xpcF9nZXRfc2VsZWN0aW9uKGNiZCk7CgogICAgLyoKICAgICAqIE9uY2Ugd2Ugc2V0IHRoZSBjbGlwYm9hcmQsIGxvc2Ugb3duZXJzaGlwLiAgSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBzZXRzCiAgICAgKiB0aGUgY2xpcGJvYXJkLCB3ZSBkb24ndCB3YW50IHRvIHRoaW5rIHRoYXQgd2Ugc3RpbGwgb3duIGl0LgogICAgICoKICAgICAqLwoKICAgIGNiZC0+b3duZWQgPSBGQUxTRTsKCiAgICB0eXBlID0gY2xpcF9jb252ZXJ0X3NlbGVjdGlvbigmc3RyLCAobG9uZ191ICopICZzY3JhcFNpemUsIGNiZCk7CgojaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKQogICAgc2l6ZV90IHV0ZjE2X2xlbiA9IDA7CiAgICBVbmlDaGFyICp0byA9IG1hY19lbmNfdG9fdXRmMTYoc3RyLCBzY3JhcFNpemUsICZ1dGYxNl9sZW4pOwogICAgaWYgKHRvKQogICAgewoJc2NyYXBTaXplID0gdXRmMTZfbGVuOwoJdmltX2ZyZWUoc3RyKTsKCXN0ciA9IChjaGFyX3UgKil0bzsKICAgIH0KI2VuZGlmCgogICAgaWYgKHR5cGUgPj0gMCkKICAgIHsKI2lmZGVmIFVTRV9DQVJCT05JWkVECglDbGVhckN1cnJlbnRTY3JhcCgpOwojZWxzZQoJWmVyb1NjcmFwKCk7CiNlbmRpZgoKI2lmZGVmIFVTRV9DQVJCT05JWkVECgl0ZXh0T2ZDbGlwID0gTmV3SGFuZGxlKHNjcmFwU2l6ZSArIDEpOwojZWxzZQoJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZShzY3JhcFNpemUpOwojZW5kaWYKCUhMb2NrKHRleHRPZkNsaXApOwoKI2lmZGVmIFVTRV9DQVJCT05JWkVECgkqKnRleHRPZkNsaXAgPSB0eXBlOwoJbWNoX21lbW1vdmUoKnRleHRPZkNsaXAgKyAxLCBzdHIsIHNjcmFwU2l6ZSk7CglHZXRDdXJyZW50U2NyYXAoJnNjcmFwKTsKCVB1dFNjcmFwRmxhdm9yKHNjcmFwLCBrU2NyYXBGbGF2b3JUeXBlVW5pY29kZSwga1NjcmFwRmxhdm9yTWFza05vbmUsCgkJc2NyYXBTaXplLCAqdGV4dE9mQ2xpcCArIDEpOwoJUHV0U2NyYXBGbGF2b3Ioc2NyYXAsIFZJTVNDUkFQRkxBVk9SLCBrU2NyYXBGbGF2b3JNYXNrTm9uZSwKCQlzY3JhcFNpemUgKyAxLCAqdGV4dE9mQ2xpcCk7CiNlbHNlCglTVFJOQ1BZKCp0ZXh0T2ZDbGlwLCBzdHIsIHNjcmFwU2l6ZSk7CglQdXRTY3JhcChzY3JhcFNpemUsICdURVhUJywgKnRleHRPZkNsaXApOwojZW5kaWYKCUhVbmxvY2sodGV4dE9mQ2xpcCk7CglEaXNwb3NlSGFuZGxlKHRleHRPZkNsaXApOwogICAgfQoKICAgIHZpbV9mcmVlKHN0cik7Cn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MoeCwgeSwgdywgaCkKICAgIGludAkJeDsKICAgIGludAkJeTsKICAgIGludAkJdzsKICAgIGludAkJaDsKewogICAgUmVjdAlWaW1Cb3VuZDsKCi8qICBIaWRlV2luZG93KGd1aS5WaW1XaW5kb3cpOyAqLwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIEdldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93R2xvYmFsUG9ydFJnbiwgJlZpbUJvdW5kKTsKI2Vsc2UKICAgIFZpbUJvdW5kID0gZ3VpLlZpbVdpbmRvdy0+cG9ydFJlY3Q7CiNlbmRpZgoKICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQogICAgewoJVmltQm91bmQubGVmdCA9IC1ndWkuc2Nyb2xsYmFyX3dpZHRoICsgMTsKICAgIH0KICAgIGVsc2UKICAgIHsKCVZpbUJvdW5kLmxlZnQgPSAwOwogICAgfQoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBTZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0dsb2JhbFBvcnRSZ24sICZWaW1Cb3VuZCk7CiNlbmRpZgoKICAgIFNob3dXaW5kb3coZ3VpLlZpbVdpbmRvdyk7Cn0KCi8qCiAqIE1lbnUgc3R1ZmYuCiAqLwoKICAgIHZvaWQKZ3VpX21jaF9lbmFibGVfbWVudShmbGFnKQogICAgaW50CQlmbGFnOwp7CiAgICAvKgogICAgICogTWVudSBpcyBhbHdheXMgYWN0aXZlIGluIGl0c2VsZgogICAgICogKG1heWJlIHdlIHNob3VsZCBvbmx5IGRpc2FibGUgYSB2aW0gbWVudQogICAgICoJYW5kIGtlZXAgc3RhbmRhcmQgbWVudSkKICAgICAqCiAgICAgKi8KfQoKICAgIHZvaWQKZ3VpX21jaF9zZXRfbWVudV9wb3MoeCwgeSwgdywgaCkKICAgIGludAkJeDsKICAgIGludAkJeTsKICAgIGludAkJdzsKICAgIGludAkJaDsKewogICAgLyoKICAgICAqIFRoZSBtZW51IGlzIGFsd2F5cyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4KICAgICAqIE1heWJlIGEgZnV0dXIgdmVyc2lvbiB3aWxsIHBlcm1pdCBhIG1lbnUgaW4gdGhlIHdpbmRvdwogICAgICoKICAgICAqLwp9CgovKgogKiBBZGQgYSBzdWIgbWVudSB0byB0aGUgbWVudSBiYXIuCiAqLwogICAgdm9pZApndWlfbWNoX2FkZF9tZW51KG1lbnUsIGlkeCkKICAgIHZpbW1lbnVfVAkqbWVudTsKICAgIGludAkJaWR4Owp7CiAgICAvKgogICAgICogVE9ETzogVHJ5IHRvIHVzZSBvbmx5IG1lbnVfaWQgaW5zdGVhZCBvZiBib3RoIG1lbnVfaWQgYW5kIG1lbnVfaGFuZGxlLgogICAgICogVE9ETzogdXNlIG1lbnUtPm1uZW1vbmljIGFuZCBtZW51LT5hY3RleHQKICAgICAqIFRPRE86IFRyeSB0byByZXVzZSBtZW51IGlkCiAgICAgKiAgICAgICBDYXJib24gSGVscCBzdWdnZXN0IHRvIHVzZSBvbmx5IGlkIGJldHdlZW4gMSBhbmQgMjM1CiAgICAgKi8KICAgIHN0YXRpYyBsb25nCSBuZXh0X2F2YWlsX2lkID0gMTI4OwogICAgbG9uZwkgbWVudV9hZnRlcl9tZSA9IDA7IC8qIERlZmF1bHQgdG8gdGhlIGVuZCAqLwojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgQ0ZTdHJpbmdSZWYgbmFtZTsKI2Vsc2UKICAgIGNoYXJfdQkqbmFtZTsKI2VuZGlmCiAgICBzaG9ydAkgaW5kZXg7CiAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKICAgIHZpbW1lbnVfVAkqYnJvdGhlciA9IG1lbnUtPm5leHQ7CgogICAgLyogQ2Fubm90IGFkZCBhIG1lbnUgaWYgLi4uICovCiAgICBpZiAoKHBhcmVudCAhPSBOVUxMICYmIHBhcmVudC0+c3VibWVudV9pZCA9PSAwKSkKCXJldHVybjsKCiAgICAvKiBtZW51IElEIGdyZWF0ZXIgdGhhbiAxMDI0IGFyZSByZXNlcnZlZCBmb3IgPz8/ICovCiAgICBpZiAobmV4dF9hdmFpbF9pZCA9PSAxMDI0KQoJcmV0dXJuOwoKICAgIC8qIE15IGJyb3RoZXIgY291bGQgYmUgdGhlIFBvcFVwLCBmaW5kIG15IHJlYWwgYnJvdGhlciAqLwogICAgd2hpbGUgKChicm90aGVyICE9IE5VTEwpICYmICghbWVudV9pc19tZW51YmFyKGJyb3RoZXItPm5hbWUpKSkKCWJyb3RoZXIgPSBicm90aGVyLT5uZXh0OwoKICAgIC8qICBGaW5kIHdoZXJlIHRvIGluc2VydCB0aGUgbWVudSAoZm9yIE1lbnVCYXIpICovCiAgICBpZiAoKHBhcmVudCA9PSBOVUxMKSAmJiAoYnJvdGhlciAhPSBOVUxMKSkKCW1lbnVfYWZ0ZXJfbWUgPSBicm90aGVyLT5zdWJtZW51X2lkOwoKICAgIC8qIElmIHRoZSBtZW51IGlzIG5vdCBwYXJ0IG9mIHRoZSBtZW51YmFyIChhbmQgaXRzIHN1Ym1lbnVzKSwgYWRkIGl0ICdub3doZXJlJyAqLwogICAgaWYgKCFtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCgltZW51X2FmdGVyX21lID0gaGllck1lbnU7CgogICAgLyogQ29udmVydCB0aGUgbmFtZSAqLwojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgbmFtZSA9IG1lbnVfdGl0bGVfcmVtb3ZpbmdfbW5lbW9uaWMobWVudSk7CiNlbHNlCiAgICBuYW1lID0gQzJQYXNjYWxfc2F2ZShtZW51LT5kbmFtZSk7CiNlbmRpZgogICAgaWYgKG5hbWUgPT0gTlVMTCkKCXJldHVybjsKCiAgICAvKiBDcmVhdGUgdGhlIG1lbnUgdW5sZXNzIGl0J3MgdGhlIGhlbHAgbWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICBpZiAobWVudS0+cHJpb3JpdHkgPT0gOTk5OSkKI2Vsc2UKICAgIGlmIChTVFJOQ01QKG5hbWUsICJcNEhlbHAiLCA1KSA9PSAwKQojZW5kaWYKICAgIHsKCW1lbnUtPnN1Ym1lbnVfaWQgPSBrSE1IZWxwTWVudUlEOwoJbWVudS0+c3VibWVudV9oYW5kbGUgPSBndWkuTWFjT1NIZWxwTWVudTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiAgICB7CgkvKiBDYXJib24gc3VnZ2VzdCB1c2Ugb2YKCSAqIE9TU3RhdHVzIENyZWF0ZU5ld01lbnUoTWVudUlELCBNZW51QXR0cmlidXRlcywgTWVudVJlZiAqKTsKCSAqIE9TU3RhdHVzIFNldE1lbnVUaXRsZShNZW51UmVmLCBDb25zdFN0cjI1NVBhcmFtIHRpdGxlKTsKCSAqLwoJbWVudS0+c3VibWVudV9pZCA9IG5leHRfYXZhaWxfaWQ7CiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCglpZiAoQ3JlYXRlTmV3TWVudShtZW51LT5zdWJtZW51X2lkLCAwLCAoTWVudVJlZiAqKSZtZW51LT5zdWJtZW51X2hhbmRsZSkgPT0gbm9FcnIpCgkgICAgU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKChNZW51UmVmKW1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBuYW1lKTsKI2Vsc2UKCW1lbnUtPnN1Ym1lbnVfaGFuZGxlID0gTmV3TWVudShtZW51LT5zdWJtZW51X2lkLCBuYW1lKTsKI2VuZGlmCgluZXh0X2F2YWlsX2lkKys7CiAgICB9CgogICAgaWYgKHBhcmVudCA9PSBOVUxMKQogICAgewoJLyogQWRkaW5nIGEgbWVudSB0byB0aGUgbWVudWJhciwgb3IgaW4gdGhlIG5vIG1hbnMgbGFuZCAoZm9yIFBvcFVwKSAqLwoKCS8qIFRPRE86IFZlcmlmeSBpZiB3ZSBjb3VsZCBvbmx5IEluc2VydCBNZW51IGlmIHJlYWxseSBwYXJ0IG9mIHRoZQoJICogbWVudWJhciBUaGUgSW5zZXJ0ZWQgbWVudSBhcmUgc2Nhbm5lZCBvciB0aGUgQ29tbWFuZC1rZXkgY29tYm9zCgkgKi8KCgkvKiBJbnNlcnQgdGhlIG1lbnUgdW5sZXNzIGl0J3MgdGhlIEhlbHAgbWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCglpZiAobWVudS0+c3VibWVudV9pZCAhPSBrSE1IZWxwTWVudUlEKQojZW5kaWYKCSAgICBJbnNlcnRNZW51KG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBtZW51X2FmdGVyX21lKTsgLyogaW5zZXJ0IGJlZm9yZSAqLwojaWYgMQoJLyogVmltIHNob3VsZCBub3JtYWxseSB1cGRhdGUgaXQuIFRPRE86IHZlcmlmeSAqLwoJRHJhd01lbnVCYXIoKTsKI2VuZGlmCiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBBZGRpbmcgYXMgYSBzdWJtZW51ICovCgoJaW5kZXggPSBndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXgobWVudSk7CgoJLyogQ2FsbCBJbnNlcnRNZW51SXRlbSBmb2xsb3dlZCBieSBTZXRNZW51SXRlbVRleHQKCSAqIHRvIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVyIHJlY29nbml0aW9uIGJ5IEluc2VydE1lbnVJdGVtCgkgKi8KCUluc2VydE1lbnVJdGVtKHBhcmVudC0+c3VibWVudV9oYW5kbGUsICJccCAiLCBpZHgpOyAvKiBhZnRlckl0ZW0gKi8KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKCVNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbmFtZSk7CiNlbHNlCglTZXRNZW51SXRlbVRleHQocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG5hbWUpOwojZW5kaWYKCVNldEl0ZW1DbWQocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIDB4MUIpOwoJU2V0SXRlbU1hcmsocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG1lbnUtPnN1Ym1lbnVfaWQpOwoJSW5zZXJ0TWVudShtZW51LT5zdWJtZW51X2hhbmRsZSwgaGllck1lbnUpOwogICAgfQoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKICAgIENGUmVsZWFzZShuYW1lKTsKI2Vsc2UKICAgIHZpbV9mcmVlKG5hbWUpOwojZW5kaWYKCiNpZiAwCiAgICAvKiBEb25lIGJ5IFZpbSBsYXRlciBvbiAqLwogICAgRHJhd01lbnVCYXIoKTsKI2VuZGlmCn0KCi8qCiAqIEFkZCBhIG1lbnUgaXRlbSB0byBhIG1lbnUKICovCiAgICB2b2lkCmd1aV9tY2hfYWRkX21lbnVfaXRlbShtZW51LCBpZHgpCiAgICB2aW1tZW51X1QJKm1lbnU7CiAgICBpbnQJCWlkeDsKewojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgQ0ZTdHJpbmdSZWYgbmFtZTsKI2Vsc2UKICAgIGNoYXJfdQkqbmFtZTsKI2VuZGlmCiAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKICAgIGludAkJbWVudV9pbnNlcnRlZDsKCiAgICAvKiBDYW5ub3QgYWRkIGl0ZW0sIGlmIHRoZSBtZW51IGhhdmUgbm90IGJlZW4gY3JlYXRlZCAqLwogICAgaWYgKHBhcmVudC0+c3VibWVudV9pZCA9PSAwKQoJcmV0dXJuOwoKICAgIC8qIENvdWxkIGNhbGwgU2V0TWVudVJlZkNvbiBbQ0FSQk9OXSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgTWVudSwKICAgICAgIGZvciBvbGRlciBPUyBjYWxsIEdldE1lbnVJdGVtRGF0YSAobWVudSwgaXRlbSwgaXNDb21tYW5kSUQ/LCBkYXRhKSAqLwoKICAgIC8qIENvbnZlcnQgdGhlIG5hbWUgKi8KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKICAgIG5hbWUgPSBtZW51X3RpdGxlX3JlbW92aW5nX21uZW1vbmljKG1lbnUpOwojZWxzZQogICAgbmFtZSA9IEMyUGFzY2FsX3NhdmUobWVudS0+ZG5hbWUpOwojZW5kaWYKCiAgICAvKiBXaGVyZSBhcmUganVzdCBhIG1lbnUgaXRlbSwgc28gbm8gaGFuZGxlLCBubyBpZCAqLwogICAgbWVudS0+c3VibWVudV9pZCA9IDA7CiAgICBtZW51LT5zdWJtZW51X2hhbmRsZSA9IE5VTEw7CgojaWZkZWYgVVNFX0hFTFBNRU5VCiAgICAvKiBUaGUgaW5kZXggaW4gdGhlIGhlbHAgbWVudSBhcmUgb2Zmc2V0ZWQgKi8KICAgIGlmIChwYXJlbnQtPnN1Ym1lbnVfaWQgPT0ga0hNSGVscE1lbnVJRCkKCWlkeCArPSBndWkuTWFjT1NIZWxwSXRlbXM7CiNlbmRpZgoKICAgIG1lbnVfaW5zZXJ0ZWQgPSAwOwogICAgaWYgKG1lbnUtPmFjdGV4dCkKICAgIHsKCS8qIElmIHRoZSBhY2NlbGVyYXRvciB0ZXh0IGZvciB0aGUgbWVudSBpdGVtIGxvb2tzIGxpa2UgaXQgZGVzY3JpYmVzCgkgKiBhIGNvbW1hbmQga2V5IChlLmcuLCAiPEQtUy10PiIgb3IgIjxDLTc+IiksIGRpc3BsYXkgaXQgYXMgdGhlCgkgKiBpdGVtJ3MgY29tbWFuZCBlcXVpdmFsZW50LgoJICovCglpbnQJICAgIGtleSA9IDA7CglpbnQJICAgIG1vZGlmaWVycyA9IDA7CgljaGFyX3UJICAgICpwX2FjdGV4dDsKCglwX2FjdGV4dCA9IG1lbnUtPmFjdGV4dDsKCWtleSA9IGZpbmRfc3BlY2lhbF9rZXkoJnBfYWN0ZXh0LCAmbW9kaWZpZXJzLCAvKmtleWNvZGU9Ki8wKTsKCWlmICgqcF9hY3RleHQgIT0gMCkKCSAgICBrZXkgPSAwOyAvKiBlcnJvcjogdHJhaWxpbmcgdGV4dCAqLwoJLyogZmluZF9zcGVjaWFsX2tleSgpIHJldHVybnMgYSBrZXljb2RlIHdpdGggYXMgbWFueSBvZiB0aGUKCSAqIHNwZWNpZmllZCBtb2RpZmllcnMgYXMgYXBwcm9wcmlhdGUgYWxyZWFkeSBhcHBsaWVkIChlLmcuLCBmb3IKCSAqICI8RC1DLXg+IiBpdCByZXR1cm5zIEN0cmwtWCBhcyB0aGUga2V5Y29kZSBhbmQgTU9EX01BU0tfQ01ECgkgKiBhcyB0aGUgb25seSBtb2RpZmllcikuICBTaW5jZSB3ZSB3YW50IHRvIGRpc3BsYXkgYWxsIG9mIHRoZQoJICogbW9kaWZpZXJzLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGtleWNvZGUgYmFjayB0byBhIHByaW50YWJsZQoJICogY2hhcmFjdGVyIHBsdXMgbW9kaWZpZXJzLgoJICogVE9ETzogV3JpdGUgYW4gYWx0ZXJuYXRpdmUgZmluZF9zcGVjaWFsX2tleSgpIHRoYXQgZG9lc24ndAoJICogYXBwbHkgbW9kaWZpZXJzLgoJICovCglpZiAoa2V5ID4gMCAmJiBrZXkgPCAzMikKCXsKCSAgICAvKiBDb252ZXJ0IGEgY29udHJvbCBrZXkgdG8gYW4gdXBwZXJjYXNlIGxldHRlci4gIE5vdGUgdGhhdAoJICAgICAqIGJ5IHRoaXMgcG9pbnQgaXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoCgkgICAgICogYmV0d2VlbiwgZS5nLiwgQ3RybC1TIGFuZCBDdHJsLVNoaWZ0LVMuCgkgICAgICovCgkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CgkgICAga2V5ICs9ICdAJzsKCX0KCS8qIElmIHRoZSBrZXljb2RlIGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIHNldCB0aGUgU2hpZnQgbW9kaWZpZXIuCgkgKiBJZiBpdCBpcyBhIGxvd2VyY2FzZSBsZXR0ZXIsIGRvbid0IHNldCB0aGUgbW9kaWZpZXIsIGJ1dCBjb252ZXJ0CgkgKiB0aGUgbGV0dGVyIHRvIHVwcGVyY2FzZSBmb3IgZGlzcGxheSBpbiB0aGUgbWVudS4KCSAqLwoJZWxzZSBpZiAoa2V5ID49ICdBJyAmJiBrZXkgPD0gJ1onKQoJICAgIG1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKCWVsc2UgaWYgKGtleSA+PSAnYScgJiYga2V5IDw9ICd6JykKCSAgICBrZXkgKz0gJ0EnIC0gJ2EnOwoJLyogTm90ZToga2V5Y29kZXMgYmVsb3cgMHgyMiBhcmUgcmVzZXJ2ZWQgYnkgQXBwbGUuICovCglpZiAoa2V5ID49IDB4MjIgJiYgdmltX2lzcHJpbnRjX3N0cmljdChrZXkpKQoJewoJICAgIGludAkJdmFsaWQgPSAxOwoJICAgIGNoYXJfdSAgICAgIG1hY19tb2RzID0ga01lbnVOb01vZGlmaWVyczsKCSAgICAvKiBDb252ZXJ0IFZpbSBtb2RpZmllciBjb2RlcyB0byBNZW51IE1hbmFnZXIgZXF1aXZhbGVudHMuICovCgkgICAgaWYgKG1vZGlmaWVycyAmIE1PRF9NQVNLX1NISUZUKQoJCW1hY19tb2RzIHw9IGtNZW51U2hpZnRNb2RpZmllcjsKCSAgICBpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfQ1RSTCkKCQltYWNfbW9kcyB8PSBrTWVudUNvbnRyb2xNb2RpZmllcjsKCSAgICBpZiAoIShtb2RpZmllcnMgJiBNT0RfTUFTS19DTUQpKQoJCW1hY19tb2RzIHw9IGtNZW51Tm9Db21tYW5kTW9kaWZpZXI7CgkgICAgaWYgKG1vZGlmaWVycyAmIE1PRF9NQVNLX0FMVCB8fCBtb2RpZmllcnMgJiBNT0RfTUFTS19NVUxUSV9DTElDSykKCQl2YWxpZCA9IDA7IC8qIFRPRE86IHdpbGwgQWx0IHNvbWVkYXkgbWFwIHRvIE9wdGlvbj8gKi8KCSAgICBpZiAodmFsaWQpCgkgICAgewoJCWNoYXJfdQkgICAgaXRlbV90eHRbMTBdOwoJCS8qIEluc2VydCB0aGUgbWVudSBpdGVtIGFmdGVyIGlkeCwgd2l0aCBpdHMgY29tbWFuZCBrZXkuICovCgkJaXRlbV90eHRbMF0gPSAzOyBpdGVtX3R4dFsxXSA9ICcgJzsgaXRlbV90eHRbMl0gPSAnLyc7CgkJaXRlbV90eHRbM10gPSBrZXk7CgkJSW5zZXJ0TWVudUl0ZW0ocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaXRlbV90eHQsIGlkeCk7CgkJLyogU2V0IHRoZSBtb2RpZmllciBrZXlzLiAqLwoJCVNldE1lbnVJdGVtTW9kaWZpZXJzKHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBtYWNfbW9kcyk7CgkJbWVudV9pbnNlcnRlZCA9IDE7CgkgICAgfQoJfQogICAgfQogICAgLyogQ2FsbCBJbnNlcnRNZW51SXRlbSBmb2xsb3dlZCBieSBTZXRNZW51SXRlbVRleHQKICAgICAqIHRvIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVyIHJlY29nbml0aW9uIGJ5IEluc2VydE1lbnVJdGVtCiAgICAgKi8KICAgIGlmICghbWVudV9pbnNlcnRlZCkKCUluc2VydE1lbnVJdGVtKHBhcmVudC0+c3VibWVudV9oYW5kbGUsICJccCAiLCBpZHgpOyAvKiBhZnRlckl0ZW0gKi8KICAgIC8qIFNldCB0aGUgbWVudSBpdGVtIG5hbWUuICovCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICBTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG5hbWUpOwojZWxzZQogICAgU2V0TWVudUl0ZW1UZXh0KHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBuYW1lKTsKI2VuZGlmCgojaWYgMAogICAgLyogQ2FsbGVkIGJ5IFZpbSAqLwogICAgRHJhd01lbnVCYXIoKTsKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgQ0ZSZWxlYXNlKG5hbWUpOwojZWxzZQogICAgLyogVE9ETzogQ2FuIG5hbWUgYmUgZnJlZWQ/ICovCiAgICB2aW1fZnJlZShuYW1lKTsKI2VuZGlmCn0KCiAgICB2b2lkCmd1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzKGVuYWJsZSkKICAgIGludAkgICAgZW5hYmxlOwp7CiAgICAvKiBubyB0ZWFyb2ZmIG1lbnVzICovCn0KCi8qCiAqIERlc3Ryb3kgdGhlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSB3aWRnZXQuCiAqLwogICAgdm9pZApndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KQogICAgdmltbWVudV9UCSptZW51Owp7CiAgICBzaG9ydAlpbmRleCA9IGd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleChtZW51KTsKCiAgICBpZiAoaW5kZXggPiAwKQogICAgewogICAgICBpZiAobWVudS0+cGFyZW50KQogICAgICB7CiNpZmRlZiBVU0VfSEVMUE1FTlUKCWlmIChtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlICE9IG5pbCkgLypndWkuTWFjT1NIZWxwTWVudSkqLwojZW5kaWYKCXsKCSAgICAvKiBGb3Igbm93IGp1c3QgZG9uJ3QgZGVsZXRlIGhlbHAgbWVudSBpdGVtcy4gKEh1aD8gRGFueSkgKi8KCSAgICBEZWxldGVNZW51SXRlbShtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CgoJICAgIC8qIERlbGV0ZSB0aGUgTWVudSBpZiBpdCB3YXMgYSBoaWVyYXJjaGljYWwgTWVudSAqLwoJICAgIGlmIChtZW51LT5zdWJtZW51X2lkICE9IDApCgkgICAgewoJCURlbGV0ZU1lbnUobWVudS0+c3VibWVudV9pZCk7CgkJRGlzcG9zZU1lbnUobWVudS0+c3VibWVudV9oYW5kbGUpOwoJICAgIH0KCX0KI2lmZGVmIFVTRV9IRUxQTUVOVQojIGlmZGVmIERFQlVHX01BQ19NRU5VCgllbHNlCgl7CgkgICAgcHJpbnRmKCJnbWRtIDFcbiIpOwoJfQojIGVuZGlmCiNlbmRpZgogICAgICB9CiNpZmRlZiBERUJVR19NQUNfTUVOVQogICAgICBlbHNlCiAgICAgIHsKCXByaW50ZigiZ21kbSAyXG4iKTsKICAgICAgfQojZW5kaWYKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIERvIG5vdCBkZWxldGUgdGhlIEhlbHAgTWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCglpZiAobWVudS0+c3VibWVudV9pZCAhPSBrSE1IZWxwTWVudUlEKQojZW5kaWYKCXsKCSAgICBEZWxldGVNZW51KG1lbnUtPnN1Ym1lbnVfaWQpOwoJICAgIERpc3Bvc2VNZW51KG1lbnUtPnN1Ym1lbnVfaGFuZGxlKTsKCX0KICAgIH0KICAgIC8qIFNob3VsZG4ndCB0aGlzIGJlIGFscmVhZHkgZG9uZSBieSBWaW0uIFRPRE86IENoZWNrICovCiAgICBEcmF3TWVudUJhcigpOwp9CgovKgogKiBNYWtlIGEgbWVudSBlaXRoZXIgZ3JleSBvciBub3QgZ3JleS4KICovCiAgICB2b2lkCmd1aV9tY2hfbWVudV9ncmV5KG1lbnUsIGdyZXkpCiAgICB2aW1tZW51X1QJKm1lbnU7CiAgICBpbnQJCWdyZXk7CnsKICAgIC8qIFRPRE86IENoZWNrIGlmIG1lbnUgcmVhbGx5IGV4aXN0cyAqLwogICAgc2hvcnQgaW5kZXggPSBndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXgobWVudSk7Ci8qCiAgICBpbmRleCA9IG1lbnUtPmluZGV4OwoqLwogICAgaWYgKGdyZXkpCiAgICB7CglpZiAobWVudS0+Y2hpbGRyZW4pCgkgICAgRGlzYWJsZU1lbnVJdGVtKG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CglpZiAobWVudS0+cGFyZW50KQoJICBpZiAobWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSkKCSAgICBEaXNhYmxlTWVudUl0ZW0obWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaW5kZXgpOwogICAgfQogICAgZWxzZQogICAgewoJaWYgKG1lbnUtPmNoaWxkcmVuKQoJICAgIEVuYWJsZU1lbnVJdGVtKG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CglpZiAobWVudS0+cGFyZW50KQoJICBpZiAobWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSkKCSAgICBFbmFibGVNZW51SXRlbShtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CiAgICB9Cn0KCi8qCiAqIE1ha2UgbWVudSBpdGVtIGhpZGRlbiBvciBub3QgaGlkZGVuCiAqLwogICAgdm9pZApndWlfbWNoX21lbnVfaGlkZGVuKG1lbnUsIGhpZGRlbikKICAgIHZpbW1lbnVfVAkqbWVudTsKICAgIGludAkJaGlkZGVuOwp7CiAgICAvKiBUaGVyZSdzIG5vIGhpZGRlbiBtb2RlIG9uIE1hY09TICovCiAgICBndWlfbWNoX21lbnVfZ3JleShtZW51LCBoaWRkZW4pOwp9CgoKLyoKICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc2V0dGluZyBhbGwgdGhlIG1lbnVzIHRvIGdyZXkvaGlkZGVuIG9yIG5vdC4KICovCiAgICB2b2lkCmd1aV9tY2hfZHJhd19tZW51YmFyKCkKewogICAgRHJhd01lbnVCYXIoKTsKfQoKCi8qCiAqIFNjcm9sbGJhciBzdHVmZi4KICovCgogICAgdm9pZApndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2IsIGZsYWcpCiAgICBzY3JvbGxiYXJfVAkqc2I7CiAgICBpbnQJCWZsYWc7CnsKICAgIGlmIChmbGFnKQoJU2hvd0NvbnRyb2woc2ItPmlkKTsKICAgIGVsc2UKCUhpZGVDb250cm9sKHNiLT5pZCk7CgojaWZkZWYgREVCVUdfTUFDX1NCCiAgICBwcmludGYoImVuYl9zYiAoJXgpICV4XG4iLHNiLT5pZCwgZmxhZyk7CiNlbmRpZgp9CgogICAgdm9pZApndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoc2IsIHZhbCwgc2l6ZSwgbWF4KQogICAgc2Nyb2xsYmFyX1QgKnNiOwogICAgbG9uZwl2YWw7CiAgICBsb25nCXNpemU7CiAgICBsb25nCW1heDsKewogICAgU2V0Q29udHJvbDMyQml0TWF4aW11bSAoc2ItPmlkLCBtYXgpOwogICAgU2V0Q29udHJvbDMyQml0TWluaW11bSAoc2ItPmlkLCAwKTsKICAgIFNldENvbnRyb2wzMkJpdFZhbHVlICAgKHNiLT5pZCwgdmFsKTsKI2lmZGVmIERFQlVHX01BQ19TQgogICAgcHJpbnRmKCJ0aHVtYl9zYiAoJXgpICV4LCAleCwleFxuIixzYi0+aWQsIHZhbCwgc2l6ZSwgbWF4KTsKI2VuZGlmCn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0X3Njcm9sbGJhcl9wb3Moc2IsIHgsIHksIHcsIGgpCiAgICBzY3JvbGxiYXJfVCAqc2I7CiAgICBpbnQJCXg7CiAgICBpbnQJCXk7CiAgICBpbnQJCXc7CiAgICBpbnQJCWg7CnsKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKLyogIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQogICAgewoJTW92ZUNvbnRyb2woc2ItPmlkLCB4LTE2LCB5KTsKCVNpemVDb250cm9sKHNiLT5pZCwgdyArIDEsIGgpOwogICAgfQogICAgZWxzZQogICAgewoJTW92ZUNvbnRyb2woc2ItPmlkLCB4LCB5KTsKCVNpemVDb250cm9sKHNiLT5pZCwgdyArIDEsIGgpOwogICAgfSovCiAgICBpZiAoc2IgPT0gJmd1aS5ib3R0b21fc2JhcikKCWggKz0gMTsKICAgIGVsc2UKCXcgKz0gMTsKCiAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKCXggLT0gMTU7CgogICAgTW92ZUNvbnRyb2woc2ItPmlkLCB4LCB5KTsKICAgIFNpemVDb250cm9sKHNiLT5pZCwgdywgaCk7CiNpZmRlZiBERUJVR19NQUNfU0IKICAgIHByaW50Zigic2l6ZV9zYiAoJXgpICV4LCAleCwgJXgsICV4XG4iLHNiLT5pZCwgeCwgeSwgdywgaCk7CiNlbmRpZgp9CgogICAgdm9pZApndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoc2IsIG9yaWVudCkKICAgIHNjcm9sbGJhcl9UICpzYjsKICAgIGludAkJb3JpZW50OwkvKiBTQkFSX1ZFUlQgb3IgU0JBUl9IT1JJWiAqLwp7CiAgICBSZWN0IGJvdW5kczsKCiAgICBib3VuZHMudG9wID0gLTE2OwogICAgYm91bmRzLmJvdHRvbSA9IC0xMDsKICAgIGJvdW5kcy5yaWdodCA9IC0xMDsKICAgIGJvdW5kcy5sZWZ0ID0gLTE2OwoKICAgIHNiLT5pZCA9IE5ld0NvbnRyb2woZ3VpLlZpbVdpbmRvdywKCQkJICZib3VuZHMsCgkJCSAiXHBTY3JvbGxCYXIiLAoJCQkgVFJVRSwKCQkJIDAsIC8qIGN1cnJlbnQqLwoJCQkgMCwgLyogdG9wICovCgkJCSAwLCAvKiBib3R0b20gKi8KI2lmZGVmIFVTRV9DQVJCT05JWkVECgkJCSBrQ29udHJvbFNjcm9sbEJhckxpdmVQcm9jLAojZWxzZQoJCQkgc2Nyb2xsQmFyUHJvYywKI2VuZGlmCgkJCSAobG9uZykgc2ItPmlkZW50KTsKI2lmZGVmIERFQlVHX01BQ19TQgogICAgcHJpbnRmKCJjcmVhdGVfc2IgKCV4KSAleFxuIixzYi0+aWQsIG9yaWVudCk7CiNlbmRpZgp9CgogICAgdm9pZApndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNiKQogICAgc2Nyb2xsYmFyX1QgKnNiOwp7CiAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CiAgICBEaXNwb3NlQ29udHJvbChzYi0+aWQpOwojaWZkZWYgREVCVUdfTUFDX1NCCiAgICBwcmludGYoImRlc3Rfc2IgKCV4KSBcbiIsc2ItPmlkKTsKI2VuZGlmCn0KCgovKgogKiBDdXJzb3IgYmxpbmsgZnVuY3Rpb25zLgogKgogKiBUaGlzIGlzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmU6CiAqIEJMSU5LX05PTkUJbm90IGJsaW5raW5nIGF0IGFsbAogKiBCTElOS19PRkYJYmxpbmtpbmcsIGN1cnNvciBpcyBub3Qgc2hvd24KICogQkxJTktfT04gYmxpbmtpbmcsIGN1cnNvciBpcyBzaG93bgogKi8KICAgIHZvaWQKZ3VpX21jaF9zZXRfYmxpbmtpbmcobG9uZyB3YWl0LCBsb25nIG9uLCBsb25nIG9mZikKewogICAgLyogVE9ETzogVE9ETzogVE9ETzogVE9ETzogKi8KLyogICAgYmxpbmtfd2FpdHRpbWUgPSB3YWl0OwogICAgYmxpbmtfb250aW1lID0gb247CiAgICBibGlua19vZmZ0aW1lID0gb2ZmOyovCn0KCi8qCiAqIFN0b3AgdGhlIGN1cnNvciBibGlua2luZy4gIFNob3cgdGhlIGN1cnNvciBpZiBpdCB3YXNuJ3Qgc2hvd24uCiAqLwogICAgdm9pZApndWlfbWNoX3N0b3BfYmxpbmsoKQp7CiAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CiAgICAvKiBUT0RPOiBUT0RPOiBUT0RPOiBUT0RPOiAqLwovKiAgICBndWlfdzMyX3JtX2JsaW5rX3RpbWVyKCk7CiAgICBpZiAoYmxpbmtfc3RhdGUgPT0gQkxJTktfT0ZGKQogICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOwogICAgYmxpbmtfc3RhdGUgPSBCTElOS19OT05FOyovCn0KCi8qCiAqIFN0YXJ0IHRoZSBjdXJzb3IgYmxpbmtpbmcuICBJZiBpdCB3YXMgYWxyZWFkeSBibGlua2luZywgdGhpcyByZXN0YXJ0cyB0aGUKICogd2FpdGluZyB0aW1lIGFuZCBzaG93cyB0aGUgY3Vyc29yLgogKi8KICAgIHZvaWQKZ3VpX21jaF9zdGFydF9ibGluaygpCnsKICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKICAgIC8qIFRPRE86IFRPRE86IFRPRE86IFRPRE86ICovCi8qICAgIGd1aV93MzJfcm1fYmxpbmtfdGltZXIoKTsgKi8KCiAgICAvKiBPbmx5IHN3aXRjaCBibGlua2luZyBvbiBpZiBub25lIG9mIHRoZSB0aW1lcyBpcyB6ZXJvICovCi8qICAgIGlmIChibGlua193YWl0dGltZSAmJiBibGlua19vbnRpbWUgJiYgYmxpbmtfb2ZmdGltZSkKICAgIHsKICAgIGJsaW5rX3RpbWVyID0gU2V0VGltZXIoTlVMTCwgMCwgKFVJTlQpYmxpbmtfd2FpdHRpbWUsCgkJCSAgICAoVElNRVJQUk9DKV9PbkJsaW5rVGltZXIpOwogICAgYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKICAgIH0qLwp9CgovKgogKiBSZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiBhIHBpeGVsIGFzIGxvbmcuCiAqLwogICAgbG9uZ191Cmd1aV9tY2hfZ2V0X3JnYihndWljb2xvcl9UIHBpeGVsKQp7CiAgICByZXR1cm4gKFJlZChwaXhlbCkgPDwgMTYpICsgKEdyZWVuKHBpeGVsKSA8PCA4KSArIEJsdWUocGl4ZWwpOwp9CgoKCiNpZmRlZiBGRUFUX0JST1dTRQovKgogKiBQb3Agb3BlbiBhIGZpbGUgYnJvd3NlciBhbmQgcmV0dXJuIHRoZSBmaWxlIHNlbGVjdGVkLCBpbiBhbGxvY2F0ZWQgbWVtb3J5LAogKiBvciBOVUxMIGlmIENhbmNlbCBpcyBoaXQuCiAqICBzYXZpbmcgIC0gVFJVRSBpZiB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvLCBGQUxTRSBpZiBpdCB3aWxsIGJlIG9wZW5lZC4KICogIHRpdGxlICAgLSBUaXRsZSBtZXNzYWdlIGZvciB0aGUgZmlsZSBicm93c2VyIGRpYWxvZy4KICogIGRmbHQgICAgLSBEZWZhdWx0IG5hbWUgb2YgZmlsZS4KICogIGV4dCAgICAgLSBEZWZhdWx0IGV4dGVuc2lvbiB0byBiZSBhZGRlZCB0byBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbnMuCiAqICBpbml0ZGlyIC0gZGlyZWN0b3J5IGluIHdoaWNoIHRvIG9wZW4gdGhlIGJyb3dzZXIgKE5VTEwgPSBjdXJyZW50IGRpcikKICogIGZpbHRlciAgLSBGaWx0ZXIgZm9yIG1hdGNoZWQgZmlsZXMgdG8gY2hvb3NlIGZyb20uCiAqICBIYXMgYSBmb3JtYXQgbGlrZSB0aGlzOgogKiAgIkMgRmlsZXMgKCouYylcMCouY1wwIgogKiAgIkFsbCBGaWxlc1wwKi4qXDBcMCIKICogIElmIHRoZXNlIHR3byBzdHJpbmdzIHdlcmUgY29uY2F0ZW5hdGVkLCB0aGVuIGEgY2hvaWNlIG9mIHR3byBmaWxlCiAqICBmaWx0ZXJzIHdpbGwgYmUgc2VsZWN0YWJsZSB0byB0aGUgdXNlci4gIFRoZW4gb25seSBtYXRjaGluZyBmaWxlcyB3aWxsCiAqICBiZSBzaG93biBpbiB0aGUgYnJvd3Nlci4gIElmIE5VTEwsIHRoZSBkZWZhdWx0IGFsbG93cyBhbGwgZmlsZXMuCiAqCiAqICAqTk9URSogLSB0aGUgZmlsdGVyIHN0cmluZyBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBUV08gbnVsbHMuCiAqLwogICAgY2hhcl91ICoKZ3VpX21jaF9icm93c2UoCiAgICBpbnQgc2F2aW5nLAogICAgY2hhcl91ICp0aXRsZSwKICAgIGNoYXJfdSAqZGZsdCwKICAgIGNoYXJfdSAqZXh0LAogICAgY2hhcl91ICppbml0ZGlyLAogICAgY2hhcl91ICpmaWx0ZXIpCnsKI2lmIGRlZmluZWQgKFVTRV9OQVZJR0FUSU9OX1NFUlZJQ0UpIHx8IGRlZmluZWQgKFVTRV9DQVJCT05JWkVEKQogICAgLyogVE9ETzogQWRkIEFtbW9uJ3Mgc2FmZXR5IGNoZWNsIChEYW55KSAqLwogICAgTmF2UmVwbHlSZWNvcmQJcmVwbHk7CiAgICBjaGFyX3UJCSpmbmFtZSA9IE5VTEw7CiAgICBjaGFyX3UJCSoqZm5hbWVzID0gTlVMTDsKICAgIGxvbmcJCW51bUZpbGVzOwogICAgTmF2RGlhbG9nT3B0aW9ucwluYXZPcHRpb25zOwogICAgT1NFcnIJCWVycm9yOwoKICAgIC8qIEdldCBOYXZpZ2F0aW9uIFNlcnZpY2UgRGVmYXVsdHMgdmFsdWUgKi8KICAgIE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKCZuYXZPcHRpb25zKTsKCgogICAgLyogVE9ETzogSWYgd2UgZ2V0IGEgOmJyb3dzZSBhcmdzLCBzZXQgdGhlIE11bHRpcGxlIGJpdC4gKi8KICAgIG5hdk9wdGlvbnMuZGlhbG9nT3B0aW9uRmxhZ3MgPSAga05hdkFsbG93SW52aXNpYmxlRmlsZXMKCQkJCSB8ICBrTmF2RG9udEF1dG9UcmFuc2xhdGUKCQkJCSB8ICBrTmF2RG9udEFkZFRyYW5zbGF0ZUl0ZW1zCgkJCSAgICAvKgkgfCAga05hdkFsbG93TXVsdGlwbGVGaWxlcyAqLwoJCQkJIHwgIGtOYXZBbGxvd1N0YXRpb25lcnk7CgogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKHRpdGxlLCAgICZuYXZPcHRpb25zLm1lc3NhZ2UpOwogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKGRmbHQsICAgICZuYXZPcHRpb25zLnNhdmVkRmlsZU5hbWUpOwogICAgLyogQ291bGQgc2V0IGNsaWVudE5hbWU/CiAgICAgKgkJIHdpbmRvd1RpdGxlPyAodGhlcmUncyBubyB0aXRsZSBiYXI/KQogICAgICovCgogICAgaWYgKHNhdmluZykKICAgIHsKCS8qIENoYW5nZSBmaXJzdCBwYXJtIEFFRGVzYyAodHlwZUZTUykgKmRlZmF1bHRMb2NhdGlvbiB0byBtYXRjaCBkZmx0ICovCglOYXZQdXRGaWxlKE5VTEwsICZyZXBseSwgJm5hdk9wdGlvbnMsIE5VTEwsICdURVhUJywgJ1ZJTSEnLCBOVUxMKTsKCWlmICghcmVwbHkudmFsaWRSZWNvcmQpCgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBDaGFuZ2UgZmlyc3QgcGFybSBBRURlc2MgKHR5cGVGU1MpICpkZWZhdWx0TG9jYXRpb24gdG8gbWF0Y2ggZGZsdCAqLwoJTmF2R2V0RmlsZShOVUxMLCAmcmVwbHksICZuYXZPcHRpb25zLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCWlmICghcmVwbHkudmFsaWRSZWNvcmQpCgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZm5hbWVzID0gbmV3X2ZuYW1lc19mcm9tX0FFRGVzYygmcmVwbHkuc2VsZWN0aW9uLCAmbnVtRmlsZXMsICZlcnJvcik7CgogICAgTmF2RGlzcG9zZVJlcGx5KCZyZXBseSk7CgogICAgaWYgKGZuYW1lcykKICAgIHsKCWZuYW1lID0gZm5hbWVzWzBdOwoJdmltX2ZyZWUoZm5hbWVzKTsKICAgIH0KCiAgICAvKiBUT0RPOiBTaG9ydGVuIHRoZSBmaWxlIG5hbWUgaWYgcG9zc2libGUgKi8KICAgIHJldHVybiBmbmFtZTsKI2Vsc2UKICAgIFNGVHlwZUxpc3QJCWZpbGVUeXBlczsKICAgIFN0YW5kYXJkRmlsZVJlcGx5CXJlcGx5OwogICAgU3RyMjU1CQlQcm9tcHQ7CiAgICBTdHIyNTUJCURlZmF1bHROYW1lOwogICAgU3RyMjU1CQlEaXJlY3Rvcnk7CgogICAgLyogVE9ETzogc3BsaXQgZGZsdCBpbiBwYXRoIGFuZCBmaWxlbmFtZSAqLwoKICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyh0aXRsZSwgICAmUHJvbXB0KTsKICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyhkZmx0LCAgICAmRGVmYXVsdE5hbWUpOwogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKGluaXRkaXIsICZEaXJlY3RvcnkpOwoKICAgIGlmIChzYXZpbmcpCiAgICB7CgkvKiBVc2UgYSBjdXN0b24gZmlsdGVyIGluc3RlYWQgb2YgbmlsIEZBUSA5LTQgKi8KCVN0YW5kYXJkUHV0RmlsZShQcm9tcHQsIERlZmF1bHROYW1lLCAgJnJlcGx5KTsKCWlmICghcmVwbHkuc2ZHb29kKQoJICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZWxzZQogICAgewoJU3RhbmRhcmRHZXRGaWxlKG5pbCwgLTEsIGZpbGVUeXBlcywgJnJlcGx5KTsKCWlmICghcmVwbHkuc2ZHb29kKQoJICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIFdvcmsgZmluZSBidXQgYXBwZW5kIGEgOiBmb3IgbmV3IGZpbGUgKi8KICAgIHJldHVybiAoRnVsbFBhdGhGcm9tRlNTcGVjX3NhdmUocmVwbHkuc2ZGaWxlKSk7CgogICAgLyogU2hvcnRlbiB0aGUgZmlsZSBuYW1lIGlmIHBvc3NpYmxlICovCi8qICAgIG1jaF9kaXJuYW1lKElPYnVmZiwgSU9TSVpFKTsKICAgIHAgPSBzaG9ydGVuX2ZuYW1lKGZpbGVCdWYsIElPYnVmZik7CiAgICBpZiAocCA9PSBOVUxMKQogICAgcCA9IGZpbGVCdWY7CiAgICByZXR1cm4gdmltX3N0cnNhdmUocCk7CiovCiNlbmRpZgp9CiNlbmRpZiAvKiBGRUFUX0JST1dTRSAqLwoKI2lmZGVmIEZFQVRfR1VJX0RJQUxPRwovKgogKiBTdHVmZiBmb3IgZGlhbG9ndWVzCiAqLwoKLyoKICogQ3JlYXRlIGEgZGlhbG9ndWUgZHluYW1pY2FsbHkgZnJvbSB0aGUgcGFyYW1ldGVyIHN0cmluZ3MuCiAqIHR5cGUgICAgICAgPSB0eXBlIG9mIGRpYWxvZ3VlIChxdWVzdGlvbiwgYWxlcnQsIGV0Yy4pCiAqIHRpdGxlICAgICAgPSBkaWFsb2d1ZSB0aXRsZS4gbWF5IGJlIE5VTEwgZm9yIGRlZmF1bHQgdGl0bGUuCiAqIG1lc3NhZ2UgICAgPSB0ZXh0IHRvIGRpc3BsYXkuIERpYWxvZ3VlIHNpemVzIHRvIGFjY29tbW9kYXRlIGl0LgogKiBidXR0b25zICAgID0gJ1xuJyBzZXBhcmF0ZWQgbGlzdCBvZiBidXR0b24gY2FwdGlvbnMsIGRlZmF1bHQgZmlyc3QuCiAqIGRmbHRidXR0b24gPSBudW1iZXIgb2YgZGVmYXVsdCBidXR0b24uCiAqCiAqIFRoaXMgcm91dGluZSByZXR1cm5zIDEgaWYgdGhlIGZpcnN0IGJ1dHRvbiBpcyBwcmVzc2VkLAogKgkgICAgMiBmb3IgdGhlIHNlY29uZCwgZXRjLgogKgogKgkgICAgMCBpbmRpY2F0ZXMgRXNjIHdhcyBwcmVzc2VkLgogKgkgICAgLTEgZm9yIHVuZXhwZWN0ZWQgZXJyb3IKICoKICogSWYgc3R1YmJpbmcgb3V0IHRoaXMgZm4sIHJldHVybiAxLgogKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIHNob3J0ICAgaWR4OwogICAgc2hvcnQgICB3aWR0aDsJLyogU2l6ZSBvZiB0aGUgdGV4dCBpbiBwaXhlbCAqLwogICAgUmVjdCAgICBib3g7Cn0gdmdtRGxnSXRtOyAvKiBWaW0gR3VpX01hYy5jIERpYWxvZyBJdGVtICovCgojZGVmaW5lIE1vdmVSZWN0VG8ocix4LHkpIE9mZnNldFJlY3Qocix4LXItPmxlZnQseS1yLT50b3ApCgogICAgc3RhdGljIHZvaWQKbWFjTW92ZURpYWxvZ0l0ZW0oCiAgICBEaWFsb2dSZWYJdGhlRGlhbG9nLAogICAgc2hvcnQJaXRlbU51bWJlciwKICAgIHNob3J0CVgsCiAgICBzaG9ydAlZLAogICAgUmVjdAkqaW5Cb3gpCnsKI2lmIDAgLyogVVNFX0NBUkJPTklaRUQgKi8KICAgIC8qIFVudGVzdGVkICovCiAgICBNb3ZlRGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIFgsIFkpOwogICAgaWYgKGluQm94ICE9IG5pbCkKCUdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpdGVtTnVtYmVyLCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCBpbkJveCk7CiNlbHNlCiAgICBzaG9ydAlpdGVtVHlwZTsKICAgIEhhbmRsZQlpdGVtSGFuZGxlOwogICAgUmVjdAlsb2NhbEJveDsKICAgIFJlY3QJKml0ZW1Cb3ggPSAmbG9jYWxCb3g7CgogICAgaWYgKGluQm94ICE9IG5pbCkKCWl0ZW1Cb3ggPSBpbkJveDsKCiAgICBHZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaXRlbU51bWJlciwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgaXRlbUJveCk7CiAgICBPZmZzZXRSZWN0KGl0ZW1Cb3gsIC1pdGVtQm94LT5sZWZ0LCAtaXRlbUJveC0+dG9wKTsKICAgIE9mZnNldFJlY3QoaXRlbUJveCwgWCwgWSk7CiAgICAvKiBUbyBtb3ZlIGEgY29udHJvbCAobGlrZSBhIGJ1dHRvbikgd2UgbmVlZCB0byBjYWxsIGJvdGgKICAgICAqIE1vdmVDb250cm9sIGFuZCBTZXREaWFsb2dJdGVtLiBGQVEgNi0xOCAqLwogICAgaWYgKDEpIC8qKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKSAqLwoJTW92ZUNvbnRyb2woKENvbnRyb2xSZWYpIGl0ZW1IYW5kbGUsIFgsIFkpOwogICAgU2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIGl0ZW1UeXBlLCBpdGVtSGFuZGxlLCBpdGVtQm94KTsKI2VuZGlmCn0KCiAgICBzdGF0aWMgdm9pZAptYWNTaXplRGlhbG9nSXRlbSgKICAgIERpYWxvZ1JlZgl0aGVEaWFsb2csCiAgICBzaG9ydAlpdGVtTnVtYmVyLAogICAgc2hvcnQJd2lkdGgsCiAgICBzaG9ydAloZWlnaHQpCnsKICAgIHNob3J0CWl0ZW1UeXBlOwogICAgSGFuZGxlCWl0ZW1IYW5kbGU7CiAgICBSZWN0CWl0ZW1Cb3g7CgogICAgR2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZpdGVtQm94KTsKCiAgICAvKiBXaGVuIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIGRvIG5vdCBjaGFuZ2UgaXQgKi8KICAgIGlmICh3aWR0aCAgPT0gMCkKCXdpZHRoICA9IGl0ZW1Cb3gucmlnaHQgIC0gaXRlbUJveC5sZWZ0OwogICAgaWYgKGhlaWdodCA9PSAwKQoJaGVpZ2h0ID0gaXRlbUJveC5ib3R0b20gLSBpdGVtQm94LnRvcDsKCiNpZiAwIC8qIFVTRV9DQVJCT05JWkVEICovCiAgICBTaXplRGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIHdpZHRoLCBoZWlnaHQpOyAvKiBVbnRlc3RlZCAqLwojZWxzZQogICAgLyogUmVzaXplIHRoZSBib3VuZGluZyBib3ggKi8KICAgIGl0ZW1Cb3gucmlnaHQgID0gaXRlbUJveC5sZWZ0ICsgd2lkdGg7CiAgICBpdGVtQm94LmJvdHRvbSA9IGl0ZW1Cb3gudG9wICArIGhlaWdodDsKCiAgICAvKiBUbyByZXNpemUgYSBjb250cm9sIChsaWtlIGEgYnV0dG9uKSB3ZSBuZWVkIHRvIGNhbGwgYm90aAogICAgICogU2l6ZUNvbnRyb2wgYW5kIFNldERpYWxvZ0l0ZW0uIChkZWR1Y3RlZCBmcm9tIEZBUSA2LTE4KSAqLwogICAgaWYgKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKQoJU2l6ZUNvbnRyb2woKENvbnRyb2xSZWYpIGl0ZW1IYW5kbGUsIHdpZHRoLCBoZWlnaHQpOwoKICAgIC8qIENvbmZpZ3VyZSBiYWNrIHRoZSBpdGVtICovCiAgICBTZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaXRlbU51bWJlciwgaXRlbVR5cGUsIGl0ZW1IYW5kbGUsICZpdGVtQm94KTsKI2VuZGlmCn0KCiAgICBzdGF0aWMgdm9pZAptYWNTZXREaWFsb2dJdGVtVGV4dCgKICAgIERpYWxvZ1JlZgl0aGVEaWFsb2csCiAgICBzaG9ydAlpdGVtTnVtYmVyLAogICAgU3RyMjU1CWl0ZW1OYW1lKQp7CiAgICBzaG9ydAlpdGVtVHlwZTsKICAgIEhhbmRsZQlpdGVtSGFuZGxlOwogICAgUmVjdAlpdGVtQm94OwoKICAgIEdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpdGVtTnVtYmVyLCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCAmaXRlbUJveCk7CgogICAgaWYgKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKQoJU2V0Q29udHJvbFRpdGxlKChDb250cm9sUmVmKSBpdGVtSGFuZGxlLCBpdGVtTmFtZSk7CiAgICBlbHNlCglTZXREaWFsb2dJdGVtVGV4dChpdGVtSGFuZGxlLCBpdGVtTmFtZSk7Cn0KCiAgICBpbnQKZ3VpX21jaF9kaWFsb2coCiAgICBpbnQJCXR5cGUsCiAgICBjaGFyX3UJKnRpdGxlLAogICAgY2hhcl91CSptZXNzYWdlLAogICAgY2hhcl91CSpidXR0b25zLAogICAgaW50CQlkZmx0YnV0dG9uLAogICAgY2hhcl91CSp0ZXh0ZmllbGQpCnsKICAgIEhhbmRsZQlidXR0b25ESVRMOwogICAgSGFuZGxlCWljb25ESVRMOwogICAgSGFuZGxlCWlucHV0RElUTDsKICAgIEhhbmRsZQltZXNzYWdlRElUTDsKICAgIEhhbmRsZQlpdGVtSGFuZGxlOwogICAgSGFuZGxlCWljb25IYW5kbGU7CiAgICBEaWFsb2dQdHIJdGhlRGlhbG9nOwogICAgY2hhcl91CWxlbjsKICAgIGNoYXJfdQlQYXNjYWxUaXRsZVsyNTZdOwkvKiBwbGFjZSBob2xkZXIgZm9yIHRoZSB0aXRsZSAqLwogICAgY2hhcl91CW5hbWVbMjU2XTsKICAgIEdyYWZQdHIJb2xkUG9ydDsKICAgIHNob3J0CWl0ZW1IaXQ7CiAgICBjaGFyX3UJKmJ1dHRvbkNoYXI7CiAgICBSZWN0CWJveDsKICAgIHNob3J0CWJ1dHRvbjsKICAgIHNob3J0CWxhc3RCdXR0b247CiAgICBzaG9ydAlpdGVtVHlwZTsKICAgIHNob3J0CXVzZUljb247CiAgICBzaG9ydAl3aWR0aDsKICAgIHNob3J0CXRvdGFsQnV0dG9uV2lkdGggPSAwOyAgIC8qIHRoZSB3aWR0aCBvZiBhbGwgYnV0dG9uIHRvZ2V0aGVyIGluY3VkaW5nIHNwYWNpbmcgKi8KICAgIHNob3J0CXdpZGVzdEJ1dHRvbiA9IDA7CiAgICBzaG9ydAlkZmx0QnV0dG9uRWRnZSAgICAgPSAyMDsgIC8qIGd1dCBmZWVsaW5nICovCiAgICBzaG9ydAlkZmx0RWxlbWVudFNwYWNpbmcgPSAxMzsgIC8qIGZyb20gSU06Vi4yLTI5ICovCiAgICBzaG9ydCAgICAgICBkZmx0SWNvblNpZGVTcGFjZSAgPSAyMzsgIC8qIGZyb20gSU06Vi4yLTI5ICovCiAgICBzaG9ydAltYXhpbXVtV2lkdGggICAgICAgPSA0MDA7IC8qIGd1dCBmZWVsaW5nICovCiAgICBzaG9ydAltYXhCdXR0b25XaWR0aAkgICA9IDE3NTsgLyogZ3V0IGZlZWxpbmcgKi8KCiAgICBzaG9ydAl2ZXJ0aWNhbDsKICAgIHNob3J0CWRpYWxvZ0hlaWdodDsKICAgIHNob3J0CW1lc3NhZ2VMaW5lcyA9IDM7CiAgICBGb250SW5mbwl0ZXh0Rm9udEluZm87CgogICAgdmdtRGxnSXRtICAgaWNvbkl0bTsKICAgIHZnbURsZ0l0bSAgIG1lc3NhZ2VJdG07CiAgICB2Z21EbGdJdG0gICBpbnB1dEl0bTsKICAgIHZnbURsZ0l0bSAgIGJ1dHRvbkl0bTsKCiAgICBXaW5kb3dSZWYJdGhlV2luZG93OwoKICAgIC8qIENoZWNrICd2JyBmbGFnIGluICdndWlvcHRpb25zJzogdmVydGljYWwgYnV0dG9uIHBsYWNlbWVudC4gKi8KICAgIHZlcnRpY2FsID0gKHZpbV9zdHJjaHIocF9nbywgR09fVkVSVElDQUwpICE9IE5VTEwpOwoKICAgIC8qIENyZWF0ZSBhIG5ldyBEaWFsb2cgQm94IGZyb20gdGVtcGxhdGUuICovCiAgICB0aGVEaWFsb2cgPSBHZXROZXdEaWFsb2coMTI5LCBuaWwsIChXaW5kb3dSZWYpIC0xKTsKCiAgICAvKiBHZXQgdGhlIFdpbmRvd1JlZiAqLwogICAgdGhlV2luZG93ID0gR2V0RGlhbG9nV2luZG93KHRoZURpYWxvZyk7CgogICAgLyogSGlkZSB0aGUgd2luZG93LgogICAgICogMS4gdG8gYXZvaWQgc2VlaW5nIHNsb3cgZHJhd2luZwogICAgICogMi4gdG8gcHJldmVudCBhIHByb2JsZW0gc2VlbiB3aGlsZSBtb3ZpbmcgZGlhbG9nIGl0ZW0KICAgICAqICAgIHdpdGhpbiBhIHZpc2libGUgd2luZG93LiAobm9uLUNhcmJvbiBNYWNPUyA5KQogICAgICogQ291bGQgYmUgYXZvaWRlZCBieSBjaGFuZ2luZyB0aGUgcmVzb3VyY2UuCiAgICAgKi8KICAgIEhpZGVXaW5kb3codGhlV2luZG93KTsKCiAgICAvKiBDaGFuZ2UgdGhlIGdyYXBoaWNhbCBwb3J0IHRvIHRoZSBkaWFsb2csCiAgICAgKiBzbyB3ZSBjYW4gbWVhc3VyZSB0aGUgdGV4dCB3aXRoIHRoZSBwcm9wZXIgZm9udCAqLwogICAgR2V0UG9ydCgmb2xkUG9ydCk7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgU2V0UG9ydERpYWxvZ1BvcnQodGhlRGlhbG9nKTsKI2Vsc2UKICAgIFNldFBvcnQodGhlRGlhbG9nKTsKI2VuZGlmCgogICAgLyogR2V0IHRoZSBpbmZvIGFib3V0IHRoZSBkZWZhdWx0IHRleHQsCiAgICAgKiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0IG9mIHRoZSBtZXNzYWdlCiAgICAgKiBhbmQgb2YgdGhlICB0ZXh0IGZpZWxkICovCiAgICBHZXRGb250SW5mbygmdGV4dEZvbnRJbmZvKTsKCiAgICAvKglTZXQgdGhlIGRpYWxvZyB0aXRsZSAqLwogICAgaWYgKHRpdGxlICE9IE5VTEwpCiAgICB7Cgkodm9pZCkgQzJQYXNjYWxTdHJpbmcodGl0bGUsICZQYXNjYWxUaXRsZSk7CglTZXRXVGl0bGUodGhlV2luZG93LCBQYXNjYWxUaXRsZSk7CiAgICB9CgogICAgLyogQ3JlYXRlcyB0aGUgYnV0dG9ucyBhbmQgYWRkIHRoZW0gdG8gdGhlIERpYWxvZyBCb3guICovCiAgICBidXR0b25ESVRMID0gR2V0UmVzb3VyY2UoJ0RJVEwnLCAxMzApOwogICAgYnV0dG9uQ2hhciA9IGJ1dHRvbnM7CiAgICBidXR0b24gPSAwOwoKICAgIGZvciAoOypidXR0b25DaGFyICE9IDA7KQogICAgewoJLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBidXR0b24gKi8KCWJ1dHRvbisrOwoJbGVuID0gMDsKCWZvciAoOygoKmJ1dHRvbkNoYXIgIT0gRExHX0JVVFRPTl9TRVApICYmICgqYnV0dG9uQ2hhciAhPSAwKSAmJiAobGVuIDwgMjU1KSk7IGJ1dHRvbkNoYXIrKykKCXsKCSAgICBpZiAoKmJ1dHRvbkNoYXIgIT0gRExHX0hPVEtFWV9DSEFSKQoJCW5hbWVbKytsZW5dID0gKmJ1dHRvbkNoYXI7Cgl9CglpZiAoKmJ1dHRvbkNoYXIgIT0gMCkKCSAgYnV0dG9uQ2hhcisrOwoJbmFtZVswXSA9IGxlbjsKCgkvKiBBZGQgdGhlIGJ1dHRvbiAqLwoJQXBwZW5kRElUTCh0aGVEaWFsb2csIGJ1dHRvbkRJVEwsIG92ZXJsYXlESVRMKTsgLyogYXBwZW5kRElUTFJpZ2h0KTsgKi8KCgkvKiBDaGFuZ2UgdGhlIGJ1dHRvbidzIG5hbWUgKi8KCW1hY1NldERpYWxvZ0l0ZW1UZXh0KHRoZURpYWxvZywgYnV0dG9uLCBuYW1lKTsKCgkvKiBSZXNpemUgdGhlIGJ1dHRvbiB0byBmaXQgaXRzIG5hbWUgKi8KCXdpZHRoID0gU3RyaW5nV2lkdGgobmFtZSkgKyAyICogZGZsdEJ1dHRvbkVkZ2U7CgkvKiBMaW1pdGUgdGhlIHNpemUgb2YgYW55IGJ1dHRvbiB0byBhbiBhY2NlcHRhYmxlIHZhbHVlLiAqLwoJLyogVE9ETzogU2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBtZXNzYWdlIHdpZHRoICovCglpZiAod2lkdGggPiBtYXhCdXR0b25XaWR0aCkKCSAgICB3aWR0aCA9IG1heEJ1dHRvbldpZHRoOwoJbWFjU2l6ZURpYWxvZ0l0ZW0odGhlRGlhbG9nLCBidXR0b24sIHdpZHRoLCAwKTsKCgl0b3RhbEJ1dHRvbldpZHRoICs9IHdpZHRoOwoKCWlmICh3aWR0aCA+IHdpZGVzdEJ1dHRvbikKCSAgICB3aWRlc3RCdXR0b24gPSB3aWR0aDsKICAgIH0KICAgIFJlbGVhc2VSZXNvdXJjZShidXR0b25ESVRMKTsKICAgIGxhc3RCdXR0b24gPSBidXR0b247CgogICAgLyogQWRkIHRoZSBpY29uIHRvIHRoZSBEaWFsb2cgQm94LiAqLwogICAgaWNvbkl0bS5pZHggPSBsYXN0QnV0dG9uICsgMTsKICAgIGljb25ESVRMID0gR2V0UmVzb3VyY2UoJ0RJVEwnLCAxMzEpOwogICAgc3dpdGNoICh0eXBlKQogICAgewoJY2FzZSBWSU1fR0VORVJJQzogIHVzZUljb24gPSBrTm90ZUljb247CgljYXNlIFZJTV9FUlJPUjogICAgdXNlSWNvbiA9IGtTdG9wSWNvbjsKCWNhc2UgVklNX1dBUk5JTkc6ICB1c2VJY29uID0ga0NhdXRpb25JY29uOwoJY2FzZSBWSU1fSU5GTzogICAgIHVzZUljb24gPSBrTm90ZUljb247CgljYXNlIFZJTV9RVUVTVElPTjogdXNlSWNvbiA9IGtOb3RlSWNvbjsKCWRlZmF1bHQ6ICAgICAgdXNlSWNvbiA9IGtTdG9wSWNvbjsKICAgIH07CiAgICBBcHBlbmRESVRMKHRoZURpYWxvZywgaWNvbkRJVEwsIG92ZXJsYXlESVRMKTsKICAgIFJlbGVhc2VSZXNvdXJjZShpY29uRElUTCk7CiAgICBHZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwogICAgLyogVE9ETzogU2hvdWxkIHRoZSBpdGVtIGJlIGZyZWVkPyAqLwogICAgaWNvbkhhbmRsZSA9IEdldEljb24odXNlSWNvbik7CiAgICBTZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsIGl0ZW1UeXBlLCBpY29uSGFuZGxlLCAmYm94KTsKCiAgICAvKiBBZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIERpYWxvZyBib3guICovCiAgICBtZXNzYWdlSXRtLmlkeCA9IGxhc3RCdXR0b24gKyAyOwogICAgbWVzc2FnZURJVEwgPSBHZXRSZXNvdXJjZSgnRElUTCcsIDEzMik7CiAgICBBcHBlbmRESVRMKHRoZURpYWxvZywgbWVzc2FnZURJVEwsIG92ZXJsYXlESVRMKTsKICAgIFJlbGVhc2VSZXNvdXJjZShtZXNzYWdlRElUTCk7CiAgICBHZXREaWFsb2dJdGVtKHRoZURpYWxvZywgbWVzc2FnZUl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKG1lc3NhZ2UsICZuYW1lKTsKICAgIFNldERpYWxvZ0l0ZW1UZXh0KGl0ZW1IYW5kbGUsIG5hbWUpOwogICAgbWVzc2FnZUl0bS53aWR0aCA9IFN0cmluZ1dpZHRoKG5hbWUpOwoKICAgIC8qIEFkZCB0aGUgaW5wdXQgYm94IGlmIG5lZWRlZCAqLwogICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQogICAgewoJLyogQ2hlYXQgZm9yIG5vdyByZXVzZSB0aGUgbWVzc2FnZSBhbmQgY29udmV0IHRvIHRleHQgZWRpdCAqLwoJaW5wdXRJdG0uaWR4ID0gbGFzdEJ1dHRvbiArIDM7CglpbnB1dERJVEwgPSBHZXRSZXNvdXJjZSgnRElUTCcsIDEzMik7CglBcHBlbmRESVRMKHRoZURpYWxvZywgaW5wdXRESVRMLCBvdmVybGF5RElUTCk7CglSZWxlYXNlUmVzb3VyY2UoaW5wdXRESVRMKTsKCUdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwovKgkgIFNldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsIGtFZGl0VGV4dERpYWxvZ0l0ZW0sIGl0ZW1IYW5kbGUsICZib3gpOyovCgkodm9pZCkgQzJQYXNjYWxTdHJpbmcodGV4dGZpZWxkLCAmbmFtZSk7CglTZXREaWFsb2dJdGVtVGV4dChpdGVtSGFuZGxlLCBuYW1lKTsKCWlucHV0SXRtLndpZHRoID0gU3RyaW5nV2lkdGgobmFtZSk7CiAgICB9CgogICAgLyogU2V0IHRoZSA8RU5URVI+IGFuZCA8RVNDPiBidXR0b24uICovCiAgICBTZXREaWFsb2dEZWZhdWx0SXRlbSh0aGVEaWFsb2csIGRmbHRidXR0b24pOwogICAgU2V0RGlhbG9nQ2FuY2VsSXRlbSh0aGVEaWFsb2csIDApOwoKICAgIC8qIFJlcG9zaXRpb24gZWxlbWVudCAqLwoKICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gZm9yY2UgdmVydGljYWwgKi8KICAgIGlmICh0b3RhbEJ1dHRvbldpZHRoID4gbWF4aW11bVdpZHRoKQoJdmVydGljYWwgPSBUUlVFOwoKICAgIC8qIFBsYWNlIGljb24gKi8KICAgIG1hY01vdmVEaWFsb2dJdGVtKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsIGRmbHRJY29uU2lkZVNwYWNlLCBkZmx0RWxlbWVudFNwYWNpbmcsICZib3gpOwogICAgaWNvbkl0bS5ib3gucmlnaHQgPSBib3gucmlnaHQ7CiAgICBpY29uSXRtLmJveC5ib3R0b20gPSBib3guYm90dG9tOwoKICAgIC8qIFBsYWNlIE1lc3NhZ2UgKi8KICAgIG1lc3NhZ2VJdG0uYm94LmxlZnQgPSBpY29uSXRtLmJveC5yaWdodCArIGRmbHRJY29uU2lkZVNwYWNlOwogICAgbWFjU2l6ZURpYWxvZ0l0ZW0odGhlRGlhbG9nLCBtZXNzYWdlSXRtLmlkeCwgMCwgIG1lc3NhZ2VMaW5lcyAqICh0ZXh0Rm9udEluZm8uYXNjZW50ICsgdGV4dEZvbnRJbmZvLmRlc2NlbnQpKTsKICAgIG1hY01vdmVEaWFsb2dJdGVtKHRoZURpYWxvZywgbWVzc2FnZUl0bS5pZHgsIG1lc3NhZ2VJdG0uYm94LmxlZnQsIGRmbHRFbGVtZW50U3BhY2luZywgJm1lc3NhZ2VJdG0uYm94KTsKCiAgICAvKiBQbGFjZSBJbnB1dCAqLwogICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQogICAgewoJaW5wdXRJdG0uYm94LmxlZnQgPSBtZXNzYWdlSXRtLmJveC5sZWZ0OwoJaW5wdXRJdG0uYm94LnRvcCAgPSBtZXNzYWdlSXRtLmJveC5ib3R0b20gKyBkZmx0RWxlbWVudFNwYWNpbmc7CgltYWNTaXplRGlhbG9nSXRlbSh0aGVEaWFsb2csIGlucHV0SXRtLmlkeCwgMCwgdGV4dEZvbnRJbmZvLmFzY2VudCArIHRleHRGb250SW5mby5kZXNjZW50KTsKCW1hY01vdmVEaWFsb2dJdGVtKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCBpbnB1dEl0bS5ib3gubGVmdCwgaW5wdXRJdG0uYm94LnRvcCwgJmlucHV0SXRtLmJveCk7CgkvKiBDb252ZXJ0IHRoZSBzdGF0aWMgdGV4dCBpbnRvIGEgdGV4dCBlZGl0LgoJICogRm9yIHNvbWUgcmVhc29uIHRoaXMgY2hhbmdlIG5lZWQgdG8gYmUgZG9uZSBsYXN0IChEYW55KSAqLwoJR2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGlucHV0SXRtLmlkeCwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmlucHV0SXRtLmJveCk7CglTZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCBrRWRpdFRleHREaWFsb2dJdGVtLCBpdGVtSGFuZGxlLCAmaW5wdXRJdG0uYm94KTsKCVNlbGVjdERpYWxvZ0l0ZW1UZXh0KHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCAwLCAzMjc2Nyk7CiAgICB9CgogICAgLyogUGxhY2UgQnV0dG9uICovCiAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCiAgICB7CglidXR0b25JdG0uYm94LmxlZnQgPSBpbnB1dEl0bS5ib3gubGVmdDsKCWJ1dHRvbkl0bS5ib3gudG9wICA9IGlucHV0SXRtLmJveC5ib3R0b20gKyBkZmx0RWxlbWVudFNwYWNpbmc7CiAgICB9CiAgICBlbHNlCiAgICB7CglidXR0b25JdG0uYm94LmxlZnQgPSBtZXNzYWdlSXRtLmJveC5sZWZ0OwoJYnV0dG9uSXRtLmJveC50b3AgID0gbWVzc2FnZUl0bS5ib3guYm90dG9tICsgZGZsdEVsZW1lbnRTcGFjaW5nOwogICAgfQoKICAgIGZvciAoYnV0dG9uPTE7IGJ1dHRvbiA8PSBsYXN0QnV0dG9uOyBidXR0b24rKykKICAgIHsKCgltYWNNb3ZlRGlhbG9nSXRlbSh0aGVEaWFsb2csIGJ1dHRvbiwgYnV0dG9uSXRtLmJveC5sZWZ0LCBidXR0b25JdG0uYm94LnRvcCwgJmJveCk7CgkvKiBXaXRoIHZlcnRpY2FsLCBpdCdzIGJldHRlciB0byBoYXZlIGFsbCBidXR0b24gdGhlIHNhbWUgbGVuZ2h0ICovCglpZiAodmVydGljYWwpCgl7CgkgICAgbWFjU2l6ZURpYWxvZ0l0ZW0odGhlRGlhbG9nLCBidXR0b24sIHdpZGVzdEJ1dHRvbiwgMCk7CgkgICAgR2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGJ1dHRvbiwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmJveCk7Cgl9CgkvKiBDYWxjdWxhdGUgcG9zaXRpb24gb2YgbmV4dCBidXR0b24gKi8KCWlmICh2ZXJ0aWNhbCkKCSAgICBidXR0b25JdG0uYm94LnRvcCAgPSBib3guYm90dG9tICsgZGZsdEVsZW1lbnRTcGFjaW5nOwoJZWxzZQoJICAgIGJ1dHRvbkl0bS5ib3gubGVmdCAgPSBib3gucmlnaHQgKyBkZmx0RWxlbWVudFNwYWNpbmc7CiAgICB9CgogICAgLyogUmVzaXplIHRoZSBkaWFsb2cgYm94ICovCiAgICBkaWFsb2dIZWlnaHQgPSBib3guYm90dG9tICsgZGZsdEVsZW1lbnRTcGFjaW5nOwogICAgU2l6ZVdpbmRvdyh0aGVXaW5kb3csIG1heGltdW1XaWR0aCwgZGlhbG9nSGVpZ2h0LCBUUlVFKTsKCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgLyogTWFnaWMgcmVzaXplICovCiAgICBBdXRvU2l6ZURpYWxvZyh0aGVEaWFsb2cpOwogICAgLyogTmVlZCBhIGhvcml6b250YWwgcmVzaXplIGFueXdheSBzbyBub3QgdGhhdCB1c2VmdWwgKi8KI2VuZGlmCgogICAgLyogRGlzcGxheSBpdCAqLwogICAgU2hvd1dpbmRvdyh0aGVXaW5kb3cpOwovKiAgQnJpbmdUb0Zyb250KHRoZVdpbmRvdyk7ICovCiAgICBTZWxlY3RXaW5kb3codGhlV2luZG93KTsKCi8qICBEcmF3RGlhbG9nKHRoZURpYWxvZyk7ICovCiNpZiAwCiAgICBHZXRQb3J0KCZvbGRQb3J0KTsKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBTZXRQb3J0RGlhbG9nUG9ydCh0aGVEaWFsb2cpOwojZWxzZQogICAgU2V0UG9ydCh0aGVEaWFsb2cpOwojZW5kaWYKI2VuZGlmCgogICAgLyogSGFuZyB1bnRpbCBvbmUgb2YgdGhlIGJ1dHRvbiBpcyBoaXQgKi8KICAgIGRvCiAgICB7CglNb2RhbERpYWxvZyhuaWwsICZpdGVtSGl0KTsKICAgIH0gd2hpbGUgKChpdGVtSGl0IDwgMSkgfHwgKGl0ZW1IaXQgPiBsYXN0QnV0dG9uKSk7CgogICAgLyogQ29weSBiYWNrIHRoZSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIgaW50byB0aGUgcGFyYW0gKi8KICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKICAgIHsKCUdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwoJR2V0RGlhbG9nSXRlbVRleHQoaXRlbUhhbmRsZSwgKGNoYXJfdSAqKSAmbmFtZSk7CiNpZiBJT1NJWkUgPCAyNTYKCS8qIFRydW5jYXRlIHRoZSBuYW1lIHRvIElPU0laRSBpZiBuZWVkZWQgKi8KCWlmIChuYW1lWzBdID4gSU9TSVpFKQoJICAgIG5hbWVbMF0gPSBJT1NJWkUgLSAxOwojZW5kaWYKCVNUUk5DUFkodGV4dGZpZWxkLCAmbmFtZVsxXSwgbmFtZVswXSk7Cgl0ZXh0ZmllbGRbbmFtZVswXV0gPSBOVUw7CiAgICB9CgogICAgLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgZ3JhcGhpY2FsIHBvcnQgKi8KICAgIFNldFBvcnQob2xkUG9ydCk7CgogICAgLyogR2V0IHJpZGUgb2YgdGggZWRpYWxvZyAoZnJlZSBtZW1vcnkpICovCiAgICBEaXNwb3NlRGlhbG9nKHRoZURpYWxvZyk7CgogICAgcmV0dXJuIGl0ZW1IaXQ7Ci8qCiAqIFVzZWZ1bGwgdGhpbmcgd2hpY2ggY291bGQgYmUgdXNlZAogKiBTZXREaWFsb2dUaW1lb3V0KCk6IEF1dG8gY2xpY2sgYSBidXR0b24gYWZ0ZXIgdGltZW91dAogKiBTZXREaWFsb2dUcmFja3NDdXJzb3IoKSA6IEdldCB0aGUgSS1iZWFtIGN1cnNvciBvdmVyIGlucHV0IGJveAogKiBNb3ZlRGlhbG9nSXRlbSgpOgkgICAgUHJvYmFibHkgYmV0dGVyIHRoYW4gU2V0RGlhbG9nSXRlbQogKiBTaXplRGlhbG9nSXRlbSgpOgkJKGJ1dCBpcyBpdCBDYXJib24gT25seT8pCiAqIEF1dG9TaXplRGlhbG9nKCk6CSAgICBNYWdpYyByZXNpemUgb2YgZGlhbG9nIGJhc2VkIG9uIHRleHQgbGVuZ2h0CiAqLwp9CiNlbmRpZiAvKiBGRUFUX0RJQUxPR19HVUkgKi8KCi8qCiAqIERpc3BsYXkgdGhlIHNhdmVkIGVycm9yIG1lc3NhZ2UocykuCiAqLwojaWZkZWYgVVNFX01DSF9FUlJNU0cKICAgIHZvaWQKZGlzcGxheV9lcnJvcnMoKQp7CiAgICBjaGFyCSpwOwogICAgY2hhcl91CXBFcnJvclsyNTZdOwoKICAgIGlmIChlcnJvcl9nYS5nYV9kYXRhICE9IE5VTEwpCiAgICB7CgkvKiBhdm9pZCBwdXR0aW5nIHVwIGEgbWVzc2FnZSBib3ggd2l0aCBibGFua3Mgb25seSAqLwoJZm9yIChwID0gKGNoYXIgKillcnJvcl9nYS5nYV9kYXRhOyAqcDsgKytwKQoJICAgIGlmICghaXNzcGFjZSgqcCkpCgkgICAgewoJCWlmIChTVFJMRU4ocCkgPiAyNTUpCgkJICAgIHBFcnJvclswXSA9IDI1NTsKCQllbHNlCgkJICAgIHBFcnJvclswXSA9IFNUUkxFTihwKTsKCgkJU1RSTkNQWSgmcEVycm9yWzFdLCBwLCBwRXJyb3JbMF0pOwoJCVBhcmFtVGV4dChwRXJyb3IsIG5pbCwgbmlsLCBuaWwpOwoJCUFsZXJ0KDEyOCwgbmlsKTsKCQlicmVhazsKCQkvKiBUT0RPOiBoYW5kbGVkIG1lc3NhZ2UgbG9uZ2VyIHRoYW4gMjU2IGNoYXJzCgkJICoJIHVzZSBhdXRvLXNpemVhYmxlIGFsZXJ0CgkJICoJIG9yIGRpYWxvZyB3aXRoIHNjcm9sbGJhcnMgKFRleHRFZGl0IHpvbmUpCgkJICovCgkgICAgfQoJZ2FfY2xlYXIoJmVycm9yX2dhKTsKICAgIH0KfQojZW5kaWYKCi8qCiAqIEdldCBjdXJyZW50IG1vdXNlIGNvb3JkaW5hdGVzIGluIHRleHQgd2luZG93LgogKi8KICAgIHZvaWQKZ3VpX21jaF9nZXRtb3VzZShpbnQgKngsIGludCAqeSkKewogICAgUG9pbnQgd2hlcmU7CgogICAgR2V0TW91c2UoJndoZXJlKTsKCiAgICAqeCA9IHdoZXJlLmg7CiAgICAqeSA9IHdoZXJlLnY7Cn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0bW91c2UoeCwgeSkKICAgIGludAkJeDsKICAgIGludAkJeTsKewogICAgLyogVE9ETyAqLwojaWYgMAogICAgLyogRnJvbSBGQVEgMy0xMSAqLwoKICAgIEN1cnNvckRldmljZVB0ciBteU1vdXNlOwogICAgUG9pbnQJICAgIHdoZXJlOwoKICAgIGlmICggICBOR2V0VHJhcEFkZHJlc3MoX0N1cnNvckRldmljZURpc3BhdGNoLCBUb29sVHJhcCkKCSE9IE5HZXRUcmFwQWRkcmVzcyhfVW5pbXBsZW1lbnRlZCwgICBUb29sVHJhcCkpCiAgICB7CgkvKiBOZXcgd2F5ICovCgoJLyoKCSAqIEdldCBmaXJzdCBkZXZvaWNlIHdpdGggb25lIGJ1dHRvbi4KCSAqIFRoaXMgd2lsbCBwcm9iYWJseSBiZSB0aGUgc3RhbmRhZCBtb3VzZQoJICogc3RhcnRhdCBoZWFkIG9mIGN1cnNvciBkZXYgbGlzdAoJICoKCSAqLwoKCW15TW91c2UgPSBuaWw7CgoJZG8KCXsKCSAgICAvKiBHZXQgdGhlIG5leHQgY3Vyc29yIGRldmljZSAqLwoJICAgIEN1cnNvckRldmljZU5leHREZXZpY2UoJm15TW91c2UpOwoJfQoJd2hpbGUgKChteU1vdXNlICE9IG5pbCkgJiYgKG15TW91c2UtPmNudEJ1dHRvbnMgIT0gMSkpOwoKCUN1cnNvckRldmljZU1vdmVUbyhteU1vdXNlLCB4LCB5KTsKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIE9sZCB3YXkgKi8KCXdoZXJlLmggPSB4OwoJd2hlcmUudiA9IHk7CgoJKihQb2ludCAqKVJhd01vdXNlID0gd2hlcmU7CgkqKFBvaW50ICopTVRlbXAgICAgPSB3aGVyZTsKCSooUHRyKSAgICBDcnNyTmV3ICA9IDB4RkZGRjsKICAgIH0KI2VuZGlmCn0KCiAgICB2b2lkCmd1aV9tY2hfc2hvd19wb3B1cG1lbnUobWVudSkKICAgIHZpbW1lbnVfVCAqbWVudTsKewojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKLyoKICogIENsb25lIFBvcFVwIHRvIHVzZSBtZW51CiAqICBDcmVhdGUgYSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCiAqICBDYWxsIHRoZSBwcm9jZWR1cmUKICovCgogICAgTWVudUhhbmRsZQlDbnR4TWVudTsKICAgIFBvaW50CXdoZXJlOwogICAgT1NTdGF0dXMJc3RhdHVzOwogICAgVUludDMyCUNudHhUeXBlOwogICAgU0ludDE2CUNudHhNZW51SUQ7CiAgICBVSW50MTYJQ250eE1lbnVJdGVtOwogICAgU3RyMjU1CUhlbHBOYW1lID0gIiI7CiAgICBHcmFmUHRyCXNhdmVQb3J0OwoKICAgIC8qIFNhdmUgQ3VycmVudCBQb3J0OiBPbiBNYWNPUyBYIHdlIHNlZW0gdG8gbG9zZSB0aGUgcG9ydCAqLwogICAgR2V0UG9ydCgmc2F2ZVBvcnQpOyAvKk9TWCovCgogICAgR2V0TW91c2UoJndoZXJlKTsKICAgIExvY2FsVG9HbG9iYWwoJndoZXJlKTsgLypPU1gqLwogICAgQ250eE1lbnUgPSBtZW51LT5zdWJtZW51X2hhbmRsZTsKCiAgICAvKiBUT0RPOiBHZXQgdGhlIHRleHQgc2VsZWN0aW9uIGZyb20gVmltICovCgogICAgLyogQ2FsbCB0byBIYW5kbGUgUG9wdXAgKi8KICAgIHN0YXR1cyA9IENvbnRleHR1YWxNZW51U2VsZWN0KENudHhNZW51LCB3aGVyZSwgZmFsc2UsIGtDTUhlbHBJdGVtTm9IZWxwLCBIZWxwTmFtZSwgTlVMTCwgJkNudHhUeXBlLCAmQ250eE1lbnVJRCwgJkNudHhNZW51SXRlbSk7CgogICAgaWYgKHN0YXR1cyA9PSBub0VycikKICAgIHsKCWlmIChDbnR4VHlwZSA9PSBrQ01NZW51SXRlbVNlbGVjdGVkKQoJewoJICAgIC8qIEhhbmRsZSB0aGUgbWVudSBDbnR4TWVudUlELCBDbnR4TWVudUl0ZW0gKi8KCSAgICAvKiBUaGUgc3VibWVudSBjYW4gYmUgaGFuZGxlIGRpcmVjdGx5IGJ5IGd1aV9tYWNfaGFuZGxlX21lbnUgKi8KCSAgICAvKiBCdXQgd2hhdCBhYm91dCB0aGUgY3VycmVudCBtZW51LCBpcyB0aGUgbWVudSBjaGFuZ2VkIGJ5IENvbnRleHR1YWxNZW51U2VsZWN0ICovCgkgICAgZ3VpX21hY19oYW5kbGVfbWVudSgoQ250eE1lbnVJRCA8PCAxNikgKyBDbnR4TWVudUl0ZW0pOwoJfQoJZWxzZSBpZiAoQ250eE1lbnVJRCA9PSBrQ01TaG93SGVscFNlbGVjdGVkKQoJewoJICAgIC8qIFNob3VsZCBjb21lIHVwIHdpdGggdGhlIGhlbHAgKi8KCX0KICAgIH0KCiAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIFBvcnQgKi8KICAgIFNldFBvcnQoc2F2ZVBvcnQpOyAvKk9TWCovCiNlbmRpZgp9CgojaWYgZGVmaW5lZChGRUFUX0NXX0VESVRPUikgfHwgZGVmaW5lZChQUk9UTykKLyogVE9ETzogSXMgaXQgbmVlZCBmb3IgTUFDT1NfWD8gKERhbnkpICovCiAgICB2b2lkCm1jaF9wb3N0X2J1ZmZlcl93cml0ZShidWZfVCAqYnVmKQp7CiMgaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoIldyaXRpbmcgQnVmLi4uXG4iKTsKIyBlbmRpZgogICAgR2V0RlNTcGVjRnJvbVBhdGgoYnVmLT5iX2ZmbmFtZSwgJmJ1Zi0+Yl9GU1NwZWMpOwogICAgU2VuZF9LQUhMX01PRF9BRShidWYpOwp9CiNlbmRpZgoKI2lmZGVmIEZFQVRfVElUTEUKLyoKICogU2V0IHRoZSB3aW5kb3cgdGl0bGUgYW5kIGljb24uCiAqIChUaGUgaWNvbiBpcyBub3QgdGFrZW4gY2FyZSBvZikuCiAqLwogICAgdm9pZApndWlfbWNoX3NldHRpdGxlKHRpdGxlLCBpY29uKQogICAgY2hhcl91ICp0aXRsZTsKICAgIGNoYXJfdSAqaWNvbjsKewogICAgLyogVE9ETzogR2V0IHZpbSB0byBtYWtlIHN1cmUgbWF4bGVuIChmcm9tIHBfdGl0bGVsZW4pIGlzIHNtYWxsZXIKICAgICAqICAgICAgIHRoYXQgMjU2LiBFdmVuIGJldHRlciBnZXQgaXQgdG8gZml0IG5pY2VseSBpbiB0aGUgdGl0bGViYXIuCiAgICAgKi8KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKICAgIENGU3RyaW5nUmVmIHdpbmRvd1RpdGxlOwogICAgc2l6ZV90CXdpbmRvd1RpdGxlTGVuOwojZWxzZQogICAgY2hhcl91ICAgKnBhc2NhbFRpdGxlOwojZW5kaWYKCiAgICBpZiAodGl0bGUgPT0gTlVMTCkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KCXJldHVybjsKCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICB3aW5kb3dUaXRsZUxlbiA9IFNUUkxFTih0aXRsZSk7CiAgICB3aW5kb3dUaXRsZSAgPSBtYWNfZW5jX3RvX2Nmc3RyaW5nKHRpdGxlLCB3aW5kb3dUaXRsZUxlbik7CgogICAgaWYgKHdpbmRvd1RpdGxlKQogICAgewoJU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcoZ3VpLlZpbVdpbmRvdywgd2luZG93VGl0bGUpOwoJQ0ZSZWxlYXNlKHdpbmRvd1RpdGxlKTsKICAgIH0KI2Vsc2UKICAgIHBhc2NhbFRpdGxlID0gQzJQYXNjYWxfc2F2ZSh0aXRsZSk7CiAgICBpZiAocGFzY2FsVGl0bGUgIT0gTlVMTCkKICAgIHsKCVNldFdUaXRsZShndWkuVmltV2luZG93LCBwYXNjYWxUaXRsZSk7Cgl2aW1fZnJlZShwYXNjYWxUaXRsZSk7CiAgICB9CiNlbmRpZgp9CiNlbmRpZgoKLyoKICogVHJhbnNmZXJlZCBmcm9tIG9zX21hYy5jIGZvciBNYWNPUyBYIHVzaW5nIG9zX3VuaXguYyBwcmVwIHdvcmsKICovCgogICAgaW50CkMyUGFzY2FsU3RyaW5nKENTdHJpbmcsIFBhc2NhbFN0cmluZykKICAgIGNoYXJfdSAgKkNTdHJpbmc7CiAgICBTdHIyNTUgICpQYXNjYWxTdHJpbmc7CnsKICAgIGNoYXJfdSAqUGFzY2FsUHRyID0gKGNoYXJfdSAqKSBQYXNjYWxTdHJpbmc7CiAgICBpbnQgICAgbGVuOwogICAgaW50ICAgIGk7CgogICAgUGFzY2FsUHRyWzBdID0gMDsKICAgIGlmIChDU3RyaW5nID09IE5VTEwpCglyZXR1cm4gMDsKCiAgICBsZW4gPSBTVFJMRU4oQ1N0cmluZyk7CiAgICBpZiAobGVuID4gMjU1KQoJbGVuID0gMjU1OwoKICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKCVBhc2NhbFB0cltpKzFdID0gQ1N0cmluZ1tpXTsKCiAgICBQYXNjYWxQdHJbMF0gPSBsZW47CgogICAgcmV0dXJuIDA7Cn0KCiAgICBpbnQKR2V0RlNTcGVjRnJvbVBhdGgoZmlsZSwgZmlsZUZTU3BlYykKICAgIGNoYXJfdSAqZmlsZTsKICAgIEZTU3BlYyAqZmlsZUZTU3BlYzsKewogICAgLyogRnJvbSBGQVEgOC0xMiAqLwogICAgU3RyMjU1ICAgICAgZmlsZVBhc2NhbDsKICAgIENJbmZvUEJSZWMJbXlDUEI7CiAgICBPU0VycgllcnI7CgogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKGZpbGUsICZmaWxlUGFzY2FsKTsKCiAgICBteUNQQi5kaXJJbmZvLmlvTmFtZVB0ciAgID0gZmlsZVBhc2NhbDsKICAgIG15Q1BCLmRpckluZm8uaW9WUmVmTnVtICAgPSAwOwogICAgbXlDUEIuZGlySW5mby5pb0ZEaXJJbmRleCA9IDA7CiAgICBteUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gMDsKCiAgICBlcnI9IFBCR2V0Q2F0SW5mbygmbXlDUEIsIGZhbHNlKTsKCiAgICAvKiAgICB2UmVmTnVtLCBkaXJJRCwgbmFtZSAqLwogICAgRlNNYWtlRlNTcGVjKDAsIDAsIGZpbGVQYXNjYWwsIGZpbGVGU1NwZWMpOwoKICAgIC8qIFRPRE86IFVzZSBhbiBlcnJvciBjb2RlIG1lY2hhbmlzbSAqLwogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIENvbnZlcnQgYSBGU1NwZWMgdG8gYSBmdWlsbCBwYXRoCiAqLwoKY2hhcl91ICpGdWxsUGF0aEZyb21GU1NwZWNfc2F2ZShGU1NwZWMgZmlsZSkKewogICAgLyoKICAgICAqIFRPRE86IEFkZCBwcm90ZWN0aW9uIGZvciAyNTYgY2hhciBtYXguCiAgICAgKi8KCiAgICBDSW5mb1BCUmVjCXRoZUNQQjsKICAgIGNoYXJfdQlmbmFtZVsyNTZdOwogICAgY2hhcl91CSpmaWxlbmFtZVB0ciA9IGZuYW1lOwogICAgT1NFcnIJZXJyb3I7CiAgICBpbnQJCWZvbGRlciA9IDE7CiNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCiAgICBTSW50MTYJZGZsdFZvbF92UmVmTnVtOwogICAgU0ludDMyCWRmbHRWb2xfZGlySUQ7CiAgICBGU1JlZglyZWZGaWxlOwogICAgT1NTdGF0dXMJc3RhdHVzOwogICAgVUludDMyCXBhdGhTaXplID0gMjU2OwogICAgY2hhcl91CXBhdGhuYW1lWzI1Nl07CiAgICBjaGFyX3UJKnBhdGggPSBwYXRobmFtZTsKI2Vsc2UKICAgIFN0cjI1NQlkaXJlY3RvcnlOYW1lOwogICAgY2hhcl91CXRlbXBvcmFyeVsyNTVdOwogICAgY2hhcl91CSp0ZW1wb3JhcnlQdHIgPSB0ZW1wb3Jhcnk7CiNlbmRpZgoKI2lmZGVmIFVTRV9VTklYRklMRU5BTUUKICAgIC8qIEdldCB0aGUgZGVmYXVsdCB2b2x1bWUgKi8KICAgIC8qIFRPRE86IFJlbW92ZSBhcyB0aGlzIG9ubHkgd29yayBpZiBWaW0gaXMgb24gdGhlIEJvb3QgVm9sdW1lKi8KICAgIGVycm9yPUhHZXRWb2woTlVMTCwgJmRmbHRWb2xfdlJlZk51bSwgJmRmbHRWb2xfZGlySUQpOwoKICAgIGlmIChlcnJvcikKICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgoKICAgIC8qIFN0YXJ0IGZpbGxpbmcgZm5hbWUgd2l0aCBmaWxlLm5hbWUgICovCiAgICBTVFJOQ1BZKGZpbGVuYW1lUHRyLCAmZmlsZS5uYW1lWzFdLCBmaWxlLm5hbWVbMF0pOwogICAgZmlsZW5hbWVQdHJbZmlsZS5uYW1lWzBdXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KCiAgICAvKiBHZXQgdGhlIGluZm8gYWJvdXQgdGhlIGZpbGUgc3BlY2lmaWVkIGluIEZTU3BlYyAqLwogICAgdGhlQ1BCLmRpckluZm8uaW9GRGlySW5kZXggPSAwOwogICAgdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBmaWxlLm5hbWU7CiAgICB0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0gICA9IGZpbGUudlJlZk51bTsKICAvKnRoZUNQQi5oRmlsZUluZm8uaW9EaXJJRCAgID0gMDsqLwogICAgdGhlQ1BCLmRpckluZm8uaW9EckRpcklEICAgPSBmaWxlLnBhcklEOwoKICAgIC8qIEFzIGlvRkRpckluZGV4ID0gMCwgZ2V0IHRoZSBpbmZvIG9mIGlvTmFtZVB0ciwKICAgICAgIHdoaWNoIGlzIHJlbGF0aXZlIHRvIGlvVnJlZk51bSwgaW9EaXJJRCAqLwogICAgZXJyb3IgPSBQQkdldENhdEluZm8oJnRoZUNQQiwgZmFsc2UpOwoKICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZm9yIGEgbmV3IGZpbGUgd2UgZXhwZWN0IGZuZkVyciAqLwogICAgaWYgKChlcnJvcikgJiYgKGVycm9yICE9IGZuZkVycikpCiAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qIENoZWNrIGlmIGl0J3MgYSBmaWxlIG9yIGZvbGRlciAgICAgICAqLwogICAgLyogZGVmYXVsdCB0byBmaWxlIGlmIGZpbGUgZG9uJ3QgZXhpc3QgICovCiAgICBpZiAoKCh0aGVDUEIuaEZpbGVJbmZvLmlvRmxBdHRyaWIgJiBpb0Rpck1hc2spID09IDApIHx8IChlcnJvcikpCiAgICAgIGZvbGRlciA9IDA7IC8qIEl0J3Mgbm90IGEgZm9sZGVyICovCiAgICBlbHNlCiAgICAgIGZvbGRlciA9IDE7CgojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQogICAgLyoKICAgICAqIFRoZSBmdW5jdGlvbiB1c2VkIGhlcmUgYXJlIGF2YWlsYWJsZSBpbiBDYXJib24sIGJ1dAogICAgICogZG8gbm90aGluZyB1bmUgTWFjT1MgOCBhbmQgOQogICAgICovCiAgICBpZiAoZXJyb3IgPT0gZm5mRXJyKQogICAgewoJLyogSWYgdGhlIGZpbGUgdG8gYmUgc2F2ZWQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgaXNuJ3QgcG9zc2libGUKCSAgIHRvIGNvbnZlcnQgaXRzIEZTU3BlYyBpbnRvIGFuIEZTUmVmLiAgQnV0IHdlIGNhbiBjb25zdHJ1Y3QgYW4KCSAgIEZTU3BlYyBmb3IgdGhlIGZpbGUncyBwYXJlbnQgZm9sZGVyIChzaW5jZSB3ZSBoYXZlIGl0cyB2b2x1bWUgYW5kCgkgICBkaXJlY3RvcnkgSURzKSwgYW5kIHNpbmNlIHRoYXQgZm9sZGVyIGRvZXMgZXhpc3QsIHdlIGNhbiBjb252ZXJ0CgkgICB0aGF0IEZTU3BlYyBpbnRvIGFuIEZTUmVmLCBjb252ZXJ0IHRoZSBGU1JlZiBpbiB0dXJuIGludG8gYSBwYXRoLAoJICAgYW5kLCBmaW5hbGx5LCBhcHBlbmQgdGhlIGZpbGVuYW1lLiAqLwoJRlNTcGVjIGRpclNwZWM7CglGU1JlZiBkaXJSZWY7CglTdHIyNTUgZW1wdHlGaWxlbmFtZSA9ICJccCI7CgllcnJvciA9IEZTTWFrZUZTU3BlYyh0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0sCgkgICAgdGhlQ1BCLmRpckluZm8uaW9EckRpcklELCBlbXB0eUZpbGVuYW1lLCAmZGlyU3BlYyk7CglpZiAoZXJyb3IpCgkgICAgcmV0dXJuIE5VTEw7CgoJZXJyb3IgPSBGU3BNYWtlRlNSZWYoJmRpclNwZWMsICZkaXJSZWYpOwoJaWYgKGVycm9yKQoJICAgIHJldHVybiBOVUxMOwoKCXN0YXR1cyA9IEZTUmVmTWFrZVBhdGgoJmRpclJlZiwgKFVJbnQ4KilwYXRoLCBwYXRoU2l6ZSk7CglpZiAoc3RhdHVzKQoJICAgIHJldHVybiBOVUxMOwoKCVNUUkNBVChwYXRoLCAiLyIpOwoJU1RSQ0FUKHBhdGgsIGZpbGVuYW1lUHRyKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIElmIHRoZSBmaWxlIHRvIGJlIHNhdmVkIGFscmVhZHkgZXhpc3RzLCB3ZSBjYW4gZ2V0IGl0cyBmdWxsIHBhdGgKCSAgIGJ5IGNvbnZlcnRpbmcgaXRzIEZTU3BlYyBpbnRvIGFuIEZTUmVmLiAqLwoJZXJyb3I9RlNwTWFrZUZTUmVmKCZmaWxlLCAmcmVmRmlsZSk7CglpZiAoZXJyb3IpCgkgICAgcmV0dXJuIE5VTEw7CgoJc3RhdHVzPUZTUmVmTWFrZVBhdGgoJnJlZkZpbGUsIChVSW50OCAqKSBwYXRoLCBwYXRoU2l6ZSk7CglpZiAoc3RhdHVzKQoJICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIEFkZCBhIHNsYXNoIGF0IHRoZSBlbmQgaWYgbmVlZGVkICovCiAgICBpZiAoZm9sZGVyKQoJU1RSQ0FUKHBhdGgsICIvIik7CgogICAgcmV0dXJuICh2aW1fc3Ryc2F2ZShwYXRoKSk7CiNlbHNlCiAgICAvKiBUT0RPOiBHZXQgcmlkIG9mIGFsbCBVU0VfVU5JWEZJTEVOQU1FIGJlbG93ICovCiAgICAvKiBTZXQgaW9OYW1lUHRyLCBpdCdzIHRoZSBzYW1lIGFyZWEgd2hpY2ggaXMgYWx3YXlzIHJldXNlZC4gKi8KICAgIHRoZUNQQi5kaXJJbmZvLmlvTmFtZVB0ciA9IGRpcmVjdG9yeU5hbWU7CgogICAgLyogVHJpY2sgZm9yIGZpcnN0IGVudHJ5LCBzZXQgaW9EclBhcklEIHRvIHRoZSBmaXJzdCB2YWx1ZQogICAgICogd2Ugd2FudCBmb3IgaW9EckRpcklEKi8KICAgIHRoZUNQQi5kaXJJbmZvLmlvRHJQYXJJRCA9IGZpbGUucGFySUQ7CiAgICB0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgPSBmaWxlLnBhcklEOwoKICAgIGlmICgoVFJVRSkgJiYgKGZpbGUucGFySUQgIT0gZnNSdERpcklEIC8qZnNSdFBhcklEKi8pKQogICAgZG8KICAgIHsKCXRoZUNQQi5kaXJJbmZvLmlvRkRpckluZGV4ID0gLTE7CiAgICAgLyogdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBkaXJlY3RvcnlOYW1lOyBBbHJlYWR5IGRvbmUgYWJvdmUuICovCgl0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0gICA9IGZpbGUudlJlZk51bTsKICAgICAvKiB0aGVDUEIuZGlySW5mby5pb0RpcklEICAgICA9IGlycmV2ZWxhbnQgd2hlbiBpb0ZEaXJJbmRleCA9IC0xICovCgl0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgICA9IHRoZUNQQi5kaXJJbmZvLmlvRHJQYXJJRDsKCgkvKiBBcyBpb0ZEaXJJbmRleCA9IC0xLCBnZXQgdGhlIGluZm8gb2YgaW9EckRpcklELCAqLwoJLyogICppb05hbWVQdHJbMCBUTyAzMV0gd2lsbCBiZSB1cGRhdGVkCQkgICAqLwoJZXJyb3IgPSBQQkdldENhdEluZm8oJnRoZUNQQixmYWxzZSk7CgoJaWYgKGVycm9yKQoJICByZXR1cm4gTlVMTDsKCgkvKiBQdXQgdGhlIG5ldyBkaXJlY3RvcnlOYW1lIGluIGZyb250IG9mIHRoZSBjdXJyZW50IGZuYW1lICovCglTVFJDUFkodGVtcG9yYXJ5UHRyLCBmaWxlbmFtZVB0cik7CglTVFJOQ1BZKGZpbGVuYW1lUHRyLCAmZGlyZWN0b3J5TmFtZVsxXSwgZGlyZWN0b3J5TmFtZVswXSk7CglmaWxlbmFtZVB0cltkaXJlY3RvcnlOYW1lWzBdXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KCVNUUkNBVChmaWxlbmFtZVB0ciwgIjoiKTsKCVNUUkNBVChmaWxlbmFtZVB0ciwgdGVtcG9yYXJ5UHRyKTsKICAgIH0KI2lmIDEgLyogZGVmIFVTRV9VTklYRklMRU5BTUUgKi8KICAgIHdoaWxlICgodGhlQ1BCLmRpckluZm8uaW9EclBhcklEICE9IGZzUnREaXJJRCkgLyogJiYgKi8KCSAvKiAgKHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAhPSBmc1J0RGlySUQpKi8pOwojZWxzZQogICAgd2hpbGUgKHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAhPSBmc1J0RGlySUQpOwojZW5kaWYKCiAgICAvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2b2x1bWUgb24gd2hpY2ggdGhlIGZpbGUgcmVzaWRlICovCiAgICB0aGVDUEIuZGlySW5mby5pb0ZEaXJJbmRleCA9IC0xOwogLyogdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBkaXJlY3RvcnlOYW1lOyBBbHJlYWR5IGRvbmUgYWJvdmUuICovCiAgICB0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0gICA9IGZpbGUudlJlZk51bTsKIC8qIHRoZUNQQi5kaXJJbmZvLmlvRGlySUQgICAgID0gaXJyZXZlbGFudCB3aGVuIGlvRkRpckluZGV4ID0gLTEgKi8KICAgIHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gdGhlQ1BCLmRpckluZm8uaW9EclBhcklEOwoKICAgIC8qIEFzIGlvRkRpckluZGV4ID0gLTEsIGdldCB0aGUgaW5mbyBvZiBpb0RyRGlySUQsICovCiAgICAvKgkqaW9OYW1lUHRyWzAgVE8gMzFdIHdpbGwgYmUgdXBkYXRlZAkgICAgICAgKi8KICAgIGVycm9yID0gUEJHZXRDYXRJbmZvKCZ0aGVDUEIsZmFsc2UpOwoKICAgIGlmIChlcnJvcikKICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogRm9yIE1hY09TIENsYXNzaWMgYWx3YXlzIGFkZCB0aGUgdm9sdW1lIG5hbWUJICAgICAqLwogICAgLyogRm9yIE1hY09TIFggYWRkIHRoZSB2b2x1bWUgbmFtZSBwcmVjZWRlZCBieSAiVm9sdW1lcyIgKi8KICAgIC8qCXdoZW4gd2UgYXJlIG5vdCByZWZlcmluZyB0byB0aGUgYm9vdCB2b2x1bWUJICAgICAqLwojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQogICAgaWYgKGZpbGUudlJlZk51bSAhPSBkZmx0Vm9sX3ZSZWZOdW0pCiNlbmRpZgogICAgewoJLyogQWRkIHRoZSB2b2x1bWUgbmFtZSAqLwoJU1RSQ1BZKHRlbXBvcmFyeVB0ciwgZmlsZW5hbWVQdHIpOwoJU1RSTkNQWShmaWxlbmFtZVB0ciwgJmRpcmVjdG9yeU5hbWVbMV0sIGRpcmVjdG9yeU5hbWVbMF0pOwoJZmlsZW5hbWVQdHJbZGlyZWN0b3J5TmFtZVswXV0gPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCglTVFJDQVQoZmlsZW5hbWVQdHIsICI6Iik7CglTVFJDQVQoZmlsZW5hbWVQdHIsIHRlbXBvcmFyeVB0cik7CgojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQoJU1RSQ1BZKHRlbXBvcmFyeVB0ciwgZmlsZW5hbWVQdHIpOwoJZmlsZW5hbWVQdHJbMF0gPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCglTVFJDQVQoZmlsZW5hbWVQdHIsICJWb2x1bWVzOiIpOwoJU1RSQ0FUKGZpbGVuYW1lUHRyLCB0ZW1wb3JhcnlQdHIpOwojZW5kaWYKICAgIH0KCiAgICAvKiBBcHBlbmQgZmluYWwgcGF0aCBzZXBhcmF0b3IgaWYgaXQncyBhIGZvbGRlciAqLwogICAgaWYgKGZvbGRlcikKCVNUUkNBVChmbmFtZSwgIjoiKTsKCiAgICAvKiBBcyB3ZSB1c2UgVW5peCBGaWxlIE5hbWUgZm9yIE1hY09TIFggY29udmVydCBpdCAqLwojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQogICAgLyogTmVlZCB0byBpbnNlcnQgbGVhZGluZyAvICovCiAgICAvKiBUT0RPOiBnZXQgdGhlIGFib3ZlIGNvZGUgdG8gdXNlIGRpcmVjdGx5IHRoZSAvICovCiAgICBTVFJDUFkoJnRlbXBvcmFyeVB0clsxXSwgZmlsZW5hbWVQdHIpOwogICAgdGVtcG9yYXJ5UHRyWzBdID0gJy8nOwogICAgU1RSQ1BZKGZpbGVuYW1lUHRyLCB0ZW1wb3JhcnlQdHIpOwogICAgewogICAgY2hhcgkqcDsKICAgIGZvciAocCA9IGZuYW1lOyAqcDsgcCsrKQoJaWYgKCpwID09ICc6JykKCSAgICAqcCA9ICcvJzsKICAgIH0KI2VuZGlmCgogICAgcmV0dXJuICh2aW1fc3Ryc2F2ZShmbmFtZSkpOwojZW5kaWYKfQoKI2lmIGRlZmluZWQoVVNFX0lNX0NPTlRST0wpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIElucHV0IE1ldGhvZCBDb250cm9sIGZ1bmN0aW9ucy4KICovCgovKgogKiBOb3RpZnkgY3Vyc29yIHBvc2l0aW9uIHRvIElNLgogKi8KICAgIHZvaWQKaW1fc2V0X3Bvc2l0aW9uKGludCByb3csIGludCBjb2wpCnsKICAgIC8qIFRPRE86IEltcGxlbWVudCBtZSEgKi8KfQoKLyoKICogU2V0IElNIHN0YXR1cyBvbiAoImFjdGl2ZSIgaXMgVFJVRSkgb3Igb2ZmICgiYWN0aXZlIiBpcyBGQUxTRSkuCiAqLwogICAgdm9pZAppbV9zZXRfYWN0aXZlKGludCBhY3RpdmUpCnsKICAgIEtleVNjcmlwdChhY3RpdmUgPyBzbUtleVN5c1NjcmlwdCA6IHNtS2V5Um9tYW4pOwp9CgovKgogKiBHZXQgSU0gc3RhdHVzLiAgV2hlbiBJTSBpcyBvbiwgcmV0dXJuIG5vdCAwLiAgRWxzZSByZXR1cm4gMC4KICovCiAgICBpbnQKaW1fZ2V0X3N0YXR1cygpCnsKICAgIFNJbnQzMiBzY3JpcHQgPSBHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LZXlTY3JpcHQpOwogICAgcmV0dXJuIChzY3JpcHQgIT0gc21Sb21hbgoJICAgICYmIHNjcmlwdCA9PSBHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21TeXNTY3JpcHQpKSA/IDEgOiAwOwp9CiNlbmRpZiAvKiBkZWZpbmVkKFVTRV9JTV9DT05UUk9MKSB8fCBkZWZpbmVkKFBST1RPKSAqLwo=