LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBUWFRCREFULkgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMDIvMTgvOTcgICAgYWxpdSAgICAgICAgQ29udmVydGVkIGZyb20gT3BlbkNsYXNzLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFkZSBzdGF0aWMgZGF0YSBtZW1iZXJzIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlLgoqICAgMDMvMjUvOTcgICAgYWxpdSAgICAgICAgUmVtb3ZlZCBzdWJjbGFzc2VzLCBhbmQgbWVyZ2VkIHRoZWlyIHN0YXRpYyBkYXRhIGludG8gdGhpcwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICBJbnN0YW50aWF0ZWQgZm91ciBzdGF0aWMgaW5zdGFuY2VzIGZvciBjaGFyYWN0ZXIsCiogICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLCBzZW50ZW5jZSwgYW5kIGxpbmUuICBNYWRlIGZvcndhcmQoKSwgYmFja3dhcmQoKSwgYW5kCiogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKSBtZXRob2RzIGlubGluZS4KKiAgIDA0LzE1Lzk3ICAgIGFsaXUgICAgICAgIFdvcmtlZCBhcm91bmQgYnVnIGluIEFJWCB4bEMgY29tcGlsZXIgd2hpY2ggb2NjdXJzIGlmIHN0YXRpYwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzIGNvbnRhaW4gY29uc3QgZWxlbWVudHMuCiogICAwNS8wNi85NyAgICBhbGl1ICAgICAgICBNYWRlIGtTSSwga1N0b3AsIGFuZCBrU0lfU3RvcCBpbnRvICNkZWZpbmVzIHRvIGhlbHAgb3V0CiogICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcGxpYW50IGNvbXBpbGVycy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgVFhUQkRBVF9ICiNkZWZpbmUgVFhUQkRBVF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKY2xhc3MgV29yZEJyZWFrVGFibGU7CmNsYXNzIFVuaWNvZGVDbGFzc01hcHBpbmc7CmNsYXNzIFNwZWNpYWxNYXBwaW5nOwoKLyoqCiAqIFRoaXMgY2xhc3Mgd3JhcHMgdXAgdGhlIGRhdGEgdGFibGVzIG5lZWRlZCBmb3IgU2ltcGxlVGV4dEJvdW5kYXJ5LgogKiBJdCBpcyBzdGF0aWNhbGx5IGluc3RhbnRpYXRlZCBmb3IgZWFjaCB0eXBlIG9mIHRleHQgYm91bmRhcnkuICBUaGlzCiAqIGNsYXNzIGlzIG5vdCBkZXNpZ25lZCB0byBiZSBzdWJjbGFzc2VkLgogKi8KY2xhc3MgVGV4dEJvdW5kYXJ5RGF0YSB7CnB1YmxpYzoKICAgIH5UZXh0Qm91bmRhcnlEYXRhKCkge30gLy8gRG8gbm90IHN1YmNsYXNzCgogICAgLy8gRmFzdCBpbmxpbmUgYWNjZXNzb3JzCiAgICBjb25zdCBXb3JkQnJlYWtUYWJsZSogZm9yd2FyZCh2b2lkKSBjb25zdDsKICAgIGNvbnN0IFdvcmRCcmVha1RhYmxlKiBiYWNrd2FyZCh2b2lkKSBjb25zdDsKICAgIGNvbnN0IFVuaWNvZGVDbGFzc01hcHBpbmcqIG1hcCh2b2lkKSBjb25zdDsKCiAgICBzdGF0aWMgY29uc3QgVGV4dEJvdW5kYXJ5RGF0YSBrQ2hhcmFjdGVyQnJlYWtEYXRhOwogICAgc3RhdGljIGNvbnN0IFRleHRCb3VuZGFyeURhdGEga1dvcmRCcmVha0RhdGE7CiAgICBzdGF0aWMgY29uc3QgVGV4dEJvdW5kYXJ5RGF0YSBrTGluZUJyZWFrRGF0YTsKICAgIHN0YXRpYyBjb25zdCBUZXh0Qm91bmRhcnlEYXRhIGtTZW50ZW5jZUJyZWFrRGF0YTsKCiAgICB0eXBlZGVmIHVpbnQ4X3QgTm9kZTsKICAgIHR5cGVkZWYgdWludDhfdCBUeXBlOwoKcHJpdmF0ZToKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9FTkRfT0ZfVEVYVDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9IT1JJWk9OVEFMX1RBQlVMQVRJT047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfTElORUZFRUQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfVkVSVElDQUxfVEFCVUxBVElPTjsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9GT1JNX0ZFRUQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQ0FSUklBR0VfUkVUVVJOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX1NQQUNFOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX0VYQ0xBTUFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfUVVPVEFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfTlVNQkVSX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfRE9MTEFSX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfUEVSQ0VOVDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9BTVBFUlNBTkQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQVBPU1RST1BIRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9DT01NQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9GVUxMX1NUT1A7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQ09MT047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfU0VNSUNPTE9OOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX1FVRVNUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfTk9OQlJFQUtJTkdfU1BBQ0U7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQ0VOVF9TSUdOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX1BPVU5EX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfWUVOX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgTEFUSU4xX1NPRlRIWVBIRU47CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgTEFUSU4xX0RFR1JFRV9TSUdOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFSQUJJQ19QRVJDRU5UX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVJBQklDX0RFQ0lNQUxfU0VQQVJBVE9SOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhBTkdVTF9DSE9TRU9OR19MT1c7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEFOR1VMX0NIT1NFT05HX0hJR0g7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEFOR1VMX0pVTkdTRU9OR19MT1c7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEFOR1VMX0pVTkdTRU9OR19ISUdIOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhBTkdVTF9KT05HU0VPTkdfTE9XOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhBTkdVTF9KT05HU0VPTkdfSElHSDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBGSUdVUkVfU1BBQ0U7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgTk9OQlJFQUtJTkdfSFlQSEVOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBVTkNUVUFUSU9OX0hZUEhFTkFUSU9OX1BPSU5UOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBVTkNUVUFUSU9OX0xJTkVfU0VQQVJBVE9SOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBVTkNUVUFUSU9OX1BBUkFHUkFQSF9TRVBBUkFUT1I7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUEVSX01JTExFX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUEVSX1RFTl9USE9VU0FORF9TSUdOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBSSU1FOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIERPVUJMRV9QUklNRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBUUklQTEVfUFJJTUU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgREVHUkVFX0NFTFNJVVM7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgREVHUkVFX0ZBSFJFTkhFSVQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUFVOQ1RVQVRJT05fSURFT0dSQVBISUNfQ09NTUE7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUFVOQ1RVQVRJT05fSURFT0dSQVBISUNfRlVMTF9TVE9QOyAKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBJREVPR1JBUEhJQ19JVEVSQVRJT05fTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfSTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfSTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfREk7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1NNQUxMX1RVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9UVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfTU87CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1NNQUxMX1lBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9ZQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfWVU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1lVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9TTUFMTF9ZTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfWU87CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1JPOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9TTUFMTF9XQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfV0E7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1ZVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIENPTUJJTklOR19LQVRBS0FOQV9ISVJBR0FOQV9WT0lDRURfU09VTkRfTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9TRU1JVk9JQ0VEX1NPVU5EX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfSVRFUkFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfVk9JQ0VEX0lURVJBVElPTl9NQVJLOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9BOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9BOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9JOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9JOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9VOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9VOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9FOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9FOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9POwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9POwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9ESTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfU01BTExfVFU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1RVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9NTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfU01BTExfWUE7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1lBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9ZVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfWVU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1NNQUxMX1lPOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9ZTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfUk87CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1NNQUxMX1dBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9XQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfVlU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1NNQUxMX0tBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9LRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfVkE7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1ZPOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0hJUkFHQU5BX1BST0xPTkdFRF9TT1VORF9NQVJLOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0lURVJBVElPTl9NQVJLOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX1ZPSUNFRF9JVEVSQVRJT05fTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBVTklDT0RFX0xPV19CT1VORF9IQU47CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgVU5JQ09ERV9ISUdIX0JPVU5EX0hBTjsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBIQU5HVUxfU1lMX0xPVzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBIQU5HVUxfU1lMX0hJR0g7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQ0pLX0NPTVBBVElCSUxJVFlfRjkwMDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBDSktfQ09NUEFUSUJJTElUWV9GQTJEOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFVOSUNPREVfWkVST19XSURUSF9OT05fQlJFQUtJTkdfU1BBQ0U7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgRlVMTFdJRFRIX0VYQ0xBTUFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgRlVMTFdJRFRIX0ZVTExfU1RPUDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBGVUxMV0lEVEhfUVVFU1RJT05fTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBFTkRfT0ZfU1RSSU5HOwoKcHJpdmF0ZToKICAgIC8vIENoYXJhY3RlciBkYXRhCiAgICBlbnVtIENoYXJhY3Rlck1hcHBpbmcKICAgIHsKICAgICAgICAvLyBUaGVzZSBlbnVtIHZhbHVlcyBtdXN0IG9jY3VyIGluIHRoaXMgb3JkZXI7IGRvIG5vdAogICAgICAgIC8vIG1vZGlmeSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISAgVGhlIGZvcndhcmQKICAgICAgICAvLyBhbmQgYmFja3dhcmQgZGF0YSB0YWJsZXMgYXJlIGluZGV4ZWQgYnkgdGhlc2UgZW51bXMuCiAgICAgICAga0FjY2VudF9kaWFjcml0aWMgICA9IDAsCiAgICAgICAga0Jhc2VGb3JtICAgICAgICAgICA9IDEsCiAgICAgICAga0Jhc2VDUiAgICAgICAgICAgICA9IDIsCiAgICAgICAga0Jhc2VMRiAgICAgICAgICAgICA9IDMsCiAgICAgICAga0Nob3Nlb25nICAgICAgICAgICA9IDQsICAgLy8gS29yZWFuIGluaXRpYWwgY29uc29uYW50CiAgICAgICAga0p1bmdzZW9uZyAgICAgICAgICA9IDUsICAvLyBLb3JlYW4gdm93ZWwKICAgICAgICBrSm9uZ3Nlb25nICAgICAgICAgID0gNiwgIC8vIEtvcmVhbiBmaW5hbCBjb25zb25hbnQKICAgICAgICBrRU9TICAgICAgICAgICAgICAgID0gNywKICAgICAgICBrQ2hhcmFjdGVyQ29sX2NvdW50ID0gOAogICAgfTsKCiAgICBzdGF0aWMgTm9kZSAgICAgICAgICAgICAgICAgICAgIGtDaGFyYWN0ZXJGb3J3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrQ2hhcmFjdGVyRm9yd2FyZERhdGFfbGVuZ3RoOwogICAgc3RhdGljIFdvcmRCcmVha1RhYmxlKiAgICAgICAgICBrQ2hhcmFjdGVyRm9yd2FyZDsKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga0NoYXJhY3RlckJhY2t3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrQ2hhcmFjdGVyQmFja3dhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga0NoYXJhY3RlckJhY2t3YXJkOwogICAgc3RhdGljIFR5cGUgICAgICAgICAgICAgICAgICAgICBrQ2hhcmFjdGVyUmF3TWFwcGluZ1tdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrQ2hhcmFjdGVyUmF3TWFwcGluZ19sZW5ndGg7CiAgICBzdGF0aWMgU3BlY2lhbE1hcHBpbmcgICAgICAgICAgIGtDaGFyYWN0ZXJFeGNlcHRpb25DaGFyW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtDaGFyYWN0ZXJFeGNlcHRpb25DaGFyX2xlbmd0aDsKICAgIHN0YXRpYyBjb25zdCBVQm9vbCAgICAgICAgICAgICBrQ2hhcmFjdGVyRXhjZXB0aW9uRmxhZ3NbXTsKICAgIHN0YXRpYyBVbmljb2RlQ2xhc3NNYXBwaW5nKiAgICAga0NoYXJhY3Rlck1hcDsKICAgIHN0YXRpYyBUeXBlICAgICAgICAgICAgICAgICAgICAga0NoYXJhY3RlckFzY2lpVmFsdWVzW107Cgpwcml2YXRlOgogICAgLy8gV29yZCBkYXRhCiAgICBlbnVtIFdvcmRNYXBwaW5nCiAgICB7CiAgICAgICAgLy8gVGhlc2UgZW51bSB2YWx1ZXMgbXVzdCBvY2N1ciBpbiB0aGlzIG9yZGVyOyBkbyBub3QKICAgICAgICAvLyBtb2RpZnkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgIFRoZSBmb3J3YXJkCiAgICAgICAgLy8gYW5kIGJhY2t3YXJkIGRhdGEgdGFibGVzIGFyZSBpbmRleGVkIGJ5IHRoZXNlIGVudW1zLgogICAgICAgIGtCcmVhayAgICAgICAgICA9IDAsCiAgICAgICAga0xldHRlciAgICAgICAgID0gMSwKICAgICAgICBrTnVtYmVyICAgICAgICAgPSAyLAogICAgICAgIGtNaWRMZXR0ZXIgICAgICA9IDMsCiAgICAgICAga01pZExldE51bSAgICAgID0gNCwKICAgICAgICBrUHJlTnVtICAgICAgICAgPSA1LAogICAgICAgIGtQb3N0TnVtICAgICAgICA9IDYsCiAgICAgICAga01pZE51bSAgICAgICAgID0gNywKICAgICAgICBrUHJlTWlkTnVtICAgICAgPSA4LAogICAgICAgIGtCbGFuayAgICAgICAgICA9IDksCiAgICAgICAga0xGICAgICAgICAgICAgID0gMTAsCiAgICAgICAga0thdGEgICAgICAgICAgID0gMTEsCiAgICAgICAga0hpcmEgICAgICAgICAgID0gMTIsCiAgICAgICAga0thbmppICAgICAgICAgID0gMTMsCiAgICAgICAga0RpYWNyaXQgICAgICAgID0gMTQsCiAgICAgICAga0NSICAgICAgICAgICAgID0gMTUsCiAgICAgICAga05zbSAgICAgICAgICAgID0gMTYsCiAgICAgICAga3dFT1MgICAgICAgICAgID0gMTcsCiAgICAgICAga1dvcmRDb2xfY291bnQgID0gMTgKICAgIH07CgogICAgc3RhdGljIE5vZGUgICAgICAgICAgICAgICAgICAgICBrV29yZEZvcndhcmREYXRhW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtXb3JkRm9yd2FyZERhdGFfbGVuZ3RoOwogICAgc3RhdGljIFdvcmRCcmVha1RhYmxlKiAgICAgICAgICBrV29yZEZvcndhcmQ7CiAgICBzdGF0aWMgTm9kZSAgICAgICAgICAgICAgICAgICAgIGtXb3JkQmFja3dhcmREYXRhW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtXb3JkQmFja3dhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga1dvcmRCYWNrd2FyZDsKICAgIHN0YXRpYyBUeXBlICAgICAgICAgICAgICAgICAgICAga1dvcmRSYXdNYXBwaW5nW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtXb3JkUmF3TWFwcGluZ19sZW5ndGg7CiAgICBzdGF0aWMgU3BlY2lhbE1hcHBpbmcgICAgICAgICAgIGtXb3JkRXhjZXB0aW9uQ2hhcltdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrV29yZEV4Y2VwdGlvbkNoYXJfbGVuZ3RoOwogICAgc3RhdGljIFVuaWNvZGVDbGFzc01hcHBpbmcqICAgICBrV29yZE1hcDsKICAgIHN0YXRpYyBUeXBlICAgICAgICAgICAgICAgICAgICAga1dvcmRBc2NpaVZhbHVlc1tdOwogICAgc3RhdGljIGNvbnN0IFVCb29sICAgICAgICAgICAgIGtXb3JkRXhjZXB0aW9uRmxhZ3NbXTsKCnByaXZhdGU6CiAgICAvLyBTZW50ZW5jZSBkYXRhCiAgICBlbnVtIFNlbnRlbmNlTWFwcGluZwogICAgewogICAgICAgIC8vIFRoZXNlIGVudW0gdmFsdWVzIG11c3Qgb2NjdXIgaW4gdGhpcyBvcmRlcjsgZG8gbm90CiAgICAgICAgLy8gbW9kaWZ5IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchICBUaGUgZm9yd2FyZAogICAgICAgIC8vIGFuZCBiYWNrd2FyZCBkYXRhIHRhYmxlcyBhcmUgaW5kZXhlZCBieSB0aGVzZSBlbnVtcy4KICAgICAgICBrT3RoZXIgICAgICAgICAgICAgID0gMCwKICAgICAgICBrU3BhY2UgICAgICAgICAgICAgID0gMSwKICAgICAgICBrVGVybWluYXRvciAgICAgICAgID0gMiwKICAgICAgICBrQW1iaWd1b3VzVGVybSAgICAgID0gMywKICAgICAgICBrT3BlbkJyYWNrZXQgICAgICAgID0gNCwKICAgICAgICBrQ2xvc2VCcmFja2V0ICAgICAgID0gNSwKICAgICAgICBrQ0pLICAgICAgICAgICAgICAgID0gNiwKICAgICAgICBrUGFyYWdyYXBoQnJlYWsgICAgID0gNywKICAgICAgICBrTG93ZXJDYXNlICAgICAgICAgID0gOCwKICAgICAgICBrVXBwZXJDYXNlICAgICAgICAgID0gOSwKICAgICAgICBrc051bWJlciAgICAgICAgICAgID0gMTAsCiAgICAgICAga1F1b3RlICAgICAgICAgICAgICA9IDExLAogICAgICAgIC8va3NDUiwKICAgICAgICBrc05zbSAgICAgICAgICAgICAgID0gMTIsCiAgICAgICAga3NFT1MgICAgICAgICAgICAgICA9IDEzLAogICAgICAgIGtTZW50ZW5jZUNvbF9jb3VudCAgPSAxNAogICAgfTsKCiAgICBzdGF0aWMgTm9kZSAgICAgICAgICAgICAgICAgICAgIGtTZW50ZW5jZUZvcndhcmREYXRhW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtTZW50ZW5jZUZvcndhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga1NlbnRlbmNlRm9yd2FyZDsKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga1NlbnRlbmNlQmFja3dhcmREYXRhW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtTZW50ZW5jZUJhY2t3YXJkRGF0YV9sZW5ndGg7CiAgICBzdGF0aWMgV29yZEJyZWFrVGFibGUqICAgICAgICAgIGtTZW50ZW5jZUJhY2t3YXJkOwogICAgc3RhdGljIFR5cGUgICAgICAgICAgICAgICAgICAgICBrU2VudGVuY2VSYXdNYXBwaW5nW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtTZW50ZW5jZVJhd01hcHBpbmdfbGVuZ3RoOwogICAgc3RhdGljIFNwZWNpYWxNYXBwaW5nICAgICAgICAgICBrU2VudGVuY2VFeGNlcHRpb25DaGFyW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtTZW50ZW5jZUV4Y2VwdGlvbkNoYXJfbGVuZ3RoOwogICAgc3RhdGljIFVuaWNvZGVDbGFzc01hcHBpbmcqICAgICBrU2VudGVuY2VNYXA7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtTZW50ZW5jZUFzY2lpVmFsdWVzW107CiAgICBzdGF0aWMgY29uc3QgVUJvb2wgICAgICAgICAgICAga1NlbnRlbmNlRXhjZXB0aW9uRmxhZ3NbXTsKCnByaXZhdGU6CiAgICAvLyBMaW5lIGRhdGEKICAgIGVudW0gTGluZU1hcHBpbmcKICAgIHsKICAgICAgICAvLyBUaGVzZSBlbnVtIHZhbHVlcyBtdXN0IG9jY3VyIGluIHRoaXMgb3JkZXI7IGRvIG5vdAogICAgICAgIC8vIG1vZGlmeSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISAgVGhlIGZvcndhcmQKICAgICAgICAvLyBhbmQgYmFja3dhcmQgZGF0YSB0YWJsZXMgYXJlIGluZGV4ZWQgYnkgdGhlc2UgZW51bXMuCiAgICAgICAga0xpbmVCcmVhaywKICAgICAgICAvL2Fsd2F5cyBicmVha3MgKG11c3QgYmUgcHJlc2VudCBhcyBmaXJzdCBpdGVtKQogICAgICAgIGtMaW5lQmxhbmssCiAgICAgICAgLy9zcGFjZXMsIHRhYnMsIG51bGxzLgogICAgICAgIGtMaW5lQ1IsCiAgICAgICAgLy9jYXJyaWFnZSByZXR1cm4KICAgICAgICBrTGluZU5vbkJsYW5rLAogICAgICAgIC8vZXZlcnl0aGluZyBub3QgaW5jbHVkZWQgZWxzZXdoZXJlCiAgICAgICAga0xpbmVPcCwKICAgICAgICAvL2h5cGhlbnMuLi4uCiAgICAgICAga0xpbmVKd3JkLAogICAgICAgIC8vaGlyYWdhbmEsIGthdGFrYW5hLCBhbmQga2FuamkKICAgICAgICBrTGluZVByZUp3cmQsCiAgICAgICAgLy9jaGFyYWN0ZXJzIHRoYXQgYmluZCB0byB0aGUgYmVnaW5uaW5nIG9mIGEgSmFwYW5lc2Ugd29yZAogICAgICAgIGtMaW5lUG9zdEp3cmQsCiAgICAgICAgLy9jaGFyYWN0ZXJzIHRoYXQgYmluZCB0byB0aGUgZW5kIG9mIGEgSmFwYW5lc2Ugd29yZAogICAgICAgIGtMaW5lRGlnaXQsCiAgICAgICAgLy9kaWdpdHMKICAgICAgICBrTGluZU51bVB1bmN0LAogICAgICAgIC8vcHVuY3R1YXRpb24gdGhhdCBjYW4gYXBwZWFyIHdpdGhpbiBhIG51bWJlcgogICAgICAgIGtMaW5lQ3VycmVuY3ksCiAgICAgICAgLy9jdXJyZW5jeSBzeW1ib2xzIHRoYXQgY2FuIHByZWNlZGUgYSBudW1iZXIKICAgICAgICBrTGluZU5zbSwKICAgICAgICAvLyBub24tc3BhY2luZyBtYXJrcwogICAgICAgIGtMaW5lTmJzcCwKICAgICAgICAvLyBub24tYnJlYWtpbmcgY2hhcmFjdGVycwogICAgICAgIGtMaW5lRU9TLAogICAgICAgIGtMaW5lQ29sX2NvdW50CiAgICB9OwoKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga0xpbmVGb3J3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrTGluZUZvcndhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga0xpbmVGb3J3YXJkOwogICAgc3RhdGljIE5vZGUgICAgICAgICAgICAgICAgICAgICBrTGluZUJhY2t3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrTGluZUJhY2t3YXJkRGF0YV9sZW5ndGg7CiAgICBzdGF0aWMgV29yZEJyZWFrVGFibGUqICAgICAgICAgIGtMaW5lQmFja3dhcmQ7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtMaW5lUmF3TWFwcGluZ1tdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrTGluZVJhd01hcHBpbmdfbGVuZ3RoOwogICAgc3RhdGljIFNwZWNpYWxNYXBwaW5nICAgICAgICAgICBrTGluZUV4Y2VwdGlvbkNoYXJbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga0xpbmVFeGNlcHRpb25DaGFyX2xlbmd0aDsKICAgIHN0YXRpYyBjb25zdCBVQm9vbCAgICAgICAgICAgICBrTGluZUV4Y2VwdGlvbkZsYWdzW107CiAgICBzdGF0aWMgVW5pY29kZUNsYXNzTWFwcGluZyogICAgIGtMaW5lTWFwOwogICAgc3RhdGljIFR5cGUgICAgICAgICAgICAgICAgICAgICBrTGluZUFzY2lpVmFsdWVzW107Cgpwcm90ZWN0ZWQ6CiAgICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgcHJvdmlkZWQgdG8gbWFrZQogICAgICogY29tcGlsZXIgaGFwcHkgb25seS4gRE8gTk9UIENBTEwuCiAgICAgKi8KICAgIFRleHRCb3VuZGFyeURhdGEoY29uc3QgVGV4dEJvdW5kYXJ5RGF0YSYpIHt9CiAgICBUZXh0Qm91bmRhcnlEYXRhJiBvcGVyYXRvcj0oY29uc3QgVGV4dEJvdW5kYXJ5RGF0YSYpIHsgcmV0dXJuICp0aGlzOyB9CiAgICBUZXh0Qm91bmRhcnlEYXRhKCkge30gLy8gRG8gbm90IHN1YmNsYXNzCiAgICBUZXh0Qm91bmRhcnlEYXRhKGNvbnN0IFdvcmRCcmVha1RhYmxlKiBmb3J3YXJkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkQnJlYWtUYWJsZSogYmFja3dhcmQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVDbGFzc01hcHBpbmcqIG1hcCkKICAgICAgICAgICAgICAgICAgICAgOiBmRm9yd2FyZChmb3J3YXJkKSwgZkJhY2t3YXJkKGJhY2t3YXJkKSwgZk1hcChtYXApIHt9CiAgICAgICAgCnByaXZhdGU6CiAgICBjb25zdCBXb3JkQnJlYWtUYWJsZSogICAgICAgZkZvcndhcmQ7CiAgICBjb25zdCBXb3JkQnJlYWtUYWJsZSogICAgICAgZkJhY2t3YXJkOwogICAgY29uc3QgVW5pY29kZUNsYXNzTWFwcGluZyogIGZNYXA7Cn07CgppbmxpbmUgY29uc3QgV29yZEJyZWFrVGFibGUqIFRleHRCb3VuZGFyeURhdGE6OmZvcndhcmQoKSBjb25zdAp7CiAgICByZXR1cm4gZkZvcndhcmQ7Cn0KCmlubGluZSBjb25zdCBXb3JkQnJlYWtUYWJsZSogVGV4dEJvdW5kYXJ5RGF0YTo6YmFja3dhcmQoKSBjb25zdAp7CiAgICByZXR1cm4gZkJhY2t3YXJkOwp9CgppbmxpbmUgY29uc3QgVW5pY29kZUNsYXNzTWFwcGluZyogVGV4dEJvdW5kYXJ5RGF0YTo6bWFwKCkgY29uc3QKewogICAgcmV0dXJuIGZNYXA7Cn0KCi8vIFRoZXNlIHVzZWQgdG8gYmUgc3RhdGljIGNvbnN0cyBpbiB0aGUgY2xhc3MsIGJ1dCBzb21lIGNvbXBpbGVycyBkaWRuJ3QgbGlrZSB0aGF0LgojZGVmaW5lIGtTdG9wICAgICAgICgwKQojZGVmaW5lIGtTSSAgICAgICAgICgweDgwKQojZGVmaW5lIGtTSV9TdG9wICAgIChrU0kra1N0b3ApCgojZGVmaW5lIGtTSV8xICAgICAgIChrU0krMSkKI2RlZmluZSBrU0lfMiAgICAgICAoa1NJKzIpCiNkZWZpbmUga1NJXzMgICAgICAgKGtTSSszKQojZGVmaW5lIGtTSV80ICAgICAgIChrU0krNCkKI2RlZmluZSBrU0lfNSAgICAgICAoa1NJKzUpCiNkZWZpbmUga1NJXzYgICAgICAgKGtTSSs2KQojZGVmaW5lIGtTSV83ICAgICAgIChrU0krNykKI2RlZmluZSBrU0lfOCAgICAgICAoa1NJKzgpCiNkZWZpbmUga1NJXzkgICAgICAgKGtTSSs5KQojZGVmaW5lIGtTSV8xMCAgICAgIChrU0krMTApCiNkZWZpbmUga1NJXzExICAgICAgKGtTSSsxMSkKI2RlZmluZSBrU0lfMTIgICAgICAoa1NJKzEyKQojZGVmaW5lIGtTSV8xMyAgICAgIChrU0krMTMpCiNkZWZpbmUga1NJXzE0ICAgICAgKGtTSSsxNCkKCiNlbmRpZiAvLyBfVFhUQkRBVAovL2VvZgo=