LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgoqIFZlcnNpb246IE5QTCAxLjEvR1BMIDIuMC9MR1BMIDIuMQoqCiogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTmV0c2NhcGUgUHVibGljIExpY2Vuc2UKKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCiogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL05QTC8KKgoqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiogV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiogZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKKiBMaWNlbnNlLgoqCiogVGhlIE9yaWdpbmFsIENvZGUgaXMgSmF2YVNjcmlwdCBFbmdpbmUgdGVzdGluZyB1dGlsaXRpZXMuCioKKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycC4KKiBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAyCiogdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqCiogQ29udHJpYnV0b3Iocyk6IHJvZ2VybEBuZXRzY2FwZS5jb20sIHBzY2h3YXJ0YXVAbmV0c2NhcGUuY29tCioKKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgoqIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUgIkdQTCIpLCBvcgoqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgb3IgbGF0ZXIgKHRoZSAiTEdQTCIpLAoqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCiogb2YgdGhvc2UgYWJvdmUuIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkKKiB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHUEwgb3IgdGhlIExHUEwsIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvCiogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBOUEwsIGluZGljYXRlIHlvdXIKKiBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQoqIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwgb3IgdGhlIExHUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlCiogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgoqIHRoZSB0ZXJtcyBvZiBhbnkgb25lIG9mIHRoZSBOUEwsIHRoZSBHUEwgb3IgdGhlIExHUEwuCioKKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKgoqCioKKiBEYXRlOiAgICAxNSBKdWx5IDIwMDIKKiBTVU1NQVJZOiBUZXN0aW5nIGlkZW50aWZpZXJzIHdpdGggZG91YmxlLWJ5dGUgbmFtZXMKKiBTZWUgaHR0cDovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01ODI3NAoqCiogSGVyZSBpcyBhIHNhbXBsZSBvZiB0aGUgcHJvYmxlbToKKgoqICAgIGpzPiBmdW5jdGlvbiBmXHUwMkIxICgpIHt9CioKKiAgICBqcz4gZlx1MDJCMS50b1NvdXJjZSgpOwoqICAgIGZ1bmN0aW9uIGamKCkge30KKgoqICAgIGpzPiBmXHUwMkIxLnRvU291cmNlKCkudG9Tb3VyY2UoKTsKKiAgICAobmV3IFN0cmluZygiZnVuY3Rpb24gZlx4QjEoKSB7fSIpKQoqCioKKiBTZWUgaG93IHRoZSBoaWdoLWJ5dGUgaW5mb3JtYXRpb24gKHRoZSAwMikgaGFzIGJlZW4gbG9zdD8KKiBUaGUgc2FtZSB0aGluZyB3YXMgaGFwcGVuaW5nIHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kOgoqCiogICAganM+IGZcdTAyQjEudG9TdHJpbmcoKTsKKgoqICAgIGZ1bmN0aW9uIGamKCkgewoqICAgIH0KKgoqICAgIGpzPiBmXHUwMkIxLnRvU3RyaW5nKCkudG9Tb3VyY2UoKTsKKiAgICAobmV3IFN0cmluZygiXG5mdW5jdGlvbiBmXHhCMSgpIHtcbn1cbiIpKQoqCiovCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdmFyIFVCb3VuZCA9IDA7CnZhciBidWcgPSA1ODI3NDsKdmFyIHN1bW1hcnkgPSAnVGVzdGluZyBpZGVudGlmaWVycyB3aXRoIGRvdWJsZS1ieXRlIG5hbWVzJzsKdmFyIHN0YXR1cyA9ICcnOwp2YXIgc3RhdHVzaXRlbXMgPSBbXTsKdmFyIGFjdHVhbCA9ICcnOwp2YXIgYWN0dWFsdmFsdWVzID0gW107CnZhciBleHBlY3Q9ICcnOwp2YXIgZXhwZWN0ZWR2YWx1ZXMgPSBbXTsKCgovKgogKiBEZWZpbmUgYSBmdW5jdGlvbiB0aGF0IHVzZXMgZG91YmxlLWJ5dGUgaWRlbnRpZmllcnMgaW4KICogImV2ZXJ5IHBvc3NpYmxlIHdheSIKICoKICogVGhlbiByZWNvdmVyIGVhY2ggZG91YmxlLWJ5dGUgaWRlbnRpZmllciB2aWEgZi50b1N0cmluZygpLgogKiBUbyBtYWtlIHRoaXMgZWFzaWVyLCBwdXQgYSAnWicgdG9rZW4gYmVmb3JlIGV2ZXJ5IG9uZS4KICoKICogT3VyIGV2YWwgc3RyaW5nIHdpbGwgYmU6CiAqCiAqIHNFdmFsID0gImZ1bmN0aW9uIFpcdTAyYjEoWlx1MDJiMiwgYikgewogKiAgICAgICAgICB0cnkgeyBaXHUwMmIzIDogdmFyIFpcdTAyYjQgPSBaXHUwMmIxOyB9CiAqICAgICAgICAgIGNhdGNoIChaXHUwMmI1KSB7IGZvciAodmFyIFpcdTAyYjYgaW4gWlx1MDJiNSkKICogICAgICAgICAge2ZvciAoMTsgMTwwOyBaXHUwMmI3KyspIHtuZXcgQXJyYXkoKVtaXHUwMmI2XSA9IDE7fSB9O30gfSI7CiAqCiAqIEl0IHdpbGwgYmUgaGVscGZ1bCB0byBidWlsZCB0aGlzIHN0cmluZyBpbiBzdGFnZXM6CiAqLwp2YXIgczAgPSAgJ2Z1bmN0aW9uIFonOwp2YXIgczEgPSAgJ1x1MDJiMShaJzsKdmFyIHMyID0gICdcdTAyYjIsIGIpIHt0cnkgeyBaJzsKdmFyIHMzID0gICdcdTAyYjMgOiB2YXIgWic7CnZhciBzNCA9ICAnXHUwMmI0ID0gWic7CnZhciBzNSA9ICAnXHUwMmIxOyB9IGNhdGNoIChaJwp2YXIgczYgPSAgJ1x1MDJiNSkgeyBmb3IgKHZhciBaJzsKdmFyIHM3ID0gICdcdTAyYjYgaW4gWic7CnZhciBzOCA9ICAnXHUwMmI1KXtmb3IgKDE7IDE8MDsgWic7CnZhciBzOSA9ICAnXHUwMmI3KyspIHtuZXcgQXJyYXkoKVtaJzsKdmFyIHMxMCA9ICdcdTAyYjZdID0gMTt9IH07fSB9JzsKCgovKgogKiBDb25jYXRlbmF0ZSB0aGVzZSBhbmQgZXZhbCgpIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gWlx1MDJiMQogKi8KdmFyIHNFdmFsID0gczAgKyBzMSArIHMyICsgczMgKyBzNCArIHM1ICsgczYgKyBzNyArIHM4ICsgczkgKyBzMTA7CmV2YWwoc0V2YWwpOwoKCi8qCiAqIFJlY292ZXIgYWxsIHRoZSBkb3VibGUtYnl0ZSBpZGVudGlmaWVycyB2aWEgWlx1MDJiMS50b1N0cmluZygpLgogKiBXZSdsbCByZWNvdmVyIHRoZSAxc3Qgb25lIGFzIGFycklEWzFdLCB0aGUgMm5kIG9uZSBhcyBhcnJJRFsyXSwKICogYW5kIHNvIG9uIC4uLgogKi8KdmFyIGFycklEID0gZ2V0SWRlbnRpZmllcnMoWlx1MDJiMSk7CgoKLyoKICogTm93IGNoZWNrIHRoYXQgd2UgZ290IGJhY2sgd2hhdCB3ZSBwdXQgaW4gLQogKi8Kc3RhdHVzID0gaW5TZWN0aW9uKDEpOwphY3R1YWwgPSBhcnJJRFsxXTsKZXhwZWN0ID0gczEuY2hhckF0KDApOwphZGRUaGlzKCk7CgpzdGF0dXMgPSBpblNlY3Rpb24oMik7CmFjdHVhbCA9IGFycklEWzJdOwpleHBlY3QgPSBzMi5jaGFyQXQoMCk7CmFkZFRoaXMoKTsKCnN0YXR1cyA9IGluU2VjdGlvbigzKTsKYWN0dWFsID0gYXJySURbM107CmV4cGVjdCA9IHMzLmNoYXJBdCgwKTsKYWRkVGhpcygpOwoKc3RhdHVzID0gaW5TZWN0aW9uKDQpOwphY3R1YWwgPSBhcnJJRFs0XTsKZXhwZWN0ID0gczQuY2hhckF0KDApOwphZGRUaGlzKCk7CgpzdGF0dXMgPSBpblNlY3Rpb24oNSk7CmFjdHVhbCA9IGFycklEWzVdOwpleHBlY3QgPSBzNS5jaGFyQXQoMCk7CmFkZFRoaXMoKTsKCnN0YXR1cyA9IGluU2VjdGlvbig2KTsKYWN0dWFsID0gYXJySURbNl07CmV4cGVjdCA9IHM2LmNoYXJBdCgwKTsKYWRkVGhpcygpOwoKc3RhdHVzID0gaW5TZWN0aW9uKDcpOwphY3R1YWwgPSBhcnJJRFs3XTsKZXhwZWN0ID0gczcuY2hhckF0KDApOwphZGRUaGlzKCk7CgpzdGF0dXMgPSBpblNlY3Rpb24oOCk7CmFjdHVhbCA9IGFycklEWzhdOwpleHBlY3QgPSBzOC5jaGFyQXQoMCk7CmFkZFRoaXMoKTsKCnN0YXR1cyA9IGluU2VjdGlvbig5KTsKYWN0dWFsID0gYXJySURbOV07CmV4cGVjdCA9IHM5LmNoYXJBdCgwKTsKYWRkVGhpcygpOwoKc3RhdHVzID0gaW5TZWN0aW9uKDEwKTsKYWN0dWFsID0gYXJySURbMTBdOwpleHBlY3QgPSBzMTAuY2hhckF0KDApOwphZGRUaGlzKCk7CgoKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRlc3QoKTsKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgovKgogKiBHb2FsOiByZWNvdmVyIHRoZSBkb3VibGUtYnl0ZSBpZGVudGlmaWVycyBmcm9tIGYudG9TdHJpbmcoKQogKiBieSBnZXR0aW5nIHRoZSB2ZXJ5IG5leHQgY2hhcmFjdGVyIGFmdGVyIGVhY2ggJ1onIHRva2VuLgogKgogKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gYXJyYXkgfGFycnwgaW5kZXhlZCBzdWNoIHRoYXQKICogfGFyclsxXXwgaXMgdGhlIDFzdCBpZGVudGlmaWVyLCB8YXJyWzJdfCB0aGUgMm5kLCBhbmQgc28gb24uCiAqCiAqIE5vdGUsIGhvd2V2ZXIsIGYudG9TdHJpbmcoKSBpcyBpbXBsZW1lbnRhdGlvbi1pbmRlcGVuZGVudC4KICogRm9yIGV4YW1wbGUsIGl0IG1heSBiZWdpbiB3aXRoICdcbmZ1bmN0aW9uJyBpbnN0ZWFkIG9mICdmdW5jdGlvbicuIAogKgogKiBSaGlubyB1c2VzIGEgVW5pY29kZSByZXByZXNlbnRhdGlvbiBmb3IgZi50b1N0cmluZygpOyB3aGVyZWFzCiAqIFNwaWRlck1vbmtleSB1c2VzIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uLCBwdXR0aW5nIGVzY2FwZSBzZXF1ZW5jZXMKICogZm9yIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiBGb3IgZXhhbXBsZSwgaWYgYSBmdW5jdGlvbiBpcyBjYWxsZWQgZlx1MDJCMSwKICogdGhlbiBpbiBSaGlubyB0aGUgdG9TdHJpbmcoKSBtZXRob2Qgd2lsbCBwcmVzZW50IGEgMi1jaGFyYWN0ZXIgVW5pY29kZQogKiBzdHJpbmcgZm9yIGl0cyBuYW1lLCB3aGVyZWFzIFNwaWRlck1vbmtleSB3aWxsIHByZXNlbnQgYSA3LWNoYXJhY3RlcgogKiBBU0NJSSBzdHJpbmcgZm9yIGl0cyBuYW1lOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ2ZcdTAyQjEnLgogKgogKiBTbyB3ZSBmb3JjZSB0aGUgbGV4ZXIgdG8gY29uZGVuc2UgdGhlIHN0cmluZyBiZWZvcmUgd2UgdXNlIGl0LgogKiBUaGlzIHdpbGwgZ2l2ZSB1bmlmb3JtIHJlc3VsdHMgaW4gUmhpbm8gYW5kIFNwaWRlck1vbmtleS4KICovCmZ1bmN0aW9uIGdldElkZW50aWZpZXJzKGYpCnsKICB2YXIgc3RyID0gY29uZGVuc2VTdHIoZi50b1N0cmluZygpKTsKICB2YXIgYXJyID0gc3RyLnNwbGl0KCdaJyk7CgogIC8qCiAgICogVGhlIGlkZW50aWZpZXJzIGFyZSB0aGUgMXN0IGNoYXIgb2YgZWFjaCBzcGxpdCBzdWJzdHJpbmcKICAgKiBFWENFUFQgdGhlIGZpcnN0IG9uZSwgd2hpY2ggaXMganVzdCAoJ1xuJyArKSAnZnVuY3Rpb24gJy4KICAgKgogICAqIFRodXMgbm90ZSB0aGUgMXN0IGlkZW50aWZpZXIgd2lsbCBiZSBzdG9yZWQgaW4gfGFyclsxXXwsCiAgICogdGhlIDJuZCBvbmUgaW4gfGFyclsyXXwsIGV0Yy4sIG1ha2luZyB0aGUgaW5kZXhpbmcgZWFzeSAtCiAgICovCiAgZm9yIChpIGluIGFycikKICAgIGFycltpXSA9IGFycltpXS5jaGFyQXQoMCk7CiAgcmV0dXJuIGFycjsKfQoKCi8qCiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wcG9zaXRlIG9mIGEgZnVuY3Rpb25zIGxpa2UgZXNjYXBlKCksIHdoaWNoIHRha2UKICogVW5pY29kZSBjaGFyYWN0ZXJzIGFuZCByZXR1cm4gZXNjYXBlIHNlcXVlbmNlcyBmb3IgdGhlbS4gSGVyZSwgd2UgZm9yY2UKICogdGhlIGxleGVyIHRvIHR1cm4gZXNjYXBlIHNlcXVlbmNlcyBiYWNrIGludG8gc2luZ2xlIGNoYXJhY3RlcnMuCiAqCiAqIE5vdGUgd2UgY2FuJ3Qgc2ltcGx5IGRvIHxldmFsKHN0cil8LCBzaW5jZSBpbiBwcmFjdGljZSB8c3RyfCB3aWxsIGJlIGFuCiAqIGlkZW50aWZpZXIgc29tZXdoZXJlIGluIHRoZSBwcm9ncmFtIChlLmcuIGEgZnVuY3Rpb24gbmFtZSk7IHRodXMgfGV2YWwoc3RyKXwKICogd291bGQgcmV0dXJuIHRoZSBvYmplY3QgdGhhdCB0aGUgaWRlbnRpZmllciByZXByZXNlbnRzOiBub3Qgd2hhdCB3ZSB3YW50LgogKgogKiBTbyB3ZSBzdXJyb3VuZCB8c3RyfCBsZXhpY29ncmFwaGljYWxseSB3aXRoIHF1b3RlcyB0byBmb3JjZSB0aGUgbGV4ZXIgdG8KICogZXZhbHVhdGUgaXQgYXMgYSBzdHJpbmcuIEhhdmUgdG8gc3RyaXAgb3V0IGFueSBsaW5lZmVlZHMgZmlyc3QsIGhvd2V2ZXIgLQogKi8KZnVuY3Rpb24gY29uZGVuc2VTdHIoc3RyKQp7CiAgLyoKICAgKiBZb3Ugd29uJ3QgYmUgYWJsZSB0byBkbyB0aGUgbmV4dCBzdGVwIGlmIHxzdHJ8IGhhcwogICAqIGFueSBjYXJyaWFnZSByZXR1cm5zIG9yIGxpbmVmZWVkcyBpbiBpdC4gRm9yIGV4YW1wbGU6CiAgICoKICAgKiAganM+IGV2YWwoIiciICsgJ1xuSGVsbG8nICsgIiciKTsKICAgKiAgMTogU3ludGF4RXJyb3I6IHVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbDoKICAgKiAgMTogJwogICAqICAxOiBeCiAgICoKICAgKiBTbyByZXBsYWNlIHRoZW0gd2l0aCB0aGUgZW1wdHkgc3RyaW5nIC0KICAgKi8KICBzdHIgPSBzdHIucmVwbGFjZSgvW1xyXG5dL2csICcnKSAKICByZXR1cm4gZXZhbCgiJyIgKyBzdHIgKyAiJyIpCn0KCgpmdW5jdGlvbiBhZGRUaGlzKCkKewogIHN0YXR1c2l0ZW1zW1VCb3VuZF0gPSBzdGF0dXM7CiAgYWN0dWFsdmFsdWVzW1VCb3VuZF0gPSBhY3R1YWw7CiAgZXhwZWN0ZWR2YWx1ZXNbVUJvdW5kXSA9IGV4cGVjdDsKICBVQm91bmQrKzsKfQoKCmZ1bmN0aW9uIHRlc3QoKQp7CiAgZW50ZXJGdW5jKCd0ZXN0Jyk7CiAgcHJpbnRCdWdOdW1iZXIoYnVnKTsKICBwcmludFN0YXR1cyhzdW1tYXJ5KTsKCiAgZm9yICh2YXIgaT0wOyBpPFVCb3VuZDsgaSsrKQogIHsKICAgIHJlcG9ydENvbXBhcmUoZXhwZWN0ZWR2YWx1ZXNbaV0sIGFjdHVhbHZhbHVlc1tpXSwgc3RhdHVzaXRlbXNbaV0pOwogIH0KCiAgZXhpdEZ1bmMgKCd0ZXN0Jyk7Cn0K