ZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL0NoYW5nZUxvZyBiL2NvbW1vbi96bGliL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlZDMzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vemxpYi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotCi0JCUNoYW5nZUxvZyBmaWxlIGZvciB6bGliCi0KLUNoYW5nZXMgaW4gMS4xLjQgKDExIE1hcmNoIDIwMDIpCi0tIFpGUkVFIHdhcyByZXBlYXRlZCBvbiBzYW1lIGFsbG9jYXRpb24gb24gc29tZSBlcnJvciBjb25kaXRpb25zLgotICBUaGlzIGNyZWF0ZXMgYSBzZWN1cml0eSBwcm9ibGVtIGRlc2NyaWJlZCBpbgotICBodHRwOi8vd3d3LnpsaWIub3JnL2Fkdmlzb3J5LTIwMDItMDMtMTEudHh0Ci0tIFJldHVybmVkIGluY29ycmVjdCBlcnJvciAoWl9NRU1fRVJST1IpIG9uIHNvbWUgaW52YWxpZCBkYXRhCi0tIEF2b2lkIGFjY2Vzc2VzIGJlZm9yZSB3aW5kb3cgZm9yIGludmFsaWQgZGlzdGFuY2VzIHdpdGggaW5mbGF0ZSB3aW5kb3cKLSAgbGVzcyB0aGFuIDMySy4KLS0gZm9yY2Ugd2luZG93Qml0cyA+IDggdG8gYXZvaWQgYSBidWcgaW4gdGhlIGVuY29kZXIgZm9yIGEgd2luZG93IHNpemUKLSAgb2YgMjU2IGJ5dGVzLiAoQSBjb21wbGV0ZSBmaXggd2lsbCBiZSBhdmFpbGFibGUgaW4gMS4xLjUpLgotCQotQ2hhbmdlcyBpbiAxLjEuMyAoOSBKdWx5IDE5OTgpCi0tIGZpeCAiYW4gaW5mbGF0ZSBpbnB1dCBidWZmZXIgYnVnIHRoYXQgc2hvd3MgdXAgb24gcmFyZSBidXQgcGVyc2lzdGVudAotICBvY2Nhc2lvbnMiIChNYXJrKQotLSBmaXggZ3pyZWFkIGFuZCBnenRlbGwgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMgKERpZGllciBMZSBCb3RsYW4pCi0tIGZpeCBnenNlZWsoLi4uLCBTRUVLX1NFVCkgaW4gd3JpdGUgbW9kZQotLSBmaXggY3JjIGNoZWNrIGFmdGVyIGEgZ3plZWsgKEZyYW5rIEZhdWJlcnQpCi0tIGZpeCBtaW5pdW56aXAgd2hlbiB0aGUgbGFzdCBlbnRyeSBpbiBhIHppcCBmaWxlIGlzIGl0c2VsZiBhIHppcCBmaWxlCi0gIChKIExpbGxnZSkKLS0gYWRkIGNvbnRyaWIvYXNtNTg2IGFuZCBjb250cmliL2FzbTY4NiAoQnJpYW4gUmFpdGVyKQotICBTZWUgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotLSBhZGQgc3VwcG9ydCBmb3IgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkgKEJvYiBEZWxsYWNhKQotLSBhZGQgc3VwcG9ydCBmb3IgQysrQnVpbGRlciAzIGFuZCBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaTIgKERhdmlkZSBNb3JldHRpKQotLSBkbyBub3QgZXhpdCBwcmVtYXR1cmVseSBpbiB1bnRneiBpZiAwIGF0IHN0YXJ0IG9mIGJsb2NrIChNYWdudXMgSG9sbWdyZW4pCi0tIHVzZSBtYWNybyBFWFRFUk4gaW5zdGVhZCBvZiBleHRlcm4gdG8gc3VwcG9ydCBETEwgZm9yIEJlT1MgKFNhbmRlciBTdG9rcykKLS0gYWRkZWQgYSBGQVEgZmlsZQotCi0tIFN1cHBvcnQgZ3pkb3BlbiBvbiBNYWMgd2l0aCBNZXRyb3dlcmtzIChKYXNvbiBMaW5oYXJ0KQotLSBEbyBub3QgcmVkZWZpbmUgQnl0ZSBvbiBNYWMgKEJyYWQgUGV0dGl0ICYgSmFzb24gTGluaGFydCkKLS0gZGVmaW5lIFNFRUtfRU5EIHRvbyBpZiBTRUVLX1NFVCBpcyBub3QgZGVmaW5lZCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKLS0gYXZvaWQgc29tZSB3YXJuaW5ncyB3aXRoIEJvcmxhbmQgQyAoVG9tIFRhbm5lcikKLS0gZml4IGEgcHJvYmxlbSBpbiBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDE2LWJpdCBNU0RPUyAoR2lsbGVzIFZvbGxhbnQpCi0tIGVtdWxhdGUgdXRpbWUoKSBmb3IgV0lOMzIgaW4gY29udHJpYi91bnRneiAgKEdpbGxlcyBWb2xsYW50KQotLSBhbGxvdyBzZXZlcmFsIGFyZ3VtZW50cyB0byBjb25maWd1cmUgKFRpbSBNb29uZXksIEZyb2RvIExvb2lqYWFyZCkKLS0gdXNlIGxpYmRpciBhbmQgaW5jbHVkZWRpciBpbiBNYWtlZmlsZS5pbiAoVGltIE1vb25leSkKLS0gc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIE9TRjEgVjQgKFRpbSBNb29uZXkpCi0tIHJlbW92ZSBzb19sb2NhdGlvbnMgaW4gIm1ha2UgY2xlYW4iICAoVGltIE1vb25leSkKLS0gZml4IG1ha2V0cmVlLmMgY29tcGlsYXRpb24gZXJyb3IgKEdsZW5uLCBNYXJrKQotLSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgbm93IGluIFB5dGhvbiAxLjUgKEplcmVteSBIeWx0b24pCi0tIG5ldyBNYWtlZmlsZS5yaXNjb3MgKFJpY2ggV2Fsa2VyKQotLSBpbml0aWFsaXplIHN0YXRpYyBkZXNjcmlwdG9ycyBpbiB0cmVlcy5jIGZvciBlbWJlZGRlZCB0YXJnZXRzIChOaWNrIFNtaXRoKQotLSB1c2UgImZvby1neiIgaW4gZXhhbXBsZS5jIGZvciBSSVNDT1MgYW5kIFZNUyAoTmljayBTbWl0aCkKLS0gYWRkIHRoZSBPUy8yIGZpbGVzIGluIE1ha2VmaWxlLmluIHRvbyAoQW5kcmV3IFphYm9sb3RueSkKLS0gZml4IGZkb3BlbiBhbmQgaGFsbG9jIG1hY3JvcyBmb3IgTWljcm9zb2Z0IEMgNi4wIChUb20gTGFuZSkKLS0gZml4IG1ha2V0cmVlLmMgdG8gYWxsb3cgY2xlYW4gY29tcGlsYXRpb24gb2YgaW5mZml4ZWQuaCAoTWFyaykKLS0gZml4IHBhcmFtZXRlciBjaGVjayBpbiBkZWZsYXRlQ29weSAoR3VudGhlciBOaWtsKQotLSBjbGVhbnVwIHRyZWVzLmMsIHVzZSBjb21wcmVzc2VkX2xlbiBvbmx5IGluIGRlYnVnIG1vZGUgKENocmlzdGlhbiBTcGllbGVyKQotLSBNYW55IHBvcnRhYmlsaXR5IHBhdGNoZXMgYnkgQ2hyaXN0aWFuIFNwaWVsZXI6Ci0gIC4genV0aWwuYywgenV0aWwuaDogYWRkZWQgImNvbnN0IiBmb3Igem1lbSoKLSAgLiBNYWtlX3Ztcy5jb206IGZpeGVkIHNvbWUgdHlwb3MKLSAgLiBNYWtlX3Ztcy5jb206IG1zZG9zL01ha2VmaWxlLio6IHJlbW92ZWQgenV0aWwuaCBmcm9tIHNvbWUgZGVwZW5kZW5jeSBsaXN0cwotICAuIG1zZG9zL01ha2VmaWxlLm1zYzogcmVtb3ZlICJkZWZhdWx0IHJ0bCBsaW5rIGxpYnJhcnkiIGluZm8gZnJvbSBvYmogZmlsZXMKLSAgLiBtc2Rvcy9NYWtlZmlsZS4qOiB1c2UgbW9kZWwtZGVwZW5kZW50IG5hbWUgZm9yIHRoZSBidWlsdCB6bGliIGxpYnJhcnkKLSAgLiBtc2Rvcy9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZ2NjOgotICAgICBuZXcgbWFrZWZpbGVzLCBmb3IgZW14IChET1MvT1MyKSwgZW14JnJzeG50IGFuZCBtaW5ndzMyIChXaW5kb3dzIDl4IC8gTlQpCi0tIHVzZSBkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciBCeXRlZiBhbHNvIGZvciBNU0Mgc21hbGwvbWVkaXVtIChUb20gTGFuZSkKLS0gcmVwbGFjZSBfX2ZhciB3aXRoIF9mYXIgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAoQ2hyaXN0aWFuIFNwaWVsZXIsIFRvbSBMYW5lKQotLSBmaXggdGVzdCBmb3IgZXJybm8uaCBpbiBjb25maWd1cmUgKFRpbSBOZXdzaGFtKQotCi1DaGFuZ2VzIGluIDEuMS4yICgxOSBNYXJjaCA5OCkKLS0gYWRkZWQgY29udHJpYi9taW56aXAsIG1pbmkgemlwIGFuZCB1bnppcCBiYXNlZCBvbiB6bGliIChHaWxsZXMgVm9sbGFudCkKLSAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotLSBwcmVpbml0aWFsaXplIHRoZSBpbmZsYXRlIHRhYmxlcyBmb3IgZml4ZWQgY29kZXMsIHRvIG1ha2UgdGhlIGNvZGUKLSAgY29tcGxldGVseSB0aHJlYWQgc2FmZSAoTWFyaykKLS0gc29tZSBzaW1wbGlmaWNhdGlvbnMgYW5kIHNsaWdodCBzcGVlZC11cCB0byB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKQotLSBmaXggZ3plb2Ygb24gbm9uLWNvbXByZXNzZWQgZmlsZXMgKEFsbGFuIFNjaHJ1bSkKLS0gYWRkIC1zdGQxIG9wdGlvbiBpbiBjb25maWd1cmUgZm9yIE9TRjEgdG8gZml4IGd6cHJpbnRmIChNYXJ0aW4gTW9rcmVqcykKLS0gdXNlIGRlZmF1bHQgdmFsdWUgb2YgNEsgZm9yIFpfQlVGU0laRSBmb3IgMTYtYml0IE1TRE9TIChUaW0gV2VnbmVyICsgR2xlbm4pCi0tIGFkZGVkIG9zMi9NYWtlZmlsZS5kZWYgYW5kIG9zMi96bGliLmRlZiAoQW5kcmV3IFphYm9sb3RueSkKLS0gYWRkIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgVU5JWF9TVjQuMk1QIChNQVRTVVVSQSBUYWthbm9yaSkKLS0gZG8gbm90IHdyYXAgZXh0ZXJuICJDIiBhcm91bmQgc3lzdGVtIGluY2x1ZGVzIChUb20gTGFuZSkKLS0gbWVudGlvbiB6bGliIGJpbmRpbmcgZm9yIFRDTCBpbiBSRUFETUUgKEFuZHJlYXMgS3VwcmllcykKLS0gYWRkZWQgYW1pZ2EvTWFrZWZpbGUucHVwIGZvciBBbWlnYSBwb3dlclVQIFNBUy9DIFBQQyAoQW5kcmVhcyBLbGVpbmVydCkKLS0gYWxsb3cgIm1ha2UgaW5zdGFsbCBwcmVmaXg9Li4uIiBldmVuIGFmdGVyIGNvbmZpZ3VyZSAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSBhbGxvdyAiY29uZmlndXJlIC0tcHJlZml4ICRIT01FIiAoVGltIE1vb25leSkKLS0gcmVtb3ZlIHdhcm5pbmdzIGluIGV4YW1wbGUuYyBhbmQgZ3ppby5jIChHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0tIG1vdmUgTWFrZWZpbGUuc2FzIHRvIGFtaWdhL01ha2VmaWxlLnNhcwotCi1DaGFuZ2VzIGluIDEuMS4xICgyNyBGZWIgOTgpCi0tIGZpeCBtYWNyb3MgX3RyX3RhbGx5XyogaW4gZGVmbGF0ZS5oIGZvciBkZWJ1ZyBtb2RlICAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSByZW1vdmUgYmxvY2sgdHJ1bmNhdGlvbiBoZXVyaXN0aWMgd2hpY2ggaGFkIHZlcnkgbWFyZ2luYWwgZWZmZWN0IGZvciB6bGliCi0gIChzbWFsbGVyIGxpdF9idWZzaXplIHRoYW4gaW4gZ3ppcCAxLjIuNCkgYW5kIGRlZ3JhZGVkIGEgbGl0dGxlIHRoZQotICBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLiBUaGlzIGFsc28gYWxsb3dzIGlubGluaW5nIF90cl90YWxseSBmb3IKLSAgbWF0Y2hlcyBpbiBkZWZsYXRlX3Nsb3cuCi0tIGFkZGVkIG1zZG9zL01ha2VmaWxlLnczMiBmb3IgV0lOMzIgTWljcm9zb2Z0IFZpc3VhbCBDKysgKEJvYiBGcmF6aWVyKQotCi1DaGFuZ2VzIGluIDEuMS4wICgyNCBGZWIgOTgpCi0tIGRvIG5vdCByZXR1cm4gU1RSRUFNX0VORCBwcmVtYXR1cmVseSBpbiBpbmZsYXRlIChKb2huIEJvd2xlcikKLS0gcmV2ZXJ0IHRvIHRoZSB6bGliIDEuMC44IGluZmxhdGUgdG8gYXZvaWQgdGhlIGdjYyAyLjguMCBidWcgKEplcmVteSBCdWhsZXIpCi0tIGNvbXBpbGUgd2l0aCAtREZBU1RFU1QgdG8gZ2V0IGNvbXByZXNzaW9uIGNvZGUgb3B0aW1pemVkIGZvciBzcGVlZCBvbmx5Ci0tIGluIG1pbmlnemlwLCB0cnkgbW1hcCdpbmcgdGhlIGlucHV0IGZpbGUgZmlyc3QgKE1pZ3VlbCBBbGJyZWNodCkKLS0gaW5jcmVhc2Ugc2l6ZSBvZiBJL08gYnVmZmVycyBpbiBtaW5pZ3ppcC5jIGFuZCBnemlvLmMgKG5vdCBhIGJpZyBnYWluCi0gIG9uIFN1biBidXQgc2lnbmlmaWNhbnQgb24gSFApCi0KLS0gYWRkIGEgcG9pbnRlciB0byBleHBlcmltZW50YWwgdW56aXAgbGlicmFyeSBpbiBSRUFETUUgKEdpbGxlcyBWb2xsYW50KQotLSBpbml0aWFsaXplIHZhcmlhYmxlIGdjYyBpbiBjb25maWd1cmUgKENocmlzIEhlcmJvcnRoKQotCi1DaGFuZ2VzIGluIDEuMC45ICgxNyBGZWIgMTk5OCkKLS0gYWRkZWQgZ3pwdXRzIGFuZCBnemdldHMgZnVuY3Rpb25zCi0tIGRvIG5vdCBjbGVhciBlb2YgZmxhZyBpbiBnenNlZWsgKE1hcmsgRGlla2hhbnMpCi0tIGZpeCBnenNlZWsgZm9yIGZpbGVzIGluIHRyYW5zcGFyZW50IG1vZGUgKE1hcmsgRGlla2hhbnMpCi0tIGRvIG5vdCBhc3N1bWUgdGhhdCB2c3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoSmVucyBLcmlua2UpCi0tIHJlcGxhY2UgRVhQT1JUIHdpdGggWkVYUE9SVCB0byBhdm9pZCBjb25mbGljdCB3aXRoIG90aGVyIHByb2dyYW1zCi0tIGFkZGVkIGNvbXByZXNzMiBpbiB6Y29uZi5oLCB6bGliLmRlZiwgemxpYi5kbnQKLS0gbmV3IGFzbSBjb2RlIGZyb20gR2lsbGVzIFZvbGxhbnQgaW4gY29udHJpYi9hc20zODYKLS0gc2ltcGxpZnkgdGhlIGluZmxhdGUgY29kZSAoTWFyayk6Ci0gLiBSZXBsYWNlIFpBTExPQydzIGluIGh1ZnRfYnVpbGQoKSB3aXRoIHNpbmdsZSBaQUxMT0MgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3KCkKLSAuIFpBTExPQyB0aGUgbGVuZ3RoIGxpc3QgaW4gaW5mbGF0ZV90cmVlc19maXhlZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKLSAuIFpBTExPQyB0aGUgdmFsdWUgYXJlYSBmb3IgaHVmdF9idWlsZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKLSAuIFNpbXBsaWZ5IFpfRklOSVNIIGNoZWNrIGluIGluZmxhdGUoKQotCi0tIEF2b2lkIGdjYyAyLjguMCBjb21wYXJpc29uIGJ1ZyBhIGxpdHRsZSBkaWZmZXJlbnRseSB0aGFuIHpsaWIgMS4wLjgKLS0gaW4gaW5mdHJlZXMuYywgYXZvaWQgY2MgLU8gYnVnIG9uIEhQIChGYXJzaGlkIEVsYWhpKQotLSBpbiB6Y29uZi5oIG1vdmUgdGhlIFpMSUJfRExMIHN0dWZmIGVhcmxpZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAotICB0aGUgZGVjbGFyYXRpb24gb2YgRkFSIChHaWxsZXMgVk9sbGFudCkKLS0gaW5zdGFsbCBsaWJ6LnNvKiB3aXRoIG1vZGUgNzU1IChleGVjdXRhYmxlKSBpbnN0ZWFkIG9mIDY0NCAoTWFyYyBMZWhtYW5uKQotLSByZWFkX2J1ZiBidWYgcGFyYW1ldGVyIG9mIHR5cGUgQnl0ZWYqIGluc3RlYWQgb2YgY2hhcmYqCi0tIHptZW1jcHkgcGFyYW1ldGVycyBhcmUgb2YgdHlwZSBCeXRlZiosIG5vdCBjaGFyZiogKEpvc2VwaCBTdHJvdXQpCi0tIGRvIG5vdCByZWRlY2xhcmUgdW5saW5rIGluIG1pbmlnemlwLmMgZm9yIFdJTjMyIChKb2huIEJvd2xlcikKLS0gZml4IGNoZWNrIGZvciBwcmVzZW5jZSBvZiBkaXJlY3RvcmllcyBpbiAibWFrZSBpbnN0YWxsIiAoSWFuIFdpbGxpcykKLQotQ2hhbmdlcyBpbiAxLjAuOCAoMjcgSmFuIDE5OTgpCi0tIGZpeGVkIG9mZnNldHMgaW4gY29udHJpYi9hc20zODYvZ3ZtYXQzMi5hc20gKEdpbGxlcyBWb2xsYW50KQotLSBmaXggZ3pnZXRjIGFuZCBnenB1dGMgZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAoTWFya3VzIE9iZXJodW1lcikKLS0gYWRkZWQgY29tcHJlc3MyKCkgdG8gYWxsb3cgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLS0gaW5jbHVkZSBzeXMvdHlwZXMuaCB0byBnZXQgb2ZmX3Qgb24gc29tZSBzeXN0ZW1zIChNYXJjIExlaG1hbm4gJiBRaW5nTG9uZykKLS0gdXNlIGNvbnN0YW50IGFycmF5cyBmb3IgdGhlIHN0YXRpYyB0cmVlcyBpbiB0cmVlcy5jIGluc3RlYWQgb2YgY29tcHV0aW5nCi0gIHRoZW0gYXQgcnVuIHRpbWUgKHRoYW5rcyB0byBLZW4gUmFlYnVybiBmb3IgdGhpcyBzdWdnZXN0aW9uKS4gVG8gY3JlYXRlCi0gIHRyZWVzLmgsIGNvbXBpbGUgd2l0aCBHRU5fVFJFRVNfSCBhbmQgcnVuICJtYWtlIHRlc3QiLgotLSBjaGVjayByZXR1cm4gY29kZSBvZiBleGFtcGxlIGluICJtYWtlIHRlc3QiIGFuZCBkaXNwbGF5IHJlc3VsdAotLSBwYXNzIG1pbmlnemlwIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGZpbGVfY29tcHJlc3MKLS0gc2ltcGxpZnlpbmcgY29kZSBvZiBpbmZsYXRlU3luYyB0byBhdm9pZCBnY2MgMi44IGJ1ZwotCi0tIHN1cHBvcnQgQ0M9ImdjYyAtV2FsbCIgaW4gY29uZmlndXJlIC1zIChRaW5nTG9uZykKLS0gYXZvaWQgYSBmbHVzaCBjYXVzZWQgYnkgZnRlbGwgaW4gZ3pvcGVuIGZvciB3cml0ZSBtb2RlIChLZW4gUmFlYnVybikKLS0gZml4IHRlc3QgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLS0gemxpYi5saWIgLT4gemxpYi5kbGwgaW4gbXNkb3MvemxpYi5yYyAoR2lsbGVzIFZvbGxhbnQpCi0tIGNoZWNrIGZvciBUQVJHRVRfT1NfTUFDIGluIGFkZGl0aW9uIHRvIE1BQ09TIChCcmFkIFBldHRpdCkKLS0gZG8gbm90IHVzZSBmZG9wZW4gZm9yIE1ldHJvd2Vya3Mgb24gTWFjIChCcmFkIFBldHRpdCkpCi0tIGFkZCBjaGVja3MgZm9yIGd6cHV0YyBhbmQgZ3pwdXRjIGluIGV4YW1wbGUuYwotLSBhdm9pZCB3YXJuaW5ncyBpbiBnemlvLmMgYW5kIGRlZmxhdGUuYyAoQW5kcmVhcyBLbGVpbmVydCkKLS0gdXNlIGNvbnN0IGZvciB0aGUgQ1JDIHRhYmxlIChLZW4gUmFlYnVybikKLS0gZml4ZWQgIm1ha2UgdW5pbnN0YWxsIiBmb3Igc2hhcmVkIGxpYnJhcmllcwotLSB1c2UgVHJhY2V2IGluc3RlYWQgb2YgVHJhY2UgaW4gaW5mYmxvY2suYwotLSBpbiBleGFtcGxlLmMgdXNlIGNvcnJlY3QgY29tcHJlc3NlZCBsZW5ndGggZm9yIHRlc3Rfc3luYwotLSBzdXBwcmVzcyArdm5vY29tcGF0d2FybmluZ3MgaW4gY29uZmlndXJlIGZvciBIUFVYIChub3QgYWx3YXlzIHN1cHBvcnRlZCkKLQotQ2hhbmdlcyBpbiAxLjAuNyAoMjAgSmFuIDE5OTgpCi0tIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCi0tIHJldHVybiBlcnJvciBmb3IgZ3pzZWVrIHRvIG5lZ2F0aXZlIGFic29sdXRlIHBvc2l0aW9uCi0tIGZpeCBjb25maWd1cmUgZm9yIExpbnV4IChDaHVuLUNodW5nIENoZW4pCi0tIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCi0tIGdldF9jcmNfdGFibGUgYW5kIGluZmxhdGVTeW5jUG9pbnQgYXJlIEVYUE9SVGVkIChHaWxsZXMgVm9sbGFudCkKLS0gZGVmaW5lIEVYUE9SVFZBIGZvciBnenByaW50ZiAoR2lsbGVzIFZvbGxhbnQpCi0tIGFkZGVkIG1hbiBwYWdlIHpsaWIuMyAoUmljayBSb2RnZXJzKQotLSBmb3IgY29udHJpYi91bnRneiwgZml4IG1ha2VkaXIoKSBhbmQgaW1wcm92ZSBNYWtlZmlsZQotCi0tIGNoZWNrIGd6c2VlayBpbiB3cml0ZSBtb2RlIGluIGV4YW1wbGUuYwotLSBhbGxvY2F0ZSBleHRyYSBidWZmZXIgZm9yIHNlZWtzIG9ubHkgaWYgZ3pzZWVrIGlzIGFjdHVhbGx5IGNhbGxlZAotLSBhdm9pZCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbnMgKFRpbSBXZWduZXIsIEdpbGxlcyBWb2xsYW50KQotLSBhZGQgaW5mbGF0ZVN5bmNQb2ludCBpbiB6Y29uZi5oCi0tIGZpeCBsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBudC96bGliLmRudCBhbmQgbWRzb3MvemxpYi5kZWYKLQotQ2hhbmdlcyBpbiAxLjAuNiAoMTkgSmFuIDE5OTgpCi0tIGFkZCBmdW5jdGlvbnMgZ3pwcmludGYsIGd6cHV0YywgZ3pnZXRjLCBnenRlbGwsIGd6ZW9mLCBnenNlZWssIGd6cmV3aW5kIGFuZAotICBnenNldHBhcmFtcyAodGhhbmtzIHRvIFJvbGFuZCBHaWVyc2lnIGFuZCBLZXZpbiBSdWxhbmQgZm9yIHNvbWUgb2YgdGhpcyBjb2RlKQotLSBGaXggYSBkZWZsYXRlIGJ1ZyBvY2N1cmluZyBvbmx5IHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMCAodGhhbmtzIHRvCi0gIEFuZHkgQnVja2xlciBmb3IgZmluZGluZyB0aGlzIG9uZSkuCi0tIEluIG1pbmlnemlwLCBwYXNzIHRyYW5zcGFyZW50bHkgYWxzbyB0aGUgZmlyc3QgYnl0ZSBmb3IgLlogZmlsZXMuCi0tIHJldHVybiBaX0JVRl9FUlJPUiBpbnN0ZWFkIG9mIFpfT0sgaWYgb3V0cHV0IGJ1ZmZlciBmdWxsIGluIHVuY29tcHJlc3MoKQotLSBjaGVjayBaX0ZJTklTSCBpbiBpbmZsYXRlICh0aGFua3MgdG8gTWFyYyBTY2hsdXBlcikKLS0gSW1wbGVtZW50IGRlZmxhdGVDb3B5ICh0aGFua3MgdG8gQWRhbSBDb3N0ZWxsbykKLS0gbWFrZSBzdGF0aWMgbGlicmFyaWVzIGJ5IGRlZmF1bHQgaW4gY29uZmlndXJlLCBhZGQgLS1zaGFyZWQgb3B0aW9uLgotLSBtb3ZlIE1TRE9TIG9yIFdpbmRvd3Mgc3BlY2lmaWMgZmlsZXMgdG8gZGlyZWN0b3J5IG1zZG9zCi0tIHN1cHByZXNzIHRoZSBub3Rpb24gb2YgcGFydGlhbCBmbHVzaCB0byBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlCi0gIChidXQgdGhlIHN5bWJvbCBaX1BBUlRJQUxfRkxVU0ggaXMga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMC40KQotLSBzdXBwcmVzcyBoaXN0b3J5IGJ1ZmZlciBwcm92aWRlZCBieSBhcHBsaWNhdGlvbiB0byBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlCi0gICh0aGlzIGZlYXR1cmUgd2FzIG5vdCBpbXBsZW1lbnRlZCBhbnl3YXkgaW4gMS4wLjQpCi0tIG5leHRfaW4gYW5kIGF2YWlsX2luIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaW5mbGF0ZUluaXQgb3IKLSAgaW5mbGF0ZUluaXQyCi0tIGFkZCBFWFBPUlQgaW4gYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyAoZm9yIFdpbmRvd3MgRExMKQotLSBhZGRlZCBNYWtlZmlsZS5udCAodGhhbmtzIHRvIFN0ZXBoZW4gV2lsbGlhbXMpCi0tIGFkZGVkIHRoZSB1bnN1cHBvcnRlZCAiY29udHJpYiIgZGlyZWN0b3J5OgotICAgY29udHJpYi9hc20zODYvIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KLQkzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4KLSAgIGNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgotICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucwotICAgY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgotCUFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQotICAgY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgotCUEgdmVyeSBzaW1wbGUgdGFyLmd6IGZpbGUgZXh0cmFjdG9yIHVzaW5nIHpsaWIKLSAgIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBieSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPgotICAgICAgICBIb3cgdG8gdXNlIGNvbXByZXNzKCksIHVuY29tcHJlc3MoKSBhbmQgdGhlIGd6KiBmdW5jdGlvbnMgZnJvbSBWQi4KLS0gcGFzcyBwYXJhbXMgLWYgKGZpbHRlcmVkIGRhdGEpLCAtaCAoaHVmZm1hbiBvbmx5KSwgLTEgdG8gLTkgKGNvbXByZXNzaW9uCi0gIGxldmVsKSBpbiBtaW5pZ3ppcCAodGhhbmtzIHRvIFRvbSBMYW5lKQotCi0tIHVzZSBjb25zdCBmb3Igcm9tbWFibGUgY29uc3RhbnRzIGluIGRlZmxhdGUKLS0gYWRkZWQgdGVzdCBmb3IgZ3pzZWVrIGFuZCBnenRlbGwgaW4gZXhhbXBsZS5jCi0tIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gaW5mbGF0ZVN5bmNQb2ludCgpIChoYWNrIGZvciBQYXVsIE1hY2tlcnJhcykKLS0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiB6RXJyb3IgdG8gY29udmVydCBlcnJvciBjb2RlIHRvIHN0cmluZwotICAoZm9yIFRpbSBTbWl0aGVycykKLS0gQWxsb3cgY29tcGlsYXRpb24gb2YgZ3ppbyB3aXRoIC1ETk9fREVGTEFURSB0byBhdm9pZCB0aGUgY29tcHJlc3Npb24gY29kZS4KLS0gVXNlIGRlZmF1bHQgbWVtY3B5IGZvciBTeW1hbnRlYyBNU0RPUyBjb21waWxlci4KLS0gQWRkIEVYUE9SVCBrZXl3b3JkIGZvciBjaGVja19mdW5jIChuZWVkZWQgZm9yIFdpbmRvd3MgRExMKQotLSBhZGQgY3VycmVudCBkaXJlY3RvcnkgdG8gTERfTElCUkFSWV9QQVRIIGZvciAibWFrZSB0ZXN0IgotLSBjcmVhdGUgYWxzbyBhIGxpbmsgZm9yIGxpYnouc28uMQotLSBhZGRlZCBzdXBwb3J0IGZvciBGVUpJVFNVIFVYUC9EUyAodGhhbmtzIHRvIFRvc2hpYWtpIE5vbXVyYSkKLS0gdXNlICQoU0hBUkVETElCKSBpbnN0ZWFkIG9mIGxpYnouc28gaW4gTWFrZWZpbGUuaW4gKGZvciBIUFVYKQotLSBhZGRlZCAtc29uYW1lIGZvciBMaW51eCBpbiBjb25maWd1cmUgKENodW4tQ2h1bmcgQ2hlbiwKLS0gYXNzaWduIG51bWJlcnMgdG8gdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiB6bGliLmRlZiAoZm9yIFdpbmRvd3MgRExMKQotLSBhZGQgYWR2aWNlIGluIHpsaWIuaCBmb3IgYmVzdCB1c2FnZSBvZiBkZWZsYXRlU2V0RGljdGlvbmFyeQotLSB3b3JrIGFyb3VuZCBjb21waWxlciBidWcgb24gQXRhcmkgKGNhc3QgWl9OVUxMIGluIGNhbGwgb2Ygcy0+Y2hlY2tmbikKLS0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCBmb3IgVHVyYm9DIGluIGxhcmdlIG1vZGVsCi0tIGF2b2lkICJ2ZXJzaW9uU3RyaW5nIlswXSAoQm9ybGFuZCBidWcpCi0tIGFkZCBORUVEX0RVTU1ZX1JFVFVSTiBmb3IgQm9ybGFuZAotLSB1c2UgdmFyaWFibGUgel92ZXJib3NlIGZvciB0cmFjaW5nIGluIGRlYnVnIG1vZGUgKEwuIFBldGVyIERldXRzY2gpLgotLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIENDCi0tIGRlZmluZWQgU1REQyBmb3IgT1MvMiAoRGF2aWQgQ2hhcmxhcCkJCi0tIGxpbWl0IGV4dGVybmFsIG5hbWVzIHRvIDggY2hhcnMgZm9yIE1WUyAoVGhvbWFzIEx1bmQpCi0tIGluIG1pbmlnemlwLmMsIHVzZSBzdGF0aWMgYnVmZmVycyBvbmx5IGZvciAxNi1iaXQgc3lzdGVtcwotLSBmaXggc3VmZml4IGNoZWNrIGZvciAibWluaWd6aXAgLWQgZm9vLmd6IgotLSBkbyBub3QgcmV0dXJuIGFuIGVycm9yIGZvciB0aGUgMm5kIG9mIHR3byBjb25zZWN1dGl2ZSBnemZsdXNoKCkgKEZlbGl4IExlZSkKLS0gdXNlIF9mZG9wZW4gaW5zdGVhZCBvZiBmZG9wZW4gZm9yIE1TQyA+PSA2LjAgKFRob21hcyBGYW5zbGF1KQotLSBhZGRlZCBtYWtlbGNjLmJhdCBmb3IgbGNjLXdpbjMyIChUb20gU3QgRGVuaXMpCi0tIGluIE1ha2VmaWxlLmRqMiwgdXNlIGNvcHkgYW5kIGRlbCBpbnN0ZWFkIG9mIGluc3RhbGwgYW5kIHJtIChGcmFuayBEb25haG9lKQotLSBBdm9pZCBleHBhbmRlZCAkSWQ6IENoYW5nZUxvZyx2IDEuMSAyMDA0LzEwLzA4IDA5OjQ0OjIwIGNvbnN0X2sgRXhwICQuIFVzZSAicmNzIC1rYiIgb3IgImN2cyBhZG1pbiAta2IiIHRvIGF2b2lkIElkIGV4cGFuc2lvbi4KLS0gY2hlY2sgZm9yIHVuaXN0ZC5oIGluIGNvbmZpZ3VyZSAoZm9yIG9mZl90KQotLSByZW1vdmUgdXNlbGVzcyBjaGVjayBwYXJhbWV0ZXIgaW4gaW5mbGF0ZV9ibG9ja3NfZnJlZQotLSBhdm9pZCB1c2VsZXNzIGFzc2lnbm1lbnQgb2Ygcy0+Y2hlY2sgdG8gaXRzZWxmIGluIGluZmxhdGVfYmxvY2tzX25ldwotLSBkbyBub3QgZmx1c2ggdHdpY2UgaW4gZ3pjbG9zZSAodGhhbmtzIHRvIEtlbiBSYWVidXJuKQotLSByZW5hbWUgRk9QRU4gYXMgRl9PUEVOIHRvIGF2b2lkIGNsYXNoIHdpdGggL3Vzci9pbmNsdWRlL3N5cy9maWxlLmgKLS0gdXNlIE5PX0VSUk5PX0ggaW5zdGVhZCBvZiBlbnVtZXJhdGlvbiBvZiBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIGVycm5vLmgKLS0gd29yayBhcm91bmQgYnVnZ3kgZmNsb3NlIG9uIHBpcGVzIGZvciBIUC9VWAotLSBzdXBwb3J0IHpsaWIgRExMIHdpdGggQk9STEFORCBDKysgNS4wICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQotLSBmaXggY29uZmlndXJlIGlmIENDIGlzIGFscmVhZHkgZXF1YWwgdG8gZ2NjCi0KLUNoYW5nZXMgaW4gMS4wLjUgKDMgSmFuIDk4KQotLSBGaXggaW5mbGF0ZSB0byB0ZXJtaW5hdGUgZ3JhY2VmdWxseSB3aGVuIGZlZCBjb3JydXB0ZWQgb3IgaW52YWxpZCBkYXRhCi0tIFVzZSBjb25zdCBmb3Igcm9tbWFibGUgY29uc3RhbnRzIGluIGluZmxhdGUKLS0gRWxpbWluYXRlIG1lbW9yeSBsZWFrcyBvbiBlcnJvciBjb25kaXRpb25zIGluIGluZmxhdGUKLS0gUmVtb3ZlZCBzb21lIHZlc3RpZ2lhbCBjb2RlIGluIGluZmxhdGUKLS0gVXBkYXRlIHdlYiBhZGRyZXNzIGluIFJFQURNRQotICAKLUNoYW5nZXMgaW4gMS4wLjQgKDI0IEp1bCA5NikKLS0gSW4gdmVyeSByYXJlIGNvbmRpdGlvbnMsIGRlZmxhdGUocywgWl9GSU5JU0gpIGNvdWxkIGZhaWwgdG8gcHJvZHVjZSBhbiBFT0YKLSAgYml0LCBzbyB0aGUgZGVjb21wcmVzc29yIGNvdWxkIGRlY29tcHJlc3MgYWxsIHRoZSBjb3JyZWN0IGRhdGEgYnV0IHdlbnQKLSAgb24gdG8gYXR0ZW1wdCBkZWNvbXByZXNzaW5nIGV4dHJhIGdhcmJhZ2UgZGF0YS4gVGhpcyBhZmZlY3RlZCBtaW5pZ3ppcCB0b28uCi0tIHpsaWJWZXJzaW9uIGFuZCBnemVycm9yIHJldHVybiBjb25zdCBjaGFyKiAobmVlZGVkIGZvciBETEwpCi0tIHBvcnQgdG8gUklTQ09TIChubyBmZG9wZW4sIG5vIG11bHRpcGxlIGRvdHMsIG5vIHVubGluaywgbm8gZmlsZW5vKQotLSB1c2Ugel9lcnJvciBvbmx5IGZvciBERUJVRyAoYXZvaWQgcHJvYmxlbSB3aXRoIERMTHMpCi0KLUNoYW5nZXMgaW4gMS4wLjMgKDIgSnVsIDk2KQotLSB1c2Ugel9zdHJlYW1wIGluc3RlYWQgb2Ygel9zdHJlYW0gKiwgd2hpY2ggaXMgbm93IGEgZmFyIHBvaW50ZXIgaW4gTVNET1MKLSAgc21hbGwgYW5kIG1lZGl1bSBtb2RlbHM7IHRoaXMgbWFrZXMgdGhlIGxpYnJhcnkgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMKLSAgdmVyc2lvbnMgZm9yIHRoZXNlIG1vZGVscy4gKE5vIGVmZmVjdCBpbiBsYXJnZSBtb2RlbCBvciBvbiBvdGhlciBzeXN0ZW1zLikKLS0gcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGlmIHByZXZpb3VzIGRlZmxhdGUgY2FsbCByZXR1cm5lZCB3aXRoCi0gIGF2YWlsX291dCBhcyB6ZXJvIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0tIGFkZGVkIG1lbWNtcCBmb3Igbm9uIFNUREMgY29tcGlsZXJzCi0tIGRlZmluZSBOT19EVU1NWV9ERUNMIGZvciBtb3JlIE1hYyBjb21waWxlcnMgKC5oIGZpbGVzIG1lcmdlZCBpbmNvcnJlY3RseSkKLS0gZGVmaW5lIF9fMzJCSVRfXyBpZiBfXzM4Nl9fIG9yIGkzODYgaXMgZGVmaW5lZCAocGIuIHdpdGggV2F0Y29tIGFuZCBTQ08pCi0tIGJldHRlciBjaGVjayBmb3IgMTYtYml0IG1vZGUgTVNDIChhdm9pZHMgcHJvYmxlbSB3aXRoIFN5bWFudGVjKQotCi1DaGFuZ2VzIGluIDEuMC4yICgyMyBNYXkgOTYpCi0tIGFkZGVkIFdpbmRvd3MgRExMIHN1cHBvcnQKLS0gYWRkZWQgYSBmdW5jdGlvbiB6bGliVmVyc2lvbiAoZm9yIHRoZSBETEwgc3VwcG9ydCkKLS0gZml4ZWQgZGVjbGFyYXRpb25zIHVzaW5nIEJ5dGVmIGluIGluZnV0aWwuYyAocGIgd2l0aCBNU0RPUyBtZWRpdW0gbW9kZWwpCi0tIEJ5dGVmIGlzIGRlZmluZSdzIGluc3RlYWQgb2YgdHlwZWRlZidkIG9ubHkgZm9yIEJvcmxhbmQgQwotLSBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGV4YW1wbGUuYwotLSBtZW50aW9uIGluIFJFQURNRSB0aGF0IHRoZSB6bGliIGZvcm1hdCBpcyBub3cgUkZDMTk1MAotLSB1cGRhdGVkIE1ha2VmaWxlLmRqMgotLSBhZGRlZCBhbGdvcml0aG0uZG9jCi0KLUNoYW5nZXMgaW4gMS4wLjEgKDIwIE1heSA5NikgWzEuMCBza2lwcGVkIHRvIGF2b2lkIGNvbmZ1c2lvbl0KLS0gZml4IGFycmF5IG92ZXJsYXkgaW4gZGVmbGF0ZS5jIHdoaWNoIHNvbWV0aW1lcyBjYXVzZWQgYmFkIGNvbXByZXNzZWQgZGF0YQotLSBmaXggaW5mbGF0ZSBidWcgd2l0aCBlbXB0eSBzdG9yZWQgYmxvY2sKLS0gZml4IE1TRE9TIG1lZGl1bSBtb2RlbCB3aGljaCB3YXMgYnJva2VuIGluIDAuOTkKLS0gZml4IGRlZmxhdGVQYXJhbXMoKSB3aGljaCBjb3VsZCBnZW5lcmF0ZWQgYmFkIGNvbXByZXNzZWQgZGF0YS4KLS0gQnl0ZWYgaXMgZGVmaW5lJ2QgaW5zdGVhZCBvZiB0eXBlZGVmJ2VkICh3b3JrIGFyb3VuZCBCb3JsYW5kIGJ1ZykKLS0gYWRkZWQgYW4gSU5ERVggZmlsZQotLSBuZXcgbWFrZWZpbGVzIGZvciBESkdQUCAoTWFrZWZpbGUuZGoyKSwgMzItYml0IEJvcmxhbmQgKE1ha2VmaWxlLmIzMiksCi0gIFdhdGNvbSAoTWFrZWZpbGUud2F0KSwgQW1pZ2EgU0FTL0MgKE1ha2VmaWxlLnNhcykKLS0gc3BlZWQgdXAgYWRsZXIzMiBmb3IgbW9kZXJuIG1hY2hpbmVzIHdpdGhvdXQgYXV0by1pbmNyZW1lbnQKLS0gYWRkZWQgLWFuc2kgZm9yIElSSVggaW4gY29uZmlndXJlCi0tIHN0YXRpY19pbml0X2RvbmUgaW4gdHJlZXMuYyBpcyBhbiBpbnQKLS0gZGVmaW5lIHVubGluayBhcyBkZWxldGUgZm9yIFZNUwotLSBmaXggY29uZmlndXJlIGZvciBRTlgKLS0gYWRkIGNvbmZpZ3VyZSBicmFuY2ggZm9yIFNDTyBhbmQgSFBVWAotLSBhdm9pZCBtYW55IHdhcm5pbmdzICh1bnVzZWQgdmFyaWFibGVzLCBkZWFkIGFzc2lnbm1lbnRzLCBldGMuLi4pCi0tIG5vIGZkb3BlbiBmb3IgQmVPUwotLSBmaXggdGhlIFdhdGNvbSBmaXggZm9yIDMyIGJpdCBtb2RlIChkZWZpbmUgRkFSIGFzIGVtcHR5KQotLSByZW1vdmVkIHJlZGVmaW5pdGlvbiBvZiBCeXRlIGZvciBNS1dFUktTCi0tIHdvcmsgYXJvdW5kIGFuIE1XS0VSS1MgYnVnIChpbmNvcnJlY3QgbWVyZ2Ugb2YgYWxsIC5oIGZpbGVzKQotCi1DaGFuZ2VzIGluIDAuOTkgKDI3IEphbiA5NikKLS0gYWxsb3cgcHJlc2V0IGRpY3Rpb25hcnkgc2hhcmVkIGJldHdlZW4gY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yCi0tIGFsbG93IGNvbXByZXNzaW9uIGxldmVsIDAgKG5vIGNvbXByZXNzaW9uKQotLSBhZGQgZGVmbGF0ZVBhcmFtcyBpbiB6bGliLmg6IGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCi0gIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4KLS0gdGVzdCBsYXJnZSBidWZmZXJzIGFuZCBkZWZsYXRlUGFyYW1zIGluIGV4YW1wbGUuYwotLSBhZGQgb3B0aW9uYWwgImNvbmZpZ3VyZSIgdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5Ci0tIHN1cHByZXNzIE1ha2VmaWxlLnFueCwgdXNlIGNvbmZpZ3VyZSBpbnN0ZWFkCi0tIGZpeGVkIGRlZmxhdGUgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBDcmF5KQotLSBmaXhlZCBpbmZsYXRlX2Jsb2NrcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIEFscGhhKQotLSBkZWNsYXJlIFpfREVGTEFURUQgaW4gemxpYi5oIChwb3NzaWJsZSBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0MikKLS0gYWx3YXlzIHJldHVybiBaX0JVRl9FUlJPUiB3aGVuIGRlZmxhdGUoKSBoYXMgbm90aGluZyB0byBkbwotLSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG5vdyBtYWNyb3MgdG8gYWxsb3cgdmVyc2lvbiBjaGVja2luZwotLSBwcmVmaXggYWxsIGdsb2JhbCBmdW5jdGlvbnMgYW5kIHR5cGVzIHdpdGggel8gd2l0aCAtRFpfUFJFRklYCi0tIG1ha2UgZmFsbG9jIGNvbXBsZXRlbHkgcmVlbnRyYW50IChpbmZ0cmVlcy5jKQotLSBmaXhlZCB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIGN0X3N0YXRpY19pbml0Ci0tIGZyZWUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uIHRvIGhlbHAgbWVtb3J5IG1hbmFnZXIKLS0gdXNlIHpsaWItMS4wLyogaW5zdGVhZCBvZiB6bGliLyogaW5zaWRlIHRoZSB0YXIuZ3oKLS0gbWFrZSB6bGliIHdhcm5pbmctZnJlZSB3aXRoICJnY2MgLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGgKLSAgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiCi0tIGFsbG93IGd6cmVhZCBvbiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzCi0tIGRlZmxhdGVFbmQgbm93IHJldHVybnMgWl9EQVRBX0VSUk9SIGlmIGl0IHdhcyBwcmVtYXR1cmUKLS0gZGVmbGF0ZSBpcyBmaW5hbGx5ICg/KSBmdWxseSBkZXRlcm1pbmlzdGljIChubyBtYXRjaGVzIGJleW9uZCBlbmQgb2YgaW5wdXQpCi0tIERvY3VtZW50IFpfU1lOQ19GTFVTSAotLSBhZGQgdW5pbnN0YWxsIGluIE1ha2VmaWxlCi0tIENoZWNrIGZvciBfX2NwbHVwbHVzIGluIHpsaWIuaAotLSBCZXR0ZXIgdGVzdCBpbiBjdF9hbGlnbiBmb3IgcGFydGlhbCBmbHVzaAotLSBhdm9pZCBoYXJtbGVzcyB3YXJuaW5ncyBmb3IgQm9ybGFuZCBDKysKLS0gaW5pdGlhbGl6ZSBoYXNoX2hlYWQgaW4gZGVmbGF0ZS5jCi0tIGF2b2lkIHdhcm5pbmcgb24gZmRvcGVuIChnemlvLmMpIGZvciBIUCBjYyAtQWEKLS0gaW5jbHVkZSBzdGRsaWIuaCBmb3IgU1REQyBjb21waWxlcnMKLS0gaW5jbHVkZSBlcnJuby5oIGZvciBDcmF5Ci0tIGlnbm9yZSBlcnJvciBpZiByYW5saWIgZG9lc24ndCBleGlzdAotLSBjYWxsIHJhbmxpYiB0d2ljZSBmb3IgTmVYVFNURVAKLS0gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YgcHJlZml4IGZvciBsaWJ6LmEKLS0gcmVuYW1lZCBjdF8qIGFzIF90cl8qIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYXBwbGljYXRpb25zCi0tIGNsZWFyIHotPm1zZyBpbiBpbmZsYXRlSW5pdDIgYmVmb3JlIGFueSBlcnJvciByZXR1cm4KLS0gaW5pdGlhbGl6ZSBvcGFxdWUgaW4gZXhhbXBsZS5jLCBnemlvLmMsIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jCi0tIGZpeGVkIHR5cG8gaW4gemNvbmYuaCAoX0dOVUNfXyA9PiBfX0dOVUNfXykKLS0gY2hlY2sgZm9yIFdJTjMyIGluIHpjb25mLmggYW5kIHp1dGlsLmMgKGF2b2lkIGZhcm1hbGxvYyBpbiAzMi1iaXQgbW9kZSkKLS0gZml4IHR5cG8gaW4gTWFrZV92bXMuY29tIChmJHRybmxubSAtPiBmJGdldHN5aSkKLS0gaW4gZmNhbGxvYywgbm9ybWFsaXplIHBvaW50ZXIgaWYgc2l6ZSA+IDY1NTIwIGJ5dGVzCi0tIGRvbid0IHVzZSBzcGVjaWFsIGZjYWxsb2MgZm9yIDMyIGJpdCBCb3JsYW5kIEMrKwotLSB1c2UgU1REQyBpbnN0ZWFkIG9mIF9fR08zMl9fIHRvIGF2b2lkIHJlZGVjbGFyaW5nIGV4aXQsIGNhbGxvYywgZXRjLi4uCi0tIHVzZSBaX0JJTkFSWSBpbnN0ZWFkIG9mIEJJTkFSWQotLSBkb2N1bWVudCB0aGF0IGd6Y2xvc2UgYWZ0ZXIgZ3pkb3BlbiB3aWxsIGNsb3NlIHRoZSBmaWxlCi0tIGFsbG93ICJhIiBhcyBtb2RlIGluIGd6b3Blbi4KLS0gZml4IGVycm9yIGNoZWNraW5nIGluIGd6cmVhZAotLSBhbGxvdyBza2lwcGluZyAuZ3ogZXh0cmEtZmllbGQgb24gcGlwZXMKLS0gYWRkZWQgcmVmZXJlbmNlIHRvIFBlcmwgaW50ZXJmYWNlIGluIFJFQURNRQotLSBwdXQgdGhlIGNyYyB0YWJsZSBpbiBGQVIgZGF0YSAoSSBkaXNsaWtlIG1vcmUgYW5kIG1vcmUgdGhlIG1lZGl1bSBtb2RlbCA6KQotLSBhZGRlZCBnZXRfY3JjX3RhYmxlCi0tIGFkZGVkIGEgZGltZW5zaW9uIHRvIGFsbCBhcnJheXMgKEJvcmxhbmQgQyBjYW4ndCBjb3VudCkuCi0tIHdvcmthcm91bmQgQm9ybGFuZCBDIGJ1ZyBpbiBkZWNsYXJhdGlvbiBvZiBpbmZsYXRlX2NvZGVzX25ldyAmIGluZmxhdGVfZmFzdAotLSBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiBvZiAqLmggKGZvciBwcmVjb21waWxlZCBoZWFkZXIgb24gTWFjKQotLSBXYXRjb20gQyBwcmV0ZW5kcyB0byBiZSBNaWNyb3NvZnQgQyBzbWFsbCBtb2RlbCBldmVuIGluIDMyIGJpdCBtb2RlLgotLSBkb24ndCB1c2UgdW5zaXplZCBhcnJheXMgdG8gYXZvaWQgc2lsbHkgd2FybmluZ3MgYnkgVmlzdWFsIEMrKzoKLSAgICAgd2FybmluZyBDNDc0NjogJ2luZmxhdGVfbWFzaycgOiB1bnNpemVkIGFycmF5IHRyZWF0ZWQgYXMgICdfX2ZhcicKLSAgICAgKHdoYXQncyB3cm9uZyB3aXRoIGZhciBkYXRhIGluIGZhciBtb2RlbD8pLgotLSBkZWZpbmUgZW51bSBvdXQgb2YgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDKysKLQotQ2hhbmdlcyBpbiAwLjk1ICgxNiBBdWcgOTUpCi0tIGZpeCBNU0RPUyBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIChub3cgZWFzaWVyIHRvIGFkYXB0IHRvIGFueSBjb21waWxlcikKLS0gaW5saW5lZCBzZW5kX2JpdHMKLS0gZml4IHRoZSBmaW5hbCAoOi0pIGJ1ZyBmb3IgZGVmbGF0ZSB3aXRoIGZsdXNoIChvdXRwdXQgd2FzIGNvcnJlY3QgYnV0Ci0gIG5vdCBjb21wbGV0ZWx5IGZsdXNoZWQgaW4gcmFyZSBvY2Nhc2lvbnMpLgotLSBkZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNhbWUgZm9yIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi0gIChpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHNldCBNQVhfV0JJVFMgaW4gemNvbmYuaCkuCi0tIHZvaWRwIC0+IHZvaWRwZiBhbmQgdm9pZG5wIC0+IHZvaWRwIChmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlcgotICB0eXBlZGVmcyBhbmQgYmVjYXVzZSB2b2lkbnAgd2FzIG5vdCBuZWFyIGluIGxhcmdlIG1vZGVsKS4KLQotQ2hhbmdlcyBpbiAwLjk0ICgxMyBBdWcgOTUpCi0tIHN1cHBvcnQgTVNET1MgbWVkaXVtIG1vZGVsCi0tIGZpeCBkZWZsYXRlIHdpdGggZmx1c2ggKGNvdWxkIHNvbWV0aW1lcyBnZW5lcmF0ZSBiYWQgb3V0cHV0KQotLSBmaXggZGVmbGF0ZVJlc2V0ICh6bGliIGhlYWRlciB3YXMgaW5jb3JyZWN0bHkgc3VwcHJlc3NlZCkKLS0gYWRkZWQgc3VwcG9ydCBmb3IgVk1TCi0tIGFsbG93IGEgY29tcHJlc3Npb24gbGV2ZWwgaW4gZ3pvcGVuKCkKLS0gZ3pmbHVzaCBub3cgY2FsbHMgZmZsdXNoCi0tIEZvciBkZWZsYXRlIHdpdGggZmx1c2gsIGZsdXNoIGV2ZW4gaWYgbm8gbW9yZSBpbnB1dCBpcyBwcm92aWRlZC4KLS0gcmVuYW1lIGxpYmd6LmEgYXMgbGliei5hCi0tIGF2b2lkIGNvbXBsZXggZXhwcmVzc2lvbiBpbiBpbmZjb2Rlcy5jIHRyaWdnZXJpbmcgVHVyYm8gQyBidWcKLS0gd29yayBhcm91bmQgYSBwcm9ibGVtIHdpdGggZ2NjIG9uIEFscGhhIChpbiBJTlNFUlRfU1RSSU5HKQotLSBkb24ndCB1c2UgaW5saW5lIGZ1bmN0aW9ucyAocHJvYmxlbSB3aXRoIHNvbWUgZ2NjIHZlcnNpb25zKQotLSBhbGxvdyByZW5hbWluZyBvZiBCeXRlLCB1SW50LCBldGMuLi4gd2l0aCAjZGVmaW5lLgotLSBhdm9pZCB3YXJuaW5nIGFib3V0ICh1bnVzZWQpIHBvaW50ZXIgYmVmb3JlIHN0YXJ0IG9mIGFycmF5IGluIGRlZmxhdGUuYwotLSBhdm9pZCB2YXJpb3VzIHdhcm5pbmdzIGluIGd6aW8uYywgZXhhbXBsZS5jLCBpbmZibG9jay5jLCBhZGxlcjMyLmMsIHp1dGlsLmMKLS0gYXZvaWQgcmVzZXJ2ZWQgd29yZCAnbmV3JyBpbiB0cmVlcy5jCi0KLUNoYW5nZXMgaW4gMC45MyAoMjUgSnVuZSA5NSkKLS0gdGVtcG9yYXJpbHkgZGlzYWJsZSBpbmxpbmUgZnVuY3Rpb25zCi0tIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljCi0tIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgUEFSVElBTF9GTFVTSAotLSBTZXQgYmluYXJ5IG1vZGUgZm9yIHN0ZGluL3N0ZG91dCBpbiBtaW5pZ3ppcC5jIGZvciBPUy8yCi0tIGRvbid0IGV2ZW4gdXNlIHNpZ25lZCBjaGFyIGluIGluZmxhdGUgKG5vdCBwb3J0YWJsZSBlbm91Z2gpCi0tIGZpeCBpbmZsYXRlIG1lbW9yeSBsZWFrIGZvciBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcwotCi1DaGFuZ2VzIGluIDAuOTIgKDMgTWF5IDk1KQotLSBkb24ndCBhc3N1bWUgdGhhdCBjaGFyIGlzIHNpZ25lZCAocHJvYmxlbSBvbiBTR0kpCi0tIENsZWFyIGJpdCBidWZmZXIgd2hlbiBzdGFydGluZyBhIHN0b3JlZCBibG9jawotLSBubyBtZW1jcHkgb24gUHlyYW1pZAotLSBzdXBwcmVzc2VkIGluZnRlc3QuYwotLSBvcHRpbWl6ZWQgZmlsbF93aW5kb3csIHB1dCBsb25nZXN0X21hdGNoIGlubGluZSBmb3IgZ2NjCi0tIG9wdGltaXplZCBpbmZsYXRlIG9uIHN0b3JlZCBibG9ja3MuCi0tIHVudGFiaWZ5IGFsbCBzb3VyY2VzIHRvIHNpbXBsaWZ5IHBhdGNoZXMKLQotQ2hhbmdlcyBpbiAwLjkxICgyIE1heSA5NSkKLS0gRGVmYXVsdCBNRU1fTEVWRUwgaXMgOCAobm90IDkgZm9yIFVuaXgpIGFzIGRvY3VtZW50ZWQgaW4gemxpYi5oCi0tIERvY3VtZW50IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIHpjb25mLmgKLS0gYWRkZWQgIm1ha2UgaW5zdGFsbCIKLS0gZml4IHN5bmMgc2VhcmNoIGxvZ2ljIGluIGluZmxhdGVTeW5jCi0tIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSBub3cgd29ya3MgZXZlbiBpZiBvdXRwdXQgYnVmZmVyIHRvbyBzaG9ydAotLSBhZnRlciBpbmZsYXRlU3luYywgZG9uJ3Qgc2NhcmUgcGVvcGxlIHdpdGgganVzdCAibG8gd29ybGQiCi0tIGFkZGVkIHN1cHBvcnQgZm9yIERKR1BQCi0KLUNoYW5nZXMgaW4gMC45ICgxIE1heSA5NSkKLS0gZG9uJ3QgYXNzdW1lIHRoYXQgemFsbG9jIGNsZWFycyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodGhlIFR1cmJvQyBidWcKLSAgd2FzIE1hcmsncyBidWcgYWZ0ZXIgYWxsIDopCi0tIGxldCBhZ2FpbiBnenJlYWQgY29weSB1bmNvbXByZXNzZWQgZGF0YSB1bmNoYW5nZWQgKHdhcyB3b3JraW5nIGluIDAuNzEpCi0tIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSwgaW5mbGF0ZVJlc2V0IGFuZCBpbmZsYXRlU3luYyBhcmUgbm93IGZ1bGx5IGltcGxlbWVudGVkCi0tIGFkZGVkIGEgdGVzdCBvZiBpbmZsYXRlU3luYyBpbiBleGFtcGxlLmMKLS0gbW92ZWQgTUFYX1dCSVRTIHRvIHpjb25mLmggYmVjYXVzZSB1c2VycyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGF0LgotLSBkb2N1bWVudCBleHBsaWNpdGx5IHRoYXQgemFsbG9jKDY0Sykgb24gTVNET1MgbXVzdCByZXR1cm4gYSBub3JtYWxpemVkCi0gIHBvaW50ZXIgKHplcm8gb2Zmc2V0KQotLSBhZGRlZCBNYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBDLCBUdXJibyBDLCBCb3JsYW5kIEMrKwotLSBmYXN0ZXIgY3JjMzIoKQotCi1DaGFuZ2VzIGluIDAuOCAoMjkgQXByaWwgOTUpCi0tIGFkZGVkIGZhc3QgaW5mbGF0ZSAoaW5mZmFzdC5jKQotLSBkZWZsYXRlKFpfRklOSVNIKSBub3cgcmV0dXJucyBaX1NUUkVBTV9FTkQgd2hlbiBkb25lLiBXYXJuaW5nOiB0aGlzCi0gIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHpsaWIgd2hpY2ggcmV0dXJuZWQgWl9PSy4KLS0gd29yayBhcm91bmQgYSBUdXJib0MgY29tcGlsZXIgYnVnIChiYWQgY29kZSBmb3IgYiA8PCAwLCBzZWUgaW5mdXRpbC5oKQotICAoYWN0dWFsbHkgdGhhdCB3YXMgbm90IGEgY29tcGlsZXIgYnVnLCBzZWUgMC44MSBhYm92ZSkKLS0gZ3pyZWFkIG5vIGxvbmdlciByZWFkcyBvbmUgZXh0cmEgYnl0ZSBpbiBjZXJ0YWluIGNhc2VzCi0tIEluIGd6aW8gZGVzdHJveSgpLCBkb24ndCByZWZlcmVuY2UgYSBmcmVlZCBzdHJ1Y3R1cmUKLS0gYXZvaWQgbWFueSB3YXJuaW5ncyBmb3IgTVNET1MKLS0gYXZvaWQgdGhlIEVSUk9SIHN5bWJvbCB3aGljaCBpcyB1c2VkIGJ5IE1TIFdpbmRvd3MKLQotQ2hhbmdlcyBpbiAwLjcxICgxNCBBcHJpbCA5NSkKLS0gRml4ZWQgbW9yZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcyA6KCBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB3aXRoCi0gIFR1cmJvQyBsYXJnZSBtb2RlbC4KLQotQ2hhbmdlcyBpbiAwLjcgKDE0IEFwcmlsIDk1KQotLSBBZGRlZCBmdWxsIGluZmxhdGUgc3VwcG9ydC4KLS0gU2ltcGxpZmllZCB0aGUgY3JjMzIoKSBpbnRlcmZhY2UuIFRoZSBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZwotICAob25lJ3MgY29tcGxlbWVudCkgaXMgbm93IGRvbmUgaW5zaWRlIGNyYzMyKCkuIFdBUk5JTkc6IHRoaXMgaXMKLSAgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnM7IHNlZSB6bGliLmggZm9yIHRoZSBuZXcgdXNhZ2UuCi0KLUNoYW5nZXMgaW4gMC42MSAoMTIgQXByaWwgOTUpCi0tIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFR1cmJvQy4gZXhhbXBsZSBhbmQgbWluaWd6aXAgbm93IHdvcmsgb24gTVNET1MuCi0KLUNoYW5nZXMgaW4gMC42ICgxMSBBcHJpbCA5NSkKLS0gYWRkZWQgbWluaWd6aXAuYwotLSBhZGRlZCBnemRvcGVuIHRvIHJlb3BlbiBhIGZpbGUgZGVzY3JpcHRvciBhcyBnekZpbGUKLS0gYWRkZWQgdHJhbnNwYXJlbnQgcmVhZGluZyBvZiBub24tZ3ppcGVkIGZpbGVzIGluIGd6cmVhZC4KLS0gZml4ZWQgYnVnIGluIGd6cmVhZCAoZG9uJ3QgcmVhZCBjcmMgYXMgZGF0YSkKLS0gZml4ZWQgYnVnIGluIGRlc3Ryb3kgKGd6aW8uYykgKGRvbid0IHJldHVybiBaX1NUUkVBTV9FTkQgZm9yIGd6Y2xvc2UpLgotLSBkb24ndCBhbGxvY2F0ZSBiaWcgYXJyYXlzIGluIHRoZSBzdGFjayAoZm9yIE1TRE9TKQotLSBmaXggc29tZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcwotCi1DaGFuZ2VzIGluIDAuNToKLS0gZG8gcmVhbCBjb21wcmVzc2lvbiBpbiBkZWZsYXRlLmMuIFpfUEFSVElBTF9GTFVTSCBpcyBzdXBwb3J0ZWQgYnV0Ci0gIG5vdCB5ZXQgWl9GVUxMX0ZMVVNILgotLSBzdXBwb3J0IGRlY29tcHJlc3Npb24gYnV0IG9ubHkgaW4gYSBzaW5nbGUgc3RlcCAoZm9yY2VkIFpfRklOSVNIKQotLSBhZGRlZCBvcGFxdWUgb2JqZWN0IGZvciB6YWxsb2MgYW5kIHpmcmVlLgotLSBhZGRlZCBkZWZsYXRlUmVzZXQgYW5kIGluZmxhdGVSZXNldAotLSBhZGRlZCBhIHZhcmlhYmxlIHpsaWJfdmVyc2lvbiBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuCi0tIHJlbmFtZWQgdGhlICdmaWx0ZXInIHBhcmFtZXRlciBvZiBkZWZsYXRlSW5pdDIgYXMgJ3N0cmF0ZWd5Jy4KLSAgQWRkZWQgWl9GSUxURVJFRCBhbmQgWl9IVUZGTUFOX09OTFkgY29uc3RhbnRzLgotCi1DaGFuZ2VzIGluIDAuNDoKLS0gYXZvaWQgInppcCIgZXZlcnl3aGVyZSwgdXNlIHpsaWIgaW5zdGVhZCBvZiB6aXBsaWIuCi0tIHN1cHByZXNzIFpfQkxPQ0tfRkxVU0gsIGludGVycHJldCBaX1BBUlRJQUxfRkxVU0ggYXMgYmxvY2sgZmx1c2gKLSAgaWYgY29tcHJlc3Npb24gbWV0aG9kID09IDguCi0tIGFkZGVkIGFkbGVyMzIgYW5kIGNyYzMyCi0tIHJlbmFtZWQgZGVmbGF0ZU9wdGlvbnMgYXMgZGVmbGF0ZUluaXQyLCBjYWxsIG9uZSBvciB0aGUgb3RoZXIgYnV0IG5vdCBib3RoCi0tIGFkZGVkIHRoZSBtZXRob2QgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIuCi0tIGFkZGVkIGluZmxhdGVJbml0MgotLSBzaW1wbGllZCBjb25zaWRlcmFibHkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGJ5IG5vdCBzdXBwb3J0aW5nCi0gIHVzZXItcHJvdmlkZWQgaGlzdG9yeSBidWZmZXIuIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgaW4gZGVmbGF0ZUluaXQyCi0gIGFuZCBpbmZsYXRlSW5pdDIuCi0KLUNoYW5nZXMgaW4gMC4zOgotLSBwcmVmaXggYWxsIG1hY3JvIG5hbWVzIHdpdGggWl8KLS0gdXNlIFpfRklOSVNIIGluc3RlYWQgb2YgZGVmbGF0ZUVuZCB0byBmaW5pc2ggY29tcHJlc3Npb24uCi0tIGFkZGVkIFpfSFVGRk1BTl9PTkxZCi0tIGFkZGVkIGd6ZXJyb3IoKQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvRkFRIGIvY29tbW9uL3psaWIvRkFRCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2E3ZDYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL0ZBUQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0KLQkJRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgotCi0KLUlmIHlvdXIgcXVlc3Rpb24gaXMgbm90IHRoZXJlLCBwbGVhc2UgY2hlY2sgdGhlIHpsaWIgaG9tZSBwYWdlIAotaHR0cDovL3d3dy56bGliLm9yZyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KLVRoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCi0KLQotIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KLQotICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KLQotIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/Ci0KLSAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLiBJZiB5b3UKLSAgICB3YW50IGEgcHJlY29tcGlsZWQgRExMLCBzZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC8gLiBRdWVzdGlvbnMKLSAgICBhYm91dCB0aGUgemxpYiBETEwgc2hvdWxkIGJlIHNlbnQgdG8gR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKS4KLQotIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KLQotICAgIFNlZQotICAgICAgICAqIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvY21wLXotaXQuemlwCi0gICAgICAgICogaHR0cDovL3d3dy5kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCi0gICAgICAgICogY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgotCi0gNC4gY29tcHJlc3MoKSByZXR1cm5zIFpfQlVGX0VSUk9SCi0KLSAgICBNYWtlIHN1cmUgdGhhdCBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MsIHRoZSBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQKLSAgICBidWZmZXIgaXMgZXF1YWwgdG8gdGhlIHRvdGFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGFuZCBub3QKLSAgICB6ZXJvLiBGb3IgVmlzdWFsIEJhc2ljLCBjaGVjayB0aGF0IHRoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSByZWZlcmVuY2UKLSAgICAoImFzIGFueSIpLCBub3QgYnkgdmFsdWUgKCJhcyBsb25nIikuCi0KLSA1LiBkZWZsYXRlKCkgb3IgaW5mbGF0ZSgpIHJldHVybnMgWl9CVUZfRVJST1IKLQotICAgIEJlZm9yZSBtYWtpbmcgdGhlIGNhbGwsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIG5vdAotICAgIHplcm8uIFdoZW4gc2V0dGluZyB0aGUgcGFyYW1ldGVyIGZsdXNoIGVxdWFsIHRvIFpfRklOSVNILCBhbHNvIG1ha2Ugc3VyZQotICAgIHRoYXQgYXZhaWxfb3V0IGlzIGJpZyBlbm91Z2ggdG8gYWxsb3cgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBpbnB1dC4KLQotIDYuIFdoZXJlJ3MgdGhlIHpsaWIgZG9jdW1lbnRhdGlvbiAobWFuIHBhZ2VzLCBldGMuKT8KLQotICAgIEl0J3MgaW4gemxpYi5oIGZvciB0aGUgbW9tZW50LCBhbmQgRnJhbmNpcyBTLiBMaW4gaGFzIGNvbnZlcnRlZCBpdCB0byBhCi0gICAgd2ViIHBhZ2UgemxpYi5odG1sLiBWb2x1bnRlZXJzIHRvIHRyYW5zZm9ybSB0aGlzIHRvIFVuaXgtc3R5bGUgbWFuIHBhZ2VzLAotICAgIHBsZWFzZSBjb250YWN0IEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKS4gRXhhbXBsZXMgb2YgemxpYiB1c2FnZQotICAgIGFyZSBpbiB0aGUgZmlsZXMgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jLgotCi0gNy4gV2h5IGRvbid0IHlvdSB1c2UgR05VIGF1dG9jb25mIG9yIGxpYnRvb2wgb3IgLi4uPwotCi0gICAgQmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIGtlZXAgemxpYiBhcyBhIHZlcnkgc21hbGwgYW5kIHNpbXBsZQotICAgIHBhY2thZ2UuIHpsaWIgaXMgcmF0aGVyIHBvcnRhYmxlIGFuZCBkb2Vzbid0IG5lZWQgbXVjaCBjb25maWd1cmF0aW9uLgotCi0gOC4gSSBmb3VuZCBhIGJ1ZyBpbiB6bGliLgotCi0gICAgTW9zdCBvZiB0aGUgdGltZSwgc3VjaCBwcm9ibGVtcyBhcmUgZHVlIHRvIGFuIGluY29ycmVjdCB1c2FnZSBvZgotICAgIHpsaWIuIFBsZWFzZSB0cnkgdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIHdpdGggYSBzbWFsbCBwcm9ncmFtIGFuZCBzZW5kCi0gICAgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIHRvIHVzIGF0IHpsaWJAZ3ppcC5vcmcgLiBEbyBub3Qgc2VuZAotICAgIG11bHRpLW1lZ2FieXRlIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCi0KLSA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KLQotICAgIElmICJtYWtlIHRlc3QiIHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlCi0KLSAgICAgICBleGFtcGxlLm8oLnRleHQrMHgxNTQpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBnenB1dGMnCi0gICAgICAKLSAgICBjaGVjayB0aGF0IHlvdSBkb24ndCBoYXZlIG9sZCBmaWxlcyBsaWJ6LiogaW4gL3Vzci9saWIsIC91c3IvbG9jYWwvbGliIG9yCi0gICAgL3Vzci9YMTFSNi9saWIuIFJlbW92ZSBhbnkgb2xkIHZlcnNpb25zLCB0aGVuIGRvICJtYWtlIGluc3RhbGwiLgotCi0xMC4gSSBuZWVkIGEgRGVscGhpIGludGVyZmFjZSB0byB6bGliLgotCi0gICAgU2VlIHRoZSBkaXJlY3RvcmllcyBjb250cmliL2RlbHBoaSBhbmQgY29udHJpYi9kZWxwaGkyIGluIHRoZSB6bGliCi0gICAgZGlzdHJpYnV0aW9uLgotCi0xMS4gQ2FuIHpsaWIgaGFuZGxlIC56aXAgYXJjaGl2ZXM/Ci0KLSAgICBTZWUgdGhlIGRpcmVjdG9yeSBjb250cmliL21pbml6aXAgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgotCi0xMi4gQ2FuIHpsaWIgaGFuZGxlIC5aIGZpbGVzPwotCi0gICAgTm8sIHNvcnJ5LiBZb3UgaGF2ZSB0byBzcGF3biBhbiB1bmNvbXByZXNzIG9yIGd1bnppcCBzdWJwcm9jZXNzLCBvciBhZGFwdAotICAgIHRoZSBjb2RlIG9mIHVuY29tcHJlc3Mgb24geW91ciBvd24uCi0KLTEzLiBIb3cgY2FuIEkgbWFrZSBhIFVuaXggc2hhcmVkIGxpYnJhcnk/Ci0KLSAgICBtYWtlIGNsZWFuCi0gICAgLi9jb25maWd1cmUgLXMKLSAgICBtYWtlCi0KLTE0LiBXaHkgZG9lcyAibWFrZSB0ZXN0IiBmYWlsIG9uIE1hYyBPUyBYPwotCi0gICAgTWFjIE9TIFggYWxyZWFkeSBpbmNsdWRlcyB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBzbyAtbHogbGlua3MgdGhlCi0gICAgc2hhcmVkIGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgdGhlICJtYWtlIiBjb21waWxlZC4gRm9yIHpsaWIKLSAgICAxLjEuMywgdGhlIHR3byBhcmUgaW5jb21wYXRpYmxlIGR1ZSB0byBkaWZmZXJlbnQgY29tcGlsZS10aW1lCi0gICAgb3B0aW9ucy4gU2ltcGx5IGNoYW5nZSB0aGUgLWx6IGluIHRoZSBNYWtlZmlsZSB0byBsaWJ6LmEsIGFuZCBpdCB3aWxsIHVzZQotICAgIHRoZSBjb21waWxlZCBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIHNoYXJlZCBvbmUgYW5kIHRoZSAibWFrZSB0ZXN0IiB3aWxsCi0gICAgc3VjY2VlZC4KLQotMTUuIEkgaGF2ZSBhIHF1ZXN0aW9uIGFib3V0IE90dG9QREYKLQotICAgIFdlIGFyZSBub3QgdGhlIGF1dGhvcnMgb2YgT3R0b1BERi4gVGhlIHJlYWwgYXV0aG9yIGlzIG9uIHRoZSBPdHRvUERGIHdlYgotICAgIHNpdGUgSm9lbCBIYWlubGV5IGpoYWlubGV5QG15bmRrcnltZS5jb20uCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9JTkRFWCBiL2NvbW1vbi96bGliL0lOREVYCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTI0NTc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL0lOREVYCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotQ2hhbmdlTG9nCQloaXN0b3J5IG9mIGNoYW5nZXMKLUlOREVYCQkJdGhpcyBmaWxlCi1GQVEJCQlGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCi1NYWtlX3Ztcy5jb20JCXNjcmlwdCBmb3IgVmF4L1ZNUwotTWFrZWZpbGUJCW1ha2VmaWxlIGZvciBVbml4IChnZW5lcmF0ZWQgYnkgY29uZmlndXJlKQotTWFrZWZpbGUuaW4JCW1ha2VmaWxlIGZvciBVbml4ICh0ZW1wbGF0ZSBmb3IgY29uZmlndXJlKQotTWFrZWZpbGUucmlzY29zIAltYWtlZmlsZSBmb3IgUklTQ09TCi1SRUFETUUJCQlndWVzcyB3aGF0Ci1hbGdvcml0aG0udHh0CQlkZXNjcmlwdGlvbiBvZiB0aGUgKGRlKWNvbXByZXNzaW9uIGFsZ29yaXRobQotY29uZmlndXJlCQljb25maWd1cmUgc2NyaXB0IGZvciBVbml4Ci1kZXNjcmlwLm1tcwkJbWFrZWZpbGUgZm9yIFZheC9WTVMKLXpsaWIuMwkJCW1pbmkgbWFuIHBhZ2UgZm9yIHpsaWIgKHZvbHVudGVlcnMgdG8gd3JpdGUgZnVsbAotCQkJbWFuIHBhZ2VzIGZyb20gemxpYi5oIHdlbGNvbWUuIHdyaXRlIHRvIGpsb3VwQGd6aXAub3JnKQotCi1hbWlnYS9NYWtlZmlsZS5zYXMJbWFrZWZpbGUgZm9yIEFtaWdhIFNBUy9DCi1hbWlnYS9NYWtlZmlsZS5wdXAgICAgICBtYWtlZmlsZSBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMKLQotbXNkb3MvTWFrZWZpbGUudzMyICAgICAgbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDMyLWJpdAotbXNkb3MvTWFrZWZpbGUuYjMyCW1ha2VmaWxlIGZvciBCb3JsYW5kIEMrKyAgIDMyLWJpdAotbXNkb3MvTWFrZWZpbGUuYm9yCW1ha2VmaWxlIGZvciBCb3JsYW5kIEMvQysrIDE2LWJpdAotbXNkb3MvTWFrZWZpbGUuZGoyCW1ha2VmaWxlIGZvciBESkdQUCAyLngKLW1zZG9zL01ha2VmaWxlLmVteAltYWtlZmlsZSBmb3IgRU1YIDAuOWMgKDMyLWJpdCBET1MvT1MyKQotbXNkb3MvTWFrZWZpbGUubXNjCW1ha2VmaWxlIGZvciBNaWNyb3NvZnQgQyAxNi1iaXQKLW1zZG9zL01ha2VmaWxlLnRjCW1ha2VmaWxlIGZvciBUdXJibyBDCi1tc2Rvcy9NYWtlZmlsZS53YXQJbWFrZWZpbGUgZm9yIFdhdGNvbSBDCi1tc2Rvcy96bGliLmRlZiAgICAgICAgCWRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBETEwKLW1zZG9zL3psaWIucmMgICAgICAgICAJZGVmaW5pdGlvbiBmaWxlIGZvciBXaW5kb3dzIERMTAotCi1udC9NYWtlZmlsZS5udAkJbWFrZWZpbGUgZm9yIFdpbmRvd3MgTlQKLW50L3psaWIuZG50CQlkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MgTlQgRExMCi1udC9NYWtlZmlsZS5lbXgJCW1ha2VmaWxlIGZvciBFTVggMC45Yy9SU1hOVCAxLjQxIChXaW4zMiBJbnRlbCkKLW50L01ha2VmaWxlLmdjYwkJbWFrZWZpbGUgZm9yIFdpbmRvd3MgTlQgdXNpbmcgR0NDIChtaW5ndzMyKQotCi0KLQkJemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgotemNvbmYuaAotemxpYi5oCi0KLQkJcHJpdmF0ZSBzb3VyY2UgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgemxpYiBsaWJyYXJ5OgotYWRsZXIzMi5jCi1jb21wcmVzcy5jCi1jcmMzMi5jCi1kZWZsYXRlLmMKLWRlZmxhdGUuaAotZ3ppby5jCi1pbmZibG9jay5jCi1pbmZibG9jay5oCi1pbmZjb2Rlcy5jCi1pbmZjb2Rlcy5oCi1pbmZmYXN0LmMKLWluZmZhc3QuaAotaW5mbGF0ZS5jCi1pbmZ0cmVlcy5jCi1pbmZ0cmVlcy5oCi1pbmZ1dGlsLmMKLWluZnV0aWwuaAotbWFrZXRyZWUuYwotdHJlZXMuYwotdW5jb21wci5jCi16dXRpbC5jCi16dXRpbC5oCi0KLQkJc291cmNlIGZpbGVzIGZvciBzYW1wbGUgcHJvZ3JhbXM6Ci1leGFtcGxlLmMKLW1pbmlnemlwLmMKLQotCQl1bnN1cHBvcnRlZCBjb250cmlidXRpb24gYnkgdGhpcmQgcGFydGllcwotCi1jb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgotCTM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgotCi1jb250cmliL21pbml6aXAvIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KLQlNaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYgotICAgICAgICBTZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCi0KLWNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgotICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucwotCi1jb250cmliL2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+Ci0JQW5vdGhlciBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlCi0KLWNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KLQlBIHZlcnkgc2ltcGxlIHRhci5neiBleHRyYWN0b3IgdXNpbmcgemxpYgotCi1jb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KLSAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9NYWtlX3Ztcy5jb20gYi9jb21tb24vemxpYi9NYWtlX3Ztcy5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTdlOGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3psaWIvTWFrZV92bXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSQhIG1ha2UgbGlieiB1bmRlciBWTVMKLSQhIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyIDxtLnppbnNlckBnc2kuZGU+Ci0kIQotJCEgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQKLSQhCi0kIGNjb3B0ID0gIiIKLSQgaWYgZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNAotJCB0aGVuCi0kICBjY29wdCA9ICIvcHJlZml4PWFsbCIrY2NvcHQKLSQgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKLSQgZWxzZQotJCAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06REVDQyRDT01QSUxFUi5FWEUiKS5lcXMuIiIKLSQgICB0aGVuCi0kICAgIGNvbXAgID0gIl9fdmF4Y19fPTEiCi0kICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCAgIGVsc2UKLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgIGNjb3B0ID0gIi9kZWNjL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICAgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBlbmRpZgotJCBlbmRpZgotJCEKLSQhIEJ1aWxkIHRoZSB0aGluZyBwbGFpbiBvciB3aXRoIG1tcwotJCEKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIFpsaWIgc291cmNlcyAuLi4iCi0kIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOk1NUy5FWEUiKS5lcXMuIiIKLSQgIHRoZW4KLSQgICBkZWxlIGV4YW1wbGUub2JqOyosbWluaWd6aXAub2JqOyoKLSQgICBDQUxMIE1BS0UgYWRsZXIzMi5PQkogIkNDICcnQ0NPUFQnIGFkbGVyMzIiIC0KLSAgICAgICAgICAgICAgICBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgY29tcHJlc3MuT0JKICJDQyAnJ0NDT1BUJyBjb21wcmVzcyIgLQotICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgY3JjMzIuT0JKICJDQyAnJ0NDT1BUJyBjcmMzMiIgLQotICAgICAgICAgICAgICAgIGNyYzMyLmMgemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgZGVmbGF0ZS5PQkogIkNDICcnQ0NPUFQnIGRlZmxhdGUiIC0KLSAgICAgICAgICAgICAgICBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKLSQgICBDQUxMIE1BS0UgZ3ppby5PQkogIkNDICcnQ0NPUFQnIGd6aW8iIC0KLSAgICAgICAgICAgICAgICBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBpbmZibG9jay5PQkogIkNDICcnQ0NPUFQnIGluZmJsb2NrIiAtCi0gICAgICAgICAgICAgICAgaW5mYmxvY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKLSQgICBDQUxMIE1BS0UgaW5mY29kZXMuT0JKICJDQyAnJ0NDT1BUJyBpbmZjb2RlcyIgLQotICAgICAgICAgICAgICAgIGluZmNvZGVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi0kICAgQ0FMTCBNQUtFIGluZmZhc3QuT0JKICJDQyAnJ0NDT1BUJyBpbmZmYXN0IiAtCi0gICAgICAgICAgICAgICAgaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mZmFzdC5oCi0kICAgQ0FMTCBNQUtFIGluZmxhdGUuT0JKICJDQyAnJ0NDT1BUJyBpbmZsYXRlIiAtCi0gICAgICAgICAgICAgICAgaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAotJCAgIENBTEwgTUFLRSBpbmZ0cmVlcy5PQkogIkNDICcnQ0NPUFQnIGluZnRyZWVzIiAtCi0gICAgICAgICAgICAgICAgaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLSQgICBDQUxMIE1BS0UgaW5mdXRpbC5PQkogIkNDICcnQ0NPUFQnIGluZnV0aWwiIC0KLSAgICAgICAgICAgICAgICBpbmZ1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAotJCAgIENBTEwgTUFLRSB0cmVlcy5PQkogIkNDICcnQ0NPUFQnIHRyZWVzIiAtCi0gICAgICAgICAgICAgICAgdHJlZXMuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSB1bmNvbXByLk9CSiAiQ0MgJydDQ09QVCcgdW5jb21wciIgLQotICAgICAgICAgICAgICAgIHVuY29tcHIuYyB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSB6dXRpbC5PQkogIkNDICcnQ0NPUFQnIHp1dGlsIiAtCi0gICAgICAgICAgICAgICAgenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgWmxpYiAuLi4iCi0kICAgQ0FMTCBNQUtFIGxpYnouT0xCICJsaWIvY3JlYSBsaWJ6Lm9sYiAqLm9iaiIgKi5PQkoKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBleGFtcGxlLi4uIgotJCAgIENBTEwgTUFLRSBleGFtcGxlLk9CSiAiQ0MgJydDQ09QVCcgZXhhbXBsZSIgLQotICAgICAgICAgICAgICAgIGV4YW1wbGUuYyB6bGliLmggemNvbmYuaAotJCAgIGNhbGwgbWFrZSBleGFtcGxlLmV4ZSAiTElOSyBleGFtcGxlLGxpYnoub2xiL2xpYiIgZXhhbXBsZS5vYmogbGliei5vbGIKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBtaW5pZ3ppcC4uLiIKLSQgICBDQUxMIE1BS0UgbWluaWd6aXAuT0JKICJDQyAnJ0NDT1BUJyBtaW5pZ3ppcCIgLQotICAgICAgICAgICAgICAgIG1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKLSQgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0gCi0gICAgICAgICAgICAgICAgIkxJTksgbWluaWd6aXAsbGliei5vbGIvbGliLHgxMXZtczp4dm1zdXRpbHMub2xiL2xpYiIgLSAKLSAgICAgICAgICAgICAgICBtaW5pZ3ppcC5vYmogbGliei5vbGIKLSQgIGVsc2UKLSQgICBtbXMvbWFjcm89KCdjb21wJykKLSQgIGVuZGlmCi0kIHdyaXRlIHN5cyRvdXRwdXQgIlpsaWIgYnVpbGQgY29tcGxldGVkIgotJCBleGl0Ci0kIQotJCEKLSRNQUtFOiBTVUJST1VUSU5FICAgIVNVQlJPVVRJTkUgVE8gQ0hFQ0sgREVQRU5ERU5DSUVTCi0kIFYgPSAnRiRWZXJpZnkoMCkKLSQhIFAxID0gV2hhdCB3ZSBhcmUgdHJ5aW5nIHRvIG1ha2UKLSQhIFAyID0gQ29tbWFuZCB0byBtYWtlIGl0Ci0kISBQMyAtIFA4ICBXaGF0IGl0IGRlcGVuZHMgb24KLSQKLSQgSWYgRiRTZWFyY2goUDEpIC5FcXMuICIiIFRoZW4gR290byBNYWtlaXQKLSQgVGltZSA9IEYkQ3ZUaW1lKEYkRmlsZShQMSwiUkRUIikpCi0kYXJnPTMKLSRMb29wOgotJCAgICAgICBBcmd1bWVudCA9IFAnYXJnCi0kICAgICAgIElmIEFyZ3VtZW50IC5FcXMuICIiIFRoZW4gR290byBFeGl0Ci0kICAgICAgIEVsPTAKLSRMb29wMjoKLSQgICAgICAgRmlsZSA9IEYkRWxlbWVudChFbCwiICIsQXJndW1lbnQpCi0kICAgICAgIElmIEZpbGUgLkVxcy4gIiAiIFRoZW4gR290byBFbmRsCi0kICAgICAgIEFGaWxlID0gIiIKLSRMb29wMzoKLSQgICAgICAgT0ZpbGUgPSBBRmlsZQotJCAgICAgICBBRmlsZSA9IEYkU2VhcmNoKEZpbGUpCi0kICAgICAgIElmIEFGaWxlIC5FcXMuICIiIC5Pci4gQUZpbGUgLkVxcy4gT0ZpbGUgVGhlbiBHb3RvIE5leHRFbAotJCAgICAgICBJZiBGJEN2VGltZShGJEZpbGUoQUZpbGUsIlJEVCIpKSAuR2VzLiBUaW1lIFRoZW4gR290byBNYWtlaXQKLSQgICAgICAgR290byBMb29wMwotJE5leHRFTDoKLSQgICAgICAgRWwgPSBFbCArIDEKLSQgICAgICAgR290byBMb29wMgotJEVuZEw6Ci0kIGFyZz1hcmcrMQotJCBJZiBhcmcgLkxlLiA4IFRoZW4gR290byBMb29wCi0kIEdvdG8gRXhpdAotJAotJE1ha2VpdDoKLSQgVlY9RiRWRVJJRlkoMCkKLSQgd3JpdGUgc3lzJG91dHB1dCBQMgotJCAnUDIKLSQgVlY9J0YkVmVyaWZ5KFZWKQotJEV4aXQ6Ci0kIElmIFYgVGhlbiBTZXQgVmVyaWZ5Ci0kRU5EU1VCUk9VVElORQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvTWFrZWZpbGUucmlzY29zIGIvY29tbW9uL3psaWIvTWFrZWZpbGUucmlzY29zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdmNDQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL01ha2VmaWxlLnJpc2NvcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIFByb2plY3Q6ICAgemxpYl8xXzAzCi0jIFBhdGNoZWQgZm9yIHpsaWIgMS4xLjIgcndAc2hhZG93Lm9yZy51ayAxOTk4MDQzMAotIyB0ZXN0IHdvcmtzIG91dC1vZi10aGUtYm94LCBpbnN0YWxscyBgc29tZXdoZXJlJyBvbiBkZW1hbmQKLQotIyBUb29sZmxhZ3M6Ci1DQ2ZsYWdzID0gLWMgLWRlcGVuZCAhRGVwZW5kIC1JQzogLWcgLXRocm93YmFjayAgLURSSVNDT1MgIC1mYWggCi1DKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKLUxpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQCAKLU9iakFzbWZsYWdzID0gLXRocm93YmFjayAtTm9DYWNoZSAtZGVwZW5kICFEZXBlbmQKLUNNSEdmbGFncyA9IAotTGliRmlsZWZsYWdzID0gLWMgLWwgLW8gJEAgCi1TcXVlZXplZmxhZ3MgPSAtbyAkQAotCi0jIGNoYW5nZSB0aGUgbGluZSBiZWxvdyB0byB3aGVyZSBfeW91XyB3YW50IHRoZSBsaWJyYXJ5IGluc3RhbGxlZC4KLWxpYmRlc3QgPSBsaWI6emxpYgotCi0jIEZpbmFsIHRhcmdldHM6Ci1ALmxpYjogICBALm8uYWRsZXIzMiBALm8uY29tcHJlc3MgQC5vLmNyYzMyIEAuby5kZWZsYXRlIEAuby5nemlvIFwKLSAgICAgICAgQC5vLmluZmJsb2NrIEAuby5pbmZjb2RlcyBALm8uaW5mZmFzdCBALm8uaW5mbGF0ZSBALm8uaW5mdHJlZXMgQC5vLmluZnV0aWwgQC5vLnRyZWVzIFwKLSAgICAgICAgQC5vLnVuY29tcHIgQC5vLnp1dGlsIAotICAgICAgICBMaWJGaWxlICQoTGliRmlsZWZsYWdzKSBALm8uYWRsZXIzMiBALm8uY29tcHJlc3MgQC5vLmNyYzMyIEAuby5kZWZsYXRlIFwKLSAgICAgICAgQC5vLmd6aW8gQC5vLmluZmJsb2NrIEAuby5pbmZjb2RlcyBALm8uaW5mZmFzdCBALm8uaW5mbGF0ZSBALm8uaW5mdHJlZXMgQC5vLmluZnV0aWwgXAotICAgICAgICBALm8udHJlZXMgQC5vLnVuY29tcHIgQC5vLnp1dGlsIAotdGVzdDogICBALm1pbmlnemlwIEAuZXhhbXBsZSBALmxpYgotCUBjb3B5IEAubGliIEAubGliYyAgQX5DfkRGfkx+Tn5QflF+UlN+VFYKLQlAZWNobyBydW5uaW5nIHRlc3RzOiBoYW5nIG9uLgotCUAvQC5taW5pZ3ppcCAtZiAtOSBsaWJjCi0JQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKLQlAL0AubWluaWd6aXAgLWYgLTEgbGliYwotCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6Ci0JQC9ALm1pbmlnemlwIC1oIC05IGxpYmMKLQlAL0AubWluaWd6aXAgLWQgbGliYy1negotCUAvQC5taW5pZ3ppcCAtaCAtMSBsaWJjCi0JQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKLQlAL0AubWluaWd6aXAgLTkgbGliYwotCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6Ci0JQC9ALm1pbmlnemlwIC0xIGxpYmMKLQlAL0AubWluaWd6aXAgLWQgbGliYy1negotCUBkaWZmIEAubGliIEAubGliYwotCUBlY2hvIHRoYXQgc2hvdWxkIGhhdmUgcmVwb3J0ZWQgJ0AubGliIGFuZCBALmxpYmMgaWRlbnRpY2FsJyBpZiB5b3UgaGF2ZSBkaWZmLgotCUAvQC5leGFtcGxlIEAuZnJlZCBALmZyZWQKLQlAZWNobyB0aGF0IHdpbGwgaGF2ZSBnaXZlbiBsb3RzIG9mIGhlbGxvISdzLgotCi1ALm1pbmlnemlwOiAgIEAuby5taW5pZ3ppcCBALmxpYiBDOm8uU3R1YnMgCi0gICAgICAgIExpbmsgJChMaW5rZmxhZ3MpIEAuby5taW5pZ3ppcCBALmxpYiBDOm8uU3R1YnMgCi1ALmV4YW1wbGU6ICAgQC5vLmV4YW1wbGUgQC5saWIgQzpvLlN0dWJzIAotICAgICAgICBMaW5rICQoTGlua2ZsYWdzKSBALm8uZXhhbXBsZSBALmxpYiBDOm8uU3R1YnMKLQotaW5zdGFsbDogQC5saWIKLQljZGlyICQobGliZGVzdCkKLQljZGlyICQobGliZGVzdCkuaAotCUBjb3B5IEAuaC56bGliICQobGliZGVzdCkuaC56bGliIEF+Q35ERn5Mfk5+UH5RflJTflRWCi0JQGNvcHkgQC5oLnpjb25mICQobGliZGVzdCkuaC56Y29uZiBBfkN+REZ+TH5OflB+UX5SU35UVgotCUBjb3B5IEAubGliICQobGliZGVzdCkubGliICBBfkN+REZ+TH5OflB+UX5SU35UVgotCUBlY2hvIG9rYXksIGluc3RhbGxlZCB6bGliIGluICQobGliZGVzdCkKLQotY2xlYW46OyByZW1vdmUgQC5taW5pZ3ppcAotCXJlbW92ZSBALmV4YW1wbGUKLQlyZW1vdmUgQC5saWJjCi0JLXdpcGUgQC5vLiogRn5yfmNWCi0JcmVtb3ZlIEAuZnJlZAotCi0jIFVzZXItZWRpdGFibGUgZGVwZW5kZW5jaWVzOgotLmMubzoKLSAgICAgICAgY2MgJChjY2ZsYWdzKSAtbyAkQCAkPAotCi0jIFN0YXRpYyBkZXBlbmRlbmNpZXM6Ci0KLSMgRHluYW1pYyBkZXBlbmRlbmNpZXM6Ci1vLmV4YW1wbGU6CWMuZXhhbXBsZQotby5leGFtcGxlOgloLnpsaWIKLW8uZXhhbXBsZToJaC56Y29uZgotby5taW5pZ3ppcDoJYy5taW5pZ3ppcAotby5taW5pZ3ppcDoJaC56bGliCi1vLm1pbmlnemlwOgloLnpjb25mCi1vLmFkbGVyMzI6CWMuYWRsZXIzMgotby5hZGxlcjMyOgloLnpsaWIKLW8uYWRsZXIzMjoJaC56Y29uZgotby5jb21wcmVzczoJYy5jb21wcmVzcwotby5jb21wcmVzczoJaC56bGliCi1vLmNvbXByZXNzOgloLnpjb25mCi1vLmNyYzMyOgljLmNyYzMyCi1vLmNyYzMyOgloLnpsaWIKLW8uY3JjMzI6CWguemNvbmYKLW8uZGVmbGF0ZToJYy5kZWZsYXRlCi1vLmRlZmxhdGU6CWguZGVmbGF0ZQotby5kZWZsYXRlOgloLnp1dGlsCi1vLmRlZmxhdGU6CWguemxpYgotby5kZWZsYXRlOgloLnpjb25mCi1vLmd6aW86CWMuZ3ppbwotby5nemlvOgloLnp1dGlsCi1vLmd6aW86CWguemxpYgotby5nemlvOgloLnpjb25mCi1vLmluZmJsb2NrOgljLmluZmJsb2NrCi1vLmluZmJsb2NrOgloLnp1dGlsCi1vLmluZmJsb2NrOgloLnpsaWIKLW8uaW5mYmxvY2s6CWguemNvbmYKLW8uaW5mYmxvY2s6CWguaW5mYmxvY2sKLW8uaW5mYmxvY2s6CWguaW5mdHJlZXMKLW8uaW5mYmxvY2s6CWguaW5mY29kZXMKLW8uaW5mYmxvY2s6CWguaW5mdXRpbAotby5pbmZjb2RlczoJYy5pbmZjb2Rlcwotby5pbmZjb2RlczoJaC56dXRpbAotby5pbmZjb2RlczoJaC56bGliCi1vLmluZmNvZGVzOgloLnpjb25mCi1vLmluZmNvZGVzOgloLmluZnRyZWVzCi1vLmluZmNvZGVzOgloLmluZmJsb2NrCi1vLmluZmNvZGVzOgloLmluZmNvZGVzCi1vLmluZmNvZGVzOgloLmluZnV0aWwKLW8uaW5mY29kZXM6CWguaW5mZmFzdAotby5pbmZmYXN0OgljLmluZmZhc3QKLW8uaW5mZmFzdDoJaC56dXRpbAotby5pbmZmYXN0OgloLnpsaWIKLW8uaW5mZmFzdDoJaC56Y29uZgotby5pbmZmYXN0OgloLmluZnRyZWVzCi1vLmluZmZhc3Q6CWguaW5mYmxvY2sKLW8uaW5mZmFzdDoJaC5pbmZjb2Rlcwotby5pbmZmYXN0OgloLmluZnV0aWwKLW8uaW5mZmFzdDoJaC5pbmZmYXN0Ci1vLmluZmxhdGU6CWMuaW5mbGF0ZQotby5pbmZsYXRlOgloLnp1dGlsCi1vLmluZmxhdGU6CWguemxpYgotby5pbmZsYXRlOgloLnpjb25mCi1vLmluZmxhdGU6CWguaW5mYmxvY2sKLW8uaW5mdHJlZXM6CWMuaW5mdHJlZXMKLW8uaW5mdHJlZXM6CWguenV0aWwKLW8uaW5mdHJlZXM6CWguemxpYgotby5pbmZ0cmVlczoJaC56Y29uZgotby5pbmZ0cmVlczoJaC5pbmZ0cmVlcwotby5pbmZ0cmVlczoJaC5pbmZmaXhlZAotby5pbmZ1dGlsOgljLmluZnV0aWwKLW8uaW5mdXRpbDoJaC56dXRpbAotby5pbmZ1dGlsOgloLnpsaWIKLW8uaW5mdXRpbDoJaC56Y29uZgotby5pbmZ1dGlsOgloLmluZmJsb2NrCi1vLmluZnV0aWw6CWguaW5mdHJlZXMKLW8uaW5mdXRpbDoJaC5pbmZjb2Rlcwotby5pbmZ1dGlsOgloLmluZnV0aWwKLW8udHJlZXM6CWMudHJlZXMKLW8udHJlZXM6CWguZGVmbGF0ZQotby50cmVlczoJaC56dXRpbAotby50cmVlczoJaC56bGliCi1vLnRyZWVzOgloLnpjb25mCi1vLnRyZWVzOgloLnRyZWVzCi1vLnVuY29tcHI6CWMudW5jb21wcgotby51bmNvbXByOgloLnpsaWIKLW8udW5jb21wcjoJaC56Y29uZgotby56dXRpbDoJYy56dXRpbAotby56dXRpbDoJaC56dXRpbAotby56dXRpbDoJaC56bGliCi1vLnp1dGlsOgloLnpjb25mCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9SRUFETUUgYi9jb21tb24vemxpYi9SRUFETUUKaW5kZXggMjlkNjcxNC4uNThjODFkZiAxMDA2NDQKLS0tIGEvY29tbW9uL3psaWIvUkVBRE1FCisrKyBiL2NvbW1vbi96bGliL1JFQURNRQpAQCAtMSwxNDcgKzEsMiBAQAotemxpYiAxLjEuNCBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUKLWlzIHRocmVhZCBzYWZlLiAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeQotaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIAotaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUKLWZvcm1hdCkgYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuIFRoZXNlIGRvY3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgaW4KLW90aGVyIGZvcm1hdHMgZnJvbSBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWwKLQotQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSB6bGliLmgKLSh2b2x1bnRlZXIgdG8gd3JpdGUgbWFuIHBhZ2VzIHdlbGNvbWUsIGNvbnRhY3QgamxvdXBAZ3ppcC5vcmcpLiBBIHVzYWdlCi1leGFtcGxlIG9mIHRoZSBsaWJyYXJ5IGlzIGdpdmVuIGluIHRoZSBmaWxlIGV4YW1wbGUuYyB3aGljaCBhbHNvIHRlc3RzIHRoYXQKLXRoZSBsaWJyYXJ5IGlzIHdvcmtpbmcgY29ycmVjdGx5LiBBbm90aGVyIGV4YW1wbGUgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUKLW1pbmlnemlwLmMuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGl0c2VsZiBpcyBjb21wb3NlZCBvZiBhbGwgc291cmNlIGZpbGVzCi1leGNlcHQgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jLgotCi1UbyBjb21waWxlIGFsbCBmaWxlcyBhbmQgcnVuIHRoZSB0ZXN0IHByb2dyYW0sIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCi1naXZlbiBhdCB0aGUgdG9wIG9mIE1ha2VmaWxlLiBJbiBzaG9ydCAibWFrZSB0ZXN0OyBtYWtlIGluc3RhbGwiCi1zaG91bGQgd29yayBmb3IgbW9zdCBtYWNoaW5lcy4gRm9yIFVuaXg6ICIuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0OyBtYWtlIGluc3RhbGwiCi1Gb3IgTVNET1MsIHVzZSBvbmUgb2YgdGhlIHNwZWNpYWwgbWFrZWZpbGVzIHN1Y2ggYXMgTWFrZWZpbGUubXNjLgotRm9yIFZNUywgdXNlIE1ha2Vfdm1zLmNvbSBvciBkZXNjcmlwLm1tcy4KLQotUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG8gPHpsaWJAZ3ppcC5vcmc+LCBvciB0bwotR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPiBmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24uCi1UaGUgemxpYiBob21lIHBhZ2UgaXMgaHR0cDovL3d3dy56bGliLm9yZyBvciBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvCi1CZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0byB2ZXJpZnkgdGhhdAoteW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7IG90aGVyd2lzZSBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZAotY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3Igbm90LgotCi1QTEVBU0UgcmVhZCB0aGUgemxpYiBGQVEgaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWJfZmFxLmh0bWwKLWJlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCi0KLU1hcmsgTmVsc29uIDxtYXJrbkBpZWVlLm9yZz4gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCB6bGliIGZvciB0aGUgSmFuLiAxOTk3Ci1pc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGluCi1odHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQotCi1UaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4xLjQgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgotVGhlIG9ubHkgY2hhbmdlcyBtYWRlIHNpbmNlIDEuMS4zIGFyZSBidWcgY29ycmVjdGlvbnM6Ci0KLS0gWkZSRUUgd2FzIHJlcGVhdGVkIG9uIHNhbWUgYWxsb2NhdGlvbiBvbiBzb21lIGVycm9yIGNvbmRpdGlvbnMuCi0gIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCi0gIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKLS0gUmV0dXJuZWQgaW5jb3JyZWN0IGVycm9yIChaX01FTV9FUlJPUikgb24gc29tZSBpbnZhbGlkIGRhdGEKLS0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdwotICBsZXNzIHRoYW4gMzJLLgotLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQotICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCi0KLVRoZSBiZXRhIHZlcnNpb24gMS4xLjViZXRhIGluY2x1ZGVzIG1hbnkgbW9yZSBjaGFuZ2VzLiBBIG5ldyBvZmZpY2lhbAotdmVyc2lvbiAxLjEuNSB3aWxsIGJlIHJlbGVhc2VkIGFzIHNvb24gYXMgZXh0ZW5zaXZlIHRlc3RpbmcgaGFzIGJlZW4KLWNvbXBsZXRlZCBvbiBpdC4KLQotCi1VbnN1cHBvcnRlZCB0aGlyZCBwYXJ0eSBjb250cmlidXRpb25zIGFyZSBwcm92aWRlZCBpbiBkaXJlY3RvcnkgImNvbnRyaWIiLgotCi1BIEphdmEgaW1wbGVtZW50YXRpb24gb2YgemxpYiBpcyBhdmFpbGFibGUgaW4gdGhlIEphdmEgRGV2ZWxvcG1lbnQgS2l0Ci1odHRwOi8vd3d3LmphdmFzb2Z0LmNvbS9wcm9kdWN0cy9KREsvMS4xL2RvY3MvYXBpL1BhY2thZ2UtamF2YS51dGlsLnppcC5odG1sCi1TZWUgdGhlIHpsaWIgaG9tZSBwYWdlIGh0dHA6Ly93d3cuemxpYi5vcmcgZm9yIGRldGFpbHMuCi0KLUEgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtYXJxdWVzc0BiZnNlYy5idC5jby51az4KLWlzIGluIHRoZSBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcwotaHR0cDovL3d3dy5jcGFuLm9yZy9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy8KLQotQSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIDxhbWtAbWFnbmV0LmNvbT4KLWlzIGF2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9ucywgc2VlCi1odHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2xpYi9tb2R1bGUtemxpYi5odG1sCi0KLUEgemxpYiBiaW5kaW5nIGZvciBUQ0wgd3JpdHRlbiBieSBBbmRyZWFzIEt1cHJpZXMgPGEua3Vwcmllc0B3ZXN0ZW5kLmNvbT4KLWlzIGF2YWlsbGFibGUgYXQgaHR0cDovL3d3dy53ZXN0ZW5kLmNvbS9+a3Vwcmllcy9kb2MvdHJmL21hbi9tYW4uaHRtbAotCi1BbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwKLXdyaXR0ZW4gb24gdG9wIG9mIHpsaWIgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPiwgaXMKLWF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKLWFuZCBhbHNvIGluIHRoZSBjb250cmliL21pbml6aXAgZGlyZWN0b3J5IG9mIHpsaWIuCi0KLQotTm90ZXMgZm9yIHNvbWUgdGFyZ2V0czoKLQotLSBUbyBidWlsZCBhIFdpbmRvd3MgRExMIHZlcnNpb24sIGluY2x1ZGUgaW4gYSBETEwgcHJvamVjdCB6bGliLmRlZiwgemxpYi5yYwotICBhbmQgYWxsIC5jIGZpbGVzIGV4Y2VwdCBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmM7IGNvbXBpbGUgd2l0aCAtRFpMSUJfRExMCi0gIFRoZSB6bGliIERMTCBzdXBwb3J0IHdhcyBpbml0aWFsbHkgZG9uZSBieSBBbGVzc2FuZHJvIElhY29wZXR0aSBhbmQgaXMKLSAgbm93IG1haW50YWluZWQgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPi4gQ2hlY2sgdGhlIHpsaWIgRExMCi0gIGhvbWUgcGFnZSBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsCi0KLSAgRnJvbSBWaXN1YWwgQmFzaWMsIHlvdSBjYW4gY2FsbCB0aGUgRExMIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgdGFrZQotICBhIHN0cnVjdHVyZSBhcyBhcmd1bWVudDogY29tcHJlc3MsIHVuY29tcHJlc3MgYW5kIGFsbCBneiogZnVuY3Rpb25zLgotICBTZWUgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLCBvciBnZXQKLSAgaHR0cDovL3d3dy50Y2ZiLmNvbS9kb3dzZXdhcmUvY21wLXotaXQuemlwCi0KLS0gRm9yIDY0LWJpdCBJcml4LCBkZWZsYXRlLmMgbXVzdCBiZSBjb21waWxlZCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24uCi0gIFdpdGggLU8sIG9uZSBsaWJwbmcgdGVzdCBmYWlscy4gVGhlIHRlc3Qgd29ya3MgaW4gMzIgYml0IG1vZGUgKHdpdGgKLSAgdGhlIC1uMzIgY29tcGlsZXIgZmxhZykuIFRoZSBjb21waWxlciBidWcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gU0dJLgotCi0tIHpsaWIgZG9lc24ndCB3b3JrIHdpdGggZ2NjIDIuNi4zIG9uIGEgREVDIDMwMDAvMzAwTFggdW5kZXIgT1NGLzEgMi4xICAgCi0gIGl0IHdvcmtzIHdoZW4gY29tcGlsZWQgd2l0aCBjYy4KLQotLSBvbiBEaWdpdGFsIFVuaXggNC4wRCAoZm9ybWVseSBPU0YvMSkgb24gQWxwaGFTZXJ2ZXIsIHRoZSBjYyBvcHRpb24gLXN0ZDEKLSAgaXMgbmVjZXNzYXJ5IHRvIGdldCBnenByaW50ZiB3b3JraW5nIGNvcnJlY3RseS4gVGhpcyBpcyBkb25lIGJ5IGNvbmZpZ3VyZS4KLQotLSB6bGliIGRvZXNuJ3Qgd29yayBvbiBIUC1VWCA5LjA1IHdpdGggc29tZSB2ZXJzaW9ucyBvZiAvYmluL2NjLiBJdCB3b3JrcwotICB3aXRoIG90aGVyIGNvbXBpbGVycy4gVXNlICJtYWtlIHRlc3QiIHRvIGNoZWNrIHlvdXIgY29tcGlsZXIuCi0KLS0gZ3pkb3BlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFJJU0NPUywgQkVPUyBhbmQgYnkgc29tZSBNYWMgY29tcGlsZXJzLgotCi0tIEZvciBUdXJibyBDIHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgb25seSB3aXRoIHJlZHVjZWQgcGVyZm9ybWFuY2UgdG8KLSAgYXZvaWQgYW55IGZhciBhbGxvY2F0aW9uOyBpdCB3YXMgdGVzdGVkIHdpdGggLURNQVhfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKLQotLSBGb3IgUGFsbU9zLCBzZWUgaHR0cDovL3d3dy5jcy51aXQubm8vfnBlcm0vUEFTVEEvcGlsb3Qvc29mdHdhcmUuaHRtbAotICBQZXIgSGFyYWxkIE15cnZhbmcgPHBlcm1Ac3R1ZC5jcy51aXQubm8+Ci0KLQotQWNrbm93bGVkZ21lbnRzOgotCi0gIFRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5IHpsaWIgd2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LiBUaGUgZGVmbGF0ZQotICBhbmQgemxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gUGV0ZXIgRGV1dHNjaC4gVGhhbmtzIHRvIGFsbCB0aGUKLSAgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7Ci0gIHRoZXkgYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCi0KLUNvcHlyaWdodCBub3RpY2U6Ci0KLSAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLUlmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIHdlIHdvdWxkIGFwcHJlY2lhdGUgKm5vdCoKLXJlY2VpdmluZyBsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyB0byBzaWduLiBUaGUgc291cmNlcyBhcmUgcHJvdmlkZWQKLWZvciBmcmVlIGJ1dCB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLiAgVGhlIGxpYnJhcnkgaGFzIGJlZW4KLWVudGlyZWx5IHdyaXR0ZW4gYnkgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcjsgaXQgZG9lcyBub3QKLWluY2x1ZGUgdGhpcmQtcGFydHkgY29kZS4KLQotSWYgeW91IHJlZGlzdHJpYnV0ZSBtb2RpZmllZCBzb3VyY2VzLCB3ZSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGluY2x1ZGUKLWluIHRoZSBmaWxlIENoYW5nZUxvZyBoaXN0b3J5IGluZm9ybWF0aW9uIGRvY3VtZW50aW5nIHlvdXIgY2hhbmdlcy4KK1RoaXMgaXMgYSBsb2NhbCBjb3B5IG9mIHRoZSB6bGliIGxpYnJhcnksIHZlcnNpb24gMS4xLjQuIFVubmVlZGVkIHBhcnRzIGFyZQorcmVtb3ZlZCwgY2hlY2sgaHR0cDovL3psaWIubmV0IGZvciBmdWxsIHNvdXJjZSBhbmQgbW9yZSBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL2FsZ29yaXRobS50eHQgYi9jb21tb24vemxpYi9hbGdvcml0aG0udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGM4MzBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL2FsZ29yaXRobS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQotCi1UaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgotTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCi10aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCi1wb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCi1sZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKLXRvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKLTMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcwotZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAotYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKLQotTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAotbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAotaW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55Ci1zaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KLWF2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0Ci1pdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcwotc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQotCi1EdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKLWxlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgotdGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKLXN0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCi10aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KLQotVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bwotZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgotVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCi1oYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgotCi1UbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Ci10cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAotcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Ci1wb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCi0KLWRlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgotbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCi1hIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCi1wcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQotbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAotdGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgotc3RlcHMgbGF0ZXIuCi0KLVRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCi10aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKLW1hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCi1pbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCi10aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KLQotVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgotbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKLWFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgotd2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbwotYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCi0KLQotMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCi0KLTIuMSBJbnRyb2R1Y3Rpb24KLQotVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGdpdmVuIGEgSHVmZm1hbiB0cmVlLCBob3cgdG8gZGVjb2RlIGZhc3QuICBUaGUgbW9zdAotaW1wb3J0YW50IHJlYWxpemF0aW9uIGlzIHRoYXQgc2hvcnRlciBjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuCi1sb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlIHNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQKLXRoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KLQotaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCi1pbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCi1zdHJlYW0sIGFuZCBsb29rcyBpdCB1cCBpbiB0aGUgdGFibGUuICBUaGUgdGFibGUgd2lsbCB0ZWxsIGlmIHRoZSBuZXh0Ci1jb2RlIGlzIHRoYXQgbWFueSBiaXRzIG9yIGxlc3MgYW5kIGhvdyBtYW55LCBhbmQgaWYgaXQgaXMsIGl0IHdpbGwgdGVsbAotdGhlIHZhbHVlLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgbGV2ZWwgdGFibGUgZm9yIHdoaWNoIGluZmxhdGUoKQotZ3JhYnMgbW9yZSBiaXRzIGFuZCB0cmllcyB0byBkZWNvZGUgYSBsb25nZXIgY29kZS4KLQotSG93IG1hbnkgYml0cyB0byBtYWtlIHRoZSBmaXJzdCBsb29rdXAgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSB0aW1lIGl0Ci10YWtlcyB0byBkZWNvZGUgYW5kIHRoZSB0aW1lIGl0IHRha2VzIHRvIGJ1aWxkIHRoZSB0YWJsZS4gIElmIGJ1aWxkaW5nIHRoZQotdGFibGUgdG9vayBubyB0aW1lIChhbmQgaWYgeW91IGhhZCBpbmZpbml0ZSBtZW1vcnkpLCB0aGVuIHRoZXJlIHdvdWxkIG9ubHkKLWJlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCi1idWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKLWNvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcwotc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgc2V0IGl0Ci1mb3IgdGhlIG1heGltdW0gc3BlZWQuCi0KLWluZmxhdGUoKSBzZW5kcyBuZXcgdHJlZXMgcmVsYXRpdmVseSBvZnRlbiwgc28gaXQgaXMgcG9zc2libHkgc2V0IGZvciBhCi1zbWFsbGVyIGZpcnN0IGxldmVsIHRhYmxlIHRoYW4gYW4gYXBwbGljYXRpb24gdGhhdCBoYXMgb25seSBvbmUgdHJlZSBmb3IKLWFsbCB0aGUgZGF0YS4gIEZvciBpbmZsYXRlLCB3aGljaCBoYXMgMjg2IHBvc3NpYmxlIGNvZGVzIGZvciB0aGUKLWxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBuaW5lIGJpdHMuICBBbHNvIHRoZQotZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZSB2YWx1ZXMsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgdGFibGUgaXMKLXNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mIHRob3NlIGNhc2VzLCB0aGUgdGFibGUgZW5kZWQgdXAgb25lIGJpdAotbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUgbGVuZ3RoLCBpLmUuIHRoZSBjb2RlIGxlbmd0aCBvZiBhbgotYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYSBsaXR0bGUgbW9yZSB0aGFuIGVpZ2h0IGJpdHMgZm9yCi0yODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cyBmb3IgMzAgc3ltYm9scy4gIEl0IHdvdWxkIGJlCi1pbnRlcmVzdGluZyB0byBzZWUgaWYgb3B0aW1pemluZyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIG90aGVyCi1hcHBsaWNhdGlvbnMgZ2F2ZSB2YWx1ZXMgd2l0aGluIGEgYml0IG9yIHR3byBvZiB0aGUgZmxhdCBjb2RlIHNpemUuCi0KLQotMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKLQotT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5ICAKLWxvb2tzIGxpa2UuICBZb3UgYXJlIGNvcnJlY3QgdGhhdCBpdCdzIG5vdCBhIEh1ZmZtYW4gdHJlZS4gIEl0IGlzIHNpbXBseSBhICAKLWxvb2t1cCB0YWJsZSBmb3IgdGhlIGZpcnN0LCBsZXQncyBzYXksIG5pbmUgYml0cyBvZiBhIEh1ZmZtYW4gc3ltYm9sLiAgVGhlICAKLXN5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhciAgCi1zeW1ib2wgaXMgc2hvcnRlciB0aGFuIG5pbmUgYml0cywgdGhlbiB0aGF0IHN5bWJvbCdzIHRyYW5zbGF0aW9uIGlzIGR1cGxpY2F0ZWQKLWluIGFsbCB0aG9zZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aCB0aGF0IHN5bWJvbCdzIGJpdHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlICAKLXN5bWJvbCBpcyBmb3VyIGJpdHMsIHRoZW4gaXQncyBkdXBsaWNhdGVkIDMyIHRpbWVzIGluIGEgbmluZS1iaXQgdGFibGUuICBJZiBhICAKLXN5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KLQotSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzICAKLXRvIGFub3RoZXIgc2ltaWxhciB0YWJsZSBmb3IgdGhlIHJlbWFpbmluZyBiaXRzLiAgQWdhaW4sIHRoZXJlIGFyZSBkdXBsaWNhdGVkICAKLWVudHJpZXMgYXMgbmVlZGVkLiAgVGhlIGlkZWEgaXMgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBzeW1ib2wgd2lsbCBiZSBzaG9ydAotYW5kIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGFibGUgbG9vayB1cC4gIChUaGF0J3Mgd2hvbGUgaWRlYSBiZWhpbmQgZGF0YSAgCi1jb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUgIAotd2lsbCBiZSB0d28gbG9va3Vwcy4gIElmIHlvdSBoYWQgYSBjb21wcmVzc2lvbiBtZXRob2Qgd2l0aCByZWFsbHkgbG9uZyAgCi1zeW1ib2xzLCB5b3UgY291bGQgaGF2ZSBhcyBtYW55IGxldmVscyBvZiBsb29rdXBzIGFzIGlzIGVmZmljaWVudC4gIEZvciAgCi1pbmZsYXRlLCB0d28gaXMgZW5vdWdoLgotCi1TbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4gIAotdGhlIGFib3ZlIGV4YW1wbGUgYXJlIGdvYmJsZWQpLCBvciBpdCBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBzeW1ib2wgIAotYW5kIHRoZSBudW1iZXIgb2YgYml0cyB0byBnb2JibGUuICBUaGVuIHlvdSBzdGFydCBhZ2FpbiB3aXRoIHRoZSBuZXh0ICAKLXVuZ29iYmxlZCBiaXQuCi0KLVlvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlICAKLWxvbmdlc3Qgc3ltYm9sIGlzPyAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHlvdSBkbyB0aGF0LCB5b3UgZW5kIHVwIHNwZW5kaW5nICAKLW1vcmUgdGltZSBmaWxsaW5nIGluIGR1cGxpY2F0ZSBzeW1ib2wgZW50cmllcyB0aGFuIHlvdSBkbyBhY3R1YWxseSBkZWNvZGluZy4gICAKLUF0IGxlYXN0IGZvciBkZWZsYXRlJ3Mgb3V0cHV0IHRoYXQgZ2VuZXJhdGVzIG5ldyB0cmVlcyBldmVyeSBzZXZlcmFsIDEwJ3Mgb2YgIAota2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUgIAotd291bGQgdGFrZSB0b28gbG9uZyBpZiB5b3UncmUgb25seSBkZWNvZGluZyBzZXZlcmFsIHRob3VzYW5kIHN5bWJvbHMuICBBdCB0aGUgIAotb3RoZXIgZXh0cmVtZSwgeW91IGNvdWxkIG1ha2UgYSBuZXcgdGFibGUgZm9yIGV2ZXJ5IGJpdCBpbiB0aGUgY29kZS4gIEluIGZhY3QsCi10aGF0J3MgZXNzZW50aWFsbHkgYSBIdWZmbWFuIHRyZWUuICBCdXQgdGhlbiB5b3Ugc3BlbmQgdHdvIG11Y2ggdGltZSAgCi10cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgotCi1TbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0byAgCi1maWxsIG91dCB0aGUgdGFibGUgdnMuIHRoZSB0aW1lIHNwZW50IGxvb2tpbmcgYXQgdGhlIHNlY29uZCBsZXZlbCBhbmQgYWJvdmUgb2YKLXRoZSB0YWJsZS4KLQotSGVyZSBpcyBhbiBleGFtcGxlLCBzY2FsZWQgZG93bjoKLQotVGhlIGNvZGUgYmVpbmcgZGVjb2RlZCwgd2l0aCAxMCBzeW1ib2xzLCBmcm9tIDEgdG8gNiBiaXRzIGxvbmc6Ci0KLUE6IDAKLUI6IDEwCi1DOiAxMTAwCi1EOiAxMTAxMAotRTogMTEwMTEKLUY6IDExMTAwCi1HOiAxMTEwMQotSDogMTExMTAKLUk6IDExMTExMAotSjogMTExMTExCi0KLUxldCdzIG1ha2UgdGhlIGZpcnN0IHRhYmxlIHRocmVlIGJpdHMgbG9uZyAoZWlnaHQgZW50cmllcyk6Ci0KLTAwMDogQSwxCi0wMDE6IEEsMQotMDEwOiBBLDEKLTAxMTogQSwxCi0xMDA6IEIsMgotMTAxOiBCLDIKLTExMDogLT4gdGFibGUgWCAoZ29iYmxlIDMgYml0cykKLTExMTogLT4gdGFibGUgWSAoZ29iYmxlIDMgYml0cykKLQotRWFjaCBlbnRyeSBpcyB3aGF0IHRoZSBiaXRzIGRlY29kZSB0byBhbmQgaG93IG1hbnkgYml0cyB0aGF0IGlzLCBpLmUuIGhvdyAgCi1tYW55IGJpdHMgdG8gZ29iYmxlLiAgT3IgdGhlIGVudHJ5IHBvaW50cyB0byBhbm90aGVyIHRhYmxlLCB3aXRoIHRoZSBudW1iZXIgb2YKLWJpdHMgdG8gZ29iYmxlIGltcGxpY2l0IGluIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KLQotVGFibGUgWCBpcyB0d28gYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTAgaXMgZml2ZSBiaXRzCi1sb25nOgotCi0wMDogQywxCi0wMTogQywxCi0xMDogRCwyCi0xMTogRSwyCi0KLVRhYmxlIFkgaXMgdGhyZWUgYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTEgaXMgc2l4ICAKLWJpdHMgbG9uZzoKLQotMDAwOiBGLDIKLTAwMTogRiwyCi0wMTA6IEcsMgotMDExOiBHLDIKLTEwMDogSCwyCi0xMDE6IEgsMgotMTEwOiBJLDMKLTExMTogSiwzCi0KLVNvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8gIAotYmUgY29uc3RydWN0ZWQuICBUaGF0J3MgY29tcGFyZWQgdG8gNjQgZW50cmllcyBmb3IgYSBzaW5nbGUgdGFibGUuICBPciAgCi1jb21wYXJlZCB0byAxNiBlbnRyaWVzIGZvciBhIEh1ZmZtYW4gdHJlZSAoc2l4IHR3byBlbnRyeSB0YWJsZXMgYW5kIG9uZSBmb3VyICAKLWVudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZiAgCi10aGUgc3ltYm9scywgaXQgdGFrZXMgb24gdGhlIGF2ZXJhZ2UgMS4yNSBsb29rdXBzIHBlciBzeW1ib2wuICBUaGF0J3MgY29tcGFyZWQKLXRvIG9uZSBsb29rdXAgZm9yIHRoZSBzaW5nbGUgdGFibGUsIG9yIDEuNjYgbG9va3VwcyBwZXIgc3ltYm9sIGZvciB0aGUgIAotSHVmZm1hbiB0cmVlLgotCi1UaGVyZSwgSSB0aGluayB0aGF0IGdpdmVzIHlvdSBhIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLiAgRm9yIGluZmxhdGUsIHRoZSAgCi1tZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYSAgCi1ieXRlIChhICJsaXRlcmFsIiksIG9yIGl0IGNhbiBiZSBlaXRoZXIgYSBsZW5ndGggb3IgYSBkaXN0YW5jZSB3aGljaCAgCi1pbmRpY2F0ZXMgYSBiYXNlIHZhbHVlIGFuZCBhIG51bWJlciBvZiBiaXRzIHRvIGZldGNoIGFmdGVyIHRoZSBjb2RlIHRoYXQgaXMgIAotYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZSAgCi1kYXRhIHN0cnVjdHVyZXMgY3JlYXRlZCBpbiBpbmZ0cmVlcy5jIHRyeSB0byBlbmNvZGUgYWxsIHRoYXQgaW5mb3JtYXRpb24gIAotY29tcGFjdGx5IGluIHRoZSB0YWJsZXMuCi0KLQotSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi0KLVJlZmVyZW5jZXM6Ci0KLVtMWjc3XSBaaXYgSi4sIExlbXBlbCBBLiwgYGBBIFVuaXZlcnNhbCBBbGdvcml0aG0gZm9yIFNlcXVlbnRpYWwgRGF0YQotQ29tcHJlc3Npb24sJycgSUVFRSBUcmFuc2FjdGlvbnMgb24gSW5mb3JtYXRpb24gVGhlb3J5LCBWb2wuIDIzLCBOby4gMywKLXBwLiAzMzctMzQzLgotCi1gYERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uJycgYXZhaWxhYmxlIGluCi1mdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi9kZXNjcmlwLm1tcyBiL2NvbW1vbi96bGliL2Rlc2NyaXAubW1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM2NDU5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL2Rlc2NyaXAubW1zCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBkZXNjcmlwLm1tczogTU1TIGRlc2NyaXB0aW9uIGZpbGUgZm9yIGJ1aWxkaW5nIHpsaWIgb24gVk1TCi0jIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyIDxtLnppbnNlckBnc2kuZGU+Ci0KLWNjX2RlZnMgPSAKLWNfZGViID0gCi0KLS5pZmRlZiBfX0RFQ0NfXwotcHJlZiA9IC9wcmVmaXg9YWxsCi0uZW5kaWYKLQotT0JKUyA9IGFkbGVyMzIub2JqLCBjb21wcmVzcy5vYmosIGNyYzMyLm9iaiwgZ3ppby5vYmosIHVuY29tcHIub2JqLFwKLSAgICAgICBkZWZsYXRlLm9iaiwgdHJlZXMub2JqLCB6dXRpbC5vYmosIGluZmxhdGUub2JqLCBpbmZibG9jay5vYmosXAotICAgICAgIGluZnRyZWVzLm9iaiwgaW5mY29kZXMub2JqLCBpbmZ1dGlsLm9iaiwgaW5mZmFzdC5vYmoKLQotQ0ZMQUdTPSAkKENfREVCKSAkKENDX0RFRlMpICQoUFJFRikKLQotYWxsIDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCi0gICAgICAgIEAgd3JpdGUgc3lzJG91dHB1dCAiIEV4YW1wbGUgYXBwbGljYXRpb25zIGF2YWlsYWJsZSIKLWxpYnoub2xiIDogbGliei5vbGIoJChPQkpTKSkKLQlAIHdyaXRlIHN5cyRvdXRwdXQgIiBsaWJ6IGF2YWlsYWJsZSIKLQotZXhhbXBsZS5leGUgOiBleGFtcGxlLm9iaiBsaWJ6Lm9sYgotICAgICAgICAgICAgICBsaW5rIGV4YW1wbGUsbGliei5vbGIvbGliCi0KLW1pbmlnemlwLmV4ZSA6IG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgotICAgICAgICAgICAgICBsaW5rIG1pbmlnemlwLGxpYnoub2xiL2xpYix4MTF2bXM6eHZtc3V0aWxzLm9sYi9saWIKLQotY2xlYW4gOiAKLQlkZWxldGUgKi5vYmo7KixsaWJ6Lm9sYjsqCi0KLQotIyBPdGhlciBkZXBlbmRlbmNpZXMuCi1hZGxlcjMyLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWNvbXByZXNzLm9iaiA6IHpsaWIuaCB6Y29uZi5oCi1jcmMzMi5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1kZWZsYXRlLm9iaiA6IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1leGFtcGxlLm9iaiA6IHpsaWIuaCB6Y29uZi5oCi1nemlvLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKLWluZmJsb2NrLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaCBpbmZ0cmVlcy5oIGluZmNvZGVzLmggaW5mdXRpbC5oCi1pbmZjb2Rlcy5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oIGluZmNvZGVzLmggaW5mZmFzdC5oCi1pbmZmYXN0Lm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmggaW5mZmFzdC5oCi1pbmZsYXRlLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAotaW5mdHJlZXMub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCi1pbmZ1dGlsLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmgKLW1pbmlnemlwLm9iaiA6IHpsaWIuaCB6Y29uZi5oCi10cmVlcy5vYmogOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotdW5jb21wci5vYmogOiB6bGliLmggemNvbmYuaAotenV0aWwub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvZXhhbXBsZS5jIGIvY29tbW9uL3psaWIvZXhhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU2NjJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL2V4YW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKiBleGFtcGxlLmMgLS0gdXNhZ2UgZXhhbXBsZSBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKLSAqLwotCi0vKiBAKCMpICRJZDogZXhhbXBsZS5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjUgY29uc3RfayBFeHAgJCAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSAgIGV4dGVybiB2b2lkIGV4aXQgIE9GKChpbnQpKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoUklTQ09TKQotIyAgZGVmaW5lIFRFU1RGSUxFICJmb28tZ3oiCi0jZWxzZQotIyAgZGVmaW5lIFRFU1RGSUxFICJmb28uZ3oiCi0jZW5kaWYKLQotI2RlZmluZSBDSEVDS19FUlIoZXJyLCBtc2cpIHsgXAotICAgIGlmIChlcnIgIT0gWl9PSykgeyBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3I6ICVkXG4iLCBtc2csIGVycik7IFwKLSAgICAgICAgZXhpdCgxKTsgXAotICAgIH0gXAotfQotCi1jb25zdCBjaGFyIGhlbGxvW10gPSAiaGVsbG8sIGhlbGxvISI7Ci0vKiAiaGVsbG8gd29ybGQiIHdvdWxkIGJlIG1vcmUgc3RhbmRhcmQsIGJ1dCB0aGUgcmVwZWF0ZWQgImhlbGxvIgotICogc3RyZXNzZXMgdGhlIGNvbXByZXNzaW9uIGNvZGUgYmV0dGVyLCBzb3JyeS4uLgotICovCi0KLWNvbnN0IGNoYXIgZGljdGlvbmFyeVtdID0gImhlbGxvIjsKLXVMb25nIGRpY3RJZDsgLyogQWRsZXIzMiB2YWx1ZSBvZiB0aGUgZGljdGlvbmFyeSAqLwotCi12b2lkIHRlc3RfY29tcHJlc3MgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZ3ppbyAgICAgICAgICBPRigoY29uc3QgY2hhciAqb3V0LCBjb25zdCBjaGFyICppbiwgCi0JCSAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIGludCB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZGVmbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7Ci12b2lkIHRlc3RfaW5mbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZSBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfbGFyZ2VfaW5mbGF0ZSBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAotCQkgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZmx1c2ggICAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nICpjb21wckxlbikpOwotdm9pZCB0ZXN0X3N5bmMgICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLQkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotdm9pZCB0ZXN0X2RpY3RfZGVmbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwotdm9pZCB0ZXN0X2RpY3RfaW5mbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLQkJICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwotaW50ICBtYWluICAgICAgICAgICAgICAgT0YoKGludCBhcmdjLCBjaGFyICphcmd2W10pKTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKQotICovCi12b2lkIHRlc3RfY29tcHJlc3MoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHVMb25nIGxlbiA9IHN0cmxlbihoZWxsbykrMTsKLQotICAgIGVyciA9IGNvbXByZXNzKGNvbXByLCAmY29tcHJMZW4sIChjb25zdCBCeXRlZiopaGVsbG8sIGxlbik7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImNvbXByZXNzIik7Ci0KLSAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7Ci0KLSAgICBlcnIgPSB1bmNvbXByZXNzKHVuY29tcHIsICZ1bmNvbXByTGVuLCBjb21wciwgY29tcHJMZW4pOwotICAgIENIRUNLX0VSUihlcnIsICJ1bmNvbXByZXNzIik7Ci0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgdW5jb21wcmVzc1xuIik7Ci0JZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoInVuY29tcHJlc3MoKTogJXNcbiIsIChjaGFyICopdW5jb21wcik7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgcmVhZC93cml0ZSBvZiAuZ3ogZmlsZXMKLSAqLwotdm9pZCB0ZXN0X2d6aW8ob3V0LCBpbiwgdW5jb21wciwgdW5jb21wckxlbikKLSAgICBjb25zdCBjaGFyICpvdXQ7IC8qIGNvbXByZXNzZWQgb3V0cHV0IGZpbGUgKi8KLSAgICBjb25zdCBjaGFyICppbjsgIC8qIGNvbXByZXNzZWQgaW5wdXQgZmlsZSAqLwotICAgIEJ5dGUgKnVuY29tcHI7Ci0gICAgaW50ICB1bmNvbXByTGVuOwotewotICAgIGludCBlcnI7Ci0gICAgaW50IGxlbiA9IHN0cmxlbihoZWxsbykrMTsKLSAgICBnekZpbGUgZmlsZTsKLSAgICB6X29mZl90IHBvczsKLQotICAgIGZpbGUgPSBnem9wZW4ob3V0LCAid2IiKTsKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pvcGVuIGVycm9yXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgZ3pwdXRjKGZpbGUsICdoJyk7Ci0gICAgaWYgKGd6cHV0cyhmaWxlLCAiZWxsbyIpICE9IDQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenB1dHMgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgaWYgKGd6cHJpbnRmKGZpbGUsICIsICVzISIsICJoZWxsbyIpICE9IDgpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenByaW50ZiBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBnenNlZWsoZmlsZSwgMUwsIFNFRUtfQ1VSKTsgLyogYWRkIG9uZSB6ZXJvIGJ5dGUgKi8KLSAgICBnemNsb3NlKGZpbGUpOwotCi0gICAgZmlsZSA9IGd6b3BlbihpbiwgInJiIik7Ci0gICAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7Ci0gICAgfQotICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKLQotICAgIHVuY29tcHJMZW4gPSBnenJlYWQoZmlsZSwgdW5jb21wciwgKHVuc2lnbmVkKXVuY29tcHJMZW4pOwotICAgIGlmICh1bmNvbXByTGVuICE9IGxlbikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cmVhZCBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgZ3pyZWFkOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOwotCWV4aXQoMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJnenJlYWQoKTogJXNcbiIsIChjaGFyICopdW5jb21wcik7Ci0gICAgfQotCi0gICAgcG9zID0gZ3pzZWVrKGZpbGUsIC04TCwgU0VFS19DVVIpOwotICAgIGlmIChwb3MgIT0gNiB8fCBnenRlbGwoZmlsZSkgIT0gcG9zKSB7Ci0JZnByaW50ZihzdGRlcnIsICJnenNlZWsgZXJyb3IsIHBvcz0lbGQsIGd6dGVsbD0lbGRcbiIsCi0JCShsb25nKXBvcywgKGxvbmcpZ3p0ZWxsKGZpbGUpKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChnemdldGMoZmlsZSkgIT0gJyAnKSB7Ci0JZnByaW50ZihzdGRlcnIsICJnemdldGMgZXJyb3JcbiIpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgZ3pnZXRzKGZpbGUsIChjaGFyKil1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgICB1bmNvbXByTGVuID0gc3RybGVuKChjaGFyKil1bmNvbXByKTsKLSAgICBpZiAodW5jb21wckxlbiAhPSA2KSB7IC8qICJoZWxsbyEiICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pnZXRzIGVyciBhZnRlciBnenNlZWs6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbys3KSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBnemdldHMgYWZ0ZXIgZ3pzZWVrXG4iKTsKLQlleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiZ3pnZXRzKCkgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci0KLSAgICBnemNsb3NlKGZpbGUpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycwotICovCi12b2lkIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW47Ci17Ci0gICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLwotICAgIGludCBlcnI7Ci0gICAgaW50IGxlbiA9IHN0cmxlbihoZWxsbykrMTsKLQotICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOwotCi0gICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWhlbGxvOwotICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7Ci0KLSAgICB3aGlsZSAoY19zdHJlYW0udG90YWxfaW4gIT0gKHVMb25nKWxlbiAmJiBjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgewotICAgICAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IGNfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KLSAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIH0KLSAgICAvKiBGaW5pc2ggdGhlIHN0cmVhbSwgc3RpbGwgZm9yY2luZyBzbWFsbCBidWZmZXJzOiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gMTsKLSAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIH0KLQotICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycwotICovCi12b2lkIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIGludCBlcnI7Ci0gICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCi0KLSAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7Ci0KLSAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7Ci0gICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAwOwotICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKLQotICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7Ci0KLSAgICB3aGlsZSAoZF9zdHJlYW0udG90YWxfb3V0IDwgdW5jb21wckxlbiAmJiBkX3N0cmVhbS50b3RhbF9pbiA8IGNvbXByTGVuKSB7Ci0gICAgICAgIGRfc3RyZWFtLmF2YWlsX2luID0gZF9zdHJlYW0uYXZhaWxfb3V0ID0gMTsgLyogZm9yY2Ugc21hbGwgYnVmZmVycyAqLwotICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7Ci0gICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKLSAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGUiKTsKLSAgICB9Ci0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKLQotICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBpbmZsYXRlXG4iKTsKLQlleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiaW5mbGF0ZSgpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlKCkgd2l0aCBsYXJnZSBidWZmZXJzIGFuZCBkeW5hbWljIGNoYW5nZSBvZiBjb21wcmVzc2lvbiBsZXZlbAotICovCi12b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KLSAgICBpbnQgZXJyOwotCi0gICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9TUEVFRCk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7Ci0KLSAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOwotICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOwotCi0gICAgLyogQXQgdGhpcyBwb2ludCwgdW5jb21wciBpcyBzdGlsbCBtb3N0bHkgemVyb2VzLCBzbyBpdCBzaG91bGQgY29tcHJlc3MKLSAgICAgKiB2ZXJ5IHdlbGw6Ci0gICAgICovCi0gICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIC8qIEZlZWQgaW4gYWxyZWFkeSBjb21wcmVzc2VkIGRhdGEgYW5kIHN3aXRjaCB0byBubyBjb21wcmVzc2lvbjogKi8KLSAgICBkZWZsYXRlUGFyYW1zKCZjX3N0cmVhbSwgWl9OT19DT01QUkVTU0lPTiwgWl9ERUZBVUxUX1NUUkFURUdZKTsKLSAgICBjX3N0cmVhbS5uZXh0X2luID0gY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbi8yOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotCi0gICAgLyogU3dpdGNoIGJhY2sgdG8gY29tcHJlc3NpbmcgbW9kZTogKi8KLSAgICBkZWZsYXRlUGFyYW1zKCZjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OLCBaX0ZJTFRFUkVEKTsKLSAgICBjX3N0cmVhbS5uZXh0X2luID0gdW5jb21wcjsKLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXVuY29tcHJMZW47Ci0gICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7Ci0KLSAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOwotICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORFxuIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBpbmZsYXRlKCkgd2l0aCBsYXJnZSBidWZmZXJzCi0gKi8KLXZvaWQgdGVzdF9sYXJnZV9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKLSAgICBCeXRlICpjb21wciwgKnVuY29tcHI7Ci0gICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Ci17Ci0gICAgaW50IGVycjsKLSAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KLQotICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKLQotICAgIGRfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgZF9zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKLSAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOwotCi0gICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOyAgICAgICAgICAgIC8qIGRpc2NhcmQgdGhlIG91dHB1dCAqLwotCWRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47Ci0gICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgICAgICBDSEVDS19FUlIoZXJyLCAibGFyZ2UgaW5mbGF0ZSIpOwotICAgIH0KLQotICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOwotCi0gICAgaWYgKGRfc3RyZWFtLnRvdGFsX291dCAhPSAyKnVuY29tcHJMZW4gKyBjb21wckxlbi8yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGxhcmdlIGluZmxhdGU6ICVsZFxuIiwgZF9zdHJlYW0udG90YWxfb3V0KTsKLQlleGl0KDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigibGFyZ2VfaW5mbGF0ZSgpOiBPS1xuIik7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggZnVsbCBmbHVzaAotICovCi12b2lkIHRlc3RfZmx1c2goY29tcHIsIGNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByOwotICAgIHVMb25nICpjb21wckxlbjsKLXsKLSAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCi0gICAgaW50IGVycjsKLSAgICBpbnQgbGVuID0gc3RybGVuKGhlbGxvKSsxOwotCi0gICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7Ci0KLSAgICBjX3N0cmVhbS5uZXh0X2luICA9IChCeXRlZiopaGVsbG87Ci0gICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IDM7Ci0gICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmNvbXByTGVuOwotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZVTExfRkxVU0gpOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7Ci0KLSAgICBjb21wclszXSsrOyAvKiBmb3JjZSBhbiBlcnJvciBpbiBmaXJzdCBjb21wcmVzc2VkIGJsb2NrICovCi0gICAgY19zdHJlYW0uYXZhaWxfaW4gPSBsZW4gLSAzOwotCi0gICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKLSAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgewotICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOwotICAgIH0KLSAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKLQotICAgICpjb21wckxlbiA9IGNfc3RyZWFtLnRvdGFsX291dDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGVTeW5jKCkKLSAqLwotdm9pZCB0ZXN0X3N5bmMoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQotICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKLSAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKLXsKLSAgICBpbnQgZXJyOwotICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLwotCi0gICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwotCi0gICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7Ci0KLSAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMjsgLyoganVzdCByZWFkIHRoZSB6bGliIGhlYWRlciAqLwotCi0gICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKLQotICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKLSAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOwotCi0gICAgaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIik7Ci0KLSAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuLTI7ICAgLyogcmVhZCBhbGwgY29tcHJlc3NlZCBkYXRhICovCi0gICAgZXJyID0gaW5mbGF0ZVN5bmMoJmRfc3RyZWFtKTsgICAgICAgICAgIC8qIGJ1dCBza2lwIHRoZSBkYW1hZ2VkIHBhcnQgKi8KLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZVN5bmMiKTsKLQotICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgKGVyciAhPSBaX0RBVEFfRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmZsYXRlIHNob3VsZCByZXBvcnQgREFUQV9FUlJPUlxuIik7Ci0gICAgICAgIC8qIEJlY2F1c2Ugb2YgaW5jb3JyZWN0IGFkbGVyMzIgKi8KLQlleGl0KDEpOwotICAgIH0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKLQotICAgIHByaW50ZigiYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJXNcbiIsIChjaGFyICopdW5jb21wcik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGVzdCBkZWZsYXRlKCkgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQotICovCi12b2lkIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbikKLSAgICBCeXRlICpjb21wcjsKLSAgICB1TG9uZyBjb21wckxlbjsKLXsKLSAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCi0gICAgaW50IGVycjsKLQotICAgIGNfc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7Ci0gICAgY19zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOwotICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOwotCi0gICAgZXJyID0gZGVmbGF0ZVNldERpY3Rpb25hcnkoJmNfc3RyZWFtLAotCQkJICAgICAgIChjb25zdCBCeXRlZiopZGljdGlvbmFyeSwgc2l6ZW9mKGRpY3Rpb25hcnkpKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZVNldERpY3Rpb25hcnkiKTsKLQotICAgIGRpY3RJZCA9IGNfc3RyZWFtLmFkbGVyOwotICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7Ci0gICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpY29tcHJMZW47Ci0KLSAgICBjX3N0cmVhbS5uZXh0X2luID0gKEJ5dGVmKiloZWxsbzsKLSAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXN0cmxlbihoZWxsbykrMTsKLQotICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7Ci0gICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUZXN0IGluZmxhdGUoKSB3aXRoIGEgcHJlc2V0IGRpY3Rpb25hcnkKLSAqLwotdm9pZCB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCi0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOwotewotICAgIGludCBlcnI7Ci0gICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCi0KLSAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7Ci0KLSAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwotICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLQotICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7Ci0gICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbjsKLQotICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7Ci0KLSAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7Ci0gICAgZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOwotICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7Ci0JaWYgKGVyciA9PSBaX05FRURfRElDVCkgewotCSAgICBpZiAoZF9zdHJlYW0uYWRsZXIgIT0gZGljdElkKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCBkaWN0aW9uYXJ5Iik7Ci0JCWV4aXQoMSk7Ci0JICAgIH0KLQkgICAgZXJyID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJmRfc3RyZWFtLCAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksCi0JCQkJICAgICAgIHNpemVvZihkaWN0aW9uYXJ5KSk7Ci0JfQotICAgICAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZSB3aXRoIGRpY3QiKTsKLSAgICB9Ci0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKLQotICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBpbmZsYXRlIHdpdGggZGljdFxuIik7Ci0JZXhpdCgxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoImluZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBleGFtcGxlIFtvdXRwdXQuZ3ogIFtpbnB1dC5nel1dCi0gKi8KLQotaW50IG1haW4oYXJnYywgYXJndikKLSAgICBpbnQgYXJnYzsKLSAgICBjaGFyICphcmd2W107Ci17Ci0gICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOwotICAgIHVMb25nIGNvbXByTGVuID0gMTAwMDAqc2l6ZW9mKGludCk7IC8qIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICovCi0gICAgdUxvbmcgdW5jb21wckxlbiA9IGNvbXByTGVuOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteVZlcnNpb24gPSBaTElCX1ZFUlNJT047Ci0KLSAgICBpZiAoemxpYlZlcnNpb24oKVswXSAhPSBteVZlcnNpb25bMF0pIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLQotICAgIH0gZWxzZSBpZiAoc3RyY21wKHpsaWJWZXJzaW9uKCksIFpMSUJfVkVSU0lPTikgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGRpZmZlcmVudCB6bGliIHZlcnNpb25cbiIpOwotICAgIH0KLQotICAgIGNvbXByICAgID0gKEJ5dGUqKWNhbGxvYygodUludCljb21wckxlbiwgMSk7Ci0gICAgdW5jb21wciAgPSAoQnl0ZSopY2FsbG9jKCh1SW50KXVuY29tcHJMZW4sIDEpOwotICAgIC8qIGNvbXByIGFuZCB1bmNvbXByIGFyZSBjbGVhcmVkIHRvIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZAotICAgICAqIGRhdGEgYW5kIHRvIGVuc3VyZSB0aGF0IHVuY29tcHIgY29tcHJlc3NlcyB3ZWxsLgotICAgICAqLwotICAgIGlmIChjb21wciA9PSBaX05VTEwgfHwgdW5jb21wciA9PSBaX05VTEwpIHsKLSAgICAgICAgcHJpbnRmKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0KLSAgICB0ZXN0X2d6aW8oKGFyZ2MgPiAxID8gYXJndlsxXSA6IFRFU1RGSUxFKSwKLSAgICAgICAgICAgICAgKGFyZ2MgPiAyID8gYXJndlsyXSA6IFRFU1RGSUxFKSwKLQkgICAgICB1bmNvbXByLCAoaW50KXVuY29tcHJMZW4pOwotCi0gICAgdGVzdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7Ci0gICAgdGVzdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0KLSAgICB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLSAgICB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKLQotICAgIHRlc3RfZmx1c2goY29tcHIsICZjb21wckxlbik7Ci0gICAgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7Ci0gICAgY29tcHJMZW4gPSB1bmNvbXByTGVuOwotCi0gICAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKLSAgICB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwotCi0gICAgZXhpdCgwKTsKLSAgICByZXR1cm4gMDsgLyogdG8gYXZvaWQgd2FybmluZyAqLwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvbWFrZXRyZWUuYyBiL2NvbW1vbi96bGliL21ha2V0cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNmQ0YjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3psaWIvbWFrZXRyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qIG1ha2V0cmVlLmMgLS0gbWFrZSBpbmZmaXhlZC5oIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogVGhpcyBwcm9ncmFtIGlzIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGNvbXBsZXRlbmVzcy4KLSAgIFlvdSBkbyBub3QgbmVlZCB0byBjb21waWxlIG9yIHJ1biB0aGlzIHByb2dyYW0gc2luY2UgaW5mZml4ZWQuaAotICAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVG8gdXNlIHRoaXMgcHJvZ3JhbQotICAgeW91IG5lZWQgdG8gY29tcGlsZSB6bGliIHdpdGggQlVJTERGSVhFRCBkZWZpbmVkIGFuZCB0aGVuIGNvbXBpbGUKLSAgIGFuZCBsaW5rIHRoaXMgcHJvZ3JhbSB3aXRoIHRoZSB6bGliIGxpYnJhcnkuICBUaGVuIHRoZSBvdXRwdXQgb2YKLSAgIHRoaXMgcHJvZ3JhbSBjYW4gYmUgcGlwZWQgdG8gaW5mZml4ZWQuaC4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAienV0aWwuaCIKLSNpbmNsdWRlICJpbmZ0cmVlcy5oIgotCi0vKiBzaW1wbGlmeSB0aGUgdXNlIG9mIHRoZSBpbmZsYXRlX2h1ZnQgdHlwZSB3aXRoIHNvbWUgZGVmaW5lcyAqLwotI2RlZmluZSBleG9wIHdvcmQud2hhdC5FeG9wCi0jZGVmaW5lIGJpdHMgd29yZC53aGF0LkJpdHMKLQotLyogZ2VuZXJhdGUgaW5pdGlhbGl6YXRpb24gdGFibGUgZm9yIGFuIGluZmxhdGVfaHVmdCBzdHJ1Y3R1cmUgYXJyYXkgKi8KLXZvaWQgbWFrZXRyZWUodUludCBiLCBpbmZsYXRlX2h1ZnQgKnQpCi17Ci0gIGludCBpLCBlOwotCi0gIGkgPSAwOwotICB3aGlsZSAoMSkKLSAgewotICAgIGUgPSB0W2ldLmV4b3A7Ci0gICAgaWYgKGUgJiYgKGUgJiAoMTYrNjQpKSA9PSAwKSAgICAgICAgLyogdGFibGUgcG9pbnRlciAqLwotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXRyZWU6IGNhbm5vdCBpbml0aWFsaXplIHN1Yi10YWJsZXMhXG4iKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGlmIChpICUgNCA9PSAwKQotICAgICAgcHJpbnRmKCJcbiAgICIpOwotICAgIHByaW50ZigiIHt7eyV1LCV1fX0sJXV9IiwgdFtpXS5leG9wLCB0W2ldLmJpdHMsIHRbaV0uYmFzZSk7Ci0gICAgaWYgKCsraSA9PSAoMTw8YikpCi0gICAgICBicmVhazsKLSAgICBwdXRjaGFyKCcsJyk7Ci0gIH0KLSAgcHV0cygiIik7Ci19Ci0KLS8qIGNyZWF0ZSB0aGUgZml4ZWQgdGFibGVzIGluIEMgaW5pdGlhbGl6YXRpb24gc3ludGF4ICovCi12b2lkIG1haW4odm9pZCkKLXsKLSAgaW50IHI7Ci0gIHVJbnQgYmwsIGJkOwotICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7Ci0gIHpfc3RyZWFtIHo7Ci0KLSAgei56YWxsb2MgPSB6Y2FsbG9jOwotICB6Lm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSAgei56ZnJlZSA9IHpjZnJlZTsKLSAgciA9IGluZmxhdGVfdHJlZXNfZml4ZWQoJmJsLCAmYmQsICZ0bCwgJnRkLCAmeik7Ci0gIGlmIChyKQotICB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJpbmZsYXRlX3RyZWVzX2ZpeGVkIGVycm9yICVkXG4iLCByKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcHV0cygiLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMiKTsKLSAgcHV0cygiICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIG1ha2V0cmVlLmMgcHJvZ3JhbSIpOwotICBwdXRzKCIgKi8iKTsKLSAgcHV0cygiIik7Ci0gIHB1dHMoIi8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzIik7Ci0gIHB1dHMoIiAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcyIpOwotICBwdXRzKCIgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguIik7Ci0gIHB1dHMoIiAqLyIpOwotICBwdXRzKCIiKTsKLSAgcHJpbnRmKCJsb2NhbCB1SW50IGZpeGVkX2JsID0gJWQ7XG4iLCBibCk7Ci0gIHByaW50ZigibG9jYWwgdUludCBmaXhlZF9iZCA9ICVkO1xuIiwgYmQpOwotICBwcmludGYoImxvY2FsIGluZmxhdGVfaHVmdCBmaXhlZF90bFtdID0geyIpOwotICBtYWtldHJlZShibCwgdGwpOwotICBwdXRzKCIgIH07Iik7Ci0gIHByaW50ZigibG9jYWwgaW5mbGF0ZV9odWZ0IGZpeGVkX3RkW10gPSB7Iik7Ci0gIG1ha2V0cmVlKGJkLCB0ZCk7Ci0gIHB1dHMoIiAgfTsiKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi96bGliL21pbmlnemlwLmMgYi9jb21tb24vemxpYi9taW5pZ3ppcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDUwODc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi96bGliL21pbmlnemlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyogbWluaWd6aXAuYyAtLSBzaW11bGF0ZSBnemlwIHVzaW5nIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAotICovCi0KLS8qCi0gKiBtaW5pZ3ppcCBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGd6aXAgdXRpbGl0eS4gVGhpcyBpcwotICogb25seSBhbiBleGFtcGxlIG9mIHVzaW5nIHpsaWIgYW5kIGlzbid0IG1lYW50IHRvIHJlcGxhY2UgdGhlCi0gKiBmdWxsLWZlYXR1cmVkIGd6aXAuIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZWFsIHdpdGggZmlsZSBzeXN0ZW1zCi0gKiBsaW1pdGluZyBuYW1lcyB0byAxNCBvciA4KzMgY2hhcmFjdGVycywgZXRjLi4uIEVycm9yIGNoZWNraW5nIGlzCi0gKiB2ZXJ5IGxpbWl0ZWQuIFNvIHVzZSBtaW5pZ3ppcCBvbmx5IGZvciB0ZXN0aW5nOyB1c2UgZ3ppcCBmb3IgdGhlCi0gKiByZWFsIHRoaW5nLiBPbiBNU0RPUywgdXNlIG9ubHkgb24gZmlsZSBuYW1lcyB3aXRob3V0IGV4dGVuc2lvbgotICogb3IgaW4gcGlwZSBtb2RlLgotICovCi0KLS8qIEAoIykgJElkOiBtaW5pZ3ppcC5jLHYgMS4xIDIwMDQvMTAvMDggMDk6NDQ6MjYgY29uc3RfayBFeHAgJCAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2lmZGVmIFNUREMKLSMgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotICAgZXh0ZXJuIHZvaWQgZXhpdCAgT0YoKGludCkpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX01NQVAKLSMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotIyAgaW5jbHVkZSA8ZmNudGwuaD4KLSMgIGluY2x1ZGUgPGlvLmg+Ci0jICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKLSNlbHNlCi0jICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCi0jZW5kaWYKLQotI2lmZGVmIFZNUwotIyAgZGVmaW5lIHVubGluayBkZWxldGUKLSMgIGRlZmluZSBHWl9TVUZGSVggIi1neiIKLSNlbmRpZgotI2lmZGVmIFJJU0NPUwotIyAgZGVmaW5lIHVubGluayByZW1vdmUKLSMgIGRlZmluZSBHWl9TVUZGSVggIi1neiIKLSMgIGRlZmluZSBmaWxlbm8oZmlsZSkgZmlsZS0+X19maWxlCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCi0jICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmaWxlbm8gKi8KLSNlbmRpZgotCi0jaWZuZGVmIFdJTjMyIC8qIHVubGluayBhbHJlYWR5IGluIHN0ZGlvLmggZm9yIFdJTjMyICovCi0gIGV4dGVybiBpbnQgdW5saW5rIE9GKChjb25zdCBjaGFyICopKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdaX1NVRkZJWAotIyAgZGVmaW5lIEdaX1NVRkZJWCAiLmd6IgotI2VuZGlmCi0jZGVmaW5lIFNVRkZJWF9MRU4gKHNpemVvZihHWl9TVUZGSVgpLTEpCi0KLSNkZWZpbmUgQlVGTEVOICAgICAgMTYzODQKLSNkZWZpbmUgTUFYX05BTUVfTEVOIDEwMjQKLQotI2lmZGVmIE1BWFNFR182NEsKLSMgIGRlZmluZSBsb2NhbCBzdGF0aWMKLSAgIC8qIE5lZWRlZCBmb3Igc3lzdGVtcyB3aXRoIGxpbWl0YXRpb24gb24gc3RhY2sgc2l6ZS4gKi8KLSNlbHNlCi0jICBkZWZpbmUgbG9jYWwKLSNlbmRpZgotCi1jaGFyICpwcm9nOwotCi12b2lkIGVycm9yICAgICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKm1zZykpOwotdm9pZCBnel9jb21wcmVzcyAgICAgIE9GKChGSUxFICAgKmluLCBnekZpbGUgb3V0KSk7Ci0jaWZkZWYgSEFWRV9NTUFQCi1pbnQgIGd6X2NvbXByZXNzX21tYXAgT0YoKEZJTEUgICAqaW4sIGd6RmlsZSBvdXQpKTsKLSNlbmRpZgotdm9pZCBnel91bmNvbXByZXNzICAgIE9GKChnekZpbGUgaW4sIEZJTEUgICAqb3V0KSk7Ci12b2lkIGZpbGVfY29tcHJlc3MgICAgT0YoKGNoYXIgICpmaWxlLCBjaGFyICptb2RlKSk7Ci12b2lkIGZpbGVfdW5jb21wcmVzcyAgT0YoKGNoYXIgICpmaWxlKSk7Ci1pbnQgIG1haW4gICAgICAgICAgICAgT0YoKGludCBhcmdjLCBjaGFyICphcmd2W10pKTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQKLSAqLwotdm9pZCBlcnJvcihtc2cpCi0gICAgY29uc3QgY2hhciAqbXNnOwotewotICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9nLCBtc2cpOwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29tcHJlc3MgaW5wdXQgdG8gb3V0cHV0IHRoZW4gY2xvc2UgYm90aCBmaWxlcy4KLSAqLwotCi12b2lkIGd6X2NvbXByZXNzKGluLCBvdXQpCi0gICAgRklMRSAgICppbjsKLSAgICBnekZpbGUgb3V0OwotewotICAgIGxvY2FsIGNoYXIgYnVmW0JVRkxFTl07Ci0gICAgaW50IGxlbjsKLSAgICBpbnQgZXJyOwotCi0jaWZkZWYgSEFWRV9NTUFQCi0gICAgLyogVHJ5IGZpcnN0IGNvbXByZXNzaW5nIHdpdGggbW1hcC4gSWYgbW1hcCBmYWlscyAobWluaWd6aXAgdXNlZCBpbiBhCi0gICAgICogcGlwZSksIHVzZSB0aGUgbm9ybWFsIGZyZWFkIGxvb3AuCi0gICAgICovCi0gICAgaWYgKGd6X2NvbXByZXNzX21tYXAoaW4sIG91dCkgPT0gWl9PSykgcmV0dXJuOwotI2VuZGlmCi0gICAgZm9yICg7OykgewotICAgICAgICBsZW4gPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbik7Ci0gICAgICAgIGlmIChmZXJyb3IoaW4pKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImZyZWFkIik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgYnJlYWs7Ci0KLSAgICAgICAgaWYgKGd6d3JpdGUob3V0LCBidWYsICh1bnNpZ25lZClsZW4pICE9IGxlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKLSAgICB9Ci0gICAgZmNsb3NlKGluKTsKLSAgICBpZiAoZ3pjbG9zZShvdXQpICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOwotfQotCi0jaWZkZWYgSEFWRV9NTUFQIC8qIE1NQVAgdmVyc2lvbiwgTWlndWVsIEFsYnJlY2h0IDxtYWxicmVjaEBlc28ub3JnPiAqLwotCi0vKiBUcnkgY29tcHJlc3NpbmcgdGhlIGlucHV0IGZpbGUgYXQgb25jZSB1c2luZyBtbWFwLiBSZXR1cm4gWl9PSyBpZgotICogaWYgc3VjY2VzcywgWl9FUlJOTyBvdGhlcndpc2UuCi0gKi8KLWludCBnel9jb21wcmVzc19tbWFwKGluLCBvdXQpCi0gICAgRklMRSAgICppbjsKLSAgICBnekZpbGUgb3V0OwotewotICAgIGludCBsZW47Ci0gICAgaW50IGVycjsKLSAgICBpbnQgaWZkID0gZmlsZW5vKGluKTsKLSAgICBjYWRkcl90IGJ1ZjsgICAgLyogbW1hcCdlZCBidWZmZXIgZm9yIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSAqLwotICAgIG9mZl90IGJ1Zl9sZW47ICAvKiBsZW5ndGggb2YgdGhlIGlucHV0IGZpbGUgKi8KLSAgICBzdHJ1Y3Qgc3RhdCBzYjsKLQotICAgIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgbmVlZGVkIGZvciBtbWFwOiAqLwotICAgIGlmIChmc3RhdChpZmQsICZzYikgPCAwKSByZXR1cm4gWl9FUlJOTzsKLSAgICBidWZfbGVuID0gc2Iuc3Rfc2l6ZTsKLSAgICBpZiAoYnVmX2xlbiA8PSAwKSByZXR1cm4gWl9FUlJOTzsKLQotICAgIC8qIE5vdyBkbyB0aGUgYWN0dWFsIG1tYXA6ICovCi0gICAgYnVmID0gbW1hcCgoY2FkZHJfdCkgMCwgYnVmX2xlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBpZmQsIChvZmZfdCkwKTsgCi0gICAgaWYgKGJ1ZiA9PSAoY2FkZHJfdCkoLTEpKSByZXR1cm4gWl9FUlJOTzsKLQotICAgIC8qIENvbXByZXNzIHRoZSB3aG9sZSBmaWxlIGF0IG9uY2U6ICovCi0gICAgbGVuID0gZ3p3cml0ZShvdXQsIChjaGFyICopYnVmLCAodW5zaWduZWQpYnVmX2xlbik7Ci0KLSAgICBpZiAobGVuICE9IChpbnQpYnVmX2xlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKLQotICAgIG11bm1hcChidWYsIGJ1Zl9sZW4pOwotICAgIGZjbG9zZShpbik7Ci0gICAgaWYgKGd6Y2xvc2Uob3V0KSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLSNlbmRpZiAvKiBIQVZFX01NQVAgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBVbmNvbXByZXNzIGlucHV0IHRvIG91dHB1dCB0aGVuIGNsb3NlIGJvdGggZmlsZXMuCi0gKi8KLXZvaWQgZ3pfdW5jb21wcmVzcyhpbiwgb3V0KQotICAgIGd6RmlsZSBpbjsKLSAgICBGSUxFICAgKm91dDsKLXsKLSAgICBsb2NhbCBjaGFyIGJ1ZltCVUZMRU5dOwotICAgIGludCBsZW47Ci0gICAgaW50IGVycjsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgbGVuID0gZ3pyZWFkKGluLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgaWYgKGxlbiA8IDApIGVycm9yIChnemVycm9yKGluLCAmZXJyKSk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgYnJlYWs7Ci0KLSAgICAgICAgaWYgKChpbnQpZndyaXRlKGJ1ZiwgMSwgKHVuc2lnbmVkKWxlbiwgb3V0KSAhPSBsZW4pIHsKLQkgICAgZXJyb3IoImZhaWxlZCBmd3JpdGUiKTsKLQl9Ci0gICAgfQotICAgIGlmIChmY2xvc2Uob3V0KSkgZXJyb3IoImZhaWxlZCBmY2xvc2UiKTsKLQotICAgIGlmIChnemNsb3NlKGluKSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXByZXNzIHRoZSBnaXZlbiBmaWxlOiBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIC5neiBmaWxlIGFuZCByZW1vdmUgdGhlCi0gKiBvcmlnaW5hbC4KLSAqLwotdm9pZCBmaWxlX2NvbXByZXNzKGZpbGUsIG1vZGUpCi0gICAgY2hhciAgKmZpbGU7Ci0gICAgY2hhciAgKm1vZGU7Ci17Ci0gICAgbG9jYWwgY2hhciBvdXRmaWxlW01BWF9OQU1FX0xFTl07Ci0gICAgRklMRSAgKmluOwotICAgIGd6RmlsZSBvdXQ7Ci0KLSAgICBzdHJjcHkob3V0ZmlsZSwgZmlsZSk7Ci0gICAgc3RyY2F0KG91dGZpbGUsIEdaX1NVRkZJWCk7Ci0KLSAgICBpbiA9IGZvcGVuKGZpbGUsICJyYiIpOwotICAgIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgICAgIHBlcnJvcihmaWxlKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgb3V0ID0gZ3pvcGVuKG91dGZpbGUsIG1vZGUpOwotICAgIGlmIChvdXQgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBnem9wZW4gJXNcbiIsIHByb2csIG91dGZpbGUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBnel9jb21wcmVzcyhpbiwgb3V0KTsKLQotICAgIHVubGluayhmaWxlKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVuY29tcHJlc3MgdGhlIGdpdmVuIGZpbGUgYW5kIHJlbW92ZSB0aGUgb3JpZ2luYWwuCi0gKi8KLXZvaWQgZmlsZV91bmNvbXByZXNzKGZpbGUpCi0gICAgY2hhciAgKmZpbGU7Ci17Ci0gICAgbG9jYWwgY2hhciBidWZbTUFYX05BTUVfTEVOXTsKLSAgICBjaGFyICppbmZpbGUsICpvdXRmaWxlOwotICAgIEZJTEUgICpvdXQ7Ci0gICAgZ3pGaWxlIGluOwotICAgIGludCBsZW4gPSBzdHJsZW4oZmlsZSk7Ci0KLSAgICBzdHJjcHkoYnVmLCBmaWxlKTsKLQotICAgIGlmIChsZW4gPiBTVUZGSVhfTEVOICYmIHN0cmNtcChmaWxlK2xlbi1TVUZGSVhfTEVOLCBHWl9TVUZGSVgpID09IDApIHsKLSAgICAgICAgaW5maWxlID0gZmlsZTsKLSAgICAgICAgb3V0ZmlsZSA9IGJ1ZjsKLSAgICAgICAgb3V0ZmlsZVtsZW4tM10gPSAnXDAnOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dGZpbGUgPSBmaWxlOwotICAgICAgICBpbmZpbGUgPSBidWY7Ci0gICAgICAgIHN0cmNhdChpbmZpbGUsIEdaX1NVRkZJWCk7Ci0gICAgfQotICAgIGluID0gZ3pvcGVuKGluZmlsZSwgInJiIik7Ci0gICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgZ3pvcGVuICVzXG4iLCBwcm9nLCBpbmZpbGUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKLSAgICBpZiAob3V0ID09IE5VTEwpIHsKLSAgICAgICAgcGVycm9yKGZpbGUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGd6X3VuY29tcHJlc3MoaW4sIG91dCk7Ci0KLSAgICB1bmxpbmsoaW5maWxlKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFVzYWdlOiAgbWluaWd6aXAgWy1kXSBbLWZdIFstaF0gWy0xIHRvIC05XSBbZmlsZXMuLi5dCi0gKiAgIC1kIDogZGVjb21wcmVzcwotICogICAtZiA6IGNvbXByZXNzIHdpdGggWl9GSUxURVJFRAotICogICAtaCA6IGNvbXByZXNzIHdpdGggWl9IVUZGTUFOX09OTFkKLSAqICAgLTEgdG8gLTkgOiBjb21wcmVzc2lvbiBsZXZlbAotICovCi0KLWludCBtYWluKGFyZ2MsIGFyZ3YpCi0gICAgaW50IGFyZ2M7Ci0gICAgY2hhciAqYXJndltdOwotewotICAgIGludCB1bmNvbXByID0gMDsKLSAgICBnekZpbGUgZmlsZTsKLSAgICBjaGFyIG91dG1vZGVbMjBdOwotCi0gICAgc3RyY3B5KG91dG1vZGUsICJ3YjYgIik7Ci0KLSAgICBwcm9nID0gYXJndlswXTsKLSAgICBhcmdjLS0sIGFyZ3YrKzsKLQotICAgIHdoaWxlIChhcmdjID4gMCkgewotICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkKLQl1bmNvbXByID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1mIikgPT0gMCkKLQlvdXRtb2RlWzNdID0gJ2YnOwotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKQotCW91dG1vZGVbM10gPSAnaCc7Ci0gICAgICBlbHNlIGlmICgoKmFyZ3YpWzBdID09ICctJyAmJiAoKmFyZ3YpWzFdID49ICcxJyAmJiAoKmFyZ3YpWzFdIDw9ICc5JyAmJgotCSAgICAgICAoKmFyZ3YpWzJdID09IDApCi0Jb3V0bW9kZVsyXSA9ICgqYXJndilbMV07Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgICBhcmdjLS0sIGFyZ3YrKzsKLSAgICB9Ci0gICAgaWYgKGFyZ2MgPT0gMCkgewotICAgICAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOwotICAgICAgICBTRVRfQklOQVJZX01PREUoc3Rkb3V0KTsKLSAgICAgICAgaWYgKHVuY29tcHIpIHsKLSAgICAgICAgICAgIGZpbGUgPSBnemRvcGVuKGZpbGVubyhzdGRpbiksICJyYiIpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgZXJyb3IoImNhbid0IGd6ZG9wZW4gc3RkaW4iKTsKLSAgICAgICAgICAgIGd6X3VuY29tcHJlc3MoZmlsZSwgc3Rkb3V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGUgPSBnemRvcGVuKGZpbGVubyhzdGRvdXQpLCBvdXRtb2RlKTsKLSAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZG91dCIpOwotICAgICAgICAgICAgZ3pfY29tcHJlc3Moc3RkaW4sIGZpbGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHVuY29tcHIpIHsKLSAgICAgICAgICAgICAgICBmaWxlX3VuY29tcHJlc3MoKmFyZ3YpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaWxlX2NvbXByZXNzKCphcmd2LCBvdXRtb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoYXJndisrLCAtLWFyZ2MpOwotICAgIH0KLSAgICBleGl0KDApOwotICAgIHJldHVybiAwOyAvKiB0byBhdm9pZCB3YXJuaW5nICovCi19CmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96bGliLjMgYi9jb21tb24vemxpYi96bGliLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmU0NTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3psaWIvemxpYi4zCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS5USCBaTElCIDMgIjExIE1hcmNoIDIwMDIiCi0uU0ggTkFNRQotemxpYiBcLSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnkKLS5TSCBTWU5PUFNJUwotW3NlZQotLkkgemxpYi5oCi1mb3IgZnVsbCBkZXNjcmlwdGlvbl0KLS5TSCBERVNDUklQVElPTgotVGhlCi0uSSB6bGliCi1saWJyYXJ5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KLVRoZSBjb2RlIGlzIHRocmVhZCBzYWZlLgotSXQgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywKLWluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KLVRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QgKGRlZmxhdGlvbikKLWJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzdHJlYW0gaW50ZXJmYWNlLgotLkxQCi1Db21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2gKLShmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLAotb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLgotSW4gdGhlIGxhdHRlciBjYXNlLAotdGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKLShwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCi0uTFAKLVRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbgotLkkgZ3ppcAotKC5neikgZm9ybWF0Ci13aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCi0uTFAKLVRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKLXRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKLWNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCi0uTFAKLUFsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKLS5JUiB6bGliLmguCi1UaGUgZGlzdHJpYnV0aW9uIHNvdXJjZSBpbmNsdWRlcyBleGFtcGxlcyBvZiB1c2Ugb2YgdGhlIGxpYnJhcnkKLXRoZSBmaWxlcwotLkkgZXhhbXBsZS5jCi1hbmQKLS5JUiBtaW5pZ3ppcC5jIC4KLS5MUAotQSBKYXZhIGltcGxlbWVudGF0aW9uIG9mCi0uSVIgemxpYgotaXMgYXZhaWxhYmxlIGluIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdCAxLjEKLS5JUAotaHR0cDovL3d3dy5qYXZhc29mdC5jb20vcHJvZHVjdHMvSkRLLzEuMS9kb2NzL2FwaS9QYWNrYWdlLWphdmEudXRpbC56aXAuaHRtbAotLkxQCi1BIFBlcmwgaW50ZXJmYWNlIHRvCi0uSVIgemxpYiAsCi13cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgKHBtYXJxdWVzc0BiZnNlYy5idC5jby51aykKLWlzIGF2YWlsYWJsZSBhdCBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcywKLXN1Y2ggYXM6Ci0uSVAKLWZ0cDovL2Z0cC5jaXMudWZsLmVkdS9wdWIvcGVybC9DUEFOL21vZHVsZXMvYnktbW9kdWxlL0NvbXByZXNzL0NvbXByZXNzLVpsaWIqCi0uTFAKLUEgUHl0aG9uIGludGVyZmFjZSB0bwotLklSIHpsaWIKLXdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQG1hZ25ldC5jb20+Ci1pcyBhdmFpbGFibGUgZnJvbSB0aGUgUHl0aG9uIFNvZnR3YXJlIEFzc29jaWF0aW9uIHNpdGVzLCBzdWNoIGFzOgotLklQCi1mdHA6Ly9mdHAucHl0aG9uLm9yZy9wdWIvcHl0aG9uL2NvbnRyaWIvRW5jb2RpbmcvemxpYioudGFyLmd6Ci0uU0ggIlNFRSBBTFNPIgotUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG86Ci0uSVAKLXpsaWJAcXVlc3QuanBsLm5hc2EuZ292Ci1vciwgaWYgdGhpcyBmYWlscywgdG8gdGhlIGF1dGhvciBhZGRyZXNzZXMgZ2l2ZW4gYmVsb3cuCi1UaGUgemxpYiBob21lIHBhZ2UgaXM6Ci0uSVAKLWh0dHA6Ly93d3cuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvCi0uTFAKLVRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQwotKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzOiAKLS5JUAotZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dCAoemxpYiBmb3JtYXQpCi0uYnIKLXJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkKLS5icgotcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KQotLkxQCi1UaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluIG90aGVyIGZvcm1hdHMgZnJvbToKLS5JUAotZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCi0uU0ggQVVUSE9SUwotVmVyc2lvbiAxLjEuNAotQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSAoamxvdXBAZ3ppcC5vcmcpCi1hbmQgTWFyayBBZGxlciAobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkuCi0uTFAKLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzLWlzLCIKLXdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLUluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi1hcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotU2VlIHRoZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byByZXF1aXJlbWVudHMKLWdvdmVybmluZyByZWRpc3RyaWJ1dGlvbi4KLVRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5Ci0uSSB6bGliCi13YXMgZGVmaW5lZCBieSBQaGlsIEthdHouCi1UaGUgZGVmbGF0ZSBhbmQKLS5JIHpsaWIKLXNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLgotVGhhbmtzIHRvIGFsbCB0aGUgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMKLWltcHJvdmVtZW50cyBpbgotLklSIHpsaWIgOwotd2hvIGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgotLkxQCi1VTklYIG1hbnVhbCBwYWdlIGJ5IFIuIFAuIEMuIFJvZGdlcnMsCi1VLlMuIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgKHJvZGdlcnNAbmxtLm5paC5nb3YpLgotLlwiIGVuZCBvZiBtYW4gcGFnZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3psaWIvemxpYi5kc3AgYi9jb21tb24vemxpYi96bGliLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNTg1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vemxpYi96bGliLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9InpsaWIiIC0gUGFja2FnZSBPd25lcj08ND4NCi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQotIyAqKiBETyBOT1QgRURJVCAqKg0KLQ0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCi0NCi1DRkc9emxpYiAtIFdpbjMyIERlYnVnIFVuaWNvZGUNCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQotIU1FU1NBR0UgDQotIU1FU1NBR0UgTk1BS0UgL2YgInpsaWIubWFrIi4NCi0hTUVTU0FHRSANCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQotIU1FU1NBR0UgDQotIU1FU1NBR0UgTk1BS0UgL2YgInpsaWIubWFrIiBDRkc9InpsaWIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFICJ6bGliIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQotIU1FU1NBR0UgInpsaWIgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQotIU1FU1NBR0UgInpsaWIgLSBXaW4zMiBEZWJ1ZyBVbmljb2RlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSANCi0NCi0jIEJlZ2luIFByb2plY3QNCi0jIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KLSMgUFJPUCBTY2NfUHJvak5hbWUgIiINCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KLUNQUD1jbC5leGUNCi1SU0M9cmMuZXhlDQotDQotIUlGICAiJChDRkcpIiA9PSAiemxpYiAtIFdpbjMyIFJlbGVhc2UiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlxSZWxlYXNlIg0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlxSZWxlYXNlXHpsaWIiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYw0KLSMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMSAvRCAiTkRFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCi0jIEFERCBMSUIzMiAvbm9sb2dvDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWIgLSBXaW4zMiBEZWJ1ZyINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cRGVidWciDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXERlYnVnXHpsaWIiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KLSMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiX0xJQiIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQotIyBBREQgTElCMzIgL25vbG9nbw0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJ6bGliIC0gV2luMzIgRGVidWcgVW5pY29kZSINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJ6bGliX19fV2luMzJfRGVidWdfVW5pY29kZSINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJ6bGliX19fV2luMzJfRGVidWdfVW5pY29kZSINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cRGVidWdfVW5pY29kZSINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cRGVidWdfVW5pY29kZVx6bGliIg0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIl9ERUJVRyIgL0QgIl9MSUIiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KLSMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiX0xJQiIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1VOSUNPREUiIC9EICJVTklDT0RFIiAvWVggL0ZEIC9HWiAvYw0KLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciDQotQlNDMzI9YnNjbWFrZS5leGUNCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCi0jIEFERCBCU0MzMiAvbm9sb2dvDQotTElCMzI9bGluay5leGUgLWxpYg0KLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KLSMgQUREIExJQjMyIC9ub2xvZ28NCi0NCi0hRU5ESUYgDQotDQotIyBCZWdpbiBUYXJnZXQNCi0NCi0jIE5hbWUgInpsaWIgLSBXaW4zMiBSZWxlYXNlIg0KLSMgTmFtZSAiemxpYiAtIFdpbjMyIERlYnVnIg0KLSMgTmFtZSAiemxpYiAtIFdpbjMyIERlYnVnIFVuaWNvZGUiDQotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KLQ0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cYWRsZXIzMi5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cY29tcHJlc3MuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGNyYzMyLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxkZWZsYXRlLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxnemlvLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxpbmZibG9jay5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5caW5mY29kZXMuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGluZmZhc3QuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGluZmxhdGUuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGluZnRyZWVzLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxpbmZ1dGlsLmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Llx0cmVlcy5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cdW5jb21wci5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cenV0aWwuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBFbmQgR3JvdXANCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQotDQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxkZWZsYXRlLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxpbmZibG9jay5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5caW5mY29kZXMuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGluZmZhc3QuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGluZmZpeGVkLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxpbmZ0cmVlcy5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5caW5mdXRpbC5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS5cdHJlZXMuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXHpjb25mLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Llx6bGliLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9Llx6dXRpbC5oDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEVuZCBHcm91cA0KLSMgRW5kIFRhcmdldA0KLSMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9jb21tb24vemxpYi96bGliLmh0bWwgYi9jb21tb24vemxpYi96bGliLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDM3MDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3psaWIvemxpYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0gPHRpdGxlPgotIHpsaWIgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkgdmVyc2lvbiAxLjEuNAotIDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSJXaGl0ZSIgdGV4dD0iQmxhY2siIHZsaW5rPSJSZWQiIGFsaW5rPSJOYXZ5IiBsaW5rPSJSZWQiPgotPCEtLSBiYWNrZ3JvdW5kPSJ6bGliYmcuZ2lmIiAtLT4KLQotPGgxPiB6bGliIDEuMS40IE1hbnVhbCA8L2gxPgotPGhyPgotPGEgbmFtZT0iQ29udGVudHMiPjxoMj5Db250ZW50czwvaDI+Ci08b2wgdHlwZT0iSSI+Ci08bGk+IDxhIGhyZWY9IiNQcm9sb2d1ZSI+UHJvbG9ndWU8L2E+Ci08bGk+IDxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI1V0aWxpdHkgZnVuY3Rpb25zIj5VdGlsaXR5IGZ1bmN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iI0Jhc2ljIGZ1bmN0aW9ucyI+QmFzaWMgZnVuY3Rpb25zPC9hPgotPGxpPiA8YSBocmVmPSIjQWR2YW5jZWQgZnVuY3Rpb25zIj5BZHZhbmNlZCBmdW5jdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNDb25zdGFudHMiPkNvbnN0YW50czwvYT4KLTxsaT4gPGEgaHJlZj0iI3N0cnVjdCB6X3N0cmVhbV9zIj5zdHJ1Y3Qgel9zdHJlYW1fczwvYT4KLTxsaT4gPGEgaHJlZj0iI0NoZWNrc3VtIGZ1bmN0aW9ucyI+Q2hlY2tzdW0gZnVuY3Rpb25zPC9hPgotPGxpPiA8YSBocmVmPSIjTWlzYyI+TWlzYzwvYT4KLTwvb2w+Ci08aHI+Ci08YSBuYW1lPSJQcm9sb2d1ZSI+PGgyPiBQcm9sb2d1ZSA8L2gyPgotICAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkgdmVyc2lvbiAxLjEuNCwgTWFyY2ggMTF0aCwgMjAwMgotICA8cD4KLSAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgotICA8cD4KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotICA8cD4KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICA8b2w+Ci0gICA8bGk+IFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCA7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgIDxsaT4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAgPGxpPiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotICA8L29sPgotCi0gIDxkbD4KLSAgPGR0PkplYW4tbG91cCBHYWlsbHkgICAgICAgIAotICA8ZGQ+PGEgaHJlZj0ibWFpbHRvOmpsb3VwQGd6aXAub3JnIj5qbG91cEBnemlwLm9yZzwvYT4KLSAgPGR0Pk1hcmsgQWRsZXIKLSAgPGRkPjxhIGhyZWY9Im1haWx0bzptYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ij5tYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PC9hPgotICA8L2RsPgotCi0gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCi0gIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCi0gIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQiPgotICBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0IDwvYT4KLSAgKHpsaWIgZm9ybWF0KSwgCi0gIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MS50eHQiPgotICByZmMxOTUxLnR4dCA8L2E+Ci0gICg8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gZm9ybWF0KSBhbmQgCi0gIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1Mi50eHQiPgotICByZmMxOTUyLnR4dCA8L2E+Ci0gIChnemlwIGZvcm1hdCkuCi0gIDxwPgotICBUaGlzIG1hbnVhbCBpcyBjb252ZXJ0ZWQgZnJvbSB6bGliLmggYnkgCi0gIDxhIGhyZWY9Im1haWx0bzpwaWFpcEBjc2llLm50dS5lZHUudHciPiBwaWFpcCA8L2E+Ci0gIDxwPgotICBWaXNpdCA8YSBocmVmPSJodHRwOi8vZnRwLmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGliLyI+Ci0gIGh0dHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvPC9hPiAKLSAgZm9yIHRoZSBvZmZpY2lhbCB6bGliIHdlYiBwYWdlLgotICA8cD4KLQotPGhyPgotPGEgbmFtZT0iSW50cm9kdWN0aW9uIj48aDI+IEludHJvZHVjdGlvbiA8L2gyPgotICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAotICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAotICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAotICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKLSAgc3RyZWFtIGludGVyZmFjZS4KLSAgPHA+Ci0KLSAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKLSAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQotICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQotICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0Ci0gIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCi0gIDxwPgotCi0gICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAotICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCi0gIDxwPgotCi0gICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKLSAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgotICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgotICA8cD4KLQotPGhyPgotPGEgbmFtZT0iVXRpbGl0eSBmdW5jdGlvbnMiPjxoMj4gVXRpbGl0eSBmdW5jdGlvbnMgPC9oMj4KLSAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQotICAgPGEgaHJlZj0iI0Jhc2ljIGZ1bmN0aW9ucyI+YmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9uczwvYT4uIAotICAgVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQotICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAotICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCi0gICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KLTxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgotPHVsPgotPGxpPiBpbnQgIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Ci08bGk+IGludCAgPGEgaHJlZj0iI2NvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7Ci08bGk+IGludCAgPGEgaHJlZj0iI3VuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Ci08bGk+IHR5cGVkZWYgdm9pZHAgZ3pGaWxlOwotPGxpPiAgZ3pGaWxlICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7Ci08bGk+IGd6RmlsZSAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZ3pzZXRwYXJhbXMiPmd6c2V0cGFyYW1zPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+ICAoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7Ci08bGk+IGludCBWQSAgIDxhIGhyZWY9IiNnenByaW50ZiI+Z3pwcmludGY8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNnenB1dHMiPmd6cHV0czwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKTsKLTxsaT4gY2hhciAqICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IChnekZpbGUgZmlsZSwgaW50IGMpOwotPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOwotPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOwotPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3p0ZWxsIj5nenRlbGw8L2E+IChnekZpbGUgZmlsZSk7Ci08bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOwotPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOwotPGxpPiBjb25zdCBjaGFyICogIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiAoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKTsKLTwvdWw+Ci08aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Ci08ZGw+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImNvbXByZXNzIj5jb21wcmVzczwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbgotICAgc291cmNlTGVuIHBsdXMgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCi0gICBjb21wcmVzc2VkIGJ1ZmZlci48cD4KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKLSAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC48cD4KLSAgICAgPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwgaW50IGxldmVsKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKLSAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPi4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQotICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKLSAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKLSAgIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9InVuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7PC9mb250PgotPGRkPgotICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCi0gICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCi0gICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKLSAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCi0gICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gPHA+Ci0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKLSAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiN1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgotICAgPHA+Ci0KLTxkdD4gdHlwZWRlZiB2b2lkcCBnekZpbGU7Ci08ZGQ+IDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgZ3pGaWxlICA8YSBuYW1lPSJnem9wZW4iPmd6b3BlbjwvYT4gIChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgotICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAotICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCi0gICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbgotICAgb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0IDsgaW4gdGhpcwotICAgY2FzZSA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCi0gICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gOyBlcnJubwotICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCi0gICB6bGliIGVycm9yIGlzIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+KS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBnekZpbGUgIDxhIG5hbWU9Imd6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQotICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCi0gICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgotICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4uCi0gICA8cD4KLSAgICAgVGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlCi0gICBmaWxlIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkKSwgbW9kZSkgY2xvc2VzIHRoZSBmaWxlCi0gICBkZXNjcmlwdG9yIGZkLiBJZiB5b3Ugd2FudCB0byBrZWVwIGZkIG9wZW4sIHVzZSA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oZHVwKGZkKSwgbW9kZSkuCi0gICA8cD4KLSAgICAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+IHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZQotICAgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250PgotPGRkPgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzLgotICAgPHA+Ci0gICAgIDxhIGhyZWY9IiNnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBmaWxlIHdhcyBub3QKLSAgIG9wZW5lZCBmb3Igd3JpdGluZy4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7PC9mb250PgotPGRkPgotICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCi0gICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCi0gICA8cD4KLSAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCi0gICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6d3JpdGUiPmd6d3JpdGU8L2E+IChnekZpbGUgZmlsZSwgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KLSAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCBWQSAgIDxhIG5hbWU9Imd6cHJpbnRmIj5nenByaW50ZjwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7PC9mb250PgotPGRkPgotICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiA8YSBocmVmPSIjZ3pwcmludGYiPmd6cHJpbnRmPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7PC9mb250PgotPGRkPgotICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZwotICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotICAgPHA+Ci0gICAgICA8YSBocmVmPSIjZ3pwdXRzIj5nenB1dHM8L2E+IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY2hhciAqICA8YSBuYW1lPSJnemdldHMiPmd6Z2V0czwvYT4gKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgotICAgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCi0gICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZCB3aXRoIGEgbnVsbAotICAgY2hhcmFjdGVyLgotICAgPHA+Ci0gICAgICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IHJldHVybnMgYnVmLCBvciA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenB1dGMiPmd6cHV0YzwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgYyk7PC9mb250PgotPGRkPgotICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gcmV0dXJucyB0aGlzIGJ5dGUKLSAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemZsdXNoIj5nemZsdXNoPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCk7PC9mb250PgotPGRkPgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKLSAgIGZsdXNoIGlzIGFzIGluIHRoZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4gPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmCi0gICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCi0gICA8cD4KLSAgICAgPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgotICAgZGVncmFkZSBjb21wcmVzc2lvbi4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB6X29mZl90ICAgICA8YSBuYW1lPSJnenNlZWsiPmd6c2VlazwvYT4gKGd6RmlsZSBmaWxlLCB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7PC9mb250PgotPGRkPgotICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7Ci0gICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KLSAgIDxwPgotICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQotICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQotICAgc3VwcG9ydGVkIDsgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldwotICAgc3RhcnRpbmcgcG9zaXRpb24uCi0gICA8cD4KLSAgICAgIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCi0gICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgotICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KLSAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCi0gICAgIDxwPgotICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4oZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KTxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfU0VUKQotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHpfb2ZmX3QgICAgIDxhIG5hbWU9Imd6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KLTxkZD4KLSAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCi0gICA8cD4KLQotICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPihmaWxlKSBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfQ1VSKQotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KLTxkZD4KLSAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KLSAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KLTxkZD4KLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQotICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCi0gICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiA8YSBocmVmPSIjZ3plcnJvciI+Z3plcnJvcjwvYT4gYmVsb3cpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNvbnN0IGNoYXIgKiAgPGEgbmFtZT0iZ3plcnJvciI+Z3plcnJvcjwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSk7PC9mb250PgotPGRkPgotICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KLSAgIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAotICAgZXJybnVtIGlzIHNldCB0byA8YSBocmVmPSIjWl9FUlJOTyI+Wl9FUlJOTzwvYT4gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotICAgPHA+Ci08L2RsPgotPGhyPgotPGEgbmFtZT0iQmFzaWMgZnVuY3Rpb25zIj48aDI+IEJhc2ljIGZ1bmN0aW9ucyA8L2gyPgotPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Ci08dWw+Ci08bGk+ICBjb25zdCBjaGFyICogIDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOwotPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08L3VsPgotCi08aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Ci08ZGw+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgY29uc3QgY2hhciAqICA8YSBuYW1lPSJ6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTs8L2ZvbnQ+Ci08ZGQ+IFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KLSAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCi0gICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBhbmQgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCk7PC9mb250PgotPGRkPgotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcwotICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KLSAgIElmIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFyZSBzZXQgdG8gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gdXBkYXRlcyB0aGVtIHRvCi0gICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLSAgIDxwPgotCi0gICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4sIG9yIGJldHdlZW4gMCBhbmQgOToKLSAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0Ci0gICBhbGwgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLgotICAgPHA+Ci0KLSAgIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKLSAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAotICAgPGEgaHJlZj0iI1pfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKDxhIGhyZWY9IiN6bGliX3ZlcnNpb24iPnpsaWJfdmVyc2lvbjwvYT4pIGlzIGluY29tcGF0aWJsZQotICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuCi0gICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7PC9mb250PgotPGRkPgotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCi0gIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCi0gIGZvcmNlZCB0byBmbHVzaC48cD4KLQotICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgPHVsPgotICA8bGk+IENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPgotICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90Ci0gICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGFyZSB1cGRhdGVkIGFuZAotICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4KLQotICA8bGk+IAotICAgIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgotICAgIGFjY29yZGluZ2x5LiBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KLSAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgotICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4KLSAgICBTb21lIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgotICA8L3VsPiA8cD4KLQotICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCi0gIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gb3IgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhY2NvcmRpbmdseSA7IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4KLSAgc2hvdWxkIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlCi0gIGNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbAotICAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLiBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4KLSAgYW5kIHdpdGggemVybyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCi0gIDxwPgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCi0gIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCi0gIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyCi0gIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZAotICBiZWZvcmUgdGhlIGNhbGwuKSAgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUgY29tcHJlc3Npb24KLSAgYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLSAgPHA+Ci0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKLSAgPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYW5kIHRoZSBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCi0gIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCi0gIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCi0gIHRoZSBjb21wcmVzc2lvbi4KLSAgPHA+Ci0KLSAgICBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgotICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCi0gIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pLCB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGUgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggbm9uLXplcm8KLSAgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPikuCi0gIDxwPgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4sIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAotICBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIGFuZCA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgdGhlcmUKLSAgd2FzIGVub3VnaCBvdXRwdXQgc3BhY2UgOyBpZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCi0gIGNhbGxlZCBhZ2FpbiB3aXRoIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KSBidXQgbm8KLSAgbW9yZSBpbnB1dCBkYXRhLCB1bnRpbCBpdCByZXR1cm5zIHdpdGggPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBvciBhbiBlcnJvci4gQWZ0ZXIKLSAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyByZXR1cm5lZCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+LCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQotICBzdHJlYW0gYXJlIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+LgotICA8cD4KLSAgCi0gICAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gaWYgYWxsIHRoZSBjb21wcmVzc2lvbgotICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGF0IGxlYXN0Ci0gIDAuMSUgbGFyZ2VyIHRoYW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gcGx1cyAxMiBieXRlcy4gIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBkb2VzIG5vdCByZXR1cm4KLSAgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCi0gIDxwPgotCi0gICAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCi0gIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYnl0ZXMpLgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIG1heSB1cGRhdGUgPGEgaHJlZj0iI2RhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPiBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKLSAgdGhlIGlucHV0IGRhdGEgdHlwZSAoPGEgaHJlZj0iI1pfQVNDSUkiPlpfQVNDSUk8L2E+IG9yIDxhIGhyZWY9IiNaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+KS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKLSAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKLSAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAotICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IGlmIGFsbCBpbnB1dCBoYXMgYmVlbgotICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bwotICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG9yIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2FzIHplcm8pLgotICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQotICAgcGVuZGluZyBvdXRwdXQuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlCi0gICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAotICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKLSAgIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQotICAgZGVhbGxvY2F0ZWQpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPiAgICAgCi0JSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcwotICAgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKLSAgIHRoZSBjYWxsZXIuIElmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBpcyBub3QgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaXMgbGFyZ2UgZW5vdWdoICh0aGUgZXhhY3QKLSAgIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGRldGVybWluZXMgdGhlCi0gICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCi0gICBhY2NvcmRpbmdseSA7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCi0gICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4uICBJZiA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhcmUgc2V0IHRvIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IHVwZGF0ZXMgdGhlbSB0bwotICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCA8YSBocmVmPSIjWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+IGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLiAgPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvcgotICAgbWVzc2FnZS4gPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKLSAgIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS4gIChTbyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kCi0gICA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBtYXkgYmUgbW9kaWZpZWQsIGJ1dCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhcmUgdW5jaGFuZ2VkLikKLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJpbmZsYXRlIj5pbmZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOzwvZm9udD4KLTxkZD4KLSAgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IHNvbWUKLSAgaW50cm9kdWNlIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkKLSAgZXhjZXB0IHdoZW4gZm9yY2VkIHRvIGZsdXNoLgotICA8cD4KLQotICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCi0gIGZvbGxvd2luZyBhY3Rpb25zOgotCi0gIDx1bD4KLSAgPGxpPiBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPgotICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90Ci0gICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZwotICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuCi0KLSAgPGxpPiBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIAotICAgIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYWNjb3JkaW5nbHkuICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgCi0gICAgdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgCi0gICAgKHNlZSBiZWxvdyBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KLSAgPC91bD4gPHA+Ci0KLSAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0Ci0gIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZwotICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgotICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCi0gIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsICg8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+ID09IDApLCBvciBhZnRlciBlYWNoCi0gIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuIElmIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBhbmQgd2l0aCB6ZXJvIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4sIGl0Ci0gIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKLSAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KLSAgPHA+Ci0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+LCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gZmx1c2hlcyBhcyBtdWNoCi0gIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBpcwotICBub3Qgc3BlY2lmaWVkIGZvciB2YWx1ZXMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBvdGhlciB0aGFuIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4KLSAgYW5kIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LCBidXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgZmx1c2hlcyBhcyBtdWNoIG91dHB1dAotICBhcyBwb3NzaWJsZSBhbnl3YXkuCi0gIDxwPgotCi0gICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IgYW4KLSAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKLSAgKGEgc2luZ2xlIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCi0gIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZwotICBvdXRwdXQgaXMgZmx1c2hlZCA7IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCi0gIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKLSAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0Ci0gIGJlIDxhIGhyZWY9IiNpbmZsYXRlRW5kIj5pbmZsYXRlRW5kPC9hPiB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBUaGUgdXNlIG9mIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+Ci0gIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiB0aGF0IGEgZmFzdGVyIHJvdXRpbmUKLSAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgY2FsbC4KLSAgPHA+Ci0KLSAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCAoc2VlIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+Ci0gIGJlbG93KSwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IHNldHMgc3RybS08YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIHRoZQotICBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPiA7IG90aGVyd2lzZSAKLSAgaXQgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQKLSAgc28gZmFyICh0aGF0IGlzLCA8YSBocmVmPSIjdG90YWxfb3V0Ij50b3RhbF9vdXQ8L2E+IGJ5dGVzKSBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4sIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IKLSAgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkKLSAgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZQotICBjb21wcmVzc29yIGFuZCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KLSAgPHA+Ci0KLSAgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCi0gIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCi0gIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+IGlmIGEKLSAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGlucHV0IGRhdGEgd2FzCi0gIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QKLSAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudAotICAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAotICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90Ci0gIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gaXMgdXNlZC4gSW4gdGhlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4KLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuIGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gdG8gbG9vayBmb3IgYSBnb29kCi0gIGNvbXByZXNzaW9uIGJsb2NrLgotICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQotICAgcGVuZGluZyBvdXRwdXQuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPgotICAgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIGVycm9yIGNhc2UsIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQotICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgotPC9kbD4KLTxocj4KLTxhIG5hbWU9IkFkdmFuY2VkIGZ1bmN0aW9ucyI+PGgyPiBBZHZhbmNlZCBmdW5jdGlvbnMgPC9oMj4KLSAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLTxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgotPHVsPgotPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sCi08bGk+IGludCAgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IGRlc3QsIDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc291cmNlKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOwotPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKLQotPC91bD4KLTxoMz4gRnVuY3Rpb24gZGVzY3JpcHRpb24gPC9oMz4KLTxkbD4KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIGxldmVsLCBpbnQgIG1ldGhvZCwgaW50ICB3aW5kb3dCaXRzLCBpbnQgIG1lbUxldmVsLCBpbnQgIHN0cmF0ZWd5KTs8L2ZvbnQ+Ci0KLTxkZD4gVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuIFRoZQotICAgZmllbGRzIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKLSAgIHRoZSBjYWxsZXIuPHA+Ci0KLSAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSA8YSBocmVmPSIjWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gaW4KLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS48cD4KLQotICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUKLSAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcwotICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCi0gICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCi0gICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBpcyB1c2VkIGluc3RlYWQuPHA+Ci0KLSAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKLSAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKLSAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW8gOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKLSAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5Ci0gICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLjxwPgotCi0gICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKLSAgIHZhbHVlIDxhIGhyZWY9IiNaX0RFRkFVTFRfU1RSQVRFR1kiPlpfREVGQVVMVF9TVFJBVEVHWTwvYT4gZm9yIG5vcm1hbCBkYXRhLCA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQotICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBvciA8YSBocmVmPSIjWl9IVUZGTUFOX09OTFkiPlpfSFVGRk1BTl9PTkxZPC9hPiB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCi0gICBzdHJpbmcgbWF0Y2gpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYQotICAgc29tZXdoYXQgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCi0gICB0dW5lZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gaXMgdG8gZm9yY2UgbW9yZQotICAgSHVmZm1hbiBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nIDsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlCi0gICBiZXR3ZWVuIFpfREVGQVVMVCBhbmQgPGEgaHJlZj0iI1pfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4uIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzCi0gICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KLSAgIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS48cD4KLQotICAgICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKLSAgIG1ldGhvZCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZG9lcwotICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7PC9mb250PgotPGRkPgotICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCi0gICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKLSAgIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+LCA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4sIGJlZm9yZSBhbnkKLSAgIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+LiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKLSAgIGRpY3Rpb25hcnkgKHNlZSA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPikuPHA+Ci0KLSAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQotICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQotICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQotICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQotICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeSA7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KLSAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS48cD4KLQotICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQotICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKLSAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCi0gICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQotICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuPHA+Ci0KLSAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gaXMgc2V0IHRvIHRoZSBBZGxlcjMyIHZhbHVlCi0gICBvZiB0aGUgZGljdGlvbmFyeSA7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIEFkbGVyMzIgdmFsdWUKLSAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCi0gICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLik8cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMKLSAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQotICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90Ci0gICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBkZXN0LCA8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHNvdXJjZSk7PC9mb250PgotPGRkPgotICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLjxwPgotCi0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCi0gICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAotICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCi0gICBieSBjYWxsaW5nIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPi4gIE5vdGUgdGhhdCA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAotICAgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCi0gICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS48cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50Ci0gICAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGJlaW5nIE5VTEwpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAotICAgZGVzdGluYXRpb24uPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLTxkZD4gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4sCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LgotICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uPHA+Ci0KLSAgICAgIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBvciA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBiZWluZyBOVUxMKS48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250PgotPGRkPgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQotICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uICBUaGlzIGNhbiBiZQotICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKLSAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50Ci0gICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCi0gICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCi0gICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuPHA+Ci0KLSAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiwgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBtdXN0IGJlIHNldCBhcyBmb3IKLSAgIGEgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8KLSAgIGJlIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuIEluIHBhcnRpY3VsYXIsIHN0cm0tJmd0IDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gbXVzdCBiZSAKLSAgIG5vbi16ZXJvLjxwPgotCi0gICAgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4KLSAgIGlmIHN0cm0tJmd0YXZhaWxfb3V0IHdhcyB6ZXJvLjxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOzwvZm9udD4KLQotPGRkPiAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQotICAgZmllbGRzIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLjxwPgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdwotICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCi0gICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGlzIHVzZWQKLSAgIGluc3RlYWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cgc2l6ZSBpcyBnaXZlbiBhcwotICAgaW5wdXQsIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpbnN0ZWFkIG9mCi0gICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LjxwPgotCi0gICAgICA8YSBocmVmPSIjaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBuZWdhdGl2ZQotICAgbWVtTGV2ZWwpLiA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+Ci0gICBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYKLSAgIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAoU28gPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBtYXkgYmUKLSAgIG1vZGlmaWVkLCBidXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYXJlIHVuY2hhbmdlZC4pPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOzwvZm9udD4KLTxkZD4KLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiB1bmNvbXByZXNzZWQgYnl0ZQotICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPgotICAgaWYgdGhpcyBjYWxsIHJldHVybmVkIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+LiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKLSAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBjYWxsIG9mCi0gICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4uIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQotICAgZGljdGlvbmFyeSAoc2VlIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+KS48cD4KLQotICAgICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gaXMKLSAgIGluY29uc2lzdGVudCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQotICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgQWRsZXIzMiB2YWx1ZSkuIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90Ci0gICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCi0gICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLQotPGRkPiAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKLSAgZGVzY3JpcHRpb24gb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHdpdGggPGEgaHJlZj0iI1pfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPikgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKLSAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC48cD4KLQotICAgIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIGEgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4KLSAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCi0gIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCi0gIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IHdoaWNoCi0gIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4sIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKLSAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZVJlc2V0Ij5pbmZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KLTxkZD4KLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNpbmZsYXRlRW5kIj5pbmZsYXRlRW5kPC9hPiBmb2xsb3dlZCBieSA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiwKLSAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KLSAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSA8YSBocmVmPSIjaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+LgotICAgPHA+Ci0KLSAgICAgIDxhIGhyZWY9IiNpbmZsYXRlUmVzZXQiPmluZmxhdGVSZXNldDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2Vzcywgb3IgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBvciA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBiZWluZyBOVUxMKS4KLSAgIDxwPgotPC9kbD4KLQotPGhyPgotPGEgbmFtZT0iQ2hlY2tzdW0gZnVuY3Rpb25zIj48aDI+IENoZWNrc3VtIGZ1bmN0aW9ucyA8L2gyPgotICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKLSAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKLSAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCi08aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KLTx1bD4KLTxsaT4gdUxvbmcgIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiAodUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTsKLTxsaT4gdUxvbmcgIDxhIGhyZWY9IiNjcmMzMiI+Y3JjMzI8L2E+ICAgKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOwotPC91bD4KLTxoMz4gRnVuY3Rpb24gZGVzY3JpcHRpb24gPC9oMz4KLTxkbD4KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJhZGxlcjMyIj5hZGxlcjMyPC9hPiAodUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKLSAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KLSAgIDxwPgotICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6Ci0gICA8cHJlPgotCi0gICAgIHVMb25nIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ID0gPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+KDBMLCA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCAwKTsKLQotICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgewotICAgICAgIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ID0gPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+KDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+LCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwotICAgPC9wcmU+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJjcmMzMiI+Y3JjMzI8L2E+ICAgKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgVXBkYXRlIGEgcnVubmluZyBjcmMgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkCi0gICBjcmMuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUKLSAgIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMgcGVyZm9ybWVkCi0gICB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCi0gICBVc2FnZSBleGFtcGxlOgotICAgPHByZT4KLQotICAgICB1TG9uZyBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPigwTCwgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgMCk7Ci0KLSAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKLSAgICAgICBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICAgfQotICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKLSAgIDwvcHJlPgotPC9kbD4KLTxocj4KLTxhIG5hbWU9InN0cnVjdCB6X3N0cmVhbV9zIj48aDI+IHN0cnVjdCB6X3N0cmVhbV9zIDwvaDI+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+Ci08YSBuYW1lPSJ6X3N0cmVhbV9zIj4KLTxwcmU+Ci10eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKLSAgICBCeXRlZiAgICAqPGEgbmFtZT0ibmV4dF9pbiI+bmV4dF9pbjwvYT47ICAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KLSAgICB1SW50ICAgICA8YSBuYW1lPSJhdmFpbF9pbiI+YXZhaWxfaW48L2E+OyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gKi8KLSAgICB1TG9uZyAgICA8YSBuYW1lPSJ0b3RhbF9pbiI+dG90YWxfaW48L2E+OyAgLyogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KLQotICAgIEJ5dGVmICAgICo8YSBuYW1lPSJuZXh0X291dCI+bmV4dF9vdXQ8L2E+OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KLSAgICB1SW50ICAgICA8YSBuYW1lPSJhdmFpbF9vdXQiPmF2YWlsX291dDwvYT47IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+ICovCi0gICAgdUxvbmcgICAgPGEgbmFtZT0idG90YWxfb3V0Ij50b3RhbF9vdXQ8L2E+OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCi0KLSAgICBjaGFyICAgICAqPGEgbmFtZT0ibXNnIj5tc2c8L2E+OyAgICAgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLwotICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKjxhIG5hbWU9InN0YXRlIj5zdGF0ZTwvYT47IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwotCi0gICAgYWxsb2NfZnVuYyA8YSBuYW1lPSJ6YWxsb2MiPnphbGxvYzwvYT47ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiAqLwotICAgIGZyZWVfZnVuYyAgPGEgbmFtZT0iemZyZWUiPnpmcmVlPC9hPjsgICAvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+ICovCi0gICAgdm9pZHBmICAgICA8YSBuYW1lPSJvcGFxdWUiPm9wYXF1ZTwvYT47ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiAqLwotCi0gICAgaW50ICAgICA8YSBuYW1lPSJkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT47ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGFzY2lpIG9yIGJpbmFyeSAqLwotICAgIHVMb25nICAgPGEgbmFtZT0iYWRsZXIiPmFkbGVyPC9hPjsgICAgICAvKiA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCi0gICAgdUxvbmcgICA8YSBuYW1lPSJyZXNlcnZlZCI+cmVzZXJ2ZWQ8L2E+OyAgIC8qIDxhIGhyZWY9IiNyZXNlcnZlZCI+cmVzZXJ2ZWQ8L2E+IGZvciBmdXR1cmUgdXNlICovCi19IDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4gOwotCi10eXBlZGVmIDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4gRkFSICogPGEgbmFtZT0iel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+OyAg/yAKLTwvcHJlPgotPC9mb250PgotICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBoYXMKLSAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+Ci0gICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZAotICAgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uIDxwPgotCi0gICBUaGUgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQotICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCi0gICA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IHZhbHVlLiA8cD4KLQotICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBtdXN0IHJldHVybiA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgotICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IG11c3QgYmUKLSAgIHRocmVhZCBzYWZlLiA8cD4KLQotICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCi0gICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKLSAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAotICAgcG9pbnRlcnMgcmV0dXJuZWQgYnkgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgotICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCi0gICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKLSAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCi0gICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCi0gICA8cD4KLQotICAgVGhlIGZpZWxkcyA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiBhbmQgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgotICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCi0gICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKLSAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KLSAgIGEgc2luZ2xlIHN0ZXApLiA8cD4KLQotPGhyPgotPGEgbmFtZT0iQ29uc3RhbnRzIj48aDI+IENvbnN0YW50cyA8L2gyPgotPGZvbnQgY29sb3I9IkJsdWUiPgotPHByZT4KLSNkZWZpbmUgPGEgbmFtZT0iWl9OT19GTFVTSCI+Wl9OT19GTFVTSDwvYT4gICAgICAwCi0jZGVmaW5lIDxhIG5hbWU9IlpfUEFSVElBTF9GTFVTSCI+Wl9QQVJUSUFMX0ZMVVNIPC9hPiAxIAotCS8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIDxhIGhyZWY9IiNaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gaW5zdGVhZCAqLwotI2RlZmluZSA8YSBuYW1lPSJaX1NZTkNfRkxVU0giPlpfU1lOQ19GTFVTSDwvYT4gICAgMgotI2RlZmluZSA8YSBuYW1lPSJaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4gICAgMwotI2RlZmluZSA8YSBuYW1lPSJaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+ICAgICAgICA0Ci0vKiBBbGxvd2VkIGZsdXNoIHZhbHVlcyA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBiZWxvdyBmb3IgZGV0YWlscyAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfT0siPlpfT0s8L2E+ICAgICAgICAgICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gICAgMQotI2RlZmluZSA8YSBuYW1lPSJaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+ICAgICAyCi0jZGVmaW5lIDxhIG5hbWU9IlpfRVJSTk8iPlpfRVJSTk88L2E+ICAgICAgICAoLTEpCi0jZGVmaW5lIDxhIG5hbWU9IlpfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gKC0yKQotI2RlZmluZSA8YSBuYW1lPSJaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gICAoLTMpCi0jZGVmaW5lIDxhIG5hbWU9IlpfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gICAgKC00KQotI2RlZmluZSA8YSBuYW1lPSJaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+ICAgICgtNSkKLSNkZWZpbmUgPGEgbmFtZT0iWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+ICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQotICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KLSAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfTk9fQ09NUFJFU1NJT04iPlpfTk9fQ09NUFJFU1NJT048L2E+ICAgICAgICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfU1BFRUQiPlpfQkVTVF9TUEVFRDwvYT4gICAgICAgICAgICAgMQotI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfQ09NUFJFU1NJT04iPlpfQkVTVF9DT01QUkVTU0lPTjwvYT4gICAgICAgOQotI2RlZmluZSA8YSBuYW1lPSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gICgtMSkKLS8qIGNvbXByZXNzaW9uIGxldmVscyAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfRklMVEVSRUQiPlpfRklMVEVSRUQ8L2E+ICAgICAgICAgICAgMQotI2RlZmluZSA8YSBuYW1lPSJaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+ICAgICAgICAyCi0jZGVmaW5lIDxhIG5hbWU9IlpfREVGQVVMVF9TVFJBVEVHWSI+Wl9ERUZBVUxUX1NUUkFURUdZPC9hPiAgICAwCi0vKiBjb21wcmVzc2lvbiBzdHJhdGVneSA7IHNlZSA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+KCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSA8YSBuYW1lPSJaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+ICAgMAotI2RlZmluZSA8YSBuYW1lPSJaX0FTQ0lJIj5aX0FTQ0lJPC9hPiAgICAxCi0jZGVmaW5lIDxhIG5hbWU9IlpfVU5LTk9XTiI+Wl9VTktOT1dOPC9hPiAgMgotLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSA8YSBocmVmPSIjZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+IGZpZWxkICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gICA4Ci0vKiBUaGUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9OVUxMIj5aX05VTEw8L2E+ICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+ICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iemxpYl92ZXJzaW9uIj56bGliX3ZlcnNpb248L2E+IDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+KCkKLS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgbGVzcyB0aGFuIDEuMC4yICovCi08L3ByZT4KLTwvZm9udD4KLQotPGhyPgotPGEgbmFtZT0iTWlzYyI+PGgyPiBNaXNjIDwvaDI+Ci0gPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIDxhIGhyZWY9IiN6X3N0cmVhbV9zIj56X3N0cmVhbTwvYT4uCi0gPHA+Ci0gT3RoZXIgZnVuY3Rpb25zOgotIDxkbD4KLSA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICAgKiAgPGEgbmFtZT0iekVycm9yIj56RXJyb3I8L2E+ICAgICAgICAgICAoaW50IGVycik7PC9mb250PgotIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgICAgICAgICA8YSBuYW1lPSJpbmZsYXRlU3luY1BvaW50Ij5pbmZsYXRlU3luY1BvaW50PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiB6KTs8L2ZvbnQ+Ci0gPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY29uc3QgdUxvbmdmICogIDxhIG5hbWU9ImdldF9jcmNfdGFibGUiPmdldF9jcmNfdGFibGU8L2E+ICAgICh2b2lkKTs8L2ZvbnQ+Ci0gPC9kbD4KLSA8aHI+Ci0gPGZvbnQgc2l6ZT0iLTEiPgotIExhc3QgdXBkYXRlOiBXZWQgT2N0IDEzIDIwOjQyOjM0IDE5OTk8YnI+Ci0gcGlhcGlAY3NpZS5udHUuZWR1LnR3Ci0gPC9mb250PgotCi08L2JvZHk+Ci08L2h0bWw+Cg==