ZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL0NoYW5nZUxvZyBiL2NvbW1vbi96bGliL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVkMzNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDgxIEBACisKKwkJQ2hhbmdlTG9nIGZpbGUgZm9yIHpsaWIKKworQ2hhbmdlcyBpbiAxLjEuNCAoMTEgTWFyY2ggMjAwMikKKy0gWkZSRUUgd2FzIHJlcGVhdGVkIG9uIHNhbWUgYWxsb2NhdGlvbiBvbiBzb21lIGVycm9yIGNvbmRpdGlvbnMuCisgIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCisgIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKKy0gUmV0dXJuZWQgaW5jb3JyZWN0IGVycm9yIChaX01FTV9FUlJPUikgb24gc29tZSBpbnZhbGlkIGRhdGEKKy0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdworICBsZXNzIHRoYW4gMzJLLgorLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQorICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCisJCitDaGFuZ2VzIGluIDEuMS4zICg5IEp1bHkgMTk5OCkKKy0gZml4ICJhbiBpbmZsYXRlIGlucHV0IGJ1ZmZlciBidWcgdGhhdCBzaG93cyB1cCBvbiByYXJlIGJ1dCBwZXJzaXN0ZW50CisgIG9jY2FzaW9ucyIgKE1hcmspCistIGZpeCBnenJlYWQgYW5kIGd6dGVsbCBmb3IgY29uY2F0ZW5hdGVkIC5neiBmaWxlcyAoRGlkaWVyIExlIEJvdGxhbikKKy0gZml4IGd6c2VlayguLi4sIFNFRUtfU0VUKSBpbiB3cml0ZSBtb2RlCistIGZpeCBjcmMgY2hlY2sgYWZ0ZXIgYSBnemVlayAoRnJhbmsgRmF1YmVydCkKKy0gZml4IG1pbml1bnppcCB3aGVuIHRoZSBsYXN0IGVudHJ5IGluIGEgemlwIGZpbGUgaXMgaXRzZWxmIGEgemlwIGZpbGUKKyAgKEogTGlsbGdlKQorLSBhZGQgY29udHJpYi9hc201ODYgYW5kIGNvbnRyaWIvYXNtNjg2IChCcmlhbiBSYWl0ZXIpCisgIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCistIGFkZCBzdXBwb3J0IGZvciBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaSAoQm9iIERlbGxhY2EpCistIGFkZCBzdXBwb3J0IGZvciBDKytCdWlsZGVyIDMgYW5kIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpMiAoRGF2aWRlIE1vcmV0dGkpCistIGRvIG5vdCBleGl0IHByZW1hdHVyZWx5IGluIHVudGd6IGlmIDAgYXQgc3RhcnQgb2YgYmxvY2sgKE1hZ251cyBIb2xtZ3JlbikKKy0gdXNlIG1hY3JvIEVYVEVSTiBpbnN0ZWFkIG9mIGV4dGVybiB0byBzdXBwb3J0IERMTCBmb3IgQmVPUyAoU2FuZGVyIFN0b2tzKQorLSBhZGRlZCBhIEZBUSBmaWxlCisKKy0gU3VwcG9ydCBnemRvcGVuIG9uIE1hYyB3aXRoIE1ldHJvd2Vya3MgKEphc29uIExpbmhhcnQpCistIERvIG5vdCByZWRlZmluZSBCeXRlIG9uIE1hYyAoQnJhZCBQZXR0aXQgJiBKYXNvbiBMaW5oYXJ0KQorLSBkZWZpbmUgU0VFS19FTkQgdG9vIGlmIFNFRUtfU0VUIGlzIG5vdCBkZWZpbmVkIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQorLSBhdm9pZCBzb21lIHdhcm5pbmdzIHdpdGggQm9ybGFuZCBDIChUb20gVGFubmVyKQorLSBmaXggYSBwcm9ibGVtIGluIGNvbnRyaWIvbWluaXppcC96aXAuYyBmb3IgMTYtYml0IE1TRE9TIChHaWxsZXMgVm9sbGFudCkKKy0gZW11bGF0ZSB1dGltZSgpIGZvciBXSU4zMiBpbiBjb250cmliL3VudGd6ICAoR2lsbGVzIFZvbGxhbnQpCistIGFsbG93IHNldmVyYWwgYXJndW1lbnRzIHRvIGNvbmZpZ3VyZSAoVGltIE1vb25leSwgRnJvZG8gTG9vaWphYXJkKQorLSB1c2UgbGliZGlyIGFuZCBpbmNsdWRlZGlyIGluIE1ha2VmaWxlLmluIChUaW0gTW9vbmV5KQorLSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gT1NGMSBWNCAoVGltIE1vb25leSkKKy0gcmVtb3ZlIHNvX2xvY2F0aW9ucyBpbiAibWFrZSBjbGVhbiIgIChUaW0gTW9vbmV5KQorLSBmaXggbWFrZXRyZWUuYyBjb21waWxhdGlvbiBlcnJvciAoR2xlbm4sIE1hcmspCistIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiBub3cgaW4gUHl0aG9uIDEuNSAoSmVyZW15IEh5bHRvbikKKy0gbmV3IE1ha2VmaWxlLnJpc2NvcyAoUmljaCBXYWxrZXIpCistIGluaXRpYWxpemUgc3RhdGljIGRlc2NyaXB0b3JzIGluIHRyZWVzLmMgZm9yIGVtYmVkZGVkIHRhcmdldHMgKE5pY2sgU21pdGgpCistIHVzZSAiZm9vLWd6IiBpbiBleGFtcGxlLmMgZm9yIFJJU0NPUyBhbmQgVk1TIChOaWNrIFNtaXRoKQorLSBhZGQgdGhlIE9TLzIgZmlsZXMgaW4gTWFrZWZpbGUuaW4gdG9vIChBbmRyZXcgWmFib2xvdG55KQorLSBmaXggZmRvcGVuIGFuZCBoYWxsb2MgbWFjcm9zIGZvciBNaWNyb3NvZnQgQyA2LjAgKFRvbSBMYW5lKQorLSBmaXggbWFrZXRyZWUuYyB0byBhbGxvdyBjbGVhbiBjb21waWxhdGlvbiBvZiBpbmZmaXhlZC5oIChNYXJrKQorLSBmaXggcGFyYW1ldGVyIGNoZWNrIGluIGRlZmxhdGVDb3B5IChHdW50aGVyIE5pa2wpCistIGNsZWFudXAgdHJlZXMuYywgdXNlIGNvbXByZXNzZWRfbGVuIG9ubHkgaW4gZGVidWcgbW9kZSAoQ2hyaXN0aWFuIFNwaWVsZXIpCistIE1hbnkgcG9ydGFiaWxpdHkgcGF0Y2hlcyBieSBDaHJpc3RpYW4gU3BpZWxlcjoKKyAgLiB6dXRpbC5jLCB6dXRpbC5oOiBhZGRlZCAiY29uc3QiIGZvciB6bWVtKgorICAuIE1ha2Vfdm1zLmNvbTogZml4ZWQgc29tZSB0eXBvcworICAuIE1ha2Vfdm1zLmNvbTogbXNkb3MvTWFrZWZpbGUuKjogcmVtb3ZlZCB6dXRpbC5oIGZyb20gc29tZSBkZXBlbmRlbmN5IGxpc3RzCisgIC4gbXNkb3MvTWFrZWZpbGUubXNjOiByZW1vdmUgImRlZmF1bHQgcnRsIGxpbmsgbGlicmFyeSIgaW5mbyBmcm9tIG9iaiBmaWxlcworICAuIG1zZG9zL01ha2VmaWxlLio6IHVzZSBtb2RlbC1kZXBlbmRlbnQgbmFtZSBmb3IgdGhlIGJ1aWx0IHpsaWIgbGlicmFyeQorICAuIG1zZG9zL01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5nY2M6CisgICAgIG5ldyBtYWtlZmlsZXMsIGZvciBlbXggKERPUy9PUzIpLCBlbXgmcnN4bnQgYW5kIG1pbmd3MzIgKFdpbmRvd3MgOXggLyBOVCkKKy0gdXNlIGRlZmluZSBpbnN0ZWFkIG9mIHR5cGVkZWYgZm9yIEJ5dGVmIGFsc28gZm9yIE1TQyBzbWFsbC9tZWRpdW0gKFRvbSBMYW5lKQorLSByZXBsYWNlIF9fZmFyIHdpdGggX2ZhciBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5IChDaHJpc3RpYW4gU3BpZWxlciwgVG9tIExhbmUpCistIGZpeCB0ZXN0IGZvciBlcnJuby5oIGluIGNvbmZpZ3VyZSAoVGltIE5ld3NoYW0pCisKK0NoYW5nZXMgaW4gMS4xLjIgKDE5IE1hcmNoIDk4KQorLSBhZGRlZCBjb250cmliL21pbnppcCwgbWluaSB6aXAgYW5kIHVuemlwIGJhc2VkIG9uIHpsaWIgKEdpbGxlcyBWb2xsYW50KQorICBTZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCistIHByZWluaXRpYWxpemUgdGhlIGluZmxhdGUgdGFibGVzIGZvciBmaXhlZCBjb2RlcywgdG8gbWFrZSB0aGUgY29kZQorICBjb21wbGV0ZWx5IHRocmVhZCBzYWZlIChNYXJrKQorLSBzb21lIHNpbXBsaWZpY2F0aW9ucyBhbmQgc2xpZ2h0IHNwZWVkLXVwIHRvIHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspCistIGZpeCBnemVvZiBvbiBub24tY29tcHJlc3NlZCBmaWxlcyAoQWxsYW4gU2NocnVtKQorLSBhZGQgLXN0ZDEgb3B0aW9uIGluIGNvbmZpZ3VyZSBmb3IgT1NGMSB0byBmaXggZ3pwcmludGYgKE1hcnRpbiBNb2tyZWpzKQorLSB1c2UgZGVmYXVsdCB2YWx1ZSBvZiA0SyBmb3IgWl9CVUZTSVpFIGZvciAxNi1iaXQgTVNET1MgKFRpbSBXZWduZXIgKyBHbGVubikKKy0gYWRkZWQgb3MyL01ha2VmaWxlLmRlZiBhbmQgb3MyL3psaWIuZGVmIChBbmRyZXcgWmFib2xvdG55KQorLSBhZGQgc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBVTklYX1NWNC4yTVAgKE1BVFNVVVJBIFRha2Fub3JpKQorLSBkbyBub3Qgd3JhcCBleHRlcm4gIkMiIGFyb3VuZCBzeXN0ZW0gaW5jbHVkZXMgKFRvbSBMYW5lKQorLSBtZW50aW9uIHpsaWIgYmluZGluZyBmb3IgVENMIGluIFJFQURNRSAoQW5kcmVhcyBLdXByaWVzKQorLSBhZGRlZCBhbWlnYS9NYWtlZmlsZS5wdXAgZm9yIEFtaWdhIHBvd2VyVVAgU0FTL0MgUFBDIChBbmRyZWFzIEtsZWluZXJ0KQorLSBhbGxvdyAibWFrZSBpbnN0YWxsIHByZWZpeD0uLi4iIGV2ZW4gYWZ0ZXIgY29uZmlndXJlIChHbGVubiBSYW5kZXJzLVBlaHJzb24pCistIGFsbG93ICJjb25maWd1cmUgLS1wcmVmaXggJEhPTUUiIChUaW0gTW9vbmV5KQorLSByZW1vdmUgd2FybmluZ3MgaW4gZXhhbXBsZS5jIGFuZCBnemlvLmMgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gbW92ZSBNYWtlZmlsZS5zYXMgdG8gYW1pZ2EvTWFrZWZpbGUuc2FzCisKK0NoYW5nZXMgaW4gMS4xLjEgKDI3IEZlYiA5OCkKKy0gZml4IG1hY3JvcyBfdHJfdGFsbHlfKiBpbiBkZWZsYXRlLmggZm9yIGRlYnVnIG1vZGUgIChHbGVubiBSYW5kZXJzLVBlaHJzb24pCistIHJlbW92ZSBibG9jayB0cnVuY2F0aW9uIGhldXJpc3RpYyB3aGljaCBoYWQgdmVyeSBtYXJnaW5hbCBlZmZlY3QgZm9yIHpsaWIKKyAgKHNtYWxsZXIgbGl0X2J1ZnNpemUgdGhhbiBpbiBnemlwIDEuMi40KSBhbmQgZGVncmFkZWQgYSBsaXR0bGUgdGhlCisgIGNvbXByZXNzaW9uIHJhdGlvIG9uIHNvbWUgZmlsZXMuIFRoaXMgYWxzbyBhbGxvd3MgaW5saW5pbmcgX3RyX3RhbGx5IGZvcgorICBtYXRjaGVzIGluIGRlZmxhdGVfc2xvdy4KKy0gYWRkZWQgbXNkb3MvTWFrZWZpbGUudzMyIGZvciBXSU4zMiBNaWNyb3NvZnQgVmlzdWFsIEMrKyAoQm9iIEZyYXppZXIpCisKK0NoYW5nZXMgaW4gMS4xLjAgKDI0IEZlYiA5OCkKKy0gZG8gbm90IHJldHVybiBTVFJFQU1fRU5EIHByZW1hdHVyZWx5IGluIGluZmxhdGUgKEpvaG4gQm93bGVyKQorLSByZXZlcnQgdG8gdGhlIHpsaWIgMS4wLjggaW5mbGF0ZSB0byBhdm9pZCB0aGUgZ2NjIDIuOC4wIGJ1ZyAoSmVyZW15IEJ1aGxlcikKKy0gY29tcGlsZSB3aXRoIC1ERkFTVEVTVCB0byBnZXQgY29tcHJlc3Npb24gY29kZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIG9ubHkKKy0gaW4gbWluaWd6aXAsIHRyeSBtbWFwJ2luZyB0aGUgaW5wdXQgZmlsZSBmaXJzdCAoTWlndWVsIEFsYnJlY2h0KQorLSBpbmNyZWFzZSBzaXplIG9mIEkvTyBidWZmZXJzIGluIG1pbmlnemlwLmMgYW5kIGd6aW8uYyAobm90IGEgYmlnIGdhaW4KKyAgb24gU3VuIGJ1dCBzaWduaWZpY2FudCBvbiBIUCkKKworLSBhZGQgYSBwb2ludGVyIHRvIGV4cGVyaW1lbnRhbCB1bnppcCBsaWJyYXJ5IGluIFJFQURNRSAoR2lsbGVzIFZvbGxhbnQpCistIGluaXRpYWxpemUgdmFyaWFibGUgZ2NjIGluIGNvbmZpZ3VyZSAoQ2hyaXMgSGVyYm9ydGgpCisKK0NoYW5nZXMgaW4gMS4wLjkgKDE3IEZlYiAxOTk4KQorLSBhZGRlZCBnenB1dHMgYW5kIGd6Z2V0cyBmdW5jdGlvbnMKKy0gZG8gbm90IGNsZWFyIGVvZiBmbGFnIGluIGd6c2VlayAoTWFyayBEaWVraGFucykKKy0gZml4IGd6c2VlayBmb3IgZmlsZXMgaW4gdHJhbnNwYXJlbnQgbW9kZSAoTWFyayBEaWVraGFucykKKy0gZG8gbm90IGFzc3VtZSB0aGF0IHZzcHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChKZW5zIEtyaW5rZSkKKy0gcmVwbGFjZSBFWFBPUlQgd2l0aCBaRVhQT1JUIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3RoZXIgcHJvZ3JhbXMKKy0gYWRkZWQgY29tcHJlc3MyIGluIHpjb25mLmgsIHpsaWIuZGVmLCB6bGliLmRudAorLSBuZXcgYXNtIGNvZGUgZnJvbSBHaWxsZXMgVm9sbGFudCBpbiBjb250cmliL2FzbTM4NgorLSBzaW1wbGlmeSB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKToKKyAuIFJlcGxhY2UgWkFMTE9DJ3MgaW4gaHVmdF9idWlsZCgpIHdpdGggc2luZ2xlIFpBTExPQyBpbiBpbmZsYXRlX2Jsb2Nrc19uZXcoKQorIC4gWkFMTE9DIHRoZSBsZW5ndGggbGlzdCBpbiBpbmZsYXRlX3RyZWVzX2ZpeGVkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjaworIC4gWkFMTE9DIHRoZSB2YWx1ZSBhcmVhIGZvciBodWZ0X2J1aWxkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjaworIC4gU2ltcGxpZnkgWl9GSU5JU0ggY2hlY2sgaW4gaW5mbGF0ZSgpCisKKy0gQXZvaWQgZ2NjIDIuOC4wIGNvbXBhcmlzb24gYnVnIGEgbGl0dGxlIGRpZmZlcmVudGx5IHRoYW4gemxpYiAxLjAuOAorLSBpbiBpbmZ0cmVlcy5jLCBhdm9pZCBjYyAtTyBidWcgb24gSFAgKEZhcnNoaWQgRWxhaGkpCistIGluIHpjb25mLmggbW92ZSB0aGUgWkxJQl9ETEwgc3R1ZmYgZWFybGllciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCisgIHRoZSBkZWNsYXJhdGlvbiBvZiBGQVIgKEdpbGxlcyBWT2xsYW50KQorLSBpbnN0YWxsIGxpYnouc28qIHdpdGggbW9kZSA3NTUgKGV4ZWN1dGFibGUpIGluc3RlYWQgb2YgNjQ0IChNYXJjIExlaG1hbm4pCistIHJlYWRfYnVmIGJ1ZiBwYXJhbWV0ZXIgb2YgdHlwZSBCeXRlZiogaW5zdGVhZCBvZiBjaGFyZioKKy0gem1lbWNweSBwYXJhbWV0ZXJzIGFyZSBvZiB0eXBlIEJ5dGVmKiwgbm90IGNoYXJmKiAoSm9zZXBoIFN0cm91dCkKKy0gZG8gbm90IHJlZGVjbGFyZSB1bmxpbmsgaW4gbWluaWd6aXAuYyBmb3IgV0lOMzIgKEpvaG4gQm93bGVyKQorLSBmaXggY2hlY2sgZm9yIHByZXNlbmNlIG9mIGRpcmVjdG9yaWVzIGluICJtYWtlIGluc3RhbGwiIChJYW4gV2lsbGlzKQorCitDaGFuZ2VzIGluIDEuMC44ICgyNyBKYW4gMTk5OCkKKy0gZml4ZWQgb2Zmc2V0cyBpbiBjb250cmliL2FzbTM4Ni9ndm1hdDMyLmFzbSAoR2lsbGVzIFZvbGxhbnQpCistIGZpeCBnemdldGMgYW5kIGd6cHV0YyBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zIChNYXJrdXMgT2Jlcmh1bWVyKQorLSBhZGRlZCBjb21wcmVzczIoKSB0byBhbGxvdyBzZXR0aW5nIHRoZSBjb21wcmVzc2lvbiBsZXZlbAorLSBpbmNsdWRlIHN5cy90eXBlcy5oIHRvIGdldCBvZmZfdCBvbiBzb21lIHN5c3RlbXMgKE1hcmMgTGVobWFubiAmIFFpbmdMb25nKQorLSB1c2UgY29uc3RhbnQgYXJyYXlzIGZvciB0aGUgc3RhdGljIHRyZWVzIGluIHRyZWVzLmMgaW5zdGVhZCBvZiBjb21wdXRpbmcKKyAgdGhlbSBhdCBydW4gdGltZSAodGhhbmtzIHRvIEtlbiBSYWVidXJuIGZvciB0aGlzIHN1Z2dlc3Rpb24pLiBUbyBjcmVhdGUKKyAgdHJlZXMuaCwgY29tcGlsZSB3aXRoIEdFTl9UUkVFU19IIGFuZCBydW4gIm1ha2UgdGVzdCIuCistIGNoZWNrIHJldHVybiBjb2RlIG9mIGV4YW1wbGUgaW4gIm1ha2UgdGVzdCIgYW5kIGRpc3BsYXkgcmVzdWx0CistIHBhc3MgbWluaWd6aXAgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gZmlsZV9jb21wcmVzcworLSBzaW1wbGlmeWluZyBjb2RlIG9mIGluZmxhdGVTeW5jIHRvIGF2b2lkIGdjYyAyLjggYnVnCisKKy0gc3VwcG9ydCBDQz0iZ2NjIC1XYWxsIiBpbiBjb25maWd1cmUgLXMgKFFpbmdMb25nKQorLSBhdm9pZCBhIGZsdXNoIGNhdXNlZCBieSBmdGVsbCBpbiBnem9wZW4gZm9yIHdyaXRlIG1vZGUgKEtlbiBSYWVidXJuKQorLSBmaXggdGVzdCBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncworLSB6bGliLmxpYiAtPiB6bGliLmRsbCBpbiBtc2Rvcy96bGliLnJjIChHaWxsZXMgVm9sbGFudCkKKy0gY2hlY2sgZm9yIFRBUkdFVF9PU19NQUMgaW4gYWRkaXRpb24gdG8gTUFDT1MgKEJyYWQgUGV0dGl0KQorLSBkbyBub3QgdXNlIGZkb3BlbiBmb3IgTWV0cm93ZXJrcyBvbiBNYWMgKEJyYWQgUGV0dGl0KSkKKy0gYWRkIGNoZWNrcyBmb3IgZ3pwdXRjIGFuZCBnenB1dGMgaW4gZXhhbXBsZS5jCistIGF2b2lkIHdhcm5pbmdzIGluIGd6aW8uYyBhbmQgZGVmbGF0ZS5jIChBbmRyZWFzIEtsZWluZXJ0KQorLSB1c2UgY29uc3QgZm9yIHRoZSBDUkMgdGFibGUgKEtlbiBSYWVidXJuKQorLSBmaXhlZCAibWFrZSB1bmluc3RhbGwiIGZvciBzaGFyZWQgbGlicmFyaWVzCistIHVzZSBUcmFjZXYgaW5zdGVhZCBvZiBUcmFjZSBpbiBpbmZibG9jay5jCistIGluIGV4YW1wbGUuYyB1c2UgY29ycmVjdCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGVzdF9zeW5jCistIHN1cHByZXNzICt2bm9jb21wYXR3YXJuaW5ncyBpbiBjb25maWd1cmUgZm9yIEhQVVggKG5vdCBhbHdheXMgc3VwcG9ydGVkKQorCitDaGFuZ2VzIGluIDEuMC43ICgyMCBKYW4gMTk5OCkKKy0gZml4IGd6c2VlayB3aGljaCB3YXMgYnJva2VuIGluIHdyaXRlIG1vZGUKKy0gcmV0dXJuIGVycm9yIGZvciBnenNlZWsgdG8gbmVnYXRpdmUgYWJzb2x1dGUgcG9zaXRpb24KKy0gZml4IGNvbmZpZ3VyZSBmb3IgTGludXggKENodW4tQ2h1bmcgQ2hlbikKKy0gaW5jcmVhc2Ugc3RhY2sgc3BhY2UgZm9yIE1TQyAoVGltIFdlZ25lcikKKy0gZ2V0X2NyY190YWJsZSBhbmQgaW5mbGF0ZVN5bmNQb2ludCBhcmUgRVhQT1JUZWQgKEdpbGxlcyBWb2xsYW50KQorLSBkZWZpbmUgRVhQT1JUVkEgZm9yIGd6cHJpbnRmIChHaWxsZXMgVm9sbGFudCkKKy0gYWRkZWQgbWFuIHBhZ2UgemxpYi4zIChSaWNrIFJvZGdlcnMpCistIGZvciBjb250cmliL3VudGd6LCBmaXggbWFrZWRpcigpIGFuZCBpbXByb3ZlIE1ha2VmaWxlCisKKy0gY2hlY2sgZ3pzZWVrIGluIHdyaXRlIG1vZGUgaW4gZXhhbXBsZS5jCistIGFsbG9jYXRlIGV4dHJhIGJ1ZmZlciBmb3Igc2Vla3Mgb25seSBpZiBnenNlZWsgaXMgYWN0dWFsbHkgY2FsbGVkCistIGF2b2lkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29ucyAoVGltIFdlZ25lciwgR2lsbGVzIFZvbGxhbnQpCistIGFkZCBpbmZsYXRlU3luY1BvaW50IGluIHpjb25mLmgKKy0gZml4IGxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIG50L3psaWIuZG50IGFuZCBtZHNvcy96bGliLmRlZgorCitDaGFuZ2VzIGluIDEuMC42ICgxOSBKYW4gMTk5OCkKKy0gYWRkIGZ1bmN0aW9ucyBnenByaW50ZiwgZ3pwdXRjLCBnemdldGMsIGd6dGVsbCwgZ3plb2YsIGd6c2VlaywgZ3pyZXdpbmQgYW5kCisgIGd6c2V0cGFyYW1zICh0aGFua3MgdG8gUm9sYW5kIEdpZXJzaWcgYW5kIEtldmluIFJ1bGFuZCBmb3Igc29tZSBvZiB0aGlzIGNvZGUpCistIEZpeCBhIGRlZmxhdGUgYnVnIG9jY3VyaW5nIG9ubHkgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwICh0aGFua3MgdG8KKyAgQW5keSBCdWNrbGVyIGZvciBmaW5kaW5nIHRoaXMgb25lKS4KKy0gSW4gbWluaWd6aXAsIHBhc3MgdHJhbnNwYXJlbnRseSBhbHNvIHRoZSBmaXJzdCBieXRlIGZvciAuWiBmaWxlcy4KKy0gcmV0dXJuIFpfQlVGX0VSUk9SIGluc3RlYWQgb2YgWl9PSyBpZiBvdXRwdXQgYnVmZmVyIGZ1bGwgaW4gdW5jb21wcmVzcygpCistIGNoZWNrIFpfRklOSVNIIGluIGluZmxhdGUgKHRoYW5rcyB0byBNYXJjIFNjaGx1cGVyKQorLSBJbXBsZW1lbnQgZGVmbGF0ZUNvcHkgKHRoYW5rcyB0byBBZGFtIENvc3RlbGxvKQorLSBtYWtlIHN0YXRpYyBsaWJyYXJpZXMgYnkgZGVmYXVsdCBpbiBjb25maWd1cmUsIGFkZCAtLXNoYXJlZCBvcHRpb24uCistIG1vdmUgTVNET1Mgb3IgV2luZG93cyBzcGVjaWZpYyBmaWxlcyB0byBkaXJlY3RvcnkgbXNkb3MKKy0gc3VwcHJlc3MgdGhlIG5vdGlvbiBvZiBwYXJ0aWFsIGZsdXNoIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKKyAgKGJ1dCB0aGUgc3ltYm9sIFpfUEFSVElBTF9GTFVTSCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4wLjQpCistIHN1cHByZXNzIGhpc3RvcnkgYnVmZmVyIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKKyAgKHRoaXMgZmVhdHVyZSB3YXMgbm90IGltcGxlbWVudGVkIGFueXdheSBpbiAxLjAuNCkKKy0gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpbmZsYXRlSW5pdCBvcgorICBpbmZsYXRlSW5pdDIKKy0gYWRkIEVYUE9SVCBpbiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIChmb3IgV2luZG93cyBETEwpCistIGFkZGVkIE1ha2VmaWxlLm50ICh0aGFua3MgdG8gU3RlcGhlbiBXaWxsaWFtcykKKy0gYWRkZWQgdGhlIHVuc3VwcG9ydGVkICJjb250cmliIiBkaXJlY3Rvcnk6CisgICBjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorCTM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgorICAgY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CisgICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCisgICBjb250cmliL2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+CisJQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCisgICBjb250cmliL3VudGd6LyAgYnkgIlBlZHJvIEEuIEFyYW5kYSBHdXRpXGlycmV6IiA8cGFhZ0B0aWQuZXM+CisJQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgorICAgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CisgICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLgorLSBwYXNzIHBhcmFtcyAtZiAoZmlsdGVyZWQgZGF0YSksIC1oIChodWZmbWFuIG9ubHkpLCAtMSB0byAtOSAoY29tcHJlc3Npb24KKyAgbGV2ZWwpIGluIG1pbmlnemlwICh0aGFua3MgdG8gVG9tIExhbmUpCisKKy0gdXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gZGVmbGF0ZQorLSBhZGRlZCB0ZXN0IGZvciBnenNlZWsgYW5kIGd6dGVsbCBpbiBleGFtcGxlLmMKKy0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50KCkgKGhhY2sgZm9yIFBhdWwgTWFja2VycmFzKQorLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIHpFcnJvciB0byBjb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nCisgIChmb3IgVGltIFNtaXRoZXJzKQorLSBBbGxvdyBjb21waWxhdGlvbiBvZiBnemlvIHdpdGggLUROT19ERUZMQVRFIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLgorLSBVc2UgZGVmYXVsdCBtZW1jcHkgZm9yIFN5bWFudGVjIE1TRE9TIGNvbXBpbGVyLgorLSBBZGQgRVhQT1JUIGtleXdvcmQgZm9yIGNoZWNrX2Z1bmMgKG5lZWRlZCBmb3IgV2luZG93cyBETEwpCistIGFkZCBjdXJyZW50IGRpcmVjdG9yeSB0byBMRF9MSUJSQVJZX1BBVEggZm9yICJtYWtlIHRlc3QiCistIGNyZWF0ZSBhbHNvIGEgbGluayBmb3IgbGliei5zby4xCistIGFkZGVkIHN1cHBvcnQgZm9yIEZVSklUU1UgVVhQL0RTICh0aGFua3MgdG8gVG9zaGlha2kgTm9tdXJhKQorLSB1c2UgJChTSEFSRURMSUIpIGluc3RlYWQgb2YgbGliei5zbyBpbiBNYWtlZmlsZS5pbiAoZm9yIEhQVVgpCistIGFkZGVkIC1zb25hbWUgZm9yIExpbnV4IGluIGNvbmZpZ3VyZSAoQ2h1bi1DaHVuZyBDaGVuLAorLSBhc3NpZ24gbnVtYmVycyB0byB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIHpsaWIuZGVmIChmb3IgV2luZG93cyBETEwpCistIGFkZCBhZHZpY2UgaW4gemxpYi5oIGZvciBiZXN0IHVzYWdlIG9mIGRlZmxhdGVTZXREaWN0aW9uYXJ5CistIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGJ1ZyBvbiBBdGFyaSAoY2FzdCBaX05VTEwgaW4gY2FsbCBvZiBzLT5jaGVja2ZuKQorLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkIGZvciBUdXJib0MgaW4gbGFyZ2UgbW9kZWwKKy0gYXZvaWQgInZlcnNpb25TdHJpbmciWzBdIChCb3JsYW5kIGJ1ZykKKy0gYWRkIE5FRURfRFVNTVlfUkVUVVJOIGZvciBCb3JsYW5kCistIHVzZSB2YXJpYWJsZSB6X3ZlcmJvc2UgZm9yIHRyYWNpbmcgaW4gZGVidWcgbW9kZSAoTC4gUGV0ZXIgRGV1dHNjaCkuCistIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQ0MKKy0gZGVmaW5lZCBTVERDIGZvciBPUy8yIChEYXZpZCBDaGFybGFwKQkKKy0gbGltaXQgZXh0ZXJuYWwgbmFtZXMgdG8gOCBjaGFycyBmb3IgTVZTIChUaG9tYXMgTHVuZCkKKy0gaW4gbWluaWd6aXAuYywgdXNlIHN0YXRpYyBidWZmZXJzIG9ubHkgZm9yIDE2LWJpdCBzeXN0ZW1zCistIGZpeCBzdWZmaXggY2hlY2sgZm9yICJtaW5pZ3ppcCAtZCBmb28uZ3oiCistIGRvIG5vdCByZXR1cm4gYW4gZXJyb3IgZm9yIHRoZSAybmQgb2YgdHdvIGNvbnNlY3V0aXZlIGd6Zmx1c2goKSAoRmVsaXggTGVlKQorLSB1c2UgX2Zkb3BlbiBpbnN0ZWFkIG9mIGZkb3BlbiBmb3IgTVNDID49IDYuMCAoVGhvbWFzIEZhbnNsYXUpCistIGFkZGVkIG1ha2VsY2MuYmF0IGZvciBsY2Mtd2luMzIgKFRvbSBTdCBEZW5pcykKKy0gaW4gTWFrZWZpbGUuZGoyLCB1c2UgY29weSBhbmQgZGVsIGluc3RlYWQgb2YgaW5zdGFsbCBhbmQgcm0gKEZyYW5rIERvbmFob2UpCistIEF2b2lkIGV4cGFuZGVkICRJZDogQ2hhbmdlTG9nLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjAgY29uc3RfayBFeHAgJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLgorLSBjaGVjayBmb3IgdW5pc3RkLmggaW4gY29uZmlndXJlIChmb3Igb2ZmX3QpCistIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlCistIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3CistIGRvIG5vdCBmbHVzaCB0d2ljZSBpbiBnemNsb3NlICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4pCistIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaAorLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaAorLSB3b3JrIGFyb3VuZCBidWdneSBmY2xvc2Ugb24gcGlwZXMgZm9yIEhQL1VYCistIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCistIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MKKworQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpCistIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGEKKy0gVXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gaW5mbGF0ZQorLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQorLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQorLSBVcGRhdGUgd2ViIGFkZHJlc3MgaW4gUkVBRE1FCisgIAorQ2hhbmdlcyBpbiAxLjAuNCAoMjQgSnVsIDk2KQorLSBJbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgZGVmbGF0ZShzLCBaX0ZJTklTSCkgY291bGQgZmFpbCB0byBwcm9kdWNlIGFuIEVPRgorICBiaXQsIHNvIHRoZSBkZWNvbXByZXNzb3IgY291bGQgZGVjb21wcmVzcyBhbGwgdGhlIGNvcnJlY3QgZGF0YSBidXQgd2VudAorICBvbiB0byBhdHRlbXB0IGRlY29tcHJlc3NpbmcgZXh0cmEgZ2FyYmFnZSBkYXRhLiBUaGlzIGFmZmVjdGVkIG1pbmlnemlwIHRvby4KKy0gemxpYlZlcnNpb24gYW5kIGd6ZXJyb3IgcmV0dXJuIGNvbnN0IGNoYXIqIChuZWVkZWQgZm9yIERMTCkKKy0gcG9ydCB0byBSSVNDT1MgKG5vIGZkb3Blbiwgbm8gbXVsdGlwbGUgZG90cywgbm8gdW5saW5rLCBubyBmaWxlbm8pCistIHVzZSB6X2Vycm9yIG9ubHkgZm9yIERFQlVHIChhdm9pZCBwcm9ibGVtIHdpdGggRExMcykKKworQ2hhbmdlcyBpbiAxLjAuMyAoMiBKdWwgOTYpCistIHVzZSB6X3N0cmVhbXAgaW5zdGVhZCBvZiB6X3N0cmVhbSAqLCB3aGljaCBpcyBub3cgYSBmYXIgcG9pbnRlciBpbiBNU0RPUworICBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsczsgdGhpcyBtYWtlcyB0aGUgbGlicmFyeSBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cworICB2ZXJzaW9ucyBmb3IgdGhlc2UgbW9kZWxzLiAoTm8gZWZmZWN0IGluIGxhcmdlIG1vZGVsIG9yIG9uIG90aGVyIHN5c3RlbXMuKQorLSByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgaWYgcHJldmlvdXMgZGVmbGF0ZSBjYWxsIHJldHVybmVkIHdpdGgKKyAgYXZhaWxfb3V0IGFzIHplcm8gYnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KKy0gYWRkZWQgbWVtY21wIGZvciBub24gU1REQyBjb21waWxlcnMKKy0gZGVmaW5lIE5PX0RVTU1ZX0RFQ0wgZm9yIG1vcmUgTWFjIGNvbXBpbGVycyAoLmggZmlsZXMgbWVyZ2VkIGluY29ycmVjdGx5KQorLSBkZWZpbmUgX18zMkJJVF9fIGlmIF9fMzg2X18gb3IgaTM4NiBpcyBkZWZpbmVkIChwYi4gd2l0aCBXYXRjb20gYW5kIFNDTykKKy0gYmV0dGVyIGNoZWNrIGZvciAxNi1iaXQgbW9kZSBNU0MgKGF2b2lkcyBwcm9ibGVtIHdpdGggU3ltYW50ZWMpCisKK0NoYW5nZXMgaW4gMS4wLjIgKDIzIE1heSA5NikKKy0gYWRkZWQgV2luZG93cyBETEwgc3VwcG9ydAorLSBhZGRlZCBhIGZ1bmN0aW9uIHpsaWJWZXJzaW9uIChmb3IgdGhlIERMTCBzdXBwb3J0KQorLSBmaXhlZCBkZWNsYXJhdGlvbnMgdXNpbmcgQnl0ZWYgaW4gaW5mdXRpbC5jIChwYiB3aXRoIE1TRE9TIG1lZGl1bSBtb2RlbCkKKy0gQnl0ZWYgaXMgZGVmaW5lJ3MgaW5zdGVhZCBvZiB0eXBlZGVmJ2Qgb25seSBmb3IgQm9ybGFuZCBDCistIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gZXhhbXBsZS5jCistIG1lbnRpb24gaW4gUkVBRE1FIHRoYXQgdGhlIHpsaWIgZm9ybWF0IGlzIG5vdyBSRkMxOTUwCistIHVwZGF0ZWQgTWFrZWZpbGUuZGoyCistIGFkZGVkIGFsZ29yaXRobS5kb2MKKworQ2hhbmdlcyBpbiAxLjAuMSAoMjAgTWF5IDk2KSBbMS4wIHNraXBwZWQgdG8gYXZvaWQgY29uZnVzaW9uXQorLSBmaXggYXJyYXkgb3ZlcmxheSBpbiBkZWZsYXRlLmMgd2hpY2ggc29tZXRpbWVzIGNhdXNlZCBiYWQgY29tcHJlc3NlZCBkYXRhCistIGZpeCBpbmZsYXRlIGJ1ZyB3aXRoIGVtcHR5IHN0b3JlZCBibG9jaworLSBmaXggTVNET1MgbWVkaXVtIG1vZGVsIHdoaWNoIHdhcyBicm9rZW4gaW4gMC45OQorLSBmaXggZGVmbGF0ZVBhcmFtcygpIHdoaWNoIGNvdWxkIGdlbmVyYXRlZCBiYWQgY29tcHJlc3NlZCBkYXRhLgorLSBCeXRlZiBpcyBkZWZpbmUnZCBpbnN0ZWFkIG9mIHR5cGVkZWYnZWQgKHdvcmsgYXJvdW5kIEJvcmxhbmQgYnVnKQorLSBhZGRlZCBhbiBJTkRFWCBmaWxlCistIG5ldyBtYWtlZmlsZXMgZm9yIERKR1BQIChNYWtlZmlsZS5kajIpLCAzMi1iaXQgQm9ybGFuZCAoTWFrZWZpbGUuYjMyKSwKKyAgV2F0Y29tIChNYWtlZmlsZS53YXQpLCBBbWlnYSBTQVMvQyAoTWFrZWZpbGUuc2FzKQorLSBzcGVlZCB1cCBhZGxlcjMyIGZvciBtb2Rlcm4gbWFjaGluZXMgd2l0aG91dCBhdXRvLWluY3JlbWVudAorLSBhZGRlZCAtYW5zaSBmb3IgSVJJWCBpbiBjb25maWd1cmUKKy0gc3RhdGljX2luaXRfZG9uZSBpbiB0cmVlcy5jIGlzIGFuIGludAorLSBkZWZpbmUgdW5saW5rIGFzIGRlbGV0ZSBmb3IgVk1TCistIGZpeCBjb25maWd1cmUgZm9yIFFOWAorLSBhZGQgY29uZmlndXJlIGJyYW5jaCBmb3IgU0NPIGFuZCBIUFVYCistIGF2b2lkIG1hbnkgd2FybmluZ3MgKHVudXNlZCB2YXJpYWJsZXMsIGRlYWQgYXNzaWdubWVudHMsIGV0Yy4uLikKKy0gbm8gZmRvcGVuIGZvciBCZU9TCistIGZpeCB0aGUgV2F0Y29tIGZpeCBmb3IgMzIgYml0IG1vZGUgKGRlZmluZSBGQVIgYXMgZW1wdHkpCistIHJlbW92ZWQgcmVkZWZpbml0aW9uIG9mIEJ5dGUgZm9yIE1LV0VSS1MKKy0gd29yayBhcm91bmQgYW4gTVdLRVJLUyBidWcgKGluY29ycmVjdCBtZXJnZSBvZiBhbGwgLmggZmlsZXMpCisKK0NoYW5nZXMgaW4gMC45OSAoMjcgSmFuIDk2KQorLSBhbGxvdyBwcmVzZXQgZGljdGlvbmFyeSBzaGFyZWQgYmV0d2VlbiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IKKy0gYWxsb3cgY29tcHJlc3Npb24gbGV2ZWwgMCAobm8gY29tcHJlc3Npb24pCistIGFkZCBkZWZsYXRlUGFyYW1zIGluIHpsaWIuaDogYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKKyAgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LgorLSB0ZXN0IGxhcmdlIGJ1ZmZlcnMgYW5kIGRlZmxhdGVQYXJhbXMgaW4gZXhhbXBsZS5jCistIGFkZCBvcHRpb25hbCAiY29uZmlndXJlIiB0byBidWlsZCB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnkKKy0gc3VwcHJlc3MgTWFrZWZpbGUucW54LCB1c2UgY29uZmlndXJlIGluc3RlYWQKKy0gZml4ZWQgZGVmbGF0ZSBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIENyYXkpCistIGZpeGVkIGluZmxhdGVfYmxvY2tzIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQWxwaGEpCistIGRlY2xhcmUgWl9ERUZMQVRFRCBpbiB6bGliLmggKHBvc3NpYmxlIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyKQorLSBhbHdheXMgcmV0dXJuIFpfQlVGX0VSUk9SIHdoZW4gZGVmbGF0ZSgpIGhhcyBub3RoaW5nIHRvIGRvCistIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbm93IG1hY3JvcyB0byBhbGxvdyB2ZXJzaW9uIGNoZWNraW5nCistIHByZWZpeCBhbGwgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgd2l0aCB6XyB3aXRoIC1EWl9QUkVGSVgKKy0gbWFrZSBmYWxsb2MgY29tcGxldGVseSByZWVudHJhbnQgKGluZnRyZWVzLmMpCistIGZpeGVkIHZlcnkgdW5saWtlbHkgcmFjZSBjb25kaXRpb24gaW4gY3Rfc3RhdGljX2luaXQKKy0gZnJlZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb24gdG8gaGVscCBtZW1vcnkgbWFuYWdlcgorLSB1c2UgemxpYi0xLjAvKiBpbnN0ZWFkIG9mIHpsaWIvKiBpbnNpZGUgdGhlIHRhci5negorLSBtYWtlIHpsaWIgd2FybmluZy1mcmVlIHdpdGggImdjYyAtTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aAorICAtV2NvbnZlcnNpb24gLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyIKKy0gYWxsb3cgZ3pyZWFkIG9uIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMKKy0gZGVmbGF0ZUVuZCBub3cgcmV0dXJucyBaX0RBVEFfRVJST1IgaWYgaXQgd2FzIHByZW1hdHVyZQorLSBkZWZsYXRlIGlzIGZpbmFsbHkgKD8pIGZ1bGx5IGRldGVybWluaXN0aWMgKG5vIG1hdGNoZXMgYmV5b25kIGVuZCBvZiBpbnB1dCkKKy0gRG9jdW1lbnQgWl9TWU5DX0ZMVVNICistIGFkZCB1bmluc3RhbGwgaW4gTWFrZWZpbGUKKy0gQ2hlY2sgZm9yIF9fY3BsdXBsdXMgaW4gemxpYi5oCistIEJldHRlciB0ZXN0IGluIGN0X2FsaWduIGZvciBwYXJ0aWFsIGZsdXNoCistIGF2b2lkIGhhcm1sZXNzIHdhcm5pbmdzIGZvciBCb3JsYW5kIEMrKworLSBpbml0aWFsaXplIGhhc2hfaGVhZCBpbiBkZWZsYXRlLmMKKy0gYXZvaWQgd2FybmluZyBvbiBmZG9wZW4gKGd6aW8uYykgZm9yIEhQIGNjIC1BYQorLSBpbmNsdWRlIHN0ZGxpYi5oIGZvciBTVERDIGNvbXBpbGVycworLSBpbmNsdWRlIGVycm5vLmggZm9yIENyYXkKKy0gaWdub3JlIGVycm9yIGlmIHJhbmxpYiBkb2Vzbid0IGV4aXN0CistIGNhbGwgcmFubGliIHR3aWNlIGZvciBOZVhUU1RFUAorLSB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZiBwcmVmaXggZm9yIGxpYnouYQorLSByZW5hbWVkIGN0XyogYXMgX3RyXyogdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhcHBsaWNhdGlvbnMKKy0gY2xlYXIgei0+bXNnIGluIGluZmxhdGVJbml0MiBiZWZvcmUgYW55IGVycm9yIHJldHVybgorLSBpbml0aWFsaXplIG9wYXF1ZSBpbiBleGFtcGxlLmMsIGd6aW8uYywgZGVmbGF0ZS5jIGFuZCBpbmZsYXRlLmMKKy0gZml4ZWQgdHlwbyBpbiB6Y29uZi5oIChfR05VQ19fID0+IF9fR05VQ19fKQorLSBjaGVjayBmb3IgV0lOMzIgaW4gemNvbmYuaCBhbmQgenV0aWwuYyAoYXZvaWQgZmFybWFsbG9jIGluIDMyLWJpdCBtb2RlKQorLSBmaXggdHlwbyBpbiBNYWtlX3Ztcy5jb20gKGYkdHJubG5tIC0+IGYkZ2V0c3lpKQorLSBpbiBmY2FsbG9jLCBub3JtYWxpemUgcG9pbnRlciBpZiBzaXplID4gNjU1MjAgYnl0ZXMKKy0gZG9uJ3QgdXNlIHNwZWNpYWwgZmNhbGxvYyBmb3IgMzIgYml0IEJvcmxhbmQgQysrCistIHVzZSBTVERDIGluc3RlYWQgb2YgX19HTzMyX18gdG8gYXZvaWQgcmVkZWNsYXJpbmcgZXhpdCwgY2FsbG9jLCBldGMuLi4KKy0gdXNlIFpfQklOQVJZIGluc3RlYWQgb2YgQklOQVJZCistIGRvY3VtZW50IHRoYXQgZ3pjbG9zZSBhZnRlciBnemRvcGVuIHdpbGwgY2xvc2UgdGhlIGZpbGUKKy0gYWxsb3cgImEiIGFzIG1vZGUgaW4gZ3pvcGVuLgorLSBmaXggZXJyb3IgY2hlY2tpbmcgaW4gZ3pyZWFkCistIGFsbG93IHNraXBwaW5nIC5neiBleHRyYS1maWVsZCBvbiBwaXBlcworLSBhZGRlZCByZWZlcmVuY2UgdG8gUGVybCBpbnRlcmZhY2UgaW4gUkVBRE1FCistIHB1dCB0aGUgY3JjIHRhYmxlIGluIEZBUiBkYXRhIChJIGRpc2xpa2UgbW9yZSBhbmQgbW9yZSB0aGUgbWVkaXVtIG1vZGVsIDopCistIGFkZGVkIGdldF9jcmNfdGFibGUKKy0gYWRkZWQgYSBkaW1lbnNpb24gdG8gYWxsIGFycmF5cyAoQm9ybGFuZCBDIGNhbid0IGNvdW50KS4KKy0gd29ya2Fyb3VuZCBCb3JsYW5kIEMgYnVnIGluIGRlY2xhcmF0aW9uIG9mIGluZmxhdGVfY29kZXNfbmV3ICYgaW5mbGF0ZV9mYXN0CistIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uIG9mICouaCAoZm9yIHByZWNvbXBpbGVkIGhlYWRlciBvbiBNYWMpCistIFdhdGNvbSBDIHByZXRlbmRzIHRvIGJlIE1pY3Jvc29mdCBDIHNtYWxsIG1vZGVsIGV2ZW4gaW4gMzIgYml0IG1vZGUuCistIGRvbid0IHVzZSB1bnNpemVkIGFycmF5cyB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyBieSBWaXN1YWwgQysrOgorICAgICB3YXJuaW5nIEM0NzQ2OiAnaW5mbGF0ZV9tYXNrJyA6IHVuc2l6ZWQgYXJyYXkgdHJlYXRlZCBhcyAgJ19fZmFyJworICAgICAod2hhdCdzIHdyb25nIHdpdGggZmFyIGRhdGEgaW4gZmFyIG1vZGVsPykuCistIGRlZmluZSBlbnVtIG91dCBvZiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEMrKworCitDaGFuZ2VzIGluIDAuOTUgKDE2IEF1ZyA5NSkKKy0gZml4IE1TRE9TIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgKG5vdyBlYXNpZXIgdG8gYWRhcHQgdG8gYW55IGNvbXBpbGVyKQorLSBpbmxpbmVkIHNlbmRfYml0cworLSBmaXggdGhlIGZpbmFsICg6LSkgYnVnIGZvciBkZWZsYXRlIHdpdGggZmx1c2ggKG91dHB1dCB3YXMgY29ycmVjdCBidXQKKyAgbm90IGNvbXBsZXRlbHkgZmx1c2hlZCBpbiByYXJlIG9jY2FzaW9ucykuCistIGRlZmF1bHQgd2luZG93IHNpemUgaXMgc2FtZSBmb3IgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KKyAgKGl0J3Mgbm93IHN1ZmZpY2llbnQgdG8gc2V0IE1BWF9XQklUUyBpbiB6Y29uZi5oKS4KKy0gdm9pZHAgLT4gdm9pZHBmIGFuZCB2b2lkbnAgLT4gdm9pZHAgKGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyCisgIHR5cGVkZWZzIGFuZCBiZWNhdXNlIHZvaWRucCB3YXMgbm90IG5lYXIgaW4gbGFyZ2UgbW9kZWwpLgorCitDaGFuZ2VzIGluIDAuOTQgKDEzIEF1ZyA5NSkKKy0gc3VwcG9ydCBNU0RPUyBtZWRpdW0gbW9kZWwKKy0gZml4IGRlZmxhdGUgd2l0aCBmbHVzaCAoY291bGQgc29tZXRpbWVzIGdlbmVyYXRlIGJhZCBvdXRwdXQpCistIGZpeCBkZWZsYXRlUmVzZXQgKHpsaWIgaGVhZGVyIHdhcyBpbmNvcnJlY3RseSBzdXBwcmVzc2VkKQorLSBhZGRlZCBzdXBwb3J0IGZvciBWTVMKKy0gYWxsb3cgYSBjb21wcmVzc2lvbiBsZXZlbCBpbiBnem9wZW4oKQorLSBnemZsdXNoIG5vdyBjYWxscyBmZmx1c2gKKy0gRm9yIGRlZmxhdGUgd2l0aCBmbHVzaCwgZmx1c2ggZXZlbiBpZiBubyBtb3JlIGlucHV0IGlzIHByb3ZpZGVkLgorLSByZW5hbWUgbGliZ3ouYSBhcyBsaWJ6LmEKKy0gYXZvaWQgY29tcGxleCBleHByZXNzaW9uIGluIGluZmNvZGVzLmMgdHJpZ2dlcmluZyBUdXJibyBDIGJ1ZworLSB3b3JrIGFyb3VuZCBhIHByb2JsZW0gd2l0aCBnY2Mgb24gQWxwaGEgKGluIElOU0VSVF9TVFJJTkcpCistIGRvbid0IHVzZSBpbmxpbmUgZnVuY3Rpb25zIChwcm9ibGVtIHdpdGggc29tZSBnY2MgdmVyc2lvbnMpCistIGFsbG93IHJlbmFtaW5nIG9mIEJ5dGUsIHVJbnQsIGV0Yy4uLiB3aXRoICNkZWZpbmUuCistIGF2b2lkIHdhcm5pbmcgYWJvdXQgKHVudXNlZCkgcG9pbnRlciBiZWZvcmUgc3RhcnQgb2YgYXJyYXkgaW4gZGVmbGF0ZS5jCistIGF2b2lkIHZhcmlvdXMgd2FybmluZ3MgaW4gZ3ppby5jLCBleGFtcGxlLmMsIGluZmJsb2NrLmMsIGFkbGVyMzIuYywgenV0aWwuYworLSBhdm9pZCByZXNlcnZlZCB3b3JkICduZXcnIGluIHRyZWVzLmMKKworQ2hhbmdlcyBpbiAwLjkzICgyNSBKdW5lIDk1KQorLSB0ZW1wb3JhcmlseSBkaXNhYmxlIGlubGluZSBmdW5jdGlvbnMKKy0gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMKKy0gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBQQVJUSUFMX0ZMVVNICistIFNldCBiaW5hcnkgbW9kZSBmb3Igc3RkaW4vc3Rkb3V0IGluIG1pbmlnemlwLmMgZm9yIE9TLzIKKy0gZG9uJ3QgZXZlbiB1c2Ugc2lnbmVkIGNoYXIgaW4gaW5mbGF0ZSAobm90IHBvcnRhYmxlIGVub3VnaCkKKy0gZml4IGluZmxhdGUgbWVtb3J5IGxlYWsgZm9yIHNlZ21lbnRlZCBhcmNoaXRlY3R1cmVzCisKK0NoYW5nZXMgaW4gMC45MiAoMyBNYXkgOTUpCistIGRvbid0IGFzc3VtZSB0aGF0IGNoYXIgaXMgc2lnbmVkIChwcm9ibGVtIG9uIFNHSSkKKy0gQ2xlYXIgYml0IGJ1ZmZlciB3aGVuIHN0YXJ0aW5nIGEgc3RvcmVkIGJsb2NrCistIG5vIG1lbWNweSBvbiBQeXJhbWlkCistIHN1cHByZXNzZWQgaW5mdGVzdC5jCistIG9wdGltaXplZCBmaWxsX3dpbmRvdywgcHV0IGxvbmdlc3RfbWF0Y2ggaW5saW5lIGZvciBnY2MKKy0gb3B0aW1pemVkIGluZmxhdGUgb24gc3RvcmVkIGJsb2Nrcy4KKy0gdW50YWJpZnkgYWxsIHNvdXJjZXMgdG8gc2ltcGxpZnkgcGF0Y2hlcworCitDaGFuZ2VzIGluIDAuOTEgKDIgTWF5IDk1KQorLSBEZWZhdWx0IE1FTV9MRVZFTCBpcyA4IChub3QgOSBmb3IgVW5peCkgYXMgZG9jdW1lbnRlZCBpbiB6bGliLmgKKy0gRG9jdW1lbnQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgaW4gemNvbmYuaAorLSBhZGRlZCAibWFrZSBpbnN0YWxsIgorLSBmaXggc3luYyBzZWFyY2ggbG9naWMgaW4gaW5mbGF0ZVN5bmMKKy0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpIG5vdyB3b3JrcyBldmVuIGlmIG91dHB1dCBidWZmZXIgdG9vIHNob3J0CistIGFmdGVyIGluZmxhdGVTeW5jLCBkb24ndCBzY2FyZSBwZW9wbGUgd2l0aCBqdXN0ICJsbyB3b3JsZCIKKy0gYWRkZWQgc3VwcG9ydCBmb3IgREpHUFAKKworQ2hhbmdlcyBpbiAwLjkgKDEgTWF5IDk1KQorLSBkb24ndCBhc3N1bWUgdGhhdCB6YWxsb2MgY2xlYXJzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh0aGUgVHVyYm9DIGJ1ZworICB3YXMgTWFyaydzIGJ1ZyBhZnRlciBhbGwgOikKKy0gbGV0IGFnYWluIGd6cmVhZCBjb3B5IHVuY29tcHJlc3NlZCBkYXRhIHVuY2hhbmdlZCAod2FzIHdvcmtpbmcgaW4gMC43MSkKKy0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpLCBpbmZsYXRlUmVzZXQgYW5kIGluZmxhdGVTeW5jIGFyZSBub3cgZnVsbHkgaW1wbGVtZW50ZWQKKy0gYWRkZWQgYSB0ZXN0IG9mIGluZmxhdGVTeW5jIGluIGV4YW1wbGUuYworLSBtb3ZlZCBNQVhfV0JJVFMgdG8gemNvbmYuaCBiZWNhdXNlIHVzZXJzIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoYXQuCistIGRvY3VtZW50IGV4cGxpY2l0bHkgdGhhdCB6YWxsb2MoNjRLKSBvbiBNU0RPUyBtdXN0IHJldHVybiBhIG5vcm1hbGl6ZWQKKyAgcG9pbnRlciAoemVybyBvZmZzZXQpCistIGFkZGVkIE1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IEMsIFR1cmJvIEMsIEJvcmxhbmQgQysrCistIGZhc3RlciBjcmMzMigpCisKK0NoYW5nZXMgaW4gMC44ICgyOSBBcHJpbCA5NSkKKy0gYWRkZWQgZmFzdCBpbmZsYXRlIChpbmZmYXN0LmMpCistIGRlZmxhdGUoWl9GSU5JU0gpIG5vdyByZXR1cm5zIFpfU1RSRUFNX0VORCB3aGVuIGRvbmUuIFdhcm5pbmc6IHRoaXMKKyAgaXMgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgemxpYiB3aGljaCByZXR1cm5lZCBaX09LLgorLSB3b3JrIGFyb3VuZCBhIFR1cmJvQyBjb21waWxlciBidWcgKGJhZCBjb2RlIGZvciBiIDw8IDAsIHNlZSBpbmZ1dGlsLmgpCisgIChhY3R1YWxseSB0aGF0IHdhcyBub3QgYSBjb21waWxlciBidWcsIHNlZSAwLjgxIGFib3ZlKQorLSBnenJlYWQgbm8gbG9uZ2VyIHJlYWRzIG9uZSBleHRyYSBieXRlIGluIGNlcnRhaW4gY2FzZXMKKy0gSW4gZ3ppbyBkZXN0cm95KCksIGRvbid0IHJlZmVyZW5jZSBhIGZyZWVkIHN0cnVjdHVyZQorLSBhdm9pZCBtYW55IHdhcm5pbmdzIGZvciBNU0RPUworLSBhdm9pZCB0aGUgRVJST1Igc3ltYm9sIHdoaWNoIGlzIHVzZWQgYnkgTVMgV2luZG93cworCitDaGFuZ2VzIGluIDAuNzEgKDE0IEFwcmlsIDk1KQorLSBGaXhlZCBtb3JlIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zIDooIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHdpdGgKKyAgVHVyYm9DIGxhcmdlIG1vZGVsLgorCitDaGFuZ2VzIGluIDAuNyAoMTQgQXByaWwgOTUpCistIEFkZGVkIGZ1bGwgaW5mbGF0ZSBzdXBwb3J0LgorLSBTaW1wbGlmaWVkIHRoZSBjcmMzMigpIGludGVyZmFjZS4gVGhlIHByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nCisgIChvbmUncyBjb21wbGVtZW50KSBpcyBub3cgZG9uZSBpbnNpZGUgY3JjMzIoKS4gV0FSTklORzogdGhpcyBpcworICBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczsgc2VlIHpsaWIuaCBmb3IgdGhlIG5ldyB1c2FnZS4KKworQ2hhbmdlcyBpbiAwLjYxICgxMiBBcHJpbCA5NSkKKy0gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gVHVyYm9DLiBleGFtcGxlIGFuZCBtaW5pZ3ppcCBub3cgd29yayBvbiBNU0RPUy4KKworQ2hhbmdlcyBpbiAwLjYgKDExIEFwcmlsIDk1KQorLSBhZGRlZCBtaW5pZ3ppcC5jCistIGFkZGVkIGd6ZG9wZW4gdG8gcmVvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIGFzIGd6RmlsZQorLSBhZGRlZCB0cmFuc3BhcmVudCByZWFkaW5nIG9mIG5vbi1nemlwZWQgZmlsZXMgaW4gZ3pyZWFkLgorLSBmaXhlZCBidWcgaW4gZ3pyZWFkIChkb24ndCByZWFkIGNyYyBhcyBkYXRhKQorLSBmaXhlZCBidWcgaW4gZGVzdHJveSAoZ3ppby5jKSAoZG9uJ3QgcmV0dXJuIFpfU1RSRUFNX0VORCBmb3IgZ3pjbG9zZSkuCistIGRvbid0IGFsbG9jYXRlIGJpZyBhcnJheXMgaW4gdGhlIHN0YWNrIChmb3IgTVNET1MpCistIGZpeCBzb21lIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zCisKK0NoYW5nZXMgaW4gMC41OgorLSBkbyByZWFsIGNvbXByZXNzaW9uIGluIGRlZmxhdGUuYy4gWl9QQVJUSUFMX0ZMVVNIIGlzIHN1cHBvcnRlZCBidXQKKyAgbm90IHlldCBaX0ZVTExfRkxVU0guCistIHN1cHBvcnQgZGVjb21wcmVzc2lvbiBidXQgb25seSBpbiBhIHNpbmdsZSBzdGVwIChmb3JjZWQgWl9GSU5JU0gpCistIGFkZGVkIG9wYXF1ZSBvYmplY3QgZm9yIHphbGxvYyBhbmQgemZyZWUuCistIGFkZGVkIGRlZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVJlc2V0CistIGFkZGVkIGEgdmFyaWFibGUgemxpYl92ZXJzaW9uIGZvciBjb25zaXN0ZW5jeSBjaGVja2luZy4KKy0gcmVuYW1lZCB0aGUgJ2ZpbHRlcicgcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0MiBhcyAnc3RyYXRlZ3knLgorICBBZGRlZCBaX0ZJTFRFUkVEIGFuZCBaX0hVRkZNQU5fT05MWSBjb25zdGFudHMuCisKK0NoYW5nZXMgaW4gMC40OgorLSBhdm9pZCAiemlwIiBldmVyeXdoZXJlLCB1c2UgemxpYiBpbnN0ZWFkIG9mIHppcGxpYi4KKy0gc3VwcHJlc3MgWl9CTE9DS19GTFVTSCwgaW50ZXJwcmV0IFpfUEFSVElBTF9GTFVTSCBhcyBibG9jayBmbHVzaAorICBpZiBjb21wcmVzc2lvbiBtZXRob2QgPT0gOC4KKy0gYWRkZWQgYWRsZXIzMiBhbmQgY3JjMzIKKy0gcmVuYW1lZCBkZWZsYXRlT3B0aW9ucyBhcyBkZWZsYXRlSW5pdDIsIGNhbGwgb25lIG9yIHRoZSBvdGhlciBidXQgbm90IGJvdGgKKy0gYWRkZWQgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0Mi4KKy0gYWRkZWQgaW5mbGF0ZUluaXQyCistIHNpbXBsaWVkIGNvbnNpZGVyYWJseSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYnkgbm90IHN1cHBvcnRpbmcKKyAgdXNlci1wcm92aWRlZCBoaXN0b3J5IGJ1ZmZlci4gVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBpbiBkZWZsYXRlSW5pdDIKKyAgYW5kIGluZmxhdGVJbml0Mi4KKworQ2hhbmdlcyBpbiAwLjM6CistIHByZWZpeCBhbGwgbWFjcm8gbmFtZXMgd2l0aCBaXworLSB1c2UgWl9GSU5JU0ggaW5zdGVhZCBvZiBkZWZsYXRlRW5kIHRvIGZpbmlzaCBjb21wcmVzc2lvbi4KKy0gYWRkZWQgWl9IVUZGTUFOX09OTFkKKy0gYWRkZWQgZ3plcnJvcigpCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9GQVEgYi9jb21tb24vemxpYi9GQVEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhN2Q2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL0ZBUQpAQCAtMCwwICsxLDEwMCBAQAorCisJCUZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKKworCitJZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZSAKK2h0dHA6Ly93d3cuemxpYi5vcmcgd2hpY2ggbWF5IGhhdmUgbW9yZSByZWNlbnQgaW5mb3JtYXRpb24uCitUaGUgbGFzdGVzdCB6bGliIEZBUSBpcyBhdCBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvemxpYl9mYXEuaHRtbAorCisKKyAxLiBJcyB6bGliIFkySy1jb21wbGlhbnQ/CisKKyAgICBZZXMuIHpsaWIgZG9lc24ndCBoYW5kbGUgZGF0ZXMuCisKKyAyLiBXaGVyZSBjYW4gSSBnZXQgYSBXaW5kb3dzIERMTCB2ZXJzaW9uPworCisgICAgVGhlIHpsaWIgc291cmNlcyBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCBjaGFuZ2UgdG8gcHJvZHVjZSBhIERMTC4gSWYgeW91CisgICAgd2FudCBhIHByZWNvbXBpbGVkIERMTCwgc2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvIC4gUXVlc3Rpb25zCisgICAgYWJvdXQgdGhlIHpsaWIgRExMIHNob3VsZCBiZSBzZW50IHRvIEdpbGxlcyBWb2xsYW50IChpbmZvQHdpbmltYWdlLmNvbSkuCisKKyAzLiBXaGVyZSBjYW4gSSBnZXQgYSBWaXN1YWwgQmFzaWMgaW50ZXJmYWNlIHRvIHpsaWI/CisKKyAgICBTZWUKKyAgICAgICAgKiBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL2NtcC16LWl0LnppcAorICAgICAgICAqIGh0dHA6Ly93d3cuZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQorICAgICAgICAqIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24KKworIDQuIGNvbXByZXNzKCkgcmV0dXJucyBaX0JVRl9FUlJPUgorCisgICAgTWFrZSBzdXJlIHRoYXQgYmVmb3JlIHRoZSBjYWxsIG9mIGNvbXByZXNzLCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkCisgICAgYnVmZmVyIGlzIGVxdWFsIHRvIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90CisgICAgemVyby4gRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCisgICAgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLgorCisgNS4gZGVmbGF0ZSgpIG9yIGluZmxhdGUoKSByZXR1cm5zIFpfQlVGX0VSUk9SCisKKyAgICBCZWZvcmUgbWFraW5nIHRoZSBjYWxsLCBtYWtlIHN1cmUgdGhhdCBhdmFpbF9pbiBhbmQgYXZhaWxfb3V0IGFyZSBub3QKKyAgICB6ZXJvLiBXaGVuIHNldHRpbmcgdGhlIHBhcmFtZXRlciBmbHVzaCBlcXVhbCB0byBaX0ZJTklTSCwgYWxzbyBtYWtlIHN1cmUKKyAgICB0aGF0IGF2YWlsX291dCBpcyBiaWcgZW5vdWdoIHRvIGFsbG93IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgaW5wdXQuCisKKyA2LiBXaGVyZSdzIHRoZSB6bGliIGRvY3VtZW50YXRpb24gKG1hbiBwYWdlcywgZXRjLik/CisKKyAgICBJdCdzIGluIHpsaWIuaCBmb3IgdGhlIG1vbWVudCwgYW5kIEZyYW5jaXMgUy4gTGluIGhhcyBjb252ZXJ0ZWQgaXQgdG8gYQorICAgIHdlYiBwYWdlIHpsaWIuaHRtbC4gVm9sdW50ZWVycyB0byB0cmFuc2Zvcm0gdGhpcyB0byBVbml4LXN0eWxlIG1hbiBwYWdlcywKKyAgICBwbGVhc2UgY29udGFjdCBKZWFuLWxvdXAgR2FpbGx5IChqbG91cEBnemlwLm9yZykuIEV4YW1wbGVzIG9mIHpsaWIgdXNhZ2UKKyAgICBhcmUgaW4gdGhlIGZpbGVzIGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYy4KKworIDcuIFdoeSBkb24ndCB5b3UgdXNlIEdOVSBhdXRvY29uZiBvciBsaWJ0b29sIG9yIC4uLj8KKworICAgIEJlY2F1c2Ugd2Ugd291bGQgbGlrZSB0byBrZWVwIHpsaWIgYXMgYSB2ZXJ5IHNtYWxsIGFuZCBzaW1wbGUKKyAgICBwYWNrYWdlLiB6bGliIGlzIHJhdGhlciBwb3J0YWJsZSBhbmQgZG9lc24ndCBuZWVkIG11Y2ggY29uZmlndXJhdGlvbi4KKworIDguIEkgZm91bmQgYSBidWcgaW4gemxpYi4KKworICAgIE1vc3Qgb2YgdGhlIHRpbWUsIHN1Y2ggcHJvYmxlbXMgYXJlIGR1ZSB0byBhbiBpbmNvcnJlY3QgdXNhZ2Ugb2YKKyAgICB6bGliLiBQbGVhc2UgdHJ5IHRvIHJlcHJvZHVjZSB0aGUgcHJvYmxlbSB3aXRoIGEgc21hbGwgcHJvZ3JhbSBhbmQgc2VuZAorICAgIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSB0byB1cyBhdCB6bGliQGd6aXAub3JnIC4gRG8gbm90IHNlbmQKKyAgICBtdWx0aS1tZWdhYnl0ZSBkYXRhIGZpbGVzIHdpdGhvdXQgcHJpb3IgYWdyZWVtZW50LgorCisgOS4gV2h5IGRvIEkgZ2V0ICJ1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGd6cHV0YyI/CisKKyAgICBJZiAibWFrZSB0ZXN0IiBwcm9kdWNlcyBzb21ldGhpbmcgbGlrZQorCisgICAgICAgZXhhbXBsZS5vKC50ZXh0KzB4MTU0KTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgZ3pwdXRjJworICAgICAgCisgICAgY2hlY2sgdGhhdCB5b3UgZG9uJ3QgaGF2ZSBvbGQgZmlsZXMgbGliei4qIGluIC91c3IvbGliLCAvdXNyL2xvY2FsL2xpYiBvcgorICAgIC91c3IvWDExUjYvbGliLiBSZW1vdmUgYW55IG9sZCB2ZXJzaW9ucywgdGhlbiBkbyAibWFrZSBpbnN0YWxsIi4KKworMTAuIEkgbmVlZCBhIERlbHBoaSBpbnRlcmZhY2UgdG8gemxpYi4KKworICAgIFNlZSB0aGUgZGlyZWN0b3JpZXMgY29udHJpYi9kZWxwaGkgYW5kIGNvbnRyaWIvZGVscGhpMiBpbiB0aGUgemxpYgorICAgIGRpc3RyaWJ1dGlvbi4KKworMTEuIENhbiB6bGliIGhhbmRsZSAuemlwIGFyY2hpdmVzPworCisgICAgU2VlIHRoZSBkaXJlY3RvcnkgY29udHJpYi9taW5pemlwIGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbi4KKworMTIuIENhbiB6bGliIGhhbmRsZSAuWiBmaWxlcz8KKworICAgIE5vLCBzb3JyeS4gWW91IGhhdmUgdG8gc3Bhd24gYW4gdW5jb21wcmVzcyBvciBndW56aXAgc3VicHJvY2Vzcywgb3IgYWRhcHQKKyAgICB0aGUgY29kZSBvZiB1bmNvbXByZXNzIG9uIHlvdXIgb3duLgorCisxMy4gSG93IGNhbiBJIG1ha2UgYSBVbml4IHNoYXJlZCBsaWJyYXJ5PworCisgICAgbWFrZSBjbGVhbgorICAgIC4vY29uZmlndXJlIC1zCisgICAgbWFrZQorCisxNC4gV2h5IGRvZXMgIm1ha2UgdGVzdCIgZmFpbCBvbiBNYWMgT1MgWD8KKworICAgIE1hYyBPUyBYIGFscmVhZHkgaW5jbHVkZXMgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgc28gLWx6IGxpbmtzIHRoZQorICAgIHNoYXJlZCBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IHRoZSAibWFrZSIgY29tcGlsZWQuIEZvciB6bGliCisgICAgMS4xLjMsIHRoZSB0d28gYXJlIGluY29tcGF0aWJsZSBkdWUgdG8gZGlmZmVyZW50IGNvbXBpbGUtdGltZQorICAgIG9wdGlvbnMuIFNpbXBseSBjaGFuZ2UgdGhlIC1seiBpbiB0aGUgTWFrZWZpbGUgdG8gbGliei5hLCBhbmQgaXQgd2lsbCB1c2UKKyAgICB0aGUgY29tcGlsZWQgbGlicmFyeSBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgb25lIGFuZCB0aGUgIm1ha2UgdGVzdCIgd2lsbAorICAgIHN1Y2NlZWQuCisKKzE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGCisKKyAgICBXZSBhcmUgbm90IHRoZSBhdXRob3JzIG9mIE90dG9QREYuIFRoZSByZWFsIGF1dGhvciBpcyBvbiB0aGUgT3R0b1BERiB3ZWIKKyAgICBzaXRlIEpvZWwgSGFpbmxleSBqaGFpbmxleUBteW5ka3J5bWUuY29tLgpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvSU5ERVggYi9jb21tb24vemxpYi9JTkRFWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTI0NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvSU5ERVgKQEAgLTAsMCArMSw4NiBAQAorQ2hhbmdlTG9nCQloaXN0b3J5IG9mIGNoYW5nZXMKK0lOREVYCQkJdGhpcyBmaWxlCitGQVEJCQlGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCitNYWtlX3Ztcy5jb20JCXNjcmlwdCBmb3IgVmF4L1ZNUworTWFrZWZpbGUJCW1ha2VmaWxlIGZvciBVbml4IChnZW5lcmF0ZWQgYnkgY29uZmlndXJlKQorTWFrZWZpbGUuaW4JCW1ha2VmaWxlIGZvciBVbml4ICh0ZW1wbGF0ZSBmb3IgY29uZmlndXJlKQorTWFrZWZpbGUucmlzY29zIAltYWtlZmlsZSBmb3IgUklTQ09TCitSRUFETUUJCQlndWVzcyB3aGF0CithbGdvcml0aG0udHh0CQlkZXNjcmlwdGlvbiBvZiB0aGUgKGRlKWNvbXByZXNzaW9uIGFsZ29yaXRobQorY29uZmlndXJlCQljb25maWd1cmUgc2NyaXB0IGZvciBVbml4CitkZXNjcmlwLm1tcwkJbWFrZWZpbGUgZm9yIFZheC9WTVMKK3psaWIuMwkJCW1pbmkgbWFuIHBhZ2UgZm9yIHpsaWIgKHZvbHVudGVlcnMgdG8gd3JpdGUgZnVsbAorCQkJbWFuIHBhZ2VzIGZyb20gemxpYi5oIHdlbGNvbWUuIHdyaXRlIHRvIGpsb3VwQGd6aXAub3JnKQorCithbWlnYS9NYWtlZmlsZS5zYXMJbWFrZWZpbGUgZm9yIEFtaWdhIFNBUy9DCithbWlnYS9NYWtlZmlsZS5wdXAgICAgICBtYWtlZmlsZSBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMKKworbXNkb3MvTWFrZWZpbGUudzMyICAgICAgbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDMyLWJpdAorbXNkb3MvTWFrZWZpbGUuYjMyCW1ha2VmaWxlIGZvciBCb3JsYW5kIEMrKyAgIDMyLWJpdAorbXNkb3MvTWFrZWZpbGUuYm9yCW1ha2VmaWxlIGZvciBCb3JsYW5kIEMvQysrIDE2LWJpdAorbXNkb3MvTWFrZWZpbGUuZGoyCW1ha2VmaWxlIGZvciBESkdQUCAyLngKK21zZG9zL01ha2VmaWxlLmVteAltYWtlZmlsZSBmb3IgRU1YIDAuOWMgKDMyLWJpdCBET1MvT1MyKQorbXNkb3MvTWFrZWZpbGUubXNjCW1ha2VmaWxlIGZvciBNaWNyb3NvZnQgQyAxNi1iaXQKK21zZG9zL01ha2VmaWxlLnRjCW1ha2VmaWxlIGZvciBUdXJibyBDCittc2Rvcy9NYWtlZmlsZS53YXQJbWFrZWZpbGUgZm9yIFdhdGNvbSBDCittc2Rvcy96bGliLmRlZiAgICAgICAgCWRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBETEwKK21zZG9zL3psaWIucmMgICAgICAgICAJZGVmaW5pdGlvbiBmaWxlIGZvciBXaW5kb3dzIERMTAorCitudC9NYWtlZmlsZS5udAkJbWFrZWZpbGUgZm9yIFdpbmRvd3MgTlQKK250L3psaWIuZG50CQlkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MgTlQgRExMCitudC9NYWtlZmlsZS5lbXgJCW1ha2VmaWxlIGZvciBFTVggMC45Yy9SU1hOVCAxLjQxIChXaW4zMiBJbnRlbCkKK250L01ha2VmaWxlLmdjYwkJbWFrZWZpbGUgZm9yIFdpbmRvd3MgTlQgdXNpbmcgR0NDIChtaW5ndzMyKQorCisKKwkJemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgoremNvbmYuaAoremxpYi5oCisKKwkJcHJpdmF0ZSBzb3VyY2UgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgemxpYiBsaWJyYXJ5OgorYWRsZXIzMi5jCitjb21wcmVzcy5jCitjcmMzMi5jCitkZWZsYXRlLmMKK2RlZmxhdGUuaAorZ3ppby5jCitpbmZibG9jay5jCitpbmZibG9jay5oCitpbmZjb2Rlcy5jCitpbmZjb2Rlcy5oCitpbmZmYXN0LmMKK2luZmZhc3QuaAoraW5mbGF0ZS5jCitpbmZ0cmVlcy5jCitpbmZ0cmVlcy5oCitpbmZ1dGlsLmMKK2luZnV0aWwuaAorbWFrZXRyZWUuYwordHJlZXMuYwordW5jb21wci5jCit6dXRpbC5jCit6dXRpbC5oCisKKwkJc291cmNlIGZpbGVzIGZvciBzYW1wbGUgcHJvZ3JhbXM6CitleGFtcGxlLmMKK21pbmlnemlwLmMKKworCQl1bnN1cHBvcnRlZCBjb250cmlidXRpb24gYnkgdGhpcmQgcGFydGllcworCitjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorCTM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgorCitjb250cmliL21pbml6aXAvIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KKwlNaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYgorICAgICAgICBTZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCisKK2NvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworCitjb250cmliL2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+CisJQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCisKK2NvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKwlBIHZlcnkgc2ltcGxlIHRhci5neiBleHRyYWN0b3IgdXNpbmcgemxpYgorCitjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KKyAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9NYWtlX3Ztcy5jb20gYi9jb21tb24vemxpYi9NYWtlX3Ztcy5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1N2U4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL01ha2Vfdm1zLmNvbQpAQCAtMCwwICsxLDExNSBAQAorJCEgbWFrZSBsaWJ6IHVuZGVyIFZNUworJCEgd3JpdHRlbiBieSBNYXJ0aW4gUC5KLiBaaW5zZXIgPG0uemluc2VyQGdzaS5kZT4KKyQhCiskISBMb29rIGZvciB0aGUgY29tcGlsZXIgdXNlZAorJCEKKyQgY2NvcHQgPSAiIgorJCBpZiBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0CiskIHRoZW4KKyQgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIitjY29wdAorJCAgY29tcCAgPSAiX19kZWNjX189MSIKKyQgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgorJCBlbHNlCiskICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpLmVxcy4iIgorJCAgIHRoZW4KKyQgICAgY29tcCAgPSAiX192YXhjX189MSIKKyQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6CiskICAgZWxzZQorJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBkZWNjJGxpYnJhcnlfaW5jbHVkZToKKyQgICAgY2NvcHQgPSAiL2RlY2MvcHJlZml4PWFsbCIrY2NvcHQKKyQgICAgY29tcCAgPSAiX19kZWNjX189MSIKKyQgIGVuZGlmCiskIGVuZGlmCiskIQorJCEgQnVpbGQgdGhlIHRoaW5nIHBsYWluIG9yIHdpdGggbW1zCiskIQorJCB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgWmxpYiBzb3VyY2VzIC4uLiIKKyQgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06TU1TLkVYRSIpLmVxcy4iIgorJCAgdGhlbgorJCAgIGRlbGUgZXhhbXBsZS5vYmo7KixtaW5pZ3ppcC5vYmo7KgorJCAgIENBTEwgTUFLRSBhZGxlcjMyLk9CSiAiQ0MgJydDQ09QVCcgYWRsZXIzMiIgLQorICAgICAgICAgICAgICAgIGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBjb21wcmVzcy5PQkogIkNDICcnQ0NPUFQnIGNvbXByZXNzIiAtCisgICAgICAgICAgICAgICAgY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBjcmMzMi5PQkogIkNDICcnQ0NPUFQnIGNyYzMyIiAtCisgICAgICAgICAgICAgICAgY3JjMzIuYyB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBkZWZsYXRlLk9CSiAiQ0MgJydDQ09QVCcgZGVmbGF0ZSIgLQorICAgICAgICAgICAgICAgIGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBnemlvLk9CSiAiQ0MgJydDQ09QVCcgZ3ppbyIgLQorICAgICAgICAgICAgICAgIGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGluZmJsb2NrLk9CSiAiQ0MgJydDQ09QVCcgaW5mYmxvY2siIC0KKyAgICAgICAgICAgICAgICBpbmZibG9jay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAorJCAgIENBTEwgTUFLRSBpbmZjb2Rlcy5PQkogIkNDICcnQ0NPUFQnIGluZmNvZGVzIiAtCisgICAgICAgICAgICAgICAgaW5mY29kZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKyQgICBDQUxMIE1BS0UgaW5mZmFzdC5PQkogIkNDICcnQ0NPUFQnIGluZmZhc3QiIC0KKyAgICAgICAgICAgICAgICBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZmYXN0LmgKKyQgICBDQUxMIE1BS0UgaW5mbGF0ZS5PQkogIkNDICcnQ0NPUFQnIGluZmxhdGUiIC0KKyAgICAgICAgICAgICAgICBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCiskICAgQ0FMTCBNQUtFIGluZnRyZWVzLk9CSiAiQ0MgJydDQ09QVCcgaW5mdHJlZXMiIC0KKyAgICAgICAgICAgICAgICBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorJCAgIENBTEwgTUFLRSBpbmZ1dGlsLk9CSiAiQ0MgJydDQ09QVCcgaW5mdXRpbCIgLQorICAgICAgICAgICAgICAgIGluZnV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oCiskICAgQ0FMTCBNQUtFIHRyZWVzLk9CSiAiQ0MgJydDQ09QVCcgdHJlZXMiIC0KKyAgICAgICAgICAgICAgICB0cmVlcy5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIHVuY29tcHIuT0JKICJDQyAnJ0NDT1BUJyB1bmNvbXByIiAtCisgICAgICAgICAgICAgICAgdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIHp1dGlsLk9CSiAiQ0MgJydDQ09QVCcgenV0aWwiIC0KKyAgICAgICAgICAgICAgICB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBabGliIC4uLiIKKyQgICBDQUxMIE1BS0UgbGliei5PTEIgImxpYi9jcmVhIGxpYnoub2xiICoub2JqIiAqLk9CSgorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIGV4YW1wbGUuLi4iCiskICAgQ0FMTCBNQUtFIGV4YW1wbGUuT0JKICJDQyAnJ0NDT1BUJyBleGFtcGxlIiAtCisgICAgICAgICAgICAgICAgZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCiskICAgY2FsbCBtYWtlIGV4YW1wbGUuZXhlICJMSU5LIGV4YW1wbGUsbGliei5vbGIvbGliIiBleGFtcGxlLm9iaiBsaWJ6Lm9sYgorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIG1pbmlnemlwLi4uIgorJCAgIENBTEwgTUFLRSBtaW5pZ3ppcC5PQkogIkNDICcnQ0NPUFQnIG1pbmlnemlwIiAtCisgICAgICAgICAgICAgICAgbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorJCAgIGNhbGwgbWFrZSBtaW5pZ3ppcC5leGUgLSAKKyAgICAgICAgICAgICAgICAiTElOSyBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliIiAtIAorICAgICAgICAgICAgICAgIG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgorJCAgZWxzZQorJCAgIG1tcy9tYWNybz0oJ2NvbXAnKQorJCAgZW5kaWYKKyQgd3JpdGUgc3lzJG91dHB1dCAiWmxpYiBidWlsZCBjb21wbGV0ZWQiCiskIGV4aXQKKyQhCiskIQorJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKKyQgViA9ICdGJFZlcmlmeSgwKQorJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQorJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKKyQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgorJAorJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAorJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKKyRhcmc9MworJExvb3A6CiskICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKKyQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKKyQgICAgICAgRWw9MAorJExvb3AyOgorJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKKyQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKKyQgICAgICAgQUZpbGUgPSAiIgorJExvb3AzOgorJCAgICAgICBPRmlsZSA9IEFGaWxlCiskICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKKyQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCiskICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAorJCAgICAgICBHb3RvIExvb3AzCiskTmV4dEVMOgorJCAgICAgICBFbCA9IEVsICsgMQorJCAgICAgICBHb3RvIExvb3AyCiskRW5kTDoKKyQgYXJnPWFyZysxCiskIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKKyQgR290byBFeGl0CiskCiskTWFrZWl0OgorJCBWVj1GJFZFUklGWSgwKQorJCB3cml0ZSBzeXMkb3V0cHV0IFAyCiskICdQMgorJCBWVj0nRiRWZXJpZnkoVlYpCiskRXhpdDoKKyQgSWYgViBUaGVuIFNldCBWZXJpZnkKKyRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9NYWtlZmlsZS5pbiBiL2NvbW1vbi96bGliL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTU2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE3NSBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorCisjIFRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6CisjICAgLi9jb25maWd1cmU7IG1ha2UgdGVzdAorIyBUaGUgY2FsbCBvZiBjb25maWd1cmUgaXMgb3B0aW9uYWwgaWYgeW91IGRvbid0IGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMKKyMgSWYgeW91IHdpc2ggdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB1c2U6IC4vY29uZmlndXJlIC1zCisKKyMgVG8gaW5zdGFsbCAvdXNyL2xvY2FsL2xpYi9saWJ6LiogYW5kIC91c3IvbG9jYWwvaW5jbHVkZS96bGliLmgsIHR5cGU6CisjICAgIG1ha2UgaW5zdGFsbAorIyBUbyBpbnN0YWxsIGluICRIT01FIGluc3RlYWQgb2YgL3Vzci9sb2NhbCwgdXNlOgorIyAgICBtYWtlIGluc3RhbGwgcHJlZml4PSRIT01FCisKK0NDPWNjCisKK0NGTEFHUz0tTworI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworI0NGTEFHUz0tZyAtRERFQlVHCisjQ0ZMQUdTPS1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCisjICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKK0xERkxBR1M9LUwuIC1segorTERTSEFSRUQ9JChDQykKK0NQUD0kKENDKSAtRQorCitWRVI9MS4xLjQKK0xJQlM9bGliei5hCitTSEFSRURMSUI9bGliei5zbworCitBUj1hciByYworUkFOTElCPXJhbmxpYgorVEFSPXRhcgorU0hFTEw9L2Jpbi9zaAorCitwcmVmaXggPSAvdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICR7cHJlZml4fQorbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCitpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKKworT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZ3ppby5vIHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyBcCisgICAgICAgenV0aWwubyBpbmZsYXRlLm8gaW5mYmxvY2subyBpbmZ0cmVlcy5vIGluZmNvZGVzLm8gaW5mdXRpbC5vIGluZmZhc3QubworCitPQkpBID0KKyMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8KKworVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KKworRElTVEZJTEVTID0gUkVBRE1FIEZBUSBJTkRFWCBDaGFuZ2VMb2cgY29uZmlndXJlIE1ha2UqW2EtejAtOV0gKi5bY2hdICoubW1zIFwKKyAgYWxnb3JpdGhtLnR4dCB6bGliLjMgemxpYi5odG1sIFwKKyAgbXNkb3MvTWFrZSpbYS16MC05XSBtc2Rvcy96bGliLmRlZiBtc2Rvcy96bGliLnJjIFwKKyAgbnQvTWFrZSpbYS16MC05XSBudC96bGliLmRudCBhbWlnYS9NYWtlKi4/Pz8gb3MyL00qLm9zMiBvczIvemxpYi5kZWYgXAorICBjb250cmliL1JFKi5jb250cmliIGNvbnRyaWIvKi50eHQgY29udHJpYi9hc20zODYvKi5hc20gY29udHJpYi9hc20zODYvKi5jIFwKKyAgY29udHJpYi9hc20zODYvKi5iYXQgY29udHJpYi9hc20zODYvemxpYnZjLmQ/PyBjb250cmliL2FzbVs1Nl04Ni8qLj84NiBcCisgIGNvbnRyaWIvYXNtWzU2XTg2LyouUyBjb250cmliL2lvc3RyZWFtLyouY3BwIFwKKyAgY29udHJpYi9pb3N0cmVhbS8qLmggIGNvbnRyaWIvaW9zdHJlYW0yLyouaCBjb250cmliL2lvc3RyZWFtMi8qLmNwcCBcCisgIGNvbnRyaWIvdW50Z3ovTWFrZWZpbGUgY29udHJpYi91bnRnei8qLmMgY29udHJpYi91bnRnei8qLnczMiBcCisgIGNvbnRyaWIvbWluaXppcC9bQ01dKltwZV0gY29udHJpYi9taW5pemlwLyouW2NoXSBjb250cmliL21pbml6aXAvKi5bdGRdPz8gXAorICBjb250cmliL2RlbHBoaSovKi4/Pz8KKworYWxsOiBleGFtcGxlIG1pbmlnemlwCisKK3Rlc3Q6IGFsbAorCUBMRF9MSUJSQVJZX1BBVEg9LjokKExEX0xJQlJBUllfUEFUSCkgOyBleHBvcnQgTERfTElCUkFSWV9QQVRIOyBcCisJZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kIHx8IFwKKwkgIGVjaG8gJwkJKioqIG1pbmlnemlwIHRlc3QgRkFJTEVEICoqKicgOyBcCisJaWYgLi9leGFtcGxlOyB0aGVuIFwKKwkgIGVjaG8gJwkJKioqIHpsaWIgdGVzdCBPSyAqKionOyBcCisJZWxzZSBcCisJICBlY2hvICcJCSoqKiB6bGliIHRlc3QgRkFJTEVEICoqKic7IFwKKwlmaQorCitsaWJ6LmE6ICQoT0JKUykgJChPQkpBKQorCSQoQVIpICRAICQoT0JKUykgJChPQkpBKQorCS1AICgkKFJBTkxJQikgJEAgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCisKK21hdGNoLm86IG1hdGNoLlMKKwkkKENQUCkgbWF0Y2guUyA+IF9tYXRjaC5zCisJJChDQykgLWMgX21hdGNoLnMKKwltdiBfbWF0Y2gubyBtYXRjaC5vCisJcm0gLWYgX21hdGNoLnMKKworJChTSEFSRURMSUIpLiQoVkVSKTogJChPQkpTKQorCSQoTERTSEFSRUQpIC1vICRAICQoT0JKUykKKwlybSAtZiAkKFNIQVJFRExJQikgJChTSEFSRURMSUIpLjEKKwlsbiAtcyAkQCAkKFNIQVJFRExJQikKKwlsbiAtcyAkQCAkKFNIQVJFRExJQikuMQorCitleGFtcGxlOiBleGFtcGxlLm8gJChMSUJTKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChMREZMQUdTKQorCittaW5pZ3ppcDogbWluaWd6aXAubyAkKExJQlMpCisJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQorCitpbnN0YWxsOiAkKExJQlMpCisJLUBpZiBbICEgLWQgJChpbmNsdWRlZGlyKSAgXTsgdGhlbiBta2RpciAkKGluY2x1ZGVkaXIpOyBmaQorCS1AaWYgWyAhIC1kICQobGliZGlyKSBdOyB0aGVuIG1rZGlyICQobGliZGlyKTsgZmkKKwljcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCisJY2htb2QgNjQ0ICQoaW5jbHVkZWRpcikvemxpYi5oICQoaW5jbHVkZWRpcikvemNvbmYuaAorCWNwICQoTElCUykgJChsaWJkaXIpCisJY2QgJChsaWJkaXIpOyBjaG1vZCA3NTUgJChMSUJTKQorCS1AKGNkICQobGliZGlyKTsgJChSQU5MSUIpIGxpYnouYSB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKKwljZCAkKGxpYmRpcik7IGlmIHRlc3QgLWYgJChTSEFSRURMSUIpLiQoVkVSKTsgdGhlbiBcCisJICBybSAtZiAkKFNIQVJFRExJQikgJChTSEFSRURMSUIpLjE7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCKS4kKFZFUikgJChTSEFSRURMSUIpOyBcCisJICBsbiAtcyAkKFNIQVJFRExJQikuJChWRVIpICQoU0hBUkVETElCKS4xOyBcCisJICAobGRjb25maWcgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAorCWZpCisjIFRoZSByYW5saWIgaW4gaW5zdGFsbCBpcyBuZWVkZWQgb24gTmVYVFNURVAgd2hpY2ggY2hlY2tzIGZpbGUgdGltZXMKKyMgbGRjb25maWcgaXMgZm9yIExpbnV4CisKK3VuaW5zdGFsbDoKKwljZCAkKGluY2x1ZGVkaXIpOyBcCisJdj0kKFZFUik7IFwKKwlpZiB0ZXN0IC1mIHpsaWIuaDsgdGhlbiBcCisJICB2PWBzZWQgLW4gJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgOyBcCisgICAgICAgICAgcm0gLWYgemxpYi5oIHpjb25mLmg7IFwKKwlmaTsgXAorCWNkICQobGliZGlyKTsgcm0gLWYgbGliei5hOyBcCisJaWYgdGVzdCAtZiAkKFNIQVJFRExJQikuJCR2OyB0aGVuIFwKKwkgIHJtIC1mICQoU0hBUkVETElCKS4kJHYgJChTSEFSRURMSUIpICQoU0hBUkVETElCKS4xOyBcCisJZmkKKworY2xlYW46CisJcm0gLWYgKi5vICp+IGV4YW1wbGUgbWluaWd6aXAgbGliei5hIGxpYnouc28qIGZvby5neiBzb19sb2NhdGlvbnMgXAorCSAgIF9tYXRjaC5zIG1ha2V0cmVlCisKK2Rpc3RjbGVhbjoJY2xlYW4KKworemlwOgorCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKKwlybSAtZiB0ZXN0LmMgenRlc3QqLmMgY29udHJpYi9taW5pemlwL3Rlc3QuemlwCisJdj1gc2VkIC1uIC1lICdzL1wuLy9nJyAtZSAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJyA8IHpsaWIuaGA7XAorCXppcCAtdWw5IHpsaWIkJHYgJChESVNURklMRVMpCisJbXYgTWFrZWZpbGV+IE1ha2VmaWxlCisKK2Rpc3Q6CisJbXYgTWFrZWZpbGUgTWFrZWZpbGV+OyBjcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQorCXJtIC1mIHRlc3QuYyB6dGVzdCouYyBjb250cmliL21pbml6aXAvdGVzdC56aXAKKwlkPXpsaWItYHNlZCAtbiAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJyA8IHpsaWIuaGA7XAorCXJtIC1mICQkZC50YXIuZ3o7IFwKKwlpZiB0ZXN0ICEgLWQgLi4vJCRkOyB0aGVuIHJtIC1mIC4uLyQkZDsgbG4gLXMgYHB3ZGAgLi4vJCRkOyBmaTsgXAorCWZpbGVzPSIiOyBcCisJZm9yIGYgaW4gJChESVNURklMRVMpOyBkbyBmaWxlcz0iJCRmaWxlcyAkJGQvJCRmIjsgZG9uZTsgXAorCWNkIC4uOyBcCisJR1pJUD0tOSAkKFRBUikgY2hvZnogJCRkLyQkZC50YXIuZ3ogJCRmaWxlczsgXAorCWlmIHRlc3QgISAtZCAkJGQ7IHRoZW4gcm0gLWYgJCRkOyBmaQorCW12IE1ha2VmaWxlfiBNYWtlZmlsZQorCit0YWdzOgkKKwlldGFncyAqLltjaF0KKworZGVwZW5kOgorCW1ha2VkZXBlbmQgLS0gJChDRkxBR1MpIC0tICouW2NoXQorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK2FkbGVyMzIubzogemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vOiB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAorZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZibG9jay5vOiBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mY29kZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mY29kZXMubzogaW5mdHJlZXMuaCBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAoraW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK2luZmZhc3QubzogaW5mYmxvY2suaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKK2luZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCitpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK2luZnV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKK21pbmlnemlwLm86ICB6bGliLmggemNvbmYuaCAKK3RyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKK3VuY29tcHIubzogemxpYi5oIHpjb25mLmgKK3p1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggIApkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvTWFrZWZpbGUucmlzY29zIGIvY29tbW9uL3psaWIvTWFrZWZpbGUucmlzY29zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5N2Y0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9NYWtlZmlsZS5yaXNjb3MKQEAgLTAsMCArMSwxNTEgQEAKKyMgUHJvamVjdDogICB6bGliXzFfMDMKKyMgUGF0Y2hlZCBmb3IgemxpYiAxLjEuMiByd0BzaGFkb3cub3JnLnVrIDE5OTgwNDMwCisjIHRlc3Qgd29ya3Mgb3V0LW9mLXRoZS1ib3gsIGluc3RhbGxzIGBzb21ld2hlcmUnIG9uIGRlbWFuZAorCisjIFRvb2xmbGFnczoKK0NDZmxhZ3MgPSAtYyAtZGVwZW5kICFEZXBlbmQgLUlDOiAtZyAtdGhyb3diYWNrICAtRFJJU0NPUyAgLWZhaCAKK0MrK2ZsYWdzID0gLWMgLWRlcGVuZCAhRGVwZW5kIC1JQzogLXRocm93YmFjaworTGlua2ZsYWdzID0gLWFpZiAtYysrIC1vICRAIAorT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAorQ01IR2ZsYWdzID0gCitMaWJGaWxlZmxhZ3MgPSAtYyAtbCAtbyAkQCAKK1NxdWVlemVmbGFncyA9IC1vICRACisKKyMgY2hhbmdlIHRoZSBsaW5lIGJlbG93IHRvIHdoZXJlIF95b3VfIHdhbnQgdGhlIGxpYnJhcnkgaW5zdGFsbGVkLgorbGliZGVzdCA9IGxpYjp6bGliCisKKyMgRmluYWwgdGFyZ2V0czoKK0AubGliOiAgIEAuby5hZGxlcjMyIEAuby5jb21wcmVzcyBALm8uY3JjMzIgQC5vLmRlZmxhdGUgQC5vLmd6aW8gXAorICAgICAgICBALm8uaW5mYmxvY2sgQC5vLmluZmNvZGVzIEAuby5pbmZmYXN0IEAuby5pbmZsYXRlIEAuby5pbmZ0cmVlcyBALm8uaW5mdXRpbCBALm8udHJlZXMgXAorICAgICAgICBALm8udW5jb21wciBALm8uenV0aWwgCisgICAgICAgIExpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAuby5hZGxlcjMyIEAuby5jb21wcmVzcyBALm8uY3JjMzIgQC5vLmRlZmxhdGUgXAorICAgICAgICBALm8uZ3ppbyBALm8uaW5mYmxvY2sgQC5vLmluZmNvZGVzIEAuby5pbmZmYXN0IEAuby5pbmZsYXRlIEAuby5pbmZ0cmVlcyBALm8uaW5mdXRpbCBcCisgICAgICAgIEAuby50cmVlcyBALm8udW5jb21wciBALm8uenV0aWwgCit0ZXN0OiAgIEAubWluaWd6aXAgQC5leGFtcGxlIEAubGliCisJQGNvcHkgQC5saWIgQC5saWJjICBBfkN+REZ+TH5OflB+UX5SU35UVgorCUBlY2hvIHJ1bm5pbmcgdGVzdHM6IGhhbmcgb24uCisJQC9ALm1pbmlnemlwIC1mIC05IGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtZiAtMSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAL0AubWluaWd6aXAgLWggLTkgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQC9ALm1pbmlnemlwIC1oIC0xIGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtOSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAL0AubWluaWd6aXAgLTEgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQGRpZmYgQC5saWIgQC5saWJjCisJQGVjaG8gdGhhdCBzaG91bGQgaGF2ZSByZXBvcnRlZCAnQC5saWIgYW5kIEAubGliYyBpZGVudGljYWwnIGlmIHlvdSBoYXZlIGRpZmYuCisJQC9ALmV4YW1wbGUgQC5mcmVkIEAuZnJlZAorCUBlY2hvIHRoYXQgd2lsbCBoYXZlIGdpdmVuIGxvdHMgb2YgaGVsbG8hJ3MuCisKK0AubWluaWd6aXA6ICAgQC5vLm1pbmlnemlwIEAubGliIEM6by5TdHVicyAKKyAgICAgICAgTGluayAkKExpbmtmbGFncykgQC5vLm1pbmlnemlwIEAubGliIEM6by5TdHVicyAKK0AuZXhhbXBsZTogICBALm8uZXhhbXBsZSBALmxpYiBDOm8uU3R1YnMgCisgICAgICAgIExpbmsgJChMaW5rZmxhZ3MpIEAuby5leGFtcGxlIEAubGliIEM6by5TdHVicworCitpbnN0YWxsOiBALmxpYgorCWNkaXIgJChsaWJkZXN0KQorCWNkaXIgJChsaWJkZXN0KS5oCisJQGNvcHkgQC5oLnpsaWIgJChsaWJkZXN0KS5oLnpsaWIgQX5DfkRGfkx+Tn5QflF+UlN+VFYKKwlAY29weSBALmguemNvbmYgJChsaWJkZXN0KS5oLnpjb25mIEF+Q35ERn5Mfk5+UH5RflJTflRWCisJQGNvcHkgQC5saWIgJChsaWJkZXN0KS5saWIgIEF+Q35ERn5Mfk5+UH5RflJTflRWCisJQGVjaG8gb2theSwgaW5zdGFsbGVkIHpsaWIgaW4gJChsaWJkZXN0KQorCitjbGVhbjo7IHJlbW92ZSBALm1pbmlnemlwCisJcmVtb3ZlIEAuZXhhbXBsZQorCXJlbW92ZSBALmxpYmMKKwktd2lwZSBALm8uKiBGfnJ+Y1YKKwlyZW1vdmUgQC5mcmVkCisKKyMgVXNlci1lZGl0YWJsZSBkZXBlbmRlbmNpZXM6CisuYy5vOgorICAgICAgICBjYyAkKGNjZmxhZ3MpIC1vICRAICQ8CisKKyMgU3RhdGljIGRlcGVuZGVuY2llczoKKworIyBEeW5hbWljIGRlcGVuZGVuY2llczoKK28uZXhhbXBsZToJYy5leGFtcGxlCitvLmV4YW1wbGU6CWguemxpYgorby5leGFtcGxlOgloLnpjb25mCitvLm1pbmlnemlwOgljLm1pbmlnemlwCitvLm1pbmlnemlwOgloLnpsaWIKK28ubWluaWd6aXA6CWguemNvbmYKK28uYWRsZXIzMjoJYy5hZGxlcjMyCitvLmFkbGVyMzI6CWguemxpYgorby5hZGxlcjMyOgloLnpjb25mCitvLmNvbXByZXNzOgljLmNvbXByZXNzCitvLmNvbXByZXNzOgloLnpsaWIKK28uY29tcHJlc3M6CWguemNvbmYKK28uY3JjMzI6CWMuY3JjMzIKK28uY3JjMzI6CWguemxpYgorby5jcmMzMjoJaC56Y29uZgorby5kZWZsYXRlOgljLmRlZmxhdGUKK28uZGVmbGF0ZToJaC5kZWZsYXRlCitvLmRlZmxhdGU6CWguenV0aWwKK28uZGVmbGF0ZToJaC56bGliCitvLmRlZmxhdGU6CWguemNvbmYKK28uZ3ppbzoJYy5nemlvCitvLmd6aW86CWguenV0aWwKK28uZ3ppbzoJaC56bGliCitvLmd6aW86CWguemNvbmYKK28uaW5mYmxvY2s6CWMuaW5mYmxvY2sKK28uaW5mYmxvY2s6CWguenV0aWwKK28uaW5mYmxvY2s6CWguemxpYgorby5pbmZibG9jazoJaC56Y29uZgorby5pbmZibG9jazoJaC5pbmZibG9jaworby5pbmZibG9jazoJaC5pbmZ0cmVlcworby5pbmZibG9jazoJaC5pbmZjb2Rlcworby5pbmZibG9jazoJaC5pbmZ1dGlsCitvLmluZmNvZGVzOgljLmluZmNvZGVzCitvLmluZmNvZGVzOgloLnp1dGlsCitvLmluZmNvZGVzOgloLnpsaWIKK28uaW5mY29kZXM6CWguemNvbmYKK28uaW5mY29kZXM6CWguaW5mdHJlZXMKK28uaW5mY29kZXM6CWguaW5mYmxvY2sKK28uaW5mY29kZXM6CWguaW5mY29kZXMKK28uaW5mY29kZXM6CWguaW5mdXRpbAorby5pbmZjb2RlczoJaC5pbmZmYXN0CitvLmluZmZhc3Q6CWMuaW5mZmFzdAorby5pbmZmYXN0OgloLnp1dGlsCitvLmluZmZhc3Q6CWguemxpYgorby5pbmZmYXN0OgloLnpjb25mCitvLmluZmZhc3Q6CWguaW5mdHJlZXMKK28uaW5mZmFzdDoJaC5pbmZibG9jaworby5pbmZmYXN0OgloLmluZmNvZGVzCitvLmluZmZhc3Q6CWguaW5mdXRpbAorby5pbmZmYXN0OgloLmluZmZhc3QKK28uaW5mbGF0ZToJYy5pbmZsYXRlCitvLmluZmxhdGU6CWguenV0aWwKK28uaW5mbGF0ZToJaC56bGliCitvLmluZmxhdGU6CWguemNvbmYKK28uaW5mbGF0ZToJaC5pbmZibG9jaworby5pbmZ0cmVlczoJYy5pbmZ0cmVlcworby5pbmZ0cmVlczoJaC56dXRpbAorby5pbmZ0cmVlczoJaC56bGliCitvLmluZnRyZWVzOgloLnpjb25mCitvLmluZnRyZWVzOgloLmluZnRyZWVzCitvLmluZnRyZWVzOgloLmluZmZpeGVkCitvLmluZnV0aWw6CWMuaW5mdXRpbAorby5pbmZ1dGlsOgloLnp1dGlsCitvLmluZnV0aWw6CWguemxpYgorby5pbmZ1dGlsOgloLnpjb25mCitvLmluZnV0aWw6CWguaW5mYmxvY2sKK28uaW5mdXRpbDoJaC5pbmZ0cmVlcworby5pbmZ1dGlsOgloLmluZmNvZGVzCitvLmluZnV0aWw6CWguaW5mdXRpbAorby50cmVlczoJYy50cmVlcworby50cmVlczoJaC5kZWZsYXRlCitvLnRyZWVzOgloLnp1dGlsCitvLnRyZWVzOgloLnpsaWIKK28udHJlZXM6CWguemNvbmYKK28udHJlZXM6CWgudHJlZXMKK28udW5jb21wcjoJYy51bmNvbXByCitvLnVuY29tcHI6CWguemxpYgorby51bmNvbXByOgloLnpjb25mCitvLnp1dGlsOgljLnp1dGlsCitvLnp1dGlsOgloLnp1dGlsCitvLnp1dGlsOgloLnpsaWIKK28uenV0aWw6CWguemNvbmYKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL1JFQURNRSBiL2NvbW1vbi96bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ2NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvUkVBRE1FCkBAIC0wLDAgKzEsMTQ3IEBACit6bGliIDEuMS40IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZQoraXMgdGhyZWFkIHNhZmUuICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5CitpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZQorZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4gVGhlc2UgZG9jdW1lbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbgorb3RoZXIgZm9ybWF0cyBmcm9tIGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvcG5nL2RvY3VtZW50cy96bGliL3pkb2MtaW5kZXguaHRtbAorCitBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIHpsaWIuaAorKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCBqbG91cEBnemlwLm9yZykuIEEgdXNhZ2UKK2V4YW1wbGUgb2YgdGhlIGxpYnJhcnkgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUgZXhhbXBsZS5jIHdoaWNoIGFsc28gdGVzdHMgdGhhdAordGhlIGxpYnJhcnkgaXMgd29ya2luZyBjb3JyZWN0bHkuIEFub3RoZXIgZXhhbXBsZSBpcyBnaXZlbiBpbiB0aGUgZmlsZQorbWluaWd6aXAuYy4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGFsbCBzb3VyY2UgZmlsZXMKK2V4Y2VwdCBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmMuCisKK1RvIGNvbXBpbGUgYWxsIGZpbGVzIGFuZCBydW4gdGhlIHRlc3QgcHJvZ3JhbSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKK2dpdmVuIGF0IHRoZSB0b3Agb2YgTWFrZWZpbGUuIEluIHNob3J0ICJtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIKK3Nob3VsZCB3b3JrIGZvciBtb3N0IG1hY2hpbmVzLiBGb3IgVW5peDogIi4vY29uZmlndXJlOyBtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIKK0ZvciBNU0RPUywgdXNlIG9uZSBvZiB0aGUgc3BlY2lhbCBtYWtlZmlsZXMgc3VjaCBhcyBNYWtlZmlsZS5tc2MuCitGb3IgVk1TLCB1c2UgTWFrZV92bXMuY29tIG9yIGRlc2NyaXAubW1zLgorCitRdWVzdGlvbnMgYWJvdXQgemxpYiBzaG91bGQgYmUgc2VudCB0byA8emxpYkBnemlwLm9yZz4sIG9yIHRvCitHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+IGZvciB0aGUgV2luZG93cyBETEwgdmVyc2lvbi4KK1RoZSB6bGliIGhvbWUgcGFnZSBpcyBodHRwOi8vd3d3LnpsaWIub3JnIG9yIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KK0JlZm9yZSByZXBvcnRpbmcgYSBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgdGhpcyBzaXRlIHRvIHZlcmlmeSB0aGF0Cit5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYjsgb3RoZXJ3aXNlIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kCitjaGVjayB3aGV0aGVyIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cyBvciBub3QuCisKK1BMRUFTRSByZWFkIHRoZSB6bGliIEZBUSBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvemxpYl9mYXEuaHRtbAorYmVmb3JlIGFza2luZyBmb3IgaGVscC4KKworTWFyayBOZWxzb24gPG1hcmtuQGllZWUub3JnPiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0IHpsaWIgZm9yIHRoZSBKYW4uIDE5OTcKK2lzc3VlIG9mICBEci4gRG9iYidzIEpvdXJuYWw7IGEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgaW4KK2h0dHA6Ly9kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCisKK1RoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjEuNCBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCitUaGUgb25seSBjaGFuZ2VzIG1hZGUgc2luY2UgMS4xLjMgYXJlIGJ1ZyBjb3JyZWN0aW9uczoKKworLSBaRlJFRSB3YXMgcmVwZWF0ZWQgb24gc2FtZSBhbGxvY2F0aW9uIG9uIHNvbWUgZXJyb3IgY29uZGl0aW9ucy4KKyAgVGhpcyBjcmVhdGVzIGEgc2VjdXJpdHkgcHJvYmxlbSBkZXNjcmliZWQgaW4KKyAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAorLSBSZXR1cm5lZCBpbmNvcnJlY3QgZXJyb3IgKFpfTUVNX0VSUk9SKSBvbiBzb21lIGludmFsaWQgZGF0YQorLSBBdm9pZCBhY2Nlc3NlcyBiZWZvcmUgd2luZG93IGZvciBpbnZhbGlkIGRpc3RhbmNlcyB3aXRoIGluZmxhdGUgd2luZG93CisgIGxlc3MgdGhhbiAzMksuCistIGZvcmNlIHdpbmRvd0JpdHMgPiA4IHRvIGF2b2lkIGEgYnVnIGluIHRoZSBlbmNvZGVyIGZvciBhIHdpbmRvdyBzaXplCisgIG9mIDI1NiBieXRlcy4gKEEgY29tcGxldGUgZml4IHdpbGwgYmUgYXZhaWxhYmxlIGluIDEuMS41KS4KKworVGhlIGJldGEgdmVyc2lvbiAxLjEuNWJldGEgaW5jbHVkZXMgbWFueSBtb3JlIGNoYW5nZXMuIEEgbmV3IG9mZmljaWFsCit2ZXJzaW9uIDEuMS41IHdpbGwgYmUgcmVsZWFzZWQgYXMgc29vbiBhcyBleHRlbnNpdmUgdGVzdGluZyBoYXMgYmVlbgorY29tcGxldGVkIG9uIGl0LgorCisKK1Vuc3VwcG9ydGVkIHRoaXJkIHBhcnR5IGNvbnRyaWJ1dGlvbnMgYXJlIHByb3ZpZGVkIGluIGRpcmVjdG9yeSAiY29udHJpYiIuCisKK0EgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB6bGliIGlzIGF2YWlsYWJsZSBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQKK2h0dHA6Ly93d3cuamF2YXNvZnQuY29tL3Byb2R1Y3RzL0pESy8xLjEvZG9jcy9hcGkvUGFja2FnZS1qYXZhLnV0aWwuemlwLmh0bWwKK1NlZSB0aGUgemxpYiBob21lIHBhZ2UgaHR0cDovL3d3dy56bGliLm9yZyBmb3IgZGV0YWlscy4KKworQSBQZXJsIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyA8cG1hcnF1ZXNzQGJmc2VjLmJ0LmNvLnVrPgoraXMgaW4gdGhlIENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzCitodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL0NvbXByZXNzLworCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgPGFta0BtYWduZXQuY29tPgoraXMgYXZhaWxhYmxlIGluIFB5dGhvbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zLCBzZWUKK2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvbGliL21vZHVsZS16bGliLmh0bWwKKworQSB6bGliIGJpbmRpbmcgZm9yIFRDTCB3cml0dGVuIGJ5IEFuZHJlYXMgS3VwcmllcyA8YS5rdXByaWVzQHdlc3RlbmQuY29tPgoraXMgYXZhaWxsYWJsZSBhdCBodHRwOi8vd3d3Lndlc3RlbmQuY29tL35rdXByaWVzL2RvYy90cmYvbWFuL21hbi5odG1sCisKK0FuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LAord3JpdHRlbiBvbiB0b3Agb2YgemxpYiBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LCBpcworYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAorYW5kIGFsc28gaW4gdGhlIGNvbnRyaWIvbWluaXppcCBkaXJlY3Rvcnkgb2YgemxpYi4KKworCitOb3RlcyBmb3Igc29tZSB0YXJnZXRzOgorCistIFRvIGJ1aWxkIGEgV2luZG93cyBETEwgdmVyc2lvbiwgaW5jbHVkZSBpbiBhIERMTCBwcm9qZWN0IHpsaWIuZGVmLCB6bGliLnJjCisgIGFuZCBhbGwgLmMgZmlsZXMgZXhjZXB0IGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYzsgY29tcGlsZSB3aXRoIC1EWkxJQl9ETEwKKyAgVGhlIHpsaWIgRExMIHN1cHBvcnQgd2FzIGluaXRpYWxseSBkb25lIGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpIGFuZCBpcworICBub3cgbWFpbnRhaW5lZCBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LiBDaGVjayB0aGUgemxpYiBETEwKKyAgaG9tZSBwYWdlIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwKKworICBGcm9tIFZpc3VhbCBCYXNpYywgeW91IGNhbiBjYWxsIHRoZSBETEwgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCB0YWtlCisgIGEgc3RydWN0dXJlIGFzIGFyZ3VtZW50OiBjb21wcmVzcywgdW5jb21wcmVzcyBhbmQgYWxsIGd6KiBmdW5jdGlvbnMuCisgIFNlZSBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24sIG9yIGdldAorICBodHRwOi8vd3d3LnRjZmIuY29tL2Rvd3Nld2FyZS9jbXAtei1pdC56aXAKKworLSBGb3IgNjQtYml0IElyaXgsIGRlZmxhdGUuYyBtdXN0IGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbi4KKyAgV2l0aCAtTywgb25lIGxpYnBuZyB0ZXN0IGZhaWxzLiBUaGUgdGVzdCB3b3JrcyBpbiAzMiBiaXQgbW9kZSAod2l0aAorICB0aGUgLW4zMiBjb21waWxlciBmbGFnKS4gVGhlIGNvbXBpbGVyIGJ1ZyBoYXMgYmVlbiByZXBvcnRlZCB0byBTR0kuCisKKy0gemxpYiBkb2Vzbid0IHdvcmsgd2l0aCBnY2MgMi42LjMgb24gYSBERUMgMzAwMC8zMDBMWCB1bmRlciBPU0YvMSAyLjEgICAKKyAgaXQgd29ya3Mgd2hlbiBjb21waWxlZCB3aXRoIGNjLgorCistIG9uIERpZ2l0YWwgVW5peCA0LjBEIChmb3JtZWx5IE9TRi8xKSBvbiBBbHBoYVNlcnZlciwgdGhlIGNjIG9wdGlvbiAtc3RkMQorICBpcyBuZWNlc3NhcnkgdG8gZ2V0IGd6cHJpbnRmIHdvcmtpbmcgY29ycmVjdGx5LiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJlLgorCistIHpsaWIgZG9lc24ndCB3b3JrIG9uIEhQLVVYIDkuMDUgd2l0aCBzb21lIHZlcnNpb25zIG9mIC9iaW4vY2MuIEl0IHdvcmtzCisgIHdpdGggb3RoZXIgY29tcGlsZXJzLiBVc2UgIm1ha2UgdGVzdCIgdG8gY2hlY2sgeW91ciBjb21waWxlci4KKworLSBnemRvcGVuIGlzIG5vdCBzdXBwb3J0ZWQgb24gUklTQ09TLCBCRU9TIGFuZCBieSBzb21lIE1hYyBjb21waWxlcnMuCisKKy0gRm9yIFR1cmJvIEMgdGhlIHNtYWxsIG1vZGVsIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggcmVkdWNlZCBwZXJmb3JtYW5jZSB0bworICBhdm9pZCBhbnkgZmFyIGFsbG9jYXRpb247IGl0IHdhcyB0ZXN0ZWQgd2l0aCAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MworCistIEZvciBQYWxtT3MsIHNlZSBodHRwOi8vd3d3LmNzLnVpdC5uby9+cGVybS9QQVNUQS9waWxvdC9zb2Z0d2FyZS5odG1sCisgIFBlciBIYXJhbGQgTXlydmFuZyA8cGVybUBzdHVkLmNzLnVpdC5ubz4KKworCitBY2tub3dsZWRnbWVudHM6CisKKyAgVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkgemxpYiB3YXMgZGVmaW5lZCBieSBQaGlsIEthdHouIFRoZSBkZWZsYXRlCisgIGFuZCB6bGliIHNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLiBUaGFua3MgdG8gYWxsIHRoZQorICBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cyBpbXByb3ZlbWVudHMgaW4gemxpYjsKKyAgdGhleSBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKworQ29weXJpZ2h0IG5vdGljZToKKworIChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgd2Ugd291bGQgYXBwcmVjaWF0ZSAqbm90KgorcmVjZWl2aW5nIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIHRvIHNpZ24uIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZAorZm9yIGZyZWUgYnV0IHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbgorZW50aXJlbHkgd3JpdHRlbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdAoraW5jbHVkZSB0aGlyZC1wYXJ0eSBjb2RlLgorCitJZiB5b3UgcmVkaXN0cmlidXRlIG1vZGlmaWVkIHNvdXJjZXMsIHdlIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3UgaW5jbHVkZQoraW4gdGhlIGZpbGUgQ2hhbmdlTG9nIGhpc3RvcnkgaW5mb3JtYXRpb24gZG9jdW1lbnRpbmcgeW91ciBjaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvYWRsZXIzMi5jIGIvY29tbW9uL3psaWIvYWRsZXIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOGEzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9hZGxlcjMyLmMKQEAgLTAsMCArMSw0OCBAQAorLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogQCgjKSAkSWQ6IGFkbGVyMzIuYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjIxIGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgInpsaWIuaCIKKworI2RlZmluZSBCQVNFIDY1NTIxTCAvKiBsYXJnZXN0IHByaW1lIHNtYWxsZXIgdGhhbiA2NTUzNiAqLworI2RlZmluZSBOTUFYIDU1NTIKKy8qIE5NQVggaXMgdGhlIGxhcmdlc3QgbiBzdWNoIHRoYXQgMjU1bihuKzEpLzIgKyAobisxKShCQVNFLTEpIDw9IDJeMzItMSAqLworCisjZGVmaW5lIERPMShidWYsaSkgIHtzMSArPSBidWZbaV07IHMyICs9IHMxO30KKyNkZWZpbmUgRE8yKGJ1ZixpKSAgRE8xKGJ1ZixpKTsgRE8xKGJ1ZixpKzEpOworI2RlZmluZSBETzQoYnVmLGkpICBETzIoYnVmLGkpOyBETzIoYnVmLGkrMik7CisjZGVmaW5lIERPOChidWYsaSkgIERPNChidWYsaSk7IERPNChidWYsaSs0KTsKKyNkZWZpbmUgRE8xNihidWYpICAgRE84KGJ1ZiwwKTsgRE84KGJ1Ziw4KTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordUxvbmcgWkVYUE9SVCBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbikKKyAgICB1TG9uZyBhZGxlcjsKKyAgICBjb25zdCBCeXRlZiAqYnVmOworICAgIHVJbnQgbGVuOworeworICAgIHVuc2lnbmVkIGxvbmcgczEgPSBhZGxlciAmIDB4ZmZmZjsKKyAgICB1bnNpZ25lZCBsb25nIHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKKyAgICBpbnQgazsKKworICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMUw7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBrID0gbGVuIDwgTk1BWCA/IGxlbiA6IE5NQVg7CisgICAgICAgIGxlbiAtPSBrOworICAgICAgICB3aGlsZSAoayA+PSAxNikgeworICAgICAgICAgICAgRE8xNihidWYpOworCSAgICBidWYgKz0gMTY7CisgICAgICAgICAgICBrIC09IDE2OworICAgICAgICB9CisgICAgICAgIGlmIChrICE9IDApIGRvIHsKKyAgICAgICAgICAgIHMxICs9ICpidWYrKzsKKwkgICAgczIgKz0gczE7CisgICAgICAgIH0gd2hpbGUgKC0tayk7CisgICAgICAgIHMxICU9IEJBU0U7CisgICAgICAgIHMyICU9IEJBU0U7CisgICAgfQorICAgIHJldHVybiAoczIgPDwgMTYpIHwgczE7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9hbGdvcml0aG0udHh0IGIvY29tbW9uL3psaWIvYWxnb3JpdGhtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM4MzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvYWxnb3JpdGhtLnR4dApAQCAtMCwwICsxLDIxMyBAQAorMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQorCitUaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgorTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCit0aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCitwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCitsZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKK3RvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKKzMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcworZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAorYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKKworTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAorbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAoraW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55CitzaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KK2F2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0CitpdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcworc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQorCitEdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKK2xlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgordGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKK3N0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCit0aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KKworVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bworZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgorVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCitoYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgorCitUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Cit0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAorcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Citwb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCisKK2RlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgorbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCithIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCitwcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQorbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAordGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgorc3RlcHMgbGF0ZXIuCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCit0aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKK21hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCit0aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KKworVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgorbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKK2FyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgord2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbworYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCisKKzIuMSBJbnRyb2R1Y3Rpb24KKworVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGdpdmVuIGEgSHVmZm1hbiB0cmVlLCBob3cgdG8gZGVjb2RlIGZhc3QuICBUaGUgbW9zdAoraW1wb3J0YW50IHJlYWxpemF0aW9uIGlzIHRoYXQgc2hvcnRlciBjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuCitsb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlIHNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQKK3RoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KKworaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCitpbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCitzdHJlYW0sIGFuZCBsb29rcyBpdCB1cCBpbiB0aGUgdGFibGUuICBUaGUgdGFibGUgd2lsbCB0ZWxsIGlmIHRoZSBuZXh0Citjb2RlIGlzIHRoYXQgbWFueSBiaXRzIG9yIGxlc3MgYW5kIGhvdyBtYW55LCBhbmQgaWYgaXQgaXMsIGl0IHdpbGwgdGVsbAordGhlIHZhbHVlLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgbGV2ZWwgdGFibGUgZm9yIHdoaWNoIGluZmxhdGUoKQorZ3JhYnMgbW9yZSBiaXRzIGFuZCB0cmllcyB0byBkZWNvZGUgYSBsb25nZXIgY29kZS4KKworSG93IG1hbnkgYml0cyB0byBtYWtlIHRoZSBmaXJzdCBsb29rdXAgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSB0aW1lIGl0Cit0YWtlcyB0byBkZWNvZGUgYW5kIHRoZSB0aW1lIGl0IHRha2VzIHRvIGJ1aWxkIHRoZSB0YWJsZS4gIElmIGJ1aWxkaW5nIHRoZQordGFibGUgdG9vayBubyB0aW1lIChhbmQgaWYgeW91IGhhZCBpbmZpbml0ZSBtZW1vcnkpLCB0aGVuIHRoZXJlIHdvdWxkIG9ubHkKK2JlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCitidWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKK2NvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcworc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgc2V0IGl0Citmb3IgdGhlIG1heGltdW0gc3BlZWQuCisKK2luZmxhdGUoKSBzZW5kcyBuZXcgdHJlZXMgcmVsYXRpdmVseSBvZnRlbiwgc28gaXQgaXMgcG9zc2libHkgc2V0IGZvciBhCitzbWFsbGVyIGZpcnN0IGxldmVsIHRhYmxlIHRoYW4gYW4gYXBwbGljYXRpb24gdGhhdCBoYXMgb25seSBvbmUgdHJlZSBmb3IKK2FsbCB0aGUgZGF0YS4gIEZvciBpbmZsYXRlLCB3aGljaCBoYXMgMjg2IHBvc3NpYmxlIGNvZGVzIGZvciB0aGUKK2xpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBuaW5lIGJpdHMuICBBbHNvIHRoZQorZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZSB2YWx1ZXMsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgdGFibGUgaXMKK3NpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mIHRob3NlIGNhc2VzLCB0aGUgdGFibGUgZW5kZWQgdXAgb25lIGJpdAorbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUgbGVuZ3RoLCBpLmUuIHRoZSBjb2RlIGxlbmd0aCBvZiBhbgorYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYSBsaXR0bGUgbW9yZSB0aGFuIGVpZ2h0IGJpdHMgZm9yCisyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cyBmb3IgMzAgc3ltYm9scy4gIEl0IHdvdWxkIGJlCitpbnRlcmVzdGluZyB0byBzZWUgaWYgb3B0aW1pemluZyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIG90aGVyCithcHBsaWNhdGlvbnMgZ2F2ZSB2YWx1ZXMgd2l0aGluIGEgYml0IG9yIHR3byBvZiB0aGUgZmxhdCBjb2RlIHNpemUuCisKKworMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKKworT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5ICAKK2xvb2tzIGxpa2UuICBZb3UgYXJlIGNvcnJlY3QgdGhhdCBpdCdzIG5vdCBhIEh1ZmZtYW4gdHJlZS4gIEl0IGlzIHNpbXBseSBhICAKK2xvb2t1cCB0YWJsZSBmb3IgdGhlIGZpcnN0LCBsZXQncyBzYXksIG5pbmUgYml0cyBvZiBhIEh1ZmZtYW4gc3ltYm9sLiAgVGhlICAKK3N5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhciAgCitzeW1ib2wgaXMgc2hvcnRlciB0aGFuIG5pbmUgYml0cywgdGhlbiB0aGF0IHN5bWJvbCdzIHRyYW5zbGF0aW9uIGlzIGR1cGxpY2F0ZWQKK2luIGFsbCB0aG9zZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aCB0aGF0IHN5bWJvbCdzIGJpdHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlICAKK3N5bWJvbCBpcyBmb3VyIGJpdHMsIHRoZW4gaXQncyBkdXBsaWNhdGVkIDMyIHRpbWVzIGluIGEgbmluZS1iaXQgdGFibGUuICBJZiBhICAKK3N5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KKworSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzICAKK3RvIGFub3RoZXIgc2ltaWxhciB0YWJsZSBmb3IgdGhlIHJlbWFpbmluZyBiaXRzLiAgQWdhaW4sIHRoZXJlIGFyZSBkdXBsaWNhdGVkICAKK2VudHJpZXMgYXMgbmVlZGVkLiAgVGhlIGlkZWEgaXMgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBzeW1ib2wgd2lsbCBiZSBzaG9ydAorYW5kIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGFibGUgbG9vayB1cC4gIChUaGF0J3Mgd2hvbGUgaWRlYSBiZWhpbmQgZGF0YSAgCitjb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUgIAord2lsbCBiZSB0d28gbG9va3Vwcy4gIElmIHlvdSBoYWQgYSBjb21wcmVzc2lvbiBtZXRob2Qgd2l0aCByZWFsbHkgbG9uZyAgCitzeW1ib2xzLCB5b3UgY291bGQgaGF2ZSBhcyBtYW55IGxldmVscyBvZiBsb29rdXBzIGFzIGlzIGVmZmljaWVudC4gIEZvciAgCitpbmZsYXRlLCB0d28gaXMgZW5vdWdoLgorCitTbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4gIAordGhlIGFib3ZlIGV4YW1wbGUgYXJlIGdvYmJsZWQpLCBvciBpdCBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBzeW1ib2wgIAorYW5kIHRoZSBudW1iZXIgb2YgYml0cyB0byBnb2JibGUuICBUaGVuIHlvdSBzdGFydCBhZ2FpbiB3aXRoIHRoZSBuZXh0ICAKK3VuZ29iYmxlZCBiaXQuCisKK1lvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlICAKK2xvbmdlc3Qgc3ltYm9sIGlzPyAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHlvdSBkbyB0aGF0LCB5b3UgZW5kIHVwIHNwZW5kaW5nICAKK21vcmUgdGltZSBmaWxsaW5nIGluIGR1cGxpY2F0ZSBzeW1ib2wgZW50cmllcyB0aGFuIHlvdSBkbyBhY3R1YWxseSBkZWNvZGluZy4gICAKK0F0IGxlYXN0IGZvciBkZWZsYXRlJ3Mgb3V0cHV0IHRoYXQgZ2VuZXJhdGVzIG5ldyB0cmVlcyBldmVyeSBzZXZlcmFsIDEwJ3Mgb2YgIAora2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUgIAord291bGQgdGFrZSB0b28gbG9uZyBpZiB5b3UncmUgb25seSBkZWNvZGluZyBzZXZlcmFsIHRob3VzYW5kIHN5bWJvbHMuICBBdCB0aGUgIAorb3RoZXIgZXh0cmVtZSwgeW91IGNvdWxkIG1ha2UgYSBuZXcgdGFibGUgZm9yIGV2ZXJ5IGJpdCBpbiB0aGUgY29kZS4gIEluIGZhY3QsCit0aGF0J3MgZXNzZW50aWFsbHkgYSBIdWZmbWFuIHRyZWUuICBCdXQgdGhlbiB5b3Ugc3BlbmQgdHdvIG11Y2ggdGltZSAgCit0cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgorCitTbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0byAgCitmaWxsIG91dCB0aGUgdGFibGUgdnMuIHRoZSB0aW1lIHNwZW50IGxvb2tpbmcgYXQgdGhlIHNlY29uZCBsZXZlbCBhbmQgYWJvdmUgb2YKK3RoZSB0YWJsZS4KKworSGVyZSBpcyBhbiBleGFtcGxlLCBzY2FsZWQgZG93bjoKKworVGhlIGNvZGUgYmVpbmcgZGVjb2RlZCwgd2l0aCAxMCBzeW1ib2xzLCBmcm9tIDEgdG8gNiBiaXRzIGxvbmc6CisKK0E6IDAKK0I6IDEwCitDOiAxMTAwCitEOiAxMTAxMAorRTogMTEwMTEKK0Y6IDExMTAwCitHOiAxMTEwMQorSDogMTExMTAKK0k6IDExMTExMAorSjogMTExMTExCisKK0xldCdzIG1ha2UgdGhlIGZpcnN0IHRhYmxlIHRocmVlIGJpdHMgbG9uZyAoZWlnaHQgZW50cmllcyk6CisKKzAwMDogQSwxCiswMDE6IEEsMQorMDEwOiBBLDEKKzAxMTogQSwxCisxMDA6IEIsMgorMTAxOiBCLDIKKzExMDogLT4gdGFibGUgWCAoZ29iYmxlIDMgYml0cykKKzExMTogLT4gdGFibGUgWSAoZ29iYmxlIDMgYml0cykKKworRWFjaCBlbnRyeSBpcyB3aGF0IHRoZSBiaXRzIGRlY29kZSB0byBhbmQgaG93IG1hbnkgYml0cyB0aGF0IGlzLCBpLmUuIGhvdyAgCittYW55IGJpdHMgdG8gZ29iYmxlLiAgT3IgdGhlIGVudHJ5IHBvaW50cyB0byBhbm90aGVyIHRhYmxlLCB3aXRoIHRoZSBudW1iZXIgb2YKK2JpdHMgdG8gZ29iYmxlIGltcGxpY2l0IGluIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KKworVGFibGUgWCBpcyB0d28gYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTAgaXMgZml2ZSBiaXRzCitsb25nOgorCiswMDogQywxCiswMTogQywxCisxMDogRCwyCisxMTogRSwyCisKK1RhYmxlIFkgaXMgdGhyZWUgYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTEgaXMgc2l4ICAKK2JpdHMgbG9uZzoKKworMDAwOiBGLDIKKzAwMTogRiwyCiswMTA6IEcsMgorMDExOiBHLDIKKzEwMDogSCwyCisxMDE6IEgsMgorMTEwOiBJLDMKKzExMTogSiwzCisKK1NvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8gIAorYmUgY29uc3RydWN0ZWQuICBUaGF0J3MgY29tcGFyZWQgdG8gNjQgZW50cmllcyBmb3IgYSBzaW5nbGUgdGFibGUuICBPciAgCitjb21wYXJlZCB0byAxNiBlbnRyaWVzIGZvciBhIEh1ZmZtYW4gdHJlZSAoc2l4IHR3byBlbnRyeSB0YWJsZXMgYW5kIG9uZSBmb3VyICAKK2VudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZiAgCit0aGUgc3ltYm9scywgaXQgdGFrZXMgb24gdGhlIGF2ZXJhZ2UgMS4yNSBsb29rdXBzIHBlciBzeW1ib2wuICBUaGF0J3MgY29tcGFyZWQKK3RvIG9uZSBsb29rdXAgZm9yIHRoZSBzaW5nbGUgdGFibGUsIG9yIDEuNjYgbG9va3VwcyBwZXIgc3ltYm9sIGZvciB0aGUgIAorSHVmZm1hbiB0cmVlLgorCitUaGVyZSwgSSB0aGluayB0aGF0IGdpdmVzIHlvdSBhIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLiAgRm9yIGluZmxhdGUsIHRoZSAgCittZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYSAgCitieXRlIChhICJsaXRlcmFsIiksIG9yIGl0IGNhbiBiZSBlaXRoZXIgYSBsZW5ndGggb3IgYSBkaXN0YW5jZSB3aGljaCAgCitpbmRpY2F0ZXMgYSBiYXNlIHZhbHVlIGFuZCBhIG51bWJlciBvZiBiaXRzIHRvIGZldGNoIGFmdGVyIHRoZSBjb2RlIHRoYXQgaXMgIAorYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZSAgCitkYXRhIHN0cnVjdHVyZXMgY3JlYXRlZCBpbiBpbmZ0cmVlcy5jIHRyeSB0byBlbmNvZGUgYWxsIHRoYXQgaW5mb3JtYXRpb24gIAorY29tcGFjdGx5IGluIHRoZSB0YWJsZXMuCisKKworSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgoramxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKK1JlZmVyZW5jZXM6CisKK1tMWjc3XSBaaXYgSi4sIExlbXBlbCBBLiwgYGBBIFVuaXZlcnNhbCBBbGdvcml0aG0gZm9yIFNlcXVlbnRpYWwgRGF0YQorQ29tcHJlc3Npb24sJycgSUVFRSBUcmFuc2FjdGlvbnMgb24gSW5mb3JtYXRpb24gVGhlb3J5LCBWb2wuIDIzLCBOby4gMywKK3BwLiAzMzctMzQzLgorCitgYERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uJycgYXZhaWxhYmxlIGluCitmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9jb21wcmVzcy5jIGIvY29tbW9uL3psaWIvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTk3NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvY29tcHJlc3MuYwpAQCAtMCwwICsxLDY4IEBACisvKiBjb21wcmVzcy5jIC0tIGNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogQCgjKSAkSWQ6IGNvbXByZXNzLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyMiBjb25zdF9rIEV4cCAkICovCisKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCisgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCisgICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KK2ludCBaRVhQT1JUIGNvbXByZXNzMiAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4sIGxldmVsKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKKyAgICBpbnQgbGV2ZWw7Cit7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCBlcnI7CisKKyAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOworICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKKyNpZmRlZiBNQVhTRUdfNjRLCisgICAgLyogQ2hlY2sgZm9yIHNvdXJjZSA+IDY0SyBvbiAxNi1iaXQgbWFjaGluZTogKi8KKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9pbiAhPSBzb3VyY2VMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKyNlbmRpZgorICAgIHN0cmVhbS5uZXh0X291dCA9IGRlc3Q7CisgICAgc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpkZXN0TGVuOworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX291dCAhPSAqZGVzdExlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmc3RyZWFtLCBsZXZlbCk7CisgICAgaWYgKGVyciAhPSBaX09LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIGVyciA9PSBaX09LID8gWl9CVUZfRVJST1IgOiBlcnI7CisgICAgfQorICAgICpkZXN0TGVuID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK2ludCBaRVhQT1JUIGNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKKyAgICBCeXRlZiAqZGVzdDsKKyAgICB1TG9uZ2YgKmRlc3RMZW47CisgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgcmV0dXJuIGNvbXByZXNzMihkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2NvbmZpZ3VyZSBiL2NvbW1vbi96bGliL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lODk0MjM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvY29uZmlndXJlCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMgY29uZmlndXJlIHNjcmlwdCBmb3IgemxpYi4gVGhpcyBzY3JpcHQgaXMgbmVlZGVkIG9ubHkgaWYKKyMgeW91IHdpc2ggdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSBhbmQgeW91ciBzeXN0ZW0gc3VwcG9ydHMgdGhlbSwKKyMgb2YgaWYgeW91IG5lZWQgc3BlY2lhbCBjb21waWxlciwgZmxhZ3Mgb3IgaW5zdGFsbCBkaXJlY3RvcnkuCisjIE90aGVyd2lzZSwgeW91IGNhbiBqdXN0IHVzZSBkaXJlY3RseSAibWFrZSB0ZXN0OyBtYWtlIGluc3RhbGwiCisjCisjIFRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LCB1c2UgImNvbmZpZ3VyZSAtLXNoYXJlZCI7IGJ5IGRlZmF1bHQgYSBzdGF0aWMKKyMgbGlicmFyeSBpcyBjcmVhdGVkLiBJZiB0aGUgcHJpbWl0aXZlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcHJvdmlkZWQgaGVyZQorIyBkb2VzIG5vdCB3b3JrLCB1c2UgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvbGlidG9vbC0qLnRhci5negorIworIyBUbyBpbXBvc2Ugc3BlY2lmaWMgY29tcGlsZXIgb3IgZmxhZ3Mgb3IgaW5zdGFsbCBkaXJlY3RvcnksIHVzZSBmb3IgZXhhbXBsZToKKyMgICAgcHJlZml4PSRIT01FIENDPWNjIENGTEFHUz0iLU80IiAuL2NvbmZpZ3VyZQorIyBvciBmb3IgY3NoL3Rjc2ggdXNlcnM6CisjICAgIChzZXRlbnYgcHJlZml4ICRIT01FOyBzZXRlbnYgQ0MgY2M7IHNldGVudiBDRkxBR1MgIi1PNCI7IC4vY29uZmlndXJlKQorIyBMRFNIQVJFRCBpcyB0aGUgY29tbWFuZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5CisKKyMgSW5jb3JyZWN0IHNldHRpbmdzIG9mIENDIG9yIENGTEFHUyBtYXkgcHJldmVudCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBJZiB5b3UgaGF2ZSBwcm9ibGVtcywgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUyBiZWZvcmUgcmVwb3J0aW5nCisjIGFuIGVycm9yLgorCitMSUJTPWxpYnouYQorU0hBUkVETElCPWxpYnouc28KK1ZFUj1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYAorQVI9JHtBUi0iYXIgcmMifQorUkFOTElCPSR7UkFOTElCLSJyYW5saWIifQorcHJlZml4PSR7cHJlZml4LS91c3IvbG9jYWx9CitleGVjX3ByZWZpeD0ke2V4ZWNfcHJlZml4LScke3ByZWZpeH0nfQorbGliZGlyPSR7bGliZGlyLScke2V4ZWNfcHJlZml4fS9saWInfQoraW5jbHVkZWRpcj0ke2luY2x1ZGVkaXItJyR7cHJlZml4fS9pbmNsdWRlJ30KK3NoYXJlZF9leHQ9Jy5zbycKK3NoYXJlZD0wCitnY2M9MAorb2xkX2NjPSIkQ0MiCitvbGRfY2ZsYWdzPSIkQ0ZMQUdTIgorCit3aGlsZSB0ZXN0ICQjIC1nZSAxCitkbworY2FzZSAiJDEiIGluCisgICAgLWgqIHwgLS1oKikKKyAgICAgIGVjaG8gJ3VzYWdlOicKKyAgICAgIGVjaG8gJyAgY29uZmlndXJlIFstLXNoYXJlZF0gWy0tcHJlZml4PVBSRUZJWF0gIFstLWV4ZWNfcHJlZml4PUVYUFJFRklYXScKKyAgICAgIGVjaG8gJyAgICAgWy0tbGliZGlyPUxJQkRJUl0gWy0taW5jbHVkZWRpcj1JTkNMVURFRElSXScKKyAgICAgICAgZXhpdCAwOzsKKyAgICAtcCo9KiB8IC0tcCo9KikgcHJlZml4PWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7IHNoaWZ0OzsKKyAgICAtZSo9KiB8IC0tZSo9KikgZXhlY19wcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvWy1hLXpfXSo9Ly8nYDsgc2hpZnQ7OworICAgIC1sKj0qIHwgLS1saWJkaXI9KikgbGliZGlyPWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7IHNoaWZ0OzsKKyAgICAtaSo9KiB8IC0taW5jbHVkZWRpcj0qKSBpbmNsdWRlZGlyPWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7c2hpZnQ7OworICAgIC1wKiB8IC0tcCopIHByZWZpeD0iJDIiOyBzaGlmdDsgc2hpZnQ7OworICAgIC1lKiB8IC0tZSopIGV4ZWNfcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdDs7CisgICAgLWwqIHwgLS1sKikgbGliZGlyPSIkMiI7IHNoaWZ0OyBzaGlmdDs7CisgICAgLWkqIHwgLS1pKikgaW5jbHVkZWRpcj0iJDIiOyBzaGlmdDsgc2hpZnQ7OworICAgIC1zKiB8IC0tcyopIHNoYXJlZD0xOyBzaGlmdDs7CisgICAgZXNhYworZG9uZQorCit0ZXN0PXp0ZXN0JCQKK2NhdCA+ICR0ZXN0LmMgPDxFT0YKK2V4dGVybiBpbnQgZ2V0Y2hhcigpOworaW50IGhlbGxvKCkge3JldHVybiBnZXRjaGFyKCk7fQorRU9GCisKK3Rlc3QgLXogIiRDQyIgJiYgZWNobyBDaGVja2luZyBmb3IgZ2NjLi4uCitjYz0ke0NDLWdjY30KK2NmbGFncz0ke0NGTEFHUy0iLU8zIn0KKyMgdG8gZm9yY2UgdGhlIGFzbSB2ZXJzaW9uIHVzZTogQ0ZMQUdTPSItTzMgLURBU01WIiAuL2NvbmZpZ3VyZQorY2FzZSAiJGNjIiBpbgorICAqZ2NjKikgZ2NjPTE7OworZXNhYworCitpZiB0ZXN0ICIkZ2NjIiAtZXEgMSAmJiAoJGNjIC1jICRjZmxhZ3MgJHRlc3QuYykgMj4vZGV2L251bGw7IHRoZW4KKyAgQ0M9IiRjYyIKKyAgU0ZMQUdTPSR7Q0ZMQUdTLSItZlBJQyAtTzMifQorICBDRkxBR1M9IiRjZmxhZ3MiCisgIGNhc2UgYCh1bmFtZSAtcyB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICBMaW51eCB8IGxpbnV4KSBMRFNIQVJFRD0ke0xEU0hBUkVELSJnY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEifTs7CisgICopICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImdjYyAtc2hhcmVkIn07OworICBlc2FjCitlbHNlCisgICMgZmluZCBzeXN0ZW0gbmFtZSBhbmQgY29ycmVzcG9uZGluZyBjYyBvcHRpb25zCisgIENDPSR7Q0MtY2N9CisgIGNhc2UgYCh1bmFtZSAtc3IgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAgaW4KKyAgSFAtVVgqKSAgICBTRkxBR1M9JHtDRkxBR1MtIi1PICt6In0KKwkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQorIwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIC1iICt2bm9jb21wYXR3YXJuaW5ncyJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCAtYiJ9CisJICAgICBzaGFyZWRfZXh0PScuc2wnCisJICAgICBTSEFSRURMSUI9J2xpYnouc2wnOzsKKyAgSVJJWCopICAgICBTRkxBR1M9JHtDRkxBR1MtIi1hbnNpIC1PMiAtcnBhdGggLiJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1hbnNpIC1PMiJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIn07OworICBPU0YxXCBWNCopIFNGTEFHUz0ke0NGTEFHUy0iLU8gLXN0ZDEifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkICAtV2wsLXNvbmFtZSwkU0hBUkVETElCIC1XbCwtbXN5bSAtV2wsLXJwYXRoLCQobGliZGlyKSAtV2wsLXNldF92ZXJzaW9uLCR7VkVSfToxLjAifTs7CisgIE9TRjEqKSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifTs7CisgIFFOWCopICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItNCAtTyJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItNCAtTyJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyJ9CisgICAgICAgICAgICAgUkFOTElCPSR7UkFOTElCLSJ0cnVlIn0KKyAgICAgICAgICAgICBBUj0iY2MgLUEiOzsKKyAgU0NPX1NWXCAzLjIqKSBTRkxBR1M9JHtDRkxBR1MtIi1PMyAtZHkgLUtQSUMgIn0KKwkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8zIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1keSAtS1BJQyAtRyJ9OzsKKyAgU3VuT1NcIDUqKSBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y2c4OSAtS1BJQyAtUi4ifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLWZhc3QgLXhjZzg5In0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworICBTdW5PU1wgNCopIFNGTEFHUz0ke0NGTEFHUy0iLU8yIC1QSUMifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIifQorCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQifTs7CisgIFVOSVhfU3lzdGVtX1ZcIDQuMi4wKSAKKwkgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKKyAgVU5JWF9TVlwgNC4yTVApCisJICAgICBTRkxBR1M9JHtDRkxBR1MtIi1LY29uZm9ybV9waWMgLU8ifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKKyAgIyBzZW5kIHdvcmtpbmcgb3B0aW9ucyBmb3Igb3RoZXIgc3lzdGVtcyB0byBzdXBwb3J0QGd6aXAub3JnCisgICopICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKwkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifTs7CisgIGVzYWMKK2ZpCisKK2lmIHRlc3QgJHNoYXJlZCAtZXEgMTsgdGhlbgorICBlY2hvIENoZWNraW5nIGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0Li4uCisgICMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAorICBpZiB0ZXN0ICJgKCRDQyAtYyAkU0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiICYmCisgICAgIHRlc3QgImAoJExEU0hBUkVEIC1vICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QubykgMj4mMWAiID0gIiI7IHRoZW4KKyAgICBDRkxBR1M9IiRTRkxBR1MiCisgICAgTElCUz0iJFNIQVJFRExJQi4kVkVSIgorICAgIGVjaG8gQnVpbGRpbmcgc2hhcmVkIGxpYnJhcnkgJFNIQVJFRExJQi4kVkVSIHdpdGggJENDLgorICBlbGlmIHRlc3QgLXogIiRvbGRfY2MiIC1hIC16ICIkb2xkX2NmbGFncyI7IHRoZW4KKyAgICBlY2hvIE5vIHNoYXJlZCBsaWJyYXJ5IHN1cHBwb3J0LgorICAgIHNoYXJlZD0wOworICBlbHNlCisgICAgZWNobyAnTm8gc2hhcmVkIGxpYnJhcnkgc3VwcHBvcnQ7IHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MnCisgICAgc2hhcmVkPTA7CisgIGZpCitmaQoraWYgdGVzdCAkc2hhcmVkIC1lcSAwOyB0aGVuCisgIExEU0hBUkVEPSIkQ0MiCisgIGVjaG8gQnVpbGRpbmcgc3RhdGljIGxpYnJhcnkgJExJQlMgdmVyc2lvbiAkVkVSIHdpdGggJENDLgorZmkKKworY2F0ID4gJHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHVuaXN0ZC5oPgoraW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKK2lmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFWRV9VTklTVERfSCIKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHVuaXN0ZC5oLi4uIFllcy4iCitlbHNlCisgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBOby4iCitmaQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8ZXJybm8uaD4KK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQorRU9GCitpZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCisgIGVjaG8gIkNoZWNraW5nIGZvciBlcnJuby5oLi4uCSBZZXMuIgorZWxzZQorICBlY2hvICJDaGVja2luZyBmb3IgZXJybm8uaC4uLgkgTm8uIgorICBDRkxBR1M9IiRDRkxBR1MgLUROT19FUlJOT19IIgorZmkKKworY2F0ID4gJHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KK2NhZGRyX3QgaGVsbG8oKSB7CisgIHJldHVybiBtbWFwKChjYWRkcl90KTAsIChvZmZfdCkwLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIDAsIChvZmZfdCkwKTsgCit9CitFT0YKK2lmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EVVNFX01NQVAiCisgIGVjaG8gQ2hlY2tpbmcgZm9yIG1tYXAgc3VwcG9ydC4uLiBZZXMuCitlbHNlCisgIGVjaG8gQ2hlY2tpbmcgZm9yIG1tYXAgc3VwcG9ydC4uLiBOby4KK2ZpCisKK0NQUD0ke0NQUC0iJENDIC1FIn0KK2Nhc2UgJENGTEFHUyBpbgorICAqQVNNViopCisgICAgaWYgdGVzdCAiYG5tICR0ZXN0Lm8gfCBncmVwIF9oZWxsb2AiID0gIiI7IHRoZW4KKyAgICAgIENQUD0iJENQUCAtRE5PX1VOREVSTElORSIKKyAgICAgIGVjaG8gQ2hlY2tpbmcgZm9yIHVuZGVybGluZSBpbiBleHRlcm5hbCBuYW1lcy4uLiBOby4KKyAgICBlbHNlCisgICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gWWVzLgorICAgIGZpOzsKK2VzYWMKKworcm0gLWYgJHRlc3QuW2NvXSAkdGVzdCRzaGFyZWRfZXh0CisKKyMgdWRwYXRlIE1ha2VmaWxlCitzZWQgPCBNYWtlZmlsZS5pbiAiCisvXkNDICo9L3MlPS4qJT0kQ0MlCisvXkNGTEFHUyAqPS9zJT0uKiU9JENGTEFHUyUKKy9eQ1BQICo9L3MlPS4qJT0kQ1BQJQorL15MRFNIQVJFRCAqPS9zJT0uKiU9JExEU0hBUkVEJQorL15MSUJTICo9L3MlPS4qJT0kTElCUyUKKy9eU0hBUkVETElCICo9L3MlPS4qJT0kU0hBUkVETElCJQorL15BUiAqPS9zJT0uKiU9JEFSJQorL15SQU5MSUIgKj0vcyU9LiolPSRSQU5MSUIlCisvXlZFUiAqPS9zJT0uKiU9JFZFUiUKKy9ecHJlZml4ICo9L3MlPS4qJT0kcHJlZml4JQorL15leGVjX3ByZWZpeCAqPS9zJT0uKiU9JGV4ZWNfcHJlZml4JQorL15saWJkaXIgKj0vcyU9LiolPSRsaWJkaXIlCisvXmluY2x1ZGVkaXIgKj0vcyU9LiolPSRpbmNsdWRlZGlyJQorIiA+IE1ha2VmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9jcmMzMi5jIGIvY29tbW9uL3psaWIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWE4YTkyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvY3JjMzIuYwpAQCAtMCwwICsxLDE2MiBAQAorLyogY3JjMzIuYyAtLSBjb21wdXRlIHRoZSBDUkMtMzIgb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBAKCMpICRJZDogY3JjMzIuYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjIzIGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgInpsaWIuaCIKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisKK2xvY2FsIGludCBjcmNfdGFibGVfZW1wdHkgPSAxOworbG9jYWwgdUxvbmdmIGNyY190YWJsZVsyNTZdOworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSBPRigodm9pZCkpOworCisvKgorICBHZW5lcmF0ZSBhIHRhYmxlIGZvciBhIGJ5dGUtd2lzZSAzMi1iaXQgQ1JDIGNhbGN1bGF0aW9uIG9uIHRoZSBwb2x5bm9taWFsOgorICB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4KzEuCisKKyAgUG9seW5vbWlhbHMgb3ZlciBHRigyKSBhcmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5LCBvbmUgYml0IHBlciBjb2VmZmljaWVudCwKKyAgd2l0aCB0aGUgbG93ZXN0IHBvd2VycyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUaGVuIGFkZGluZyBwb2x5bm9taWFscworICBpcyBqdXN0IGV4Y2x1c2l2ZS1vciwgYW5kIG11bHRpcGx5aW5nIGEgcG9seW5vbWlhbCBieSB4IGlzIGEgcmlnaHQgc2hpZnQgYnkKKyAgb25lLiAgSWYgd2UgY2FsbCB0aGUgYWJvdmUgcG9seW5vbWlhbCBwLCBhbmQgcmVwcmVzZW50IGEgYnl0ZSBhcyB0aGUKKyAgcG9seW5vbWlhbCBxLCBhbHNvIHdpdGggdGhlIGxvd2VzdCBwb3dlciBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgKHNvIHRoZQorICBieXRlIDB4YjEgaXMgdGhlIHBvbHlub21pYWwgeF43K3heMyt4KzEpLCB0aGVuIHRoZSBDUkMgaXMgKHEqeF4zMikgbW9kIHAsCisgIHdoZXJlIGEgbW9kIGIgbWVhbnMgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpZGluZyBhIGJ5IGIuCisKKyAgVGhpcyBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIHRoZSBzaGlmdC1yZWdpc3RlciBtZXRob2Qgb2YgbXVsdGlwbHlpbmcgYW5kCisgIHRha2luZyB0aGUgcmVtYWluZGVyLiAgVGhlIHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8sIGFuZCBmb3IgZWFjaAorICBpbmNvbWluZyBiaXQsIHheMzIgaXMgYWRkZWQgbW9kIHAgdG8gdGhlIHJlZ2lzdGVyIGlmIHRoZSBiaXQgaXMgYSBvbmUgKHdoZXJlCisgIHheMzIgbW9kIHAgaXMgcCt4XjMyID0geF4yNisuLi4rMSksIGFuZCB0aGUgcmVnaXN0ZXIgaXMgbXVsdGlwbGllZCBtb2QgcCBieQorICB4ICh3aGljaCBpcyBzaGlmdGluZyByaWdodCBieSBvbmUgYW5kIGFkZGluZyB4XjMyIG1vZCBwIGlmIHRoZSBiaXQgc2hpZnRlZAorICBvdXQgaXMgYSBvbmUpLiAgV2Ugc3RhcnQgd2l0aCB0aGUgaGlnaGVzdCBwb3dlciAobGVhc3Qgc2lnbmlmaWNhbnQgYml0KSBvZgorICBxIGFuZCByZXBlYXQgZm9yIGFsbCBlaWdodCBiaXRzIG9mIHEuCisKKyAgVGhlIHRhYmxlIGlzIHNpbXBseSB0aGUgQ1JDIG9mIGFsbCBwb3NzaWJsZSBlaWdodCBiaXQgdmFsdWVzLiAgVGhpcyBpcyBhbGwKKyAgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBDUkMncyBvbiBkYXRhIGEgYnl0ZSBhdCBhIHRpbWUgZm9yIGFsbAorICBjb21iaW5hdGlvbnMgb2YgQ1JDIHJlZ2lzdGVyIHZhbHVlcyBhbmQgaW5jb21pbmcgYnl0ZXMuCisqLworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSgpCit7CisgIHVMb25nIGM7CisgIGludCBuLCBrOworICB1TG9uZyBwb2x5OyAgICAgICAgICAgIC8qIHBvbHlub21pYWwgZXhjbHVzaXZlLW9yIHBhdHRlcm4gKi8KKyAgLyogdGVybXMgb2YgcG9seW5vbWlhbCBkZWZpbmluZyB0aGlzIGNyYyAoZXhjZXB0IHheMzIpOiAqLworICBzdGF0aWMgY29uc3QgQnl0ZSBwW10gPSB7MCwxLDIsNCw1LDcsOCwxMCwxMSwxMiwxNiwyMiwyMywyNn07CisKKyAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBMKSAqLworICBwb2x5ID0gMEw7CisgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKEJ5dGUpOyBuKyspCisgICAgcG9seSB8PSAxTCA8PCAoMzEgLSBwW25dKTsKKyAKKyAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQorICB7CisgICAgYyA9ICh1TG9uZyluOworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7CisgICAgY3JjX3RhYmxlW25dID0gYzsKKyAgfQorICBjcmNfdGFibGVfZW1wdHkgPSAwOworfQorI2Vsc2UKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGFibGUgb2YgQ1JDLTMyJ3Mgb2YgYWxsIHNpbmdsZS1ieXRlIHZhbHVlcyAobWFkZSBieSBtYWtlX2NyY190YWJsZSkKKyAqLworbG9jYWwgY29uc3QgdUxvbmdmIGNyY190YWJsZVsyNTZdID0geworICAweDAwMDAwMDAwTCwgMHg3NzA3MzA5NkwsIDB4ZWUwZTYxMmNMLCAweDk5MDk1MWJhTCwgMHgwNzZkYzQxOUwsCisgIDB4NzA2YWY0OGZMLCAweGU5NjNhNTM1TCwgMHg5ZTY0OTVhM0wsIDB4MGVkYjg4MzJMLCAweDc5ZGNiOGE0TCwKKyAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLAorICAweDkwYmYxZDkxTCwgMHgxZGI3MTA2NEwsIDB4NmFiMDIwZjJMLCAweGYzYjk3MTQ4TCwgMHg4NGJlNDFkZUwsCisgIDB4MWFkYWQ0N2RMLCAweDZkZGRlNGViTCwgMHhmNGQ0YjU1MUwsIDB4ODNkMzg1YzdMLCAweDEzNmM5ODU2TCwKKyAgMHg2NDZiYThjMEwsIDB4ZmQ2MmY5N2FMLCAweDhhNjVjOWVjTCwgMHgxNDAxNWM0ZkwsIDB4NjMwNjZjZDlMLAorICAweGZhMGYzZDYzTCwgMHg4ZDA4MGRmNUwsIDB4M2I2ZTIwYzhMLCAweDRjNjkxMDVlTCwgMHhkNTYwNDFlNEwsCisgIDB4YTI2NzcxNzJMLCAweDNjMDNlNGQxTCwgMHg0YjA0ZDQ0N0wsIDB4ZDIwZDg1ZmRMLCAweGE1MGFiNTZiTCwKKyAgMHgzNWI1YThmYUwsIDB4NDJiMjk4NmNMLCAweGRiYmJjOWQ2TCwgMHhhY2JjZjk0MEwsIDB4MzJkODZjZTNMLAorICAweDQ1ZGY1Yzc1TCwgMHhkY2Q2MGRjZkwsIDB4YWJkMTNkNTlMLCAweDI2ZDkzMGFjTCwgMHg1MWRlMDAzYUwsCisgIDB4YzhkNzUxODBMLCAweGJmZDA2MTE2TCwgMHgyMWI0ZjRiNUwsIDB4NTZiM2M0MjNMLCAweGNmYmE5NTk5TCwKKyAgMHhiOGJkYTUwZkwsIDB4MjgwMmI4OWVMLCAweDVmMDU4ODA4TCwgMHhjNjBjZDliMkwsIDB4YjEwYmU5MjRMLAorICAweDJmNmY3Yzg3TCwgMHg1ODY4NGMxMUwsIDB4YzE2MTFkYWJMLCAweGI2NjYyZDNkTCwgMHg3NmRjNDE5MEwsCisgIDB4MDFkYjcxMDZMLCAweDk4ZDIyMGJjTCwgMHhlZmQ1MTAyYUwsIDB4NzFiMTg1ODlMLCAweDA2YjZiNTFmTCwKKyAgMHg5ZmJmZTRhNUwsIDB4ZThiOGQ0MzNMLCAweDc4MDdjOWEyTCwgMHgwZjAwZjkzNEwsIDB4OTYwOWE4OGVMLAorICAweGUxMGU5ODE4TCwgMHg3ZjZhMGRiYkwsIDB4MDg2ZDNkMmRMLCAweDkxNjQ2Yzk3TCwgMHhlNjYzNWMwMUwsCisgIDB4NmI2YjUxZjRMLCAweDFjNmM2MTYyTCwgMHg4NTY1MzBkOEwsIDB4ZjI2MjAwNGVMLCAweDZjMDY5NWVkTCwKKyAgMHgxYjAxYTU3YkwsIDB4ODIwOGY0YzFMLCAweGY1MGZjNDU3TCwgMHg2NWIwZDljNkwsIDB4MTJiN2U5NTBMLAorICAweDhiYmViOGVhTCwgMHhmY2I5ODg3Y0wsIDB4NjJkZDFkZGZMLCAweDE1ZGEyZDQ5TCwgMHg4Y2QzN2NmM0wsCisgIDB4ZmJkNDRjNjVMLCAweDRkYjI2MTU4TCwgMHgzYWI1NTFjZUwsIDB4YTNiYzAwNzRMLCAweGQ0YmIzMGUyTCwKKyAgMHg0YWRmYTU0MUwsIDB4M2RkODk1ZDdMLCAweGE0ZDFjNDZkTCwgMHhkM2Q2ZjRmYkwsIDB4NDM2OWU5NmFMLAorICAweDM0NmVkOWZjTCwgMHhhZDY3ODg0NkwsIDB4ZGE2MGI4ZDBMLCAweDQ0MDQyZDczTCwgMHgzMzAzMWRlNUwsCisgIDB4YWEwYTRjNWZMLCAweGRkMGQ3Y2M5TCwgMHg1MDA1NzEzY0wsIDB4MjcwMjQxYWFMLCAweGJlMGIxMDEwTCwKKyAgMHhjOTBjMjA4NkwsIDB4NTc2OGI1MjVMLCAweDIwNmY4NWIzTCwgMHhiOTY2ZDQwOUwsIDB4Y2U2MWU0OWZMLAorICAweDVlZGVmOTBlTCwgMHgyOWQ5Yzk5OEwsIDB4YjBkMDk4MjJMLCAweGM3ZDdhOGI0TCwgMHg1OWIzM2QxN0wsCisgIDB4MmViNDBkODFMLCAweGI3YmQ1YzNiTCwgMHhjMGJhNmNhZEwsIDB4ZWRiODgzMjBMLCAweDlhYmZiM2I2TCwKKyAgMHgwM2I2ZTIwY0wsIDB4NzRiMWQyOWFMLCAweGVhZDU0NzM5TCwgMHg5ZGQyNzdhZkwsIDB4MDRkYjI2MTVMLAorICAweDczZGMxNjgzTCwgMHhlMzYzMGIxMkwsIDB4OTQ2NDNiODRMLCAweDBkNmQ2YTNlTCwgMHg3YTZhNWFhOEwsCisgIDB4ZTQwZWNmMGJMLCAweDkzMDlmZjlkTCwgMHgwYTAwYWUyN0wsIDB4N2QwNzllYjFMLCAweGYwMGY5MzQ0TCwKKyAgMHg4NzA4YTNkMkwsIDB4MWUwMWYyNjhMLCAweDY5MDZjMmZlTCwgMHhmNzYyNTc1ZEwsIDB4ODA2NTY3Y2JMLAorICAweDE5NmMzNjcxTCwgMHg2ZTZiMDZlN0wsIDB4ZmVkNDFiNzZMLCAweDg5ZDMyYmUwTCwgMHgxMGRhN2E1YUwsCisgIDB4NjdkZDRhY2NMLCAweGY5YjlkZjZmTCwgMHg4ZWJlZWZmOUwsIDB4MTdiN2JlNDNMLCAweDYwYjA4ZWQ1TCwKKyAgMHhkNmQ2YTNlOEwsIDB4YTFkMTkzN2VMLCAweDM4ZDhjMmM0TCwgMHg0ZmRmZjI1MkwsIDB4ZDFiYjY3ZjFMLAorICAweGE2YmM1NzY3TCwgMHgzZmI1MDZkZEwsIDB4NDhiMjM2NGJMLCAweGQ4MGQyYmRhTCwgMHhhZjBhMWI0Y0wsCisgIDB4MzYwMzRhZjZMLCAweDQxMDQ3YTYwTCwgMHhkZjYwZWZjM0wsIDB4YTg2N2RmNTVMLCAweDMxNmU4ZWVmTCwKKyAgMHg0NjY5YmU3OUwsIDB4Y2I2MWIzOGNMLCAweGJjNjY4MzFhTCwgMHgyNTZmZDJhMEwsIDB4NTI2OGUyMzZMLAorICAweGNjMGM3Nzk1TCwgMHhiYjBiNDcwM0wsIDB4MjIwMjE2YjlMLCAweDU1MDUyNjJmTCwgMHhjNWJhM2JiZUwsCisgIDB4YjJiZDBiMjhMLCAweDJiYjQ1YTkyTCwgMHg1Y2IzNmEwNEwsIDB4YzJkN2ZmYTdMLCAweGI1ZDBjZjMxTCwKKyAgMHgyY2Q5OWU4YkwsIDB4NWJkZWFlMWRMLCAweDliNjRjMmIwTCwgMHhlYzYzZjIyNkwsIDB4NzU2YWEzOWNMLAorICAweDAyNmQ5MzBhTCwgMHg5YzA5MDZhOUwsIDB4ZWIwZTM2M2ZMLCAweDcyMDc2Nzg1TCwgMHgwNTAwNTcxM0wsCisgIDB4OTViZjRhODJMLCAweGUyYjg3YTE0TCwgMHg3YmIxMmJhZUwsIDB4MGNiNjFiMzhMLCAweDkyZDI4ZTliTCwKKyAgMHhlNWQ1YmUwZEwsIDB4N2NkY2VmYjdMLCAweDBiZGJkZjIxTCwgMHg4NmQzZDJkNEwsIDB4ZjFkNGUyNDJMLAorICAweDY4ZGRiM2Y4TCwgMHgxZmRhODM2ZUwsIDB4ODFiZTE2Y2RMLCAweGY2YjkyNjViTCwgMHg2ZmIwNzdlMUwsCisgIDB4MThiNzQ3NzdMLCAweDg4MDg1YWU2TCwgMHhmZjBmNmE3MEwsIDB4NjYwNjNiY2FMLCAweDExMDEwYjVjTCwKKyAgMHg4ZjY1OWVmZkwsIDB4Zjg2MmFlNjlMLCAweDYxNmJmZmQzTCwgMHgxNjZjY2Y0NUwsIDB4YTAwYWUyNzhMLAorICAweGQ3MGRkMmVlTCwgMHg0ZTA0ODM1NEwsIDB4MzkwM2IzYzJMLCAweGE3NjcyNjYxTCwgMHhkMDYwMTZmN0wsCisgIDB4NDk2OTQ3NGRMLCAweDNlNmU3N2RiTCwgMHhhZWQxNmE0YUwsIDB4ZDlkNjVhZGNMLCAweDQwZGYwYjY2TCwKKyAgMHgzN2Q4M2JmMEwsIDB4YTliY2FlNTNMLCAweGRlYmI5ZWM1TCwgMHg0N2IyY2Y3ZkwsIDB4MzBiNWZmZTlMLAorICAweGJkYmRmMjFjTCwgMHhjYWJhYzI4YUwsIDB4NTNiMzkzMzBMLCAweDI0YjRhM2E2TCwgMHhiYWQwMzYwNUwsCisgIDB4Y2RkNzA2OTNMLCAweDU0ZGU1NzI5TCwgMHgyM2Q5NjdiZkwsIDB4YjM2NjdhMmVMLCAweGM0NjE0YWI4TCwKKyAgMHg1ZDY4MWIwMkwsIDB4MmE2ZjJiOTRMLCAweGI0MGJiZTM3TCwgMHhjMzBjOGVhMUwsIDB4NWEwNWRmMWJMLAorICAweDJkMDJlZjhkTAorfTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGFzbSB2ZXJzaW9ucyBvZiBjcmMzMigpCisgKi8KK2NvbnN0IHVMb25nZiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSgpCit7CisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgaWYgKGNyY190YWJsZV9lbXB0eSkgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZgorICByZXR1cm4gKGNvbnN0IHVMb25nZiAqKWNyY190YWJsZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBETzEoYnVmKSBjcmMgPSBjcmNfdGFibGVbKChpbnQpY3JjIF4gKCpidWYrKykpICYgMHhmZl0gXiAoY3JjID4+IDgpOworI2RlZmluZSBETzIoYnVmKSAgRE8xKGJ1Zik7IERPMShidWYpOworI2RlZmluZSBETzQoYnVmKSAgRE8yKGJ1Zik7IERPMihidWYpOworI2RlZmluZSBETzgoYnVmKSAgRE80KGJ1Zik7IERPNChidWYpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGNyYzMyKGNyYywgYnVmLCBsZW4pCisgICAgdUxvbmcgY3JjOworICAgIGNvbnN0IEJ5dGVmICpidWY7CisgICAgdUludCBsZW47Cit7CisgICAgaWYgKGJ1ZiA9PSBaX05VTEwpIHJldHVybiAwTDsKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICAgIGlmIChjcmNfdGFibGVfZW1wdHkpCisgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmCisgICAgY3JjID0gY3JjIF4gMHhmZmZmZmZmZkw7CisgICAgd2hpbGUgKGxlbiA+PSA4KQorICAgIHsKKyAgICAgIERPOChidWYpOworICAgICAgbGVuIC09IDg7CisgICAgfQorICAgIGlmIChsZW4pIGRvIHsKKyAgICAgIERPMShidWYpOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICByZXR1cm4gY3JjIF4gMHhmZmZmZmZmZkw7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9kZWZsYXRlLmMgYi9jb21tb24vemxpYi9kZWZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhNTkwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2RlZmxhdGUuYwpAQCAtMCwwICsxLDEzNTAgQEAKKy8qIGRlZmxhdGUuYyAtLSBjb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKgorICogIEFMR09SSVRITQorICoKKyAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgZGVwZW5kcyBvbiBiZWluZyBhYmxlIHRvIGlkZW50aWZ5IHBvcnRpb25zCisgKiAgICAgIG9mIHRoZSBpbnB1dCB0ZXh0IHdoaWNoIGFyZSBpZGVudGljYWwgdG8gZWFybGllciBpbnB1dCAod2l0aGluIGEKKyAqICAgICAgc2xpZGluZyB3aW5kb3cgdHJhaWxpbmcgYmVoaW5kIHRoZSBpbnB1dCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkKS4KKyAqCisgKiAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0Zm9yd2FyZCB0ZWNobmlxdWUgdHVybnMgb3V0IHRvIGJlIHRoZSBmYXN0ZXN0IGZvcgorICogICAgICBtb3N0IGlucHV0IGZpbGVzOiB0cnkgYWxsIHBvc3NpYmxlIG1hdGNoZXMgYW5kIHNlbGVjdCB0aGUgbG9uZ2VzdC4KKyAqICAgICAgVGhlIGtleSBmZWF0dXJlIG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRoYXQgaW5zZXJ0aW9ucyBpbnRvIHRoZSBzdHJpbmcKKyAqICAgICAgZGljdGlvbmFyeSBhcmUgdmVyeSBzaW1wbGUgYW5kIHRodXMgZmFzdCwgYW5kIGRlbGV0aW9ucyBhcmUgYXZvaWRlZAorICogICAgICBjb21wbGV0ZWx5LiBJbnNlcnRpb25zIGFyZSBwZXJmb3JtZWQgYXQgZWFjaCBpbnB1dCBjaGFyYWN0ZXIsIHdoZXJlYXMKKyAqICAgICAgc3RyaW5nIG1hdGNoZXMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGVuZHMuIFNvIGl0CisgKiAgICAgIGlzIHByZWZlcmFibGUgdG8gc3BlbmQgbW9yZSB0aW1lIGluIG1hdGNoZXMgdG8gYWxsb3cgdmVyeSBmYXN0IHN0cmluZworICogICAgICBpbnNlcnRpb25zIGFuZCBhdm9pZCBkZWxldGlvbnMuIFRoZSBtYXRjaGluZyBhbGdvcml0aG0gZm9yIHNtYWxsCisgKiAgICAgIHN0cmluZ3MgaXMgaW5zcGlyZWQgZnJvbSB0aGF0IG9mIFJhYmluICYgS2FycC4gQSBicnV0ZSBmb3JjZSBhcHByb2FjaAorICogICAgICBpcyB1c2VkIHRvIGZpbmQgbG9uZ2VyIHN0cmluZ3Mgd2hlbiBhIHNtYWxsIG1hdGNoIGhhcyBiZWVuIGZvdW5kLgorICogICAgICBBIHNpbWlsYXIgYWxnb3JpdGhtIGlzIHVzZWQgaW4gY29taWMgKGJ5IEphbi1NYXJrIFdhbXMpIGFuZCBmcmVlemUKKyAqICAgICAgKGJ5IExlb25pZCBCcm91a2hpcykuCisgKiAgICAgICAgIEEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdXNlZCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGdvcml0aG0KKyAqICAgICAgKGJ5IEZpYWxhIGFuZCBHcmVlbmUpIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIGxpbmVhciBhbW9ydGl6ZWQKKyAqICAgICAgdGltZSwgYnV0IGhhcyBhIGxhcmdlciBhdmVyYWdlIGNvc3QsIHVzZXMgbW9yZSBtZW1vcnkgYW5kIGlzIHBhdGVudGVkLgorICogICAgICBIb3dldmVyIHRoZSBGJkcgYWxnb3JpdGhtIG1heSBiZSBmYXN0ZXIgZm9yIHNvbWUgaGlnaGx5IHJlZHVuZGFudAorICogICAgICBmaWxlcyBpZiB0aGUgcGFyYW1ldGVyIG1heF9jaGFpbl9sZW5ndGggKGRlc2NyaWJlZCBiZWxvdykgaXMgdG9vIGxhcmdlLgorICoKKyAqICBBQ0tOT1dMRURHRU1FTlRTCisgKgorICogICAgICBUaGUgaWRlYSBvZiBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBpcyBkdWUgdG8gSmFuLU1hcmsgV2FtcywgYW5kCisgKiAgICAgIEkgZm91bmQgaXQgaW4gJ2ZyZWV6ZScgd3JpdHRlbiBieSBMZW9uaWQgQnJvdWtoaXMuCisgKiAgICAgIFRoYW5rcyB0byBtYW55IHBlb3BsZSBmb3IgYnVnIHJlcG9ydHMgYW5kIHRlc3RpbmcuCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MS50eHQKKyAqCisgKiAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhlIFJhYmluIGFuZCBLYXJwIGFsZ29yaXRobSBpcyBnaXZlbiBpbiB0aGUgYm9vaworICogICAgICAgICAiQWxnb3JpdGhtcyIgYnkgUi4gU2VkZ2V3aWNrLCBBZGRpc29uLVdlc2xleSwgcDI1Mi4KKyAqCisgKiAgICAgIEZpYWxhLEUuUi4sIGFuZCBHcmVlbmUsRC5ILgorICogICAgICAgICBEYXRhIENvbXByZXNzaW9uIHdpdGggRmluaXRlIFdpbmRvd3MsIENvbW0uQUNNLCAzMiw0ICgxOTg5KSA0OTAtNTk1CisgKgorICovCisKKy8qIEAoIykgJElkOiBkZWZsYXRlLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyNCBjb25zdF9rIEV4cCAkICovCisKKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKK2NvbnN0IGNoYXIgZGVmbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGRlZmxhdGUgMS4xLjQgQ29weXJpZ2h0IDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5ICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIEZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgbmVlZF9tb3JlLCAgICAgIC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqLworICAgIGJsb2NrX2RvbmUsICAgICAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi8KKyAgICBmaW5pc2hfc3RhcnRlZCwgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi8KKyAgICBmaW5pc2hfZG9uZSAgICAgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqLworfSBibG9ja19zdGF0ZTsKKwordHlwZWRlZiBibG9ja19zdGF0ZSAoKmNvbXByZXNzX2Z1bmMpIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKKy8qIENvbXByZXNzaW9uIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBibG9jayBzdGF0ZSBhZnRlciB0aGUgY2FsbC4gKi8KKworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgdm9pZCBsbV9pbml0ICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdUludCBiKSk7Citsb2NhbCB2b2lkIGZsdXNoX3BlbmRpbmcgIE9GKCh6X3N0cmVhbXAgc3RybSkpOworbG9jYWwgaW50IHJlYWRfYnVmICAgICAgICBPRigoel9zdHJlYW1wIHN0cm0sIEJ5dGVmICpidWYsIHVuc2lnbmVkIHNpemUpKTsKKyNpZmRlZiBBU01WCisgICAgICB2b2lkIG1hdGNoX2luaXQgT0YoKHZvaWQpKTsgLyogYXNtIGNvZGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CisjZWxzZQorbG9jYWwgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKK2xvY2FsICB2b2lkIGNoZWNrX21hdGNoIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIHN0YXJ0LCBJUG9zIG1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpKTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEKKyAqLworCisjZGVmaW5lIE5JTCAwCisvKiBUYWlsIG9mIGhhc2ggY2hhaW5zICovCisKKyNpZm5kZWYgVE9PX0ZBUgorIyAgZGVmaW5lIFRPT19GQVIgNDA5NgorI2VuZGlmCisvKiBNYXRjaGVzIG9mIGxlbmd0aCAzIGFyZSBkaXNjYXJkZWQgaWYgdGhlaXIgZGlzdGFuY2UgZXhjZWVkcyBUT09fRkFSICovCisKKyNkZWZpbmUgTUlOX0xPT0tBSEVBRCAoTUFYX01BVENIK01JTl9NQVRDSCsxKQorLyogTWluaW11bSBhbW91bnQgb2YgbG9va2FoZWFkLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIFNlZSBkZWZsYXRlLmMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBNSU5fTUFUQ0grMS4KKyAqLworCisvKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb24KKyAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0bworICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlCisgKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNvbmZpZ19zIHsKKyAgIHVzaCBnb29kX2xlbmd0aDsgLyogcmVkdWNlIGxhenkgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCisgICB1c2ggbWF4X2xhenk7ICAgIC8qIGRvIG5vdCBwZXJmb3JtIGxhenkgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCisgICB1c2ggbmljZV9sZW5ndGg7IC8qIHF1aXQgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCisgICB1c2ggbWF4X2NoYWluOworICAgY29tcHJlc3NfZnVuYyBmdW5jOworfSBjb25maWc7CisKK2xvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzEwXSA9IHsKKy8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi8KKy8qIDAgKi8gezAsICAgIDAsICAwLCAgICAwLCBkZWZsYXRlX3N0b3JlZH0sICAvKiBzdG9yZSBvbmx5ICovCisvKiAxICovIHs0LCAgICA0LCAgOCwgICAgNCwgZGVmbGF0ZV9mYXN0fSwgLyogbWF4aW11bSBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCisvKiAyICovIHs0LCAgICA1LCAxNiwgICAgOCwgZGVmbGF0ZV9mYXN0fSwKKy8qIDMgKi8gezQsICAgIDYsIDMyLCAgIDMyLCBkZWZsYXRlX2Zhc3R9LAorCisvKiA0ICovIHs0LCAgICA0LCAxNiwgICAxNiwgZGVmbGF0ZV9zbG93fSwgIC8qIGxhenkgbWF0Y2hlcyAqLworLyogNSAqLyB7OCwgICAxNiwgMzIsICAgMzIsIGRlZmxhdGVfc2xvd30sCisvKiA2ICovIHs4LCAgIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93fSwKKy8qIDcgKi8gezgsICAgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3d9LAorLyogOCAqLyB7MzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3d9LAorLyogOSAqLyB7MzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3d9fTsgLyogbWF4aW11bSBjb21wcmVzc2lvbiAqLworCisvKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAorICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudAorICogbWVhbmluZy4KKyAqLworCisjZGVmaW5lIEVRVUFMIDAKKy8qIHJlc3VsdCBvZiBtZW1jbXAgZm9yIGVxdWFsIHN0cmluZ3MgKi8KKworc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgYSBoYXNoIHZhbHVlIHdpdGggdGhlIGdpdmVuIGlucHV0IGJ5dGUKKyAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byB0byBVUERBVEVfSEFTSCBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzLCBzbyB0aGF0IGEgcnVubmluZyBoYXNoIGtleSBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUKKyAqICAgIHByZXZpb3VzIGtleSBpbnN0ZWFkIG9mIGNvbXBsZXRlIHJlY2FsY3VsYXRpb24gZWFjaCB0aW1lLgorICovCisjZGVmaW5lIFVQREFURV9IQVNIKHMsaCxjKSAoaCA9ICgoKGgpPDxzLT5oYXNoX3NoaWZ0KSBeIChjKSkgJiBzLT5oYXNoX21hc2spCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbnNlcnQgc3RyaW5nIHN0ciBpbiB0aGUgZGljdGlvbmFyeSBhbmQgc2V0IG1hdGNoX2hlYWQgdG8gdGhlIHByZXZpb3VzIGhlYWQKKyAqIG9mIHRoZSBoYXNoIGNoYWluICh0aGUgbW9zdCByZWNlbnQgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGtleSkuIFJldHVybgorICogdGhlIHByZXZpb3VzIGxlbmd0aCBvZiB0aGUgaGFzaCBjaGFpbi4KKyAqIElmIHRoaXMgZmlsZSBpcyBjb21waWxlZCB3aXRoIC1ERkFTVEVTVCwgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGZvcmNlZAorICogdG8gMSwgYW5kIG5vIGhhc2ggY2hhaW5zIGFyZSBtYWludGFpbmVkLgorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIElOU0VSVF9TVFJJTkcgYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycyBhbmQgdGhlIGZpcnN0IE1JTl9NQVRDSCBieXRlcyBvZiBzdHIgYXJlIHZhbGlkCisgKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuCisgKi8KKyNpZmRlZiBGQVNURVNUCisjZGVmaW5lIElOU0VSVF9TVFJJTkcocywgc3RyLCBtYXRjaF9oZWFkKSBcCisgICAoVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1soc3RyKSArIChNSU5fTUFUQ0gtMSldKSwgXAorICAgIG1hdGNoX2hlYWQgPSBzLT5oZWFkW3MtPmluc19oXSwgXAorICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcykoc3RyKSkKKyNlbHNlCisjZGVmaW5lIElOU0VSVF9TVFJJTkcocywgc3RyLCBtYXRjaF9oZWFkKSBcCisgICAoVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1soc3RyKSArIChNSU5fTUFUQ0gtMSldKSwgXAorICAgIHMtPnByZXZbKHN0cikgJiBzLT53X21hc2tdID0gbWF0Y2hfaGVhZCA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCisgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSAoYXZvaWRpbmcgNjRLIG92ZXJmbG93IGZvciAxNiBiaXQgc3lzdGVtcykuCisgKiBwcmV2W10gd2lsbCBiZSBpbml0aWFsaXplZCBvbiB0aGUgZmx5LgorICovCisjZGVmaW5lIENMRUFSX0hBU0gocykgXAorICAgIHMtPmhlYWRbcy0+aGFzaF9zaXplLTFdID0gTklMOyBcCisgICAgem1lbXplcm8oKEJ5dGVmICopcy0+aGVhZCwgKHVuc2lnbmVkKShzLT5oYXNoX3NpemUtMSkqc2l6ZW9mKCpzLT5oZWFkKSk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVJbml0XyhzdHJtLCBsZXZlbCwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGxldmVsOworICAgIGNvbnN0IGNoYXIgKnZlcnNpb247CisgICAgaW50IHN0cmVhbV9zaXplOworeworICAgIHJldHVybiBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsCisJCQkgWl9ERUZBVUxUX1NUUkFURUdZLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7CisgICAgLyogVG8gZG86IGlnbm9yZSBzdHJtLT5uZXh0X2luIGlmIHdlIHVzZSBpdCBhcyB3aW5kb3cgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisJCSAgdmVyc2lvbiwgc3RyZWFtX3NpemUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50ICBsZXZlbDsKKyAgICBpbnQgIG1ldGhvZDsKKyAgICBpbnQgIHdpbmRvd0JpdHM7CisgICAgaW50ICBtZW1MZXZlbDsKKyAgICBpbnQgIHN0cmF0ZWd5OworICAgIGNvbnN0IGNoYXIgKnZlcnNpb247CisgICAgaW50IHN0cmVhbV9zaXplOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IG5vaGVhZGVyID0gMDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbXlfdmVyc2lvbiA9IFpMSUJfVkVSU0lPTjsKKworICAgIHVzaGYgKm92ZXJsYXk7CisgICAgLyogV2Ugb3ZlcmxheSBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYuIFRoaXMgd29ya3Mgc2luY2UgdGhlIGF2ZXJhZ2UKKyAgICAgKiBvdXRwdXQgc2l6ZSBmb3IgKGxlbmd0aCxkaXN0YW5jZSkgY29kZXMgaXMgPD0gMjQgYml0cy4KKyAgICAgKi8KKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IG15X3ZlcnNpb25bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gc2l6ZW9mKHpfc3RyZWFtKSkgeworCXJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgfQorICAgIGlmIChzdHJtID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RybS0+bXNnID0gWl9OVUxMOworICAgIGlmIChzdHJtLT56YWxsb2MgPT0gWl9OVUxMKSB7CisJc3RybS0+emFsbG9jID0gemNhbGxvYzsKKwlzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSBaX05VTEwpIHN0cm0tPnpmcmVlID0gemNmcmVlOworCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2lmZGVmIEZBU1RFU1QKKyAgICBsZXZlbCA9IDE7CisjZW5kaWYKKworICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiB1bmRvY3VtZW50ZWQgZmVhdHVyZTogc3VwcHJlc3MgemxpYiBoZWFkZXIgKi8KKyAgICAgICAgbm9oZWFkZXIgPSAxOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPSBaX0RFRkxBVEVEIHx8CisgICAgICAgIHdpbmRvd0JpdHMgPCA5IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8CisJc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9IVUZGTUFOX09OTFkpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBzID0gKGRlZmxhdGVfc3RhdGUgKikgWkFMTE9DKHN0cm0sIDEsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXM7CisgICAgcy0+c3RybSA9IHN0cm07CisKKyAgICBzLT5ub2hlYWRlciA9IG5vaGVhZGVyOworICAgIHMtPndfYml0cyA9IHdpbmRvd0JpdHM7CisgICAgcy0+d19zaXplID0gMSA8PCBzLT53X2JpdHM7CisgICAgcy0+d19tYXNrID0gcy0+d19zaXplIC0gMTsKKworICAgIHMtPmhhc2hfYml0cyA9IG1lbUxldmVsICsgNzsKKyAgICBzLT5oYXNoX3NpemUgPSAxIDw8IHMtPmhhc2hfYml0czsKKyAgICBzLT5oYXNoX21hc2sgPSBzLT5oYXNoX3NpemUgLSAxOworICAgIHMtPmhhc2hfc2hpZnQgPSAgKChzLT5oYXNoX2JpdHMrTUlOX01BVENILTEpL01JTl9NQVRDSCk7CisKKyAgICBzLT53aW5kb3cgPSAoQnl0ZWYgKikgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOworICAgIHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+d19zaXplLCBzaXplb2YoUG9zKSk7CisgICAgcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKKworICAgIHMtPmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi8KKworICAgIG92ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOworICAgIHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKyAgICBzLT5wZW5kaW5nX2J1Zl9zaXplID0gKHVsZylzLT5saXRfYnVmc2l6ZSAqIChzaXplb2YodXNoKSsyTCk7CisKKyAgICBpZiAocy0+d2luZG93ID09IFpfTlVMTCB8fCBzLT5wcmV2ID09IFpfTlVMTCB8fCBzLT5oZWFkID09IFpfTlVMTCB8fAorICAgICAgICBzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOworICAgICAgICBkZWZsYXRlRW5kIChzdHJtKTsKKyAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIH0KKyAgICBzLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBzLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplOworCisgICAgcy0+bGV2ZWwgPSBsZXZlbDsKKyAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHMtPm1ldGhvZCA9IChCeXRlKW1ldGhvZDsKKworICAgIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IChzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OworICAgIHVJbnQgIGRpY3RMZW5ndGg7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1SW50IGxlbmd0aCA9IGRpY3RMZW5ndGg7CisgICAgdUludCBuOworICAgIElQb3MgaGFzaF9oZWFkID0gMDsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgZGljdGlvbmFyeSA9PSBaX05VTEwgfHwKKyAgICAgICAgc3RybS0+c3RhdGUtPnN0YXR1cyAhPSBJTklUX1NUQVRFKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKKworICAgIGlmIChsZW5ndGggPCBNSU5fTUFUQ0gpIHJldHVybiBaX09LOworICAgIGlmIChsZW5ndGggPiBNQVhfRElTVChzKSkgeworCWxlbmd0aCA9IE1BWF9ESVNUKHMpOworI2lmbmRlZiBVU0VfRElDVF9IRUFECisJZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gbGVuZ3RoOyAvKiB1c2UgdGhlIHRhaWwgb2YgdGhlIGRpY3Rpb25hcnkgKi8KKyNlbmRpZgorICAgIH0KKyAgICB6bWVtY3B5KHMtPndpbmRvdywgZGljdGlvbmFyeSwgbGVuZ3RoKTsKKyAgICBzLT5zdHJzdGFydCA9IGxlbmd0aDsKKyAgICBzLT5ibG9ja19zdGFydCA9IChsb25nKWxlbmd0aDsKKworICAgIC8qIEluc2VydCBhbGwgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSAoZXhjZXB0IGZvciB0aGUgbGFzdCB0d28gYnl0ZXMpLgorICAgICAqIHMtPmxvb2thaGVhZCBzdGF5cyBudWxsLCBzbyBzLT5pbnNfaCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgdGhlIG5leHQKKyAgICAgKiBjYWxsIG9mIGZpbGxfd2luZG93LgorICAgICAqLworICAgIHMtPmluc19oID0gcy0+d2luZG93WzBdOworICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbMV0pOworICAgIGZvciAobiA9IDA7IG4gPD0gbGVuZ3RoIC0gTUlOX01BVENIOyBuKyspIHsKKwlJTlNFUlRfU1RSSU5HKHMsIG4sIGhhc2hfaGVhZCk7CisgICAgfQorICAgIGlmIChoYXNoX2hlYWQpIGhhc2hfaGVhZCA9IDA7ICAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVSZXNldCAoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIAorICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwKKyAgICAgICAgc3RybS0+emFsbG9jID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gMDsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7IC8qIHVzZSB6ZnJlZSBpZiB3ZSBldmVyIGFsbG9jYXRlIG1zZyBkeW5hbWljYWxseSAqLworICAgIHN0cm0tPmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKKworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIHMtPnBlbmRpbmcgPSAwOworICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CisKKyAgICBpZiAocy0+bm9oZWFkZXIgPCAwKSB7CisgICAgICAgIHMtPm5vaGVhZGVyID0gMDsgLyogd2FzIHNldCB0byAtMSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqLworICAgIH0KKyAgICBzLT5zdGF0dXMgPSBzLT5ub2hlYWRlciA/IEJVU1lfU1RBVEUgOiBJTklUX1NUQVRFOworICAgIHN0cm0tPmFkbGVyID0gMTsKKyAgICBzLT5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDsKKworICAgIF90cl9pbml0KHMpOworICAgIGxtX2luaXQocyk7CisKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyhzdHJtLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKKyAgICBpbnQgZXJyID0gWl9PSzsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisKKyAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7CisJbGV2ZWwgPSA2OworICAgIH0KKyAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fCBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0hVRkZNQU5fT05MWSkgeworCXJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgZnVuYyA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmZ1bmM7CisKKyAgICBpZiAoZnVuYyAhPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5mdW5jICYmIHN0cm0tPnRvdGFsX2luICE9IDApIHsKKwkvKiBGbHVzaCB0aGUgbGFzdCBidWZmZXI6ICovCisJZXJyID0gZGVmbGF0ZShzdHJtLCBaX1BBUlRJQUxfRkxVU0gpOworICAgIH0KKyAgICBpZiAocy0+bGV2ZWwgIT0gbGV2ZWwpIHsKKwlzLT5sZXZlbCA9IGxldmVsOworCXMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKKwlzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZ29vZF9sZW5ndGg7CisJcy0+bmljZV9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm5pY2VfbGVuZ3RoOworCXMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47CisgICAgfQorICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuCisgKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4KKyAqIHBlbmRpbmdfYnVmLgorICovCitsb2NhbCB2b2lkIHB1dFNob3J0TVNCIChzLCBiKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdUludCBiOworeworICAgIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTsKKyAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTsKK30gICAKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lcworICogdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdAorICogdG8gYXZvaWQgYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPm5leHRfb3V0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LgorICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLgorICovCitsb2NhbCB2b2lkIGZsdXNoX3BlbmRpbmcoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5zdGF0ZS0+cGVuZGluZzsKKworICAgIGlmIChsZW4gPiBzdHJtLT5hdmFpbF9vdXQpIGxlbiA9IHN0cm0tPmF2YWlsX291dDsKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKKworICAgIHptZW1jcHkoc3RybS0+bmV4dF9vdXQsIHN0cm0tPnN0YXRlLT5wZW5kaW5nX291dCwgbGVuKTsKKyAgICBzdHJtLT5uZXh0X291dCAgKz0gbGVuOworICAgIHN0cm0tPnN0YXRlLT5wZW5kaW5nX291dCAgKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX291dCArPSBsZW47CisgICAgc3RybS0+YXZhaWxfb3V0ICAtPSBsZW47CisgICAgc3RybS0+c3RhdGUtPnBlbmRpbmcgLT0gbGVuOworICAgIGlmIChzdHJtLT5zdGF0ZS0+cGVuZGluZyA9PSAwKSB7CisgICAgICAgIHN0cm0tPnN0YXRlLT5wZW5kaW5nX291dCA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1ZjsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGUgKHN0cm0sIGZsdXNoKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBmbHVzaDsKK3sKKyAgICBpbnQgb2xkX2ZsdXNoOyAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwKKwlmbHVzaCA+IFpfRklOSVNIIHx8IGZsdXNoIDwgMCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIHMgPSBzdHJtLT5zdGF0ZTsKKworICAgIGlmIChzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKKyAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHx8CisJKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT0gWl9GSU5JU0gpKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9TVFJFQU1fRVJST1IpOworICAgIH0KKyAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworCisgICAgcy0+c3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqLworICAgIG9sZF9mbHVzaCA9IHMtPmxhc3RfZmx1c2g7CisgICAgcy0+bGFzdF9mbHVzaCA9IGZsdXNoOworCisgICAgLyogV3JpdGUgdGhlIHpsaWIgaGVhZGVyICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBJTklUX1NUQVRFKSB7CisKKyAgICAgICAgdUludCBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy0+d19iaXRzLTgpPDw0KSkgPDwgODsKKyAgICAgICAgdUludCBsZXZlbF9mbGFncyA9IChzLT5sZXZlbC0xKSA+PiAxOworCisgICAgICAgIGlmIChsZXZlbF9mbGFncyA+IDMpIGxldmVsX2ZsYWdzID0gMzsKKyAgICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTsKKwlpZiAocy0+c3Ryc3RhcnQgIT0gMCkgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOworICAgICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpOworCisgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7CisKKwkvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi8KKwlpZiAocy0+c3Ryc3RhcnQgIT0gMCkgeworCSAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKKwkgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyICYgMHhmZmZmKSk7CisJfQorCXN0cm0tPmFkbGVyID0gMUw7CisgICAgfQorCisgICAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqLworICAgIGlmIChzLT5wZW5kaW5nICE9IDApIHsKKyAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisJICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGgKKwkgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKKwkgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sCisJICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlCisJICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKKyAgICAgICAgICAgICAqLworCSAgICBzLT5sYXN0X2ZsdXNoID0gLTE7CisJICAgIHJldHVybiBaX09LOworCX0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQorICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwCisgICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGRl9FUlJPUi4KKyAgICAgKi8KKyAgICB9IGVsc2UgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgZmx1c2ggPD0gb2xkX2ZsdXNoICYmCisJICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworICAgIH0KKworICAgIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuCisgICAgICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luICE9IDAgfHwgcy0+bG9va2FoZWFkICE9IDAgfHwKKyAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKKyAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOworCisJYnN0YXRlID0gKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKTsKKworICAgICAgICBpZiAoYnN0YXRlID09IGZpbmlzaF9zdGFydGVkIHx8IGJzdGF0ZSA9PSBmaW5pc2hfZG9uZSkgeworICAgICAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICB9CisgICAgICAgIGlmIChic3RhdGUgPT0gbmVlZF9tb3JlIHx8IGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCkgeworCSAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKwkgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisJICAgIH0KKwkgICAgcmV0dXJuIFpfT0s7CisJICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKKwkgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmUKKwkgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuCisJICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCisJICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdAorCSAgICAgKiBvbmUgZW1wdHkgYmxvY2suCisJICAgICAqLworCX0KKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBibG9ja19kb25lKSB7CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9QQVJUSUFMX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgX3RyX2FsaWduKHMpOworICAgICAgICAgICAgfSBlbHNlIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovCisgICAgICAgICAgICAgICAgX3RyX3N0b3JlZF9ibG9jayhzLCAoY2hhciopMCwgMEwsIDApOworICAgICAgICAgICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkCisgICAgICAgICAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgICAgIENMRUFSX0hBU0gocyk7ICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKwkgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisJICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKwkgICAgICByZXR1cm4gWl9PSzsKKwkgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCAiYnVnMiIpOworCisgICAgaWYgKGZsdXNoICE9IFpfRklOSVNIKSByZXR1cm4gWl9PSzsKKyAgICBpZiAocy0+bm9oZWFkZXIpIHJldHVybiBaX1NUUkVBTV9FTkQ7CisKKyAgICAvKiBXcml0ZSB0aGUgemxpYiB0cmFpbGVyIChhZGxlcjMyKSAqLworICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpbgorICAgICAqIHRvIGZsdXNoIHRoZSByZXN0LgorICAgICAqLworICAgIHMtPm5vaGVhZGVyID0gLTE7IC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi8KKyAgICByZXR1cm4gcy0+cGVuZGluZyAhPSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCAoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RhdHVzID0gc3RybS0+c3RhdGUtPnN0YXR1czsKKyAgICBpZiAoc3RhdHVzICE9IElOSVRfU1RBVEUgJiYgc3RhdHVzICE9IEJVU1lfU1RBVEUgJiYKKwlzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSB7CisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgLyogRGVhbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zOiAqLworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1Zik7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPmhlYWQpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wcmV2KTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+d2luZG93KTsKKworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKworICAgIHJldHVybiBzdGF0dXMgPT0gQlVTWV9TVEFURSA/IFpfREFUQV9FUlJPUiA6IFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgdGhlIHNvdXJjZSBzdGF0ZSB0byB0aGUgZGVzdGluYXRpb24gc3RhdGUuCisgKiBUbyBzaW1wbGlmeSB0aGUgc291cmNlLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIDE2LWJpdCBNU0RPUyAod2hpY2gKKyAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5IGFueXdheSB0byBkdXBsaWNhdGUgY29tcHJlc3Npb24gc3RhdGVzKS4KKyAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgKGRlc3QsIHNvdXJjZSkKKyAgICB6X3N0cmVhbXAgZGVzdDsKKyAgICB6X3N0cmVhbXAgc291cmNlOworeworI2lmZGVmIE1BWFNFR182NEsKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgIGRlZmxhdGVfc3RhdGUgKmRzOworICAgIGRlZmxhdGVfc3RhdGUgKnNzOworICAgIHVzaGYgKm92ZXJsYXk7CisKKworICAgIGlmIChzb3VyY2UgPT0gWl9OVUxMIHx8IGRlc3QgPT0gWl9OVUxMIHx8IHNvdXJjZS0+c3RhdGUgPT0gWl9OVUxMKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKKyAgICBzcyA9IHNvdXJjZS0+c3RhdGU7CisKKyAgICAqZGVzdCA9ICpzb3VyY2U7CisKKyAgICBkcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhkZXN0LCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOworICAgIGlmIChkcyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBkZXN0LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopIGRzOworICAgICpkcyA9ICpzczsKKyAgICBkcy0+c3RybSA9IGRlc3Q7CisKKyAgICBkcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7CisgICAgZHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIGRzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKGRlc3QsIGRzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgZHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKworICAgIGlmIChkcy0+d2luZG93ID09IFpfTlVMTCB8fCBkcy0+cHJldiA9PSBaX05VTEwgfHwgZHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIGRzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgZGVmbGF0ZUVuZCAoZGVzdCk7CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgLyogZm9sbG93aW5nIHptZW1jcHkgZG8gbm90IHdvcmsgZm9yIDE2LWJpdCBNU0RPUyAqLworICAgIHptZW1jcHkoZHMtPndpbmRvdywgc3MtPndpbmRvdywgZHMtPndfc2l6ZSAqIDIgKiBzaXplb2YoQnl0ZSkpOworICAgIHptZW1jcHkoZHMtPnByZXYsIHNzLT5wcmV2LCBkcy0+d19zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPmhlYWQsIHNzLT5oZWFkLCBkcy0+aGFzaF9zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPnBlbmRpbmdfYnVmLCBzcy0+cGVuZGluZ19idWYsICh1SW50KWRzLT5wZW5kaW5nX2J1Zl9zaXplKTsKKworICAgIGRzLT5wZW5kaW5nX291dCA9IGRzLT5wZW5kaW5nX2J1ZiArIChzcy0+cGVuZGluZ19vdXQgLSBzcy0+cGVuZGluZ19idWYpOworICAgIGRzLT5kX2J1ZiA9IG92ZXJsYXkgKyBkcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7CisgICAgZHMtPmxfYnVmID0gZHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKmRzLT5saXRfYnVmc2l6ZTsKKworICAgIGRzLT5sX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2x0cmVlOworICAgIGRzLT5kX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2R0cmVlOworICAgIGRzLT5ibF9kZXNjLmR5bl90cmVlID0gZHMtPmJsX3RyZWU7CisKKyAgICByZXR1cm4gWl9PSzsKKyNlbmRpZgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzIKKyAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoCisgKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZAorICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPm5leHRfaW4gYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuCisgKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS4KKyAqLworbG9jYWwgaW50IHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc2l6ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBCeXRlZiAqYnVmOworICAgIHVuc2lnbmVkIHNpemU7Cit7CisgICAgdW5zaWduZWQgbGVuID0gc3RybS0+YXZhaWxfaW47CisKKyAgICBpZiAobGVuID4gc2l6ZSkgbGVuID0gc2l6ZTsKKyAgICBpZiAobGVuID09IDApIHJldHVybiAwOworCisgICAgc3RybS0+YXZhaWxfaW4gIC09IGxlbjsKKworICAgIGlmICghc3RybS0+c3RhdGUtPm5vaGVhZGVyKSB7CisgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMihzdHJtLT5hZGxlciwgc3RybS0+bmV4dF9pbiwgbGVuKTsKKyAgICB9CisgICAgem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgc3RybS0+bmV4dF9pbiAgKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX2luICs9IGxlbjsKKworICAgIHJldHVybiAoaW50KWxlbjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtCisgKi8KK2xvY2FsIHZvaWQgbG1faW5pdCAocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHMtPndpbmRvd19zaXplID0gKHVsZykyTCpzLT53X3NpemU7CisKKyAgICBDTEVBUl9IQVNIKHMpOworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKKyAgICAgKi8KKyAgICBzLT5tYXhfbGF6eV9tYXRjaCAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubWF4X2xhenk7CisgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgIHMtPm5pY2VfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5uaWNlX2xlbmd0aDsKKyAgICBzLT5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubWF4X2NoYWluOworCisgICAgcy0+c3Ryc3RhcnQgPSAwOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7CisgICAgcy0+bG9va2FoZWFkID0gMDsKKyAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgcy0+aW5zX2ggPSAwOworI2lmZGVmIEFTTVYKKyAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCisjZW5kaWYKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKKyAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXMKKyAqIGdhcmJhZ2UuCisgKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50CisgKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLgorICovCisjaWZuZGVmIEFTTVYKKy8qIEZvciA4MHg4NiBhbmQgNjgweDAsIGFuIG9wdGltaXplZCB2ZXJzaW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gbWF0Y2guYXNtIG9yCisgKiBtYXRjaC5TLiBUaGUgY29kZSB3aWxsIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LgorICovCisjaWZuZGVmIEZBU1RFU1QKK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOy8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKm1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisgICAgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7ICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi8KKyAgICBpbnQgbmljZV9tYXRjaCA9IHMtPm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi8KKyAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CisgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CisgICAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSwKKyAgICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLgorICAgICAqLworICAgIFBvc2YgKnByZXYgPSBzLT5wcmV2OworICAgIHVJbnQgd21hc2sgPSBzLT53X21hc2s7CisKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAvKiBDb21wYXJlIHR3byBieXRlcyBhdCBhIHRpbWUuIE5vdGU6IHRoaXMgaXMgbm90IGFsd2F5cyBiZW5lZmljaWFsLgorICAgICAqIFRyeSB3aXRoIGFuZCB3aXRob3V0IC1EVU5BTElHTkVEX09LIHRvIGNoZWNrLgorICAgICAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSCAtIDE7CisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47CisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorCisgICAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCisgICAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgIkNvZGUgdG9vIGNsZXZlciIpOworCisgICAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi8KKyAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgeworICAgICAgICBjaGFpbl9sZW5ndGggPj49IDI7CisgICAgfQorICAgIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy4KKyAgICAgKi8KKyAgICBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgZG8geworICAgICAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsKKyAgICAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7CisKKyAgICAgICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlCisgICAgICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICAgICAqLworI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKKyAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCisgICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKworICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKKyAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0CisgICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50CisgICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKKyAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKKyAgICAgICAgc2NhbisrLCBtYXRjaCsrOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCisKKyAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisgICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKKworICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOworCisjZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8CisgICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKKyAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAorICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAgICAgKi8KKyAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOworICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisjZW5kaWYgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7CisgICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0CisgICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisKKyAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CisgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKK30KKworI2Vsc2UgLyogRkFTVEVTVCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPcHRpbWl6ZWQgdmVyc2lvbiBmb3IgbGV2ZWwgPT0gMSBvbmx5CisgKi8KK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKworICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisKKyAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICovCisgICAgaWYgKG1hdGNoWzBdICE9IHNjYW5bMF0gfHwgbWF0Y2hbMV0gIT0gc2NhblsxXSkgcmV0dXJuIE1JTl9NQVRDSC0xOworCisgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKKyAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAorICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAqLworICAgIHNjYW4gKz0gMiwgbWF0Y2ggKz0gMjsKKyAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorICAgICAqLworICAgIGRvIHsKKyAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKwkgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorCSAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisJICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKwkgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKworICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworCisgICAgaWYgKGxlbiA8IE1JTl9NQVRDSCkgcmV0dXJuIE1JTl9NQVRDSCAtIDE7CisKKyAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICByZXR1cm4gbGVuIDw9IHMtPmxvb2thaGVhZCA/IGxlbiA6IHMtPmxvb2thaGVhZDsKK30KKyNlbmRpZiAvKiBGQVNURVNUICovCisjZW5kaWYgLyogQVNNViAqLworCisjaWZkZWYgREVCVUcKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgdGhhdCB0aGUgbWF0Y2ggYXQgbWF0Y2hfc3RhcnQgaXMgaW5kZWVkIGEgbWF0Y2guCisgKi8KK2xvY2FsIHZvaWQgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIHN0YXJ0LCBtYXRjaDsKKyAgICBpbnQgbGVuZ3RoOworeworICAgIC8qIGNoZWNrIHRoYXQgdGhlIG1hdGNoIGlzIGluZGVlZCBhIG1hdGNoICovCisgICAgaWYgKHptZW1jbXAocy0+d2luZG93ICsgbWF0Y2gsCisgICAgICAgICAgICAgICAgcy0+d2luZG93ICsgc3RhcnQsIGxlbmd0aCkgIT0gRVFVQUwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgc3RhcnQgJXUsIG1hdGNoICV1LCBsZW5ndGggJWRcbiIsCisJCXN0YXJ0LCBtYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZG8geworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVjJWMiLCBzLT53aW5kb3dbbWF0Y2grK10sIHMtPndpbmRvd1tzdGFydCsrXSk7CisJfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisgICAgICAgIHpfZXJyb3IoImludmFsaWQgbWF0Y2giKTsKKyAgICB9CisgICAgaWYgKHpfdmVyYm9zZSA+IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlxcWyVkLCVkXSIsIHN0YXJ0LW1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7IHB1dGMocy0+d2luZG93W3N0YXJ0KytdLCBzdGRlcnIpOyB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICB9Cit9CisjZWxzZQorIyAgZGVmaW5lIGNoZWNrX21hdGNoKHMsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC4KKyAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC4KKyAqCisgKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQKKyAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFECisgKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmUKKyAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sCisgKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS4KKyAqLworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKKyAgICByZWdpc3RlciBQb3NmICpwOworICAgIHVuc2lnbmVkIG1vcmU7ICAgIC8qIEFtb3VudCBvZiBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4gKi8KKyAgICB1SW50IHdzaXplID0gcy0+d19zaXplOworCisgICAgZG8geworICAgICAgICBtb3JlID0gKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZSAtKHVsZylzLT5sb29rYWhlYWQgLSh1bGcpcy0+c3Ryc3RhcnQpOworCisgICAgICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovCisgICAgICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkgeworICAgICAgICAgICAgbW9yZSA9IHdzaXplOworCisgICAgICAgIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkgeworICAgICAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmIHN0cnN0YXJ0ID09IDAKKyAgICAgICAgICAgICAqIGFuZCBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBvbmUgYnl0ZSBhdCB0aW1lKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtb3JlLS07CisKKyAgICAgICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCwKKyAgICAgICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi4KKyAgICAgICAgICovCisgICAgICAgIH0gZWxzZSBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKKworICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCisgICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7CisKKyAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcworICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKKyAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKKyAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgorICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKKyAgICAgICAgICAgICAqLworCSAgICBuID0gcy0+aGFzaF9zaXplOworCSAgICBwID0gJnMtPmhlYWRbbl07CisJICAgIGRvIHsKKwkJbSA9ICotLXA7CisJCSpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworCSAgICB9IHdoaWxlICgtLW4pOworCisJICAgIG4gPSB3c2l6ZTsKKyNpZm5kZWYgRkFTVEVTVAorCSAgICBwID0gJnMtPnByZXZbbl07CisJICAgIGRvIHsKKwkJbSA9ICotLXA7CisJCSpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworCQkvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAorCQkgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorCQkgKi8KKwkgICAgfSB3aGlsZSAoLS1uKTsKKyNlbmRpZgorICAgICAgICAgICAgbW9yZSArPSB3c2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgcmV0dXJuOworCisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOgorICAgICAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJgorICAgICAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKKyAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpCisgICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMgorICAgICAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSwKKyAgICAgICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiYKKyAgICAgICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC4KKyAgICAgICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KKyAgICAgICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLgorICAgICAgICAgKi8KKyAgICAgICAgQXNzZXJ0KG1vcmUgPj0gMiwgIm1vcmUgPCAyIik7CisKKyAgICAgICAgbiA9IHJlYWRfYnVmKHMtPnN0cm0sIHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkLCBtb3JlKTsKKyAgICAgICAgcy0+bG9va2FoZWFkICs9IG47CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzLT5zdHJzdGFydF07CisgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyNpZiBNSU5fTUFUQ0ggIT0gMworICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSwKKyAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgorICAgICAgICAgKi8KKworICAgIH0gd2hpbGUgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy0+c3RybS0+YXZhaWxfaW4gIT0gMCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGN1cnJlbnQgYmxvY2ssIHdpdGggZ2l2ZW4gZW5kLW9mLWZpbGUgZmxhZy4KKyAqIElOIGFzc2VydGlvbjogc3Ryc3RhcnQgaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2guCisgKi8KKyNkZWZpbmUgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpIHsgXAorICAgX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLT5ibG9ja19zdGFydCA+PSAwTCA/IFwKKyAgICAgICAgICAgICAgICAgICAoY2hhcmYgKikmcy0+d2luZG93Wyh1bnNpZ25lZClzLT5ibG9ja19zdGFydF0gOiBcCisgICAgICAgICAgICAgICAgICAgKGNoYXJmICopWl9OVUxMKSwgXAorCQkodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KSwgXAorCQkoZW9mKSk7IFwKKyAgIHMtPmJsb2NrX3N0YXJ0ID0gcy0+c3Ryc3RhcnQ7IFwKKyAgIGZsdXNoX3BlbmRpbmcocy0+c3RybSk7IFwKKyAgIFRyYWNldigoc3RkZXJyLCJbRkxVU0hdIikpOyBcCit9CisKKy8qIFNhbWUgYnV0IGZvcmNlIHByZW1hdHVyZSBleGl0IGlmIG5lY2Vzc2FyeS4gKi8KKyNkZWZpbmUgRkxVU0hfQkxPQ0socywgZW9mKSB7IFwKKyAgIEZMVVNIX0JMT0NLX09OTFkocywgZW9mKTsgXAorICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gKGVvZikgPyBmaW5pc2hfc3RhcnRlZCA6IG5lZWRfbW9yZTsgXAorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuCisgKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlCisgKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZAorICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLgorICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbQorICogd2luZG93IHRvIHBlbmRpbmdfYnVmLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZAorICAgICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOgorICAgICAqLworICAgIHVsZyBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjsKKyAgICB1bGcgbWF4X3N0YXJ0OworCisgICAgaWYgKG1heF9ibG9ja19zaXplID4gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDUpIHsKKyAgICAgICAgbWF4X2Jsb2NrX3NpemUgPSBzLT5wZW5kaW5nX2J1Zl9zaXplIC0gNTsKKyAgICB9CisKKyAgICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSAxKSB7CisKKyAgICAgICAgICAgIEFzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fAorCQkgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOworCisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSByZXR1cm4gbmVlZF9tb3JlOworCisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisJQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCAiYmxvY2sgZ29uZSIpOworCisJcy0+c3Ryc3RhcnQgKz0gcy0+bG9va2FoZWFkOworCXMtPmxvb2thaGVhZCA9IDA7CisKKwkvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi8KKyAJbWF4X3N0YXJ0ID0gcy0+YmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTsKKyAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ID09IDAgfHwgKHVsZylzLT5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHsKKwkgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi8KKwkgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKKwkgICAgcy0+c3Ryc3RhcnQgPSAodUludCltYXhfc3RhcnQ7CisgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKwl9CisJLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCisgICAgICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgLSAodUludClzLT5ibG9ja19zdGFydCA+PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisJfQorICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnQKKyAqIGJsb2NrIHN0YXRlLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzCisgKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnQKKyAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIElQb3MgaGFzaF9oZWFkID0gTklMOyAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovCisgICAgaW50IGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisJICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworCSAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0gKKyAgICAgICAgICovCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+bWF0Y2hfc3RhcnQsIHMtPm1hdGNoX2xlbmd0aCk7CisKKyAgICAgICAgICAgIF90cl90YWxseV9kaXN0KHMsIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGgKKyAgICAgICAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICAgICAgICAgKi8KKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSBzLT5tYXhfaW5zZXJ0X2xlbmd0aCAmJgorICAgICAgICAgICAgICAgIHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gaGFzaCB0YWJsZSAqLworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXMtPm1hdGNoX2xlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOyAKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisJICAgIHsKKyAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzLT5zdHJzdGFydF07CisgICAgICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzLT5zdHJzdGFydCsxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcworI2VuZGlmCisgICAgICAgICAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgKiBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKKyAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7IAorICAgICAgICB9CisgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKKyAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKKyAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICBJUG9zIGhhc2hfaGVhZCA9IE5JTDsgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisJICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworCSAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIHMtPnByZXZfbGVuZ3RoID0gcy0+bWF0Y2hfbGVuZ3RoLCBzLT5wcmV2X21hdGNoID0gcy0+bWF0Y2hfc3RhcnQ7CisgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHMtPnByZXZfbGVuZ3RoIDwgcy0+bWF4X2xhenlfbWF0Y2ggJiYKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworCisgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoIDw9IDUgJiYgKHMtPnN0cmF0ZWd5ID09IFpfRklMVEVSRUQgfHwKKyAgICAgICAgICAgICAgICAgKHMtPm1hdGNoX2xlbmd0aCA9PSBNSU5fTUFUQ0ggJiYKKyAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQgPiBUT09fRkFSKSkpIHsKKworICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKyAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOworICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCisKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKKworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAorCQkJICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAorICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgorICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOworICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworCisgICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQorICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAorICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworCSAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKwkgICAgaWYgKGJmbHVzaCkgeworICAgICAgICAgICAgICAgIEZMVVNIX0JMT0NLX09OTFkocywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yCisgICAgICAgICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsICJubyBmbHVzaD8iKTsKKyAgICBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7CisgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTsKKyAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7CisgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9kZWZsYXRlLmggYi9jb21tb24vemxpYi9kZWZsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljZmFlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2RlZmxhdGUuaApAQCAtMCwwICsxLDMxOCBAQAorLyogZGVmbGF0ZS5oIC0tIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBAKCMpICRJZDogZGVmbGF0ZS5oLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjQgY29uc3RfayBFeHAgJCAqLworCisjaWZuZGVmIF9ERUZMQVRFX0gKKyNkZWZpbmUgX0RFRkxBVEVfSAorCisjaW5jbHVkZSAienV0aWwuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KKyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgTF9DT0RFUyAoTElURVJBTFMrMStMRU5HVEhfQ09ERVMpCisvKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBEX0NPREVTICAgMzAKKy8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisjZGVmaW5lIEJMX0NPREVTICAxOQorLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovCisKKyNkZWZpbmUgSEVBUF9TSVpFICgyKkxfQ09ERVMrMSkKKy8qIG1heGltdW0gaGVhcCBzaXplICovCisKKyNkZWZpbmUgTUFYX0JJVFMgMTUKKy8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLworCisjZGVmaW5lIElOSVRfU1RBVEUgICAgNDIKKyNkZWZpbmUgQlVTWV9TVEFURSAgIDExMworI2RlZmluZSBGSU5JU0hfU1RBVEUgNjY2CisvKiBTdHJlYW0gc3RhdHVzICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YV9zIHsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZnJlcTsgICAgICAgLyogZnJlcXVlbmN5IGNvdW50ICovCisgICAgICAgIHVzaCAgY29kZTsgICAgICAgLyogYml0IHN0cmluZyAqLworICAgIH0gZmM7CisgICAgdW5pb24geworICAgICAgICB1c2ggIGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLworICAgICAgICB1c2ggIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCisgICAgfSBkbDsKK30gRkFSIGN0X2RhdGE7CisKKyNkZWZpbmUgRnJlcSBmYy5mcmVxCisjZGVmaW5lIENvZGUgZmMuY29kZQorI2RlZmluZSBEYWQgIGRsLmRhZAorI2RlZmluZSBMZW4gIGRsLmxlbgorCit0eXBlZGVmIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgIHN0YXRpY190cmVlX2Rlc2M7CisKK3R5cGVkZWYgc3RydWN0IHRyZWVfZGVzY19zIHsKKyAgICBjdF9kYXRhICpkeW5fdHJlZTsgICAgICAgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi8KKyAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIHN0YXRpY190cmVlX2Rlc2MgKnN0YXRfZGVzYzsgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi8KK30gRkFSIHRyZWVfZGVzYzsKKwordHlwZWRlZiB1c2ggUG9zOwordHlwZWRlZiBQb3MgRkFSIFBvc2Y7Cit0eXBlZGVmIHVuc2lnbmVkIElQb3M7CisKKy8qIEEgUG9zIGlzIGFuIGluZGV4IGluIHRoZSBjaGFyYWN0ZXIgd2luZG93LiBXZSB1c2Ugc2hvcnQgaW5zdGVhZCBvZiBpbnQgdG8KKyAqIHNhdmUgc3BhY2UgaW4gdGhlIHZhcmlvdXMgdGFibGVzLiBJUG9zIGlzIHVzZWQgb25seSBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgeworICAgIHpfc3RyZWFtcCBzdHJtOyAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovCisgICAgaW50ICAgc3RhdHVzOyAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqLworICAgIEJ5dGVmICpwZW5kaW5nX2J1ZjsgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovCisgICAgdWxnICAgcGVuZGluZ19idWZfc2l6ZTsgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqLworICAgIEJ5dGVmICpwZW5kaW5nX291dDsgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovCisgICAgaW50ICAgcGVuZGluZzsgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovCisgICAgaW50ICAgbm9oZWFkZXI7ICAgICAgLyogc3VwcHJlc3MgemxpYiBoZWFkZXIgYW5kIGFkbGVyMzIgKi8KKyAgICBCeXRlICBkYXRhX3R5cGU7ICAgICAvKiBVTktOT1dOLCBCSU5BUlkgb3IgQVNDSUkgKi8KKyAgICBCeXRlICBtZXRob2Q7ICAgICAgICAvKiBTVE9SRUQgKGZvciB6aXAgb25seSkgb3IgREVGTEFURUQgKi8KKyAgICBpbnQgICBsYXN0X2ZsdXNoOyAgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovCisKKyAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IGRlZmxhdGUuYzogKi8KKworICAgIHVJbnQgIHdfc2l6ZTsgICAgICAgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqLworICAgIHVJbnQgIHdfYml0czsgICAgICAgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqLworICAgIHVJbnQgIHdfbWFzazsgICAgICAgIC8qIHdfc2l6ZSAtIDEgKi8KKworICAgIEJ5dGVmICp3aW5kb3c7CisgICAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csCisgICAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemUKKyAgICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCisgICAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzCisgICAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cworICAgICAqIHRoZSB3aW5kb3cgc2l6ZSB0byA2NEssIHdoaWNoIGlzIHF1aXRlIHVzZWZ1bCBvbiBNU0RPUy4KKyAgICAgKiBUbyBkbzogdXNlIHRoZSB1c2VyIGlucHV0IGJ1ZmZlciBhcyBzbGlkaW5nIHdpbmRvdy4KKyAgICAgKi8KKworICAgIHVsZyB3aW5kb3dfc2l6ZTsKKyAgICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlcgorICAgICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuCisgICAgICovCisKKyAgICBQb3NmICpwcmV2OworICAgIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCisgICAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KKyAgICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy4KKyAgICAgKi8KKworICAgIFBvc2YgKmhlYWQ7IC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovCisKKyAgICB1SW50ICBpbnNfaDsgICAgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi8KKyAgICB1SW50ICBoYXNoX3NpemU7ICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KKyAgICB1SW50ICBoYXNoX2JpdHM7ICAgICAgLyogbG9nMihoYXNoX3NpemUpICovCisgICAgdUludCAgaGFzaF9tYXNrOyAgICAgIC8qIGhhc2hfc2l6ZS0xICovCisKKyAgICB1SW50ICBoYXNoX3NoaWZ0OworICAgIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0CisgICAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0CisgICAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6CisgICAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0cworICAgICAqLworCisgICAgbG9uZyBibG9ja19zdGFydDsKKyAgICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHMKKyAgICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgorICAgICAqLworCisgICAgdUludCBtYXRjaF9sZW5ndGg7ICAgICAgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLworICAgIElQb3MgcHJldl9tYXRjaDsgICAgICAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi8KKyAgICBpbnQgbWF0Y2hfYXZhaWxhYmxlOyAgICAgICAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi8KKyAgICB1SW50IHN0cnN0YXJ0OyAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi8KKyAgICB1SW50IG1hdGNoX3N0YXJ0OyAgICAgICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqLworICAgIHVJbnQgbG9va2FoZWFkOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqLworCisgICAgdUludCBwcmV2X2xlbmd0aDsKKyAgICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMKKyAgICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi4KKyAgICAgKi8KKworICAgIHVJbnQgbWF4X2NoYWluX2xlbmd0aDsKKyAgICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpcworICAgICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGUKKyAgICAgKiBzcGVlZC4KKyAgICAgKi8KKworICAgIHVJbnQgbWF4X2xhenlfbWF0Y2g7CisgICAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseQorICAgICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uCisgICAgICogbGV2ZWxzID49IDQuCisgICAgICovCisjICAgZGVmaW5lIG1heF9pbnNlcnRfbGVuZ3RoICBtYXhfbGF6eV9tYXRjaAorICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90CisgICAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICAgICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuCisgICAgICovCisKKyAgICBpbnQgbGV2ZWw7ICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqLworICAgIGludCBzdHJhdGVneTsgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqLworCisgICAgdUludCBnb29kX21hdGNoOworICAgIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqLworCisgICAgaW50IG5pY2VfbWF0Y2g7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi8KKworICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi8KKyAgICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCisgICAgc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovCisKKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgbF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgZF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovCisgICAgc3RydWN0IHRyZWVfZGVzY19zIGJsX2Rlc2M7ICAgICAgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovCisKKyAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07CisgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCisKKyAgICBpbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCisgICAgaW50IGhlYXBfbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqLworICAgIGludCBoZWFwX21heDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovCisgICAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KKyAgICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLgorICAgICAqLworCisgICAgdWNoIGRlcHRoWzIqTF9DT0RFUysxXTsKKyAgICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5CisgICAgICovCisKKyAgICB1Y2hmICpsX2J1ZjsgICAgICAgICAgLyogYnVmZmVyIGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovCisKKyAgICB1SW50ICBsaXRfYnVmc2l6ZTsKKyAgICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yCisgICAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOgorICAgICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKKyAgICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0CisgICAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuCisgICAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yCisgICAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQorICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhbgorICAgICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCisgICAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLgorICAgICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3QKKyAgICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgorICAgICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnkKKyAgICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmUKKyAgICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nCisgICAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS4KKyAgICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0CisgICAgICovCisKKyAgICB1SW50IGxhc3RfbGl0OyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKworICAgIHVzaGYgKmRfYnVmOworICAgIC8qIEJ1ZmZlciBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmUKKyAgICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZworICAgICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KKyAgICAgKi8KKworICAgIHVsZyBvcHRfbGVuOyAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLworICAgIHVsZyBzdGF0aWNfbGVuOyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCisgICAgdUludCBtYXRjaGVzOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqLworICAgIGludCBsYXN0X2VvYl9sZW47ICAgLyogYml0IGxlbmd0aCBvZiBFT0IgY29kZSBmb3IgbGFzdCBibG9jayAqLworCisjaWZkZWYgREVCVUcKKyAgICB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBmaWxlIG1vZCAyXjMyICovCisgICAgdWxnIGJpdHNfc2VudDsgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGF0YSBzZW50IG1vZCAyXjMyICovCisjZW5kaWYKKworICAgIHVzaCBiaV9idWY7CisgICAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3QKKyAgICAgKiBzaWduaWZpY2FudCBiaXRzKS4KKyAgICAgKi8KKyAgICBpbnQgYmlfdmFsaWQ7CisgICAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0CisgICAgICogYXJlIGFsd2F5cyB6ZXJvLgorICAgICAqLworCit9IEZBUiBkZWZsYXRlX3N0YXRlOworCisvKiBPdXRwdXQgYSBieXRlIG9uIHRoZSBzdHJlYW0uCisgKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdfYnVmLgorICovCisjZGVmaW5lIHB1dF9ieXRlKHMsIGMpIHtzLT5wZW5kaW5nX2J1ZltzLT5wZW5kaW5nKytdID0gKGMpO30KKworCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKKy8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCisgKi8KKworI2RlZmluZSBNQVhfRElTVChzKSAgKChzKS0+d19zaXplLU1JTl9MT09LQUhFQUQpCisvKiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgY29kZSwgcGFydGljdWxhcmx5IG9uIDE2IGJpdCBtYWNoaW5lcywgbWF0Y2gKKyAqIGRpc3RhbmNlcyBhcmUgbGltaXRlZCB0byBNQVhfRElTVCBpbnN0ZWFkIG9mIFdTSVpFLgorICovCisKKyAgICAgICAgLyogaW4gdHJlZXMuYyAqLwordm9pZCBfdHJfaW5pdCAgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CitpbnQgIF90cl90YWxseSAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVuc2lnbmVkIGRpc3QsIHVuc2lnbmVkIGxjKSk7Cit2b2lkIF90cl9mbHVzaF9ibG9jayAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVsZyBzdG9yZWRfbGVuLAorCQkJICBpbnQgZW9mKSk7Cit2b2lkIF90cl9hbGlnbiAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgX3RyX3N0b3JlZF9ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlb2YpKTsKKworI2RlZmluZSBkX2NvZGUoZGlzdCkgXAorICAgKChkaXN0KSA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NisoKGRpc3QpPj43KV0pCisvKiBNYXBwaW5nIGZyb20gYSBkaXN0YW5jZSB0byBhIGRpc3RhbmNlIGNvZGUuIGRpc3QgaXMgdGhlIGRpc3RhbmNlIC0gMSBhbmQKKyAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBfZGlzdF9jb2RlWzI1Nl0gYW5kIF9kaXN0X2NvZGVbMjU3XSBhcmUgbmV2ZXIKKyAqIHVzZWQuCisgKi8KKworI2lmbmRlZiBERUJVRworLyogSW5saW5lIHZlcnNpb25zIG9mIF90cl90YWxseSBmb3Igc3BlZWQ6ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorICBleHRlcm4gdWNoIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gdWNoIF9kaXN0X2NvZGVbXTsKKyNlbHNlCisgIGV4dGVybiBjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW107CisgIGV4dGVybiBjb25zdCB1Y2ggX2Rpc3RfY29kZVtdOworI2VuZGlmCisKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIFwKKyAgeyB1Y2ggY2MgPSAoYyk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSAwOyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBjYzsgXAorICAgIHMtPmR5bl9sdHJlZVtjY10uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgIH0KKyMgZGVmaW5lIF90cl90YWxseV9kaXN0KHMsIGRpc3RhbmNlLCBsZW5ndGgsIGZsdXNoKSBcCisgIHsgdWNoIGxlbiA9IChsZW5ndGgpOyBcCisgICAgdXNoIGRpc3QgPSAoZGlzdGFuY2UpOyBcCisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gZGlzdDsgXAorICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gbGVuOyBcCisgICAgZGlzdC0tOyBcCisgICAgcy0+ZHluX2x0cmVlW19sZW5ndGhfY29kZVtsZW5dK0xJVEVSQUxTKzFdLkZyZXErKzsgXAorICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsgXAorICAgIGZsdXNoID0gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOyBcCisgIH0KKyNlbHNlCisjIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBmbHVzaCA9IF90cl90YWxseShzLCAwLCBjKQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgICAgICAgICAgICAgZmx1c2ggPSBfdHJfdGFsbHkocywgZGlzdGFuY2UsIGxlbmd0aCkgCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9kZXNjcmlwLm1tcyBiL2NvbW1vbi96bGliL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDQ4IEBACisjIGRlc2NyaXAubW1zOiBNTVMgZGVzY3JpcHRpb24gZmlsZSBmb3IgYnVpbGRpbmcgemxpYiBvbiBWTVMKKyMgd3JpdHRlbiBieSBNYXJ0aW4gUC5KLiBaaW5zZXIgPG0uemluc2VyQGdzaS5kZT4KKworY2NfZGVmcyA9IAorY19kZWIgPSAKKworLmlmZGVmIF9fREVDQ19fCitwcmVmID0gL3ByZWZpeD1hbGwKKy5lbmRpZgorCitPQkpTID0gYWRsZXIzMi5vYmosIGNvbXByZXNzLm9iaiwgY3JjMzIub2JqLCBnemlvLm9iaiwgdW5jb21wci5vYmosXAorICAgICAgIGRlZmxhdGUub2JqLCB0cmVlcy5vYmosIHp1dGlsLm9iaiwgaW5mbGF0ZS5vYmosIGluZmJsb2NrLm9iaixcCisgICAgICAgaW5mdHJlZXMub2JqLCBpbmZjb2Rlcy5vYmosIGluZnV0aWwub2JqLCBpbmZmYXN0Lm9iagorCitDRkxBR1M9ICQoQ19ERUIpICQoQ0NfREVGUykgJChQUkVGKQorCithbGwgOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKyAgICAgICAgQCB3cml0ZSBzeXMkb3V0cHV0ICIgRXhhbXBsZSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlIgorbGliei5vbGIgOiBsaWJ6Lm9sYigkKE9CSlMpKQorCUAgd3JpdGUgc3lzJG91dHB1dCAiIGxpYnogYXZhaWxhYmxlIgorCitleGFtcGxlLmV4ZSA6IGV4YW1wbGUub2JqIGxpYnoub2xiCisgICAgICAgICAgICAgIGxpbmsgZXhhbXBsZSxsaWJ6Lm9sYi9saWIKKworbWluaWd6aXAuZXhlIDogbWluaWd6aXAub2JqIGxpYnoub2xiCisgICAgICAgICAgICAgIGxpbmsgbWluaWd6aXAsbGliei5vbGIvbGliLHgxMXZtczp4dm1zdXRpbHMub2xiL2xpYgorCitjbGVhbiA6IAorCWRlbGV0ZSAqLm9iajsqLGxpYnoub2xiOyoKKworCisjIE90aGVyIGRlcGVuZGVuY2llcy4KK2FkbGVyMzIub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAorY29tcHJlc3Mub2JqIDogemxpYi5oIHpjb25mLmgKK2NyYzMyLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2RlZmxhdGUub2JqIDogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2V4YW1wbGUub2JqIDogemxpYi5oIHpjb25mLmgKK2d6aW8ub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mYmxvY2sub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKK2luZmNvZGVzLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmggaW5mY29kZXMuaCBpbmZmYXN0LmgKK2luZmZhc3Qub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKK2luZmxhdGUub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCitpbmZ0cmVlcy5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK2luZnV0aWwub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAorbWluaWd6aXAub2JqIDogemxpYi5oIHpjb25mLmgKK3RyZWVzLm9iaiA6IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCit1bmNvbXByLm9iaiA6IHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9leGFtcGxlLmMgYi9jb21tb24vemxpYi9leGFtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1NjYyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2V4YW1wbGUuYwpAQCAtMCwwICsxLDU1NiBAQAorLyogZXhhbXBsZS5jIC0tIHVzYWdlIGV4YW1wbGUgb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogQCgjKSAkSWQ6IGV4YW1wbGUuYyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjI1IGNvbnN0X2sgRXhwICQgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisgICBleHRlcm4gdm9pZCBleGl0ICBPRigoaW50KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKFJJU0NPUykKKyMgIGRlZmluZSBURVNURklMRSAiZm9vLWd6IgorI2Vsc2UKKyMgIGRlZmluZSBURVNURklMRSAiZm9vLmd6IgorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfRVJSKGVyciwgbXNnKSB7IFwKKyAgICBpZiAoZXJyICE9IFpfT0spIHsgXAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yOiAlZFxuIiwgbXNnLCBlcnIpOyBcCisgICAgICAgIGV4aXQoMSk7IFwKKyAgICB9IFwKK30KKworY29uc3QgY2hhciBoZWxsb1tdID0gImhlbGxvLCBoZWxsbyEiOworLyogImhlbGxvIHdvcmxkIiB3b3VsZCBiZSBtb3JlIHN0YW5kYXJkLCBidXQgdGhlIHJlcGVhdGVkICJoZWxsbyIKKyAqIHN0cmVzc2VzIHRoZSBjb21wcmVzc2lvbiBjb2RlIGJldHRlciwgc29ycnkuLi4KKyAqLworCitjb25zdCBjaGFyIGRpY3Rpb25hcnlbXSA9ICJoZWxsbyI7Cit1TG9uZyBkaWN0SWQ7IC8qIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKi8KKwordm9pZCB0ZXN0X2NvbXByZXNzICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKwkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2d6aW8gICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKm91dCwgY29uc3QgY2hhciAqaW4sIAorCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCBpbnQgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2RlZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwordm9pZCB0ZXN0X2luZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKwkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2xhcmdlX2RlZmxhdGUgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKwkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKwkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2ZsdXNoICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyAqY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9zeW5jICAgICAgICAgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisJCSAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9kaWN0X2RlZmxhdGUgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9kaWN0X2luZmxhdGUgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisJCSAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK2ludCAgbWFpbiAgICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBjb21wcmVzcygpIGFuZCB1bmNvbXByZXNzKCkKKyAqLwordm9pZCB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgaW50IGVycjsKKyAgICB1TG9uZyBsZW4gPSBzdHJsZW4oaGVsbG8pKzE7CisKKyAgICBlcnIgPSBjb21wcmVzcyhjb21wciwgJmNvbXByTGVuLCAoY29uc3QgQnl0ZWYqKWhlbGxvLCBsZW4pOworICAgIENIRUNLX0VSUihlcnIsICJjb21wcmVzcyIpOworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZXJyID0gdW5jb21wcmVzcyh1bmNvbXByLCAmdW5jb21wckxlbiwgY29tcHIsIGNvbXByTGVuKTsKKyAgICBDSEVDS19FUlIoZXJyLCAidW5jb21wcmVzcyIpOworCisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIHVuY29tcHJlc3NcbiIpOworCWV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJ1bmNvbXByZXNzKCk6ICVzXG4iLCAoY2hhciAqKXVuY29tcHIpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IHJlYWQvd3JpdGUgb2YgLmd6IGZpbGVzCisgKi8KK3ZvaWQgdGVzdF9nemlvKG91dCwgaW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgY29uc3QgY2hhciAqb3V0OyAvKiBjb21wcmVzc2VkIG91dHB1dCBmaWxlICovCisgICAgY29uc3QgY2hhciAqaW47ICAvKiBjb21wcmVzc2VkIGlucHV0IGZpbGUgKi8KKyAgICBCeXRlICp1bmNvbXByOworICAgIGludCAgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIGludCBsZW4gPSBzdHJsZW4oaGVsbG8pKzE7CisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmZfdCBwb3M7CisKKyAgICBmaWxlID0gZ3pvcGVuKG91dCwgIndiIik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGd6cHV0YyhmaWxlLCAnaCcpOworICAgIGlmIChnenB1dHMoZmlsZSwgImVsbG8iKSAhPSA0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwdXRzIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOworCWV4aXQoMSk7CisgICAgfQorICAgIGlmIChnenByaW50ZihmaWxlLCAiLCAlcyEiLCAiaGVsbG8iKSAhPSA4KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwcmludGYgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgZ3pzZWVrKGZpbGUsIDFMLCBTRUVLX0NVUik7IC8qIGFkZCBvbmUgemVybyBieXRlICovCisgICAgZ3pjbG9zZShmaWxlKTsKKworICAgIGZpbGUgPSBnem9wZW4oaW4sICJyYiIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnem9wZW4gZXJyb3JcbiIpOworICAgIH0KKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICB1bmNvbXByTGVuID0gZ3pyZWFkKGZpbGUsIHVuY29tcHIsICh1bnNpZ25lZCl1bmNvbXByTGVuKTsKKyAgICBpZiAodW5jb21wckxlbiAhPSBsZW4pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenJlYWQgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGd6cmVhZDogJXNcbiIsIChjaGFyKil1bmNvbXByKTsKKwlleGl0KDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiZ3pyZWFkKCk6ICVzXG4iLCAoY2hhciAqKXVuY29tcHIpOworICAgIH0KKworICAgIHBvcyA9IGd6c2VlayhmaWxlLCAtOEwsIFNFRUtfQ1VSKTsKKyAgICBpZiAocG9zICE9IDYgfHwgZ3p0ZWxsKGZpbGUpICE9IHBvcykgeworCWZwcmludGYoc3RkZXJyLCAiZ3pzZWVrIGVycm9yLCBwb3M9JWxkLCBnenRlbGw9JWxkXG4iLAorCQkobG9uZylwb3MsIChsb25nKWd6dGVsbChmaWxlKSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAoZ3pnZXRjKGZpbGUpICE9ICcgJykgeworCWZwcmludGYoc3RkZXJyLCAiZ3pnZXRjIGVycm9yXG4iKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIGd6Z2V0cyhmaWxlLCAoY2hhciopdW5jb21wciwgdW5jb21wckxlbik7CisgICAgdW5jb21wckxlbiA9IHN0cmxlbigoY2hhciopdW5jb21wcik7CisgICAgaWYgKHVuY29tcHJMZW4gIT0gNikgeyAvKiAiaGVsbG8hIiAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6Z2V0cyBlcnIgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8rNykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgZ3pnZXRzIGFmdGVyIGd6c2Vla1xuIik7CisJZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImd6Z2V0cygpIGFmdGVyIGd6c2VlazogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorCisgICAgZ3pjbG9zZShmaWxlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGRlZmxhdGUoKSB3aXRoIHNtYWxsIGJ1ZmZlcnMKKyAqLwordm9pZCB0ZXN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByOworICAgIHVMb25nIGNvbXByTGVuOworeworICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KKyAgICBpbnQgZXJyOworICAgIGludCBsZW4gPSBzdHJsZW4oaGVsbG8pKzE7CisKKyAgICBjX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIGNfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKKworICAgIGNfc3RyZWFtLm5leHRfaW4gID0gKEJ5dGVmKiloZWxsbzsKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworCisgICAgd2hpbGUgKGNfc3RyZWFtLnRvdGFsX2luICE9ICh1TG9uZylsZW4gJiYgY19zdHJlYW0udG90YWxfb3V0IDwgY29tcHJMZW4pIHsKKyAgICAgICAgY19zdHJlYW0uYXZhaWxfaW4gPSBjX3N0cmVhbS5hdmFpbF9vdXQgPSAxOyAvKiBmb3JjZSBzbWFsbCBidWZmZXJzICovCisgICAgICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKyAgICB9CisgICAgLyogRmluaXNoIHRoZSBzdHJlYW0sIHN0aWxsIGZvcmNpbmcgc21hbGwgYnVmZmVyczogKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNfc3RyZWFtLmF2YWlsX291dCA9IDE7CisgICAgICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKyAgICB9CisKKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGUoKSB3aXRoIHNtYWxsIGJ1ZmZlcnMKKyAqLwordm9pZCB0ZXN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOworCisgICAgd2hpbGUgKGRfc3RyZWFtLnRvdGFsX291dCA8IHVuY29tcHJMZW4gJiYgZF9zdHJlYW0udG90YWxfaW4gPCBjb21wckxlbikgeworICAgICAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IGRfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIik7CisgICAgfQorCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7CisKKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgaW5mbGF0ZVxuIik7CisJZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImluZmxhdGUoKTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggbGFyZ2UgYnVmZmVycyBhbmQgZHluYW1pYyBjaGFuZ2Ugb2YgY29tcHJlc3Npb24gbGV2ZWwKKyAqLwordm9pZCB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCisgICAgaW50IGVycjsKKworICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0JFU1RfU1BFRUQpOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKKyAgICBjX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCljb21wckxlbjsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHVuY29tcHIgaXMgc3RpbGwgbW9zdGx5IHplcm9lcywgc28gaXQgc2hvdWxkIGNvbXByZXNzCisgICAgICogdmVyeSB3ZWxsOgorICAgICAqLworICAgIGNfc3RyZWFtLm5leHRfaW4gPSB1bmNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpdW5jb21wckxlbjsKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKyAgICBpZiAoY19zdHJlYW0uYXZhaWxfaW4gIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmxhdGUgbm90IGdyZWVkeVxuIik7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBGZWVkIGluIGFscmVhZHkgY29tcHJlc3NlZCBkYXRhIGFuZCBzd2l0Y2ggdG8gbm8gY29tcHJlc3Npb246ICovCisgICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfTk9fQ09NUFJFU1NJT04sIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgY19zdHJlYW0ubmV4dF9pbiA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4vMjsKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKworICAgIC8qIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICovCisgICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7CisgICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworCisgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmxhdGUgc2hvdWxkIHJlcG9ydCBaX1NUUkVBTV9FTkRcbiIpOworCWV4aXQoMSk7CisgICAgfQorICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggbGFyZ2UgYnVmZmVycworICovCit2b2lkIHRlc3RfbGFyZ2VfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOworeworICAgIGludCBlcnI7CisgICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCisKKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbjsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsgICAgICAgICAgICAvKiBkaXNjYXJkIHRoZSBvdXRwdXQgKi8KKwlkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOworICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImxhcmdlIGluZmxhdGUiKTsKKyAgICB9CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIGlmIChkX3N0cmVhbS50b3RhbF9vdXQgIT0gMip1bmNvbXByTGVuICsgY29tcHJMZW4vMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBsYXJnZSBpbmZsYXRlOiAlbGRcbiIsIGRfc3RyZWFtLnRvdGFsX291dCk7CisJZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImxhcmdlX2luZmxhdGUoKTogT0tcbiIpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGRlZmxhdGUoKSB3aXRoIGZ1bGwgZmx1c2gKKyAqLwordm9pZCB0ZXN0X2ZsdXNoKGNvbXByLCBjb21wckxlbikKKyAgICBCeXRlICpjb21wcjsKKyAgICB1TG9uZyAqY29tcHJMZW47Cit7CisgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLworICAgIGludCBlcnI7CisgICAgaW50IGxlbiA9IHN0cmxlbihoZWxsbykrMTsKKworICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWhlbGxvOworICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAzOworICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpjb21wckxlbjsKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GVUxMX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworCisgICAgY29tcHJbM10rKzsgLyogZm9yY2UgYW4gZXJyb3IgaW4gZmlyc3QgY29tcHJlc3NlZCBibG9jayAqLworICAgIGNfc3RyZWFtLmF2YWlsX2luID0gbGVuIC0gMzsKKworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKyAgICB9CisgICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7CisKKyAgICAqY29tcHJMZW4gPSBjX3N0cmVhbS50b3RhbF9vdXQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlU3luYygpCisgKi8KK3ZvaWQgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgaW50IGVycjsKKyAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KKworICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIGRfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgZF9zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IDI7IC8qIGp1c3QgcmVhZCB0aGUgemxpYiBoZWFkZXIgKi8KKworICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKKworICAgIGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZSIpOworCisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbi0yOyAgIC8qIHJlYWQgYWxsIGNvbXByZXNzZWQgZGF0YSAqLworICAgIGVyciA9IGluZmxhdGVTeW5jKCZkX3N0cmVhbSk7ICAgICAgICAgICAvKiBidXQgc2tpcCB0aGUgZGFtYWdlZCBwYXJ0ICovCisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVTeW5jIik7CisKKyAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9EQVRBX0VSUk9SKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5mbGF0ZSBzaG91bGQgcmVwb3J0IERBVEFfRVJST1JcbiIpOworICAgICAgICAvKiBCZWNhdXNlIG9mIGluY29ycmVjdCBhZGxlcjMyICovCisJZXhpdCgxKTsKKyAgICB9CisgICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7CisKKyAgICBwcmludGYoImFmdGVyIGluZmxhdGVTeW5jKCk6IGhlbCVzXG4iLCAoY2hhciAqKXVuY29tcHIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggcHJlc2V0IGRpY3Rpb25hcnkKKyAqLwordm9pZCB0ZXN0X2RpY3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW47Cit7CisgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLworICAgIGludCBlcnI7CisKKyAgICBjX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIGNfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKKworICAgIGVyciA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5KCZjX3N0cmVhbSwKKwkJCSAgICAgICAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksIHNpemVvZihkaWN0aW9uYXJ5KSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVTZXREaWN0aW9uYXJ5Iik7CisKKyAgICBkaWN0SWQgPSBjX3N0cmVhbS5hZGxlcjsKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOworCisgICAgY19zdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopaGVsbG87CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludClzdHJsZW4oaGVsbG8pKzE7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORFxuIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlKCkgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5CisgKi8KK3ZvaWQgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW47CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOworCisgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOworCWlmIChlcnIgPT0gWl9ORUVEX0RJQ1QpIHsKKwkgICAgaWYgKGRfc3RyZWFtLmFkbGVyICE9IGRpY3RJZCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuZXhwZWN0ZWQgZGljdGlvbmFyeSIpOworCQlleGl0KDEpOworCSAgICB9CisJICAgIGVyciA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZkX3N0cmVhbSwgKGNvbnN0IEJ5dGVmKilkaWN0aW9uYXJ5LAorCQkJCSAgICAgICBzaXplb2YoZGljdGlvbmFyeSkpOworCX0KKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGUgd2l0aCBkaWN0Iik7CisgICAgfQorCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7CisKKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgaW5mbGF0ZSB3aXRoIGRpY3RcbiIpOworCWV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJpbmZsYXRlIHdpdGggZGljdGlvbmFyeTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVzYWdlOiAgZXhhbXBsZSBbb3V0cHV0Lmd6ICBbaW5wdXQuZ3pdXQorICovCisKK2ludCBtYWluKGFyZ2MsIGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqYXJndltdOworeworICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiA9IDEwMDAwKnNpemVvZihpbnQpOyAvKiBkb24ndCBvdmVyZmxvdyBvbiBNU0RPUyAqLworICAgIHVMb25nIHVuY29tcHJMZW4gPSBjb21wckxlbjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbXlWZXJzaW9uID0gWkxJQl9WRVJTSU9OOworCisgICAgaWYgKHpsaWJWZXJzaW9uKClbMF0gIT0gbXlWZXJzaW9uWzBdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb21wYXRpYmxlIHpsaWIgdmVyc2lvblxuIik7CisgICAgICAgIGV4aXQoMSk7CisKKyAgICB9IGVsc2UgaWYgKHN0cmNtcCh6bGliVmVyc2lvbigpLCBaTElCX1ZFUlNJT04pICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBkaWZmZXJlbnQgemxpYiB2ZXJzaW9uXG4iKTsKKyAgICB9CisKKyAgICBjb21wciAgICA9IChCeXRlKiljYWxsb2MoKHVJbnQpY29tcHJMZW4sIDEpOworICAgIHVuY29tcHIgID0gKEJ5dGUqKWNhbGxvYygodUludCl1bmNvbXByTGVuLCAxKTsKKyAgICAvKiBjb21wciBhbmQgdW5jb21wciBhcmUgY2xlYXJlZCB0byBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQKKyAgICAgKiBkYXRhIGFuZCB0byBlbnN1cmUgdGhhdCB1bmNvbXByIGNvbXByZXNzZXMgd2VsbC4KKyAgICAgKi8KKyAgICBpZiAoY29tcHIgPT0gWl9OVUxMIHx8IHVuY29tcHIgPT0gWl9OVUxMKSB7CisgICAgICAgIHByaW50Zigib3V0IG9mIG1lbW9yeVxuIik7CisJZXhpdCgxKTsKKyAgICB9CisgICAgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworCisgICAgdGVzdF9nemlvKChhcmdjID4gMSA/IGFyZ3ZbMV0gOiBURVNURklMRSksCisgICAgICAgICAgICAgIChhcmdjID4gMiA/IGFyZ3ZbMl0gOiBURVNURklMRSksCisJICAgICAgdW5jb21wciwgKGludCl1bmNvbXByTGVuKTsKKworICAgIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pOworICAgIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworCisgICAgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgICAgdGVzdF9sYXJnZV9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisKKyAgICB0ZXN0X2ZsdXNoKGNvbXByLCAmY29tcHJMZW4pOworICAgIHRlc3Rfc3luYyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworICAgIGNvbXByTGVuID0gdW5jb21wckxlbjsKKworICAgIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7CisgICAgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKworICAgIGV4aXQoMCk7CisgICAgcmV0dXJuIDA7IC8qIHRvIGF2b2lkIHdhcm5pbmcgKi8KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2d6aW8uYyBiL2NvbW1vbi96bGliL2d6aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThiNTczCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvZ3ppby5jCkBAIC0wLDAgKzEsODc1IEBACisvKiBnemlvLmMgLS0gSU8gb24gLmd6IGZpbGVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICoKKyAqIENvbXBpbGUgdGhpcyBmaWxlIHdpdGggLUROT19ERUZMQVRFIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLgorICovCisKKy8qIEAoIykgJElkOiBnemlvLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyNSBjb25zdF9rIEV4cCAkICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAienV0aWwuaCIKKworc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworCisjaWZuZGVmIFpfQlVGU0laRQorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgWl9CVUZTSVpFIDQwOTYgLyogbWluaW1pemUgbWVtb3J5IHVzYWdlIGZvciAxNi1iaXQgRE9TICovCisjICBlbHNlCisjICAgIGRlZmluZSBaX0JVRlNJWkUgMTYzODQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgWl9QUklOVEZfQlVGU0laRQorIyAgZGVmaW5lIFpfUFJJTlRGX0JVRlNJWkUgNDA5NgorI2VuZGlmCisKKyNkZWZpbmUgQUxMT0Moc2l6ZSkgbWFsbG9jKHNpemUpCisjZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KKworc3RhdGljIGludCBnel9tYWdpY1syXSA9IHsweDFmLCAweDhifTsgLyogZ3ppcCBtYWdpYyBoZWFkZXIgKi8KKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KKyNkZWZpbmUgSEVBRF9DUkMgICAgIDB4MDIgLyogYml0IDEgc2V0OiBoZWFkZXIgQ1JDIHByZXNlbnQgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhFMCAvKiBiaXRzIDUuLjc6IHJlc2VydmVkICovCisKK3R5cGVkZWYgc3RydWN0IGd6X3N0cmVhbSB7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCAgICAgIHpfZXJyOyAgIC8qIGVycm9yIGNvZGUgZm9yIGxhc3Qgc3RyZWFtIG9wZXJhdGlvbiAqLworICAgIGludCAgICAgIHpfZW9mOyAgIC8qIHNldCBpZiBlbmQgb2YgaW5wdXQgZmlsZSAqLworICAgIEZJTEUgICAgICpmaWxlOyAgIC8qIC5neiBmaWxlICovCisgICAgQnl0ZSAgICAgKmluYnVmOyAgLyogaW5wdXQgYnVmZmVyICovCisgICAgQnl0ZSAgICAgKm91dGJ1ZjsgLyogb3V0cHV0IGJ1ZmZlciAqLworICAgIHVMb25nICAgIGNyYzsgICAgIC8qIGNyYzMyIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgY2hhciAgICAgKm1zZzsgICAgLyogZXJyb3IgbWVzc2FnZSAqLworICAgIGNoYXIgICAgICpwYXRoOyAgIC8qIHBhdGggbmFtZSBmb3IgZGVidWdnaW5nIG9ubHkgKi8KKyAgICBpbnQgICAgICB0cmFuc3BhcmVudDsgLyogMSBpZiBpbnB1dCBmaWxlIGlzIG5vdCBhIC5neiBmaWxlICovCisgICAgY2hhciAgICAgbW9kZTsgICAgLyogJ3cnIG9yICdyJyAqLworICAgIGxvbmcgICAgIHN0YXJ0cG9zOyAvKiBzdGFydCBvZiBjb21wcmVzc2VkIGRhdGEgaW4gZmlsZSAoaGVhZGVyIHNraXBwZWQpICovCit9IGd6X3N0cmVhbTsKKworCitsb2NhbCBnekZpbGUgZ3pfb3BlbiAgICAgIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlLCBpbnQgIGZkKSk7Citsb2NhbCBpbnQgZG9fZmx1c2ggICAgICAgIE9GKChnekZpbGUgZmlsZSwgaW50IGZsdXNoKSk7Citsb2NhbCBpbnQgICAgZ2V0X2J5dGUgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKK2xvY2FsIHZvaWQgICBjaGVja19oZWFkZXIgT0YoKGd6X3N0cmVhbSAqcykpOworbG9jYWwgaW50ICAgIGRlc3Ryb3kgICAgICBPRigoZ3pfc3RyZWFtICpzKSk7Citsb2NhbCB2b2lkICAgcHV0TG9uZyAgICAgIE9GKChGSUxFICpmaWxlLCB1TG9uZyB4KSk7Citsb2NhbCB1TG9uZyAgZ2V0TG9uZyAgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgorICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikuIFRoZSBmaWxlIGlzIGdpdmVuIGVpdGhlciBieSBmaWxlIGRlc2NyaXB0b3IKKyAgIG9yIHBhdGggbmFtZSAoaWYgZmQgPT0gLTEpLgorICAgICBnel9vcGVuIHJldHVybiBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCisgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCisgICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKKyAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLgorKi8KK2xvY2FsIGd6RmlsZSBnel9vcGVuIChwYXRoLCBtb2RlLCBmZCkKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7CisgICAgaW50ICBmZDsKK3sKKyAgICBpbnQgZXJyOworICAgIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsgLyogY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgICBpbnQgc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1k7IC8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovCisgICAgY2hhciAqcCA9IChjaGFyKiltb2RlOworICAgIGd6X3N0cmVhbSAqczsKKyAgICBjaGFyIGZtb2RlWzgwXTsgLyogY29weSBvZiBtb2RlLCB3aXRob3V0IHRoZSBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIGNoYXIgKm0gPSBmbW9kZTsKKworICAgIGlmICghcGF0aCB8fCAhbW9kZSkgcmV0dXJuIFpfTlVMTDsKKworICAgIHMgPSAoZ3pfc3RyZWFtICopQUxMT0Moc2l6ZW9mKGd6X3N0cmVhbSkpOworICAgIGlmICghcykgcmV0dXJuIFpfTlVMTDsKKworICAgIHMtPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHMtPnN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBzLT5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWYgPSBaX05VTEw7CisgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gWl9OVUxMOworICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IHMtPnN0cmVhbS5hdmFpbF9vdXQgPSAwOworICAgIHMtPmZpbGUgPSBOVUxMOworICAgIHMtPnpfZXJyID0gWl9PSzsKKyAgICBzLT56X2VvZiA9IDA7CisgICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgcy0+bXNnID0gTlVMTDsKKyAgICBzLT50cmFuc3BhcmVudCA9IDA7CisKKyAgICBzLT5wYXRoID0gKGNoYXIqKUFMTE9DKHN0cmxlbihwYXRoKSsxKTsKKyAgICBpZiAocy0+cGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKyAgICB9CisgICAgc3RyY3B5KHMtPnBhdGgsIHBhdGgpOyAvKiBkbyB0aGlzIGVhcmx5IGZvciBkZWJ1Z2dpbmcgKi8KKworICAgIHMtPm1vZGUgPSAnXDAnOworICAgIGRvIHsKKyAgICAgICAgaWYgKCpwID09ICdyJykgcy0+bW9kZSA9ICdyJzsKKyAgICAgICAgaWYgKCpwID09ICd3JyB8fCAqcCA9PSAnYScpIHMtPm1vZGUgPSAndyc7CisgICAgICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB7CisJICAgIGxldmVsID0gKnAgLSAnMCc7CisJfSBlbHNlIGlmICgqcCA9PSAnZicpIHsKKwkgIHN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKKwl9IGVsc2UgaWYgKCpwID09ICdoJykgeworCSAgc3RyYXRlZ3kgPSBaX0hVRkZNQU5fT05MWTsKKwl9IGVsc2UgeworCSAgICAqbSsrID0gKnA7IC8qIGNvcHkgdGhlIG1vZGUgKi8KKwl9CisgICAgfSB3aGlsZSAoKnArKyAmJiBtICE9IGZtb2RlICsgc2l6ZW9mKGZtb2RlKSk7CisgICAgaWYgKHMtPm1vZGUgPT0gJ1wwJykgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgIAorICAgIGlmIChzLT5tb2RlID09ICd3JykgeworI2lmZGVmIE5PX0RFRkxBVEUKKyAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJihzLT5zdHJlYW0pLCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIHN0cmF0ZWd5KTsKKyAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHN1cHByZXNzIHpsaWIgaGVhZGVyICovCisKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisjZW5kaWYKKyAgICAgICAgaWYgKGVyciAhPSBaX09LIHx8IHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luICA9IHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisKKyAgICAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCYocy0+c3RyZWFtKSwgLU1BWF9XQklUUyk7CisgICAgICAgIC8qIHdpbmRvd0JpdHMgaXMgcGFzc2VkIDwgMCB0byB0ZWxsIHRoYXQgdGhlcmUgaXMgbm8gemxpYiBoZWFkZXIuCisgICAgICAgICAqIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgaW5mbGF0ZSAqcmVxdWlyZXMqIGFuIGV4dHJhICJkdW1teSIgYnl0ZQorICAgICAgICAgKiBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0gaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgICogcmV0dXJuIFpfU1RSRUFNX0VORC4gSGVyZSB0aGUgZ3ppcCBDUkMzMiBlbnN1cmVzIHRoYXQgNCBieXRlcyBhcmUKKyAgICAgICAgICogcHJlc2VudCBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+aW5idWYgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKKworICAgIGVycm5vID0gMDsKKyAgICBzLT5maWxlID0gZmQgPCAwID8gRl9PUEVOKHBhdGgsIGZtb2RlKSA6IChGSUxFKilmZG9wZW4oZmQsIGZtb2RlKTsKKworICAgIGlmIChzLT5maWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgIH0KKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyAgICAgICAgLyogV3JpdGUgYSB2ZXJ5IHNpbXBsZSAuZ3ogaGVhZGVyOgorICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZihzLT5maWxlLCAiJWMlYyVjJWMlYyVjJWMlYyVjJWMiLCBnel9tYWdpY1swXSwgZ3pfbWFnaWNbMV0sCisgICAgICAgICAgICAgWl9ERUZMQVRFRCwgMCAvKmZsYWdzKi8sIDAsMCwwLDAgLyp0aW1lKi8sIDAgLyp4ZmxhZ3MqLywgT1NfQ09ERSk7CisJcy0+c3RhcnRwb3MgPSAxMEw7CisJLyogV2UgdXNlIDEwTCBpbnN0ZWFkIG9mIGZ0ZWxsKHMtPmZpbGUpIHRvIGJlY2F1c2UgZnRlbGwgY2F1c2VzIGFuCisgICAgICAgICAqIGZmbHVzaCBvbiBzb21lIHN5c3RlbXMuIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBkb2Vzbid0IHVzZQorICAgICAgICAgKiBzdGFydHBvcyBhbnl3YXkgaW4gd3JpdGUgbW9kZSwgc28gdGhpcyBpbml0aWFsaXphdGlvbiBpcyBub3QKKyAgICAgICAgICogbmVjZXNzYXJ5LgorICAgICAgICAgKi8KKyAgICB9IGVsc2UgeworCWNoZWNrX2hlYWRlcihzKTsgLyogc2tpcCB0aGUgLmd6IGhlYWRlciAqLworCXMtPnN0YXJ0cG9zID0gKGZ0ZWxsKHMtPmZpbGUpIC0gcy0+c3RyZWFtLmF2YWlsX2luKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChnekZpbGUpczsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisqLworZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuIChwYXRoLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbiAocGF0aCwgbW9kZSwgLTEpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgQXNzb2NpYXRlIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gZmQgaXMgbm90IGR1cCdlZCBoZXJlCisgICB0byBtaW1pYyB0aGUgYmVoYXZpbyh1KXIgb2YgZmRvcGVuLgorKi8KK2d6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gKGZkLCBtb2RlKQorICAgIGludCBmZDsKKyAgICBjb25zdCBjaGFyICptb2RlOworeworICAgIGNoYXIgbmFtZVsyMF07CisKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gKGd6RmlsZSlaX05VTEw7CisgICAgc3ByaW50ZihuYW1lLCAiPGZkOiVkPiIsIGZkKTsgLyogZm9yIGRlYnVnZ2luZyAqLworCisgICAgcmV0dXJuIGd6X29wZW4gKG5hbWUsIG1vZGUsIGZkKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBzdHJhdGVneQorICovCitpbnQgWkVYUE9SVCBnenNldHBhcmFtcyAoZmlsZSwgbGV2ZWwsIHN0cmF0ZWd5KQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc3RyYXRlZ3k7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIE1ha2Ugcm9vbSB0byBhbGxvdyBmbHVzaGluZyAqLworICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKworCXMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKKwlpZiAoZndyaXRlKHMtPm91dGJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKSAhPSBaX0JVRlNJWkUpIHsKKwkgICAgcy0+el9lcnIgPSBaX0VSUk5POworCX0KKwlzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworICAgIH0KKworICAgIHJldHVybiBkZWZsYXRlUGFyYW1zICgmKHMtPnN0cmVhbSksIGxldmVsLCBzdHJhdGVneSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZWFkIGEgYnl0ZSBmcm9tIGEgZ3pfc3RyZWFtOyB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4uIFJldHVybiBFT0YKKyAgIGZvciBlbmQgb2YgZmlsZS4KKyAgIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzIGhhcyBiZWVuIHN1Y2Vzc2Z1bGx5IG9wZW5lZCBmb3IgcmVhZGluZy4KKyovCitsb2NhbCBpbnQgZ2V0X2J5dGUocykKKyAgICBnel9zdHJlYW0gKnM7Cit7CisgICAgaWYgKHMtPnpfZW9mKSByZXR1cm4gRU9GOworICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgeworCWVycm5vID0gMDsKKwlzLT5zdHJlYW0uYXZhaWxfaW4gPSBmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKKwlpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKKwkgICAgcy0+el9lb2YgPSAxOworCSAgICBpZiAoZmVycm9yKHMtPmZpbGUpKSBzLT56X2VyciA9IFpfRVJSTk87CisJICAgIHJldHVybiBFT0Y7CisJfQorCXMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgfQorICAgIHMtPnN0cmVhbS5hdmFpbF9pbi0tOworICAgIHJldHVybiAqKHMtPnN0cmVhbS5uZXh0X2luKSsrOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIENoZWNrIHRoZSBnemlwIGhlYWRlciBvZiBhIGd6X3N0cmVhbSBvcGVuZWQgZm9yIHJlYWRpbmcuIFNldCB0aGUgc3RyZWFtCisgICAgbW9kZSB0byB0cmFuc3BhcmVudCBpZiB0aGUgZ3ppcCBtYWdpYyBoZWFkZXIgaXMgbm90IHByZXNlbnQ7IHNldCBzLT5lcnIKKyAgICB0byBaX0RBVEFfRVJST1IgaWYgdGhlIG1hZ2ljIGhlYWRlciBpcyBwcmVzZW50IGJ1dCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyCisgICAgaXMgaW5jb3JyZWN0LgorICAgIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBzdWNlc3NmdWxseTsKKyAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gaXMgemVybyBmb3IgdGhlIGZpcnN0IHRpbWUsIGJ1dCBtYXkgYmUgbm9uLXplcm8KKyAgICAgICBmb3IgY29uY2F0ZW5hdGVkIC5neiBmaWxlcy4KKyovCitsb2NhbCB2b2lkIGNoZWNrX2hlYWRlcihzKQorICAgIGd6X3N0cmVhbSAqczsKK3sKKyAgICBpbnQgbWV0aG9kOyAvKiBtZXRob2QgYnl0ZSAqLworICAgIGludCBmbGFnczsgIC8qIGZsYWdzIGJ5dGUgKi8KKyAgICB1SW50IGxlbjsKKyAgICBpbnQgYzsKKworICAgIC8qIENoZWNrIHRoZSBnemlwIG1hZ2ljIGhlYWRlciAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDwgMjsgbGVuKyspIHsKKwljID0gZ2V0X2J5dGUocyk7CisJaWYgKGMgIT0gZ3pfbWFnaWNbbGVuXSkgeworCSAgICBpZiAobGVuICE9IDApIHMtPnN0cmVhbS5hdmFpbF9pbisrLCBzLT5zdHJlYW0ubmV4dF9pbi0tOworCSAgICBpZiAoYyAhPSBFT0YpIHsKKwkJcy0+c3RyZWFtLmF2YWlsX2luKyssIHMtPnN0cmVhbS5uZXh0X2luLS07CisJCXMtPnRyYW5zcGFyZW50ID0gMTsKKwkgICAgfQorCSAgICBzLT56X2VyciA9IHMtPnN0cmVhbS5hdmFpbF9pbiAhPSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgbWV0aG9kID0gZ2V0X2J5dGUocyk7CisgICAgZmxhZ3MgPSBnZXRfYnl0ZShzKTsKKyAgICBpZiAobWV0aG9kICE9IFpfREVGTEFURUQgfHwgKGZsYWdzICYgUkVTRVJWRUQpICE9IDApIHsKKwlzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogRGlzY2FyZCB0aW1lLCB4ZmxhZ3MgYW5kIE9TIGNvZGU6ICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCA2OyBsZW4rKykgKHZvaWQpZ2V0X2J5dGUocyk7CisKKyAgICBpZiAoKGZsYWdzICYgRVhUUkFfRklFTEQpICE9IDApIHsgLyogc2tpcCB0aGUgZXh0cmEgZmllbGQgKi8KKwlsZW4gID0gICh1SW50KWdldF9ieXRlKHMpOworCWxlbiArPSAoKHVJbnQpZ2V0X2J5dGUocykpPDw4OworCS8qIGxlbiBpcyBnYXJiYWdlIGlmIEVPRiBidXQgdGhlIGxvb3AgYmVsb3cgd2lsbCBxdWl0IGFueXdheSAqLworCXdoaWxlIChsZW4tLSAhPSAwICYmIGdldF9ieXRlKHMpICE9IEVPRikgOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgT1JJR19OQU1FKSAhPSAwKSB7IC8qIHNraXAgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSAqLworCXdoaWxlICgoYyA9IGdldF9ieXRlKHMpKSAhPSAwICYmIGMgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBDT01NRU5UKSAhPSAwKSB7ICAgLyogc2tpcCB0aGUgLmd6IGZpbGUgY29tbWVudCAqLworCXdoaWxlICgoYyA9IGdldF9ieXRlKHMpKSAhPSAwICYmIGMgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBIRUFEX0NSQykgIT0gMCkgeyAgLyogc2tpcCB0aGUgaGVhZGVyIGNyYyAqLworCWZvciAobGVuID0gMDsgbGVuIDwgMjsgbGVuKyspICh2b2lkKWdldF9ieXRlKHMpOworICAgIH0KKyAgICBzLT56X2VyciA9IHMtPnpfZW9mID8gWl9EQVRBX0VSUk9SIDogWl9PSzsKK30KKworIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xlYW51cCB0aGVuIGZyZWUgdGhlIGdpdmVuIGd6X3N0cmVhbS4gUmV0dXJuIGEgemxpYiBlcnJvciBjb2RlLgorICAgVHJ5IGZyZWVpbmcgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbnMuCisgKi8KK2xvY2FsIGludCBkZXN0cm95IChzKQorICAgIGd6X3N0cmVhbSAqczsKK3sKKyAgICBpbnQgZXJyID0gWl9PSzsKKworICAgIGlmICghcykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgVFJZRlJFRShzLT5tc2cpOworCisgICAgaWYgKHMtPnN0cmVhbS5zdGF0ZSAhPSBOVUxMKSB7CisJaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fREVGTEFURQorCSAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisJICAgIGVyciA9IGRlZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAocy0+bW9kZSA9PSAncicpIHsKKwkgICAgZXJyID0gaW5mbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOworCX0KKyAgICB9CisgICAgaWYgKHMtPmZpbGUgIT0gTlVMTCAmJiBmY2xvc2Uocy0+ZmlsZSkpIHsKKyNpZmRlZiBFU1BJUEUKKwlpZiAoZXJybm8gIT0gRVNQSVBFKSAvKiBmY2xvc2UgaXMgYnJva2VuIGZvciBwaXBlcyBpbiBIUC9VWCAqLworI2VuZGlmCisJICAgIGVyciA9IFpfRVJSTk87CisgICAgfQorICAgIGlmIChzLT56X2VyciA8IDApIGVyciA9IHMtPnpfZXJyOworCisgICAgVFJZRlJFRShzLT5pbmJ1Zik7CisgICAgVFJZRlJFRShzLT5vdXRidWYpOworICAgIFRSWUZSRUUocy0+cGF0aCk7CisgICAgVFJZRlJFRShzKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkICgwIGZvciBlbmQgb2YgZmlsZSkuCisqLworaW50IFpFWFBPUlQgZ3pyZWFkIChmaWxlLCBidWYsIGxlbikKKyAgICBnekZpbGUgZmlsZTsKKyAgICB2b2lkcCBidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisgICAgQnl0ZWYgKnN0YXJ0ID0gKEJ5dGVmKilidWY7IC8qIHN0YXJ0aW5nIHBvaW50IGZvciBjcmMgY29tcHV0YXRpb24gKi8KKyAgICBCeXRlICAqbmV4dF9vdXQ7IC8qID09IHN0cmVhbS5uZXh0X291dCBidXQgbm90IGZvcmNlZCBmYXIgKGZvciBNU0RPUykgKi8KKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIGlmIChzLT56X2VyciA9PSBaX0RBVEFfRVJST1IgfHwgcy0+el9lcnIgPT0gWl9FUlJOTykgcmV0dXJuIC0xOworICAgIGlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHJldHVybiAwOyAgLyogRU9GICovCisKKyAgICBuZXh0X291dCA9IChCeXRlKilidWY7CisgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7CisgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IGxlbjsKKworICAgIHdoaWxlIChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDApIHsKKworCWlmIChzLT50cmFuc3BhcmVudCkgeworCSAgICAvKiBDb3B5IGZpcnN0IHRoZSBsb29rYWhlYWQgYnl0ZXM6ICovCisJICAgIHVJbnQgbiA9IHMtPnN0cmVhbS5hdmFpbF9pbjsKKwkgICAgaWYgKG4gPiBzLT5zdHJlYW0uYXZhaWxfb3V0KSBuID0gcy0+c3RyZWFtLmF2YWlsX291dDsKKwkgICAgaWYgKG4gPiAwKSB7CisJCXptZW1jcHkocy0+c3RyZWFtLm5leHRfb3V0LCBzLT5zdHJlYW0ubmV4dF9pbiwgbik7CisJCW5leHRfb3V0ICs9IG47CisJCXMtPnN0cmVhbS5uZXh0X291dCA9IG5leHRfb3V0OworCQlzLT5zdHJlYW0ubmV4dF9pbiAgICs9IG47CisJCXMtPnN0cmVhbS5hdmFpbF9vdXQgLT0gbjsKKwkJcy0+c3RyZWFtLmF2YWlsX2luICAtPSBuOworCSAgICB9CisJICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID4gMCkgeworCQlzLT5zdHJlYW0uYXZhaWxfb3V0IC09IGZyZWFkKG5leHRfb3V0LCAxLCBzLT5zdHJlYW0uYXZhaWxfb3V0LAorCQkJCQkgICAgIHMtPmZpbGUpOworCSAgICB9CisJICAgIGxlbiAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworCSAgICBzLT5zdHJlYW0udG90YWxfaW4gICs9ICh1TG9uZylsZW47CisJICAgIHMtPnN0cmVhbS50b3RhbF9vdXQgKz0gKHVMb25nKWxlbjsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgcy0+el9lb2YgPSAxOworCSAgICByZXR1cm4gKGludClsZW47CisJfQorICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDAgJiYgIXMtPnpfZW9mKSB7CisKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IGZyZWFkKHMtPmluYnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpOworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+el9lb2YgPSAxOworCQlpZiAoZmVycm9yKHMtPmZpbGUpKSB7CisJCSAgICBzLT56X2VyciA9IFpfRVJSTk87CisJCSAgICBicmVhazsKKwkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICAgICAgfQorICAgICAgICBzLT56X2VyciA9IGluZmxhdGUoJihzLT5zdHJlYW0pLCBaX05PX0ZMVVNIKTsKKworCWlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHsKKwkgICAgLyogQ2hlY2sgQ1JDIGFuZCBvcmlnaW5hbCBzaXplICovCisJICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgc3RhcnQsICh1SW50KShzLT5zdHJlYW0ubmV4dF9vdXQgLSBzdGFydCkpOworCSAgICBzdGFydCA9IHMtPnN0cmVhbS5uZXh0X291dDsKKworCSAgICBpZiAoZ2V0TG9uZyhzKSAhPSBzLT5jcmMpIHsKKwkJcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7CisJICAgIH0gZWxzZSB7CisJICAgICAgICAodm9pZClnZXRMb25nKHMpOworICAgICAgICAgICAgICAgIC8qIFRoZSB1bmNvbXByZXNzZWQgbGVuZ3RoIHJldHVybmVkIGJ5IGFib3ZlIGdldGxvbmcoKSBtYXkKKyAgICAgICAgICAgICAgICAgKiBiZSBkaWZmZXJlbnQgZnJvbSBzLT5zdHJlYW0udG90YWxfb3V0KSBpbiBjYXNlIG9mCisJCSAqIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMuIENoZWNrIGZvciBzdWNoIGZpbGVzOgorCQkgKi8KKwkJY2hlY2tfaGVhZGVyKHMpOworCQlpZiAocy0+el9lcnIgPT0gWl9PSykgeworCQkgICAgdUxvbmcgdG90YWxfaW4gPSBzLT5zdHJlYW0udG90YWxfaW47CisJCSAgICB1TG9uZyB0b3RhbF9vdXQgPSBzLT5zdHJlYW0udG90YWxfb3V0OworCisJCSAgICBpbmZsYXRlUmVzZXQoJihzLT5zdHJlYW0pKTsKKwkJICAgIHMtPnN0cmVhbS50b3RhbF9pbiA9IHRvdGFsX2luOworCQkgICAgcy0+c3RyZWFtLnRvdGFsX291dCA9IHRvdGFsX291dDsKKwkJICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCQl9CisJICAgIH0KKwl9CisJaWYgKHMtPnpfZXJyICE9IFpfT0sgfHwgcy0+el9lb2YpIGJyZWFrOworICAgIH0KKyAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIHN0YXJ0LCAodUludCkocy0+c3RyZWFtLm5leHRfb3V0IC0gc3RhcnQpKTsKKworICAgIHJldHVybiAoaW50KShsZW4gLSBzLT5zdHJlYW0uYXZhaWxfb3V0KTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gZ3pnZXRjIHJldHVybnMgdGhpcyBieXRlCisgICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgorKi8KK2ludCBaRVhQT1JUIGd6Z2V0YyhmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIHVuc2lnbmVkIGNoYXIgYzsKKworICAgIHJldHVybiBnenJlYWQoZmlsZSwgJmMsIDEpID09IDEgPyBjIDogLTE7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUKKyAgIHJlYWQsIG9yIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbgorICAgZW5kLW9mLWZpbGUgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQKKyAgIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KKyAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisKKyAgICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBvcHRpbWl6ZWQgYXQgYWxsLgorKi8KK2NoYXIgKiBaRVhQT1JUIGd6Z2V0cyhmaWxlLCBidWYsIGxlbikKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbjsKK3sKKyAgICBjaGFyICpiID0gYnVmOworICAgIGlmIChidWYgPT0gWl9OVUxMIHx8IGxlbiA8PSAwKSByZXR1cm4gWl9OVUxMOworCisgICAgd2hpbGUgKC0tbGVuID4gMCAmJiBnenJlYWQoZmlsZSwgYnVmLCAxKSA9PSAxICYmICpidWYrKyAhPSAnXG4nKSA7CisgICAgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIGIgPT0gYnVmICYmIGxlbiA+IDAgPyBaX05VTEwgOiBiOworfQorCisKKyNpZm5kZWYgTk9fREVGTEFURQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KK2ludCBaRVhQT1JUIGd6d3JpdGUgKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNvbnN0IHZvaWRwIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHMtPnN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilidWY7CisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gbGVuOworCisgICAgd2hpbGUgKHMtPnN0cmVhbS5hdmFpbF9pbiAhPSAwKSB7CisKKyAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworCisgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7CisgICAgICAgICAgICBpZiAoZndyaXRlKHMtPm91dGJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKSAhPSBaX0JVRlNJWkUpIHsKKyAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworICAgICAgICB9CisgICAgICAgIHMtPnpfZXJyID0gZGVmbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSykgYnJlYWs7CisgICAgfQorICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgKGNvbnN0IEJ5dGVmICopYnVmLCBsZW4pOworCisgICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9pbik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KKyNpZmRlZiBTVERDCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBaRVhQT1JUVkEgZ3pwcmludGYgKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC8qIGFyZ3MgKi8gLi4uKQoreworICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOworICAgIHZhX2xpc3QgdmE7CisgICAgaW50IGxlbjsKKworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworI2lmZGVmIEhBU192c25wcmludGYKKyAgICAodm9pZCl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB2YSk7CisjZWxzZQorICAgICh2b2lkKXZzcHJpbnRmKGJ1ZiwgZm9ybWF0LCB2YSk7CisjZW5kaWYKKyAgICB2YV9lbmQodmEpOworICAgIGxlbiA9IHN0cmxlbihidWYpOyAvKiBzb21lICpzcHJpbnRmIGRvbid0IHJldHVybiB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiAqLworICAgIGlmIChsZW4gPD0gMCkgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCBidWYsICh1bnNpZ25lZClsZW4pOworfQorI2Vsc2UgLyogbm90IEFOU0kgQyAqLworCitpbnQgWkVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKwkgICAgICAgICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApCisgICAgZ3pGaWxlIGZpbGU7CisgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgIGludCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsCisJYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwOworeworICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOworICAgIGludCBsZW47CisKKyNpZmRlZiBIQVNfc25wcmludGYKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKwkgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisjZWxzZQorICAgIHNwcmludGYoYnVmLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKwkgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyNlbmRpZgorICAgIGxlbiA9IHN0cmxlbihidWYpOyAvKiBvbGQgc3ByaW50ZiBkb2Vzbid0IHJldHVybiB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiAqLworICAgIGlmIChsZW4gPD0gMCkgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCBidWYsIGxlbik7Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6cHV0YyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KK2ludCBaRVhQT1JUIGd6cHV0YyhmaWxlLCBjKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBjOworeworICAgIHVuc2lnbmVkIGNoYXIgY2MgPSAodW5zaWduZWQgY2hhcikgYzsgLyogcmVxdWlyZWQgZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAqLworCisgICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgJmNjLCAxKSA9PSAxID8gKGludCljYyA6IC0xOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorICAgICAgZ3pwdXRzIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworaW50IFpFWFBPUlQgZ3pwdXRzKGZpbGUsIHMpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgY29uc3QgY2hhciAqczsKK3sKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCAoY2hhciopcywgKHVuc2lnbmVkKXN0cmxlbihzKSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgorICAgZmx1c2ggaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4KKyovCitsb2NhbCBpbnQgZG9fZmx1c2ggKGZpbGUsIGZsdXNoKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBmbHVzaDsKK3sKKyAgICB1SW50IGxlbjsKKyAgICBpbnQgZG9uZSA9IDA7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7IC8qIHNob3VsZCBiZSB6ZXJvIGFscmVhZHkgYW55d2F5ICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxlbiA9IFpfQlVGU0laRSAtIHMtPnN0cmVhbS5hdmFpbF9vdXQ7CisKKyAgICAgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHVJbnQpZndyaXRlKHMtPm91dGJ1ZiwgMSwgbGVuLCBzLT5maWxlKSAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7CisgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworICAgICAgICB9CisgICAgICAgIGlmIChkb25lKSBicmVhazsKKyAgICAgICAgcy0+el9lcnIgPSBkZWZsYXRlKCYocy0+c3RyZWFtKSwgZmx1c2gpOworCisJLyogSWdub3JlIHRoZSBzZWNvbmQgb2YgdHdvIGNvbnNlY3V0aXZlIGZsdXNoZXM6ICovCisJaWYgKGxlbiA9PSAwICYmIHMtPnpfZXJyID09IFpfQlVGX0VSUk9SKSBzLT56X2VyciA9IFpfT0s7CisKKyAgICAgICAgLyogZGVmbGF0ZSBoYXMgZmluaXNoZWQgZmx1c2hpbmcgb25seSB3aGVuIGl0IGhhc24ndCB1c2VkIHVwCisgICAgICAgICAqIGFsbCB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyOiAKKyAgICAgICAgICovCisgICAgICAgIGRvbmUgPSAocy0+c3RyZWFtLmF2YWlsX291dCAhPSAwIHx8IHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCk7CisgCisgICAgICAgIGlmIChzLT56X2VyciAhPSBaX09LICYmIHMtPnpfZXJyICE9IFpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IHMtPnpfZXJyOworfQorCitpbnQgWkVYUE9SVCBnemZsdXNoIChmaWxlLCBmbHVzaCkKKyAgICAgZ3pGaWxlIGZpbGU7CisgICAgIGludCBmbHVzaDsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworICAgIGludCBlcnIgPSBkb19mbHVzaCAoZmlsZSwgZmx1c2gpOworCisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBmZmx1c2gocy0+ZmlsZSk7CisgICAgcmV0dXJuICBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogcy0+el9lcnI7Cit9CisjZW5kaWYgLyogTk9fREVGTEFURSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgICAgZ3pzZWVrIHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgIFNFRUtfRU5EIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJucyBlcnJvci4KKyAgICAgIEluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgZ3pzZWVrIGNhbiBiZSBleHRyZW1lbHkgc2xvdy4KKyovCit6X29mZl90IFpFWFBPUlQgZ3pzZWVrIChmaWxlLCBvZmZzZXQsIHdoZW5jZSkKKyAgICBnekZpbGUgZmlsZTsKKyAgICB6X29mZl90IG9mZnNldDsKKyAgICBpbnQgd2hlbmNlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHdoZW5jZSA9PSBTRUVLX0VORCB8fAorCXMtPnpfZXJyID09IFpfRVJSTk8gfHwgcy0+el9lcnIgPT0gWl9EQVRBX0VSUk9SKSB7CisJcmV0dXJuIC0xTDsKKyAgICB9CisgICAgCisgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fREVGTEFURQorCXJldHVybiAtMUw7CisjZWxzZQorCWlmICh3aGVuY2UgPT0gU0VFS19TRVQpIHsKKwkgICAgb2Zmc2V0IC09IHMtPnN0cmVhbS50b3RhbF9pbjsKKwl9CisJaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7CisKKwkvKiBBdCB0aGlzIHBvaW50LCBvZmZzZXQgaXMgdGhlIG51bWJlciBvZiB6ZXJvIGJ5dGVzIHRvIHdyaXRlLiAqLworCWlmIChzLT5pbmJ1ZiA9PSBaX05VTEwpIHsKKwkgICAgcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsgLyogZm9yIHNlZWtpbmcgKi8KKwkgICAgem1lbXplcm8ocy0+aW5idWYsIFpfQlVGU0laRSk7CisJfQorCXdoaWxlIChvZmZzZXQgPiAwKSAgeworCSAgICB1SW50IHNpemUgPSBaX0JVRlNJWkU7CisJICAgIGlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAodUludClvZmZzZXQ7CisKKwkgICAgc2l6ZSA9IGd6d3JpdGUoZmlsZSwgcy0+aW5idWYsIHNpemUpOworCSAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gLTFMOworCisJICAgIG9mZnNldCAtPSBzaXplOworCX0KKwlyZXR1cm4gKHpfb2ZmX3Qpcy0+c3RyZWFtLnRvdGFsX2luOworI2VuZGlmCisgICAgfQorICAgIC8qIFJlc3Qgb2YgZnVuY3Rpb24gaXMgZm9yIHJlYWRpbmcgb25seSAqLworCisgICAgLyogY29tcHV0ZSBhYnNvbHV0ZSBwb3NpdGlvbiAqLworICAgIGlmICh3aGVuY2UgPT0gU0VFS19DVVIpIHsKKwlvZmZzZXQgKz0gcy0+c3RyZWFtLnRvdGFsX291dDsKKyAgICB9CisgICAgaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7CisKKyAgICBpZiAocy0+dHJhbnNwYXJlbnQpIHsKKwkvKiBtYXAgdG8gZnNlZWsgKi8KKwlzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworCXMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgICAgIGlmIChmc2VlayhzLT5maWxlLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApIHJldHVybiAtMUw7CisKKwlzLT5zdHJlYW0udG90YWxfaW4gPSBzLT5zdHJlYW0udG90YWxfb3V0ID0gKHVMb25nKW9mZnNldDsKKwlyZXR1cm4gb2Zmc2V0OworICAgIH0KKworICAgIC8qIEZvciBhIG5lZ2F0aXZlIHNlZWssIHJld2luZCBhbmQgdXNlIHBvc2l0aXZlIHNlZWsgKi8KKyAgICBpZiAoKHVMb25nKW9mZnNldCA+PSBzLT5zdHJlYW0udG90YWxfb3V0KSB7CisJb2Zmc2V0IC09IHMtPnN0cmVhbS50b3RhbF9vdXQ7CisgICAgfSBlbHNlIGlmIChnenJld2luZChmaWxlKSA8IDApIHsKKwlyZXR1cm4gLTFMOworICAgIH0KKyAgICAvKiBvZmZzZXQgaXMgbm93IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4gKi8KKworICAgIGlmIChvZmZzZXQgIT0gMCAmJiBzLT5vdXRidWYgPT0gWl9OVUxMKSB7CisJcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisgICAgfQorICAgIHdoaWxlIChvZmZzZXQgPiAwKSAgeworCWludCBzaXplID0gWl9CVUZTSVpFOworCWlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAoaW50KW9mZnNldDsKKworCXNpemUgPSBnenJlYWQoZmlsZSwgcy0+b3V0YnVmLCAodUludClzaXplKTsKKwlpZiAoc2l6ZSA8PSAwKSByZXR1cm4gLTFMOworCW9mZnNldCAtPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gKHpfb2ZmX3Qpcy0+c3RyZWFtLnRvdGFsX291dDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJld2luZHMgaW5wdXQgZmlsZS4gCisqLworaW50IFpFWFBPUlQgZ3pyZXdpbmQgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICAKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gLTE7CisKKyAgICBzLT56X2VyciA9IFpfT0s7CisgICAgcy0+el9lb2YgPSAwOworICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKwkKKyAgICBpZiAocy0+c3RhcnRwb3MgPT0gMCkgeyAvKiBub3QgYSBjb21wcmVzc2VkIGZpbGUgKi8KKwlyZXdpbmQocy0+ZmlsZSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgKHZvaWQpIGluZmxhdGVSZXNldCgmcy0+c3RyZWFtKTsKKyAgICByZXR1cm4gZnNlZWsocy0+ZmlsZSwgcy0+c3RhcnRwb3MsIFNFRUtfU0VUKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorKi8KK3pfb2ZmX3QgWkVYUE9SVCBnenRlbGwgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgcmV0dXJuIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KKyAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisqLworaW50IFpFWFBPUlQgZ3plb2YgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICAKKyAgICByZXR1cm4gKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJykgPyAwIDogcy0+el9lb2Y7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgT3V0cHV0cyBhIGxvbmcgaW4gTFNCIG9yZGVyIHRvIHRoZSBnaXZlbiBmaWxlCisqLworbG9jYWwgdm9pZCBwdXRMb25nIChmaWxlLCB4KQorICAgIEZJTEUgKmZpbGU7CisgICAgdUxvbmcgeDsKK3sKKyAgICBpbnQgbjsKKyAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CisgICAgICAgIGZwdXRjKChpbnQpKHggJiAweGZmKSwgZmlsZSk7CisgICAgICAgIHggPj49IDg7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzIHpfZXJyIGluIGNhc2UKKyAgIG9mIGVycm9yLgorKi8KK2xvY2FsIHVMb25nIGdldExvbmcgKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIHVMb25nIHggPSAodUxvbmcpZ2V0X2J5dGUocyk7CisgICAgaW50IGM7CisKKyAgICB4ICs9ICgodUxvbmcpZ2V0X2J5dGUocykpPDw4OworICAgIHggKz0gKCh1TG9uZylnZXRfYnl0ZShzKSk8PDE2OworICAgIGMgPSBnZXRfYnl0ZShzKTsKKyAgICBpZiAoYyA9PSBFT0YpIHMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOworICAgIHggKz0gKCh1TG9uZyljKTw8MjQ7CisgICAgcmV0dXJuIHg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCisqLworaW50IFpFWFBPUlQgZ3pjbG9zZSAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBpbnQgZXJyOworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19ERUZMQVRFCisJcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgZXJyID0gZG9fZmx1c2ggKGZpbGUsIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKGVyciAhPSBaX09LKSByZXR1cm4gZGVzdHJveSgoZ3pfc3RyZWFtKilmaWxlKTsKKworICAgICAgICBwdXRMb25nIChzLT5maWxlLCBzLT5jcmMpOworICAgICAgICBwdXRMb25nIChzLT5maWxlLCBzLT5zdHJlYW0udG90YWxfaW4pOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBkZXN0cm95KChnel9zdHJlYW0qKWZpbGUpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJlZCBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KKyAgIGVycm9yIG9jY3VyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCisgICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorKi8KK2NvbnN0IGNoYXIqICBaRVhQT1JUIGd6ZXJyb3IgKGZpbGUsIGVycm51bSkKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgKmVycm51bTsKK3sKKyAgICBjaGFyICptOworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgICplcnJudW0gPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIChjb25zdCBjaGFyKilFUlJfTVNHKFpfU1RSRUFNX0VSUk9SKTsKKyAgICB9CisgICAgKmVycm51bSA9IHMtPnpfZXJyOworICAgIGlmICgqZXJybnVtID09IFpfT0spIHJldHVybiAoY29uc3QgY2hhciopIiI7CisKKyAgICBtID0gIChjaGFyKikoKmVycm51bSA9PSBaX0VSUk5PID8genN0cmVycm9yKGVycm5vKSA6IHMtPnN0cmVhbS5tc2cpOworCisgICAgaWYgKG0gPT0gTlVMTCB8fCAqbSA9PSAnXDAnKSBtID0gKGNoYXIqKUVSUl9NU0cocy0+el9lcnIpOworCisgICAgVFJZRlJFRShzLT5tc2cpOworICAgIHMtPm1zZyA9IChjaGFyKilBTExPQyhzdHJsZW4ocy0+cGF0aCkgKyBzdHJsZW4obSkgKyAzKTsKKyAgICBzdHJjcHkocy0+bXNnLCBzLT5wYXRoKTsKKyAgICBzdHJjYXQocy0+bXNnLCAiOiAiKTsKKyAgICBzdHJjYXQocy0+bXNnLCBtKTsKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIqKXMtPm1zZzsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2luZmJsb2NrLmMgYi9jb21tb24vemxpYi9pbmZibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2E2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9pbmZibG9jay5jCkBAIC0wLDAgKzEsNDAzIEBACisvKiBpbmZibG9jay5jIC0tIGludGVycHJldCBhbmQgcHJvY2VzcyBibG9jayB0eXBlcyB0byBsYXN0IGJsb2NrCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZmJsb2NrLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZjb2Rlcy5oIgorI2luY2x1ZGUgImluZnV0aWwuaCIKKworc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKKy8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCisjZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKKyNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cworCisvKiBUYWJsZSBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCitsb2NhbCBjb25zdCB1SW50IGJvcmRlcltdID0geyAvKiBPcmRlciBvZiB0aGUgYml0IGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CisKKy8qCisgICBOb3RlcyBiZXlvbmQgdGhlIDEuOTNhIGFwcG5vdGUudHh0OgorCisgICAxLiBEaXN0YW5jZSBwb2ludGVycyBuZXZlciBwb2ludCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0CisgICAgICBzdHJlYW0uCisgICAyLiBEaXN0YW5jZSBwb2ludGVycyBjYW4gcG9pbnQgYmFjayBhY3Jvc3MgYmxvY2tzLCB1cCB0byAzMmsgYXdheS4KKyAgIDMuIFRoZXJlIGlzIGFuIGltcGxpZWQgbWF4aW11bSBvZiA3IGJpdHMgZm9yIHRoZSBiaXQgbGVuZ3RoIHRhYmxlIGFuZAorICAgICAgMTUgYml0cyBmb3IgdGhlIGFjdHVhbCBkYXRhLgorICAgNC4gSWYgb25seSBvbmUgY29kZSBleGlzdHMsIHRoZW4gaXQgaXMgZW5jb2RlZCB1c2luZyBvbmUgYml0LiAgKFplcm8KKyAgICAgIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgcGVyaGFwcyBhIGxpdHRsZSBjb25mdXNpbmcuKSAgSWYgdHdvCisgICAgICBjb2RlcyBleGlzdCwgdGhleSBhcmUgY29kZWQgdXNpbmcgb25lIGJpdCBlYWNoICgwIGFuZCAxKS4KKyAgIDUuIFRoZXJlIGlzIG5vIHdheSBvZiBzZW5kaW5nIHplcm8gZGlzdGFuY2UgY29kZXMtLWEgZHVtbXkgbXVzdCBiZQorICAgICAgc2VudCBpZiB0aGVyZSBhcmUgbm9uZS4gIChIaXN0b3J5OiBhIHByZSAyLjAgdmVyc2lvbiBvZiBQS1pJUCB3b3VsZAorICAgICAgc3RvcmUgYmxvY2tzIHdpdGggbm8gZGlzdGFuY2UgY29kZXMsIGJ1dCB0aGlzIHdhcyBkaXNjb3ZlcmVkIHRvIGJlCisgICAgICB0b28gaGFyc2ggYSBjcml0ZXJpb24uKSAgVmFsaWQgb25seSBmb3IgMS45M2EuICAyLjA0YyBkb2VzIGFsbG93CisgICAgICB6ZXJvIGRpc3RhbmNlIGNvZGVzLCB3aGljaCBpcyBzZW50IGFzIG9uZSBjb2RlIG9mIHplcm8gYml0cyBpbgorICAgICAgbGVuZ3RoLgorICAgNi4gVGhlcmUgYXJlIHVwIHRvIDI4NiBsaXRlcmFsL2xlbmd0aCBjb2Rlcy4gIENvZGUgMjU2IHJlcHJlc2VudHMgdGhlCisgICAgICBlbmQtb2YtYmxvY2suICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgc3RhdGljIGxlbmd0aCB0cmVlIGRlZmluZXMKKyAgICAgIDI4OCBjb2RlcyBqdXN0IHRvIGZpbGwgb3V0IHRoZSBIdWZmbWFuIGNvZGVzLiAgQ29kZXMgMjg2IGFuZCAyODcKKyAgICAgIGNhbm5vdCBiZSB1c2VkIHRob3VnaCwgc2luY2UgdGhlcmUgaXMgbm8gbGVuZ3RoIGJhc2Ugb3IgZXh0cmEgYml0cworICAgICAgZGVmaW5lZCBmb3IgdGhlbS4gIFNpbWlsYXJpbHksIHRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBjb2Rlcy4KKyAgICAgIEhvd2V2ZXIsIHN0YXRpYyB0cmVlcyBkZWZpbmUgMzIgY29kZXMgKGFsbCA1IGJpdHMpIHRvIGZpbGwgb3V0IHRoZQorICAgICAgSHVmZm1hbiBjb2RlcywgYnV0IHRoZSBsYXN0IHR3byBoYWQgYmV0dGVyIG5vdCBzaG93IHVwIGluIHRoZSBkYXRhLgorICAgNy4gVW56aXAgY2FuIGNoZWNrIGR5bmFtaWMgSHVmZm1hbiBibG9ja3MgZm9yIGNvbXBsZXRlIGNvZGUgc2V0cy4KKyAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhhdCBhIHNpbmdsZSBjb2RlIHdvdWxkIG5vdCBiZSBjb21wbGV0ZSAoc2VlICM0KS4KKyAgIDguIFRoZSBmaXZlIGJpdHMgZm9sbG93aW5nIHRoZSBibG9jayB0eXBlIGlzIHJlYWxseSB0aGUgbnVtYmVyIG9mCisgICAgICBsaXRlcmFsIGNvZGVzIHNlbnQgbWludXMgMjU3LgorICAgOS4gTGVuZ3RoIGNvZGVzIDgsMTYsMTYgYXJlIGludGVycHJldGVkIGFzIDEzIGxlbmd0aCBjb2RlcyBvZiA4IGJpdHMKKyAgICAgICgxKzYrNikuICBUaGVyZWZvcmUsIHRvIG91dHB1dCB0aHJlZSB0aW1lcyB0aGUgbGVuZ3RoLCB5b3Ugb3V0cHV0CisgICAgICB0aHJlZSBjb2RlcyAoMSsxKzEpLCB3aGVyZWFzIHRvIG91dHB1dCBmb3VyIHRpbWVzIHRoZSBzYW1lIGxlbmd0aCwKKyAgICAgIHlvdSBvbmx5IG5lZWQgdHdvIGNvZGVzICgxKzMpLiAgSG1tLgorICAxMC4gSW4gdGhlIHRyZWUgcmVjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLCBDb2RlID0gQ29kZSArIEluY3JlbWVudAorICAgICAgb25seSBpZiBCaXRMZW5ndGgoaSkgaXMgbm90IHplcm8uICAoUHJldHR5IG9idmlvdXMuKQorICAxMS4gQ29ycmVjdGlvbjogNCBCaXRzOiAjIG9mIEJpdCBMZW5ndGggY29kZXMgLSA0ICAgICAoNCAtIDE5KQorICAxMi4gTm90ZTogbGVuZ3RoIGNvZGUgMjg0IGNhbiByZXByZXNlbnQgMjI3LTI1OCwgYnV0IGxlbmd0aCBjb2RlIDI4NQorICAgICAgcmVhbGx5IGlzIDI1OC4gIFRoZSBsYXN0IGxlbmd0aCBkZXNlcnZlcyBpdHMgb3duLCBzaG9ydCBjb2RlCisgICAgICBzaW5jZSBpdCBnZXRzIHVzZWQgYSBsb3QgaW4gdmVyeSByZWR1bmRhbnQgZmlsZXMuICBUaGUgbGVuZ3RoCisgICAgICAyNTggaXMgc3BlY2lhbCBzaW5jZSAyNTggLSAzICh0aGUgbWluIG1hdGNoIGxlbmd0aCkgaXMgMjU1LgorICAxMy4gVGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGJpdCBsZW5ndGhzIGFyZSByZWFkIGFzIGEKKyAgICAgIHNpbmdsZSBzdHJlYW0gb2YgbGVuZ3Rocy4gIEl0IGlzIHBvc3NpYmxlIChhbmQgYWR2YW50YWdlb3VzKSBmb3IKKyAgICAgIGEgcmVwZWF0IGNvZGUgKDE2LCAxNywgb3IgMTgpIHRvIGdvIGFjcm9zcyB0aGUgYm91bmRhcnkgYmV0d2VlbgorICAgICAgdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCisgKi8KKworCit2b2lkIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIGMpCitpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Cit6X3N0cmVhbXAgejsKK3VMb25nZiAqYzsKK3sKKyAgaWYgKGMgIT0gWl9OVUxMKQorICAgICpjID0gcy0+Y2hlY2s7CisgIGlmIChzLT5tb2RlID09IEJUUkVFIHx8IHMtPm1vZGUgPT0gRFRSRUUpCisgICAgWkZSRUUoeiwgcy0+c3ViLnRyZWVzLmJsZW5zKTsKKyAgaWYgKHMtPm1vZGUgPT0gQ09ERVMpCisgICAgaW5mbGF0ZV9jb2Rlc19mcmVlKHMtPnN1Yi5kZWNvZGUuY29kZXMsIHopOworICBzLT5tb2RlID0gVFlQRTsKKyAgcy0+Yml0ayA9IDA7CisgIHMtPmJpdGIgPSAwOworICBzLT5yZWFkID0gcy0+d3JpdGUgPSBzLT53aW5kb3c7CisgIGlmIChzLT5jaGVja2ZuICE9IFpfTlVMTCkKKyAgICB6LT5hZGxlciA9IHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKSgwTCwgKGNvbnN0IEJ5dGVmICopWl9OVUxMLCAwKTsKKyAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGJsb2NrcyByZXNldFxuIikpOworfQorCisKK2luZmxhdGVfYmxvY2tzX3N0YXRlZiAqaW5mbGF0ZV9ibG9ja3NfbmV3KHosIGMsIHcpCit6X3N0cmVhbXAgejsKK2NoZWNrX2Z1bmMgYzsKK3VJbnQgdzsKK3sKKyAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworCisgIGlmICgocyA9IChpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKilaQUxMT0MKKyAgICAgICAoeiwxLHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUpKSkgPT0gWl9OVUxMKQorICAgIHJldHVybiBzOworICBpZiAoKHMtPmh1ZnRzID0KKyAgICAgICAoaW5mbGF0ZV9odWZ0ICopWkFMTE9DKHosIHNpemVvZihpbmZsYXRlX2h1ZnQpLCBNQU5ZKSkgPT0gWl9OVUxMKQorICB7CisgICAgWkZSRUUoeiwgcyk7CisgICAgcmV0dXJuIFpfTlVMTDsKKyAgfQorICBpZiAoKHMtPndpbmRvdyA9IChCeXRlZiAqKVpBTExPQyh6LCAxLCB3KSkgPT0gWl9OVUxMKQorICB7CisgICAgWkZSRUUoeiwgcy0+aHVmdHMpOworICAgIFpGUkVFKHosIHMpOworICAgIHJldHVybiBaX05VTEw7CisgIH0KKyAgcy0+ZW5kID0gcy0+d2luZG93ICsgdzsKKyAgcy0+Y2hlY2tmbiA9IGM7CisgIHMtPm1vZGUgPSBUWVBFOworICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgYmxvY2tzIGFsbG9jYXRlZFxuIikpOworICBpbmZsYXRlX2Jsb2Nrc19yZXNldChzLCB6LCBaX05VTEwpOworICByZXR1cm4gczsKK30KKworCitpbnQgaW5mbGF0ZV9ibG9ja3MocywgeiwgcikKK2luZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKK3pfc3RyZWFtcCB6OworaW50IHI7Cit7CisgIHVJbnQgdDsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLworICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgIEJ5dGVmICpwOyAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KKyAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLworICBCeXRlZiAqcTsgICAgICAgICAgICAgLyogb3V0cHV0IHdpbmRvdyB3cml0ZSBwb2ludGVyICovCisgIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLworCisgIC8qIGNvcHkgaW5wdXQvb3V0cHV0IGluZm9ybWF0aW9uIHRvIGxvY2FscyAoVVBEQVRFIG1hY3JvIHJlc3RvcmVzKSAqLworICBMT0FECisKKyAgLyogcHJvY2VzcyBpbnB1dCBiYXNlZCBvbiBjdXJyZW50IHN0YXRlICovCisgIHdoaWxlICgxKSBzd2l0Y2ggKHMtPm1vZGUpCisgIHsKKyAgICBjYXNlIFRZUEU6CisgICAgICBORUVEQklUUygzKQorICAgICAgdCA9ICh1SW50KWIgJiA3OworICAgICAgcy0+bGFzdCA9IHQgJiAxOworICAgICAgc3dpdGNoICh0ID4+IDEpCisgICAgICB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkICovCisgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgIERVTVBCSVRTKDMpCisgICAgICAgICAgdCA9IGsgJiA3OyAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgIERVTVBCSVRTKHQpCisgICAgICAgICAgcy0+bW9kZSA9IExFTlM7ICAgICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBvZiBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCAqLworICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIHVJbnQgYmwsIGJkOworICAgICAgICAgICAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOworCisgICAgICAgICAgICBpbmZsYXRlX3RyZWVzX2ZpeGVkKCZibCwgJmJkLCAmdGwsICZ0ZCwgeik7CisgICAgICAgICAgICBzLT5zdWIuZGVjb2RlLmNvZGVzID0gaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopOworICAgICAgICAgICAgaWYgKHMtPnN1Yi5kZWNvZGUuY29kZXMgPT0gWl9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByID0gWl9NRU1fRVJST1I7CisgICAgICAgICAgICAgIExFQVZFCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIERVTVBCSVRTKDMpCisgICAgICAgICAgcy0+bW9kZSA9IENPREVTOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgKi8KKyAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgIHMtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgIERVTVBCSVRTKDMpCisgICAgICAgICAgcy0+bW9kZSA9IFRBQkxFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlsbGVnYWwgKi8KKyAgICAgICAgICBEVU1QQklUUygzKQorICAgICAgICAgIHMtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOworICAgICAgICAgIHIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgTEVBVkUKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgIE5FRURCSVRTKDMyKQorICAgICAgaWYgKCgoKH5iKSA+PiAxNikgJiAweGZmZmYpICE9IChiICYgMHhmZmZmKSkKKyAgICAgIHsKKyAgICAgICAgcy0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKKyAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgTEVBVkUKKyAgICAgIH0KKyAgICAgIHMtPnN1Yi5sZWZ0ID0gKHVJbnQpYiAmIDB4ZmZmZjsKKyAgICAgIGIgPSBrID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogZHVtcCBiaXRzICovCisgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsIHMtPnN1Yi5sZWZ0KSk7CisgICAgICBzLT5tb2RlID0gcy0+c3ViLmxlZnQgPyBTVE9SRUQgOiAocy0+bGFzdCA/IERSWSA6IFRZUEUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9SRUQ6CisgICAgICBpZiAobiA9PSAwKQorICAgICAgICBMRUFWRQorICAgICAgTkVFRE9VVAorICAgICAgdCA9IHMtPnN1Yi5sZWZ0OworICAgICAgaWYgKHQgPiBuKSB0ID0gbjsKKyAgICAgIGlmICh0ID4gbSkgdCA9IG07CisgICAgICB6bWVtY3B5KHEsIHAsIHQpOworICAgICAgcCArPSB0OyAgbiAtPSB0OworICAgICAgcSArPSB0OyAgbSAtPSB0OworICAgICAgaWYgKChzLT5zdWIubGVmdCAtPSB0KSAhPSAwKQorICAgICAgICBicmVhazsKKyAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZCwgJWx1IHRvdGFsIG91dFxuIiwKKyAgICAgICAgICAgICAgei0+dG90YWxfb3V0ICsgKHEgPj0gcy0+cmVhZCA/IHEgLSBzLT5yZWFkIDoKKyAgICAgICAgICAgICAgKHMtPmVuZCAtIHMtPnJlYWQpICsgKHEgLSBzLT53aW5kb3cpKSkpOworICAgICAgcy0+bW9kZSA9IHMtPmxhc3QgPyBEUlkgOiBUWVBFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUJMRToKKyAgICAgIE5FRURCSVRTKDE0KQorICAgICAgcy0+c3ViLnRyZWVzLnRhYmxlID0gdCA9ICh1SW50KWIgJiAweDNmZmY7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICBpZiAoKHQgJiAweDFmKSA+IDI5IHx8ICgodCA+PiA1KSAmIDB4MWYpID4gMjkpCisgICAgICB7CisgICAgICAgIHMtPm1vZGUgPSBCQUQ7CisgICAgICAgIHotPm1zZyA9IChjaGFyKikidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOworICAgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgICBMRUFWRQorICAgICAgfQorI2VuZGlmCisgICAgICB0ID0gMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpOworICAgICAgaWYgKChzLT5zdWIudHJlZXMuYmxlbnMgPSAodUludGYqKVpBTExPQyh6LCB0LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCisgICAgICB7CisgICAgICAgIHIgPSBaX01FTV9FUlJPUjsKKyAgICAgICAgTEVBVkUKKyAgICAgIH0KKyAgICAgIERVTVBCSVRTKDE0KQorICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gMDsKKyAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKyAgICAgIHMtPm1vZGUgPSBCVFJFRTsKKyAgICBjYXNlIEJUUkVFOgorICAgICAgd2hpbGUgKHMtPnN1Yi50cmVlcy5pbmRleCA8IDQgKyAocy0+c3ViLnRyZWVzLnRhYmxlID4+IDEwKSkKKyAgICAgIHsKKyAgICAgICAgTkVFREJJVFMoMykKKyAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2JvcmRlcltzLT5zdWIudHJlZXMuaW5kZXgrK11dID0gKHVJbnQpYiAmIDc7CisgICAgICAgIERVTVBCSVRTKDMpCisgICAgICB9CisgICAgICB3aGlsZSAocy0+c3ViLnRyZWVzLmluZGV4IDwgMTkpCisgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVuc1tib3JkZXJbcy0+c3ViLnRyZWVzLmluZGV4KytdXSA9IDA7CisgICAgICBzLT5zdWIudHJlZXMuYmIgPSA3OworICAgICAgdCA9IGluZmxhdGVfdHJlZXNfYml0cyhzLT5zdWIudHJlZXMuYmxlbnMsICZzLT5zdWIudHJlZXMuYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5zdWIudHJlZXMudGIsIHMtPmh1ZnRzLCB6KTsKKyAgICAgIGlmICh0ICE9IFpfT0spCisgICAgICB7CisgICAgICAgIHIgPSB0OworICAgICAgICBpZiAociA9PSBaX0RBVEFfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOworICAgICAgICAgIHMtPm1vZGUgPSBCQUQ7CisgICAgICAgIH0KKyAgICAgICAgTEVBVkUKKyAgICAgIH0KKyAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IDA7CisgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGJpdHMgdHJlZSBva1xuIikpOworICAgICAgcy0+bW9kZSA9IERUUkVFOworICAgIGNhc2UgRFRSRUU6CisgICAgICB3aGlsZSAodCA9IHMtPnN1Yi50cmVlcy50YWJsZSwKKyAgICAgICAgICAgICBzLT5zdWIudHJlZXMuaW5kZXggPCAyNTggKyAodCAmIDB4MWYpICsgKCh0ID4+IDUpICYgMHgxZikpCisgICAgICB7CisgICAgICAgIGluZmxhdGVfaHVmdCAqaDsKKyAgICAgICAgdUludCBpLCBqLCBjOworCisgICAgICAgIHQgPSBzLT5zdWIudHJlZXMuYmI7CisgICAgICAgIE5FRURCSVRTKHQpCisgICAgICAgIGggPSBzLT5zdWIudHJlZXMudGIgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1t0XSk7CisgICAgICAgIHQgPSBoLT5iaXRzOworICAgICAgICBjID0gaC0+YmFzZTsKKyAgICAgICAgaWYgKGMgPCAxNikKKyAgICAgICAgeworICAgICAgICAgIERVTVBCSVRTKHQpCisgICAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW3MtPnN1Yi50cmVlcy5pbmRleCsrXSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBjID09IDE2Li4xOCAqLworICAgICAgICB7CisgICAgICAgICAgaSA9IGMgPT0gMTggPyA3IDogYyAtIDE0OworICAgICAgICAgIGogPSBjID09IDE4ID8gMTEgOiAzOworICAgICAgICAgIE5FRURCSVRTKHQgKyBpKQorICAgICAgICAgIERVTVBCSVRTKHQpCisgICAgICAgICAgaiArPSAodUludCliICYgaW5mbGF0ZV9tYXNrW2ldOworICAgICAgICAgIERVTVBCSVRTKGkpCisgICAgICAgICAgaSA9IHMtPnN1Yi50cmVlcy5pbmRleDsKKyAgICAgICAgICB0ID0gcy0+c3ViLnRyZWVzLnRhYmxlOworICAgICAgICAgIGlmIChpICsgaiA+IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSB8fAorICAgICAgICAgICAgICAoYyA9PSAxNiAmJiBpIDwgMSkpCisgICAgICAgICAgeworICAgICAgICAgICAgWkZSRUUoeiwgcy0+c3ViLnRyZWVzLmJsZW5zKTsKKyAgICAgICAgICAgIHMtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIExFQVZFCisgICAgICAgICAgfQorICAgICAgICAgIGMgPSBjID09IDE2ID8gcy0+c3ViLnRyZWVzLmJsZW5zW2kgLSAxXSA6IDA7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zW2krK10gPSBjOworICAgICAgICAgIH0gd2hpbGUgKC0taik7CisgICAgICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcy0+c3ViLnRyZWVzLnRiID0gWl9OVUxMOworICAgICAgeworICAgICAgICB1SW50IGJsLCBiZDsKKyAgICAgICAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOworICAgICAgICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYzsKKworICAgICAgICBibCA9IDk7ICAgICAgICAgLyogbXVzdCBiZSA8PSA5IGZvciBsb29rYWhlYWQgYXNzdW1wdGlvbnMgKi8KKyAgICAgICAgYmQgPSA2OyAgICAgICAgIC8qIG11c3QgYmUgPD0gOSBmb3IgbG9va2FoZWFkIGFzc3VtcHRpb25zICovCisgICAgICAgIHQgPSBzLT5zdWIudHJlZXMudGFibGU7CisgICAgICAgIHQgPSBpbmZsYXRlX3RyZWVzX2R5bmFtaWMoMjU3ICsgKHQgJiAweDFmKSwgMSArICgodCA+PiA1KSAmIDB4MWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVucywgJmJsLCAmYmQsICZ0bCwgJnRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmh1ZnRzLCB6KTsKKyAgICAgICAgaWYgKHQgIT0gWl9PSykKKyAgICAgICAgeworICAgICAgICAgIGlmICh0ID09ICh1SW50KVpfREFUQV9FUlJPUikKKyAgICAgICAgICB7CisgICAgICAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOworICAgICAgICAgICAgcy0+bW9kZSA9IEJBRDsKKyAgICAgICAgICB9CisgICAgICAgICAgciA9IHQ7CisgICAgICAgICAgTEVBVkUKKyAgICAgICAgfQorICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHRyZWVzIG9rXG4iKSk7CisgICAgICAgIGlmICgoYyA9IGluZmxhdGVfY29kZXNfbmV3KGJsLCBiZCwgdGwsIHRkLCB6KSkgPT0gWl9OVUxMKQorICAgICAgICB7CisgICAgICAgICAgciA9IFpfTUVNX0VSUk9SOworICAgICAgICAgIExFQVZFCisgICAgICAgIH0KKyAgICAgICAgcy0+c3ViLmRlY29kZS5jb2RlcyA9IGM7CisgICAgICB9CisgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOworICAgICAgcy0+bW9kZSA9IENPREVTOworICAgIGNhc2UgQ09ERVM6CisgICAgICBVUERBVEUKKyAgICAgIGlmICgociA9IGluZmxhdGVfY29kZXMocywgeiwgcikpICE9IFpfU1RSRUFNX0VORCkKKyAgICAgICAgcmV0dXJuIGluZmxhdGVfZmx1c2gocywgeiwgcik7CisgICAgICByID0gWl9PSzsKKyAgICAgIGluZmxhdGVfY29kZXNfZnJlZShzLT5zdWIuZGVjb2RlLmNvZGVzLCB6KTsKKyAgICAgIExPQUQKKyAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgZW5kLCAlbHUgdG90YWwgb3V0XG4iLAorICAgICAgICAgICAgICB6LT50b3RhbF9vdXQgKyAocSA+PSBzLT5yZWFkID8gcSAtIHMtPnJlYWQgOgorICAgICAgICAgICAgICAocy0+ZW5kIC0gcy0+cmVhZCkgKyAocSAtIHMtPndpbmRvdykpKSk7CisgICAgICBpZiAoIXMtPmxhc3QpCisgICAgICB7CisgICAgICAgIHMtPm1vZGUgPSBUWVBFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHMtPm1vZGUgPSBEUlk7CisgICAgY2FzZSBEUlk6CisgICAgICBGTFVTSAorICAgICAgaWYgKHMtPnJlYWQgIT0gcy0+d3JpdGUpCisgICAgICAgIExFQVZFCisgICAgICBzLT5tb2RlID0gRE9ORTsKKyAgICBjYXNlIERPTkU6CisgICAgICByID0gWl9TVFJFQU1fRU5EOworICAgICAgTEVBVkUKKyAgICBjYXNlIEJBRDoKKyAgICAgIHIgPSBaX0RBVEFfRVJST1I7CisgICAgICBMRUFWRQorICAgIGRlZmF1bHQ6CisgICAgICByID0gWl9TVFJFQU1fRVJST1I7CisgICAgICBMRUFWRQorICB9Cit9CisKKworaW50IGluZmxhdGVfYmxvY2tzX2ZyZWUocywgeikKK2luZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKK3pfc3RyZWFtcCB6OworeworICBpbmZsYXRlX2Jsb2Nrc19yZXNldChzLCB6LCBaX05VTEwpOworICBaRlJFRSh6LCBzLT53aW5kb3cpOworICBaRlJFRSh6LCBzLT5odWZ0cyk7CisgIFpGUkVFKHosIHMpOworICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgYmxvY2tzIGZyZWVkXG4iKSk7CisgIHJldHVybiBaX09LOworfQorCisKK3ZvaWQgaW5mbGF0ZV9zZXRfZGljdGlvbmFyeShzLCBkLCBuKQoraW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworY29uc3QgQnl0ZWYgKmQ7Cit1SW50ICBuOworeworICB6bWVtY3B5KHMtPndpbmRvdywgZCwgbik7CisgIHMtPnJlYWQgPSBzLT53cml0ZSA9IHMtPndpbmRvdyArIG47Cit9CisKKworLyogUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQKKyAqIGJ5IFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIAorICogSU4gYXNzZXJ0aW9uOiBzICE9IFpfTlVMTAorICovCitpbnQgaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludChzKQoraW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworeworICByZXR1cm4gcy0+bW9kZSA9PSBMRU5TOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mYmxvY2suaCBiL2NvbW1vbi96bGliL2luZmJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczYjIyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmJsb2NrLmgKQEAgLTAsMCArMSwzOSBAQAorLyogaW5mYmxvY2suaCAtLSBoZWFkZXIgdG8gdXNlIGluZmJsb2NrLmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKK3N0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZTsKK3R5cGVkZWYgc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlIEZBUiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWY7CisKK2V4dGVybiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiBpbmZsYXRlX2Jsb2Nrc19uZXcgT0YoKAorICAgIHpfc3RyZWFtcCB6LAorICAgIGNoZWNrX2Z1bmMgYywgICAgICAgICAgICAgICAvKiBjaGVjayBmdW5jdGlvbiAqLworICAgIHVJbnQgdykpOyAgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSAqLworCitleHRlcm4gaW50IGluZmxhdGVfYmxvY2tzIE9GKCgKKyAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKKyAgICB6X3N0cmVhbXAgLAorICAgIGludCkpOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIHJldHVybiBjb2RlICovCisKK2V4dGVybiB2b2lkIGluZmxhdGVfYmxvY2tzX3Jlc2V0IE9GKCgKKyAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKKyAgICB6X3N0cmVhbXAgLAorICAgIHVMb25nZiAqKSk7ICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdmFsdWUgb24gb3V0cHV0ICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV9ibG9ja3NfZnJlZSBPRigoCisgICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCisgICAgel9zdHJlYW1wKSk7CisKK2V4dGVybiB2b2lkIGluZmxhdGVfc2V0X2RpY3Rpb25hcnkgT0YoKAorICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKKyAgICBjb25zdCBCeXRlZiAqZCwgIC8qIGRpY3Rpb25hcnkgKi8KKyAgICB1SW50ICBuKSk7ICAgICAgIC8qIGRpY3Rpb25hcnkgbGVuZ3RoICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludCBPRigoCisgICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzKSk7CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZjb2Rlcy5jIGIvY29tbW9uL3psaWIvaW5mY29kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWJlNTQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mY29kZXMuYwpAQCAtMCwwICsxLDI1MSBAQAorLyogaW5mY29kZXMuYyAtLSBwcm9jZXNzIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZibG9jay5oIgorI2luY2x1ZGUgImluZmNvZGVzLmgiCisjaW5jbHVkZSAiaW5mdXRpbC5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKworLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KKyNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAorI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCisKK3R5cGVkZWYgZW51bSB7ICAgICAgICAvKiB3YWl0aW5nIGZvciAiaToiPWlucHV0LCAibzoiPW91dHB1dCwgIng6Ij1ub3RoaW5nICovCisgICAgICBTVEFSVCwgICAgLyogeDogc2V0IHVwIGZvciBMRU4gKi8KKyAgICAgIExFTiwgICAgICAvKiBpOiBnZXQgbGVuZ3RoL2xpdGVyYWwvZW9iIG5leHQgKi8KKyAgICAgIExFTkVYVCwgICAvKiBpOiBnZXR0aW5nIGxlbmd0aCBleHRyYSAoaGF2ZSBiYXNlKSAqLworICAgICAgRElTVCwgICAgIC8qIGk6IGdldCBkaXN0YW5jZSBuZXh0ICovCisgICAgICBESVNURVhULCAgLyogaTogZ2V0dGluZyBkaXN0YW5jZSBleHRyYSAqLworICAgICAgQ09QWSwgICAgIC8qIG86IGNvcHlpbmcgYnl0ZXMgaW4gd2luZG93LCB3YWl0aW5nIGZvciBzcGFjZSAqLworICAgICAgTElULCAgICAgIC8qIG86IGdvdCBsaXRlcmFsLCB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgKi8KKyAgICAgIFdBU0gsICAgICAvKiBvOiBnb3QgZW9iLCBwb3NzaWJseSBzdGlsbCBvdXRwdXQgd2FpdGluZyAqLworICAgICAgRU5ELCAgICAgIC8qIHg6IGdvdCBlb2IgYW5kIGFsbCBkYXRhIGZsdXNoZWQgKi8KKyAgICAgIEJBRENPREV9ICAvKiB4OiBnb3QgZXJyb3IgKi8KK2luZmxhdGVfY29kZXNfbW9kZTsKKworLyogaW5mbGF0ZSBjb2RlcyBwcml2YXRlIHN0YXRlICovCitzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7CisKKyAgLyogbW9kZSAqLworICBpbmZsYXRlX2NvZGVzX21vZGUgbW9kZTsgICAgICAvKiBjdXJyZW50IGluZmxhdGVfY29kZXMgbW9kZSAqLworCisgIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCisgIHVJbnQgbGVuOworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGluZmxhdGVfaHVmdCAqdHJlZTsgICAgICAgLyogcG9pbnRlciBpbnRvIHRyZWUgKi8KKyAgICAgIHVJbnQgbmVlZDsgICAgICAgICAgICAgICAgLyogYml0cyBuZWVkZWQgKi8KKyAgICB9IGNvZGU7ICAgICAgICAgICAgIC8qIGlmIExFTiBvciBESVNULCB3aGVyZSBpbiB0cmVlICovCisgICAgdUludCBsaXQ7ICAgICAgICAgICAvKiBpZiBMSVQsIGxpdGVyYWwgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgdUludCBnZXQ7ICAgICAgICAgICAgICAgICAvKiBiaXRzIHRvIGdldCBmb3IgZXh0cmEgKi8KKyAgICAgIHVJbnQgZGlzdDsgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IGZyb20gKi8KKyAgICB9IGNvcHk7ICAgICAgICAgICAgIC8qIGlmIEVYVCBvciBDT1BZLCB3aGVyZSBhbmQgaG93IG11Y2ggKi8KKyAgfSBzdWI7ICAgICAgICAgICAgICAgIC8qIHN1Ym1vZGUgKi8KKworICAvKiBtb2RlIGluZGVwZW5kZW50IGluZm9ybWF0aW9uICovCisgIEJ5dGUgbGJpdHM7ICAgICAgICAgICAvKiBsdHJlZSBiaXRzIGRlY29kZWQgcGVyIGJyYW5jaCAqLworICBCeXRlIGRiaXRzOyAgICAgICAgICAgLyogZHRyZWUgYml0cyBkZWNvZGVyIHBlciBicmFuY2ggKi8KKyAgaW5mbGF0ZV9odWZ0ICpsdHJlZTsgICAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGgvZW9iIHRyZWUgKi8KKyAgaW5mbGF0ZV9odWZ0ICpkdHJlZTsgICAgICAgICAgLyogZGlzdGFuY2UgdHJlZSAqLworCit9OworCisKK2luZmxhdGVfY29kZXNfc3RhdGVmICppbmZsYXRlX2NvZGVzX25ldyhibCwgYmQsIHRsLCB0ZCwgeikKK3VJbnQgYmwsIGJkOworaW5mbGF0ZV9odWZ0ICp0bDsKK2luZmxhdGVfaHVmdCAqdGQ7IC8qIG5lZWQgc2VwYXJhdGUgZGVjbGFyYXRpb24gZm9yIEJvcmxhbmQgQysrICovCit6X3N0cmVhbXAgejsKK3sKKyAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmM7CisKKyAgaWYgKChjID0gKGluZmxhdGVfY29kZXNfc3RhdGVmICopCisgICAgICAgWkFMTE9DKHosMSxzaXplb2Yoc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUpKSkgIT0gWl9OVUxMKQorICB7CisgICAgYy0+bW9kZSA9IFNUQVJUOworICAgIGMtPmxiaXRzID0gKEJ5dGUpYmw7CisgICAgYy0+ZGJpdHMgPSAoQnl0ZSliZDsKKyAgICBjLT5sdHJlZSA9IHRsOworICAgIGMtPmR0cmVlID0gdGQ7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBuZXdcbiIpKTsKKyAgfQorICByZXR1cm4gYzsKK30KKworCitpbnQgaW5mbGF0ZV9jb2RlcyhzLCB6LCByKQoraW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOworel9zdHJlYW1wIHo7CitpbnQgcjsKK3sKKyAgdUludCBqOyAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlICovCisgIGluZmxhdGVfaHVmdCAqdDsgICAgICAvKiB0ZW1wb3JhcnkgcG9pbnRlciAqLworICB1SW50IGU7ICAgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KKyAgdUxvbmcgYjsgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgdUludCBrOyAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICBCeXRlZiAqcDsgICAgICAgICAgICAgLyogaW5wdXQgZGF0YSBwb2ludGVyICovCisgIHVJbnQgbjsgICAgICAgICAgICAgICAvKiBieXRlcyBhdmFpbGFibGUgdGhlcmUgKi8KKyAgQnl0ZWYgKnE7ICAgICAgICAgICAgIC8qIG91dHB1dCB3aW5kb3cgd3JpdGUgcG9pbnRlciAqLworICB1SW50IG07ICAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gZW5kIG9mIHdpbmRvdyBvciByZWFkIHBvaW50ZXIgKi8KKyAgQnl0ZWYgKmY7ICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gY29weSBzdHJpbmdzIGZyb20gKi8KKyAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmMgPSBzLT5zdWIuZGVjb2RlLmNvZGVzOyAgLyogY29kZXMgc3RhdGUgKi8KKworICAvKiBjb3B5IGlucHV0L291dHB1dCBpbmZvcm1hdGlvbiB0byBsb2NhbHMgKFVQREFURSBtYWNybyByZXN0b3JlcykgKi8KKyAgTE9BRAorCisgIC8qIHByb2Nlc3MgaW5wdXQgYW5kIG91dHB1dCBiYXNlZCBvbiBjdXJyZW50IHN0YXRlICovCisgIHdoaWxlICgxKSBzd2l0Y2ggKGMtPm1vZGUpCisgIHsgICAgICAgICAgICAgLyogd2FpdGluZyBmb3IgImk6Ij1pbnB1dCwgIm86Ij1vdXRwdXQsICJ4OiI9bm90aGluZyAqLworICAgIGNhc2UgU1RBUlQ6ICAgICAgICAgLyogeDogc2V0IHVwIGZvciBMRU4gKi8KKyNpZm5kZWYgU0xPVworICAgICAgaWYgKG0gPj0gMjU4ICYmIG4gPj0gMTApCisgICAgICB7CisgICAgICAgIFVQREFURQorICAgICAgICByID0gaW5mbGF0ZV9mYXN0KGMtPmxiaXRzLCBjLT5kYml0cywgYy0+bHRyZWUsIGMtPmR0cmVlLCBzLCB6KTsKKyAgICAgICAgTE9BRAorICAgICAgICBpZiAociAhPSBaX09LKQorICAgICAgICB7CisgICAgICAgICAgYy0+bW9kZSA9IHIgPT0gWl9TVFJFQU1fRU5EID8gV0FTSCA6IEJBRENPREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZiAvKiAhU0xPVyAqLworICAgICAgYy0+c3ViLmNvZGUubmVlZCA9IGMtPmxiaXRzOworICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IGMtPmx0cmVlOworICAgICAgYy0+bW9kZSA9IExFTjsKKyAgICBjYXNlIExFTjogICAgICAgICAgIC8qIGk6IGdldCBsZW5ndGgvbGl0ZXJhbC9lb2IgbmV4dCAqLworICAgICAgaiA9IGMtPnN1Yi5jb2RlLm5lZWQ7CisgICAgICBORUVEQklUUyhqKQorICAgICAgdCA9IGMtPnN1Yi5jb2RlLnRyZWUgKyAoKHVJbnQpYiAmIGluZmxhdGVfbWFza1tqXSk7CisgICAgICBEVU1QQklUUyh0LT5iaXRzKQorICAgICAgZSA9ICh1SW50KSh0LT5leG9wKTsKKyAgICAgIGlmIChlID09IDApICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqLworICAgICAgeworICAgICAgICBjLT5zdWIubGl0ID0gdC0+YmFzZTsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0LT5iYXNlID49IDB4MjAgJiYgdC0+YmFzZSA8IDB4N2YgPworICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdC0+YmFzZSkpOworICAgICAgICBjLT5tb2RlID0gTElUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChlICYgMTYpICAgICAgICAgICAgICAgLyogbGVuZ3RoICovCisgICAgICB7CisgICAgICAgIGMtPnN1Yi5jb3B5LmdldCA9IGUgJiAxNTsKKyAgICAgICAgYy0+bGVuID0gdC0+YmFzZTsKKyAgICAgICAgYy0+bW9kZSA9IExFTkVYVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKGUgJiA2NCkgPT0gMCkgICAgICAgIC8qIG5leHQgdGFibGUgKi8KKyAgICAgIHsKKyAgICAgICAgYy0+c3ViLmNvZGUubmVlZCA9IGU7CisgICAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSB0ICsgdC0+YmFzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoZSAmIDMyKSAgICAgICAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgeworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICBjLT5tb2RlID0gV0FTSDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjLT5tb2RlID0gQkFEQ09ERTsgICAgICAgIC8qIGludmFsaWQgY29kZSAqLworICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICAgIExFQVZFCisgICAgY2FzZSBMRU5FWFQ6ICAgICAgICAvKiBpOiBnZXR0aW5nIGxlbmd0aCBleHRyYSAoaGF2ZSBiYXNlKSAqLworICAgICAgaiA9IGMtPnN1Yi5jb3B5LmdldDsKKyAgICAgIE5FRURCSVRTKGopCisgICAgICBjLT5sZW4gKz0gKHVJbnQpYiAmIGluZmxhdGVfbWFza1tqXTsKKyAgICAgIERVTVBCSVRTKGopCisgICAgICBjLT5zdWIuY29kZS5uZWVkID0gYy0+ZGJpdHM7CisgICAgICBjLT5zdWIuY29kZS50cmVlID0gYy0+ZHRyZWU7CisgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgYy0+bGVuKSk7CisgICAgICBjLT5tb2RlID0gRElTVDsKKyAgICBjYXNlIERJU1Q6ICAgICAgICAgIC8qIGk6IGdldCBkaXN0YW5jZSBuZXh0ICovCisgICAgICBqID0gYy0+c3ViLmNvZGUubmVlZDsKKyAgICAgIE5FRURCSVRTKGopCisgICAgICB0ID0gYy0+c3ViLmNvZGUudHJlZSArICgodUludCliICYgaW5mbGF0ZV9tYXNrW2pdKTsKKyAgICAgIERVTVBCSVRTKHQtPmJpdHMpCisgICAgICBlID0gKHVJbnQpKHQtPmV4b3ApOworICAgICAgaWYgKGUgJiAxNikgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSAqLworICAgICAgeworICAgICAgICBjLT5zdWIuY29weS5nZXQgPSBlICYgMTU7CisgICAgICAgIGMtPnN1Yi5jb3B5LmRpc3QgPSB0LT5iYXNlOworICAgICAgICBjLT5tb2RlID0gRElTVEVYVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoKGUgJiA2NCkgPT0gMCkgICAgICAgIC8qIG5leHQgdGFibGUgKi8KKyAgICAgIHsKKyAgICAgICAgYy0+c3ViLmNvZGUubmVlZCA9IGU7CisgICAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSB0ICsgdC0+YmFzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjLT5tb2RlID0gQkFEQ09ERTsgICAgICAgIC8qIGludmFsaWQgY29kZSAqLworICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICAgIExFQVZFCisgICAgY2FzZSBESVNURVhUOiAgICAgICAvKiBpOiBnZXR0aW5nIGRpc3RhbmNlIGV4dHJhICovCisgICAgICBqID0gYy0+c3ViLmNvcHkuZ2V0OworICAgICAgTkVFREJJVFMoaikKKyAgICAgIGMtPnN1Yi5jb3B5LmRpc3QgKz0gKHVJbnQpYiAmIGluZmxhdGVfbWFza1tqXTsKKyAgICAgIERVTVBCSVRTKGopCisgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBjLT5zdWIuY29weS5kaXN0KSk7CisgICAgICBjLT5tb2RlID0gQ09QWTsKKyAgICBjYXNlIENPUFk6ICAgICAgICAgIC8qIG86IGNvcHlpbmcgYnl0ZXMgaW4gd2luZG93LCB3YWl0aW5nIGZvciBzcGFjZSAqLworICAgICAgZiA9IHEgLSBjLT5zdWIuY29weS5kaXN0OworICAgICAgd2hpbGUgKGYgPCBzLT53aW5kb3cpICAgICAgICAgICAgIC8qIG1vZHVsbyB3aW5kb3cgc2l6ZS0id2hpbGUiIGluc3RlYWQgKi8KKyAgICAgICAgZiArPSBzLT5lbmQgLSBzLT53aW5kb3c7ICAgICAgICAvKiBvZiAiaWYiIGhhbmRsZXMgaW52YWxpZCBkaXN0YW5jZXMgKi8KKyAgICAgIHdoaWxlIChjLT5sZW4pCisgICAgICB7CisgICAgICAgIE5FRURPVVQKKyAgICAgICAgT1VUQllURSgqZisrKQorICAgICAgICBpZiAoZiA9PSBzLT5lbmQpCisgICAgICAgICAgZiA9IHMtPndpbmRvdzsKKyAgICAgICAgYy0+bGVuLS07CisgICAgICB9CisgICAgICBjLT5tb2RlID0gU1RBUlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIExJVDogICAgICAgICAgIC8qIG86IGdvdCBsaXRlcmFsLCB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgKi8KKyAgICAgIE5FRURPVVQKKyAgICAgIE9VVEJZVEUoYy0+c3ViLmxpdCkKKyAgICAgIGMtPm1vZGUgPSBTVEFSVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0FTSDogICAgICAgICAgLyogbzogZ290IGVvYiwgcG9zc2libHkgbW9yZSBvdXRwdXQgKi8KKyAgICAgIGlmIChrID4gNykgICAgICAgIC8qIHJldHVybiB1bnVzZWQgYnl0ZSwgaWYgYW55ICovCisgICAgICB7CisgICAgICAgIEFzc2VydChrIDwgMTYsICJpbmZsYXRlX2NvZGVzIGdyYWJiZWQgdG9vIG1hbnkgYnl0ZXMiKQorICAgICAgICBrIC09IDg7CisgICAgICAgIG4rKzsKKyAgICAgICAgcC0tOyAgICAgICAgICAgIC8qIGNhbiBhbHdheXMgcmV0dXJuIG9uZSAqLworICAgICAgfQorICAgICAgRkxVU0gKKyAgICAgIGlmIChzLT5yZWFkICE9IHMtPndyaXRlKQorICAgICAgICBMRUFWRQorICAgICAgYy0+bW9kZSA9IEVORDsKKyAgICBjYXNlIEVORDoKKyAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7CisgICAgICBMRUFWRQorICAgIGNhc2UgQkFEQ09ERTogICAgICAgLyogeDogZ290IGVycm9yICovCisgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgTEVBVkUKKyAgICBkZWZhdWx0OgorICAgICAgciA9IFpfU1RSRUFNX0VSUk9SOworICAgICAgTEVBVkUKKyAgfQorI2lmZGVmIE5FRURfRFVNTVlfUkVUVVJOCisgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsgIC8qIFNvbWUgZHVtYiBjb21waWxlcnMgY29tcGxhaW4gd2l0aG91dCB0aGlzICovCisjZW5kaWYKK30KKworCit2b2lkIGluZmxhdGVfY29kZXNfZnJlZShjLCB6KQoraW5mbGF0ZV9jb2Rlc19zdGF0ZWYgKmM7Cit6X3N0cmVhbXAgejsKK3sKKyAgWkZSRUUoeiwgYyk7CisgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgZnJlZVxuIikpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mY29kZXMuaCBiL2NvbW1vbi96bGliL2luZmNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4MjFhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmNvZGVzLmgKQEAgLTAsMCArMSwyNyBAQAorLyogaW5mY29kZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZmNvZGVzLmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKK3N0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSBGQVIgaW5mbGF0ZV9jb2Rlc19zdGF0ZWY7CisKK2V4dGVybiBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqaW5mbGF0ZV9jb2Rlc19uZXcgT0YoKAorICAgIHVJbnQsIHVJbnQsCisgICAgaW5mbGF0ZV9odWZ0ICosIGluZmxhdGVfaHVmdCAqLAorICAgIHpfc3RyZWFtcCApKTsKKworZXh0ZXJuIGludCBpbmZsYXRlX2NvZGVzIE9GKCgKKyAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKKyAgICB6X3N0cmVhbXAgLAorICAgIGludCkpOworCitleHRlcm4gdm9pZCBpbmZsYXRlX2NvZGVzX2ZyZWUgT0YoKAorICAgIGluZmxhdGVfY29kZXNfc3RhdGVmICosCisgICAgel9zdHJlYW1wICkpOworCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZmYXN0LmMgYi9jb21tb24vemxpYi9pbmZmYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3ZjFkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZmZhc3QuYwpAQCAtMCwwICsxLDE4MyBAQAorLyogaW5mZmFzdC5jIC0tIHByb2Nlc3MgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycyBmYXN0CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mYmxvY2suaCIKKyNpbmNsdWRlICJpbmZjb2Rlcy5oIgorI2luY2x1ZGUgImluZnV0aWwuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKK3N0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworCisvKiBzaW1wbGlmeSB0aGUgdXNlIG9mIHRoZSBpbmZsYXRlX2h1ZnQgdHlwZSB3aXRoIHNvbWUgZGVmaW5lcyAqLworI2RlZmluZSBleG9wIHdvcmQud2hhdC5FeG9wCisjZGVmaW5lIGJpdHMgd29yZC53aGF0LkJpdHMKKworLyogbWFjcm9zIGZvciBiaXQgaW5wdXQgd2l0aCBubyBjaGVja2luZyBhbmQgZm9yIHJldHVybmluZyB1bnVzZWQgYnl0ZXMgKi8KKyNkZWZpbmUgR1JBQkJJVFMoaikge3doaWxlKGs8KGopKXtifD0oKHVMb25nKU5FWFRCWVRFKTw8aztrKz04O319CisjZGVmaW5lIFVOR1JBQiB7Yz16LT5hdmFpbF9pbi1uO2M9KGs+PjMpPGM/az4+MzpjO24rPWM7cC09YztrLT1jPDwzO30KKworLyogQ2FsbGVkIHdpdGggbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gd3JpdGUgaW4gd2luZG93IGF0IGxlYXN0IDI1OAorICAgKHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGgpIGFuZCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgYXZhaWxhYmxlCisgICBhdCBsZWFzdCB0ZW4uICBUaGUgdGVuIGJ5dGVzIGFyZSBzaXggYnl0ZXMgZm9yIHRoZSBsb25nZXN0IGxlbmd0aC8KKyAgIGRpc3RhbmNlIHBhaXIgcGx1cyBmb3VyIGJ5dGVzIGZvciBvdmVybG9hZGluZyB0aGUgYml0IGJ1ZmZlci4gKi8KKworaW50IGluZmxhdGVfZmFzdChibCwgYmQsIHRsLCB0ZCwgcywgeikKK3VJbnQgYmwsIGJkOworaW5mbGF0ZV9odWZ0ICp0bDsKK2luZmxhdGVfaHVmdCAqdGQ7IC8qIG5lZWQgc2VwYXJhdGUgZGVjbGFyYXRpb24gZm9yIEJvcmxhbmQgQysrICovCitpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Cit6X3N0cmVhbXAgejsKK3sKKyAgaW5mbGF0ZV9odWZ0ICp0OyAgICAgIC8qIHRlbXBvcmFyeSBwb2ludGVyICovCisgIHVJbnQgZTsgICAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG9yIG9wZXJhdGlvbiAqLworICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgIEJ5dGVmICpwOyAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KKyAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLworICBCeXRlZiAqcTsgICAgICAgICAgICAgLyogb3V0cHV0IHdpbmRvdyB3cml0ZSBwb2ludGVyICovCisgIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLworICB1SW50IG1sOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbGl0ZXJhbC9sZW5ndGggdHJlZSAqLworICB1SW50IG1kOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgZGlzdGFuY2UgdHJlZSAqLworICB1SW50IGM7ICAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gY29weSAqLworICB1SW50IGQ7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IGZyb20gKi8KKyAgQnl0ZWYgKnI7ICAgICAgICAgICAgIC8qIGNvcHkgc291cmNlIHBvaW50ZXIgKi8KKworICAvKiBsb2FkIGlucHV0LCBvdXRwdXQsIGJpdCB2YWx1ZXMgKi8KKyAgTE9BRAorCisgIC8qIGluaXRpYWxpemUgbWFza3MgKi8KKyAgbWwgPSBpbmZsYXRlX21hc2tbYmxdOworICBtZCA9IGluZmxhdGVfbWFza1tiZF07CisKKyAgLyogZG8gdW50aWwgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgc3BhY2UgZm9yIGZhc3QgbG9vcCAqLworICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgY2FsbGVkIHdpdGggbSA+PSAyNTggJiYgbiA+PSAxMCAqLworICAgIC8qIGdldCBsaXRlcmFsL2xlbmd0aCBjb2RlICovCisgICAgR1JBQkJJVFMoMjApICAgICAgICAgICAgICAgIC8qIG1heCBiaXRzIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlICovCisgICAgaWYgKChlID0gKHQgPSB0bCArICgodUludCliICYgbWwpKS0+ZXhvcCkgPT0gMCkKKyAgICB7CisgICAgICBEVU1QQklUUyh0LT5iaXRzKQorICAgICAgVHJhY2V2digoc3RkZXJyLCB0LT5iYXNlID49IDB4MjAgJiYgdC0+YmFzZSA8IDB4N2YgPworICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgICogbGl0ZXJhbCAnJWMnXG4iIDoKKyAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICAqIGxpdGVyYWwgMHglMDJ4XG4iLCB0LT5iYXNlKSk7CisgICAgICAqcSsrID0gKEJ5dGUpdC0+YmFzZTsKKyAgICAgIG0tLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBkbyB7CisgICAgICBEVU1QQklUUyh0LT5iaXRzKQorICAgICAgaWYgKGUgJiAxNikKKyAgICAgIHsKKyAgICAgICAgLyogZ2V0IGV4dHJhIGJpdHMgZm9yIGxlbmd0aCAqLworICAgICAgICBlICY9IDE1OworICAgICAgICBjID0gdC0+YmFzZSArICgodUludCliICYgaW5mbGF0ZV9tYXNrW2VdKTsKKyAgICAgICAgRFVNUEJJVFMoZSkKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICAqIGxlbmd0aCAldVxuIiwgYykpOworCisgICAgICAgIC8qIGRlY29kZSBkaXN0YW5jZSBiYXNlIG9mIGJsb2NrIHRvIGNvcHkgKi8KKyAgICAgICAgR1JBQkJJVFMoMTUpOyAgICAgICAgICAgLyogbWF4IGJpdHMgZm9yIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgZSA9ICh0ID0gdGQgKyAoKHVJbnQpYiAmIG1kKSktPmV4b3A7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBEVU1QQklUUyh0LT5iaXRzKQorICAgICAgICAgIGlmIChlICYgMTYpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogZ2V0IGV4dHJhIGJpdHMgdG8gYWRkIHRvIGRpc3RhbmNlIGJhc2UgKi8KKyAgICAgICAgICAgIGUgJj0gMTU7CisgICAgICAgICAgICBHUkFCQklUUyhlKSAgICAgICAgIC8qIGdldCBleHRyYSBiaXRzICh1cCB0byAxMykgKi8KKyAgICAgICAgICAgIGQgPSB0LT5iYXNlICsgKCh1SW50KWIgJiBpbmZsYXRlX21hc2tbZV0pOworICAgICAgICAgICAgRFVNUEJJVFMoZSkKKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgKiBkaXN0YW5jZSAldVxuIiwgZCkpOworCisgICAgICAgICAgICAvKiBkbyB0aGUgY29weSAqLworICAgICAgICAgICAgbSAtPSBjOworICAgICAgICAgICAgciA9IHEgLSBkOworICAgICAgICAgICAgaWYgKHIgPCBzLT53aW5kb3cpICAgICAgICAgICAgICAgICAgLyogd3JhcCBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHIgKz0gcy0+ZW5kIC0gcy0+d2luZG93OyAgICAgICAgLyogZm9yY2UgcG9pbnRlciBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgfSB3aGlsZSAociA8IHMtPndpbmRvdyk7ICAgICAgICAgIC8qIGNvdmVycyBpbnZhbGlkIGRpc3RhbmNlcyAqLworICAgICAgICAgICAgICBlID0gcy0+ZW5kIC0gcjsKKyAgICAgICAgICAgICAgaWYgKGMgPiBlKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyAtPSBlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cmFwcGVkIGNvcHkgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSAqcisrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tZSk7CisgICAgICAgICAgICAgICAgciA9IHMtPndpbmRvdzsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSAqcisrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tYyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vcm1hbCBjb3B5ICovCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gKnIrKzsgIGMtLTsKKyAgICAgICAgICAgICAgICAqcSsrID0gKnIrKzsgIGMtLTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpxKysgPSAqcisrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tYyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vcm1hbCBjb3B5ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOworICAgICAgICAgICAgICAqcSsrID0gKnIrKzsgIGMtLTsKKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpxKysgPSAqcisrOworICAgICAgICAgICAgICB9IHdoaWxlICgtLWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKChlICYgNjQpID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgdCArPSB0LT5iYXNlOworICAgICAgICAgICAgZSA9ICh0ICs9ICgodUludCliICYgaW5mbGF0ZV9tYXNrW2VdKSktPmV4b3A7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICBVTkdSQUIKKyAgICAgICAgICAgIFVQREFURQorICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICgoZSAmIDY0KSA9PSAwKQorICAgICAgeworICAgICAgICB0ICs9IHQtPmJhc2U7CisgICAgICAgIGlmICgoZSA9ICh0ICs9ICgodUludCliICYgaW5mbGF0ZV9tYXNrW2VdKSktPmV4b3ApID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBEVU1QQklUUyh0LT5iaXRzKQorICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdC0+YmFzZSA+PSAweDIwICYmIHQtPmJhc2UgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgKiBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICAqIGxpdGVyYWwgMHglMDJ4XG4iLCB0LT5iYXNlKSk7CisgICAgICAgICAgKnErKyA9IChCeXRlKXQtPmJhc2U7CisgICAgICAgICAgbS0tOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChlICYgMzIpCisgICAgICB7CisgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgKiBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgVU5HUkFCCisgICAgICAgIFVQREFURQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRU5EOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgIFVOR1JBQgorICAgICAgICBVUERBVEUKKyAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgxKTsKKyAgfSB3aGlsZSAobSA+PSAyNTggJiYgbiA+PSAxMCk7CisKKyAgLyogbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQtLXJlc3RvcmUgcG9pbnRlcnMgYW5kIHJldHVybiAqLworICBVTkdSQUIKKyAgVVBEQVRFCisgIHJldHVybiBaX09LOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mZmFzdC5oIGIvY29tbW9uL3psaWIvaW5mZmFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMWE0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9pbmZmYXN0LmgKQEAgLTAsMCArMSwxNyBAQAorLyogaW5mZmFzdC5oIC0tIGhlYWRlciB0byB1c2UgaW5mZmFzdC5jCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCitleHRlcm4gaW50IGluZmxhdGVfZmFzdCBPRigoCisgICAgdUludCwKKyAgICB1SW50LAorICAgIGluZmxhdGVfaHVmdCAqLAorICAgIGluZmxhdGVfaHVmdCAqLAorICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAorICAgIHpfc3RyZWFtcCApKTsKZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2luZmZpeGVkLmggYi9jb21tb24vemxpYi9pbmZmaXhlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjdlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9pbmZmaXhlZC5oCkBAIC0wLDAgKzEsMTUxIEBACisvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcworICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIG1ha2V0cmVlLmMgcHJvZ3JhbQorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCitsb2NhbCB1SW50IGZpeGVkX2JsID0gOTsKK2xvY2FsIHVJbnQgZml4ZWRfYmQgPSA1OworbG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX3RsW10gPSB7CisgICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgwfSwge3t7MCw4fX0sMTZ9LCB7e3s4NCw4fX0sMTE1fSwKKyAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTJ9LCB7e3swLDh9fSw0OH0sIHt7ezAsOX19LDE5Mn0sCisgICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTZ9LCB7e3swLDh9fSwzMn0sIHt7ezAsOX19LDE2MH0sCisgICAge3t7MCw4fX0sMH0sIHt7ezAsOH19LDEyOH0sIHt7ezAsOH19LDY0fSwge3t7MCw5fX0sMjI0fSwKKyAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg4fSwge3t7MCw4fX0sMjR9LCB7e3swLDl9fSwxNDR9LAorICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMH0sIHt7ezAsOH19LDU2fSwge3t7MCw5fX0sMjA4fSwKKyAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDR9LCB7e3swLDh9fSw0MH0sIHt7ezAsOX19LDE3Nn0sCisgICAge3t7MCw4fX0sOH0sIHt7ezAsOH19LDEzNn0sIHt7ezAsOH19LDcyfSwge3t7MCw5fX0sMjQwfSwKKyAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg0fSwge3t7MCw4fX0sMjB9LCB7e3s4NSw4fX0sMjI3fSwKKyAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTZ9LCB7e3swLDh9fSw1Mn0sIHt7ezAsOX19LDIwMH0sCisgICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAwfSwge3t7MCw4fX0sMzZ9LCB7e3swLDl9fSwxNjh9LAorICAgIHt7ezAsOH19LDR9LCB7e3swLDh9fSwxMzJ9LCB7e3swLDh9fSw2OH0sIHt7ezAsOX19LDIzMn0sCisgICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5Mn0sIHt7ezAsOH19LDI4fSwge3t7MCw5fX0sMTUyfSwKKyAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjR9LCB7e3swLDh9fSw2MH0sIHt7ezAsOX19LDIxNn0sCisgICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA4fSwge3t7MCw4fX0sNDR9LCB7e3swLDl9fSwxODR9LAorICAgIHt7ezAsOH19LDEyfSwge3t7MCw4fX0sMTQwfSwge3t7MCw4fX0sNzZ9LCB7e3swLDl9fSwyNDh9LAorICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODJ9LCB7e3swLDh9fSwxOH0sIHt7ezg1LDh9fSwxNjN9LAorICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNH0sIHt7ezAsOH19LDUwfSwge3t7MCw5fX0sMTk2fSwKKyAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OH0sIHt7ezAsOH19LDM0fSwge3t7MCw5fX0sMTY0fSwKKyAgICB7e3swLDh9fSwyfSwge3t7MCw4fX0sMTMwfSwge3t7MCw4fX0sNjZ9LCB7e3swLDl9fSwyMjh9LAorICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTB9LCB7e3swLDh9fSwyNn0sIHt7ezAsOX19LDE0OH0sCisgICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIyfSwge3t7MCw4fX0sNTh9LCB7e3swLDl9fSwyMTJ9LAorICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwNn0sIHt7ezAsOH19LDQyfSwge3t7MCw5fX0sMTgwfSwKKyAgICB7e3swLDh9fSwxMH0sIHt7ezAsOH19LDEzOH0sIHt7ezAsOH19LDc0fSwge3t7MCw5fX0sMjQ0fSwKKyAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg2fSwge3t7MCw4fX0sMjJ9LCB7e3sxOTIsOH19LDB9LAorICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOH0sIHt7ezAsOH19LDU0fSwge3t7MCw5fX0sMjA0fSwKKyAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDJ9LCB7e3swLDh9fSwzOH0sIHt7ezAsOX19LDE3Mn0sCisgICAge3t7MCw4fX0sNn0sIHt7ezAsOH19LDEzNH0sIHt7ezAsOH19LDcwfSwge3t7MCw5fX0sMjM2fSwKKyAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk0fSwge3t7MCw4fX0sMzB9LCB7e3swLDl9fSwxNTZ9LAorICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyNn0sIHt7ezAsOH19LDYyfSwge3t7MCw5fX0sMjIwfSwKKyAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTB9LCB7e3swLDh9fSw0Nn0sIHt7ezAsOX19LDE4OH0sCisgICAge3t7MCw4fX0sMTR9LCB7e3swLDh9fSwxNDJ9LCB7e3swLDh9fSw3OH0sIHt7ezAsOX19LDI1Mn0sCisgICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgxfSwge3t7MCw4fX0sMTd9LCB7e3s4NSw4fX0sMTMxfSwKKyAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTN9LCB7e3swLDh9fSw0OX0sIHt7ezAsOX19LDE5NH0sCisgICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTd9LCB7e3swLDh9fSwzM30sIHt7ezAsOX19LDE2Mn0sCisgICAge3t7MCw4fX0sMX0sIHt7ezAsOH19LDEyOX0sIHt7ezAsOH19LDY1fSwge3t7MCw5fX0sMjI2fSwKKyAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg5fSwge3t7MCw4fX0sMjV9LCB7e3swLDl9fSwxNDZ9LAorICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMX0sIHt7ezAsOH19LDU3fSwge3t7MCw5fX0sMjEwfSwKKyAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDV9LCB7e3swLDh9fSw0MX0sIHt7ezAsOX19LDE3OH0sCisgICAge3t7MCw4fX0sOX0sIHt7ezAsOH19LDEzN30sIHt7ezAsOH19LDczfSwge3t7MCw5fX0sMjQyfSwKKyAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg1fSwge3t7MCw4fX0sMjF9LCB7e3s4MCw4fX0sMjU4fSwKKyAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTd9LCB7e3swLDh9fSw1M30sIHt7ezAsOX19LDIwMn0sCisgICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAxfSwge3t7MCw4fX0sMzd9LCB7e3swLDl9fSwxNzB9LAorICAgIHt7ezAsOH19LDV9LCB7e3swLDh9fSwxMzN9LCB7e3swLDh9fSw2OX0sIHt7ezAsOX19LDIzNH0sCisgICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5M30sIHt7ezAsOH19LDI5fSwge3t7MCw5fX0sMTU0fSwKKyAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjV9LCB7e3swLDh9fSw2MX0sIHt7ezAsOX19LDIxOH0sCisgICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA5fSwge3t7MCw4fX0sNDV9LCB7e3swLDl9fSwxODZ9LAorICAgIHt7ezAsOH19LDEzfSwge3t7MCw4fX0sMTQxfSwge3t7MCw4fX0sNzd9LCB7e3swLDl9fSwyNTB9LAorICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODN9LCB7e3swLDh9fSwxOX0sIHt7ezg1LDh9fSwxOTV9LAorICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNX0sIHt7ezAsOH19LDUxfSwge3t7MCw5fX0sMTk4fSwKKyAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OX0sIHt7ezAsOH19LDM1fSwge3t7MCw5fX0sMTY2fSwKKyAgICB7e3swLDh9fSwzfSwge3t7MCw4fX0sMTMxfSwge3t7MCw4fX0sNjd9LCB7e3swLDl9fSwyMzB9LAorICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTF9LCB7e3swLDh9fSwyN30sIHt7ezAsOX19LDE1MH0sCisgICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIzfSwge3t7MCw4fX0sNTl9LCB7e3swLDl9fSwyMTR9LAorICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwN30sIHt7ezAsOH19LDQzfSwge3t7MCw5fX0sMTgyfSwKKyAgICB7e3swLDh9fSwxMX0sIHt7ezAsOH19LDEzOX0sIHt7ezAsOH19LDc1fSwge3t7MCw5fX0sMjQ2fSwKKyAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg3fSwge3t7MCw4fX0sMjN9LCB7e3sxOTIsOH19LDB9LAorICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOX0sIHt7ezAsOH19LDU1fSwge3t7MCw5fX0sMjA2fSwKKyAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDN9LCB7e3swLDh9fSwzOX0sIHt7ezAsOX19LDE3NH0sCisgICAge3t7MCw4fX0sN30sIHt7ezAsOH19LDEzNX0sIHt7ezAsOH19LDcxfSwge3t7MCw5fX0sMjM4fSwKKyAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk1fSwge3t7MCw4fX0sMzF9LCB7e3swLDl9fSwxNTh9LAorICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyN30sIHt7ezAsOH19LDYzfSwge3t7MCw5fX0sMjIyfSwKKyAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTF9LCB7e3swLDh9fSw0N30sIHt7ezAsOX19LDE5MH0sCisgICAge3t7MCw4fX0sMTV9LCB7e3swLDh9fSwxNDN9LCB7e3swLDh9fSw3OX0sIHt7ezAsOX19LDI1NH0sCisgICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgwfSwge3t7MCw4fX0sMTZ9LCB7e3s4NCw4fX0sMTE1fSwKKyAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTJ9LCB7e3swLDh9fSw0OH0sIHt7ezAsOX19LDE5M30sCisgICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTZ9LCB7e3swLDh9fSwzMn0sIHt7ezAsOX19LDE2MX0sCisgICAge3t7MCw4fX0sMH0sIHt7ezAsOH19LDEyOH0sIHt7ezAsOH19LDY0fSwge3t7MCw5fX0sMjI1fSwKKyAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg4fSwge3t7MCw4fX0sMjR9LCB7e3swLDl9fSwxNDV9LAorICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMH0sIHt7ezAsOH19LDU2fSwge3t7MCw5fX0sMjA5fSwKKyAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDR9LCB7e3swLDh9fSw0MH0sIHt7ezAsOX19LDE3N30sCisgICAge3t7MCw4fX0sOH0sIHt7ezAsOH19LDEzNn0sIHt7ezAsOH19LDcyfSwge3t7MCw5fX0sMjQxfSwKKyAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg0fSwge3t7MCw4fX0sMjB9LCB7e3s4NSw4fX0sMjI3fSwKKyAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTZ9LCB7e3swLDh9fSw1Mn0sIHt7ezAsOX19LDIwMX0sCisgICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAwfSwge3t7MCw4fX0sMzZ9LCB7e3swLDl9fSwxNjl9LAorICAgIHt7ezAsOH19LDR9LCB7e3swLDh9fSwxMzJ9LCB7e3swLDh9fSw2OH0sIHt7ezAsOX19LDIzM30sCisgICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5Mn0sIHt7ezAsOH19LDI4fSwge3t7MCw5fX0sMTUzfSwKKyAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjR9LCB7e3swLDh9fSw2MH0sIHt7ezAsOX19LDIxN30sCisgICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA4fSwge3t7MCw4fX0sNDR9LCB7e3swLDl9fSwxODV9LAorICAgIHt7ezAsOH19LDEyfSwge3t7MCw4fX0sMTQwfSwge3t7MCw4fX0sNzZ9LCB7e3swLDl9fSwyNDl9LAorICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODJ9LCB7e3swLDh9fSwxOH0sIHt7ezg1LDh9fSwxNjN9LAorICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNH0sIHt7ezAsOH19LDUwfSwge3t7MCw5fX0sMTk3fSwKKyAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OH0sIHt7ezAsOH19LDM0fSwge3t7MCw5fX0sMTY1fSwKKyAgICB7e3swLDh9fSwyfSwge3t7MCw4fX0sMTMwfSwge3t7MCw4fX0sNjZ9LCB7e3swLDl9fSwyMjl9LAorICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTB9LCB7e3swLDh9fSwyNn0sIHt7ezAsOX19LDE0OX0sCisgICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIyfSwge3t7MCw4fX0sNTh9LCB7e3swLDl9fSwyMTN9LAorICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwNn0sIHt7ezAsOH19LDQyfSwge3t7MCw5fX0sMTgxfSwKKyAgICB7e3swLDh9fSwxMH0sIHt7ezAsOH19LDEzOH0sIHt7ezAsOH19LDc0fSwge3t7MCw5fX0sMjQ1fSwKKyAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg2fSwge3t7MCw4fX0sMjJ9LCB7e3sxOTIsOH19LDB9LAorICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOH0sIHt7ezAsOH19LDU0fSwge3t7MCw5fX0sMjA1fSwKKyAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDJ9LCB7e3swLDh9fSwzOH0sIHt7ezAsOX19LDE3M30sCisgICAge3t7MCw4fX0sNn0sIHt7ezAsOH19LDEzNH0sIHt7ezAsOH19LDcwfSwge3t7MCw5fX0sMjM3fSwKKyAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk0fSwge3t7MCw4fX0sMzB9LCB7e3swLDl9fSwxNTd9LAorICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyNn0sIHt7ezAsOH19LDYyfSwge3t7MCw5fX0sMjIxfSwKKyAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTB9LCB7e3swLDh9fSw0Nn0sIHt7ezAsOX19LDE4OX0sCisgICAge3t7MCw4fX0sMTR9LCB7e3swLDh9fSwxNDJ9LCB7e3swLDh9fSw3OH0sIHt7ezAsOX19LDI1M30sCisgICAge3t7OTYsN319LDI1Nn0sIHt7ezAsOH19LDgxfSwge3t7MCw4fX0sMTd9LCB7e3s4NSw4fX0sMTMxfSwKKyAgICB7e3s4Miw3fX0sMzF9LCB7e3swLDh9fSwxMTN9LCB7e3swLDh9fSw0OX0sIHt7ezAsOX19LDE5NX0sCisgICAge3t7ODAsN319LDEwfSwge3t7MCw4fX0sOTd9LCB7e3swLDh9fSwzM30sIHt7ezAsOX19LDE2M30sCisgICAge3t7MCw4fX0sMX0sIHt7ezAsOH19LDEyOX0sIHt7ezAsOH19LDY1fSwge3t7MCw5fX0sMjI3fSwKKyAgICB7e3s4MCw3fX0sNn0sIHt7ezAsOH19LDg5fSwge3t7MCw4fX0sMjV9LCB7e3swLDl9fSwxNDd9LAorICAgIHt7ezgzLDd9fSw1OX0sIHt7ezAsOH19LDEyMX0sIHt7ezAsOH19LDU3fSwge3t7MCw5fX0sMjExfSwKKyAgICB7e3s4MSw3fX0sMTd9LCB7e3swLDh9fSwxMDV9LCB7e3swLDh9fSw0MX0sIHt7ezAsOX19LDE3OX0sCisgICAge3t7MCw4fX0sOX0sIHt7ezAsOH19LDEzN30sIHt7ezAsOH19LDczfSwge3t7MCw5fX0sMjQzfSwKKyAgICB7e3s4MCw3fX0sNH0sIHt7ezAsOH19LDg1fSwge3t7MCw4fX0sMjF9LCB7e3s4MCw4fX0sMjU4fSwKKyAgICB7e3s4Myw3fX0sNDN9LCB7e3swLDh9fSwxMTd9LCB7e3swLDh9fSw1M30sIHt7ezAsOX19LDIwM30sCisgICAge3t7ODEsN319LDEzfSwge3t7MCw4fX0sMTAxfSwge3t7MCw4fX0sMzd9LCB7e3swLDl9fSwxNzF9LAorICAgIHt7ezAsOH19LDV9LCB7e3swLDh9fSwxMzN9LCB7e3swLDh9fSw2OX0sIHt7ezAsOX19LDIzNX0sCisgICAge3t7ODAsN319LDh9LCB7e3swLDh9fSw5M30sIHt7ezAsOH19LDI5fSwge3t7MCw5fX0sMTU1fSwKKyAgICB7e3s4NCw3fX0sODN9LCB7e3swLDh9fSwxMjV9LCB7e3swLDh9fSw2MX0sIHt7ezAsOX19LDIxOX0sCisgICAge3t7ODIsN319LDIzfSwge3t7MCw4fX0sMTA5fSwge3t7MCw4fX0sNDV9LCB7e3swLDl9fSwxODd9LAorICAgIHt7ezAsOH19LDEzfSwge3t7MCw4fX0sMTQxfSwge3t7MCw4fX0sNzd9LCB7e3swLDl9fSwyNTF9LAorICAgIHt7ezgwLDd9fSwzfSwge3t7MCw4fX0sODN9LCB7e3swLDh9fSwxOX0sIHt7ezg1LDh9fSwxOTV9LAorICAgIHt7ezgzLDd9fSwzNX0sIHt7ezAsOH19LDExNX0sIHt7ezAsOH19LDUxfSwge3t7MCw5fX0sMTk5fSwKKyAgICB7e3s4MSw3fX0sMTF9LCB7e3swLDh9fSw5OX0sIHt7ezAsOH19LDM1fSwge3t7MCw5fX0sMTY3fSwKKyAgICB7e3swLDh9fSwzfSwge3t7MCw4fX0sMTMxfSwge3t7MCw4fX0sNjd9LCB7e3swLDl9fSwyMzF9LAorICAgIHt7ezgwLDd9fSw3fSwge3t7MCw4fX0sOTF9LCB7e3swLDh9fSwyN30sIHt7ezAsOX19LDE1MX0sCisgICAge3t7ODQsN319LDY3fSwge3t7MCw4fX0sMTIzfSwge3t7MCw4fX0sNTl9LCB7e3swLDl9fSwyMTV9LAorICAgIHt7ezgyLDd9fSwxOX0sIHt7ezAsOH19LDEwN30sIHt7ezAsOH19LDQzfSwge3t7MCw5fX0sMTgzfSwKKyAgICB7e3swLDh9fSwxMX0sIHt7ezAsOH19LDEzOX0sIHt7ezAsOH19LDc1fSwge3t7MCw5fX0sMjQ3fSwKKyAgICB7e3s4MCw3fX0sNX0sIHt7ezAsOH19LDg3fSwge3t7MCw4fX0sMjN9LCB7e3sxOTIsOH19LDB9LAorICAgIHt7ezgzLDd9fSw1MX0sIHt7ezAsOH19LDExOX0sIHt7ezAsOH19LDU1fSwge3t7MCw5fX0sMjA3fSwKKyAgICB7e3s4MSw3fX0sMTV9LCB7e3swLDh9fSwxMDN9LCB7e3swLDh9fSwzOX0sIHt7ezAsOX19LDE3NX0sCisgICAge3t7MCw4fX0sN30sIHt7ezAsOH19LDEzNX0sIHt7ezAsOH19LDcxfSwge3t7MCw5fX0sMjM5fSwKKyAgICB7e3s4MCw3fX0sOX0sIHt7ezAsOH19LDk1fSwge3t7MCw4fX0sMzF9LCB7e3swLDl9fSwxNTl9LAorICAgIHt7ezg0LDd9fSw5OX0sIHt7ezAsOH19LDEyN30sIHt7ezAsOH19LDYzfSwge3t7MCw5fX0sMjIzfSwKKyAgICB7e3s4Miw3fX0sMjd9LCB7e3swLDh9fSwxMTF9LCB7e3swLDh9fSw0N30sIHt7ezAsOX19LDE5MX0sCisgICAge3t7MCw4fX0sMTV9LCB7e3swLDh9fSwxNDN9LCB7e3swLDh9fSw3OX0sIHt7ezAsOX19LDI1NX0KKyAgfTsKK2xvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF90ZFtdID0geworICAgIHt7ezgwLDV9fSwxfSwge3t7ODcsNX19LDI1N30sIHt7ezgzLDV9fSwxN30sIHt7ezkxLDV9fSw0MDk3fSwKKyAgICB7e3s4MSw1fX0sNX0sIHt7ezg5LDV9fSwxMDI1fSwge3t7ODUsNX19LDY1fSwge3t7OTMsNX19LDE2Mzg1fSwKKyAgICB7e3s4MCw1fX0sM30sIHt7ezg4LDV9fSw1MTN9LCB7e3s4NCw1fX0sMzN9LCB7e3s5Miw1fX0sODE5M30sCisgICAge3t7ODIsNX19LDl9LCB7e3s5MCw1fX0sMjA0OX0sIHt7ezg2LDV9fSwxMjl9LCB7e3sxOTIsNX19LDI0NTc3fSwKKyAgICB7e3s4MCw1fX0sMn0sIHt7ezg3LDV9fSwzODV9LCB7e3s4Myw1fX0sMjV9LCB7e3s5MSw1fX0sNjE0NX0sCisgICAge3t7ODEsNX19LDd9LCB7e3s4OSw1fX0sMTUzN30sIHt7ezg1LDV9fSw5N30sIHt7ezkzLDV9fSwyNDU3N30sCisgICAge3t7ODAsNX19LDR9LCB7e3s4OCw1fX0sNzY5fSwge3t7ODQsNX19LDQ5fSwge3t7OTIsNX19LDEyMjg5fSwKKyAgICB7e3s4Miw1fX0sMTN9LCB7e3s5MCw1fX0sMzA3M30sIHt7ezg2LDV9fSwxOTN9LCB7e3sxOTIsNX19LDI0NTc3fQorICB9OwpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mbGF0ZS5jIGIvY29tbW9uL3psaWIvaW5mbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjJlODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi9pbmZsYXRlLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qIGluZmxhdGUuYyAtLSB6bGliIGludGVyZmFjZSB0byBpbmZsYXRlIG1vZHVsZXMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mYmxvY2suaCIKKworc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworCit0eXBlZGVmIGVudW0geworICAgICAgTUVUSE9ELCAgIC8qIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlICovCisgICAgICBGTEFHLCAgICAgLyogd2FpdGluZyBmb3IgZmxhZyBieXRlICovCisgICAgICBESUNUNCwgICAgLyogZm91ciBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCisgICAgICBESUNUMywgICAgLyogdGhyZWUgZGljdGlvbmFyeSBjaGVjayBieXRlcyB0byBnbyAqLworICAgICAgRElDVDIsICAgIC8qIHR3byBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCisgICAgICBESUNUMSwgICAgLyogb25lIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZSB0byBnbyAqLworICAgICAgRElDVDAsICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5ICovCisgICAgICBCTE9DS1MsICAgLyogZGVjb21wcmVzc2luZyBibG9ja3MgKi8KKyAgICAgIENIRUNLNCwgICAvKiBmb3VyIGNoZWNrIGJ5dGVzIHRvIGdvICovCisgICAgICBDSEVDSzMsICAgLyogdGhyZWUgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KKyAgICAgIENIRUNLMiwgICAvKiB0d28gY2hlY2sgYnl0ZXMgdG8gZ28gKi8KKyAgICAgIENIRUNLMSwgICAvKiBvbmUgY2hlY2sgYnl0ZSB0byBnbyAqLworICAgICAgRE9ORSwgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lICovCisgICAgICBCQUR9ICAgICAgLyogZ290IGFuIGVycm9yLS1zdGF5IGhlcmUgKi8KK2luZmxhdGVfbW9kZTsKKworLyogaW5mbGF0ZSBwcml2YXRlIHN0YXRlICovCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgeworCisgIC8qIG1vZGUgKi8KKyAgaW5mbGF0ZV9tb2RlICBtb2RlOyAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCisKKyAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KKyAgdW5pb24geworICAgIHVJbnQgbWV0aG9kOyAgICAgICAgLyogaWYgRkxBR1MsIG1ldGhvZCBieXRlICovCisgICAgc3RydWN0IHsKKyAgICAgIHVMb25nIHdhczsgICAgICAgICAgICAgICAgLyogY29tcHV0ZWQgY2hlY2sgdmFsdWUgKi8KKyAgICAgIHVMb25nIG5lZWQ7ICAgICAgICAgICAgICAgLyogc3RyZWFtIGNoZWNrIHZhbHVlICovCisgICAgfSBjaGVjazsgICAgICAgICAgICAvKiBpZiBDSEVDSywgY2hlY2sgdmFsdWVzIHRvIGNvbXBhcmUgKi8KKyAgICB1SW50IG1hcmtlcjsgICAgICAgIC8qIGlmIEJBRCwgaW5mbGF0ZVN5bmMncyBtYXJrZXIgYnl0ZXMgY291bnQgKi8KKyAgfSBzdWI7ICAgICAgICAvKiBzdWJtb2RlICovCisKKyAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLworICBpbnQgIG5vd3JhcDsgICAgICAgICAgLyogZmxhZyBmb3Igbm8gd3JhcHBlciAqLworICB1SW50IHdiaXRzOyAgICAgICAgICAgLyogbG9nMih3aW5kb3cgc2l6ZSkgICg4Li4xNSwgZGVmYXVsdHMgdG8gMTUpICovCisgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAKKyAgICAqYmxvY2tzOyAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZV9ibG9ja3Mgc3RhdGUgKi8KKworfTsKKworCitpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoeikKK3pfc3RyZWFtcCB6OworeworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgei0+dG90YWxfaW4gPSB6LT50b3RhbF9vdXQgPSAwOworICB6LT5tc2cgPSBaX05VTEw7CisgIHotPnN0YXRlLT5tb2RlID0gei0+c3RhdGUtPm5vd3JhcCA/IEJMT0NLUyA6IE1FVEhPRDsKKyAgaW5mbGF0ZV9ibG9ja3NfcmVzZXQoei0+c3RhdGUtPmJsb2NrcywgeiwgWl9OVUxMKTsKKyAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOworICByZXR1cm4gWl9PSzsKK30KKworCitpbnQgWkVYUE9SVCBpbmZsYXRlRW5kKHopCit6X3N0cmVhbXAgejsKK3sKKyAgaWYgKHogPT0gWl9OVUxMIHx8IHotPnN0YXRlID09IFpfTlVMTCB8fCB6LT56ZnJlZSA9PSBaX05VTEwpCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICBpZiAoei0+c3RhdGUtPmJsb2NrcyAhPSBaX05VTEwpCisgICAgaW5mbGF0ZV9ibG9ja3NfZnJlZSh6LT5zdGF0ZS0+YmxvY2tzLCB6KTsKKyAgWkZSRUUoeiwgei0+c3RhdGUpOworICB6LT5zdGF0ZSA9IFpfTlVMTDsKKyAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKKyAgcmV0dXJuIFpfT0s7Cit9CisKKworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyh6LCB3LCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKK3pfc3RyZWFtcCB6OworaW50IHc7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpCisgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOworCisgIC8qIGluaXRpYWxpemUgc3RhdGUgKi8KKyAgaWYgKHogPT0gWl9OVUxMKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgei0+bXNnID0gWl9OVUxMOworICBpZiAoei0+emFsbG9jID09IFpfTlVMTCkKKyAgeworICAgIHotPnphbGxvYyA9IHpjYWxsb2M7CisgICAgei0+b3BhcXVlID0gKHZvaWRwZikwOworICB9CisgIGlmICh6LT56ZnJlZSA9PSBaX05VTEwpIHotPnpmcmVlID0gemNmcmVlOworICBpZiAoKHotPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKikKKyAgICAgICBaQUxMT0MoeiwxLHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUpKSkgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgei0+c3RhdGUtPmJsb2NrcyA9IFpfTlVMTDsKKworICAvKiBoYW5kbGUgdW5kb2N1bWVudGVkIG5vd3JhcCBvcHRpb24gKG5vIHpsaWIgaGVhZGVyIG9yIGNoZWNrKSAqLworICB6LT5zdGF0ZS0+bm93cmFwID0gMDsKKyAgaWYgKHcgPCAwKQorICB7CisgICAgdyA9IC0gdzsKKyAgICB6LT5zdGF0ZS0+bm93cmFwID0gMTsKKyAgfQorCisgIC8qIHNldCB3aW5kb3cgc2l6ZSAqLworICBpZiAodyA8IDggfHwgdyA+IDE1KQorICB7CisgICAgaW5mbGF0ZUVuZCh6KTsKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgIH0KKyAgei0+c3RhdGUtPndiaXRzID0gKHVJbnQpdzsKKworICAvKiBjcmVhdGUgaW5mbGF0ZV9ibG9ja3Mgc3RhdGUgKi8KKyAgaWYgKCh6LT5zdGF0ZS0+YmxvY2tzID0KKyAgICAgIGluZmxhdGVfYmxvY2tzX25ldyh6LCB6LT5zdGF0ZS0+bm93cmFwID8gWl9OVUxMIDogYWRsZXIzMiwgKHVJbnQpMSA8PCB3KSkKKyAgICAgID09IFpfTlVMTCkKKyAgeworICAgIGluZmxhdGVFbmQoeik7CisgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICB9CisgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisKKyAgLyogcmVzZXQgc3RhdGUgKi8KKyAgaW5mbGF0ZVJlc2V0KHopOworICByZXR1cm4gWl9PSzsKK30KKworCitpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oeiwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgejsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgIHJldHVybiBpbmZsYXRlSW5pdDJfKHosIERFRl9XQklUUywgdmVyc2lvbiwgc3RyZWFtX3NpemUpOworfQorCisKKyNkZWZpbmUgTkVFREJZVEUge2lmKHotPmF2YWlsX2luPT0wKXJldHVybiByO3I9Zjt9CisjZGVmaW5lIE5FWFRCWVRFICh6LT5hdmFpbF9pbi0tLHotPnRvdGFsX2luKyssKnotPm5leHRfaW4rKykKKworaW50IFpFWFBPUlQgaW5mbGF0ZSh6LCBmKQorel9zdHJlYW1wIHo7CitpbnQgZjsKK3sKKyAgaW50IHI7CisgIHVJbnQgYjsKKworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPm5leHRfaW4gPT0gWl9OVUxMKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgZiA9IGYgPT0gWl9GSU5JU0ggPyBaX0JVRl9FUlJPUiA6IFpfT0s7CisgIHIgPSBaX0JVRl9FUlJPUjsKKyAgd2hpbGUgKDEpIHN3aXRjaCAoei0+c3RhdGUtPm1vZGUpCisgIHsKKyAgICBjYXNlIE1FVEhPRDoKKyAgICAgIE5FRURCWVRFCisgICAgICBpZiAoKCh6LT5zdGF0ZS0+c3ViLm1ldGhvZCA9IE5FWFRCWVRFKSAmIDB4ZikgIT0gWl9ERUZMQVRFRCkKKyAgICAgIHsKKyAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgIHotPm1zZyA9IChjaGFyKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOworICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPj4gNCkgKyA4ID4gei0+c3RhdGUtPndiaXRzKQorICAgICAgeworICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIHdpbmRvdyBzaXplIjsKKyAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEZMQUc7CisgICAgY2FzZSBGTEFHOgorICAgICAgTkVFREJZVEUKKyAgICAgIGIgPSBORVhUQllURTsKKyAgICAgIGlmICgoKHotPnN0YXRlLT5zdWIubWV0aG9kIDw8IDgpICsgYikgJSAzMSkKKyAgICAgIHsKKyAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb3JyZWN0IGhlYWRlciBjaGVjayI7CisgICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gNTsgICAgICAgLyogY2FuJ3QgdHJ5IGluZmxhdGVTeW5jICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGhlYWRlciBva1xuIikpOworICAgICAgaWYgKCEoYiAmIFBSRVNFVF9ESUNUKSkKKyAgICAgIHsKKyAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUNDsKKyAgICBjYXNlIERJQ1Q0OgorICAgICAgTkVFREJZVEUKKyAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCA9ICh1TG9uZylORVhUQllURSA8PCAyNDsKKyAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDM7CisgICAgY2FzZSBESUNUMzoKKyAgICAgIE5FRURCWVRFCisgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OworICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMjsKKyAgICBjYXNlIERJQ1QyOgorICAgICAgTkVFREJZVEUKKyAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgODsKKyAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDE7CisgICAgY2FzZSBESUNUMToKKyAgICAgIE5FRURCWVRFCisgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFOworICAgICAgei0+YWRsZXIgPSB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQ7CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1QwOworICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUOworICAgIGNhc2UgRElDVDA6CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgIHotPm1zZyA9IChjaGFyKikibmVlZCBkaWN0aW9uYXJ5IjsKKyAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLworICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIGNhc2UgQkxPQ0tTOgorICAgICAgciA9IGluZmxhdGVfYmxvY2tzKHotPnN0YXRlLT5ibG9ja3MsIHosIHIpOworICAgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQorICAgICAgeworICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOyAgICAgICAvKiBjYW4gdHJ5IGluZmxhdGVTeW5jICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHIgPT0gWl9PSykKKyAgICAgICAgciA9IGY7CisgICAgICBpZiAociAhPSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHJldHVybiByOworICAgICAgciA9IGY7CisgICAgICBpbmZsYXRlX2Jsb2Nrc19yZXNldCh6LT5zdGF0ZS0+YmxvY2tzLCB6LCAmei0+c3RhdGUtPnN1Yi5jaGVjay53YXMpOworICAgICAgaWYgKHotPnN0YXRlLT5ub3dyYXApCisgICAgICB7CisgICAgICAgIHotPnN0YXRlLT5tb2RlID0gRE9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLNDsKKyAgICBjYXNlIENIRUNLNDoKKyAgICAgIE5FRURCWVRFCisgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgPSAodUxvbmcpTkVYVEJZVEUgPDwgMjQ7CisgICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMzsKKyAgICBjYXNlIENIRUNLMzoKKyAgICAgIE5FRURCWVRFCisgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OworICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzI7CisgICAgY2FzZSBDSEVDSzI6CisgICAgICBORUVEQllURQorICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCA4OworICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzE7CisgICAgY2FzZSBDSEVDSzE6CisgICAgICBORUVEQllURQorICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURTsKKworICAgICAgaWYgKHotPnN0YXRlLT5zdWIuY2hlY2sud2FzICE9IHotPnN0YXRlLT5zdWIuY2hlY2submVlZCkKKyAgICAgIHsKKyAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgIHotPm1zZyA9IChjaGFyKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOworICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBjaGVjayBva1xuIikpOworICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOworICAgIGNhc2UgRE9ORToKKyAgICAgIHJldHVybiBaX1NUUkVBTV9FTkQ7CisgICAgY2FzZSBCQUQ6CisgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgIH0KKyNpZmRlZiBORUVEX0RVTU1ZX1JFVFVSTgorICByZXR1cm4gWl9TVFJFQU1fRVJST1I7ICAvKiBTb21lIGR1bWIgY29tcGlsZXJzIGNvbXBsYWluIHdpdGhvdXQgdGhpcyAqLworI2VuZGlmCit9CisKKworaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkoeiwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKK3pfc3RyZWFtcCB6OworY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7Cit1SW50ICBkaWN0TGVuZ3RoOworeworICB1SW50IGxlbmd0aCA9IGRpY3RMZW5ndGg7CisKKyAgaWYgKHogPT0gWl9OVUxMIHx8IHotPnN0YXRlID09IFpfTlVMTCB8fCB6LT5zdGF0ZS0+bW9kZSAhPSBESUNUMCkKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgaWYgKGFkbGVyMzIoMUwsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpICE9IHotPmFkbGVyKSByZXR1cm4gWl9EQVRBX0VSUk9SOworICB6LT5hZGxlciA9IDFMOworCisgIGlmIChsZW5ndGggPj0gKCh1SW50KTE8PHotPnN0YXRlLT53Yml0cykpCisgIHsKKyAgICBsZW5ndGggPSAoMTw8ei0+c3RhdGUtPndiaXRzKS0xOworICAgIGRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIGxlbmd0aDsKKyAgfQorICBpbmZsYXRlX3NldF9kaWN0aW9uYXJ5KHotPnN0YXRlLT5ibG9ja3MsIGRpY3Rpb25hcnksIGxlbmd0aCk7CisgIHotPnN0YXRlLT5tb2RlID0gQkxPQ0tTOworICByZXR1cm4gWl9PSzsKK30KKworCitpbnQgWkVYUE9SVCBpbmZsYXRlU3luYyh6KQorel9zdHJlYW1wIHo7Cit7CisgIHVJbnQgbjsgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgKi8KKyAgQnl0ZWYgKnA7ICAgICAvKiBwb2ludGVyIHRvIGJ5dGVzICovCisgIHVJbnQgbTsgICAgICAgLyogbnVtYmVyIG9mIG1hcmtlciBieXRlcyBmb3VuZCBpbiBhIHJvdyAqLworICB1TG9uZyByLCB3OyAgIC8qIHRlbXBvcmFyaWVzIHRvIHNhdmUgdG90YWxfaW4gYW5kIHRvdGFsX291dCAqLworCisgIC8qIHNldCB1cCAqLworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgaWYgKHotPnN0YXRlLT5tb2RlICE9IEJBRCkKKyAgeworICAgIHotPnN0YXRlLT5tb2RlID0gQkFEOworICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsKKyAgfQorICBpZiAoKG4gPSB6LT5hdmFpbF9pbikgPT0gMCkKKyAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgIHAgPSB6LT5uZXh0X2luOworICBtID0gei0+c3RhdGUtPnN1Yi5tYXJrZXI7CisKKyAgLyogc2VhcmNoICovCisgIHdoaWxlIChuICYmIG0gPCA0KQorICB7CisgICAgc3RhdGljIGNvbnN0IEJ5dGUgbWFya1s0XSA9IHswLCAwLCAweGZmLCAweGZmfTsKKyAgICBpZiAoKnAgPT0gbWFya1ttXSkKKyAgICAgIG0rKzsKKyAgICBlbHNlIGlmICgqcCkKKyAgICAgIG0gPSAwOworICAgIGVsc2UKKyAgICAgIG0gPSA0IC0gbTsKKyAgICBwKyssIG4tLTsKKyAgfQorCisgIC8qIHJlc3RvcmUgKi8KKyAgei0+dG90YWxfaW4gKz0gcCAtIHotPm5leHRfaW47CisgIHotPm5leHRfaW4gPSBwOworICB6LT5hdmFpbF9pbiA9IG47CisgIHotPnN0YXRlLT5zdWIubWFya2VyID0gbTsKKworICAvKiByZXR1cm4gbm8gam95IG9yIHNldCB1cCB0byByZXN0YXJ0IG9uIGEgbmV3IGJsb2NrICovCisgIGlmIChtICE9IDQpCisgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgciA9IHotPnRvdGFsX2luOyAgdyA9IHotPnRvdGFsX291dDsKKyAgaW5mbGF0ZVJlc2V0KHopOworICB6LT50b3RhbF9pbiA9IHI7ICB6LT50b3RhbF9vdXQgPSB3OworICB6LT5zdGF0ZS0+bW9kZSA9IEJMT0NLUzsKKyAgcmV0dXJuIFpfT0s7Cit9CisKKworLyogUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQKKyAqIGJ5IFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBvbmUgUFBQCisgKiBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrLiBQUFAgdXNlcyBaX1NZTkNfRkxVU0gKKyAqIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQgYmxvY2suIFdoZW4KKyAqIGRlY29tcHJlc3NpbmcsIFBQUCBjaGVja3MgdGhhdCBhdCB0aGUgZW5kIG9mIGlucHV0IHBhY2tldCwgaW5mbGF0ZSBpcworICogd2FpdGluZyBmb3IgdGhlc2UgbGVuZ3RoIGJ5dGVzLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50KHopCit6X3N0cmVhbXAgejsKK3sKKyAgaWYgKHogPT0gWl9OVUxMIHx8IHotPnN0YXRlID09IFpfTlVMTCB8fCB6LT5zdGF0ZS0+YmxvY2tzID09IFpfTlVMTCkKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgIHJldHVybiBpbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50KHotPnN0YXRlLT5ibG9ja3MpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mdHJlZXMuYyBiL2NvbW1vbi96bGliL2luZnRyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMmNhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZnRyZWVzLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qIGluZnRyZWVzLmMgLS0gZ2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisKKyNpZiAhZGVmaW5lZChCVUlMREZJWEVEKSAmJiAhZGVmaW5lZChTVERDKQorIyAgZGVmaW5lIEJVSUxERklYRUQgICAvKiBub24gQU5TSSBjb21waWxlcnMgbWF5IG5vdCBhY2NlcHQgaW5mZml4ZWQuaCAqLworI2VuZGlmCisKK2NvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGluZmxhdGUgMS4xLjQgQ29weXJpZ2h0IDE5OTUtMjAwMiBNYXJrIEFkbGVyICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworCisvKiBzaW1wbGlmeSB0aGUgdXNlIG9mIHRoZSBpbmZsYXRlX2h1ZnQgdHlwZSB3aXRoIHNvbWUgZGVmaW5lcyAqLworI2RlZmluZSBleG9wIHdvcmQud2hhdC5FeG9wCisjZGVmaW5lIGJpdHMgd29yZC53aGF0LkJpdHMKKworCitsb2NhbCBpbnQgaHVmdF9idWlsZCBPRigoCisgICAgdUludGYgKiwgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAqLworICAgIHVJbnQsICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzICovCisgICAgdUludCwgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgInNpbXBsZSIgY29kZXMgKi8KKyAgICBjb25zdCB1SW50ZiAqLCAgICAgIC8qIGxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KKyAgICBjb25zdCB1SW50ZiAqLCAgICAgIC8qIGxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworICAgIGluZmxhdGVfaHVmdCAqIEZBUiosLyogcmVzdWx0OiBzdGFydGluZyB0YWJsZSAqLworICAgIHVJbnRmICosICAgICAgICAgICAgLyogbWF4aW11bSBsb29rdXAgYml0cyAocmV0dXJucyBhY3R1YWwpICovCisgICAgaW5mbGF0ZV9odWZ0ICosICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KKyAgICB1SW50ICosICAgICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KKyAgICB1SW50ZiAqICkpOyAgICAgICAgIC8qIHNwYWNlIGZvciB2YWx1ZXMgKi8KKworLyogVGFibGVzIGZvciBkZWZsYXRlIGZyb20gUEtaSVAncyBhcHBub3RlLnR4dC4gKi8KK2xvY2FsIGNvbnN0IHVJbnQgY3BsZW5zWzMxXSA9IHsgLyogQ29weSBsZW5ndGhzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCisgICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsCisgICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwfTsKKyAgICAgICAgLyogc2VlIG5vdGUgIzEzIGFib3ZlIGFib3V0IDI1OCAqLworbG9jYWwgY29uc3QgdUludCBjcGxleHRbMzFdID0geyAvKiBFeHRyYSBiaXRzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCisgICAgICAgIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDAsIDExMiwgMTEyfTsgLyogMTEyPT1pbnZhbGlkICovCitsb2NhbCBjb25zdCB1SW50IGNwZGlzdFszMF0gPSB7IC8qIENvcHkgb2Zmc2V0cyBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAorICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCisgICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1Nzd9OworbG9jYWwgY29uc3QgdUludCBjcGRleHRbMzBdID0geyAvKiBFeHRyYSBiaXRzIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LAorICAgICAgICA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwKKyAgICAgICAgMTIsIDEyLCAxMywgMTN9OworCisvKgorICAgSHVmZm1hbiBjb2RlIGRlY29kaW5nIGlzIHBlcmZvcm1lZCB1c2luZyBhIG11bHRpLWxldmVsIHRhYmxlIGxvb2t1cC4KKyAgIFRoZSBmYXN0ZXN0IHdheSB0byBkZWNvZGUgaXMgdG8gc2ltcGx5IGJ1aWxkIGEgbG9va3VwIHRhYmxlIHdob3NlCisgICBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsIHRoZSB0aW1lIGl0IHRha2VzCisgICB0byBidWlsZCB0aGlzIHRhYmxlIGNhbiBhbHNvIGJlIGEgZmFjdG9yIGlmIHRoZSBkYXRhIGJlaW5nIGRlY29kZWQKKyAgIGlzIG5vdCB2ZXJ5IGxvbmcuICBUaGUgbW9zdCBjb21tb24gY29kZXMgYXJlIG5lY2Vzc2FyaWx5IHRoZQorICAgc2hvcnRlc3QgY29kZXMsIHNvIHRob3NlIGNvZGVzIGRvbWluYXRlIHRoZSBkZWNvZGluZyB0aW1lLCBhbmQgaGVuY2UKKyAgIHRoZSBzcGVlZC4gIFRoZSBpZGVhIGlzIHlvdSBjYW4gaGF2ZSBhIHNob3J0ZXIgdGFibGUgdGhhdCBkZWNvZGVzIHRoZQorICAgc2hvcnRlciwgbW9yZSBwcm9iYWJsZSBjb2RlcywgYW5kIHRoZW4gcG9pbnQgdG8gc3Vic2lkaWFyeSB0YWJsZXMgZm9yCisgICB0aGUgbG9uZ2VyIGNvZGVzLiAgVGhlIHRpbWUgaXQgY29zdHMgdG8gZGVjb2RlIHRoZSBsb25nZXIgY29kZXMgaXMKKyAgIHRoZW4gdHJhZGVkIGFnYWluc3QgdGhlIHRpbWUgaXQgdGFrZXMgdG8gbWFrZSBsb25nZXIgdGFibGVzLgorCisgICBUaGlzIHJlc3VsdHMgb2YgdGhpcyB0cmFkZSBhcmUgaW4gdGhlIHZhcmlhYmxlcyBsYml0cyBhbmQgZGJpdHMKKyAgIGJlbG93LiAgbGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBmaXJzdCBsZXZlbCB0YWJsZSBmb3IgbGl0ZXJhbC8KKyAgIGxlbmd0aCBjb2RlcyBjYW4gZGVjb2RlIGluIG9uZSBzdGVwLCBhbmQgZGJpdHMgaXMgdGhlIHNhbWUgdGhpbmcgZm9yCisgICB0aGUgZGlzdGFuY2UgY29kZXMuICBTdWJzZXF1ZW50IHRhYmxlcyBhcmUgYWxzbyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgIHRob3NlIHNpemVzLiAgVGhlc2UgdmFsdWVzIG1heSBiZSBhZGp1c3RlZCBlaXRoZXIgd2hlbiBhbGwgb2YgdGhlCisgICBjb2RlcyBhcmUgc2hvcnRlciB0aGFuIHRoYXQsIGluIHdoaWNoIGNhc2UgdGhlIGxvbmdlc3QgY29kZSBsZW5ndGggaW4KKyAgIGJpdHMgaXMgdXNlZCwgb3Igd2hlbiB0aGUgc2hvcnRlc3QgY29kZSBpcyAqbG9uZ2VyKiB0aGFuIHRoZSByZXF1ZXN0ZWQKKyAgIHRhYmxlIHNpemUsIGluIHdoaWNoIGNhc2UgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlc3QgY29kZSBpbiBiaXRzIGlzCisgICB1c2VkLgorCisgICBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHRoZSB0d28gdGFibGVzLCBzaW5jZSB0aGV5IGNvZGUgYQorICAgZGlmZmVyZW50IG51bWJlciBvZiBwb3NzaWJpbGl0aWVzIGVhY2guICBUaGUgbGl0ZXJhbC9sZW5ndGggdGFibGUKKyAgIGNvZGVzIDI4NiBwb3NzaWJsZSB2YWx1ZXMsIG9yIGluIGEgZmxhdCBjb2RlLCBhIGxpdHRsZSBvdmVyIGVpZ2h0CisgICBiaXRzLiAgVGhlIGRpc3RhbmNlIHRhYmxlIGNvZGVzIDMwIHBvc3NpYmxlIHZhbHVlcywgb3IgYSBsaXR0bGUgbGVzcworICAgdGhhbiBmaXZlIGJpdHMsIGZsYXQuICBUaGUgb3B0aW11bSB2YWx1ZXMgZm9yIHNwZWVkIGVuZCB1cCBiZWluZworICAgYWJvdXQgb25lIGJpdCBtb3JlIHRoYW4gdGhvc2UsIHNvIGxiaXRzIGlzIDgrMSBhbmQgZGJpdHMgaXMgNSsxLgorICAgVGhlIG9wdGltdW0gdmFsdWVzIG1heSBkaWZmZXIgdGhvdWdoIGZyb20gbWFjaGluZSB0byBtYWNoaW5lLCBhbmQKKyAgIHBvc3NpYmx5IGV2ZW4gYmV0d2VlbiBjb21waWxlcnMuICBZb3VyIG1pbGVhZ2UgbWF5IHZhcnkuCisgKi8KKworCisvKiBJZiBCTUFYIG5lZWRzIHRvIGJlIGxhcmdlciB0aGFuIDE2LCB0aGVuIGggYW5kIHhbXSBzaG91bGQgYmUgdUxvbmcuICovCisjZGVmaW5lIEJNQVggMTUgICAgICAgICAvKiBtYXhpbXVtIGJpdCBsZW5ndGggb2YgYW55IGNvZGUgKi8KKworbG9jYWwgaW50IGh1ZnRfYnVpbGQoYiwgbiwgcywgZCwgZSwgdCwgbSwgaHAsIGhuLCB2KQordUludGYgKmI7ICAgICAgICAgICAgICAgLyogY29kZSBsZW5ndGhzIGluIGJpdHMgKGFsbCBhc3N1bWVkIDw9IEJNQVgpICovCit1SW50IG47ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgKGFzc3VtZWQgPD0gMjg4KSAqLwordUludCBzOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHNpbXBsZS12YWx1ZWQgY29kZXMgKDAuLnMtMSkgKi8KK2NvbnN0IHVJbnRmICpkOyAgICAgICAgIC8qIGxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KK2NvbnN0IHVJbnRmICplOyAgICAgICAgIC8qIGxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworaW5mbGF0ZV9odWZ0ICogRkFSICp0OyAgLyogcmVzdWx0OiBzdGFydGluZyB0YWJsZSAqLwordUludGYgKm07ICAgICAgICAgICAgICAgLyogbWF4aW11bSBsb29rdXAgYml0cywgcmV0dXJucyBhY3R1YWwgKi8KK2luZmxhdGVfaHVmdCAqaHA7ICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLwordUludCAqaG47ICAgICAgICAgICAgICAgLyogaHVmdHMgdXNlZCBpbiBzcGFjZSAqLwordUludGYgKnY7ICAgICAgICAgICAgICAgLyogd29ya2luZyBhcmVhOiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aCAqLworLyogR2l2ZW4gYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBhbmQgYSBtYXhpbXVtIHRhYmxlIHNpemUsIG1ha2UgYSBzZXQgb2YKKyAgIHRhYmxlcyB0byBkZWNvZGUgdGhhdCBzZXQgb2YgY29kZXMuICBSZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUgorICAgaWYgdGhlIGdpdmVuIGNvZGUgc2V0IGlzIGluY29tcGxldGUgKHRoZSB0YWJsZXMgYXJlIHN0aWxsIGJ1aWx0IGluIHRoaXMKKyAgIGNhc2UpLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGlzIGludmFsaWQuICovCit7CisKKyAgdUludCBhOyAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnRlciBmb3IgY29kZXMgb2YgbGVuZ3RoIGsgKi8KKyAgdUludCBjW0JNQVgrMV07ICAgICAgICAgICAgICAgLyogYml0IGxlbmd0aCBjb3VudCB0YWJsZSAqLworICB1SW50IGY7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpIHJlcGVhdHMgaW4gdGFibGUgZXZlcnkgZiBlbnRyaWVzICovCisgIGludCBnOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KKyAgaW50IGg7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFibGUgbGV2ZWwgKi8KKyAgcmVnaXN0ZXIgdUludCBpOyAgICAgICAgICAgICAgLyogY291bnRlciwgY3VycmVudCBjb2RlICovCisgIHJlZ2lzdGVyIHVJbnQgajsgICAgICAgICAgICAgIC8qIGNvdW50ZXIgKi8KKyAgcmVnaXN0ZXIgaW50IGs7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gY3VycmVudCBjb2RlICovCisgIGludCBsOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgcGVyIHRhYmxlIChyZXR1cm5lZCBpbiBtKSAqLworICB1SW50IG1hc2s7ICAgICAgICAgICAgICAgICAgICAvKiAoMSA8PCB3KSAtIDEsIHRvIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAqLworICByZWdpc3RlciB1SW50ZiAqcDsgICAgICAgICAgICAvKiBwb2ludGVyIGludG8gY1tdLCBiW10sIG9yIHZbXSAqLworICBpbmZsYXRlX2h1ZnQgKnE7ICAgICAgICAgICAgICAvKiBwb2ludHMgdG8gY3VycmVudCB0YWJsZSAqLworICBzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgcjsgICAgICAvKiB0YWJsZSBlbnRyeSBmb3Igc3RydWN0dXJlIGFzc2lnbm1lbnQgKi8KKyAgaW5mbGF0ZV9odWZ0ICp1W0JNQVhdOyAgICAgICAgLyogdGFibGUgc3RhY2sgKi8KKyAgcmVnaXN0ZXIgaW50IHc7ICAgICAgICAgICAgICAgLyogYml0cyBiZWZvcmUgdGhpcyB0YWJsZSA9PSAobCAqIGgpICovCisgIHVJbnQgeFtCTUFYKzFdOyAgICAgICAgICAgICAgIC8qIGJpdCBvZmZzZXRzLCB0aGVuIGNvZGUgc3RhY2sgKi8KKyAgdUludGYgKnhwOyAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciBpbnRvIHggKi8KKyAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGR1bW15IGNvZGVzIGFkZGVkICovCisgIHVJbnQgejsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGN1cnJlbnQgdGFibGUgKi8KKworCisgIC8qIEdlbmVyYXRlIGNvdW50cyBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCisgIHAgPSBjOworI2RlZmluZSBDMCAqcCsrID0gMDsKKyNkZWZpbmUgQzIgQzAgQzAgQzAgQzAKKyNkZWZpbmUgQzQgQzIgQzIgQzIgQzIKKyAgQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgY1tdLS1hc3N1bWUgQk1BWCsxIGlzIDE2ICovCisgIHAgPSBiOyAgaSA9IG47CisgIGRvIHsKKyAgICBjWypwKytdKys7ICAgICAgICAgICAgICAgICAgLyogYXNzdW1lIGFsbCBlbnRyaWVzIDw9IEJNQVggKi8KKyAgfSB3aGlsZSAoLS1pKTsKKyAgaWYgKGNbMF0gPT0gbikgICAgICAgICAgICAgICAgLyogbnVsbCBpbnB1dC0tYWxsIHplcm8gbGVuZ3RoIGNvZGVzICovCisgIHsKKyAgICAqdCA9IChpbmZsYXRlX2h1ZnQgKilaX05VTEw7CisgICAgKm0gPSAwOworICAgIHJldHVybiBaX09LOworICB9CisKKworICAvKiBGaW5kIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoLCBib3VuZCAqbSBieSB0aG9zZSAqLworICBsID0gKm07CisgIGZvciAoaiA9IDE7IGogPD0gQk1BWDsgaisrKQorICAgIGlmIChjW2pdKQorICAgICAgYnJlYWs7CisgIGsgPSBqOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gY29kZSBsZW5ndGggKi8KKyAgaWYgKCh1SW50KWwgPCBqKQorICAgIGwgPSBqOworICBmb3IgKGkgPSBCTUFYOyBpOyBpLS0pCisgICAgaWYgKGNbaV0pCisgICAgICBicmVhazsKKyAgZyA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworICBpZiAoKHVJbnQpbCA+IGkpCisgICAgbCA9IGk7CisgICptID0gbDsKKworCisgIC8qIEFkanVzdCBsYXN0IGxlbmd0aCBjb3VudCB0byBmaWxsIG91dCBjb2RlcywgaWYgbmVlZGVkICovCisgIGZvciAoeSA9IDEgPDwgajsgaiA8IGk7IGorKywgeSA8PD0gMSkKKyAgICBpZiAoKHkgLT0gY1tqXSkgPCAwKQorICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgaWYgKCh5IC09IGNbaV0pIDwgMCkKKyAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICBjW2ldICs9IHk7CisKKworICAvKiBHZW5lcmF0ZSBzdGFydGluZyBvZmZzZXRzIGludG8gdGhlIHZhbHVlIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworICB4WzFdID0gaiA9IDA7CisgIHAgPSBjICsgMTsgIHhwID0geCArIDI7CisgIHdoaWxlICgtLWkpIHsgICAgICAgICAgICAgICAgIC8qIG5vdGUgdGhhdCBpID09IGcgZnJvbSBhYm92ZSAqLworICAgICp4cCsrID0gKGogKz0gKnArKyk7CisgIH0KKworCisgIC8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KKyAgcCA9IGI7ICBpID0gMDsKKyAgZG8geworICAgIGlmICgoaiA9ICpwKyspICE9IDApCisgICAgICB2W3hbal0rK10gPSBpOworICB9IHdoaWxlICgrK2kgPCBuKTsKKyAgbiA9IHhbZ107ICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG4gdG8gbGVuZ3RoIG9mIHYgKi8KKworCisgIC8qIEdlbmVyYXRlIHRoZSBIdWZmbWFuIGNvZGVzIGFuZCBmb3IgZWFjaCwgbWFrZSB0aGUgdGFibGUgZW50cmllcyAqLworICB4WzBdID0gaSA9IDA7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBIdWZmbWFuIGNvZGUgaXMgemVybyAqLworICBwID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmFiIHZhbHVlcyBpbiBiaXQgb3JkZXIgKi8KKyAgaCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gdGFibGVzIHlldC0tbGV2ZWwgLTEgKi8KKyAgdyA9IC1sOyAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBkZWNvZGVkID09IChsICogaCkgKi8KKyAgdVswXSA9IChpbmZsYXRlX2h1ZnQgKilaX05VTEw7ICAgICAgICAvKiBqdXN0IHRvIGtlZXAgY29tcGlsZXJzIGhhcHB5ICovCisgIHEgPSAoaW5mbGF0ZV9odWZ0ICopWl9OVUxMOyAgIC8qIGRpdHRvICovCisgIHogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpdHRvICovCisKKyAgLyogZ28gdGhyb3VnaCB0aGUgYml0IGxlbmd0aHMgKGsgYWxyZWFkeSBpcyBiaXRzIGluIHNob3J0ZXN0IGNvZGUpICovCisgIGZvciAoOyBrIDw9IGc7IGsrKykKKyAgeworICAgIGEgPSBjW2tdOworICAgIHdoaWxlIChhLS0pCisgICAgeworICAgICAgLyogaGVyZSBpIGlzIHRoZSBIdWZmbWFuIGNvZGUgb2YgbGVuZ3RoIGsgYml0cyBmb3IgdmFsdWUgKnAgKi8KKyAgICAgIC8qIG1ha2UgdGFibGVzIHVwIHRvIHJlcXVpcmVkIGxldmVsICovCisgICAgICB3aGlsZSAoayA+IHcgKyBsKQorICAgICAgeworICAgICAgICBoKys7CisgICAgICAgIHcgKz0gbDsgICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzIHRhYmxlIGFsd2F5cyBsIGJpdHMgKi8KKworICAgICAgICAvKiBjb21wdXRlIG1pbmltdW0gc2l6ZSB0YWJsZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbCBiaXRzICovCisgICAgICAgIHogPSBnIC0gdzsKKyAgICAgICAgeiA9IHogPiAodUludClsID8gbCA6IHo7ICAgICAgICAvKiB0YWJsZSBzaXplIHVwcGVyIGxpbWl0ICovCisgICAgICAgIGlmICgoZiA9IDEgPDwgKGogPSBrIC0gdykpID4gYSArIDEpICAgICAvKiB0cnkgYSBrLXcgYml0IHRhYmxlICovCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvbyBmZXcgY29kZXMgZm9yIGstdyBiaXQgdGFibGUgKi8KKyAgICAgICAgICBmIC09IGEgKyAxOyAgICAgICAgICAgLyogZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgbGVmdCAqLworICAgICAgICAgIHhwID0gYyArIGs7CisgICAgICAgICAgaWYgKGogPCB6KQorICAgICAgICAgICAgd2hpbGUgKCsraiA8IHopICAgICAvKiB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgoZiA8PD0gMSkgPD0gKisreHApCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIGVub3VnaCBjb2RlcyB0byB1c2UgdXAgaiBiaXRzICovCisgICAgICAgICAgICAgIGYgLT0gKnhwOyAgICAgICAgIC8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB6ID0gMSA8PCBqOyAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyaWVzIGZvciBqLWJpdCB0YWJsZSAqLworCisgICAgICAgIC8qIGFsbG9jYXRlIG5ldyB0YWJsZSAqLworICAgICAgICBpZiAoKmhuICsgeiA+IE1BTlkpICAgICAvKiAobm90ZTogZG9lc24ndCBtYXR0ZXIgZm9yIGZpeGVkKSAqLworICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7ICAvKiBvdmVyZmxvdyBvZiBNQU5ZICovCisgICAgICAgIHVbaF0gPSBxID0gaHAgKyAqaG47CisgICAgICAgICpobiArPSB6OworCisgICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCisgICAgICAgIGlmIChoKQorICAgICAgICB7CisgICAgICAgICAgeFtoXSA9IGk7ICAgICAgICAgICAgIC8qIHNhdmUgcGF0dGVybiBmb3IgYmFja2luZyB1cCAqLworICAgICAgICAgIHIuYml0cyA9IChCeXRlKWw7ICAgICAvKiBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUgKi8KKyAgICAgICAgICByLmV4b3AgPSAoQnl0ZSlqOyAgICAgLyogYml0cyBpbiB0aGlzIHRhYmxlICovCisgICAgICAgICAgaiA9IGkgPj4gKHcgLSBsKTsKKyAgICAgICAgICByLmJhc2UgPSAodUludCkocSAtIHVbaC0xXSAtIGopOyAgIC8qIG9mZnNldCB0byB0aGlzIHRhYmxlICovCisgICAgICAgICAgdVtoLTFdW2pdID0gcjsgICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqdCA9IHE7ICAgICAgICAgICAgICAgLyogZmlyc3QgdGFibGUgaXMgcmV0dXJuZWQgcmVzdWx0ICovCisgICAgICB9CisKKyAgICAgIC8qIHNldCB1cCB0YWJsZSBlbnRyeSBpbiByICovCisgICAgICByLmJpdHMgPSAoQnl0ZSkoayAtIHcpOworICAgICAgaWYgKHAgPj0gdiArIG4pCisgICAgICAgIHIuZXhvcCA9IDEyOCArIDY0OyAgICAgIC8qIG91dCBvZiB2YWx1ZXMtLWludmFsaWQgY29kZSAqLworICAgICAgZWxzZSBpZiAoKnAgPCBzKQorICAgICAgeworICAgICAgICByLmV4b3AgPSAoQnl0ZSkoKnAgPCAyNTYgPyAwIDogMzIgKyA2NCk7ICAgICAvKiAyNTYgaXMgZW5kLW9mLWJsb2NrICovCisgICAgICAgIHIuYmFzZSA9ICpwKys7ICAgICAgICAgIC8qIHNpbXBsZSBjb2RlIGlzIGp1c3QgdGhlIHZhbHVlICovCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHIuZXhvcCA9IChCeXRlKShlWypwIC0gc10gKyAxNiArIDY0KTsvKiBub24tc2ltcGxlLS1sb29rIHVwIGluIGxpc3RzICovCisgICAgICAgIHIuYmFzZSA9IGRbKnArKyAtIHNdOworICAgICAgfQorCisgICAgICAvKiBmaWxsIGNvZGUtbGlrZSBlbnRyaWVzIHdpdGggciAqLworICAgICAgZiA9IDEgPDwgKGsgLSB3KTsKKyAgICAgIGZvciAoaiA9IGkgPj4gdzsgaiA8IHo7IGogKz0gZikKKyAgICAgICAgcVtqXSA9IHI7CisKKyAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGstYml0IGNvZGUgaSAqLworICAgICAgZm9yIChqID0gMSA8PCAoayAtIDEpOyBpICYgajsgaiA+Pj0gMSkKKyAgICAgICAgaSBePSBqOworICAgICAgaSBePSBqOworCisgICAgICAvKiBiYWNrdXAgb3ZlciBmaW5pc2hlZCB0YWJsZXMgKi8KKyAgICAgIG1hc2sgPSAoMSA8PCB3KSAtIDE7ICAgICAgLyogbmVlZGVkIG9uIEhQLCBjYyAtTyBidWcgKi8KKyAgICAgIHdoaWxlICgoaSAmIG1hc2spICE9IHhbaF0pCisgICAgICB7CisgICAgICAgIGgtLTsgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gdXBkYXRlIHEgKi8KKyAgICAgICAgdyAtPSBsOworICAgICAgICBtYXNrID0gKDEgPDwgdykgLSAxOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyogUmV0dXJuIFpfQlVGX0VSUk9SIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW5jb21wbGV0ZSB0YWJsZSAqLworICByZXR1cm4geSAhPSAwICYmIGcgIT0gMSA/IFpfQlVGX0VSUk9SIDogWl9PSzsKK30KKworCitpbnQgaW5mbGF0ZV90cmVlc19iaXRzKGMsIGJiLCB0YiwgaHAsIHopCit1SW50ZiAqYzsgICAgICAgICAgICAgICAvKiAxOSBjb2RlIGxlbmd0aHMgKi8KK3VJbnRmICpiYjsgICAgICAgICAgICAgIC8qIGJpdHMgdHJlZSBkZXNpcmVkL2FjdHVhbCBkZXB0aCAqLworaW5mbGF0ZV9odWZ0ICogRkFSICp0YjsgLyogYml0cyB0cmVlIHJlc3VsdCAqLworaW5mbGF0ZV9odWZ0ICpocDsgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCit6X3N0cmVhbXAgejsgICAgICAgICAgICAvKiBmb3IgbWVzc2FnZXMgKi8KK3sKKyAgaW50IHI7CisgIHVJbnQgaG4gPSAwOyAgICAgICAgICAvKiBodWZ0cyB1c2VkIGluIHNwYWNlICovCisgIHVJbnRmICp2OyAgICAgICAgICAgICAvKiB3b3JrIGFyZWEgZm9yIGh1ZnRfYnVpbGQgKi8KKworICBpZiAoKHYgPSAodUludGYqKVpBTExPQyh6LCAxOSwgc2l6ZW9mKHVJbnQpKSkgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgciA9IGh1ZnRfYnVpbGQoYywgMTksIDE5LCAodUludGYqKVpfTlVMTCwgKHVJbnRmKilaX05VTEwsCisgICAgICAgICAgICAgICAgIHRiLCBiYiwgaHAsICZobiwgdik7CisgIGlmIChyID09IFpfREFUQV9FUlJPUikKKyAgICB6LT5tc2cgPSAoY2hhciopIm92ZXJzdWJzY3JpYmVkIGR5bmFtaWMgYml0IGxlbmd0aHMgdHJlZSI7CisgIGVsc2UgaWYgKHIgPT0gWl9CVUZfRVJST1IgfHwgKmJiID09IDApCisgIHsKKyAgICB6LT5tc2cgPSAoY2hhciopImluY29tcGxldGUgZHluYW1pYyBiaXQgbGVuZ3RocyB0cmVlIjsKKyAgICByID0gWl9EQVRBX0VSUk9SOworICB9CisgIFpGUkVFKHosIHYpOworICByZXR1cm4gcjsKK30KKworCitpbnQgaW5mbGF0ZV90cmVlc19keW5hbWljKG5sLCBuZCwgYywgYmwsIGJkLCB0bCwgdGQsIGhwLCB6KQordUludCBubDsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCit1SW50IG5kOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KK3VJbnRmICpjOyAgICAgICAgICAgICAgIC8qIHRoYXQgbWFueSAodG90YWwpIGNvZGUgbGVuZ3RocyAqLwordUludGYgKmJsOyAgICAgICAgICAgICAgLyogbGl0ZXJhbCBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KK3VJbnRmICpiZDsgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLworaW5mbGF0ZV9odWZ0ICogRkFSICp0bDsgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KK2luZmxhdGVfaHVmdCAqIEZBUiAqdGQ7IC8qIGRpc3RhbmNlIHRyZWUgcmVzdWx0ICovCitpbmZsYXRlX2h1ZnQgKmhwOyAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KK3pfc3RyZWFtcCB6OyAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLworeworICBpbnQgcjsKKyAgdUludCBobiA9IDA7ICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KKyAgdUludGYgKnY7ICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLworCisgIC8qIGFsbG9jYXRlIHdvcmsgYXJlYSAqLworICBpZiAoKHYgPSAodUludGYqKVpBTExPQyh6LCAyODgsIHNpemVvZih1SW50KSkpID09IFpfTlVMTCkKKyAgICByZXR1cm4gWl9NRU1fRVJST1I7CisKKyAgLyogYnVpbGQgbGl0ZXJhbC9sZW5ndGggdHJlZSAqLworICByID0gaHVmdF9idWlsZChjLCBubCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgdGwsIGJsLCBocCwgJmhuLCB2KTsKKyAgaWYgKHIgIT0gWl9PSyB8fCAqYmwgPT0gMCkKKyAgeworICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKKyAgICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgbGl0ZXJhbC9sZW5ndGggdHJlZSI7CisgICAgZWxzZSBpZiAociAhPSBaX01FTV9FUlJPUikKKyAgICB7CisgICAgICB6LT5tc2cgPSAoY2hhciopImluY29tcGxldGUgbGl0ZXJhbC9sZW5ndGggdHJlZSI7CisgICAgICByID0gWl9EQVRBX0VSUk9SOworICAgIH0KKyAgICBaRlJFRSh6LCB2KTsKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIC8qIGJ1aWxkIGRpc3RhbmNlIHRyZWUgKi8KKyAgciA9IGh1ZnRfYnVpbGQoYyArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsIHRkLCBiZCwgaHAsICZobiwgdik7CisgIGlmIChyICE9IFpfT0sgfHwgKCpiZCA9PSAwICYmIG5sID4gMjU3KSkKKyAgeworICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKKyAgICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgZGlzdGFuY2UgdHJlZSI7CisgICAgZWxzZSBpZiAociA9PSBaX0JVRl9FUlJPUikgeworI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICByID0gWl9PSzsKKyAgICB9CisjZWxzZQorICAgICAgei0+bXNnID0gKGNoYXIqKSJpbmNvbXBsZXRlIGRpc3RhbmNlIHRyZWUiOworICAgICAgciA9IFpfREFUQV9FUlJPUjsKKyAgICB9CisgICAgZWxzZSBpZiAociAhPSBaX01FTV9FUlJPUikKKyAgICB7CisgICAgICB6LT5tc2cgPSAoY2hhciopImVtcHR5IGRpc3RhbmNlIHRyZWUgd2l0aCBsZW5ndGhzIjsKKyAgICAgIHIgPSBaX0RBVEFfRVJST1I7CisgICAgfQorICAgIFpGUkVFKHosIHYpOworICAgIHJldHVybiByOworI2VuZGlmCisgIH0KKworICAvKiBkb25lICovCisgIFpGUkVFKHosIHYpOworICByZXR1cm4gWl9PSzsKK30KKworCisvKiBidWlsZCBmaXhlZCB0YWJsZXMgb25seSBvbmNlLS1rZWVwIHRoZW0gaGVyZSAqLworI2lmZGVmIEJVSUxERklYRUQKK2xvY2FsIGludCBmaXhlZF9idWlsdCA9IDA7CisjZGVmaW5lIEZJWEVESCA1NDQgICAgICAvKiBudW1iZXIgb2YgaHVmdHMgdXNlZCBieSBmaXhlZCB0YWJsZXMgKi8KK2xvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF9tZW1bRklYRURIXTsKK2xvY2FsIHVJbnQgZml4ZWRfYmw7Citsb2NhbCB1SW50IGZpeGVkX2JkOworbG9jYWwgaW5mbGF0ZV9odWZ0ICpmaXhlZF90bDsKK2xvY2FsIGluZmxhdGVfaHVmdCAqZml4ZWRfdGQ7CisjZWxzZQorI2luY2x1ZGUgImluZmZpeGVkLmgiCisjZW5kaWYKKworCitpbnQgaW5mbGF0ZV90cmVlc19maXhlZChibCwgYmQsIHRsLCB0ZCwgeikKK3VJbnRmICpibDsgICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwordUludGYgKmJkOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLworaW5mbGF0ZV9odWZ0ICogRkFSICp0bDsgIC8qIGxpdGVyYWwvbGVuZ3RoIHRyZWUgcmVzdWx0ICovCitpbmZsYXRlX2h1ZnQgKiBGQVIgKnRkOyAgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KK3pfc3RyZWFtcCB6OyAgICAgICAgICAgICAvKiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KK3sKKyNpZmRlZiBCVUlMREZJWEVECisgIC8qIGJ1aWxkIGZpeGVkIHRhYmxlcyBpZiBub3QgYWxyZWFkeSAqLworICBpZiAoIWZpeGVkX2J1aWx0KQorICB7CisgICAgaW50IGs7ICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKyAgICB1SW50IGYgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiBodWZ0cyB1c2VkIGluIGZpeGVkX21lbSAqLworICAgIHVJbnRmICpjOyAgICAgICAgICAgLyogbGVuZ3RoIGxpc3QgZm9yIGh1ZnRfYnVpbGQgKi8KKyAgICB1SW50ZiAqdjsgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCisgICAgaWYgKChjID0gKHVJbnRmKilaQUxMT0MoeiwgMjg4LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCisgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgaWYgKCh2ID0gKHVJbnRmKilaQUxMT0MoeiwgMjg4LCBzaXplb2YodUludCkpKSA9PSBaX05VTEwpCisgICAgeworICAgICAgWkZSRUUoeiwgYyk7CisgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorCisgICAgLyogbGl0ZXJhbCB0YWJsZSAqLworICAgIGZvciAoayA9IDA7IGsgPCAxNDQ7IGsrKykKKyAgICAgIGNba10gPSA4OworICAgIGZvciAoOyBrIDwgMjU2OyBrKyspCisgICAgICBjW2tdID0gOTsKKyAgICBmb3IgKDsgayA8IDI4MDsgaysrKQorICAgICAgY1trXSA9IDc7CisgICAgZm9yICg7IGsgPCAyODg7IGsrKykKKyAgICAgIGNba10gPSA4OworICAgIGZpeGVkX2JsID0gOTsKKyAgICBodWZ0X2J1aWxkKGMsIDI4OCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgJmZpeGVkX3RsLCAmZml4ZWRfYmwsCisgICAgICAgICAgICAgICBmaXhlZF9tZW0sICZmLCB2KTsKKworICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgZm9yIChrID0gMDsgayA8IDMwOyBrKyspCisgICAgICBjW2tdID0gNTsKKyAgICBmaXhlZF9iZCA9IDU7CisgICAgaHVmdF9idWlsZChjLCAzMCwgMCwgY3BkaXN0LCBjcGRleHQsICZmaXhlZF90ZCwgJmZpeGVkX2JkLAorICAgICAgICAgICAgICAgZml4ZWRfbWVtLCAmZiwgdik7CisKKyAgICAvKiBkb25lICovCisgICAgWkZSRUUoeiwgdik7CisgICAgWkZSRUUoeiwgYyk7CisgICAgZml4ZWRfYnVpbHQgPSAxOworICB9CisjZW5kaWYKKyAgKmJsID0gZml4ZWRfYmw7CisgICpiZCA9IGZpeGVkX2JkOworICAqdGwgPSBmaXhlZF90bDsKKyAgKnRkID0gZml4ZWRfdGQ7CisgIHJldHVybiBaX09LOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvaW5mdHJlZXMuaCBiL2NvbW1vbi96bGliL2luZnRyZWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiNzNiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZnRyZWVzLmgKQEAgLTAsMCArMSw1OCBAQAorLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIEh1ZmZtYW4gY29kZSBsb29rdXAgdGFibGUgZW50cnktLXRoaXMgZW50cnkgaXMgZm91ciBieXRlcyBmb3IgbWFjaGluZXMKKyAgIHRoYXQgaGF2ZSAxNi1iaXQgcG9pbnRlcnMgKGUuZy4gUEMncyBpbiB0aGUgc21hbGwgb3IgbWVkaXVtIG1vZGVsKS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9odWZ0X3MgRkFSIGluZmxhdGVfaHVmdDsKKworc3RydWN0IGluZmxhdGVfaHVmdF9zIHsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBCeXRlIEV4b3A7ICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KKyAgICAgIEJ5dGUgQml0czsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCisgICAgfSB3aGF0OworICAgIHVJbnQgcGFkOyAgICAgICAgICAgLyogcGFkIHN0cnVjdHVyZSB0byBhIHBvd2VyIG9mIDIgKDQgYnl0ZXMgZm9yICovCisgIH0gd29yZDsgICAgICAgICAgICAgICAvKiAgMTYtYml0LCA4IGJ5dGVzIGZvciAzMi1iaXQgaW50J3MpICovCisgIHVJbnQgYmFzZTsgICAgICAgICAgICAvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgZGlzdGFuY2UgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRhYmxlIG9mZnNldCAqLworfTsKKworLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQorICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDEwMDQgaHVmdCBzdHJ1Y3R1cmVzICg4NTAgZm9yIGxlbmd0aC9saXRlcmFscworICAgYW5kIDE1NCBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KKyAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSBhY3R1YWwgbWF4aW11bSBpcyBub3Qga25vd24sIGJ1dCB0aGUKKyAgIHZhbHVlIGJlbG93IGlzIG1vcmUgdGhhbiBzYWZlLiAqLworI2RlZmluZSBNQU5ZIDE0NDAKKworZXh0ZXJuIGludCBpbmZsYXRlX3RyZWVzX2JpdHMgT0YoKAorICAgIHVJbnRmICosICAgICAgICAgICAgICAgICAgICAvKiAxOSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogYml0cyB0cmVlIGRlc2lyZWQvYWN0dWFsIGRlcHRoICovCisgICAgaW5mbGF0ZV9odWZ0ICogRkFSICosICAgICAgIC8qIGJpdHMgdHJlZSByZXN1bHQgKi8KKyAgICBpbmZsYXRlX2h1ZnQgKiwgICAgICAgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCisgICAgel9zdHJlYW1wKSk7ICAgICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLworCitleHRlcm4gaW50IGluZmxhdGVfdHJlZXNfZHluYW1pYyBPRigoCisgICAgdUludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworICAgIHVJbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICB1SW50ZiAqLCAgICAgICAgICAgICAgICAgICAgLyogdGhhdCBtYW55ICh0b3RhbCkgY29kZSBsZW5ndGhzICovCisgICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCisgICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLworICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLworICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLworICAgIGluZmxhdGVfaHVmdCAqLCAgICAgICAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KKyAgICB6X3N0cmVhbXApKTsgICAgICAgICAgICAgICAgLyogZm9yIG1lc3NhZ2VzICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV90cmVlc19maXhlZCBPRigoCisgICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCisgICAgdUludGYgKiwgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLworICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLworICAgIGluZmxhdGVfaHVmdCAqIEZBUiAqLCAgICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLworICAgIHpfc3RyZWFtcCkpOyAgICAgICAgICAgICAgICAvKiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2luZnV0aWwuYyBiL2NvbW1vbi96bGliL2luZnV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTA3NjIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvaW5mdXRpbC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIGluZmxhdGVfdXRpbC5jIC0tIGRhdGEgYW5kIHJvdXRpbmVzIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZmJsb2NrLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZjb2Rlcy5oIgorI2luY2x1ZGUgImluZnV0aWwuaCIKKworc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKKy8qIEFuZCdpbmcgd2l0aCBtYXNrW25dIG1hc2tzIHRoZSBsb3dlciBuIGJpdHMgKi8KK3VJbnQgaW5mbGF0ZV9tYXNrWzE3XSA9IHsKKyAgICAweDAwMDAsCisgICAgMHgwMDAxLCAweDAwMDMsIDB4MDAwNywgMHgwMDBmLCAweDAwMWYsIDB4MDAzZiwgMHgwMDdmLCAweDAwZmYsCisgICAgMHgwMWZmLCAweDAzZmYsIDB4MDdmZiwgMHgwZmZmLCAweDFmZmYsIDB4M2ZmZiwgMHg3ZmZmLCAweGZmZmYKK307CisKKworLyogY29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNsaWRpbmcgd2luZG93IHRvIHRoZSBvdXRwdXQgYXJlYSAqLworaW50IGluZmxhdGVfZmx1c2gocywgeiwgcikKK2luZmxhdGVfYmxvY2tzX3N0YXRlZiAqczsKK3pfc3RyZWFtcCB6OworaW50IHI7Cit7CisgIHVJbnQgbjsKKyAgQnl0ZWYgKnA7CisgIEJ5dGVmICpxOworCisgIC8qIGxvY2FsIGNvcGllcyBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCisgIHAgPSB6LT5uZXh0X291dDsKKyAgcSA9IHMtPnJlYWQ7CisKKyAgLyogY29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBhcyBmYXIgYXMgZW5kIG9mIHdpbmRvdyAqLworICBuID0gKHVJbnQpKChxIDw9IHMtPndyaXRlID8gcy0+d3JpdGUgOiBzLT5lbmQpIC0gcSk7CisgIGlmIChuID4gei0+YXZhaWxfb3V0KSBuID0gei0+YXZhaWxfb3V0OworICBpZiAobiAmJiByID09IFpfQlVGX0VSUk9SKSByID0gWl9PSzsKKworICAvKiB1cGRhdGUgY291bnRlcnMgKi8KKyAgei0+YXZhaWxfb3V0IC09IG47CisgIHotPnRvdGFsX291dCArPSBuOworCisgIC8qIHVwZGF0ZSBjaGVjayBpbmZvcm1hdGlvbiAqLworICBpZiAocy0+Y2hlY2tmbiAhPSBaX05VTEwpCisgICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikocy0+Y2hlY2ssIHEsIG4pOworCisgIC8qIGNvcHkgYXMgZmFyIGFzIGVuZCBvZiB3aW5kb3cgKi8KKyAgem1lbWNweShwLCBxLCBuKTsKKyAgcCArPSBuOworICBxICs9IG47CisKKyAgLyogc2VlIGlmIG1vcmUgdG8gY29weSBhdCBiZWdpbm5pbmcgb2Ygd2luZG93ICovCisgIGlmIChxID09IHMtPmVuZCkKKyAgeworICAgIC8qIHdyYXAgcG9pbnRlcnMgKi8KKyAgICBxID0gcy0+d2luZG93OworICAgIGlmIChzLT53cml0ZSA9PSBzLT5lbmQpCisgICAgICBzLT53cml0ZSA9IHMtPndpbmRvdzsKKworICAgIC8qIGNvbXB1dGUgYnl0ZXMgdG8gY29weSAqLworICAgIG4gPSAodUludCkocy0+d3JpdGUgLSBxKTsKKyAgICBpZiAobiA+IHotPmF2YWlsX291dCkgbiA9IHotPmF2YWlsX291dDsKKyAgICBpZiAobiAmJiByID09IFpfQlVGX0VSUk9SKSByID0gWl9PSzsKKworICAgIC8qIHVwZGF0ZSBjb3VudGVycyAqLworICAgIHotPmF2YWlsX291dCAtPSBuOworICAgIHotPnRvdGFsX291dCArPSBuOworCisgICAgLyogdXBkYXRlIGNoZWNrIGluZm9ybWF0aW9uICovCisgICAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQorICAgICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikocy0+Y2hlY2ssIHEsIG4pOworCisgICAgLyogY29weSAqLworICAgIHptZW1jcHkocCwgcSwgbik7CisgICAgcCArPSBuOworICAgIHEgKz0gbjsKKyAgfQorCisgIC8qIHVwZGF0ZSBwb2ludGVycyAqLworICB6LT5uZXh0X291dCA9IHA7CisgIHMtPnJlYWQgPSBxOworCisgIC8qIGRvbmUgKi8KKyAgcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9pbmZ1dGlsLmggYi9jb21tb24vemxpYi9pbmZ1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMWRmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL2luZnV0aWwuaApAQCAtMCwwICsxLDk4IEBACisvKiBpbmZ1dGlsLmggLS0gdHlwZXMgYW5kIG1hY3JvcyBjb21tb24gdG8gYmxvY2tzIGFuZCBjb2RlcworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworI2lmbmRlZiBfSU5GVVRJTF9ICisjZGVmaW5lIF9JTkZVVElMX0gKKwordHlwZWRlZiBlbnVtIHsKKyAgICAgIFRZUEUsICAgICAvKiBnZXQgdHlwZSBiaXRzICgzLCBpbmNsdWRpbmcgZW5kIGJpdCkgKi8KKyAgICAgIExFTlMsICAgICAvKiBnZXQgbGVuZ3RocyBmb3Igc3RvcmVkICovCisgICAgICBTVE9SRUQsICAgLyogcHJvY2Vzc2luZyBzdG9yZWQgYmxvY2sgKi8KKyAgICAgIFRBQkxFLCAgICAvKiBnZXQgdGFibGUgbGVuZ3RocyAqLworICAgICAgQlRSRUUsICAgIC8qIGdldCBiaXQgbGVuZ3RocyB0cmVlIGZvciBhIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgIERUUkVFLCAgICAvKiBnZXQgbGVuZ3RoLCBkaXN0YW5jZSB0cmVlcyBmb3IgYSBkeW5hbWljIGJsb2NrICovCisgICAgICBDT0RFUywgICAgLyogcHJvY2Vzc2luZyBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCisgICAgICBEUlksICAgICAgLyogb3V0cHV0IHJlbWFpbmluZyB3aW5kb3cgYnl0ZXMgKi8KKyAgICAgIERPTkUsICAgICAvKiBmaW5pc2hlZCBsYXN0IGJsb2NrLCBkb25lICovCisgICAgICBCQUR9ICAgICAgLyogZ290IGEgZGF0YSBlcnJvci0tc3R1Y2sgaGVyZSAqLworaW5mbGF0ZV9ibG9ja19tb2RlOworCisvKiBpbmZsYXRlIGJsb2NrcyBzZW1pLXByaXZhdGUgc3RhdGUgKi8KK3N0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB7CisKKyAgLyogbW9kZSAqLworICBpbmZsYXRlX2Jsb2NrX21vZGUgIG1vZGU7ICAgICAvKiBjdXJyZW50IGluZmxhdGVfYmxvY2sgbW9kZSAqLworCisgIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCisgIHVuaW9uIHsKKyAgICB1SW50IGxlZnQ7ICAgICAgICAgIC8qIGlmIFNUT1JFRCwgYnl0ZXMgbGVmdCB0byBjb3B5ICovCisgICAgc3RydWN0IHsKKyAgICAgIHVJbnQgdGFibGU7ICAgICAgICAgICAgICAgLyogdGFibGUgbGVuZ3RocyAoMTQgYml0cykgKi8KKyAgICAgIHVJbnQgaW5kZXg7ICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBibGVucyAob3IgYm9yZGVyKSAqLworICAgICAgdUludGYgKmJsZW5zOyAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBjb2RlcyAqLworICAgICAgdUludCBiYjsgICAgICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIHRyZWUgZGVwdGggKi8KKyAgICAgIGluZmxhdGVfaHVmdCAqdGI7ICAgICAgICAgLyogYml0IGxlbmd0aCBkZWNvZGluZyB0cmVlICovCisgICAgfSB0cmVlczsgICAgICAgICAgICAvKiBpZiBEVFJFRSwgZGVjb2RpbmcgaW5mbyBmb3IgdHJlZXMgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgCisgICAgICAgICAqY29kZXM7CisgICAgfSBkZWNvZGU7ICAgICAgICAgICAvKiBpZiBDT0RFUywgY3VycmVudCBzdGF0ZSAqLworICB9IHN1YjsgICAgICAgICAgICAgICAgLyogc3VibW9kZSAqLworICB1SW50IGxhc3Q7ICAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrICovCisKKyAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLworICB1SW50IGJpdGs7ICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgIHVMb25nIGJpdGI7ICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIGluZmxhdGVfaHVmdCAqaHVmdHM7ICAvKiBzaW5nbGUgbWFsbG9jIGZvciB0cmVlIHNwYWNlICovCisgIEJ5dGVmICp3aW5kb3c7ICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLworICBCeXRlZiAqZW5kOyAgICAgICAgICAgLyogb25lIGJ5dGUgYWZ0ZXIgc2xpZGluZyB3aW5kb3cgKi8KKyAgQnl0ZWYgKnJlYWQ7ICAgICAgICAgIC8qIHdpbmRvdyByZWFkIHBvaW50ZXIgKi8KKyAgQnl0ZWYgKndyaXRlOyAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBwb2ludGVyICovCisgIGNoZWNrX2Z1bmMgY2hlY2tmbjsgICAvKiBjaGVjayBmdW5jdGlvbiAqLworICB1TG9uZyBjaGVjazsgICAgICAgICAgLyogY2hlY2sgb24gb3V0cHV0ICovCisKK307CisKKworLyogZGVmaW5lcyBmb3IgaW5mbGF0ZSBpbnB1dC9vdXRwdXQgKi8KKy8qICAgdXBkYXRlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KKyNkZWZpbmUgVVBEQklUUyB7cy0+Yml0Yj1iO3MtPmJpdGs9azt9CisjZGVmaW5lIFVQRElOIHt6LT5hdmFpbF9pbj1uO3otPnRvdGFsX2luKz1wLXotPm5leHRfaW47ei0+bmV4dF9pbj1wO30KKyNkZWZpbmUgVVBET1VUIHtzLT53cml0ZT1xO30KKyNkZWZpbmUgVVBEQVRFIHtVUERCSVRTIFVQRElOIFVQRE9VVH0KKyNkZWZpbmUgTEVBVkUge1VQREFURSByZXR1cm4gaW5mbGF0ZV9mbHVzaChzLHoscik7fQorLyogICBnZXQgYnl0ZXMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgTE9BRElOIHtwPXotPm5leHRfaW47bj16LT5hdmFpbF9pbjtiPXMtPmJpdGI7az1zLT5iaXRrO30KKyNkZWZpbmUgTkVFREJZVEUge2lmKG4pcj1aX09LO2Vsc2UgTEVBVkV9CisjZGVmaW5lIE5FWFRCWVRFIChuLS0sKnArKykKKyNkZWZpbmUgTkVFREJJVFMoaikge3doaWxlKGs8KGopKXtORUVEQllURTtifD0oKHVMb25nKU5FWFRCWVRFKTw8aztrKz04O319CisjZGVmaW5lIERVTVBCSVRTKGopIHtiPj49KGopO2stPShqKTt9CisvKiAgIG91dHB1dCBieXRlcyAqLworI2RlZmluZSBXQVZBSUwgKHVJbnQpKHE8cy0+cmVhZD9zLT5yZWFkLXEtMTpzLT5lbmQtcSkKKyNkZWZpbmUgTE9BRE9VVCB7cT1zLT53cml0ZTttPSh1SW50KVdBVkFJTDt9CisjZGVmaW5lIFdSQVAge2lmKHE9PXMtPmVuZCYmcy0+cmVhZCE9cy0+d2luZG93KXtxPXMtPndpbmRvdzttPSh1SW50KVdBVkFJTDt9fQorI2RlZmluZSBGTFVTSCB7VVBET1VUIHI9aW5mbGF0ZV9mbHVzaChzLHoscik7IExPQURPVVR9CisjZGVmaW5lIE5FRURPVVQge2lmKG09PTApe1dSQVAgaWYobT09MCl7RkxVU0ggV1JBUCBpZihtPT0wKSBMRUFWRX19cj1aX09LO30KKyNkZWZpbmUgT1VUQllURShhKSB7KnErKz0oQnl0ZSkoYSk7bS0tO30KKy8qICAgbG9hZCBsb2NhbCBwb2ludGVycyAqLworI2RlZmluZSBMT0FEIHtMT0FESU4gTE9BRE9VVH0KKworLyogbWFza3MgZm9yIGxvd2VyIGJpdHMgKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLworZXh0ZXJuIHVJbnQgaW5mbGF0ZV9tYXNrWzE3XTsKKworLyogY29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNsaWRpbmcgd2luZG93IHRvIHRoZSBvdXRwdXQgYXJlYSAqLworZXh0ZXJuIGludCBpbmZsYXRlX2ZsdXNoIE9GKCgKKyAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKKyAgICB6X3N0cmVhbXAgLAorICAgIGludCkpOworCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9tYWtldHJlZS5jIGIvY29tbW9uL3psaWIvbWFrZXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZkNGIxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvbWFrZXRyZWUuYwpAQCAtMCwwICsxLDg1IEBACisvKiBtYWtldHJlZS5jIC0tIG1ha2UgaW5mZml4ZWQuaCB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIFRoaXMgcHJvZ3JhbSBpcyBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBjb21wbGV0ZW5lc3MuCisgICBZb3UgZG8gbm90IG5lZWQgdG8gY29tcGlsZSBvciBydW4gdGhpcyBwcm9ncmFtIHNpbmNlIGluZmZpeGVkLmgKKyAgIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gIFRvIHVzZSB0aGlzIHByb2dyYW0KKyAgIHlvdSBuZWVkIHRvIGNvbXBpbGUgemxpYiB3aXRoIEJVSUxERklYRUQgZGVmaW5lZCBhbmQgdGhlbiBjb21waWxlCisgICBhbmQgbGluayB0aGlzIHByb2dyYW0gd2l0aCB0aGUgemxpYiBsaWJyYXJ5LiAgVGhlbiB0aGUgb3V0cHV0IG9mCisgICB0aGlzIHByb2dyYW0gY2FuIGJlIHBpcGVkIHRvIGluZmZpeGVkLmguICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKworLyogc2ltcGxpZnkgdGhlIHVzZSBvZiB0aGUgaW5mbGF0ZV9odWZ0IHR5cGUgd2l0aCBzb21lIGRlZmluZXMgKi8KKyNkZWZpbmUgZXhvcCB3b3JkLndoYXQuRXhvcAorI2RlZmluZSBiaXRzIHdvcmQud2hhdC5CaXRzCisKKy8qIGdlbmVyYXRlIGluaXRpYWxpemF0aW9uIHRhYmxlIGZvciBhbiBpbmZsYXRlX2h1ZnQgc3RydWN0dXJlIGFycmF5ICovCit2b2lkIG1ha2V0cmVlKHVJbnQgYiwgaW5mbGF0ZV9odWZ0ICp0KQoreworICBpbnQgaSwgZTsKKworICBpID0gMDsKKyAgd2hpbGUgKDEpCisgIHsKKyAgICBlID0gdFtpXS5leG9wOworICAgIGlmIChlICYmIChlICYgKDE2KzY0KSkgPT0gMCkgICAgICAgIC8qIHRhYmxlIHBvaW50ZXIgKi8KKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2V0cmVlOiBjYW5ub3QgaW5pdGlhbGl6ZSBzdWItdGFibGVzIVxuIik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICBpZiAoaSAlIDQgPT0gMCkKKyAgICAgIHByaW50ZigiXG4gICAiKTsKKyAgICBwcmludGYoIiB7e3sldSwldX19LCV1fSIsIHRbaV0uZXhvcCwgdFtpXS5iaXRzLCB0W2ldLmJhc2UpOworICAgIGlmICgrK2kgPT0gKDE8PGIpKQorICAgICAgYnJlYWs7CisgICAgcHV0Y2hhcignLCcpOworICB9CisgIHB1dHMoIiIpOworfQorCisvKiBjcmVhdGUgdGhlIGZpeGVkIHRhYmxlcyBpbiBDIGluaXRpYWxpemF0aW9uIHN5bnRheCAqLwordm9pZCBtYWluKHZvaWQpCit7CisgIGludCByOworICB1SW50IGJsLCBiZDsKKyAgaW5mbGF0ZV9odWZ0ICp0bCwgKnRkOworICB6X3N0cmVhbSB6OworCisgIHouemFsbG9jID0gemNhbGxvYzsKKyAgei5vcGFxdWUgPSAodm9pZHBmKTA7CisgIHouemZyZWUgPSB6Y2ZyZWU7CisgIHIgPSBpbmZsYXRlX3RyZWVzX2ZpeGVkKCZibCwgJmJkLCAmdGwsICZ0ZCwgJnopOworICBpZiAocikKKyAgeworICAgIGZwcmludGYoc3RkZXJyLCAiaW5mbGF0ZV90cmVlc19maXhlZCBlcnJvciAlZFxuIiwgcik7CisgICAgcmV0dXJuOworICB9CisgIHB1dHMoIi8qIGluZmZpeGVkLmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzIik7CisgIHB1dHMoIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBtYWtldHJlZS5jIHByb2dyYW0iKTsKKyAgcHV0cygiICovIik7CisgIHB1dHMoIiIpOworICBwdXRzKCIvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcyIpOworICBwdXRzKCIgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMiKTsKKyAgcHV0cygiICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOworICBwdXRzKCIgKi8iKTsKKyAgcHV0cygiIik7CisgIHByaW50ZigibG9jYWwgdUludCBmaXhlZF9ibCA9ICVkO1xuIiwgYmwpOworICBwcmludGYoImxvY2FsIHVJbnQgZml4ZWRfYmQgPSAlZDtcbiIsIGJkKTsKKyAgcHJpbnRmKCJsb2NhbCBpbmZsYXRlX2h1ZnQgZml4ZWRfdGxbXSA9IHsiKTsKKyAgbWFrZXRyZWUoYmwsIHRsKTsKKyAgcHV0cygiICB9OyIpOworICBwcmludGYoImxvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF90ZFtdID0geyIpOworICBtYWtldHJlZShiZCwgdGQpOworICBwdXRzKCIgIH07Iik7Cit9CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9taW5pZ3ppcC5jIGIvY29tbW9uL3psaWIvbWluaWd6aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUwMmJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvbWluaWd6aXAuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogbWluaWd6aXAuYyAtLSBzaW11bGF0ZSBnemlwIHVzaW5nIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qCisgKiBtaW5pZ3ppcCBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGd6aXAgdXRpbGl0eS4gVGhpcyBpcworICogb25seSBhbiBleGFtcGxlIG9mIHVzaW5nIHpsaWIgYW5kIGlzbid0IG1lYW50IHRvIHJlcGxhY2UgdGhlCisgKiBmdWxsLWZlYXR1cmVkIGd6aXAuIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZWFsIHdpdGggZmlsZSBzeXN0ZW1zCisgKiBsaW1pdGluZyBuYW1lcyB0byAxNCBvciA4KzMgY2hhcmFjdGVycywgZXRjLi4uIEVycm9yIGNoZWNraW5nIGlzCisgKiB2ZXJ5IGxpbWl0ZWQuIFNvIHVzZSBtaW5pZ3ppcCBvbmx5IGZvciB0ZXN0aW5nOyB1c2UgZ3ppcCBmb3IgdGhlCisgKiByZWFsIHRoaW5nLiBPbiBNU0RPUywgdXNlIG9ubHkgb24gZmlsZSBuYW1lcyB3aXRob3V0IGV4dGVuc2lvbgorICogb3IgaW4gcGlwZSBtb2RlLgorICovCisKKy8qIEAoIykgJElkOiBtaW5pZ3ppcC5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjYgY29uc3RfayBFeHAgJCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2Vsc2UKKyAgIGV4dGVybiB2b2lkIGV4aXQgIE9GKChpbnQpKTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX01NQVAKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgIGluY2x1ZGUgPGlvLmg+CisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKKyNlbHNlCisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCisjZW5kaWYKKworI2lmZGVmIFZNUworIyAgZGVmaW5lIHVubGluayBkZWxldGUKKyMgIGRlZmluZSBHWl9TVUZGSVggIi1neiIKKyNlbmRpZgorI2lmZGVmIFJJU0NPUworIyAgZGVmaW5lIHVubGluayByZW1vdmUKKyMgIGRlZmluZSBHWl9TVUZGSVggIi1neiIKKyMgIGRlZmluZSBmaWxlbm8oZmlsZSkgZmlsZS0+X19maWxlCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCisjICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmaWxlbm8gKi8KKyNlbmRpZgorCisjaWZuZGVmIFdJTjMyIC8qIHVubGluayBhbHJlYWR5IGluIHN0ZGlvLmggZm9yIFdJTjMyICovCisgIGV4dGVybiBpbnQgdW5saW5rIE9GKChjb25zdCBjaGFyICopKTsKKyNlbmRpZgorCisjaWZuZGVmIEdaX1NVRkZJWAorIyAgZGVmaW5lIEdaX1NVRkZJWCAiLmd6IgorI2VuZGlmCisjZGVmaW5lIFNVRkZJWF9MRU4gKHNpemVvZihHWl9TVUZGSVgpLTEpCisKKyNkZWZpbmUgQlVGTEVOICAgICAgMTYzODQKKyNkZWZpbmUgTUFYX05BTUVfTEVOIDEwMjQKKworI2lmZGVmIE1BWFNFR182NEsKKyMgIGRlZmluZSBsb2NhbCBzdGF0aWMKKyAgIC8qIE5lZWRlZCBmb3Igc3lzdGVtcyB3aXRoIGxpbWl0YXRpb24gb24gc3RhY2sgc2l6ZS4gKi8KKyNlbHNlCisjICBkZWZpbmUgbG9jYWwKKyNlbmRpZgorCitjaGFyICpwcm9nOworCit2b2lkIGVycm9yICAgICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKm1zZykpOwordm9pZCBnel9jb21wcmVzcyAgICAgIE9GKChGSUxFICAgKmluLCBnekZpbGUgb3V0KSk7CisjaWZkZWYgVVNFX01NQVAKK2ludCAgZ3pfY29tcHJlc3NfbW1hcCBPRigoRklMRSAgICppbiwgZ3pGaWxlIG91dCkpOworI2VuZGlmCit2b2lkIGd6X3VuY29tcHJlc3MgICAgT0YoKGd6RmlsZSBpbiwgRklMRSAgICpvdXQpKTsKK3ZvaWQgZmlsZV9jb21wcmVzcyAgICBPRigoY2hhciAgKmZpbGUsIGNoYXIgKm1vZGUpKTsKK3ZvaWQgZmlsZV91bmNvbXByZXNzICBPRigoY2hhciAgKmZpbGUpKTsKK2ludCAgbWFpbiAgICAgICAgICAgICBPRigoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdAorICovCit2b2lkIGVycm9yKG1zZykKKyAgICBjb25zdCBjaGFyICptc2c7Cit7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByb2csIG1zZyk7CisgICAgZXhpdCgxKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdGhlbiBjbG9zZSBib3RoIGZpbGVzLgorICovCisKK3ZvaWQgZ3pfY29tcHJlc3MoaW4sIG91dCkKKyAgICBGSUxFICAgKmluOworICAgIGd6RmlsZSBvdXQ7Cit7CisgICAgbG9jYWwgY2hhciBidWZbQlVGTEVOXTsKKyAgICBpbnQgbGVuOworICAgIGludCBlcnI7CisKKyNpZmRlZiBVU0VfTU1BUAorICAgIC8qIFRyeSBmaXJzdCBjb21wcmVzc2luZyB3aXRoIG1tYXAuIElmIG1tYXAgZmFpbHMgKG1pbmlnemlwIHVzZWQgaW4gYQorICAgICAqIHBpcGUpLCB1c2UgdGhlIG5vcm1hbCBmcmVhZCBsb29wLgorICAgICAqLworICAgIGlmIChnel9jb21wcmVzc19tbWFwKGluLCBvdXQpID09IFpfT0spIHJldHVybjsKKyNlbmRpZgorICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gZnJlYWQoYnVmLCAxLCBzaXplb2YoYnVmKSwgaW4pOworICAgICAgICBpZiAoZmVycm9yKGluKSkgeworICAgICAgICAgICAgcGVycm9yKCJmcmVhZCIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID09IDApIGJyZWFrOworCisgICAgICAgIGlmIChnendyaXRlKG91dCwgYnVmLCAodW5zaWduZWQpbGVuKSAhPSBsZW4pIGVycm9yKGd6ZXJyb3Iob3V0LCAmZXJyKSk7CisgICAgfQorICAgIGZjbG9zZShpbik7CisgICAgaWYgKGd6Y2xvc2Uob3V0KSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKK30KKworI2lmZGVmIFVTRV9NTUFQIC8qIE1NQVAgdmVyc2lvbiwgTWlndWVsIEFsYnJlY2h0IDxtYWxicmVjaEBlc28ub3JnPiAqLworCisvKiBUcnkgY29tcHJlc3NpbmcgdGhlIGlucHV0IGZpbGUgYXQgb25jZSB1c2luZyBtbWFwLiBSZXR1cm4gWl9PSyBpZgorICogaWYgc3VjY2VzcywgWl9FUlJOTyBvdGhlcndpc2UuCisgKi8KK2ludCBnel9jb21wcmVzc19tbWFwKGluLCBvdXQpCisgICAgRklMRSAgICppbjsKKyAgICBnekZpbGUgb3V0OworeworICAgIGludCBsZW47CisgICAgaW50IGVycjsKKyAgICBpbnQgaWZkID0gZmlsZW5vKGluKTsKKyAgICBjYWRkcl90IGJ1ZjsgICAgLyogbW1hcCdlZCBidWZmZXIgZm9yIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSAqLworICAgIG9mZl90IGJ1Zl9sZW47ICAvKiBsZW5ndGggb2YgdGhlIGlucHV0IGZpbGUgKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgbmVlZGVkIGZvciBtbWFwOiAqLworICAgIGlmIChmc3RhdChpZmQsICZzYikgPCAwKSByZXR1cm4gWl9FUlJOTzsKKyAgICBidWZfbGVuID0gc2Iuc3Rfc2l6ZTsKKyAgICBpZiAoYnVmX2xlbiA8PSAwKSByZXR1cm4gWl9FUlJOTzsKKworICAgIC8qIE5vdyBkbyB0aGUgYWN0dWFsIG1tYXA6ICovCisgICAgYnVmID0gbW1hcCgoY2FkZHJfdCkgMCwgYnVmX2xlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBpZmQsIChvZmZfdCkwKTsgCisgICAgaWYgKGJ1ZiA9PSAoY2FkZHJfdCkoLTEpKSByZXR1cm4gWl9FUlJOTzsKKworICAgIC8qIENvbXByZXNzIHRoZSB3aG9sZSBmaWxlIGF0IG9uY2U6ICovCisgICAgbGVuID0gZ3p3cml0ZShvdXQsIChjaGFyICopYnVmLCAodW5zaWduZWQpYnVmX2xlbik7CisKKyAgICBpZiAobGVuICE9IChpbnQpYnVmX2xlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKKworICAgIG11bm1hcChidWYsIGJ1Zl9sZW4pOworICAgIGZjbG9zZShpbik7CisgICAgaWYgKGd6Y2xvc2Uob3V0KSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKyNlbmRpZiAvKiBVU0VfTU1BUCAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVuY29tcHJlc3MgaW5wdXQgdG8gb3V0cHV0IHRoZW4gY2xvc2UgYm90aCBmaWxlcy4KKyAqLwordm9pZCBnel91bmNvbXByZXNzKGluLCBvdXQpCisgICAgZ3pGaWxlIGluOworICAgIEZJTEUgICAqb3V0OworeworICAgIGxvY2FsIGNoYXIgYnVmW0JVRkxFTl07CisgICAgaW50IGxlbjsKKyAgICBpbnQgZXJyOworCisgICAgZm9yICg7OykgeworICAgICAgICBsZW4gPSBnenJlYWQoaW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICBpZiAobGVuIDwgMCkgZXJyb3IgKGd6ZXJyb3IoaW4sICZlcnIpKTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSBicmVhazsKKworICAgICAgICBpZiAoKGludClmd3JpdGUoYnVmLCAxLCAodW5zaWduZWQpbGVuLCBvdXQpICE9IGxlbikgeworCSAgICBlcnJvcigiZmFpbGVkIGZ3cml0ZSIpOworCX0KKyAgICB9CisgICAgaWYgKGZjbG9zZShvdXQpKSBlcnJvcigiZmFpbGVkIGZjbG9zZSIpOworCisgICAgaWYgKGd6Y2xvc2UoaW4pICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgdGhlIGdpdmVuIGZpbGU6IGNyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgLmd6IGZpbGUgYW5kIHJlbW92ZSB0aGUKKyAqIG9yaWdpbmFsLgorICovCit2b2lkIGZpbGVfY29tcHJlc3MoZmlsZSwgbW9kZSkKKyAgICBjaGFyICAqZmlsZTsKKyAgICBjaGFyICAqbW9kZTsKK3sKKyAgICBsb2NhbCBjaGFyIG91dGZpbGVbTUFYX05BTUVfTEVOXTsKKyAgICBGSUxFICAqaW47CisgICAgZ3pGaWxlIG91dDsKKworICAgIHN0cmNweShvdXRmaWxlLCBmaWxlKTsKKyAgICBzdHJjYXQob3V0ZmlsZSwgR1pfU1VGRklYKTsKKworICAgIGluID0gZm9wZW4oZmlsZSwgInJiIik7CisgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBvdXQgPSBnem9wZW4ob3V0ZmlsZSwgbW9kZSk7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgb3V0ZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGd6X2NvbXByZXNzKGluLCBvdXQpOworCisgICAgdW5saW5rKGZpbGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW5jb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmVtb3ZlIHRoZSBvcmlnaW5hbC4KKyAqLwordm9pZCBmaWxlX3VuY29tcHJlc3MoZmlsZSkKKyAgICBjaGFyICAqZmlsZTsKK3sKKyAgICBsb2NhbCBjaGFyIGJ1ZltNQVhfTkFNRV9MRU5dOworICAgIGNoYXIgKmluZmlsZSwgKm91dGZpbGU7CisgICAgRklMRSAgKm91dDsKKyAgICBnekZpbGUgaW47CisgICAgaW50IGxlbiA9IHN0cmxlbihmaWxlKTsKKworICAgIHN0cmNweShidWYsIGZpbGUpOworCisgICAgaWYgKGxlbiA+IFNVRkZJWF9MRU4gJiYgc3RyY21wKGZpbGUrbGVuLVNVRkZJWF9MRU4sIEdaX1NVRkZJWCkgPT0gMCkgeworICAgICAgICBpbmZpbGUgPSBmaWxlOworICAgICAgICBvdXRmaWxlID0gYnVmOworICAgICAgICBvdXRmaWxlW2xlbi0zXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ZmlsZSA9IGZpbGU7CisgICAgICAgIGluZmlsZSA9IGJ1ZjsKKyAgICAgICAgc3RyY2F0KGluZmlsZSwgR1pfU1VGRklYKTsKKyAgICB9CisgICAgaW4gPSBnem9wZW4oaW5maWxlLCAicmIiKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBnem9wZW4gJXNcbiIsIHByb2csIGluZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICAgIGlmIChvdXQgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZ3pfdW5jb21wcmVzcyhpbiwgb3V0KTsKKworICAgIHVubGluayhpbmZpbGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWRdIFstZl0gWy1oXSBbLTEgdG8gLTldIFtmaWxlcy4uLl0KKyAqICAgLWQgOiBkZWNvbXByZXNzCisgKiAgIC1mIDogY29tcHJlc3Mgd2l0aCBaX0ZJTFRFUkVECisgKiAgIC1oIDogY29tcHJlc3Mgd2l0aCBaX0hVRkZNQU5fT05MWQorICogICAtMSB0byAtOSA6IGNvbXByZXNzaW9uIGxldmVsCisgKi8KKworaW50IG1haW4oYXJnYywgYXJndikKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICphcmd2W107Cit7CisgICAgaW50IHVuY29tcHIgPSAwOworICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgb3V0bW9kZVsyMF07CisKKyAgICBzdHJjcHkob3V0bW9kZSwgIndiNiAiKTsKKworICAgIHByb2cgPSBhcmd2WzBdOworICAgIGFyZ2MtLSwgYXJndisrOworCisgICAgd2hpbGUgKGFyZ2MgPiAwKSB7CisgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWQiKSA9PSAwKQorCXVuY29tcHIgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWYiKSA9PSAwKQorCW91dG1vZGVbM10gPSAnZic7CisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItaCIpID09IDApCisJb3V0bW9kZVszXSA9ICdoJzsKKyAgICAgIGVsc2UgaWYgKCgqYXJndilbMF0gPT0gJy0nICYmICgqYXJndilbMV0gPj0gJzEnICYmICgqYXJndilbMV0gPD0gJzknICYmCisJICAgICAgICgqYXJndilbMl0gPT0gMCkKKwlvdXRtb2RlWzJdID0gKCphcmd2KVsxXTsKKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICAgIGFyZ2MtLSwgYXJndisrOworICAgIH0KKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRpbik7CisgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworICAgICAgICBpZiAodW5jb21wcikgeworICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZGluKSwgInJiIik7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRpbiIpOworICAgICAgICAgICAgZ3pfdW5jb21wcmVzcyhmaWxlLCBzdGRvdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZG91dCksIG91dG1vZGUpOworICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgZXJyb3IoImNhbid0IGd6ZG9wZW4gc3Rkb3V0Iik7CisgICAgICAgICAgICBnel9jb21wcmVzcyhzdGRpbiwgZmlsZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAodW5jb21wcikgeworICAgICAgICAgICAgICAgIGZpbGVfdW5jb21wcmVzcygqYXJndik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVfY29tcHJlc3MoKmFyZ3YsIG91dG1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7CisgICAgfQorICAgIGV4aXQoMCk7CisgICAgcmV0dXJuIDA7IC8qIHRvIGF2b2lkIHdhcm5pbmcgKi8KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL3RyZWVzLmMgYi9jb21tb24vemxpYi90cmVlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2MyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi90cmVlcy5jCkBAIC0wLDAgKzEsMTIxNCBAQAorLyogdHJlZXMuYyAtLSBvdXRwdXQgZGVmbGF0ZWQgZGF0YSB1c2luZyBIdWZmbWFuIGNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKgorICogIEFMR09SSVRITQorICoKKyAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgdXNlcyBzZXZlcmFsIEh1ZmZtYW4gdHJlZXMuIFRoZSBtb3JlCisgKiAgICAgIGNvbW1vbiBzb3VyY2UgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBzaG9ydGVyIGJpdCBzZXF1ZW5jZXMuCisgKgorICogICAgICBFYWNoIGNvZGUgdHJlZSBpcyBzdG9yZWQgaW4gYSBjb21wcmVzc2VkIGZvcm0gd2hpY2ggaXMgaXRzZWxmCisgKiBhIEh1ZmZtYW4gZW5jb2Rpbmcgb2YgdGhlIGxlbmd0aHMgb2YgYWxsIHRoZSBjb2RlIHN0cmluZ3MgKGluCisgKiBhc2NlbmRpbmcgb3JkZXIgYnkgc291cmNlIHZhbHVlcykuICBUaGUgYWN0dWFsIGNvZGUgc3RyaW5ncyBhcmUKKyAqIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgbGVuZ3RocyBpbiB0aGUgaW5mbGF0ZSBwcm9jZXNzLCBhcyBkZXNjcmliZWQKKyAqIGluIHRoZSBkZWZsYXRlIHNwZWNpZmljYXRpb24uCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIERldXRzY2gsIEwuUC4sIidEZWZsYXRlJyBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgorICogICAgICBBdmFpbGFibGUgaW4gZnRwLnV1Lm5ldDovcHViL2FyY2hpdmluZy96aXAvZG9jL2RlZmxhdGUtMS4xLmRvYworICoKKyAqICAgICAgU3RvcmVyLCBKYW1lcyBBLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIE1ldGhvZHMgYW5kIFRoZW9yeSwgcHAuIDQ5LTUwLgorICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4gIElTQk4gMC03MTY3LTgxNTYtNS4KKyAqCisgKiAgICAgIFNlZGdld2ljaywgUi4KKyAqICAgICAgICAgIEFsZ29yaXRobXMsIHAyOTAuCisgKiAgICAgICAgICBBZGRpc29uLVdlc2xleSwgMTk4My4gSVNCTiAwLTIwMS0wNjY3Mi02LgorICovCisKKy8qIEAoIykgJElkOiB0cmVlcy5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjYgY29uc3RfayBFeHAgJCAqLworCisvKiAjZGVmaW5lIEdFTl9UUkVFU19IICovCisKKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0YW50cworICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIEVORF9CTE9DSyAyNTYKKy8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KKworI2RlZmluZSBSRVBfM182ICAgICAgMTYKKy8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzNfMTAgICAgMTcKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CisKK2xvY2FsIGNvbnN0IGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDd9OworCitsb2NhbCBjb25zdCB1Y2ggYmxfb3JkZXJbQkxfQ09ERVNdCisgICA9IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKKy8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmcKKyAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLgorICovCisKKyNkZWZpbmUgQnVmX3NpemUgKDggKiAyKnNpemVvZihjaGFyKSkKKy8qIE51bWJlciBvZiBiaXRzIHVzZWQgd2l0aGluIGJpX2J1Zi4gKGJpX2J1ZiBtaWdodCBiZSBpbXBsZW1lbnRlZCBvbgorICogbW9yZSB0aGFuIDE2IGJpdHMgb24gc29tZSBzeXN0ZW1zLikKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuCisgKi8KKworI2RlZmluZSBESVNUX0NPREVfTEVOICA1MTIgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorLyogbm9uIEFOU0kgY29tcGlsZXJzIG1heSBub3QgYWNjZXB0IHRyZWVzLmggKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0CisgKiBiZWxvdykuCisgKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCisgKiA1IGJpdHMuKQorICovCisKK3VjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dOworLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcworICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgorICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCisgKi8KKwordWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCitsb2NhbCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2Rpc3RbRF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisjZWxzZQorIyAgaW5jbHVkZSAidHJlZXMuaCIKKyNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLworCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHsKKyAgICBjb25zdCBjdF9kYXRhICpzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKyAgICBjb25zdCBpbnRmICpleHRyYV9iaXRzOyAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisgICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisgICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCisgICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCit9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfbF9kZXNjID0KK3tzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUysxLCBMX0NPREVTLCBNQVhfQklUU307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19kX2Rlc2MgPQore3N0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2JsX2Rlc2MgPQoreyhjb25zdCBjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgIEJMX0NPREVTLCBNQVhfQkxfQklUU307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgKHN0YXRpYykgcm91dGluZXMgaW4gdGhpcyBmaWxlLgorICovCisKK2xvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgaW5pdF9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgcHFkb3duaGVhcCAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBrKSk7Citsb2NhbCB2b2lkIGdlbl9iaXRsZW4gICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAgT0YoKGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSwgdXNoZiAqYmxfY291bnQpKTsKK2xvY2FsIHZvaWQgYnVpbGRfdHJlZSAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBzY2FuX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCB2b2lkIHNlbmRfdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2RlcykpOworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9kYXRhICpkdHJlZSkpOworbG9jYWwgdm9pZCBzZXRfZGF0YV90eXBlICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdW5zaWduZWQgYmlfcmV2ZXJzZSBPRigodW5zaWduZWQgdmFsdWUsIGludCBsZW5ndGgpKTsKK2xvY2FsIHZvaWQgYmlfd2luZHVwICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgYmlfZmx1c2ggICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgY29weV9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVuc2lnbmVkIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXIpKTsKKworI2lmZGVmIEdFTl9UUkVFU19ICitsb2NhbCB2b2lkIGdlbl90cmVlc19oZWFkZXIgT0YoKHZvaWQpKTsKKyNlbmRpZgorCisjaWZuZGVmIERFQlVHCisjICBkZWZpbmUgc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKQorICAgLyogU2VuZCBhIGNvZGUgb2YgdGhlIGdpdmVuIHRyZWUuIGMgYW5kIHRyZWUgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworI2Vsc2UgLyogREVCVUcgKi8KKyMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgXAorICAgICB7IGlmICh6X3ZlcmJvc2U+MikgZnByaW50ZihzdGRlcnIsIlxuY2QgJTNkICIsKGMpKTsgXAorICAgICAgIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKTsgfQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uCisgKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuCisgKi8KKyNkZWZpbmUgcHV0X3Nob3J0KHMsIHcpIHsgXAorICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTsgXAorICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTsgXAorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCisgKi8KKyNpZmRlZiBERUJVRworbG9jYWwgdm9pZCBzZW5kX2JpdHMgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7CisKK2xvY2FsIHZvaWQgc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgdmFsdWU7ICAvKiB2YWx1ZSB0byBzZW5kICovCisgICAgaW50IGxlbmd0aDsgLyogbnVtYmVyIG9mIGJpdHMgKi8KK3sKKyAgICBUcmFjZXZ2KChzdGRlcnIsIiBsICUyZCB2ICU0eCAiLCBsZW5ndGgsIHZhbHVlKSk7CisgICAgQXNzZXJ0KGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDE1LCAiaW52YWxpZCBsZW5ndGgiKTsKKyAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW5ndGg7CisKKyAgICAvKiBJZiBub3QgZW5vdWdoIHJvb20gaW4gYmlfYnVmLCB1c2UgKHZhbGlkKSBiaXRzIGZyb20gYmlfYnVmIGFuZAorICAgICAqICgxNiAtIGJpX3ZhbGlkKSBiaXRzIGZyb20gdmFsdWUsIGxlYXZpbmcgKHdpZHRoIC0gKDE2LWJpX3ZhbGlkKSkKKyAgICAgKiB1bnVzZWQgYml0cyBpbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuZ3RoKSB7CisgICAgICAgIHMtPmJpX2J1ZiB8PSAodmFsdWUgPDwgcy0+YmlfdmFsaWQpOworICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKKyAgICAgICAgcy0+YmlfYnVmID0gKHVzaCl2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLT5iaV92YWxpZCk7CisgICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmJpX2J1ZiB8PSB2YWx1ZSA8PCBzLT5iaV92YWxpZDsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoOworICAgIH0KK30KKyNlbHNlIC8qICFERUJVRyAqLworCisjZGVmaW5lIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSBcCit7IGludCBsZW4gPSBsZW5ndGg7XAorICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuKSB7XAorICAgIGludCB2YWwgPSB2YWx1ZTtcCisgICAgcy0+YmlfYnVmIHw9ICh2YWwgPDwgcy0+YmlfdmFsaWQpO1wKKyAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTtcCisgICAgcy0+YmlfYnVmID0gKHVzaCl2YWwgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW4gLSBCdWZfc2l6ZTtcCisgIH0gZWxzZSB7XAorICAgIHMtPmJpX2J1ZiB8PSAodmFsdWUpIDw8IHMtPmJpX3ZhbGlkO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW47XAorICB9XAorfQorI2VuZGlmIC8qIERFQlVHICovCisKKworI2RlZmluZSBNQVgoYSxiKSAoYSA+PSBiID8gYSA6IGIpCisvKiB0aGUgYXJndW1lbnRzIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy4KKyAqLworbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCgpCit7CisjaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKKyAgICBzdGF0aWMgaW50IHN0YXRpY19pbml0X2RvbmUgPSAwOworICAgIGludCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqLworICAgIGludCBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovCisgICAgaW50IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovCisgICAgaW50IGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqLworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGlmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47CisKKyAgICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovCisgICAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTsKKyAgICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0czsKKyAgICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlOworICAgIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzOworICAgIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTLTE7IGNvZGUrKykgeworICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9sYml0c1tjb2RlXSk7IG4rKykgeworICAgICAgICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGxlbmd0aCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NiIpOworICAgIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkCisgICAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2UKKyAgICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6CisgICAgICovCisgICAgX2xlbmd0aF9jb2RlW2xlbmd0aC0xXSA9ICh1Y2gpY29kZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworICAgIGRpc3QgPSAwOworICAgIGZvciAoY29kZSA9IDAgOyBjb2RlIDwgMTY7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NiIpOworICAgIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqLworICAgIGZvciAoIDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8KGV4dHJhX2RiaXRzW2NvZGVdLTcpKTsgbisrKSB7CisgICAgICAgICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTIiKTsKKworICAgIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi8KKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIGJsX2NvdW50W2JpdHNdID0gMDsKKyAgICBuID0gMDsKKyAgICB3aGlsZSAobiA8PSAxNDMpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDgsIGJsX2NvdW50WzhdKys7CisgICAgd2hpbGUgKG4gPD0gMjU1KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA5LCBibF9jb3VudFs5XSsrOworICAgIHdoaWxlIChuIDw9IDI3OSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gNywgYmxfY291bnRbN10rKzsKKyAgICB3aGlsZSAobiA8PSAyODcpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDgsIGJsX2NvdW50WzhdKys7CisgICAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlCisgICAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlCisgICAgICogYWxsIG9uZXMpCisgICAgICovCisgICAgZ2VuX2NvZGVzKChjdF9kYXRhICopc3RhdGljX2x0cmVlLCBMX0NPREVTKzEsIGJsX2NvdW50KTsKKworICAgIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqLworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKKyAgICAgICAgc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZSgodW5zaWduZWQpbiwgNSk7CisgICAgfQorICAgIHN0YXRpY19pbml0X2RvbmUgPSAxOworCisjICBpZmRlZiBHRU5fVFJFRVNfSAorICAgIGdlbl90cmVlc19oZWFkZXIoKTsKKyMgIGVuZGlmCisjZW5kaWYgLyogZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmVyYXRlIHRoZSBmaWxlIHRyZWVzLmggZGVzY3JpYmluZyB0aGUgc3RhdGljIHRyZWVzLgorICovCisjaWZkZWYgR0VOX1RSRUVTX0gKKyMgIGlmbmRlZiBERUJVRworIyAgICBpbmNsdWRlIDxzdGRpby5oPgorIyAgZW5kaWYKKworIyAgZGVmaW5lIFNFUEFSQVRPUihpLCBsYXN0LCB3aWR0aCkgXAorICAgICAgKChpKSA9PSAobGFzdCk/ICJcbn07XG5cbiIgOiAgICBcCisgICAgICAgKChpKSAlICh3aWR0aCkgPT0gKHdpZHRoKS0xID8gIixcbiIgOiAiLCAiKSkKKwordm9pZCBnZW5fdHJlZXNfaGVhZGVyKCkKK3sKKyAgICBGSUxFICpoZWFkZXIgPSBmb3BlbigidHJlZXMuaCIsICJ3Iik7CisgICAgaW50IGk7CisKKyAgICBBc3NlcnQgKGhlYWRlciAhPSBOVUxMLCAiQ2FuJ3Qgb3BlbiB0cmVlcy5oIik7CisgICAgZnByaW50ZihoZWFkZXIsCisJICAgICIvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqL1xuXG4iKTsKKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREVTKzI7IGkrKykgeworCWZwcmludGYoaGVhZGVyLCAie3slM3V9LHslM3V9fSVzIiwgc3RhdGljX2x0cmVlW2ldLkNvZGUsCisJCXN0YXRpY19sdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBMX0NPREVTKzEsIDUpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgeworCWZwcmludGYoaGVhZGVyLCAie3slMnV9LHslMnV9fSVzIiwgc3RhdGljX2R0cmVlW2ldLkNvZGUsCisJCXN0YXRpY19kdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDUpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IERJU1RfQ09ERV9MRU47IGkrKykgeworCWZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfZGlzdF9jb2RlW2ldLAorCQlTRVBBUkFUT1IoaSwgRElTVF9DT0RFX0xFTi0xLCAyMCkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BVENILU1JTl9NQVRDSCsxOyBpKyspIHsKKwlmcHJpbnRmKGhlYWRlciwgIiUydSVzIiwgX2xlbmd0aF9jb2RlW2ldLAorCQlTRVBBUkFUT1IoaSwgTUFYX01BVENILU1JTl9NQVRDSCwgMjApKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTkdUSF9DT0RFUzsgaSsrKSB7CisJZnByaW50ZihoZWFkZXIsICIlMXUlcyIsIGJhc2VfbGVuZ3RoW2ldLAorCQlTRVBBUkFUT1IoaSwgTEVOR1RIX0NPREVTLTEsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgeworCWZwcmludGYoaGVhZGVyLCAiJTV1JXMiLCBiYXNlX2Rpc3RbaV0sCisJCVNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDEwKSk7CisgICAgfQorCisgICAgZmNsb3NlKGhlYWRlcik7Cit9CisjZW5kaWYgLyogR0VOX1RSRUVTX0ggKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uCisgKi8KK3ZvaWQgX3RyX2luaXQocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHRyX3N0YXRpY19pbml0KCk7CisKKyAgICBzLT5sX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fbHRyZWU7CisgICAgcy0+bF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfbF9kZXNjOworCisgICAgcy0+ZF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2R0cmVlOworICAgIHMtPmRfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2RfZGVzYzsKKworICAgIHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBzLT5ibF90cmVlOworICAgIHMtPmJsX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19ibF9kZXNjOworCisgICAgcy0+YmlfYnVmID0gMDsKKyAgICBzLT5iaV92YWxpZCA9IDA7CisgICAgcy0+bGFzdF9lb2JfbGVuID0gODsgLyogZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZSAqLworI2lmZGVmIERFQlVHCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gPSAwTDsKKyAgICBzLT5iaXRzX3NlbnQgPSAwTDsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovCisgICAgaW5pdF9ibG9jayhzKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLgorICovCitsb2NhbCB2b2lkIGluaXRfYmxvY2socykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGludCBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KKworICAgIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqLworICAgIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSBzLT5keW5fbHRyZWVbbl0uRnJlcSA9IDA7CisgICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHMtPmR5bl9kdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgcy0+YmxfdHJlZVtuXS5GcmVxID0gMDsKKworICAgIHMtPmR5bl9sdHJlZVtFTkRfQkxPQ0tdLkZyZXEgPSAxOworICAgIHMtPm9wdF9sZW4gPSBzLT5zdGF0aWNfbGVuID0gMEw7CisgICAgcy0+bGFzdF9saXQgPSBzLT5tYXRjaGVzID0gMDsKK30KKworI2RlZmluZSBTTUFMTEVTVCAxCisvKiBJbmRleCB3aXRoaW4gdGhlIGhlYXAgYXJyYXkgb2YgbGVhc3QgZnJlcXVlbnQgbm9kZSBpbiB0aGUgSHVmZm1hbiB0cmVlICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgZnJvbSB0aGUgaGVhcCBhbmQgcmVjcmVhdGUgdGhlIGhlYXAgd2l0aAorICogb25lIGxlc3MgZWxlbWVudC4gVXBkYXRlcyBoZWFwIGFuZCBoZWFwX2xlbi4KKyAqLworI2RlZmluZSBwcXJlbW92ZShzLCB0cmVlLCB0b3ApIFwKK3tcCisgICAgdG9wID0gcy0+aGVhcFtTTUFMTEVTVF07IFwKKyAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IHMtPmhlYXBbcy0+aGVhcF9sZW4tLV07IFwKKyAgICBwcWRvd25oZWFwKHMsIHRyZWUsIFNNQUxMRVNUKTsgXAorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuCisgKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC4KKyAqLworI2RlZmluZSBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSBcCisgICAodHJlZVtuXS5GcmVxIDwgdHJlZVttXS5GcmVxIHx8IFwKKyAgICh0cmVlW25dLkZyZXEgPT0gdHJlZVttXS5GcmVxICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgaywKKyAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCisgKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzCisgKiB0d28gc29ucykuCisgKi8KK2xvY2FsIHZvaWQgcHFkb3duaGVhcChzLCB0cmVlLCBrKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi8KKyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqLworeworICAgIGludCB2ID0gcy0+aGVhcFtrXTsKKyAgICBpbnQgaiA9IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi8KKyAgICB3aGlsZSAoaiA8PSBzLT5oZWFwX2xlbikgeworICAgICAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqLworICAgICAgICBpZiAoaiA8IHMtPmhlYXBfbGVuICYmCisgICAgICAgICAgICBzbWFsbGVyKHRyZWUsIHMtPmhlYXBbaisxXSwgcy0+aGVhcFtqXSwgcy0+ZGVwdGgpKSB7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi8KKyAgICAgICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy0+aGVhcFtqXSwgcy0+ZGVwdGgpKSBicmVhazsKKworICAgICAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqLworICAgICAgICBzLT5oZWFwW2tdID0gcy0+aGVhcFtqXTsgIGsgPSBqOworCisgICAgICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi8KKyAgICAgICAgaiA8PD0gMTsKKyAgICB9CisgICAgcy0+aGVhcFtrXSA9IHY7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGgKKyAqIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kCisgKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgorICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZQorICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLgorICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcworICogICAgIG5vdCBudWxsLgorICovCitsb2NhbCB2b2lkIGdlbl9iaXRsZW4ocywgZGVzYykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLworeworICAgIGN0X2RhdGEgKnRyZWUgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgaW50IG1heF9jb2RlICAgICAgICAgPSBkZXNjLT5tYXhfY29kZTsKKyAgICBjb25zdCBjdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRfZGVzYy0+c3RhdGljX3RyZWU7CisgICAgY29uc3QgaW50ZiAqZXh0cmEgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmV4dHJhX2JpdHM7CisgICAgaW50IGJhc2UgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmV4dHJhX2Jhc2U7CisgICAgaW50IG1heF9sZW5ndGggICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPm1heF9sZW5ndGg7CisgICAgaW50IGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovCisgICAgaW50IG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi8KKyAgICBpbnQgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi8KKyAgICB1c2ggZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLworICAgIGludCBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KKworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgcy0+YmxfY291bnRbYml0c10gPSAwOworCisgICAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXkKKyAgICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KKyAgICAgKi8KKyAgICB0cmVlW3MtPmhlYXBbcy0+aGVhcF9tYXhdXS5MZW4gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovCisKKyAgICBmb3IgKGggPSBzLT5oZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHsKKyAgICAgICAgbiA9IHMtPmhlYXBbaF07CisgICAgICAgIGJpdHMgPSB0cmVlW3RyZWVbbl0uRGFkXS5MZW4gKyAxOworICAgICAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIGJpdHMgPSBtYXhfbGVuZ3RoLCBvdmVyZmxvdysrOworICAgICAgICB0cmVlW25dLkxlbiA9ICh1c2gpYml0czsKKyAgICAgICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKworICAgICAgICBpZiAobiA+IG1heF9jb2RlKSBjb250aW51ZTsgLyogbm90IGEgbGVhZiBub2RlICovCisKKyAgICAgICAgcy0+YmxfY291bnRbYml0c10rKzsKKyAgICAgICAgeGJpdHMgPSAwOworICAgICAgICBpZiAobiA+PSBiYXNlKSB4Yml0cyA9IGV4dHJhW24tYmFzZV07CisgICAgICAgIGYgPSB0cmVlW25dLkZyZXE7CisgICAgICAgIHMtPm9wdF9sZW4gKz0gKHVsZylmICogKGJpdHMgKyB4Yml0cyk7CisgICAgICAgIGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiArPSAodWxnKWYgKiAoc3RyZWVbbl0uTGVuICsgeGJpdHMpOworICAgIH0KKyAgICBpZiAob3ZlcmZsb3cgPT0gMCkgcmV0dXJuOworCisgICAgVHJhY2UoKHN0ZGVyciwiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7CisgICAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KKworICAgIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovCisgICAgZG8geworICAgICAgICBiaXRzID0gbWF4X2xlbmd0aC0xOworICAgICAgICB3aGlsZSAocy0+YmxfY291bnRbYml0c10gPT0gMCkgYml0cy0tOworICAgICAgICBzLT5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqLworICAgICAgICBzLT5ibF9jb3VudFtiaXRzKzFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KKyAgICAgICAgcy0+YmxfY291bnRbbWF4X2xlbmd0aF0tLTsKKyAgICAgICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKKyAgICAgICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdCisgICAgICAgICAqLworICAgICAgICBvdmVyZmxvdyAtPSAyOworICAgIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7CisKKyAgICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgICAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAorICAgICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuCisgICAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCisgICAgICovCisgICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKKyAgICAgICAgbiA9IHMtPmJsX2NvdW50W2JpdHNdOworICAgICAgICB3aGlsZSAobiAhPSAwKSB7CisgICAgICAgICAgICBtID0gcy0+aGVhcFstLWhdOworICAgICAgICAgICAgaWYgKG0gPiBtYXhfY29kZSkgY29udGludWU7CisgICAgICAgICAgICBpZiAodHJlZVttXS5MZW4gIT0gKHVuc2lnbmVkKSBiaXRzKSB7CisgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKyAgICAgICAgICAgICAgICBzLT5vcHRfbGVuICs9ICgobG9uZyliaXRzIC0gKGxvbmcpdHJlZVttXS5MZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxvbmcpdHJlZVttXS5GcmVxOworICAgICAgICAgICAgICAgIHRyZWVbbV0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbi0tOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZQorICogb3B0aW1hbCkuCisgKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvcgorICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCisgKiAgICAgemVybyBjb2RlIGxlbmd0aC4KKyAqLworbG9jYWwgdm9pZCBnZW5fY29kZXMgKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudCkKKyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqLworICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi8KK3sKKyAgICB1c2ggbmV4dF9jb2RlW01BWF9CSVRTKzFdOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworICAgIHVzaCBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqLworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi8KKworICAgIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlcworICAgICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLgorICAgICAqLworICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgeworICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzLTFdKSA8PCAxOworICAgIH0KKyAgICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlCisgICAgICogbXVzdCBiZSBhbGwgb25lcy4KKyAgICAgKi8KKyAgICBBc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsCisgICAgICAgICAgICAiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CisKKyAgICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGludCBsZW4gPSB0cmVlW25dLkxlbjsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KKyAgICAgICAgdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOworCisgICAgICAgIFRyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLAorICAgICAgICAgICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgorICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKKyAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcworICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAqLworbG9jYWwgdm9pZCBidWlsZF90cmVlKHMsIGRlc2MpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi8KK3sKKyAgICBjdF9kYXRhICp0cmVlICAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBjb25zdCBjdF9kYXRhICpzdHJlZSAgPSBkZXNjLT5zdGF0X2Rlc2MtPnN0YXRpY190cmVlOworICAgIGludCBlbGVtcyAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZWxlbXM7CisgICAgaW50IG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovCisgICAgaW50IG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIGludCBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovCisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluCisgICAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uCisgICAgICogaGVhcFswXSBpcyBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBzLT5oZWFwX2xlbiA9IDAsIHMtPmhlYXBfbWF4ID0gSEVBUF9TSVpFOworCisgICAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHsKKyAgICAgICAgaWYgKHRyZWVbbl0uRnJlcSAhPSAwKSB7CisgICAgICAgICAgICBzLT5oZWFwWysrKHMtPmhlYXBfbGVuKV0gPSBtYXhfY29kZSA9IG47CisgICAgICAgICAgICBzLT5kZXB0aFtuXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmVlW25dLkxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLAorICAgICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0CisgICAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS4KKyAgICAgKi8KKyAgICB3aGlsZSAocy0+aGVhcF9sZW4gPCAyKSB7CisgICAgICAgIG5vZGUgPSBzLT5oZWFwWysrKHMtPmhlYXBfbGVuKV0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApOworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSAxOworICAgICAgICBzLT5kZXB0aFtub2RlXSA9IDA7CisgICAgICAgIHMtPm9wdF9sZW4tLTsgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGVdLkxlbjsKKyAgICAgICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCisgICAgfQorICAgIGRlc2MtPm1heF9jb2RlID0gbWF4X2NvZGU7CisKKyAgICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsCisgICAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6CisgICAgICovCisgICAgZm9yIChuID0gcy0+aGVhcF9sZW4vMjsgbiA+PSAxOyBuLS0pIHBxZG93bmhlYXAocywgdHJlZSwgbik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisgICAgICogZnJlcXVlbnQgbm9kZXMuCisgICAgICovCisgICAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovCisgICAgZG8geworICAgICAgICBwcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqLworICAgICAgICBtID0gcy0+aGVhcFtTTUFMTEVTVF07IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovCisKKyAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLworICAgICAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBtOworCisgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovCisgICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVbbV0uRnJlcTsKKyAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAodWNoKSAoTUFYKHMtPmRlcHRoW25dLCBzLT5kZXB0aFttXSkgKyAxKTsKKyAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKyAgICAgICAgaWYgKHRyZWUgPT0gcy0+YmxfdHJlZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBub2RlKys7CisgICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOworCisgICAgfSB3aGlsZSAocy0+aGVhcF9sZW4gPj0gMik7CisKKyAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBzLT5oZWFwW1NNQUxMRVNUXTsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKKyAgICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCisgICAgICovCisgICAgZ2VuX2JpdGxlbihzLCAodHJlZV9kZXNjICopZGVzYyk7CisKKyAgICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCisgICAgZ2VuX2NvZGVzICgoY3RfZGF0YSAqKXRyZWUsIG1heF9jb2RlLCBzLT5ibF9jb3VudCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4KKyAqLworbG9jYWwgdm9pZCBzY2FuX3RyZWUgKHMsIHRyZWUsIG1heF9jb2RlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKKyAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCisgKiBibF90cmVlLgorICovCitsb2NhbCB2b2lkIHNlbmRfdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOworICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7CisgICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOworCisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KKyAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICovCitsb2NhbCBpbnQgYnVpbGRfYmxfdHJlZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgcy0+bF9kZXNjLm1heF9jb2RlKTsKKyAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIHMtPmRfZGVzYy5tYXhfY29kZSk7CisKKyAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLworICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmJsX2Rlc2MpKSk7CisgICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorICAgICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCisgICAgICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKKyAgICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworICAgICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKKyAgICAgKi8KKyAgICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMtMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgeworICAgICAgICBpZiAocy0+YmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KKyAgICBzLT5vcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsgNSs1KzQ7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLAorICAgICAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpOworCisgICAgcmV0dXJuIG1heF9ibGluZGV4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQorICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCisgKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCit7CisgICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLworCisgICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKKyAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCisgICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7CisgICAgc2VuZF9iaXRzKHMsIGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBzZW5kX2JpdHMocywgZGNvZGVzLTEsICAgNSk7CisgICAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisgICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgeworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKKyAgICAgICAgc2VuZF9iaXRzKHMsIHMtPmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7CisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKKworICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgc3RvcmVkIGJsb2NrCisgKi8KK3ZvaWQgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGVvZjsgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KK3sKKyAgICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSzw8MSkrZW9mLCAzKTsgIC8qIHNlbmQgYmxvY2sgdHlwZSAqLworI2lmZGVmIERFQlVHCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gPSAocy0+Y29tcHJlc3NlZF9sZW4gKyAzICsgNykgJiAodWxnKX43TDsKKyAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAoc3RvcmVkX2xlbiArIDQpIDw8IDM7CisjZW5kaWYKKyAgICBjb3B5X2Jsb2NrKHMsIGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9sZW4sIDEpOyAvKiB3aXRoIGhlYWRlciAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuCisgKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci4KKyAqIFRoZSBjdXJyZW50IGluZmxhdGUgY29kZSByZXF1aXJlcyA5IGJpdHMgb2YgbG9va2FoZWFkLiBJZiB0aGUKKyAqIGxhc3QgdHdvIGNvZGVzIGZvciB0aGUgcHJldmlvdXMgYmxvY2sgKHJlYWwgY29kZSBwbHVzIEVPQikgd2VyZSBjb2RlZAorICogb24gNSBiaXRzIG9yIGxlc3MsIGluZmxhdGUgbWF5IGhhdmUgb25seSA1KzMgYml0cyBvZiBsb29rYWhlYWQgdG8gZGVjb2RlCisgKiB0aGUgbGFzdCByZWFsIGNvZGUuIEluIHRoaXMgY2FzZSB3ZSBzZW5kIHR3byBlbXB0eSBzdGF0aWMgYmxvY2tzIGluc3RlYWQKKyAqIG9mIG9uZS4gKFRoZXJlIGFyZSBubyBwcm9ibGVtcyBpZiB0aGUgcHJldmlvdXMgYmxvY2sgaXMgc3RvcmVkIG9yIGZpeGVkLikKKyAqIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBhc3N1bWUgdGhlIHdvcnN0IGNhc2Ugb2YgbGFzdCByZWFsIGNvZGUgZW5jb2RlZAorICogb24gb25lIGJpdCBvbmx5LgorICovCit2b2lkIF90cl9hbGlnbihzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTsKKyNpZmRlZiBERUJVRworICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsgLyogMyBmb3IgYmxvY2sgdHlwZSwgNyBmb3IgRU9CICovCisjZW5kaWYKKyAgICBiaV9mbHVzaChzKTsKKyAgICAvKiBPZiB0aGUgMTAgYml0cyBmb3IgdGhlIGVtcHR5IGJsb2NrLCB3ZSBoYXZlIGFscmVhZHkgc2VudAorICAgICAqICgxMCAtIGJpX3ZhbGlkKSBiaXRzLiBUaGUgbG9va2FoZWFkIGZvciB0aGUgbGFzdCByZWFsIGNvZGUgKGJlZm9yZQorICAgICAqIHRoZSBFT0Igb2YgdGhlIHByZXZpb3VzIGJsb2NrKSB3YXMgdGh1cyBhdCBsZWFzdCBvbmUgcGx1cyB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIEVPQiBwbHVzIHdoYXQgd2UgaGF2ZSBqdXN0IHNlbnQgb2YgdGhlIGVtcHR5IHN0YXRpYyBibG9jay4KKyAgICAgKi8KKyAgICBpZiAoMSArIHMtPmxhc3RfZW9iX2xlbiArIDEwIC0gcy0+YmlfdmFsaWQgPCA5KSB7CisgICAgICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOworICAgICAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsKKyNlbmRpZgorICAgICAgICBiaV9mbHVzaChzKTsKKyAgICB9CisgICAgcy0+bGFzdF9lb2JfbGVuID0gNzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKKyAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS4KKyAqLwordm9pZCBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGVvZjsgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KK3sKKyAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCisgICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KKyAgICBpZiAocy0+bGV2ZWwgPiAwKSB7CisKKwkgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYXNjaWkgb3IgYmluYXJ5ICovCisJaWYgKHMtPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pIHNldF9kYXRhX3R5cGUocyk7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisJYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOworCVRyYWNldigoc3RkZXJyLCAiXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAorCQlzLT5zdGF0aWNfbGVuKSk7CisKKwlidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5kX2Rlc2MpKSk7CisJVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAorCQlzLT5zdGF0aWNfbGVuKSk7CisJLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCisJICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKwkgKi8KKworCS8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4CisJICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisJICovCisJbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpOworCisJLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIGZpcnN0IHRoZSBibG9jayBsZW5ndGggaW4gYnl0ZXMqLworCW9wdF9sZW5iID0gKHMtPm9wdF9sZW4rMys3KT4+MzsKKwlzdGF0aWNfbGVuYiA9IChzLT5zdGF0aWNfbGVuKzMrNyk+PjM7CisKKwlUcmFjZXYoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgIiwKKwkJb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLAorCQlzLT5sYXN0X2xpdCkpOworCisJaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgImxvc3QgYnVmIik7CisJb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLworICAgIH0KKworI2lmZGVmIEZPUkNFX1NUT1JFRAorICAgIGlmIChidWYgIT0gKGNoYXIqKTApIHsgLyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCisjZWxzZQorICAgIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKyNlbmRpZgorICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgorICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCisgICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgorICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KKyAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KKyAgICAgICAgICovCisgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpOworCisjaWZkZWYgRk9SQ0VfU1RBVElDCisgICAgfSBlbHNlIGlmIChzdGF0aWNfbGVuYiA+PSAwKSB7IC8qIGZvcmNlIHN0YXRpYyB0cmVlcyAqLworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CisjZW5kaWYKKyAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2VvZiwgMyk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopc3RhdGljX2x0cmVlLCAoY3RfZGF0YSAqKXN0YXRpY19kdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPnN0YXRpY19sZW47CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUzw8MSkrZW9mLCAzKTsKKyAgICAgICAgc2VuZF9hbGxfdHJlZXMocywgcy0+bF9kZXNjLm1heF9jb2RlKzEsIHMtPmRfZGVzYy5tYXhfY29kZSsxLAorICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmxpbmRleCsxKTsKKyAgICAgICAgY29tcHJlc3NfYmxvY2socywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+b3B0X2xlbjsKKyNlbmRpZgorICAgIH0KKyAgICBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgImJhZCBjb21wcmVzc2VkIHNpemUiKTsKKyAgICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQgorICAgICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLgorICAgICAqLworICAgIGluaXRfYmxvY2socyk7CisKKyAgICBpZiAoZW9mKSB7CisgICAgICAgIGJpX3dpbmR1cChzKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworI2VuZGlmCisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCJcbmNvbXBybGVuICVsdSglbHUpICIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLAorICAgICAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03KmVvZikpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgorICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgorICovCitpbnQgX3RyX3RhbGx5IChzLCBkaXN0LCBsYykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLworeworICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7CisgICAgaWYgKGRpc3QgPT0gMCkgeworICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KKyAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWF0Y2hlcysrOworICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgorICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgorICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiX3RyX3RhbGx5OiBiYWQgbWF0Y2giKTsKKworICAgICAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7CisgICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKKyAgICB9CisKKyNpZmRlZiBUUlVOQ0FURV9CTE9DSworICAgIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLworICAgIGlmICgocy0+bGFzdF9saXQgJiAweDFmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7CisgICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLworICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7CisgICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKKyAgICAgICAgaW50IGRjb2RlOworICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CisgICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKKyAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKKyAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCisgICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOworICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOworICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SworICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCisgICAgICogNjRLLTEgYnl0ZXMuCisgICAgICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCisgKi8KK2xvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCit7CisgICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworICAgIGludCBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCisgICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCisgICAgdW5zaWduZWQgY29kZTsgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovCisgICAgaW50IGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovCisKKyAgICBpZiAocy0+bGFzdF9saXQgIT0gMCkgZG8geworICAgICAgICBkaXN0ID0gcy0+ZF9idWZbbHhdOworICAgICAgICBsYyA9IHMtPmxfYnVmW2x4KytdOworICAgICAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVyciwiICclYycgIiwgbGMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKyAgICAgICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7CisgICAgICAgICAgICBBc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOworCisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLworCisgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovCisgICAgICAgIEFzc2VydChzLT5wZW5kaW5nIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LCAicGVuZGluZ0J1ZiBvdmVyZmxvdyIpOworCisgICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7CisKKyAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7CisgICAgcy0+bGFzdF9lb2JfbGVuID0gbHRyZWVbRU5EX0JMT0NLXS5MZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IHRoZSBkYXRhIHR5cGUgdG8gQVNDSUkgb3IgQklOQVJZLCB1c2luZyBhIGNydWRlIGFwcHJveGltYXRpb246CisgKiBiaW5hcnkgaWYgbW9yZSB0aGFuIDIwJSBvZiB0aGUgYnl0ZXMgYXJlIDw9IDYgb3IgPj0gMTI4LCBhc2NpaSBvdGhlcndpc2UuCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldCBhbmQgdGhlIHRvdGFsIG9mIGFsbAorICogZnJlcXVlbmNpZXMgZG9lcyBub3QgZXhjZWVkIDY0SyAodG8gZml0IGluIGFuIGludCBvbiAxNiBiaXQgbWFjaGluZXMpLgorICovCitsb2NhbCB2b2lkIHNldF9kYXRhX3R5cGUocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGludCBuID0gMDsKKyAgICB1bnNpZ25lZCBhc2NpaV9mcmVxID0gMDsKKyAgICB1bnNpZ25lZCBiaW5fZnJlcSA9IDA7CisgICAgd2hpbGUgKG4gPCA3KSAgICAgICAgYmluX2ZyZXEgKz0gcy0+ZHluX2x0cmVlW24rK10uRnJlcTsKKyAgICB3aGlsZSAobiA8IDEyOCkgICAgYXNjaWlfZnJlcSArPSBzLT5keW5fbHRyZWVbbisrXS5GcmVxOworICAgIHdoaWxlIChuIDwgTElURVJBTFMpIGJpbl9mcmVxICs9IHMtPmR5bl9sdHJlZVtuKytdLkZyZXE7CisgICAgcy0+ZGF0YV90eXBlID0gKEJ5dGUpKGJpbl9mcmVxID4gKGFzY2lpX2ZyZXEgPj4gMikgPyBaX0JJTkFSWSA6IFpfQVNDSUkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCisgKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCisgKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgKi8KK2xvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UoY29kZSwgbGVuKQorICAgIHVuc2lnbmVkIGNvZGU7IC8qIHRoZSB2YWx1ZSB0byBpbnZlcnQgKi8KKyAgICBpbnQgbGVuOyAgICAgICAvKiBpdHMgYml0IGxlbmd0aCAqLworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHJlcyA9IDA7CisgICAgZG8geworICAgICAgICByZXMgfD0gY29kZSAmIDE7CisgICAgICAgIGNvZGUgPj49IDEsIHJlcyA8PD0gMTsKKyAgICB9IHdoaWxlICgtLWxlbiA+IDApOworICAgIHJldHVybiByZXMgPj4gMTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC4KKyAqLworbG9jYWwgdm9pZCBiaV9mbHVzaChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaWYgKHMtPmJpX3ZhbGlkID09IDE2KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAwOworICAgICAgICBzLT5iaV92YWxpZCA9IDA7CisgICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+PSA4KSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA+Pj0gODsKKyAgICAgICAgcy0+YmlfdmFsaWQgLT0gODsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5CisgKi8KK2xvY2FsIHZvaWQgYmlfd2luZHVwKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpZiAocy0+YmlfdmFsaWQgPiA4KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPiAwKSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgfQorICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgcy0+YmlfdmFsaWQgPSAwOworI2lmZGVmIERFQlVHCisgICAgcy0+Yml0c19zZW50ID0gKHMtPmJpdHNfc2VudCs3KSAmIH43OworI2VuZGlmCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHMKKyAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLgorICovCitsb2NhbCB2b2lkIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqLworICAgIGludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqLworeworICAgIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA4OyAvKiBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlICovCisKKyAgICBpZiAoaGVhZGVyKSB7CisgICAgICAgIHB1dF9zaG9ydChzLCAodXNoKWxlbik7ICAgCisgICAgICAgIHB1dF9zaG9ydChzLCAodXNoKX5sZW4pOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmJpdHNfc2VudCArPSAyKjE2OworI2VuZGlmCisgICAgfQorI2lmZGVmIERFQlVHCisgICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuPDwzOworI2VuZGlmCisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgIHB1dF9ieXRlKHMsICpidWYrKyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvdHJlZXMuaCBiL2NvbW1vbi96bGliL3RyZWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmYWNmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3RyZWVzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovCisKK2xvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7Cit7eyAxMn0seyAgOH19LCB7ezE0MH0seyAgOH19LCB7eyA3Nn0seyAgOH19LCB7ezIwNH0seyAgOH19LCB7eyA0NH0seyAgOH19LAore3sxNzJ9LHsgIDh9fSwge3sxMDh9LHsgIDh9fSwge3syMzZ9LHsgIDh9fSwge3sgMjh9LHsgIDh9fSwge3sxNTZ9LHsgIDh9fSwKK3t7IDkyfSx7ICA4fX0sIHt7MjIwfSx7ICA4fX0sIHt7IDYwfSx7ICA4fX0sIHt7MTg4fSx7ICA4fX0sIHt7MTI0fSx7ICA4fX0sCit7ezI1Mn0seyAgOH19LCB7eyAgMn0seyAgOH19LCB7ezEzMH0seyAgOH19LCB7eyA2Nn0seyAgOH19LCB7ezE5NH0seyAgOH19LAore3sgMzR9LHsgIDh9fSwge3sxNjJ9LHsgIDh9fSwge3sgOTh9LHsgIDh9fSwge3syMjZ9LHsgIDh9fSwge3sgMTh9LHsgIDh9fSwKK3t7MTQ2fSx7ICA4fX0sIHt7IDgyfSx7ICA4fX0sIHt7MjEwfSx7ICA4fX0sIHt7IDUwfSx7ICA4fX0sIHt7MTc4fSx7ICA4fX0sCit7ezExNH0seyAgOH19LCB7ezI0Mn0seyAgOH19LCB7eyAxMH0seyAgOH19LCB7ezEzOH0seyAgOH19LCB7eyA3NH0seyAgOH19LAore3syMDJ9LHsgIDh9fSwge3sgNDJ9LHsgIDh9fSwge3sxNzB9LHsgIDh9fSwge3sxMDZ9LHsgIDh9fSwge3syMzR9LHsgIDh9fSwKK3t7IDI2fSx7ICA4fX0sIHt7MTU0fSx7ICA4fX0sIHt7IDkwfSx7ICA4fX0sIHt7MjE4fSx7ICA4fX0sIHt7IDU4fSx7ICA4fX0sCit7ezE4Nn0seyAgOH19LCB7ezEyMn0seyAgOH19LCB7ezI1MH0seyAgOH19LCB7eyAgNn0seyAgOH19LCB7ezEzNH0seyAgOH19LAore3sgNzB9LHsgIDh9fSwge3sxOTh9LHsgIDh9fSwge3sgMzh9LHsgIDh9fSwge3sxNjZ9LHsgIDh9fSwge3sxMDJ9LHsgIDh9fSwKK3t7MjMwfSx7ICA4fX0sIHt7IDIyfSx7ICA4fX0sIHt7MTUwfSx7ICA4fX0sIHt7IDg2fSx7ICA4fX0sIHt7MjE0fSx7ICA4fX0sCit7eyA1NH0seyAgOH19LCB7ezE4Mn0seyAgOH19LCB7ezExOH0seyAgOH19LCB7ezI0Nn0seyAgOH19LCB7eyAxNH0seyAgOH19LAore3sxNDJ9LHsgIDh9fSwge3sgNzh9LHsgIDh9fSwge3syMDZ9LHsgIDh9fSwge3sgNDZ9LHsgIDh9fSwge3sxNzR9LHsgIDh9fSwKK3t7MTEwfSx7ICA4fX0sIHt7MjM4fSx7ICA4fX0sIHt7IDMwfSx7ICA4fX0sIHt7MTU4fSx7ICA4fX0sIHt7IDk0fSx7ICA4fX0sCit7ezIyMn0seyAgOH19LCB7eyA2Mn0seyAgOH19LCB7ezE5MH0seyAgOH19LCB7ezEyNn0seyAgOH19LCB7ezI1NH0seyAgOH19LAore3sgIDF9LHsgIDh9fSwge3sxMjl9LHsgIDh9fSwge3sgNjV9LHsgIDh9fSwge3sxOTN9LHsgIDh9fSwge3sgMzN9LHsgIDh9fSwKK3t7MTYxfSx7ICA4fX0sIHt7IDk3fSx7ICA4fX0sIHt7MjI1fSx7ICA4fX0sIHt7IDE3fSx7ICA4fX0sIHt7MTQ1fSx7ICA4fX0sCit7eyA4MX0seyAgOH19LCB7ezIwOX0seyAgOH19LCB7eyA0OX0seyAgOH19LCB7ezE3N30seyAgOH19LCB7ezExM30seyAgOH19LAore3syNDF9LHsgIDh9fSwge3sgIDl9LHsgIDh9fSwge3sxMzd9LHsgIDh9fSwge3sgNzN9LHsgIDh9fSwge3syMDF9LHsgIDh9fSwKK3t7IDQxfSx7ICA4fX0sIHt7MTY5fSx7ICA4fX0sIHt7MTA1fSx7ICA4fX0sIHt7MjMzfSx7ICA4fX0sIHt7IDI1fSx7ICA4fX0sCit7ezE1M30seyAgOH19LCB7eyA4OX0seyAgOH19LCB7ezIxN30seyAgOH19LCB7eyA1N30seyAgOH19LCB7ezE4NX0seyAgOH19LAore3sxMjF9LHsgIDh9fSwge3syNDl9LHsgIDh9fSwge3sgIDV9LHsgIDh9fSwge3sxMzN9LHsgIDh9fSwge3sgNjl9LHsgIDh9fSwKK3t7MTk3fSx7ICA4fX0sIHt7IDM3fSx7ICA4fX0sIHt7MTY1fSx7ICA4fX0sIHt7MTAxfSx7ICA4fX0sIHt7MjI5fSx7ICA4fX0sCit7eyAyMX0seyAgOH19LCB7ezE0OX0seyAgOH19LCB7eyA4NX0seyAgOH19LCB7ezIxM30seyAgOH19LCB7eyA1M30seyAgOH19LAore3sxODF9LHsgIDh9fSwge3sxMTd9LHsgIDh9fSwge3syNDV9LHsgIDh9fSwge3sgMTN9LHsgIDh9fSwge3sxNDF9LHsgIDh9fSwKK3t7IDc3fSx7ICA4fX0sIHt7MjA1fSx7ICA4fX0sIHt7IDQ1fSx7ICA4fX0sIHt7MTczfSx7ICA4fX0sIHt7MTA5fSx7ICA4fX0sCit7ezIzN30seyAgOH19LCB7eyAyOX0seyAgOH19LCB7ezE1N30seyAgOH19LCB7eyA5M30seyAgOH19LCB7ezIyMX0seyAgOH19LAore3sgNjF9LHsgIDh9fSwge3sxODl9LHsgIDh9fSwge3sxMjV9LHsgIDh9fSwge3syNTN9LHsgIDh9fSwge3sgMTl9LHsgIDl9fSwKK3t7Mjc1fSx7ICA5fX0sIHt7MTQ3fSx7ICA5fX0sIHt7NDAzfSx7ICA5fX0sIHt7IDgzfSx7ICA5fX0sIHt7MzM5fSx7ICA5fX0sCit7ezIxMX0seyAgOX19LCB7ezQ2N30seyAgOX19LCB7eyA1MX0seyAgOX19LCB7ezMwN30seyAgOX19LCB7ezE3OX0seyAgOX19LAore3s0MzV9LHsgIDl9fSwge3sxMTV9LHsgIDl9fSwge3szNzF9LHsgIDl9fSwge3syNDN9LHsgIDl9fSwge3s0OTl9LHsgIDl9fSwKK3t7IDExfSx7ICA5fX0sIHt7MjY3fSx7ICA5fX0sIHt7MTM5fSx7ICA5fX0sIHt7Mzk1fSx7ICA5fX0sIHt7IDc1fSx7ICA5fX0sCit7ezMzMX0seyAgOX19LCB7ezIwM30seyAgOX19LCB7ezQ1OX0seyAgOX19LCB7eyA0M30seyAgOX19LCB7ezI5OX0seyAgOX19LAore3sxNzF9LHsgIDl9fSwge3s0Mjd9LHsgIDl9fSwge3sxMDd9LHsgIDl9fSwge3szNjN9LHsgIDl9fSwge3syMzV9LHsgIDl9fSwKK3t7NDkxfSx7ICA5fX0sIHt7IDI3fSx7ICA5fX0sIHt7MjgzfSx7ICA5fX0sIHt7MTU1fSx7ICA5fX0sIHt7NDExfSx7ICA5fX0sCit7eyA5MX0seyAgOX19LCB7ezM0N30seyAgOX19LCB7ezIxOX0seyAgOX19LCB7ezQ3NX0seyAgOX19LCB7eyA1OX0seyAgOX19LAore3szMTV9LHsgIDl9fSwge3sxODd9LHsgIDl9fSwge3s0NDN9LHsgIDl9fSwge3sxMjN9LHsgIDl9fSwge3szNzl9LHsgIDl9fSwKK3t7MjUxfSx7ICA5fX0sIHt7NTA3fSx7ICA5fX0sIHt7ICA3fSx7ICA5fX0sIHt7MjYzfSx7ICA5fX0sIHt7MTM1fSx7ICA5fX0sCit7ezM5MX0seyAgOX19LCB7eyA3MX0seyAgOX19LCB7ezMyN30seyAgOX19LCB7ezE5OX0seyAgOX19LCB7ezQ1NX0seyAgOX19LAore3sgMzl9LHsgIDl9fSwge3syOTV9LHsgIDl9fSwge3sxNjd9LHsgIDl9fSwge3s0MjN9LHsgIDl9fSwge3sxMDN9LHsgIDl9fSwKK3t7MzU5fSx7ICA5fX0sIHt7MjMxfSx7ICA5fX0sIHt7NDg3fSx7ICA5fX0sIHt7IDIzfSx7ICA5fX0sIHt7Mjc5fSx7ICA5fX0sCit7ezE1MX0seyAgOX19LCB7ezQwN30seyAgOX19LCB7eyA4N30seyAgOX19LCB7ezM0M30seyAgOX19LCB7ezIxNX0seyAgOX19LAore3s0NzF9LHsgIDl9fSwge3sgNTV9LHsgIDl9fSwge3szMTF9LHsgIDl9fSwge3sxODN9LHsgIDl9fSwge3s0Mzl9LHsgIDl9fSwKK3t7MTE5fSx7ICA5fX0sIHt7Mzc1fSx7ICA5fX0sIHt7MjQ3fSx7ICA5fX0sIHt7NTAzfSx7ICA5fX0sIHt7IDE1fSx7ICA5fX0sCit7ezI3MX0seyAgOX19LCB7ezE0M30seyAgOX19LCB7ezM5OX0seyAgOX19LCB7eyA3OX0seyAgOX19LCB7ezMzNX0seyAgOX19LAore3syMDd9LHsgIDl9fSwge3s0NjN9LHsgIDl9fSwge3sgNDd9LHsgIDl9fSwge3szMDN9LHsgIDl9fSwge3sxNzV9LHsgIDl9fSwKK3t7NDMxfSx7ICA5fX0sIHt7MTExfSx7ICA5fX0sIHt7MzY3fSx7ICA5fX0sIHt7MjM5fSx7ICA5fX0sIHt7NDk1fSx7ICA5fX0sCit7eyAzMX0seyAgOX19LCB7ezI4N30seyAgOX19LCB7ezE1OX0seyAgOX19LCB7ezQxNX0seyAgOX19LCB7eyA5NX0seyAgOX19LAore3szNTF9LHsgIDl9fSwge3syMjN9LHsgIDl9fSwge3s0Nzl9LHsgIDl9fSwge3sgNjN9LHsgIDl9fSwge3szMTl9LHsgIDl9fSwKK3t7MTkxfSx7ICA5fX0sIHt7NDQ3fSx7ICA5fX0sIHt7MTI3fSx7ICA5fX0sIHt7MzgzfSx7ICA5fX0sIHt7MjU1fSx7ICA5fX0sCit7ezUxMX0seyAgOX19LCB7eyAgMH0seyAgN319LCB7eyA2NH0seyAgN319LCB7eyAzMn0seyAgN319LCB7eyA5Nn0seyAgN319LAore3sgMTZ9LHsgIDd9fSwge3sgODB9LHsgIDd9fSwge3sgNDh9LHsgIDd9fSwge3sxMTJ9LHsgIDd9fSwge3sgIDh9LHsgIDd9fSwKK3t7IDcyfSx7ICA3fX0sIHt7IDQwfSx7ICA3fX0sIHt7MTA0fSx7ICA3fX0sIHt7IDI0fSx7ICA3fX0sIHt7IDg4fSx7ICA3fX0sCit7eyA1Nn0seyAgN319LCB7ezEyMH0seyAgN319LCB7eyAgNH0seyAgN319LCB7eyA2OH0seyAgN319LCB7eyAzNn0seyAgN319LAore3sxMDB9LHsgIDd9fSwge3sgMjB9LHsgIDd9fSwge3sgODR9LHsgIDd9fSwge3sgNTJ9LHsgIDd9fSwge3sxMTZ9LHsgIDd9fSwKK3t7ICAzfSx7ICA4fX0sIHt7MTMxfSx7ICA4fX0sIHt7IDY3fSx7ICA4fX0sIHt7MTk1fSx7ICA4fX0sIHt7IDM1fSx7ICA4fX0sCit7ezE2M30seyAgOH19LCB7eyA5OX0seyAgOH19LCB7ezIyN30seyAgOH19Cit9OworCitsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHsKK3t7IDB9LHsgNX19LCB7ezE2fSx7IDV9fSwge3sgOH0seyA1fX0sIHt7MjR9LHsgNX19LCB7eyA0fSx7IDV9fSwKK3t7MjB9LHsgNX19LCB7ezEyfSx7IDV9fSwge3syOH0seyA1fX0sIHt7IDJ9LHsgNX19LCB7ezE4fSx7IDV9fSwKK3t7MTB9LHsgNX19LCB7ezI2fSx7IDV9fSwge3sgNn0seyA1fX0sIHt7MjJ9LHsgNX19LCB7ezE0fSx7IDV9fSwKK3t7MzB9LHsgNX19LCB7eyAxfSx7IDV9fSwge3sxN30seyA1fX0sIHt7IDl9LHsgNX19LCB7ezI1fSx7IDV9fSwKK3t7IDV9LHsgNX19LCB7ezIxfSx7IDV9fSwge3sxM30seyA1fX0sIHt7Mjl9LHsgNX19LCB7eyAzfSx7IDV9fSwKK3t7MTl9LHsgNX19LCB7ezExfSx7IDV9fSwge3syN30seyA1fX0sIHt7IDd9LHsgNX19LCB7ezIzfSx7IDV9fQorfTsKKworY29uc3QgdWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7CisgMCwgIDEsICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCisgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsCisxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgIDAsICAwLCAxNiwgMTcsCisxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCisyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5Cit9OworCitjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHsKKyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKzEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKzE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwKKzE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKzIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwKKzIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywKKzIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKKzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI4Cit9OworCitsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHsKKzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsIDQ4LCA1NiwKKzY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAwCit9OworCitsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0geworICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNiwgICAgIDgsICAgIDEyLCAgICAxNiwgICAgMjQsCisgICAzMiwgICAgNDgsICAgIDY0LCAgICA5NiwgICAxMjgsICAgMTkyLCAgIDI1NiwgICAzODQsICAgNTEyLCAgIDc2OCwKKyAxMDI0LCAgMTUzNiwgIDIwNDgsICAzMDcyLCAgNDA5NiwgIDYxNDQsICA4MTkyLCAxMjI4OCwgMTYzODQsIDI0NTc2Cit9OworCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi91bmNvbXByLmMgYi9jb21tb24vemxpYi91bmNvbXByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNGE2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3VuY29tcHIuYwpAQCAtMCwwICsxLDU4IEBACisvKiB1bmNvbXByLmMgLS0gZGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIEAoIykgJElkOiB1bmNvbXByLmMsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyNiBjb25zdF9rIEV4cCAkICovCisKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCisgICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKKyAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCisgICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KKyovCitpbnQgWkVYUE9SVCB1bmNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKKyAgICBCeXRlZiAqZGVzdDsKKyAgICB1TG9uZ2YgKmRlc3RMZW47CisgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCBlcnI7CisKKyAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOworICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICByZXR1cm4gZXJyID09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvemNvbmYuaCBiL2NvbW1vbi96bGliL3pjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkNmNlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3pjb25mLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBAKCMpICRJZDogemNvbmYuaCx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjI2IGNvbnN0X2sgRXhwICQgKi8KKworI2lmbmRlZiBfWkNPTkZfSAorI2RlZmluZSBfWkNPTkZfSAorCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKi8KKyNpZmRlZiBaX1BSRUZJWAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Xwl6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGUJel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZAl6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gCXpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZQl6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kCXpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8Jel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVDb3B5CXpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQJel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zCXpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8Jel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVTeW5jCXpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50IHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVSZXNldAl6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGNvbXByZXNzCXpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIJel9jb21wcmVzczIKKyMgIGRlZmluZSB1bmNvbXByZXNzCXpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIJel9hZGxlcjMyCisjICBkZWZpbmUgY3JjMzIJCXpfY3JjMzIKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlIHpfZ2V0X2NyY190YWJsZQorCisjICBkZWZpbmUgQnl0ZQkJel9CeXRlCisjICBkZWZpbmUgdUludAkJel91SW50CisjICBkZWZpbmUgdUxvbmcJCXpfdUxvbmcKKyMgIGRlZmluZSBCeXRlZgkgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBjaGFyZgkJel9jaGFyZgorIyAgZGVmaW5lIGludGYJCXpfaW50ZgorIyAgZGVmaW5lIHVJbnRmCQl6X3VJbnRmCisjICBkZWZpbmUgdUxvbmdmCXpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHBmCXpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHAJCXpfdm9pZHAKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgZGVmaW5lIFdJTjMyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fMzg2X18pIHx8IGRlZmluZWQoaTM4NikKKyMgIGlmbmRlZiBfXzMyQklUX18KKyMgICAgZGVmaW5lIF9fMzJCSVRfXworIyAgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisKKy8qCisgKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQorICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgorICovCisjaWYgZGVmaW5lZChNU0RPUykgJiYgIWRlZmluZWQoX18zMkJJVF9fKQorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkgICYmICFkZWZpbmVkKFNUREMpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX09TMl9fKQorIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTVERDCisjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCisjICAgIGRlZmluZSBjb25zdAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXykgfHwgZGVmaW5lZChhcHBsZWMpIHx8ZGVmaW5lZChUSElOS19DKSB8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBPbGQgQm9ybGFuZCBDIGluY29ycmVjdGx5IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHJldHVybnM6ICovCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPCAweDUwMCkKKyMgIGRlZmluZSBORUVEX0RVTU1ZX1JFVFVSTgorI2VuZGlmCisKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZiAoZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pKSAmJiAhZGVmaW5lZChfXzMyQklUX18pCisgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICBkZWZpbmUgU01BTExfTUVESVVNCisjICBpZmRlZiBfTVNDX1ZFUgorIyAgICBkZWZpbmUgRkFSIF9mYXIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEZBUiBmYXIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQorIyAgaWZuZGVmIF9fMzJCSVRfXworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBDb21waWxlIHdpdGggLURaTElCX0RMTCBmb3IgV2luZG93cyBETEwgc3VwcG9ydCAqLworI2lmIGRlZmluZWQoWkxJQl9ETEwpCisjICBpZiBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKFdJTkRPV1MpCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjICAgIGRlZmluZSBaRVhQT1JUICBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBICBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBICBGQVIgX2NkZWNsIF9leHBvcnQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICAgIGlmIChfX0JPUkxBTkRDX18gPj0gMHgwNTAwKSAmJiBkZWZpbmVkIChXSU4zMikKKyMgICAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjICAgICAgZGVmaW5lIFpFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpIFdJTkFQSQorIyAgICAgIGRlZmluZSBaRVhQT1JUUlZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBpZiBkZWZpbmVkIChfV2luZG93cykgJiYgZGVmaW5lZCAoX19ETExfXykKKyMgICAgICAgIGRlZmluZSBaRVhQT1JUIF9leHBvcnQKKyMgICAgICAgIGRlZmluZSBaRVhQT1JUVkEgX2V4cG9ydAorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmIGRlZmluZWQgKFpMSUJfRExMKQorIyAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICBlbHNlCisjICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisjaWZuZGVmIFpFWFRFUk4KKyMgIGRlZmluZSBaRVhURVJOIGV4dGVybgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChNQUNPUykgJiYgIWRlZmluZWQoVEFSR0VUX09TX01BQykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIEZBUiAqdm9pZHBmOworICAgdHlwZWRlZiB2b2lkICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIEZBUiAqdm9pZHBmOworICAgdHlwZWRlZiBCeXRlICAgICAqdm9pZHA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgZGVmaW5lIHpfb2ZmX3QgIG9mZl90CisjZW5kaWYKKyNpZm5kZWYgU0VFS19TRVQKKyMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCisjZW5kaWYKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lICB6X29mZl90IGxvbmcKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2NrcywiSU5CTCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2Nrc19uZXcsIklOQkxORSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Jsb2Nrc19mcmVlLCJJTkJMRlIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3NfcmVzZXQsIklOQkxSRSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvZGVzX2ZyZWUsIklOQ09GUiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvZGVzLCJJTkNPIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2ZsdXNoLCJJTkZMVSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX21hc2ssIklOTUEiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9zZXRfZGljdGlvbmFyeSwiSU5TRURJMiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdHJlZXNfYml0cywiSU5UUkJJIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdHJlZXNfZHluYW1pYywiSU5UUkRZIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdHJlZXNfZml4ZWQsIklOVFJGSSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2ZyZWUsIklOVFJGUiIpCisjZW5kaWYKKworI2VuZGlmIC8qIF9aQ09ORl9IICovCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96bGliLjMgYi9jb21tb24vemxpYi96bGliLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3psaWIuMwpAQCAtMCwwICsxLDEwNyBAQAorLlRIIFpMSUIgMyAiMTEgTWFyY2ggMjAwMiIKKy5TSCBOQU1FCit6bGliIFwtIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gbGlicmFyeQorLlNIIFNZTk9QU0lTCitbc2VlCisuSSB6bGliLmgKK2ZvciBmdWxsIGRlc2NyaXB0aW9uXQorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5JIHpsaWIKK2xpYnJhcnkgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorVGhlIGNvZGUgaXMgdGhyZWFkIHNhZmUuCitJdCBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLAoraW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCisuTFAKK0NvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaAorKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksCitvciBjYW4gYmUgZG9uZSBieSByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uCitJbiB0aGUgbGF0dGVyIGNhc2UsCit0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KKy5MUAorVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluCisuSSBnemlwCisoLmd6KSBmb3JtYXQKK3dpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KKy5MUAorVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcwordGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKy5MUAorQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZQorLklSIHpsaWIuaC4KK1RoZSBkaXN0cmlidXRpb24gc291cmNlIGluY2x1ZGVzIGV4YW1wbGVzIG9mIHVzZSBvZiB0aGUgbGlicmFyeQordGhlIGZpbGVzCisuSSBleGFtcGxlLmMKK2FuZAorLklSIG1pbmlnemlwLmMgLgorLkxQCitBIEphdmEgaW1wbGVtZW50YXRpb24gb2YKKy5JUiB6bGliCitpcyBhdmFpbGFibGUgaW4gdGhlIEphdmEgRGV2ZWxvcG1lbnQgS2l0IDEuMQorLklQCitodHRwOi8vd3d3LmphdmFzb2Z0LmNvbS9wcm9kdWN0cy9KREsvMS4xL2RvY3MvYXBpL1BhY2thZ2UtamF2YS51dGlsLnppcC5odG1sCisuTFAKK0EgUGVybCBpbnRlcmZhY2UgdG8KKy5JUiB6bGliICwKK3dyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyAocG1hcnF1ZXNzQGJmc2VjLmJ0LmNvLnVrKQoraXMgYXZhaWxhYmxlIGF0IENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzLAorc3VjaCBhczoKKy5JUAorZnRwOi8vZnRwLmNpcy51ZmwuZWR1L3B1Yi9wZXJsL0NQQU4vbW9kdWxlcy9ieS1tb2R1bGUvQ29tcHJlc3MvQ29tcHJlc3MtWmxpYioKKy5MUAorQSBQeXRob24gaW50ZXJmYWNlIHRvCisuSVIgemxpYgord3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIDxhbWtAbWFnbmV0LmNvbT4KK2lzIGF2YWlsYWJsZSBmcm9tIHRoZSBQeXRob24gU29mdHdhcmUgQXNzb2NpYXRpb24gc2l0ZXMsIHN1Y2ggYXM6CisuSVAKK2Z0cDovL2Z0cC5weXRob24ub3JnL3B1Yi9weXRob24vY29udHJpYi9FbmNvZGluZy96bGliKi50YXIuZ3oKKy5TSCAiU0VFIEFMU08iCitRdWVzdGlvbnMgYWJvdXQgemxpYiBzaG91bGQgYmUgc2VudCB0bzoKKy5JUAoremxpYkBxdWVzdC5qcGwubmFzYS5nb3YKK29yLCBpZiB0aGlzIGZhaWxzLCB0byB0aGUgYXV0aG9yIGFkZHJlc3NlcyBnaXZlbiBiZWxvdy4KK1RoZSB6bGliIGhvbWUgcGFnZSBpczoKKy5JUAoraHR0cDovL3d3dy5jZHJvbS5jb20vcHViL2luZm96aXAvemxpYi8KKy5MUAorVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXM6IAorLklQCitmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0ICh6bGliIGZvcm1hdCkKKy5icgorcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KQorLmJyCityZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpCisuTFAKK1RoZXNlIGRvY3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gb3RoZXIgZm9ybWF0cyBmcm9tOgorLklQCitmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWwKKy5TSCBBVVRIT1JTCitWZXJzaW9uIDEuMS40CitDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IChqbG91cEBnemlwLm9yZykKK2FuZCBNYXJrIEFkbGVyIChtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1KS4KKy5MUAorVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMtaXMsIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKK2FyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCitTZWUgdGhlIGRpc3RyaWJ1dGlvbiBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHJlcXVpcmVtZW50cworZ292ZXJuaW5nIHJlZGlzdHJpYnV0aW9uLgorVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkKKy5JIHpsaWIKK3dhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4KK1RoZSBkZWZsYXRlIGFuZAorLkkgemxpYgorc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuIFBldGVyIERldXRzY2guCitUaGFua3MgdG8gYWxsIHRoZSBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cworaW1wcm92ZW1lbnRzIGluCisuSVIgemxpYiA7Cit3aG8gYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCisuTFAKK1VOSVggbWFudWFsIHBhZ2UgYnkgUi4gUC4gQy4gUm9kZ2VycywKK1UuUy4gTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZSAocm9kZ2Vyc0BubG0ubmloLmdvdikuCisuXCIgZW5kIG9mIG1hbiBwYWdlCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96bGliLmRzcCBiL2NvbW1vbi96bGliL3psaWIuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTU4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi96bGliLmRzcApAQCAtMCwwICsxLDIxNyBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ6bGliIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPXpsaWIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJ6bGliLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJ6bGliLm1hayIgQ0ZHPSJ6bGliIC0gV2luMzIgRGVidWcgVW5pY29kZSINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiemxpYiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJ6bGliIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJ6bGliIC0gV2luMzIgRGVidWcgVW5pY29kZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cUmVsZWFzZVx6bGliIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzEgL0QgIk5ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbw0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxEZWJ1Z1x6bGliIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28NCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIERlYnVnIFVuaWNvZGUiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiemxpYl9fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiemxpYl9fX1dpbjMyX0RlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXERlYnVnX1VuaWNvZGUiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnX1VuaWNvZGVcemxpYiINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJfREVCVUciIC9EICJfTElCIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIl9MSUIiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9VTklDT0RFIiAvRCAiVU5JQ09ERSIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJ6bGliIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgInpsaWIgLSBXaW4zMiBEZWJ1ZyINCisjIE5hbWUgInpsaWIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGFkbGVyMzIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGNvbXByZXNzLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxjcmMzMi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGVmbGF0ZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZ3ppby5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mYmxvY2suYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZmNvZGVzLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZmYXN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZsYXRlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZ0cmVlcy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mdXRpbC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdHJlZXMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHVuY29tcHIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHp1dGlsLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGVmbGF0ZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mYmxvY2suaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZmNvZGVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZmYXN0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbmZmaXhlZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW5mdHJlZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGluZnV0aWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHRyZWVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx6Y29uZi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cemxpYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cenV0aWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvemxpYi5oIGIvY29tbW9uL3psaWIvemxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyY2I1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi96bGliLmgKQEAgLTAsMCArMSw4OTMgQEAKKy8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICB2ZXJzaW9uIDEuMS40LCBNYXJjaCAxMXRoLCAyMDAyCisKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworCisgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQKKyAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KKyovCisKKyNpZm5kZWYgX1pMSUJfSAorI2RlZmluZSBfWkxJQl9ICisKKyNpbmNsdWRlICJ6Y29uZi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjEuNCIKKworLyogCisgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCisgIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCisgIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQorICBzdHJlYW0gaW50ZXJmYWNlLgorCisgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCisgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKKyAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorCisgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCisKKyAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcworICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCisgIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisqLworCit0eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzKSk7CisKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7CisgICAgQnl0ZWYgICAgKm5leHRfaW47ICAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9pbjsgIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dF9pbiAqLworICAgIHVMb25nICAgIHRvdGFsX2luOyAgLyogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKworICAgIEJ5dGVmICAgICpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCisgICAgdUludCAgICAgYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLworICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworCisgICAgY2hhciAgICAgKm1zZzsgICAgICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICpzdGF0ZTsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCisKKyAgICBhbGxvY19mdW5jIHphbGxvYzsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlICovCisgICAgZnJlZV9mdW5jICB6ZnJlZTsgICAvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICovCisgICAgdm9pZHBmICAgICBvcGFxdWU7ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byB6YWxsb2MgYW5kIHpmcmVlICovCisKKyAgICBpbnQgICAgIGRhdGFfdHlwZTsgIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYXNjaWkgb3IgYmluYXJ5ICovCisgICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gel9zdHJlYW07CisKK3R5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7CisKKy8qCisgICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMKKyAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dAorICAgaGFzIGRyb3BwZWQgdG8gemVyby4gVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSB6YWxsb2MsIHpmcmVlIGFuZAorICAgb3BhcXVlIGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlCisgICBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisgICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCisgICBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKKyAgIG9wYXF1ZSB2YWx1ZS4KKworICAgemFsbG9jIG11c3QgcmV0dXJuIFpfTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KKyAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUKKyAgIHRocmVhZCBzYWZlLgorCisgICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQorICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCisgICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKKyAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgorICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCisgICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKKyAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCisgICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCisKKyAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgorICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCisgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKKyAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KKyAgIGEgc2luZ2xlIHN0ZXApLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCisKKyNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKKyNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEgLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQgKi8KKyNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKKyNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKKyNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKKyNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKKyNkZWZpbmUgWl9ORUVEX0RJQ1QgICAgIDIKKyNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQorI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCisjZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKKyNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQorI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCisjZGVmaW5lIFpfVkVSU0lPTl9FUlJPUiAoLTYpCisvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUKKyAqIHZhbHVlcyBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCisgKi8KKworI2RlZmluZSBaX05PX0NPTVBSRVNTSU9OICAgICAgICAgMAorI2RlZmluZSBaX0JFU1RfU1BFRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQorI2RlZmluZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworCisjZGVmaW5lIFpfRklMVEVSRUQgICAgICAgICAgICAxCisjZGVmaW5lIFpfSFVGRk1BTl9PTkxZICAgICAgICAyCisjZGVmaW5lIFpfREVGQVVMVF9TVFJBVEVHWSAgICAwCisvKiBjb21wcmVzc2lvbiBzdHJhdGVneTsgc2VlIGRlZmxhdGVJbml0MigpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9CSU5BUlkgICAwCisjZGVmaW5lIFpfQVNDSUkgICAgMQorI2RlZmluZSBaX1VOS05PV04gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICovCisKKyNkZWZpbmUgWl9ERUZMQVRFRCAgIDgKKy8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCisKKyNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLworCisjZGVmaW5lIHpsaWJfdmVyc2lvbiB6bGliVmVyc2lvbigpCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDwgMS4wLjIgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24gT0YoKHZvaWQpKTsKKy8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCisgICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCisgKi8KKworLyogCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsKSk7CisKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorICAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgZGVmbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCisgICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIG9yIGJldHdlZW4gMCBhbmQgOToKKyAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0CisgICBhbGwgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLgorICAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIHJlcXVlc3RzIGEgZGVmYXVsdCBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kCisgICBjb21wcmVzc2lvbiAoY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCisKKyAgICAgZGVmbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAorICAgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoemxpYl92ZXJzaW9uKSBpcyBpbmNvbXBhdGlibGUKKyAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgorICAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdCBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGRlZmxhdGUgY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2Ugc29tZQorICBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBkZWZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKKyAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gYW5kIGF2YWlsX2luIGFyZSB1cGRhdGVkIGFuZAorICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KKyAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgorICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4KKyAgICBTb21lIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IGFjY29yZGluZ2x5OyBhdmFpbF9vdXQKKyAgc2hvdWxkIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlCisgIGNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbAorICAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgZGVmbGF0ZSgpLiBJZiBkZWZsYXRlIHJldHVybnMgWl9PSworICBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKKyAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KKyAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKKyAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCisgIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgorICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKKyAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KKyAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKKyAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICB0aGUgY29tcHJlc3Npb24uCisKKyAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgYXZhaWxfb3V0KS4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCisgIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCisgIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gQWZ0ZXIKKyAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQorICBzdHJlYW0gYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgorICAKKyAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCisgIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gSW4gdGhpcyBjYXNlLCBhdmFpbF9vdXQgbXVzdCBiZSBhdCBsZWFzdAorICAwLjElIGxhcmdlciB0aGFuIGF2YWlsX2luIHBsdXMgMTIgYnl0ZXMuICBJZiBkZWZsYXRlIGRvZXMgbm90IHJldHVybgorICBaX1NUUkVBTV9FTkQsIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKKyAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCisKKyAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBkYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0CisgIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQVNDSUkgb3IgWl9CSU5BUlkpLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAorICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAorICB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCisKKyAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAorICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCisgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCisgIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKKyAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBkZWZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKKyAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCisgICBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQorICAgZGVhbGxvY2F0ZWQpLgorKi8KKworCisvKiAKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4gSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAorICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKKyAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKKyAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvcgorICAgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKKyAgIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQKKyAgIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0IG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCisgIGludHJvZHVjZSBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpCisgIGV4Y2VwdCB3aGVuIGZvcmNlZCB0byBmbHVzaC4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCisgICAgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZQorICAgIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cKKyAgICBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgaW5mbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgorICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCisgIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2gKKyAgY2FsbCBvZiBpbmZsYXRlKCkuIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdAorICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCisgIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGluZmxhdGUgZmx1c2hlcyBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIGluZmxhdGUgaXMKKyAgbm90IHNwZWNpZmllZCBmb3IgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiBaX1NZTkNfRkxVU0gKKyAgYW5kIFpfRklOSVNILCBidXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgZmx1c2hlcyBhcyBtdWNoIG91dHB1dAorICBhcyBwb3NzaWJsZSBhbnl3YXkuCisKKyAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgorICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAorICAoYSBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCisgIFpfRklOSVNILiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZworICBvdXRwdXQgaXMgZmx1c2hlZDsgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCisgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAorICBiZSBpbmZsYXRlRW5kIHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gc3RhdGUuIFRoZSB1c2Ugb2YgWl9GSU5JU0gKKyAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIHJvdXRpbmUKKyAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpIGNhbGwuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tYWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlCisgIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgCisgIGl0IHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZAorICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yCisgIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKQorICBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMiBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZQorICBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORCBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgorCisgICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCisgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKKyAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQorICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcworICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0CisgIGFkbGVyMzIgY2hlY2tzdW0pLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50CisgIChmb3IgZXhhbXBsZSBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90CisgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gSW4gdGhlIFpfREFUQV9FUlJPUgorICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4gY2FsbCBpbmZsYXRlU3luYyB0byBsb29rIGZvciBhIGdvb2QKKyAgY29tcHJlc3Npb24gYmxvY2suCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKKyAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgorKi8KKworLyogICAKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCisgICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLgorCisgICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQorICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCisgICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKKyAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKKyAgIGRlZmxhdGVJbml0IGlzIHVzZWQgaW5zdGVhZC4KKworICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAorICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gbWVtTGV2ZWw9MSB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dAorICAgaXMgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5CisgICBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeQorICAgdXNhZ2UgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KKworICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCisgICB2YWx1ZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIG5vcm1hbCBkYXRhLCBaX0ZJTFRFUkVEIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKKyAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgb3IgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubworICAgc3RyaW5nIG1hdGNoKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEKKyAgIHNvbWV3aGF0IHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcworICAgdHVuZWQgdG8gY29tcHJlc3MgdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlCisgICBIdWZmbWFuIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZQorICAgYmV0d2VlbiBaX0RFRkFVTFQgYW5kIFpfSFVGRk1BTl9PTkxZLiBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cworICAgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuCisgICBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCisKKyAgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCisgICBtZXRob2QpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0MiBkb2VzCisgICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOworLyoKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQorICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yIGRlZmxhdGVSZXNldCwgYmVmb3JlIGFueQorICAgY2FsbCBvZiBkZWZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIGRpY3Rpb25hcnkgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeSkuCisKKyAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQorICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQorICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQorICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQorICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgorICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgorCisgICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CisgICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCisgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZSBpbgorICAgZGVmbGF0ZSBvciBkZWZsYXRlMi4gVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgc2hvdWxkIGJlCisgICBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4KKworICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLT5hZGxlciBpcyBzZXQgdG8gdGhlIEFkbGVyMzIgdmFsdWUKKyAgIG9mIHRoZSBkaWN0aW9uYXJ5OyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKKyAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBBZGxlcjMyIHZhbHVlCisgICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcworICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pCisKKyAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQorICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCisgICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAorICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCisgICBieSBjYWxsaW5nIGRlZmxhdGVFbmQuICBOb3RlIHRoYXQgZGVmbGF0ZUNvcHkgZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKKyAgIGNvbXByZXNzaW9uIHN0YXRlIHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZAorICAgY2FuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuCisKKyAgICAgZGVmbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBkZWZsYXRlRW5kIGZvbGxvd2VkIGJ5IGRlZmxhdGVJbml0LAorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KKyAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcworICAgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCisKKyAgICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zIE9GKCh6X3N0cmVhbXAgc3RybSwKKwkJCQkgICAgICBpbnQgbGV2ZWwsCisJCQkJICAgICAgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQorICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCisgICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQKKyAgIHN0cmF0ZWd5LiBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIKKyAgIGlzIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwKKyAgIHRha2UgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bworICAgYmUgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gSW4gcGFydGljdWxhciwgc3RybS0+YXZhaWxfb3V0IG11c3QgYmUgbm9uLXplcm8uCisKKyAgICAgZGVmbGF0ZVBhcmFtcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIFpfQlVGX0VSUk9SCisgICBpZiBzdHJtLT5hdmFpbF9vdXQgd2FzIHplcm8uCisqLworCisvKiAgIAorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cykpOworCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdworICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKKyAgIGluc3RlYWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cgc2l6ZSBpcyBnaXZlbiBhcworICAgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mCisgICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgorCisgICAgICBpbmZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBuZWdhdGl2ZQorICAgbWVtTGV2ZWwpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0MgorICAgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmCisgICBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUKKyAgIG1vZGlmaWVkLCBidXQgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW5jaGFuZ2VkLikKKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCisgICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZQorICAgaWYgdGhpcyBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKKyAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsIG9mCisgICBpbmZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIGRpY3Rpb25hcnkgKHNlZSBkZWZsYXRlU2V0RGljdGlvbmFyeSkuCisKKyAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKKyAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IEFkbGVyMzIgdmFsdWUpLiBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgorICAgaW5mbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU3luYyBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qIAorICAgIFNraXBzIGludmFsaWQgY29tcHJlc3NlZCBkYXRhIHVudGlsIGEgZnVsbCBmbHVzaCBwb2ludCAoc2VlIGFib3ZlIHRoZQorICBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAorICBhdmFpbGFibGUgaW5wdXQgaXMgc2tpcHBlZC4gTm8gb3V0cHV0IGlzIHByb3ZpZGVkLgorCisgICAgaW5mbGF0ZVN5bmMgcmV0dXJucyBaX09LIGlmIGEgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwgWl9CVUZfRVJST1IKKyAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwKKyAgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIHN1Y2Nlc3MKKyAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YgdG90YWxfaW4gd2hpY2gKKyAgaW5kaWNhdGVzIHdoZXJlIHZhbGlkIGNvbXByZXNzZWQgZGF0YSB3YXMgZm91bmQuIEluIHRoZSBlcnJvciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbWF5IHJlcGVhdGVkbHkgY2FsbCBpbmZsYXRlU3luYywgcHJvdmlkaW5nIG1vcmUgaW5wdXQgZWFjaCB0aW1lLAorICB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuCisgICBUaGUgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgaW5mbGF0ZUluaXQyLgorCisgICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBOVUxMKS4KKyovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuCisgICBzb3VyY2VMZW4gcGx1cyAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKKyAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIHVuY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCisgICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKKyAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCisgICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KKyovCisKKwordHlwZWRlZiB2b2lkcCBnekZpbGU7CisKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuICBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOworLyoKKyAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCisgICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsCisgICAoIndiOSIpIG9yIGEgc3RyYXRlZ3k6ICdmJyBmb3IgZmlsdGVyZWQgZGF0YSBhcyBpbiAid2I2ZiIsICdoJyBmb3IKKyAgIEh1ZmZtYW4gb25seSBjb21wcmVzc2lvbiBhcyBpbiAid2IxaCIuIChTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCisKKyAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcworICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLgorCisgICAgIGd6b3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBvciBpZiB0aGVyZSB3YXMKKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZTsgZXJybm8KKyAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQorICAgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuICAqLworCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gIE9GKChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpKTsKKy8qCisgICAgIGd6ZG9wZW4oKSBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUKKyAgIGRlc2NyaXB0b3JzIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvcgorICAgZmlsZW5vIChpbiB0aGUgZmlsZSBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4KKyAgIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiBnem9wZW4uCisgICAgIFRoZSBuZXh0IGNhbGwgb2YgZ3pjbG9zZSBvbiB0aGUgcmV0dXJuZWQgZ3pGaWxlIHdpbGwgYWxzbyBjbG9zZSB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBmZCwganVzdCBsaWtlIGZjbG9zZShmZG9wZW4oZmQpLCBtb2RlKSBjbG9zZXMgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgZmQuIElmIHlvdSB3YW50IHRvIGtlZXAgZmQgb3BlbiwgdXNlIGd6ZG9wZW4oZHVwKGZkKSwgbW9kZSkuCisgICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlCisgICB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenNldHBhcmFtcyBPRigoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisgICAgIGd6c2V0cGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgZmlsZSB3YXMgbm90CisgICBvcGVuZWQgZm9yIHdyaXRpbmcuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6cmVhZCAgT0YoKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgZ3pyZWFkIGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCisgICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgICAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCisgICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4gKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnendyaXRlIE9GKChnekZpbGUgZmlsZSwgCisJCQkJICAgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUVkEgICBnenByaW50ZiBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7CisvKgorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dHMgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKSk7CisvKgorICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorICAgICAgZ3pwdXRzIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGNoYXIgKiBaRVhQT1JUIGd6Z2V0cyBPRigoZ3pGaWxlIGZpbGUsIGNoYXIgKmJ1ZiwgaW50IGxlbikpOworLyoKKyAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgorICAgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCisgICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZCB3aXRoIGEgbnVsbAorICAgY2hhcmFjdGVyLgorICAgICAgZ3pnZXRzIHJldHVybnMgYnVmLCBvciBaX05VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pwdXRjIE9GKChnekZpbGUgZmlsZSwgaW50IGMpKTsKKy8qCisgICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6cHV0YyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemdldGMgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKKyAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Zmx1c2ggT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgorICAgZmx1c2ggaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuIGd6Zmx1c2ggcmV0dXJucyBaX09LIGlmCisgICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIFpfRklOSVNIIGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCisgICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgY2FuCisgICBkZWdyYWRlIGNvbXByZXNzaW9uLgorKi8KKworWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3pzZWVrIE9GKChnekZpbGUgZmlsZSwKKwkJCQkgICAgICB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkpOworLyogCisgICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKKyAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQorICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKKyAgIHN0YXJ0aW5nIHBvc2l0aW9uLgorCisgICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgorICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KKyAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZXdpbmQgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXdpbmRzIHRoZSBnaXZlbiBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciByZWFkaW5nLgorCisgICBnenJld2luZChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIChpbnQpZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkKKyovCisKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUICAgIGd6dGVsbCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorCisgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCisgICBpbnB1dCBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemNsb3NlIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQorICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4KKyovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7CisvKgorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KKyAgIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAorICAgZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KKyAgIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKKyAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKKyAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KKyAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKKyAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMiAgIE9GKCh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIGNyYyB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQKKyAgIGNyYy4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZQorICAgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcyBwZXJmb3JtZWQKKyAgIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBjcmMgPSBjcmMzMihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFyaW91cyBoYWNrcywgZG9uJ3QgbG9vayA6KSAqLworCisvKiBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG1hY3JvcyB0byBhbGxvdyBjaGVja2luZyB0aGUgemxpYiB2ZXJzaW9uCisgKiBhbmQgdGhlIGNvbXBpbGVyJ3MgdmlldyBvZiB6X3N0cmVhbToKKyAqLworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIGxldmVsLCBpbnQgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsIGludCBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LCBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CisjZGVmaW5lIGRlZmxhdGVJbml0KHN0cm0sIGxldmVsKSBcCisgICAgICAgIGRlZmxhdGVJbml0Xygoc3RybSksIChsZXZlbCksICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAorICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIFwKKyAgICAgICAgZGVmbGF0ZUluaXQyXygoc3RybSksKGxldmVsKSwobWV0aG9kKSwod2luZG93Qml0cyksKG1lbUxldmVsKSxcCisgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5KSwgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKKyAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisKKyNpZiAhZGVmaW5lZChfWl9VVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCisgICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisjZW5kaWYKKworWkVYVEVSTiBjb25zdCBjaGFyICAgKiBaRVhQT1JUIHpFcnJvciAgICAgICAgICAgT0YoKGludCBlcnIpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50IE9GKCh6X3N0cmVhbXAgeikpOworWkVYVEVSTiBjb25zdCB1TG9uZ2YgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9aTElCX0ggKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL3psaWIuaHRtbCBiL2NvbW1vbi96bGliL3psaWIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQzNzAzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL3psaWIvemxpYi5odG1sCkBAIC0wLDAgKzEsOTcxIEBACis8aHRtbD4KKzxoZWFkPgorIDx0aXRsZT4KKyB6bGliIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHZlcnNpb24gMS4xLjQKKyA8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0iV2hpdGUiIHRleHQ9IkJsYWNrIiB2bGluaz0iUmVkIiBhbGluaz0iTmF2eSIgbGluaz0iUmVkIj4KKzwhLS0gYmFja2dyb3VuZD0iemxpYmJnLmdpZiIgLS0+CisKKzxoMT4gemxpYiAxLjEuNCBNYW51YWwgPC9oMT4KKzxocj4KKzxhIG5hbWU9IkNvbnRlbnRzIj48aDI+Q29udGVudHM8L2gyPgorPG9sIHR5cGU9IkkiPgorPGxpPiA8YSBocmVmPSIjUHJvbG9ndWUiPlByb2xvZ3VlPC9hPgorPGxpPiA8YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+Cis8bGk+IDxhIGhyZWY9IiNVdGlsaXR5IGZ1bmN0aW9ucyI+VXRpbGl0eSBmdW5jdGlvbnM8L2E+Cis8bGk+IDxhIGhyZWY9IiNCYXNpYyBmdW5jdGlvbnMiPkJhc2ljIGZ1bmN0aW9uczwvYT4KKzxsaT4gPGEgaHJlZj0iI0FkdmFuY2VkIGZ1bmN0aW9ucyI+QWR2YW5jZWQgZnVuY3Rpb25zPC9hPgorPGxpPiA8YSBocmVmPSIjQ29uc3RhbnRzIj5Db25zdGFudHM8L2E+Cis8bGk+IDxhIGhyZWY9IiNzdHJ1Y3Qgel9zdHJlYW1fcyI+c3RydWN0IHpfc3RyZWFtX3M8L2E+Cis8bGk+IDxhIGhyZWY9IiNDaGVja3N1bSBmdW5jdGlvbnMiPkNoZWNrc3VtIGZ1bmN0aW9uczwvYT4KKzxsaT4gPGEgaHJlZj0iI01pc2MiPk1pc2M8L2E+Cis8L29sPgorPGhyPgorPGEgbmFtZT0iUHJvbG9ndWUiPjxoMj4gUHJvbG9ndWUgPC9oMj4KKyAgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHZlcnNpb24gMS4xLjQsIE1hcmNoIDExdGgsIDIwMDIKKyAgPHA+CisgIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKyAgPHA+CisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAgPHA+CisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAgPG9sPgorICAgPGxpPiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgICA8bGk+IEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgIDxsaT4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAgPC9vbD4KKworICA8ZGw+CisgIDxkdD5KZWFuLWxvdXAgR2FpbGx5ICAgICAgICAKKyAgPGRkPjxhIGhyZWY9Im1haWx0bzpqbG91cEBnemlwLm9yZyI+amxvdXBAZ3ppcC5vcmc8L2E+CisgIDxkdD5NYXJrIEFkbGVyCisgIDxkZD48YSBocmVmPSJtYWlsdG86bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSI+bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdTwvYT4KKyAgPC9kbD4KKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcworICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0Ij4KKyAgZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dCA8L2E+CisgICh6bGliIGZvcm1hdCksIAorICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0Ij4KKyAgcmZjMTk1MS50eHQgPC9hPgorICAoPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGZvcm1hdCkgYW5kIAorICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTIudHh0Ij4KKyAgcmZjMTk1Mi50eHQgPC9hPgorICAoZ3ppcCBmb3JtYXQpLgorICA8cD4KKyAgVGhpcyBtYW51YWwgaXMgY29udmVydGVkIGZyb20gemxpYi5oIGJ5IAorICA8YSBocmVmPSJtYWlsdG86cGlhaXBAY3NpZS5udHUuZWR1LnR3Ij4gcGlhaXAgPC9hPgorICA8cD4KKyAgVmlzaXQgPGEgaHJlZj0iaHR0cDovL2Z0cC5jZHJvbS5jb20vcHViL2luZm96aXAvemxpYi8iPgorICBodHRwOi8vZnRwLmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGliLzwvYT4gCisgIGZvciB0aGUgb2ZmaWNpYWwgemxpYiB3ZWIgcGFnZS4KKyAgPHA+CisKKzxocj4KKzxhIG5hbWU9IkludHJvZHVjdGlvbiI+PGgyPiBJbnRyb2R1Y3Rpb24gPC9oMj4KKyAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKKyAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCisgIHN0cmVhbSBpbnRlcmZhY2UuCisgIDxwPgorCisgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCisgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKKyAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorICA8cD4KKworICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgorICA8cD4KKworICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKKyAgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyAgPHA+CisKKzxocj4KKzxhIG5hbWU9IlV0aWxpdHkgZnVuY3Rpb25zIj48aDI+IFV0aWxpdHkgZnVuY3Rpb25zIDwvaDI+CisgICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKKyAgIDxhIGhyZWY9IiNCYXNpYyBmdW5jdGlvbnMiPmJhc2ljIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnM8L2E+LiAKKyAgIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKKyAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwKKyAgIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucykuIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZQorICAgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCis8aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KKzx1bD4KKzxsaT4gaW50ICA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOworPGxpPiBpbnQgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuLCBpbnQgbGV2ZWwpOworPGxpPiBpbnQgIDxhIGhyZWY9IiN1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOworPGxpPiB0eXBlZGVmIHZvaWRwIGd6RmlsZTsKKzxsaT4gIGd6RmlsZSAgPGEgaHJlZj0iI2d6b3BlbiI+Z3pvcGVuPC9hPiAgKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpOworPGxpPiBnekZpbGUgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPiAgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSk7Cis8bGk+IGludCAgPGEgaHJlZj0iI2d6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7Cis8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7Cis8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IChnekZpbGUgZmlsZSwgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOworPGxpPiBpbnQgVkEgICA8YSBocmVmPSIjZ3pwcmludGYiPmd6cHJpbnRmPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKzxsaT4gaW50ICA8YSBocmVmPSIjZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7Cis8bGk+IGNoYXIgKiAgPGEgaHJlZj0iI2d6Z2V0cyI+Z3pnZXRzPC9hPiAoZ3pGaWxlIGZpbGUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7Cis8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cHV0YyI+Z3pwdXRjPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBjKTsKKzxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pnZXRjIj5nemdldGM8L2E+IChnekZpbGUgZmlsZSk7Cis8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IChnekZpbGUgZmlsZSwgaW50IGZsdXNoKTsKKzxsaT4gel9vZmZfdCAgICAgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiAoZ3pGaWxlIGZpbGUsIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKzxsaT4gel9vZmZfdCAgICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOworPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnenJld2luZCI+Z3pyZXdpbmQ8L2E+IChnekZpbGUgZmlsZSk7Cis8bGk+IGludCAgPGEgaHJlZj0iI2d6ZW9mIj5nemVvZjwvYT4gKGd6RmlsZSBmaWxlKTsKKzxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gKGd6RmlsZSBmaWxlKTsKKzxsaT4gY29uc3QgY2hhciAqICA8YSBocmVmPSIjZ3plcnJvciI+Z3plcnJvcjwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSk7Cis8L3VsPgorPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgorPGRsPgorPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJjb21wcmVzcyI+Y29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7PC9mb250PgorPGRkPgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAorICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4KKyAgIHNvdXJjZUxlbiBwbHVzIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuPHA+CisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuPHA+CisgICAgIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLjxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImNvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7PC9mb250PgorPGRkPgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCisgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4uICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCisgICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCisgICA8cD4KKworICAgICA8YSBocmVmPSIjY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJ1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOzwvZm9udD4KKzxkZD4KKyAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAorICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQorICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQorICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCisgICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQorICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuIDxwPgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisgICA8cD4KKworICAgICA8YSBocmVmPSIjdW5jb21wcmVzcyI+dW5jb21wcmVzczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KKyAgIDxwPgorCis8ZHQ+IHR5cGVkZWYgdm9pZHAgZ3pGaWxlOworPGRkPiA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGd6RmlsZSAgPGEgbmFtZT0iZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7PC9mb250PgorPGRkPgorICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgbW9kZSBwYXJhbWV0ZXIKKyAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKKyAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgorICAgSHVmZm1hbiBvbmx5IGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24KKyAgIG9mIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCisgICA8cD4KKworICAgICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+IGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdCA7IGluIHRoaXMKKyAgIGNhc2UgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCisgICA8cD4KKworICAgICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+IHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcworICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IDsgZXJybm8KKyAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQorICAgemxpYiBlcnJvciBpcyA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPikuCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gZ3pGaWxlICA8YSBuYW1lPSJnemRvcGVuIj5nemRvcGVuPC9hPiAgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSk7PC9mb250PgorPGRkPgorICAgICA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oKSBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUKKyAgIGRlc2NyaXB0b3JzIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvcgorICAgZmlsZW5vIChpbiB0aGUgZmlsZSBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4KKyAgIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+LgorICAgPHA+CisgICAgIFRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2d6Y2xvc2UiPmd6Y2xvc2U8L2E+IG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQorICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQorICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+KGR1cChmZCksIG1vZGUpLgorICAgPHA+CisgICAgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKKyAgIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOzwvZm9udD4KKzxkZD4KKyAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvciBzdHJhdGVneS4gU2VlIHRoZSBkZXNjcmlwdGlvbgorICAgb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KKyAgIDxwPgorICAgICA8YSBocmVmPSIjZ3pzZXRwYXJhbXMiPmd6c2V0cGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgZmlsZSB3YXMgbm90CisgICBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenJlYWQiPmd6cmVhZDwvYT4gIChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KKzxkZD4KKyAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiBjb3BpZXMgdGhlIGdpdmVuIG51bWJlcgorICAgb2YgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorICAgPHA+CisgICAgIDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkICgwIGZvcgorICAgZW5kIG9mIGZpbGUsIC0xIGZvciBlcnJvcikuCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnendyaXRlIj5nendyaXRlPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgICAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgVkEgICA8YSBuYW1lPSJnenByaW50ZiI+Z3pwcmludGY8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOzwvZm9udD4KKzxkZD4KKyAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3MgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSB1bmRlcgorICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gPGEgaHJlZj0iI2d6cHJpbnRmIj5nenByaW50ZjwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6cHV0cyI+Z3pwdXRzPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnMpOzwvZm9udD4KKzxkZD4KKyAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKKyAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KKyAgIDxwPgorICAgICAgPGEgaHJlZj0iI2d6cHV0cyI+Z3pwdXRzPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorICAgICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNoYXIgKiAgPGEgbmFtZT0iZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKKyAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQorICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKKyAgIGNoYXJhY3Rlci4KKyAgIDxwPgorICAgICAgPGEgaHJlZj0iI2d6Z2V0cyI+Z3pnZXRzPC9hPiByZXR1cm5zIGJ1Ziwgb3IgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBpbiBjYXNlIG9mIGVycm9yLgorICAgICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pwdXRjIj5nenB1dGM8L2E+IChnekZpbGUgZmlsZSwgaW50IGMpOzwvZm9udD4KKzxkZD4KKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgPGEgaHJlZj0iI2d6cHV0YyI+Z3pwdXRjPC9hPiByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pnZXRjIj5nemdldGM8L2E+IChnekZpbGUgZmlsZSk7PC9mb250PgorPGRkPgorICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiA8YSBocmVmPSIjZ3pnZXRjIj5nemdldGM8L2E+IHJldHVybnMgdGhpcyBieXRlCisgICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOzwvZm9udD4KKzxkZD4KKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICBmbHVzaCBpcyBhcyBpbiB0aGUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgZnVuY3Rpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKKyAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiBiZWxvdykuIDxhIGhyZWY9IiNnemZsdXNoIj5nemZsdXNoPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZgorICAgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgorICAgPHA+CisgICAgIDxhIGhyZWY9IiNnemZsdXNoIj5nemZsdXNoPC9hPiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KKyAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gel9vZmZfdCAgICAgPGEgbmFtZT0iZ3pzZWVrIj5nenNlZWs8L2E+IChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOzwvZm9udD4KKzxkZD4KKyAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IG9yIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOworICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCisgICA8cD4KKyAgICAgSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIGVtdWxhdGVkIGJ1dCBjYW4gYmUKKyAgIGV4dHJlbWVseSBzbG93LiBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcsIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKKyAgIHN1cHBvcnRlZCA7IDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKKyAgIHN0YXJ0aW5nIHBvc2l0aW9uLgorICAgPHA+CisgICAgICA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvciwgaW4KKyAgIHBhcnRpY3VsYXIgaWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nIGFuZCB0aGUgbmV3IHN0YXJ0aW5nIHBvc2l0aW9uCisgICB3b3VsZCBiZSBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenJld2luZCI+Z3pyZXdpbmQ8L2E+IChnekZpbGUgZmlsZSk7PC9mb250PgorPGRkPgorICAgICBSZXdpbmRzIHRoZSBnaXZlbiBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciByZWFkaW5nLgorICAgICA8cD4KKyAgIDxhIGhyZWY9IiNnenJld2luZCI+Z3pyZXdpbmQ8L2E+KGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludCk8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+KGZpbGUsIDBMLCBTRUVLX1NFVCkKKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB6X29mZl90ICAgICA8YSBuYW1lPSJnenRlbGwiPmd6dGVsbDwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IG9yIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorICAgPHA+CisKKyAgIDxhIGhyZWY9IiNnenRlbGwiPmd6dGVsbDwvYT4oZmlsZSkgaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+KGZpbGUsIDBMLCBTRUVLX0NVUikKKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6ZW9mIj5nemVvZjwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCisgICBpbnB1dCBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICogIDxhIG5hbWU9Imd6ZXJyb3IiPmd6ZXJyb3I8L2E+IChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pOzwvZm9udD4KKzxkZD4KKyAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgIGVycm51bSBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRVJSTk8iPlpfRVJSTk88L2E+IGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KKyAgIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KKyAgIDxwPgorPC9kbD4KKzxocj4KKzxhIG5hbWU9IkJhc2ljIGZ1bmN0aW9ucyI+PGgyPiBCYXNpYyBmdW5jdGlvbnMgPC9oMj4KKzxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgorPHVsPgorPGxpPiAgY29uc3QgY2hhciAqICA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiAodm9pZCk7Cis8bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCk7Cis8bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOworPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Cis8bGk+ICBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOworPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTsKKzxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOworPC91bD4KKworPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgorPGRsPgorPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGNvbnN0IGNoYXIgKiAgPGEgbmFtZT0iemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiAodm9pZCk7PC9mb250PgorPGRkPiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgPGEgaHJlZj0iI3psaWJWZXJzaW9uIj56bGliVmVyc2lvbjwvYT4gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCisgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcworICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+LgorICAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwpOzwvZm9udD4KKzxkZD4KKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBmb3IgY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisgICBJZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhcmUgc2V0IHRvIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisgICA8cD4KKworICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSA8YSBocmVmPSIjWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+LCBvciBiZXR3ZWVuIDAgYW5kIDk6CisgICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAorICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KKyAgIDxwPgorCisgICA8YSBocmVmPSIjWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+IHJlcXVlc3RzIGEgZGVmYXVsdCBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kCisgICBjb21wcmVzc2lvbiAoY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCisgICA8cD4KKworICAgICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKKyAgIDxhIGhyZWY9IiNaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICg8YSBocmVmPSIjemxpYl92ZXJzaW9uIj56bGliX3ZlcnNpb248L2E+KSBpcyBpbmNvbXBhdGlibGUKKyAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgorICAgPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gZG9lcyBub3QKKyAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJkZWZsYXRlIj5kZWZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOzwvZm9udD4KKzxkZD4KKyAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2Ugc29tZQorICBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guPHA+CisKKyAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIDx1bD4KKyAgPGxpPiBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBhcmUgdXBkYXRlZCBhbmQKKyAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuCisKKyAgPGxpPiAKKyAgICBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4KKyAgICBhY2NvcmRpbmdseS4gVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCisgICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKKyAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCisgICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KKyAgPC91bD4gPHA+CisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG9yIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYWNjb3JkaW5nbHkgOyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+CisgIHNob3VsZCBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZQorICBjb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwKKyAgKDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4gSWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+CisgIGFuZCB3aXRoIHplcm8gPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorICA8cD4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4sIGFsbCBwZW5kaW5nIG91dHB1dCBpcworICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0IGlzIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBzbworICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhcgorICA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4gcHJvdmlkZWQKKyAgYmVmb3JlIHRoZSBjYWxsLikgIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lIGNvbXByZXNzaW9uCisgIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisgIDxwPgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIDxhIGhyZWY9IiNaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4sIGFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoCisgIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4sIGFuZCB0aGUgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbgorICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgorICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuIFVzaW5nIDxhIGhyZWY9IiNaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4gdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICB0aGUgY29tcHJlc3Npb24uCisgIDxwPgorCisgICAgSWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgd2l0aCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+ID09IDAsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWdhaW4KKyAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZAorICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlICg8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIG5vbi16ZXJvCisgIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pLgorICA8cD4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgd2l0aCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IGlmIHRoZXJlCisgIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlIDsgaWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgd2l0aCA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4sIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQorICBjYWxsZWQgYWdhaW4gd2l0aCA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPikgYnV0IG5vCisgIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IgYW4gZXJyb3IuIEFmdGVyCisgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBoYXMgcmV0dXJuZWQgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiwgdGhlIG9ubHkgcG9zc2libGUgb3BlcmF0aW9ucyBvbiB0aGUKKyAgc3RyZWFtIGFyZSA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPi4KKyAgPHA+CisgIAorICAgIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KKyAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSBhdCBsZWFzdAorICAwLjElIGxhcmdlciB0aGFuIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IHBsdXMgMTIgYnl0ZXMuICBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gZG9lcyBub3QgcmV0dXJuCisgIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4sIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgorICA8cD4KKworICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHNldHMgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAorICBzbyBmYXIgKHRoYXQgaXMsIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGJ5dGVzKS4KKyAgPHA+CisKKyAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBtYXkgdXBkYXRlIDxhIGhyZWY9IiNkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT4gaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0CisgIHRoZSBpbnB1dCBkYXRhIHR5cGUgKDxhIGhyZWY9IiNaX0FTQ0lJIj5aX0FTQ0lJPC9hPiBvciA8YSBocmVmPSIjWl9CSU5BUlkiPlpfQklOQVJZPC9hPikuIEluIGRvdWJ0LCB0aGUgZGF0YSBpcyBjb25zaWRlcmVkCisgIGJpbmFyeS4gVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyBhbmQgZG9lcyBub3QgYWZmZWN0CisgIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW4gYW55IG1hbm5lci4KKyAgPHA+CisKKyAgICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKKyAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiBhbGwgaW5wdXQgaGFzIGJlZW4KKyAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQgKG9ubHkgd2hlbiBmbHVzaCBpcyBzZXQgdG8KKyAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4pLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCisgIGlmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBvciA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiB3YXMgTlVMTCksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCisgIChmb3IgZXhhbXBsZSA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBvciA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IHdhcyB6ZXJvKS4KKyAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KKzxkZD4KKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorICAgPHA+CisKKyAgICAgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZQorICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKKyAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCisgICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKKyAgIGRlYWxsb2NhdGVkKS4KKyAgIDxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KKzxkZD4gICAgIAorCUluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLiBJZiA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gaXMgbm90IDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGlzIGxhcmdlIGVub3VnaCAodGhlIGV4YWN0CisgICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBkZXRlcm1pbmVzIHRoZQorICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcworICAgYWNjb3JkaW5nbHkgOyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+LiAgSWYgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYXJlIHNldCB0byA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorICAgPHA+CisKKyAgICAgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IKKyAgIG1lc3NhZ2UuIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nCisgICB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuICAoU28gPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZAorICAgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gbWF5IGJlIG1vZGlmaWVkLCBidXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYXJlIHVuY2hhbmdlZC4pCisgICA8cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCisgIGludHJvZHVjZSBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpCisgIGV4Y2VwdCB3aGVuIGZvcmNlZCB0byBmbHVzaC4KKyAgPHA+CisKKyAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICA8dWw+CisgIDxsaT4gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLgorCisgIDxsaT4gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCAKKyAgICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFjY29yZGluZ2x5LiAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIAorICAgIHVudGlsIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIAorICAgIChzZWUgYmVsb3cgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCisgIDwvdWw+IDxwPgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgorICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAorICBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiBJZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gYW5kIHdpdGggemVybyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+LCBpdAorICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCisgIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisgIDxwPgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGZsdXNoZXMgYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoZSBmbHVzaGluZyBiZWhhdmlvciBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gaXMKKyAgbm90IHNwZWNpZmllZCBmb3IgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+CisgIGFuZCA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiwgYnV0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQKKyAgYXMgcG9zc2libGUgYW55d2F5LgorICA8cD4KKworICAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yIGFuCisgIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCisgIChhIHNpbmdsZSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bworICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPi4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKKyAgb3V0cHV0IGlzIGZsdXNoZWQgOyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCisgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAorICBiZSA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4gVGhlIHVzZSBvZiA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPgorICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gdGhhdCBhIGZhc3RlciByb3V0aW5lCisgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIGNhbGwuCisgIDxwPgorCisgICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQgKHNlZSA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPgorICBiZWxvdyksIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBzZXRzIHN0cm0tPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiB0aGUKKyAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gOyBvdGhlcndpc2UgCisgIGl0IHNldHMgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkCisgIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBieXRlcykgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+LCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yCisgIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpCisgIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUKKyAgY29tcHJlc3NvciBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisgIDxwPgorCisgICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAorICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCA8YSBocmVmPSIjWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPiBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIHRoZSBpbnB1dCBkYXRhIHdhcworICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0CisgIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQKKyAgKGZvciBleGFtcGxlIGlmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBvciA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiB3YXMgTlVMTCksIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKKyAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdAorICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVuIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGlzIHVzZWQuIEluIHRoZSA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+CisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbiBjYWxsIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+IHRvIGxvb2sgZm9yIGEgZ29vZAorICBjb21wcmVzc2lvbiBibG9jay4KKyAgPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KKzxkZD4KKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorICAgPHA+CisKKyAgICAgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4KKyAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKKyAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KKzwvZGw+Cis8aHI+Cis8YSBuYW1lPSJBZHZhbmNlZCBmdW5jdGlvbnMiPjxoMj4gQWR2YW5jZWQgZnVuY3Rpb25zIDwvaDI+CisgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBvbmx5IGluIHNvbWUgc3BlY2lhbCBhcHBsaWNhdGlvbnMuCis8aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KKzx1bD4KKzxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLAorPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTsKKzxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBkZXN0LCA8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHNvdXJjZSk7Cis8bGk+IGludCAgPGEgaHJlZj0iI2RlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKKzxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOworPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICB3aW5kb3dCaXRzKTsKKzxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOworPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOworPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlUmVzZXQiPmluZmxhdGVSZXNldDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7CisKKzwvdWw+Cis8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Cis8ZGw+Cis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsIGludCAgd2luZG93Qml0cywgaW50ICBtZW1MZXZlbCwgaW50ICBzdHJhdGVneSk7PC9mb250PgorCis8ZGQ+IFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiBUaGUKKyAgIGZpZWxkcyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLjxwPgorCisgICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgPGEgaHJlZj0iI1pfREVGTEFURUQiPlpfREVGTEFURUQ8L2E+IGluCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuPHA+CisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCisgICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgorICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgorICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gaXMgdXNlZCBpbnN0ZWFkLjxwPgorCisgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0CisgICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvIDsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5CisgICBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeQorICAgdXNhZ2UgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC48cD4KKworICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCisgICB2YWx1ZSA8YSBocmVmPSIjWl9ERUZBVUxUX1NUUkFURUdZIj5aX0RFRkFVTFRfU1RSQVRFR1k8L2E+IGZvciBub3JtYWwgZGF0YSwgPGEgaHJlZj0iI1pfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+IGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKKyAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgb3IgPGEgaHJlZj0iI1pfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4gdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubworICAgc3RyaW5nIG1hdGNoKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEKKyAgIHNvbWV3aGF0IHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcworICAgdHVuZWQgdG8gPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgPGEgaHJlZj0iI1pfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+IGlzIHRvIGZvcmNlIG1vcmUKKyAgIEh1ZmZtYW4gY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZyA7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZQorICAgYmV0d2VlbiBaX0RFRkFVTFQgYW5kIDxhIGhyZWY9IiNaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+LiBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cworICAgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuCisgICBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuPHA+CisKKyAgICAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCisgICBtZXRob2QpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGRvZXMKKyAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOzwvZm9udD4KKzxkZD4KKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQorICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiwgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBvciA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+LCBiZWZvcmUgYW55CisgICBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPi4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCisgICBkaWN0aW9uYXJ5IChzZWUgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4pLjxwPgorCisgICAgIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkKKyAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKKyAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKKyAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKKyAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3kgOyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCisgICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuPHA+CisKKyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKKyAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4sIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCisgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZSBpbgorICAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IG9yIGRlZmxhdGUyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBzaG91bGQgYmUKKyAgIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LjxwPgorCisgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tJmd0IDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IGlzIHNldCB0byB0aGUgQWRsZXIzMiB2YWx1ZQorICAgb2YgdGhlIGRpY3Rpb25hcnkgOyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKKyAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBBZGxlcjMyIHZhbHVlCisgICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcworICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pPHA+CisKKyAgICAgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGlzCisgICBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KKyAgIG9yIGlmIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgYnNvcnQpLiA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLjxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVDb3B5Ij5kZWZsYXRlQ29weTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gZGVzdCwgPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzb3VyY2UpOzwvZm9udD4KKzxkZD4KKyAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS48cD4KKworICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQorICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKKyAgIGRhdGEgd2l0aCBhIGZpbHRlci4gVGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCBzaG91bGQgdGhlbiBiZSBmcmVlZAorICAgYnkgY2FsbGluZyA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4uICBOb3RlIHRoYXQgPGEgaHJlZj0iI2RlZmxhdGVDb3B5Ij5kZWZsYXRlQ29weTwvYT4gZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKKyAgIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZAorICAgY2FuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuPHA+CisKKyAgICAgPGEgaHJlZj0iI2RlZmxhdGVDb3B5Ij5kZWZsYXRlQ29weTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBiZWluZyBOVUxMKS4gPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIGRlc3RpbmF0aW9uLjxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+Cis8ZGQ+ICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+IGZvbGxvd2VkIGJ5IDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+LAorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KKyAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcworICAgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+LjxwPgorCisgICAgICA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gb3IgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gYmVpbmcgTlVMTCkuPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOzwvZm9udD4KKzxkZD4KKyAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKKyAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+LiAgVGhpcyBjYW4gYmUKKyAgIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0IGRhdGEsIG9yCisgICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudAorICAgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhcgorICAgaXMgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7IHRoZSBuZXcgbGV2ZWwgd2lsbAorICAgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLjxwPgorCisgICAgIEJlZm9yZSB0aGUgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4sIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gbXVzdCBiZSBzZXQgYXMgZm9yCisgICBhIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvCisgICBiZSBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiBJbiBwYXJ0aWN1bGFyLCBzdHJtLSZndCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IG11c3QgYmUgCisgICBub24temVyby48cD4KKworICAgICA8YSBocmVmPSIjZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+CisgICBpZiBzdHJtLSZndGF2YWlsX291dCB3YXMgemVyby48cD4KKworPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICB3aW5kb3dCaXRzKTs8L2ZvbnQ+CisKKzxkZD4gICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiBUaGUKKyAgIGZpZWxkcyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4sIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+LCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhbmQgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBtdXN0IGJlIGluaXRpYWxpemVkCisgICBiZWZvcmUgYnkgdGhlIGNhbGxlci48cD4KKworICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKKyAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBpcyB1c2VkCisgICBpbnN0ZWFkLiBJZiBhIGNvbXByZXNzZWQgc3RyZWFtIHdpdGggYSBsYXJnZXIgd2luZG93IHNpemUgaXMgZ2l2ZW4gYXMKKyAgIGlucHV0LCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaW5zdGVhZCBvZgorICAgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHdpbmRvdy48cD4KKworICAgICAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGEgbmVnYXRpdmUKKyAgIG1lbUxldmVsKS4gPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPgorICAgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmCisgICBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS4gKFNvIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gbWF5IGJlCisgICBtb2RpZmllZCwgYnV0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFyZSB1bmNoYW5nZWQuKTxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKKyAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4KKyAgIGlmIHRoaXMgY2FsbCByZXR1cm5lZCA8YSBocmVmPSIjWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPi4gVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCisgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBBZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBvZgorICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+LiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIGRpY3Rpb25hcnkgKHNlZSA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPikuPHA+CisKKyAgICAgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGlzCisgICBpbmNvbnNpc3RlbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKKyAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IEFkbGVyMzIgdmFsdWUpLiA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgorICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuPHA+CisKKzxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+CisKKzxkZD4gICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCisgIGRlc2NyaXB0aW9uIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiB3aXRoIDxhIGhyZWY9IiNaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4pIGNhbiBiZSBmb3VuZCwgb3IgdW50aWwgYWxsCisgIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuPHA+CisKKyAgICA8YSBocmVmPSIjaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+CisgIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAorICBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgc3VjY2VzcworICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZiA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiB3aGljaAorICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+LCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCisgIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLjxwPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4sCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCisgICBUaGUgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPi4KKyAgIDxwPgorCisgICAgICA8YSBocmVmPSIjaW5mbGF0ZVJlc2V0Ij5pbmZsYXRlUmVzZXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gb3IgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gYmVpbmcgTlVMTCkuCisgICA8cD4KKzwvZGw+CisKKzxocj4KKzxhIG5hbWU9IkNoZWNrc3VtIGZ1bmN0aW9ucyI+PGgyPiBDaGVja3N1bSBmdW5jdGlvbnMgPC9oMj4KKyAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCisgICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCisgICBjb21wcmVzc2lvbiBsaWJyYXJ5LgorPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Cis8dWw+Cis8bGk+IHVMb25nICA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gKHVMb25nIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+LCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbik7Cis8bGk+IHVMb25nICA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPiAgICh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTsKKzwvdWw+Cis8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Cis8ZGw+Cis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB1TG9uZyAgPGEgbmFtZT0iYWRsZXIzMiI+YWRsZXIzMjwvYT4gKHVMb25nIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+LCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbik7PC9mb250PgorPGRkPgorICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisgICA8cD4KKyAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKKyAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgorICAgPHByZT4KKworICAgICB1TG9uZyA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiA9IDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPigwTCwgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiA9IDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPig8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiwgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmICg8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKKyAgIDwvcHJlPgorCis8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB1TG9uZyAgPGEgbmFtZT0iY3JjMzIiPmNyYzMyPC9hPiAgICh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTs8L2ZvbnQ+Cis8ZGQ+CisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgY3JjIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUgdXBkYXRlZAorICAgY3JjLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlCisgICBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZAorICAgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVXNhZ2UgZXhhbXBsZToKKyAgIDxwcmU+CisKKyAgICAgdUxvbmcgY3JjID0gPGEgaHJlZj0iI2NyYzMyIj5jcmMzMjwvYT4oMEwsIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gPGEgaHJlZj0iI2NyYzMyIj5jcmMzMjwvYT4oY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisgICA8L3ByZT4KKzwvZGw+Cis8aHI+Cis8YSBuYW1lPSJzdHJ1Y3Qgel9zdHJlYW1fcyI+PGgyPiBzdHJ1Y3Qgel9zdHJlYW1fcyA8L2gyPgorPGZvbnQgY29sb3I9IkJsdWUiPgorPGEgbmFtZT0iel9zdHJlYW1fcyI+Cis8cHJlPgordHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7CisgICAgQnl0ZWYgICAgKjxhIG5hbWU9Im5leHRfaW4iPm5leHRfaW48L2E+OyAgLyogbmV4dCBpbnB1dCBieXRlICovCisgICAgdUludCAgICAgPGEgbmFtZT0iYXZhaWxfaW4iPmF2YWlsX2luPC9hPjsgIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+ICovCisgICAgdUxvbmcgICAgPGEgbmFtZT0idG90YWxfaW4iPnRvdGFsX2luPC9hPjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCisKKyAgICBCeXRlZiAgICAqPGEgbmFtZT0ibmV4dF9vdXQiPm5leHRfb3V0PC9hPjsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCisgICAgdUludCAgICAgPGEgbmFtZT0iYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiAqLworICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX291dCI+dG90YWxfb3V0PC9hPjsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworCisgICAgY2hhciAgICAgKjxhIG5hbWU9Im1zZyI+bXNnPC9hPjsgICAgICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICo8YSBuYW1lPSJzdGF0ZSI+c3RhdGU8L2E+OyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKworICAgIGFsbG9jX2Z1bmMgPGEgbmFtZT0iemFsbG9jIj56YWxsb2M8L2E+OyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gKi8KKyAgICBmcmVlX2Z1bmMgIDxhIG5hbWU9InpmcmVlIj56ZnJlZTwvYT47ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiAqLworICAgIHZvaWRwZiAgICAgPGEgbmFtZT0ib3BhcXVlIj5vcGFxdWU8L2E+OyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gKi8KKworICAgIGludCAgICAgPGEgbmFtZT0iZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+OyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKi8KKyAgICB1TG9uZyAgIDxhIG5hbWU9ImFkbGVyIj5hZGxlcjwvYT47ICAgICAgLyogPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgIHVMb25nICAgPGEgbmFtZT0icmVzZXJ2ZWQiPnJlc2VydmVkPC9hPjsgICAvKiA8YSBocmVmPSIjcmVzZXJ2ZWQiPnJlc2VydmVkPC9hPiBmb3IgZnV0dXJlIHVzZSAqLworfSA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+IDsKKwordHlwZWRlZiA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+IEZBUiAqIDxhIG5hbWU9Inpfc3RyZWFtcCI+el9zdHJlYW1wPC9hPjsgIP8gCis8L3ByZT4KKzwvZm9udD4KKyAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IHdoZW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaGFzCisgICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IHdoZW4gPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgorICAgaGFzIGRyb3BwZWQgdG8gemVyby4gVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhbmQKKyAgIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiA8cD4KKworICAgVGhlIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAorICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KKyAgIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQorICAgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiB2YWx1ZS4gPHA+CisKKyAgIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gbXVzdCByZXR1cm4gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KKyAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBtdXN0IGJlCisgICB0aHJlYWQgc2FmZS4gPHA+CisKKyAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQorICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCisgICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKKyAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKKyAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgorICAgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiBUbyByZWR1Y2UgbWVtb3J5CisgICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgorICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgorICAgPHA+CisKKyAgIFRoZSBmaWVsZHMgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYW5kIDxhIGhyZWY9IiN0b3RhbF9vdXQiPnRvdGFsX291dDwvYT4gY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKKyAgIHByb2dyZXNzIHJlcG9ydHMuIEFmdGVyIGNvbXByZXNzaW9uLCA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZgorICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCisgICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCisgICBhIHNpbmdsZSBzdGVwKS4gPHA+CisKKzxocj4KKzxhIG5hbWU9IkNvbnN0YW50cyI+PGgyPiBDb25zdGFudHMgPC9oMj4KKzxmb250IGNvbG9yPSJCbHVlIj4KKzxwcmU+CisjZGVmaW5lIDxhIG5hbWU9IlpfTk9fRkxVU0giPlpfTk9fRkxVU0g8L2E+ICAgICAgMAorI2RlZmluZSA8YSBuYW1lPSJaX1BBUlRJQUxfRkxVU0giPlpfUEFSVElBTF9GTFVTSDwvYT4gMSAKKwkvKiB3aWxsIGJlIHJlbW92ZWQsIHVzZSA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+IGluc3RlYWQgKi8KKyNkZWZpbmUgPGEgbmFtZT0iWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+ICAgIDIKKyNkZWZpbmUgPGEgbmFtZT0iWl9GVUxMX0ZMVVNIIj5aX0ZVTExfRkxVU0g8L2E+ICAgIDMKKyNkZWZpbmUgPGEgbmFtZT0iWl9GSU5JU0giPlpfRklOSVNIPC9hPiAgICAgICAgNAorLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXMgOyBzZWUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSA8YSBuYW1lPSJaX09LIj5aX09LPC9hPiAgICAgICAgICAgIDAKKyNkZWZpbmUgPGEgbmFtZT0iWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+ICAgIDEKKyNkZWZpbmUgPGEgbmFtZT0iWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPiAgICAgMgorI2RlZmluZSA8YSBuYW1lPSJaX0VSUk5PIj5aX0VSUk5PPC9hPiAgICAgICAgKC0xKQorI2RlZmluZSA8YSBuYW1lPSJaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+ICgtMikKKyNkZWZpbmUgPGEgbmFtZT0iWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+ICAgKC0zKQorI2RlZmluZSA8YSBuYW1lPSJaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+ICAgICgtNCkKKyNkZWZpbmUgPGEgbmFtZT0iWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiAgICAoLTUpCisjZGVmaW5lIDxhIG5hbWU9IlpfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiAoLTYpCisvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUKKyAqIHZhbHVlcyBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCisgKi8KKworI2RlZmluZSA8YSBuYW1lPSJaX05PX0NPTVBSRVNTSU9OIj5aX05PX0NPTVBSRVNTSU9OPC9hPiAgICAgICAgIDAKKyNkZWZpbmUgPGEgbmFtZT0iWl9CRVNUX1NQRUVEIj5aX0JFU1RfU1BFRUQ8L2E+ICAgICAgICAgICAgIDEKKyNkZWZpbmUgPGEgbmFtZT0iWl9CRVNUX0NPTVBSRVNTSU9OIj5aX0JFU1RfQ09NUFJFU1NJT048L2E+ICAgICAgIDkKKyNkZWZpbmUgPGEgbmFtZT0iWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+ICAoLTEpCisvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KKworI2RlZmluZSA8YSBuYW1lPSJaX0ZJTFRFUkVEIj5aX0ZJTFRFUkVEPC9hPiAgICAgICAgICAgIDEKKyNkZWZpbmUgPGEgbmFtZT0iWl9IVUZGTUFOX09OTFkiPlpfSFVGRk1BTl9PTkxZPC9hPiAgICAgICAgMgorI2RlZmluZSA8YSBuYW1lPSJaX0RFRkFVTFRfU1RSQVRFR1kiPlpfREVGQVVMVF9TVFJBVEVHWTwvYT4gICAgMAorLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgOyBzZWUgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPigpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgPGEgbmFtZT0iWl9CSU5BUlkiPlpfQklOQVJZPC9hPiAgIDAKKyNkZWZpbmUgPGEgbmFtZT0iWl9BU0NJSSI+Wl9BU0NJSTwvYT4gICAgMQorI2RlZmluZSA8YSBuYW1lPSJaX1VOS05PV04iPlpfVU5LTk9XTjwvYT4gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgPGEgaHJlZj0iI2RhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPiBmaWVsZCAqLworCisjZGVmaW5lIDxhIG5hbWU9IlpfREVGTEFURUQiPlpfREVGTEFURUQ8L2E+ICAgOAorLyogVGhlIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLworCisjZGVmaW5lIDxhIG5hbWU9IlpfTlVMTCI+Wl9OVUxMPC9hPiAgMCAgLyogZm9yIGluaXRpYWxpemluZyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiwgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiAqLworCisjZGVmaW5lIDxhIG5hbWU9InpsaWJfdmVyc2lvbiI+emxpYl92ZXJzaW9uPC9hPiA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPigpCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIGxlc3MgdGhhbiAxLjAuMiAqLworPC9wcmU+Cis8L2ZvbnQ+CisKKzxocj4KKzxhIG5hbWU9Ik1pc2MiPjxoMj4gTWlzYyA8L2gyPgorIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IGFuZCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBhcmUgbWFjcm9zIHRvIGFsbG93IGNoZWNraW5nIHRoZSB6bGliIHZlcnNpb24KKyBhbmQgdGhlIGNvbXBpbGVyJ3MgdmlldyBvZiA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+LgorIDxwPgorIE90aGVyIGZ1bmN0aW9uczoKKyA8ZGw+CisgPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY29uc3QgY2hhciAgICogIDxhIG5hbWU9InpFcnJvciI+ekVycm9yPC9hPiAgICAgICAgICAgKGludCBlcnIpOzwvZm9udD4KKyA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgICAgICAgICAgPGEgbmFtZT0iaW5mbGF0ZVN5bmNQb2ludCI+aW5mbGF0ZVN5bmNQb2ludDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4geik7PC9mb250PgorIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNvbnN0IHVMb25nZiAqICA8YSBuYW1lPSJnZXRfY3JjX3RhYmxlIj5nZXRfY3JjX3RhYmxlPC9hPiAgICAodm9pZCk7PC9mb250PgorIDwvZGw+CisgPGhyPgorIDxmb250IHNpemU9Ii0xIj4KKyBMYXN0IHVwZGF0ZTogV2VkIE9jdCAxMyAyMDo0MjozNCAxOTk5PGJyPgorIHBpYXBpQGNzaWUubnR1LmVkdS50dworIDwvZm9udD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvenV0aWwuYyBiL2NvbW1vbi96bGliL3p1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViZWI1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi96bGliL3p1dGlsLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qIHp1dGlsLmMgLS0gdGFyZ2V0IGRlcGVuZGVudCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICovCisKKy8qIEAoIykgJElkOiB6dXRpbC5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjggY29uc3RfayBFeHAgJCAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKworc3RydWN0IGludGVybmFsX3N0YXRlICAgICAge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisKKyNpZm5kZWYgU1REQworZXh0ZXJuIHZvaWQgZXhpdCBPRigoaW50KSk7CisjZW5kaWYKKworY29uc3QgY2hhciAqel9lcnJtc2dbMTBdID0geworIm5lZWQgZGljdGlvbmFyeSIsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqLworInN0cmVhbSBlbmQiLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqLworIiIsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqLworImZpbGUgZXJyb3IiLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqLworInN0cmVhbSBlcnJvciIsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqLworImRhdGEgZXJyb3IiLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqLworImluc3VmZmljaWVudCBtZW1vcnkiLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqLworImJ1ZmZlciBlcnJvciIsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqLworImluY29tcGF0aWJsZSB2ZXJzaW9uIiwvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqLworIiJ9OworCisKK2NvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uKCkKK3sKKyAgICByZXR1cm4gWkxJQl9WRVJTSU9OOworfQorCisjaWZkZWYgREVCVUcKKworIyAgaWZuZGVmIHZlcmJvc2UKKyMgICAgZGVmaW5lIHZlcmJvc2UgMAorIyAgZW5kaWYKK2ludCB6X3ZlcmJvc2UgPSB2ZXJib3NlOworCit2b2lkIHpfZXJyb3IgKG0pCisgICAgY2hhciAqbTsKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtKTsKKyAgICBleGl0KDEpOworfQorI2VuZGlmCisKKy8qIGV4cG9ydGVkIHRvIGFsbG93IGNvbnZlcnNpb24gb2YgZXJyb3IgY29kZSB0byBzdHJpbmcgZm9yIGNvbXByZXNzKCkgYW5kCisgKiB1bmNvbXByZXNzKCkKKyAqLworY29uc3QgY2hhciAqIFpFWFBPUlQgekVycm9yKGVycikKKyAgICBpbnQgZXJyOworeworICAgIHJldHVybiBFUlJfTVNHKGVycik7Cit9CisKKworI2lmbmRlZiBIQVZFX01FTUNQWQorCit2b2lkIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCisgICAgQnl0ZWYqIGRlc3Q7CisgICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKKyAgICB1SW50ICBsZW47Cit7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisgICAgZG8geworICAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOyAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KKyAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKworaW50IHptZW1jbXAoczEsIHMyLCBsZW4pCisgICAgY29uc3QgQnl0ZWYqIHMxOworICAgIGNvbnN0IEJ5dGVmKiBzMjsKKyAgICB1SW50ICBsZW47Cit7CisgICAgdUludCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgIGlmIChzMVtqXSAhPSBzMltqXSkgcmV0dXJuIDIqKHMxW2pdID4gczJbal0pLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIHptZW16ZXJvKGRlc3QsIGxlbikKKyAgICBCeXRlZiogZGVzdDsKKyAgICB1SW50ICBsZW47Cit7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisgICAgZG8geworICAgICAgICAqZGVzdCsrID0gMDsgIC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLworICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1RVUkJPQ19fCisjaWYgKGRlZmluZWQoIF9fQk9STEFORENfXykgfHwgIWRlZmluZWQoU01BTExfTUVESVVNKSkgJiYgIWRlZmluZWQoX18zMkJJVF9fKQorLyogU21hbGwgYW5kIG1lZGl1bSBtb2RlbCBpbiBUdXJibyBDIGFyZSBmb3Igbm93IGxpbWl0ZWQgdG8gbmVhciBhbGxvY2F0aW9uCisgKiB3aXRoIHJlZHVjZWQgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMCisgKi8KKyMgIGRlZmluZSBNWV9aQ0FMTE9DCisKKy8qIFR1cmJvIEMgbWFsbG9jKCkgZG9lcyBub3QgYWxsb3cgZHluYW1pYyBhbGxvY2F0aW9uIG9mIDY0SyBieXRlcworICogYW5kIGZhcm1hbGxvYyg2NEspIHJldHVybnMgYSBwb2ludGVyIHdpdGggYW4gb2Zmc2V0IG9mIDgsIHNvIHdlCisgKiBtdXN0IGZpeCB0aGUgcG9pbnRlci4gV2FybmluZzogdGhlIHBvaW50ZXIgbXVzdCBiZSBwdXQgYmFjayB0byBpdHMKKyAqIG9yaWdpbmFsIGZvcm0gaW4gb3JkZXIgdG8gZnJlZSBpdCwgdXNlIHpjZnJlZSgpLgorICovCisKKyNkZWZpbmUgTUFYX1BUUiAxMAorLyogMTAqNjRLID0gNjQwSyAqLworCitsb2NhbCBpbnQgbmV4dF9wdHIgPSAwOworCit0eXBlZGVmIHN0cnVjdCBwdHJfdGFibGVfcyB7CisgICAgdm9pZHBmIG9yZ19wdHI7CisgICAgdm9pZHBmIG5ld19wdHI7Cit9IHB0cl90YWJsZTsKKworbG9jYWwgcHRyX3RhYmxlIHRhYmxlW01BWF9QVFJdOworLyogVGhpcyB0YWJsZSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCBmb3JtIG9mIHBvaW50ZXJzCisgKiB0byBsYXJnZSBidWZmZXJzICg2NEspLiBTdWNoIHBvaW50ZXJzIGFyZSBub3JtYWxpemVkIHdpdGggYSB6ZXJvIG9mZnNldC4KKyAqIFNpbmNlIE1TRE9TIGlzIG5vdCBhIHByZWVtcHRpdmUgbXVsdGl0YXNraW5nIE9TLCB0aGlzIHRhYmxlIGlzIG5vdAorICogcHJvdGVjdGVkIGZyb20gY29uY3VycmVudCBhY2Nlc3MuIFRoaXMgaGFjayBkb2Vzbid0IHdvcmsgYW55d2F5IG9uCisgKiBhIHByb3RlY3RlZCBzeXN0ZW0gbGlrZSBPUy8yLiBVc2UgTWljcm9zb2Z0IEMgaW5zdGVhZC4KKyAqLworCit2b2lkcGYgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgdm9pZHBmIGJ1ZiA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCisgICAgdWxnIGJzaXplID0gKHVsZylpdGVtcypzaXplOworCisgICAgLyogSWYgd2UgYWxsb2NhdGUgbGVzcyB0aGFuIDY1NTIwIGJ5dGVzLCB3ZSBhc3N1bWUgdGhhdCBmYXJtYWxsb2MKKyAgICAgKiB3aWxsIHJldHVybiBhIHVzYWJsZSBwb2ludGVyIHdoaWNoIGRvZXNuJ3QgaGF2ZSB0byBiZSBub3JtYWxpemVkLgorICAgICAqLworICAgIGlmIChic2l6ZSA8IDY1NTIwTCkgeworICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUpOworICAgICAgICBpZiAoKih1c2gqKSZidWYgIT0gMCkgcmV0dXJuIGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUgKyAxNkwpOworICAgIH0KKyAgICBpZiAoYnVmID09IE5VTEwgfHwgbmV4dF9wdHIgPj0gTUFYX1BUUikgcmV0dXJuIE5VTEw7CisgICAgdGFibGVbbmV4dF9wdHJdLm9yZ19wdHIgPSBidWY7CisKKyAgICAvKiBOb3JtYWxpemUgdGhlIHBvaW50ZXIgdG8gc2VnOjAgKi8KKyAgICAqKCh1c2gqKSZidWYrMSkgKz0gKCh1c2gpKCh1Y2gqKWJ1Zi0wKSArIDE1KSA+PiA0OworICAgICoodXNoKikmYnVmID0gMDsKKyAgICB0YWJsZVtuZXh0X3B0cisrXS5uZXdfcHRyID0gYnVmOworICAgIHJldHVybiBidWY7Cit9CisKK3ZvaWQgIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKK3sKKyAgICBpbnQgbjsKKyAgICBpZiAoKih1c2gqKSZwdHIgIT0gMCkgeyAvKiBvYmplY3QgPCA2NEsgKi8KKyAgICAgICAgZmFyZnJlZShwdHIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIEZpbmQgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgbmV4dF9wdHI7IG4rKykgeworICAgICAgICBpZiAocHRyICE9IHRhYmxlW25dLm5ld19wdHIpIGNvbnRpbnVlOworCisgICAgICAgIGZhcmZyZWUodGFibGVbbl0ub3JnX3B0cik7CisgICAgICAgIHdoaWxlICgrK24gPCBuZXh0X3B0cikgeworICAgICAgICAgICAgdGFibGVbbi0xXSA9IHRhYmxlW25dOworICAgICAgICB9CisgICAgICAgIG5leHRfcHRyLS07CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcHRyID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KKyAgICBBc3NlcnQoMCwgInpjZnJlZTogcHRyIG5vdCBmb3VuZCIpOworfQorI2VuZGlmCisjZW5kaWYgLyogX19UVVJCT0NfXyAqLworCisKKyNpZiBkZWZpbmVkKE1fSTg2KSAmJiAhZGVmaW5lZChfXzMyQklUX18pCisvKiBNaWNyb3NvZnQgQyBpbiAxNi1iaXQgbW9kZSAqLworCisjICBkZWZpbmUgTVlfWkNBTExPQworCisjaWYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPD0gNjAwKSkKKyMgIGRlZmluZSBfaGFsbG9jICBoYWxsb2MKKyMgIGRlZmluZSBfaGZyZWUgICBoZnJlZQorI2VuZGlmCisKK3ZvaWRwZiB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIF9oYWxsb2MoKGxvbmcpaXRlbXMsIHNpemUpOworfQorCit2b2lkICB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaWYgKG9wYXF1ZSkgb3BhcXVlID0gMDsgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIF9oZnJlZShwdHIpOworfQorCisjZW5kaWYgLyogTVNDICovCisKKworI2lmbmRlZiBNWV9aQ0FMTE9DIC8qIEFueSBzeXN0ZW0gd2l0aG91dCBhIHNwZWNpYWwgYWxsb2MgZnVuY3Rpb24gKi8KKworI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZHAgIGNhbGxvYyBPRigodUludCBpdGVtcywgdUludCBzaXplKSk7CitleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOworI2VuZGlmCisKK3ZvaWRwZiB6Y2FsbG9jIChvcGFxdWUsIGl0ZW1zLCBzaXplKQorICAgIHZvaWRwZiBvcGFxdWU7CisgICAgdW5zaWduZWQgaXRlbXM7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICBpZiAob3BhcXVlKSBpdGVtcyArPSBzaXplIC0gc2l6ZTsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIHJldHVybiAodm9pZHBmKWNhbGxvYyhpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgIHpjZnJlZSAob3BhcXVlLCBwdHIpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB2b2lkcGYgcHRyOworeworICAgIGZyZWUocHRyKTsKKyAgICBpZiAob3BhcXVlKSByZXR1cm47IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KK30KKworI2VuZGlmIC8qIE1ZX1pDQUxMT0MgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL3p1dGlsLmggYi9jb21tb24vemxpYi96dXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWI3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vemxpYi96dXRpbC5oCkBAIC0wLDAgKzEsMjIwIEBACisvKiB6dXRpbC5oIC0tIGludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogQCgjKSAkSWQ6IHp1dGlsLmgsdiAxLjEgMjAwNC8xMC8wOCAwOTo0NDoyOCBjb25zdF9rIEV4cCAkICovCisKKyNpZm5kZWYgX1pfVVRJTF9ICisjZGVmaW5lIF9aX1VUSUxfSAorCisjaW5jbHVkZSAiemxpYi5oIgorCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgTk9fRVJSTk9fSAorICAgIGV4dGVybiBpbnQgZXJybm87CisjZWxzZQorIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2lmbmRlZiBsb2NhbAorIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworI2VuZGlmCisvKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Cit0eXBlZGVmIHVjaCBGQVIgdWNoZjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwordHlwZWRlZiB1c2ggRkFSIHVzaGY7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsZzsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnpfZXJybXNnWzEwXTsgLyogaW5kZXhlZCBieSAyLXpsaWJfZXJyb3IgKi8KKy8qIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KKworI2RlZmluZSBFUlJfTVNHKGVycikgel9lcnJtc2dbWl9ORUVEX0RJQ1QtKGVycildCisKKyNkZWZpbmUgRVJSX1JFVFVSTihzdHJtLGVycikgXAorICByZXR1cm4gKHN0cm0tPm1zZyA9IChjaGFyKilFUlJfTVNHKGVyciksIChlcnIpKQorLyogVG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN0YXRlIGlzIGtub3duIHRvIGJlIHZhbGlkICovCisKKyAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLworCisjaWZuZGVmIERFRl9XQklUUworIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKKyNlbmRpZgorLyogZGVmYXVsdCB3aW5kb3dCaXRzIGZvciBkZWNvbXByZXNzaW9uLiBNQVhfV0JJVFMgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHkgKi8KKworI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKy8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBQUkVTRVRfRElDVCAweDIwIC8qIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIgKi8KKworICAgICAgICAvKiB0YXJnZXQgZGVwZW5kZW5jaWVzICovCisKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKKyMgIGlmIGRlZmluZWQoX19UVVJCT0NfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjICAgIGlmKF9fU1REQ19fID09IDEpICYmIChkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChfX0NPTVBBQ1RfXykpCisgICAgICAgLyogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCAqLworICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7CisgICAgICAgdm9pZCAqX0NkZWNsIGZhcm1hbGxvYyggdW5zaWduZWQgbG9uZyBuYnl0ZXMgKTsKKyMgICAgZWxzZQorIyAgICAgaW5jbHVkZSA8YWxsb2MuaD4KKyMgICAgZW5kaWYKKyMgIGVsc2UgLyogTVNDIG9yIERKR1BQICovCisjICAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1MyCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMiAvKiBXaW5kb3cgOTUgJiBXaW5kb3dzIE5UICovCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwYgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAorICAgICBmb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCisjZW5kaWYKKworI2lmZGVmIEFNSUdBCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFUQVJJKSB8fCBkZWZpbmVkKGF0YXJpc3QpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFRBUkdFVF9PU19NQUMpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNworIyAgaWYgZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX2Rlc3Rfb3MgIT0gX19iZV9vcyAmJiBfX2Rlc3Rfb3MgIT0gX193aW4zMl9vcworIyAgICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmZG9wZW4gKi8KKyMgIGVsc2UKKyMgICAgaWZuZGVmIGZkb3BlbgorIyAgICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX181MFNFUklFUyAvKiBQcmltZS9QUklNT1MgKi8KKyMgIGRlZmluZSBPU19DT0RFICAweDBGCisjZW5kaWYKKworI2lmZGVmIFRPUFMyMAorIyAgZGVmaW5lIE9TX0NPREUgIDB4MGEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfQkVPU18pIHx8IGRlZmluZWQoUklTQ09TKQorIyAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiA2MDApKQorIyAgZGVmaW5lIGZkb3BlbihmZCx0eXBlKSAgX2Zkb3BlbihmZCx0eXBlKQorI2VuZGlmCisKKworICAgICAgICAvKiBDb21tb24gZGVmYXVsdHMgKi8KKworI2lmbmRlZiBPU19DT0RFCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMyAgLyogYXNzdW1lIFVuaXggKi8KKyNlbmRpZgorCisjaWZuZGVmIEZfT1BFTgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBmb3BlbigobmFtZSksIChtb2RlKSkKKyNlbmRpZgorCisgICAgICAgICAvKiBmdW5jdGlvbnMgKi8KKworI2lmZGVmIEhBVkVfU1RSRVJST1IKKyAgIGV4dGVybiBjaGFyICpzdHJlcnJvciBPRigoaW50KSk7CisjICBkZWZpbmUgenN0cmVycm9yKGVycm51bSkgc3RyZXJyb3IoZXJybnVtKQorI2Vsc2UKKyMgIGRlZmluZSB6c3RyZXJyb3IoZXJybnVtKSAiIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKHB5cikKKyMgIGRlZmluZSBOT19NRU1DUFkKKyNlbmRpZgorI2lmIGRlZmluZWQoU01BTExfTUVESVVNKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19TQ19fKQorIC8qIFVzZSBvdXIgb3duIGZ1bmN0aW9ucyBmb3Igc21hbGwgYW5kIG1lZGl1bSBtb2RlbCB3aXRoIE1TQyA8PSA1LjAuCisgICogWW91IG1heSBoYXZlIHRvIHVzZSB0aGUgc2FtZSBzdHJhdGVneSBmb3IgQm9ybGFuZCBDICh1bnRlc3RlZCkuCisgICogVGhlIF9fU0NfXyBjaGVjayBpcyBmb3IgU3ltYW50ZWMuCisgICovCisjICBkZWZpbmUgTk9fTUVNQ1BZCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKEhBVkVfTUVNQ1BZKSAmJiAhZGVmaW5lZChOT19NRU1DUFkpCisjICBkZWZpbmUgSEFWRV9NRU1DUFkKKyNlbmRpZgorI2lmZGVmIEhBVkVfTUVNQ1BZCisjICBpZmRlZiBTTUFMTF9NRURJVU0gLyogTVNET1Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSB6bWVtY3B5IF9mbWVtY3B5CisjICAgIGRlZmluZSB6bWVtY21wIF9mbWVtY21wCisjICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIF9mbWVtc2V0KGRlc3QsIDAsIGxlbikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIHptZW1jcHkgbWVtY3B5CisjICAgIGRlZmluZSB6bWVtY21wIG1lbWNtcAorIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBtZW1zZXQoZGVzdCwgMCwgbGVuKQorIyAgZW5kaWYKKyNlbHNlCisgICBleHRlcm4gdm9pZCB6bWVtY3B5ICBPRigoQnl0ZWYqIGRlc3QsIGNvbnN0IEJ5dGVmKiBzb3VyY2UsIHVJbnQgbGVuKSk7CisgICBleHRlcm4gaW50ICB6bWVtY21wICBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7CisgICBleHRlcm4gdm9pZCB6bWVtemVybyBPRigoQnl0ZWYqIGRlc3QsIHVJbnQgbGVuKSk7CisjZW5kaWYKKworLyogRGlhZ25vc3RpYyBmdW5jdGlvbnMgKi8KKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyAgIGV4dGVybiBpbnQgel92ZXJib3NlOworICAgZXh0ZXJuIHZvaWQgel9lcnJvciAgICBPRigoY2hhciAqbSkpOworIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykge2lmKCEoY29uZCkpIHpfZXJyb3IobXNnKTt9CisjICBkZWZpbmUgVHJhY2UoeCkge2lmICh6X3ZlcmJvc2U+PTApIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNldih4KSB7aWYgKHpfdmVyYm9zZT4wKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAoel92ZXJib3NlPjEpIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpIHtpZiAoel92ZXJib3NlPjAgJiYgKGMpKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh6X3ZlcmJvc2U+MSAmJiAoYykpIGZwcmludGYgeCA7fQorI2Vsc2UKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpCisjICBkZWZpbmUgVHJhY2UoeCkKKyMgIGRlZmluZSBUcmFjZXYoeCkKKyMgIGRlZmluZSBUcmFjZXZ2KHgpCisjICBkZWZpbmUgVHJhY2VjKGMseCkKKyMgIGRlZmluZSBUcmFjZWN2KGMseCkKKyNlbmRpZgorCisKK3R5cGVkZWYgdUxvbmcgKFpFWFBPUlQgKmNoZWNrX2Z1bmMpIE9GKCh1TG9uZyBjaGVjaywgY29uc3QgQnl0ZWYgKmJ1ZiwKKwkJCQkgICAgICAgdUludCBsZW4pKTsKK3ZvaWRwZiB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkpOwordm9pZCAgIHpjZnJlZSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpKTsKKworI2RlZmluZSBaQUxMT0Moc3RybSwgaXRlbXMsIHNpemUpIFwKKyAgICAgICAgICAgKCooKHN0cm0pLT56YWxsb2MpKSgoc3RybSktPm9wYXF1ZSwgKGl0ZW1zKSwgKHNpemUpKQorI2RlZmluZSBaRlJFRShzdHJtLCBhZGRyKSAgKCooKHN0cm0pLT56ZnJlZSkpKChzdHJtKS0+b3BhcXVlLCAodm9pZHBmKShhZGRyKSkKKyNkZWZpbmUgVFJZX0ZSRUUocywgcCkge2lmIChwKSBaRlJFRShzLCBwKTt9CisKKyNlbmRpZiAvKiBfWl9VVElMX0ggKi8K