LyoKICogQ29weXJpZ2h0IDIwMTAtMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCiAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4xLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQogKiAwMjExMC0xMzAxIFVTQS4KICoKICogRGlzY2xhaW1lcjogVGhlIGNvZGVzIGNvbnRhaW5lZCBpbiB0aGVzZSBtb2R1bGVzIG1heSBiZSBzcGVjaWZpYwogKiB0byB0aGUgSW50ZWwgU29mdHdhcmUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0gY29kZW5hbWVkIEtuaWdodHMgRmVycnksCiAqIGFuZCB0aGUgSW50ZWwgcHJvZHVjdCBjb2RlbmFtZWQgS25pZ2h0cyBDb3JuZXIsIGFuZCBhcmUgbm90IGJhY2t3YXJkCiAqIGNvbXBhdGlibGUgd2l0aCBvdGhlciBJbnRlbCBwcm9kdWN0cy4gQWRkaXRpb25hbGx5LCBJbnRlbCB3aWxsIE5PVAogKiBzdXBwb3J0IHRoZSBjb2RlcyBvciBpbnN0cnVjdGlvbiBzZXQgaW4gZnV0dXJlIHByb2R1Y3RzLgogKgogKiBJbnRlbCBvZmZlcnMgbm8gd2FycmFudHkgb2YgYW55IGtpbmQgcmVnYXJkaW5nIHRoZSBjb2RlLiBUaGlzIGNvZGUgaXMKICogbGljZW5zZWQgb24gYW4gIkFTIElTIiBiYXNpcyBhbmQgSW50ZWwgaXMgbm90IG9ibGlnYXRlZCB0byBwcm92aWRlCiAqIGFueSBzdXBwb3J0LCBhc3Npc3RhbmNlLCBpbnN0YWxsYXRpb24sIHRyYWluaW5nLCBvciBvdGhlciBzZXJ2aWNlcwogKiBvZiBhbnkga2luZC4gSW50ZWwgaXMgYWxzbyBub3Qgb2JsaWdhdGVkIHRvIHByb3ZpZGUgYW55IHVwZGF0ZXMsCiAqIGVuaGFuY2VtZW50cyBvciBleHRlbnNpb25zLiBJbnRlbCBzcGVjaWZpY2FsbHkgZGlzY2xhaW1zIGFueSB3YXJyYW50eQogKiBvZiBtZXJjaGFudGFiaWxpdHksIG5vbi1pbmZyaW5nZW1lbnQsIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyCiAqIHB1cnBvc2UsIGFuZCBhbnkgb3RoZXIgd2FycmFudHkuCiAqCiAqIEZ1cnRoZXIsIEludGVsIGRpc2NsYWltcyBhbGwgbGlhYmlsaXR5IG9mIGFueSBraW5kLCBpbmNsdWRpbmcgYnV0CiAqIG5vdCBsaW1pdGVkIHRvIGxpYWJpbGl0eSBmb3IgaW5mcmluZ2VtZW50IG9mIGFueSBwcm9wcmlldGFyeSByaWdodHMsCiAqIHJlbGF0aW5nIHRvIHRoZSB1c2Ugb2YgdGhlIGNvZGUsIGV2ZW4gaWYgSW50ZWwgaXMgbm90aWZpZWQgb2YgdGhlCiAqIHBvc3NpYmlsaXR5IG9mIHN1Y2ggbGlhYmlsaXR5LiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBhbiBJbnRlbAogKiBsaWNlbnNlIGFncmVlbWVudCBwcm92aWRlZCB3aXRoIHRoaXMgY29kZSBhbmQgYWdyZWVkIHVwb24gd2l0aCBJbnRlbCwKICogbm8gbGljZW5zZSwgZXhwcmVzcyBvciBpbXBsaWVkLCBieSBlc3RvcHBlbCBvciBvdGhlcndpc2UsIHRvIGFueQogKiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIGdyYW50ZWQgaGVyZWluLgogKi8KCiNpZm5kZWYgX0NPSUJVRkZFUl9TT1VSQ0VfSAojZGVmaW5lIF9DT0lCVUZGRVJfU09VUkNFX0gKCi8qKiBAaW5ncm91cCBDT0lCdWZmZXIKICogIEBhZGR0b2dyb3VwIENPSUJ1ZmZlclNvdXJjZQpAewoKKiBAZmlsZSBzb3VyY2VcQ09JQnVmZmVyX3NvdXJjZS5oCiovCiNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCiAgICAjaW5jbHVkZSAiLi4vY29tbW9uL0NPSVR5cGVzX2NvbW1vbi5oIgogICAgI2luY2x1ZGUgIi4uL2NvbW1vbi9DT0lSZXN1bHRfY29tbW9uLmgiCiNlbmRpZiAvLyBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gVGhlIHZhbGlkIGJ1ZmZlciB0eXBlcyB0aGF0IG1heSBiZSBjcmVhdGVkIHVzaW5nIENPSUJ1ZmZlckNyZWF0ZS4KLy8vIFBsZWFzZSBzZWUgdGhlIENPSV9WQUxJRF9CVUZGRVJfVFlQRVNfQU5EX0ZMQUdTIG1hdHJpeAovLy8gYmVsb3cgd2hpY2ggZGVzY3JpYmVzIHRoZSB2YWxpZCBjb21iaW5hdGlvbnMgb2YgYnVmZmVyIHR5cGVzIGFuZCBmbGFncy4KLy8vCnR5cGVkZWYgZW51bSBDT0lfQlVGRkVSX1RZUEUKewogICAgLy8vIE5vcm1hbCBidWZmZXJzIGV4aXN0IGFzIGEgc2luZ2xlIHBoeXNpY2FsIGJ1ZmZlciBpbiBlaXRoZXIgU291cmNlIG9yCiAgICAvLy8gU2luayBwaHlzaWNhbCBtZW1vcnkuIE1hcHBpbmcgdGhlIGJ1ZmZlciBtYXkgc3RhbGwgdGhlIHBpcGVsaW5lcy4KICAgIENPSV9CVUZGRVJfTk9STUFMID0gMSwKCiAgICAvLyBSZXNlcnZlZCB2YWx1ZXMsIG5vdCB1c2VkIGJ5IENPSSBhbnkgbW9yZQogICAgQ09JX0JVRkZFUl9SRVNFUlZFRF8xLAogICAgQ09JX0JVRkZFUl9SRVNFUlZFRF8yLAogICAgQ09JX0JVRkZFUl9SRVNFUlZFRF8zLAoKICAgIC8vLyBPcGVuQ0wgYnVmZmVycyBhcmUgc2ltaWxhciB0byBOb3JtYWwgYnVmZmVycyBleGNlcHQgdGhleSBkb24ndAogICAgLy8vIHN0YWxsIHBpcGVsaW5lcyBhbmQgZG9uJ3QgZm9sbG93IGFueSByZWFkIHdyaXRlIGRlcGVuZGVuY2llcy4KICAgIENPSV9CVUZGRVJfT1BFTkNMCgp9IENPSV9CVUZGRVJfVFlQRTsKCgovLy8gQG5hbWUgQ09JQlVGRkVSIGNyZWF0aW9uIGZsYWdzLgovLy8gUGxlYXNlIHNlZSB0aGUgQ09JX1ZBTElEX0JVRkZFUl9UWVBFU19BTkRfRkxBR1MgbWF0cml4Ci8vLyBiZWxvdyB3aGljaCBkZXNjcmliZXMgdGhlIHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBidWZmZXIgdHlwZXMgYW5kIGZsYWdzLgovL0B7CgovLy8gQ3JlYXRlIHRoZSBidWZmZXIgc3VjaCB0aGF0IGl0IGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYWxsIG9mIHRoZQovLy8gc2luayBwcm9jZXNzZXMgd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLgojZGVmaW5lIENPSV9TQU1FX0FERFJFU1NfU0lOS1MgICAgICAgICAgICAgMHgwMDAwMDAwMQoKLy8vIENyZWF0ZSB0aGUgYnVmZmVyIHN1Y2ggdGhhdCBpdCBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGFsbCBvZiB0aGUKLy8vIHNpbmsgcHJvY2Vzc2VzIHdpdGggd2hpY2ggaXQgaXMgYXNzb2NpYXRlZCBhbmQgaW4gdGhlIHNvdXJjZSBwcm9jZXNzLgojZGVmaW5lIENPSV9TQU1FX0FERFJFU1NfU0lOS1NfQU5EX1NPVVJDRSAgMHgwMDAwMDAwMgoKLy8vIEhpbnQgdG8gdGhlIHJ1bnRpbWUgdGhhdCB0aGUgc291cmNlIHdpbGwgZnJlcXVlbnRseSByZWFkIHRoZSBidWZmZXIKI2RlZmluZSBDT0lfT1BUSU1JWkVfU09VUkNFX1JFQUQgICAgICAgICAgIDB4MDAwMDAwMDQKCi8vLyBIaW50IHRvIHRoZSBydW50aW1lIHRoYXQgdGhlIHNvdXJjZSB3aWxsIGZyZXF1ZW50bHkgd3JpdGUgdGhlIGJ1ZmZlcgojZGVmaW5lIENPSV9PUFRJTUlaRV9TT1VSQ0VfV1JJVEUgICAgICAgICAgMHgwMDAwMDAwOAoKLy8vIEhpbnQgdG8gdGhlIHJ1bnRpbWUgdGhhdCB0aGUgc2luayB3aWxsIGZyZXF1ZW50bHkgcmVhZCB0aGUgYnVmZmVyCiNkZWZpbmUgQ09JX09QVElNSVpFX1NJTktfUkVBRCAgICAgICAgICAgICAweDAwMDAwMDEwCgovLy8gSGludCB0byB0aGUgcnVudGltZSB0aGF0IHRoZSBzaW5rIHdpbGwgZnJlcXVlbnRseSB3cml0ZSB0aGUgYnVmZmVyCiNkZWZpbmUgQ09JX09QVElNSVpFX1NJTktfV1JJVEUgICAgICAgICAgICAweDAwMDAwMDIwCgovLy8gVXNlZCB0byBkZWxheSB0aGUgcGlubmluZyBvZiBtZW1vcnkgaW50byBwaHlzaWNhbCBwYWdlcywgdW50aWwgcmVxdWlyZWQKLy8vIGZvciBETUEuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGVsYXkgdGhlIGNvc3Qgb2YgdGltZSBzcGVudCBwaW5uaW5nIG1lbW9yeQovLy8gdW50aWwgYWJzb2x1dGVseSBuZWNlc3NhcnkuIE1pZ2h0IHNwZWVkIHVwIHRoZSBleGVjdXRpb24gb2YgQ09JQnVmZmVyQ3JlYXRlCi8vLyBjYWxscywgYnV0IHNsb3cgZG93biB0aGUgZmlyc3QgYWNjZXNzIG9mIHRoZSBidWZmZXIgaW4KLy8vIENPSVBpcGVsaW5lUnVuRnVuY3Rpb24ocykgb3Igb3RoZXIgQ09JQnVmZmVyIGFjY2VzcyBBUEkncy4KLy8vIEFsc28gb2YgaW1wb3J0YW50IG5vdGUsIHRoYXQgd2l0aCB0aGlzIGZsYWcgZW5hYmxlZCBDT0kgd2lsbCBub3QgYmUgYWJsZSB0bwovLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWVtb3J5IGlzIHJlYWQgb25seS4gT3JkaW5hcmlseSB0aGlzIGlzIGNoZWNrZWQKLy8vIGFuZCBhbiBlcnJvciBpcyB0aHJvd24gdXBvbiBidWZmZXIgY3JlYXRpb24uIFdpdGggdGhpcyBmbGFnLCB0aGUgZXJyb3IKLy8vIG1pZ2h0IG9jY3VyIGxhdGVyLCBhbmQgY2F1c2UgdW5kZXRlcm1pbmVkIGJlaGF2aW9yLiBCZSBzdXJlIHRvIGFsd2F5cwovLy8gdXNlIHdyaXRhYmxlIG1lbW9yeSBmb3IgQ09JQnVmZmVycy4KI2RlZmluZSBDT0lfT1BUSU1JWkVfTk9fRE1BICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKCi8vLyBIaW50IHRvIHRoZSBydW50aW1lIHRvIHRyeSB0byB1c2UgaHVnZSBwYWdlIHNpemVzIGZvciBiYWNraW5nIHN0b3JlIG9uIHRoZQovLy8gc2luay4gSXMgY3VycmVudGx5IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFNBTUVfQUREUkVTUwovLy8gZmxhZ3Mgb3IgdGhlIFNJTktfTUVNT1JZIGZsYWcuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBpcyBhIGhpbnQKLy8vIGFuZCBpbnRlcm5hbGx5IHRoZSBydW50aW1lIG1heSBub3QgYWN0dWFsbHkgcHJvbW90ZSB0byBodWdlIHBhZ2VzLgovLy8gU3BlY2lmaWNhbGx5IGlmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsIChsZXNzIHRoYW4gNEtpQiBmb3IgZXhhbXBsZSkgdGhlbgovLy8gdGhlIHJ1bnRpbWUgd2lsbCBub3QgcHJvbW90ZSB0aGUgYnVmZmVyIHRvIHVzZSBodWdlIHBhZ2VzLgojZGVmaW5lIENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRSAgICAgICAgMHgwMDAwMDA4MAoKLy8vIFVzZWQgdG8gdGVsbCBJbnRlbChSKSBDb3Byb2Nlc3NvciBPZmZsb2FkIEluZnJhc3RydWN0dXJlIChJbnRlbChSKSBDT0kpCi8vLyB0byBjcmVhdGUgYSBidWZmZXIgdXNpbmcgbWVtb3J5IHRoYXQgaGFzIGFscmVhZHkgYmVlbgovLy8gYWxsb2NhdGVkIG9uIHRoZSBzaW5rLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCB3aGVuIHBhc3NlZCBpbiB0byB0aGUKLy8vIENPSUJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkgQVBJLgojZGVmaW5lIENPSV9TSU5LX01FTU9SWSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAoKLy9AfQoKI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKLy8gTWFrZSB0aGUgZmxhZyBtYXNrCiNpZmRlZiBGCiN1bmRlZiBGCiNlbmRpZgojZGVmaW5lIEYgMAojaWZkZWYgVAojdW5kZWYgVAojZW5kaWYKI2RlZmluZSBUIDEKI2RlZmluZSBNVE0oX0JVRkZFUiwgQjEsIEIyLCBCMywgQjQsIEI1LCBCNiwgQjcsIEI4LCBCOSkgXAogICAgKEIxIHwgQjI8PDEgfCBCMzw8MiB8IEI0PDwzIHwgQjU8PDQgfCBCNjw8NSB8IEI3PDw2IHwgQjg8PDcgfCBCOTw8OCkKI2VuZGlmCgovLy8gXGVudW0gQ09JX0JVRkZFUl9UWVBFCi8vLyBUaGlzIG1hdHJpeCBzaG93cyB0aGUgdmFsaWQgY29tYmluYXRpb25zIG9mIGJ1ZmZlciB0eXBlcyBhbmQgYnVmZmVyIGZsYWdzCi8vLyB0aGF0IG1heSBiZSBwYXNzZWQgaW4gdG8gQ09JQnVmZmVyQ3JlYXRlIGFuZCBDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5LgovLy8gXGNvZGUKc3RhdGljIGNvbnN0IHVpbnQ2NF90CkNPSV9WQUxJRF9CVUZGRVJfVFlQRVNfQU5EX0ZMQUdTW0NPSV9CVUZGRVJfT1BFTkNMICsgMV0gPQp7CiAgICAvKiAgICAgICAgICAgfCAgICAgICB8IFNBTUUgfCAgICAgIHwgICAgICAgfCAgICAgIHwgICAgICAgfCAgICAgfCAgICAgIHwgICAgICB8CiAgICAgICAgICAgICAgICAgfCBTQU1FICB8IEFERFIgfCBPUFQgIHwgT1BUICAgfCBPUFQgIHwgT1BUICAgfCBPUFQgfCBIVUdFIHwgQ09JICB8CiAgICAgICAgICAgICAgICAgfCBBRERSICB8IFNJTksgfCBTUkMgIHwgU1JDICAgfCBTSU5LIHwgU0lOSyAgfCBOTyAgfCBQQUdFIHwgU0lOSyB8CiAgICAgICAgICAgICAgICAgfCBTSU5LUyB8IFNSQyAgfCBSRUFEIHwgV1JJVEUgfCBSRUFEIHwgV1JJVEUgfCBETUEgfCBTSVpFIHwgTUVNICB8CiAgICAgICAgICAgICAgICAgKy0tLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSovCiAgICBNVE0oSU5WQUxJRCAgICwgICBGICAgLCAgIEYgICwgICBGICAsICAgRiAgICwgICBGICAsICAgRiAgICwgIEYgICwgICBGICAsICBGKSwKICAgIE1UTShOT1JNQUwgICAgLCAgIFQgICAsICAgVCAgLCAgIFQgICwgICBUICAgLCAgIFQgICwgICBUICAgLCAgVCAgLCAgIFQgICwgIFQpLAogICAgTVRNKFJFU0VSVkVEMSAsICAgRiAgICwgICBGICAsICAgRiAgLCAgIEYgICAsICAgRiAgLCAgIEYgICAsICBGICAsICAgRiAgLCAgRiksCiAgICBNVE0oUkVTRVJWRUQyICwgICBGICAgLCAgIEYgICwgICBGICAsICAgRiAgICwgICBGICAsICAgRiAgICwgIEYgICwgICBGICAsICBGKSwKICAgIE1UTShSRVNFUlZFRDMgLCAgIEYgICAsICAgRiAgLCAgIEYgICwgICBGICAgLCAgIEYgICwgICBGICAgLCAgRiAgLCAgIEYgICwgIEYpLAogICAgTVRNKE9QRU5DTCAgICAsICAgVCAgICwgICBUICAsICAgVCAgLCAgIFQgICAsICAgVCAgLCAgIFQgICAsICBUICAsICAgVCAgLCAgRiksCn07Ci8vL1xlbmRjb2RlCiN1bmRlZiBNVE0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gVGhlc2UgZmxhZ3MgY29udHJvbCBob3cgdGhlIGJ1ZmZlciB3aWxsIGJlIGFjY2Vzc2VkIG9uIHRoZSBzb3VyY2UgYWZ0ZXIKLy8vIGl0IGlzIG1hcHBlZC4KLy8vIFBsZWFzZSBzZWUgdGhlIENPSV9WQUxJRF9CVUZGRVJfVFlQRVNfQU5EX01BUCBtYXRyaXggYmVsb3cgZm9yIHRoZQovLy8gdmFsaWQgYnVmZmVyIHR5cGUgYW5kIG1hcCBvcGVyYXRpb24gY29tYmluYXRpb25zLgp0eXBlZGVmIGVudW0gQ09JX01BUF9UWVBFCnsKICAgIC8vLyBBbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyCiAgICAvLy8gYWZ0ZXIgaXQgaXMgbWFwcGVkLgogICAgQ09JX01BUF9SRUFEX1dSSVRFID0gMSwKCiAgICAvLy8gSWYgdGhpcyBmbGFnIGlzIHNldCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBtdXN0IG9ubHkgcmVhZCBmcm9tIHRoZQogICAgLy8vIGJ1ZmZlciBhZnRlciBpdCBpcyBtYXBwZWQuIElmIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXMgdG8gdGhlIGJ1ZmZlcgogICAgLy8vIHRoZSBjb250ZW50cyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgYmFjayB0byB0aGUgc2luayBvciBzdG9yZWQgZm9yCiAgICAvLy8gdGhlIG5leHQgdGltZSB0aGUgYnVmZmVyIGlzIG1hcHBlZCBvbiB0aGUgc291cmNlLgogICAgLy8vIFRoaXMgYWxsb3dzIHRoZSBydW50aW1lIHRvIG1ha2Ugc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucwogICAgLy8vIGluIGJ1ZmZlciBoYW5kbGluZy4KICAgIENPSV9NQVBfUkVBRF9PTkxZLAoKICAgIC8vLyBTZXR0aW5nIHRoaXMgZmxhZyBtZWFucyB0aGF0IHRoZSBzb3VyY2Ugd2lsbCBvdmVyd3JpdGUgdGhlIGVudGlyZQogICAgLy8vIGJ1ZmZlciBvbmNlIGl0IGlzIG1hcHBlZC4gVGhlIGFwcCBtdXN0IG5vdCByZWFkIGZyb20gdGhlIGJ1ZmZlciBhbmQKICAgIC8vLyBtdXN0IG5vdCBleHBlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gYmUgc3luY2hyb25pemVkIGZyb20KICAgIC8vLyB0aGUgc2luayBzaWRlIGR1cmluZyB0aGUgbWFwIG9wZXJhdGlvbi4KICAgIC8vLyBUaGlzIGFsbG93cyB0aGUgcnVudGltZSB0byBtYWtlIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMKICAgIC8vLyBpbiBidWZmZXIgaGFuZGxpbmcuCiAgICBDT0lfTUFQX1dSSVRFX0VOVElSRV9CVUZGRVIKfSBDT0lfTUFQX1RZUEU7CgojaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUwovLyBNYWtlIHRoZSBmbGFnIG1hc2sKI2RlZmluZSBNTU0oX0JVRkZFUiwgQjEsIEIyLCBCMykgXAogICAgeyAgRiAgLCBCMSwgQjIsIEIzfQojZW5kaWYKLy8vIFxlbnVtIENPSV9NQVBfVFlQRQovLy8gVGhpcyBtYXRyaXggc2hvd3MgdGhlIHZhbGlkIGNvbWJpbmF0aW9ucyBvZiBidWZmZXIgdHlwZXMgYW5kIG1hcAovLy8gb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBwYXNzZWQgaW4gdG8gQ09JQnVmZmVyTWFwLgovLy8gXGNvZGUKc3RhdGljIGNvbnN0IHVpbnQ2NF90CkNPSV9WQUxJRF9CVUZGRVJfVFlQRVNfQU5EX01BUApbQ09JX0JVRkZFUl9PUEVOQ0wgKyAxXVtDT0lfTUFQX1dSSVRFX0VOVElSRV9CVUZGRVIgKyAxXSA9CnsKICAgIC8qICAgICAgICAgICAgICAgICAgICAgIHwgTUFQICAgfCBNQVAgICB8IE1BUCAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUkVBRCAgfCBSRUFEICB8IFdSSVRFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV1JJVEUgfCBPTkxZICB8IEVOVElSRXwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsqLwogICAgTU1NKElOVkFMSUQgICAgICAgICAgICAgLCAgIEYgICAsICAgRiAgICwgICBGKSwKICAgIE1NTShOT1JNQUwgICAgICAgICAgICAgICwgICBUICAgLCAgIFQgICAsICAgVCksCiAgICBNTU0oUkVTRVJWRUQxICAgICAgICAgICAsICAgRiAgICwgICBGICAgLCAgIEYpLAogICAgTU1NKFJFU0VSVkVEMiAgICAgICAgICAgLCAgIEYgICAsICAgRiAgICwgICBGKSwKICAgIE1NTShSRVNFUlZFRDMgICAgICAgICAgICwgICBGICAgLCAgIEYgICAsICAgRiksCiAgICBNTU0oT1BFTkNMICAgICAgICAgICAgICAsICAgVCAgICwgICBUICAgLCAgIFQpLAp9OwovLy9cZW5kY29kZQojdW5kZWYgTU1NCiNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCiN1bmRlZiBGCiN1bmRlZiBUCiNlbmRpZgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLyBUaGUgdmFsaWQgY29weSBvcGVyYXRpb24gdHlwZXMgZm9yIHRoZSBDT0lCdWZmZXJXcml0ZSwgQ09JQnVmZmVyUmVhZCwKLy8vIGFuZCBDT0lCdWZmZXJDb3B5IEFQSXMuCi8vLwp0eXBlZGVmIGVudW0gQ09JX0NPUFlfVFlQRQp7CiAgICAvLy8gVGhlIHJ1bnRpbWUgY2FuIHBpY2sgdGhlIGJlc3Qgc3VpdGFibGUgd2F5IHRvIGNvcHkgdGhlIGRhdGEuCiAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCA9IDAsCgogICAgLy8vIFRoZSBydW50aW1lIHNob3VsZCB1c2UgRE1BIHRvIGNvcHkgdGhlIGRhdGEuCiAgICBDT0lfQ09QWV9VU0VfRE1BLAoKICAgIC8vLyBUaGUgcnVudGltZSBzaG91bGQgdXNlIGEgQ1BVIGNvcHkgdG8gY29weSB0aGUgZGF0YS4KICAgIENPSV9DT1BZX1VTRV9DUFUsCgogICAgLy8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3JjZXMgbW92aW5nIGVudGlyZSBidWZmZXIgdG8gdGFyZ2V0IHByb2Nlc3MgaW4gRXgKICAgIC8vLyBleHRlbmRlZCBBUElzLCBldmVuIGlmIHRoZSBmdWxsIGJ1ZmZlciBpcyBub3Qgd3JpdHRlbi4KICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVEX01PVkVfRU5USVJFLAoKICAgIC8vLyBTYW1lIGFzIGFib3ZlLCBidXQgZm9yY2VzIG1vdmluZyBlbnRpcmUgYnVmZmVyIHRvIHRhcmdldCBwcm9jZXNzIGluIEV4CiAgICAvLy8gZXh0ZW5kZWQgQVBJcywgZXZlbiBpZiB0aGUgZnVsbCBidWZmZXIgaXMgbm90IHdyaXR0ZW4uCiAgICBDT0lfQ09QWV9VU0VfRE1BX01PVkVfRU5USVJFLAoKICAgIC8vLyBTYW1lIGFzIGFib3ZlLCBidXQgZm9yY2VzIG1vdmluZyBlbnRpcmUgYnVmZmVyIHRvIHRhcmdldCBwcm9jZXNzIGluIEV4CiAgICAvLy8gZXh0ZW5kZWQgQVBJcywgZXZlbiBpZiB0aGUgZnVsbCBidWZmZXIgaXMgbm90IHdyaXR0ZW4uCiAgICBDT0lfQ09QWV9VU0VfQ1BVX01PVkVfRU5USVJFCgp9IENPSV9DT1BZX1RZUEU7CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLyBUaGUgYnVmZmVyIHN0YXRlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBmb3IKLy8vIGFjY2VzcyBpbiBhIENPSVBST0NFU1MuIFRoaXMgaXMgdXNlZCB3aXRoIENPSUJ1ZmZlclNldFN0YXRlLgovLy8KLy8vIFJ1bGVzIG9uIFN0YXRlIFRyYW5zaXRpb24gb2YgdGhlIGJ1ZmZlcjoKLy8vIC0uIFdoZW4gYSBCdWZmZXIgaXMgY3JlYXRlZCBieSBkZWZhdWx0IGl0IGlzIHZhbGlkIG9ubHkgb24gdGhlIHNvdXJjZSwKLy8vICAgIGV4Y2VwdCBmb3IgYnVmZmVycyBjcmVhdGVkIHdpdGggQ09JX1NJTktfTUVNT1JZIGZsYWcgd2hpY2ggYXJlIHZhbGlkCi8vLyAgICBvbmx5IG9uIHRoZSBzaW5rIHdoZXJlIHRoZSBtZW1vcnkgbGllcyB3aGVuIGNyZWF0ZWQuCi8vLyAtLiBBcGFydCBmcm9tIFNldFN0YXRlIGZvbGxvd2luZyBBUElzIGFsc28gYWx0ZXJzIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVyCi8vLyAgICBpbnRlcm5hbGx5OgovLy8KLy8vICAgIC0gQ09JQnVmZmVyTWFwIGFsdGVycyBzdGF0ZSBvZiBidWZmZXIgZGVwZW5kaW5nIG9uIHRoZSBDT0lfTUFQX1RZUEUuCi8vLyAgICAgIENPSV9NQVBfUkVBRF9PTkxZOiBNYWtlcyBWYWxpZCBvbiB0aGUgU291cmNlLiBEb2Vzbid0IGFmZmVjdCB0aGUgc3RhdGUKLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBidWZmZXIgb24gdGhlIG90aGVyIGRldmljZXMuCi8vLyAgICAgIENPSV9NQVBfUkVBRF9XUklURTogTWFrZXMgaXQgVmFsaWQgb25seSB0aGUgU291cmNlIGFuZCBJbnZhbGlkCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICBldmVyeXdoZXJlIGVsc2UuIE9QRU5DTCBidWZmZXJzIGFyZSBpbnZhbGlkYXRlZAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgb25seSBpZiBpdCBpcyBub3QgaW4gdXNlLgovLy8gICAgICBDT0lfTUFQX1dSSVRFX0VOVElSRV9CVUZGRVI6IE1ha2VzIGl0IHZhbGlkIG9ubHkgb24gdGhlIFNvdXJjZS4gT1BFTkNMCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzIGFyZSBpbnZhbGlkYXRlZCBvbmx5IGlmIG5vdCBpbiB1c2UuCi8vLwovLy8gICAgLSBDT0lQaXBlbGluZVJ1bmZ1bmN0aW9uIGFsdGVycyB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlciBkZXBlbmRpbmcgb24gdGhlCi8vLyAgICAgIENPSV9BQ0NFU1NfRkxBR1MKLy8vICAgICAgQ09JX1NJTktfUkVBRDogTWFrZXMgaXQgdmFsaWQgb24gdGhlIHNpbmsgd2hlcmUgUnVuRnVuY3Rpb24gaXMgYmVpbmcKLy8vICAgICAgICAgICAgICAgICAgICAgaXNzdWVkLiBEb2Vzbid0IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlciBvbiBvdGhlcgovLy8gICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLgovLy8gICAgICBDT0lfU0lOS19XUklURTogTWFrZXMgaXQgdmFsaWQgb25seSBvbiB0aGUgc2luayB3aGVyZSBSdW5mdW5jdGlvbiBpcwovLy8gICAgICAgICAgICAgICAgICAgICBiZWluZyBpc3N1ZWQgYW5kIGludmFsaWQgZXZlcnl3aGVyZSBlbHNlLiBPUEVOQ0wKLy8vICAgICAgICAgICAgICAgICAgICAgYnVmZmVycyBhcmUgaW52YWxpZGF0ZWQgb25seSBpZiB0aGUgYnVmZmVyIGlzIG5vdCBpbgovLy8gICAgICAgICAgICAgICAgICAgICB1c2UuCi8vLyAgICAgIENPSV9TSU5LX1dSSVRFX0VOVElSRTogTWFrZXMgaXQgdmFsaWQgb25seSBvbiB0aGUgc2luayB3aGVyZQovLy8gICAgICAgICAgICAgICAgICAgICBSdW5mdW5jdGlvbiBpcyBiZWluZyBpc3N1ZWQgYW5kIGludmFsaWQgZXZlcnl3aGVyZSBlbHNlCi8vLyAgICAgICAgICAgICAgICAgICAgIE9QRU5DTCBidWZmZXJzIGFyZSBpbnZhbGlkYXRlZCBvbmx5IGlmIHRoZSBidWZmZXIgaXMKLy8vICAgICAgICAgICAgICAgICAgICAgbm90IGluIHVzZS4KLy8vCi8vLyAgICAtIENPSUJ1ZmZlcldyaXRlIG1ha2VzIHRoZSBidWZmZXIgZXhjbHVzaXZlbHkgdmFsaWQgd2hlcmUgdGhlIHdyaXRlCi8vLyAgICAgIGhhcHBlbnMuIFdyaXRlIGdpdmVzIHByZWZlcmVuY2UgdG8gU291cmNlIG92ZXIgU2luay4gSW4gb3RoZXIgd29yZHMKLy8vICAgICAgaWYgYSBidWZmZXIgaXMgdmFsaWQgb24gdGhlIFNvdXJjZSBhbmQgbXVsdGlwbGUgU2lua3MsIFdyaXRlIHdpbGwKLy8vICAgICAgaGFwcGVuIG9uIHRoZSBTb3VyY2UgYW5kIHdpbGwgSW52YWxpZGF0ZSBhbGwgb3RoZXIgU2lua3MuIElmIHRoZQovLy8gICAgICBidWZmZXIgaXMgdmFsaWQgb24gbXVsdGlwbGUgU2lua3MgKCBhbmQgbm90IG9uIHRoZSBTb3VyY2UpIHRoZW4KLy8vICAgICAgSW50ZWwoUikgQ29wcm9jZXNzb3IgT2ZmbG9hZCBJbmZyYXN0cnVjdHVyZSAoSW50ZWwoUikgQ09JKQovLy8gICAgICBzZWxlY3RzIHByb2Nlc3MgaGFuZGxlIHdpdGggdGhlIGxvd2VzdCBudW1lcmljYWwgdmFsdWUgdG8gZG8gdGhlCi8vLyAgICAgIGV4Y2x1c2l2ZSB3cml0ZSBBZ2FpbiwgT1BFTkNMIGJ1ZmZlcnMgYXJlIGludmFsaWRhdGVkIG9ubHkgaWYgdGhlCi8vLyAgICAgIGJ1ZmZlciBpcyBub3QgaW4gdXNlIG9uIHRoYXQgU0lOSy9TT1VSQ0UuCi8vLwovLy8gICAgICBUaGUgcHJlZmVyZW5jZSBydWxlIG1lbnRpb25lZCBhYm92ZSBob2xkcyB0cnVlIGV2ZW4gZm9yIFNldFN0YXRlIEFQSSwKLy8vICAgICAgd2hlbiBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGZyb20gYSB2YWxpZCBsb2NhdGlvbi4gVGhlIHNlbGVjdGlvbiBvZgovLy8gICAgICB2YWxpZCBsb2NhdGlvbiBoYXBwZW5zIGFzIHN0YXRlZCBhYm92ZS4KLy8vCi8vLyAtIEl0IGlzIHBvc3NpYmxlIHRvIGFsdGVyIG9ubHkgcGFydHMgb2YgdGhlIGJ1ZmZlciBhbmQgY2hhbmdlIGl0IHN0YXRlCi8vLyAgIEluIG90aGVyIHdvcmRzIGl0IGlzIHBvc3NpYmxlIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGJ1ZmZlciB0byBoYXZlCi8vLyAgIGRpZmZlcmVudCBzdGF0ZXMgb24gZGlmZmVyZW50IGRldmljZXMuIEEgYnl0ZSBpcyB0aGUgbWluaW11bSBzaXplIGF0Ci8vLyAgIHdoaWNoIHN0YXRlIGNhbiBiZSBtYWludGFpbmVkIGludGVybmFsbHkuIEdyYW51bGFyaXR5IGxldmVsIGlzIGNvbXBsZXRlbHkKLy8vICAgZGV0ZXJtaW5lZCBieSBob3cgdGhlIGJ1ZmZlciBnZXRzIGZyYWdtZW50ZWQuCi8vLwovLy8gTm90ZTogQnVmZmVyIGlzIGNvbnNpZGVyZWQgJ2luIHVzZScgaWYgaXMKLy8vICAgICAgICAgLSBCZWluZyB1c2VkIGluIFJ1bkZ1bmN0aW9uIDogSW4gdXNlIG9uIGEgU2luawovLy8gICAgICAgICAtIE1hcHBlZDogSW4gdXNlIG9uIGEgU291cmNlCi8vLyAgICAgICAgIC0gQWRkUmVmJ2Q6IEluIHVzZSBvbiBTaW5rCi8vLwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLyBUaGUgYnVmZmVyIHN0YXRlcyB1c2VkIHdpdGggQ09JQnVmZmVyU2V0U3RhdGUgY2FsbCB0byBpbmRpY2F0ZSB0aGUgbmV3Ci8vLyBzdGF0ZSBvZiB0aGUgYnVmZmVyIG9uIGEgZ2l2ZW4gcHJvY2VzcwovLy8KdHlwZWRlZiBlbnVtCnsKICAgIENPSV9CVUZGRVJfVkFMSUQgPSAwLCAgICAgIC8vIEJ1ZmZlciBpcyB2YWxpZCBhbmQgdXAtdG8tZGF0ZSBvbiB0aGUgcHJvY2VzcwogICAgQ09JX0JVRkZFUl9JTlZBTElEICwgICAgICAgLy8gQnVmZmVyIGlzIG5vdCB2YWxpZCwgbmVlZCB2YWxpZCBkYXRhCiAgICBDT0lfQlVGRkVSX1ZBTElEX01BWV9EUk9QLCAvLyBTYW1lIGFzIHZhbGlkIGJ1dCB3aWxsIGRyb3AgdGhlIGNvbnRlbnQgd2hlbgogICAgLy8gZXZpY3RlZCB0byBhdm9pZCBvdmVyd3JpdGluZyB0aGUgc2hhZG93CiAgICAvLyBtZW1vcnkKICAgIENPSV9CVUZGRVJfUkVTRVJWRUQgICAgICAgIC8vIFJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UKfSBDT0lfQlVGRkVSX1NUQVRFOwovLy8KLy8vIE5vdGU6IEEgVkFMSURfTUFZX0RST1AgZGVjbGFyZXMgYSBidWZmZXIncyBjb3B5IGFzIHNlY29uZGFyeSBvbiBhIGdpdmVuCi8vLyBwcm9jZXNzLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgbmVlZHMgdG8gYmUgYXQgbGVhc3Qgb25lIHByaW1hcnkgY29weSBvZiB0aGUKLy8vIHRoZSBidWZmZXIgc29tZXdoZXJlIGluIG9yZGVyIHRvIG1hcmsgdGhlIGJ1ZmZlciBhcyBWQUxJRF9NQVlfRFJPUCBvbiBhCi8vLyBwcm9jZXNzLiBJbiBvdGhlciB3b3JkcyB0byBtYWtlIGEgYnVmZmVyIFZBTElEX01BWV9EUk9QIG9uIGEgZ2l2ZW4gcHJvY2VzcwovLy8gaXQgbmVlZHMgdG8gYmUgaW4gQ09JX0JVRkZFUl9WQUxJRCBzdGF0ZSBzb21ld2hlcmUgZWxzZS4gVGhlIG9wZXJhdGlvbiBnZXRzCi8vLyBpZ25vcmVkIChvciBpcyBhIG5vcCkgaWYgdGhlcmUgaXMgbm8gcHJpbWFyeSBjb3B5IG9mIHRoZSBidWZmZXIuIFRoZSBuYXR1cmUKLy8vIG9mIHRoaXMgc3RhdGUgdG8gImRyb3AgdGhlIGNvbnRlbnQiIHdoZW4gZXZpY3RlZCBpcyBhIHNpZGUgZWZmZWN0IG9mCi8vLyBtYXJraW5nIHRoZSBidWZmZXIgYXMgc2Vjb25kYXJ5IGNvcHkuIFNvIHdoZW4gYSBidWZmZXIgbWFya2VkCi8vLyBWQUxJRF9NQVlfRFJPUCBpcyBldmljdGVkIEludGVsKFIpIENvcHJvY2Vzc29yIE9mZmxvYWQgSW5mcmFzdHJ1Y3R1cmUKLy8vIChJbnRlbChSKSBDT0kpIGRvZXNuJ3QgYmFjayBpdCB1cCBhcyBpdCBpcyBhc3N1bWVkIHRoYXQKLy8vIHRoZXJlIGlzIGEgcHJpbWFyeSBjb3B5IHNvbWV3aGVyZS4KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gVGhlIGJ1ZmZlciBtb3ZlIGZsYWdzIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoZW4gYSBidWZmZXIgc2hvdWxkIGJlIG1vdmVkCi8vLyB3aGVuIGl0J3Mgc3RhdGUgaXMgY2hhbmdlZC4gVGhpcyBpcyB1c2VkIHdpdGggQ09JQnVmZmVyU2V0U3RhdGUuCnR5cGVkZWYgZW51bQp7CiAgICBDT0lfQlVGRkVSX01PVkUgPSAwLC8vIERpcnR5IGRhdGEgaXMgbW92ZWQgaWYgc3RhdGUgY2hhbmdlIHJlcXVpcmVzIGl0CiAgICBDT0lfQlVGRkVSX05PX01PVkUgIC8vIENoYW5nZSBzdGF0ZSB3aXRob3V0IG1vdmluZyBkYXRhCn0gQ09JX0JVRkZFUl9NT1ZFX0ZMQUc7CgovLyBBIHByb2Nlc3MgaGFuZGxlIGZvciBDT0lCdWZmZXJTZXRTdGF0ZSBjYWxsIHRvIGluZGljYXRlIGFsbCB0aGUgc2luawovLyBwcm9jZXNzZXMgd2hlcmUgdGhlIGdpdmVuIGJ1ZmZlciBpcyB2YWxpZAojZGVmaW5lIENPSV9TSU5LX09XTkVSUyAoKENPSVBST0NFU1MpLTIpCgovLyBNYXRyaXggZGVzY3JpcHRvcnMgdXNlZCB3aXRoIE11bHRpRCBSZWFkL1dyaXRlCnR5cGVkZWYgc3RydWN0IGRpbV9kZXNjCnsKICAgIGludDY0X3Qgc2l6ZTsgICAgICAgLy8gU2l6ZSBvZiBkYXRhIHR5cGUKICAgIGludDY0X3QgbGluZGV4OyAgICAgLy8gTG93ZXIgaW5kZXgsIHVzZWQgaW4gRm9ydHJhbgogICAgaW50NjRfdCBsb3dlcjsgICAgICAvLyBMb3dlciBzZWN0aW9uIGJvdW5kCiAgICBpbnQ2NF90IHVwcGVyOyAgICAgIC8vIFVwcGVyIHNlY3Rpb24gYm91bmQKICAgIGludDY0X3Qgc3RyaWRlOyAgICAgLy8gU3RyaWRlLCBvciBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiB0aGUgc3RhcnQKICAgIC8vIG9mIG9uZSBlbGVtZW50IGFuZCBzdGFydCBvZiBuZXh0IG9uZSBkaXZpZGVkCiAgICAvLyBieSBzaXplLgp9IGRpbV9kZXNjOwoKdHlwZWRlZiBzdHJ1Y3QgYXJyX2Rlc2MKewogICAgaW50NjRfdCBiYXNlOyAgICAgICAvLyBCYXNlIGFkZHJlc3MKICAgIGludDY0X3QgcmFuazsgICAgICAgLy8gUmFuayBvZiBhcnJheSwgaS5lLiBudW1iZXIgb2YgZGltZW5zaW9ucwogICAgZGltX2Rlc2MgZGltWzNdOyAgICAvLyBUaGlzIGFycmF5IGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIJNyYW5rlAogICAgLy8gY3VycmVudGx5IGxpbWl0ZWQgdG8gMy4KfSBhcnJfZGVzYzsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIENyZWF0ZXMgYSBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiBSdW5GdW5jdGlvbnMgdGhhdCBhcmUgcXVldWVkIGluCi8vLyBwaXBlbGluZXMuIFRoZSBhZGRyZXNzIHNwYWNlIGZvciB0aGUgYnVmZmVyIGlzIHJlc2VydmVkIHdoZW4gaXQgaXMKLy8vIGNyZWF0ZWQgYWx0aG91Z2ggdGhlIG1lbW9yeSBtYXkgbm90IGJlIGNvbW1pdHRlZCB1bnRpbCB0aGUgYnVmZmVyIGlzCi8vLyB1c2VkIGZvciB0aGUgZmlyc3QgdGltZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgSW50ZWwoUikgQ29wcm9jZXNzb3IgT2ZmbG9hZAovLy8gSW5mcmFzdHJ1Y3R1cmUgKEludGVsKFIpIENPSSkgcnVudGltZSBtYXkgYWxzbyBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCi8vLyBzb3VyY2UgcHJvY2VzcyB0byB1c2UgYXMgc2hhZG93IG1lbW9yeSBmb3IgY2VydGFpbiB0eXBlcyBvZiBidWZmZXJzLgovLy8gSWYgSW50ZWwoUikgQ29wcm9jZXNzb3IgT2ZmbG9hZCBJbmZyYXN0cnVjdHVyZSAoSW50ZWwoUikgQ09JKQovLy8gZG9lcyBhbGxvY2F0ZSB0aGlzIG1lbW9yeSBpdCB3aWxsIG5vdCBiZSByZWxlYXNlZCBvciByZWFsbG9jYXRlZAovLy8gdW50aWwgdGhlIENPSUJ1ZmZlciBpcyBkZXN0cm95ZWQuCi8vLwovLy8gQHBhcmFtICBpbl9TaXplCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmb3IgdGhlIGJ1ZmZlci4gSWYgaW5fU2l6ZQovLy8gICAgICAgICBpcyBub3QgcGFnZSBhbGlnbmVkLCBpdCB3aWxsIGJlIHJvdW5kZWQgdXAuCi8vLwovLy8gQHBhcmFtICBpbl9UeXBlCi8vLyAgICAgICAgIFtpbl0gVGhlIHR5cGUgb2YgdGhlIGJ1ZmZlciB0byBjcmVhdGUuCi8vLwovLy8gQHBhcmFtICBpbl9GbGFncwovLy8gICAgICAgICBbaW5dIEEgYml0bWFzayBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBidWZmZXIuCi8vLyAgICAgICAgIFNvbWUgb2YgdGhlc2UgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcyB3aGlsZSBvdGhlcnMKLy8vICAgICAgICAgYXJlIHByb3ZpZGVkIGFzIGhpbnRzIHRvIHRoZSBydW50aW1lIHN5c3RlbSBzbyBpdCBjYW4gbWFrZQovLy8gICAgICAgICBjZXJ0YWluIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMuCi8vLwovLy8gQHBhcmFtICBpbl9wSW5pdERhdGEKLy8vICAgICAgICAgW2luXSBJZiBub24tTlVMTCB0aGUgYnVmZmVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGF0YQovLy8gICAgICAgICBwb2ludGVkIHRvIGJ5IHBJbml0RGF0YS4gVGhlIG1lbW9yeSBhdCBpbl9wSW5pdERhdGEgbXVzdCBob2xkCi8vLyAgICAgICAgIGF0IGxlYXN0IGluX1NpemUgYnl0ZXMuCi8vLwovLy8gQHBhcmFtICBpbl9OdW1Qcm9jZXNzZXMKLy8vICAgICAgICAgW2luXSBUaGUgbnVtYmVyIG9mIHByb2Nlc3NlcyB3aXRoIHdoaWNoIHRoaXMgYnVmZmVyIG1pZ2h0IGJlIHVzZWQuCi8vLwovLy8gQHBhcmFtICBpbl9wUHJvY2Vzc2VzCi8vLyAgICAgICAgIFtpbl0gQW4gYXJyYXkgb2YgQ09JUFJPQ0VTUyBoYW5kbGVzIGlkZW50aWZ5aW5nIHRoZSBwcm9jZXNzZXMgd2l0aAovLy8gICAgICAgICB3aGljaCB0aGlzIGJ1ZmZlciBtaWdodCBiZSB1c2VkLgovLy8KLy8vIEBwYXJhbSAgb3V0X3BCdWZmZXIKLy8vICAgICAgICAgW291dF0gUG9pbnRlciB0byBhIGJ1ZmZlciBoYW5kbGUuIFRoZSBoYW5kbGUgd2lsbCBiZSBmaWxsZWQgaW4KLy8vICAgICAgICAgd2l0aCBhIHZhbHVlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbmV3bHkgY3JlYXRlZCBidWZmZXIuCi8vLyAgICAgICAgIFRoaXMgaGFuZGxlIHNob3VsZCBiZSBkaXNwb3NlZCBvZiB2aWEgQ09JQnVmZmVyRGVzdHJveSgpCi8vLyAgICAgICAgIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9TVUNDRVNTIGlmIHRoZSBidWZmZXIgd2FzIGNyZWF0ZWQKLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiB0aGUgaW5fVHlwZSBhbmQgaW5fRmxhZ3MgcGFyYW1ldGVycwovLy8gICAgICAgICBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBvbmUgYW5vdGhlci4gUGxlYXNlIHNlZSB0aGUKLy8vICAgICAgICAgQ09JX1ZBTElEX0JVRkZFUl9UWVBFU19BTkRfRkxBR1MgbWFwIGFib3ZlIGZvciBpbmZvcm1hdGlvbiBhYm91dAovLy8gICAgICAgICB3aGljaCBmbGFncyBhbmQgdHlwZXMgYXJlIGNvbXBhdGlibGUuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX1NpemUgaXMgemVybywgaWYgdGhlIGJpdHMgc2V0IGluCi8vLyAgICAgICAgIHRoZSBpbl9GbGFncyBwYXJhbWV0ZXIgYXJlIG5vdCByZWNvZ25pemVkIGZsYWdzLCBvciBpZiBpbl9OdW1Qcm9jZXNzZXMgaXMgemVyby4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX1BPSU5URVIgaWYgdGhlIGluX3BQcm9jZXNzZXMgb3Igb3V0X3BCdWZmZXIgcGFyYW1ldGVyCi8vLyAgICAgICAgIGlzIE5VTEwuCi8vLwovLy8gQHJldHVybiBDT0lfTk9UX1NVUFBPUlRFRCBpZiBpbl9UeXBlIGhhcyBpbnZhbGlkIHZhbHVlIG9yIGlmCi8vLyAgICAgICAgb25lIG9mIHRoZSBpbl9GbGFncyBpcyBDT0lfU0lOS19NRU1PUlkuCi8vLwovLy8gQHJldHVybiBDT0lfTk9UX1NVUFBPUlRFRCBpZiB0aGUgZmxhZ3MgaW5jbHVkZSBlaXRoZXIKLy8vICAgICAgICAgQ09JX1NBTUVfQUREUkVTU19TSU5LUyBvciBDT0lfU0FNRV9BRERSRVNTX1NJTktTX0FORF9TT1VSQ0UgYW5kCi8vLyAgICAgICAgIENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRS4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiBvbmUgb2YgdGhlIENPSVBST0NFU1MgaGFuZGxlcyBpbiB0aGUKLy8vICAgICAgICAgaW5fcFByb2Nlc3NlcyBhcnJheSBkb2VzIG5vdCBpZGVudGlmeSBhIHZhbGlkIHByb2Nlc3MuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX01FTU9SWSBpZiBhbGxvY2F0aW5nIHRoZSBidWZmZXIgZmFpbHMuCi8vLwovLy8gQHJldHVybiBDT0lfUkVTT1VSQ0VfRVhIQVVTVEVEIGlmIHRoZSBzaW5rIGlzIG91dCBvZiBidWZmZXIgbWVtb3J5LgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJDcmVhdGUoCiAgICB1aW50NjRfdCAgICAgICAgICAgIGluX1NpemUsCiAgICBDT0lfQlVGRkVSX1RZUEUgICAgIGluX1R5cGUsCiAgICB1aW50MzJfdCAgICAgICAgICAgIGluX0ZsYWdzLAogICAgY29uc3QgICB2b2lkICAgICAgICAgICAgICAgKmluX3BJbml0RGF0YSwKICAgIHVpbnQzMl90ICAgICAgICAgICAgaW5fTnVtUHJvY2Vzc2VzLAogICAgY29uc3QgICBDT0lQUk9DRVNTICAgICAgICAgKmluX3BQcm9jZXNzZXMsCiAgICBDT0lCVUZGRVIgICAgICAgICAgKm91dF9wQnVmZmVyKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIENyZWF0ZXMgYSBidWZmZXIgZnJvbSBzb21lIGV4aXN0aW5nIG1lbW9yeSB0aGF0IGNhbiBiZSB1c2VkIGluCi8vLyBSdW5GdW5jdGlvbnMgdGhhdCBhcmUgcXVldWVkIGluIHBpcGVsaW5lcy4gSWYgdGhlIGZsYWcgQ09JX1NJTktfTUVNT1JZCi8vLyBpcyBzcGVjaWZpZWQgdGhlbiBJbnRlbChSKSBDb3Byb2Nlc3NvciBPZmZsb2FkCi8vLyBJbmZyYXN0cnVjdHVyZSAoSW50ZWwoUikgQ09JKSB3aWxsIHVzZSB0aGF0IG1lbW9yeSBmb3IgdGhlIGJ1ZmZlciBvbiB0aGUgc2luay4KLy8vIElmIHRoYXQgZmxhZyBpc24ndCBzZXQgdGhlbiB0aGUgbWVtb3J5IHByb3ZpZGVkIGlzIHVzZWQgYXMgYmFja2luZyBzdG9yZQovLy8gZm9yIHRoZSBidWZmZXIgb24gdGhlIHNvdXJjZS4gSW4gZWl0aGVyIGNhc2UgdGhlIG1lbW9yeSBtdXN0IG5vdCBiZSBmcmVlZAovLy8gYmVmb3JlIHRoZSBidWZmZXIgaXMgZGVzdHJveWVkLgovLy8gV2hpbGUgdGhlIHVzZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IHBhc3NlZCBpbiB0aGV5IG11c3QgdXNlIHRoZQovLy8gYXBwcm9wcmlhdGUgYWNjZXNzIGZsYWdzIHdoZW4gYWNjZXNzaW5nIHRoZSBidWZmZXIgaW4gQ09JUGlwZWxpblJ1bkZ1bmN0aW9uCi8vLyBvciBDT0lCdWZmZXJNYXAgY2FsbHMgc28gdGhhdCB0aGUgcnVudGltZSBrbm93cyB3aGVuIHRoZQovLy8gbWVtb3J5IGhhcyBiZWVuIG1vZGlmaWVkLiBJZiB0aGUgdXNlciBqdXN0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgbWVtb3J5Ci8vLyBsb2NhdGlvbiB0aGVuIHRob3NlIGNoYW5nZXMgbWF5IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcKLy8vIGJ1ZmZlciBpcyBhY2Nlc3NlZC4KLy8vIFdoYXRldmVyIHZhbHVlcyBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBtZW1vcnkgbG9jYXRpb24gd2hlbiB0aGlzIGNhbGwKLy8vIGlzIG1hZGUgYXJlIHByZXNlcnZlZC4gVGhlIG1lbW9yeSB2YWx1ZXMgYXJlIGFsc28gcHJlc2VydmVkIHdoZW4KLy8vIENPSUJ1ZmZlckRlc3Ryb3kgaXMgY2FsbGVkLgovLy8KLy8vIEB3YXJuaW5nOiBVc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQgaWYgdGhlIGNhbGxpbmcKLy8vIHByb2dyYW0gZm9ya3MgYXQgYWxsIChpbmNsdWRpbmcgY2FsbHMgdG8gc3lzdGVtKDMpLCBwb3BlbigzKSwgb3Igc2ltaWxhcgovLy8gZnVuY3Rpb25zKSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhpcyBidWZmZXIuIFNlZSB0aGUgZGlzY3Vzc2lvbiBhcm91bmQgdGhlCi8vLyBpbl9NZW1vcnkgcGFyYW1ldGVyIGJlbG93IHJlZ2FyZGluZyB0aGlzLgovLy8KLy8vIEBwYXJhbSAgaW5fU2l6ZQovLy8gICAgICAgICBbaW5dIFRoZSBzaXplIG9mIGluX01lbW9yeSBpbiBieXRlcy4gSWYgaW5fU2l6ZQovLy8gICAgICAgICBpcyBub3QgcGFnZSBhbGlnbmVkLCBpdCB3aWxsIGJlIHJvdW5kZWQgdXAuCi8vLwovLy8gQHBhcmFtICBpbl9UeXBlCi8vLyAgICAgICAgIFtpbl0gVGhlIHR5cGUgb2YgdGhlIGJ1ZmZlciB0byBjcmVhdGUuIE9ubHkgQ09JX0JVRkZFUl9OT1JNQUwKLy8vICAgICAgICAgYnVmZmVyIHR5cGUgaXMgc3VwcG9ydGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fRmxhZ3MKLy8vICAgICAgICAgW2luXSBBIGJpdG1hc2sgb2YgYXR0cmlidXRlcyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgYnVmZmVyLgovLy8gICAgICAgICBTb21lIG9mIHRoZXNlIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3Mgd2hpbGUgb3RoZXJzCi8vLyAgICAgICAgIGFyZSBwcm92aWRlZCBhcyBoaW50cyB0byB0aGUgcnVudGltZSBzeXN0ZW0gc28gaXQgY2FuIG1ha2UKLy8vICAgICAgICAgY2VydGFpbiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLiBOb3RlIHRoYXQgdGhlIGZsYWcKLy8vICAgICAgICAgQ09JX1NBTUVfQUREUkVTU19TSU5LU19BTkRfU09VUkNFIGlzIHN0aWxsIHZhbGlkIGJ1dCBtYXkgZmFpbAovLy8gICAgICAgICBpZiB0aGUgc2FtZSBhZGRyZXNzIGFzIGluX01lbW9yeSBjYW4gbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc2luay4KLy8vCi8vLyBAcGFyYW0gIGluX01lbW9yeQovLy8gICAgICAgICBbaW5dIEEgcG9pbnRlciB0byBhbiBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9uCi8vLyAgICAgICAgIHRoYXQgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGEgQ09JQlVGRkVSLiBBbHRob3VnaCB0aGUgdXNlciBzdGlsbAovLy8gICAgICAgICBvd25zIHRoaXMgbWVtb3J5IHRoZXkgc2hvdWxkIG5vdCBmcmVlIGl0IGJlZm9yZSBjYWxsaW5nCi8vLyAgICAgICAgIENPSUJ1ZmZlckRlc3Ryb3kuIFRoZXkgbXVzdCBhbHNvIG9ubHkgYWNjZXNzIHRoZSBtZW1vcnkgdXNpbmcKLy8vICAgICAgICAgQ09JQlVGRkVSIHNlbWFudGljcywgZm9yIGV4YW1wbGUgdXNpbmcgQ09JQnVmZmVyTWFwL0NPSUJ1ZmZlclVubWFwCi8vLyAgICAgICAgIHdoZW4gdGhleSB3aXNoIHRvIHJlYWQgb3Igd3JpdGUgdGhlIGRhdGEuIFRoZXJlIGFyZSBubyBhbGlnbm1lbnQKLy8vICAgICAgICAgb3Igc2l6ZSByZXF1aXJlbWVudHMgZm9yIHRoaXMgbWVtb3J5IHJlZ2lvbi4KLy8vCi8vLyAgICAgICAgIFdBUk5JTkc6Ci8vLyAgICAgICAgIFNpbmNlIHRoZSBiYWNraW5nIG1lbW9yeSBwYXNzZWQgaW4gY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSBETUEKLy8vICAgICAgICAgdGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIGNhbGwgdG8gY2xvbmUoMikgKHdpdGhvdXQKLy8vICAgICAgICAgdGhlIENMT05FX1ZNIGFyZ3VtZW50KSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhpcyBidWZmZXIuIFRoaXMKLy8vICAgICAgICAgaW5jbHVkZXMgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucyB0aGF0IGNhbGwgY2xvbmUgc3VjaCBhcyBmb3JrKDIpLAovLy8gICAgICAgICBzeXN0ZW0oMyksIHBvcGVuKDMpLCBhbW9uZyBvdGhlcnMpLgovLy8KLy8vICAgICAgICAgRm9yIGZvcmtlZCBwcm9jZXNzZXMsIExpbnV4IHVzZXMgY29weS1vbi13cml0ZSBzZW1hbnRpY3MgZm9yCi8vLyAgICAgICAgIHBlcmZvcm1hbmNlIHJlYXNvbnMuIENvbnNlcXVlbnRseSwgaWYgdGhlIHBhcmVudCBmb3JrcyBhbmQgdGhlbgovLy8gICAgICAgICB3cml0ZXMgdG8gdGhpcyBtZW1vcnksIHRoZSBwaHlzaWNhbCBwYWdlIG1hcHBpbmcgY2hhbmdlcyBjYXVzaW5nCi8vLyAgICAgICAgIHRoZSBETUEgdG8gZmFpbCAoYW5kIHRodXMgZGF0YSBjb3JydXB0aW9uKS4KLy8vCi8vLyAgICAgICAgIEluIExpbnV4IHlvdSBjYW4gbWFyayBhIHNldCBvZiBwYWdlcyB0byBub3QgYmUgY29waWVkIGFjcm9zcwovLy8gICAgICAgICBhY3Jvc3MgdGhlIGNsb25lIGJ5IGNhbGxpbmcgbWFkdmlzZSgyKSB3aXRoIGFuIGFyZ3VtZW50IG9mCi8vLyAgICAgICAgIE1BRFZfRE9OVEZPUksgYW5kIHRoZW4gc2FmZWx5IHVzZSB0aGF0IG1lbW9yeSBpbiB0aGlzIHNjZW5hcmlvLgovLy8gICAgICAgICBBbHRlcm5hdGVseSwgaWYgdGhlIG1lbW9yeSBpcyBmcm9tIGEgcmVnaW9uIG1hcmtlZCBNQVBfU0hBUkVELAovLy8gICAgICAgICB0aGlzIHdpbGwgd29yay4KLy8vCi8vLyBAcGFyYW0gIGluX051bVByb2Nlc3NlcwovLy8gICAgICAgICBbaW5dIFRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIHdpdGggd2hpY2ggdGhpcyBidWZmZXIgbWlnaHQgYmUgdXNlZC4KLy8vICAgICAgICAgSWYgdGhlIGZsYWcgQ09JX1NJTktfTUVNT1JZIGlzIHNwZWNpZmllZCB0aGVuIHRoaXMgbXVzdCBiZSAxLgovLy8KLy8vIEBwYXJhbSAgaW5fcFByb2Nlc3NlcwovLy8gICAgICAgICBbaW5dIEFuIGFycmF5IG9mIENPSVBST0NFU1MgaGFuZGxlcyBpZGVudGlmeWluZyB0aGUgcHJvY2Vzc2VzIHdpdGgKLy8vICAgICAgICAgd2hpY2ggdGhpcyBidWZmZXIgbWlnaHQgYmUgdXNlZC4KLy8vCi8vLyBAcGFyYW0gIG91dF9wQnVmZmVyCi8vLyAgICAgICAgIFtvdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgaGFuZGxlLiBUaGUgaGFuZGxlIHdpbGwgYmUgZmlsbGVkIGluCi8vLyAgICAgICAgIHdpdGggYSB2YWx1ZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIG5ld2x5IGNyZWF0ZWQgYnVmZmVyLgovLy8gICAgICAgICBUaGlzIGhhbmRsZSBzaG91bGQgYmUgZGlzcG9zZWQgb2YgdmlhIENPSUJ1ZmZlckRlc3Ryb3koKQovLy8gICAgICAgICBvbmNlIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCi8vLwovLy8gQHJldHVybiBDT0lfU1VDQ0VTUyBpZiB0aGUgYnVmZmVyIHdhcyBjcmVhdGVkCi8vLwovLy8gQHJldHVybiBDT0lfTk9UX1NVUFBPUlRFRCBpZiB0aGUgaW5fVHlwZSB2YWx1ZSBpcyBub3QgQ09JX0JVRkZFUl9OT1JNQUwsCi8vLyAgICAgICAgIG9yIENPSV9CVUZGRVJfT1BFTkNMLgovLy8KLy8vIEByZXR1cm4gQ09JX05PVF9TVVBQT1JURUQgaWYgaW5fTWVtb3J5IGlzIHJlYWQtb25seSBtZW1vcnkKLy8vCi8vLyBAcmV0dXJuIENPSV9OT1RfU1VQUE9SVEVEIGlmIG9uZSBvZiB0aGUgaW5fRmxhZ3MgaXMgQ09JX1NJTktfTUVNT1JZIGFuZAovLy8gICAgICAgICBpbl9UeXBlIGlzIG5vdCBDT0lfQlVGRkVSX05PUk1BTAovLy8KLy8vIEByZXR1cm4gQ09JX05PVF9TVVBQT1JURUQgaWYgdGhlIGZsYWcgQ09JX1NBTUVfQUREUkVTU19TSU5LUyBpcyBzZXQKLy8vCi8vLyBAcmV0dXJuIENPSV9OT1RfU1VQUE9SVEVEIGlmIHRoZSBmbGFnIENPSV9TQU1FX0FERFJFU1NfU0lOS1NfQU5EX1NPVVJDRSBpcwovLy8gICAgICAgICBzZXQKLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiB0aGUgaW5fVHlwZSBhbmQgaW5fRmxhZ3MgcGFyYW1ldGVycwovLy8gICAgICAgICBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBvbmUgYW5vdGhlci4gUGxlYXNlIHNlZSB0aGUKLy8vICAgICAgICAgQ09JX1ZBTElEX0JVRkZFUl9UWVBFU19BTkRfRkxBR1MgbWFwIGFib3ZlIGZvciBpbmZvcm1hdGlvbiBhYm91dAovLy8gICAgICAgICB3aGljaCBmbGFncyBhbmQgdHlwZXMgYXJlIGNvbXBhdGlibGUuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgdGhlIGZsYWcgQ09JX1NJTktfTUVNT1JZIGlzIHNwZWNpZmllZCBhbmQKLy8vICAgICAgICAgaW5fTnVtUHJvY2Vzc2VzID4gMS4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiB0aGUgZmxhZ3MgQ09JX1NJTktfTUVNT1JZIGFuZAovLy8gICAgICAgICBDT0lfT1BUSU1JWkVfSFVHRV9QQUdFX1NJWkUgYXJlIGJvdGggc2V0LgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9TaXplIGlzIHplcm8sIGlmIHRoZSBiaXRzIHNldCBpbgovLy8gICAgICAgICB0aGUgaW5fRmxhZ3MgcGFyYW1ldGVyIGFyZSBub3QgcmVjb2duaXplZCBmbGFncywgIG9yIGlmIGluX051bVByb2Nlc3NlcyBpcyB6ZXJvLgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfUE9JTlRFUiBpZiBpbl9NZW1vcnksIGluX3BQcm9jZXNzZXMgb3IKLy8vICAgICAgICAgb3V0X3BCdWZmZXIgcGFyYW1ldGVyIGlzIE5VTEwuCi8vLwovLy8gQHJldHVybiBDT0lfSU5WQUxJRF9IQU5ETEUgaWYgb25lIG9mIHRoZSBDT0lQUk9DRVNTIGhhbmRsZXMgaW4gdGhlCi8vLyAgICAgICAgIGluX3BQcm9jZXNzZXMgYXJyYXkgZG9lcyBub3QgaWRlbnRpZnkgYSB2YWxpZCBwcm9jZXNzLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9TaXplLAogICAgQ09JX0JVRkZFUl9UWVBFICAgICBpbl9UeXBlLAogICAgdWludDMyX3QgICAgICAgICAgICBpbl9GbGFncywKICAgIHZvaWQgICAgICAgICAgICAgICAqaW5fTWVtb3J5LAogICAgdWludDMyX3QgICAgICAgICAgICBpbl9OdW1Qcm9jZXNzZXMsCiAgICBjb25zdCAgIENPSVBST0NFU1MgICAgICAgICAqaW5fcFByb2Nlc3NlcywKICAgIENPSUJVRkZFUiAgICAgICAgICAqb3V0X3BCdWZmZXIpOwoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIERlc3Ryb3lzIGEgYnVmZmVyLiBXaWxsIGJsb2NrIG9uIGNvbXBsZXRpb24gb2YgYW55IG9wZXJhdGlvbnMgb24gdGhlCi8vLyBidWZmZXIsIHN1Y2ggYXMgQ09JUGlwZWxpbmVSdW5GdW5jdGlvbiBvciBDT0lCdWZmZXJDb3B5LiBXaWxsIGJsb2NrIHVudGlsCi8vLyBhbGwgQ09JQnVmZmVyQWRkUmVmIGNhbGxzIGhhdmUgaGFkIGEgbWF0Y2hpbmcgQ09JQnVmZmVyUmVsZWFzZVJlZiBjYWxsCi8vLyBtYWRlLiB3aWxsIG5vdCBibG9jayBvbiBhbiBvdXRzdGFuZGluZyBDT0lCdWZmZXJVbm1hcCBidXQgd2lsbCBpbnN0ZWFkCi8vLyByZXR1cm4gQ09JX1JFVFJZLgovLy8KLy8vIEBwYXJhbSAgaW5fQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gZGVzdHJveS4KLy8vCi8vLyBAcmV0dXJuIENPSV9TVUNDRVNTIGlmIHRoZSBidWZmZXIgd2FzIGRlc3Ryb3llZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiB0aGUgYnVmZmVyIGhhbmRsZSB3YXMgaW52YWxpZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9SRVRSWSBpZiB0aGUgYnVmZmVyIGlzIGN1cnJlbnRseSBtYXBwZWQuIFRoZSBidWZmZXIgbXVzdAovLy8gICAgICAgICBmaXJzdCBiZSB1bm1hcHBlZCBiZWZvcmUgaXQgY2FuIGJlIGRlc3Ryb3llZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9SRVRSWSBpZiB0aGUgc3ViLWJ1ZmZlcnMgY3JlYXRlZCBmcm9tIHRoaXMgYnVmZmVyIGFyZSBub3QgeWV0Ci8vLyAgICAgICAgIGRlc3Ryb3llZAovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJEZXN0cm95KAogICAgQ09JQlVGRkVSICAgICAgICAgICBpbl9CdWZmZXIpOwoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIFRoaXMgY2FsbCBpbml0aWF0ZXMgYSByZXF1ZXN0IHRvIGFjY2VzcyBhIHJlZ2lvbiBvZiBhIGJ1ZmZlci4gTXVsdGlwbGUKLy8vIG92ZXJsYXBwaW5nIChvciBub24gb3ZlcmxhcHBpbmcpIHJlZ2lvbnMgY2FuIGJlIG1hcHBlZCBzaW11bHRhbmVvdXNseSBmb3IKLy8vIGFueSBnaXZlbiBidWZmZXIuIElmIGEgY29tcGxldGlvbiBldmVudCBpcyBzcGVjaWZpZWQgdGhpcyBjYWxsIHdpbGwKLy8vIHF1ZXVlIGEgcmVxdWVzdCBmb3IgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBzYXRpc2ZpZWQgd2hlbiB0aGUgYnVmZmVyIGlzCi8vLyBhdmFpbGFibGUuIE9uY2UgYWxsIGNvbmRpdGlvbnMgYXJlIG1ldCB0aGUgY29tcGxldGlvbiBldmVudCB3aWxsIGJlCi8vLyBzaWduYWxlZCBhbmQgdGhlIHVzZXIgY2FuIGFjY2VzcyB0aGUgZGF0YSBhdCBvdXRfcHBEYXRhLiBUaGUgdXNlciBjYW4gY2FsbAovLy8gQ09JRXZlbnRXYWl0IHdpdGggb3V0X3BDb21wbGV0aW9uIHRvIGZpbmQgb3V0IHdoZW4gdGhlIG1hcCBvcGVyYXRpb24gaGFzCi8vLyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIGFjY2Vzc2VzIHRoZSBkYXRhIGJlZm9yZSB0aGUgbWFwIG9wZXJhdGlvbiBpcwovLy8gY29tcGxldGUgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZC4gSWYgb3V0X3BDb21wbGV0aW9uIGlzIE5VTEwgdGhlbiB0aGlzCi8vLyBjYWxsIGJsb2NrcyB1bnRpbCB0aGUgbWFwIG9wZXJhdGlvbiBjb21wbGV0ZXMgYW5kIHdoZW4gdGhpcyBjYWxsIHJldHVybnMKLy8vIG91dF9wcERhdGEgY2FuIGJlIHNhZmVseSBhY2Nlc3NlZC4gVGhpcyBjYWxsIHJldHVybnMgYSBtYXAgaW5zdGFuY2UgaGFuZGxlCi8vLyBpbiBhbiBvdXQgcGFyYW1ldGVyIHdoaWNoIG11c3QgYmUgcGFzc2VkIGludG8gQ09JQnVmZmVyVW5tYXAgd2hlbiB0aGUgdXNlcgovLy8gbm8gbG9uZ2VyIG5lZWRzIGFjY2VzcyB0byB0aGF0IHJlZ2lvbiBvZiB0aGUgYnVmZmVyLgovLy8KLy8vIFRoZSBhZGRyZXNzIHJldHVybmVkIGZyb20gQ09JQnVmZmVyTWFwIG1heSBwb2ludCB0byBtZW1vcnkgdGhhdAovLy8gSW50ZWwoUikgQ29wcm9jZXNzb3IgT2ZmbG9hZCBJbmZyYXN0cnVjdHVyZSAoSW50ZWwoUikgQ09JKQovLy8gbWFuYWdlcyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFRoZSB1c2VyIG11c3Qgbm90IGZyZWUgb3IgcmVhbGxvY2F0ZSB0aGlzCi8vLyBtZW1vcnksIEludGVsKFIpIENvcHJvY2Vzc29yIE9mZmxvYWQgSW5mcmFzdHJ1Y3R1cmUgKEludGVsKFIpIENPSSkKLy8vIHdpbGwgcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgd2hlbiB0aGUgYnVmZmVyIGlzCi8vLyBkZXN0cm95ZWQuCi8vLwovLy8gTm90ZSB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBidWZmZXJzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIG1hcHBlZC4KLy8vIEZvciBpbnN0YW5jZSwgbWFwcGluZyBhIENPSV9CVUZGRVJfTk9STUFMIGZvciB3cml0ZSBtdXN0IHN0YWxsIGlmIHRoZQovLy8gYnVmZmVyIGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIHRvIGJ5IGEgcnVuIGZ1bmN0aW9uLgovLy8gVGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gb2YgQ09JQnVmZmVyTWFwIHdpbGwgbGlrZWx5IGJlIG1vc3QgdXNlZnVsIHdoZW4KLy8vIHBhaXJlZCB3aXRoIGEgQ09JX0JVRkZFUl9OT1JNQUwuCi8vLwovLy8gQHBhcmFtICBpbl9CdWZmZXIKLy8vICAgICAgICAgW2luXSBIYW5kbGUgZm9yIHRoZSBidWZmZXIgdG8gbWFwLgovLy8KLy8vIEBwYXJhbSAgaW5fT2Zmc2V0Ci8vLyAgICAgICAgIFtpbl0gT2Zmc2V0IGludG8gdGhlIGJ1ZmZlciB0aGF0IGEgcG9pbnRlciBzaG91bGQgYmUgcmV0dXJuZWQKLy8vICAgICAgICAgZm9yLiBUaGUgdmFsdWUgMCBjYW4gYmUgcGFzc2VkIGluIHRvIHNpZ25pZnkgdGhhdCB0aGUgbWFwcGVkCi8vLyAgICAgICAgIHJlZ2lvbiBzaG91bGQgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLgovLy8KLy8vIEBwYXJhbSAgaW5fTGVuZ3RoCi8vLyAgICAgICAgIFtpbl0gTGVuZ3RoIG9mIHRoZSBidWZmZXIgYXJlYSB0byBtYXAuIFRoaXMgcGFyYW1ldGVyLCBpbgovLy8gICAgICAgICBjb21iaW5hdGlvbiB3aXRoIGluX09mZnNldCwgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeQovLy8gICAgICAgICB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgYW4gZW50aXJlIGJ1ZmZlciBuZWVkIGJlIG1hcHBlZC4gQQovLy8gICAgICAgICB2YWx1ZSBvZiAwIGNhbiBiZSBwYXNzZWQgaW4gb25seSBpZiBpbl9PZmZzZXQgaXMgMCwgdG8gc2lnbmlmeQovLy8gICAgICAgICB0aGF0IHRoZSBtYXBwZWQgcmVnaW9uIGlzIHRoZSBlbnRpcmUgYnVmZmVyLgovLy8KLy8vIEBwYXJhbSAgaW5fVHlwZQovLy8gICAgICAgICBbaW5dIFRoZSBhY2Nlc3MgdHlwZSB0aGF0IGlzIG5lZWRlZCBieSB0aGUgYXBwbGljYXRpb24uIFRoaXMgd2lsbAovLy8gICAgICAgICBhZmZlY3QgaG93IHRoZSBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBvbmNlIHRoZSBtYXAgb3BlcmF0aW9uCi8vLyAgICAgICAgIGNvbXBsZXRlcy4gU2VlIHRoZSBDT0lfTUFQX1RZUEUgZW51bSBmb3IgbW9yZSBkZXRhaWxzLgovLy8KLy8vIEBwYXJhbSAgaW5fTnVtRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGluIHRoZSBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIGFycmF5LiBUaGlzIG1heSBiZSAwIGlmIHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCB0aGUgbWFwCi8vLyAgICAgICAgIGNhbGwgaW5pdGlhdGlvbiB0byB3YWl0IGZvciBhbnkgZXZlbnRzIHRvIGJlIHNpZ25hbGVkIGJlZm9yZQovLy8gICAgICAgICBzdGFydGluZyB0aGUgbWFwIG9wZXJhdGlvbnMuCi8vLwovLy8gQHBhcmFtICBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgaGFuZGxlcyB0byBwcmV2aW91c2x5IGNyZWF0ZWQgQ09JRVZFTlQKLy8vICAgICAgICAgb2JqZWN0cyB0aGF0IHRoaXMgbWFwIG9wZXJhdGlvbiB3aWxsIHdhaXQgZm9yIGJlZm9yZSBzdGFydGluZy4KLy8vICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGFzeW5jaHJvbm91cwovLy8gICAgICAgICBtYXAgY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMgc3VjaCBhcyBydW4gZnVuY3Rpb25zIG9yIG90aGVyCi8vLyAgICAgICAgIGFzeW5jaHJvbm91cyBtYXAgY2FsbHMuIFRoZSB1c2VyIG1heSBwYXNzIGluIE5VTEwgaWYgdGhleSBkbyBub3QKLy8vICAgICAgICAgd2lzaCB0byB3YWl0IGZvciBhbnkgZGVwZW5kZW5jaWVzIHRvIGNvbXBsZXRlIGJlZm9yZSBpbml0aWF0aW5nIG1hcAovLy8gICAgICAgICBvcGVyYXRpb25zLgovLy8KLy8vIEBwYXJhbSAgb3V0X3BDb21wbGV0aW9uCi8vLyAgICAgICAgIFtvdXRdIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBDT0lFVkVOVCBvYmplY3QKLy8vICAgICAgICAgdGhhdCB3aWxsIGJlIHNpZ25hbGVkIHdoZW4gYSBtYXAgY2FsbCB3aXRoIHRoZSBwYXNzZWQgaW4gYnVmZmVyCi8vLyAgICAgICAgIHdvdWxkIGNvbXBsZXRlIGltbWVkaWF0ZWx5LCB0aGF0IGlzLCB0aGUgYnVmZmVyIG1lbW9yeSBoYXMgYmVlbgovLy8gICAgICAgICBhbGxvY2F0ZWQgb24gdGhlIHNvdXJjZSBhbmQgaXRzIGNvbnRlbnRzIHVwZGF0ZWQuIFRoZSB1c2VyIG1heSBwYXNzCi8vLyAgICAgICAgIGluIE5VTEwgaWYgdGhlIHVzZXIgd2FudHMgQ09JQnVmZmVyTWFwIHRvIHBlcmZvcm0gYSBibG9ja2luZyBtYXAKLy8vICAgICAgICAgb3BlcmF0aW9uLgovLy8KLy8vIEBwYXJhbSAgb3V0X3BNYXBJbnN0YW5jZQovLy8gICAgICAgICBbb3V0XSBBIHBvaW50ZXIgdG8gYSBDT0lNQVBJTlNUQU5DRSB3aGljaCByZXByZXNlbnRzIHRoaXMgbWFwcGluZwovLy8gICAgICAgICBvZiB0aGUgYnVmZmVyIGFuZCBtdXN0IGJlIHBhc3NlZCBpbiB0byBDT0lCdWZmZXJVbm1hcCB3aGVuIGFjY2VzcwovLy8gICAgICAgICB0byB0aGlzIHJlZ2lvbiBvZiB0aGUgYnVmZmVyIGRhdGEgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLy8vCi8vLyBAcGFyYW0gIG91dF9wcERhdGEKLy8vICAgICAgICAgW291dF0gUG9pbnRlciB0byB0aGUgYnVmZmVyIGRhdGEuIFRoZSBkYXRhIHdpbGwgb25seSBiZSB2YWxpZAovLy8gICAgICAgICB3aGVuIHRoZSBjb21wbGV0aW9uIG9iamVjdCBpcyBzaWduYWxlZCwgb3IgZm9yIGEgc3luY2hyb25vdXMKLy8vICAgICAgICAgbWFwIG9wZXJhdGlvbiB3aXRoIHRoZSBjYWxsIHRvIG1hcCByZXR1cm5zLgovLy8KLy8vCi8vLyBAcmV0dXJuIENPSV9TVUNDRVNTIGlmIHRoZSBtYXAgcmVxdWVzdCBzdWNjZWVkcy4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fT2Zmc2V0IG9mIChpbl9PZmZzZXQgKyBpbl9MZW5ndGgpIGV4Y2VlZHMKLy8vICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fTGVuZ3RoIGlzIDAsIGJ1dCBpbl9PZmZzZXQgaXMgbm90IDAuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX1R5cGUgaXMgbm90IGEgdmFsaWQgQ09JX01BUF9UWVBFLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIGluX051bURlcGVuZGVuY2llcyBpcyBub24temVybyB3aGlsZQovLy8gICAgICAgICBpbl9wRGVwZW5kZW5jaWVzIHdhcyBwYXNzZWQgaW4gYXMgTlVMTC4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiBpbl9wRGVwZW5kZW5jaWVzIGlzIG5vbi1OVUxMIGJ1dAovLy8gICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMgaXMgemVyby4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiB0aGUgaW5fVHlwZSBvZiBtYXAgaXMgbm90IGEgdmFsaWQgdHlwZQovLy8gICAgICAgICBmb3IgaW5fQnVmZmVyJ3MgdHlwZSBvZiBidWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfSU5WQUxJRF9IQU5ETEUgaWYgaW5fQnVmZmVyIGlzIG5vdCBhIHZhbGlkIGJ1ZmZlciBoYW5kbGUuCi8vLwovLy8gQHJldHVybiBDT0lfSU5WQUxJRF9QT0lOVEVSIGlmIG91dF9wTWFwSW5zdGFuY2Ugb3Igb3V0X3BwRGF0YSBpcyBOVUxMLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJNYXAoCiAgICBDT0lCVUZGRVIgICAgICAgICAgIGluX0J1ZmZlciwKICAgIHVpbnQ2NF90ICAgICAgICAgICAgaW5fT2Zmc2V0LAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9MZW5ndGgsCiAgICBDT0lfTUFQX1RZUEUgICAgICAgIGluX1R5cGUsCiAgICB1aW50MzJfdCAgICAgICAgICAgIGluX051bURlcGVuZGVuY2llcywKICAgIGNvbnN0ICAgQ09JRVZFTlQgICAgICAgICAgICppbl9wRGVwZW5kZW5jaWVzLAogICAgQ09JRVZFTlQgICAgICAgICAgICpvdXRfcENvbXBsZXRpb24sCiAgICBDT0lNQVBJTlNUQU5DRSAgICAgKm91dF9wTWFwSW5zdGFuY2UsCiAgICB2b2lkICAgICAgICAgICAgICAqKm91dF9wcERhdGEpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLwovLy8gRGlzYWJsZXMgU291cmNlIGFjY2VzcyB0byB0aGUgcmVnaW9uIG9mIHRoZSBidWZmZXIgdGhhdCB3YXMgcHJvdmlkZWQKLy8vIHRocm91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCB0byBDT0lCdWZmZXJNYXAuIFRoZSBudW1iZXIgb2YgY2FsbHMgdG8KLy8vIENPSUJ1ZmZlclVubWFwKCkgc2hvdWxkIGFsd2F5cyBtYXRjaCB0aGUgbnVtYmVyIG9mIGNhbGxzIG1hZGUgdG8KLy8vIENPSUJ1ZmZlck1hcCgpLiBUaGUgZGF0YSBwb2ludGVyIHJldHVybmVkIGZyb20gdGhlIENPSUJ1ZmZlck1hcCgpIGNhbGwKLy8vIHdpbGwgYmUgaW52YWxpZCBhZnRlciB0aGlzIGNhbGwuCi8vLwovLy8gQHBhcmFtICBpbl9NYXBJbnN0YW5jZQovLy8gICAgICAgICBbaW5dIGJ1ZmZlciBtYXAgaW5zdGFuY2UgaGFuZGxlIHRvIHVubWFwLgovLy8KLy8vIEBwYXJhbSAgaW5fTnVtRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGluIHRoZSBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIGFycmF5LiBUaGlzIG1heSBiZSAwIGlmIHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCB0aGUgdW5tYXAgY2FsbCB0bwovLy8gICAgICAgICB3YWl0IGZvciBhbnkgZXZlbnRzIHRvIGJlIHNpZ25hbGVkIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSB1bm1hcAovLy8gICAgICAgICBvcGVyYXRpb24uCi8vLwovLy8gQHBhcmFtICBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgaGFuZGxlcyB0byBwcmV2aW91c2x5IGNyZWF0ZWQgQ09JRVZFTlQKLy8vICAgICAgICAgb2JqZWN0cyB0aGF0IHRoaXMgdW5tYXAgb3BlcmF0aW9uIHdpbGwgd2FpdCBmb3IgYmVmb3JlIHN0YXJ0aW5nLgovLy8gICAgICAgICBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjcmVhdGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gYXN5bmNocm9ub3VzCi8vLyAgICAgICAgIHVubWFwIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zIHN1Y2ggYXMgcnVuIGZ1bmN0aW9ucyBvciBvdGhlcgovLy8gICAgICAgICBhc3luY2hyb25vdXMgdW5tYXAgY2FsbHMuIFRoZSB1c2VyIG1heSBwYXNzIGluIE5VTEwgaWYgdGhleSBkbyBub3QKLy8vICAgICAgICAgd2lzaCB0byB3YWl0IGZvciBhbnkgZGVwZW5kZW5jaWVzIHRvIGNvbXBsZXRlIGJlZm9yZSBpbml0aWF0aW5nCi8vLyAgICAgICAgIHVubWFwIG9wZXJhdGlvbnMuCi8vLwovLy8gQHBhcmFtICBvdXRfcENvbXBsZXRpb24KLy8vICAgICAgICAgW291dF0gQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIENPSUVWRU5UIG9iamVjdCB0aGF0IHdpbGwgYmUKLy8vICAgICAgICAgc2lnbmFsZWQgd2hlbiB0aGUgdW5tYXAgaXMgY29tcGxldGUuIFRoZSB1c2VyIG1heSBwYXNzIGluIE5VTEwgaWYKLy8vICAgICAgICAgdGhlIHVzZXIgd2FudHMgQ09JQnVmZmVyVW5tYXAgdG8gcGVyZm9ybSBhIGJsb2NraW5nIHVubWFwCi8vLyAgICAgICAgIG9wZXJhdGlvbi4KLy8vCi8vLyBAcmV0dXJuIENPSV9TVUNDRVNTIHVwb24gc3VjY2Vzc2Z1bCB1bm1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBpbnN0YW5jZS4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiB0aGUgcGFzc2VkIGluIG1hcCBpbnN0YW5jZSBoYW5kbGUgd2FzIE5VTEwuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgdGhlIGluX3BEZXBlbmRlbmNpZXMgaXMgbm9uIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyAwLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIGluX3BEZXBlbmRlbmNpZXMgaXMgTlVMTCBidXQKLy8vICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzIGlzIG5vdCAwLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJVbm1hcCgKICAgIENPSU1BUElOU1RBTkNFICAgICAgaW5fTWFwSW5zdGFuY2UsCiAgICB1aW50MzJfdCAgICAgICAgICAgIGluX051bURlcGVuZGVuY2llcywKICAgIGNvbnN0ICAgQ09JRVZFTlQgICAgICAgICAgICppbl9wRGVwZW5kZW5jaWVzLAogICAgQ09JRVZFTlQgICAgICAgICAgICpvdXRfcENvbXBsZXRpb24pOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLwovLy8gR2V0cyB0aGUgU2luaydzIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGZvciB0aGUgZmlyc3QgcHJvY2VzcwovLy8gdGhhdCBpcyB1c2luZyB0aGUgYnVmZmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFkZHJlc3MKLy8vIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBydW4gZnVuY3Rpb24gb24gdGhlIFNpbmsuIFRoZSB2aXJ0dWFsCi8vLyBhZGRyZXNzIGFzc2lnbmVkIHRvIHRoZSBidWZmZXIgZm9yIHVzZSBvbiB0aGUgc2luayBpcyBmaXhlZDsKLy8vIHRoZSBidWZmZXIgd2lsbCBhbHdheXMgYmUgcHJlc2VudCBhdCB0aGF0IHZpcnR1YWwgYWRkcmVzcyBvbiB0aGUgc2luawovLy8gYW5kIHdpbGwgbm90IGdldCBhIGRpZmZlcmVudCB2aXJ0dWFsIGFkZHJlc3MgYWNyb3NzIGRpZmZlcmVudAovLy8gUnVuRnVuY3Rpb25zLgovLy8gVGhpcyBhZGRyZXNzIGlzIG9ubHkgdmFsaWQgb24gdGhlIFNpbmsgYW5kIHNob3VsZCBub3QgYmUgZGVyZWZlcmVuY2VkIG9uCi8vLyB0aGUgU291cmNlIChleGNlcHQgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYnVmZmVycyBjcmVhdGVkIHdpdGggdGhlCi8vLyBDT0lfU0FNRV9BRERSRVNTIGZsYWcpLgovLy8KLy8vIEBwYXJhbSAgaW5fQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gQnVmZmVyIGhhbmRsZQovLy8KLy8vIEBwYXJhbSAgb3V0X3BBZGRyZXNzCi8vLyAgICAgICAgIFtvdXRdIHBvaW50ZXIgdG8gYSB1aW50NjRfdCogdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBhZGRyZXNzLgovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgdXBvbiBzdWNjZXNzZnVsIHJldHVybiBvZiB0aGUgYnVmZmVyJ3MgYWRkcmVzcy4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiB0aGUgcGFzc2VkIGluIGJ1ZmZlciBoYW5kbGUgd2FzIGludmFsaWQuCi8vLwovLy8gQHJldHVybiBDT0lfSU5WQUxJRF9QT0lOVEVSIGlmIHRoZSBvdXRfcEFkZHJlc3MgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJHZXRTaW5rQWRkcmVzcygKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fQnVmZmVyLAogICAgdWludDY0X3QgICAgICAgICAgICpvdXRfcEFkZHJlc3MpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLwovLy8gR2V0cyB0aGUgU2luaydzIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLiBUaGlzIGlzIHRoZSBzYW1lCi8vLyBhZGRyZXNzIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBydW4gZnVuY3Rpb24gb24gdGhlIFNpbmsuIFRoZSB2aXJ0dWFsCi8vLyBhZGRyZXNzIGFzc2lnbmVkIHRvIHRoZSBidWZmZXIgZm9yIHVzZSBvbiB0aGUgc2luayBpcyBmaXhlZDsKLy8vIHRoZSBidWZmZXIgd2lsbCBhbHdheXMgYmUgcHJlc2VudCBhdCB0aGF0IHZpcnR1YWwgYWRkcmVzcyBvbiB0aGUgc2luawovLy8gYW5kIHdpbGwgbm90IGdldCBhIGRpZmZlcmVudCB2aXJ0dWFsIGFkZHJlc3MgYWNyb3NzIGRpZmZlcmVudAovLy8gUnVuRnVuY3Rpb25zLgovLy8gVGhpcyBhZGRyZXNzIGlzIG9ubHkgdmFsaWQgb24gdGhlIFNpbmsgYW5kIHNob3VsZCBub3QgYmUgZGVyZWZlcmVuY2VkIG9uCi8vLyB0aGUgU291cmNlIChleGNlcHQgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYnVmZmVycyBjcmVhdGVkIHdpdGggdGhlCi8vLyBDT0lfU0FNRV9BRERSRVNTIGZsYWcpLgovLy8KLy8vIEBwYXJhbSAgaW5fUHJvY2VzcwovLy8gICAgICAgICBbaW5dIFRoZSBwcm9jZXNzIGZvciB3aGljaCB0aGUgYWRkcmVzcyBzaG91bGQgYmUgcmV0dXJuZWQuCi8vLyAgICAgICAgIFNwZWNpYWwgaGFuZGxlIHZhbHVlIDAgY2FuIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb247Ci8vLyAgICAgICAgIGluIHRoaXMgY2FzZSwgYWRkcmVzcyBmb3IgdGhlIGZpcnN0IHZhbGlkIHByb2Nlc3Mgd2lsbCBiZSByZXR1cm5lZAovLy8KLy8vIEBwYXJhbSAgaW5fQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gQnVmZmVyIGhhbmRsZQovLy8KLy8vIEBwYXJhbSAgb3V0X3BBZGRyZXNzCi8vLyAgICAgICAgIFtvdXRdIHBvaW50ZXIgdG8gYSB1aW50NjRfdCogdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBhZGRyZXNzLgovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgdXBvbiBzdWNjZXNzZnVsIHJldHVybiBvZiB0aGUgYnVmZmVyJ3MgYWRkcmVzcy4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiB0aGUgcGFzc2VkIGluIGJ1ZmZlciBvciBwcm9jZXNzCi8vLyAgICAgICAgIGhhbmRsZSB3YXMgaW52YWxpZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX1BPSU5URVIgaWYgdGhlIG91dF9wQWRkcmVzcyBwYXJhbWV0ZXIgd2FzIGludmFsaWQuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIHRoZSBpbl9Qcm9jZXNzIGlzIG5vdCB2YWxpZCBmb3IgaW5fQnVmZmVyIGF0IHRoZQovLy8gICAgICAgICBtb21lbnQgb2YgY2FsbGluZyB0aGUgZnVuY3Rpb24uCi8vLwpDT0lBQ0NFU1NBUEkKQ09JUkVTVUxUCkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzRXgoCiAgICBDT0lQUk9DRVNTICAgICAgICAgIGluX1Byb2Nlc3MsCiAgICBDT0lCVUZGRVIgICAgICAgICAgIGluX0J1ZmZlciwKICAgIHVpbnQ2NF90ICAgICAgICAgICAqb3V0X3BBZGRyZXNzKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIENvcHkgZGF0YSBmcm9tIGEgbm9ybWFsIHZpcnR1YWwgYWRkcmVzcyBpbnRvIGFuIGV4aXN0aW5nIENPSUJVRkZFUi4KLy8vIFBsZWFzZSBub3RlIHRoYXQgQ09JQnVmZmVyV3JpdGUgZG9lcyBub3QgZm9sbG93IGltcGxpY2l0IGJ1ZmZlcgovLy8gZGVwZW5kZW5jaWVzLiBJZiBhIGJ1ZmZlciBpcyBpbiB1c2UgaW4gYSBydW4gZnVuY3Rpb24gb3IgaGFzIGJlZW4gYWRkZWQKLy8vIHRvIGEgcHJvY2VzcyB1c2luZyBDT0lCdWZmZXJBZGRSZWYgdGhlIGNhbGwgdG8gQ09JQnVmZmVyV3JpdGUgd2lsbCBub3QKLy8vIHdhaXQsIGl0IHdpbGwgc3RpbGwgY29weSBkYXRhIGltbWVkaWF0ZWx5LgovLy8gVGhpcyBpcyB0byBmYWNpbGl0YXRlIGEgdXNhZ2UgbW9kZWwgd2hlcmUgYSBidWZmZXIgaXMgYmVpbmcgdXNlZCBvdXRzaWRlCi8vLyBvZiBhIHJ1biBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgaW4gYSBzcGF3bmVkIHRocmVhZCwgYnV0IGRhdGEgc3RpbGwgbmVlZHMKLy8vIHRvIGJlIHRyYW5zZmVycmVkIHRvIG9yIGZyb20gdGhlIGJ1ZmZlci4KLy8vIEFkZGl0aW9uYWxseSB0aGlzIG1lYW5zIHRoYXQgaWYgbW9yZSB0aGFuIG9uZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLAovLy8gKFNlZSBDT0lQcm9jZXNzQ29uZmlndXJlRE1BKSBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGJ1ZmZlciBtYXkKLy8vIGhhcHBlbiBpbiBwYXJhbGxlbCBpZiB0aGV5IGNhbiBiZSBhc3NpZ25lZCB0byBkaWZmZXJlbnQgRE1BIGhhcmR3YXJlLgovLy8gU28gaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSBleHBsaWNpdCBldmVudCBkZXBlbmRlbmNpZXMgdG8KLy8vIG9yZGVyIG9wZXJhdGlvbnMgd2hlcmUgbmVlZGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fRGVzdEJ1ZmZlcgovLy8gICAgICAgICBbaW5dIEJ1ZmZlciB0byB3cml0ZSBpbnRvLgovLy8KLy8vIEBwYXJhbSAgaW5fRGVzdFByb2Nlc3MKLy8vICAgICAgICAgW2luXSBBIHBvaW50ZXIgdG8gdGhlIHByb2Nlc3MgdG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuLgovLy8gICAgICAgICBCdWZmZXIgaXMgdXBkYXRlZCBvbmx5IGluIHRoaXMgcHJvY2VzcyBhbmQgaW52YWxpZGF0ZWQgaW4gb3RoZXIKLy8vICAgICAgICAgcHJvY2Vzc2VzLiBPbmx5IGEgc2luZ2xlIHByb2Nlc3MgY2FuIGJlIHNwZWNpZmllZC4KLy8vICAgICAgICAgQ2FuIGJlIGxlZnQgTlVMTCBhbmQgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGJlIGNob3Nlbiwgd2hpY2gKLy8vICAgICAgICAgY2hvb3NlcyB0aGUgZmlyc3QgdmFsaWQgcHJvY2VzcyBpbiB3aGljaCByZWdpb25zIGFyZSBmb3VuZC4gT3RoZXIKLy8vICAgICAgICAgYnVmZmVyIHJlZ2lvbnMgYXJlIGludmFsaWRhdGVkIGlmIG5vdCB1cGRhdGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fT2Zmc2V0Ci8vLyAgICAgICAgIFtpbl0gTG9jYXRpb24gaW4gdGhlIGJ1ZmZlciB0byBzdGFydCB3cml0aW5nIHRvLgovLy8KLy8vIEBwYXJhbSAgaW5fcFNvdXJjZURhdGEKLy8vICAgICAgICAgW2luXSBBIHBvaW50ZXIgdG8gbG9jYWwgbWVtb3J5IHRoYXQgc2hvdWxkIGJlIGNvcGllZCBpbnRvIHRoZQovLy8gICAgICAgICBwcm92aWRlZCBidWZmZXIuCi8vLwovLy8gQHBhcmFtICBpbl9MZW5ndGgKLy8vICAgICAgICAgW2luXSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGZyb20gaW5fcFNvdXJjZURhdGEgaW50bwovLy8gICAgICAgICBpbl9EZXN0QnVmZmVyLiBNdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiBpbl9EZXN0QnVmZmVyCi8vLyAgICAgICAgIGFuZCBtdXN0IG5vdCBvdmVyIHJ1biBpbl9EZXN0QnVmZmVyIGlmIGFuIGluX09mZnNldCBpcyBwcm92aWRlZC4KLy8vCi8vLyBAcGFyYW0gIGluX1R5cGUKLy8vICAgICAgICAgW2luXSBUaGUgdHlwZSBvZiBjb3B5IG9wZXJhdGlvbiB0byB1c2UsIG9uZSBvZiBlaXRoZXIKLy8vICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsIENPSV9DT1BZX1VTRV9ETUEsIENPSV9DT1BZX1VTRV9DUFUuCi8vLwovLy8gQHBhcmFtICBpbl9OdW1EZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBUaGUgbnVtYmVyIG9mIGRlcGVuZGVuY2llcyBzcGVjaWZpZWQgaW4gdGhlIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgYXJyYXkuIFRoaXMgbWF5IGJlIDAgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSB3cml0ZSBjYWxsIHRvCi8vLyAgICAgICAgIHdhaXQgZm9yIGFueSBhZGRpdGlvbmFsIGV2ZW50cyB0byBiZSBzaWduYWxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlCi8vLyAgICAgICAgIHdyaXRlIG9wZXJhdGlvbi4KLy8vCi8vLyBAcGFyYW0gIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBBbiBvcHRpb25hbCBhcnJheSBvZiBoYW5kbGVzIHRvIHByZXZpb3VzbHkgY3JlYXRlZCBDT0lFVkVOVAovLy8gICAgICAgICBvYmplY3RzIHRoYXQgdGhpcyB3cml0ZSBvcGVyYXRpb24gd2lsbCB3YWl0IGZvciBiZWZvcmUgc3RhcnRpbmcuCi8vLyAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBidWZmZXIgd3JpdGUKLy8vICAgICAgICAgY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMgc3VjaCBhcyBydW4gZnVuY3Rpb25zIGFuZCBtYXAgY2FsbHMuIFRoZQovLy8gICAgICAgICB1c2VyIG1heSBwYXNzIGluIE5VTEwgaWYgdGhleSBkbyBub3Qgd2lzaCB0byB3YWl0IGZvciBhbnkKLy8vICAgICAgICAgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgdG8gY29tcGxldGUgYmVmb3JlIGRvaW5nIHRoZSB3cml0ZS4KLy8vCi8vLyBAcGFyYW0gIG91dF9wQ29tcGxldGlvbgovLy8gICAgICAgICBbb3V0XSBBbiBvcHRpb25hbCBldmVudCB0byBiZSBzaWduYWxlZCB3aGVuIHRoZSB3cml0ZSBoYXMKLy8vICAgICAgICAgY29tcGxldGVkLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGFzIGEgZGVwZW5kZW5jeSB0byBvcmRlcgovLy8gICAgICAgICB0aGUgd3JpdGUgd2l0aCByZWdhcmQgdG8gZnV0dXJlIG9wZXJhdGlvbnMuCi8vLyAgICAgICAgIElmIG5vIGNvbXBsZXRpb24gZXZlbnQgaXMgcGFzc2VkIGluIHRoZW4gdGhlIHdyaXRlIGlzCi8vLyAgICAgICAgIHN5bmNocm9ub3VzIGFuZCB3aWxsIGJsb2NrIHVudGlsIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KLy8vCi8vLwovLy8gQHJldHVybiBDT0lfU1VDQ0VTUyBpZiB0aGUgYnVmZmVyIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseS4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiB0aGUgYnVmZmVyIGhhbmRsZSB3YXMgaW52YWxpZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fT2Zmc2V0IGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgdGhlIGluX3BEZXBlbmRlbmNpZXMgaXMgbm9uIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyAwLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIGluX3BEZXBlbmRlbmNpZXMgaXMgTlVMTCBidXQKLy8vICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzIGlzIG5vdCAwLgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfUE9JTlRFUiBpZiB0aGUgaW5fcFNvdXJjZURhdGEgcG9pbnRlciBpcyBOVUxMLgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9PZmZzZXQgKyBpbl9MZW5ndGggZXhjZWVkcyB0aGUgc2l6ZSBvZgovLy8gICAgICAgICB0aGUgYnVmZmVyLgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9MZW5ndGggaXMgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9SRVRSWSBpZiBpbl9EZXN0QnVmZmVyIGlzIG1hcHBlZCBhbmQgaXMgbm90IENPSV9CVUZGRVJfT1BFTkNMCi8vLyAgICAgICAgIGJ1ZmZlci4KLy8vCkNPSUFDQ0VTU0FQSQpDT0lSRVNVTFQKQ09JQnVmZmVyV3JpdGVFeCgKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fRGVzdEJ1ZmZlciwKICAgIGNvbnN0ICAgQ09JUFJPQ0VTUyAgICAgICAgICBpbl9EZXN0UHJvY2VzcywKICAgIHVpbnQ2NF90ICAgICAgICAgICAgaW5fT2Zmc2V0LAogICAgY29uc3QgICB2b2lkICAgICAgICAgICAgICAgKmluX3BTb3VyY2VEYXRhLAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9MZW5ndGgsCiAgICBDT0lfQ09QWV9UWVBFICAgICAgIGluX1R5cGUsCiAgICB1aW50MzJfdCAgICAgICAgICAgIGluX051bURlcGVuZGVuY2llcywKICAgIGNvbnN0ICAgQ09JRVZFTlQgICAgICAgICAgICppbl9wRGVwZW5kZW5jaWVzLAogICAgQ09JRVZFTlQgICAgICAgICAgICpvdXRfcENvbXBsZXRpb24pOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLwovLy8gQ29weSBkYXRhIHNwZWNpZmllZCBieSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBkYXRhIHN0cnVjdHVyZSBpbnRvIGFub3RoZXIKLy8vIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGluIGFuIGV4aXN0aW5nIENPSUJVRkZFUi4KLy8vIEFycmF5cyB3aXRoIG1vcmUgdGhhbiAzIGRpbWVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCi8vLyBEaWZmZXJlbnQgbnVtYmVycyBvZiBlbGVtZW50cyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLy8vIFBsZWFzZSBub3RlIHRoYXQgQ09JQnVmZmVyV3JpdGVNdWx0aUQgZG9lcyBub3QgZm9sbG93IGltcGxpY2l0IGJ1ZmZlcgovLy8gZGVwZW5kZW5jaWVzLiBJZiBhIGJ1ZmZlciBpcyBpbiB1c2UgaW4gYSBydW4gZnVuY3Rpb24gb3IgaGFzIGJlZW4gYWRkZWQKLy8vIHRvIGEgcHJvY2VzcyB1c2luZyBDT0lCdWZmZXJBZGRSZWYgdGhlIGNhbGwgdG8gQ09JQnVmZmVyV3JpdGVNdWx0aUQgd2lsbCBub3QKLy8vIHdhaXQsIGl0IHdpbGwgc3RpbGwgY29weSBkYXRhIGltbWVkaWF0ZWx5LgovLy8gVGhpcyBpcyB0byBmYWNpbGl0YXRlIGEgdXNhZ2UgbW9kZWwgd2hlcmUgYSBidWZmZXIgaXMgYmVpbmcgdXNlZCBvdXRzaWRlCi8vLyBvZiBhIHJ1biBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgaW4gYSBzcGF3bmVkIHRocmVhZCwgYnV0IGRhdGEgc3RpbGwgbmVlZHMKLy8vIHRvIGJlIHRyYW5zZmVycmVkIHRvIG9yIGZyb20gdGhlIGJ1ZmZlci4KLy8vIEFkZGl0aW9uYWxseSB0aGlzIG1lYW5zIHRoYXQgaWYgbW9yZSB0aGFuIG9uZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLAovLy8gKFNlZSBDT0lQcm9jZXNzQ29uZmlndXJlRE1BKSBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGJ1ZmZlciBtYXkKLy8vIGhhcHBlbiBpbiBwYXJhbGxlbCBpZiB0aGV5IGNhbiBiZSBhc3NpZ25lZCB0byBkaWZmZXJlbnQgRE1BIGhhcmR3YXJlLgovLy8gU28gaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSBleHBsaWNpdCBldmVudCBkZXBlbmRlbmNpZXMgdG8KLy8vIG9yZGVyIG9wZXJhdGlvbnMgd2hlcmUgbmVlZGVkLgovLy8KLy8vCi8vLyBAcGFyYW0gIGluX0Rlc3RCdWZmZXIKLy8vICAgICAgICAgW2luXSBCdWZmZXIgdG8gd3JpdGUgaW50by4KLy8vCi8vLyBAcGFyYW0gIGluX0Rlc3RQcm9jZXNzCi8vLyAgICAgICAgIFtpbl0gQSBwb2ludGVyIHRvIHRoZSBwcm9jZXNzIHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLy8vICAgICAgICAgQnVmZmVyIGlzIHVwZGF0ZWQgb25seSBpbiB0aGlzIHByb2Nlc3MgYW5kIGludmFsaWRhdGVkIGluIG90aGVyCi8vLyAgICAgICAgIHByb2Nlc3Nlcy4gT25seSBhIHNpbmdsZSBwcm9jZXNzIGNhbiBiZSBzcGVjaWZpZWQuCi8vLyAgICAgICAgIENhbiBiZSBsZWZ0IE5VTEwgYW5kIGRlZmF1bHQgYmVoYXZpb3Igd2lsbCBiZSBjaG9zZW4sIHdoaWNoCi8vLyAgICAgICAgIGNob29zZXMgdGhlIGZpcnN0IHZhbGlkIHByb2Nlc3MgaW4gd2hpY2ggcmVnaW9ucyBhcmUgZm91bmQuIE90aGVyCi8vLyAgICAgICAgIGJ1ZmZlciByZWdpb25zIGFyZSBpbnZhbGlkYXRlZCBpZiBub3QgdXBkYXRlZC4KLy8vCi8vLyBAcGFyYW0gIGluX09mZnNldAovLy8gICAgICAgICBbaW5dIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aXRoaW4gdGhlIGJ1ZmZlci4KLy8vCi8vLyBAcGFyYW0gIGluX0Rlc3RBcnJheQovLy8gICAgICAgICBbaW5dIEEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZgovLy8gICAgICAgICB0aGUgZGF0YSBhcnJheSBpbiB0aGUgYnVmZmVyLiBUb3RhbCBzaXplIG11c3Qgbm90IGJlIGxhcmdlciB0aGFuCi8vLyAgICAgICAgIHRoZSBzaXplIG9mIGluX0Rlc3RCdWZmZXIuIFRoZSBiYXNlIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlIHdpbGwKLy8vICAgICAgICAgYmUgaWdub3JlZC4KLy8vCi8vLyBAcGFyYW0gIGluX1NyY0FycmF5Ci8vLyAgICAgICAgIFtpbl0gQSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mCi8vLyAgICAgICAgIHRoZSBkYXRhIGFycmF5IGluIGxvY2FsIG1lbW9yeSB0aGF0IHNob3VsZCBiZSBjb3BpZWQuIGluX1NyY0FycmF5Ci8vLyAgICAgICAgIGFuZCBpbl9EZXN0QXJyeSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgYmFzZQovLy8gICAgICAgICBmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgdGhlIHZpcnR1YWwgcG9pbnRlciB0byB0aGUgbG9jYWwKLy8vICAgICAgICAgbWVtb3J5IGluIHdoaWNoIHRoaXMgYXJyYXkgaXMgbG9jYXRlZC4KLy8vCi8vLyBAcGFyYW0gIGluX1R5cGUKLy8vICAgICAgICAgW2luXSBUaGUgdHlwZSBvZiBjb3B5IG9wZXJhdGlvbiB0byB1c2UsIG9uZSBvZiBlaXRoZXIKLy8vICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsIENPSV9DT1BZX1VTRV9ETUEsIENPSV9DT1BZX1VTRV9DUFUuCi8vLwovLy8gQHBhcmFtICBpbl9OdW1EZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBUaGUgbnVtYmVyIG9mIGRlcGVuZGVuY2llcyBzcGVjaWZpZWQgaW4gdGhlIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgYXJyYXkuIFRoaXMgbWF5IGJlIDAgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSB3cml0ZSBjYWxsIHRvCi8vLyAgICAgICAgIHdhaXQgZm9yIGFueSBhZGRpdGlvbmFsIGV2ZW50cyB0byBiZSBzaWduYWxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlCi8vLyAgICAgICAgIHdyaXRlIG9wZXJhdGlvbi4KLy8vCi8vLyBAcGFyYW0gIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBBbiBvcHRpb25hbCBhcnJheSBvZiBoYW5kbGVzIHRvIHByZXZpb3VzbHkgY3JlYXRlZCBDT0lFVkVOVAovLy8gICAgICAgICBvYmplY3RzIHRoYXQgdGhpcyB3cml0ZSBvcGVyYXRpb24gd2lsbCB3YWl0IGZvciBiZWZvcmUgc3RhcnRpbmcuCi8vLyAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBidWZmZXIgd3JpdGUKLy8vICAgICAgICAgY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMgc3VjaCBhcyBydW4gZnVuY3Rpb25zIGFuZCBtYXAgY2FsbHMuIFRoZQovLy8gICAgICAgICB1c2VyIG1heSBwYXNzIGluIE5VTEwgaWYgdGhleSBkbyBub3Qgd2lzaCB0byB3YWl0IGZvciBhbnkKLy8vICAgICAgICAgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgdG8gY29tcGxldGUgYmVmb3JlIGRvaW5nIHRoZSB3cml0ZS4KLy8vCi8vLyBAcGFyYW0gIG91dF9wQ29tcGxldGlvbgovLy8gICAgICAgICBbb3V0XSBBbiBvcHRpb25hbCBldmVudCB0byBiZSBzaWduYWxlZCB3aGVuIHRoZSB3cml0ZSBoYXMKLy8vICAgICAgICAgY29tcGxldGVkLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGFzIGEgZGVwZW5kZW5jeSB0byBvcmRlcgovLy8gICAgICAgICB0aGUgd3JpdGUgd2l0aCByZWdhcmQgdG8gZnV0dXJlIG9wZXJhdGlvbnMuCi8vLyAgICAgICAgIElmIG5vIGNvbXBsZXRpb24gZXZlbnQgaXMgcGFzc2VkIGluIHRoZW4gdGhlIHdyaXRlIGlzCi8vLyAgICAgICAgIHN5bmNocm9ub3VzIGFuZCB3aWxsIGJsb2NrIHVudGlsIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KLy8vCi8vLwovLy8gQHJldHVybiBDT0lfU1VDQ0VTUyBpZiB0aGUgYnVmZmVyIHdhcyBjb3BpZWQgc3VjY2Vzc2Z1bGx5LgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfSEFORExFIGlmIHRoZSBidWZmZXIgb3IgcHJvY2VzcyBoYW5kbGUgd2FzIGludmFsaWQuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX09mZnNldCBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIHRoZSBpbl9wRGVwZW5kZW5jaWVzIGlzIG5vbiBOVUxMIGJ1dAovLy8gICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMgaXMgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiBpbl9wRGVwZW5kZW5jaWVzIGlzIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyBub3QgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9OT1RfU1VQUE9SVEVEIG9yIGRpbWVuc2lvbiBvZiBkZXN0aW5hdGlvbiBvciBzb3VyY2UgYXJyYXlzCi8vLyAgICAgICAgIGFyZSBncmVhdGVyIHRoYW4gMyBvciBsZXNzIHRoYW4gMQovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfUE9JTlRFUiBpZiB0aGUgcG9pbnRlciBpbl9TcmNBcnJheS0+YmFzZSBpcyBOVUxMLgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9PZmZzZXQgKyBzaXplIG9mIGluX0Rlc3RBcnJheSBleGNlZWRzIHRoZQovLy8gICAgICAgICBzaXplIG9mIHRoZSBidWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX01FTU9SWSBpZiBhbnkgYWxsb2NhdGlvbiBvZiBtZW1vcnkgZmFpbHMKLy8vCi8vLyBAcmV0dXJuIENPSV9SRVRSWSBpZiBpbl9EZXN0QnVmZmVyIGlzIG1hcHBlZCBhbmQgaXMgbm90Ci8vLyAgICAgICAgIGEgQ09JX0JVRkZFUl9PUEVOQ0wgYnVmZmVyLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJXcml0ZU11bHRpRCgKICAgIENPSUJVRkZFUiAgICAgICAgICBpbl9EZXN0QnVmZmVyLAogICAgY29uc3QgICBDT0lQUk9DRVNTICAgICAgICAgaW5fRGVzdFByb2Nlc3MsCiAgICB1aW50NjRfdCAgICAgICAgICAgaW5fT2Zmc2V0LAogICAgc3RydWN0IGFycl9kZXNjICAgKmluX0Rlc3RBcnJheSwKICAgIHN0cnVjdCBhcnJfZGVzYyAgICppbl9TcmNBcnJheSwKICAgIENPSV9DT1BZX1RZUEUgICAgICBpbl9UeXBlLAogICAgdWludDMyX3QgICAgICAgICAgIGluX051bURlcGVuZGVuY2llcywKICAgIGNvbnN0ICAgQ09JRVZFTlQgICAgICAgICAgKmluX3BEZXBlbmRlbmNpZXMsCiAgICBDT0lFVkVOVCAgICAgICAgICAqb3V0X3BDb21wbGV0aW9uKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIENvcHkgZGF0YSBzcGVjaWZpZWQgYnkgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBhbgovLy8gZXhpc3RpbmcgQ09JQlVGRkVSIHRvIGFub3RoZXIgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgbG9jYXRlZCBpbiBtZW1vcnkuCi8vLyBBcnJheXMgd2l0aCBtb3JlIHRoYW4gMyBkaW1lbnNpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgovLy8gRGlmZmVyZW50IG51bWJlcnMgb2YgZWxlbWVudHMgYmV0d2VlbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBub3Qgc3VwcG9ydGVkLgovLy8gUGxlYXNlIG5vdGUgdGhhdCBDT0lCdWZmZXJSZWFkTXVsdGlEIGRvZXMgbm90IGZvbGxvdyBpbXBsaWNpdCBidWZmZXIKLy8vIGRlcGVuZGVuY2llcy4gSWYgYSBidWZmZXIgaXMgaW4gdXNlIGluIGEgcnVuIGZ1bmN0aW9uIG9yIGhhcyBiZWVuIGFkZGVkCi8vLyB0byBhIHByb2Nlc3MgdXNpbmcgQ09JQnVmZmVyQWRkUmVmIHRoZSBjYWxsIHRvIENPSUJ1ZmZlclJlYWRNdWx0aUQgd2lsbCBub3QKLy8vIHdhaXQsIGl0IHdpbGwgc3RpbGwgY29weSBkYXRhIGltbWVkaWF0ZWx5LgovLy8gVGhpcyBpcyB0byBmYWNpbGl0YXRlIGEgdXNhZ2UgbW9kZWwgd2hlcmUgYSBidWZmZXIgaXMgYmVpbmcgdXNlZCBvdXRzaWRlCi8vLyBvZiBhIHJ1biBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgaW4gYSBzcGF3bmVkIHRocmVhZCwgYnV0IGRhdGEgc3RpbGwgbmVlZHMKLy8vIHRvIGJlIHRyYW5zZmVycmVkIHRvIG9yIGZyb20gdGhlIGJ1ZmZlci4KLy8vIEFkZGl0aW9uYWxseSB0aGlzIG1lYW5zIHRoYXQgaWYgbW9yZSB0aGFuIG9uZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLAovLy8gKFNlZSBDT0lQcm9jZXNzQ29uZmlndXJlRE1BKSBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGJ1ZmZlciBtYXkKLy8vIGhhcHBlbiBpbiBwYXJhbGxlbCBpZiB0aGV5IGNhbiBiZSBhc3NpZ25lZCB0byBkaWZmZXJlbnQgRE1BIGhhcmR3YXJlLgovLy8gU28gaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSBleHBsaWNpdCBldmVudCBkZXBlbmRlbmNpZXMgdG8KLy8vIG9yZGVyIG9wZXJhdGlvbnMgd2hlcmUgbmVlZGVkLgovLy8KLy8vCi8vLyBAcGFyYW0gIGluX1NvdXJjZUJ1ZmZlcgovLy8gICAgICAgICBbaW5dIEJ1ZmZlciB0byByZWFkIGZyb20uCi8vLwovLy8gQHBhcmFtICBpbl9PZmZzZXQKLy8vICAgICAgICAgW2luXSBTdGFydCBsb2NhdGlvbiBvZiB0aGUgc291cmNlIGFycmF5IHdpdGhpbiB0aGUgYnVmZmVyLgovLy8KLy8vIEBwYXJhbSAgaW5fRGVzdEFycmF5Ci8vLyAgICAgICAgIFtpbl0gQSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mCi8vLyAgICAgICAgIHRoZSBkYXRhIGFycmF5IGluIHRoZSBidWZmZXIuIFRvdGFsIHNpemUgbXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4KLy8vICAgICAgICAgdGhlIHNpemUgb2YgaW5fRGVzdEJ1ZmZlci4gVGhlIGJhc2UgZmllbGQgb2YgdGhpcyBzdHJ1Y3R1cmUgd2lsbAovLy8gICAgICAgICBiZSBpZ25vcmVkLgovLy8KLy8vIEBwYXJhbSAgaW5fU3JjQXJyYXkKLy8vICAgICAgICAgW2luXSBBIHBvaW50ZXIgdG8gYSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YKLy8vICAgICAgICAgdGhlIGRhdGEgYXJyYXkgaW4gbG9jYWwgbWVtb3J5IHRoYXQgc2hvdWxkIGJlIGNvcGllZC4gaW5fU3JjQXJyYXkKLy8vICAgICAgICAgYW5kIGluX0Rlc3RBcnJ5IG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRoZSBiYXNlCi8vLyAgICAgICAgIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSB0aGUgdmlydHVhbCBwb2ludGVyIHRvIHRoZSBsb2NhbAovLy8gICAgICAgICBtZW1vcnkgaW4gd2hpY2ggdGhpcyBhcnJheSBpcyBsb2NhdGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fVHlwZQovLy8gICAgICAgICBbaW5dIFRoZSB0eXBlIG9mIGNvcHkgb3BlcmF0aW9uIHRvIHVzZSwgb25lIG9mIGVpdGhlcgovLy8gICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwgQ09JX0NPUFlfVVNFX0RNQSwgQ09JX0NPUFlfVVNFX0NQVS4KLy8vCi8vLyBAcGFyYW0gIGluX051bURlcGVuZGVuY2llcwovLy8gICAgICAgICBbaW5dIFRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBpbiB0aGUgaW5fcERlcGVuZGVuY2llcwovLy8gICAgICAgICBhcnJheS4gVGhpcyBtYXkgYmUgMCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IHdhbnQgdGhlIHdyaXRlIGNhbGwgdG8KLy8vICAgICAgICAgd2FpdCBmb3IgYW55IGFkZGl0aW9uYWwgZXZlbnRzIHRvIGJlIHNpZ25hbGVkIGJlZm9yZSBzdGFydGluZyB0aGUKLy8vICAgICAgICAgd3JpdGUgb3BlcmF0aW9uLgovLy8KLy8vIEBwYXJhbSAgaW5fcERlcGVuZGVuY2llcwovLy8gICAgICAgICBbaW5dIEFuIG9wdGlvbmFsIGFycmF5IG9mIGhhbmRsZXMgdG8gcHJldmlvdXNseSBjcmVhdGVkIENPSUVWRU5UCi8vLyAgICAgICAgIG9iamVjdHMgdGhhdCB0aGlzIHdyaXRlIG9wZXJhdGlvbiB3aWxsIHdhaXQgZm9yIGJlZm9yZSBzdGFydGluZy4KLy8vICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGJ1ZmZlciB3cml0ZQovLy8gICAgICAgICBjYWxscyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBzdWNoIGFzIHJ1biBmdW5jdGlvbnMgYW5kIG1hcCBjYWxscy4gVGhlCi8vLyAgICAgICAgIHVzZXIgbWF5IHBhc3MgaW4gTlVMTCBpZiB0aGV5IGRvIG5vdCB3aXNoIHRvIHdhaXQgZm9yIGFueQovLy8gICAgICAgICBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB0byBjb21wbGV0ZSBiZWZvcmUgZG9pbmcgdGhlIHdyaXRlLgovLy8KLy8vIEBwYXJhbSAgb3V0X3BDb21wbGV0aW9uCi8vLyAgICAgICAgIFtvdXRdIEFuIG9wdGlvbmFsIGV2ZW50IHRvIGJlIHNpZ25hbGVkIHdoZW4gdGhlIHdyaXRlIGhhcwovLy8gICAgICAgICBjb21wbGV0ZWQuIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IHRvIG9yZGVyCi8vLyAgICAgICAgIHRoZSB3cml0ZSB3aXRoIHJlZ2FyZCB0byBmdXR1cmUgb3BlcmF0aW9ucy4KLy8vICAgICAgICAgSWYgbm8gY29tcGxldGlvbiBldmVudCBpcyBwYXNzZWQgaW4gdGhlbiB0aGUgd3JpdGUgaXMKLy8vICAgICAgICAgc3luY2hyb25vdXMgYW5kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgovLy8KLy8vCi8vLyBAcmV0dXJuIENPSV9TVUNDRVNTIGlmIHRoZSBidWZmZXIgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfSEFORExFIGlmIHRoZSBidWZmZXIgb3IgcHJvY2VzcyBoYW5kbGUgd2FzIGludmFsaWQuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX09mZnNldCBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIHRoZSBpbl9wRGVwZW5kZW5jaWVzIGlzIG5vbiBOVUxMIGJ1dAovLy8gICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMgaXMgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiBpbl9wRGVwZW5kZW5jaWVzIGlzIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyBub3QgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9OT1RfU1VQUE9SVEVEIG9yIGRpbWVuc2lvbiBvZiBkZXN0aW5hdGlvbiBvciBzb3VyY2UgYXJyYXlzCi8vLyAgICAgICAgIGFyZSBncmVhdGVyIHRoYW4gMyBvciBsZXNzIHRoYW4gMQovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfUE9JTlRFUiBpZiB0aGUgcG9pbnRlciBpbl9EZXN0QXJyYXktPmJhc2UgaXMgTlVMTC4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fT2Zmc2V0ICsgc2l6ZSBvZiBpbl9Tb3VyY2VBcnJheSBleGNlZWRzIHRoZQovLy8gICAgICAgICBzaXplIG9mIHRoZSBidWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX01FTU9SWSBpZiBhbnkgYWxsb2NhdGlvbiBvZiBtZW1vcnkgZmFpbHMKLy8vCi8vLyBAcmV0dXJuIENPSV9SRVRSWSBpZiBpbl9Tb3VyY2VCdWZmZXIgaXMgbWFwcGVkIGFuZCBpcyBub3QKLy8vICAgICAgICAgYSBDT0lfQlVGRkVSX09QRU5DTCBidWZmZXIuCi8vLwpDT0lBQ0NFU1NBUEkKQ09JUkVTVUxUCkNPSUJ1ZmZlclJlYWRNdWx0aUQoCiAgICBDT0lCVUZGRVIgICAgICAgICAgaW5fU291cmNlQnVmZmVyLAogICAgdWludDY0X3QgICAgICAgICAgIGluX09mZnNldCwKICAgIHN0cnVjdCBhcnJfZGVzYyAgICppbl9EZXN0QXJyYXksCiAgICBzdHJ1Y3QgYXJyX2Rlc2MgICAqaW5fU3JjQXJyYXksCiAgICBDT0lfQ09QWV9UWVBFICAgICAgaW5fVHlwZSwKICAgIHVpbnQzMl90ICAgICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMsCiAgICBjb25zdCAgIENPSUVWRU5UICAgICAgICAgICppbl9wRGVwZW5kZW5jaWVzLAogICAgQ09JRVZFTlQgICAgICAgICAgKm91dF9wQ29tcGxldGlvbik7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vCi8vLyBDb3B5IGRhdGEgZnJvbSBhIG5vcm1hbCB2aXJ0dWFsIGFkZHJlc3MgaW50byBhbiBleGlzdGluZyBDT0lCVUZGRVIuCi8vLyBQbGVhc2Ugbm90ZSB0aGF0IENPSUJ1ZmZlcldyaXRlIGRvZXMgbm90IGZvbGxvdyBpbXBsaWNpdCBidWZmZXIKLy8vIGRlcGVuZGVuY2llcy4gSWYgYSBidWZmZXIgaXMgaW4gdXNlIGluIGEgcnVuIGZ1bmN0aW9uIG9yIGhhcyBiZWVuIGFkZGVkCi8vLyB0byBhIHByb2Nlc3MgdXNpbmcgQ09JQnVmZmVyQWRkUmVmIHRoZSBjYWxsIHRvIENPSUJ1ZmZlcldyaXRlIHdpbGwgbm90Ci8vLyB3YWl0LCBpdCB3aWxsIHN0aWxsIGNvcHkgZGF0YSBpbW1lZGlhdGVseS4KLy8vIFRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBhIHVzYWdlIG1vZGVsIHdoZXJlIGEgYnVmZmVyIGlzIGJlaW5nIHVzZWQgb3V0c2lkZQovLy8gb2YgYSBydW4gZnVuY3Rpb24sIGZvciBleGFtcGxlIGluIGEgc3Bhd25lZCB0aHJlYWQsIGJ1dCBkYXRhIHN0aWxsIG5lZWRzCi8vLyB0byBiZSB0cmFuc2ZlcnJlZCB0byBvciBmcm9tIHRoZSBidWZmZXIuCi8vLyBBZGRpdGlvbmFsbHkgdGhpcyBtZWFucyB0aGF0IGlmIG1vcmUgdGhhbiBvbmUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZCwKLy8vIChTZWUgQ09JUHJvY2Vzc0NvbmZpZ3VyZURNQSkgb3BlcmF0aW9ucyB0byB0aGUgc2FtZSBidWZmZXIgbWF5Ci8vLyBoYXBwZW4gaW4gcGFyYWxsZWwgaWYgdGhleSBjYW4gYmUgYXNzaWduZWQgdG8gZGlmZmVyZW50IERNQSBoYXJkd2FyZS4KLy8vIFNvIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UgZXhwbGljaXQgZXZlbnQgZGVwZW5kZW5jaWVzIHRvCi8vLyBvcmRlciBvcGVyYXRpb25zIHdoZXJlIG5lZWRlZC4KLy8vCi8vLyBAcGFyYW0gIGluX0Rlc3RCdWZmZXIKLy8vICAgICAgICAgW2luXSBCdWZmZXIgdG8gd3JpdGUgaW50by4KLy8vCi8vLyBAcGFyYW0gIGluX09mZnNldAovLy8gICAgICAgICBbaW5dIExvY2F0aW9uIGluIHRoZSBidWZmZXIgdG8gc3RhcnQgd3JpdGluZyB0by4KLy8vCi8vLyBAcGFyYW0gIGluX3BTb3VyY2VEYXRhCi8vLyAgICAgICAgIFtpbl0gQSBwb2ludGVyIHRvIGxvY2FsIG1lbW9yeSB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUKLy8vICAgICAgICAgcHJvdmlkZWQgYnVmZmVyLgovLy8KLy8vIEBwYXJhbSAgaW5fTGVuZ3RoCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBmcm9tIGluX3BTb3VyY2VEYXRhIGludG8KLy8vICAgICAgICAgaW5fRGVzdEJ1ZmZlci4gTXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgaW5fRGVzdEJ1ZmZlcgovLy8gICAgICAgICBhbmQgbXVzdCBub3Qgb3ZlciBydW4gaW5fRGVzdEJ1ZmZlciBpZiBhbiBpbl9PZmZzZXQgaXMgcHJvdmlkZWQuCi8vLwovLy8gQHBhcmFtICBpbl9UeXBlCi8vLyAgICAgICAgIFtpbl0gVGhlIHR5cGUgb2YgY29weSBvcGVyYXRpb24gdG8gdXNlLCBvbmUgb2YgZWl0aGVyCi8vLyAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELCBDT0lfQ09QWV9VU0VfRE1BLCBDT0lfQ09QWV9VU0VfQ1BVLgovLy8KLy8vIEBwYXJhbSAgaW5fTnVtRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGluIHRoZSBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIGFycmF5LiBUaGlzIG1heSBiZSAwIGlmIHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCB0aGUgd3JpdGUgY2FsbCB0bwovLy8gICAgICAgICB3YWl0IGZvciBhbnkgYWRkaXRpb25hbCBldmVudHMgdG8gYmUgc2lnbmFsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZQovLy8gICAgICAgICB3cml0ZSBvcGVyYXRpb24uCi8vLwovLy8gQHBhcmFtICBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgaGFuZGxlcyB0byBwcmV2aW91c2x5IGNyZWF0ZWQgQ09JRVZFTlQKLy8vICAgICAgICAgb2JqZWN0cyB0aGF0IHRoaXMgd3JpdGUgb3BlcmF0aW9uIHdpbGwgd2FpdCBmb3IgYmVmb3JlIHN0YXJ0aW5nLgovLy8gICAgICAgICBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjcmVhdGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gYnVmZmVyIHdyaXRlCi8vLyAgICAgICAgIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zIHN1Y2ggYXMgcnVuIGZ1bmN0aW9ucyBhbmQgbWFwIGNhbGxzLiBUaGUKLy8vICAgICAgICAgdXNlciBtYXkgcGFzcyBpbiBOVUxMIGlmIHRoZXkgZG8gbm90IHdpc2ggdG8gd2FpdCBmb3IgYW55Ci8vLyAgICAgICAgIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHRvIGNvbXBsZXRlIGJlZm9yZSBkb2luZyB0aGUgd3JpdGUuCi8vLwovLy8gQHBhcmFtICBvdXRfcENvbXBsZXRpb24KLy8vICAgICAgICAgW291dF0gQW4gb3B0aW9uYWwgZXZlbnQgdG8gYmUgc2lnbmFsZWQgd2hlbiB0aGUgd3JpdGUgaGFzCi8vLyAgICAgICAgIGNvbXBsZXRlZC4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgdG8gb3JkZXIKLy8vICAgICAgICAgdGhlIHdyaXRlIHdpdGggcmVnYXJkIHRvIGZ1dHVyZSBvcGVyYXRpb25zLgovLy8gICAgICAgICBJZiBubyBjb21wbGV0aW9uIGV2ZW50IGlzIHBhc3NlZCBpbiB0aGVuIHRoZSB3cml0ZSBpcwovLy8gICAgICAgICBzeW5jaHJvbm91cyBhbmQgd2lsbCBibG9jayB1bnRpbCB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi8vLwovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgaWYgdGhlIGJ1ZmZlciB3YXMgY29waWVkIHN1Y2Nlc3NmdWxseS4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiB0aGUgYnVmZmVyIGhhbmRsZSB3YXMgaW52YWxpZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fT2Zmc2V0IGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgdGhlIGluX3BEZXBlbmRlbmNpZXMgaXMgbm9uIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyAwLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIGluX3BEZXBlbmRlbmNpZXMgaXMgTlVMTCBidXQKLy8vICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzIGlzIG5vdCAwLgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfUE9JTlRFUiBpZiB0aGUgaW5fcFNvdXJjZURhdGEgcG9pbnRlciBpcyBOVUxMLgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9PZmZzZXQgKyBpbl9MZW5ndGggZXhjZWVkcyB0aGUgc2l6ZSBvZgovLy8gICAgICAgICB0aGUgYnVmZmVyLgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9MZW5ndGggaXMgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9SRVRSWSBpZiBpbl9EZXN0QnVmZmVyIGlzIG1hcHBlZCBhbmQgaXMgbm90Ci8vLyAgICAgICAgIGEgQ09JX0JVRkZFUl9PUEVOQ0wgYnVmZmVyLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJXcml0ZSgKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fRGVzdEJ1ZmZlciwKICAgIHVpbnQ2NF90ICAgICAgICAgICAgaW5fT2Zmc2V0LAogICAgY29uc3QgICB2b2lkICAgICAgICAgICAgICAgKmluX3BTb3VyY2VEYXRhLAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9MZW5ndGgsCiAgICBDT0lfQ09QWV9UWVBFICAgICAgIGluX1R5cGUsCiAgICB1aW50MzJfdCAgICAgICAgICAgIGluX051bURlcGVuZGVuY2llcywKICAgIGNvbnN0ICAgQ09JRVZFTlQgICAgICAgICAgICppbl9wRGVwZW5kZW5jaWVzLAogICAgQ09JRVZFTlQgICAgICAgICAgICpvdXRfcENvbXBsZXRpb24pOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLwovLy8gQ29weSBkYXRhIGZyb20gYSBidWZmZXIgaW50byBsb2NhbCBtZW1vcnkuCi8vLyBQbGVhc2Ugbm90ZSB0aGF0IENPSUJ1ZmZlclJlYWQgZG9lcyBub3QgZm9sbG93IGltcGxpY2l0IGJ1ZmZlcgovLy8gZGVwZW5kZW5jaWVzLiBJZiBhIGJ1ZmZlciBpcyBpbiB1c2UgaW4gYSBydW4gZnVuY3Rpb24gb3IgaGFzIGJlZW4gYWRkZWQKLy8vIHRvIGEgcHJvY2VzcyB1c2luZyBDT0lCdWZmZXJBZGRSZWYgdGhlIGNhbGwgdG8gQ09JQnVmZmVyUmVhZCB3aWxsIG5vdAovLy8gd2FpdCwgaXQgd2lsbCBzdGlsbCBjb3B5IGRhdGEgaW1tZWRpYXRlbHkuCi8vLyBUaGlzIGlzIHRvIGZhY2lsaXRhdGUgYSB1c2FnZSBtb2RlbCB3aGVyZSBhIGJ1ZmZlciBpcyBiZWluZyB1c2VkIG91dHNpZGUKLy8vIG9mIGEgcnVuIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZSBpbiBhIHNwYXduZWQgdGhyZWFkLCBidXQgZGF0YSBzdGlsbCBuZWVkcwovLy8gdG8gYmUgdHJhbnNmZXJyZWQgdG8gb3IgZnJvbSB0aGUgYnVmZmVyLgovLy8gQWRkaXRpb25hbGx5IHRoaXMgbWVhbnMgdGhhdCBpZiBtb3JlIHRoYW4gb25lIERNQSBjaGFubmVsIGlzIGVuYWJsZWQsCi8vLyAoU2VlIENPSVByb2Nlc3NDb25maWd1cmVETUEpIG9wZXJhdGlvbnMgdG8gdGhlIHNhbWUgYnVmZmVyIG1heQovLy8gaGFwcGVuIGluIHBhcmFsbGVsIGlmIHRoZXkgY2FuIGJlIGFzc2lnbmVkIHRvIGRpZmZlcmVudCBETUEgaGFyZHdhcmUuCi8vLyBTbyBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gdXNlIGV4cGxpY2l0IGV2ZW50IGRlcGVuZGVuY2llcyB0bwovLy8gb3JkZXIgb3BlcmF0aW9ucyB3aGVyZSBuZWVkZWQuCi8vLwovLy8KLy8vIEBwYXJhbSAgaW5fU291cmNlQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gQnVmZmVyIHRvIHJlYWQgZnJvbS4KLy8vCi8vLyBAcGFyYW0gIGluX09mZnNldAovLy8gICAgICAgICBbaW5dIExvY2F0aW9uIGluIHRoZSBidWZmZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgovLy8KLy8vIEBwYXJhbSAgaW5fcERlc3REYXRhCi8vLyAgICAgICAgIFtpbl0gQSBwb2ludGVyIHRvIGxvY2FsIG1lbW9yeSB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGludG8gZnJvbQovLy8gICAgICAgICB0aGUgcHJvdmlkZWQgYnVmZmVyLgovLy8KLy8vIEBwYXJhbSAgaW5fTGVuZ3RoCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBmcm9tIGluX1NvdXJjZUJ1ZmZlciBpbnRvCi8vLyAgICAgICAgIGluX3BEZXN0RGF0YS4gTXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgaW5fU291cmNlQnVmZmVyCi8vLyAgICAgICAgIGFuZCBtdXN0IG5vdCBvdmVyIHJ1biBpbl9Tb3VyY2VCdWZmZXIgaWYgYW4gaW5fT2Zmc2V0IGlzIHByb3ZpZGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fVHlwZQovLy8gICAgICAgICBbaW5dIFRoZSB0eXBlIG9mIGNvcHkgb3BlcmF0aW9uIHRvIHVzZSwgb25lIG9mIGVpdGhlcgovLy8gICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwgQ09JX0NPUFlfVVNFX0RNQSwgQ09JX0NPUFlfVVNFX0NQVS4KLy8vCi8vLyBAcGFyYW0gIGluX051bURlcGVuZGVuY2llcwovLy8gICAgICAgICBbaW5dIFRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBpbiB0aGUgaW5fcERlcGVuZGVuY2llcwovLy8gICAgICAgICBhcnJheS4gVGhpcyBtYXkgYmUgMCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IHdhbnQgdGhlIHJlYWQgY2FsbCB0bwovLy8gICAgICAgICB3YWl0IGZvciBhbnkgYWRkaXRpb25hbCBldmVudHMgdG8gYmUgc2lnbmFsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZQovLy8gICAgICAgICByZWFkIG9wZXJhdGlvbi4KLy8vCi8vLyBAcGFyYW0gIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBBbiBvcHRpb25hbCBhcnJheSBvZiBoYW5kbGVzIHRvIHByZXZpb3VzbHkgY3JlYXRlZCBDT0lFVkVOVAovLy8gICAgICAgICBvYmplY3RzIHRoYXQgdGhpcyByZWFkIG9wZXJhdGlvbiB3aWxsIHdhaXQgZm9yIGJlZm9yZSBzdGFydGluZy4KLy8vICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGJ1ZmZlciByZWFkCi8vLyAgICAgICAgIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zIHN1Y2ggYXMgcnVuIGZ1bmN0aW9ucyBhbmQgbWFwIGNhbGxzLiBUaGUKLy8vICAgICAgICAgdXNlciBtYXkgcGFzcyBpbiBOVUxMIGlmIHRoZXkgZG8gbm90IHdpc2ggdG8gd2FpdCBmb3IgYW55Ci8vLyAgICAgICAgIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHRvIGNvbXBsZXRlIGJlZm9yZSBkb2luZyB0aGUgcmVhZC4KLy8vCi8vLyBAcGFyYW0gIG91dF9wQ29tcGxldGlvbgovLy8gICAgICAgICBbb3V0XSBBbiBvcHRpb25hbCBldmVudCB0byBiZSBzaWduYWxlZCB3aGVuIHRoZSByZWFkIGhhcwovLy8gICAgICAgICBjb21wbGV0ZWQuIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IHRvIG9yZGVyCi8vLyAgICAgICAgIHRoZSByZWFkIHdpdGggcmVnYXJkIHRvIGZ1dHVyZSBvcGVyYXRpb25zLgovLy8gICAgICAgICBJZiBubyBjb21wbGV0aW9uIGV2ZW50IGlzIHBhc3NlZCBpbiB0aGVuIHRoZSByZWFkIGlzCi8vLyAgICAgICAgIHN5bmNocm9ub3VzIGFuZCB3aWxsIGJsb2NrIHVudGlsIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KLy8vCi8vLyBAcmV0dXJuIENPSV9TVUNDRVNTIGlmIHRoZSBidWZmZXIgd2FzIGNvcGllZCBzdWNjZXNzZnVsbHkuCi8vLwovLy8gQHJldHVybiBDT0lfSU5WQUxJRF9IQU5ETEUgaWYgdGhlIGJ1ZmZlciBoYW5kbGUgd2FzIGludmFsaWQuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX09mZnNldCBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIHRoZSBpbl9wRGVwZW5kZW5jaWVzIGlzIG5vbiBOVUxMIGJ1dAovLy8gICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMgaXMgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiBpbl9wRGVwZW5kZW5jaWVzIGlzIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyBub3QgMC4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fT2Zmc2V0ICsgaW5fTGVuZ3RoIGV4Y2VlZHMgdGhlIHNpemUgb2YKLy8vICAgICAgICAgdGhlIGJ1ZmZlci4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fTGVuZ3RoIGlzIDAuCi8vLwovLy8gQHJldHVybiBDT0lfSU5WQUxJRF9QT0lOVEVSIGlmIHRoZSBpbl9wRGVzdERhdGEgcG9pbnRlciBpcyBOVUxMLgovLy8KLy8vIEByZXR1cm4gQ09JX1JFVFJZIGlmIGluX1NvdXJjZUJ1ZmZlciBpcyBtYXBwZWQgYW5kIGlzIG5vdAovLy8gICAgICAgICBhIENPSV9CVUZGRVJfT1BFTkNMIGJ1ZmZlci4KLy8vCkNPSUFDQ0VTU0FQSQpDT0lSRVNVTFQKQ09JQnVmZmVyUmVhZCgKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fU291cmNlQnVmZmVyLAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9PZmZzZXQsCiAgICB2b2lkICAgICAgICAgICAgICAgKmluX3BEZXN0RGF0YSwKICAgIHVpbnQ2NF90ICAgICAgICAgICAgaW5fTGVuZ3RoLAogICAgQ09JX0NPUFlfVFlQRSAgICAgICBpbl9UeXBlLAogICAgdWludDMyX3QgICAgICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMsCiAgICBjb25zdCAgIENPSUVWRU5UICAgICAgICAgICAqaW5fcERlcGVuZGVuY2llcywKICAgIENPSUVWRU5UICAgICAgICAgICAqb3V0X3BDb21wbGV0aW9uKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIENvcHkgZGF0YSBiZXR3ZWVuIHR3byBidWZmZXJzLiBJdCBhbHNvIGFsbG93cyBjb3B5aW5nIHdpdGhpbiB0aGUgc2FtZQovLy8gYnVmZmVyLiBGb3IgY29weSB3aXRoaW4gdGhlIHNhbWUgYnVmZmVyLCBpZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lvbnMKLy8vIG92ZXJsYXAgdGhlbiB0aGlzIEFQSSByZXR1cm5zIGVycm9yLgovLy8gUGxlYXNlIG5vdGUgdGhhdCBDT0lCdWZmZXJDb3B5IGRvZXMgbm90IGZvbGxvdyBpbXBsaWNpdCBidWZmZXIKLy8vIGRlcGVuZGVuY2llcy4gSWYgYSBidWZmZXIgaXMgaW4gdXNlIGluIGEgcnVuIGZ1bmN0aW9uIG9yIGhhcyBiZWVuIGFkZGVkCi8vLyB0byBhIHByb2Nlc3MgdXNpbmcgQ09JQnVmZmVyQWRkUmVmIHRoZSBjYWxsIHRvIENPSUJ1ZmZlckNvcHkgd2lsbCBub3QKLy8vIHdhaXQsIGl0IHdpbGwgc3RpbGwgY29weSBkYXRhIGltbWVkaWF0ZWx5LgovLy8gVGhpcyBpcyB0byBmYWNpbGl0YXRlIGEgdXNhZ2UgbW9kZWwgd2hlcmUgYSBidWZmZXIgaXMgYmVpbmcgdXNlZCBvdXRzaWRlCi8vLyBvZiBhIHJ1biBmdW5jdGlvbiwgZm9yIGV4YW1wbGUgaW4gYSBzcGF3bmVkIHRocmVhZCwgYnV0IGRhdGEgc3RpbGwgbmVlZHMKLy8vIHRvIGJlIHRyYW5zZmVycmVkIHRvIG9yIGZyb20gdGhlIGJ1ZmZlci4KLy8vIEFkZGl0aW9uYWxseSB0aGlzIG1lYW5zIHRoYXQgaWYgbW9yZSB0aGFuIG9uZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLAovLy8gKFNlZSBDT0lQcm9jZXNzQ29uZmlndXJlRE1BKSBvcGVyYXRpb25zIHRvIHRoZSBzYW1lIGJ1ZmZlciBtYXkKLy8vIGhhcHBlbiBpbiBwYXJhbGxlbCBpZiB0aGV5IGNhbiBiZSBhc3NpZ25lZCB0byBkaWZmZXJlbnQgRE1BIGhhcmR3YXJlLgovLy8gU28gaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSBleHBsaWNpdCBldmVudCBkZXBlbmRlbmNpZXMgdG8KLy8vIG9yZGVyIG9wZXJhdGlvbnMgd2hlcmUgbmVlZGVkLgovLy8gV2hlbiBhIGRlc3Ryb3llZCBidWZmZXIgKGRlc3RpbmF0aW9uIG9yIHNvdXJjZSkgaXMgcHJvdmlkZWQgdG8gdGhlCi8vLyBmdW5jdGlvbiwgdGhlbiBiZWhhdmlvciBpcyB1bnNwZWNpZmllZC4KLy8vCi8vLyBAcGFyYW0gIGluX0Rlc3RCdWZmZXIKLy8vICAgICAgICAgW2luXSBCdWZmZXIgdG8gY29weSBpbnRvLgovLy8KLy8vIEBwYXJhbSAgaW5fRGVzdFByb2Nlc3MKLy8vICAgICAgICAgW2luXSBBIHBvaW50ZXIgdG8gdGhlIHByb2Nlc3MgdG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuLgovLy8gICAgICAgICBCdWZmZXIgaXMgdXBkYXRlZCBvbmx5IGluIHRoaXMgcHJvY2VzcyBhbmQgaW52YWxpZGF0ZWQgaW4gb3RoZXIKLy8vICAgICAgICAgcHJvY2Vzc2VzLiBPbmx5IGEgc2luZ2xlIHByb2Nlc3MgY2FuIGJlIHNwZWNpZmllZC4KLy8vICAgICAgICAgQ2FuIGJlIGxlZnQgTlVMTCBhbmQgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGJlIGNob3Nlbiwgd2hpY2gKLy8vICAgICAgICAgY2hvb3NlcyB0aGUgZmlyc3QgdmFsaWQgcHJvY2VzcyBpbiB3aGljaCByZWdpb25zIGFyZSBmb3VuZC4gT3RoZXIKLy8vICAgICAgICAgYnVmZmVyIHJlZ2lvbnMgYXJlIGludmFsaWRhdGVkIGlmIG5vdCB1cGRhdGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fU291cmNlQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gQnVmZmVyIHRvIGNvcHkgZnJvbS4KLy8vCi8vLyBAcGFyYW0gIGluX0Rlc3RPZmZzZXQKLy8vICAgICAgICAgW2luXSBMb2NhdGlvbiBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHRvIHN0YXJ0IHdyaXRpbmcgdG8uCi8vLwovLy8gQHBhcmFtICBpbl9Tb3VyY2VPZmZzZXQKLy8vICAgICAgICAgW2luXSBMb2NhdGlvbiBpbiB0aGUgc291cmNlIGJ1ZmZlciB0byBzdGFydCByZWFkaW5nIGZyb20uCi8vLwovLy8gQHBhcmFtICBpbl9MZW5ndGgKLy8vICAgICAgICAgW2luXSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSBpbl9Tb3VyY2VCdWZmZXIgaW50bwovLy8gICAgICAgICBpbl9EZXN0aW5hdGlvbkJ1ZmZlci4KLy8vICAgICAgICAgSWYgdGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgYXMgemVybyB0aGVuIGxlbmd0aCB0byBiZSBjb3BpZWQKLy8gICAgICAgICAgaXMgZW50aXJlIGRlc3RpbmF0aW9uIGJ1ZmZlcidzIGxlbmd0aC4KLy8vICAgICAgICAgTXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgaW5fU291cmNlQnVmZmVyIG9yCi8vLyAgICAgICAgIGluX0Rlc3RCdWZmZXIgYW5kIG11c3Qgbm90IG92ZXIgcnVuIGluX1NvdXJjZUJ1ZmZlciBvcgovLy8gICAgICAgICBpbl9EZXN0QnVmZmVyIGlmIG9mZnNldHMgYXJlIHNwZWNpZmllZC4KLy8vCi8vLyBAcGFyYW0gIGluX1R5cGUKLy8vICAgICAgICAgW2luXSBUaGUgdHlwZSBvZiBjb3B5IG9wZXJhdGlvbiB0byB1c2UsIG9uZSBvZiBlaXRoZXIKLy8vICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsIENPSV9DT1BZX1VTRV9ETUEsIENPSV9DT1BZX1VTRV9DUFUuCi8vLwovLy8gQHBhcmFtICBpbl9OdW1EZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBUaGUgbnVtYmVyIG9mIGRlcGVuZGVuY2llcyBzcGVjaWZpZWQgaW4gdGhlIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgYXJyYXkuIFRoaXMgbWF5IGJlIDAgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSBjb3B5IGNhbGwgdG8KLy8vICAgICAgICAgd2FpdCBmb3IgYW55IGFkZGl0aW9uYWwgZXZlbnRzIHRvIGJlIHNpZ25hbGVkIGJlZm9yZSBzdGFydGluZyB0aGUKLy8vICAgICAgICAgY29weSBvcGVyYXRpb24uCi8vLwovLy8gQHBhcmFtICBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgaGFuZGxlcyB0byBwcmV2aW91c2x5IGNyZWF0ZWQgQ09JRVZFTlQKLy8vICAgICAgICAgb2JqZWN0cyB0aGF0IHRoaXMgY29weSBvcGVyYXRpb24gd2lsbCB3YWl0IGZvciBiZWZvcmUgc3RhcnRpbmcuCi8vLyAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBidWZmZXIgY29weQovLy8gICAgICAgICBjYWxscyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBzdWNoIGFzIHJ1biBmdW5jdGlvbnMgYW5kIG1hcCBjYWxscy4gVGhlCi8vLyAgICAgICAgIHVzZXIgbWF5IHBhc3MgaW4gTlVMTCBpZiB0aGV5IGRvIG5vdCB3aXNoIHRvIHdhaXQgZm9yIGFueQovLy8gICAgICAgICBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB0byBjb21wbGV0ZSBiZWZvcmUgZG9pbmcgdGhlIGNvcHkuCi8vLwovLy8gQHBhcmFtICBvdXRfcENvbXBsZXRpb24KLy8vICAgICAgICAgW291dF0gQW4gb3B0aW9uYWwgZXZlbnQgdG8gYmUgc2lnbmFsZWQgd2hlbiB0aGUgY29weSBoYXMKLy8vICAgICAgICAgY29tcGxldGVkLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGFzIGEgZGVwZW5kZW5jeSB0byBvcmRlcgovLy8gICAgICAgICB0aGUgY29weSB3aXRoIHJlZ2FyZCB0byBmdXR1cmUgb3BlcmF0aW9ucy4KLy8vICAgICAgICAgSWYgbm8gY29tcGxldGlvbiBldmVudCBpcyBwYXNzZWQgaW4gdGhlbiB0aGUgY29weSBpcwovLy8gICAgICAgICBzeW5jaHJvbm91cyBhbmQgd2lsbCBibG9jayB1bnRpbCB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi8vLwovLy8gQHJldHVybiBDT0lfU1VDQ0VTUyBpZiB0aGUgYnVmZmVyIHdhcyBjb3BpZWQgc3VjY2Vzc2Z1bGx5LgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfSEFORExFIGlmIGVpdGhlciBidWZmZXIgaGFuZGxlIHdhcyBpbnZhbGlkLgovLy8KLy8vIEByZXR1cm4gQ09JX01FTU9SWV9PVkVSTEFQIGlmIGluX1NvdXJjZUJ1ZmZlciBhbmQgaW5fRGVzdEJ1ZmZlciBhcmUgdGhlCi8vLyAgICAgICAgIHNhbWUgYnVmZmVyKG9yIGhhdmUgdGhlIHNhbWUgcGFyZW50IGJ1ZmZlcikgYW5kIHRoZSBzb3VyY2UgYW5kCi8vLyAgICAgICAgIGRlc3RpbmF0aW9uIHJlZ2lvbnMgb3ZlcmxhcAovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9EZXN0T2Zmc2V0IGlzIGlzIGJleW9uZCB0aGUgZW5kIG9mCi8vLyAgICAgICAgIGluX0Rlc3RCdWZmZXIKLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fU291cmNlT2Zmc2V0IGlzIGJleW9uZCB0aGUgZW5kIG9mCi8vLyAgICAgICAgIGluX1NvdXJjZUJ1ZmZlci4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fRGVzdE9mZnNldCArIGluX0xlbmd0aCBleGNlZWRzIHRoZSBzaXplIG9mCi8vLyAgICAgICAgIHRoZSBpbl9EZXN0QnVmZmVyCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX1NvdXJjZU9mZnNldCArIGluX0xlbmd0aCBleGNlZWRzCi8vLyAgICAgICAgIHRoZSBzaXplIG9mIGluX1NvdXJjZUJ1ZmZlci4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiB0aGUgaW5fcERlcGVuZGVuY2llcyBpcyBub24gTlVMTCBidXQKLy8vICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzIGlzIDAuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgaW5fcERlcGVuZGVuY2llcyBpcyBOVUxMIGJ1dAovLy8gICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMgaXMgbm90IDAuCi8vLwovLy8gQHJldHVybiBDT0lfUkVUUlkgaWYgaW5fRGVzdEJ1ZmZlciBvciBpbl9Tb3VyY2VCdWZmZXIgYXJlIG1hcHBlZCBhbmQgbm90Ci8vLyAgICAgICAgIENPSV9CVUZGRVJfT1BFTkNMIGJ1ZmZlcnMuCi8vLwpDT0lBQ0NFU1NBUEkKQ09JUkVTVUxUCkNPSUJ1ZmZlckNvcHlFeCgKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fRGVzdEJ1ZmZlciwKICAgIGNvbnN0ICAgQ09JUFJPQ0VTUyAgICAgICAgICBpbl9EZXN0UHJvY2VzcywKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fU291cmNlQnVmZmVyLAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9EZXN0T2Zmc2V0LAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9Tb3VyY2VPZmZzZXQsCiAgICB1aW50NjRfdCAgICAgICAgICAgIGluX0xlbmd0aCwKICAgIENPSV9DT1BZX1RZUEUgICAgICAgaW5fVHlwZSwKICAgIHVpbnQzMl90ICAgICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzLAogICAgY29uc3QgICBDT0lFVkVOVCAgICAgICAgICAgKmluX3BEZXBlbmRlbmNpZXMsCiAgICBDT0lFVkVOVCAgICAgICAgICAgKm91dF9wQ29tcGxldGlvbik7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vCi8vLyBDb3B5IGRhdGEgYmV0d2VlbiB0d28gYnVmZmVycy4gSXQgYWxzbyBhbGxvd3MgY29weWluZyB3aXRoaW4gdGhlIHNhbWUKLy8vIGJ1ZmZlci4gRm9yIGNvcHkgd2l0aGluIHRoZSBzYW1lIGJ1ZmZlciwgaWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpb25zCi8vLyBvdmVybGFwIHRoZW4gdGhpcyBBUEkgcmV0dXJucyBlcnJvci4KLy8vIFBsZWFzZSBub3RlIHRoYXQgQ09JQnVmZmVyQ29weSBkb2VzIG5vdCBmb2xsb3cgaW1wbGljaXQgYnVmZmVyCi8vLyBkZXBlbmRlbmNpZXMuIElmIGEgYnVmZmVyIGlzIGluIHVzZSBpbiBhIHJ1biBmdW5jdGlvbiBvciBoYXMgYmVlbiBhZGRlZAovLy8gdG8gYSBwcm9jZXNzIHVzaW5nIENPSUJ1ZmZlckFkZFJlZiB0aGUgY2FsbCB0byBDT0lCdWZmZXJDb3B5IHdpbGwgbm90Ci8vLyB3YWl0LCBpdCB3aWxsIHN0aWxsIGNvcHkgZGF0YSBpbW1lZGlhdGVseS4KLy8vIFRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBhIHVzYWdlIG1vZGVsIHdoZXJlIGEgYnVmZmVyIGlzIGJlaW5nIHVzZWQgb3V0c2lkZQovLy8gb2YgYSBydW4gZnVuY3Rpb24sIGZvciBleGFtcGxlIGluIGEgc3Bhd25lZCB0aHJlYWQsIGJ1dCBkYXRhIHN0aWxsIG5lZWRzCi8vLyB0byBiZSB0cmFuc2ZlcnJlZCB0byBvciBmcm9tIHRoZSBidWZmZXIuCi8vLyBBZGRpdGlvbmFsbHkgdGhpcyBtZWFucyB0aGF0IGlmIG1vcmUgdGhhbiBvbmUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZCwKLy8vIChTZWUgQ09JUHJvY2Vzc0NvbmZpZ3VyZURNQSkgb3BlcmF0aW9ucyB0byB0aGUgc2FtZSBidWZmZXIgbWF5Ci8vLyBoYXBwZW4gaW4gcGFyYWxsZWwgaWYgdGhleSBjYW4gYmUgYXNzaWduZWQgdG8gZGlmZmVyZW50IERNQSBoYXJkd2FyZS4KLy8vIFNvIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UgZXhwbGljaXQgZXZlbnQgZGVwZW5kZW5jaWVzIHRvCi8vLyBvcmRlciBvcGVyYXRpb25zIHdoZXJlIG5lZWRlZC4KLy8vIFdoZW4gYSBkZXN0cm95ZWQgYnVmZmVyIChkZXN0aW5hdGlvbiBvciBzb3VyY2UpIGlzIHByb3ZpZGVkIHRvIHRoZQovLy8gZnVuY3Rpb24sIHRoZW4gYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQuCi8vLwovLy8gQHBhcmFtICBpbl9EZXN0QnVmZmVyCi8vLyAgICAgICAgIFtpbl0gQnVmZmVyIHRvIGNvcHkgaW50by4KLy8vCi8vLyBAcGFyYW0gIGluX1NvdXJjZUJ1ZmZlcgovLy8gICAgICAgICBbaW5dIEJ1ZmZlciB0byBjb3B5IGZyb20uCi8vLwovLy8gQHBhcmFtICBpbl9EZXN0T2Zmc2V0Ci8vLyAgICAgICAgIFtpbl0gTG9jYXRpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBzdGFydCB3cml0aW5nIHRvLgovLy8KLy8vIEBwYXJhbSAgaW5fU291cmNlT2Zmc2V0Ci8vLyAgICAgICAgIFtpbl0gTG9jYXRpb24gaW4gdGhlIHNvdXJjZSBidWZmZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgovLy8KLy8vIEBwYXJhbSAgaW5fTGVuZ3RoCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gaW5fU291cmNlQnVmZmVyIGludG8KLy8vICAgICAgICAgaW5fRGVzdGluYXRpb25CdWZmZXIuCi8vLyAgICAgICAgIElmIHRoZSBsZW5ndGggaXMgc3BlY2lmaWVkIGFzIHplcm8gdGhlbiBsZW5ndGggdG8gYmUgY29waWVkCi8vLyAgICAgICAgIGlzIGVudGlyZSBkZXN0aW5hdGlvbiBidWZmZXIncyBsZW5ndGguCi8vLyAgICAgICAgIE11c3Qgbm90IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGluX1NvdXJjZUJ1ZmZlciBvcgovLy8gICAgICAgICBpbl9EZXN0QnVmZmVyIGFuZCBtdXN0IG5vdCBvdmVyIHJ1biBpbl9Tb3VyY2VCdWZmZXIgb3IKLy8vICAgICAgICAgaW5fRGVzdEJ1ZmZlciBpZiBvZmZzZXRzIGFyZSBzcGVjaWZpZWQuCi8vLwovLy8gQHBhcmFtICBpbl9UeXBlCi8vLyAgICAgICAgIFtpbl0gVGhlIHR5cGUgb2YgY29weSBvcGVyYXRpb24gdG8gdXNlLCBvbmUgb2YgZWl0aGVyCi8vLyAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELCBDT0lfQ09QWV9VU0VfRE1BLCBDT0lfQ09QWV9VU0VfQ1BVLgovLy8KLy8vIEBwYXJhbSAgaW5fTnVtRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIFtpbl0gVGhlIG51bWJlciBvZiBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGluIHRoZSBpbl9wRGVwZW5kZW5jaWVzCi8vLyAgICAgICAgIGFycmF5LiBUaGlzIG1heSBiZSAwIGlmIHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCB0aGUgY29weSBjYWxsIHRvCi8vLyAgICAgICAgIHdhaXQgZm9yIGFueSBhZGRpdGlvbmFsIGV2ZW50cyB0byBiZSBzaWduYWxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlCi8vLyAgICAgICAgIGNvcHkgb3BlcmF0aW9uLgovLy8KLy8vIEBwYXJhbSAgaW5fcERlcGVuZGVuY2llcwovLy8gICAgICAgICBbaW5dIEFuIG9wdGlvbmFsIGFycmF5IG9mIGhhbmRsZXMgdG8gcHJldmlvdXNseSBjcmVhdGVkIENPSUVWRU5UCi8vLyAgICAgICAgIG9iamVjdHMgdGhhdCB0aGlzIGNvcHkgb3BlcmF0aW9uIHdpbGwgd2FpdCBmb3IgYmVmb3JlIHN0YXJ0aW5nLgovLy8gICAgICAgICBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjcmVhdGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gYnVmZmVyIGNvcHkKLy8vICAgICAgICAgY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMgc3VjaCBhcyBydW4gZnVuY3Rpb25zIGFuZCBtYXAgY2FsbHMuIFRoZQovLy8gICAgICAgICB1c2VyIG1heSBwYXNzIGluIE5VTEwgaWYgdGhleSBkbyBub3Qgd2lzaCB0byB3YWl0IGZvciBhbnkKLy8vICAgICAgICAgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgdG8gY29tcGxldGUgYmVmb3JlIGRvaW5nIHRoZSBjb3B5LgovLy8KLy8vIEBwYXJhbSAgb3V0X3BDb21wbGV0aW9uCi8vLyAgICAgICAgIFtvdXRdIEFuIG9wdGlvbmFsIGV2ZW50IHRvIGJlIHNpZ25hbGVkIHdoZW4gdGhlIGNvcHkgaGFzCi8vLyAgICAgICAgIGNvbXBsZXRlZC4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgdG8gb3JkZXIKLy8vICAgICAgICAgdGhlIGNvcHkgd2l0aCByZWdhcmQgdG8gZnV0dXJlIG9wZXJhdGlvbnMuCi8vLyAgICAgICAgIElmIG5vIGNvbXBsZXRpb24gZXZlbnQgaXMgcGFzc2VkIGluIHRoZW4gdGhlIGNvcHkgaXMKLy8vICAgICAgICAgc3luY2hyb25vdXMgYW5kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgaWYgdGhlIGJ1ZmZlciB3YXMgY29waWVkIHN1Y2Nlc3NmdWxseS4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiBlaXRoZXIgYnVmZmVyIGhhbmRsZSB3YXMgaW52YWxpZC4KLy8vCi8vLyBAcmV0dXJuIENPSV9NRU1PUllfT1ZFUkxBUCBpZiBpbl9Tb3VyY2VCdWZmZXIgYW5kIGluX0Rlc3RCdWZmZXIgYXJlIHRoZQovLy8gICAgICAgICBzYW1lIGJ1ZmZlcihvciBoYXZlIHRoZSBzYW1lIHBhcmVudCBidWZmZXIpIGFuZCB0aGUgc291cmNlIGFuZAovLy8gICAgICAgICBkZXN0aW5hdGlvbiByZWdpb25zIG92ZXJsYXAKLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fRGVzdE9mZnNldCBpcyBpcyBiZXlvbmQgdGhlIGVuZCBvZgovLy8gICAgICAgICBpbl9EZXN0QnVmZmVyCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX1NvdXJjZU9mZnNldCBpcyBiZXlvbmQgdGhlIGVuZCBvZgovLy8gICAgICAgICBpbl9Tb3VyY2VCdWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIGluX0Rlc3RPZmZzZXQgKyBpbl9MZW5ndGggZXhjZWVkcyB0aGUgc2l6ZSBvZgovLy8gICAgICAgICB0aGUgaW5fRGVzdEJ1ZmZlcgovLy8KLy8vIEByZXR1cm4gQ09JX09VVF9PRl9SQU5HRSBpZiBpbl9Tb3VyY2VPZmZzZXQgKyBpbl9MZW5ndGggZXhjZWVkcwovLy8gICAgICAgICB0aGUgc2l6ZSBvZiBpbl9Tb3VyY2VCdWZmZXIuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgdGhlIGluX3BEZXBlbmRlbmNpZXMgaXMgbm9uIE5VTEwgYnV0Ci8vLyAgICAgICAgIGluX051bURlcGVuZGVuY2llcyBpcyAwLgovLy8KLy8vIEByZXR1cm4gQ09JX0FSR1VNRU5UX01JU01BVENIIGlmIGluX3BEZXBlbmRlbmNpZXMgaXMgTlVMTCBidXQKLy8vICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzIGlzIG5vdCAwLgovLy8KLy8vIEByZXR1cm4gQ09JX1JFVFJZIGlmIGluX0Rlc3RCdWZmZXIgb3IgaW5fU291cmNlQnVmZmVyIGFyZSBtYXBwZWQgYW5kIG5vdAovLy8gICAgICAgICBDT0lfQlVGRkVSX09QRU5DTCBidWZmZXJzLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJDb3B5KAogICAgQ09JQlVGRkVSICAgICAgICAgICBpbl9EZXN0QnVmZmVyLAogICAgQ09JQlVGRkVSICAgICAgICAgICBpbl9Tb3VyY2VCdWZmZXIsCiAgICB1aW50NjRfdCAgICAgICAgICAgIGluX0Rlc3RPZmZzZXQsCiAgICB1aW50NjRfdCAgICAgICAgICAgIGluX1NvdXJjZU9mZnNldCwKICAgIHVpbnQ2NF90ICAgICAgICAgICAgaW5fTGVuZ3RoLAogICAgQ09JX0NPUFlfVFlQRSAgICAgICBpbl9UeXBlLAogICAgdWludDMyX3QgICAgICAgICAgICBpbl9OdW1EZXBlbmRlbmNpZXMsCiAgICBjb25zdCAgIENPSUVWRU5UICAgICAgICAgICAqaW5fcERlcGVuZGVuY2llcywKICAgIENPSUVWRU5UICAgICAgICAgICAqb3V0X3BDb21wbGV0aW9uKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIFRoaXMgQVBJIGFsbG93cyBhbiBleHBlcmllbmNlZCBJbnRlbChSKSBDb3Byb2Nlc3NvciBPZmZsb2FkIEluZnJhc3RydWN0dXJlCi8vLyAoSW50ZWwoUikgQ09JKSBkZXZlbG9wZXIgdG8gc2V0IHdoZXJlIGEgQ09JQlVGRkVSIGlzCi8vLyBsb2NhdGVkIGFuZCB3aGVuIHRoZSBDT0lCVUZGRVIncyBkYXRhIGlzIG1vdmVkLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMKLy8vIHVzZWZ1bCB3aGVuIHRoZSBkZXZlbG9wZXIga25vd3Mgd2hlbiBhbmQgd2hlcmUgYSBidWZmZXIgaXMgZ29pbmcgdG8gYmUKLy8vIGFjY2Vzc2VkLiBJdCBhbGxvd3MgdGhlIGRhdGEgbW92ZW1lbnQgdG8gaGFwcGVuIHNvb25lciB0aGFuIGlmIHRoZQovLy8gSW50ZWwoUikgQ29wcm9jZXNzb3IgT2ZmbG9hZCBJbmZyYXN0cnVjdHVyZSAoSW50ZWwoUikgQ09JKQovLy8gcnVudGltZSB0cmllZCB0byBtYW5hZ2UgdGhlIGJ1ZmZlciBwbGFjZW1lbnQgaXRzZWxmLiBUaGUgYWR2YW50YWdlIG9mCi8vLyB0aGlzIEFQSSBpcyB0aGF0IHRoZSBkZXZlbG9wZXIga25vd3MgbXVjaCBtb3JlIGFib3V0IHRoZWlyIG93bgovLy8gYXBwbGljYXRpb24ncyBkYXRhIGFjY2VzcyBwYXR0ZXJucyBhbmQgY2FuIHRoZXJlZm9yZSBvcHRpbWl6ZSB0aGUgZGF0YQovLy8gYWNjZXNzIHRvIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgSW50ZWwoUilDb3Byb2Nlc3NvciBPZmZsb2FkCi8vLyBJbmZyYXN0cnVjdHVyZSAoSW50ZWwoUikgQ09JKSBydW50aW1lLiBVc2luZyB0aGlzIEFQSSBtYXkgeWllbGQgYmV0dGVyCi8vLyBtZW1vcnkgdXRpbGl6YXRpb24sIGxvd2VyIGxhdGVuY3kgYW5kIG92ZXJhbGwgaW1wcm92ZWQgd29ya2xvYWQKLy8vIHRocm91Z2hwdXQuCi8vLyBUaGlzIEFQSSBkb2VzIHJlc3BlY3QgaW1wbGljaXQgZGVwZW5kZW5jaWVzIGZvciBidWZmZXIgcmVhZC93cml0ZSBoYXphcmRzLgovLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBidWZmZXIgaXMgYmVpbmcgd3JpdHRlbiBpbiBvbmUgQ09JUFJPQ0VTUyBhbmQgdGhlIHVzZXIKLy8vIHJlcXVlc3RzIHRoZSBidWZmZXIgYmUgcGxhY2VkIGluIGFub3RoZXIgQ09JUFJPQ0VTUyB0aGVuIHRoaXMgQVBJIHdpbGwgd2FpdAovLy8gZm9yIHRoZSBmaXJzdCBhY2Nlc3MgdG8gY29tcGxldGUgYmVmb3JlIG1vdmluZyB0aGUgYnVmZmVyLgovLy8gVGhpcyBBUEkgaXMgbm90IHJlcXVpcmVkIGZvciBwcm9ncmFtIGNvcnJlY3RuZXNzLiBJdCBpcyBpbnRlbmRlZCBzb2xlbHkKLy8vIGZvciBhZHZhbmNlZCBJbnRlbChSKSBDb3Byb2Nlc3NvciBPZmZsb2FkIEluZnJhc3RydWN0dXJlIChJbnRlbChSKSBDT0kpCi8vLyBkZXZlbG9wZXJzIHdobyB3aXNoIHRvIGZpbmUgdHVuZSB0aGVpciBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZQovLy8gQ2FzZXMgd2hlcmUgImEgY2hhbmdlIGluIHN0YXRlIiBpcyBhbiBlcnJvciBjb25kaXRpb24gdGhlIGNoYW5nZSBqdXN0IGdldHMKLy8vIGlnbm9yZWQgd2l0aG91dCBhbnkgZXJyb3IuIFRoaXMgaXMgYmVjYXVzZSB0aGUgU2V0U3RhdGUgY2FuIGJlIGEKLy8vIG5vbmJsb2NraW5nIGNhbGwgYW5kIGluIHN1Y2ggY2FzZXMgd2UgY2FuJ3QgcmVseSBvbiB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlcgovLy8gYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwuIFdlIGNhbiBkbyB0aGUgdHJhbnNpdGlvbiBjaGVja3Mgb25seSBhdCB0aGUgdGltZQovLy8gd2hlbiB0aGUgYWN0dWFsIHN0YXRlIGNoYW5nZSBoYXBwZW5zICh3aGljaCBpcyBzb21ldGhpbmcgaW4gZnV0dXJlKS4KLy8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyB3YXkgdG8gcmVwb3J0IGFuIGVycm9yIGZyb20gc29tZXRoaW5nIHRoYXQgaGFwcGVucyBpbgovLy8gZnV0dXJlIGFuZCB0aGF0IGlzIHdoeSBzdWNoIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBub3AuIE9uZSBleGFtcGxlIGlzIHVzaW5nCi8vLyBWQUxJRF9NQVlfRFJPUCB3aXRoIENPSV9TSU5LX09XTkVSUyB3aGVuIGJ1ZmZlciBpcyBub3QgdmFsaWQgYXQgc291cmNlLgovLy8gVGhpcyBvcGVyYXRpb24gd2lsbCBiZSBhIG5vcCBpZiBhdCB0aGUgdGltZSBvZiBhY3R1YWwgc3RhdGUgY2hhbmdlIHRoZQovLy8gYnVmZmVyIGlzIG5vdCB2YWxpZCBhdCBzb3VyY2UuCi8vLwovLy8gQHBhcmFtICBpbl9CdWZmZXIKLy8vICAgICAgICAgW2luXSBUaGUgYnVmZmVyIHRvIG1vZGlmeS4KLy8vCi8vLyBAcGFyYW0gIGluX1Byb2Nlc3MKLy8vICAgICAgICAgW2luXSBUaGUgcHJvY2VzcyB3aGVyZSB0aGUgc3RhdGUgaXMgYmVpbmcgbW9kaWZpZWQgZm9yIHRoaXMKLy8vICAgICAgICAgYnVmZmVyLiBUbyBtb2RpZnkgYnVmZmVyJ3Mgc3RhdGUgb24gc291cmNlIHByb2Nlc3MgdXNlCi8vLyAgICAgICAgIENPSV9QUk9DRVNTX1NPVVJDRSBhcyBwcm9jZXNzIGhhbmRsZS4gVG8gbW9kaWZ5IGJ1ZmZlcidzCi8vLyAgICAgICAgIHN0YXRlIG9uIGFsbCBwcm9jZXNzZXMgd2hlcmUgYnVmZmVyIGlzIHZhbGlkIHVzZSBDT0lfU0lOS19PV05FUlMKLy8vICAgICAgICAgYXMgdGhlIHByb2Nlc3MgaGFuZGxlLgovLy8KLy8vIEBwYXJhbSAgaW5fU3RhdGUKLy8vICAgICAgICAgW2luXSBUaGUgbmV3IHN0YXRlIGZvciB0aGUgYnVmZmVyLiBUaGUgYnVmZmVyJ3Mgc3RhdGUgY291bGQgYmUKLy8vICAgICAgICAgc2V0IHRvIGludmFsaWQgb24gb25lIG9mIHRoZSBzaW5rIHByb2Nlc3NlcyB3aGVyZSBpdCBpcyBiZWluZwovLy8gICAgICAgICB1c2VkLgovLy8KLy8vIEBwYXJhbSAgaW5fRGF0YU1vdmUKLy8vICAgICAgICAgW2luXSBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGJ1ZmZlcidzIGRhdGEgc2hvdWxkIGJlIG1vdmVkCi8vLyAgICAgICAgIHdoZW4gdGhlIHN0YXRlIGlzIGNoYW5nZWQuIEZvciBpbnN0YW5jZSwgYSBidWZmZXIncyBzdGF0ZSBtYXkKLy8vICAgICAgICAgYmUgc2V0IHRvIHZhbGlkIG9uIGEgcHJvY2VzcyBhbmQgdGhlIGRhdGEgbW92ZSBmbGFnIG1heSBiZSBzZXQgdG8KLy8vICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFIHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBidWZmZXIgY29udGVudHMgdG8gYmUKLy8vICAgICAgICAgY29waWVkIHRvIHRoZSBwcm9jZXNzIHdoZXJlIGl0IGlzIG5vdyB2YWxpZC4KLy8vCi8vLyBAcGFyYW0gIGluX051bURlcGVuZGVuY2llcwovLy8gICAgICAgICBbaW5dIFRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzIHNwZWNpZmllZCBpbiB0aGUgaW5fcERlcGVuZGVuY2llcwovLy8gICAgICAgICBhcnJheS4gVGhpcyBtYXkgYmUgMCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IHdhbnQgdGhlIFNldFN0YXRlIGNhbGwKLy8vICAgICAgICAgdG8gd2FpdCBmb3IgYW55IGFkZGl0aW9uYWwgZXZlbnRzIHRvIGJlIHNpZ25hbGVkIGJlZm9yZSBzdGFydGluZwovLy8gICAgICAgICB0aGlzIG9wZXJhdGlvbi4KLy8vCi8vLyBAcGFyYW0gIGluX3BEZXBlbmRlbmNpZXMKLy8vICAgICAgICAgW2luXSBBbiBvcHRpb25hbCBhcnJheSBvZiBoYW5kbGVzIHRvIHByZXZpb3VzbHkgY3JlYXRlZCBDT0lFVkVOVAovLy8gICAgICAgICBvYmplY3RzIHRoYXQgdGhpcyBTZXRTdGF0ZSBvcGVyYXRpb24gd2lsbCB3YWl0IGZvciBiZWZvcmUgc3RhcnRpbmcKLy8vICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGJ1ZmZlcgovLy8gICAgICAgICBTZXRTdGF0ZSBjYWxscyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBzdWNoIGFzIHJ1biBmdW5jdGlvbnMgYW5kIG1hcAovLy8gICAgICAgICBjYWxscy4gVGhlIHVzZXIgbWF5IHBhc3MgaW4gTlVMTCBpZiB0aGV5IGRvIG5vdCB3aXNoIHRvIHdhaXQgZm9yCi8vLyAgICAgICAgIGFueSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB0byBjb21wbGV0ZSBiZWZvcmUgZG9pbmcgdGhlIFNldFN0YXRlCi8vLwovLy8gQHBhcmFtICBvdXRfcENvbXBsZXRpb24KLy8vICAgICAgICAgW291dF0gQW4gb3B0aW9uYWwgZXZlbnQgdG8gYmUgc2lnbmFsZWQgd2hlbiB0aGUgU2V0U3RhdGUgaGFzCi8vLyAgICAgICAgIGNvbXBsZXRlZC4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgdG8gb3JkZXIKLy8vICAgICAgICAgdGhlIFNldFN0YXRlIHdpdGggcmVnYXJkIHRvIGZ1dHVyZSBvcGVyYXRpb25zLgovLy8gICAgICAgICBJZiBubyBjb21wbGV0aW9uIGV2ZW50IGlzIHBhc3NlZCBpbiB0aGVuIHRoZSBzdGF0ZSBjaGFuZ2luZyBpcwovLy8gICAgICAgICBzeW5jaHJvbm91cyBhbmQgd2lsbCBibG9jayB1bnRpbCB0aGUgU2V0U3RhdGUgYW5kIGRtYSB0cmFuc2ZlcnMKLy8vICAgICAgICAgcmVsYXRlZCB0byB0aGlzIG9wZXJhdGlvbiBhcmUgY29tcGxldGUuCi8vLwovLy8gQHJldHVybiBDT0lfU1VDQ0VTUyBpZiB0aGUgYnVmZmVyJ3Mgc3RhdGUgd2FzIGNoYW5nZWQgc3VjY2Vzc2Z1bGx5LgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfSEFORExFIGlmIGluX0J1ZmZlciBvciBpbl9Qcm9jZXNzIGlzIGludmFsaWQuCi8vLwovLy8gQHJldHVybiBDT0lfTk9UX1NVUFBPUlRFRCBpZiB0aGUgaW5fQnVmZmVyIGlzIG9mIGFueSB0eXBlIG90aGVyIHRoYW4KLy8vICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwgb3IgQ09JX0JVRkZFUl9PUEVOQ0wuCi8vLwovLy8gQHJldHVybiBDT0lfQVJHVU1FTlRfTUlTTUFUQ0ggaWYgdGhlIGluX1N0YXRlIGlzIENPSV9CVUZGRVJfVkFMSURfTUFZX0RST1AKLy8vICAgICAgICAgYW5kIHRoZSBpbl9Qcm9jZXNzIGlzIENPSV9QUk9DRVNTX1NPVVJDRS4KLy8vCi8vLyBAcmV0dXJuIENPSV9BUkdVTUVOVF9NSVNNQVRDSCBpZiB0aGUgaW5fUHJvY2VzcyBpcyBDT0lfU0lOS19PV05FUlMgYW5kIHRoZQovLy8gICAgICAgICBDT0lfQlVGRkVSX01PVkUgaXMgcGFzc2VkIGFzIG1vdmUgZmxhZy4KLy8vCi8vLyBAcmV0dXJuIENPSV9NSVNTSU5HX0RFUEVOREVOQ1kgaWYgYnVmZmVyIHdhcyBub3QgY3JlYXRlZCBvbiB0aGUgcHJvY2VzcwovLy8gICAgICAgICBoYW5kbGUgdGhhdCB3YXMgcGFzc2VkIGluLgovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJTZXRTdGF0ZSgKICAgIENPSUJVRkZFUiAgICAgICAgICAgICAgIGluX0J1ZmZlciwKICAgIENPSVBST0NFU1MgICAgICAgICAgICAgIGluX1Byb2Nlc3MsCiAgICBDT0lfQlVGRkVSX1NUQVRFICAgICAgICBpbl9TdGF0ZSwKICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHICAgIGluX0RhdGFNb3ZlLAogICAgdWludDMyX3QgICAgICAgICAgICAgICAgaW5fTnVtRGVwZW5kZW5jaWVzLAogICAgY29uc3QgICBDT0lFVkVOVCAgICAgICAgICAgICAgICppbl9wRGVwZW5kZW5jaWVzLAogICAgQ09JRVZFTlQgICAgICAgICAgICAgICAqb3V0X3BDb21wbGV0aW9uKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8KLy8vIENyZWF0ZXMgYSBzdWItYnVmZmVyIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gYSBwb3J0aW9uIG9mIGFuIGV4aXN0aW5nCi8vLyBidWZmZXIuIFRoZSByZXR1cm5lZCBidWZmZXIgaGFuZGxlIGNhbiBiZSB1c2VkIGluIGFsbCBBUEkgY2FsbHMgdGhhdCB0aGUKLy8vIG9yaWdpbmFsIGJ1ZmZlciBoYW5kbGUgY291bGQgYmUgdXNlZCBpbiBleGNlcHQgQ09JQnVmZmVyQ3JlYXRlU3ViQnVmZmVyLgovLy8gU3ViIGJ1ZmZlcnMgb3V0IG9mIEh1Z2UgUGFnZSBCdWZmZXIgYXJlIGFsc28gc3VwcG9ydGVkIGJ1dCB0aGUgb3JpZ2luYWwKLy8vIGJ1ZmZlciBuZWVkcyB0byBiZSBhIE9QRU5DTCBidWZmZXIgY3JlYXRlZCB3aXRoIENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRQovLy8gZmxhZy4KLy8vCi8vLyBXaGVuIHRoZSBzdWItYnVmZmVyIGlzIHVzZWQgb25seSB0aGUgY29ycmVzcG9uZGluZyBzdWItc2VjdGlvbiBvZiB0aGUKLy8vIG9yaWdpbmFsIGJ1ZmZlciBpcyB1c2VkIG9yIGFmZmVjdGVkLgovLy8KLy8vIEBwYXJhbSAgaW5fQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gVGhlIG9yaWdpbmFsIGJ1ZmZlciB0aGF0IHRoaXMgbmV3IHN1Yi1idWZmZXIgaXMgYSByZWZlcmVuY2UKLy8vICAgICAgICAgdG8uCi8vLwovLy8gQHBhcmFtICBpbl9MZW5ndGgKLy8vICAgICAgICAgW2luXSBUaGUgbGVuZ3RoIG9mIHRoZSBzdWItYnVmZmVyIGluIG51bWJlciBvZiBieXRlcy4KLy8vCi8vLyBAcGFyYW0gIGluX09mZnNldAovLy8gICAgICAgICBbaW5dIFdoZXJlIGluIHRoZSBvcmlnaW5hbCBidWZmZXIgdG8gc3RhcnQgdGhpcyBzdWItYnVmZmVyLgovLy8KLy8vIEBwYXJhbSAgb3V0X3BTdWJCdWZmZXIKLy8vICAgICAgICAgW291dF0gUG9pbnRlciB0byBhIGJ1ZmZlciBoYW5kbGUgdGhhdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgbmV3bHkKLy8vICAgICAgICAgY3JlYXRlZCBzdWItYnVmZmVyLgovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgaWYgdGhlIHN1Yi1idWZmZXIgd2FzIGNyZWF0ZWQKLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX0hBTkRMRSBpZiBpbl9CdWZmZXIgaXMgbm90IGEgdmFsaWQgYnVmZmVyIGhhbmRsZS4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfUkFOR0UgaWYgaW5fTGVuZ3RoIGlzIHplcm8sIG9yIGlmIGluX09mZnNldCArIGluX0xlbmd0aAovLy8gICAgICAgICBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KLy8vCi8vLyBAcmV0dXJuIENPSV9PVVRfT0ZfTUVNT1JZIGlmIGFsbG9jYXRpbmcgdGhlIGJ1ZmZlciBmYWlscy4KLy8vCi8vLyBAcmV0dXJuIENPSV9JTlZBTElEX1BPSU5URVIgaWYgdGhlIG91dF9wU3ViQnVmZmVyIHBvaW50ZXIgaXMgTlVMTC4KLy8vCi8vLyBAcmV0dXJuIENPSV9OT1RfU1VQUE9SVEVEIGlmIHRoZSBpbl9CdWZmZXIgaXMgb2YgYW55IHR5cGUgb3RoZXIgdGhhbgovLy8gICAgICAgICBDT0lfQlVGRkVSX09QRU5DTAovLy8KQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJDcmVhdGVTdWJCdWZmZXIoCiAgICBDT0lCVUZGRVIgICBpbl9CdWZmZXIsCiAgICB1aW50NjRfdCAgICBpbl9MZW5ndGgsCiAgICB1aW50NjRfdCAgICBpbl9PZmZzZXQsCiAgICBDT0lCVUZGRVIgICpvdXRfcFN1YkJ1ZmZlcik7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vCi8vLyBSZWxlYXNlcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGFuZCBwcm9jZXNzIGJ5Ci8vLyBpbl9SZWxlYXNlUmVmY250LiBUaGUgcmV0dXJuZWQgcmVzdWx0IGJlaW5nIENPSV9TVUNDRVNTIGluZGljYXRlcyB0aGF0IHRoZQovLy8gc3BlY2lmaWVkIHByb2Nlc3MgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIgdGhhdCBoYXMgYQovLy8gcmVmY250IHRoYXQgY2FuIGJlIGRlY3JlbWVudGVkLiBPdGhlcndpc2UsIGlmIHRoZSBidWZmZXIgb3IgcHJvY2VzcwovLy8gc3BlY2lmaWVkIGRvIG5vdCBleGlzdCwgdGhlbiBDT0lfSU5WQUxJRF9IQU5ETEUgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlCi8vLyBwcm9jZXNzIGRvZXMgbm90IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIgdGhlbgovLy8gQ09JX09VVF9PRl9SQU5HRSB3aWxsIGJlIHJldHVybmVkLgovLy8KLy8vCi8vLyBAcGFyYW0gIGluX1Byb2Nlc3MKLy8vICAgICAgICAgW2luXSBUaGUgQ09JIFByb2Nlc3Mgd2hvc2UgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgovLy8gICAgICAgICB0aGUgdXNlciB3YW50cyB0byBkZWNyZW1lbnQuCi8vLwovLy8gQHBhcmFtICBpbl9CdWZmZXIKLy8vICAgICAgICAgW2luXSBUaGUgYnVmZmVyIHVzZWQgaW4gdGhlIHNwZWNpZmllZCBjb2kgcHJvY2VzcyBpbiB3aGljaCB0aGUgdXNlcgovLy8gICAgICAgICB3YW50cyB0byBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudC4KLy8vCi8vLyBAcGFyYW0gIGluX1JlbGVhc2VSZWZjbnQKLy8vICAgICAgICAgW2luXSBUaGUgdmFsdWUgdGhlIHJlZmVyZW5jZSBjb3VudCB3aWxsIGJlIGRlY3JlbWVudGVkIGJ5LgovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgaWYgdGhlIHJlZmVyZW5jZSBjb3VudCB3YXMgc3VjY2Vzc2Z1bGx5IGRlY3JlbWVudGVkLgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfSEFORExFIGlmIGluX0J1ZmZlciBvciBpbl9Qcm9jZXNzIGFyZSBpbnZhbGlkIGhhbmRsZXMuCi8vLwovLy8gQHJldHVybiBDT0lfT1VUX09GX1JBTkdFIGlmIHRoZSByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgYnVmZmVyIG9yCi8vLyAgICAgICAgIHByb2Nlc3MgZG9lcyBub3QgZXhpc3QuCi8vLwoKQ09JQUNDRVNTQVBJCkNPSVJFU1VMVApDT0lCdWZmZXJSZWxlYXNlUmVmY250KAogICAgQ09JUFJPQ0VTUyAgICAgICAgICBpbl9Qcm9jZXNzLAogICAgQ09JQlVGRkVSICAgICAgICAgICBpbl9CdWZmZXIsCiAgICB1aW50NjRfdCAgICAgICAgICAgIGluX1JlbGVhc2VSZWZjbnQpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLwovLy8gSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGFuZCBwcm9jZXNzIGJ5Ci8vLyBpbl9BZGRSZWZjbnQuIFRoZSByZXR1cm5lZCByZXN1bHQgYmVpbmcgQ09JX1NVQ0NFU1MgaW5kaWNhdGVzIHRoYXQgdGhlCi8vLyBzcGVjaWZpZWQgcHJvY2VzcyBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBvciBhIG5ldwovLy8gcmVmZXJlbmNlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHRoYXQgcmVmZXJlbmNlIGhhcyBhIG5ldyByZWZjbnQuIE90aGVyd2lzZSwKLy8vIGlmIHRoZSBidWZmZXIgb3IgcHJvY2VzcyBzcGVjaWZpZWQgZG8gbm90IGV4aXN0LCB0aGVuIENPSV9JTlZBTElEX0hBTkRMRQovLy8gd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlIGlucHV0IGJ1ZmZlciBpcyBub3QgdmFsaWQgb24gdGhlIHRhcmdldCBwcm9jZXNzCi8vLyB0aGVuIENPSV9OT1RfSU5JVElBTElaRUQgd2lsbCBiZSByZXR1cm5lZCBzaW5jZSB0aGUgYnVmZmVyIGlzIG5vdCBjdXJyZW50Ci8vLyBvciBhbGxvY2F0ZWQgb24gdGhlIHByb2Nlc3MuCi8vLwovLy8gQHBhcmFtICBpbl9Qcm9jZXNzCi8vLyAgICAgICAgIFtpbl0gVGhlIENPSSBQcm9jZXNzIHdob3NlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHNwZWNpZmllZCBidWZmZXIKLy8vICAgICAgICAgdGhlIHVzZXIgd2FudHMgdG8gaW5jcmVtZW50LgovLy8KLy8vIEBwYXJhbSAgaW5fQnVmZmVyCi8vLyAgICAgICAgIFtpbl0gVGhlIGJ1ZmZlciB1c2VkIGluIHRoZSBzcGVjaWZpZWQgY29pIHByb2Nlc3MgaW4gd2hpY2ggdGhlIHVzZXIKLy8vICAgICAgICAgd2FudHMgdG8gaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQuCi8vLwovLy8gQHBhcmFtICBpbl9BZGRSZWZjbnQKLy8vICAgICAgICAgW2luXSBUaGUgdmFsdWUgdGhlIHJlZmVyZW5jZSBjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkIGJ5LgovLy8KLy8vIEByZXR1cm4gQ09JX1NVQ0NFU1MgaWYgdGhlIHJlZmVyZW5jZSBjb3VudCB3YXMgc3VjY2Vzc2Z1bGx5IGluY3JlbWVudGVkLgovLy8KLy8vIEByZXR1cm4gQ09JX0lOVkFMSURfSEFORExFIGlmIGluX0J1ZmZlciBvciBpbl9Qcm9jZXNzIGFyZSBpbnZhbGlkIGhhbmRsZXMuCi8vLwovLy8gQHJldHVybiBDT0lfTk9UX0lOSVRJQUxJWkVEIGlmIGluX0J1ZmZlciBkb2VzIG5vdCBoYXZlIGEgYnVmZmVyIHN0YXRlIG9mCi8vLyAgICAgICAgIENPSV9CVUZGRVJfVkFMSUQgb24gdGhlIGluX1Byb2Nlc3MuCi8vLwpDT0lBQ0NFU1NBUEkKQ09JUkVTVUxUCkNPSUJ1ZmZlckFkZFJlZmNudCgKICAgIENPSVBST0NFU1MgICAgICAgICAgaW5fUHJvY2VzcywKICAgIENPSUJVRkZFUiAgICAgICAgICAgaW5fQnVmZmVyLAogICAgdWludDY0X3QgICAgICAgICAgICBpbl9BZGRSZWZjbnQpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0gLyogZXh0ZXJuICJDIiAqLwojZW5kaWYKCiNlbmRpZiAvKiBfQ09JQlVGRkVSX1NPVVJDRV9IICovCgovKiEgQH0gKi8K