LyoKICogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogKi8KCiNpbmNsdWRlICJTa09UVGFibGVfbmFtZS5oIgoKI2luY2x1ZGUgIlNrRW5kaWFuLmgiCiNpbmNsdWRlICJTa1N0cmluZy5oIgojaW5jbHVkZSAiU2tUU2VhcmNoLmgiCiNpbmNsdWRlICJTa1RlbXBsYXRlcy5oIgojaW5jbHVkZSAiU2tVdGlscy5oIgoKc3RhdGljIFNrVW5pY2hhciBTa1VURjE2QkVfTmV4dFVuaWNoYXIoY29uc3QgdWludDE2X3QqKiBzcmNQdHIpIHsKICAgIFNrQVNTRVJUKHNyY1B0ciAmJiAqc3JjUHRyKTsKCiAgICBjb25zdCB1aW50MTZfdCogc3JjID0gKnNyY1B0cjsKICAgIFNrVW5pY2hhciBjID0gU2tFbmRpYW5fU3dhcEJFMTYoKnNyYysrKTsKCiAgICBTa0FTU0VSVCghU2tVVEYxNl9Jc0xvd1N1cnJvZ2F0ZShjKSk7CiAgICBpZiAoU2tVVEYxNl9Jc0hpZ2hTdXJyb2dhdGUoYykpIHsKICAgICAgICB1bnNpZ25lZCBjMiA9IFNrRW5kaWFuX1N3YXBCRTE2KCpzcmMrKyk7CiAgICAgICAgU2tBU1NFUlQoU2tVVEYxNl9Jc0xvd1N1cnJvZ2F0ZShjMikpOwoKICAgICAgICBjID0gKGMgPDwgMTApICsgYzIgKyAoMHgxMDAwMCAtICgweEQ4MDAgPDwgMTApIC0gMHhEQzAwKTsKICAgIH0KICAgICpzcmNQdHIgPSBzcmM7CiAgICByZXR1cm4gYzsKfQoKc3RhdGljIHZvaWQgU2tTdHJpbmdGcm9tVVRGMTZCRShjb25zdCB1aW50MTZfdCogdXRmMTZiZSwgc2l6ZV90IGxlbmd0aCwgU2tTdHJpbmcmIHV0ZjgpIHsKICAgIFNrQVNTRVJUKHV0ZjE2YmUgIT0gbnVsbHB0cik7CgogICAgdXRmOC5yZXNldCgpOwogICAgc2l6ZV90IG51bWJlck9mMTZCaXRWYWx1ZXMgPSBsZW5ndGggLyAyOwogICAgY29uc3QgdWludDE2X3QqIGVuZCA9IHV0ZjE2YmUgKyBudW1iZXJPZjE2Qml0VmFsdWVzOwogICAgd2hpbGUgKHV0ZjE2YmUgPCBlbmQpIHsKICAgICAgICB1dGY4LmFwcGVuZFVuaWNoYXIoU2tVVEYxNkJFX05leHRVbmljaGFyKCZ1dGYxNmJlKSk7CiAgICB9Cn0KCi8qKiBVbmljb2RlRnJvbU1hY1JvbWFuW21hY1JvbWFuUG9pbnQgLSAweDgwXSAtPiB1bmljb2RlQ29kZVBvaW50LgogKiAgRGVyaXZlZCBmcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvUk9NQU4uVFhUIC4KICogIEluIE1hY1JvbWFuIHRoZSBmaXJzdCAxMjggY29kZSBwb2ludHMgbWF0Y2ggQVNDSUkgY29kZSBwb2ludHMuCiAqICBUaGlzIG1hcHMgdGhlIHNlY29uZCAxMjggTWFjUm9tYW4gY29kZSBwb2ludHMgdG8gdW5pY29kZSBjb2RlIHBvaW50cy4KICovCnN0YXRpYyB1aW50MTZfdCBVbmljb2RlRnJvbU1hY1JvbWFuWzB4ODBdID0gewogICAgMHgwMEM0LCAweDAwQzUsIDB4MDBDNywgMHgwMEM5LCAweDAwRDEsIDB4MDBENiwgMHgwMERDLCAweDAwRTEsCiAgICAweDAwRTAsIDB4MDBFMiwgMHgwMEU0LCAweDAwRTMsIDB4MDBFNSwgMHgwMEU3LCAweDAwRTksIDB4MDBFOCwKICAgIDB4MDBFQSwgMHgwMEVCLCAweDAwRUQsIDB4MDBFQywgMHgwMEVFLCAweDAwRUYsIDB4MDBGMSwgMHgwMEYzLAogICAgMHgwMEYyLCAweDAwRjQsIDB4MDBGNiwgMHgwMEY1LCAweDAwRkEsIDB4MDBGOSwgMHgwMEZCLCAweDAwRkMsCiAgICAweDIwMjAsIDB4MDBCMCwgMHgwMEEyLCAweDAwQTMsIDB4MDBBNywgMHgyMDIyLCAweDAwQjYsIDB4MDBERiwKICAgIDB4MDBBRSwgMHgwMEE5LCAweDIxMjIsIDB4MDBCNCwgMHgwMEE4LCAweDIyNjAsIDB4MDBDNiwgMHgwMEQ4LAogICAgMHgyMjFFLCAweDAwQjEsIDB4MjI2NCwgMHgyMjY1LCAweDAwQTUsIDB4MDBCNSwgMHgyMjAyLCAweDIyMTEsCiAgICAweDIyMEYsIDB4MDNDMCwgMHgyMjJCLCAweDAwQUEsIDB4MDBCQSwgMHgwM0E5LCAweDAwRTYsIDB4MDBGOCwKICAgIDB4MDBCRiwgMHgwMEExLCAweDAwQUMsIDB4MjIxQSwgMHgwMTkyLCAweDIyNDgsIDB4MjIwNiwgMHgwMEFCLAogICAgMHgwMEJCLCAweDIwMjYsIDB4MDBBMCwgMHgwMEMwLCAweDAwQzMsIDB4MDBENSwgMHgwMTUyLCAweDAxNTMsCiAgICAweDIwMTMsIDB4MjAxNCwgMHgyMDFDLCAweDIwMUQsIDB4MjAxOCwgMHgyMDE5LCAweDAwRjcsIDB4MjVDQSwKICAgIDB4MDBGRiwgMHgwMTc4LCAweDIwNDQsIDB4MjBBQywgMHgyMDM5LCAweDIwM0EsIDB4RkIwMSwgMHhGQjAyLAogICAgMHgyMDIxLCAweDAwQjcsIDB4MjAxQSwgMHgyMDFFLCAweDIwMzAsIDB4MDBDMiwgMHgwMENBLCAweDAwQzEsCiAgICAweDAwQ0IsIDB4MDBDOCwgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwgMHgwMENDLCAweDAwRDMsIDB4MDBENCwKICAgIDB4RjhGRiwgMHgwMEQyLCAweDAwREEsIDB4MDBEQiwgMHgwMEQ5LCAweDAxMzEsIDB4MDJDNiwgMHgwMkRDLAogICAgMHgwMEFGLCAweDAyRDgsIDB4MDJEOSwgMHgwMkRBLCAweDAwQjgsIDB4MDJERCwgMHgwMkRCLCAweDAyQzcsCn07CgpzdGF0aWMgdm9pZCBTa1N0cmluZ0Zyb21NYWNSb21hbihjb25zdCB1aW50OF90KiBtYWNSb21hbiwgc2l6ZV90IGxlbmd0aCwgU2tTdHJpbmcmIHV0ZjgpIHsKICAgIHV0ZjgucmVzZXQoKTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICB1dGY4LmFwcGVuZFVuaWNoYXIobWFjUm9tYW5baV0gPCAweDgwID8gbWFjUm9tYW5baV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVW5pY29kZUZyb21NYWNSb21hblttYWNSb21hbltpXSAtIDB4ODBdKTsKICAgIH0KfQoKc3RhdGljIHN0cnVjdCBCQ1A0N0Zyb21MYW5ndWFnZUlkIHsKICAgIHVpbnQxNl90IGxhbmd1YWdlSUQ7CiAgICBjb25zdCBjaGFyKiBiY3A0NzsKfQovKiogVGhlIE1hYyBhbmQgV2luZG93cyB2YWx1ZXMgZG8gbm90IGNvbmZsaWN0LCBzbyB0aGlzIGlzIGN1cnJlbnRseSBvbmUgc2luZ2xlIHRhYmxlLiAqLwpCQ1A0N0Zyb21MYW5ndWFnZUlEW10gPSB7CiAgICAvKiogQSBtYXBwaW5nIGZyb20gTWFjIExhbmd1YWdlIERlc2lnbmF0b3JzIHRvIEJDUCA0NyBjb2Rlcy4KICAgICAqICBUaGUgZm9sbG93aW5nIGxpc3Qgd2FzIGNvbnN0cnVjdGVkIG1vcmUgb3IgbGVzcyBtYW51YWxseS4KICAgICAqICBBcHBsZSBub3cgdXNlcyBCQ1AgNDcgKHBvc3QgT1NYMTAuNCksIHNvIHRoZXJlIHdpbGwgYmUgbm8gbmV3IGVudHJpZXMuCiAgICAgKi8KICAgIHswLCAiZW4ifSwgLy9FbmdsaXNoCiAgICB7MSwgImZyIn0sIC8vRnJlbmNoCiAgICB7MiwgImRlIn0sIC8vR2VybWFuCiAgICB7MywgIml0In0sIC8vSXRhbGlhbgogICAgezQsICJubCJ9LCAvL0R1dGNoCiAgICB7NSwgInN2In0sIC8vU3dlZGlzaAogICAgezYsICJlcyJ9LCAvL1NwYW5pc2gKICAgIHs3LCAiZGEifSwgLy9EYW5pc2gKICAgIHs4LCAicHQifSwgLy9Qb3J0dWd1ZXNlCiAgICB7OSwgIm5iIn0sIC8vTm9yd2VnaWFuCiAgICB7MTAsICJoZSJ9LCAvL0hlYnJldwogICAgezExLCAiamEifSwgLy9KYXBhbmVzZQogICAgezEyLCAiYXIifSwgLy9BcmFiaWMKICAgIHsxMywgImZpIn0sIC8vRmlubmlzaAogICAgezE0LCAiZWwifSwgLy9HcmVlawogICAgezE1LCAiaXMifSwgLy9JY2VsYW5kaWMKICAgIHsxNiwgIm10In0sIC8vTWFsdGVzZQogICAgezE3LCAidHIifSwgLy9UdXJraXNoCiAgICB7MTgsICJociJ9LCAvL0Nyb2F0aWFuCiAgICB7MTksICJ6aC1IYW50In0sIC8vQ2hpbmVzZSAoVHJhZGl0aW9uYWwpCiAgICB7MjAsICJ1ciJ9LCAvL1VyZHUKICAgIHsyMSwgImhpIn0sIC8vSGluZGkKICAgIHsyMiwgInRoIn0sIC8vVGhhaQogICAgezIzLCAia28ifSwgLy9Lb3JlYW4KICAgIHsyNCwgImx0In0sIC8vTGl0aHVhbmlhbgogICAgezI1LCAicGwifSwgLy9Qb2xpc2gKICAgIHsyNiwgImh1In0sIC8vSHVuZ2FyaWFuCiAgICB7MjcsICJldCJ9LCAvL0VzdG9uaWFuCiAgICB7MjgsICJsdiJ9LCAvL0xhdHZpYW4KICAgIHsyOSwgInNlIn0sIC8vU2FtaQogICAgezMwLCAiZm8ifSwgLy9GYXJvZXNlCiAgICB7MzEsICJmYSJ9LCAvL0ZhcnNpIChQZXJzaWFuKQogICAgezMyLCAicnUifSwgLy9SdXNzaWFuCiAgICB7MzMsICJ6aC1IYW5zIn0sIC8vQ2hpbmVzZSAoU2ltcGxpZmllZCkKICAgIHszNCwgIm5sIn0sIC8vRHV0Y2gKICAgIHszNSwgImdhIn0sIC8vSXJpc2goR2FlbGljKQogICAgezM2LCAic3EifSwgLy9BbGJhbmlhbgogICAgezM3LCAicm8ifSwgLy9Sb21hbmlhbgogICAgezM4LCAiY3MifSwgLy9DemVjaAogICAgezM5LCAic2sifSwgLy9TbG92YWsKICAgIHs0MCwgInNsIn0sIC8vU2xvdmVuaWFuCiAgICB7NDEsICJ5aSJ9LCAvL1lpZGRpc2gKICAgIHs0MiwgInNyIn0sIC8vU2VyYmlhbgogICAgezQzLCAibWsifSwgLy9NYWNlZG9uaWFuCiAgICB7NDQsICJiZyJ9LCAvL0J1bGdhcmlhbgogICAgezQ1LCAidWsifSwgLy9Va3JhaW5pYW4KICAgIHs0NiwgImJlIn0sIC8vQnllbG9ydXNzaWFuCiAgICB7NDcsICJ1eiJ9LCAvL1V6YmVrCiAgICB7NDgsICJrayJ9LCAvL0themFraAogICAgezQ5LCAiYXotQ3lybCJ9LCAvL0F6ZXJiYWlqYW5pIChDeXJpbGxpYykKICAgIHs1MCwgImF6LUFyYWIifSwgLy9BemVyYmFpamFuaSAoQXJhYmljKQogICAgezUxLCAiaHkifSwgLy9Bcm1lbmlhbgogICAgezUyLCAia2EifSwgLy9HZW9yZ2lhbgogICAgezUzLCAibW8ifSwgLy9Nb2xkYXZpYW4KICAgIHs1NCwgImt5In0sIC8vS2lyZ2hpegogICAgezU1LCAidGcifSwgLy9UYWppa2kKICAgIHs1NiwgInRrIn0sIC8vVHVya21lbgogICAgezU3LCAibW4tTW9uZyJ9LCAvL01vbmdvbGlhbiAoVHJhZGl0aW9uYWwpCiAgICB7NTgsICJtbi1DeXJsIn0sIC8vTW9uZ29saWFuIChDeXJpbGxpYykKICAgIHs1OSwgInBzIn0sIC8vUGFzaHRvCiAgICB7NjAsICJrdSJ9LCAvL0t1cmRpc2gKICAgIHs2MSwgImtzIn0sIC8vS2FzaG1pcmkKICAgIHs2MiwgInNkIn0sIC8vU2luZGhpCiAgICB7NjMsICJibyJ9LCAvL1RpYmV0YW4KICAgIHs2NCwgIm5lIn0sIC8vTmVwYWxpCiAgICB7NjUsICJzYSJ9LCAvL1NhbnNrcml0CiAgICB7NjYsICJtciJ9LCAvL01hcmF0aGkKICAgIHs2NywgImJuIn0sIC8vQmVuZ2FsaQogICAgezY4LCAiYXMifSwgLy9Bc3NhbWVzZQogICAgezY5LCAiZ3UifSwgLy9HdWphcmF0aQogICAgezcwLCAicGEifSwgLy9QdW5qYWJpCiAgICB7NzEsICJvciJ9LCAvL09yaXlhCiAgICB7NzIsICJtbCJ9LCAvL01hbGF5YWxhbQogICAgezczLCAia24ifSwgLy9LYW5uYWRhCiAgICB7NzQsICJ0YSJ9LCAvL1RhbWlsCiAgICB7NzUsICJ0ZSJ9LCAvL1RlbHVndQogICAgezc2LCAic2kifSwgLy9TaW5oYWxlc2UKICAgIHs3NywgIm15In0sIC8vQnVybWVzZQogICAgezc4LCAia20ifSwgLy9LaG1lcgogICAgezc5LCAibG8ifSwgLy9MYW8KICAgIHs4MCwgInZpIn0sIC8vVmlldG5hbWVzZQogICAgezgxLCAiaWQifSwgLy9JbmRvbmVzaWFuCiAgICB7ODIsICJ0bCJ9LCAvL1RhZ2Fsb2cKICAgIHs4MywgIm1zLUxhdG4ifSwgLy9NYWxheSAoUm9tYW4pCiAgICB7ODQsICJtcy1BcmFiIn0sIC8vTWFsYXkgKEFyYWJpYykKICAgIHs4NSwgImFtIn0sIC8vQW1oYXJpYwogICAgezg2LCAidGkifSwgLy9UaWdyaW55YQogICAgezg3LCAib20ifSwgLy9Pcm9tbwogICAgezg4LCAic28ifSwgLy9Tb21hbGkKICAgIHs4OSwgInN3In0sIC8vU3dhaGlsaQogICAgezkwLCAicncifSwgLy9LaW55YXJ3YW5kYS9SdWFuZGEKICAgIHs5MSwgInJuIn0sIC8vUnVuZGkKICAgIHs5MiwgIm55In0sIC8vTnlhbmphL0NoZXdhCiAgICB7OTMsICJtZyJ9LCAvL01hbGFnYXN5CiAgICB7OTQsICJlbyJ9LCAvL0VzcGVyYW50bwogICAgezEyOCwgImN5In0sIC8vV2Vsc2gKICAgIHsxMjksICJldSJ9LCAvL0Jhc3F1ZQogICAgezEzMCwgImNhIn0sIC8vQ2F0YWxhbgogICAgezEzMSwgImxhIn0sIC8vTGF0aW4KICAgIHsxMzIsICJxdSJ9LCAvL1F1ZWNodWEKICAgIHsxMzMsICJnbiJ9LCAvL0d1YXJhbmkKICAgIHsxMzQsICJheSJ9LCAvL0F5bWFyYQogICAgezEzNSwgInR0In0sIC8vVGF0YXIKICAgIHsxMzYsICJ1ZyJ9LCAvL1VpZ2h1cgogICAgezEzNywgImR6In0sIC8vRHpvbmdraGEKICAgIHsxMzgsICJqdi1MYXRuIn0sIC8vSmF2YW5lc2UgKFJvbWFuKQogICAgezEzOSwgInN1LUxhdG4ifSwgLy9TdW5kYW5lc2UgKFJvbWFuKQogICAgezE0MCwgImdsIn0sIC8vR2FsaWNpYW4KICAgIHsxNDEsICJhZiJ9LCAvL0FmcmlrYWFucwogICAgezE0MiwgImJyIn0sIC8vQnJldG9uCiAgICB7MTQzLCAiaXUifSwgLy9JbnVrdGl0dXQKICAgIHsxNDQsICJnZCJ9LCAvL1Njb3R0aXNoIChHYWVsaWMpCiAgICB7MTQ1LCAiZ3YifSwgLy9NYW54IChHYWVsaWMpCiAgICB7MTQ2LCAiZ2EifSwgLy9JcmlzaCAoR2FlbGljIHdpdGggTGVuaXRpb24pCiAgICB7MTQ3LCAidG8ifSwgLy9Ub25nYW4KICAgIHsxNDgsICJlbCJ9LCAvL0dyZWVrIChQb2x5dG9uaWMpIE5vdGU6IElTTyAxNTkyNCBkb2VzIG5vdCBoYXZlIGFuIGVxdWl2YWxlbnQgc2NyaXB0IG5hbWUuCiAgICB7MTQ5LCAia2wifSwgLy9HcmVlbmxhbmRpYwogICAgezE1MCwgImF6LUxhdG4ifSwgLy9BemVyYmFpamFuaSAoUm9tYW4pCiAgICB7MTUxLCAibm4ifSwgLy9OeW5vcnNrCgogICAgLyoqIEEgbWFwcGluZyBmcm9tIFdpbmRvd3MgTENJRCB0byBCQ1AgNDcgY29kZXMuCiAgICAgKiAgVGhpcyBsaXN0IGlzIHRoZSBzb3J0ZWQsIGN1cmF0ZWQgb3V0cHV0IG9mIHRvb2xzL3dpbl9sY2lkLmNwcC4KICAgICAqICBOb3RlIHRoYXQgdGhlc2UgYXJlIHNvcnRlZCBieSB2YWx1ZSBmb3IgcXVpY2sgYmluYXJ5IGxvb2t1cCwgYW5kIG5vdCBsb2dpY2FsbHkgYnkgbHNiLgogICAgICogIFRoZSAnYmFyZScgbGFuZ3VhZ2UgaWRzIChlLmcuIDB4MDAwMSBmb3IgQXJhYmljKSBhcmUgb21taXR0ZWQKICAgICAqICBhcyB0aGV5IGRvIG5vdCBhcHBlYXIgYXMgdmFsaWQgbGFuZ3VhZ2UgaWRzIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLgogICAgICovCiAgICB7IDB4MDQwMSwgImFyLVNBIiB9LCAvL0FyYWJpYwogICAgeyAweDA0MDIsICJiZy1CRyIgfSwgLy9CdWxnYXJpYW4KICAgIHsgMHgwNDAzLCAiY2EtRVMiIH0sIC8vQ2F0YWxhbgogICAgeyAweDA0MDQsICJ6aC1UVyIgfSwgLy9DaGluZXNlIChUcmFkaXRpb25hbCkKICAgIHsgMHgwNDA1LCAiY3MtQ1oiIH0sIC8vQ3plY2gKICAgIHsgMHgwNDA2LCAiZGEtREsiIH0sIC8vRGFuaXNoCiAgICB7IDB4MDQwNywgImRlLURFIiB9LCAvL0dlcm1hbgogICAgeyAweDA0MDgsICJlbC1HUiIgfSwgLy9HcmVlawogICAgeyAweDA0MDksICJlbi1VUyIgfSwgLy9FbmdsaXNoCiAgICB7IDB4MDQwYSwgImVzLUVTX3RyYWRubCIgfSwgLy9TcGFuaXNoCiAgICB7IDB4MDQwYiwgImZpLUZJIiB9LCAvL0Zpbm5pc2gKICAgIHsgMHgwNDBjLCAiZnItRlIiIH0sIC8vRnJlbmNoCiAgICB7IDB4MDQwZCwgImhlLUlMIiB9LCAvL0hlYnJldwogICAgeyAweDA0MGQsICJoZSIgfSwgLy9IZWJyZXcKICAgIHsgMHgwNDBlLCAiaHUtSFUiIH0sIC8vSHVuZ2FyaWFuCiAgICB7IDB4MDQwZSwgImh1IiB9LCAvL0h1bmdhcmlhbgogICAgeyAweDA0MGYsICJpcy1JUyIgfSwgLy9JY2VsYW5kaWMKICAgIHsgMHgwNDEwLCAiaXQtSVQiIH0sIC8vSXRhbGlhbgogICAgeyAweDA0MTEsICJqYS1KUCIgfSwgLy9KYXBhbmVzZQogICAgeyAweDA0MTIsICJrby1LUiIgfSwgLy9Lb3JlYW4KICAgIHsgMHgwNDEzLCAibmwtTkwiIH0sIC8vRHV0Y2gKICAgIHsgMHgwNDE0LCAibmItTk8iIH0sIC8vTm9yd2VnaWFuIChCb2tt5WwpCiAgICB7IDB4MDQxNSwgInBsLVBMIiB9LCAvL1BvbGlzaAogICAgeyAweDA0MTYsICJwdC1CUiIgfSwgLy9Qb3J0dWd1ZXNlCiAgICB7IDB4MDQxNywgInJtLUNIIiB9LCAvL1JvbWFuc2gKICAgIHsgMHgwNDE4LCAicm8tUk8iIH0sIC8vUm9tYW5pYW4KICAgIHsgMHgwNDE5LCAicnUtUlUiIH0sIC8vUnVzc2lhbgogICAgeyAweDA0MWEsICJoci1IUiIgfSwgLy9Dcm9hdGlhbgogICAgeyAweDA0MWIsICJzay1TSyIgfSwgLy9TbG92YWsKICAgIHsgMHgwNDFjLCAic3EtQUwiIH0sIC8vQWxiYW5pYW4KICAgIHsgMHgwNDFkLCAic3YtU0UiIH0sIC8vU3dlZGlzaAogICAgeyAweDA0MWUsICJ0aC1USCIgfSwgLy9UaGFpCiAgICB7IDB4MDQxZiwgInRyLVRSIiB9LCAvL1R1cmtpc2gKICAgIHsgMHgwNDIwLCAidXItUEsiIH0sIC8vVXJkdQogICAgeyAweDA0MjEsICJpZC1JRCIgfSwgLy9JbmRvbmVzaWFuCiAgICB7IDB4MDQyMiwgInVrLVVBIiB9LCAvL1VrcmFpbmlhbgogICAgeyAweDA0MjMsICJiZS1CWSIgfSwgLy9CZWxhcnVzaWFuCiAgICB7IDB4MDQyNCwgInNsLVNJIiB9LCAvL1Nsb3ZlbmlhbgogICAgeyAweDA0MjUsICJldC1FRSIgfSwgLy9Fc3RvbmlhbgogICAgeyAweDA0MjYsICJsdi1MViIgfSwgLy9MYXR2aWFuCiAgICB7IDB4MDQyNywgImx0LUxUIiB9LCAvL0xpdGh1YW5pYW4KICAgIHsgMHgwNDI4LCAidGctQ3lybC1USiIgfSwgLy9UYWppayAoQ3lyaWxsaWMpCiAgICB7IDB4MDQyOSwgImZhLUlSIiB9LCAvL1BlcnNpYW4KICAgIHsgMHgwNDJhLCAidmktVk4iIH0sIC8vVmlldG5hbWVzZQogICAgeyAweDA0MmIsICJoeS1BTSIgfSwgLy9Bcm1lbmlhbgogICAgeyAweDA0MmMsICJhei1MYXRuLUFaIiB9LCAvL0F6ZXJpIChMYXRpbikKICAgIHsgMHgwNDJkLCAiZXUtRVMiIH0sIC8vQmFzcXVlCiAgICB7IDB4MDQyZSwgImhzYi1ERSIgfSwgLy9VcHBlciBTb3JiaWFuCiAgICB7IDB4MDQyZiwgIm1rLU1LIiB9LCAvL01hY2Vkb25pYW4gKEZZUk9NKQogICAgeyAweDA0MzIsICJ0bi1aQSIgfSwgLy9TZXRzd2FuYQogICAgeyAweDA0MzQsICJ4aC1aQSIgfSwgLy9pc2lYaG9zYQogICAgeyAweDA0MzUsICJ6dS1aQSIgfSwgLy9pc2ladWx1CiAgICB7IDB4MDQzNiwgImFmLVpBIiB9LCAvL0FmcmlrYWFucwogICAgeyAweDA0MzcsICJrYS1HRSIgfSwgLy9HZW9yZ2lhbgogICAgeyAweDA0MzgsICJmby1GTyIgfSwgLy9GYXJvZXNlCiAgICB7IDB4MDQzOSwgImhpLUlOIiB9LCAvL0hpbmRpCiAgICB7IDB4MDQzYSwgIm10LU1UIiB9LCAvL01hbHRlc2UKICAgIHsgMHgwNDNiLCAic2UtTk8iIH0sIC8vU2FtaSAoTm9ydGhlcm4pCiAgICB7IDB4MDQzZSwgIm1zLU1ZIiB9LCAvL01hbGF5CiAgICB7IDB4MDQzZiwgImtrLUtaIiB9LCAvL0themFraAogICAgeyAweDA0NDAsICJreS1LRyIgfSwgLy9LeXJneXoKICAgIHsgMHgwNDQxLCAic3ctS0UiIH0sIC8vS2lzd2FoaWxpCiAgICB7IDB4MDQ0MiwgInRrLVRNIiB9LCAvL1R1cmttZW4KICAgIHsgMHgwNDQzLCAidXotTGF0bi1VWiIgfSwgLy9VemJlayAoTGF0aW4pCiAgICB7IDB4MDQ0MywgInV6IiB9LCAvL1V6YmVrCiAgICB7IDB4MDQ0NCwgInR0LVJVIiB9LCAvL1RhdGFyCiAgICB7IDB4MDQ0NSwgImJuLUlOIiB9LCAvL0JlbmdhbGkKICAgIHsgMHgwNDQ2LCAicGEtSU4iIH0sIC8vUHVuamFiaQogICAgeyAweDA0NDcsICJndS1JTiIgfSwgLy9HdWphcmF0aQogICAgeyAweDA0NDgsICJvci1JTiIgfSwgLy9Pcml5YQogICAgeyAweDA0NDksICJ0YS1JTiIgfSwgLy9UYW1pbAogICAgeyAweDA0NGEsICJ0ZS1JTiIgfSwgLy9UZWx1Z3UKICAgIHsgMHgwNDRiLCAia24tSU4iIH0sIC8vS2FubmFkYQogICAgeyAweDA0NGMsICJtbC1JTiIgfSwgLy9NYWxheWFsYW0KICAgIHsgMHgwNDRkLCAiYXMtSU4iIH0sIC8vQXNzYW1lc2UKICAgIHsgMHgwNDRlLCAibXItSU4iIH0sIC8vTWFyYXRoaQogICAgeyAweDA0NGYsICJzYS1JTiIgfSwgLy9TYW5za3JpdAogICAgeyAweDA0NTAsICJtbi1DeXJsIiB9LCAvL01vbmdvbGlhbiAoQ3lyaWxsaWMpCiAgICB7IDB4MDQ1MSwgImJvLUNOIiB9LCAvL1RpYmV0YW4KICAgIHsgMHgwNDUyLCAiY3ktR0IiIH0sIC8vV2Vsc2gKICAgIHsgMHgwNDUzLCAia20tS0giIH0sIC8vS2htZXIKICAgIHsgMHgwNDU0LCAibG8tTEEiIH0sIC8vTGFvCiAgICB7IDB4MDQ1NiwgImdsLUVTIiB9LCAvL0dhbGljaWFuCiAgICB7IDB4MDQ1NywgImtvay1JTiIgfSwgLy9Lb25rYW5pCiAgICB7IDB4MDQ1YSwgInN5ci1TWSIgfSwgLy9TeXJpYWMKICAgIHsgMHgwNDViLCAic2ktTEsiIH0sIC8vU2luaGFsYQogICAgeyAweDA0NWQsICJpdS1DYW5zLUNBIiB9LCAvL0ludWt0aXR1dCAoU3lsbGFiaWNzKQogICAgeyAweDA0NWUsICJhbS1FVCIgfSwgLy9BbWhhcmljCiAgICB7IDB4MDQ2MSwgIm5lLU5QIiB9LCAvL05lcGFsaQogICAgeyAweDA0NjIsICJmeS1OTCIgfSwgLy9GcmlzaWFuCiAgICB7IDB4MDQ2MywgInBzLUFGIiB9LCAvL1Bhc2h0bwogICAgeyAweDA0NjQsICJmaWwtUEgiIH0sIC8vRmlsaXBpbm8KICAgIHsgMHgwNDY1LCAiZHYtTVYiIH0sIC8vRGl2ZWhpCiAgICB7IDB4MDQ2OCwgImhhLUxhdG4tTkciIH0sIC8vSGF1c2EgKExhdGluKQogICAgeyAweDA0NmEsICJ5by1ORyIgfSwgLy9Zb3J1YmEKICAgIHsgMHgwNDZiLCAicXV6LUJPIiB9LCAvL1F1ZWNodWEKICAgIHsgMHgwNDZjLCAibnNvLVpBIiB9LCAvL1Nlc290aG8gc2EgTGVib2EKICAgIHsgMHgwNDZkLCAiYmEtUlUiIH0sIC8vQmFzaGtpcgogICAgeyAweDA0NmUsICJsYi1MVSIgfSwgLy9MdXhlbWJvdXJnaXNoCiAgICB7IDB4MDQ2ZiwgImtsLUdMIiB9LCAvL0dyZWVubGFuZGljCiAgICB7IDB4MDQ3MCwgImlnLU5HIiB9LCAvL0lnYm8KICAgIHsgMHgwNDc4LCAiaWktQ04iIH0sIC8vWWkKICAgIHsgMHgwNDdhLCAiYXJuLUNMIiB9LCAvL01hcHVkdW5ndW4KICAgIHsgMHgwNDdjLCAibW9oLUNBIiB9LCAvL01vaGF3awogICAgeyAweDA0N2UsICJici1GUiIgfSwgLy9CcmV0b24KICAgIHsgMHgwNDgwLCAidWctQ04iIH0sIC8vVXlnaHVyCiAgICB7IDB4MDQ4MSwgIm1pLU5aIiB9LCAvL01hb3JpCiAgICB7IDB4MDQ4MiwgIm9jLUZSIiB9LCAvL09jY2l0YW4KICAgIHsgMHgwNDgzLCAiY28tRlIiIH0sIC8vQ29yc2ljYW4KICAgIHsgMHgwNDg0LCAiZ3N3LUZSIiB9LCAvL0Fsc2F0aWFuCiAgICB7IDB4MDQ4NSwgInNhaC1SVSIgfSwgLy9ZYWt1dAogICAgeyAweDA0ODYsICJxdXQtR1QiIH0sIC8vSydpY2hlCiAgICB7IDB4MDQ4NywgInJ3LVJXIiB9LCAvL0tpbnlhcndhbmRhCiAgICB7IDB4MDQ4OCwgIndvLVNOIiB9LCAvL1dvbG9mCiAgICB7IDB4MDQ4YywgInBycy1BRiIgfSwgLy9EYXJpCiAgICB7IDB4MDQ5MSwgImdkLUdCIiB9LCAvL1Njb3R0aXNoIEdhZWxpYwogICAgeyAweDA4MDEsICJhci1JUSIgfSwgLy9BcmFiaWMKICAgIHsgMHgwODA0LCAiemgtSGFucyIgfSwgLy9DaGluZXNlIChTaW1wbGlmaWVkKQogICAgeyAweDA4MDcsICJkZS1DSCIgfSwgLy9HZXJtYW4KICAgIHsgMHgwODA5LCAiZW4tR0IiIH0sIC8vRW5nbGlzaAogICAgeyAweDA4MGEsICJlcy1NWCIgfSwgLy9TcGFuaXNoCiAgICB7IDB4MDgwYywgImZyLUJFIiB9LCAvL0ZyZW5jaAogICAgeyAweDA4MTAsICJpdC1DSCIgfSwgLy9JdGFsaWFuCiAgICB7IDB4MDgxMywgIm5sLUJFIiB9LCAvL0R1dGNoCiAgICB7IDB4MDgxNCwgIm5uLU5PIiB9LCAvL05vcndlZ2lhbiAoTnlub3JzaykKICAgIHsgMHgwODE2LCAicHQtUFQiIH0sIC8vUG9ydHVndWVzZQogICAgeyAweDA4MWEsICJzci1MYXRuLUNTIiB9LCAvL1NlcmJpYW4gKExhdGluKQogICAgeyAweDA4MWQsICJzdi1GSSIgfSwgLy9Td2VkaXNoCiAgICB7IDB4MDgyYywgImF6LUN5cmwtQVoiIH0sIC8vQXplcmkgKEN5cmlsbGljKQogICAgeyAweDA4MmUsICJkc2ItREUiIH0sIC8vTG93ZXIgU29yYmlhbgogICAgeyAweDA4MmUsICJkc2IiIH0sIC8vTG93ZXIgU29yYmlhbgogICAgeyAweDA4M2IsICJzZS1TRSIgfSwgLy9TYW1pIChOb3J0aGVybikKICAgIHsgMHgwODNjLCAiZ2EtSUUiIH0sIC8vSXJpc2gKICAgIHsgMHgwODNlLCAibXMtQk4iIH0sIC8vTWFsYXkKICAgIHsgMHgwODQzLCAidXotQ3lybC1VWiIgfSwgLy9VemJlayAoQ3lyaWxsaWMpCiAgICB7IDB4MDg0NSwgImJuLUJEIiB9LCAvL0JlbmdhbGkKICAgIHsgMHgwODUwLCAibW4tTW9uZy1DTiIgfSwgLy9Nb25nb2xpYW4gKFRyYWRpdGlvbmFsIE1vbmdvbGlhbikKICAgIHsgMHgwODVkLCAiaXUtTGF0bi1DQSIgfSwgLy9JbnVrdGl0dXQgKExhdGluKQogICAgeyAweDA4NWYsICJ0em0tTGF0bi1EWiIgfSwgLy9UYW1hemlnaHQgKExhdGluKQogICAgeyAweDA4NmIsICJxdXotRUMiIH0sIC8vUXVlY2h1YQogICAgeyAweDBjMDEsICJhci1FRyIgfSwgLy9BcmFiaWMKICAgIHsgMHgwYzA0LCAiemgtSGFudCIgfSwgLy9DaGluZXNlIChUcmFkaXRpb25hbCkKICAgIHsgMHgwYzA3LCAiZGUtQVQiIH0sIC8vR2VybWFuCiAgICB7IDB4MGMwOSwgImVuLUFVIiB9LCAvL0VuZ2xpc2gKICAgIHsgMHgwYzBhLCAiZXMtRVMiIH0sIC8vU3BhbmlzaAogICAgeyAweDBjMGMsICJmci1DQSIgfSwgLy9GcmVuY2gKICAgIHsgMHgwYzFhLCAic3ItQ3lybC1DUyIgfSwgLy9TZXJiaWFuIChDeXJpbGxpYykKICAgIHsgMHgwYzNiLCAic2UtRkkiIH0sIC8vU2FtaSAoTm9ydGhlcm4pCiAgICB7IDB4MGM2YiwgInF1ei1QRSIgfSwgLy9RdWVjaHVhCiAgICB7IDB4MTAwMSwgImFyLUxZIiB9LCAvL0FyYWJpYwogICAgeyAweDEwMDQsICJ6aC1TRyIgfSwgLy9DaGluZXNlIChTaW1wbGlmaWVkKQogICAgeyAweDEwMDcsICJkZS1MVSIgfSwgLy9HZXJtYW4KICAgIHsgMHgxMDA5LCAiZW4tQ0EiIH0sIC8vRW5nbGlzaAogICAgeyAweDEwMGEsICJlcy1HVCIgfSwgLy9TcGFuaXNoCiAgICB7IDB4MTAwYywgImZyLUNIIiB9LCAvL0ZyZW5jaAogICAgeyAweDEwMWEsICJoci1CQSIgfSwgLy9Dcm9hdGlhbiAoTGF0aW4pCiAgICB7IDB4MTAzYiwgInNtai1OTyIgfSwgLy9TYW1pIChMdWxlKQogICAgeyAweDE0MDEsICJhci1EWiIgfSwgLy9BcmFiaWMKICAgIHsgMHgxNDA0LCAiemgtTU8iIH0sIC8vQ2hpbmVzZSAoVHJhZGl0aW9uYWwpCiAgICB7IDB4MTQwNywgImRlLUxJIiB9LCAvL0dlcm1hbgogICAgeyAweDE0MDksICJlbi1OWiIgfSwgLy9FbmdsaXNoCiAgICB7IDB4MTQwYSwgImVzLUNSIiB9LCAvL1NwYW5pc2gKICAgIHsgMHgxNDBjLCAiZnItTFUiIH0sIC8vRnJlbmNoCiAgICB7IDB4MTQxYSwgImJzLUxhdG4tQkEiIH0sIC8vQm9zbmlhbiAoTGF0aW4pCiAgICB7IDB4MTQxYSwgImJzIiB9LCAvL0Jvc25pYW4KICAgIHsgMHgxNDNiLCAic21qLVNFIiB9LCAvL1NhbWkgKEx1bGUpCiAgICB7IDB4MTQzYiwgInNtaiIgfSwgLy9TYW1pIChMdWxlKQogICAgeyAweDE4MDEsICJhci1NQSIgfSwgLy9BcmFiaWMKICAgIHsgMHgxODA5LCAiZW4tSUUiIH0sIC8vRW5nbGlzaAogICAgeyAweDE4MGEsICJlcy1QQSIgfSwgLy9TcGFuaXNoCiAgICB7IDB4MTgwYywgImZyLU1DIiB9LCAvL0ZyZW5jaAogICAgeyAweDE4MWEsICJzci1MYXRuLUJBIiB9LCAvL1NlcmJpYW4gKExhdGluKQogICAgeyAweDE4M2IsICJzbWEtTk8iIH0sIC8vU2FtaSAoU291dGhlcm4pCiAgICB7IDB4MWMwMSwgImFyLVROIiB9LCAvL0FyYWJpYwogICAgeyAweDFjMDksICJlbi1aQSIgfSwgLy9FbmdsaXNoCiAgICB7IDB4MWMwYSwgImVzLURPIiB9LCAvL1NwYW5pc2gKICAgIHsgMHgxYzFhLCAic3ItQ3lybC1CQSIgfSwgLy9TZXJiaWFuIChDeXJpbGxpYykKICAgIHsgMHgxYzNiLCAic21hLVNFIiB9LCAvL1NhbWkgKFNvdXRoZXJuKQogICAgeyAweDFjM2IsICJzbWEiIH0sIC8vU2FtaSAoU291dGhlcm4pCiAgICB7IDB4MjAwMSwgImFyLU9NIiB9LCAvL0FyYWJpYwogICAgeyAweDIwMDksICJlbi1KTSIgfSwgLy9FbmdsaXNoCiAgICB7IDB4MjAwYSwgImVzLVZFIiB9LCAvL1NwYW5pc2gKICAgIHsgMHgyMDFhLCAiYnMtQ3lybC1CQSIgfSwgLy9Cb3NuaWFuIChDeXJpbGxpYykKICAgIHsgMHgyMDFhLCAiYnMtQ3lybCIgfSwgLy9Cb3NuaWFuIChDeXJpbGxpYykKICAgIHsgMHgyMDNiLCAic21zLUZJIiB9LCAvL1NhbWkgKFNrb2x0KQogICAgeyAweDIwM2IsICJzbXMiIH0sIC8vU2FtaSAoU2tvbHQpCiAgICB7IDB4MjQwMSwgImFyLVlFIiB9LCAvL0FyYWJpYwogICAgeyAweDI0MDksICJlbi0wMjkiIH0sIC8vRW5nbGlzaAogICAgeyAweDI0MGEsICJlcy1DTyIgfSwgLy9TcGFuaXNoCiAgICB7IDB4MjQxYSwgInNyLUxhdG4tUlMiIH0sIC8vU2VyYmlhbiAoTGF0aW4pCiAgICB7IDB4MjQzYiwgInNtbi1GSSIgfSwgLy9TYW1pIChJbmFyaSkKICAgIHsgMHgyODAxLCAiYXItU1kiIH0sIC8vQXJhYmljCiAgICB7IDB4MjgwOSwgImVuLUJaIiB9LCAvL0VuZ2xpc2gKICAgIHsgMHgyODBhLCAiZXMtUEUiIH0sIC8vU3BhbmlzaAogICAgeyAweDI4MWEsICJzci1DeXJsLVJTIiB9LCAvL1NlcmJpYW4gKEN5cmlsbGljKQogICAgeyAweDJjMDEsICJhci1KTyIgfSwgLy9BcmFiaWMKICAgIHsgMHgyYzA5LCAiZW4tVFQiIH0sIC8vRW5nbGlzaAogICAgeyAweDJjMGEsICJlcy1BUiIgfSwgLy9TcGFuaXNoCiAgICB7IDB4MmMxYSwgInNyLUxhdG4tTUUiIH0sIC8vU2VyYmlhbiAoTGF0aW4pCiAgICB7IDB4MzAwMSwgImFyLUxCIiB9LCAvL0FyYWJpYwogICAgeyAweDMwMDksICJlbi1aVyIgfSwgLy9FbmdsaXNoCiAgICB7IDB4MzAwYSwgImVzLUVDIiB9LCAvL1NwYW5pc2gKICAgIHsgMHgzMDFhLCAic3ItQ3lybC1NRSIgfSwgLy9TZXJiaWFuIChDeXJpbGxpYykKICAgIHsgMHgzNDAxLCAiYXItS1ciIH0sIC8vQXJhYmljCiAgICB7IDB4MzQwOSwgImVuLVBIIiB9LCAvL0VuZ2xpc2gKICAgIHsgMHgzNDBhLCAiZXMtQ0wiIH0sIC8vU3BhbmlzaAogICAgeyAweDM4MDEsICJhci1BRSIgfSwgLy9BcmFiaWMKICAgIHsgMHgzODBhLCAiZXMtVVkiIH0sIC8vU3BhbmlzaAogICAgeyAweDNjMDEsICJhci1CSCIgfSwgLy9BcmFiaWMKICAgIHsgMHgzYzBhLCAiZXMtUFkiIH0sIC8vU3BhbmlzaAogICAgeyAweDQwMDEsICJhci1RQSIgfSwgLy9BcmFiaWMKICAgIHsgMHg0MDA5LCAiZW4tSU4iIH0sIC8vRW5nbGlzaAogICAgeyAweDQwMGEsICJlcy1CTyIgfSwgLy9TcGFuaXNoCiAgICB7IDB4NDQwOSwgImVuLU1ZIiB9LCAvL0VuZ2xpc2gKICAgIHsgMHg0NDBhLCAiZXMtU1YiIH0sIC8vU3BhbmlzaAogICAgeyAweDQ4MDksICJlbi1TRyIgfSwgLy9FbmdsaXNoCiAgICB7IDB4NDgwYSwgImVzLUhOIiB9LCAvL1NwYW5pc2gKICAgIHsgMHg0YzBhLCAiZXMtTkkiIH0sIC8vU3BhbmlzaAogICAgeyAweDUwMGEsICJlcy1QUiIgfSwgLy9TcGFuaXNoCiAgICB7IDB4NTQwYSwgImVzLVVTIiB9LCAvL1NwYW5pc2gKfTsKCm5hbWVzcGFjZSB7CmJvb2wgQkNQNDdGcm9tTGFuZ3VhZ2VJZExlc3MoY29uc3QgQkNQNDdGcm9tTGFuZ3VhZ2VJZCYgYSwgY29uc3QgQkNQNDdGcm9tTGFuZ3VhZ2VJZCYgYikgewogICAgcmV0dXJuIGEubGFuZ3VhZ2VJRCA8IGIubGFuZ3VhZ2VJRDsKfQp9Cgpib29sIFNrT1RUYWJsZU5hbWU6Okl0ZXJhdG9yOjpuZXh0KFNrT1RUYWJsZU5hbWU6Okl0ZXJhdG9yOjpSZWNvcmQmIHJlY29yZCkgewogICAgY29uc3Qgc2l6ZV90IG5hbWVSZWNvcmRzQ291bnQgPSBTa0VuZGlhbl9Td2FwQkUxNihmTmFtZS5jb3VudCk7CiAgICBjb25zdCBTa09UVGFibGVOYW1lOjpSZWNvcmQqIG5hbWVSZWNvcmRzID0gU2tUQWZ0ZXI8Y29uc3QgU2tPVFRhYmxlTmFtZTo6UmVjb3JkPigmZk5hbWUpOwogICAgY29uc3QgU2tPVFRhYmxlTmFtZTo6UmVjb3JkKiBuYW1lUmVjb3JkOwoKICAgIC8vIEZpbmQgdGhlIG5leHQgcmVjb3JkIHdoaWNoIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCB0eXBlLgogICAgZG8gewogICAgICAgIGlmIChmSW5kZXggPj0gbmFtZVJlY29yZHNDb3VudCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBuYW1lUmVjb3JkID0gJm5hbWVSZWNvcmRzW2ZJbmRleF07CiAgICAgICAgKytmSW5kZXg7CiAgICB9IHdoaWxlIChmVHlwZSAhPSAtMSAmJiBuYW1lUmVjb3JkLT5uYW1lSUQuZm9udFNwZWNpZmljICE9IGZUeXBlKTsKCiAgICByZWNvcmQudHlwZSA9IG5hbWVSZWNvcmQtPm5hbWVJRC5mb250U3BlY2lmaWM7CgogICAgY29uc3QgdWludDE2X3Qgc3RyaW5nVGFibGVPZmZzZXQgPSBTa0VuZGlhbl9Td2FwQkUxNihmTmFtZS5zdHJpbmdPZmZzZXQpOwogICAgY29uc3QgY2hhciogc3RyaW5nVGFibGUgPSBTa1RBZGRPZmZzZXQ8Y29uc3QgY2hhcj4oJmZOYW1lLCBzdHJpbmdUYWJsZU9mZnNldCk7CgogICAgLy8gRGVjb2RlIHRoZSBuYW1lIGludG8gVVRGLTguCiAgICBjb25zdCB1aW50MTZfdCBuYW1lT2Zmc2V0ID0gU2tFbmRpYW5fU3dhcEJFMTYobmFtZVJlY29yZC0+b2Zmc2V0KTsKICAgIGNvbnN0IHVpbnQxNl90IG5hbWVMZW5ndGggPSBTa0VuZGlhbl9Td2FwQkUxNihuYW1lUmVjb3JkLT5sZW5ndGgpOwogICAgY29uc3QgY2hhciogbmFtZVN0cmluZyA9IFNrVEFkZE9mZnNldDxjb25zdCBjaGFyPihzdHJpbmdUYWJsZSwgbmFtZU9mZnNldCk7CiAgICBzd2l0Y2ggKG5hbWVSZWNvcmQtPnBsYXRmb3JtSUQudmFsdWUpIHsKICAgICAgICBjYXNlIFNrT1RUYWJsZU5hbWU6OlJlY29yZDo6UGxhdGZvcm1JRDo6V2luZG93czoKICAgICAgICAgICAgaWYgKFNrT1RUYWJsZU5hbWU6OlJlY29yZDo6RW5jb2RpbmdJRDo6V2luZG93czo6VW5pY29kZUJNUFVDUzIKICAgICAgICAgICAgICAgICAgICE9IG5hbWVSZWNvcmQtPmVuY29kaW5nSUQud2luZG93cy52YWx1ZQogICAgICAgICAgICAgICAgJiYgU2tPVFRhYmxlTmFtZTo6UmVjb3JkOjpFbmNvZGluZ0lEOjpXaW5kb3dzOjpVbmljb2RlVUNTNAogICAgICAgICAgICAgICAgICAgIT0gbmFtZVJlY29yZC0+ZW5jb2RpbmdJRC53aW5kb3dzLnZhbHVlCiAgICAgICAgICAgICAgICAmJiBTa09UVGFibGVOYW1lOjpSZWNvcmQ6OkVuY29kaW5nSUQ6OldpbmRvd3M6OlN5bWJvbAogICAgICAgICAgICAgICAgICAgIT0gbmFtZVJlY29yZC0+ZW5jb2RpbmdJRC53aW5kb3dzLnZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZWNvcmQubmFtZS5yZXNldCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICBjYXNlIFNrT1RUYWJsZU5hbWU6OlJlY29yZDo6UGxhdGZvcm1JRDo6VW5pY29kZToKICAgICAgICBjYXNlIFNrT1RUYWJsZU5hbWU6OlJlY29yZDo6UGxhdGZvcm1JRDo6SVNPOgogICAgICAgICAgICBTa1N0cmluZ0Zyb21VVEYxNkJFKChjb25zdCB1aW50MTZfdCopbmFtZVN0cmluZywgbmFtZUxlbmd0aCwgcmVjb3JkLm5hbWUpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBTa09UVGFibGVOYW1lOjpSZWNvcmQ6OlBsYXRmb3JtSUQ6Ok1hY2ludG9zaDoKICAgICAgICAgICAgLy8gVE9ETzogbmVlZCBiZXR0ZXIgZGVjb2RpbmcsIGVzcGVjaWFsbHkgb24gTWFjLgogICAgICAgICAgICBpZiAoU2tPVFRhYmxlTmFtZTo6UmVjb3JkOjpFbmNvZGluZ0lEOjpNYWNpbnRvc2g6OlJvbWFuCiAgICAgICAgICAgICAgICAhPSBuYW1lUmVjb3JkLT5lbmNvZGluZ0lELm1hY2ludG9zaC52YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVjb3JkLm5hbWUucmVzZXQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFNrU3RyaW5nRnJvbU1hY1JvbWFuKChjb25zdCB1aW50OF90KiluYW1lU3RyaW5nLCBuYW1lTGVuZ3RoLCByZWNvcmQubmFtZSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFNrT1RUYWJsZU5hbWU6OlJlY29yZDo6UGxhdGZvcm1JRDo6Q3VzdG9tOgogICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGEgJ25hbWUnIHRhYmxlLgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNrQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgcmVjb3JkLm5hbWUucmVzZXQoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLy8gRGV0ZXJtaW5lIHRoZSBsYW5ndWFnZS4KICAgIGNvbnN0IHVpbnQxNl90IGxhbmd1YWdlSUQgPSBTa0VuZGlhbl9Td2FwQkUxNihuYW1lUmVjb3JkLT5sYW5ndWFnZUlELmxhbmd1YWdlVGFnSUQpOwoKICAgIC8vIEhhbmRsZSBmb3JtYXQgMSBsYW5ndWFnZXMuCiAgICBpZiAoU2tPVFRhYmxlTmFtZTo6Zm9ybWF0XzEgPT0gZk5hbWUuZm9ybWF0ICYmIGxhbmd1YWdlSUQgPj0gMHg4MDAwKSB7CiAgICAgICAgY29uc3QgdWludDE2X3QgbGFuZ3VhZ2VUYWdSZWNvcmRJbmRleCA9IGxhbmd1YWdlSUQgLSAweDgwMDA7CgogICAgICAgIGNvbnN0IFNrT1RUYWJsZU5hbWU6OkZvcm1hdDFFeHQqIGZvcm1hdDFleHQgPQogICAgICAgICAgICBTa1RBZnRlcjxjb25zdCBTa09UVGFibGVOYW1lOjpGb3JtYXQxRXh0PihuYW1lUmVjb3JkcywgbmFtZVJlY29yZHNDb3VudCk7CgogICAgICAgIGlmIChsYW5ndWFnZVRhZ1JlY29yZEluZGV4IDwgU2tFbmRpYW5fU3dhcEJFMTYoZm9ybWF0MWV4dC0+bGFuZ1RhZ0NvdW50KSkgewogICAgICAgICAgICBjb25zdCBTa09UVGFibGVOYW1lOjpGb3JtYXQxRXh0OjpMYW5nVGFnUmVjb3JkKiBsYW5ndWFnZVRhZ1JlY29yZCA9CiAgICAgICAgICAgICAgICBTa1RBZnRlcjxjb25zdCBTa09UVGFibGVOYW1lOjpGb3JtYXQxRXh0OjpMYW5nVGFnUmVjb3JkPihmb3JtYXQxZXh0KTsKCiAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCA9IFNrRW5kaWFuX1N3YXBCRTE2KGxhbmd1YWdlVGFnUmVjb3JkW2xhbmd1YWdlVGFnUmVjb3JkSW5kZXhdLm9mZnNldCk7CiAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCA9IFNrRW5kaWFuX1N3YXBCRTE2KGxhbmd1YWdlVGFnUmVjb3JkW2xhbmd1YWdlVGFnUmVjb3JkSW5kZXhdLmxlbmd0aCk7CiAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBzdHJpbmcgPSBTa1RBZGRPZmZzZXQ8Y29uc3QgdWludDE2X3Q+KHN0cmluZ1RhYmxlLCBvZmZzZXQpOwogICAgICAgICAgICBTa1N0cmluZ0Zyb21VVEYxNkJFKHN0cmluZywgbGVuZ3RoLCByZWNvcmQubGFuZ3VhZ2UpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgLy8gSGFuZGxlIGZvcm1hdCAwIGxhbmd1YWdlcywgdHJhbnNsYXRpbmcgdGhlbSBpbnRvIEJDUCA0Ny4KICAgIGNvbnN0IEJDUDQ3RnJvbUxhbmd1YWdlSWQgdGFyZ2V0ID0geyBsYW5ndWFnZUlELCAiIiB9OwogICAgaW50IGxhbmd1YWdlSW5kZXggPSBTa1RTZWFyY2g8QkNQNDdGcm9tTGFuZ3VhZ2VJZCwgQkNQNDdGcm9tTGFuZ3VhZ2VJZExlc3M+KAogICAgICAgIEJDUDQ3RnJvbUxhbmd1YWdlSUQsIFNLX0FSUkFZX0NPVU5UKEJDUDQ3RnJvbUxhbmd1YWdlSUQpLCB0YXJnZXQsIHNpemVvZih0YXJnZXQpKTsKICAgIGlmIChsYW5ndWFnZUluZGV4ID49IDApIHsKICAgICAgICByZWNvcmQubGFuZ3VhZ2UgPSBCQ1A0N0Zyb21MYW5ndWFnZUlEW2xhbmd1YWdlSW5kZXhdLmJjcDQ3OwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIFVua25vd24gbGFuZ3VhZ2UsIHJldHVybiB0aGUgQkNQIDQ3IGNvZGUgJ3VuZCcgZm9yICd1bmRldGVybWluZWQnLgogICAgcmVjb3JkLmxhbmd1YWdlID0gInVuZCI7CiAgICByZXR1cm4gdHJ1ZTsKfQo=