From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754628AbcE3KVw (ORCPT ); Mon, 30 May 2016 06:21:52 -0400 Received: from mail-pf0-f169.google.com ([209.85.192.169]:34037 "EHLO mail-pf0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751137AbcE3KVt (ORCPT ); Mon, 30 May 2016 06:21:49 -0400 From: Arend Van Spriel To: linux-arm-kernel@lists.infradead.org Cc: "linux-kernel@vger.kernel.org" , Russell King , Ard Biesheuvel , Hante Meuleman Subject: building and using modules on arm64 hikey board Message-ID: <87a3195c-febb-a6c8-a679-272b9f7b59cc@broadcom.com> Date: Mon, 30 May 2016 12:21:33 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------BB334B2F2611F33E4697FAFB" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------BB334B2F2611F33E4697FAFB Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I got myself an arm64 HiKey board from LeMaker and build an Android AOSP image for it (see [1]). For development I would like to use CONFIG_MODULES. However, when I try to insmod the build module I get: [ 287.903653] module cfg80211: overflow in relocation type 261 val ffffffbffc006530 Looking AArch64 ELF documentation [2], section 4.6.5, it has: code|name |operation |overflow check | 261 |R_AARCH64_PREL32|S + A - P |-2^31 <= X < 2^32| So basically the highest 32 bits should all be one and so ffffffbf is invalid. From what I could find searching internet it could be an issue with linker options so I build kernel and modules with V=1. Here the linker invocation for them: + aarch64-linux-android-ld -EL -p --no-undefined -X --build-id -o vmlinux \ -T ./arch/arm64/kernel/vmlinux.lds arch/arm64/kernel/head.o init/built-in.o \ --start-group usr/built-in.o arch/arm64/kernel/built-in.o arch/arm64/mm/built-in.o \ arch/arm64/net/built-in.o arch/arm64/kvm/built-in.o arch/arm64/crypto/built-in.o \ ./drivers/firmware/efi/libstub/lib.a kernel/built-in.o certs/built-in.o mm/built-in.o \ fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o \ arch/arm64/lib/lib.a lib/lib.a arch/arm64/lib/built-in.o lib/built-in.o drivers/built-in.o \ sound/built-in.o firmware/built-in.o net/built-in.o virt/built-in.o --end-group .tmp_kallsyms2.o aarch64-linux-android-ld -EL -r -T ./scripts/module-common.lds --build-id \ -o net/wireless/cfg80211.ko net/wireless/cfg80211.o net/wireless/cfg80211.mod.o Attached are vmlinux.lds and module-common.lds. I also tried taking upstream arch/arm64/kernel/module.lds in hikey-linaro tree. If someone can give a hint or educated guess at what to try it would be appreciated. Regards, Arend [1] https://source.android.com/source/devices.html#building-kernel [2] http://infocenter.arm.com/help/topic/com.arm.doc.ihi0056b/IHI0056B_aaelf64.pdf --------------BB334B2F2611F33E4697FAFB Content-Type: text/plain; charset=UTF-8; name="module-common.lds" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="module-common.lds" LyoKICogQ29tbW9uIG1vZHVsZSBsaW5rZXIgc2NyaXB0LCBhbHdheXMgdXNlZCB3aGVuIGxp bmtpbmcgYSBtb2R1bGUuCiAqIEFyY2hzIGFyZSBmcmVlIHRvIHN1cHBseSB0aGVpciBvd24g bGlua2VyIHNjcmlwdHMuICBsZCB3aWxsCiAqIGNvbWJpbmUgdGhlbSBhdXRvbWF0aWNhbGx5 LgogKi8KU0VDVElPTlMgewoJL0RJU0NBUkQvIDogeyAqKC5kaXNjYXJkKSB9CgoJX19rc3lt dGFiCQkwIDogeyAqKFNPUlQoX19fa3N5bXRhYisqKSkgfQoJX19rc3ltdGFiX2dwbAkJMCA6 IHsgKihTT1JUKF9fX2tzeW10YWJfZ3BsKyopKSB9CglfX2tzeW10YWJfdW51c2VkCTAgOiB7 ICooU09SVChfX19rc3ltdGFiX3VudXNlZCsqKSkgfQoJX19rc3ltdGFiX3VudXNlZF9ncGwJ MCA6IHsgKihTT1JUKF9fX2tzeW10YWJfdW51c2VkX2dwbCsqKSkgfQoJX19rc3ltdGFiX2dw bF9mdXR1cmUJMCA6IHsgKihTT1JUKF9fX2tzeW10YWJfZ3BsX2Z1dHVyZSsqKSkgfQoJX19r Y3JjdGFiCQkwIDogeyAqKFNPUlQoX19fa2NyY3RhYisqKSkgfQoJX19rY3JjdGFiX2dwbAkJ MCA6IHsgKihTT1JUKF9fX2tjcmN0YWJfZ3BsKyopKSB9CglfX2tjcmN0YWJfdW51c2VkCTAg OiB7ICooU09SVChfX19rY3JjdGFiX3VudXNlZCsqKSkgfQoJX19rY3JjdGFiX3VudXNlZF9n cGwJMCA6IHsgKihTT1JUKF9fX2tjcmN0YWJfdW51c2VkX2dwbCsqKSkgfQoJX19rY3JjdGFi X2dwbF9mdXR1cmUJMCA6IHsgKihTT1JUKF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSsqKSkgfQoK CS4gPSBBTElHTig4KTsKCS5pbml0X2FycmF5CQkwIDogeyAqKFNPUlQoLmluaXRfYXJyYXku KikpICooLmluaXRfYXJyYXkpIH0KfQo= --------------BB334B2F2611F33E4697FAFB Content-Type: text/plain; charset=UTF-8; name="vmlinux.lds" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="vmlinux.lds" LyoKICoKICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZTsgRE8gTk9UIEVESVQuCiAq IExpbnV4L2FybTY0IDQuNC45IEtlcm5lbCBDb25maWd1cmF0aW9uCiAqCiAqLwovKgogKiBI ZWxwZXIgbWFjcm9zIHRvIHVzZSBDT05GSUdfIG9wdGlvbnMgaW4gQy9DUFAgZXhwcmVzc2lv bnMuIE5vdGUgdGhhdAogKiB0aGVzZSBvbmx5IHdvcmsgd2l0aCBib29sZWFuIGFuZCB0cmlz dGF0ZSBvcHRpb25zLgogKi8KLyoKICogR2V0dGluZyBzb21ldGhpbmcgdGhhdCB3b3JrcyBp biBDIGFuZCBDUFAgZm9yIGFuIGFyZyB0aGF0IG1heSBvciBtYXkKICogbm90IGJlIGRlZmlu ZWQgaXMgdHJpY2t5LiAgSGVyZSwgaWYgd2UgaGF2ZSAiI2RlZmluZSBDT05GSUdfQk9PR0VS IDEiCiAqIHdlIG1hdGNoIG9uIHRoZSBwbGFjZWhvbGRlciBkZWZpbmUsIGluc2VydCB0aGUg IjAsIiBmb3IgYXJnMSBhbmQgZ2VuZXJhdGUKICogdGhlIHRyaXBsZXQgKDAsIDEsIDApLiAg VGhlbiB0aGUgbGFzdCBzdGVwIGNoZXJyeSBwaWNrcyB0aGUgMm5kIGFyZyAoYSBvbmUpLgog KiBXaGVuIENPTkZJR19CT09HRVIgaXMgbm90IGRlZmluZWQsIHdlIGdlbmVyYXRlIGEgKC4u LiAxLCAwKSBwYWlyLCBhbmQgd2hlbgogKiB0aGUgbGFzdCBzdGVwIGNoZXJyeSBwaWNrcyB0 aGUgMm5kIGFyZywgd2UgZ2V0IGEgemVyby4KICovCi8qCiAqIElTX0JVSUxUSU4oQ09ORklH X0ZPTykgZXZhbHVhdGVzIHRvIDEgaWYgQ09ORklHX0ZPTyBpcyBzZXQgdG8gJ3knLCAwCiAq IG90aGVyd2lzZS4gRm9yIGJvb2xlYW4gb3B0aW9ucywgdGhpcyBpcyBlcXVpdmFsZW50IHRv CiAqIElTX0VOQUJMRUQoQ09ORklHX0ZPTykuCiAqLwovKgogKiBJU19NT0RVTEUoQ09ORklH X0ZPTykgZXZhbHVhdGVzIHRvIDEgaWYgQ09ORklHX0ZPTyBpcyBzZXQgdG8gJ20nLCAwCiAq IG90aGVyd2lzZS4KICovCi8qCiAqIElTX1JFQUNIQUJMRShDT05GSUdfRk9PKSBldmFsdWF0 ZXMgdG8gMSBpZiB0aGUgY3VycmVudGx5IGNvbXBpbGVkCiAqIGNvZGUgY2FuIGNhbGwgYSBm dW5jdGlvbiBkZWZpbmVkIGluIGNvZGUgY29tcGlsZWQgYmFzZWQgb24gQ09ORklHX0ZPTy4K ICogVGhpcyBpcyBzaW1pbGFyIHRvIElTX0VOQUJMRUQoKSwgYnV0IHJldHVybnMgZmFsc2Ug d2hlbiBpbnZva2VkIGZyb20KICogYnVpbHQtaW4gY29kZSB3aGVuIENPTkZJR19GT08gaXMg c2V0IHRvICdtJy4KICovCi8qCiAqIElTX0VOQUJMRUQoQ09ORklHX0ZPTykgZXZhbHVhdGVz IHRvIDEgaWYgQ09ORklHX0ZPTyBpcyBzZXQgdG8gJ3knIG9yICdtJywKICogMCBvdGhlcndp c2UuCiAqLwovKgogKiBsZCBzY3JpcHQgdG8gbWFrZSBBUk0gTGludXgga2VybmVsCiAqIHRh a2VuIGZyb20gdGhlIGkzODYgdmVyc2lvbiBieSBSdXNzZWxsIEtpbmcKICogV3JpdHRlbiBi eSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KICovCi8qCiAq IEhlbHBlciBtYWNyb3MgdG8gc3VwcG9ydCB3cml0aW5nIGFyY2hpdGVjdHVyZSBzcGVjaWZp YwogKiBsaW5rZXIgc2NyaXB0cy4KICoKICogQSBtaW5pbWFsIGxpbmtlciBzY3JpcHRzIGhh cyBmb2xsb3dpbmcgY29udGVudDoKICogW1RoaXMgaXMgYSBzYW1wbGUsIGFyY2hpdGVjdHVy ZXMgbWF5IGhhdmUgc3BlY2lhbCByZXF1aXJpZW1lbnRzXQogKgogKiBPVVRQVVRfRk9STUFU KC4uLikKICogT1VUUFVUX0FSQ0goLi4uKQogKiBFTlRSWSguLi4pCiAqIFNFQ1RJT05TCiAq IHsKICoJLiA9IFNUQVJUOwogKglfX2luaXRfYmVnaW4gPSAuOwogKglIRUFEX1RFWFRfU0VD VElPTgogKglJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCiAqCUlOSVRfREFUQV9TRUNU SU9OKC4uLikKICoJUEVSQ1BVX1NFQ1RJT04oQ0FDSEVMSU5FX1NJWkUpCiAqCV9faW5pdF9l bmQgPSAuOwogKgogKglfc3RleHQgPSAuOwogKglURVhUX1NFQ1RJT04gPSAwCiAqCV9ldGV4 dCA9IC47CiAqCiAqICAgICAgX3NkYXRhID0gLjsKICoJUk9fREFUQV9TRUNUSU9OKFBBR0Vf U0laRSkKICoJUldfREFUQV9TRUNUSU9OKC4uLikKICoJX2VkYXRhID0gLjsKICoKICoJRVhD RVBUSU9OX1RBQkxFKC4uLikKICoJTk9URVMKICoKICoJQlNTX1NFQ1RJT04oMCwgMCwgMCkK ICoJX2VuZCA9IC47CiAqCiAqCVNUQUJTX0RFQlVHCiAqCURXQVJGX0RFQlVHCiAqCiAqCURJ U0NBUkRTCQkvLyBtdXN0IGJlIHRoZSBsYXN0CiAqIH0KICoKICogW19faW5pdF9iZWdpbiwg X19pbml0X2VuZF0gaXMgdGhlIGluaXQgc2VjdGlvbiB0aGF0IG1heSBiZSBmcmVlZCBhZnRl ciBpbml0CiAqIAkvLyBfX2luaXRfYmVnaW4gYW5kIF9faW5pdF9lbmQgc2hvdWxkIGJlIHBh Z2UgYWxpZ25lZCwgc28gdGhhdCB3ZSBjYW4KICoJLy8gZnJlZSB0aGUgd2hvbGUgLmluaXQg bWVtb3J5CiAqIFtfc3RleHQsIF9ldGV4dF0gaXMgdGhlIHRleHQgc2VjdGlvbgogKiBbX3Nk YXRhLCBfZWRhdGFdIGlzIHRoZSBkYXRhIHNlY3Rpb24KICoKICogU29tZSBvZiB0aGUgaW5j bHVkZWQgb3V0cHV0IHNlY3Rpb24gaGF2ZSB0aGVpciBvd24gc2V0IG9mIGNvbnN0YW50cy4K ICogRXhhbXBsZXMgYXJlOiBbX19pbml0cmFtZnNfc3RhcnQsIF9faW5pdHJhbWZzX2VuZF0g Zm9yIGluaXRyYW1mcyBhbmQKICogICAgICAgICAgICAgICBbX19ub3NhdmVfYmVnaW4sIF9f bm9zYXZlX2VuZF0gZm9yIHRoZSBub3NhdmUgZGF0YQogKi8KLyoKICogRXhwb3J0IHN5bWJv bHMgZnJvbSB0aGUga2VybmVsIHRvIG1vZHVsZXMuICBGb3JrZWQgZnJvbSBtb2R1bGUuaAog KiB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBwb2ludGxlc3MgY3J1ZnQgd2UgZmVlZCB0byBn Y2Mgd2hlbiBvbmx5CiAqIGV4cG9ydGluZyBhIHNpbXBsZSBzeW1ib2wgb3IgdHdvLgogKgog KiBUcnkgbm90IHRvIGFkZCAjaW5jbHVkZXMgaGVyZS4gIEl0IHNsb3dzIGNvbXBpbGF0aW9u IGFuZCBtYWtlcyBrZXJuZWwKICogaGFja2VycyBwbGFjZSBncnVtcHkgY29tbWVudHMgaW4g aGVhZGVyIGZpbGVzLgogKi8KLyogU29tZSB0b29sY2hhaW5zIHVzZSBhIGBfJyBwcmVmaXgg Zm9yIGFsbCB1c2VyIHN5bWJvbHMuICovCi8qIEluZGlyZWN0LCBzbyBtYWNyb3MgYXJlIGV4 cGFuZGVkIGJlZm9yZSBwYXN0aW5nLiAqLwovKiBBbGlnbiAuIHRvIGEgOCBieXRlIGJvdW5k YXJ5IGVxdWFscyB0byBtYXhpbXVtIGZ1bmN0aW9uIGFsaWdubWVudC4gKi8KLyoKICogQWxp Z24gdG8gYSAzMiBieXRlIGJvdW5kYXJ5IGVxdWFsIHRvIHRoZQogKiBhbGlnbm1lbnQgZ2Nj IDQuNSB1c2VzIGZvciBhIHN0cnVjdAogKi8KLyogVGhlIGFjdHVhbCBjb25maWd1cmF0aW9u IGRldGVybWluZSBpZiB0aGUgaW5pdC9leGl0IHNlY3Rpb25zCiAqIGFyZSBoYW5kbGVkIGFz IHRleHQvZGF0YSBvciB0aGV5IGNhbiBiZSBkaXNjYXJkZWQgKHdoaWNoCiAqIG9mdGVuIGhh cHBlbnMgYXQgcnVudGltZSkKICovCi8qIC5kYXRhIHNlY3Rpb24gKi8KLyoKICogRGF0YSBz ZWN0aW9uIGhlbHBlcnMKICovCi8qCiAqIFJlYWQgb25seSBEYXRhCiAqLwovKiBST0RBVEEg JiBST19EQVRBIHByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogKiBBbGwg YXJjaHMgYXJlIHN1cHBvc2VkIHRvIHVzZSBST19EQVRBKCkgKi8KLyogLnRleHQgc2VjdGlv bi4gTWFwIHRvIGZ1bmN0aW9uIGFsaWdubWVudCB0byBhdm9pZCBhZGRyZXNzIGNoYW5nZXMK ICogZHVyaW5nIHNlY29uZCBsZCBydW4gaW4gc2Vjb25kIGxkIHBhc3Mgd2hlbiBnZW5lcmF0 aW5nIFN5c3RlbS5tYXAgKi8KLyogc2NoZWQudGV4dCBpcyBhbGluZyB0byBmdW5jdGlvbiBh bGlnbm1lbnQgdG8gc2VjdXJlIHdlIGhhdmUgc2FtZQogKiBhZGRyZXNzIGV2ZW4gYXQgc2Vj b25kIGxkIHBhc3Mgd2hlbiBnZW5lcmF0aW5nIFN5c3RlbS5tYXAgKi8KLyogc3BpbmxvY2su dGV4dCBpcyBhbGluZyB0byBmdW5jdGlvbiBhbGlnbm1lbnQgdG8gc2VjdXJlIHdlIGhhdmUg c2FtZQogKiBhZGRyZXNzIGV2ZW4gYXQgc2Vjb25kIGxkIHBhc3Mgd2hlbiBnZW5lcmF0aW5n IFN5c3RlbS5tYXAgKi8KLyogU2VjdGlvbiB1c2VkIGZvciBlYXJseSBpbml0IChpbiAuUyBm aWxlcykgKi8KLyoKICogRXhjZXB0aW9uIHRhYmxlCiAqLwovKgogKiBJbml0IHRhc2sKICov Ci8qIGluaXQgYW5kIGV4aXQgc2VjdGlvbiBoYW5kbGluZyAqLwovKgogKiBic3MgKEJsb2Nr IFN0YXJ0ZWQgYnkgU3ltYm9sKSAtIHVuaW5pdGlhbGl6ZWQgZGF0YQogKiB6ZXJvZWQgZHVy aW5nIHN0YXJ0dXAKICovCi8qCiAqIEFsbG93IGFyY2hlY3R1cmVzIHRvIHJlZGVmaW5lIEJT U19GSVJTVF9TRUNUSU9OUyB0byBhZGQgZXh0cmEKICogc2VjdGlvbnMgdG8gdGhlIGZyb250 IG9mIGJzcy4KICovCi8qCiAqIERXQVJGIGRlYnVnIHNlY3Rpb25zLgogKiBTeW1ib2xzIGlu IHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvCiAqIHRoZSBi ZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLgogKi8KICAv KiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwovKgogKiBEZWZhdWx0IGRpc2NhcmRl ZCBzZWN0aW9ucy4KICoKICogU29tZSBhcmNocyB3YW50IHRvIGRpc2NhcmQgZXhpdCB0ZXh0 L2RhdGEgYXQgcnVudGltZSByYXRoZXIgdGhhbgogKiBsaW5rIHRpbWUgZHVlIHRvIGNyb3Nz LXNlY3Rpb24gcmVmZXJlbmNlcyBzdWNoIGFzIGFsdCBpbnN0cnVjdGlvbnMsCiAqIGJ1ZyB0 YWJsZSwgZWhfZnJhbWUsIGV0Yy4gIERJU0NBUkRTIG11c3QgYmUgdGhlIGxhc3Qgb2Ygb3V0 cHV0CiAqIHNlY3Rpb24gZGVmaW5pdGlvbnMgc28gdGhhdCBzdWNoIGFyY2hzIHB1dCB0aG9z ZSBpbiBlYXJsaWVyIHNlY3Rpb24KICogZGVmaW5pdGlvbnMuCiAqLwovKioKICogUEVSQ1BV X0lOUFVUIC0gdGhlIHBlcmNwdSBpbnB1dCBzZWN0aW9ucwogKiBAY2FjaGVsaW5lOiBjYWNo ZWxpbmUgc2l6ZQogKgogKiBUaGUgY29yZSBwZXJjcHUgc2VjdGlvbiBuYW1lcyBhbmQgY29y ZSBzeW1ib2xzIHdoaWNoIGRvIG5vdCByZWx5CiAqIGRpcmVjdGx5IHVwb24gbG9hZCBhZGRy ZXNzZXMuCiAqCiAqIEBjYWNoZWxpbmUgaXMgdXNlZCB0byBhbGlnbiBzdWJzZWN0aW9ucyB0 byBhdm9pZCBmYWxzZSBjYWNoZWxpbmUKICogc2hhcmluZyBiZXR3ZWVuIHN1YnNlY3Rpb25z IGZvciBkaWZmZXJlbnQgcHVycG9zZXMuCiAqLwovKioKICogUEVSQ1BVX1ZBRERSIC0gZGVm aW5lIG91dHB1dCBzZWN0aW9uIGZvciBwZXJjcHUgYXJlYQogKiBAY2FjaGVsaW5lOiBjYWNo ZWxpbmUgc2l6ZQogKiBAdmFkZHI6IGV4cGxpY2l0IGJhc2UgYWRkcmVzcyAob3B0aW9uYWwp CiAqIEBwaGRyOiBkZXN0aW5hdGlvbiBQSERSIChvcHRpb25hbCkKICoKICogTWFjcm8gd2hp Y2ggZXhwYW5kcyB0byBvdXRwdXQgc2VjdGlvbiBmb3IgcGVyY3B1IGFyZWEuCiAqCiAqIEBj YWNoZWxpbmUgaXMgdXNlZCB0byBhbGlnbiBzdWJzZWN0aW9ucyB0byBhdm9pZCBmYWxzZSBj YWNoZWxpbmUKICogc2hhcmluZyBiZXR3ZWVuIHN1YnNlY3Rpb25zIGZvciBkaWZmZXJlbnQg cHVycG9zZXMuCiAqCiAqIElmIEB2YWRkciBpcyBub3QgYmxhbmssIGl0IHNwZWNpZmllcyBl eHBsaWNpdCBiYXNlIGFkZHJlc3MgYW5kIGFsbAogKiBwZXJjcHUgc3ltYm9scyB3aWxsIGJl IG9mZnNldCBmcm9tIHRoZSBnaXZlbiBhZGRyZXNzLiAgSWYgYmxhbmssCiAqIEB2YWRkciBh bHdheXMgZXF1YWxzIEBsYWRkciArIExPQURfT0ZGU0VULgogKgogKiBAcGhkciBkZWZpbmVz IHRoZSBvdXRwdXQgUEhEUiB0byB1c2UgaWYgbm90IGJsYW5rLiAgQmUgd2FybmVkIHRoYXQK ICogb3V0cHV0IFBIRFIgaXMgc3RpY2t5LiAgSWYgQHBoZHIgaXMgc3BlY2lmaWVkLCB0aGUg bmV4dCBvdXRwdXQKICogc2VjdGlvbiBpbiB0aGUgbGlua2VyIHNjcmlwdCB3aWxsIGdvIHRo ZXJlIHRvby4gIEBwaGRyIHNob3VsZCBoYXZlCiAqIGEgbGVhZGluZyBjb2xvbi4KICoKICog Tm90ZSB0aGF0IHRoaXMgbWFjcm9zIGRlZmluZXMgX19wZXJfY3B1X2xvYWQgYXMgYW4gYWJz b2x1dGUgc3ltYm9sLgogKiBJZiB0aGVyZSBpcyBubyBuZWVkIHRvIHB1dCB0aGUgcGVyY3B1 IHNlY3Rpb24gYXQgYSBwcmVkZXRlcm1pbmVkCiAqIGFkZHJlc3MsIHVzZSBQRVJDUFVfU0VD VElPTi4KICovCi8qKgogKiBQRVJDUFVfU0VDVElPTiAtIGRlZmluZSBvdXRwdXQgc2VjdGlv biBmb3IgcGVyY3B1IGFyZWEsIHNpbXBsZSB2ZXJzaW9uCiAqIEBjYWNoZWxpbmU6IGNhY2hl bGluZSBzaXplCiAqCiAqIEFsaWduIHRvIFBBR0VfU0laRSBhbmQgb3V0cHV0cyBvdXRwdXQg c2VjdGlvbiBmb3IgcGVyY3B1IGFyZWEuICBUaGlzCiAqIG1hY3JvIGRvZXNuJ3QgbWFuaXB1 bGF0ZSBAdmFkZHIgb3IgQHBoZHIgYW5kIF9fcGVyX2NwdV9sb2FkIGFuZAogKiBfX3Blcl9j cHVfc3RhcnQgd2lsbCBiZSBpZGVudGljYWwuCiAqCiAqIFRoaXMgbWFjcm8gaXMgZXF1aXZh bGVudCB0byBBTElHTihQQUdFX1NJWkUpOyBQRVJDUFVfVkFERFIoQGNhY2hlbGluZSwsKQog KiBleGNlcHQgdGhhdCBfX3Blcl9jcHVfbG9hZCBpcyBkZWZpbmVkIGFzIGEgcmVsYXRpdmUg c3ltYm9sIGFnYWluc3QKICogLmRhdGEuLnBlcmNwdSB3aGljaCBpcyByZXF1aXJlZCBmb3Ig cmVsb2NhdGFibGUgeDg2XzMyIGNvbmZpZ3VyYXRpb24uCiAqLwovKgogKiBEZWZpbml0aW9u IG9mIHRoZSBoaWdoIGxldmVsICpfU0VDVElPTiBtYWNyb3MKICogVGhleSB3aWxsIGZpdCBv bmx5IGEgc3Vic2V0IG9mIHRoZSBhcmNoaXRlY3R1cmVzCiAqLwovKgogKiBXcml0ZWFibGUg ZGF0YS4KICogQWxsIHNlY3Rpb25zIGFyZSBjb21iaW5lZCBpbiBhIHNpbmdsZSAuZGF0YSBz ZWN0aW9uLgogKiBUaGUgc2VjdGlvbnMgZm9sbG93aW5nIENPTlNUUlVDVE9SUyBhcmUgYXJy YW5nZWQgc28gdGhlaXIKICogdHlwaWNhbCBhbGlnbm1lbnQgbWF0Y2hlcy4KICogQSBjYWNo ZWxpbmUgaXMgdHlwaWNhbC9hbHdheXMgbGVzcyB0aGFuIGEgUEFHRV9TSVpFIHNvCiAqIHRo ZSBzZWN0aW9ucyB0aGF0IGhhcyB0aGlzIHJlc3RyaWN0aW9uIChvciBzaW1pbGFyKQogKiBp cyBsb2NhdGVkIGJlZm9yZSB0aGUgb25lcyByZXF1aXJpbmcgUEFHRV9TSVpFIGFsaWdubWVu dC4KICogTk9TQVZFX0RBVEEgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSBQQUdFX1NJWkUgYWxp Z25tZW50IHdoaWNoCiAqIG1hdGNoZXMgdGhlIHJlcXVpcmVtZW50IG9mIFBBR0VfQUxJR05F RF9EQVRBLgogKgogKiB1c2UgMCBhcyBwYWdlX2FsaWduIGlmIHBhZ2VfYWxpZ25lZCBkYXRh IGlzIG5vdCB1c2VkICovCi8qCiAqIENvcHlyaWdodCAoQykgMjAxMiBBUk0gTHRkLgogKgog KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAq IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBu b3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwovKgogKiBDb3B5 cmlnaHQgKEMpIDIwMTIgQVJNIEx0ZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9u IDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAq CiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y Zy9saWNlbnNlcy8+LgogKi8KLyoKICogQ29weXJpZ2h0IChDKSAyMDEyIEFSTSBMdGQuCiAq CiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh aWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCi8qCiAqIE1l bW9yeSByZXR1cm5lZCBieSBrbWFsbG9jKCkgbWF5IGJlIHVzZWQgZm9yIERNQSwgc28gd2Ug bXVzdCBtYWtlCiAqIHN1cmUgdGhhdCBhbGwgc3VjaCBhbGxvY2F0aW9ucyBhcmUgY2FjaGUg YWxpZ25lZC4gT3RoZXJ3aXNlLAogKiB1bnJlbGF0ZWQgY29kZSBtYXkgY2F1c2UgcGFydHMg b2YgdGhlIGJ1ZmZlciB0byBiZSByZWFkIGludG8gdGhlCiAqIGNhY2hlIGJlZm9yZSB0aGUg dHJhbnNmZXIgaXMgZG9uZSwgY2F1c2luZyBvbGQgZGF0YSB0byBiZSBzZWVuIGJ5CiAqIHRo ZSBDUFUuCiAqLwovKgogKiBLZXJuZWwgcGFnZSB0YWJsZSBtYXBwaW5nCiAqCiAqIENvcHly aWdodCAoQykgMjAxNSBBUk0gTHRkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24g MiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoK ICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxv bmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uCiAqLwovKgogKiBUaGUgbGluZWFyIG1hcHBpbmcgYW5kIHRoZSBzdGFy dCBvZiBtZW1vcnkgYXJlIGJvdGggMk0gYWxpZ25lZCAocGVyCiAqIHRoZSBhcm02NCBib290 aW5nLnR4dCByZXF1aXJlbWVudHMpLiBIZW5jZSB3ZSBjYW4gdXNlIHNlY3Rpb24gbWFwcGlu ZwogKiB3aXRoIDRLIChzZWN0aW9uIHNpemUgPSAyTSkgYnV0IG5vdCB3aXRoIDE2SyAoc2Vj dGlvbiBzaXplID0gMzJNKSBvcgogKiA2NEsgKHNlY3Rpb24gc2l6ZSA9IDUxMk0pLgogKi8K LyoKICogVGhlIGlkbWFwIGFuZCBzd2FwcGVyIHBhZ2UgdGFibGVzIG5lZWQgc29tZSBzcGFj ZSByZXNlcnZlZCBpbiB0aGUga2VybmVsCiAqIGltYWdlLiBCb3RoIHJlcXVpcmUgcGdkLCBw dWQgKDQgbGV2ZWxzIG9ubHkpIGFuZCBwbWQgdGFibGVzIHRvIChzZWN0aW9uKQogKiBtYXAg dGhlIGtlcm5lbC4gV2l0aCB0aGUgNjRLIHBhZ2UgY29uZmlndXJhdGlvbiwgc3dhcHBlciBh bmQgaWRtYXAgbmVlZCB0bwogKiBtYXAgdG8gcHRlIGxldmVsLiBUaGUgc3dhcHBlciBhbHNv IG1hcHMgdGhlIEZEVCAoc2VlIF9fY3JlYXRlX3BhZ2VfdGFibGVzCiAqIGZvciBtb3JlIGlu Zm9ybWF0aW9uKS4gTm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgSUQgbWFwIHRyYW5zbGF0aW9u IGxldmVscwogKiBjb3VsZCBiZSBpbmNyZWFzZWQgb24gdGhlIGZseSBpZiBzeXN0ZW0gUkFN IGlzIG91dCBvZiByZWFjaCBmb3IgdGhlIGRlZmF1bHQKICogVkEgcmFuZ2UsIHNvIHBhZ2Vz IHJlcXVpcmVkIHRvIG1hcCBoaWdoZXN0IHBvc3NpYmxlIFBBIGFyZSByZXNlcnZlZCBpbiBh bGwKICogY2FzZXMuCiAqLwovKiBJbml0aWFsIG1lbW9yeSBtYXAgc2l6ZSAqLwovKiBUaGUg c2l6ZSBvZiB0aGUgaW5pdGlhbCBrZXJuZWwgZGlyZWN0IG1hcHBpbmcgKi8KLyoKICogSW5p dGlhbCBtZW1vcnkgbWFwIGF0dHJpYnV0ZXMuCiAqLwovKgogKiBCYXNlZCBvbiBhcmNoL2Fy bS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMiBS dXNzZWxsIEtpbmcuCiAqIENvcHlyaWdodCAoQykgMjAxMiBBUk0gTHRkLgogKgogKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoK ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNl ZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwovKgogKiBBbGxvdyB1cyB0 byBtYXJrIGZ1bmN0aW9ucyBhcyAnZGVwcmVjYXRlZCcgYW5kIGhhdmUgZ2NjIGVtaXQgYSBu aWNlCiAqIHdhcm5pbmcgZm9yIGVhY2ggdXNlLCBpbiBob3BlcyBvZiBzcGVlZGluZyB0aGUg ZnVuY3Rpb25zIHJlbW92YWwuCiAqIFVzYWdlIGlzOgogKiAJCWludCBfX2RlcHJlY2F0ZWQg Zm9vKHZvaWQpCiAqLwovKgogKiBBbGxvdyB1cyB0byBhdm9pZCAnZGVmaW5lZCBidXQgbm90 IHVzZWQnIHdhcm5pbmdzIG9uIGZ1bmN0aW9ucyBhbmQgZGF0YSwKICogYXMgd2VsbCBhcyBm b3JjZSB0aGVtIHRvIGJlIGVtaXR0ZWQgdG8gdGhlIGFzc2VtYmx5IGZpbGUuCiAqCiAqIEFz IG9mIGdjYyAzLjQsIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IG1hcmtlZCB3aXRo IGF0dHJpYnV0ZSgodXNlZCkpCiAqIG1heSBiZSBlbGlkZWQgZnJvbSB0aGUgYXNzZW1ibHkg ZmlsZS4gIEFzIG9mIGdjYyAzLjQsIHN0YXRpYyBkYXRhIG5vdCBzbwogKiBtYXJrZWQgd2ls bCBub3QgYmUgZWxpZGVkLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIGdjYyB2 ZXJzaW9uLgogKgogKiBOT1RFOiBCZWNhdXNlIGRpc3RyaWJ1dGlvbnMgc2hpcHBlZCB3aXRo IGEgYmFja3BvcnRlZCB1bml0LWF0LWEtdGltZQogKiBjb21waWxlciBpbiBnY2MgMy4zLCB3 ZSBtdXN0IGRlZmluZSBfX3VzZWQgdG8gYmUgX19hdHRyaWJ1dGVfXygodXNlZCkpCiAqIGZv ciBnY2MgPj0zLjMgaW5zdGVhZCBvZiAzLjQuCiAqCiAqIEluIHByaW9yIHZlcnNpb25zIG9m IGdjYywgc3VjaCBmdW5jdGlvbnMgYW5kIGRhdGEgd291bGQgYmUgZW1pdHRlZCwgYnV0CiAq IHdvdWxkIGJlIHdhcm5lZCBhYm91dCBleGNlcHQgd2l0aCBhdHRyaWJ1dGUoKHVudXNlZCkp LgogKgogKiBNYXJrIGZ1bmN0aW9ucyB0aGF0IGFyZSByZWZlcmVuY2VkIG9ubHkgaW4gaW5s aW5lIGFzc2VtYmx5IGFzIF9fdXNlZCBzbwogKiB0aGUgY29kZSBpcyBlbWl0dGVkIGV2ZW4g dGhvdWdoIGl0IGFwcGVhcnMgdG8gYmUgdW5yZWZlcmVuY2VkLgogKi8KLyoKICogUmF0aGVy IHRoZW4gdXNpbmcgbm9pbmxpbmUgdG8gcHJldmVudCBzdGFjayBjb25zdW1wdGlvbiwgdXNl CiAqIG5vaW5saW5lX2Zvcl9zdGFjayBpbnN0ZWFkLiAgRm9yIGRvY3VtZW50YXRpb24gcmVh c29ucy4KICovCi8qCiAqIEZyb20gdGhlIEdDQyBtYW51YWw6CiAqCiAqIE1hbnkgZnVuY3Rp b25zIGRvIG5vdCBleGFtaW5lIGFueSB2YWx1ZXMgZXhjZXB0IHRoZWlyIGFyZ3VtZW50cywK ICogYW5kIGhhdmUgbm8gZWZmZWN0cyBleGNlcHQgdGhlIHJldHVybiB2YWx1ZS4gIEJhc2lj YWxseSB0aGlzIGlzCiAqIGp1c3Qgc2xpZ2h0bHkgbW9yZSBzdHJpY3QgY2xhc3MgdGhhbiB0 aGUgYHB1cmUnIGF0dHJpYnV0ZSBhYm92ZSwKICogc2luY2UgZnVuY3Rpb24gaXMgbm90IGFs bG93ZWQgdG8gcmVhZCBnbG9iYWwgbWVtb3J5LgogKgogKiBOb3RlIHRoYXQgYSBmdW5jdGlv biB0aGF0IGhhcyBwb2ludGVyIGFyZ3VtZW50cyBhbmQgZXhhbWluZXMgdGhlCiAqIGRhdGEg cG9pbnRlZCB0byBtdXN0IF9ub3RfIGJlIGRlY2xhcmVkIGBjb25zdCcuICBMaWtld2lzZSwg YQogKiBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgbm9uLWBjb25zdCcgZnVuY3Rpb24gdXN1YWxs eSBtdXN0IG5vdCBiZQogKiBgY29uc3QnLiAgSXQgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3Ig YSBgY29uc3QnIGZ1bmN0aW9uIHRvIHJldHVybgogKiBgdm9pZCcuCiAqLwovKgogKiBUZWxs IGdjYyBpZiBhIGZ1bmN0aW9uIGlzIGNvbGQuIFRoZSBjb21waWxlciB3aWxsIGFzc3VtZSBh bnkgcGF0aAogKiBkaXJlY3RseSBsZWFkaW5nIHRvIHRoZSBjYWxsIGlzIHVubGlrZWx5Lgog Ki8KLyogU2ltcGxlIHNob3J0aGFuZCBmb3IgYSBzZWN0aW9uIGRlZmluaXRpb24gKi8KLyoK ICogQXNzdW1lIGFsaWdubWVudCBvZiByZXR1cm4gdmFsdWUuCiAqLwovKiBBcmUgdHdvIHR5 cGVzL3ZhcnMgdGhlIHNhbWUgdHlwZSAoaWdub3JpbmcgcXVhbGlmaWVycyk/ICovCi8qIElz IHRoaXMgdHlwZSBhIG5hdGl2ZSB3b3JkIHNpemUgLS0gdXNlZnVsIGZvciBhdG9taWMgb3Bl cmF0aW9ucyAqLwovKiBDb21waWxlIHRpbWUgb2JqZWN0IHNpemUsIC0xIGZvciB1bmtub3du ICovCi8qCiAqIFNwYXJzZSBjb21wbGFpbnMgb2YgdmFyaWFibGUgc2l6ZWQgYXJyYXlzIGR1 ZSB0byB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGluCiAqIF9fY29tcGlsZXRpbWVfYXNzZXJ0 LiBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IGp1c3QgZXhwYW5kIGl0IG91dCB0byBtYWtlCiAq IHNwYXJzZSBzZWUgYSBjb25zdGFudCBhcnJheSBzaXplIHdpdGhvdXQgYnJlYWtpbmcgY29t cGlsZXRpbWVfYXNzZXJ0IG9uIG9sZAogKiB2ZXJzaW9ucyBvZiBHQ0MgKGUuZy4gNC4yLjQp LCBzbyBoaWRlIHRoZSBhcnJheSBmcm9tIHNwYXJzZSBhbHRvZ2V0aGVyLgogKi8KLyoqCiAq IGNvbXBpbGV0aW1lX2Fzc2VydCAtIGJyZWFrIGJ1aWxkIGFuZCBlbWl0IG1zZyBpZiBjb25k aXRpb24gaXMgZmFsc2UKICogQGNvbmRpdGlvbjogYSBjb21waWxlLXRpbWUgY29uc3RhbnQg Y29uZGl0aW9uIHRvIGNoZWNrCiAqIEBtc2c6ICAgICAgIGEgbWVzc2FnZSB0byBlbWl0IGlm IGNvbmRpdGlvbiBpcyBmYWxzZQogKgogKiBJbiB0cmFkaXRpb24gb2YgUE9TSVggYXNzZXJ0 LCB0aGlzIG1hY3JvIHdpbGwgYnJlYWsgdGhlIGJ1aWxkIGlmIHRoZQogKiBzdXBwbGllZCBj b25kaXRpb24gaXMgKmZhbHNlKiwgZW1pdHRpbmcgdGhlIHN1cHBsaWVkIGVycm9yIG1lc3Nh Z2UgaWYgdGhlCiAqIGNvbXBpbGVyIGhhcyBzdXBwb3J0IHRvIGRvIHNvLgogKi8KLyoKICog UHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBtZXJnaW5nIG9yIHJlZmV0Y2hpbmcgYWNjZXNz ZXMuICBUaGUgY29tcGlsZXIKICogaXMgYWxzbyBmb3JiaWRkZW4gZnJvbSByZW9yZGVyaW5n IHN1Y2Nlc3NpdmUgaW5zdGFuY2VzIG9mIEFDQ0VTU19PTkNFKCksCiAqIGJ1dCBvbmx5IHdo ZW4gdGhlIGNvbXBpbGVyIGlzIGF3YXJlIG9mIHNvbWUgcGFydGljdWxhciBvcmRlcmluZy4g IE9uZSB3YXkKICogdG8gbWFrZSB0aGUgY29tcGlsZXIgYXdhcmUgb2Ygb3JkZXJpbmcgaXMg dG8gcHV0IHRoZSB0d28gaW52b2NhdGlvbnMgb2YKICogQUNDRVNTX09OQ0UoKSBpbiBkaWZm ZXJlbnQgQyBzdGF0ZW1lbnRzLgogKgogKiBBQ0NFU1NfT05DRSB3aWxsIG9ubHkgd29yayBv biBzY2FsYXIgdHlwZXMuIEZvciB1bmlvbiB0eXBlcywgQUNDRVNTX09OQ0UKICogb24gYSB1 bmlvbiBtZW1iZXIgd2lsbCB3b3JrIGFzIGxvbmcgYXMgdGhlIHNpemUgb2YgdGhlIG1lbWJl ciBtYXRjaGVzIHRoZQogKiBzaXplIG9mIHRoZSB1bmlvbiBhbmQgdGhlIHNpemUgaXMgc21h bGxlciB0aGFuIHdvcmQgc2l6ZS4KICoKICogVGhlIG1ham9yIHVzZSBjYXNlcyBvZiBBQ0NF U1NfT05DRSB1c2VkIHRvIGJlICgxKSBNZWRpYXRpbmcgY29tbXVuaWNhdGlvbgogKiBiZXR3 ZWVuIHByb2Nlc3MtbGV2ZWwgY29kZSBhbmQgaXJxL05NSSBoYW5kbGVycywgYWxsIHJ1bm5p bmcgb24gdGhlIHNhbWUgQ1BVLAogKiBhbmQgKDIpIEVuc3VyaW5nIHRoYXQgdGhlIGNvbXBp bGVyIGRvZXMgbm90ICBmb2xkLCBzcGluZGxlLCBvciBvdGhlcndpc2UKICogbXV0aWxhdGUg YWNjZXNzZXMgdGhhdCBlaXRoZXIgZG8gbm90IHJlcXVpcmUgb3JkZXJpbmcgb3IgdGhhdCBp bnRlcmFjdAogKiB3aXRoIGFuIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIG9yIGF0b21pYyBp bnN0cnVjdGlvbiB0aGF0IHByb3ZpZGVzIHRoZQogKiByZXF1aXJlZCBvcmRlcmluZy4KICoK ICogSWYgcG9zc2libGUgdXNlIFJFQURfT05DRSgpL1dSSVRFX09OQ0UoKSBpbnN0ZWFkLgog Ki8KLyoqCiAqIGxvY2tsZXNzX2RlcmVmZXJlbmNlKCkgLSBzYWZlbHkgbG9hZCBhIHBvaW50 ZXIgZm9yIGxhdGVyIGRlcmVmZXJlbmNlCiAqIEBwOiBUaGUgcG9pbnRlciB0byBsb2FkCiAq CiAqIFNpbWlsYXIgdG8gcmN1X2RlcmVmZXJlbmNlKCksIGJ1dCBmb3Igc2l0dWF0aW9ucyB3 aGVyZSB0aGUgcG9pbnRlZC10bwogKiBvYmplY3QncyBsaWZldGltZSBpcyBtYW5hZ2VkIGJ5 IHNvbWV0aGluZyBvdGhlciB0aGFuIFJDVS4gIFRoYXQKICogInNvbWV0aGluZyBvdGhlciIg bWlnaHQgYmUgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHNpbXBsZSBpbW1vcnRhbGl0eS4KICov Ci8qIElnbm9yZS9mb3JiaWQga3Byb2JlcyBhdHRhY2ggb24gdmVyeSBsb3cgbGV2ZWwgZnVu Y3Rpb25zIG1hcmtlZCBieSB0aGlzIGF0dHJpYnV0ZTogKi8KLyoKICogdGhyZWFkIGluZm9y bWF0aW9uIGZsYWdzOgogKiAgVElGX1NZU0NBTExfVFJBQ0UJLSBzeXNjYWxsIHRyYWNlIGFj dGl2ZQogKiAgVElGX1NZU0NBTExfVFJBQ0VQT0lOVCAtIHN5c2NhbGwgdHJhY2Vwb2ludCBm b3IgZnRyYWNlCiAqICBUSUZfU1lTQ0FMTF9BVURJVAktIHN5c2NhbGwgYXVkaXRpbmcKICog IFRJRl9TRUNPTVAJCS0gc3lzY2FsbCBzZWN1cmUgY29tcHV0aW5nCiAqICBUSUZfU0lHUEVO RElORwktIHNpZ25hbCBwZW5kaW5nCiAqICBUSUZfTkVFRF9SRVNDSEVECS0gcmVzY2hlZHVs aW5nIG5lY2Vzc2FyeQogKiAgVElGX05PVElGWV9SRVNVTUUJLSBjYWxsYmFjayBiZWZvcmUg cmV0dXJuaW5nIHRvIHVzZXIKICogIFRJRl9VU0VERlBVCQktIEZQVSB3YXMgdXNlZCBieSB0 aGlzIHRhc2sgdGhpcyBxdWFudHVtIChTTVApCiAqLwovKgogKiBCYXNlZCBvbiBhcmNoL2Fy bS9pbmNsdWRlL2FzbS9tZW1vcnkuaAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBS dXNzZWxsIEtpbmcKICogQ29weXJpZ2h0IChDKSAyMDEyIEFSTSBMdGQuCiAqCiAqIFRoaXMg cHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgog KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICoKICogTm90ZTogdGhpcyBmaWxl IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgYnkgbm9uLWFzbS8uaCBmaWxlcwogKi8KLyogY29u c3QuaDogTWFjcm9zIGZvciBkZWFsaW5nIHdpdGggY29uc3RhbnRzLiAgKi8KLyogU29tZSBj b25zdGFudCBtYWNyb3MgYXJlIHVzZWQgaW4gYm90aCBhc3NlbWJsZXIgYW5kCiAqIEMgY29k ZS4gIFRoZXJlZm9yZSB3ZSBjYW5ub3QgYW5ub3RhdGUgdGhlbSBhbHdheXMgd2l0aAogKiAn VUwnIGFuZCBvdGhlciB0eXBlIHNwZWNpZmllcnMgdW5pbGF0ZXJhbGx5LiAgV2UKICogdXNl IHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGRlYWwgd2l0aCB0aGlzLgogKgogKiBTaW1pbGFy bHksIF9BVCgpIHdpbGwgY2FzdCBhbiBleHByZXNzaW9uIHdpdGggYSB0eXBlIGluIEMsIGJ1 dAogKiBsZWF2ZSBpdCB1bmNoYW5nZWQgaW4gYXNtLgogKi8KLyoKICogaW50LWxsNjQgaXMg dXNlZCBldmVyeXdoZXJlIG5vdy4KICovCi8qCiAqIGFzbS1nZW5lcmljL2ludC1sbDY0LmgK ICoKICogSW50ZWdlciBkZWNsYXJhdGlvbnMgZm9yIGFyY2hpdGVjdHVyZXMgd2hpY2ggdXNl ICJsb25nIGxvbmciCiAqIGZvciA2NC1iaXQgdHlwZXMuCiAqLwovKgogKiBhc20tZ2VuZXJp Yy9pbnQtbGw2NC5oCiAqCiAqIEludGVnZXIgZGVjbGFyYXRpb25zIGZvciBhcmNoaXRlY3R1 cmVzIHdoaWNoIHVzZSAibG9uZyBsb25nIgogKiBmb3IgNjQtYml0IHR5cGVzLgogKi8KLyoK ICogQ29weXJpZ2h0IChDKSAyMDEyIEFSTSBMdGQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug dmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4KICovCi8qCiAqIFRoZXJlIHNlZW1zIHRvIGJlIG5vIHdh eSBvZiBkZXRlY3RpbmcgdGhpcyBhdXRvbWF0aWNhbGx5IGZyb20gdXNlcgogKiBzcGFjZSwg c28gNjQgYml0IGFyY2hpdGVjdHVyZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgaW4gdGhlaXIK ICogYml0c3BlcmxvbmcuaC4gSW4gcGFydGljdWxhciwgYW4gYXJjaGl0ZWN0dXJlIHRoYXQg c3VwcG9ydHMKICogYm90aCAzMiBhbmQgNjQgYml0IHVzZXIgc3BhY2UgbXVzdCBub3QgcmVs eSBvbiBDT05GSUdfNjRCSVQKICogdG8gZGVjaWRlIGl0LCBidXQgcmF0aGVyIGNoZWNrIGEg Y29tcGlsZXIgcHJvdmlkZWQgbWFjcm8uCiAqLwovKgogKiBGSVhNRTogVGhlIGNoZWNrIGN1 cnJlbnRseSBicmVha3MgeDg2LTY0IGJ1aWxkLCBzbyBpdCdzCiAqIHRlbXBvcmFyaWx5IGRp c2FibGVkLiBQbGVhc2UgZml4IHg4Ni02NCBhbmQgcmVlbmFibGUKICovCi8qIFRoaXMgaXMg YSBwbGFjZWhvbGRlciwgdG8gYmUgcmVtb3ZlZCBvdmVyIHRpbWUgKi8KLyoKICogaW5jbHVk ZS9saW51eC9zaXplcy5oCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAq IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KLyoKICog QWxsb3cgZm9yIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUgdG8gYmUgdXNlZCBmcm9tIGFzc2Vt Ymx5IGNvZGUKICogYnkgcHJlcGVuZGluZyB0aGUgVUwgc3VmZml4IG9ubHkgd2l0aCBhY3R1 YWwgQyBjb2RlIGNvbXBpbGF0aW9uLgogKi8KLyoKICogU2l6ZSBvZiB0aGUgUENJIEkvTyBz cGFjZS4gVGhpcyBtdXN0IHJlbWFpbiBhIHBvd2VyIG9mIHR3byBzbyB0aGF0CiAqIElPX1NQ QUNFX0xJTUlUIGFjdHMgYXMgYSBtYXNrIGZvciB0aGUgbG93IGJpdHMgb2YgSS9PIGFkZHJl c3Nlcy4KICovCi8qCiAqIFBBR0VfT0ZGU0VUIC0gdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0 aGUgc3RhcnQgb2YgdGhlIGtlcm5lbCBpbWFnZSAodG9wCiAqCQkgKFZBX0JJVFMgLSAxKSkK ICogVkFfQklUUyAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGZvciB2aXJ0dWFsIGFk ZHJlc3Nlcy4KICogVkFfU1RBUlQgLSB0aGUgZmlyc3Qga2VybmVsIHZpcnR1YWwgYWRkcmVz cy4KICogVEFTS19TSVpFIC0gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHVzZXIgc3BhY2UgdGFz ay4KICogVEFTS19VTk1BUFBFRF9CQVNFIC0gdGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBt bWFwIFZNIGFyZWEuCiAqIFRoZSBtb2R1bGUgc3BhY2UgbGl2ZXMgYmV0d2VlbiB0aGUgYWRk cmVzc2VzIGdpdmVuIGJ5IFRBU0tfU0laRQogKiBhbmQgUEFHRV9PRkZTRVQgLSBpdCBtdXN0 IGJlIHdpdGhpbiAxMjhNQiBvZiB0aGUga2VybmVsIHRleHQuCiAqLwovKgogKiBQaHlzaWNh bCB2cyB2aXJ0dWFsIFJBTSBhZGRyZXNzIHNwYWNlIGNvbnZlcnNpb24uICBUaGVzZSBhcmUK ICogcHJpdmF0ZSBkZWZpbml0aW9ucyB3aGljaCBzaG91bGQgTk9UIGJlIHVzZWQgb3V0c2lk ZSBtZW1vcnkuaAogKiBmaWxlcy4gIFVzZSB2aXJ0X3RvX3BoeXMvcGh5c190b192aXJ0L19f cGEvX192YSBpbnN0ZWFkLgogKi8KLyoKICogQ29udmVydCBhIHBhZ2UgdG8vZnJvbSBhIHBo eXNpY2FsIGFkZHJlc3MKICovCi8qCiAqIE1lbW9yeSB0eXBlcyBhdmFpbGFibGUuCiAqLwov KgogKiBNZW1vcnkgdHlwZXMgZm9yIFN0YWdlLTIgdHJhbnNsYXRpb24KICovCi8qCiAqIEJh c2VkIG9uIGFyY2gvYXJtL2luY2x1ZGUvYXNtL3BhZ2UuaAogKgogKiBDb3B5cmlnaHQgKEMp IDE5OTUtMjAwMyBSdXNzZWxsIEtpbmcKICogQ29weXJpZ2h0IChDKSAyMDEyIEFSTSBMdGQu CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4g IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICovCi8qIFBB R0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCi8qIENPTlRfU0hJRlQgZGV0 ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIGNhbiBiZSB0cmFja2VkIHRvZ2V0 aGVyICAqLwovKgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgQVJNIEx0ZC4KICoKICogVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl CiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAq IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUg PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogKi8KLyoKICogQ29weXJpZ2h0IChD KSAyMDE1ICBBUk0gTGltaXRlZAogKiBBdXRob3I6IERhdmUgTWFydGluIDxEYXZlLk1hcnRp bkBhcm0uY29tPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws CiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlz IHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4u CiAqLwovKgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgQVJNIEx0ZC4KICoKICogVGhpcyBwcm9n cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlv dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogKi8KLyoKICogVGhpcyBlcnJvciBjb2Rl IGlzIHNwZWNpYWw6IGFyY2ggc3lzY2FsbCBlbnRyeSBjb2RlIHdpbGwgcmV0dXJuCiAqIC1F Tk9TWVMgaWYgdXNlcnMgdHJ5IHRvIGNhbGwgYSBzeXNjYWxsIHRoYXQgZG9lc24ndCBleGlz dC4gIFRvIGtlZXAKICogZmFpbHVyZXMgb2Ygc3lzY2FsbHMgdGhhdCByZWFsbHkgZG8gZXhp c3QgZGlzdGluZ3Vpc2hhYmxlIGZyb20KICogZmFpbHVyZXMgZHVlIHRvIGF0dGVtcHRzIHRv IHVzZSBhIG5vbmV4aXN0ZW50IHN5c2NhbGwsIHN5c2NhbGwKICogaW1wbGVtZW50YXRpb25z IHNob3VsZCByZWZyYWluIGZyb20gcmV0dXJuaW5nIC1FTk9TWVMuCiAqLwovKiBmb3Igcm9i dXN0IG11dGV4ZXMgKi8KLyoKICogVGhlc2Ugc2hvdWxkIG5ldmVyIGJlIHNlZW4gYnkgdXNl ciBwcm9ncmFtcy4gIFRvIHJldHVybiBvbmUgb2YgRVJFU1RBUlQqCiAqIGNvZGVzLCBzaWdu YWxfcGVuZGluZygpIE1VU1QgYmUgc2V0LiAgTm90ZSB0aGF0IHB0cmFjZSBjYW4gb2JzZXJ2 ZSB0aGVzZQogKiBhdCBzeXNjYWxsIGV4aXQgdHJhY2luZywgYnV0IHRoZXkgd2lsbCBuZXZl ciBiZSBsZWZ0IGZvciB0aGUgZGVidWdnZWQgdXNlcgogKiBwcm9jZXNzIHRvIHNlZS4KICov Ci8qIERlZmluZWQgZm9yIHRoZSBORlN2MyBwcm90b2NvbCAqLwovKgogKiBDb3B5cmlnaHQg KEMpIDIwMTMgLSBBUk0gTHRkCiAqIEF1dGhvcjogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdp ZXJAYXJtLmNvbT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+ LgogKi8KLyoKICogQmFzZWQgb24gYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKICoK ICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUnVzc2VsbCBLaW5nCiAqIENvcHlyaWdodCAo QykgMjAxMiBBUk0gTHRkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwog KiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVGhp cyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk IGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0 aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uCiAqCiAqIE5vdGU6IHRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGJ5 IG5vbi1hc20vLmggZmlsZXMKICovCi8qIFVuYWxsb2NhdGVkIEVDOiAweDAyICovCi8qIFVu YWxsb2NhdGVkIEVDOiAweDA5IC0gMHgwQiAqLwovKiBVbmFsbG9jYXRlZCBFQzogMHgwZCAq LwovKiBVbmFsbG9jYXRlZCBFQzogMHgwRiAtIDB4MTAgKi8KLyogVW5hbGxvY2F0ZWQgRUM6 IDB4MTQgKi8KLyogVW5hbGxvY2F0ZWQgRUM6IDB4MTkgLSAweDFFICovCi8qIFVuYWxsb2Nh dGVkIEVDOiAweDIzICovCi8qIFVuYWxsb2NhdGVkIEVDOiAweDI3ICovCi8qIFVuYWxsb2Nh dGVkIEVDOiAweDI5IC0gMHgyQiAqLwovKiBVbmFsbG9jYXRlZCBFQzogMHgyRCAtIDB4MkUg Ki8KLyogVW5hbGxvY2F0ZWQgRUM6IDB4MzYgLSAweDM3ICovCi8qIFVuYWxsb2NhdGVkIEVD OiAweDM5ICovCi8qIFVuYWxsb2N0ZWQgRUM6IDB4M0IgKi8KLyogVW5hbGxvY2F0ZWQgRUM6 IDB4M0QgLSAweDNGICovCi8qIEVTUiB2YWx1ZSB0ZW1wbGF0ZXMgZm9yIHNwZWNpZmljIGV2 ZW50cyAqLwovKiBCUksgaW5zdHJ1Y3Rpb24gdHJhcCBmcm9tIEFBcmNoNjQgc3RhdGUgKi8K LyoKICogQ29weXJpZ2h0IChDKSAyMDEzIEh1YXdlaSBMdGQuCiAqIEF1dGhvcjogSmlhbmcg TGl1IDxsaXVqOTdAZ21haWwuY29tPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTQgWmkgU2hl biBMaW0gPHpsaW0ubG54QGdtYWlsLmNvbT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJz aW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24u CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+LgogKi8KLyogQTY0IGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIDMy IGJpdHMuICovCi8qCiAqIEJhc2VkIG9uIGFyY2gvYXJtL2luY2x1ZGUvYXNtL3B0cmFjZS5o CiAqCiAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDAzIFJ1c3NlbGwgS2luZwogKiBDb3B5cmln aHQgKEMpIDIwMTIgQVJNIEx0ZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIg YXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAq IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+LgogKi8KLyoKICogQmFzZWQgb24gYXJjaC9hcm0vaW5jbHVkZS9hc20vcHRy YWNlLmgKICoKICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDMgUnVzc2VsbCBLaW5nCiAqIENv cHlyaWdodCAoQykgMjAxMiBBUk0gTHRkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNp b24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4K ICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICog YWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLz4uCiAqLwovKgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgQVJNIEx0ZC4K ICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv ZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAg SWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogKi8KLyoKICog Q29weXJpZ2h0IChDKSAyMDEyIEFSTSBMdGQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVy c2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQog KiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3Lmdu dS5vcmcvbGljZW5zZXMvPi4KICovCi8qCiAqIEhXQ0FQIGZsYWdzIC0gZm9yIGVsZl9od2Nh cCAoaW4ga2VybmVsKSBhbmQgQVRfSFdDQVAKICovCi8qCiAqIFBTUiBiaXRzCiAqLwovKiBB QXJjaDMyIENQU1IgYml0cyAqLwovKiBBQXJjaDY0IFNQU1IgYml0cyAqLwovKgogKiBHcm91 cHMgb2YgUFNSIGJpdHMKICovCi8qIEN1cnJlbnQgRXhjZXB0aW9uIExldmVsIHZhbHVlcywg YXMgY29udGFpbmVkIGluIEN1cnJlbnRFTCAqLwovKiBBQXJjaDMyLXNwZWNpZmljIHB0cmFj ZSByZXF1ZXN0cyAqLwovKiBBQXJjaDMyIENQU1IgYml0cyAqLwovKgogKiBUaGVzZSBhcmUg J21hZ2ljJyB2YWx1ZXMgZm9yIFBUUkFDRV9QRUVLVVNSIHRoYXQgcmV0dXJuIGluZm8gYWJv dXQgd2hlcmUgYQogKiBwcm9jZXNzIGlzIGxvY2F0ZWQgaW4gbWVtb3J5LgogKi8KLyogTG93 LWxldmVsIHN0ZXBwaW5nIGNvbnRyb2xzLiAqLwovKiBNRFNDUl9FTDEgZW5hYmxpbmcgYml0 cyAqLwovKiBBQXJjaDY0ICovCi8qCiAqIEJyZWFrIHBvaW50IGluc3RydWN0aW9uIGVuY29k aW5nCiAqLwovKgogKiAjaW1tMTYgdmFsdWVzIHVzZWQgZm9yIEJSSyBpbnN0cnVjdGlvbiBn ZW5lcmF0aW9uCiAqIEFsbG93ZWQgdmFsdWVzIGZvciBrZ2JkIGFyZSAweDQwMCAtIDB4N2Zm CiAqIDB4MTAwOiBmb3IgdHJpZ2dlcmluZyBhIGZhdWx0IG9uIHB1cnBvc2UgKHJlc2VydmVk KQogKiAweDQwMDogZm9yIGR5bmFtaWMgQlJLIGluc3RydWN0aW9uCiAqIDB4NDAxOiBmb3Ig Y29tcGlsZSB0aW1lIEJSSyBpbnN0cnVjdGlvbgogKiAweDgwMDoga2VybmVsLW1vZGUgQlVH KCkgYW5kIFdBUk4oKSB0cmFwcwogKi8KLyoKICogQlJLIGluc3RydWN0aW9uIGVuY29kaW5n CiAqIFRoZSAjaW1tMTYgdmFsdWUgc2hvdWxkIGJlIHBsYWNlZCBhdCBiaXRzWzIwOjVdIHdp dGhpbiBCUksgaW5zCiAqLwovKgogKiBCUksgaW5zdHJ1Y3Rpb24gZm9yIHByb3Zva2luZyBh IGZhdWx0IG9uIHB1cnBvc2UKICogVW5saWtlIGtnZGIsICNpbW0xNiB2YWx1ZSB3aXRoIHVu YWxsb2NhdGVkIGhhbmRsZXIgaXMgdXNlZCBmb3IgZmF1bHRpbmcuCiAqLwovKiBBQXJjaDMy ICovCi8qCiAqIEJhc2VkIG9uIGFyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb2MtZm5zLmgKICoK ICogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgUnVzc2VsbCBLaW5nCiAqIENvcHlyaWdodCAo QykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAogKiBDb3B5cmlnaHQgKEMpIDIwMTIg QVJNIEx0ZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAog KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3 YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBw cm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgog Ki8KLyoKICogQmFzZWQgb24gYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKICoKICog Q29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUnVzc2VsbCBLaW5nCiAqIENvcHlyaWdodCAoQykg MjAxMiBBUk0gTHRkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBw dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVGhpcyBw cm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0 aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uCiAqCiAqIE5vdGU6IHRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGJ5IG5v bi1hc20vLmggZmlsZXMKICovCi8qCiAqIENvcHlyaWdodCAoQykgMjAxMiBBUk0gTHRkLgog KgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJ ZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwovKgogKiBO dW1iZXIgb2YgcGFnZS10YWJsZSBsZXZlbHMgcmVxdWlyZWQgdG8gYWRkcmVzcyAndmFfYml0 cycgd2lkZQogKiBhZGRyZXNzLCB3aXRob3V0IHNlY3Rpb24gbWFwcGluZy4gV2UgcmVzb2x2 ZSB0aGUgdG9wICh2YV9iaXRzIC0gUEFHRV9TSElGVCkKICogYml0cyB3aXRoIChQQUdFX1NI SUZUIC0gMykgYml0cyBhdCBlYWNoIHBhZ2UgdGFibGUgbGV2ZWwuIEhlbmNlOgogKgogKiAg bGV2ZWxzID0gRElWX1JPVU5EX1VQKCh2YV9iaXRzIC0gUEFHRV9TSElGVCksIChQQUdFX1NI SUZUIC0gMykpCiAqCiAqIHdoZXJlIERJVl9ST1VORF9VUChuLCBkKSA9PiAoKChuKSArIChk KSAtIDEpIC8gKGQpKQogKgogKiBXZSBjYW5ub3QgaW5jbHVkZSBsaW51eC9rZXJuZWwuaCB3 aGljaCBkZWZpbmVzIERJVl9ST1VORF9VUCBoZXJlCiAqIGR1ZSB0byBidWlsZCBpc3N1ZXMu IFNvIHdlIG9wZW4gY29kZSBESVZfUk9VTkRfVVAgaGVyZToKICoKICoJKCgoKHZhX2JpdHMp IC0gUEFHRV9TSElGVCkgKyAoUEFHRV9TSElGVCAtIDMpIC0gMSkgLyAoUEFHRV9TSElGVCAt IDMpKQogKgogKiB3aGljaCBnZXRzIHNpbXBsaWZpZWQgYXMgOgogKi8KLyoKICogU2l6ZSBt YXBwZWQgYnkgYW4gZW50cnkgYXQgbGV2ZWwgbiAoIDAgPD0gbiA8PSAzKQogKiBXZSBtYXAg KFBBR0VfU0hJRlQgLSAzKSBhdCBhbGwgdHJhbnNsYXRpb24gbGV2ZWxzIGFuZCBQQUdFX1NI SUZUIGJpdHMKICogaW4gdGhlIGZpbmFsIHBhZ2UuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0 cmFuc2xhdGlvbiBsZXZlbHMgc3VwcG9ydGVkIGJ5CiAqIHRoZSBhcmNoaXRlY3R1cmUgaXMg NC4gSGVuY2UsIHN0YXJ0aW5nIGF0IGF0IGxldmVsIG4sIHdlIGhhdmUgZnVydGhlcgogKiAo KDQgLSBuKSAtIDEpIGxldmVscyBvZiB0cmFuc2xhdGlvbiBleGNsdWRpbmcgdGhlIG9mZnNl dCB3aXRoaW4gdGhlIHBhZ2UuCiAqIFNvLCB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgbWFw cGVkIGJ5IGFuIGVudHJ5IGF0IGxldmVsIG4gaXMgOgogKgogKiAgKCg0IC0gbikgLSAxKSAq IChQQUdFX1NISUZUIC0gMykgKyBQQUdFX1NISUZUCiAqCiAqIFJlYXJyYW5naW5nIGl0IGEg Yml0IHdlIGdldCA6CiAqICAgKDQgLSBuKSAqIChQQUdFX1NISUZUIC0gMykgKyAzCiAqLwov KgogKiBQTURfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBhIGxldmVsIDIgcGFnZSB0YWJs ZSBlbnRyeSBjYW4gbWFwLgogKi8KLyoKICogUFVEX1NISUZUIGRldGVybWluZXMgdGhlIHNp emUgYSBsZXZlbCAxIHBhZ2UgdGFibGUgZW50cnkgY2FuIG1hcC4KICovCi8qCiAqIFBHRElS X1NISUZUIGRldGVybWluZXMgdGhlIHNpemUgYSB0b3AtbGV2ZWwgcGFnZSB0YWJsZSBlbnRy eSBjYW4gbWFwCiAqIChkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb24sIHRoaXMgbGV2 ZWwgY2FuIGJlIDAsIDEgb3IgMikuCiAqLwovKgogKiBTZWN0aW9uIGFkZHJlc3MgbWFzayBh bmQgc2l6ZSBkZWZpbml0aW9ucy4KICovCi8qCiAqIENvbnRpZ3VvdXMgcGFnZSBkZWZpbml0 aW9ucy4KICovCi8qIHRoZSB0aGUgbnVtZXJpY2FsIG9mZnNldCBvZiB0aGUgUFRFIHdpdGhp biBhIHJhbmdlIG9mIENPTlRfUFRFUyAqLwovKgogKiBIYXJkd2FyZSBwYWdlIHRhYmxlIGRl ZmluaXRpb25zLgogKgogKiBMZXZlbCAxIGRlc2NyaXB0b3IgKFBVRCkuCiAqLwovKgogKiBM ZXZlbCAyIGRlc2NyaXB0b3IgKFBNRCkuCiAqLwovKgogKiBTZWN0aW9uCiAqLwovKgogKiBB dHRySW5keFsyOjBdIGVuY29kaW5nIChtYXBwaW5nIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0 aGUgTUFJUiogcmVnaXN0ZXJzKS4KICovCi8qCiAqIExldmVsIDMgZGVzY3JpcHRvciAoUFRF KS4KICovCi8qCiAqIEF0dHJJbmR4WzI6MF0gZW5jb2RpbmcgKG1hcHBpbmcgYXR0cmlidXRl cyBkZWZpbmVkIGluIHRoZSBNQUlSKiByZWdpc3RlcnMpLgogKi8KLyoKICogMm5kIHN0YWdl IFBURSBkZWZpbml0aW9ucwogKi8KLyoKICogTWVtb3J5IEF0dHJpYnV0ZSBvdmVycmlkZSBm b3IgU3RhZ2UtMiAoTWVtQXR0clszOjBdKQogKi8KLyoKICogRUwyL0hZUCBQVEUvUE1EIGRl ZmluaXRpb25zCiAqLwovKgogKiBIaWdoZXN0IHBvc3NpYmxlIHBoeXNpY2FsIGFkZHJlc3Mg c3VwcG9ydGVkLgogKi8KLyoKICogVENSIGZsYWdzLgogKi8KLyoKICogU29mdHdhcmUgZGVm aW5lZCBQVEUgYml0cyBkZWZpbml0aW9uLgogKi8KLyoKICogVk1BTExPQyBhbmQgU1BBUlNF TUVNX1ZNRU1NQVAgcmFuZ2VzLgogKgogKiBWTUVNQVBfU0laRTogYWxsb3dzIHRoZSB3aG9s ZSBsaW5lYXIgcmVnaW9uIHRvIGJlIGNvdmVyZWQgYnkgYSBzdHJ1Y3QgcGFnZSBhcnJheQog Kgkocm91bmRlZCB1cCB0byBQVURfU0laRSkuCiAqIFZNQUxMT0NfU1RBUlQ6IGJlZ2lubmlu ZyBvZiB0aGUga2VybmVsIFZBIHNwYWNlCiAqIFZNQUxMT0NfRU5EOiBleHRlbmRzIHRvIHRo ZSBhdmFpbGFibGUgc3BhY2UgYmVsb3cgdm1tZW1tYXAsIFBDSSBJL08gc3BhY2UsCiAqCWZp eGVkIG1hcHBpbmdzIGFuZCBtb2R1bGVzCiAqLwovKgogKiBMaW5rZXIgc2NyaXB0IG1hY3Jv cyB0byBnZW5lcmF0ZSBJbWFnZSBoZWFkZXIgZmllbGRzLgogKgogKiBDb3B5cmlnaHQgKEMp IDIwMTQgQVJNIEx0ZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICog cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+LgogKi8KLyoKICogVGhlcmUgYXJlbid0IGFueSBFTEYgcmVsb2NhdGlvbnMgd2UgY2Fu IHVzZSB0byBlbmRpYW4tc3dhcCB2YWx1ZXMga25vd24gb25seQogKiBhdCBsaW5rIHRpbWUg KGUuZy4gdGhlIHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2wgYWRkcmVzc2VzKSwgc28gd2Ug bXVzdCBnZXQKICogdGhlIGxpbmtlciB0byBlbmRpYW4tc3dhcCBjZXJ0YWluIHZhbHVlcyBi ZWZvcmUgZW1pdHRpbmcgdGhlbS4KICovCi8qCiAqIFRoZXNlIHdpbGwgb3V0cHV0IGFzIHBh cnQgb2YgdGhlIEltYWdlIGhlYWRlciwgd2hpY2ggc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4K ICogcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFubmVzcyBvZiB0aGUga2VybmVsLiBXaGlsZSBj b25zdGFudCB2YWx1ZXMgY291bGQgYmUKICogZW5kaWFuIHN3YXBwZWQgaW4gaGVhZC5TLCBh bGwgYXJlIGRvbmUgaGVyZSBmb3IgY29uc2lzdGVuY3kuCiAqLwovKgogKiBUaGUgRUZJIHN0 dWIgaGFzIGl0cyBvd24gc3ltYm9sIG5hbWVzcGFjZSBwcmVmaXhlZCBieSBfX2VmaXN0dWJf LCB0bwogKiBpc29sYXRlIGl0IGZyb20gdGhlIGtlcm5lbCBwcm9wZXIuIFRoZSBmb2xsb3dp bmcgc3ltYm9scyBhcmUgbGVnYWxseQogKiBhY2Nlc3NlZCBieSB0aGUgc3R1Yiwgc28gcHJv dmlkZSBzb21lIGFsaWFzZXMgdG8gbWFrZSB0aGVtIGFjY2Vzc2libGUuCiAqIE9ubHkgaW5j bHVkZSBkYXRhIHN5bWJvbHMgaGVyZSwgb3IgdGV4dCBzeW1ib2xzIG9mIGZ1bmN0aW9ucyB0 aGF0IGFyZQogKiBndWFyYW50ZWVkIHRvIGJlIHNhZmUgd2hlbiBleGVjdXRlZCBhdCBhbm90 aGVyIG9mZnNldCB0aGFuIHRoZXkgd2VyZQogKiBsaW5rZWQgYXQuIFRoZSByb3V0aW5lcyBi ZWxvdyBhcmUgYWxsIGltcGxlbWVudGVkIGluIGFzc2VtYmxlciBpbiBhCiAqIHBvc2l0aW9u IGluZGVwZW5kZW50IG1hbm5lcgogKi8KX19lZmlzdHViX21lbWNtcCA9IF9fcGlfbWVtY21w OwpfX2VmaXN0dWJfbWVtY2hyID0gX19waV9tZW1jaHI7Cl9fZWZpc3R1Yl9tZW1jcHkgPSBf X3BpX21lbWNweTsKX19lZmlzdHViX21lbW1vdmUgPSBfX3BpX21lbW1vdmU7Cl9fZWZpc3R1 Yl9tZW1zZXQgPSBfX3BpX21lbXNldDsKX19lZmlzdHViX3N0cmxlbiA9IF9fcGlfc3RybGVu OwpfX2VmaXN0dWJfc3RyY21wID0gX19waV9zdHJjbXA7Cl9fZWZpc3R1Yl9zdHJuY21wID0g X19waV9zdHJuY21wOwpfX2VmaXN0dWJfX19mbHVzaF9kY2FjaGVfYXJlYSA9IF9fcGlfX19m bHVzaF9kY2FjaGVfYXJlYTsKX19lZmlzdHViX190ZXh0ID0gX3RleHQ7Cl9fZWZpc3R1Yl9f ZW5kID0gX2VuZDsKX19lZmlzdHViX19lZGF0YSA9IF9lZGF0YTsKLyogLmV4aXQudGV4dCBu ZWVkZWQgaW4gY2FzZSBvZiBhbHRlcm5hdGl2ZSBwYXRjaGluZyAqLwpPVVRQVVRfQVJDSChh YXJjaDY0KQpFTlRSWShfdGV4dCkKamlmZmllcyA9IGppZmZpZXNfNjQ7Ci8qCiAqIFRoZSBz aXplIG9mIHRoZSBQRS9DT0ZGIHNlY3Rpb24gdGhhdCBjb3ZlcnMgdGhlIGtlcm5lbCBpbWFn ZSwgd2hpY2gKICogcnVucyBmcm9tIHN0ZXh0IHRvIF9lZGF0YSwgbXVzdCBiZSBhIHJvdW5k IG11bHRpcGxlIG9mIHRoZSBQRS9DT0ZGCiAqIEZpbGVBbGlnbm1lbnQsIHdoaWNoIHdlIHNl dCB0byBpdHMgbWluaW11bSB2YWx1ZSBvZiAweDIwMC4gJ3N0ZXh0JwogKiBpdHNlbGYgaXMg NCBLQiBhbGlnbmVkLCBzbyBwYWRkaW5nIG91dCBfZWRhdGEgdG8gYSAweDIwMCBhbGlnbmVk CiAqIGJvdW5kYXJ5IHNob3VsZCBiZSBzdWZmaWNpZW50LgogKi8KUEVDT0ZGX0ZJTEVfQUxJ R05NRU5UID0gMHgyMDA7ClNFQ1RJT05TCnsKIC8qCgkgKiBYWFg6IFRoZSBsaW5rZXIgZG9l cyBub3QgZGVmaW5lIGhvdyBvdXRwdXQgc2VjdGlvbnMgYXJlCgkgKiBhc3NpZ25lZCB0byBp bnB1dCBzZWN0aW9ucyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzdGF0ZW1lbnRzCgkgKiBt YXRjaGluZyB0aGUgc2FtZSBpbnB1dCBzZWN0aW9uIG5hbWUuICBUaGVyZSBpcyBubyBkb2N1 bWVudGVkCgkgKiBvcmRlciBvZiBtYXRjaGluZy4KCSAqLwogL0RJU0NBUkQvIDogewogCiAK ICAqKC5leGl0Y2FsbC5leGl0KQogICooLmRpc2NhcmQpCiAgKiguZGlzY2FyZC4qKQogfQog LiA9ICgweGZmZmZmZmZmZmZmZmZmZmYgPDwgKCgzOSkgLSAxKSkgKyAweDAwMDgwMDAwOwog LmhlYWQudGV4dCA6IHsKICBfdGV4dCA9IC47CiAgKiguaGVhZC50ZXh0KQogfQogLiA9IEFM SUdOKDE8PDEyKTsKIC50ZXh0IDogeyAvKiBSZWFsIHRleHQgc2VnbWVudAkJKi8KICBfc3Rl eHQgPSAuOyAvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YQkqLwogICBfX2V4Y2VwdGlvbl90 ZXh0X3N0YXJ0ID0gLjsKICAgKiguZXhjZXB0aW9uLnRleHQpCiAgIF9fZXhjZXB0aW9uX3Rl eHRfZW5kID0gLjsKICAgLiA9IEFMSUdOKDgpOyBfX2lycWVudHJ5X3RleHRfc3RhcnQgPSAu OyAqKC5pcnFlbnRyeS50ZXh0KSBfX2lycWVudHJ5X3RleHRfZW5kID0gLjsKICAgLiA9IEFM SUdOKDgpOyAqKC50ZXh0LmhvdCAudGV4dCAudGV4dC5maXh1cCAudGV4dC51bmxpa2VseSkg KigucmVmLnRleHQpCiAgIC4gPSBBTElHTig4KTsgX19zY2hlZF90ZXh0X3N0YXJ0ID0gLjsg Kiguc2NoZWQudGV4dCkgX19zY2hlZF90ZXh0X2VuZCA9IC47CiAgIC4gPSBBTElHTig4KTsg X19sb2NrX3RleHRfc3RhcnQgPSAuOyAqKC5zcGlubG9jay50ZXh0KSBfX2xvY2tfdGV4dF9l bmQgPSAuOwogICAuID0gQUxJR04oMHgwMDAwMTAwMCk7IF9faHlwX2lkbWFwX3RleHRfc3Rh cnQgPSAuOyAqKC5oeXAuaWRtYXAudGV4dCkgX19oeXBfaWRtYXBfdGV4dF9lbmQgPSAuOyBf X2h5cF90ZXh0X3N0YXJ0ID0gLjsgKiguaHlwLnRleHQpIF9faHlwX3RleHRfZW5kID0gLjsK ICAgLiA9IEFMSUdOKDB4MDAwMDEwMDApOyBfX2lkbWFwX3RleHRfc3RhcnQgPSAuOyAqKC5p ZG1hcC50ZXh0KSBfX2lkbWFwX3RleHRfZW5kID0gLjsKICAgKiguZml4dXApCiAgICooLmdu dS53YXJuaW5nKQogIC4gPSBBTElHTigxNik7CiAgKiguZ290KSAvKiBHbG9iYWwgb2Zmc2V0 IHRhYmxlCQkqLwogfQogLiA9IEFMSUdOKDE8PDEyKTsKIC4gPSBBTElHTigoKDEgPDwgMTIp KSk7IC5yb2RhdGEgOiBBVChBRERSKC5yb2RhdGEpIC0gMCkgeyBfX3N0YXJ0X3JvZGF0YSA9 IC47ICooLnJvZGF0YSkgKigucm9kYXRhLiopICooX192ZXJtYWdpYykgLiA9IEFMSUdOKDgp OyBfX3N0YXJ0X19fdHJhY2Vwb2ludHNfcHRycyA9IC47ICooX190cmFjZXBvaW50c19wdHJz KSBfX3N0b3BfX190cmFjZXBvaW50c19wdHJzID0gLjsgKihfX3RyYWNlcG9pbnRzX3N0cmlu Z3MpIH0gLnJvZGF0YTEgOiBBVChBRERSKC5yb2RhdGExKSAtIDApIHsgKigucm9kYXRhMSkg fSAuID0gQUxJR04oOCk7IF9fYnVnX3RhYmxlIDogQVQoQUREUihfX2J1Z190YWJsZSkgLSAw KSB7IF9fc3RhcnRfX19idWdfdGFibGUgPSAuOyAqKF9fYnVnX3RhYmxlKSBfX3N0b3BfX19i dWdfdGFibGUgPSAuOyB9IC5wY2lfZml4dXAgOiBBVChBRERSKC5wY2lfZml4dXApIC0gMCkg eyBfX3N0YXJ0X3BjaV9maXh1cHNfZWFybHkgPSAuOyAqKC5wY2lfZml4dXBfZWFybHkpIF9f ZW5kX3BjaV9maXh1cHNfZWFybHkgPSAuOyBfX3N0YXJ0X3BjaV9maXh1cHNfaGVhZGVyID0g LjsgKigucGNpX2ZpeHVwX2hlYWRlcikgX19lbmRfcGNpX2ZpeHVwc19oZWFkZXIgPSAuOyBf X3N0YXJ0X3BjaV9maXh1cHNfZmluYWwgPSAuOyAqKC5wY2lfZml4dXBfZmluYWwpIF9fZW5k X3BjaV9maXh1cHNfZmluYWwgPSAuOyBfX3N0YXJ0X3BjaV9maXh1cHNfZW5hYmxlID0gLjsg KigucGNpX2ZpeHVwX2VuYWJsZSkgX19lbmRfcGNpX2ZpeHVwc19lbmFibGUgPSAuOyBfX3N0 YXJ0X3BjaV9maXh1cHNfcmVzdW1lID0gLjsgKigucGNpX2ZpeHVwX3Jlc3VtZSkgX19lbmRf cGNpX2ZpeHVwc19yZXN1bWUgPSAuOyBfX3N0YXJ0X3BjaV9maXh1cHNfcmVzdW1lX2Vhcmx5 ID0gLjsgKigucGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSkgX19lbmRfcGNpX2ZpeHVwc19yZXN1 bWVfZWFybHkgPSAuOyBfX3N0YXJ0X3BjaV9maXh1cHNfc3VzcGVuZCA9IC47ICooLnBjaV9m aXh1cF9zdXNwZW5kKSBfX2VuZF9wY2lfZml4dXBzX3N1c3BlbmQgPSAuOyBfX3N0YXJ0X3Bj aV9maXh1cHNfc3VzcGVuZF9sYXRlID0gLjsgKigucGNpX2ZpeHVwX3N1c3BlbmRfbGF0ZSkg X19lbmRfcGNpX2ZpeHVwc19zdXNwZW5kX2xhdGUgPSAuOyB9IC5idWlsdGluX2Z3IDogQVQo QUREUiguYnVpbHRpbl9mdykgLSAwKSB7IF9fc3RhcnRfYnVpbHRpbl9mdyA9IC47ICooLmJ1 aWx0aW5fZncpIF9fZW5kX2J1aWx0aW5fZncgPSAuOyB9IF9fa3N5bXRhYiA6IEFUKEFERFIo X19rc3ltdGFiKSAtIDApIHsgX19zdGFydF9fX2tzeW10YWIgPSAuOyAqKFNPUlQoX19fa3N5 bXRhYisqKSkgX19zdG9wX19fa3N5bXRhYiA9IC47IH0gX19rc3ltdGFiX2dwbCA6IEFUKEFE RFIoX19rc3ltdGFiX2dwbCkgLSAwKSB7IF9fc3RhcnRfX19rc3ltdGFiX2dwbCA9IC47ICoo U09SVChfX19rc3ltdGFiX2dwbCsqKSkgX19zdG9wX19fa3N5bXRhYl9ncGwgPSAuOyB9IF9f a3N5bXRhYl91bnVzZWQgOiBBVChBRERSKF9fa3N5bXRhYl91bnVzZWQpIC0gMCkgeyBfX3N0 YXJ0X19fa3N5bXRhYl91bnVzZWQgPSAuOyAqKFNPUlQoX19fa3N5bXRhYl91bnVzZWQrKikp IF9fc3RvcF9fX2tzeW10YWJfdW51c2VkID0gLjsgfSBfX2tzeW10YWJfdW51c2VkX2dwbCA6 IEFUKEFERFIoX19rc3ltdGFiX3VudXNlZF9ncGwpIC0gMCkgeyBfX3N0YXJ0X19fa3N5bXRh Yl91bnVzZWRfZ3BsID0gLjsgKihTT1JUKF9fX2tzeW10YWJfdW51c2VkX2dwbCsqKSkgX19z dG9wX19fa3N5bXRhYl91bnVzZWRfZ3BsID0gLjsgfSBfX2tzeW10YWJfZ3BsX2Z1dHVyZSA6 IEFUKEFERFIoX19rc3ltdGFiX2dwbF9mdXR1cmUpIC0gMCkgeyBfX3N0YXJ0X19fa3N5bXRh Yl9ncGxfZnV0dXJlID0gLjsgKihTT1JUKF9fX2tzeW10YWJfZ3BsX2Z1dHVyZSsqKSkgX19z dG9wX19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsgfSBfX2tjcmN0YWIgOiBBVChBRERSKF9f a2NyY3RhYikgLSAwKSB7IF9fc3RhcnRfX19rY3JjdGFiID0gLjsgKihTT1JUKF9fX2tjcmN0 YWIrKikpIF9fc3RvcF9fX2tjcmN0YWIgPSAuOyB9IF9fa2NyY3RhYl9ncGwgOiBBVChBRERS KF9fa2NyY3RhYl9ncGwpIC0gMCkgeyBfX3N0YXJ0X19fa2NyY3RhYl9ncGwgPSAuOyAqKFNP UlQoX19fa2NyY3RhYl9ncGwrKikpIF9fc3RvcF9fX2tjcmN0YWJfZ3BsID0gLjsgfSBfX2tj cmN0YWJfdW51c2VkIDogQVQoQUREUihfX2tjcmN0YWJfdW51c2VkKSAtIDApIHsgX19zdGFy dF9fX2tjcmN0YWJfdW51c2VkID0gLjsgKihTT1JUKF9fX2tjcmN0YWJfdW51c2VkKyopKSBf X3N0b3BfX19rY3JjdGFiX3VudXNlZCA9IC47IH0gX19rY3JjdGFiX3VudXNlZF9ncGwgOiBB VChBRERSKF9fa2NyY3RhYl91bnVzZWRfZ3BsKSAtIDApIHsgX19zdGFydF9fX2tjcmN0YWJf dW51c2VkX2dwbCA9IC47ICooU09SVChfX19rY3JjdGFiX3VudXNlZF9ncGwrKikpIF9fc3Rv cF9fX2tjcmN0YWJfdW51c2VkX2dwbCA9IC47IH0gX19rY3JjdGFiX2dwbF9mdXR1cmUgOiBB VChBRERSKF9fa2NyY3RhYl9ncGxfZnV0dXJlKSAtIDApIHsgX19zdGFydF9fX2tjcmN0YWJf Z3BsX2Z1dHVyZSA9IC47ICooU09SVChfX19rY3JjdGFiX2dwbF9mdXR1cmUrKikpIF9fc3Rv cF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSA9IC47IH0gX19rc3ltdGFiX3N0cmluZ3MgOiBBVChB RERSKF9fa3N5bXRhYl9zdHJpbmdzKSAtIDApIHsgKihfX2tzeW10YWJfc3RyaW5ncykgfSBf X2luaXRfcm9kYXRhIDogQVQoQUREUihfX2luaXRfcm9kYXRhKSAtIDApIHsgKigucmVmLnJv ZGF0YSkgfSBfX3BhcmFtIDogQVQoQUREUihfX3BhcmFtKSAtIDApIHsgX19zdGFydF9fX3Bh cmFtID0gLjsgKihfX3BhcmFtKSBfX3N0b3BfX19wYXJhbSA9IC47IH0gX19tb2R2ZXIgOiBB VChBRERSKF9fbW9kdmVyKSAtIDApIHsgX19zdGFydF9fX21vZHZlciA9IC47ICooX19tb2R2 ZXIpIF9fc3RvcF9fX21vZHZlciA9IC47IC4gPSBBTElHTigoKDEgPDwgMTIpKSk7IF9fZW5k X3JvZGF0YSA9IC47IH0gLiA9IEFMSUdOKCgoMSA8PCAxMikpKTsKIC4gPSBBTElHTig4KTsg X19leF90YWJsZSA6IEFUKEFERFIoX19leF90YWJsZSkgLSAwKSB7IF9fc3RhcnRfX19leF90 YWJsZSA9IC47ICooX19leF90YWJsZSkgX19zdG9wX19fZXhfdGFibGUgPSAuOyB9CiAubm90 ZXMgOiBBVChBRERSKC5ub3RlcykgLSAwKSB7IF9fc3RhcnRfbm90ZXMgPSAuOyAqKC5ub3Rl LiopIF9fc3RvcF9ub3RlcyA9IC47IH0KIC4gPSBBTElHTigxPDwxMik7CiBfZXRleHQgPSAu OyAvKiBFbmQgb2YgdGV4dCBhbmQgcm9kYXRhIHNlY3Rpb24gKi8KIC4gPSBBTElHTigxPDwx Mik7CiBfX2luaXRfYmVnaW4gPSAuOwogLiA9IEFMSUdOKDgpOyAuaW5pdC50ZXh0IDogQVQo QUREUiguaW5pdC50ZXh0KSAtIDApIHsgX3Npbml0dGV4dCA9IC47ICooLmluaXQudGV4dCkg KigubWVtaW5pdC50ZXh0KSBfZWluaXR0ZXh0ID0gLjsgfQogLmV4aXQudGV4dCA6IHsKICAq KC5leGl0LnRleHQpICooLm1lbWV4aXQudGV4dCkKIH0KIC4gPSBBTElHTigxPDwxMik7CiAu aW5pdC5kYXRhIDogewogICooLmluaXQuZGF0YSkgKigubWVtaW5pdC5kYXRhKSAuID0gQUxJ R04oOCk7IF9fc3RhcnRfbWNvdW50X2xvYyA9IC47ICooX19tY291bnRfbG9jKSBfX3N0b3Bf bWNvdW50X2xvYyA9IC47ICooLmluaXQucm9kYXRhKSAuID0gQUxJR04oOCk7IF9fc3RhcnRf ZnRyYWNlX2V2ZW50cyA9IC47ICooX2Z0cmFjZV9ldmVudHMpIF9fc3RvcF9mdHJhY2VfZXZl bnRzID0gLjsgX19zdGFydF9mdHJhY2VfZW51bV9tYXBzID0gLjsgKihfZnRyYWNlX2VudW1f bWFwKSBfX3N0b3BfZnRyYWNlX2VudW1fbWFwcyA9IC47IC4gPSBBTElHTig4KTsgX19zdGFy dF9zeXNjYWxsc19tZXRhZGF0YSA9IC47ICooX19zeXNjYWxsc19tZXRhZGF0YSkgX19zdG9w X3N5c2NhbGxzX21ldGFkYXRhID0gLjsgKigubWVtaW5pdC5yb2RhdGEpIC4gPSBBTElHTig4 KTsgX19jbGtfb2ZfdGFibGUgPSAuOyAqKF9fY2xrX29mX3RhYmxlKSAqKF9fY2xrX29mX3Rh YmxlX2VuZCkgLiA9IEFMSUdOKDgpOyBfX3Jlc2VydmVkbWVtX29mX3RhYmxlID0gLjsgKihf X3Jlc2VydmVkbWVtX29mX3RhYmxlKSAqKF9fcmVzZXJ2ZWRtZW1fb2ZfdGFibGVfZW5kKSAu ID0gQUxJR04oOCk7IF9fY2xrc3JjX29mX3RhYmxlID0gLjsgKihfX2Nsa3NyY19vZl90YWJs ZSkgKihfX2Nsa3NyY19vZl90YWJsZV9lbmQpIC4gPSBBTElHTig4KTsgX19jcHVfbWV0aG9k X29mX3RhYmxlID0gLjsgKihfX2NwdV9tZXRob2Rfb2ZfdGFibGUpICooX19jcHVfbWV0aG9k X29mX3RhYmxlX2VuZCkgLiA9IEFMSUdOKDgpOyBfX2NwdWlkbGVfbWV0aG9kX29mX3RhYmxl ID0gLjsgKihfX2NwdWlkbGVfbWV0aG9kX29mX3RhYmxlKSAqKF9fY3B1aWRsZV9tZXRob2Rf b2ZfdGFibGVfZW5kKSAuID0gQUxJR04oMzIpOyBfX2R0Yl9zdGFydCA9IC47ICooLmR0Yi5p bml0LnJvZGF0YSkgX19kdGJfZW5kID0gLjsgLiA9IEFMSUdOKDgpOyBfX2lycWNoaXBfb2Zf dGFibGUgPSAuOyAqKF9faXJxY2hpcF9vZl90YWJsZSkgKihfX2lycWNoaXBfb2ZfdGFibGVf ZW5kKSAuID0gQUxJR04oOCk7IF9faXJxY2hpcF9hY3BpX3Byb2JlX3RhYmxlID0gLjsgKihf X2lycWNoaXBfYWNwaV9wcm9iZV90YWJsZSkgX19pcnFjaGlwX2FjcGlfcHJvYmVfdGFibGVf ZW5kID0gLjsgLiA9IEFMSUdOKDgpOyBfX2Nsa3NyY19hY3BpX3Byb2JlX3RhYmxlID0gLjsg KihfX2Nsa3NyY19hY3BpX3Byb2JlX3RhYmxlKSBfX2Nsa3NyY19hY3BpX3Byb2JlX3RhYmxl X2VuZCA9IC47IC4gPSBBTElHTigzMik7IF9fZWFybHljb25fdGFibGUgPSAuOyAqKF9fZWFy bHljb25fdGFibGUpICooX19lYXJseWNvbl90YWJsZV9lbmQpIC4gPSBBTElHTig4KTsgX19l YXJseWNvbl9vZl90YWJsZSA9IC47ICooX19lYXJseWNvbl9vZl90YWJsZSkgKihfX2Vhcmx5 Y29uX29mX3RhYmxlX2VuZCkKICAuID0gQUxJR04oMTYpOyBfX3NldHVwX3N0YXJ0ID0gLjsg KiguaW5pdC5zZXR1cCkgX19zZXR1cF9lbmQgPSAuOwogIF9faW5pdGNhbGxfc3RhcnQgPSAu OyAqKC5pbml0Y2FsbGVhcmx5LmluaXQpIF9faW5pdGNhbGwwX3N0YXJ0ID0gLjsgKiguaW5p dGNhbGwwLmluaXQpICooLmluaXRjYWxsMHMuaW5pdCkgX19pbml0Y2FsbDFfc3RhcnQgPSAu OyAqKC5pbml0Y2FsbDEuaW5pdCkgKiguaW5pdGNhbGwxcy5pbml0KSBfX2luaXRjYWxsMl9z dGFydCA9IC47ICooLmluaXRjYWxsMi5pbml0KSAqKC5pbml0Y2FsbDJzLmluaXQpIF9faW5p dGNhbGwzX3N0YXJ0ID0gLjsgKiguaW5pdGNhbGwzLmluaXQpICooLmluaXRjYWxsM3MuaW5p dCkgX19pbml0Y2FsbDRfc3RhcnQgPSAuOyAqKC5pbml0Y2FsbDQuaW5pdCkgKiguaW5pdGNh bGw0cy5pbml0KSBfX2luaXRjYWxsNV9zdGFydCA9IC47ICooLmluaXRjYWxsNS5pbml0KSAq KC5pbml0Y2FsbDVzLmluaXQpIF9faW5pdGNhbGxyb290ZnNfc3RhcnQgPSAuOyAqKC5pbml0 Y2FsbHJvb3Rmcy5pbml0KSAqKC5pbml0Y2FsbHJvb3Rmc3MuaW5pdCkgX19pbml0Y2FsbDZf c3RhcnQgPSAuOyAqKC5pbml0Y2FsbDYuaW5pdCkgKiguaW5pdGNhbGw2cy5pbml0KSBfX2lu aXRjYWxsN19zdGFydCA9IC47ICooLmluaXRjYWxsNy5pbml0KSAqKC5pbml0Y2FsbDdzLmlu aXQpIF9faW5pdGNhbGxfZW5kID0gLjsKICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47ICoo LmNvbl9pbml0Y2FsbC5pbml0KSBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwogIF9fc2VjdXJp dHlfaW5pdGNhbGxfc3RhcnQgPSAuOyAqKC5zZWN1cml0eV9pbml0Y2FsbC5pbml0KSBfX3Nl Y3VyaXR5X2luaXRjYWxsX2VuZCA9IC47CiAgLiA9IEFMSUdOKDQpOyBfX2luaXRyYW1mc19z dGFydCA9IC47ICooLmluaXQucmFtZnMpIC4gPSBBTElHTig4KTsgKiguaW5pdC5yYW1mcy5p bmZvKQogfQogLmV4aXQuZGF0YSA6IHsKICAqKC5leGl0LmRhdGEpICooLm1lbWV4aXQuZGF0 YSkgKigubWVtZXhpdC5yb2RhdGEpCiB9CiAuID0gQUxJR04oKDEgPDwgMTIpKTsgLmRhdGEu LnBlcmNwdSA6IEFUKEFERFIoLmRhdGEuLnBlcmNwdSkgLSAwKSB7IF9fcGVyX2NwdV9sb2Fk ID0gLjsgX19wZXJfY3B1X3N0YXJ0ID0gLjsgKiguZGF0YS4ucGVyY3B1Li5maXJzdCkgLiA9 IEFMSUdOKCgxIDw8IDEyKSk7ICooLmRhdGEuLnBlcmNwdS4ucGFnZV9hbGlnbmVkKSAuID0g QUxJR04oKDEgPDwgNykpOyAqKC5kYXRhLi5wZXJjcHUuLnJlYWRfbW9zdGx5KSAuID0gQUxJ R04oKDEgPDwgNykpOyAqKC5kYXRhLi5wZXJjcHUpICooLmRhdGEuLnBlcmNwdS4uc2hhcmVk X2FsaWduZWQpIF9fcGVyX2NwdV9lbmQgPSAuOyB9CiAuID0gQUxJR04oKDEgPDwgMTIpKTsK IF9faW5pdF9lbmQgPSAuOwogLiA9IEFMSUdOKDQpOwogLmFsdGluc3RydWN0aW9ucyA6IHsK ICBfX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwogICooLmFsdGluc3RydWN0aW9ucykKICBfX2Fs dF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKIH0KIC5hbHRpbnN0cl9yZXBsYWNlbWVudCA6IHsK ICAqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkKIH0KIC4gPSBBTElHTigoMSA8PCAxMikpOwog X2RhdGEgPSAuOwogX3NkYXRhID0gLjsKIC4gPSBBTElHTigoMSA8PCAxMikpOyAuZGF0YSA6 IEFUKEFERFIoLmRhdGEpIC0gMCkgeyAuID0gQUxJR04oMTYzODQpOyAqKC5kYXRhLi5pbml0 X3Rhc2spIC4gPSBBTElHTigoMSA8PCAxMikpOyBfX25vc2F2ZV9iZWdpbiA9IC47ICooLmRh dGEuLm5vc2F2ZSkgLiA9IEFMSUdOKCgxIDw8IDEyKSk7IF9fbm9zYXZlX2VuZCA9IC47IC4g PSBBTElHTigoMSA8PCAxMikpOyAqKC5kYXRhLi5wYWdlX2FsaWduZWQpIC4gPSBBTElHTigo MSA8PCA3KSk7ICooLmRhdGEuLmNhY2hlbGluZV9hbGlnbmVkKSAuID0gQUxJR04oKDEgPDwg NykpOyAqKC5kYXRhLi5yZWFkX21vc3RseSkgLiA9IEFMSUdOKCgxIDw8IDcpKTsgKiguZGF0 YSkgKigucmVmLmRhdGEpICooLmRhdGEuLnNoYXJlZF9hbGlnbmVkKSAqKC5kYXRhLnVubGlr ZWx5KSAuID0gQUxJR04oMzIpOyAqKF9fdHJhY2Vwb2ludHMpIC4gPSBBTElHTig4KTsgX19z dGFydF9fX2p1bXBfdGFibGUgPSAuOyAqKF9fanVtcF90YWJsZSkgX19zdG9wX19fanVtcF90 YWJsZSA9IC47IC4gPSBBTElHTig4KTsgX19zdGFydF9fX3ZlcmJvc2UgPSAuOyAqKF9fdmVy Ym9zZSkgX19zdG9wX19fdmVyYm9zZSA9IC47IF9fc3RhcnRfX190cmFjZV9icHJpbnRrX2Zt dCA9IC47ICooX190cmFjZV9wcmludGtfZm10KSBfX3N0b3BfX190cmFjZV9icHJpbnRrX2Zt dCA9IC47IF9fc3RhcnRfX190cmFjZXBvaW50X3N0ciA9IC47ICooX190cmFjZXBvaW50X3N0 cikgX19zdG9wX19fdHJhY2Vwb2ludF9zdHIgPSAuOyBDT05TVFJVQ1RPUlMgfQogLnBlY29m Zl9lZGF0YV9wYWRkaW5nIDogeyBCWVRFKDApOyAuID0gQUxJR04oUEVDT0ZGX0ZJTEVfQUxJ R05NRU5UKTsgfQogX2VkYXRhID0gLjsKIC4gPSBBTElHTigwKTsgX19ic3Nfc3RhcnQgPSAu OyAuID0gQUxJR04oMCk7IC5zYnNzIDogQVQoQUREUiguc2JzcykgLSAwKSB7ICooLnNic3Mp ICooLnNjb21tb24pIH0gLiA9IEFMSUdOKDApOyAuYnNzIDogQVQoQUREUiguYnNzKSAtIDAp IHsgKiguYnNzLi5wYWdlX2FsaWduZWQpICooLmR5bmJzcykgKiguYnNzKSAqKENPTU1PTikg fSAuID0gQUxJR04oMCk7IF9fYnNzX3N0b3AgPSAuOwogLiA9IEFMSUdOKCgxIDw8IDEyKSk7 CiBpZG1hcF9wZ19kaXIgPSAuOwogLiArPSAoKCgoKCg0OCkpIC0gNCkgLyAoMTIgLSAzKSkg LSAxKSAqICgxIDw8IDEyKSk7CiBzd2FwcGVyX3BnX2RpciA9IC47CiAuICs9ICgoMyAtIDEp ICogKDEgPDwgMTIpKTsKIF9lbmQgPSAuOwogLnN0YWIgMCA6IHsgKiguc3RhYikgfSAuc3Rh YnN0ciAwIDogeyAqKC5zdGFic3RyKSB9IC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNs KSB9IC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9IC5zdGFiLmluZGV4 IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0gLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5p bmRleHN0cikgfSAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CiBfa2VybmVsX3NpemVf bGUgPSAoKF9lbmQgLSBfdGV4dCkgJiAweGZmZmZmZmZmZmZmZmZmZmYpOyBfa2VybmVsX29m ZnNldF9sZSA9ICgoMHgwMDA4MDAwMCkgJiAweGZmZmZmZmZmZmZmZmZmZmYpOyBfa2VybmVs X2ZsYWdzX2xlID0gKCgoKDAgPDwgMCkgfCAoKCgxMiAtIDEwKSAvIDIpIDw8IDEpKSkgJiAw eGZmZmZmZmZmZmZmZmZmZmYpOwp9Ci8qCiAqIFRoZSBIWVAgaW5pdCBjb2RlIGFuZCBJRCBt YXAgdGV4dCBjYW4ndCBiZSBsb25nZXIgdGhhbiBhIHBhZ2UgZWFjaCwKICogYW5kIHNob3Vs ZCBub3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LgogKi8KQVNTRVJUKF9faHlwX2lkbWFwX3Rl eHRfZW5kIC0gKF9faHlwX2lkbWFwX3RleHRfc3RhcnQgJiB+KDB4MDAwMDEwMDAgLSAxKSkg PD0gMHgwMDAwMTAwMCwKICJIWVAgaW5pdCBjb2RlIHRvbyBiaWcgb3IgbWlzYWxpZ25lZCIp CkFTU0VSVChfX2lkbWFwX3RleHRfZW5kIC0gKF9faWRtYXBfdGV4dF9zdGFydCAmIH4oMHgw MDAwMTAwMCAtIDEpKSA8PSAweDAwMDAxMDAwLAogIklEIG1hcCB0ZXh0IHRvbyBiaWcgb3Ig bWlzYWxpZ25lZCIpCi8qCiAqIElmIHBhZGRpbmcgaXMgYXBwbGllZCBiZWZvcmUgLmhlYWQu dGV4dCwgdmlydDwtPnBoeXMgY29udmVyc2lvbnMgd2lsbCBmYWlsLgogKi8KQVNTRVJUKF90 ZXh0ID09ICgoMHhmZmZmZmZmZmZmZmZmZmZmIDw8ICgoMzkpIC0gMSkpICsgMHgwMDA4MDAw MCksICJIRUFEIGlzIG1pc2FsaWduZWQiKQo= --------------BB334B2F2611F33E4697FAFB--