JCEKJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TLgokIQokISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiQhIHRvIGV4ZWN1dGUgaXQuCiQhCiQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKJCEgUmV3cml0dGVuIGJ5IFRyaXN0YW4gR2luZ29sZCAoZ2luZ29sZEBhZGFjb3JlLmNvbSkKJCEKJCBhcmNoPUYkR0VUU1lJKCJBUkNIX05BTUUiKQokIGFyY2g9RiRFRElUKGFyY2gsIkxPV0VSQ0FTRSIpCiRpZiBhcmNoIC5lcXMuICJhbHBoYSIgdGhlbiB0YXJnZXQgPSAiYWxwaGEiCiRpZiBhcmNoIC5lcXMuICJpYTY0IiB0aGVuIHRhcmdldCA9ICJpYTY0IgokIQokaWYgKGFyY2ggLmVxcy4gImFscGhhIikgLm9yLiAoYXJjaCAuZXFzLiAiaWE2NCIpCiR0aGVuCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgQkZEIGZvciAnJ3RhcmdldCcgdGFyZ2V0IgokIQokIQokISBjb3B5IGJmZC1pbjIuaCB0byBiZmQuaCwgcmVwbGFjaW5nIEAgbWFjcm9zCiQhCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQogICAgICAgIFtdYmZkLWluMi5oIC9vdXRwdXQ9W11iZmQuaAokREVDSwohCiEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQohCiEKICAgc2V0IChzdWNjZXNzLG9mZik7CiAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKICAgRUxTRTsKICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKICAgRU5ESUY7CgogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKCiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfZGVmYXVsdF90YXJnZXRfc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCc2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcwJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9MT05HX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR19MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzEnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwogICAgICBTUExJVF9MSU5FOwogICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RQVFJfVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF9maWxlX3B0ckAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdiZmRfc2lnbmVkX3ZtYScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCd1bnNpZ25lZCBAYmZkX2ZpbGVfcHRyQCB1ZmlsZV9wdHInLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdiZmRfdm1hIHVmaWxlX3B0cicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAc3VwcG9ydHNfcGx1Z2luc0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcwJyk7CiAgIEVORElGOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokCiRlbHNlCiQKJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgVmF4IHRhcmdldCIKJCB0YXJnZXQgPSAidmF4IgokIQokISBjb3B5IGJmZC1pbjIuaCB0byBiZmQuaCwgcmVwbGFjaW5nIEAgbWFjcm9zCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGBiZmQuaCcgZnJvbSBgYmZkLWluMi5oJy4iCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQogICAgICAgIFtdYmZkLWluMi5oIC9vdXRwdXQ9W11iZmQuaAokREVDSwohCiEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQohCiEKICAgc2V0IChzdWNjZXNzLG9mZik7CiAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKICAgRUxTRTsKICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKICAgRU5ESUY7CgogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKCiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzMyJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwogICAgICBTUExJVF9MSU5FOwogICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwogICBFTkRJRjsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJGVuZGlmCiQKJCEKJCEgY3JlYXRlIGJmZHZlci5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYGJmZHZlci5oJyBmcm9tICd2ZXJzaW9uLmgnIGFuZCBgY29uZmlndXJlLmluJy4iCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQogICAgICAgIFtddmVyc2lvbi5oIC9vdXRwdXQ9W11iZmR2ZXIuaAokREVDSwohCiEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQohCiEKICAgc2V0IChzdWNjZXNzLG9mZik7CiAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgImNvbmZpZ3VyZS5pbiIpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKICAgRUxTRTsKICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKICAgRU5ESUY7CiAgIHZlcnNudW0gOj0gdmVycyAtICIuIiAtICIuIjsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3ZlcnNpb25AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzbnVtKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF92ZXJzaW9uX3N0cmluZ0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciJyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzKTsKICAgICAgQ09QWV9URVhUKCciJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfdmVyc2lvbl9wYWNrYWdlQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJyIoR05VIEJpbnV0aWxzKSAiJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0ByZXBvcnRfYnVnc190b0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciPGh0dHA6Ly93d3cuc291cmNld2FyZS5vcmcvYnVnemlsbGEvPiInKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiQhCiQhCiQhIGNyZWF0ZSBiZmRfc3RkaW50LmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgYmZkX3N0ZGludC5oJyIKJCBjcmVhdGUgW11iZmRfc3RkaW50LmgKI2luY2x1ZGUgPGludHR5cGVzLmg+CiQhCiQhCiQhIGNyZWF0ZSB0YXJnbWF0Y2guaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGB0YXJnbWF0Y2guaCciCiQgb3Blbi93cml0ZSB0ZmlsZSBbXXRhcmdtYXRjaC5oCiQgd3JpdGUgdGZpbGUgInsgIiIiICsgdGFyZ2V0ICsgIi0qLSp2bXMqIiIiICsgIiwiCiQgd3JpdGUgdGZpbGUgIiNpZiBkZWZpbmVkIChTRUxFQ1RfVkVDUykiCiQgd3JpdGUgdGZpbGUgIlNFTEVDVF9WRUNTIgokIHdyaXRlIHRmaWxlICIjZWxzZSIKJCB3cml0ZSB0ZmlsZSAiVU5TVVBQT1JURURfVEFSR0VUIgokIHdyaXRlIHRmaWxlICIjZW5kaWYiCiQgd3JpdGUgdGZpbGUgIn0sIgokIGNsb3NlIHRmaWxlCiQhCiQhCiQhIGNyZWF0ZSBjb25maWcuaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGBjb25maWcuaCciCiQgY3JlYXRlIFtdY29uZmlnLmgKLyogY29uZmlnLmgtdm1zLiAgR2VuZXJhdGVkIGJ5IGhhbmQgYnkgS2xhdXMgS+RtcGYsIGtrYWVtcGZAZGlkeW11cy5ybWkuZGUuICAqLwovKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLyogV2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwovKiAjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgKi8KLyogV2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRSAqLwovKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi8qICNkZWZpbmUgSEFWRV9NTUFQIDEgKi8KLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi8qICN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOICovCi8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAgKi8KLyogI3VuZGVmIFRSQURfSEVBREVSICovCi8qIERlZmluZSBvbmx5IGlmIDxzeXMvcHJvY2ZzLmg+IGlzIGF2YWlsYWJsZSAqYW5kKiBpdCBkZWZpbmVzIHByc3RhdHVzX3QuICAqLwovKiAjdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0ggKi8KLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gdXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICAqLwovKiAjdW5kZWYgVVNFX01NQVAgKi8KLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9GQ05UTCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfTUFEVklTRSAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfTVBST1RFQ1QgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9USU1FX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfVU5JU1REX0ggMQovKiBEaXNhYmxlIE5MUyAgKi8KI3VuZGVmIEVOQUJMRV9OTFMKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJDb3B5IHN5c2RlcC5oIgokIGNvcHkgWy5ob3N0c11hbHBoYXZtcy5oIHN5c2RlcC5oCiQKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBidWlsZC5jb20iCiQhCiQgaWYgQVJDSC5lcXMuImFscGhhIgokIHRoZW4KJCAgIGNyZWF0ZSBidWlsZC5jb20KJERFQ0sKJCBERUZTPSIiIlNFTEVDVF9WRUNTPSZ2bXNfYWxwaGFfdmVjIiIsIistCiAgIiIiU0VMRUNUX0FSQ0hJVEVDVFVSRVM9JmJmZF9hbHBoYV9hcmNoIiIiCiQgRklMRVM9ImNwdS1hbHBoYSx2bXMsdm1zLWhkcix2bXMtZ3NkLHZtcy10aXIsdm1zLW1pc2MsIgokRU9ECiQgZW5kaWYKJCBpZiBBUkNILmVxcy4iaWE2NCIKJCB0aGVuCiQgICBjcmVhdGUgYnVpbGQuY29tCiRERUNLCiQgREVGUz0iIiJTRUxFQ1RfVkVDUz0mYmZkX2VsZjY0X2lhNjRfdm1zX3ZlYyIiLCIrLQogICIiIlNFTEVDVF9BUkNISVRFQ1RVUkVTPSZiZmRfaWE2NF9hcmNoIiIiCiQgRklMRVM9ImNwdS1pYTY0LGVsZjY0LWlhNjQsZWxmLXN0cnRhYixjb3JlZmlsZSxzdGFicyxtZXJnZSxlbGYtZWgtZnJhbWUsIistCiAgImVsZmxpbmssZWxmLWF0dHJzLGR3YXJmMSxlbGY2NCwiCiRFT0QKJCBjcmVhdGUgc3Vic3R4eC50cHUKJERFQ0sKICAgc2V0IChzdWNjZXNzLG9mZik7CiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgZm91bmRfcmFuZ2UgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgQkVHSU5OSU5HX09GKGZpbGUpKTsKCiAgIExPT1AKICAgICByYW5nIDo9IENSRUFURV9SQU5HRSAoRU5EX09GKGZvdW5kX3JhbmdlKSxFTkRfT0YoZmlsZSkpOwogICAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnTk4nLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgICAgRVhJVElGIG1hdGNoX3BvcyA9IDA7CiAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgQ09QWV9URVhUKCc2NCcpOwogICBFTkRMT09QOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGVsZjY0LWlhNjQuYyBmcm9tIGVsZnh4LWlhNjQuYyIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN1YnN0eHgudHB1IC0KICAgICAgICBbXWVsZlhYLWlhNjQuYyAvb3V0cHV0PVtdZWxmNjQtaWE2NC5jCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgZWxmNjQtdGFyZ2V0LmggZnJvbSBlbGZ4eC10YXJnZXQuaCIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN1YnN0eHgudHB1IC0KICAgICAgICBbXWVsZlhYLXRhcmdldC5oIC9vdXRwdXQ9W11lbGY2NC10YXJnZXQuaAokIGRlbCBzdWJzdHh4LnRwdTsqCiQgZW5kaWYKJCBhcHBlbmQgc3lzJGlucHV0IGJ1aWxkLmNvbQokREVDSwokIERFRlM9REVGUyArICIsIiJ1bmxpbms9cmVtb3ZlIiIsIiJERUJVR0RJUj0iIiIiR05VJERFQlVHRElSOiIiIiIiIiIKJCBPUFQ9Ii9ub29wdC9kZWJ1ZyIKJCBDRkxBR1M9Ii9uYW1lPShhc19pcyxzaG9ydGVuZWQpIiArIC0KICAiL2luY2x1ZGU9KFtdLCIiLi4vIiIsIiIuLi9pbmNsdWRlIiIpIiArIC0KICAiL2RlZmluZT0oIiArIERFRlMgKyAiKSIgKyBPUFQKJCBGSUxFUz1GSUxFUyArICJhcmNoaXZlLGFyY2hpdmU2NCxhcmNodXJlcyxiZmQsYmZkaW8sYmluYXJ5LGNhY2hlLGNvZmZnZW4sIistCiAgImNvbXByZXNzLGNvcmVmaWxlLGR3YXJmMixlbGYsZm9ybWF0LGhhc2gsaWhleCxpbml0LGxpYmJmZCxsaW5rZXIsIistCiAgIm9wbmNscyxyZWxvYyxzZWN0aW9uLHNpbXBsZSxzcmVjLHN0YWItc3ltcyxzeW1zLHRhcmdldHMsdGVraGV4LHZlcmlsb2ciCiQgd3JpdGUgc3lzJG91dHB1dCAiQ0ZMQUdTPSIsQ0ZMQUdTCiQgY2ZsYWdzX2xpYmJmZD0iL3dhcm5pbmc9KGRpc2FibGU9bWlzc2luZ3JldHVybikiCiQgY2ZsYWdzX25pbD0iIgokIE5VTSA9IDAKJCBPQkpTPSIiCiQgTE9PUDoKJCAgIEYgPSBGJEVMRU1FTlQoTlVNLCIsIixGSUxFUykKJCAgIElGIEYuRVFTLiIsIiBUSEVOIEdPVE8gRU5ECiQgICBlZmxhZ3NfbmFtZT0iY2ZsYWdzXycnZiciCiQgICBuYW1lX2xlbj1mJGxlbmd0aChlZmxhZ3NfbmFtZSkKJCAgIGRhc2hfcG9zPWYkbG9jYXRlKCItIixlZmxhZ3NfbmFtZSkKJCAgIGlmIGRhc2hfcG9zLm5lLm5hbWVfbGVuCiQgICB0aGVuCiQgICAgIGVmbGFnc19uYW1lWydkYXNoX3BvcywxXTo9Il8iCiQgICAgIGRhc2hfcG9zPWYkbG9jYXRlKCItIixlZmxhZ3NfbmFtZSkKJCAgICAgaWYgZGFzaF9wb3MubmUubmFtZV9sZW4gdGhlbiBlZmxhZ3NfbmFtZVsnZGFzaF9wb3MsMV06PSJfIgokICAgZW5kaWYKJCAgIGlmIGYkdHlwZSgnZWZsYWdzX25hbWUpLmVxcy4iIiB0aGVuIGVmbGFnc19uYW1lPSJjZmxhZ3NfbmlsIgokICAgZWZsYWdzPSdlZmxhZ3NfbmFtZQokICAgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nICIsIEYsICIuYyIsIGVmbGFncwokICAgY2MgJ0NGTEFHUyAnZWZsYWdzICdGLmMKJCAgIElGIE9CSlMuTkVTLiIiIFRIRU4gT0JKUz1PQkpTICsgIiwiCiQgICBPQkpTPU9CSlMgKyBGICsgIi5vYmoiCiQgICBOVU0gPSBOVU0gKyAxCiQgICBHT1RPIExPT1AKJCBFTkQ6CiQgcHVyZ2UKJCBsaWIvY3JlYXRlIGxpYmJmZCAnT0JKUwokRU9ECg==