Ci8vICAgdmltOnR3PTExMDp0cz00OgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBGSUxFCSAgOiBtbWQuYwoqCiogREFURSAgICA6ICREYXRlOiAyMDA0LzA3LzIzIDExOjU3OjQ1ICQgICAkUmV2aXNpb246IDEuNCAkCiogT3JpZ2luYWw6IDIwMDQvMDUvMjggMTQ6MDU6MzUgICAgUmV2aXNpb246IDEuMzIgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCiogT3JpZ2luYWw6IDIwMDQvMDUvMTMgMTU6MzE6NDUgICAgUmV2aXNpb246IDEuMzAgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA1MTNfMDEKKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQoqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE3ICAgIFJldmlzaW9uOiAxLjI0ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQoqIE9yaWdpbmFsOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjIyICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQoqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjE4ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKiBPcmlnaW5hbDogMjAwNC8wMy8wMyAxNDoxMDoxMiAgICBSZXZpc2lvbjogMS4xNiAgICAgIFRhZzogdDIwMDQwMzA0XzAxCiogT3JpZ2luYWw6IDIwMDQvMDMvMDIgMDk6Mjc6MTIgICAgUmV2aXNpb246IDEuMTQgICAgICBUYWc6IHQyMDA0MDMwMl8wMwoqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI5ICAgIFJldmlzaW9uOiAxLjEyICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKiBPcmlnaW5hbDogMjAwNC8wMS8zMCAwOTo1OTozMyAgICBSZXZpc2lvbjogMS4xMSAgICAgIFRhZzogdDIwMDQwMjE5XzAxCioKKiBBVVRIT1IgIDogTmljbyBWYWxzdGVyCioKKiBERVNDICAgIDogQ29tbW9uIHJvdXRpbmVzIGZvciBIQ0YsIE1TRiwgVUlMIGFzIHdlbGwgYXMgVVNGIHNvdXJjZXMKKgoqIE5vdGU6IHJlbGF0aXZlIHRvIEFzc2VydHMsIHRoZSBmb2xsb3dpbmcgY2FuIGJlIG9ic2VydmVkOgoqCVNpbmNlIHRoZSBJRkIgaXMgbm90IGtub3duIGluc2lkZSB0aGUgcm91dGluZSwgdGhlIG1hY3JvIEhDRkFTU0VSVCBpcyByZXBsYWNlZCB3aXRoIE1EREFTU0VSVC4KKglBbHNvIHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBpbiB0aGUgYXNzZXJ0IGlzIHJhaXNlZCBieSBGSUxFX05BTUVfT0ZGU0VUICgyMDAwMCkgdG8gZGlzY3JpbWluYXRlIHRoZQoqCU1NRCBBc3NlcnRzIGZyb20gSENGIGFuZCBESEYgYXNzZXJ0cy4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqCiogU09GVFdBUkUgTElDRU5TRQoqCiogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwoqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCioKKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAoqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioKKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAoqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKgoqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKiAgICBkaXN0cmlidXRpb24uCioKKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCioKKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwoqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQoqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoqCiogRGlzY2xhaW1lcgoqCiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgoqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgoqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwoqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAoqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiogREFNQUdFLgoqCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiCQkJCS8vIE5lZWRlZCBhcyBsb25nIGFzIHdlIGRvIG5vdCByZWFsbHkgc29ydCBvdXQgdGhlIG1lc3MKI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBnZXQgQ05WX0xJVFRMRV9UT19TSE9SVAojaW5jbHVkZSAibW1kLmgiCQkJCS8vIE1vcmVNb2R1bGFyRHJpdmVyIGNvbW1vbiBpbmNsdWRlIGZpbGUKCi8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKI3VuZGVmCUZJTEVfTkFNRV9PRkZTRVQKI2RlZmluZSBGSUxFX05BTUVfT0ZGU0VUIERIRl9GSUxFX05BTUVfT0ZGU0VUCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqIG1tZF9jaGVja19jb21wKCBDRkdfUkFOR0VTX1NUUkNUICphY3RwLCBDRkdfU1VQX1JBTkdFX1NUUkNUICpzdXBwICkKKi5QVVJQT1NFCQlDaGVja3MgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGFuIGFjdG9yIGFuZCBhIHN1cHBsaWVyLgoqCiouQVJHVU1FTlRTCioJYWN0cAoqCXN1cHAKKgoqLlJFVFVSTlMKKglOVUxMCWluY29tcGF0aWJsZQoqCTw+TlVMTAlwb2ludGVyIHRvIG1hdGNoaW5nIENGR19SQU5HRV9TUEVDX1NUUkNUIHN1YnN0cnVjdHVyZSBpbiBhY3Rvci1zdHJ1Y3R1cmUgbWF0Y2hpbmcgdGhlIHN1cHBsaWVyCioKKi5OQVJSQVRJVkUKKgoqICBQYXJhbWV0ZXJzOgoqCWFjdHAJYWRkcmVzcyBvZiB0aGUgYWN0b3Igc3BlY2lmaWNhdGlvbgoqCXN1cHAJYWRkcmVzcyBvZiB0aGUgc3VwcGxpZXIgc3BlY2lmaWNhdGlvbgoqCioJRGVzY3JpcHRpb246IG1tZF9jaGVja19jb21wIGlzIGEgc3VwcG9ydCByb3V0aW5lIHRvIGNoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gYW4gYWN0b3IgYW5kIGEKKglzdXBwbGllci4gIG1tZF9jaGVja19jb21wIGlzIGluZGVwZW5kZW50IG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlIGFjdHAgYW5kIHN1cHAgc3RydWN0dXJlcy4gVGhpcyBpcwoqCWFjaGlldmVkIGJ5IGNoZWNraW5nIHRoZSAiYm90dG9tIiBvciAicm9sZSIgZmllbGRzIG9mIHRoZXNlIHN0cnVjdHVyZXMuIFNpbmNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzdHJpY3RlZAoqCXRvIGEgbGltaXRlZCByYW5nZSwgY29tcGFyaW5nIHRoZSBjb250ZW50cyB0byBhIHZhbHVlIHdpdGggYSBrbm93biBlbmRpYW4tZXNzIGdpdmVzIGEgY2x1ZSB0byB0aGVpciBhY3R1YWwKKgllbmRpYW5lc3MuCioKKi5ESUFHUkFNCioxYTogVGhlIHJvbGUtZmllbGQgb2YgdGhlIGFjdG9yIHN0cnVjdHVyZSBoYXMgYSBrbm93biBub24temVybywgbm90ICJieXRlIHN5bW1ldHJpYyIgdmFsdWUgKG5hbWVseQoqCUNPTVBfUk9MRV9BQ1Qgb3IgMHgwMDAxKSwgc28gaWYgYW5kIG9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgbWF0Y2hlcyBDT01QX1JPTEVfQUNUIChpbiBOYXRpdmUKKglFbmRpYW4gZm9ybWF0KSwgdGhlIGFjdG9yIHN0cnVjdHVyZSBpcyBOYXRpdmUgRW5kaWFuLgoqMmE6IFNpbmNlIHRoZSByb2xlLWZpZWxkIG9mIHRoZSBzdXBwbGllciBzdHJ1Y3R1cmUgaXMgMHgwMDAwLCB0aGUgdGVzdCBhcyB1c2VkIGZvciB0aGUgYWN0b3IgZG9lcyBub3Qgd29yawoqCWZvciBhIHN1cHBsaWVyLiBBIHN1cHBsaWVyIGhhcyBhbHdheXMgZXhhY3RseSAxIHZhcmlhbnQsdG9wLGJvdHRvbSByZWNvcmQgd2l0aCAob2ZmaWNpYWxseSwgYnV0IHNlZSB0aGUKKglub3RlIGJlbG93KSBlYWNoIG9mIHRoZXNlIDMgdmFsdWVzIGluIHRoZSByYW5nZSAxIHRocm91Z2ggOTksIHNvIG9uZSBieXRlIG9mIHRoZSB3b3JkIHZhbHVlIG9mIHZhcmlhbnQsCioJdG9wIGFuZCBib3R0b20gd29yZHMgaXMgMHgwMCBhbmQgdGhlIG90aGVyIGJ5dGUgaXMgbm9uLXplcm8uIFdoZXRoZXIgdGhlIGxvd2VzdCBhZGRyZXNzIGJ5dGUgb3IgdGhlCioJaGlnaGVzdCBhZGRyZXNzIGJ5dGUgaXMgbm9uLXplcm8gZGVwZW5kcyBvbiB0aGUgRW5kaWFuZXNzIG9mIHRoZSBMVFYuIElmIGFuZCBvbmx5IGlmIHRoZSB3b3JkIHZhbHVlIG9mCioJYm90dG9tIGlzIGxlc3MgdGhhbiAweDAxMDAsIHRoZSBzdXBwbGllciBpcyBOYXRpdmUgRW5kaWFuLgoqCU5PVEU6IHRoZSB2YXJpYW50IGZpZWxkIG9mIHRoZSBzdXBwbGllciBzdHJ1Y3R1cmUgY2FuIG5vdCBiZSB1c2VkIGZvciB0aGUgRW5kaWFuIERldGVjdGlvbiBBbGdvcml0aG0sCioJYmVjYXVzZSBhIGEgemVyby12YWx1ZWQgdmFyaWFudCBoYXMgYmVlbiB1c2VkIGFzIENvbnRyb2xsZWQgRGVwbG95bWVudCBpbmRpY2F0aW9uIGluIHRoZSBwYXN0LgoqCU5vdGU6IEFuIGFjdG9yIG1heSBoYXZlIG11bHRpcGxlIHNldHMgb2YgdmFyaWFudCx0b3AsYm90dG9tIHJlY29yZHMsIGluY2x1ZGluZyBkdW1teSBzZXRzIHdpdGggdmFyaWFudCwKKgl0b3AgYW5kIGJvdHRvbSBmaWVsZHMgd2l0aCBhIHplcm8tdmFsdWUuIEFzIGEgY29uc2VxdWVuY2UgdGhlIGVuZGlhbmVzcyBvZiB0aGUgYWN0b3IgY2FuIG5vdCBiZSBkZXRlcm1pbmVkCioJYmFzZWQgb24gaXRzIHZhcmlhbnQsdG9wLGJvdHRvbSB2YWx1ZXMuCioKKglOb3RlOiB0aGUgTCBhbmQgVCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlcyBhcmUgYWx3YXlzIGluIE5hdGl2ZSBFbmRpYW4gZm9ybWF0LCBzbyB5b3UgY2FuIG5vdCBkcmF3CioJY29uY2x1c2lvbnMgY29uY2VybmluZyB0aGUgRW5kaWFuZXNzIG9mIHRoZSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlc2UgdHdvIGZpZWxkcy4KKgoqMWIvMmIKKglUaGUgb25seSBwdXJwb3NlIG9mIHRoZSBDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUIGlzIHRvIGdpdmUgZWFzeSBhY2Nlc3MgdG8gdGhlIG5vbi16ZXJvIGJ5dGUgb2YgdGhlIHdvcmQKKgl2YWx1ZSBvZiB2YXJpYW50LCB0b3AgYW5kIGJvdHRvbS4gVGhlIHZhcmlhYmxlcyBzdXBfZW5kaWFuIGFuZCBhY3RfZW5kaWFuIGFyZSB1c2VkIGZvciB0aGUgc3VwcGxpZXIgYW5kCioJYWN0b3Igc3RydWN0dXJlIHJlc3BlY3RpdmVseS4gVGhlc2UgdmFyaWFibGVzIG11c3QgYmUgMCB3aGVuIHRoZSBzdHJ1Y3R1cmUgaGFzIExFIGZvcm1hdCBhbmQgMSBpZiB0aGUKKglzdHJ1Y3R1cmUgaGFzIEJFIGZvcm1hdC4gVGhpcyBjYW4gYmUgcGhyYXNlZCBhczoKKgl0aGUgdmFyaWFibGUgaXMgZmFsc2UgKGkuZSAweDAwMDApIGlmIGVpdGhlcgoqCQkodGhlIHBsYXRmb3JtIGlzIExFIGFuZCB0aGUgTFRWIGlzIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSkKKglvcgoqCQkodGhlIHBsYXRmb3JtIGlzIEJFIGFuZCB0aGUgTFRWIGRpZmZlcnMgZnJvbSB0aGUgcGxhdGZvcm0pLgoqCXRoZSB2YXJpYWJsZSBpcyB0cnVlIChpLmUgMHgwMDAxKSBpZiBlaXRoZXIKKgkJKHRoZSBwbGF0Zm9ybSBpcyBCRSBhbmQgdGhlIExUViBpcyB0aGUgc2FtZSBhcyB0aGUgcGxhdGZvcm0pCioJb3IKKgkJKHRoZSBwbGF0Zm9ybSBpcyBMRSBhbmQgdGhlIExUViBkaWZmZXJzIGZyb20gdGhlIHBsYXRmb3JtKS4KKgoqCUFsdGVybmF0aXZlbHkgdGhpcyBjYW4gYmUgcGhyYXNlZCBhczoKKglpZiB0aGUgcGxhdGZvcm0gaXMgTEUKKgkJaWYgdGhlIExUViBpcyBMRSAoaS5lIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSksIHRoZW4gdGhlIHZhcmlhYmxlID0gMAoqCQllbHNlICh0aGUgTFRWIGlzIEJFIChpLmUuIGRpZmZlcmVudCBmcm9tIHRoZSBwbGF0Zm9ybSkgKSwgdGhlbiB0aGUgdmFyaWFibGUgPSAxCioJaWYgdGhlIHBsYXRmb3JtIGlzIEJFCioJCWlmIHRoZSBMVFYgaXMgQkUgKGkuZSB0aGUgc2FtZSBhcyB0aGUgcGxhdGZvcm0pLCB0aGVuIHRoZSB2YXJpYWJsZSA9IDEKKgkJZWxzZSAodGhlIExUViBpcyBMRSAoaS5lLiBkaWZmZXJlbnQgZnJvbSB0aGUgcGxhdGZvcm0pICksIHRoZW4gdGhlIHZhcmlhYmxlID0gMAoqCioJVGhpcyBpcyBpbXBsZW1lbnRlZCBhczoKKgkjaWYgSENGX0JJR19FTkRJQU4gPT0gMAkvL3BsYXRmb3JtIGlzIExFCioJCXN1cC9hY3RfZW5kaWFuIGJlY29tZXMgcmV2ZXJzZSBvZiBzdHJ1Y3R1cmUtZW5kaWFuZXNzIGFzIGRldGVybWluZWQgaW4gMWEvMWIKKgkjZW5kaWYKKjY6CUVhY2ggb2YgdGhlIGFjdG9yIHZhcmlhbnQtYm90dG9tLXRvcCByZWNvcmRzIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgKHNpbmdsZSkgc3VwcGxpZXIgdmFyaWFudC1ib3R0b20tdG9wCioJcmFuZ2UgdGlsbCBlaXRoZXIgYW4gYWNjZXB0YWJsZSBtYXRjaCBpcyBmb3VuZCBvciBhbGwgYWN0b3IgcmVjb3JkcyBhcmUgdHJpZWQuIEFzIGV4cGxhaW5lZCBhYm92ZSwgZHVlIHRvCioJdGhlIGxpbWl0ZWQgcmFuZ2VzIG9mIHRoZXNlIHZhbHVlcywgY2hlY2tpbmcgYSBieXRlIGlzIGFjY2VwdGFibGUgYW5kIHN1aXRhYmxlLgoqODoJZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBtYXRjaCB3YXMgZm91bmQgb3Igbm90IChhcyByZWZsZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHZhcmlhYmxlIG9mIHRoZQoqCWZvciBsb29wKSwgdGhlIE5VTEwgcG9pbnRlciBvciBhIHBvaW50ZXIgdG8gdGhlIG1hdGNoaW5nIE51bWJlci9Cb3R0b20vVG9wIHJlY29yZCBvZiB0aGUgQWN0b3Igc3RydWN0dXJlCioJaXMgcmV0dXJuZWQuCioJQXMgYW4gYWRkaXRpb25hbCBzYWZldHksIGNoZWNraW5nIHRoZSBzdXBwbGllciBsZW5ndGggcHJvdGVjdHMgYWdhaW5zdCBpbnZhbGlkIFN1cHBsaWVyIHN0cnVjdHVyZXMsIHdoaWNoCioJbWF5IGJlIGNhdXNlZCBieSBmYWlsaW5nIGhjZl9nZXRfaW5mbyAoaW4gd2hpY2ggY2FzZSB0aGUgbGVuLWZpZWxkIGlzIHplcm8pLiBOb3RlIHRoYXQgdGhlIGNvbnRyYXB0aW9uCioJInN1cHAtPmxlbiAhPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxIgoqCWRpZCB0dXJuIG91dCBub3QgdG8gd29yayBmb3IgYSBjb21waWxlciB3aGljaCBwYWRkZWQgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgoqCiogTm90ZTogd2hlbiBjb25zdWx0aW5nIHJlZmVyZW5jZXMgbGlrZSBEZXNpZ25Ob3RlcyBhbmQgQXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb25zIHRoZXJlIGlzIGEgY29uZnVzaW5nIHVzZQoqCW9mIHRoZSBub3Rpb25zIG51bWJlciBhbmQgdmFyaWFudC4gVGhpcyByZXN1bHRlZCBpbiBhbiBpbmNvbnNpc3RlbnQgdXNlIGluIHRoZSBIQ0Ygbm9tZW5jbGF0dXJlIGFzIHdlbGwuCioJVGhpcyBtYWtlcyB0aGUgbG9naWMgaGFyZCB0byBmb2xsb3cgYW5kIG9uZSBoYXMgdG8gYmUgdmVyeSBtdWNoIGF3YXJlIG9mIHRoZSBjb250ZXh0IHdoZW4gd2Fsa2luZyB0aHJvdWdoCioJdGhlIGNvZGUuCiogTk9URTogVGhlIEVuZGlhbiBEZXRlY3Rpb24gQWxnb3JpdGhtIHBsYWNlcyBsaW1pdGF0aW9ucyBvbiBmdXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgZmllbGRzLCBpLmUuIHRoZXkgc2hvdWxkCioJc3RheSB3aXRoaW4gdGhlIGN1cnJlbnRseSBkZWZpbmVkIGJvdW5kYXJpZXMgb2YgMSB0aHJvdWdoIDk5IChhbHRob3VnaCAxIHRocm91Z2ggMjU1KSB3b3VsZCB3b3JrIGFzIHdlbGwKKglhbmQgdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYSB6ZXJvIHZhbHVlIGZvciB0aGUgYm90dG9tIG9mIGEgdmFsaWQgc3VwcGxpZXIuCiogTm90ZTogcmVsYXRpdmUgdG8gQXNzZXJ0cywgdGhlIGZvbGxvd2luZyBjYW4gYmUgb2JzZXJ2ZWQ6CioJMTogU3VwcGxpZXIgdmFyaWFudCAweDAwMDAgaGFzIGJlZW4gdXNlZCBmb3IgQ29udHJvbGxlZCBEZXBsb3ltZW50CioJMjogQW4gYWN0b3IgbWF5IGhhdmUgb25lIG9yIG1vcmUgdmFyaWFudCByZWNvcmQgc3BlY2lmaWNhdGlvbnMgd2l0aCBhIHRvcCBvZiB6ZXJvIGFuZCBhIG5vbi16ZXJvIGJvdHRvbQoqCXRvIG92ZXJyaWRlIHRoZSBIQ0YgZGVmYXVsdCBzdXBwb3J0IG9mIGEgcGFydGljdWxhciB2YXJpYW50IGJ5IHRoZSBNU0YgcHJvZ3JhbW1lciB2aWEgaGNmY2ZnLmgKKgkzOglBbiBhY3RvciByYW5nZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFsbCB6ZXJvcywgZS5nLiBhcyBwYWRkaW5nIGluIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaXJtd2FyZQoqCWltYWdlIGZpbGVzLgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpDRkdfUkFOR0VfU1BFQ19TVFJDVCoKbW1kX2NoZWNrX2NvbXAoIENGR19SQU5HRVNfU1RSQ1QgKmFjdHAsIENGR19TVVBfUkFOR0VfU1RSQ1QgKnN1cHAgKQp7CgpDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUICAqYWN0cSA9IChDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUKilhY3RwLT52YXJfcmVjOwpDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUICAqc3VwcSA9IChDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUKikmKHN1cHAtPnZhcmlhbnQpOwpoY2ZfMTYJaTsKaW50CQlhY3RfZW5kaWFuOwkJCQkJLy9hY3RvciBlbmRpYW4gZmxhZwppbnQJCXN1cF9lbmRpYW47CQkJCQkvL3N1cHBsaWVyIGVuZGlhbiBmbGFnCgoJYWN0X2VuZGlhbiA9IGFjdHAtPnJvbGUgPT0gQ09NUF9ST0xFX0FDVDsJLy90cnVlIGlmIG5hdGl2ZSBlbmRpYW4JCQkJLyogMWEgKi8KCXN1cF9lbmRpYW4gPSBzdXBwLT5ib3R0b20gPCAweDAxMDA7CQkgCS8vdHJ1ZSBpZiBuYXRpdmUgZW5kaWFuCQkJCS8qIDJhICovCgojaWYgSENGX0FTU0VSVAoJTU1EQVNTRVJUKCBzdXBwLT5sZW4gPT0gNiwgCQkJCQkJCQkJCQkJCQkJCXN1cHAtPmxlbiApCglNTURBU1NFUlQoIGFjdHAtPmxlbiA+PSA2ICYmIGFjdHAtPmxlbiUzID09IDAsIAkJCQkJCQkJCQkJYWN0cC0+bGVuICkKCglpZiAoIGFjdF9lbmRpYW4gKSB7CQkJCQkJCS8vbmF0aXZlIGVuZGlhbgoJCU1NREFTU0VSVCggYWN0cC0+cm9sZSA9PSBDT01QX1JPTEVfQUNULAkJCQkJCQkJCQkJCWFjdHAtPnJvbGUgKQoJCU1NREFTU0VSVCggMSA8PSBhY3RwLT5pZCAmJiBhY3RwLT5pZCA8PSA5OSwgIAkJCQkJCQkJCQlhY3RwLT5pZCApCgl9IGVsc2UgewkJCQkJCQkJCS8vbm9uLW5hdGl2ZSBlbmRpYW4KCQlNTURBU1NFUlQoIGFjdHAtPnJvbGUgPT0gQ05WX0VORF9TSE9SVChDT01QX1JPTEVfQUNUKSwJIAkJCQkJCQlhY3RwLT5yb2xlICkKCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChhY3RwLT5pZCkgJiYgQ05WX0VORF9TSE9SVChhY3RwLT5pZCkgPD0gOTksCQkJCWFjdHAtPmlkICkKCX0KCWlmICggc3VwX2VuZGlhbiApIHsJCQkJCQkJLy9uYXRpdmUgZW5kaWFuCgkJTU1EQVNTRVJUKCBzdXBwLT5yb2xlID09IENPTVBfUk9MRV9TVVBMLCAJCQkJCQkJCQkJCXN1cHAtPnJvbGUgKQoJCU1NREFTU0VSVCggMSA8PSBzdXBwLT5pZCAgICAgICYmIHN1cHAtPmlkIDw9IDk5LCAgCQkJCQkJCQkJc3VwcC0+aWQgKQoJCU1NREFTU0VSVCggMSA8PSBzdXBwLT52YXJpYW50ICYmIHN1cHAtPnZhcmlhbnQgPD0gOTksICAJCQkJCQkJCXN1cHAtPnZhcmlhbnQgKQoJCU1NREFTU0VSVCggMSA8PSBzdXBwLT5ib3R0b20gICYmIHN1cHAtPmJvdHRvbSA8PSA5OSwgCQkJCQkJCQlzdXBwLT5ib3R0b20gKQoJCU1NREFTU0VSVCggMSA8PSBzdXBwLT50b3AgICAgICYmIHN1cHAtPnRvcCA8PSA5OSwgCQkgCQkJCQkJCXN1cHAtPnRvcCApCgkJTU1EQVNTRVJUKCBzdXBwLT5ib3R0b20gPD0gc3VwcC0+dG9wLAkJCQkJCQlzdXBwLT5ib3R0b20gPDwgOCB8IHN1cHAtPnRvcCApCgl9IGVsc2UgewkJCQkJCQkJCS8vbm9uLW5hdGl2ZSBlbmRpYW4KCQlNTURBU1NFUlQoIHN1cHAtPnJvbGUgPT0gQ05WX0VORF9TSE9SVChDT01QX1JPTEVfU1VQTCksIAkJCQkJCQkJc3VwcC0+cm9sZSApCgkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoc3VwcC0+aWQpICYmIENOVl9FTkRfU0hPUlQoc3VwcC0+aWQpIDw9IDk5LAkJCQlzdXBwLT5pZCApCgkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoc3VwcC0+dmFyaWFudCkgJiYgQ05WX0VORF9TSE9SVChzdXBwLT52YXJpYW50KSA8PSA5OSwJCXN1cHAtPnZhcmlhbnQgKQoJCU1NREFTU0VSVCggMSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPmJvdHRvbSkgICYmIENOVl9FTkRfU0hPUlQoc3VwcC0+Ym90dG9tKSA8PTk5LAkJc3VwcC0+Ym90dG9tICkKCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChzdXBwLT50b3ApICAgICAmJiBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCkgPD05OSwgIAkJc3VwcC0+dG9wICkKCQlNTURBU1NFUlQoIENOVl9FTkRfU0hPUlQoc3VwcC0+Ym90dG9tKSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCksCXN1cHAtPmJvdHRvbSA8PCA4IHwJc3VwcC0+dG9wICkKCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlQKCiNpZiBIQ0ZfQklHX0VORElBTiA9PSAwCglhY3RfZW5kaWFuID0gIWFjdF9lbmRpYW47CQkJCQkJCQkJCQkJCQkJCQkJLyogMWIqLwoJc3VwX2VuZGlhbiA9ICFzdXBfZW5kaWFuOwkJCQkJCQkJCQkJCQkJCQkJCS8qIDJiKi8KI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCgoJZm9yICggaSA9IGFjdHAtPmxlbiA7IGkgPiAzOyBhY3RxKyssIGkgLT0gMyApIHsJCQkJCQkJCQkJCQkJLyogNiAqLwoJCU1NREFTU0VSVCggYWN0cS0+dmFyaWFudFthY3RfZW5kaWFuXSA8PSA5OSwgaTw8OCB8IGFjdHEtPnZhcmlhbnRbYWN0X2VuZGlhbl0gKQoJCU1NREFTU0VSVCggYWN0cS0+Ym90dG9tW2FjdF9lbmRpYW5dIDw9IDk5ICwgaTw8OCB8IGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSApCgkJTU1EQVNTRVJUKCBhY3RxLT50b3BbYWN0X2VuZGlhbl0gPD0gOTkJICAsIGk8PDggfCBhY3RxLT50b3BbYWN0X2VuZGlhbl0gKQoJCU1NREFTU0VSVCggYWN0cS0+Ym90dG9tW2FjdF9lbmRpYW5dIDw9IGFjdHEtPnRvcFthY3RfZW5kaWFuXSwgaTw8OCB8IGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSApCgkJaWYgKCBhY3RxLT52YXJpYW50W2FjdF9lbmRpYW5dID09IHN1cHEtPnZhcmlhbnRbc3VwX2VuZGlhbl0gJiYKCQkJIGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSAgPD0gc3VwcS0+dG9wW3N1cF9lbmRpYW5dICYmCgkJCSBhY3RxLT50b3BbYWN0X2VuZGlhbl0gICAgID49IHN1cHEtPmJvdHRvbVtzdXBfZW5kaWFuXQoJCSAgICkgYnJlYWs7Cgl9CglpZiAoIGkgPD0gMyB8fCBzdXBwLT5sZW4gIT0gNiAvKnNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDEgKi8gKSB7CgkgICBhY3RxID0gTlVMTDsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA4ICovCgl9CiNpZiBIQ0ZfQVNTRVJUCglpZiAoIGFjdHEgPT0gTlVMTCApIHsKCQlmb3IgKCBpID0gMDsgaSA8PSBzdXBwLT5sZW47IGkgKz0gMiApIHsKCQkJTU1EQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoICgoaGNmXzE2KilzdXBwKVtpXSwgKChoY2ZfMTYqKXN1cHApW2krMV0gKSApOwoJCX0KCQlmb3IgKCBpID0gMDsgaSA8PSBhY3RwLT5sZW47IGkgKz0gMiApIHsKCQkJTU1EQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoICgoaGNmXzE2KilhY3RwKVtpXSwgKChoY2ZfMTYqKWFjdHApW2krMV0gKSApOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlQKCXJldHVybiAoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqKWFjdHE7Cn0gLy8gbW1kX2NoZWNrX2NvbXAKCg==