gosling.js 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -187504,7 +187504,7 @@ function JsonDataFetcher(HGC, ...args) {
187504
187504
  JsonDataFetcher.config = {
187505
187505
  type: "json"
187506
187506
  };
187507
- var encodedJs$1 = "dmFyIF9fYWNjZXNzQ2hlY2sgPSAob2JqLCBtZW1iZXIsIG1zZykgPT4gewogIGlmICghbWVtYmVyLmhhcyhvYmopKQogICAgdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIiArIG1zZyk7Cn07CnZhciBfX3ByaXZhdGVHZXQgPSAob2JqLCBtZW1iZXIsIGdldHRlcikgPT4gewogIF9fYWNjZXNzQ2hlY2sob2JqLCBtZW1iZXIsICJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpOwogIHJldHVybiBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogbWVtYmVyLmdldChvYmopOwp9Owp2YXIgX19wcml2YXRlQWRkID0gKG9iaiwgbWVtYmVyLCB2YWx1ZSkgPT4gewogIGlmIChtZW1iZXIuaGFzKG9iaikpCiAgICB0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTsKICBtZW1iZXIgaW5zdGFuY2VvZiBXZWFrU2V0ID8gbWVtYmVyLmFkZChvYmopIDogbWVtYmVyLnNldChvYmosIHZhbHVlKTsKfTsKdmFyIF9fcHJpdmF0ZVNldCA9IChvYmosIG1lbWJlciwgdmFsdWUsIHNldHRlcikgPT4gewogIF9fYWNjZXNzQ2hlY2sob2JqLCBtZW1iZXIsICJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIik7CiAgc2V0dGVyID8gc2V0dGVyLmNhbGwob2JqLCB2YWx1ZSkgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUpOwogIHJldHVybiB2YWx1ZTsKfTsKdmFyIF9fcHJpdmF0ZU1ldGhvZCA9IChvYmosIG1lbWJlciwgbWV0aG9kKSA9PiB7CiAgX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpOwogIHJldHVybiBtZXRob2Q7Cn07CihmdW5jdGlvbihyZXF1aXJlJCQwMikgewogIHZhciBfdWlkLCBfbl9mZWF0dXJlcywgX2dldE51bWJlckZlYXR1cmVzLCBnZXROdW1iZXJGZWF0dXJlc19mbiwgX2dldExpbmVQcm9taXNlcywgZ2V0TGluZVByb21pc2VzX2ZuOwogICJ1c2Ugc3RyaWN0IjsKICBmdW5jdGlvbiBfaW50ZXJvcERlZmF1bHRMZWdhY3koZSkgewogICAgcmV0dXJuIGUgJiYgdHlwZW9mIGUgPT09ICJvYmplY3QiICYmICJkZWZhdWx0IiBpbiBlID8gZSA6IHsgImRlZmF1bHQiOiBlIH07CiAgfQogIHZhciByZXF1aXJlJCQwX19kZWZhdWx0ID0gLyogQF9fUFVSRV9fICovIF9pbnRlcm9wRGVmYXVsdExlZ2FjeShyZXF1aXJlJCQwMik7CiAgdmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDoge307CiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoeCkgewogICAgcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAiZGVmYXVsdCIpID8geFsiZGVmYXVsdCJdIDogeDsKICB9CiAgdmFyIGVzbSA9IHt9OwogIHZhciBBYm9ydGFibGVQcm9taXNlQ2FjaGUkMSA9IHt9OwogIHZhciBhYm9ydGNvbnRyb2xsZXJQb255ZmlsbCA9IHt9OwogIHZhciBjanNQb255ZmlsbCA9IHt9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjanNQb255ZmlsbCwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgcHJvcHMubGVuZ3RoOyBpMisrKSB7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaTJdOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikKICAgICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICBpZiAocHJvdG9Qcm9wcykKICAgICAgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykKICAgICAgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKQogICAgICBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KICBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgewogICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZjIobzIpIHsKICAgICAgcmV0dXJuIG8yLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YobzIpOwogICAgfTsKICAgIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7CiAgfQogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mMihvMiwgcDIpIHsKICAgICAgbzIuX19wcm90b19fID0gcDI7CiAgICAgIHJldHVybiBvMjsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KICBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgewogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAidW5kZWZpbmVkIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24oKSB7CiAgICAgIH0pKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmMikgewogICAgaWYgKHNlbGYyID09PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsKICAgIH0KICAgIHJldHVybiBzZWxmMjsKICB9CiAgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZjIsIGNhbGwpIHsKICAgIGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7CiAgICAgIHJldHVybiBjYWxsOwogICAgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTsKICAgIH0KICAgIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYyKTsKICB9CiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsKICAgIHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOwogICAgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgewogICAgICB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsKICAgICAgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsKICAgICAgICB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOwogICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQogICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHsKICAgIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7CiAgICAgIG9iamVjdCA9IF9nZXRQcm90b3R5cGVPZihvYmplY3QpOwogICAgICBpZiAob2JqZWN0ID09PSBudWxsKQogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIG9iamVjdDsKICB9CiAgZnVuY3Rpb24gX2dldCgpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5nZXQpIHsKICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0LmJpbmQoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0Mih0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikgewogICAgICAgIHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7CiAgICAgICAgaWYgKCFiYXNlKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGRlc2MuZ2V0KSB7CiAgICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbChhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IHJlY2VpdmVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlc2MudmFsdWU7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gX2dldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KICB2YXIgRW1pdHRlciQxID0gLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gRW1pdHRlcjIoKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbWl0dGVyMik7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAibGlzdGVuZXJzIiwgewogICAgICAgIHZhbHVlOiB7fSwKICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgICBfY3JlYXRlQ2xhc3MoRW1pdHRlcjIsIFt7CiAgICAgIGtleTogImFkZEV2ZW50TGlzdGVuZXIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgICAgIGlmICghKHR5cGUgaW4gdGhpcy5saXN0ZW5lcnMpKSB7CiAgICAgICAgICB0aGlzLmxpc3RlbmVyc1t0eXBlXSA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpc3RlbmVyc1t0eXBlXS5wdXNoKHsKICAgICAgICAgIGNhbGxiYWNrLAogICAgICAgICAgb3B0aW9ucwogICAgICAgIH0pOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlbW92ZUV2ZW50TGlzdGVuZXIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaykgewogICAgICAgIGlmICghKHR5cGUgaW4gdGhpcy5saXN0ZW5lcnMpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBzdGFjayA9IHRoaXMubGlzdGVuZXJzW3R5cGVdOwogICAgICAgIGZvciAodmFyIGkyID0gMCwgbCA9IHN0YWNrLmxlbmd0aDsgaTIgPCBsOyBpMisrKSB7CiAgICAgICAgICBpZiAoc3RhY2tbaTJdLmNhbGxiYWNrID09PSBjYWxsYmFjaykgewogICAgICAgICAgICBzdGFjay5zcGxpY2UoaTIsIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImRpc3BhdGNoRXZlbnQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChldmVudCkgewogICAgICAgIGlmICghKGV2ZW50LnR5cGUgaW4gdGhpcy5saXN0ZW5lcnMpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBzdGFjayA9IHRoaXMubGlzdGVuZXJzW2V2ZW50LnR5cGVdOwogICAgICAgIHZhciBzdGFja1RvQ2FsbCA9IHN0YWNrLnNsaWNlKCk7CiAgICAgICAgZm9yICh2YXIgaTIgPSAwLCBsID0gc3RhY2tUb0NhbGwubGVuZ3RoOyBpMiA8IGw7IGkyKyspIHsKICAgICAgICAgIHZhciBsaXN0ZW5lciA9IHN0YWNrVG9DYWxsW2kyXTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxpc3RlbmVyLm9wdGlvbnMgJiYgbGlzdGVuZXIub3B0aW9ucy5vbmNlKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBsaXN0ZW5lci5jYWxsYmFjayk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZDsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIEVtaXR0ZXIyOwogIH0oKTsKICB2YXIgQWJvcnRTaWduYWwkMSA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbihfRW1pdHRlcikgewogICAgX2luaGVyaXRzKEFib3J0U2lnbmFsMiwgX0VtaXR0ZXIpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBYm9ydFNpZ25hbDIpOwogICAgZnVuY3Rpb24gQWJvcnRTaWduYWwyKCkgewogICAgICB2YXIgX3RoaXM7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBYm9ydFNpZ25hbDIpOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpOwogICAgICBpZiAoIV90aGlzLmxpc3RlbmVycykgewogICAgICAgIEVtaXR0ZXIkMS5jYWxsKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJhYm9ydGVkIiwgewogICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgIm9uYWJvcnQiLCB7CiAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJyZWFzb24iLCB7CiAgICAgICAgdmFsdWU6IHZvaWQgMCwKICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhBYm9ydFNpZ25hbDIsIFt7CiAgICAgIGtleTogInRvU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nMigpIHsKICAgICAgICByZXR1cm4gIltvYmplY3QgQWJvcnRTaWduYWxdIjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJkaXNwYXRjaEV2ZW50IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsKICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gImFib3J0IikgewogICAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vbmFib3J0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHRoaXMub25hYm9ydC5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoQWJvcnRTaWduYWwyLnByb3RvdHlwZSksICJkaXNwYXRjaEV2ZW50IiwgdGhpcykuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBBYm9ydFNpZ25hbDI7CiAgfShFbWl0dGVyJDEpOwogIHZhciBBYm9ydENvbnRyb2xsZXIkMSA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIEFib3J0Q29udHJvbGxlcjIoKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBYm9ydENvbnRyb2xsZXIyKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJzaWduYWwiLCB7CiAgICAgICAgdmFsdWU6IG5ldyBBYm9ydFNpZ25hbCQxKCksCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogICAgX2NyZWF0ZUNsYXNzKEFib3J0Q29udHJvbGxlcjIsIFt7CiAgICAgIGtleTogImFib3J0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0KHJlYXNvbikgewogICAgICAgIHZhciBldmVudDsKICAgICAgICB0cnkgewogICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoImFib3J0Iik7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5jcmVhdGVFdmVudCkgewogICAgICAgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTsKICAgICAgICAgICAgICBldmVudC50eXBlID0gImFib3J0IjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICAgICAgICAgIGV2ZW50LmluaXRFdmVudCgiYWJvcnQiLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBldmVudCA9IHsKICAgICAgICAgICAgICB0eXBlOiAiYWJvcnQiLAogICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLAogICAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBzaWduYWxSZWFzb24gPSByZWFzb247CiAgICAgICAgaWYgKHNpZ25hbFJlYXNvbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICBzaWduYWxSZWFzb24gPSBuZXcgRXJyb3IoIlRoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkIik7CiAgICAgICAgICAgIHNpZ25hbFJlYXNvbi5uYW1lID0gIkFib3J0RXJyb3IiOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBzaWduYWxSZWFzb24gPSBuZXcgRE9NRXhjZXB0aW9uKCJzaWduYWwgaXMgYWJvcnRlZCB3aXRob3V0IHJlYXNvbiIpOwogICAgICAgICAgICB9IGNhdGNoIChlcnIyKSB7CiAgICAgICAgICAgICAgc2lnbmFsUmVhc29uID0gbmV3IEVycm9yKCJUaGlzIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCIpOwogICAgICAgICAgICAgIHNpZ25hbFJlYXNvbi5uYW1lID0gIkFib3J0RXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiA9IHNpZ25hbFJlYXNvbjsKICAgICAgICB0aGlzLnNpZ25hbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0b1N0cmluZyIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZzIoKSB7CiAgICAgICAgcmV0dXJuICJbb2JqZWN0IEFib3J0Q29udHJvbGxlcl0iOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gQWJvcnRDb250cm9sbGVyMjsKICB9KCk7CiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIFN5bWJvbC50b1N0cmluZ1RhZykgewogICAgQWJvcnRDb250cm9sbGVyJDEucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAiQWJvcnRDb250cm9sbGVyIjsKICAgIEFib3J0U2lnbmFsJDEucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAiQWJvcnRTaWduYWwiOwogIH0KICBmdW5jdGlvbiBwb2x5ZmlsbE5lZWRlZChzZWxmMikgewogICAgaWYgKHNlbGYyLl9fRk9SQ0VfSU5TVEFMTF9BQk9SVENPTlRST0xMRVJfUE9MWUZJTEwpIHsKICAgICAgY29uc29sZS5sb2coIl9fRk9SQ0VfSU5TVEFMTF9BQk9SVENPTlRST0xMRVJfUE9MWUZJTEw9dHJ1ZSBpcyBzZXQsIHdpbGwgZm9yY2UgaW5zdGFsbCBwb2x5ZmlsbCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0eXBlb2Ygc2VsZjIuUmVxdWVzdCA9PT0gImZ1bmN0aW9uIiAmJiAhc2VsZjIuUmVxdWVzdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoInNpZ25hbCIpIHx8ICFzZWxmMi5BYm9ydENvbnRyb2xsZXI7CiAgfQogIGZ1bmN0aW9uIGFib3J0YWJsZUZldGNoRGVjb3JhdG9yKHBhdGNoVGFyZ2V0cykgewogICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBwYXRjaFRhcmdldHMpIHsKICAgICAgcGF0Y2hUYXJnZXRzID0gewogICAgICAgIGZldGNoOiBwYXRjaFRhcmdldHMKICAgICAgfTsKICAgIH0KICAgIHZhciBfcGF0Y2hUYXJnZXRzID0gcGF0Y2hUYXJnZXRzLCBmZXRjaCA9IF9wYXRjaFRhcmdldHMuZmV0Y2gsIF9wYXRjaFRhcmdldHMkUmVxdWVzdCA9IF9wYXRjaFRhcmdldHMuUmVxdWVzdCwgTmF0aXZlUmVxdWVzdCA9IF9wYXRjaFRhcmdldHMkUmVxdWVzdCA9PT0gdm9pZCAwID8gZmV0Y2guUmVxdWVzdCA6IF9wYXRjaFRhcmdldHMkUmVxdWVzdCwgTmF0aXZlQWJvcnRDb250cm9sbGVyID0gX3BhdGNoVGFyZ2V0cy5BYm9ydENvbnRyb2xsZXIsIF9wYXRjaFRhcmdldHMkX19GT1JDRSA9IF9wYXRjaFRhcmdldHMuX19GT1JDRV9JTlNUQUxMX0FCT1JUQ09OVFJPTExFUl9QT0xZRklMTCwgX19GT1JDRV9JTlNUQUxMX0FCT1JUQ09OVFJPTExFUl9QT0xZRklMTCA9IF9wYXRjaFRhcmdldHMkX19GT1JDRSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcGF0Y2hUYXJnZXRzJF9fRk9SQ0U7CiAgICBpZiAoIXBvbHlmaWxsTmVlZGVkKHsKICAgICAgZmV0Y2gsCiAgICAgIFJlcXVlc3Q6IE5hdGl2ZVJlcXVlc3QsCiAgICAgIEFib3J0Q29udHJvbGxlcjogTmF0aXZlQWJvcnRDb250cm9sbGVyLAogICAgICBfX0ZPUkNFX0lOU1RBTExfQUJPUlRDT05UUk9MTEVSX1BPTFlGSUxMCiAgICB9KSkgewogICAgICByZXR1cm4gewogICAgICAgIGZldGNoLAogICAgICAgIFJlcXVlc3QKICAgICAgfTsKICAgIH0KICAgIHZhciBSZXF1ZXN0ID0gTmF0aXZlUmVxdWVzdDsKICAgIGlmIChSZXF1ZXN0ICYmICFSZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgic2lnbmFsIikgfHwgX19GT1JDRV9JTlNUQUxMX0FCT1JUQ09OVFJPTExFUl9QT0xZRklMTCkgewogICAgICBSZXF1ZXN0ID0gZnVuY3Rpb24gUmVxdWVzdDIoaW5wdXQsIGluaXQyKSB7CiAgICAgICAgdmFyIHNpZ25hbDsKICAgICAgICBpZiAoaW5pdDIgJiYgaW5pdDIuc2lnbmFsKSB7CiAgICAgICAgICBzaWduYWwgPSBpbml0Mi5zaWduYWw7CiAgICAgICAgICBkZWxldGUgaW5pdDIuc2lnbmFsOwogICAgICAgIH0KICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBOYXRpdmVSZXF1ZXN0KGlucHV0LCBpbml0Mik7CiAgICAgICAgaWYgKHNpZ25hbCkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVlc3QsICJzaWduYWwiLCB7CiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHNpZ25hbAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXF1ZXN0OwogICAgICB9OwogICAgICBSZXF1ZXN0LnByb3RvdHlwZSA9IE5hdGl2ZVJlcXVlc3QucHJvdG90eXBlOwogICAgfQogICAgdmFyIHJlYWxGZXRjaCA9IGZldGNoOwogICAgdmFyIGFib3J0YWJsZUZldGNoID0gZnVuY3Rpb24gYWJvcnRhYmxlRmV0Y2gyKGlucHV0LCBpbml0MikgewogICAgICB2YXIgc2lnbmFsID0gUmVxdWVzdCAmJiBSZXF1ZXN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGlucHV0KSA/IGlucHV0LnNpZ25hbCA6IGluaXQyID8gaW5pdDIuc2lnbmFsIDogdm9pZCAwOwogICAgICBpZiAoc2lnbmFsKSB7CiAgICAgICAgdmFyIGFib3J0RXJyb3I7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGFib3J0RXJyb3IgPSBuZXcgRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwgIkFib3J0RXJyb3IiKTsKICAgICAgICB9IGNhdGNoIChlcnIyKSB7CiAgICAgICAgICBhYm9ydEVycm9yID0gbmV3IEVycm9yKCJBYm9ydGVkIik7CiAgICAgICAgICBhYm9ydEVycm9yLm5hbWUgPSAiQWJvcnRFcnJvciI7CiAgICAgICAgfQogICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGFib3J0RXJyb3IpOwogICAgICAgIH0KICAgICAgICB2YXIgY2FuY2VsbGF0aW9uID0gbmV3IFByb21pc2UoZnVuY3Rpb24oXywgcmVqZWN0KSB7CiAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHJlamVjdChhYm9ydEVycm9yKTsKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgb25jZTogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGluaXQyICYmIGluaXQyLnNpZ25hbCkgewogICAgICAgICAgZGVsZXRlIGluaXQyLnNpZ25hbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbY2FuY2VsbGF0aW9uLCByZWFsRmV0Y2goaW5wdXQsIGluaXQyKV0pOwogICAgICB9CiAgICAgIHJldHVybiByZWFsRmV0Y2goaW5wdXQsIGluaXQyKTsKICAgIH07CiAgICByZXR1cm4gewogICAgICBmZXRjaDogYWJvcnRhYmxlRmV0Y2gsCiAgICAgIFJlcXVlc3QKICAgIH07CiAgfQogIGNqc1BvbnlmaWxsLkFib3J0Q29udHJvbGxlciA9IEFib3J0Q29udHJvbGxlciQxOwogIGNqc1BvbnlmaWxsLkFib3J0U2lnbmFsID0gQWJvcnRTaWduYWwkMTsKICBjanNQb255ZmlsbC5hYm9ydGFibGVGZXRjaCA9IGFib3J0YWJsZUZldGNoRGVjb3JhdG9yOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhYm9ydGNvbnRyb2xsZXJQb255ZmlsbCwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIGFib3J0Y29udHJvbGxlclBvbnlmaWxsLkFib3J0U2lnbmFsID0gYWJvcnRjb250cm9sbGVyUG9ueWZpbGwuQWJvcnRDb250cm9sbGVyID0gdm9pZCAwOwogIGNvbnN0IGNqc19wb255ZmlsbF8xID0gY2pzUG9ueWZpbGw7CiAgdmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gc2VsZjsKICAgIH0KICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gd2luZG93OwogICAgfQogICAgaWYgKHR5cGVvZiBjb21tb25qc0dsb2JhbCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIGNvbW1vbmpzR2xvYmFsOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCJ1bmFibGUgdG8gbG9jYXRlIGdsb2JhbCBvYmplY3QiKTsKICB9OwogIGxldCBBYm9ydENvbnRyb2xsZXIgPSB0eXBlb2YgZ2V0R2xvYmFsKCkuQWJvcnRDb250cm9sbGVyID09PSAidW5kZWZpbmVkIiA/IGNqc19wb255ZmlsbF8xLkFib3J0Q29udHJvbGxlciA6IGdldEdsb2JhbCgpLkFib3J0Q29udHJvbGxlcjsKICBhYm9ydGNvbnRyb2xsZXJQb255ZmlsbC5BYm9ydENvbnRyb2xsZXIgPSBBYm9ydENvbnRyb2xsZXI7CiAgbGV0IEFib3J0U2lnbmFsID0gdHlwZW9mIGdldEdsb2JhbCgpLkFib3J0Q29udHJvbGxlciA9PT0gInVuZGVmaW5lZCIgPyBjanNfcG9ueWZpbGxfMS5BYm9ydFNpZ25hbCA6IGdldEdsb2JhbCgpLkFib3J0U2lnbmFsOwogIGFib3J0Y29udHJvbGxlclBvbnlmaWxsLkFib3J0U2lnbmFsID0gQWJvcnRTaWduYWw7CiAgdmFyIEFnZ3JlZ2F0ZUFib3J0Q29udHJvbGxlciQxID0ge307CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFnZ3JlZ2F0ZUFib3J0Q29udHJvbGxlciQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgY29uc3QgYWJvcnRjb250cm9sbGVyX3BvbnlmaWxsXzEkMSA9IGFib3J0Y29udHJvbGxlclBvbnlmaWxsOwogIGNsYXNzIE51bGxTaWduYWwgewogIH0KICBjbGFzcyBBZ2dyZWdhdGVBYm9ydENvbnRyb2xsZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHRoaXMuc2lnbmFscyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IGFib3J0Y29udHJvbGxlcl9wb255ZmlsbF8xJDEuQWJvcnRDb250cm9sbGVyKCk7CiAgICB9CiAgICBhZGRTaWduYWwoc2lnbmFsID0gbmV3IE51bGxTaWduYWwoKSkgewogICAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiY2Fubm90IGFkZCBhIHNpZ25hbCwgYWxyZWFkeSBhYm9ydGVkISIpOwogICAgICB9CiAgICAgIHRoaXMuc2lnbmFscy5hZGQoc2lnbmFsKTsKICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7CiAgICAgICAgdGhpcy5oYW5kbGVBYm9ydGVkKHNpZ25hbCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgKCkgPT4gewogICAgICAgICAgdGhpcy5oYW5kbGVBYm9ydGVkKHNpZ25hbCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUFib3J0ZWQoc2lnbmFsKSB7CiAgICAgIHRoaXMuc2lnbmFscy5kZWxldGUoc2lnbmFsKTsKICAgICAgaWYgKHRoaXMuc2lnbmFscy5zaXplID09PSAwKSB7CiAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgfQogICAgfQogICAgZ2V0IHNpZ25hbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuYWJvcnRDb250cm9sbGVyLnNpZ25hbDsKICAgIH0KICAgIGFib3J0KCkgewogICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgfQogIH0KICBBZ2dyZWdhdGVBYm9ydENvbnRyb2xsZXIkMS5kZWZhdWx0ID0gQWdncmVnYXRlQWJvcnRDb250cm9sbGVyOwogIHZhciBBZ2dyZWdhdGVTdGF0dXNSZXBvcnRlciQxID0ge307CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFnZ3JlZ2F0ZVN0YXR1c1JlcG9ydGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICBjbGFzcyBBZ2dyZWdhdGVTdGF0dXNSZXBvcnRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5jYWxsYmFja3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgfQogICAgYWRkQ2FsbGJhY2soY2FsbGJhY2sgPSAoKSA9PiB7CiAgICB9KSB7CiAgICAgIHRoaXMuY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgIGNhbGxiYWNrKHRoaXMuY3VycmVudE1lc3NhZ2UpOwogICAgfQogICAgY2FsbGJhY2sobWVzc2FnZSkgewogICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlID0gbWVzc2FnZTsKICAgICAgdGhpcy5jYWxsYmFja3MuZm9yRWFjaCgoZWx0KSA9PiB7CiAgICAgICAgZWx0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgIH0KICB9CiAgQWdncmVnYXRlU3RhdHVzUmVwb3J0ZXIkMS5kZWZhdWx0ID0gQWdncmVnYXRlU3RhdHVzUmVwb3J0ZXI7CiAgdmFyIF9faW1wb3J0RGVmYXVsdCQxID0gY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19pbXBvcnREZWZhdWx0IHx8IGZ1bmN0aW9uKG1vZCkgewogICAgcmV0dXJuIG1vZCAmJiBtb2QuX19lc01vZHVsZSA/IG1vZCA6IHsgImRlZmF1bHQiOiBtb2QgfTsKICB9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYm9ydGFibGVQcm9taXNlQ2FjaGUkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIGNvbnN0IGFib3J0Y29udHJvbGxlcl9wb255ZmlsbF8xID0gYWJvcnRjb250cm9sbGVyUG9ueWZpbGw7CiAgY29uc3QgQWdncmVnYXRlQWJvcnRDb250cm9sbGVyXzEgPSBfX2ltcG9ydERlZmF1bHQkMShBZ2dyZWdhdGVBYm9ydENvbnRyb2xsZXIkMSk7CiAgY29uc3QgQWdncmVnYXRlU3RhdHVzUmVwb3J0ZXJfMSA9IF9faW1wb3J0RGVmYXVsdCQxKEFnZ3JlZ2F0ZVN0YXR1c1JlcG9ydGVyJDEpOwogIGNsYXNzIEFib3J0YWJsZVByb21pc2VDYWNoZSB7CiAgICBjb25zdHJ1Y3Rvcih7IGZpbGwsIGNhY2hlIH0pIHsKICAgICAgaWYgKHR5cGVvZiBmaWxsICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigibXVzdCBwYXNzIGEgZmlsbCBmdW5jdGlvbiIpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgY2FjaGUgIT09ICJvYmplY3QiKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigibXVzdCBwYXNzIGEgY2FjaGUgb2JqZWN0Iik7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBjYWNoZS5nZXQgIT09ICJmdW5jdGlvbiIgfHwgdHlwZW9mIGNhY2hlLnNldCAhPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgY2FjaGUuZGVsZXRlICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FjaGUgbXVzdCBpbXBsZW1lbnQgZ2V0KGtleSksIHNldChrZXksIHZhbCksIGFuZCBhbmQgZGVsZXRlKGtleSkiKTsKICAgICAgfQogICAgICB0aGlzLmNhY2hlID0gY2FjaGU7CiAgICAgIHRoaXMuZmlsbENhbGxiYWNrID0gZmlsbDsKICAgIH0KICAgIHN0YXRpYyBpc0Fib3J0RXhjZXB0aW9uKGV4Y2VwdGlvbikgewogICAgICByZXR1cm4gZXhjZXB0aW9uLm5hbWUgPT09ICJBYm9ydEVycm9yIiB8fCBleGNlcHRpb24uY29kZSA9PT0gIkVSUl9BQk9SVEVEIiB8fCBleGNlcHRpb24ubWVzc2FnZSA9PT0gIkFib3J0RXJyb3I6IGFib3J0ZWQiIHx8IGV4Y2VwdGlvbi5tZXNzYWdlID09PSAiRXJyb3I6IGFib3J0ZWQiOwogICAgfQogICAgZXZpY3Qoa2V5LCBlbnRyeSkgewogICAgICBpZiAodGhpcy5jYWNoZS5nZXQoa2V5KSA9PT0gZW50cnkpIHsKICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpOwogICAgICB9CiAgICB9CiAgICBmaWxsKGtleSwgZGF0YSwgc2lnbmFsLCBzdGF0dXNDYWxsYmFjaykgewogICAgICBjb25zdCBhYm9ydGVyID0gbmV3IEFnZ3JlZ2F0ZUFib3J0Q29udHJvbGxlcl8xLmRlZmF1bHQoKTsKICAgICAgY29uc3Qgc3RhdHVzUmVwb3J0ZXIgPSBuZXcgQWdncmVnYXRlU3RhdHVzUmVwb3J0ZXJfMS5kZWZhdWx0KCk7CiAgICAgIHN0YXR1c1JlcG9ydGVyLmFkZENhbGxiYWNrKHN0YXR1c0NhbGxiYWNrKTsKICAgICAgY29uc3QgbmV3RW50cnkgPSB7CiAgICAgICAgYWJvcnRlciwKICAgICAgICBwcm9taXNlOiB0aGlzLmZpbGxDYWxsYmFjayhkYXRhLCBhYm9ydGVyLnNpZ25hbCwgKG1lc3NhZ2UpID0+IHsKICAgICAgICAgIHN0YXR1c1JlcG9ydGVyLmNhbGxiYWNrKG1lc3NhZ2UpOwogICAgICAgIH0pLAogICAgICAgIHNldHRsZWQ6IGZhbHNlLAogICAgICAgIHN0YXR1c1JlcG9ydGVyLAogICAgICAgIGdldCBhYm9ydGVkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuYWJvcnRlci5zaWduYWwuYWJvcnRlZDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIG5ld0VudHJ5LmFib3J0ZXIuYWRkU2lnbmFsKHNpZ25hbCk7CiAgICAgIG5ld0VudHJ5LmFib3J0ZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgKCkgPT4gewogICAgICAgIGlmICghbmV3RW50cnkuc2V0dGxlZCkgewogICAgICAgICAgdGhpcy5ldmljdChrZXksIG5ld0VudHJ5KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBuZXdFbnRyeS5wcm9taXNlLnRoZW4oKCkgPT4gewogICAgICAgIG5ld0VudHJ5LnNldHRsZWQgPSB0cnVlOwogICAgICB9LCAoKSA9PiB7CiAgICAgICAgbmV3RW50cnkuc2V0dGxlZCA9IHRydWU7CiAgICAgICAgdGhpcy5ldmljdChrZXksIG5ld0VudHJ5KTsKICAgICAgfSkuY2F0Y2goKGUpID0+IHsKICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgICB0aGlzLmNhY2hlLnNldChrZXksIG5ld0VudHJ5KTsKICAgIH0KICAgIHN0YXRpYyBjaGVja1NpbmdsZVByb21pc2UocHJvbWlzZSwgc2lnbmFsKSB7CiAgICAgIGZ1bmN0aW9uIGNoZWNrRm9yU2luZ2xlQWJvcnQoKSB7CiAgICAgICAgaWYgKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkgewogICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoImFib3J0ZWQiKSwgeyBjb2RlOiAiRVJSX0FCT1JURUQiIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHsKICAgICAgICBjaGVja0ZvclNpbmdsZUFib3J0KCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSwgKGVycm9yKSA9PiB7CiAgICAgICAgY2hlY2tGb3JTaW5nbGVBYm9ydCgpOwogICAgICAgIHRocm93IGVycm9yOwogICAgICB9KTsKICAgIH0KICAgIGhhcyhrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGtleSk7CiAgICB9CiAgICBnZXQoa2V5LCBkYXRhLCBzaWduYWwsIHN0YXR1c0NhbGxiYWNrKSB7CiAgICAgIGlmICghc2lnbmFsICYmIGRhdGEgaW5zdGFuY2VvZiBhYm9ydGNvbnRyb2xsZXJfcG9ueWZpbGxfMS5BYm9ydFNpZ25hbCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInNlY29uZCBnZXQgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhbiBBYm9ydFNpZ25hbCwgcGVyaGFwcyB5b3UgbWVhbnQgdG8gcGFzcyBgbnVsbGAgZm9yIHRoZSBmaWxsIGRhdGE/Iik7CiAgICAgIH0KICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7CiAgICAgIGlmIChjYWNoZUVudHJ5KSB7CiAgICAgICAgaWYgKGNhY2hlRW50cnkuYWJvcnRlZCAmJiAhY2FjaGVFbnRyeS5zZXR0bGVkKSB7CiAgICAgICAgICB0aGlzLmV2aWN0KGtleSwgY2FjaGVFbnRyeSk7CiAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoa2V5LCBkYXRhLCBzaWduYWwsIHN0YXR1c0NhbGxiYWNrKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhY2hlRW50cnkuc2V0dGxlZCkgewogICAgICAgICAgcmV0dXJuIGNhY2hlRW50cnkucHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgY2FjaGVFbnRyeS5hYm9ydGVyLmFkZFNpZ25hbChzaWduYWwpOwogICAgICAgIGNhY2hlRW50cnkuc3RhdHVzUmVwb3J0ZXIuYWRkQ2FsbGJhY2soc3RhdHVzQ2FsbGJhY2spOwogICAgICAgIHJldHVybiBBYm9ydGFibGVQcm9taXNlQ2FjaGUuY2hlY2tTaW5nbGVQcm9taXNlKGNhY2hlRW50cnkucHJvbWlzZSwgc2lnbmFsKTsKICAgICAgfQogICAgICB0aGlzLmZpbGwoa2V5LCBkYXRhLCBzaWduYWwsIHN0YXR1c0NhbGxiYWNrKTsKICAgICAgcmV0dXJuIEFib3J0YWJsZVByb21pc2VDYWNoZS5jaGVja1NpbmdsZVByb21pc2UoCiAgICAgICAgdGhpcy5jYWNoZS5nZXQoa2V5KS5wcm9taXNlLAogICAgICAgIHNpZ25hbAogICAgICApOwogICAgfQogICAgZGVsZXRlKGtleSkgewogICAgICBjb25zdCBjYWNoZWRFbnRyeSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7CiAgICAgIGlmIChjYWNoZWRFbnRyeSkgewogICAgICAgIGlmICghY2FjaGVkRW50cnkuc2V0dGxlZCkgewogICAgICAgICAgY2FjaGVkRW50cnkuYWJvcnRlci5hYm9ydCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpOwogICAgICB9CiAgICB9CiAgICBjbGVhcigpIHsKICAgICAgY29uc3Qga2V5SXRlciA9IHRoaXMuY2FjaGUua2V5cygpOwogICAgICBsZXQgZGVsZXRlQ291bnQgPSAwOwogICAgICBmb3IgKGxldCByZXN1bHQgPSBrZXlJdGVyLm5leHQoKTsgIXJlc3VsdC5kb25lOyByZXN1bHQgPSBrZXlJdGVyLm5leHQoKSkgewogICAgICAgIHRoaXMuZGVsZXRlKHJlc3VsdC52YWx1ZSk7CiAgICAgICAgZGVsZXRlQ291bnQgKz0gMTsKICAgICAgfQogICAgICByZXR1cm4gZGVsZXRlQ291bnQ7CiAgICB9CiAgfQogIEFib3J0YWJsZVByb21pc2VDYWNoZSQxLmRlZmF1bHQgPSBBYm9ydGFibGVQcm9taXNlQ2FjaGU7CiAgdmFyIF9faW1wb3J0RGVmYXVsdCA9IGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9faW1wb3J0RGVmYXVsdCB8fCBmdW5jdGlvbihtb2QpIHsKICAgIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7ICJkZWZhdWx0IjogbW9kIH07CiAgfTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXNtLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgY29uc3QgQWJvcnRhYmxlUHJvbWlzZUNhY2hlXzEgPSBfX2ltcG9ydERlZmF1bHQoQWJvcnRhYmxlUHJvbWlzZUNhY2hlJDEpOwogIHZhciBfZGVmYXVsdCA9IGVzbS5kZWZhdWx0ID0gQWJvcnRhYmxlUHJvbWlzZUNhY2hlXzEuZGVmYXVsdDsKICBjbGFzcyBRdWlja0xSVSB7CiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgICAgaWYgKCEob3B0aW9ucy5tYXhTaXplICYmIG9wdGlvbnMubWF4U2l6ZSA+IDApKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYG1heFNpemVgIG11c3QgYmUgYSBudW1iZXIgZ3JlYXRlciB0aGFuIDAiKTsKICAgICAgfQogICAgICB0aGlzLm1heFNpemUgPSBvcHRpb25zLm1heFNpemU7CiAgICAgIHRoaXMuY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0aGlzLm9sZENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgdGhpcy5fc2l6ZSA9IDA7CiAgICB9CiAgICBfc2V0KGtleSwgdmFsdWUpIHsKICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgIHRoaXMuX3NpemUrKzsKICAgICAgaWYgKHRoaXMuX3NpemUgPj0gdGhpcy5tYXhTaXplKSB7CiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7CiAgICAgICAgdGhpcy5vbGRDYWNoZSA9IHRoaXMuY2FjaGU7CiAgICAgICAgdGhpcy5jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIH0KICAgIH0KICAgIGdldChrZXkpIHsKICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKGtleSkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTsKICAgICAgfQogICAgICBpZiAodGhpcy5vbGRDYWNoZS5oYXMoa2V5KSkgewogICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5vbGRDYWNoZS5nZXQoa2V5KTsKICAgICAgICB0aGlzLm9sZENhY2hlLmRlbGV0ZShrZXkpOwogICAgICAgIHRoaXMuX3NldChrZXksIHZhbHVlKTsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHNldChrZXksIHZhbHVlKSB7CiAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7CiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fc2V0KGtleSwgdmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaGFzKGtleSkgewogICAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoa2V5KSB8fCB0aGlzLm9sZENhY2hlLmhhcyhrZXkpOwogICAgfQogICAgcGVlayhrZXkpIHsKICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKGtleSkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTsKICAgICAgfQogICAgICBpZiAodGhpcy5vbGRDYWNoZS5oYXMoa2V5KSkgewogICAgICAgIHJldHVybiB0aGlzLm9sZENhY2hlLmdldChrZXkpOwogICAgICB9CiAgICB9CiAgICBkZWxldGUoa2V5KSB7CiAgICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpOwogICAgICBpZiAoZGVsZXRlZCkgewogICAgICAgIHRoaXMuX3NpemUtLTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5vbGRDYWNoZS5kZWxldGUoa2V5KSB8fCBkZWxldGVkOwogICAgfQogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMuY2FjaGUuY2xlYXIoKTsKICAgICAgdGhpcy5vbGRDYWNoZS5jbGVhcigpOwogICAgICB0aGlzLl9zaXplID0gMDsKICAgIH0KICAgICprZXlzKCkgewogICAgICBmb3IgKGNvbnN0IFtrZXldIG9mIHRoaXMpIHsKICAgICAgICB5aWVsZCBrZXk7CiAgICAgIH0KICAgIH0KICAgICp2YWx1ZXMoKSB7CiAgICAgIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIHRoaXMpIHsKICAgICAgICB5aWVsZCB2YWx1ZTsKICAgICAgfQogICAgfQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jYWNoZSkgewogICAgICAgIHlpZWxkIGl0ZW07CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMub2xkQ2FjaGUpIHsKICAgICAgICBjb25zdCBba2V5XSA9IGl0ZW07CiAgICAgICAgaWYgKCF0aGlzLmNhY2hlLmhhcyhrZXkpKSB7CiAgICAgICAgICB5aWVsZCBpdGVtOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0IHNpemUoKSB7CiAgICAgIGxldCBvbGRDYWNoZVNpemUgPSAwOwogICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm9sZENhY2hlLmtleXMoKSkgewogICAgICAgIGlmICghdGhpcy5jYWNoZS5oYXMoa2V5KSkgewogICAgICAgICAgb2xkQ2FjaGVTaXplKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9zaXplICsgb2xkQ2FjaGVTaXplOwogICAgfQogIH0KICB2YXIgcXVpY2tMcnUgPSBRdWlja0xSVTsKICB2YXIgYnVmZmVyID0ge307CiAgdmFyIGJhc2U2NEpzID0ge307CiAgYmFzZTY0SnMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgYmFzZTY0SnMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheTsKICBiYXNlNjRKcy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheTsKICB2YXIgbG9va3VwID0gW107CiAgdmFyIHJldkxvb2t1cCA9IFtdOwogIHZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gInVuZGVmaW5lZCIgPyBVaW50OEFycmF5IDogQXJyYXk7CiAgdmFyIGNvZGUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgIGxvb2t1cFtpXSA9IGNvZGVbaV07CiAgICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgfQogIHJldkxvb2t1cFsiLSIuY2hhckNvZGVBdCgwKV0gPSA2MjsKICByZXZMb29rdXBbIl8iLmNoYXJDb2RlQXQoMCldID0gNjM7CiAgZnVuY3Rpb24gZ2V0TGVucyhiNjQpIHsKICAgIHZhciBsZW4yID0gYjY0Lmxlbmd0aDsKICAgIGlmIChsZW4yICUgNCA+IDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7CiAgICB9CiAgICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZigiPSIpOwogICAgaWYgKHZhbGlkTGVuID09PSAtMSkKICAgICAgdmFsaWRMZW4gPSBsZW4yOwogICAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW4yID8gMCA6IDQgLSB2YWxpZExlbiAlIDQ7CiAgICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dOwogIH0KICBmdW5jdGlvbiBieXRlTGVuZ3RoKGI2NCkgewogICAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NCk7CiAgICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdOwogICAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07CiAgICByZXR1cm4gKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzTGVuOwogIH0KICBmdW5jdGlvbiBfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHsKICAgIHJldHVybiAodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQgLSBwbGFjZUhvbGRlcnNMZW47CiAgfQogIGZ1bmN0aW9uIHRvQnl0ZUFycmF5KGI2NCkgewogICAgdmFyIHRtcDsKICAgIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpOwogICAgdmFyIHZhbGlkTGVuID0gbGVuc1swXTsKICAgIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdOwogICAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSk7CiAgICB2YXIgY3VyQnl0ZSA9IDA7CiAgICB2YXIgbGVuMiA9IHBsYWNlSG9sZGVyc0xlbiA+IDAgPyB2YWxpZExlbiAtIDQgOiB2YWxpZExlbjsKICAgIHZhciBpMjsKICAgIGZvciAoaTIgPSAwOyBpMiA8IGxlbjI7IGkyICs9IDQpIHsKICAgICAgdG1wID0gcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkyKV0gPDwgMTggfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIgKyAxKV0gPDwgMTIgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIgKyAyKV0gPDwgNiB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpMiArIDMpXTsKICAgICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gMTYgJiAyNTU7CiAgICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDggJiAyNTU7CiAgICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMjU1OwogICAgfQogICAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikgewogICAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIpXSA8PCAyIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkyICsgMSldID4+IDQ7CiAgICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMjU1OwogICAgfQogICAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkgewogICAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIpXSA8PCAxMCB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpMiArIDEpXSA8PCA0IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkyICsgMildID4+IDI7CiAgICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDggJiAyNTU7CiAgICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMjU1OwogICAgfQogICAgcmV0dXJuIGFycjsKICB9CiAgZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0KG51bSkgewogICAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiA2M10gKyBsb29rdXBbbnVtID4+IDEyICYgNjNdICsgbG9va3VwW251bSA+PiA2ICYgNjNdICsgbG9va3VwW251bSAmIDYzXTsKICB9CiAgZnVuY3Rpb24gZW5jb2RlQ2h1bmsodWludDgsIHN0YXJ0LCBlbmQpIHsKICAgIHZhciB0bXA7CiAgICB2YXIgb3V0cHV0ID0gW107CiAgICBmb3IgKHZhciBpMiA9IHN0YXJ0OyBpMiA8IGVuZDsgaTIgKz0gMykgewogICAgICB0bXAgPSAodWludDhbaTJdIDw8IDE2ICYgMTY3MTE2ODApICsgKHVpbnQ4W2kyICsgMV0gPDwgOCAmIDY1MjgwKSArICh1aW50OFtpMiArIDJdICYgMjU1KTsKICAgICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpOwogICAgfQogICAgcmV0dXJuIG91dHB1dC5qb2luKCIiKTsKICB9CiAgZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSh1aW50OCkgewogICAgdmFyIHRtcDsKICAgIHZhciBsZW4yID0gdWludDgubGVuZ3RoOwogICAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4yICUgMzsKICAgIHZhciBwYXJ0cyA9IFtdOwogICAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7CiAgICBmb3IgKHZhciBpMiA9IDAsIGxlbjIyID0gbGVuMiAtIGV4dHJhQnl0ZXM7IGkyIDwgbGVuMjI7IGkyICs9IG1heENodW5rTGVuZ3RoKSB7CiAgICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGkyLCBpMiArIG1heENodW5rTGVuZ3RoID4gbGVuMjIgPyBsZW4yMiA6IGkyICsgbWF4Q2h1bmtMZW5ndGgpKTsKICAgIH0KICAgIGlmIChleHRyYUJ5dGVzID09PSAxKSB7CiAgICAgIHRtcCA9IHVpbnQ4W2xlbjIgLSAxXTsKICAgICAgcGFydHMucHVzaCgKICAgICAgICBsb29rdXBbdG1wID4+IDJdICsgbG9va3VwW3RtcCA8PCA0ICYgNjNdICsgIj09IgogICAgICApOwogICAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7CiAgICAgIHRtcCA9ICh1aW50OFtsZW4yIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4yIC0gMV07CiAgICAgIHBhcnRzLnB1c2goCiAgICAgICAgbG9va3VwW3RtcCA+PiAxMF0gKyBsb29rdXBbdG1wID4+IDQgJiA2M10gKyBsb29rdXBbdG1wIDw8IDIgJiA2M10gKyAiPSIKICAgICAgKTsKICAgIH0KICAgIHJldHVybiBwYXJ0cy5qb2luKCIiKTsKICB9CiAgdmFyIGllZWU3NTQgPSB7fTsKICAvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqLwogIGllZWU3NTQucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlcjIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7CiAgICB2YXIgZSwgbTsKICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxOwogICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7CiAgICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7CiAgICB2YXIgbkJpdHMgPSAtNzsKICAgIHZhciBpMiA9IGlzTEUgPyBuQnl0ZXMgLSAxIDogMDsKICAgIHZhciBkID0gaXNMRSA/IC0xIDogMTsKICAgIHZhciBzID0gYnVmZmVyMltvZmZzZXQgKyBpMl07CiAgICBpMiArPSBkOwogICAgZSA9IHMgJiAoMSA8PCAtbkJpdHMpIC0gMTsKICAgIHMgPj49IC1uQml0czsKICAgIG5CaXRzICs9IGVMZW47CiAgICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcjJbb2Zmc2V0ICsgaTJdLCBpMiArPSBkLCBuQml0cyAtPSA4KSB7CiAgICB9CiAgICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxOwogICAgZSA+Pj0gLW5CaXRzOwogICAgbkJpdHMgKz0gbUxlbjsKICAgIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyMltvZmZzZXQgKyBpMl0sIGkyICs9IGQsIG5CaXRzIC09IDgpIHsKICAgIH0KICAgIGlmIChlID09PSAwKSB7CiAgICAgIGUgPSAxIC0gZUJpYXM7CiAgICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHsKICAgICAgcmV0dXJuIG0gPyBOYU4gOiAocyA/IC0xIDogMSkgKiBJbmZpbml0eTsKICAgIH0gZWxzZSB7CiAgICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbik7CiAgICAgIGUgPSBlIC0gZUJpYXM7CiAgICB9CiAgICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKTsKICB9OwogIGllZWU3NTQud3JpdGUgPSBmdW5jdGlvbihidWZmZXIyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHsKICAgIHZhciBlLCBtLCBjMjsKICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxOwogICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7CiAgICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7CiAgICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMDsKICAgIHZhciBpMiA9IGlzTEUgPyAwIDogbkJ5dGVzIC0gMTsKICAgIHZhciBkID0gaXNMRSA/IDEgOiAtMTsKICAgIHZhciBzID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMDsKICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpOwogICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHsKICAgICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwOwogICAgICBlID0gZU1heDsKICAgIH0gZWxzZSB7CiAgICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTsKICAgICAgaWYgKHZhbHVlICogKGMyID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHsKICAgICAgICBlLS07CiAgICAgICAgYzIgKj0gMjsKICAgICAgfQogICAgICBpZiAoZSArIGVCaWFzID49IDEpIHsKICAgICAgICB2YWx1ZSArPSBydCAvIGMyOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTsKICAgICAgfQogICAgICBpZiAodmFsdWUgKiBjMiA+PSAyKSB7CiAgICAgICAgZSsrOwogICAgICAgIGMyIC89IDI7CiAgICAgIH0KICAgICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7CiAgICAgICAgbSA9IDA7CiAgICAgICAgZSA9IGVNYXg7CiAgICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHsKICAgICAgICBtID0gKHZhbHVlICogYzIgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pOwogICAgICAgIGUgPSBlICsgZUJpYXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pOwogICAgICAgIGUgPSAwOwogICAgICB9CiAgICB9CiAgICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXIyW29mZnNldCArIGkyXSA9IG0gJiAyNTUsIGkyICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHsKICAgIH0KICAgIGUgPSBlIDw8IG1MZW4gfCBtOwogICAgZUxlbiArPSBtTGVuOwogICAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXIyW29mZnNldCArIGkyXSA9IGUgJiAyNTUsIGkyICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHsKICAgIH0KICAgIGJ1ZmZlcjJbb2Zmc2V0ICsgaTIgLSBkXSB8PSBzICogMTI4OwogIH07CiAgLyohCiAgICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCiAgICoKICAgKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPgogICAqIEBsaWNlbnNlICBNSVQKICAgKi8KICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIGNvbnN0IGJhc2U2NCA9IGJhc2U2NEpzOwogICAgY29uc3QgaWVlZTc1NCQxID0gaWVlZTc1NDsKICAgIGNvbnN0IGN1c3RvbUluc3BlY3RTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2xbImZvciJdID09PSAiZnVuY3Rpb24iID8gU3ltYm9sWyJmb3IiXSgibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKSA6IG51bGw7CiAgICBleHBvcnRzMi5CdWZmZXIgPSBCdWZmZXIzOwogICAgZXhwb3J0czIuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXI7CiAgICBleHBvcnRzMi5JTlNQRUNUX01BWF9CWVRFUyA9IDUwOwogICAgY29uc3QgS19NQVhfTEVOR1RIID0gMjE0NzQ4MzY0NzsKICAgIGV4cG9ydHMyLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEg7CiAgICBCdWZmZXIzLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpOwogICAgaWYgKCFCdWZmZXIzLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoCiAgICAgICAgIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LiIKICAgICAgKTsKICAgIH0KICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0KCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KDEpOwogICAgICAgIGNvbnN0IHByb3RvID0geyBmb286IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIDQyOwogICAgICAgIH0gfTsKICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKTsKICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYXJyLCBwcm90byk7CiAgICAgICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDI7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIzLnByb3RvdHlwZSwgInBhcmVudCIsIHsKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIodGhpcykpCiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjsKICAgICAgfQogICAgfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyMy5wcm90b3R5cGUsICJvZmZzZXQiLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFCdWZmZXIzLmlzQnVmZmVyKHRoaXMpKQogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0OwogICAgICB9CiAgICB9KTsKICAgIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihsZW5ndGgpIHsKICAgICAgaWYgKGxlbmd0aCA+IEtfTUFYX0xFTkdUSCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgIicgKyBsZW5ndGggKyAnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJyk7CiAgICAgIH0KICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyMy5wcm90b3R5cGUpOwogICAgICByZXR1cm4gYnVmOwogICAgfQogICAgZnVuY3Rpb24gQnVmZmVyMyhhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkgewogICAgICBpZiAodHlwZW9mIGFyZyA9PT0gIm51bWJlciIpIHsKICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAnVGhlICJzdHJpbmciIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgfQogICAgQnVmZmVyMy5wb29sU2l6ZSA9IDgxOTI7CiAgICBmdW5jdGlvbiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gZnJvbVN0cmluZzIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpOwogICAgICB9CiAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIGZyb21BcnJheVZpZXcodmFsdWUpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAiICsgdHlwZW9mIHZhbHVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8IHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpIHsKICAgICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICJ1bmRlZmluZWQiICYmIChpc0luc3RhbmNlKHZhbHVlLCBTaGFyZWRBcnJheUJ1ZmZlcikgfHwgdmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpIHsKICAgICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICdUaGUgInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInCiAgICAgICAgKTsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKCk7CiAgICAgIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHsKICAgICAgICByZXR1cm4gQnVmZmVyMy5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0KICAgICAgY29uc3QgYiA9IGZyb21PYmplY3QodmFsdWUpOwogICAgICBpZiAoYikKICAgICAgICByZXR1cm4gYjsKICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIEJ1ZmZlcjMuZnJvbSh2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCJzdHJpbmciKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAiICsgdHlwZW9mIHZhbHVlCiAgICAgICk7CiAgICB9CiAgICBCdWZmZXIzLmZyb20gPSBmdW5jdGlvbih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7CiAgICAgIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgfTsKICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIzLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpOwogICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlcjMsIFVpbnQ4QXJyYXkpOwogICAgZnVuY3Rpb24gYXNzZXJ0U2l6ZShzaXplKSB7CiAgICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gIm51bWJlciIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpOwogICAgICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIHNpemUgKyAnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJyk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7CiAgICAgIGFzc2VydFNpemUoc2l6ZSk7CiAgICAgIGlmIChzaXplIDw9IDApIHsKICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpOwogICAgICB9CiAgICAgIGlmIChmaWxsICE9PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAic3RyaW5nIiA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKSA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpOwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSk7CiAgICB9CiAgICBCdWZmZXIzLmFsbG9jID0gZnVuY3Rpb24oc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHsKICAgICAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKTsKICAgIH07CiAgICBmdW5jdGlvbiBhbGxvY1Vuc2FmZShzaXplKSB7CiAgICAgIGFzc2VydFNpemUoc2l6ZSk7CiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApOwogICAgfQogICAgQnVmZmVyMy5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpOwogICAgfTsKICAgIEJ1ZmZlcjMuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24oc2l6ZSkgewogICAgICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gZnJvbVN0cmluZzIoc3RyaW5nLCBlbmNvZGluZykgewogICAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAic3RyaW5nIiB8fCBlbmNvZGluZyA9PT0gIiIpIHsKICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IjsKICAgICAgfQogICAgICBpZiAoIUJ1ZmZlcjMuaXNFbmNvZGluZyhlbmNvZGluZykpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgICB9CiAgICAgIGNvbnN0IGxlbmd0aCA9IGJ5dGVMZW5ndGgyKHN0cmluZywgZW5jb2RpbmcpIHwgMDsKICAgICAgbGV0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpOwogICAgICBjb25zdCBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZyk7CiAgICAgIGlmIChhY3R1YWwgIT09IGxlbmd0aCkgewogICAgICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpOwogICAgICB9CiAgICAgIHJldHVybiBidWY7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tQXJyYXlMaWtlKGFycmF5KSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMDsKICAgICAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBsZW5ndGg7IGkyICs9IDEpIHsKICAgICAgICBidWZbaTJdID0gYXJyYXlbaTJdICYgMjU1OwogICAgICB9CiAgICAgIHJldHVybiBidWY7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tQXJyYXlWaWV3KGFycmF5VmlldykgewogICAgICBpZiAoaXNJbnN0YW5jZShhcnJheVZpZXcsIFVpbnQ4QXJyYXkpKSB7CiAgICAgICAgY29uc3QgY29weSA9IG5ldyBVaW50OEFycmF5KGFycmF5Vmlldyk7CiAgICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKGFycmF5Vmlldyk7CiAgICB9CiAgICBmdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignIm9mZnNldCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7CiAgICAgIH0KICAgICAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcibGVuZ3RoIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTsKICAgICAgfQogICAgICBsZXQgYnVmOwogICAgICBpZiAoYnl0ZU9mZnNldCA9PT0gdm9pZCAwICYmIGxlbmd0aCA9PT0gdm9pZCAwKSB7CiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpOwogICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7CiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlcjMucHJvdG90eXBlKTsKICAgICAgcmV0dXJuIGJ1ZjsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7CiAgICAgIGlmIChCdWZmZXIzLmlzQnVmZmVyKG9iaikpIHsKICAgICAgICBjb25zdCBsZW4yID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDA7CiAgICAgICAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbjIpOwogICAgICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgIH0KICAgICAgICBvYmouY29weShidWYsIDAsIDAsIGxlbjIpOwogICAgICAgIHJldHVybiBidWY7CiAgICAgIH0KICAgICAgaWYgKG9iai5sZW5ndGggIT09IHZvaWQgMCkgewogICAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gIm51bWJlciIgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHsKICAgICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iaik7CiAgICAgIH0KICAgICAgaWYgKG9iai50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkgewogICAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2hlY2tlZChsZW5ndGgpIHsKICAgICAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgIiBieXRlcyIpOwogICAgICB9CiAgICAgIHJldHVybiBsZW5ndGggfCAwOwogICAgfQogICAgZnVuY3Rpb24gU2xvd0J1ZmZlcihsZW5ndGgpIHsKICAgICAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7CiAgICAgICAgbGVuZ3RoID0gMDsKICAgICAgfQogICAgICByZXR1cm4gQnVmZmVyMy5hbGxvYygrbGVuZ3RoKTsKICAgIH0KICAgIEJ1ZmZlcjMuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcjIoYikgewogICAgICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlICYmIGIgIT09IEJ1ZmZlcjMucHJvdG90eXBlOwogICAgfTsKICAgIEJ1ZmZlcjMuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikgewogICAgICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkKICAgICAgICBhID0gQnVmZmVyMy5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpOwogICAgICBpZiAoaXNJbnN0YW5jZShiLCBVaW50OEFycmF5KSkKICAgICAgICBiID0gQnVmZmVyMy5mcm9tKGIsIGIub2Zmc2V0LCBiLmJ5dGVMZW5ndGgpOwogICAgICBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlcjMuaXNCdWZmZXIoYikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgJ1RoZSAiYnVmMSIsICJidWYyIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheScKICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChhID09PSBiKQogICAgICAgIHJldHVybiAwOwogICAgICBsZXQgeCA9IGEubGVuZ3RoOwogICAgICBsZXQgeSA9IGIubGVuZ3RoOwogICAgICBmb3IgKGxldCBpMiA9IDAsIGxlbjIgPSBNYXRoLm1pbih4LCB5KTsgaTIgPCBsZW4yOyArK2kyKSB7CiAgICAgICAgaWYgKGFbaTJdICE9PSBiW2kyXSkgewogICAgICAgICAgeCA9IGFbaTJdOwogICAgICAgICAgeSA9IGJbaTJdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh4IDwgeSkKICAgICAgICByZXR1cm4gLTE7CiAgICAgIGlmICh5IDwgeCkKICAgICAgICByZXR1cm4gMTsKICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgQnVmZmVyMy5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyhlbmNvZGluZykgewogICAgICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkgewogICAgICAgIGNhc2UgImhleCI6CiAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICBjYXNlICJsYXRpbjEiOgogICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfTsKICAgIEJ1ZmZlcjMuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KGxpc3QsIGxlbmd0aCkgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7CiAgICAgIH0KICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJ1ZmZlcjMuYWxsb2MoMCk7CiAgICAgIH0KICAgICAgbGV0IGkyOwogICAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHsKICAgICAgICBsZW5ndGggPSAwOwogICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IGxpc3QubGVuZ3RoOyArK2kyKSB7CiAgICAgICAgICBsZW5ndGggKz0gbGlzdFtpMl0ubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBidWZmZXIyID0gQnVmZmVyMy5hbGxvY1Vuc2FmZShsZW5ndGgpOwogICAgICBsZXQgcG9zID0gMDsKICAgICAgZm9yIChpMiA9IDA7IGkyIDwgbGlzdC5sZW5ndGg7ICsraTIpIHsKICAgICAgICBsZXQgYnVmID0gbGlzdFtpMl07CiAgICAgICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkgewogICAgICAgICAgaWYgKHBvcyArIGJ1Zi5sZW5ndGggPiBidWZmZXIyLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIoYnVmKSkKICAgICAgICAgICAgICBidWYgPSBCdWZmZXIzLmZyb20oYnVmKTsKICAgICAgICAgICAgYnVmLmNvcHkoYnVmZmVyMiwgcG9zKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKAogICAgICAgICAgICAgIGJ1ZmZlcjIsCiAgICAgICAgICAgICAgYnVmLAogICAgICAgICAgICAgIHBvcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIoYnVmKSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBidWYuY29weShidWZmZXIyLCBwb3MpOwogICAgICAgIH0KICAgICAgICBwb3MgKz0gYnVmLmxlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gYnVmZmVyMjsKICAgIH07CiAgICBmdW5jdGlvbiBieXRlTGVuZ3RoMihzdHJpbmcsIGVuY29kaW5nKSB7CiAgICAgIGlmIChCdWZmZXIzLmlzQnVmZmVyKHN0cmluZykpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkgewogICAgICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aDsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHN0cmluZyAhPT0gInN0cmluZyIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZwogICAgICAgICk7CiAgICAgIH0KICAgICAgY29uc3QgbGVuMiA9IHN0cmluZy5sZW5ndGg7CiAgICAgIGNvbnN0IG11c3RNYXRjaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZTsKICAgICAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuMiA9PT0gMCkKICAgICAgICByZXR1cm4gMDsKICAgICAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2U7CiAgICAgIGZvciAoOyA7ICkgewogICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICByZXR1cm4gbGVuMjsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7CiAgICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICAgIGNhc2UgInVjcy0yIjoKICAgICAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgICAgICByZXR1cm4gbGVuMiAqIDI7CiAgICAgICAgICBjYXNlICJoZXgiOgogICAgICAgICAgICByZXR1cm4gbGVuMiA+Pj4gMTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5jb2RpbmcgPSAoIiIgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgQnVmZmVyMy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDI7CiAgICBmdW5jdGlvbiBzbG93VG9TdHJpbmcoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHsKICAgICAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2U7CiAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwIHx8IHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBpZiAoZW5kID09PSB2b2lkIDAgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHsKICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoZW5kIDw9IDApIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgICAgZW5kID4+Pj0gMDsKICAgICAgc3RhcnQgPj4+PSAwOwogICAgICBpZiAoZW5kIDw9IHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICAgIGlmICghZW5jb2RpbmcpCiAgICAgICAgZW5jb2RpbmcgPSAidXRmOCI7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgc3dpdGNoIChlbmNvZGluZykgewogICAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpOwogICAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgICBjYXNlICJ1dGYtOCI6CiAgICAgICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZCk7CiAgICAgICAgICBjYXNlICJhc2NpaSI6CiAgICAgICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpOwogICAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKTsKICAgICAgICAgIGNhc2UgInVjczIiOgogICAgICAgICAgY2FzZSAidWNzLTIiOgogICAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAobG93ZXJlZENhc2UpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nKTsKICAgICAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZTsKICAgIGZ1bmN0aW9uIHN3YXAoYiwgbiwgbSkgewogICAgICBjb25zdCBpMiA9IGJbbl07CiAgICAgIGJbbl0gPSBiW21dOwogICAgICBiW21dID0gaTI7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYoKSB7CiAgICAgIGNvbnN0IGxlbjIgPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKGxlbjIgJSAyICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGxlbjI7IGkyICs9IDIpIHsKICAgICAgICBzd2FwKHRoaXMsIGkyLCBpMiArIDEpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMigpIHsKICAgICAgY29uc3QgbGVuMiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAobGVuMiAlIDQgIT09IDApIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGVuMjsgaTIgKz0gNCkgewogICAgICAgIHN3YXAodGhpcywgaTIsIGkyICsgMyk7CiAgICAgICAgc3dhcCh0aGlzLCBpMiArIDEsIGkyICsgMik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0KCkgewogICAgICBjb25zdCBsZW4yID0gdGhpcy5sZW5ndGg7CiAgICAgIGlmIChsZW4yICUgOCAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBsZW4yOyBpMiArPSA4KSB7CiAgICAgICAgc3dhcCh0aGlzLCBpMiwgaTIgKyA3KTsKICAgICAgICBzd2FwKHRoaXMsIGkyICsgMSwgaTIgKyA2KTsKICAgICAgICBzd2FwKHRoaXMsIGkyICsgMiwgaTIgKyA1KTsKICAgICAgICBzd2FwKHRoaXMsIGkyICsgMywgaTIgKyA0KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nMigpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuICIiOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aCk7CiAgICAgIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlcjMucHJvdG90eXBlLnRvU3RyaW5nOwogICAgQnVmZmVyMy5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKGIpIHsKICAgICAgaWYgKCFCdWZmZXIzLmlzQnVmZmVyKGIpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTsKICAgICAgaWYgKHRoaXMgPT09IGIpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBCdWZmZXIzLmNvbXBhcmUodGhpcywgYikgPT09IDA7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7CiAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgY29uc3QgbWF4ID0gZXhwb3J0czIuSU5TUEVDVF9NQVhfQllURVM7CiAgICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoImhleCIsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICIkMSAiKS50cmltKCk7CiAgICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkKICAgICAgICBzdHIgKz0gIiAuLi4gIjsKICAgICAgcmV0dXJuICI8QnVmZmVyICIgKyBzdHIgKyAiPiI7CiAgICB9OwogICAgaWYgKGN1c3RvbUluc3BlY3RTeW1ib2wpIHsKICAgICAgQnVmZmVyMy5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBCdWZmZXIzLnByb3RvdHlwZS5pbnNwZWN0OwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHsKICAgICAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkgewogICAgICAgIHRhcmdldCA9IEJ1ZmZlcjMuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKTsKICAgICAgfQogICAgICBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIodGFyZ2V0KSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAnVGhlICJ0YXJnZXQiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB0YXJnZXQKICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwKSB7CiAgICAgICAgc3RhcnQgPSAwOwogICAgICB9CiAgICAgIGlmIChlbmQgPT09IHZvaWQgMCkgewogICAgICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwOwogICAgICB9CiAgICAgIGlmICh0aGlzU3RhcnQgPT09IHZvaWQgMCkgewogICAgICAgIHRoaXNTdGFydCA9IDA7CiAgICAgIH0KICAgICAgaWYgKHRoaXNFbmQgPT09IHZvaWQgMCkgewogICAgICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7CiAgICAgIH0KICAgICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPj0gZW5kKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgc3RhcnQgPj4+PSAwOwogICAgICBlbmQgPj4+PSAwOwogICAgICB0aGlzU3RhcnQgPj4+PSAwOwogICAgICB0aGlzRW5kID4+Pj0gMDsKICAgICAgaWYgKHRoaXMgPT09IHRhcmdldCkKICAgICAgICByZXR1cm4gMDsKICAgICAgbGV0IHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0OwogICAgICBsZXQgeSA9IGVuZCAtIHN0YXJ0OwogICAgICBjb25zdCBsZW4yID0gTWF0aC5taW4oeCwgeSk7CiAgICAgIGNvbnN0IHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpOwogICAgICBjb25zdCB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGVuMjsgKytpMikgewogICAgICAgIGlmICh0aGlzQ29weVtpMl0gIT09IHRhcmdldENvcHlbaTJdKSB7CiAgICAgICAgICB4ID0gdGhpc0NvcHlbaTJdOwogICAgICAgICAgeSA9IHRhcmdldENvcHlbaTJdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh4IDwgeSkKICAgICAgICByZXR1cm4gLTE7CiAgICAgIGlmICh5IDwgeCkKICAgICAgICByZXR1cm4gMTsKICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YoYnVmZmVyMiwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7CiAgICAgIGlmIChidWZmZXIyLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gLTE7CiAgICAgIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gInN0cmluZyIpIHsKICAgICAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXQ7CiAgICAgICAgYnl0ZU9mZnNldCA9IDA7CiAgICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDIxNDc0ODM2NDcpIHsKICAgICAgICBieXRlT2Zmc2V0ID0gMjE0NzQ4MzY0NzsKICAgICAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTIxNDc0ODM2NDgpIHsKICAgICAgICBieXRlT2Zmc2V0ID0gLTIxNDc0ODM2NDg7CiAgICAgIH0KICAgICAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0OwogICAgICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHsKICAgICAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IGJ1ZmZlcjIubGVuZ3RoIC0gMTsKICAgICAgfQogICAgICBpZiAoYnl0ZU9mZnNldCA8IDApCiAgICAgICAgYnl0ZU9mZnNldCA9IGJ1ZmZlcjIubGVuZ3RoICsgYnl0ZU9mZnNldDsKICAgICAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyMi5sZW5ndGgpIHsKICAgICAgICBpZiAoZGlyKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGVsc2UKICAgICAgICAgIGJ5dGVPZmZzZXQgPSBidWZmZXIyLmxlbmd0aCAtIDE7CiAgICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHsKICAgICAgICBpZiAoZGlyKQogICAgICAgICAgYnl0ZU9mZnNldCA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAic3RyaW5nIikgewogICAgICAgIHZhbCA9IEJ1ZmZlcjMuZnJvbSh2YWwsIGVuY29kaW5nKTsKICAgICAgfQogICAgICBpZiAoQnVmZmVyMy5pc0J1ZmZlcih2YWwpKSB7CiAgICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICJudW1iZXIiKSB7CiAgICAgICAgdmFsID0gdmFsICYgMjU1OwogICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgaWYgKGRpcikgewogICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlcjIsIHZhbCwgYnl0ZU9mZnNldCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIyLCB2YWwsIGJ5dGVPZmZzZXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlcjIsIFt2YWxdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFycmF5SW5kZXhPZihhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikgewogICAgICBsZXQgaW5kZXhTaXplID0gMTsKICAgICAgbGV0IGFyckxlbmd0aCA9IGFyci5sZW5ndGg7CiAgICAgIGxldCB2YWxMZW5ndGggPSB2YWwubGVuZ3RoOwogICAgICBpZiAoZW5jb2RpbmcgIT09IHZvaWQgMCkgewogICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChlbmNvZGluZyA9PT0gInVjczIiIHx8IGVuY29kaW5nID09PSAidWNzLTIiIHx8IGVuY29kaW5nID09PSAidXRmMTZsZSIgfHwgZW5jb2RpbmcgPT09ICJ1dGYtMTZsZSIpIHsKICAgICAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleFNpemUgPSAyOwogICAgICAgICAgYXJyTGVuZ3RoIC89IDI7CiAgICAgICAgICB2YWxMZW5ndGggLz0gMjsKICAgICAgICAgIGJ5dGVPZmZzZXQgLz0gMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmVhZChidWYsIGkzKSB7CiAgICAgICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIGJ1ZltpM107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkzICogaW5kZXhTaXplKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGkyOwogICAgICBpZiAoZGlyKSB7CiAgICAgICAgbGV0IGZvdW5kSW5kZXggPSAtMTsKICAgICAgICBmb3IgKGkyID0gYnl0ZU9mZnNldDsgaTIgPCBhcnJMZW5ndGg7IGkyKyspIHsKICAgICAgICAgIGlmIChyZWFkKGFyciwgaTIpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaTIgLSBmb3VuZEluZGV4KSkgewogICAgICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgICAgZm91bmRJbmRleCA9IGkyOwogICAgICAgICAgICBpZiAoaTIgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKQogICAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKQogICAgICAgICAgICAgIGkyIC09IGkyIC0gZm91bmRJbmRleDsKICAgICAgICAgICAgZm91bmRJbmRleCA9IC0xOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkKICAgICAgICAgIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGg7CiAgICAgICAgZm9yIChpMiA9IGJ5dGVPZmZzZXQ7IGkyID49IDA7IGkyLS0pIHsKICAgICAgICAgIGxldCBmb3VuZCA9IHRydWU7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGlmIChyZWFkKGFyciwgaTIgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7CiAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGZvdW5kKQogICAgICAgICAgICByZXR1cm4gaTI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIEJ1ZmZlcjMucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgewogICAgICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7CiAgICAgIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHsKICAgICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKTsKICAgIH07CiAgICBmdW5jdGlvbiBoZXhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMDsKICAgICAgY29uc3QgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldDsKICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7CiAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykgewogICAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikgewogICAgICAgIGxlbmd0aCA9IHN0ckxlbiAvIDI7CiAgICAgIH0KICAgICAgbGV0IGkyOwogICAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW5ndGg7ICsraTIpIHsKICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkyICogMiwgMiksIDE2KTsKICAgICAgICBpZiAobnVtYmVySXNOYU4ocGFyc2VkKSkKICAgICAgICAgIHJldHVybiBpMjsKICAgICAgICBidWZbb2Zmc2V0ICsgaTJdID0gcGFyc2VkOwogICAgICB9CiAgICAgIHJldHVybiBpMjsKICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgICBmdW5jdGlvbiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkgewogICAgICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlNjRXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHVjczJXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7CiAgICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkgewogICAgICAgIGVuY29kaW5nID0gInV0ZjgiOwogICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgICAgIG9mZnNldCA9IDA7CiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB2b2lkIDAgJiYgdHlwZW9mIG9mZnNldCA9PT0gInN0cmluZyIpIHsKICAgICAgICBlbmNvZGluZyA9IG9mZnNldDsKICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgICAgICBvZmZzZXQgPSAwOwogICAgICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHsKICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMDsKICAgICAgICAgIGlmIChlbmNvZGluZyA9PT0gdm9pZCAwKQogICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7CiAgICAgICAgICBsZW5ndGggPSB2b2lkIDA7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIKICAgICAgICApOwogICAgICB9CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0OwogICAgICBpZiAobGVuZ3RoID09PSB2b2lkIDAgfHwgbGVuZ3RoID4gcmVtYWluaW5nKQogICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZzsKICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7CiAgICAgIH0KICAgICAgaWYgKCFlbmNvZGluZykKICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IjsKICAgICAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2U7CiAgICAgIGZvciAoOyA7ICkgewogICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgICAgICAgIGNhc2UgImhleCI6CiAgICAgICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSAiYXNjaWkiOgogICAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSAidWNzMiI6CiAgICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgICAgICAgICBlbmNvZGluZyA9ICgiIiArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJCdWZmZXIiLAogICAgICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKQogICAgICB9OwogICAgfTsKICAgIGZ1bmN0aW9uIGJhc2U2NFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkgewogICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjhTbGljZShidWYsIHN0YXJ0LCBlbmQpIHsKICAgICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTsKICAgICAgY29uc3QgcmVzID0gW107CiAgICAgIGxldCBpMiA9IHN0YXJ0OwogICAgICB3aGlsZSAoaTIgPCBlbmQpIHsKICAgICAgICBjb25zdCBmaXJzdEJ5dGUgPSBidWZbaTJdOwogICAgICAgIGxldCBjb2RlUG9pbnQgPSBudWxsOwogICAgICAgIGxldCBieXRlc1BlclNlcXVlbmNlID0gZmlyc3RCeXRlID4gMjM5ID8gNCA6IGZpcnN0Qnl0ZSA+IDIyMyA/IDMgOiBmaXJzdEJ5dGUgPiAxOTEgPyAyIDogMTsKICAgICAgICBpZiAoaTIgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkgewogICAgICAgICAgbGV0IHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludDsKICAgICAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDEyOCkgewogICAgICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaTIgKyAxXTsKICAgICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAxOTIpID09PSAxMjgpIHsKICAgICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMzEpIDw8IDYgfCBzZWNvbmRCeXRlICYgNjM7CiAgICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDEyNykgewogICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaTIgKyAxXTsKICAgICAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaTIgKyAyXTsKICAgICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAxOTIpID09PSAxMjggJiYgKHRoaXJkQnl0ZSAmIDE5MikgPT09IDEyOCkgewogICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAxNSkgPDwgMTIgfCAoc2Vjb25kQnl0ZSAmIDYzKSA8PCA2IHwgdGhpcmRCeXRlICYgNjM7CiAgICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDIwNDcgJiYgKHRlbXBDb2RlUG9pbnQgPCA1NTI5NiB8fCB0ZW1wQ29kZVBvaW50ID4gNTczNDMpKSB7CiAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpMiArIDFdOwogICAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpMiArIDJdOwogICAgICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaTIgKyAzXTsKICAgICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAxOTIpID09PSAxMjggJiYgKHRoaXJkQnl0ZSAmIDE5MikgPT09IDEyOCAmJiAoZm91cnRoQnl0ZSAmIDE5MikgPT09IDEyOCkgewogICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAxNSkgPDwgMTggfCAoc2Vjb25kQnl0ZSAmIDYzKSA8PCAxMiB8ICh0aGlyZEJ5dGUgJiA2MykgPDwgNiB8IGZvdXJ0aEJ5dGUgJiA2MzsKICAgICAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gNjU1MzUgJiYgdGVtcENvZGVQb2ludCA8IDExMTQxMTIpIHsKICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHsKICAgICAgICAgIGNvZGVQb2ludCA9IDY1NTMzOwogICAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiA2NTUzNSkgewogICAgICAgICAgY29kZVBvaW50IC09IDY1NTM2OwogICAgICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDEwMjMgfCA1NTI5Nik7CiAgICAgICAgICBjb2RlUG9pbnQgPSA1NjMyMCB8IGNvZGVQb2ludCAmIDEwMjM7CiAgICAgICAgfQogICAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCk7CiAgICAgICAgaTIgKz0gYnl0ZXNQZXJTZXF1ZW5jZTsKICAgICAgfQogICAgICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcyk7CiAgICB9CiAgICBjb25zdCBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDQwOTY7CiAgICBmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkoY29kZVBvaW50cykgewogICAgICBjb25zdCBsZW4yID0gY29kZVBvaW50cy5sZW5ndGg7CiAgICAgIGlmIChsZW4yIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTsKICAgICAgfQogICAgICBsZXQgcmVzID0gIiI7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIHdoaWxlIChpMiA8IGxlbjIpIHsKICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgKICAgICAgICAgIFN0cmluZywKICAgICAgICAgIGNvZGVQb2ludHMuc2xpY2UoaTIsIGkyICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKQogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIGZ1bmN0aW9uIGFzY2lpU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7CiAgICAgIGxldCByZXQgPSAiIjsKICAgICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTsKICAgICAgZm9yIChsZXQgaTIgPSBzdGFydDsgaTIgPCBlbmQ7ICsraTIpIHsKICAgICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaTJdICYgMTI3KTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7CiAgICAgIGxldCByZXQgPSAiIjsKICAgICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTsKICAgICAgZm9yIChsZXQgaTIgPSBzdGFydDsgaTIgPCBlbmQ7ICsraTIpIHsKICAgICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaTJdKTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gaGV4U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7CiAgICAgIGNvbnN0IGxlbjIgPSBidWYubGVuZ3RoOwogICAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkKICAgICAgICBzdGFydCA9IDA7CiAgICAgIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuMikKICAgICAgICBlbmQgPSBsZW4yOwogICAgICBsZXQgb3V0ID0gIiI7CiAgICAgIGZvciAobGV0IGkyID0gc3RhcnQ7IGkyIDwgZW5kOyArK2kyKSB7CiAgICAgICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2kyXV07CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjE2bGVTbGljZShidWYsIHN0YXJ0LCBlbmQpIHsKICAgICAgY29uc3QgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgIGxldCByZXMgPSAiIjsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGJ5dGVzLmxlbmd0aCAtIDE7IGkyICs9IDIpIHsKICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpMl0gKyBieXRlc1tpMiArIDFdICogMjU2KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7CiAgICAgIGNvbnN0IGxlbjIgPSB0aGlzLmxlbmd0aDsKICAgICAgc3RhcnQgPSB+fnN0YXJ0OwogICAgICBlbmQgPSBlbmQgPT09IHZvaWQgMCA/IGxlbjIgOiB+fmVuZDsKICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ICs9IGxlbjI7CiAgICAgICAgaWYgKHN0YXJ0IDwgMCkKICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfSBlbHNlIGlmIChzdGFydCA+IGxlbjIpIHsKICAgICAgICBzdGFydCA9IGxlbjI7CiAgICAgIH0KICAgICAgaWYgKGVuZCA8IDApIHsKICAgICAgICBlbmQgKz0gbGVuMjsKICAgICAgICBpZiAoZW5kIDwgMCkKICAgICAgICAgIGVuZCA9IDA7CiAgICAgIH0gZWxzZSBpZiAoZW5kID4gbGVuMikgewogICAgICAgIGVuZCA9IGxlbjI7CiAgICAgIH0KICAgICAgaWYgKGVuZCA8IHN0YXJ0KQogICAgICAgIGVuZCA9IHN0YXJ0OwogICAgICBjb25zdCBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpOwogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIzLnByb3RvdHlwZSk7CiAgICAgIHJldHVybiBuZXdCdWY7CiAgICB9OwogICAgZnVuY3Rpb24gY2hlY2tPZmZzZXQob2Zmc2V0LCBleHQsIGxlbmd0aCkgewogICAgICBpZiAob2Zmc2V0ICUgMSAhPT0gMCB8fCBvZmZzZXQgPCAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTsKICAgICAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpOwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZFVpbnRMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFKG9mZnNldCwgYnl0ZUxlbmd0aDMsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgYnl0ZUxlbmd0aDMgPSBieXRlTGVuZ3RoMyA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgzLCB0aGlzLmxlbmd0aCk7CiAgICAgIGxldCB2YWwgPSB0aGlzW29mZnNldF07CiAgICAgIGxldCBtdWwgPSAxOwogICAgICBsZXQgaTIgPSAwOwogICAgICB3aGlsZSAoKytpMiA8IGJ5dGVMZW5ndGgzICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGkyXSAqIG11bDsKICAgICAgfQogICAgICByZXR1cm4gdmFsOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVaW50QkUgPSBCdWZmZXIzLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgzLCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGJ5dGVMZW5ndGgzID0gYnl0ZUxlbmd0aDMgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgzLCB0aGlzLmxlbmd0aCk7CiAgICAgIH0KICAgICAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoM107CiAgICAgIGxldCBtdWwgPSAxOwogICAgICB3aGlsZSAoYnl0ZUxlbmd0aDMgPiAwICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aDNdICogbXVsOwogICAgICB9CiAgICAgIHJldHVybiB2YWw7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZFVpbnQ4ID0gQnVmZmVyMy5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4KG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpOwogICAgICByZXR1cm4gdGhpc1tvZmZzZXRdOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVaW50MTZMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPSBCdWZmZXIzLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzW29mZnNldF0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMV07CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZFVpbnQzMkxFID0gQnVmZmVyMy5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFKG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpOwogICAgICByZXR1cm4gKHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpICsgdGhpc1tvZmZzZXQgKyAzXSAqIDE2Nzc3MjE2OwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVaW50MzJCRSA9IEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSAqIDE2Nzc3MjE2ICsgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYgfCB0aGlzW29mZnNldCArIDJdIDw8IDggfCB0aGlzW29mZnNldCArIDNdKTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NExFKG9mZnNldCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgIm9mZnNldCIpOwogICAgICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XTsKICAgICAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN107CiAgICAgIGlmIChmaXJzdCA9PT0gdm9pZCAwIHx8IGxhc3QgPT09IHZvaWQgMCkgewogICAgICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KTsKICAgICAgfQogICAgICBjb25zdCBsbyA9IGZpcnN0ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDggKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQ7CiAgICAgIGNvbnN0IGhpID0gdGhpc1srK29mZnNldF0gKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArIGxhc3QgKiAyICoqIDI0OwogICAgICByZXR1cm4gQmlnSW50KGxvKSArIChCaWdJbnQoaGkpIDw8IEJpZ0ludCgzMikpOwogICAgfSk7CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NEJFKG9mZnNldCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgIm9mZnNldCIpOwogICAgICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XTsKICAgICAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN107CiAgICAgIGlmIChmaXJzdCA9PT0gdm9pZCAwIHx8IGxhc3QgPT09IHZvaWQgMCkgewogICAgICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KTsKICAgICAgfQogICAgICBjb25zdCBoaSA9IGZpcnN0ICogMiAqKiAyNCArIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICsgdGhpc1srK29mZnNldF07CiAgICAgIGNvbnN0IGxvID0gdGhpc1srK29mZnNldF0gKiAyICoqIDI0ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDggKyBsYXN0OwogICAgICByZXR1cm4gKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQobG8pOwogICAgfSk7CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUob2Zmc2V0LCBieXRlTGVuZ3RoMywgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBieXRlTGVuZ3RoMyA9IGJ5dGVMZW5ndGgzID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aDMsIHRoaXMubGVuZ3RoKTsKICAgICAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0XTsKICAgICAgbGV0IG11bCA9IDE7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIHdoaWxlICgrK2kyIDwgYnl0ZUxlbmd0aDMgJiYgKG11bCAqPSAyNTYpKSB7CiAgICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaTJdICogbXVsOwogICAgICB9CiAgICAgIG11bCAqPSAxMjg7CiAgICAgIGlmICh2YWwgPj0gbXVsKQogICAgICAgIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aDMpOwogICAgICByZXR1cm4gdmFsOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgzLCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGJ5dGVMZW5ndGgzID0gYnl0ZUxlbmd0aDMgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoMywgdGhpcy5sZW5ndGgpOwogICAgICBsZXQgaTIgPSBieXRlTGVuZ3RoMzsKICAgICAgbGV0IG11bCA9IDE7CiAgICAgIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0taTJdOwogICAgICB3aGlsZSAoaTIgPiAwICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taTJdICogbXVsOwogICAgICB9CiAgICAgIG11bCAqPSAxMjg7CiAgICAgIGlmICh2YWwgPj0gbXVsKQogICAgICAgIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aDMpOwogICAgICByZXR1cm4gdmFsOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDgob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7CiAgICAgIGlmICghKHRoaXNbb2Zmc2V0XSAmIDEyOCkpCiAgICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XTsKICAgICAgcmV0dXJuICgyNTUgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODsKICAgICAgcmV0dXJuIHZhbCAmIDMyNzY4ID8gdmFsIHwgNDI5NDkwMTc2MCA6IHZhbDsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpOwogICAgICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgdGhpc1tvZmZzZXRdIDw8IDg7CiAgICAgIHJldHVybiB2YWwgJiAzMjc2OCA/IHZhbCB8IDQyOTQ5MDE3NjAgOiB2YWw7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYgfCB0aGlzW29mZnNldCArIDNdIDw8IDI0OwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzW29mZnNldF0gPDwgMjQgfCB0aGlzW29mZnNldCArIDFdIDw8IDE2IHwgdGhpc1tvZmZzZXQgKyAyXSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAzXTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnSW50NjRMRShvZmZzZXQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICJvZmZzZXQiKTsKICAgICAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF07CiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddOwogICAgICBpZiAoZmlyc3QgPT09IHZvaWQgMCB8fCBsYXN0ID09PSB2b2lkIDApIHsKICAgICAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIH0KICAgICAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyA0XSArIHRoaXNbb2Zmc2V0ICsgNV0gKiAyICoqIDggKyB0aGlzW29mZnNldCArIDZdICogMiAqKiAxNiArIChsYXN0IDw8IDI0KTsKICAgICAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChmaXJzdCArIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDI0KTsKICAgIH0pOwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUob2Zmc2V0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAib2Zmc2V0Iik7CiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdOwogICAgICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XTsKICAgICAgaWYgKGZpcnN0ID09PSB2b2lkIDAgfHwgbGFzdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpOwogICAgICB9CiAgICAgIGNvbnN0IHZhbCA9IChmaXJzdCA8PCAyNCkgKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArIHRoaXNbKytvZmZzZXRdOwogICAgICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KHRoaXNbKytvZmZzZXRdICogMiAqKiAyNCArIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICsgbGFzdCk7CiAgICB9KTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7CiAgICAgIHJldHVybiBpZWVlNzU0JDEucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFKG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpOwogICAgICByZXR1cm4gaWVlZTc1NCQxLnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIGllZWU3NTQkMS5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIGllZWU3NTQkMS5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KTsKICAgIH07CiAgICBmdW5jdGlvbiBjaGVja0ludChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHsKICAgICAgaWYgKCFCdWZmZXIzLmlzQnVmZmVyKGJ1ZikpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpOwogICAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpOwogICAgICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVpbnRMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aDMsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGJ5dGVMZW5ndGgzID0gYnl0ZUxlbmd0aDMgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjb25zdCBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoMykgLSAxOwogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgzLCBtYXhCeXRlcywgMCk7CiAgICAgIH0KICAgICAgbGV0IG11bCA9IDE7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMjU1OwogICAgICB3aGlsZSAoKytpMiA8IGJ5dGVMZW5ndGgzICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHRoaXNbb2Zmc2V0ICsgaTJdID0gdmFsdWUgLyBtdWwgJiAyNTU7CiAgICAgIH0KICAgICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGgzOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludEJFID0gQnVmZmVyMy5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoMywgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgYnl0ZUxlbmd0aDMgPSBieXRlTGVuZ3RoMyA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkgewogICAgICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgzKSAtIDE7CiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aDMsIG1heEJ5dGVzLCAwKTsKICAgICAgfQogICAgICBsZXQgaTIgPSBieXRlTGVuZ3RoMyAtIDE7CiAgICAgIGxldCBtdWwgPSAxOwogICAgICB0aGlzW29mZnNldCArIGkyXSA9IHZhbHVlICYgMjU1OwogICAgICB3aGlsZSAoLS1pMiA+PSAwICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHRoaXNbb2Zmc2V0ICsgaTJdID0gdmFsdWUgLyBtdWwgJiAyNTU7CiAgICAgIH0KICAgICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGgzOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludDggPSBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDI1NSwgMCk7CiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMjU1OwogICAgICByZXR1cm4gb2Zmc2V0ICsgMTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFID0gQnVmZmVyMy5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCA2NTUzNSwgMCk7CiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMjU1OwogICAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDg7CiAgICAgIHJldHVybiBvZmZzZXQgKyAyOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludDE2QkUgPSBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDY1NTM1LCAwKTsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDg7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDI1NTsKICAgICAgcmV0dXJuIG9mZnNldCArIDI7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgNDI5NDk2NzI5NSwgMCk7CiAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjQ7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gMTY7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAyNTU7CiAgICAgIHJldHVybiBvZmZzZXQgKyA0OwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludDMyQkUgPSBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDQyOTQ5NjcyOTUsIDApOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQ7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODsKICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMjU1OwogICAgICByZXR1cm4gb2Zmc2V0ICsgNDsKICAgIH07CiAgICBmdW5jdGlvbiB3cnRCaWdVSW50NjRMRShidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7CiAgICAgIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNyk7CiAgICAgIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIGJ1ZltvZmZzZXQrK10gPSBsbzsKICAgICAgbG8gPSBsbyA+PiA4OwogICAgICBidWZbb2Zmc2V0KytdID0gbG87CiAgICAgIGxvID0gbG8gPj4gODsKICAgICAgYnVmW29mZnNldCsrXSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQrK10gPSBsbzsKICAgICAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoNDI5NDk2NzI5NSkpOwogICAgICBidWZbb2Zmc2V0KytdID0gaGk7CiAgICAgIGhpID0gaGkgPj4gODsKICAgICAgYnVmW29mZnNldCsrXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQrK10gPSBoaTsKICAgICAgaGkgPSBoaSA+PiA4OwogICAgICBidWZbb2Zmc2V0KytdID0gaGk7CiAgICAgIHJldHVybiBvZmZzZXQ7CiAgICB9CiAgICBmdW5jdGlvbiB3cnRCaWdVSW50NjRCRShidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7CiAgICAgIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNyk7CiAgICAgIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIGJ1ZltvZmZzZXQgKyA3XSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyA2XSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyA1XSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyA0XSA9IGxvOwogICAgICBsZXQgaGkgPSBOdW1iZXIodmFsdWUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIGJ1ZltvZmZzZXQgKyAzXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyAyXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyAxXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXRdID0gaGk7CiAgICAgIHJldHVybiBvZmZzZXQgKyA4OwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLCBvZmZzZXQgPSAwKSB7CiAgICAgIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOwogICAgfSk7CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0QkUodmFsdWUsIG9mZnNldCA9IDApIHsKICAgICAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIEJpZ0ludCgwKSwgQmlnSW50KCIweGZmZmZmZmZmZmZmZmZmZmYiKSk7CiAgICB9KTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgzLCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KSB7CiAgICAgICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aDMgLSAxKTsKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoMywgbGltaXQgLSAxLCAtbGltaXQpOwogICAgICB9CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIGxldCBtdWwgPSAxOwogICAgICBsZXQgc3ViID0gMDsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAyNTU7CiAgICAgIHdoaWxlICgrK2kyIDwgYnl0ZUxlbmd0aDMgJiYgKG11bCAqPSAyNTYpKSB7CiAgICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpMiAtIDFdICE9PSAwKSB7CiAgICAgICAgICBzdWIgPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzW29mZnNldCArIGkyXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDI1NTsKICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDM7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aDMsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjb25zdCBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoMyAtIDEpOwogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgzLCBsaW1pdCAtIDEsIC1saW1pdCk7CiAgICAgIH0KICAgICAgbGV0IGkyID0gYnl0ZUxlbmd0aDMgLSAxOwogICAgICBsZXQgbXVsID0gMTsKICAgICAgbGV0IHN1YiA9IDA7CiAgICAgIHRoaXNbb2Zmc2V0ICsgaTJdID0gdmFsdWUgJiAyNTU7CiAgICAgIHdoaWxlICgtLWkyID49IDAgJiYgKG11bCAqPSAyNTYpKSB7CiAgICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpMiArIDFdICE9PSAwKSB7CiAgICAgICAgICBzdWIgPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzW29mZnNldCArIGkyXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDI1NTsKICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDM7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMTI3LCAtMTI4KTsKICAgICAgaWYgKHZhbHVlIDwgMCkKICAgICAgICB2YWx1ZSA9IDI1NSArIHZhbHVlICsgMTsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAyNTU7CiAgICAgIHJldHVybiBvZmZzZXQgKyAxOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDMyNzY3LCAtMzI3NjgpOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDI1NTsKICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4OwogICAgICByZXR1cm4gb2Zmc2V0ICsgMjsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAzMjc2NywgLTMyNzY4KTsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDg7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDI1NTsKICAgICAgcmV0dXJuIG9mZnNldCArIDI7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMjE0NzQ4MzY0NywgLTIxNDc0ODM2NDgpOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDI1NTsKICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4OwogICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDE2OwogICAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgPj4+IDI0OwogICAgICByZXR1cm4gb2Zmc2V0ICsgNDsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OCk7CiAgICAgIGlmICh2YWx1ZSA8IDApCiAgICAgICAgdmFsdWUgPSA0Mjk0OTY3Mjk1ICsgdmFsdWUgKyAxOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQ7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODsKICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMjU1OwogICAgICByZXR1cm4gb2Zmc2V0ICsgNDsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFKHZhbHVlLCBvZmZzZXQgPSAwKSB7CiAgICAgIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAtQmlnSW50KCIweDgwMDAwMDAwMDAwMDAwMDAiKSwgQmlnSW50KCIweDdmZmZmZmZmZmZmZmZmZmYiKSk7CiAgICB9KTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUodmFsdWUsIG9mZnNldCA9IDApIHsKICAgICAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoIjB4ODAwMDAwMDAwMDAwMDAwMCIpLCBCaWdJbnQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKICAgIH0pOwogICAgZnVuY3Rpb24gY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikgewogICAgICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgIGlmIChvZmZzZXQgPCAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRmxvYXQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0KTsKICAgICAgfQogICAgICBpZWVlNzU0JDEud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KTsKICAgICAgcmV0dXJuIG9mZnNldCArIDQ7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpOwogICAgfTsKICAgIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KSB7CiAgICAgICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCk7CiAgICAgIH0KICAgICAgaWVlZTc1NCQxLndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7CiAgICAgIHJldHVybiBvZmZzZXQgKyA4OwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7CiAgICAgIGlmICghQnVmZmVyMy5pc0J1ZmZlcih0YXJnZXQpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlciIpOwogICAgICBpZiAoIXN0YXJ0KQogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKQogICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkKICAgICAgICB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGg7CiAgICAgIGlmICghdGFyZ2V0U3RhcnQpCiAgICAgICAgdGFyZ2V0U3RhcnQgPSAwOwogICAgICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkKICAgICAgICBlbmQgPSBzdGFydDsKICAgICAgaWYgKGVuZCA9PT0gc3RhcnQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAwOwogICAgICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgaWYgKGVuZCA8IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7CiAgICAgIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkKICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7CiAgICAgICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnQ7CiAgICAgIH0KICAgICAgY29uc3QgbGVuMiA9IGVuZCAtIHN0YXJ0OwogICAgICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCgKICAgICAgICAgIHRhcmdldCwKICAgICAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksCiAgICAgICAgICB0YXJnZXRTdGFydAogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIGxlbjI7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykgewogICAgICBpZiAodHlwZW9mIHZhbCA9PT0gInN0cmluZyIpIHsKICAgICAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAic3RyaW5nIikgewogICAgICAgICAgZW5jb2RpbmcgPSBzdGFydDsKICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGVuY29kaW5nID0gZW5kOwogICAgICAgICAgZW5kID0gdGhpcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGlmIChlbmNvZGluZyAhPT0gdm9pZCAwICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gInN0cmluZyIpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gInN0cmluZyIgJiYgIUJ1ZmZlcjMuaXNFbmNvZGluZyhlbmNvZGluZykpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICBjb25zdCBjb2RlMiA9IHZhbC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgaWYgKGVuY29kaW5nID09PSAidXRmOCIgJiYgY29kZTIgPCAxMjggfHwgZW5jb2RpbmcgPT09ICJsYXRpbjEiKSB7CiAgICAgICAgICAgIHZhbCA9IGNvZGUyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAibnVtYmVyIikgewogICAgICAgIHZhbCA9IHZhbCAmIDI1NTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAiYm9vbGVhbiIpIHsKICAgICAgICB2YWwgPSBOdW1iZXIodmFsKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7CiAgICAgIH0KICAgICAgaWYgKGVuZCA8PSBzdGFydCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHN0YXJ0ID0gc3RhcnQgPj4+IDA7CiAgICAgIGVuZCA9IGVuZCA9PT0gdm9pZCAwID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDA7CiAgICAgIGlmICghdmFsKQogICAgICAgIHZhbCA9IDA7CiAgICAgIGxldCBpMjsKICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICJudW1iZXIiKSB7CiAgICAgICAgZm9yIChpMiA9IHN0YXJ0OyBpMiA8IGVuZDsgKytpMikgewogICAgICAgICAgdGhpc1tpMl0gPSB2YWw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyMy5pc0J1ZmZlcih2YWwpID8gdmFsIDogQnVmZmVyMy5mcm9tKHZhbCwgZW5jb2RpbmcpOwogICAgICAgIGNvbnN0IGxlbjIgPSBieXRlcy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbjIgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIHZhbCArICciIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50ICJ2YWx1ZSInKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgZW5kIC0gc3RhcnQ7ICsraTIpIHsKICAgICAgICAgIHRoaXNbaTIgKyBzdGFydF0gPSBieXRlc1tpMiAlIGxlbjJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBjb25zdCBlcnJvcnMgPSB7fTsKICAgIGZ1bmN0aW9uIEUoc3ltLCBnZXRNZXNzYWdlLCBCYXNlKSB7CiAgICAgIGVycm9yc1tzeW1dID0gY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJtZXNzYWdlIiwgewogICAgICAgICAgICB2YWx1ZTogZ2V0TWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7c3ltfV1gOwogICAgICAgICAgdGhpcy5zdGFjazsKICAgICAgICAgIGRlbGV0ZSB0aGlzLm5hbWU7CiAgICAgICAgfQogICAgICAgIGdldCBjb2RlKCkgewogICAgICAgICAgcmV0dXJuIHN5bTsKICAgICAgICB9CiAgICAgICAgc2V0IGNvZGUodmFsdWUpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiY29kZSIsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3N5bX1dOiAke3RoaXMubWVzc2FnZX1gOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIEUoCiAgICAgICJFUlJfQlVGRkVSX09VVF9PRl9CT1VORFMiLAogICAgICBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgIHJldHVybiBgJHtuYW1lfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiOwogICAgICB9LAogICAgICBSYW5nZUVycm9yCiAgICApOwogICAgRSgKICAgICAgIkVSUl9JTlZBTElEX0FSR19UWVBFIiwKICAgICAgZnVuY3Rpb24obmFtZSwgYWN0dWFsKSB7CiAgICAgICAgcmV0dXJuIGBUaGUgIiR7bmFtZX0iIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWA7CiAgICAgIH0sCiAgICAgIFR5cGVFcnJvcgogICAgKTsKICAgIEUoCiAgICAgICJFUlJfT1VUX09GX1JBTkdFIiwKICAgICAgZnVuY3Rpb24oc3RyLCByYW5nZSwgaW5wdXQpIHsKICAgICAgICBsZXQgbXNnMiA9IGBUaGUgdmFsdWUgb2YgIiR7c3RyfSIgaXMgb3V0IG9mIHJhbmdlLmA7CiAgICAgICAgbGV0IHJlY2VpdmVkID0gaW5wdXQ7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5wdXQpICYmIE1hdGguYWJzKGlucHV0KSA+IDIgKiogMzIpIHsKICAgICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKFN0cmluZyhpbnB1dCkpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAiYmlnaW50IikgewogICAgICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpOwogICAgICAgICAgaWYgKGlucHV0ID4gQmlnSW50KDIpICoqIEJpZ0ludCgzMikgfHwgaW5wdXQgPCAtKEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpKSkgewogICAgICAgICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihyZWNlaXZlZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZWNlaXZlZCArPSAibiI7CiAgICAgICAgfQogICAgICAgIG1zZzIgKz0gYCBJdCBtdXN0IGJlICR7cmFuZ2V9LiBSZWNlaXZlZCAke3JlY2VpdmVkfWA7CiAgICAgICAgcmV0dXJuIG1zZzI7CiAgICAgIH0sCiAgICAgIFJhbmdlRXJyb3IKICAgICk7CiAgICBmdW5jdGlvbiBhZGROdW1lcmljYWxTZXBhcmF0b3IodmFsKSB7CiAgICAgIGxldCByZXMgPSAiIjsKICAgICAgbGV0IGkyID0gdmFsLmxlbmd0aDsKICAgICAgY29uc3Qgc3RhcnQgPSB2YWxbMF0gPT09ICItIiA/IDEgOiAwOwogICAgICBmb3IgKDsgaTIgPj0gc3RhcnQgKyA0OyBpMiAtPSAzKSB7CiAgICAgICAgcmVzID0gYF8ke3ZhbC5zbGljZShpMiAtIDMsIGkyKX0ke3Jlc31gOwogICAgICB9CiAgICAgIHJldHVybiBgJHt2YWwuc2xpY2UoMCwgaTIpfSR7cmVzfWA7CiAgICB9CiAgICBmdW5jdGlvbiBjaGVja0JvdW5kcyhidWYsIG9mZnNldCwgYnl0ZUxlbmd0aDMpIHsKICAgICAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAib2Zmc2V0Iik7CiAgICAgIGlmIChidWZbb2Zmc2V0XSA9PT0gdm9pZCAwIHx8IGJ1ZltvZmZzZXQgKyBieXRlTGVuZ3RoM10gPT09IHZvaWQgMCkgewogICAgICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgYnVmLmxlbmd0aCAtIChieXRlTGVuZ3RoMyArIDEpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2hlY2tJbnRCSSh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoMykgewogICAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHsKICAgICAgICBjb25zdCBuID0gdHlwZW9mIG1pbiA9PT0gImJpZ2ludCIgPyAibiIgOiAiIjsKICAgICAgICBsZXQgcmFuZ2U7CiAgICAgICAgaWYgKGJ5dGVMZW5ndGgzID4gMykgewogICAgICAgICAgaWYgKG1pbiA9PT0gMCB8fCBtaW4gPT09IEJpZ0ludCgwKSkgewogICAgICAgICAgICByYW5nZSA9IGA+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkeyhieXRlTGVuZ3RoMyArIDEpICogOH0ke259YDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJhbmdlID0gYD49IC0oMiR7bn0gKiogJHsoYnl0ZUxlbmd0aDMgKyAxKSAqIDggLSAxfSR7bn0pIGFuZCA8IDIgKiogJHsoYnl0ZUxlbmd0aDMgKyAxKSAqIDggLSAxfSR7bn1gOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByYW5nZSA9IGA+PSAke21pbn0ke259IGFuZCA8PSAke21heH0ke259YDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKCJ2YWx1ZSIsIHJhbmdlLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgY2hlY2tCb3VuZHMoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCBuYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJudW1iZXIiKSB7CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAibnVtYmVyIiwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBib3VuZHNFcnJvcih2YWx1ZSwgbGVuZ3RoLCB0eXBlKSB7CiAgICAgIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUpIHsKICAgICAgICB2YWxpZGF0ZU51bWJlcih2YWx1ZSwgdHlwZSk7CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgIm9mZnNldCIsICJhbiBpbnRlZ2VyIiwgdmFsdWUpOwogICAgICB9CiAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UoCiAgICAgICAgdHlwZSB8fCAib2Zmc2V0IiwKICAgICAgICBgPj0gJHt0eXBlID8gMSA6IDB9IGFuZCA8PSAke2xlbmd0aH1gLAogICAgICAgIHZhbHVlCiAgICAgICk7CiAgICB9CiAgICBjb25zdCBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2c7CiAgICBmdW5jdGlvbiBiYXNlNjRjbGVhbihzdHIpIHsKICAgICAgc3RyID0gc3RyLnNwbGl0KCI9IilbMF07CiAgICAgIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgIiIpOwogICAgICBpZiAoc3RyLmxlbmd0aCA8IDIpCiAgICAgICAgcmV0dXJuICIiOwogICAgICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHsKICAgICAgICBzdHIgPSBzdHIgKyAiPSI7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZywgdW5pdHMpIHsKICAgICAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eTsKICAgICAgbGV0IGNvZGVQb2ludDsKICAgICAgY29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgICAgbGV0IGxlYWRTdXJyb2dhdGUgPSBudWxsOwogICAgICBjb25zdCBieXRlcyA9IFtdOwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGVuZ3RoOyArK2kyKSB7CiAgICAgICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaTIpOwogICAgICAgIGlmIChjb2RlUG9pbnQgPiA1NTI5NSAmJiBjb2RlUG9pbnQgPCA1NzM0NCkgewogICAgICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7CiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPiA1NjMxOSkgewogICAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkKICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goMjM5LCAxOTEsIDE4OSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaTIgKyAxID09PSBsZW5ndGgpIHsKICAgICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpCiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKDIzOSwgMTkxLCAxODkpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDU2MzIwKSB7CiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkKICAgICAgICAgICAgICBieXRlcy5wdXNoKDIzOSwgMTkxLCAxODkpOwogICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50OwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gNTUyOTYgPDwgMTAgfCBjb2RlUG9pbnQgLSA1NjMyMCkgKyA2NTUzNjsKICAgICAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHsKICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkKICAgICAgICAgICAgYnl0ZXMucHVzaCgyMzksIDE5MSwgMTg5KTsKICAgICAgICB9CiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7CiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDEyOCkgewogICAgICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpOwogICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMjA0OCkgewogICAgICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYnl0ZXMucHVzaCgKICAgICAgICAgICAgY29kZVBvaW50ID4+IDYgfCAxOTIsCiAgICAgICAgICAgIGNvZGVQb2ludCAmIDYzIHwgMTI4CiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgNjU1MzYpIHsKICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGJ5dGVzLnB1c2goCiAgICAgICAgICAgIGNvZGVQb2ludCA+PiAxMiB8IDIyNCwKICAgICAgICAgICAgY29kZVBvaW50ID4+IDYgJiA2MyB8IDEyOCwKICAgICAgICAgICAgY29kZVBvaW50ICYgNjMgfCAxMjgKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAxMTE0MTEyKSB7CiAgICAgICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBieXRlcy5wdXNoKAogICAgICAgICAgICBjb2RlUG9pbnQgPj4gMTggfCAyNDAsCiAgICAgICAgICAgIGNvZGVQb2ludCA+PiAxMiAmIDYzIHwgMTI4LAogICAgICAgICAgICBjb2RlUG9pbnQgPj4gNiAmIDYzIHwgMTI4LAogICAgICAgICAgICBjb2RlUG9pbnQgJiA2MyB8IDEyOAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJ5dGVzOwogICAgfQogICAgZnVuY3Rpb24gYXNjaWlUb0J5dGVzKHN0cikgewogICAgICBjb25zdCBieXRlQXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHN0ci5sZW5ndGg7ICsraTIpIHsKICAgICAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpMikgJiAyNTUpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlQXJyYXk7CiAgICB9CiAgICBmdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyhzdHIsIHVuaXRzKSB7CiAgICAgIGxldCBjMiwgaGksIGxvOwogICAgICBjb25zdCBieXRlQXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHN0ci5sZW5ndGg7ICsraTIpIHsKICAgICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkKICAgICAgICAgIGJyZWFrOwogICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaTIpOwogICAgICAgIGhpID0gYzIgPj4gODsKICAgICAgICBsbyA9IGMyICUgMjU2OwogICAgICAgIGJ5dGVBcnJheS5wdXNoKGxvKTsKICAgICAgICBieXRlQXJyYXkucHVzaChoaSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ5dGVBcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMoc3RyKSB7CiAgICAgIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBibGl0QnVmZmVyKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkgewogICAgICBsZXQgaTI7CiAgICAgIGZvciAoaTIgPSAwOyBpMiA8IGxlbmd0aDsgKytpMikgewogICAgICAgIGlmIChpMiArIG9mZnNldCA+PSBkc3QubGVuZ3RoIHx8IGkyID49IHNyYy5sZW5ndGgpCiAgICAgICAgICBicmVhazsKICAgICAgICBkc3RbaTIgKyBvZmZzZXRdID0gc3JjW2kyXTsKICAgICAgfQogICAgICByZXR1cm4gaTI7CiAgICB9CiAgICBmdW5jdGlvbiBpc0luc3RhbmNlKG9iaiwgdHlwZSkgewogICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fCBvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWU7CiAgICB9CiAgICBmdW5jdGlvbiBudW1iZXJJc05hTihvYmopIHsKICAgICAgcmV0dXJuIG9iaiAhPT0gb2JqOwogICAgfQogICAgY29uc3QgaGV4U2xpY2VMb29rdXBUYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBhbHBoYWJldCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKICAgICAgY29uc3QgdGFibGUgPSBuZXcgQXJyYXkoMjU2KTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IDE2OyArK2kyKSB7CiAgICAgICAgY29uc3QgaTE2ID0gaTIgKiAxNjsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaTJdICsgYWxwaGFiZXRbal07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0YWJsZTsKICAgIH0oKTsKICAgIGZ1bmN0aW9uIGRlZmluZUJpZ0ludE1ldGhvZChmbikgewogICAgICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gInVuZGVmaW5lZCIgPyBCdWZmZXJCaWdJbnROb3REZWZpbmVkIDogZm47CiAgICB9CiAgICBmdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgfSkoYnVmZmVyKTsKICB2YXIgTG9jYWxGaWxlID0gbmV3IFByb3h5KHt9LCB7CiAgICBnZXQoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlICIiIGhhcyBiZWVuIGV4dGVybmFsaXplZCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5IGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgaW4gY2xpZW50IGNvZGUuJyk7CiAgICB9CiAgfSk7CiAgY29uc3QgbXlHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB7IGZldGNoOiB2b2lkIDAgfTsKICBjbGFzcyBSZW1vdGVGaWxlJDEgewogICAgYXN5bmMgZ2V0QnVmZmVyRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJ1ZmZlcigpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXNwb25zZS5hcnJheUJ1ZmZlciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIHJldHVybiBidWZmZXIuQnVmZmVyLmZyb20ocmVzcCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBIVFRQIHJlc3BvbnNlIG9iamVjdCwgaGFzIG5vIGJ1ZmZlciBtZXRob2QsIGFuZCBubyBhcnJheUJ1ZmZlciBtZXRob2QiKTsKICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3Ioc291cmNlLCBvcHRzID0ge30pIHsKICAgICAgdGhpcy5iYXNlT3ZlcnJpZGVzID0ge307CiAgICAgIHRoaXMudXJsID0gc291cmNlOwogICAgICBjb25zdCBmZXRjaCA9IG9wdHMuZmV0Y2ggfHwgbXlHbG9iYWwuZmV0Y2ggJiYgbXlHbG9iYWwuZmV0Y2guYmluZChteUdsb2JhbCk7CiAgICAgIGlmICghZmV0Y2gpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBubyBmZXRjaCBmdW5jdGlvbiBzdXBwbGllZCwgYW5kIG5vbmUgZm91bmQgaW4gZ2xvYmFsIGVudmlyb25tZW50YCk7CiAgICAgIH0KICAgICAgaWYgKG9wdHMub3ZlcnJpZGVzKSB7CiAgICAgICAgdGhpcy5iYXNlT3ZlcnJpZGVzID0gb3B0cy5vdmVycmlkZXM7CiAgICAgIH0KICAgICAgdGhpcy5mZXRjaEltcGxlbWVudGF0aW9uID0gZmV0Y2g7CiAgICB9CiAgICBhc3luYyBmZXRjaChpbnB1dCwgaW5pdDIpIHsKICAgICAgbGV0IHJlc3BvbnNlOwogICAgICB0cnkgewogICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGxlbWVudGF0aW9uKGlucHV0LCBpbml0Mik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoYCR7ZX1gLmluY2x1ZGVzKCJGYWlsZWQgdG8gZmV0Y2giKSkgewogICAgICAgICAgY29uc29sZS53YXJuKGBnZW5lcmljLWZpbGVoYW5kbGU6IHJlZmV0Y2hpbmcgJHtpbnB1dH0gdG8gYXR0ZW1wdCB0byB3b3JrIGFyb3VuZCBjaHJvbWUgQ09SUyBoZWFkZXIgY2FjaGluZyBidWdgKTsKICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGxlbWVudGF0aW9uKGlucHV0LCB7CiAgICAgICAgICAgIC4uLmluaXQyLAogICAgICAgICAgICBjYWNoZTogInJlbG9hZCIKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9CiAgICBhc3luYyByZWFkKGJ1ZmZlcjIsIG9mZnNldCA9IDAsIGxlbmd0aCwgcG9zaXRpb24gPSAwLCBvcHRzID0ge30pIHsKICAgICAgY29uc3QgeyBoZWFkZXJzID0ge30sIHNpZ25hbCwgb3ZlcnJpZGVzID0ge30gfSA9IG9wdHM7CiAgICAgIGlmIChsZW5ndGggPCBJbmZpbml0eSkgewogICAgICAgIGhlYWRlcnMucmFuZ2UgPSBgYnl0ZXM9JHtwb3NpdGlvbn0tJHtwb3NpdGlvbiArIGxlbmd0aH1gOwogICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gSW5maW5pdHkgJiYgcG9zaXRpb24gIT09IDApIHsKICAgICAgICBoZWFkZXJzLnJhbmdlID0gYGJ5dGVzPSR7cG9zaXRpb259LWA7CiAgICAgIH0KICAgICAgY29uc3QgYXJncyA9IHsKICAgICAgICAuLi50aGlzLmJhc2VPdmVycmlkZXMsCiAgICAgICAgLi4ub3ZlcnJpZGVzLAogICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgIC4uLmhlYWRlcnMsCiAgICAgICAgICAuLi5vdmVycmlkZXMuaGVhZGVycywKICAgICAgICAgIC4uLnRoaXMuYmFzZU92ZXJyaWRlcy5oZWFkZXJzCiAgICAgICAgfSwKICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgIHJlZGlyZWN0OiAiZm9sbG93IiwKICAgICAgICBtb2RlOiAiY29ycyIsCiAgICAgICAgc2lnbmFsCiAgICAgIH07CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaCh0aGlzLnVybCwgYXJncyk7CiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gJHt0aGlzLnVybH1gKTsKICAgICAgfQogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDAgJiYgcG9zaXRpb24gPT09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDYpIHsKICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckZyb21SZXNwb25zZShyZXNwb25zZSk7CiAgICAgICAgY29uc3QgYnl0ZXNDb3BpZWQgPSByZXNwb25zZURhdGEuY29weShidWZmZXIyLCBvZmZzZXQsIDAsIE1hdGgubWluKGxlbmd0aCwgcmVzcG9uc2VEYXRhLmxlbmd0aCkpOwogICAgICAgIGNvbnN0IHJlcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCJjb250ZW50LXJhbmdlIik7CiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gL1wvKFxkKykkLy5leGVjKHJlcyB8fCAiIik7CiAgICAgICAgaWYgKHNpemVNYXRjaCAmJiBzaXplTWF0Y2hbMV0pIHsKICAgICAgICAgIHRoaXMuX3N0YXQgPSB7IHNpemU6IHBhcnNlSW50KHNpemVNYXRjaFsxXSwgMTApIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGJ5dGVzUmVhZDogYnl0ZXNDb3BpZWQsIGJ1ZmZlcjogYnVmZmVyMiB9OwogICAgICB9CiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiJHt0aGlzLnVybH0gZmV0Y2ggcmV0dXJuZWQgc3RhdHVzIDIwMCwgZXhwZWN0ZWQgMjA2Iik7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSBmZXRjaGluZyAke3RoaXMudXJsfWApOwogICAgfQogICAgYXN5bmMgcmVhZEZpbGUob3B0aW9ucyA9IHt9KSB7CiAgICAgIGxldCBlbmNvZGluZzsKICAgICAgbGV0IG9wdHM7CiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIpIHsKICAgICAgICBlbmNvZGluZyA9IG9wdGlvbnM7CiAgICAgICAgb3B0cyA9IHt9OwogICAgICB9IGVsc2UgewogICAgICAgIGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZzsKICAgICAgICBvcHRzID0gb3B0aW9uczsKICAgICAgICBkZWxldGUgb3B0cy5lbmNvZGluZzsKICAgICAgfQogICAgICBjb25zdCB7IGhlYWRlcnMgPSB7fSwgc2lnbmFsLCBvdmVycmlkZXMgPSB7fSB9ID0gb3B0czsKICAgICAgY29uc3QgYXJncyA9IHsKICAgICAgICBoZWFkZXJzLAogICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgcmVkaXJlY3Q6ICJmb2xsb3ciLAogICAgICAgIG1vZGU6ICJjb3JzIiwKICAgICAgICBzaWduYWwsCiAgICAgICAgLi4udGhpcy5iYXNlT3ZlcnJpZGVzLAogICAgICAgIC4uLm92ZXJyaWRlcwogICAgICB9OwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy51cmwsIGFyZ3MpOwogICAgICBpZiAoIXJlc3BvbnNlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJnZW5lcmljLWZpbGVoYW5kbGUgZmFpbGVkIHRvIGZldGNoIik7CiAgICAgIH0KICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9IGZldGNoaW5nICR7dGhpcy51cmx9YCksIHsKICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGVuY29kaW5nID09PSAidXRmOCIpIHsKICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgICB9CiAgICAgIGlmIChlbmNvZGluZykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKICAgIH0KICAgIGFzeW5jIHN0YXQoKSB7CiAgICAgIGlmICghdGhpcy5fc3RhdCkgewogICAgICAgIGNvbnN0IGJ1ZiA9IGJ1ZmZlci5CdWZmZXIuYWxsb2NVbnNhZmUoMTApOwogICAgICAgIGF3YWl0IHRoaXMucmVhZChidWYsIDAsIDEwLCAwKTsKICAgICAgICBpZiAoIXRoaXMuX3N0YXQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5hYmxlIHRvIGRldGVybWluZSBzaXplIG9mIGZpbGUgYXQgJHt0aGlzLnVybH1gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3N0YXQ7CiAgICB9CiAgICBhc3luYyBjbG9zZSgpIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICB2YXIgY29tbW9uJDEgPSB7fTsKICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIHZhciBUWVBFRF9PSyA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgVWludDE2QXJyYXkgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAidW5kZWZpbmVkIjsKICAgIGZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7CiAgICB9CiAgICBleHBvcnRzMi5hc3NpZ24gPSBmdW5jdGlvbihvYmopIHsKICAgICAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHsKICAgICAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpOwogICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICJtdXN0IGJlIG5vbi1vYmplY3QiKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHsKICAgICAgICAgIGlmIChfaGFzKHNvdXJjZSwgcCkpIHsKICAgICAgICAgICAgb2JqW3BdID0gc291cmNlW3BdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqOwogICAgfTsKICAgIGV4cG9ydHMyLnNocmlua0J1ZiA9IGZ1bmN0aW9uKGJ1Ziwgc2l6ZSkgewogICAgICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgewogICAgICAgIHJldHVybiBidWY7CiAgICAgIH0KICAgICAgaWYgKGJ1Zi5zdWJhcnJheSkgewogICAgICAgIHJldHVybiBidWYuc3ViYXJyYXkoMCwgc2l6ZSk7CiAgICAgIH0KICAgICAgYnVmLmxlbmd0aCA9IHNpemU7CiAgICAgIHJldHVybiBidWY7CiAgICB9OwogICAgdmFyIGZuVHlwZWQgPSB7CiAgICAgIGFycmF5U2V0OiBmdW5jdGlvbihkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4yLCBkZXN0X29mZnMpIHsKICAgICAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHsKICAgICAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4yKSwgZGVzdF9vZmZzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IGxlbjI7IGkyKyspIHsKICAgICAgICAgIGRlc3RbZGVzdF9vZmZzICsgaTJdID0gc3JjW3NyY19vZmZzICsgaTJdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24oY2h1bmtzKSB7CiAgICAgICAgdmFyIGkyLCBsLCBsZW4yLCBwb3MsIGNodW5rLCByZXN1bHQ7CiAgICAgICAgbGVuMiA9IDA7CiAgICAgICAgZm9yIChpMiA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpMiA8IGw7IGkyKyspIHsKICAgICAgICAgIGxlbjIgKz0gY2h1bmtzW2kyXS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbjIpOwogICAgICAgIHBvcyA9IDA7CiAgICAgICAgZm9yIChpMiA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpMiA8IGw7IGkyKyspIHsKICAgICAgICAgIGNodW5rID0gY2h1bmtzW2kyXTsKICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7CiAgICAgICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9OwogICAgdmFyIGZuVW50eXBlZCA9IHsKICAgICAgYXJyYXlTZXQ6IGZ1bmN0aW9uKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbjIsIGRlc3Rfb2ZmcykgewogICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBsZW4yOyBpMisrKSB7CiAgICAgICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGkyXSA9IHNyY1tzcmNfb2ZmcyArIGkyXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uKGNodW5rcykgewogICAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5zZXRUeXBlZCA9IGZ1bmN0aW9uKG9uKSB7CiAgICAgIGlmIChvbikgewogICAgICAgIGV4cG9ydHMyLkJ1ZjggPSBVaW50OEFycmF5OwogICAgICAgIGV4cG9ydHMyLkJ1ZjE2ID0gVWludDE2QXJyYXk7CiAgICAgICAgZXhwb3J0czIuQnVmMzIgPSBJbnQzMkFycmF5OwogICAgICAgIGV4cG9ydHMyLmFzc2lnbihleHBvcnRzMiwgZm5UeXBlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXhwb3J0czIuQnVmOCA9IEFycmF5OwogICAgICAgIGV4cG9ydHMyLkJ1ZjE2ID0gQXJyYXk7CiAgICAgICAgZXhwb3J0czIuQnVmMzIgPSBBcnJheTsKICAgICAgICBleHBvcnRzMi5hc3NpZ24oZXhwb3J0czIsIGZuVW50eXBlZCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5zZXRUeXBlZChUWVBFRF9PSyk7CiAgfSkoY29tbW9uJDEpOwogIHZhciBkZWZsYXRlJDQgPSB7fTsKICB2YXIgZGVmbGF0ZSQzID0ge307CiAgdmFyIHRyZWVzJDEgPSB7fTsKICB2YXIgdXRpbHMkNiA9IGNvbW1vbiQxOwogIHZhciBaX0ZJWEVEJDEgPSA0OwogIHZhciBaX0JJTkFSWSA9IDA7CiAgdmFyIFpfVEVYVCA9IDE7CiAgdmFyIFpfVU5LTk9XTiQxID0gMjsKICBmdW5jdGlvbiB6ZXJvJDEoYnVmKSB7CiAgICB2YXIgbGVuMiA9IGJ1Zi5sZW5ndGg7CiAgICB3aGlsZSAoLS1sZW4yID49IDApIHsKICAgICAgYnVmW2xlbjJdID0gMDsKICAgIH0KICB9CiAgdmFyIFNUT1JFRF9CTE9DSyA9IDA7CiAgdmFyIFNUQVRJQ19UUkVFUyA9IDE7CiAgdmFyIERZTl9UUkVFUyA9IDI7CiAgdmFyIE1JTl9NQVRDSCQxID0gMzsKICB2YXIgTUFYX01BVENIJDEgPSAyNTg7CiAgdmFyIExFTkdUSF9DT0RFUyQxID0gMjk7CiAgdmFyIExJVEVSQUxTJDEgPSAyNTY7CiAgdmFyIExfQ09ERVMkMSA9IExJVEVSQUxTJDEgKyAxICsgTEVOR1RIX0NPREVTJDE7CiAgdmFyIERfQ09ERVMkMSA9IDMwOwogIHZhciBCTF9DT0RFUyQxID0gMTk7CiAgdmFyIEhFQVBfU0laRSQxID0gMiAqIExfQ09ERVMkMSArIDE7CiAgdmFyIE1BWF9CSVRTJDEgPSAxNTsKICB2YXIgQnVmX3NpemUgPSAxNjsKICB2YXIgTUFYX0JMX0JJVFMgPSA3OwogIHZhciBFTkRfQkxPQ0sgPSAyNTY7CiAgdmFyIFJFUF8zXzYgPSAxNjsKICB2YXIgUkVQWl8zXzEwID0gMTc7CiAgdmFyIFJFUFpfMTFfMTM4ID0gMTg7CiAgdmFyIGV4dHJhX2xiaXRzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDBdOwogIHZhciBleHRyYV9kYml0cyA9IFswLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTNdOwogIHZhciBleHRyYV9ibGJpdHMgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgN107CiAgdmFyIGJsX29yZGVyID0gWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdOwogIHZhciBESVNUX0NPREVfTEVOID0gNTEyOwogIHZhciBzdGF0aWNfbHRyZWUgPSBuZXcgQXJyYXkoKExfQ09ERVMkMSArIDIpICogMik7CiAgemVybyQxKHN0YXRpY19sdHJlZSk7CiAgdmFyIHN0YXRpY19kdHJlZSA9IG5ldyBBcnJheShEX0NPREVTJDEgKiAyKTsKICB6ZXJvJDEoc3RhdGljX2R0cmVlKTsKICB2YXIgX2Rpc3RfY29kZSA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTsKICB6ZXJvJDEoX2Rpc3RfY29kZSk7CiAgdmFyIF9sZW5ndGhfY29kZSA9IG5ldyBBcnJheShNQVhfTUFUQ0gkMSAtIE1JTl9NQVRDSCQxICsgMSk7CiAgemVybyQxKF9sZW5ndGhfY29kZSk7CiAgdmFyIGJhc2VfbGVuZ3RoID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyQxKTsKICB6ZXJvJDEoYmFzZV9sZW5ndGgpOwogIHZhciBiYXNlX2Rpc3QgPSBuZXcgQXJyYXkoRF9DT0RFUyQxKTsKICB6ZXJvJDEoYmFzZV9kaXN0KTsKICBmdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHsKICAgIHRoaXMuc3RhdGljX3RyZWUgPSBzdGF0aWNfdHJlZTsKICAgIHRoaXMuZXh0cmFfYml0cyA9IGV4dHJhX2JpdHM7CiAgICB0aGlzLmV4dHJhX2Jhc2UgPSBleHRyYV9iYXNlOwogICAgdGhpcy5lbGVtcyA9IGVsZW1zOwogICAgdGhpcy5tYXhfbGVuZ3RoID0gbWF4X2xlbmd0aDsKICAgIHRoaXMuaGFzX3N0cmVlID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoOwogIH0KICB2YXIgc3RhdGljX2xfZGVzYzsKICB2YXIgc3RhdGljX2RfZGVzYzsKICB2YXIgc3RhdGljX2JsX2Rlc2M7CiAgZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykgewogICAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOwogICAgdGhpcy5tYXhfY29kZSA9IDA7CiAgICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsKICB9CiAgZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHsKICAgIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTsKICB9CiAgZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHsKICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gdyAmIDI1NTsKICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gdyA+Pj4gOCAmIDI1NTsKICB9CiAgZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHsKICAgIGlmIChzLmJpX3ZhbGlkID4gQnVmX3NpemUgLSBsZW5ndGgpIHsKICAgICAgcy5iaV9idWYgfD0gdmFsdWUgPDwgcy5iaV92YWxpZCAmIDY1NTM1OwogICAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpOwogICAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IEJ1Zl9zaXplIC0gcy5iaV92YWxpZDsKICAgICAgcy5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKICAgIH0gZWxzZSB7CiAgICAgIHMuYmlfYnVmIHw9IHZhbHVlIDw8IHMuYmlfdmFsaWQgJiA2NTUzNTsKICAgICAgcy5iaV92YWxpZCArPSBsZW5ndGg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNlbmRfY29kZShzLCBjMiwgdHJlZSkgewogICAgc2VuZF9iaXRzKHMsIHRyZWVbYzIgKiAyXSwgdHJlZVtjMiAqIDIgKyAxXSk7CiAgfQogIGZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZTIsIGxlbjIpIHsKICAgIHZhciByZXMgPSAwOwogICAgZG8gewogICAgICByZXMgfD0gY29kZTIgJiAxOwogICAgICBjb2RlMiA+Pj49IDE7CiAgICAgIHJlcyA8PD0gMTsKICAgIH0gd2hpbGUgKC0tbGVuMiA+IDApOwogICAgcmV0dXJuIHJlcyA+Pj4gMTsKICB9CiAgZnVuY3Rpb24gYmlfZmx1c2gocykgewogICAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7CiAgICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7CiAgICAgIHMuYmlfYnVmID0gMDsKICAgICAgcy5iaV92YWxpZCA9IDA7CiAgICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkgewogICAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMjU1OwogICAgICBzLmJpX2J1ZiA+Pj0gODsKICAgICAgcy5iaV92YWxpZCAtPSA4OwogICAgfQogIH0KICBmdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpIHsKICAgIHZhciB0cmVlID0gZGVzYy5keW5fdHJlZTsKICAgIHZhciBtYXhfY29kZSA9IGRlc2MubWF4X2NvZGU7CiAgICB2YXIgc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTsKICAgIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7CiAgICB2YXIgZXh0cmEgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzOwogICAgdmFyIGJhc2UgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlOwogICAgdmFyIG1heF9sZW5ndGggPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoOwogICAgdmFyIGg7CiAgICB2YXIgbiwgbTsKICAgIHZhciBiaXRzOwogICAgdmFyIHhiaXRzOwogICAgdmFyIGY7CiAgICB2YXIgb3ZlcmZsb3cgPSAwOwogICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHsKICAgICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7CiAgICB9CiAgICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXSA9IDA7CiAgICBmb3IgKGggPSBzLmhlYXBfbWF4ICsgMTsgaCA8IEhFQVBfU0laRSQxOyBoKyspIHsKICAgICAgbiA9IHMuaGVhcFtoXTsKICAgICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdICogMiArIDFdICsgMTsKICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7CiAgICAgICAgYml0cyA9IG1heF9sZW5ndGg7CiAgICAgICAgb3ZlcmZsb3crKzsKICAgICAgfQogICAgICB0cmVlW24gKiAyICsgMV0gPSBiaXRzOwogICAgICBpZiAobiA+IG1heF9jb2RlKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcy5ibF9jb3VudFtiaXRzXSsrOwogICAgICB4Yml0cyA9IDA7CiAgICAgIGlmIChuID49IGJhc2UpIHsKICAgICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTsKICAgICAgfQogICAgICBmID0gdHJlZVtuICogMl07CiAgICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7CiAgICAgIGlmIChoYXNfc3RyZWUpIHsKICAgICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdICsgeGJpdHMpOwogICAgICB9CiAgICB9CiAgICBpZiAob3ZlcmZsb3cgPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZG8gewogICAgICBiaXRzID0gbWF4X2xlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7CiAgICAgICAgYml0cy0tOwogICAgICB9CiAgICAgIHMuYmxfY291bnRbYml0c10tLTsKICAgICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsKICAgICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOwogICAgICBvdmVyZmxvdyAtPSAyOwogICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKICAgIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT09IDA7IGJpdHMtLSkgewogICAgICBuID0gcy5ibF9jb3VudFtiaXRzXTsKICAgICAgd2hpbGUgKG4gIT09IDApIHsKICAgICAgICBtID0gcy5oZWFwWy0taF07CiAgICAgICAgaWYgKG0gPiBtYXhfY29kZSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0cmVlW20gKiAyICsgMV0gIT09IGJpdHMpIHsKICAgICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXSkgKiB0cmVlW20gKiAyXTsKICAgICAgICAgIHRyZWVbbSAqIDIgKyAxXSA9IGJpdHM7CiAgICAgICAgfQogICAgICAgIG4tLTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KSB7CiAgICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTJDEgKyAxKTsKICAgIHZhciBjb2RlMiA9IDA7CiAgICB2YXIgYml0czsKICAgIHZhciBuOwogICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHsKICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZTIgPSBjb2RlMiArIGJsX2NvdW50W2JpdHMgLSAxXSA8PCAxOwogICAgfQogICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CiAgICAgIHZhciBsZW4yID0gdHJlZVtuICogMiArIDFdOwogICAgICBpZiAobGVuMiA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRyZWVbbiAqIDJdID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuMl0rKywgbGVuMik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkgewogICAgdmFyIG47CiAgICB2YXIgYml0czsKICAgIHZhciBsZW5ndGg7CiAgICB2YXIgY29kZTI7CiAgICB2YXIgZGlzdDsKICAgIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyQxICsgMSk7CiAgICBsZW5ndGggPSAwOwogICAgZm9yIChjb2RlMiA9IDA7IGNvZGUyIDwgTEVOR1RIX0NPREVTJDEgLSAxOyBjb2RlMisrKSB7CiAgICAgIGJhc2VfbGVuZ3RoW2NvZGUyXSA9IGxlbmd0aDsKICAgICAgZm9yIChuID0gMDsgbiA8IDEgPDwgZXh0cmFfbGJpdHNbY29kZTJdOyBuKyspIHsKICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTI7CiAgICAgIH0KICAgIH0KICAgIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGUyOwogICAgZGlzdCA9IDA7CiAgICBmb3IgKGNvZGUyID0gMDsgY29kZTIgPCAxNjsgY29kZTIrKykgewogICAgICBiYXNlX2Rpc3RbY29kZTJdID0gZGlzdDsKICAgICAgZm9yIChuID0gMDsgbiA8IDEgPDwgZXh0cmFfZGJpdHNbY29kZTJdOyBuKyspIHsKICAgICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlMjsKICAgICAgfQogICAgfQogICAgZGlzdCA+Pj0gNzsKICAgIGZvciAoOyBjb2RlMiA8IERfQ09ERVMkMTsgY29kZTIrKykgewogICAgICBiYXNlX2Rpc3RbY29kZTJdID0gZGlzdCA8PCA3OwogICAgICBmb3IgKG4gPSAwOyBuIDwgMSA8PCBleHRyYV9kYml0c1tjb2RlMl0gLSA3OyBuKyspIHsKICAgICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlMjsKICAgICAgfQogICAgfQogICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHsKICAgICAgYmxfY291bnRbYml0c10gPSAwOwogICAgfQogICAgbiA9IDA7CiAgICB3aGlsZSAobiA8PSAxNDMpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA4OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzhdKys7CiAgICB9CiAgICB3aGlsZSAobiA8PSAyNTUpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA5OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzldKys7CiAgICB9CiAgICB3aGlsZSAobiA8PSAyNzkpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA3OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzddKys7CiAgICB9CiAgICB3aGlsZSAobiA8PSAyODcpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA4OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzhdKys7CiAgICB9CiAgICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTJDEgKyAxLCBibF9jb3VudCk7CiAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUyQxOyBuKyspIHsKICAgICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0gPSA1OwogICAgICBzdGF0aWNfZHRyZWVbbiAqIDJdID0gYmlfcmV2ZXJzZShuLCA1KTsKICAgIH0KICAgIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMkMSArIDEsIExfQ09ERVMkMSwgTUFYX0JJVFMkMSk7CiAgICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsIERfQ09ERVMkMSwgTUFYX0JJVFMkMSk7CiAgICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgQkxfQ09ERVMkMSwgTUFYX0JMX0JJVFMpOwogIH0KICBmdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHsKICAgIHZhciBuOwogICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVMkMTsgbisrKSB7CiAgICAgIHMuZHluX2x0cmVlW24gKiAyXSA9IDA7CiAgICB9CiAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUyQxOyBuKyspIHsKICAgICAgcy5keW5fZHRyZWVbbiAqIDJdID0gMDsKICAgIH0KICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUyQxOyBuKyspIHsKICAgICAgcy5ibF90cmVlW24gKiAyXSA9IDA7CiAgICB9CiAgICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXSA9IDE7CiAgICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwOwogICAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7CiAgfQogIGZ1bmN0aW9uIGJpX3dpbmR1cChzKSB7CiAgICBpZiAocy5iaV92YWxpZCA+IDgpIHsKICAgICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTsKICAgIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHsKICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjsKICAgIH0KICAgIHMuYmlfYnVmID0gMDsKICAgIHMuYmlfdmFsaWQgPSAwOwogIH0KICBmdW5jdGlvbiBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuMiwgaGVhZGVyKSB7CiAgICBiaV93aW5kdXAocyk7CiAgICBpZiAoaGVhZGVyKSB7CiAgICAgIHB1dF9zaG9ydChzLCBsZW4yKTsKICAgICAgcHV0X3Nob3J0KHMsIH5sZW4yKTsKICAgIH0KICAgIHV0aWxzJDYuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuMiwgcy5wZW5kaW5nKTsKICAgIHMucGVuZGluZyArPSBsZW4yOwogIH0KICBmdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7CiAgICB2YXIgX24yID0gbiAqIDI7CiAgICB2YXIgX20yID0gbSAqIDI7CiAgICByZXR1cm4gdHJlZVtfbjJdIDwgdHJlZVtfbTJdIHx8IHRyZWVbX24yXSA9PT0gdHJlZVtfbTJdICYmIGRlcHRoW25dIDw9IGRlcHRoW21dOwogIH0KICBmdW5jdGlvbiBwcWRvd25oZWFwKHMsIHRyZWUsIGspIHsKICAgIHZhciB2ID0gcy5oZWFwW2tdOwogICAgdmFyIGogPSBrIDw8IDE7CiAgICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7CiAgICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJiBzbWFsbGVyKHRyZWUsIHMuaGVhcFtqICsgMV0sIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsKICAgICAgICBqKys7CiAgICAgIH0KICAgICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTsKICAgICAgayA9IGo7CiAgICAgIGogPDw9IDE7CiAgICB9CiAgICBzLmhlYXBba10gPSB2OwogIH0KICBmdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpIHsKICAgIHZhciBkaXN0OwogICAgdmFyIGxjOwogICAgdmFyIGx4ID0gMDsKICAgIHZhciBjb2RlMjsKICAgIHZhciBleHRyYTsKICAgIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7CiAgICAgIGRvIHsKICAgICAgICBkaXN0ID0gcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyXSA8PCA4IHwgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV07CiAgICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07CiAgICAgICAgbHgrKzsKICAgICAgICBpZiAoZGlzdCA9PT0gMCkgewogICAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvZGUyID0gX2xlbmd0aF9jb2RlW2xjXTsKICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlMiArIExJVEVSQUxTJDEgKyAxLCBsdHJlZSk7CiAgICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGUyXTsKICAgICAgICAgIGlmIChleHRyYSAhPT0gMCkgewogICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlMl07CiAgICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOwogICAgICAgICAgfQogICAgICAgICAgZGlzdC0tOwogICAgICAgICAgY29kZTIgPSBkX2NvZGUoZGlzdCk7CiAgICAgICAgICBzZW5kX2NvZGUocywgY29kZTIsIGR0cmVlKTsKICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZTJdOwogICAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7CiAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGUyXTsKICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gd2hpbGUgKGx4IDwgcy5sYXN0X2xpdCk7CiAgICB9CiAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkX3RyZWUocywgZGVzYykgewogICAgdmFyIHRyZWUgPSBkZXNjLmR5bl90cmVlOwogICAgdmFyIHN0cmVlID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7CiAgICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlOwogICAgdmFyIGVsZW1zID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7CiAgICB2YXIgbiwgbTsKICAgIHZhciBtYXhfY29kZSA9IC0xOwogICAgdmFyIG5vZGU7CiAgICBzLmhlYXBfbGVuID0gMDsKICAgIHMuaGVhcF9tYXggPSBIRUFQX1NJWkUkMTsKICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7CiAgICAgIGlmICh0cmVlW24gKiAyXSAhPT0gMCkgewogICAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuOwogICAgICAgIHMuZGVwdGhbbl0gPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRyZWVbbiAqIDIgKyAxXSA9IDA7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChzLmhlYXBfbGVuIDwgMikgewogICAgICBub2RlID0gcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMDsKICAgICAgdHJlZVtub2RlICogMl0gPSAxOwogICAgICBzLmRlcHRoW25vZGVdID0gMDsKICAgICAgcy5vcHRfbGVuLS07CiAgICAgIGlmIChoYXNfc3RyZWUpIHsKICAgICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXTsKICAgICAgfQogICAgfQogICAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlOwogICAgZm9yIChuID0gcy5oZWFwX2xlbiA+PiAxOyBuID49IDE7IG4tLSkgewogICAgICBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOwogICAgfQogICAgbm9kZSA9IGVsZW1zOwogICAgZG8gewogICAgICBuID0gcy5oZWFwWzFdOwogICAgICBzLmhlYXBbMV0gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTsKICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCAxKTsKICAgICAgbSA9IHMuaGVhcFsxXTsKICAgICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOwogICAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07CiAgICAgIHRyZWVbbm9kZSAqIDJdID0gdHJlZVtuICogMl0gKyB0cmVlW20gKiAyXTsKICAgICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxOwogICAgICB0cmVlW24gKiAyICsgMV0gPSB0cmVlW20gKiAyICsgMV0gPSBub2RlOwogICAgICBzLmhlYXBbMV0gPSBub2RlKys7CiAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgMSk7CiAgICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpOwogICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMV07CiAgICBnZW5fYml0bGVuKHMsIGRlc2MpOwogICAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTsKICB9CiAgZnVuY3Rpb24gc2Nhbl90cmVlKHMsIHRyZWUsIG1heF9jb2RlKSB7CiAgICB2YXIgbjsKICAgIHZhciBwcmV2bGVuID0gLTE7CiAgICB2YXIgY3VybGVuOwogICAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV07CiAgICB2YXIgY291bnQgPSAwOwogICAgdmFyIG1heF9jb3VudCA9IDc7CiAgICB2YXIgbWluX2NvdW50ID0gNDsKICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgIG1heF9jb3VudCA9IDEzODsKICAgICAgbWluX2NvdW50ID0gMzsKICAgIH0KICAgIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0gPSA2NTUzNTsKICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgewogICAgICBjdXJsZW4gPSBuZXh0bGVuOwogICAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdOwogICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewogICAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXSArPSBjb3VudDsKICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHsKICAgICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7CiAgICAgICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0rKzsKICAgICAgICB9CiAgICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXSsrOwogICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CiAgICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4ICogMl0rKzsKICAgICAgfQogICAgICBjb3VudCA9IDA7CiAgICAgIHByZXZsZW4gPSBjdXJsZW47CiAgICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgICAgbWF4X2NvdW50ID0gMTM4OwogICAgICAgIG1pbl9jb3VudCA9IDM7CiAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgICAgbWF4X2NvdW50ID0gNjsKICAgICAgICBtaW5fY291bnQgPSAzOwogICAgICB9IGVsc2UgewogICAgICAgIG1heF9jb3VudCA9IDc7CiAgICAgICAgbWluX2NvdW50ID0gNDsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpIHsKICAgIHZhciBuOwogICAgdmFyIHByZXZsZW4gPSAtMTsKICAgIHZhciBjdXJsZW47CiAgICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXTsKICAgIHZhciBjb3VudCA9IDA7CiAgICB2YXIgbWF4X2NvdW50ID0gNzsKICAgIHZhciBtaW5fY291bnQgPSA0OwogICAgaWYgKG5leHRsZW4gPT09IDApIHsKICAgICAgbWF4X2NvdW50ID0gMTM4OwogICAgICBtaW5fY291bnQgPSAzOwogICAgfQogICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CiAgICAgIGN1cmxlbiA9IG5leHRsZW47CiAgICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV07CiAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CiAgICAgICAgZG8gewogICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsKICAgICAgICB9IHdoaWxlICgtLWNvdW50ICE9PSAwKTsKICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHsKICAgICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7CiAgICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOwogICAgICAgICAgY291bnQtLTsKICAgICAgICB9CiAgICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7CiAgICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7CiAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKICAgICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpOwogICAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDMpOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTsKICAgICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7CiAgICAgIH0KICAgICAgY291bnQgPSAwOwogICAgICBwcmV2bGVuID0gY3VybGVuOwogICAgICBpZiAobmV4dGxlbiA9PT0gMCkgewogICAgICAgIG1heF9jb3VudCA9IDEzODsKICAgICAgICBtaW5fY291bnQgPSAzOwogICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikgewogICAgICAgIG1heF9jb3VudCA9IDY7CiAgICAgICAgbWluX2NvdW50ID0gMzsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXhfY291bnQgPSA3OwogICAgICAgIG1pbl9jb3VudCA9IDQ7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7CiAgICB2YXIgbWF4X2JsaW5kZXg7CiAgICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTsKICAgIHNjYW5fdHJlZShzLCBzLmR5bl9kdHJlZSwgcy5kX2Rlc2MubWF4X2NvZGUpOwogICAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpOwogICAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTJDEgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CiAgICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdICE9PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7CiAgICByZXR1cm4gbWF4X2JsaW5kZXg7CiAgfQogIGZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKSB7CiAgICB2YXIgcmFuazI7CiAgICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsKICAgIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCA1KTsKICAgIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgNCk7CiAgICBmb3IgKHJhbmsyID0gMDsgcmFuazIgPCBibGNvZGVzOyByYW5rMisrKSB7CiAgICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFuazJdICogMiArIDFdLCAzKTsKICAgIH0KICAgIHNlbmRfdHJlZShzLCBzLmR5bl9sdHJlZSwgbGNvZGVzIC0gMSk7CiAgICBzZW5kX3RyZWUocywgcy5keW5fZHRyZWUsIGRjb2RlcyAtIDEpOwogIH0KICBmdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHsKICAgIHZhciBibGFja19tYXNrID0gNDA5MzYyNDQ0NzsKICAgIHZhciBuOwogICAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkgewogICAgICBpZiAoYmxhY2tfbWFzayAmIDEgJiYgcy5keW5fbHRyZWVbbiAqIDJdICE9PSAwKSB7CiAgICAgICAgcmV0dXJuIFpfQklOQVJZOwogICAgICB9CiAgICB9CiAgICBpZiAocy5keW5fbHRyZWVbOSAqIDJdICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0gIT09IDAgfHwgcy5keW5fbHRyZWVbMTMgKiAyXSAhPT0gMCkgewogICAgICByZXR1cm4gWl9URVhUOwogICAgfQogICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUyQxOyBuKyspIHsKICAgICAgaWYgKHMuZHluX2x0cmVlW24gKiAyXSAhPT0gMCkgewogICAgICAgIHJldHVybiBaX1RFWFQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBaX0JJTkFSWTsKICB9CiAgdmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTsKICBmdW5jdGlvbiBfdHJfaW5pdChzKSB7CiAgICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHsKICAgICAgdHJfc3RhdGljX2luaXQoKTsKICAgICAgc3RhdGljX2luaXRfZG9uZSA9IHRydWU7CiAgICB9CiAgICBzLmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7CiAgICBzLmRfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7CiAgICBzLmJsX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5ibF90cmVlLCBzdGF0aWNfYmxfZGVzYyk7CiAgICBzLmJpX2J1ZiA9IDA7CiAgICBzLmJpX3ZhbGlkID0gMDsKICAgIGluaXRfYmxvY2socyk7CiAgfQogIGZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KSB7CiAgICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsKICAgIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gX3RyX2FsaWduKHMpIHsKICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVMgPDwgMSwgMyk7CiAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOwogICAgYmlfZmx1c2gocyk7CiAgfQogIGZ1bmN0aW9uIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpIHsKICAgIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7CiAgICB2YXIgbWF4X2JsaW5kZXggPSAwOwogICAgaWYgKHMubGV2ZWwgPiAwKSB7CiAgICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04kMSkgewogICAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpOwogICAgICB9CiAgICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpOwogICAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTsKICAgICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpOwogICAgICBvcHRfbGVuYiA9IHMub3B0X2xlbiArIDMgKyA3ID4+PiAzOwogICAgICBzdGF0aWNfbGVuYiA9IHMuc3RhdGljX2xlbiArIDMgKyA3ID4+PiAzOwogICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsKICAgICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7CiAgICB9CiAgICBpZiAoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIgJiYgYnVmICE9PSAtMSkgewogICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7CiAgICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQkMSB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHsKICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7CiAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOwogICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTsKICAgICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTsKICAgIH0KICAgIGluaXRfYmxvY2socyk7CiAgICBpZiAobGFzdCkgewogICAgICBiaV93aW5kdXAocyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYykgewogICAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdID0gZGlzdCA+Pj4gOCAmIDI1NTsKICAgIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMjU1OwogICAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDI1NTsKICAgIHMubGFzdF9saXQrKzsKICAgIGlmIChkaXN0ID09PSAwKSB7CiAgICAgIHMuZHluX2x0cmVlW2xjICogMl0rKzsKICAgIH0gZWxzZSB7CiAgICAgIHMubWF0Y2hlcysrOwogICAgICBkaXN0LS07CiAgICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMkMSArIDEpICogMl0rKzsKICAgICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0rKzsKICAgIH0KICAgIHJldHVybiBzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMTsKICB9CiAgdHJlZXMkMS5fdHJfaW5pdCA9IF90cl9pbml0OwogIHRyZWVzJDEuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7CiAgdHJlZXMkMS5fdHJfZmx1c2hfYmxvY2sgPSBfdHJfZmx1c2hfYmxvY2s7CiAgdHJlZXMkMS5fdHJfdGFsbHkgPSBfdHJfdGFsbHk7CiAgdHJlZXMkMS5fdHJfYWxpZ24gPSBfdHJfYWxpZ247CiAgZnVuY3Rpb24gYWRsZXIzMiQyKGFkbGVyLCBidWYsIGxlbjIsIHBvcykgewogICAgdmFyIHMxID0gYWRsZXIgJiA2NTUzNSB8IDAsIHMyID0gYWRsZXIgPj4+IDE2ICYgNjU1MzUgfCAwLCBuID0gMDsKICAgIHdoaWxlIChsZW4yICE9PSAwKSB7CiAgICAgIG4gPSBsZW4yID4gMmUzID8gMmUzIDogbGVuMjsKICAgICAgbGVuMiAtPSBuOwogICAgICBkbyB7CiAgICAgICAgczEgPSBzMSArIGJ1Zltwb3MrK10gfCAwOwogICAgICAgIHMyID0gczIgKyBzMSB8IDA7CiAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgIHMxICU9IDY1NTIxOwogICAgICBzMiAlPSA2NTUyMTsKICAgIH0KICAgIHJldHVybiBzMSB8IHMyIDw8IDE2IHwgMDsKICB9CiAgdmFyIGFkbGVyMzJfMSA9IGFkbGVyMzIkMjsKICBmdW5jdGlvbiBtYWtlVGFibGUoKSB7CiAgICB2YXIgYzIsIHRhYmxlID0gW107CiAgICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7CiAgICAgIGMyID0gbjsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHsKICAgICAgICBjMiA9IGMyICYgMSA/IDM5ODgyOTIzODQgXiBjMiA+Pj4gMSA6IGMyID4+PiAxOwogICAgICB9CiAgICAgIHRhYmxlW25dID0gYzI7CiAgICB9CiAgICByZXR1cm4gdGFibGU7CiAgfQogIHZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpOwogIGZ1bmN0aW9uIGNyYzMyJDIoY3JjLCBidWYsIGxlbjIsIHBvcykgewogICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuMjsKICAgIGNyYyBePSAtMTsKICAgIGZvciAodmFyIGkyID0gcG9zOyBpMiA8IGVuZDsgaTIrKykgewogICAgICBjcmMgPSBjcmMgPj4+IDggXiB0WyhjcmMgXiBidWZbaTJdKSAmIDI1NV07CiAgICB9CiAgICByZXR1cm4gY3JjIF4gLTE7CiAgfQogIHZhciBjcmMzMl8xID0gY3JjMzIkMjsKICB2YXIgbWVzc2FnZXMkMSA9IHsKICAgIDI6ICJuZWVkIGRpY3Rpb25hcnkiLAogICAgMTogInN0cmVhbSBlbmQiLAogICAgMDogIiIsCiAgICAiLTEiOiAiZmlsZSBlcnJvciIsCiAgICAiLTIiOiAic3RyZWFtIGVycm9yIiwKICAgICItMyI6ICJkYXRhIGVycm9yIiwKICAgICItNCI6ICJpbnN1ZmZpY2llbnQgbWVtb3J5IiwKICAgICItNSI6ICJidWZmZXIgZXJyb3IiLAogICAgIi02IjogImluY29tcGF0aWJsZSB2ZXJzaW9uIgogIH07CiAgdmFyIHV0aWxzJDUgPSBjb21tb24kMTsKICB2YXIgdHJlZXMgPSB0cmVlcyQxOwogIHZhciBhZGxlcjMyJDEgPSBhZGxlcjMyXzE7CiAgdmFyIGNyYzMyJDEgPSBjcmMzMl8xOwogIHZhciBtc2ckMiA9IG1lc3NhZ2VzJDE7CiAgdmFyIFpfTk9fRkxVU0gkMSA9IDA7CiAgdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7CiAgdmFyIFpfRlVMTF9GTFVTSCA9IDM7CiAgdmFyIFpfRklOSVNIJDIgPSA0OwogIHZhciBaX0JMT0NLJDEgPSA1OwogIHZhciBaX09LJDIgPSAwOwogIHZhciBaX1NUUkVBTV9FTkQkMiA9IDE7CiAgdmFyIFpfU1RSRUFNX0VSUk9SJDEgPSAtMjsKICB2YXIgWl9EQVRBX0VSUk9SJDEgPSAtMzsKICB2YXIgWl9CVUZfRVJST1IkMSA9IC01OwogIHZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04kMSA9IC0xOwogIHZhciBaX0ZJTFRFUkVEID0gMTsKICB2YXIgWl9IVUZGTUFOX09OTFkgPSAyOwogIHZhciBaX1JMRSA9IDM7CiAgdmFyIFpfRklYRUQgPSA0OwogIHZhciBaX0RFRkFVTFRfU1RSQVRFR1kkMSA9IDA7CiAgdmFyIFpfVU5LTk9XTiA9IDI7CiAgdmFyIFpfREVGTEFURUQkMiA9IDg7CiAgdmFyIE1BWF9NRU1fTEVWRUwgPSA5OwogIHZhciBNQVhfV0JJVFMkMSA9IDE1OwogIHZhciBERUZfTUVNX0xFVkVMID0gODsKICB2YXIgTEVOR1RIX0NPREVTID0gMjk7CiAgdmFyIExJVEVSQUxTID0gMjU2OwogIHZhciBMX0NPREVTID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTOwogIHZhciBEX0NPREVTID0gMzA7CiAgdmFyIEJMX0NPREVTID0gMTk7CiAgdmFyIEhFQVBfU0laRSA9IDIgKiBMX0NPREVTICsgMTsKICB2YXIgTUFYX0JJVFMgPSAxNTsKICB2YXIgTUlOX01BVENIID0gMzsKICB2YXIgTUFYX01BVENIID0gMjU4OwogIHZhciBNSU5fTE9PS0FIRUFEID0gTUFYX01BVENIICsgTUlOX01BVENIICsgMTsKICB2YXIgUFJFU0VUX0RJQ1QgPSAzMjsKICB2YXIgSU5JVF9TVEFURSA9IDQyOwogIHZhciBFWFRSQV9TVEFURSA9IDY5OwogIHZhciBOQU1FX1NUQVRFID0gNzM7CiAgdmFyIENPTU1FTlRfU1RBVEUgPSA5MTsKICB2YXIgSENSQ19TVEFURSA9IDEwMzsKICB2YXIgQlVTWV9TVEFURSA9IDExMzsKICB2YXIgRklOSVNIX1NUQVRFID0gNjY2OwogIHZhciBCU19ORUVEX01PUkUgPSAxOwogIHZhciBCU19CTE9DS19ET05FID0gMjsKICB2YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOwogIHZhciBCU19GSU5JU0hfRE9ORSA9IDQ7CiAgdmFyIE9TX0NPREUgPSAzOwogIGZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHsKICAgIHN0cm0ubXNnID0gbXNnJDJbZXJyb3JDb2RlXTsKICAgIHJldHVybiBlcnJvckNvZGU7CiAgfQogIGZ1bmN0aW9uIHJhbmsoZikgewogICAgcmV0dXJuIChmIDw8IDEpIC0gKGYgPiA0ID8gOSA6IDApOwogIH0KICBmdW5jdGlvbiB6ZXJvKGJ1ZikgewogICAgdmFyIGxlbjIgPSBidWYubGVuZ3RoOwogICAgd2hpbGUgKC0tbGVuMiA+PSAwKSB7CiAgICAgIGJ1ZltsZW4yXSA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkgewogICAgdmFyIHMgPSBzdHJtLnN0YXRlOwogICAgdmFyIGxlbjIgPSBzLnBlbmRpbmc7CiAgICBpZiAobGVuMiA+IHN0cm0uYXZhaWxfb3V0KSB7CiAgICAgIGxlbjIgPSBzdHJtLmF2YWlsX291dDsKICAgIH0KICAgIGlmIChsZW4yID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHV0aWxzJDUuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbjIsIHN0cm0ubmV4dF9vdXQpOwogICAgc3RybS5uZXh0X291dCArPSBsZW4yOwogICAgcy5wZW5kaW5nX291dCArPSBsZW4yOwogICAgc3RybS50b3RhbF9vdXQgKz0gbGVuMjsKICAgIHN0cm0uYXZhaWxfb3V0IC09IGxlbjI7CiAgICBzLnBlbmRpbmcgLT0gbGVuMjsKICAgIGlmIChzLnBlbmRpbmcgPT09IDApIHsKICAgICAgcy5wZW5kaW5nX291dCA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkgewogICAgdHJlZXMuX3RyX2ZsdXNoX2Jsb2NrKHMsIHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpOwogICAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7CiAgICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7CiAgfQogIGZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHsKICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjsKICB9CiAgZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikgewogICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiID4+PiA4ICYgMjU1OwogICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMjU1OwogIH0KICBmdW5jdGlvbiByZWFkX2J1ZihzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSB7CiAgICB2YXIgbGVuMiA9IHN0cm0uYXZhaWxfaW47CiAgICBpZiAobGVuMiA+IHNpemUpIHsKICAgICAgbGVuMiA9IHNpemU7CiAgICB9CiAgICBpZiAobGVuMiA9PT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHN0cm0uYXZhaWxfaW4gLT0gbGVuMjsKICAgIHV0aWxzJDUuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbjIsIHN0YXJ0KTsKICAgIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDEpIHsKICAgICAgc3RybS5hZGxlciA9IGFkbGVyMzIkMShzdHJtLmFkbGVyLCBidWYsIGxlbjIsIHN0YXJ0KTsKICAgIH0gZWxzZSBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAyKSB7CiAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMiQxKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuMiwgc3RhcnQpOwogICAgfQogICAgc3RybS5uZXh0X2luICs9IGxlbjI7CiAgICBzdHJtLnRvdGFsX2luICs9IGxlbjI7CiAgICByZXR1cm4gbGVuMjsKICB9CiAgZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpIHsKICAgIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7CiAgICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7CiAgICB2YXIgbWF0Y2g7CiAgICB2YXIgbGVuMjsKICAgIHZhciBiZXN0X2xlbiA9IHMucHJldl9sZW5ndGg7CiAgICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsKICAgIHZhciBsaW1pdCA9IHMuc3Ryc3RhcnQgPiBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQgPyBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwOwogICAgdmFyIF93aW4gPSBzLndpbmRvdzsKICAgIHZhciB3bWFzayA9IHMud19tYXNrOwogICAgdmFyIHByZXYgPSBzLnByZXY7CiAgICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDsKICAgIHZhciBzY2FuX2VuZDEgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdOwogICAgdmFyIHNjYW5fZW5kID0gX3dpbltzY2FuICsgYmVzdF9sZW5dOwogICAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7CiAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKICAgIH0KICAgIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsKICAgICAgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOwogICAgfQogICAgZG8gewogICAgICBtYXRjaCA9IGN1cl9tYXRjaDsKICAgICAgaWYgKF93aW5bbWF0Y2ggKyBiZXN0X2xlbl0gIT09IHNjYW5fZW5kIHx8IF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHwgX3dpblttYXRjaF0gIT09IF93aW5bc2Nhbl0gfHwgX3dpblsrK21hdGNoXSAhPT0gX3dpbltzY2FuICsgMV0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzY2FuICs9IDI7CiAgICAgIG1hdGNoKys7CiAgICAgIGRvIHsKICAgICAgfSB3aGlsZSAoX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBzY2FuIDwgc3RyZW5kKTsKICAgICAgbGVuMiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTsKICAgICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDsKICAgICAgaWYgKGxlbjIgPiBiZXN0X2xlbikgewogICAgICAgIHMubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CiAgICAgICAgYmVzdF9sZW4gPSBsZW4yOwogICAgICAgIGlmIChsZW4yID49IG5pY2VfbWF0Y2gpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzY2FuX2VuZDEgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdOwogICAgICAgIHNjYW5fZW5kID0gX3dpbltzY2FuICsgYmVzdF9sZW5dOwogICAgICB9CiAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApOwogICAgaWYgKGJlc3RfbGVuIDw9IHMubG9va2FoZWFkKSB7CiAgICAgIHJldHVybiBiZXN0X2xlbjsKICAgIH0KICAgIHJldHVybiBzLmxvb2thaGVhZDsKICB9CiAgZnVuY3Rpb24gZmlsbF93aW5kb3cocykgewogICAgdmFyIF93X3NpemUgPSBzLndfc2l6ZTsKICAgIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7CiAgICBkbyB7CiAgICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0OwogICAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkgewogICAgICAgIHV0aWxzJDUuYXJyYXlTZXQocy53aW5kb3csIHMud2luZG93LCBfd19zaXplLCBfd19zaXplLCAwKTsKICAgICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7CiAgICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplOwogICAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTsKICAgICAgICBuID0gcy5oYXNoX3NpemU7CiAgICAgICAgcCA9IG47CiAgICAgICAgZG8gewogICAgICAgICAgbSA9IHMuaGVhZFstLXBdOwogICAgICAgICAgcy5oZWFkW3BdID0gbSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwOwogICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgbiA9IF93X3NpemU7CiAgICAgICAgcCA9IG47CiAgICAgICAgZG8gewogICAgICAgICAgbSA9IHMucHJldlstLXBdOwogICAgICAgICAgcy5wcmV2W3BdID0gbSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwOwogICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgbW9yZSArPSBfd19zaXplOwogICAgICB9CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTsKICAgICAgcy5sb29rYWhlYWQgKz0gbjsKICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0OwogICAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdOwogICAgICAgIHMuaW5zX2ggPSAocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgICB3aGlsZSAocy5pbnNlcnQpIHsKICAgICAgICAgIHMuaW5zX2ggPSAocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7CiAgICAgICAgICBzdHIrKzsKICAgICAgICAgIHMuaW5zZXJ0LS07CiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApOwogIH0KICBmdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkgewogICAgdmFyIG1heF9ibG9ja19zaXplID0gNjU1MzU7CiAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CiAgICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTsKICAgIH0KICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkgewogICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgIH0KICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkOwogICAgICBzLmxvb2thaGVhZCA9IDA7CiAgICAgIHZhciBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CiAgICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CiAgICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0OwogICAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7CiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHMuaW5zZXJ0ID0gMDsKICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgICAgfQogICAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgICB9CiAgICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7CiAgICB2YXIgaGFzaF9oZWFkOwogICAgdmFyIGJmbHVzaDsKICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgIH0KICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBoYXNoX2hlYWQgPSAwOwogICAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgcy5pbnNfaCA9IChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0OwogICAgICB9CiAgICAgIGlmIChoYXNoX2hlYWQgIT09IDAgJiYgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTsKICAgICAgfQogICAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CiAgICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7CiAgICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2ggJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgICBzLm1hdGNoX2xlbmd0aC0tOwogICAgICAgICAgZG8gewogICAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgICAgIHMuaW5zX2ggPSAocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7CiAgICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0OwogICAgICAgICAgfSB3aGlsZSAoLS1zLm1hdGNoX2xlbmd0aCAhPT0gMCk7CiAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7CiAgICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07CiAgICAgICAgICBzLmluc19oID0gKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0IF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pOwogICAgICAgIHMubG9va2FoZWFkLS07CiAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICB9CiAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTsKICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgICAgfQogICAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgICB9CiAgICBpZiAocy5sYXN0X2xpdCkgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7CiAgICB2YXIgaGFzaF9oZWFkOwogICAgdmFyIGJmbHVzaDsKICAgIHZhciBtYXhfaW5zZXJ0OwogICAgZm9yICg7IDsgKSB7CiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDEpIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc2hfaGVhZCA9IDA7CiAgICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgICBzLmluc19oID0gKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0IF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7CiAgICAgIH0KICAgICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoOwogICAgICBzLnByZXZfbWF0Y2ggPSBzLm1hdGNoX3N0YXJ0OwogICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgICAgIGlmIChoYXNoX2hlYWQgIT09IDAgJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiYgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTsKICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCBzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5NikpIHsKICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHsKICAgICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIOwogICAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7CiAgICAgICAgcy5sb29rYWhlYWQgLT0gcy5wcmV2X2xlbmd0aCAtIDE7CiAgICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmICgrK3Muc3Ryc3RhcnQgPD0gbWF4X2luc2VydCkgewogICAgICAgICAgICBzLmluc19oID0gKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0IF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApOwogICAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHsKICAgICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTsKICAgICAgICBpZiAoYmZsdXNoKSB7CiAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgIHMubG9va2FoZWFkLS07CiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTsKICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgcy5sb29rYWhlYWQtLTsKICAgICAgfQogICAgfQogICAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7CiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pOwogICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICB9CiAgICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7CiAgICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgfQogICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7CiAgICB2YXIgYmZsdXNoOwogICAgdmFyIHByZXY7CiAgICB2YXIgc2Nhbiwgc3RyZW5kOwogICAgdmFyIF93aW4gPSBzLndpbmRvdzsKICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIKSB7CiAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgIH0KICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7CiAgICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCA+IDApIHsKICAgICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7CiAgICAgICAgcHJldiA9IF93aW5bc2Nhbl07CiAgICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7CiAgICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIOwogICAgICAgICAgZG8gewogICAgICAgICAgfSB3aGlsZSAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBzY2FuIDwgc3RyZW5kKTsKICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pOwogICAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHsKICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLmxvb2thaGVhZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgewogICAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7CiAgICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTsKICAgICAgICBzLmxvb2thaGVhZC0tOwogICAgICAgIHMuc3Ryc3RhcnQrKzsKICAgICAgfQogICAgICBpZiAoYmZsdXNoKSB7CiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzLmluc2VydCA9IDA7CiAgICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgfQogICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgewogICAgdmFyIGJmbHVzaDsKICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcy5tYXRjaF9sZW5ndGggPSAwOwogICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pOwogICAgICBzLmxvb2thaGVhZC0tOwogICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHMuaW5zZXJ0ID0gMDsKICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgICAgfQogICAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgICB9CiAgICBpZiAocy5sYXN0X2xpdCkgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKICB9CiAgZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykgewogICAgdGhpcy5nb29kX2xlbmd0aCA9IGdvb2RfbGVuZ3RoOwogICAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5OwogICAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoOwogICAgdGhpcy5tYXhfY2hhaW4gPSBtYXhfY2hhaW47CiAgICB0aGlzLmZ1bmMgPSBmdW5jOwogIH0KICB2YXIgY29uZmlndXJhdGlvbl90YWJsZTsKICBjb25maWd1cmF0aW9uX3RhYmxlID0gWwogICAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksCiAgICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksCiAgICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLAogICAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksCiAgICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwKICAgIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwKICAgIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLAogICAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksCiAgICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwKICAgIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpCiAgXTsKICBmdW5jdGlvbiBsbV9pbml0KHMpIHsKICAgIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7CiAgICB6ZXJvKHMuaGVhZCk7CiAgICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTsKICAgIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7CiAgICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoOwogICAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47CiAgICBzLnN0cnN0YXJ0ID0gMDsKICAgIHMuYmxvY2tfc3RhcnQgPSAwOwogICAgcy5sb29rYWhlYWQgPSAwOwogICAgcy5pbnNlcnQgPSAwOwogICAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgIHMuaW5zX2ggPSAwOwogIH0KICBmdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7CiAgICB0aGlzLnN0cm0gPSBudWxsOwogICAgdGhpcy5zdGF0dXMgPSAwOwogICAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7CiAgICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOwogICAgdGhpcy5wZW5kaW5nX291dCA9IDA7CiAgICB0aGlzLnBlbmRpbmcgPSAwOwogICAgdGhpcy53cmFwID0gMDsKICAgIHRoaXMuZ3poZWFkID0gbnVsbDsKICAgIHRoaXMuZ3ppbmRleCA9IDA7CiAgICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQkMjsKICAgIHRoaXMubGFzdF9mbHVzaCA9IC0xOwogICAgdGhpcy53X3NpemUgPSAwOwogICAgdGhpcy53X2JpdHMgPSAwOwogICAgdGhpcy53X21hc2sgPSAwOwogICAgdGhpcy53aW5kb3cgPSBudWxsOwogICAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7CiAgICB0aGlzLnByZXYgPSBudWxsOwogICAgdGhpcy5oZWFkID0gbnVsbDsKICAgIHRoaXMuaW5zX2ggPSAwOwogICAgdGhpcy5oYXNoX3NpemUgPSAwOwogICAgdGhpcy5oYXNoX2JpdHMgPSAwOwogICAgdGhpcy5oYXNoX21hc2sgPSAwOwogICAgdGhpcy5oYXNoX3NoaWZ0ID0gMDsKICAgIHRoaXMuYmxvY2tfc3RhcnQgPSAwOwogICAgdGhpcy5tYXRjaF9sZW5ndGggPSAwOwogICAgdGhpcy5wcmV2X21hdGNoID0gMDsKICAgIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgIHRoaXMuc3Ryc3RhcnQgPSAwOwogICAgdGhpcy5tYXRjaF9zdGFydCA9IDA7CiAgICB0aGlzLmxvb2thaGVhZCA9IDA7CiAgICB0aGlzLnByZXZfbGVuZ3RoID0gMDsKICAgIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7CiAgICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDsKICAgIHRoaXMubGV2ZWwgPSAwOwogICAgdGhpcy5zdHJhdGVneSA9IDA7CiAgICB0aGlzLmdvb2RfbWF0Y2ggPSAwOwogICAgdGhpcy5uaWNlX21hdGNoID0gMDsKICAgIHRoaXMuZHluX2x0cmVlID0gbmV3IHV0aWxzJDUuQnVmMTYoSEVBUF9TSVpFICogMik7CiAgICB0aGlzLmR5bl9kdHJlZSA9IG5ldyB1dGlscyQ1LkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7CiAgICB0aGlzLmJsX3RyZWUgPSBuZXcgdXRpbHMkNS5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTsKICAgIHplcm8odGhpcy5keW5fbHRyZWUpOwogICAgemVybyh0aGlzLmR5bl9kdHJlZSk7CiAgICB6ZXJvKHRoaXMuYmxfdHJlZSk7CiAgICB0aGlzLmxfZGVzYyA9IG51bGw7CiAgICB0aGlzLmRfZGVzYyA9IG51bGw7CiAgICB0aGlzLmJsX2Rlc2MgPSBudWxsOwogICAgdGhpcy5ibF9jb3VudCA9IG5ldyB1dGlscyQ1LkJ1ZjE2KE1BWF9CSVRTICsgMSk7CiAgICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMkNS5CdWYxNigyICogTF9DT0RFUyArIDEpOwogICAgemVybyh0aGlzLmhlYXApOwogICAgdGhpcy5oZWFwX2xlbiA9IDA7CiAgICB0aGlzLmhlYXBfbWF4ID0gMDsKICAgIHRoaXMuZGVwdGggPSBuZXcgdXRpbHMkNS5CdWYxNigyICogTF9DT0RFUyArIDEpOwogICAgemVybyh0aGlzLmRlcHRoKTsKICAgIHRoaXMubF9idWYgPSAwOwogICAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7CiAgICB0aGlzLmxhc3RfbGl0ID0gMDsKICAgIHRoaXMuZF9idWYgPSAwOwogICAgdGhpcy5vcHRfbGVuID0gMDsKICAgIHRoaXMuc3RhdGljX2xlbiA9IDA7CiAgICB0aGlzLm1hdGNoZXMgPSAwOwogICAgdGhpcy5pbnNlcnQgPSAwOwogICAgdGhpcy5iaV9idWYgPSAwOwogICAgdGhpcy5iaV92YWxpZCA9IDA7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSkgewogICAgdmFyIHM7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQxKTsKICAgIH0KICAgIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7CiAgICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKICAgIHMgPSBzdHJtLnN0YXRlOwogICAgcy5wZW5kaW5nID0gMDsKICAgIHMucGVuZGluZ19vdXQgPSAwOwogICAgaWYgKHMud3JhcCA8IDApIHsKICAgICAgcy53cmFwID0gLXMud3JhcDsKICAgIH0KICAgIHMuc3RhdHVzID0gcy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7CiAgICBzdHJtLmFkbGVyID0gcy53cmFwID09PSAyID8gMCA6IDE7CiAgICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIJDE7CiAgICB0cmVlcy5fdHJfaW5pdChzKTsKICAgIHJldHVybiBaX09LJDI7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7CiAgICB2YXIgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTsKICAgIGlmIChyZXQgPT09IFpfT0skMikgewogICAgICBsbV9pbml0KHN0cm0uc3RhdGUpOwogICAgfQogICAgcmV0dXJuIHJldDsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7CiAgICB9CiAgICBpZiAoc3RybS5zdGF0ZS53cmFwICE9PSAyKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxOwogICAgfQogICAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkOwogICAgcmV0dXJuIFpfT0skMjsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgewogICAgaWYgKCFzdHJtKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxOwogICAgfQogICAgdmFyIHdyYXAgPSAxOwogICAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04kMSkgewogICAgICBsZXZlbCA9IDY7CiAgICB9CiAgICBpZiAod2luZG93Qml0cyA8IDApIHsKICAgICAgd3JhcCA9IDA7CiAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKICAgIH0gZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7CiAgICAgIHdyYXAgPSAyOwogICAgICB3aW5kb3dCaXRzIC09IDE2OwogICAgfQogICAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEJDIgfHwgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgewogICAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDEpOwogICAgfQogICAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHsKICAgICAgd2luZG93Qml0cyA9IDk7CiAgICB9CiAgICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTsKICAgIHN0cm0uc3RhdGUgPSBzOwogICAgcy5zdHJtID0gc3RybTsKICAgIHMud3JhcCA9IHdyYXA7CiAgICBzLmd6aGVhZCA9IG51bGw7CiAgICBzLndfYml0cyA9IHdpbmRvd0JpdHM7CiAgICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7CiAgICBzLndfbWFzayA9IHMud19zaXplIC0gMTsKICAgIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3OwogICAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzOwogICAgcy5oYXNoX21hc2sgPSBzLmhhc2hfc2l6ZSAtIDE7CiAgICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7CiAgICBzLndpbmRvdyA9IG5ldyB1dGlscyQ1LkJ1Zjgocy53X3NpemUgKiAyKTsKICAgIHMuaGVhZCA9IG5ldyB1dGlscyQ1LkJ1ZjE2KHMuaGFzaF9zaXplKTsKICAgIHMucHJldiA9IG5ldyB1dGlscyQ1LkJ1ZjE2KHMud19zaXplKTsKICAgIHMubGl0X2J1ZnNpemUgPSAxIDw8IG1lbUxldmVsICsgNjsKICAgIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0OwogICAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscyQ1LkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTsKICAgIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTsKICAgIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTsKICAgIHMubGV2ZWwgPSBsZXZlbDsKICAgIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKICAgIHMubWV0aG9kID0gbWV0aG9kOwogICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHsKICAgIHJldHVybiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQkMiwgTUFYX1dCSVRTJDEsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSQxKTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZSQyKHN0cm0sIGZsdXNoKSB7CiAgICB2YXIgb2xkX2ZsdXNoLCBzOwogICAgdmFyIGJlZywgdmFsOwogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8IGZsdXNoID4gWl9CTE9DSyQxIHx8IGZsdXNoIDwgMCkgewogICAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQxKSA6IFpfU1RSRUFNX0VSUk9SJDE7CiAgICB9CiAgICBzID0gc3RybS5zdGF0ZTsKICAgIGlmICghc3RybS5vdXRwdXQgfHwgIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9PSBaX0ZJTklTSCQyKSB7CiAgICAgIHJldHVybiBlcnIoc3RybSwgc3RybS5hdmFpbF9vdXQgPT09IDAgPyBaX0JVRl9FUlJPUiQxIDogWl9TVFJFQU1fRVJST1IkMSk7CiAgICB9CiAgICBzLnN0cm0gPSBzdHJtOwogICAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoOwogICAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7CiAgICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHsKICAgICAgaWYgKHMud3JhcCA9PT0gMikgewogICAgICAgIHN0cm0uYWRsZXIgPSAwOwogICAgICAgIHB1dF9ieXRlKHMsIDMxKTsKICAgICAgICBwdXRfYnl0ZShzLCAxMzkpOwogICAgICAgIHB1dF9ieXRlKHMsIDgpOwogICAgICAgIGlmICghcy5nemhlYWQpIHsKICAgICAgICAgIHB1dF9ieXRlKHMsIDApOwogICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICAgIHB1dF9ieXRlKHMsIDApOwogICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6IHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgPyA0IDogMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTsKICAgICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHV0X2J5dGUoCiAgICAgICAgICAgIHMsCiAgICAgICAgICAgIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICsgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgKyAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICsgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICsgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KQogICAgICAgICAgKTsKICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAyNTUpOwogICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSA+PiA4ICYgMjU1KTsKICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgPj4gMTYgJiAyNTUpOwogICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSA+PiAyNCAmIDI1NSk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6IHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgPyA0IDogMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDI1NSk7CiAgICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7CiAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDI1NSk7CiAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4ICYgMjU1KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7CiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMiQxKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7CiAgICAgICAgICB9CiAgICAgICAgICBzLmd6aW5kZXggPSAwOwogICAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGhlYWRlciA9IFpfREVGTEFURUQkMiArIChzLndfYml0cyAtIDggPDwgNCkgPDwgODsKICAgICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTsKICAgICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikgewogICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOwogICAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHsKICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKICAgICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHsKICAgICAgICAgIGxldmVsX2ZsYWdzID0gMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOwogICAgICAgIH0KICAgICAgICBoZWFkZXIgfD0gbGV2ZWxfZmxhZ3MgPDwgNjsKICAgICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgICAgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOwogICAgICAgIH0KICAgICAgICBoZWFkZXIgKz0gMzEgLSBoZWFkZXIgJSAzMTsKICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7CiAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKICAgICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpOwogICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDY1NTM1KTsKICAgICAgICB9CiAgICAgICAgc3RybS5hZGxlciA9IDE7CiAgICAgIH0KICAgIH0KICAgIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHsKICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhKSB7CiAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgNjU1MzUpKSB7CiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyJDEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICAgIGJlZyA9IHMucGVuZGluZzsKICAgICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAyNTUpOwogICAgICAgICAgcy5nemluZGV4Kys7CiAgICAgICAgfQogICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykgewogICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyJDEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpOwogICAgICAgIH0KICAgICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHsKICAgICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTsKICAgICAgfQogICAgfQogICAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7CiAgICAgIGlmIChzLmd6aGVhZC5uYW1lKSB7CiAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICB2YWwgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDI1NTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwogICAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7CiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTsKICAgICAgfQogICAgfQogICAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7CiAgICAgIGlmIChzLmd6aGVhZC5jb21tZW50KSB7CiAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICB2YWwgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDI1NTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwogICAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7CiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFOwogICAgICB9CiAgICB9CiAgICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHsKICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHsKICAgICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICB9CiAgICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMjU1KTsKICAgICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgPj4gOCAmIDI1NSk7CiAgICAgICAgICBzdHJtLmFkbGVyID0gMDsKICAgICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFOwogICAgICB9CiAgICB9CiAgICBpZiAocy5wZW5kaW5nICE9PSAwKSB7CiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOwogICAgICAgIHJldHVybiBaX09LJDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiYgZmx1c2ggIT09IFpfRklOSVNIJDIpIHsKICAgICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUiQxKTsKICAgIH0KICAgIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHsKICAgICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUiQxKTsKICAgIH0KICAgIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8IGZsdXNoICE9PSBaX05PX0ZMVVNIJDEgJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkgewogICAgICB2YXIgYnN0YXRlID0gcy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDogcy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOiBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpOwogICAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7CiAgICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CiAgICAgIH0KICAgICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHsKICAgICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gWl9PSyQyOwogICAgICB9CiAgICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHsKICAgICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkgewogICAgICAgICAgdHJlZXMuX3RyX2FsaWduKHMpOwogICAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0skMSkgewogICAgICAgICAgdHJlZXMuX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7CiAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkgewogICAgICAgICAgICB6ZXJvKHMuaGVhZCk7CiAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwOwogICAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwOwogICAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwogICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7CiAgICAgICAgICByZXR1cm4gWl9PSyQyOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCQyKSB7CiAgICAgIHJldHVybiBaX09LJDI7CiAgICB9CiAgICBpZiAocy53cmFwIDw9IDApIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORCQyOwogICAgfQogICAgaWYgKHMud3JhcCA9PT0gMikgewogICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciA+PiA4ICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciA+PiAxNiAmIDI1NSk7CiAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgPj4gMjQgJiAyNTUpOwogICAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiA+PiA4ICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiA+PiAxNiAmIDI1NSk7CiAgICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gPj4gMjQgJiAyNTUpOwogICAgfSBlbHNlIHsKICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpOwogICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgNjU1MzUpOwogICAgfQogICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgIGlmIChzLndyYXAgPiAwKSB7CiAgICAgIHMud3JhcCA9IC1zLndyYXA7CiAgICB9CiAgICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyQyIDogWl9TVFJFQU1fRU5EJDI7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkgewogICAgdmFyIHN0YXR1czsKICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTsKICAgIH0KICAgIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzOwogICAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJiBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJiBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiYgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJiBzdGF0dXMgIT09IEZJTklTSF9TVEFURSkgewogICAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDEpOwogICAgfQogICAgc3RybS5zdGF0ZSA9IG51bGw7CiAgICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUiQxKSA6IFpfT0skMjsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkgewogICAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDsKICAgIHZhciBzOwogICAgdmFyIHN0ciwgbjsKICAgIHZhciB3cmFwOwogICAgdmFyIGF2YWlsOwogICAgdmFyIG5leHQ7CiAgICB2YXIgaW5wdXQ7CiAgICB2YXIgdG1wRGljdDsKICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTsKICAgIH0KICAgIHMgPSBzdHJtLnN0YXRlOwogICAgd3JhcCA9IHMud3JhcDsKICAgIGlmICh3cmFwID09PSAyIHx8IHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUgfHwgcy5sb29rYWhlYWQpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7CiAgICB9CiAgICBpZiAod3JhcCA9PT0gMSkgewogICAgICBzdHJtLmFkbGVyID0gYWRsZXIzMiQxKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApOwogICAgfQogICAgcy53cmFwID0gMDsKICAgIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7CiAgICAgIGlmICh3cmFwID09PSAwKSB7CiAgICAgICAgemVybyhzLmhlYWQpOwogICAgICAgIHMuc3Ryc3RhcnQgPSAwOwogICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwOwogICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgfQogICAgICB0bXBEaWN0ID0gbmV3IHV0aWxzJDUuQnVmOChzLndfc2l6ZSk7CiAgICAgIHV0aWxzJDUuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7CiAgICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0OwogICAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7CiAgICB9CiAgICBhdmFpbCA9IHN0cm0uYXZhaWxfaW47CiAgICBuZXh0ID0gc3RybS5uZXh0X2luOwogICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7CiAgICBzdHJtLm5leHRfaW4gPSAwOwogICAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7CiAgICBmaWxsX3dpbmRvdyhzKTsKICAgIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgc3RyID0gcy5zdHJzdGFydDsKICAgICAgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpOwogICAgICBkbyB7CiAgICAgICAgcy5pbnNfaCA9IChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyOwogICAgICAgIHN0cisrOwogICAgICB9IHdoaWxlICgtLW4pOwogICAgICBzLnN0cnN0YXJ0ID0gc3RyOwogICAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7CiAgICAgIGZpbGxfd2luZG93KHMpOwogICAgfQogICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDsKICAgIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0OwogICAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDsKICAgIHMubG9va2FoZWFkID0gMDsKICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICBzdHJtLm5leHRfaW4gPSBuZXh0OwogICAgc3RybS5pbnB1dCA9IGlucHV0OwogICAgc3RybS5hdmFpbF9pbiA9IGF2YWlsOwogICAgcy53cmFwID0gd3JhcDsKICAgIHJldHVybiBaX09LJDI7CiAgfQogIGRlZmxhdGUkMy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0OwogIGRlZmxhdGUkMy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7CiAgZGVmbGF0ZSQzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDsKICBkZWZsYXRlJDMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7CiAgZGVmbGF0ZSQzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyOwogIGRlZmxhdGUkMy5kZWZsYXRlID0gZGVmbGF0ZSQyOwogIGRlZmxhdGUkMy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDsKICBkZWZsYXRlJDMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTsKICBkZWZsYXRlJDMuZGVmbGF0ZUluZm8gPSAicGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7CiAgdmFyIHN0cmluZ3MkMiA9IHt9OwogIHZhciB1dGlscyQ0ID0gY29tbW9uJDE7CiAgdmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7CiAgdmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlOwogIHRyeSB7CiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFswXSk7CiAgfSBjYXRjaCAoX18pIHsKICAgIFNUUl9BUFBMWV9PSyA9IGZhbHNlOwogIH0KICB0cnkgewogICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7CiAgfSBjYXRjaCAoX18pIHsKICAgIFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsKICB9CiAgdmFyIF91dGY4bGVuID0gbmV3IHV0aWxzJDQuQnVmOCgyNTYpOwogIGZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHsKICAgIF91dGY4bGVuW3FdID0gcSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMTsKICB9CiAgX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOwogIHN0cmluZ3MkMi5zdHJpbmcyYnVmID0gZnVuY3Rpb24oc3RyKSB7CiAgICB2YXIgYnVmLCBjMiwgYzIyLCBtX3BvcywgaTIsIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDsKICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHsKICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7CiAgICAgIGlmICgoYzIgJiA2NDUxMikgPT09IDU1Mjk2ICYmIG1fcG9zICsgMSA8IHN0cl9sZW4pIHsKICAgICAgICBjMjIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpOwogICAgICAgIGlmICgoYzIyICYgNjQ1MTIpID09PSA1NjMyMCkgewogICAgICAgICAgYzIgPSA2NTUzNiArIChjMiAtIDU1Mjk2IDw8IDEwKSArIChjMjIgLSA1NjMyMCk7CiAgICAgICAgICBtX3BvcysrOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZfbGVuICs9IGMyIDwgMTI4ID8gMSA6IGMyIDwgMjA0OCA/IDIgOiBjMiA8IDY1NTM2ID8gMyA6IDQ7CiAgICB9CiAgICBidWYgPSBuZXcgdXRpbHMkNC5CdWY4KGJ1Zl9sZW4pOwogICAgZm9yIChpMiA9IDAsIG1fcG9zID0gMDsgaTIgPCBidWZfbGVuOyBtX3BvcysrKSB7CiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpOwogICAgICBpZiAoKGMyICYgNjQ1MTIpID09PSA1NTI5NiAmJiBtX3BvcyArIDEgPCBzdHJfbGVuKSB7CiAgICAgICAgYzIyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTsKICAgICAgICBpZiAoKGMyMiAmIDY0NTEyKSA9PT0gNTYzMjApIHsKICAgICAgICAgIGMyID0gNjU1MzYgKyAoYzIgLSA1NTI5NiA8PCAxMCkgKyAoYzIyIC0gNTYzMjApOwogICAgICAgICAgbV9wb3MrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGMyIDwgMTI4KSB7CiAgICAgICAgYnVmW2kyKytdID0gYzI7CiAgICAgIH0gZWxzZSBpZiAoYzIgPCAyMDQ4KSB7CiAgICAgICAgYnVmW2kyKytdID0gMTkyIHwgYzIgPj4+IDY7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgJiA2MzsKICAgICAgfSBlbHNlIGlmIChjMiA8IDY1NTM2KSB7CiAgICAgICAgYnVmW2kyKytdID0gMjI0IHwgYzIgPj4+IDEyOwogICAgICAgIGJ1ZltpMisrXSA9IDEyOCB8IGMyID4+PiA2ICYgNjM7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgJiA2MzsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZbaTIrK10gPSAyNDAgfCBjMiA+Pj4gMTg7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgPj4+IDEyICYgNjM7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgPj4+IDYgJiA2MzsKICAgICAgICBidWZbaTIrK10gPSAxMjggfCBjMiAmIDYzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmOwogIH07CiAgZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbjIpIHsKICAgIGlmIChsZW4yIDwgNjU1MzQpIHsKICAgICAgaWYgKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LIHx8ICFidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX09LKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRpbHMkNC5zaHJpbmtCdWYoYnVmLCBsZW4yKSk7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBsZW4yOyBpMisrKSB7CiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpMl0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgc3RyaW5ncyQyLmJ1ZjJiaW5zdHJpbmcgPSBmdW5jdGlvbihidWYpIHsKICAgIHJldHVybiBidWYyYmluc3RyaW5nKGJ1ZiwgYnVmLmxlbmd0aCk7CiAgfTsKICBzdHJpbmdzJDIuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uKHN0cikgewogICAgdmFyIGJ1ZiA9IG5ldyB1dGlscyQ0LkJ1Zjgoc3RyLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpMiA9IDAsIGxlbjIgPSBidWYubGVuZ3RoOyBpMiA8IGxlbjI7IGkyKyspIHsKICAgICAgYnVmW2kyXSA9IHN0ci5jaGFyQ29kZUF0KGkyKTsKICAgIH0KICAgIHJldHVybiBidWY7CiAgfTsKICBzdHJpbmdzJDIuYnVmMnN0cmluZyA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7CiAgICB2YXIgaTIsIG91dCwgYzIsIGNfbGVuOwogICAgdmFyIGxlbjIgPSBtYXggfHwgYnVmLmxlbmd0aDsKICAgIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4yICogMik7CiAgICBmb3IgKG91dCA9IDAsIGkyID0gMDsgaTIgPCBsZW4yOyApIHsKICAgICAgYzIgPSBidWZbaTIrK107CiAgICAgIGlmIChjMiA8IDEyOCkgewogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGMyOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNfbGVuID0gX3V0ZjhsZW5bYzJdOwogICAgICBpZiAoY19sZW4gPiA0KSB7CiAgICAgICAgdXRmMTZidWZbb3V0KytdID0gNjU1MzM7CiAgICAgICAgaTIgKz0gY19sZW4gLSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGMyICY9IGNfbGVuID09PSAyID8gMzEgOiBjX2xlbiA9PT0gMyA/IDE1IDogNzsKICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpMiA8IGxlbjIpIHsKICAgICAgICBjMiA9IGMyIDw8IDYgfCBidWZbaTIrK10gJiA2MzsKICAgICAgICBjX2xlbi0tOwogICAgICB9CiAgICAgIGlmIChjX2xlbiA+IDEpIHsKICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSA2NTUzMzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoYzIgPCA2NTUzNikgewogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGMyOwogICAgICB9IGVsc2UgewogICAgICAgIGMyIC09IDY1NTM2OwogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDU1Mjk2IHwgYzIgPj4gMTAgJiAxMDIzOwogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDU2MzIwIHwgYzIgJiAxMDIzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTsKICB9OwogIHN0cmluZ3MkMi51dGY4Ym9yZGVyID0gZnVuY3Rpb24oYnVmLCBtYXgpIHsKICAgIHZhciBwb3M7CiAgICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDsKICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7CiAgICAgIG1heCA9IGJ1Zi5sZW5ndGg7CiAgICB9CiAgICBwb3MgPSBtYXggLSAxOwogICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDE5MikgPT09IDEyOCkgewogICAgICBwb3MtLTsKICAgIH0KICAgIGlmIChwb3MgPCAwKSB7CiAgICAgIHJldHVybiBtYXg7CiAgICB9CiAgICBpZiAocG9zID09PSAwKSB7CiAgICAgIHJldHVybiBtYXg7CiAgICB9CiAgICByZXR1cm4gcG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4ID8gcG9zIDogbWF4OwogIH07CiAgZnVuY3Rpb24gWlN0cmVhbSQyKCkgewogICAgdGhpcy5pbnB1dCA9IG51bGw7CiAgICB0aGlzLm5leHRfaW4gPSAwOwogICAgdGhpcy5hdmFpbF9pbiA9IDA7CiAgICB0aGlzLnRvdGFsX2luID0gMDsKICAgIHRoaXMub3V0cHV0ID0gbnVsbDsKICAgIHRoaXMubmV4dF9vdXQgPSAwOwogICAgdGhpcy5hdmFpbF9vdXQgPSAwOwogICAgdGhpcy50b3RhbF9vdXQgPSAwOwogICAgdGhpcy5tc2cgPSAiIjsKICAgIHRoaXMuc3RhdGUgPSBudWxsOwogICAgdGhpcy5kYXRhX3R5cGUgPSAyOwogICAgdGhpcy5hZGxlciA9IDA7CiAgfQogIHZhciB6c3RyZWFtID0gWlN0cmVhbSQyOwogIHZhciB6bGliX2RlZmxhdGUgPSBkZWZsYXRlJDM7CiAgdmFyIHV0aWxzJDMgPSBjb21tb24kMTsKICB2YXIgc3RyaW5ncyQxID0gc3RyaW5ncyQyOwogIHZhciBtc2ckMSA9IG1lc3NhZ2VzJDE7CiAgdmFyIFpTdHJlYW0kMSA9IHpzdHJlYW07CiAgdmFyIHRvU3RyaW5nJDEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogIHZhciBaX05PX0ZMVVNIID0gMDsKICB2YXIgWl9GSU5JU0gkMSA9IDQ7CiAgdmFyIFpfT0skMSA9IDA7CiAgdmFyIFpfU1RSRUFNX0VORCQxID0gMTsKICB2YXIgWl9TWU5DX0ZMVVNIID0gMjsKICB2YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7CiAgdmFyIFpfREVGQVVMVF9TVFJBVEVHWSA9IDA7CiAgdmFyIFpfREVGTEFURUQkMSA9IDg7CiAgZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpCiAgICAgIHJldHVybiBuZXcgRGVmbGF0ZShvcHRpb25zKTsKICAgIHRoaXMub3B0aW9ucyA9IHV0aWxzJDMuYXNzaWduKHsKICAgICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTiwKICAgICAgbWV0aG9kOiBaX0RFRkxBVEVEJDEsCiAgICAgIGNodW5rU2l6ZTogMTYzODQsCiAgICAgIHdpbmRvd0JpdHM6IDE1LAogICAgICBtZW1MZXZlbDogOCwKICAgICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSwKICAgICAgdG86ICIiCiAgICB9LCBvcHRpb25zIHx8IHt9KTsKICAgIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7CiAgICBpZiAob3B0LnJhdyAmJiBvcHQud2luZG93Qml0cyA+IDApIHsKICAgICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7CiAgICB9IGVsc2UgaWYgKG9wdC5nemlwICYmIG9wdC53aW5kb3dCaXRzID4gMCAmJiBvcHQud2luZG93Qml0cyA8IDE2KSB7CiAgICAgIG9wdC53aW5kb3dCaXRzICs9IDE2OwogICAgfQogICAgdGhpcy5lcnIgPSAwOwogICAgdGhpcy5tc2cgPSAiIjsKICAgIHRoaXMuZW5kZWQgPSBmYWxzZTsKICAgIHRoaXMuY2h1bmtzID0gW107CiAgICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSQxKCk7CiAgICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDsKICAgIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKAogICAgICB0aGlzLnN0cm0sCiAgICAgIG9wdC5sZXZlbCwKICAgICAgb3B0Lm1ldGhvZCwKICAgICAgb3B0LndpbmRvd0JpdHMsCiAgICAgIG9wdC5tZW1MZXZlbCwKICAgICAgb3B0LnN0cmF0ZWd5CiAgICApOwogICAgaWYgKHN0YXR1cyAhPT0gWl9PSyQxKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihtc2ckMVtzdGF0dXNdKTsKICAgIH0KICAgIGlmIChvcHQuaGVhZGVyKSB7CiAgICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7CiAgICB9CiAgICBpZiAob3B0LmRpY3Rpb25hcnkpIHsKICAgICAgdmFyIGRpY3Q7CiAgICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZGljdCA9IHN0cmluZ3MkMS5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgfSBlbHNlIGlmICh0b1N0cmluZyQxLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7CiAgICAgIH0KICAgICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7CiAgICAgIGlmIChzdGF0dXMgIT09IFpfT0skMSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihtc2ckMVtzdGF0dXNdKTsKICAgICAgfQogICAgICB0aGlzLl9kaWN0X3NldCA9IHRydWU7CiAgICB9CiAgfQogIERlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihkYXRhLCBtb2RlKSB7CiAgICB2YXIgc3RybSA9IHRoaXMuc3RybTsKICAgIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplOwogICAgdmFyIHN0YXR1cywgX21vZGU7CiAgICBpZiAodGhpcy5lbmRlZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfbW9kZSA9IG1vZGUgPT09IH5+bW9kZSA/IG1vZGUgOiBtb2RlID09PSB0cnVlID8gWl9GSU5JU0gkMSA6IFpfTk9fRkxVU0g7CiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzJDEuc3RyaW5nMmJ1ZihkYXRhKTsKICAgIH0gZWxzZSBpZiAodG9TdHJpbmckMS5jYWxsKGRhdGEpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cm0uaW5wdXQgPSBkYXRhOwogICAgfQogICAgc3RybS5uZXh0X2luID0gMDsKICAgIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDsKICAgIGRvIHsKICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMkMy5CdWY4KGNodW5rU2l6ZSk7CiAgICAgICAgc3RybS5uZXh0X291dCA9IDA7CiAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7CiAgICAgIH0KICAgICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOwogICAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQkMSAmJiBzdGF0dXMgIT09IFpfT0skMSkgewogICAgICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgICAgICB0aGlzLmVuZGVkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCQxIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MkMS5idWYyYmluc3RyaW5nKHV0aWxzJDMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscyQzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCQxKTsKICAgIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gkMSkgewogICAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pOwogICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7CiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlOwogICAgICByZXR1cm4gc3RhdHVzID09PSBaX09LJDE7CiAgICB9CiAgICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkgewogICAgICB0aGlzLm9uRW5kKFpfT0skMSk7CiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gMDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9OwogIERlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uKGNodW5rKSB7CiAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICB9OwogIERlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24oc3RhdHVzKSB7CiAgICBpZiAoc3RhdHVzID09PSBaX09LJDEpIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oIiIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMkMy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTsKICAgICAgfQogICAgfQogICAgdGhpcy5jaHVua3MgPSBbXTsKICAgIHRoaXMuZXJyID0gc3RhdHVzOwogICAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnOwogIH07CiAgZnVuY3Rpb24gZGVmbGF0ZSQxKGlucHV0LCBvcHRpb25zKSB7CiAgICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTsKICAgIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpOwogICAgaWYgKGRlZmxhdG9yLmVycikgewogICAgICB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnJDFbZGVmbGF0b3IuZXJyXTsKICAgIH0KICAgIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy5yYXcgPSB0cnVlOwogICAgcmV0dXJuIGRlZmxhdGUkMShpbnB1dCwgb3B0aW9ucyk7CiAgfQogIGZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy5nemlwID0gdHJ1ZTsKICAgIHJldHVybiBkZWZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpOwogIH0KICBkZWZsYXRlJDQuRGVmbGF0ZSA9IERlZmxhdGU7CiAgZGVmbGF0ZSQ0LmRlZmxhdGUgPSBkZWZsYXRlJDE7CiAgZGVmbGF0ZSQ0LmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3OwogIGRlZmxhdGUkNC5nemlwID0gZ3ppcDsKICB2YXIgaW5mbGF0ZSQ0ID0ge307CiAgdmFyIGluZmxhdGUkMyA9IHt9OwogIHZhciBCQUQkMSA9IDMwOwogIHZhciBUWVBFJDEgPSAxMjsKICB2YXIgaW5mZmFzdCA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdDIoc3RybSwgc3RhcnQpIHsKICAgIHZhciBzdGF0ZTsKICAgIHZhciBfaW47CiAgICB2YXIgbGFzdDsKICAgIHZhciBfb3V0OwogICAgdmFyIGJlZzsKICAgIHZhciBlbmQ7CiAgICB2YXIgZG1heDsKICAgIHZhciB3c2l6ZTsKICAgIHZhciB3aGF2ZTsKICAgIHZhciB3bmV4dDsKICAgIHZhciBzX3dpbmRvdzsKICAgIHZhciBob2xkOwogICAgdmFyIGJpdHM7CiAgICB2YXIgbGNvZGU7CiAgICB2YXIgZGNvZGU7CiAgICB2YXIgbG1hc2s7CiAgICB2YXIgZG1hc2s7CiAgICB2YXIgaGVyZTsKICAgIHZhciBvcDsKICAgIHZhciBsZW4yOwogICAgdmFyIGRpc3Q7CiAgICB2YXIgZnJvbTsKICAgIHZhciBmcm9tX3NvdXJjZTsKICAgIHZhciBpbnB1dCwgb3V0cHV0OwogICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgX2luID0gc3RybS5uZXh0X2luOwogICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7CiAgICBfb3V0ID0gc3RybS5uZXh0X291dDsKICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTsKICAgIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpOwogICAgZG1heCA9IHN0YXRlLmRtYXg7CiAgICB3c2l6ZSA9IHN0YXRlLndzaXplOwogICAgd2hhdmUgPSBzdGF0ZS53aGF2ZTsKICAgIHduZXh0ID0gc3RhdGUud25leHQ7CiAgICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdzsKICAgIGhvbGQgPSBzdGF0ZS5ob2xkOwogICAgYml0cyA9IHN0YXRlLmJpdHM7CiAgICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7CiAgICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlOwogICAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7CiAgICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7CiAgICB0b3A6CiAgICAgIGRvIHsKICAgICAgICBpZiAoYml0cyA8IDE1KSB7CiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICB9CiAgICAgICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107CiAgICAgICAgZG9sZW46CiAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgb3AgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICBpZiAob3AgPT09IDApIHsKICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgfSBlbHNlIGlmIChvcCAmIDE2KSB7CiAgICAgICAgICAgICAgbGVuMiA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICBvcCAmPSAxNTsKICAgICAgICAgICAgICBpZiAob3ApIHsKICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuMiArPSBob2xkICYgKDEgPDwgb3ApIC0gMTsKICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBvcDsKICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKICAgICAgICAgICAgICBkb2Rpc3Q6CiAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgICAgb3AgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICAgICAgICBiaXRzIC09IG9wOwogICAgICAgICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgICBpZiAob3AgJiAxNikgewogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICAgICAgb3AgJj0gMTU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgewogICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoMSA8PCBvcCkgLSAxOwogICAgICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkgewogICAgICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwogICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRCQxOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKICAgICAgICAgICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgewogICAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gMDsKICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuMiAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHduZXh0IDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wIC09IHduZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuMiAtPSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbjIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4yIC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4yID4gMikgewogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdOwogICAgICAgICAgICAgICAgICAgICAgICBsZW4yIC09IDM7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuMikgewogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgLT0gMzsKICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbjIgPiAyKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgNjU1MzUpICsgKGhvbGQgJiAoMSA8PCBvcCkgLSAxKV07CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgZG9kaXN0OwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRCQxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsKICAgICAgICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiA2NTUzNSkgKyAoaG9sZCAmICgxIDw8IG9wKSAtIDEpXTsKICAgICAgICAgICAgICBjb250aW51ZSBkb2xlbjsKICAgICAgICAgICAgfSBlbHNlIGlmIChvcCAmIDMyKSB7CiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEUkMTsKICAgICAgICAgICAgICBicmVhayB0b3A7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7CiAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpOwogICAgbGVuMiA9IGJpdHMgPj4gMzsKICAgIF9pbiAtPSBsZW4yOwogICAgYml0cyAtPSBsZW4yIDw8IDM7CiAgICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTsKICAgIHN0cm0ubmV4dF9pbiA9IF9pbjsKICAgIHN0cm0ubmV4dF9vdXQgPSBfb3V0OwogICAgc3RybS5hdmFpbF9pbiA9IF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KTsKICAgIHN0cm0uYXZhaWxfb3V0ID0gX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKTsKICAgIHN0YXRlLmhvbGQgPSBob2xkOwogICAgc3RhdGUuYml0cyA9IGJpdHM7CiAgICByZXR1cm47CiAgfTsKICB2YXIgdXRpbHMkMiA9IGNvbW1vbiQxOwogIHZhciBNQVhCSVRTID0gMTU7CiAgdmFyIEVOT1VHSF9MRU5TJDEgPSA4NTI7CiAgdmFyIEVOT1VHSF9ESVNUUyQxID0gNTkyOwogIHZhciBDT0RFUyQxID0gMDsKICB2YXIgTEVOUyQxID0gMTsKICB2YXIgRElTVFMkMSA9IDI7CiAgdmFyIGxiYXNlID0gWwogICAgMywKICAgIDQsCiAgICA1LAogICAgNiwKICAgIDcsCiAgICA4LAogICAgOSwKICAgIDEwLAogICAgMTEsCiAgICAxMywKICAgIDE1LAogICAgMTcsCiAgICAxOSwKICAgIDIzLAogICAgMjcsCiAgICAzMSwKICAgIDM1LAogICAgNDMsCiAgICA1MSwKICAgIDU5LAogICAgNjcsCiAgICA4MywKICAgIDk5LAogICAgMTE1LAogICAgMTMxLAogICAgMTYzLAogICAgMTk1LAogICAgMjI3LAogICAgMjU4LAogICAgMCwKICAgIDAKICBdOwogIHZhciBsZXh0ID0gWwogICAgMTYsCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE3LAogICAgMTcsCiAgICAxNywKICAgIDE3LAogICAgMTgsCiAgICAxOCwKICAgIDE4LAogICAgMTgsCiAgICAxOSwKICAgIDE5LAogICAgMTksCiAgICAxOSwKICAgIDIwLAogICAgMjAsCiAgICAyMCwKICAgIDIwLAogICAgMjEsCiAgICAyMSwKICAgIDIxLAogICAgMjEsCiAgICAxNiwKICAgIDcyLAogICAgNzgKICBdOwogIHZhciBkYmFzZSA9IFsKICAgIDEsCiAgICAyLAogICAgMywKICAgIDQsCiAgICA1LAogICAgNywKICAgIDksCiAgICAxMywKICAgIDE3LAogICAgMjUsCiAgICAzMywKICAgIDQ5LAogICAgNjUsCiAgICA5NywKICAgIDEyOSwKICAgIDE5MywKICAgIDI1NywKICAgIDM4NSwKICAgIDUxMywKICAgIDc2OSwKICAgIDEwMjUsCiAgICAxNTM3LAogICAgMjA0OSwKICAgIDMwNzMsCiAgICA0MDk3LAogICAgNjE0NSwKICAgIDgxOTMsCiAgICAxMjI4OSwKICAgIDE2Mzg1LAogICAgMjQ1NzcsCiAgICAwLAogICAgMAogIF07CiAgdmFyIGRleHQgPSBbCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE3LAogICAgMTcsCiAgICAxOCwKICAgIDE4LAogICAgMTksCiAgICAxOSwKICAgIDIwLAogICAgMjAsCiAgICAyMSwKICAgIDIxLAogICAgMjIsCiAgICAyMiwKICAgIDIzLAogICAgMjMsCiAgICAyNCwKICAgIDI0LAogICAgMjUsCiAgICAyNSwKICAgIDI2LAogICAgMjYsCiAgICAyNywKICAgIDI3LAogICAgMjgsCiAgICAyOCwKICAgIDI5LAogICAgMjksCiAgICA2NCwKICAgIDY0CiAgXTsKICB2YXIgaW5mdHJlZXMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlMih0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKSB7CiAgICB2YXIgYml0cyA9IG9wdHMuYml0czsKICAgIHZhciBsZW4yID0gMDsKICAgIHZhciBzeW0gPSAwOwogICAgdmFyIG1pbiA9IDAsIG1heCA9IDA7CiAgICB2YXIgcm9vdDIgPSAwOwogICAgdmFyIGN1cnIgPSAwOwogICAgdmFyIGRyb3AgPSAwOwogICAgdmFyIGxlZnQgPSAwOwogICAgdmFyIHVzZWQgPSAwOwogICAgdmFyIGh1ZmYgPSAwOwogICAgdmFyIGluY3I7CiAgICB2YXIgZmlsbDsKICAgIHZhciBsb3c7CiAgICB2YXIgbWFzazsKICAgIHZhciBuZXh0OwogICAgdmFyIGJhc2UgPSBudWxsOwogICAgdmFyIGJhc2VfaW5kZXggPSAwOwogICAgdmFyIGVuZDsKICAgIHZhciBjb3VudCA9IG5ldyB1dGlscyQyLkJ1ZjE2KE1BWEJJVFMgKyAxKTsKICAgIHZhciBvZmZzID0gbmV3IHV0aWxzJDIuQnVmMTYoTUFYQklUUyArIDEpOwogICAgdmFyIGV4dHJhID0gbnVsbDsKICAgIHZhciBleHRyYV9pbmRleCA9IDA7CiAgICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsKICAgIGZvciAobGVuMiA9IDA7IGxlbjIgPD0gTUFYQklUUzsgbGVuMisrKSB7CiAgICAgIGNvdW50W2xlbjJdID0gMDsKICAgIH0KICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7CiAgICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7CiAgICB9CiAgICByb290MiA9IGJpdHM7CiAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkgewogICAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAocm9vdDIgPiBtYXgpIHsKICAgICAgcm9vdDIgPSBtYXg7CiAgICB9CiAgICBpZiAobWF4ID09PSAwKSB7CiAgICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gMSA8PCAyNCB8IDY0IDw8IDE2IHwgMDsKICAgICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAxIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgICBvcHRzLmJpdHMgPSAxOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykgewogICAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAocm9vdDIgPCBtaW4pIHsKICAgICAgcm9vdDIgPSBtaW47CiAgICB9CiAgICBsZWZ0ID0gMTsKICAgIGZvciAobGVuMiA9IDE7IGxlbjIgPD0gTUFYQklUUzsgbGVuMisrKSB7CiAgICAgIGxlZnQgPDw9IDE7CiAgICAgIGxlZnQgLT0gY291bnRbbGVuMl07CiAgICAgIGlmIChsZWZ0IDwgMCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgfQogICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyQxIHx8IG1heCAhPT0gMSkpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgb2Zmc1sxXSA9IDA7CiAgICBmb3IgKGxlbjIgPSAxOyBsZW4yIDwgTUFYQklUUzsgbGVuMisrKSB7CiAgICAgIG9mZnNbbGVuMiArIDFdID0gb2Zmc1tsZW4yXSArIGNvdW50W2xlbjJdOwogICAgfQogICAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHsKICAgICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHsKICAgICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlID09PSBDT0RFUyQxKSB7CiAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7CiAgICAgIGVuZCA9IDE5OwogICAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TJDEpIHsKICAgICAgYmFzZSA9IGxiYXNlOwogICAgICBiYXNlX2luZGV4IC09IDI1NzsKICAgICAgZXh0cmEgPSBsZXh0OwogICAgICBleHRyYV9pbmRleCAtPSAyNTc7CiAgICAgIGVuZCA9IDI1NjsKICAgIH0gZWxzZSB7CiAgICAgIGJhc2UgPSBkYmFzZTsKICAgICAgZXh0cmEgPSBkZXh0OwogICAgICBlbmQgPSAtMTsKICAgIH0KICAgIGh1ZmYgPSAwOwogICAgc3ltID0gMDsKICAgIGxlbjIgPSBtaW47CiAgICBuZXh0ID0gdGFibGVfaW5kZXg7CiAgICBjdXJyID0gcm9vdDI7CiAgICBkcm9wID0gMDsKICAgIGxvdyA9IC0xOwogICAgdXNlZCA9IDEgPDwgcm9vdDI7CiAgICBtYXNrID0gdXNlZCAtIDE7CiAgICBpZiAodHlwZSA9PT0gTEVOUyQxICYmIHVzZWQgPiBFTk9VR0hfTEVOUyQxIHx8IHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgZm9yICg7IDsgKSB7CiAgICAgIGhlcmVfYml0cyA9IGxlbjIgLSBkcm9wOwogICAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7CiAgICAgICAgaGVyZV9vcCA9IDA7CiAgICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07CiAgICAgIH0gZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7CiAgICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTsKICAgICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7CiAgICAgICAgaGVyZV92YWwgPSAwOwogICAgICB9CiAgICAgIGluY3IgPSAxIDw8IGxlbjIgLSBkcm9wOwogICAgICBmaWxsID0gMSA8PCBjdXJyOwogICAgICBtaW4gPSBmaWxsOwogICAgICBkbyB7CiAgICAgICAgZmlsbCAtPSBpbmNyOwogICAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gaGVyZV9iaXRzIDw8IDI0IHwgaGVyZV9vcCA8PCAxNiB8IGhlcmVfdmFsIHwgMDsKICAgICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7CiAgICAgIGluY3IgPSAxIDw8IGxlbjIgLSAxOwogICAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHsKICAgICAgICBpbmNyID4+PSAxOwogICAgICB9CiAgICAgIGlmIChpbmNyICE9PSAwKSB7CiAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKICAgICAgICBodWZmICs9IGluY3I7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaHVmZiA9IDA7CiAgICAgIH0KICAgICAgc3ltKys7CiAgICAgIGlmICgtLWNvdW50W2xlbjJdID09PSAwKSB7CiAgICAgICAgaWYgKGxlbjIgPT09IG1heCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxlbjIgPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dOwogICAgICB9CiAgICAgIGlmIChsZW4yID4gcm9vdDIgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7CiAgICAgICAgaWYgKGRyb3AgPT09IDApIHsKICAgICAgICAgIGRyb3AgPSByb290MjsKICAgICAgICB9CiAgICAgICAgbmV4dCArPSBtaW47CiAgICAgICAgY3VyciA9IGxlbjIgLSBkcm9wOwogICAgICAgIGxlZnQgPSAxIDw8IGN1cnI7CiAgICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7CiAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKICAgICAgICAgIGlmIChsZWZ0IDw9IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyKys7CiAgICAgICAgICBsZWZ0IDw8PSAxOwogICAgICAgIH0KICAgICAgICB1c2VkICs9IDEgPDwgY3VycjsKICAgICAgICBpZiAodHlwZSA9PT0gTEVOUyQxICYmIHVzZWQgPiBFTk9VR0hfTEVOUyQxIHx8IHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgbG93ID0gaHVmZiAmIG1hc2s7CiAgICAgICAgdGFibGVbbG93XSA9IHJvb3QyIDw8IDI0IHwgY3VyciA8PCAxNiB8IG5leHQgLSB0YWJsZV9pbmRleCB8IDA7CiAgICAgIH0KICAgIH0KICAgIGlmIChodWZmICE9PSAwKSB7CiAgICAgIHRhYmxlW25leHQgKyBodWZmXSA9IGxlbjIgLSBkcm9wIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgfQogICAgb3B0cy5iaXRzID0gcm9vdDI7CiAgICByZXR1cm4gMDsKICB9OwogIHZhciB1dGlscyQxID0gY29tbW9uJDE7CiAgdmFyIGFkbGVyMzIgPSBhZGxlcjMyXzE7CiAgdmFyIGNyYzMyID0gY3JjMzJfMTsKICB2YXIgaW5mbGF0ZV9mYXN0ID0gaW5mZmFzdDsKICB2YXIgaW5mbGF0ZV90YWJsZSA9IGluZnRyZWVzOwogIHZhciBDT0RFUyA9IDA7CiAgdmFyIExFTlMgPSAxOwogIHZhciBESVNUUyA9IDI7CiAgdmFyIFpfRklOSVNIID0gNDsKICB2YXIgWl9CTE9DSyA9IDU7CiAgdmFyIFpfVFJFRVMgPSA2OwogIHZhciBaX09LID0gMDsKICB2YXIgWl9TVFJFQU1fRU5EID0gMTsKICB2YXIgWl9ORUVEX0RJQ1QgPSAyOwogIHZhciBaX1NUUkVBTV9FUlJPUiA9IC0yOwogIHZhciBaX0RBVEFfRVJST1IgPSAtMzsKICB2YXIgWl9NRU1fRVJST1IgPSAtNDsKICB2YXIgWl9CVUZfRVJST1IgPSAtNTsKICB2YXIgWl9ERUZMQVRFRCA9IDg7CiAgdmFyIEhFQUQgPSAxOwogIHZhciBGTEFHUyA9IDI7CiAgdmFyIFRJTUUgPSAzOwogIHZhciBPUyA9IDQ7CiAgdmFyIEVYTEVOID0gNTsKICB2YXIgRVhUUkEgPSA2OwogIHZhciBOQU1FID0gNzsKICB2YXIgQ09NTUVOVCA9IDg7CiAgdmFyIEhDUkMgPSA5OwogIHZhciBESUNUSUQgPSAxMDsKICB2YXIgRElDVCA9IDExOwogIHZhciBUWVBFID0gMTI7CiAgdmFyIFRZUEVETyA9IDEzOwogIHZhciBTVE9SRUQgPSAxNDsKICB2YXIgQ09QWV8gPSAxNTsKICB2YXIgQ09QWSA9IDE2OwogIHZhciBUQUJMRSA9IDE3OwogIHZhciBMRU5MRU5TID0gMTg7CiAgdmFyIENPREVMRU5TID0gMTk7CiAgdmFyIExFTl8gPSAyMDsKICB2YXIgTEVOID0gMjE7CiAgdmFyIExFTkVYVCA9IDIyOwogIHZhciBESVNUID0gMjM7CiAgdmFyIERJU1RFWFQgPSAyNDsKICB2YXIgTUFUQ0ggPSAyNTsKICB2YXIgTElUID0gMjY7CiAgdmFyIENIRUNLID0gMjc7CiAgdmFyIExFTkdUSCA9IDI4OwogIHZhciBET05FID0gMjk7CiAgdmFyIEJBRCA9IDMwOwogIHZhciBNRU0gPSAzMTsKICB2YXIgU1lOQyA9IDMyOwogIHZhciBFTk9VR0hfTEVOUyA9IDg1MjsKICB2YXIgRU5PVUdIX0RJU1RTID0gNTkyOwogIHZhciBNQVhfV0JJVFMgPSAxNTsKICB2YXIgREVGX1dCSVRTID0gTUFYX1dCSVRTOwogIGZ1bmN0aW9uIHpzd2FwMzIocTIpIHsKICAgIHJldHVybiAocTIgPj4+IDI0ICYgMjU1KSArIChxMiA+Pj4gOCAmIDY1MjgwKSArICgocTIgJiA2NTI4MCkgPDwgOCkgKyAoKHEyICYgMjU1KSA8PCAyNCk7CiAgfQogIGZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHsKICAgIHRoaXMubW9kZSA9IDA7CiAgICB0aGlzLmxhc3QgPSBmYWxzZTsKICAgIHRoaXMud3JhcCA9IDA7CiAgICB0aGlzLmhhdmVkaWN0ID0gZmFsc2U7CiAgICB0aGlzLmZsYWdzID0gMDsKICAgIHRoaXMuZG1heCA9IDA7CiAgICB0aGlzLmNoZWNrID0gMDsKICAgIHRoaXMudG90YWwgPSAwOwogICAgdGhpcy5oZWFkID0gbnVsbDsKICAgIHRoaXMud2JpdHMgPSAwOwogICAgdGhpcy53c2l6ZSA9IDA7CiAgICB0aGlzLndoYXZlID0gMDsKICAgIHRoaXMud25leHQgPSAwOwogICAgdGhpcy53aW5kb3cgPSBudWxsOwogICAgdGhpcy5ob2xkID0gMDsKICAgIHRoaXMuYml0cyA9IDA7CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB0aGlzLmV4dHJhID0gMDsKICAgIHRoaXMubGVuY29kZSA9IG51bGw7CiAgICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsKICAgIHRoaXMubGVuYml0cyA9IDA7CiAgICB0aGlzLmRpc3RiaXRzID0gMDsKICAgIHRoaXMubmNvZGUgPSAwOwogICAgdGhpcy5ubGVuID0gMDsKICAgIHRoaXMubmRpc3QgPSAwOwogICAgdGhpcy5oYXZlID0gMDsKICAgIHRoaXMubmV4dCA9IG51bGw7CiAgICB0aGlzLmxlbnMgPSBuZXcgdXRpbHMkMS5CdWYxNigzMjApOwogICAgdGhpcy53b3JrID0gbmV3IHV0aWxzJDEuQnVmMTYoMjg4KTsKICAgIHRoaXMubGVuZHluID0gbnVsbDsKICAgIHRoaXMuZGlzdGR5biA9IG51bGw7CiAgICB0aGlzLnNhbmUgPSAwOwogICAgdGhpcy5iYWNrID0gMDsKICAgIHRoaXMud2FzID0gMDsKICB9CiAgZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7CiAgICB2YXIgc3RhdGU7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwOwogICAgc3RybS5tc2cgPSAiIjsKICAgIGlmIChzdGF0ZS53cmFwKSB7CiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTsKICAgIH0KICAgIHN0YXRlLm1vZGUgPSBIRUFEOwogICAgc3RhdGUubGFzdCA9IDA7CiAgICBzdGF0ZS5oYXZlZGljdCA9IDA7CiAgICBzdGF0ZS5kbWF4ID0gMzI3Njg7CiAgICBzdGF0ZS5oZWFkID0gbnVsbDsKICAgIHN0YXRlLmhvbGQgPSAwOwogICAgc3RhdGUuYml0cyA9IDA7CiAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzJDEuQnVmMzIoRU5PVUdIX0xFTlMpOwogICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzJDEuQnVmMzIoRU5PVUdIX0RJU1RTKTsKICAgIHN0YXRlLnNhbmUgPSAxOwogICAgc3RhdGUuYmFjayA9IC0xOwogICAgcmV0dXJuIFpfT0s7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7CiAgICB2YXIgc3RhdGU7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgc3RhdGUud3NpemUgPSAwOwogICAgc3RhdGUud2hhdmUgPSAwOwogICAgc3RhdGUud25leHQgPSAwOwogICAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykgewogICAgdmFyIHdyYXA7CiAgICB2YXIgc3RhdGU7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CiAgICAgIHdyYXAgPSAwOwogICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CiAgICB9IGVsc2UgewogICAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOwogICAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7CiAgICAgICAgd2luZG93Qml0cyAmPSAxNTsKICAgICAgfQogICAgfQogICAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgaWYgKHN0YXRlLndpbmRvdyAhPT0gbnVsbCAmJiBzdGF0ZS53Yml0cyAhPT0gd2luZG93Qml0cykgewogICAgICBzdGF0ZS53aW5kb3cgPSBudWxsOwogICAgfQogICAgc3RhdGUud3JhcCA9IHdyYXA7CiAgICBzdGF0ZS53Yml0cyA9IHdpbmRvd0JpdHM7CiAgICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pOwogIH0KICBmdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgewogICAgdmFyIHJldDsKICAgIHZhciBzdGF0ZTsKICAgIGlmICghc3RybSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICB9CiAgICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTsKICAgIHN0cm0uc3RhdGUgPSBzdGF0ZTsKICAgIHN0YXRlLndpbmRvdyA9IG51bGw7CiAgICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpOwogICAgaWYgKHJldCAhPT0gWl9PSykgewogICAgICBzdHJtLnN0YXRlID0gbnVsbDsKICAgIH0KICAgIHJldHVybiByZXQ7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGVJbml0KHN0cm0pIHsKICAgIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTsKICB9CiAgdmFyIHZpcmdpbiA9IHRydWU7CiAgdmFyIGxlbmZpeCwgZGlzdGZpeDsKICBmdW5jdGlvbiBmaXhlZHRhYmxlcyhzdGF0ZSkgewogICAgaWYgKHZpcmdpbikgewogICAgICB2YXIgc3ltOwogICAgICBsZW5maXggPSBuZXcgdXRpbHMkMS5CdWYzMig1MTIpOwogICAgICBkaXN0Zml4ID0gbmV3IHV0aWxzJDEuQnVmMzIoMzIpOwogICAgICBzeW0gPSAwOwogICAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7CiAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4OwogICAgICB9CiAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHsKICAgICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7CiAgICAgIH0KICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgewogICAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gNzsKICAgICAgfQogICAgICB3aGlsZSAoc3ltIDwgMjg4KSB7CiAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4OwogICAgICB9CiAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTsKICAgICAgc3ltID0gMDsKICAgICAgd2hpbGUgKHN5bSA8IDMyKSB7CiAgICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA1OwogICAgICB9CiAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7CiAgICAgIHZpcmdpbiA9IGZhbHNlOwogICAgfQogICAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDsKICAgIHN0YXRlLmxlbmJpdHMgPSA5OwogICAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4OwogICAgc3RhdGUuZGlzdGJpdHMgPSA1OwogIH0KICBmdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHsKICAgIHZhciBkaXN0OwogICAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTsKICAgIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHsKICAgICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzOwogICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgIHN0YXRlLndoYXZlID0gMDsKICAgICAgc3RhdGUud2luZG93ID0gbmV3IHV0aWxzJDEuQnVmOChzdGF0ZS53c2l6ZSk7CiAgICB9CiAgICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkgewogICAgICB1dGlscyQxLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApOwogICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7CiAgICB9IGVsc2UgewogICAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDsKICAgICAgaWYgKGRpc3QgPiBjb3B5KSB7CiAgICAgICAgZGlzdCA9IGNvcHk7CiAgICAgIH0KICAgICAgdXRpbHMkMS5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpOwogICAgICBjb3B5IC09IGRpc3Q7CiAgICAgIGlmIChjb3B5KSB7CiAgICAgICAgdXRpbHMkMS5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgY29weSwgMCk7CiAgICAgICAgc3RhdGUud25leHQgPSBjb3B5OwogICAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RhdGUud25leHQgKz0gZGlzdDsKICAgICAgICBpZiAoc3RhdGUud25leHQgPT09IHN0YXRlLndzaXplKSB7CiAgICAgICAgICBzdGF0ZS53bmV4dCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7CiAgICAgICAgICBzdGF0ZS53aGF2ZSArPSBkaXN0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGUkMihzdHJtLCBmbHVzaCkgewogICAgdmFyIHN0YXRlOwogICAgdmFyIGlucHV0LCBvdXRwdXQ7CiAgICB2YXIgbmV4dDsKICAgIHZhciBwdXQ7CiAgICB2YXIgaGF2ZSwgbGVmdDsKICAgIHZhciBob2xkOwogICAgdmFyIGJpdHM7CiAgICB2YXIgX2luLCBfb3V0OwogICAgdmFyIGNvcHk7CiAgICB2YXIgZnJvbTsKICAgIHZhciBmcm9tX3NvdXJjZTsKICAgIHZhciBoZXJlID0gMDsKICAgIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOwogICAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7CiAgICB2YXIgbGVuMjsKICAgIHZhciByZXQ7CiAgICB2YXIgaGJ1ZiA9IG5ldyB1dGlscyQxLkJ1ZjgoNCk7CiAgICB2YXIgb3B0czsKICAgIHZhciBuOwogICAgdmFyIG9yZGVyID0gWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdOwogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fCAhc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICAgIHN0YXRlID0gc3RybS5zdGF0ZTsKICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7CiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87CiAgICB9CiAgICBwdXQgPSBzdHJtLm5leHRfb3V0OwogICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7CiAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7CiAgICBuZXh0ID0gc3RybS5uZXh0X2luOwogICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47CiAgICBob2xkID0gc3RhdGUuaG9sZDsKICAgIGJpdHMgPSBzdGF0ZS5iaXRzOwogICAgX2luID0gaGF2ZTsKICAgIF9vdXQgPSBsZWZ0OwogICAgcmV0ID0gWl9PSzsKICAgIGluZl9sZWF2ZToKICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7CiAgICAgICAgICBjYXNlIEhFQUQ6CiAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7CiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUud3JhcCAmIDIgJiYgaG9sZCA9PT0gMzU2MTUpIHsKICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IDA7CiAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7CiAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLmZsYWdzID0gMDsKICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShzdGF0ZS53cmFwICYgMSkgfHwgKCgoaG9sZCAmIDI1NSkgPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkgewogICAgICAgICAgICAgIHN0cm0ubXNnID0gImluY29ycmVjdCBoZWFkZXIgY2hlY2siOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChob2xkICYgMTUpICE9PSBaX0RFRkxBVEVEKSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaG9sZCA+Pj49IDQ7CiAgICAgICAgICAgIGJpdHMgLT0gNDsKICAgICAgICAgICAgbGVuMiA9IChob2xkICYgMTUpICsgODsKICAgICAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7CiAgICAgICAgICAgICAgc3RhdGUud2JpdHMgPSBsZW4yOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxlbjIgPiBzdGF0ZS53Yml0cykgewogICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgd2luZG93IHNpemUiOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuMjsKICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMTsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiA1MTIgPyBESUNUSUQgOiBUWVBFOwogICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBGTEFHUzoKICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkOwogICAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMjU1KSAhPT0gWl9ERUZMQVRFRCkgewogICAgICAgICAgICAgIHN0cm0ubXNnID0gInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDU3MzQ0KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gaG9sZCA+PiA4ICYgMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICBoYnVmWzFdID0gaG9sZCA+Pj4gOCAmIDI1NTsKICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUSU1FOwogICAgICAgICAgY2FzZSBUSU1FOgogICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgIHN0YXRlLmhlYWQudGltZSA9IGhvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsyXSA9IGhvbGQgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgIGhidWZbM10gPSBob2xkID4+PiAyNCAmIDI1NTsKICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBPUzsKICAgICAgICAgIGNhc2UgT1M6CiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSBob2xkICYgMjU1OwogICAgICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSBob2xkID4+IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47CiAgICAgICAgICBjYXNlIEVYTEVOOgogICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAxMDI0KSB7CiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7CiAgICAgICAgICBjYXNlIEVYVFJBOgogICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAxMDI0KSB7CiAgICAgICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBoYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoY29weSkgewogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICAgICAgbGVuMiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB1dGlscyQxLmFycmF5U2V0KAogICAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsCiAgICAgICAgICAgICAgICAgICAgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgbmV4dCwKICAgICAgICAgICAgICAgICAgICBjb3B5LAogICAgICAgICAgICAgICAgICAgIGxlbjIKICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CiAgICAgICAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5sZW5ndGggPSAwOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gTkFNRTsKICAgICAgICAgIGNhc2UgTkFNRToKICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMjA0OCkgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvcHkgPSAwOwogICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGxlbjIgPSBpbnB1dFtuZXh0ICsgY29weSsrXTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbjIgJiYgc3RhdGUubGVuZ3RoIDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuMiAmJiBjb3B5IDwgaGF2ZSk7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CiAgICAgICAgICAgICAgaWYgKGxlbjIpIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGVhZCkgewogICAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUubGVuZ3RoID0gMDsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IENPTU1FTlQ7CiAgICAgICAgICBjYXNlIENPTU1FTlQ6CiAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDQwOTYpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb3B5ID0gMDsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBsZW4yID0gaW5wdXRbbmV4dCArIGNvcHkrK107CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4yICYmIHN0YXRlLmxlbmd0aCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbjIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gd2hpbGUgKGxlbjIgJiYgY29weSA8IGhhdmUpOwogICAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgICAgICAgIGlmIChsZW4yKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHsKICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDOwogICAgICAgICAgY2FzZSBIQ1JDOgogICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDY1NTM1KSkgewogICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaGVhZGVyIGNyYyBtaXNtYXRjaCI7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7CiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gc3RhdGUuZmxhZ3MgPj4gOSAmIDE7CiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERJQ1RJRDoKICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTsKICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gRElDVDsKICAgICAgICAgIGNhc2UgRElDVDoKICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7CiAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMTsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7CiAgICAgICAgICBjYXNlIFRZUEU6CiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBUWVBFRE86CiAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0KSB7CiAgICAgICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3OwogICAgICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7CiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMykgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUubGFzdCA9IGhvbGQgJiAxOwogICAgICAgICAgICBob2xkID4+Pj0gMTsKICAgICAgICAgICAgYml0cyAtPSAxOwogICAgICAgICAgICBzd2l0Y2ggKGhvbGQgJiAzKSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFNUT1JFRDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOwogICAgICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgYmxvY2sgdHlwZSI7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBTVE9SRUQ6CiAgICAgICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNzsKICAgICAgICAgICAgYml0cyAtPSBiaXRzICYgNzsKICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChob2xkICYgNjU1MzUpICE9PSAoaG9sZCA+Pj4gMTYgXiA2NTUzNSkpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiA2NTUzNTsKICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWV87CiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBDT1BZXzoKICAgICAgICAgICAgc3RhdGUubW9kZSA9IENPUFk7CiAgICAgICAgICBjYXNlIENPUFk6CiAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgICAgIGlmIChjb3B5KSB7CiAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7CiAgICAgICAgICAgICAgICBjb3B5ID0gaGF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7CiAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGNvcHkgPT09IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXRpbHMkMS5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpOwogICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CiAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwogICAgICAgICAgICAgIHB1dCArPSBjb3B5OwogICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVEFCTEU6CiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDMxKSArIDI1NzsKICAgICAgICAgICAgaG9sZCA+Pj49IDU7CiAgICAgICAgICAgIGJpdHMgLT0gNTsKICAgICAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDMxKSArIDE7CiAgICAgICAgICAgIGhvbGQgPj4+PSA1OwogICAgICAgICAgICBiaXRzIC09IDU7CiAgICAgICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAxNSkgKyA0OwogICAgICAgICAgICBob2xkID4+Pj0gNDsKICAgICAgICAgICAgYml0cyAtPSA0OwogICAgICAgICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuaGF2ZSA9IDA7CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TOwogICAgICAgICAgY2FzZSBMRU5MRU5TOgogICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7CiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IGhvbGQgJiA3OwogICAgICAgICAgICAgIGhvbGQgPj4+PSAzOwogICAgICAgICAgICAgIGJpdHMgLT0gMzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7CiAgICAgICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjsKICAgICAgICAgICAgc3RhdGUubGVuYml0cyA9IDc7CiAgICAgICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTsKICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpOwogICAgICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzOwogICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLmhhdmUgPSAwOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7CiAgICAgICAgICBjYXNlIENPREVMRU5TOgogICAgICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkgewogICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMV07CiAgICAgICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDsKICAgICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7CiAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikgewogICAgICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGxlbjIgPSBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUgLSAxXTsKICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDMpOwogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gMjsKICAgICAgICAgICAgICAgICAgYml0cyAtPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHsKICAgICAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgIGxlbjIgPSAwOwogICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgNyk7CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAzOwogICAgICAgICAgICAgICAgICBiaXRzIC09IDM7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgNzsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgbGVuMiA9IDA7CiAgICAgICAgICAgICAgICAgIGNvcHkgPSAxMSArIChob2xkICYgMTI3KTsKICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gNzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkgewogICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoY29weS0tKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBCQUQpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLmxlbmJpdHMgPSA5OwogICAgICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07CiAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7CiAgICAgICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7CiAgICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2OwogICAgICAgICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47CiAgICAgICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07CiAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIHN0YXRlLm5sZW4sIHN0YXRlLm5kaXN0LCBzdGF0ZS5kaXN0Y29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7CiAgICAgICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzOwogICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZXMgc2V0IjsKICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOwogICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsKICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgTEVOXzoKICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTjsKICAgICAgICAgIGNhc2UgTEVOOgogICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CiAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDsKICAgICAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7CiAgICAgICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDsKICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDsKICAgICAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7CiAgICAgICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjsKICAgICAgICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7CiAgICAgICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47CiAgICAgICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7CiAgICAgICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuYmFjayA9IDA7CiAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDFdOwogICAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMjQwKSA9PT0gMCkgewogICAgICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0czsKICAgICAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDsKICAgICAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsOwogICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgKyAoKGhvbGQgJiAoMSA8PCBsYXN0X2JpdHMgKyBsYXN0X29wKSAtIDEpID4+IGxhc3RfYml0cyldOwogICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICBoZXJlX29wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgIGlmIChsYXN0X2JpdHMgKyBoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzOwogICAgICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzOwogICAgICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzOwogICAgICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0czsKICAgICAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7CiAgICAgICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7CiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IExJVDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7CiAgICAgICAgICAgICAgc3RhdGUuYmFjayA9IC0xOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoZXJlX29wICYgNjQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5FWFQ7CiAgICAgICAgICBjYXNlIExFTkVYVDoKICAgICAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7CiAgICAgICAgICAgICAgbiA9IHN0YXRlLmV4dHJhOwogICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKDEgPDwgc3RhdGUuZXh0cmEpIC0gMTsKICAgICAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IERJU1Q7CiAgICAgICAgICBjYXNlIERJU1Q6CiAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMV07CiAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgaGVyZV9vcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChoZXJlX29wICYgMjQwKSA9PT0gMCkgewogICAgICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0czsKICAgICAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDsKICAgICAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsOwogICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICsgKChob2xkICYgKDEgPDwgbGFzdF9iaXRzICsgbGFzdF9vcCkgLSAxKSA+PiBsYXN0X2JpdHMpXTsKICAgICAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICAgICAgaGVyZV9vcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICBpZiAobGFzdF9iaXRzICsgaGVyZV9iaXRzIDw9IGJpdHMpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0czsKICAgICAgICAgICAgICBiaXRzIC09IGxhc3RfYml0czsKICAgICAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0czsKICAgICAgICAgICAgfQogICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7CiAgICAgICAgICAgIGlmIChoZXJlX29wICYgNjQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7CiAgICAgICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1OwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDsKICAgICAgICAgIGNhc2UgRElTVEVYVDoKICAgICAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7CiAgICAgICAgICAgICAgbiA9IHN0YXRlLmV4dHJhOwogICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKDEgPDwgc3RhdGUuZXh0cmEpIC0gMTsKICAgICAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7CiAgICAgICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTsKICAgICAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUubW9kZSA9IE1BVENIOwogICAgICAgICAgY2FzZSBNQVRDSDoKICAgICAgICAgICAgaWYgKGxlZnQgPT09IDApIHsKICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29weSA9IF9vdXQgLSBsZWZ0OwogICAgICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgewogICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5OwogICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHsKICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7CiAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5OwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDsKICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgewogICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlZnQgLT0gY29weTsKICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTsKICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIExJVDoKICAgICAgICAgICAgaWYgKGxlZnQgPT09IDApIHsKICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDsKICAgICAgICAgICAgbGVmdC0tOwogICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ0hFQ0s6CiAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwKSB7CiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF9vdXQgLT0gbGVmdDsKICAgICAgICAgICAgICBzdHJtLnRvdGFsX291dCArPSBfb3V0OwogICAgICAgICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7CiAgICAgICAgICAgICAgaWYgKF9vdXQpIHsKICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfb3V0ID0gbGVmdDsKICAgICAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykgewogICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW5jb3JyZWN0IGRhdGEgY2hlY2siOwogICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIOwogICAgICAgICAgY2FzZSBMRU5HVEg6CiAgICAgICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7CiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiA0Mjk0OTY3Mjk1KSkgewogICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBET05FOwogICAgICAgICAgY2FzZSBET05FOgogICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgIGNhc2UgQkFEOgogICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgIGNhc2UgTUVNOgogICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICAgICAgICBjYXNlIFNZTkM6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICBzdHJtLm5leHRfb3V0ID0gcHV0OwogICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0OwogICAgc3RybS5uZXh0X2luID0gbmV4dDsKICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlOwogICAgc3RhdGUuaG9sZCA9IGhvbGQ7CiAgICBzdGF0ZS5iaXRzID0gYml0czsKICAgIGlmIChzdGF0ZS53c2l6ZSB8fCBfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkgewogICAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKQogICAgICAgIDsKICAgIH0KICAgIF9pbiAtPSBzdHJtLmF2YWlsX2luOwogICAgX291dCAtPSBzdHJtLmF2YWlsX291dDsKICAgIHN0cm0udG90YWxfaW4gKz0gX2luOwogICAgc3RybS50b3RhbF9vdXQgKz0gX291dDsKICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7CiAgICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7CiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCk7CiAgICB9CiAgICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgKyAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICsgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTsKICAgIGlmICgoX2luID09PSAwICYmIF9vdXQgPT09IDAgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHsKICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CiAgICB9CiAgICByZXR1cm4gcmV0OwogIH0KICBmdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHsKICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICB9CiAgICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgaWYgKHN0YXRlLndpbmRvdykgewogICAgICBzdGF0ZS53aW5kb3cgPSBudWxsOwogICAgfQogICAgc3RybS5zdGF0ZSA9IG51bGw7CiAgICByZXR1cm4gWl9PSzsKICB9CiAgZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7CiAgICB2YXIgc3RhdGU7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUuaGVhZCA9IGhlYWQ7CiAgICBoZWFkLmRvbmUgPSBmYWxzZTsKICAgIHJldHVybiBaX09LOwogIH0KICBmdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7CiAgICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoOwogICAgdmFyIHN0YXRlOwogICAgdmFyIGRpY3RpZDsKICAgIHZhciByZXQ7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUgPSBzdHJtLnN0YXRlOwogICAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICB9CiAgICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkgewogICAgICBkaWN0aWQgPSAxOwogICAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7CiAgICAgIGlmIChkaWN0aWQgIT09IHN0YXRlLmNoZWNrKSB7CiAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKICAgICAgfQogICAgfQogICAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpOwogICAgaWYgKHJldCkgewogICAgICBzdGF0ZS5tb2RlID0gTUVNOwogICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICB9CiAgICBzdGF0ZS5oYXZlZGljdCA9IDE7CiAgICByZXR1cm4gWl9PSzsKICB9CiAgaW5mbGF0ZSQzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDsKICBpbmZsYXRlJDMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7CiAgaW5mbGF0ZSQzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwOwogIGluZmxhdGUkMy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0OwogIGluZmxhdGUkMy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7CiAgaW5mbGF0ZSQzLmluZmxhdGUgPSBpbmZsYXRlJDI7CiAgaW5mbGF0ZSQzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kOwogIGluZmxhdGUkMy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjsKICBpbmZsYXRlJDMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTsKICBpbmZsYXRlJDMuaW5mbGF0ZUluZm8gPSAicGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7CiAgdmFyIGNvbnN0YW50cyQxID0gewogICAgWl9OT19GTFVTSDogMCwKICAgIFpfUEFSVElBTF9GTFVTSDogMSwKICAgIFpfU1lOQ19GTFVTSDogMiwKICAgIFpfRlVMTF9GTFVTSDogMywKICAgIFpfRklOSVNIOiA0LAogICAgWl9CTE9DSzogNSwKICAgIFpfVFJFRVM6IDYsCiAgICBaX09LOiAwLAogICAgWl9TVFJFQU1fRU5EOiAxLAogICAgWl9ORUVEX0RJQ1Q6IDIsCiAgICBaX0VSUk5POiAtMSwKICAgIFpfU1RSRUFNX0VSUk9SOiAtMiwKICAgIFpfREFUQV9FUlJPUjogLTMsCiAgICBaX0JVRl9FUlJPUjogLTUsCiAgICBaX05PX0NPTVBSRVNTSU9OOiAwLAogICAgWl9CRVNUX1NQRUVEOiAxLAogICAgWl9CRVNUX0NPTVBSRVNTSU9OOiA5LAogICAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAtMSwKICAgIFpfRklMVEVSRUQ6IDEsCiAgICBaX0hVRkZNQU5fT05MWTogMiwKICAgIFpfUkxFOiAzLAogICAgWl9GSVhFRDogNCwKICAgIFpfREVGQVVMVF9TVFJBVEVHWTogMCwKICAgIFpfQklOQVJZOiAwLAogICAgWl9URVhUOiAxLAogICAgWl9VTktOT1dOOiAyLAogICAgWl9ERUZMQVRFRDogOAogIH07CiAgZnVuY3Rpb24gR1poZWFkZXIkMSgpIHsKICAgIHRoaXMudGV4dCA9IDA7CiAgICB0aGlzLnRpbWUgPSAwOwogICAgdGhpcy54ZmxhZ3MgPSAwOwogICAgdGhpcy5vcyA9IDA7CiAgICB0aGlzLmV4dHJhID0gbnVsbDsKICAgIHRoaXMuZXh0cmFfbGVuID0gMDsKICAgIHRoaXMubmFtZSA9ICIiOwogICAgdGhpcy5jb21tZW50ID0gIiI7CiAgICB0aGlzLmhjcmMgPSAwOwogICAgdGhpcy5kb25lID0gZmFsc2U7CiAgfQogIHZhciBnemhlYWRlciA9IEdaaGVhZGVyJDE7CiAgdmFyIHpsaWJfaW5mbGF0ZSA9IGluZmxhdGUkMzsKICB2YXIgdXRpbHMgPSBjb21tb24kMTsKICB2YXIgc3RyaW5ncyA9IHN0cmluZ3MkMjsKICB2YXIgYyA9IGNvbnN0YW50cyQxOwogIHZhciBtc2cgPSBtZXNzYWdlcyQxOwogIHZhciBaU3RyZWFtID0genN0cmVhbTsKICB2YXIgR1poZWFkZXIgPSBnemhlYWRlcjsKICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogIGZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykgewogICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKQogICAgICByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7CiAgICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oewogICAgICBjaHVua1NpemU6IDE2Mzg0LAogICAgICB3aW5kb3dCaXRzOiAwLAogICAgICB0bzogIiIKICAgIH0sIG9wdGlvbnMgfHwge30pOwogICAgdmFyIG9wdCA9IHRoaXMub3B0aW9uczsKICAgIGlmIChvcHQucmF3ICYmIG9wdC53aW5kb3dCaXRzID49IDAgJiYgb3B0LndpbmRvd0JpdHMgPCAxNikgewogICAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0czsKICAgICAgaWYgKG9wdC53aW5kb3dCaXRzID09PSAwKSB7CiAgICAgICAgb3B0LndpbmRvd0JpdHMgPSAtMTU7CiAgICAgIH0KICAgIH0KICAgIGlmIChvcHQud2luZG93Qml0cyA+PSAwICYmIG9wdC53aW5kb3dCaXRzIDwgMTYgJiYgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHsKICAgICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7CiAgICB9CiAgICBpZiAob3B0LndpbmRvd0JpdHMgPiAxNSAmJiBvcHQud2luZG93Qml0cyA8IDQ4KSB7CiAgICAgIGlmICgob3B0LndpbmRvd0JpdHMgJiAxNSkgPT09IDApIHsKICAgICAgICBvcHQud2luZG93Qml0cyB8PSAxNTsKICAgICAgfQogICAgfQogICAgdGhpcy5lcnIgPSAwOwogICAgdGhpcy5tc2cgPSAiIjsKICAgIHRoaXMuZW5kZWQgPSBmYWxzZTsKICAgIHRoaXMuY2h1bmtzID0gW107CiAgICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSgpOwogICAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7CiAgICB2YXIgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MigKICAgICAgdGhpcy5zdHJtLAogICAgICBvcHQud2luZG93Qml0cwogICAgKTsKICAgIGlmIChzdGF0dXMgIT09IGMuWl9PSykgewogICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pOwogICAgfQogICAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTsKICAgIHpsaWJfaW5mbGF0ZS5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpOwogICAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7CiAgICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgb3B0LmRpY3Rpb25hcnkgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpOwogICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgICAgb3B0LmRpY3Rpb25hcnkgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7CiAgICAgIH0KICAgICAgaWYgKG9wdC5yYXcpIHsKICAgICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7CiAgICAgICAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBJbmZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZGF0YSwgbW9kZSkgewogICAgdmFyIHN0cm0gPSB0aGlzLnN0cm07CiAgICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTsKICAgIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7CiAgICB2YXIgc3RhdHVzLCBfbW9kZTsKICAgIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyOwogICAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTsKICAgIGlmICh0aGlzLmVuZGVkKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9tb2RlID0gbW9kZSA9PT0gfn5tb2RlID8gbW9kZSA6IG1vZGUgPT09IHRydWUgPyBjLlpfRklOSVNIIDogYy5aX05PX0ZMVVNIOwogICAgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5iaW5zdHJpbmcyYnVmKGRhdGEpOwogICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cm0uaW5wdXQgPSBkYXRhOwogICAgfQogICAgc3RybS5uZXh0X2luID0gMDsKICAgIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDsKICAgIGRvIHsKICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpOwogICAgICAgIHN0cm0ubmV4dF9vdXQgPSAwOwogICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplOwogICAgICB9CiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7CiAgICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkgewogICAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3Rpb25hcnkpOwogICAgICB9CiAgICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkgewogICAgICAgIHN0YXR1cyA9IGMuWl9PSzsKICAgICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHsKICAgICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7CiAgICAgICAgdGhpcy5lbmRlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChzdHJtLm5leHRfb3V0KSB7CiAgICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkgewogICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7CiAgICAgICAgICAgIHRhaWwgPSBzdHJtLm5leHRfb3V0IC0gbmV4dF9vdXRfdXRmODsKICAgICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7CiAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB0YWlsOwogICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7CiAgICAgICAgICAgIGlmICh0YWlsKSB7CiAgICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRGF0YSh1dGY4c3RyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlOwogICAgICB9CiAgICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpOwogICAgaWYgKHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQpIHsKICAgICAgX21vZGUgPSBjLlpfRklOSVNIOwogICAgfQogICAgaWYgKF9tb2RlID09PSBjLlpfRklOSVNIKSB7CiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7CiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgICAgdGhpcy5lbmRlZCA9IHRydWU7CiAgICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSzsKICAgIH0KICAgIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHsKICAgICAgdGhpcy5vbkVuZChjLlpfT0spOwogICAgICBzdHJtLmF2YWlsX291dCA9IDA7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfTsKICBJbmZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaykgewogICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7CiAgfTsKICBJbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCIiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmNodW5rcyA9IFtdOwogICAgdGhpcy5lcnIgPSBzdGF0dXM7CiAgICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7CiAgfTsKICBmdW5jdGlvbiBpbmZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpIHsKICAgIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpOwogICAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7CiAgICBpZiAoaW5mbGF0b3IuZXJyKSB7CiAgICAgIHRocm93IGluZmxhdG9yLm1zZyB8fCBtc2dbaW5mbGF0b3IuZXJyXTsKICAgIH0KICAgIHJldHVybiBpbmZsYXRvci5yZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy5yYXcgPSB0cnVlOwogICAgcmV0dXJuIGluZmxhdGUkMShpbnB1dCwgb3B0aW9ucyk7CiAgfQogIGluZmxhdGUkNC5JbmZsYXRlID0gSW5mbGF0ZTsKICBpbmZsYXRlJDQuaW5mbGF0ZSA9IGluZmxhdGUkMTsKICBpbmZsYXRlJDQuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7CiAgaW5mbGF0ZSQ0LnVuZ3ppcCA9IGluZmxhdGUkMTsKICB2YXIgYXNzaWduID0gY29tbW9uJDEuYXNzaWduOwogIHZhciBkZWZsYXRlID0gZGVmbGF0ZSQ0OwogIHZhciBpbmZsYXRlID0gaW5mbGF0ZSQ0OwogIHZhciBjb25zdGFudHMgPSBjb25zdGFudHMkMTsKICB2YXIgcGFrbyA9IHt9OwogIGFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpOwogIHZhciBwYWtvXzEgPSBwYWtvOwogIGFzeW5jIGZ1bmN0aW9uIHVuemlwKGlucHV0RGF0YSkgewogICAgdHJ5IHsKICAgICAgbGV0IHN0cm07CiAgICAgIGxldCBwb3MgPSAwOwogICAgICBsZXQgaTIgPSAwOwogICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7CiAgICAgIGxldCBpbmZsYXRvcjsKICAgICAgZG8gewogICAgICAgIGNvbnN0IHJlbWFpbmluZ0lucHV0ID0gaW5wdXREYXRhLnN1YmFycmF5KHBvcyk7CiAgICAgICAgaW5mbGF0b3IgPSBuZXcgcGFrb18xLkluZmxhdGUoKTsKICAgICAgICAoeyBzdHJtIH0gPSBpbmZsYXRvcik7CiAgICAgICAgaW5mbGF0b3IucHVzaChyZW1haW5pbmdJbnB1dCwgcGFrb18xLlpfU1lOQ19GTFVTSCk7CiAgICAgICAgaWYgKGluZmxhdG9yLmVycikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGluZmxhdG9yLm1zZyk7CiAgICAgICAgfQogICAgICAgIHBvcyArPSBzdHJtLm5leHRfaW47CiAgICAgICAgY2h1bmtzW2kyXSA9IGluZmxhdG9yLnJlc3VsdDsKICAgICAgICB0b3RhbFNpemUgKz0gY2h1bmtzW2kyXS5sZW5ndGg7CiAgICAgICAgaTIgKz0gMTsKICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9pbik7CiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7CiAgICAgIGZvciAobGV0IGkzID0gMCwgb2Zmc2V0ID0gMDsgaTMgPCBjaHVua3MubGVuZ3RoOyBpMysrKSB7CiAgICAgICAgcmVzdWx0LnNldChjaHVua3NbaTNdLCBvZmZzZXQpOwogICAgICAgIG9mZnNldCArPSBjaHVua3NbaTNdLmxlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gYnVmZmVyLkJ1ZmZlci5mcm9tKHJlc3VsdCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChgJHtlfWAubWF0Y2goL2luY29ycmVjdCBoZWFkZXIgY2hlY2svKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigicHJvYmxlbSBkZWNvbXByZXNzaW5nIGJsb2NrOiBpbmNvcnJlY3QgZ3ppcCBoZWFkZXIgY2hlY2siKTsKICAgICAgfQogICAgICB0aHJvdyBlOwogICAgfQogIH0KICBhc3luYyBmdW5jdGlvbiB1bnppcENodW5rU2xpY2UoaW5wdXREYXRhLCBjaHVuaykgewogICAgdHJ5IHsKICAgICAgbGV0IHN0cm07CiAgICAgIGNvbnN0IHsgbWludiwgbWF4diB9ID0gY2h1bms7CiAgICAgIGxldCBjcG9zID0gbWludi5ibG9ja1Bvc2l0aW9uOwogICAgICBsZXQgZHBvcyA9IG1pbnYuZGF0YVBvc2l0aW9uOwogICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgY29uc3QgY3Bvc2l0aW9ucyA9IFtdOwogICAgICBjb25zdCBkcG9zaXRpb25zID0gW107CiAgICAgIGxldCB0b3RhbFNpemUgPSAwOwogICAgICBsZXQgaTIgPSAwOwogICAgICBkbyB7CiAgICAgICAgY29uc3QgcmVtYWluaW5nSW5wdXQgPSBpbnB1dERhdGEuc3ViYXJyYXkoY3BvcyAtIG1pbnYuYmxvY2tQb3NpdGlvbik7CiAgICAgICAgY29uc3QgaW5mbGF0b3IgPSBuZXcgcGFrb18xLkluZmxhdGUoKTsKICAgICAgICAoeyBzdHJtIH0gPSBpbmZsYXRvcik7CiAgICAgICAgaW5mbGF0b3IucHVzaChyZW1haW5pbmdJbnB1dCwgcGFrb18xLlpfU1lOQ19GTFVTSCk7CiAgICAgICAgaWYgKGluZmxhdG9yLmVycikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGluZmxhdG9yLm1zZyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJ1ZmZlcjIgPSBpbmZsYXRvci5yZXN1bHQ7CiAgICAgICAgY2h1bmtzLnB1c2goYnVmZmVyMik7CiAgICAgICAgbGV0IGxlbjIgPSBidWZmZXIyLmxlbmd0aDsKICAgICAgICBjcG9zaXRpb25zLnB1c2goY3Bvcyk7CiAgICAgICAgZHBvc2l0aW9ucy5wdXNoKGRwb3MpOwogICAgICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAxICYmIG1pbnYuZGF0YVBvc2l0aW9uKSB7CiAgICAgICAgICBjaHVua3NbMF0gPSBjaHVua3NbMF0uc3ViYXJyYXkobWludi5kYXRhUG9zaXRpb24pOwogICAgICAgICAgbGVuMiA9IGNodW5rc1swXS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9yaWdDcG9zID0gY3BvczsKICAgICAgICBjcG9zICs9IHN0cm0ubmV4dF9pbjsKICAgICAgICBkcG9zICs9IGxlbjI7CiAgICAgICAgaWYgKG9yaWdDcG9zID49IG1heHYuYmxvY2tQb3NpdGlvbikgewogICAgICAgICAgY2h1bmtzW2kyXSA9IGNodW5rc1tpMl0uc3ViYXJyYXkoMCwgbWF4di5ibG9ja1Bvc2l0aW9uID09PSBtaW52LmJsb2NrUG9zaXRpb24gPyBtYXh2LmRhdGFQb3NpdGlvbiAtIG1pbnYuZGF0YVBvc2l0aW9uICsgMSA6IG1heHYuZGF0YVBvc2l0aW9uICsgMSk7CiAgICAgICAgICBjcG9zaXRpb25zLnB1c2goY3Bvcyk7CiAgICAgICAgICBkcG9zaXRpb25zLnB1c2goZHBvcyk7CiAgICAgICAgICB0b3RhbFNpemUgKz0gY2h1bmtzW2kyXS5sZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdG90YWxTaXplICs9IGNodW5rc1tpMl0ubGVuZ3RoOwogICAgICAgIGkyKys7CiAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfaW4pOwogICAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpOwogICAgICBmb3IgKGxldCBpMyA9IDAsIG9mZnNldCA9IDA7IGkzIDwgY2h1bmtzLmxlbmd0aDsgaTMrKykgewogICAgICAgIHJlc3VsdC5zZXQoY2h1bmtzW2kzXSwgb2Zmc2V0KTsKICAgICAgICBvZmZzZXQgKz0gY2h1bmtzW2kzXS5sZW5ndGg7CiAgICAgIH0KICAgICAgY29uc3QgYnVmZmVyJDEgPSBidWZmZXIuQnVmZmVyLmZyb20ocmVzdWx0KTsKICAgICAgcmV0dXJuIHsgYnVmZmVyOiBidWZmZXIkMSwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucyB9OwogICAgfSBjYXRjaCAoZSkgewogICAgICBpZiAoYCR7ZX1gLm1hdGNoKC9pbmNvcnJlY3QgaGVhZGVyIGNoZWNrLykpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInByb2JsZW0gZGVjb21wcmVzc2luZyBibG9jazogaW5jb3JyZWN0IGd6aXAgaGVhZGVyIGNoZWNrIik7CiAgICAgIH0KICAgICAgdGhyb3cgZTsKICAgIH0KICB9CiAgLyoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAwOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMKICAgKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgV2lydHogLyBUaGUgbG9uZy5qcyBBdXRob3JzLgogICAqCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICAqCiAgICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAqCiAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAqCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKICAgKi8KICB2YXIgd2FzbSQxID0gbnVsbDsKICB0cnkgewogICAgd2FzbSQxID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUobmV3IFVpbnQ4QXJyYXkoWwogICAgICAwLAogICAgICA5NywKICAgICAgMTE1LAogICAgICAxMDksCiAgICAgIDEsCiAgICAgIDAsCiAgICAgIDAsCiAgICAgIDAsCiAgICAgIDEsCiAgICAgIDEzLAogICAgICAyLAogICAgICA5NiwKICAgICAgMCwKICAgICAgMSwKICAgICAgMTI3LAogICAgICA5NiwKICAgICAgNCwKICAgICAgMTI3LAogICAgICAxMjcsCiAgICAgIDEyNywKICAgICAgMTI3LAogICAgICAxLAogICAgICAxMjcsCiAgICAgIDMsCiAgICAgIDcsCiAgICAgIDYsCiAgICAgIDAsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDYsCiAgICAgIDYsCiAgICAgIDEsCiAgICAgIDEyNywKICAgICAgMSwKICAgICAgNjUsCiAgICAgIDAsCiAgICAgIDExLAogICAgICA3LAogICAgICA1MCwKICAgICAgNiwKICAgICAgMywKICAgICAgMTA5LAogICAgICAxMTcsCiAgICAgIDEwOCwKICAgICAgMCwKICAgICAgMSwKICAgICAgNSwKICAgICAgMTAwLAogICAgICAxMDUsCiAgICAgIDExOCwKICAgICAgOTUsCiAgICAgIDExNSwKICAgICAgMCwKICAgICAgMiwKICAgICAgNSwKICAgICAgMTAwLAogICAgICAxMDUsCiAgICAgIDExOCwKICAgICAgOTUsCiAgICAgIDExNywKICAgICAgMCwKICAgICAgMywKICAgICAgNSwKICAgICAgMTE0LAogICAgICAxMDEsCiAgICAgIDEwOSwKICAgICAgOTUsCiAgICAgIDExNSwKICAgICAgMCwKICAgICAgNCwKICAgICAgNSwKICAgICAgMTE0LAogICAgICAxMDEsCiAgICAgIDEwOSwKICAgICAgOTUsCiAgICAgIDExNywKICAgICAgMCwKICAgICAgNSwKICAgICAgOCwKICAgICAgMTAzLAogICAgICAxMDEsCiAgICAgIDExNiwKICAgICAgOTUsCiAgICAgIDEwNCwKICAgICAgMTA1LAogICAgICAxMDMsCiAgICAgIDEwNCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMTAsCiAgICAgIDE5MSwKICAgICAgMSwKICAgICAgNiwKICAgICAgNCwKICAgICAgMCwKICAgICAgMzUsCiAgICAgIDAsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMjYsCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEyNywKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMSwKICAgICAgMzYsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEyNiwKICAgICAgMzIsCiAgICAgIDAsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDEsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMzIsCiAgICAgIDIsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDMsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMTI4LAogICAgICAzNCwKICAgICAgNCwKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzUsCiAgICAgIDE2NywKICAgICAgMzYsCiAgICAgIDAsCiAgICAgIDMyLAogICAgICA0LAogICAgICAxNjcsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMjksCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEzMCwKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMQogICAgXSkpLCB7fSkuZXhwb3J0czsKICB9IGNhdGNoIChlKSB7CiAgfQogIGZ1bmN0aW9uIExvbmckMShsb3csIGhpZ2gsIHVuc2lnbmVkKSB7CiAgICB0aGlzLmxvdyA9IGxvdyB8IDA7CiAgICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDsKICAgIHRoaXMudW5zaWduZWQgPSAhIXVuc2lnbmVkOwogIH0KICBMb25nJDEucHJvdG90eXBlLl9faXNMb25nX187CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmckMS5wcm90b3R5cGUsICJfX2lzTG9uZ19fIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICBmdW5jdGlvbiBpc0xvbmckMShvYmopIHsKICAgIHJldHVybiAob2JqICYmIG9ialsiX19pc0xvbmdfXyJdKSA9PT0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gY3R6MzIodmFsdWUpIHsKICAgIHZhciBjMiA9IE1hdGguY2x6MzIodmFsdWUgJiAtdmFsdWUpOwogICAgcmV0dXJuIHZhbHVlID8gMzEgLSBjMiA6IGMyOwogIH0KICBMb25nJDEuaXNMb25nID0gaXNMb25nJDE7CiAgdmFyIElOVF9DQUNIRSQxID0ge307CiAgdmFyIFVJTlRfQ0FDSEUkMSA9IHt9OwogIGZ1bmN0aW9uIGZyb21JbnQkMSh2YWx1ZSwgdW5zaWduZWQpIHsKICAgIHZhciBvYmosIGNhY2hlZE9iaiwgY2FjaGU7CiAgICBpZiAodW5zaWduZWQpIHsKICAgICAgdmFsdWUgPj4+PSAwOwogICAgICBpZiAoY2FjaGUgPSAwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSB7CiAgICAgICAgY2FjaGVkT2JqID0gVUlOVF9DQUNIRSQxW3ZhbHVlXTsKICAgICAgICBpZiAoY2FjaGVkT2JqKQogICAgICAgICAgcmV0dXJuIGNhY2hlZE9iajsKICAgICAgfQogICAgICBvYmogPSBmcm9tQml0cyQxKHZhbHVlLCAwLCB0cnVlKTsKICAgICAgaWYgKGNhY2hlKQogICAgICAgIFVJTlRfQ0FDSEUkMVt2YWx1ZV0gPSBvYmo7CiAgICAgIHJldHVybiBvYmo7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSB8PSAwOwogICAgICBpZiAoY2FjaGUgPSAtMTI4IDw9IHZhbHVlICYmIHZhbHVlIDwgMTI4KSB7CiAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFJDFbdmFsdWVdOwogICAgICAgIGlmIChjYWNoZWRPYmopCiAgICAgICAgICByZXR1cm4gY2FjaGVkT2JqOwogICAgICB9CiAgICAgIG9iaiA9IGZyb21CaXRzJDEodmFsdWUsIHZhbHVlIDwgMCA/IC0xIDogMCwgZmFsc2UpOwogICAgICBpZiAoY2FjaGUpCiAgICAgICAgSU5UX0NBQ0hFJDFbdmFsdWVdID0gb2JqOwogICAgICByZXR1cm4gb2JqOwogICAgfQogIH0KICBMb25nJDEuZnJvbUludCA9IGZyb21JbnQkMTsKICBmdW5jdGlvbiBmcm9tTnVtYmVyJDEodmFsdWUsIHVuc2lnbmVkKSB7CiAgICBpZiAoaXNOYU4odmFsdWUpKQogICAgICByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyQxIDogWkVSTyQxOwogICAgaWYgKHVuc2lnbmVkKSB7CiAgICAgIGlmICh2YWx1ZSA8IDApCiAgICAgICAgcmV0dXJuIFVaRVJPJDE7CiAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTCQxKQogICAgICAgIHJldHVybiBNQVhfVU5TSUdORURfVkFMVUUkMTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwkMSkKICAgICAgICByZXR1cm4gTUlOX1ZBTFVFJDE7CiAgICAgIGlmICh2YWx1ZSArIDEgPj0gVFdPX1BXUl82M19EQkwkMSkKICAgICAgICByZXR1cm4gTUFYX1ZBTFVFJDE7CiAgICB9CiAgICBpZiAodmFsdWUgPCAwKQogICAgICByZXR1cm4gZnJvbU51bWJlciQxKC12YWx1ZSwgdW5zaWduZWQpLm5lZygpOwogICAgcmV0dXJuIGZyb21CaXRzJDEodmFsdWUgJSBUV09fUFdSXzMyX0RCTCQxIHwgMCwgdmFsdWUgLyBUV09fUFdSXzMyX0RCTCQxIHwgMCwgdW5zaWduZWQpOwogIH0KICBMb25nJDEuZnJvbU51bWJlciA9IGZyb21OdW1iZXIkMTsKICBmdW5jdGlvbiBmcm9tQml0cyQxKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCkgewogICAgcmV0dXJuIG5ldyBMb25nJDEobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTsKICB9CiAgTG9uZyQxLmZyb21CaXRzID0gZnJvbUJpdHMkMTsKICB2YXIgcG93X2RibCQxID0gTWF0aC5wb3c7CiAgZnVuY3Rpb24gZnJvbVN0cmluZyQxKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7CiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkKICAgICAgdGhyb3cgRXJyb3IoImVtcHR5IHN0cmluZyIpOwogICAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gIm51bWJlciIpIHsKICAgICAgcmFkaXggPSB1bnNpZ25lZDsKICAgICAgdW5zaWduZWQgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDsKICAgIH0KICAgIGlmIChzdHIgPT09ICJOYU4iIHx8IHN0ciA9PT0gIkluZmluaXR5IiB8fCBzdHIgPT09ICIrSW5maW5pdHkiIHx8IHN0ciA9PT0gIi1JbmZpbml0eSIpCiAgICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPJDEgOiBaRVJPJDE7CiAgICByYWRpeCA9IHJhZGl4IHx8IDEwOwogICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KQogICAgICB0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpOwogICAgdmFyIHA7CiAgICBpZiAoKHAgPSBzdHIuaW5kZXhPZigiLSIpKSA+IDApCiAgICAgIHRocm93IEVycm9yKCJpbnRlcmlvciBoeXBoZW4iKTsKICAgIGVsc2UgaWYgKHAgPT09IDApIHsKICAgICAgcmV0dXJuIGZyb21TdHJpbmckMShzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpOwogICAgfQogICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIkMShwb3dfZGJsJDEocmFkaXgsIDgpKTsKICAgIHZhciByZXN1bHQgPSBaRVJPJDE7CiAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc3RyLmxlbmd0aDsgaTIgKz0gOCkgewogICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpMiksIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpMiwgaTIgKyBzaXplKSwgcmFkaXgpOwogICAgICBpZiAoc2l6ZSA8IDgpIHsKICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyJDEocG93X2RibCQxKHJhZGl4LCBzaXplKSk7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIkMSh2YWx1ZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQuYWRkKGZyb21OdW1iZXIkMSh2YWx1ZSkpOwogICAgICB9CiAgICB9CiAgICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIExvbmckMS5mcm9tU3RyaW5nID0gZnJvbVN0cmluZyQxOwogIGZ1bmN0aW9uIGZyb21WYWx1ZSQxKHZhbCwgdW5zaWduZWQpIHsKICAgIGlmICh0eXBlb2YgdmFsID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIGZyb21OdW1iZXIkMSh2YWwsIHVuc2lnbmVkKTsKICAgIGlmICh0eXBlb2YgdmFsID09PSAic3RyaW5nIikKICAgICAgcmV0dXJuIGZyb21TdHJpbmckMSh2YWwsIHVuc2lnbmVkKTsKICAgIHJldHVybiBmcm9tQml0cyQxKHZhbC5sb3csIHZhbC5oaWdoLCB0eXBlb2YgdW5zaWduZWQgPT09ICJib29sZWFuIiA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkKTsKICB9CiAgTG9uZyQxLmZyb21WYWx1ZSA9IGZyb21WYWx1ZSQxOwogIHZhciBUV09fUFdSXzE2X0RCTCQxID0gMSA8PCAxNjsKICB2YXIgVFdPX1BXUl8yNF9EQkwkMSA9IDEgPDwgMjQ7CiAgdmFyIFRXT19QV1JfMzJfREJMJDEgPSBUV09fUFdSXzE2X0RCTCQxICogVFdPX1BXUl8xNl9EQkwkMTsKICB2YXIgVFdPX1BXUl82NF9EQkwkMSA9IFRXT19QV1JfMzJfREJMJDEgKiBUV09fUFdSXzMyX0RCTCQxOwogIHZhciBUV09fUFdSXzYzX0RCTCQxID0gVFdPX1BXUl82NF9EQkwkMSAvIDI7CiAgdmFyIFRXT19QV1JfMjQkMSA9IGZyb21JbnQkMShUV09fUFdSXzI0X0RCTCQxKTsKICB2YXIgWkVSTyQxID0gZnJvbUludCQxKDApOwogIExvbmckMS5aRVJPID0gWkVSTyQxOwogIHZhciBVWkVSTyQxID0gZnJvbUludCQxKDAsIHRydWUpOwogIExvbmckMS5VWkVSTyA9IFVaRVJPJDE7CiAgdmFyIE9ORSQxID0gZnJvbUludCQxKDEpOwogIExvbmckMS5PTkUgPSBPTkUkMTsKICB2YXIgVU9ORSQxID0gZnJvbUludCQxKDEsIHRydWUpOwogIExvbmckMS5VT05FID0gVU9ORSQxOwogIHZhciBORUdfT05FJDEgPSBmcm9tSW50JDEoLTEpOwogIExvbmckMS5ORUdfT05FID0gTkVHX09ORSQxOwogIHZhciBNQVhfVkFMVUUkMSA9IGZyb21CaXRzJDEoNDI5NDk2NzI5NSB8IDAsIDIxNDc0ODM2NDcgfCAwLCBmYWxzZSk7CiAgTG9uZyQxLk1BWF9WQUxVRSA9IE1BWF9WQUxVRSQxOwogIHZhciBNQVhfVU5TSUdORURfVkFMVUUkMSA9IGZyb21CaXRzJDEoNDI5NDk2NzI5NSB8IDAsIDQyOTQ5NjcyOTUgfCAwLCB0cnVlKTsKICBMb25nJDEuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFJDE7CiAgdmFyIE1JTl9WQUxVRSQxID0gZnJvbUJpdHMkMSgwLCAyMTQ3NDgzNjQ4IHwgMCwgZmFsc2UpOwogIExvbmckMS5NSU5fVkFMVUUgPSBNSU5fVkFMVUUkMTsKICB2YXIgTG9uZ1Byb3RvdHlwZSQxID0gTG9uZyQxLnByb3RvdHlwZTsKICBMb25nUHJvdG90eXBlJDEudG9JbnQgPSBmdW5jdGlvbiB0b0ludCgpIHsKICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gdGhpcy5sb3cgPj4+IDAgOiB0aGlzLmxvdzsKICB9OwogIExvbmdQcm90b3R5cGUkMS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyMigpIHsKICAgIGlmICh0aGlzLnVuc2lnbmVkKQogICAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCQxICsgKHRoaXMubG93ID4+PiAwKTsKICAgIHJldHVybiB0aGlzLmhpZ2ggKiBUV09fUFdSXzMyX0RCTCQxICsgKHRoaXMubG93ID4+PiAwKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nMihyYWRpeCkgewogICAgcmFkaXggPSByYWRpeCB8fCAxMDsKICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkKICAgICAgdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTsKICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICByZXR1cm4gIjAiOwogICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7CiAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSQxKSkgewogICAgICAgIHZhciByYWRpeExvbmcgPSBmcm9tTnVtYmVyJDEocmFkaXgpLCBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLCByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTsKICAgICAgICByZXR1cm4gZGl2LnRvU3RyaW5nKHJhZGl4KSArIHJlbTEudG9JbnQoKS50b1N0cmluZyhyYWRpeCk7CiAgICAgIH0gZWxzZQogICAgICAgIHJldHVybiAiLSIgKyB0aGlzLm5lZygpLnRvU3RyaW5nKHJhZGl4KTsKICAgIH0KICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyJDEocG93X2RibCQxKHJhZGl4LCA2KSwgdGhpcy51bnNpZ25lZCksIHJlbSA9IHRoaXM7CiAgICB2YXIgcmVzdWx0ID0gIiI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLCBpbnR2YWwgPSByZW0uc3ViKHJlbURpdi5tdWwocmFkaXhUb1Bvd2VyKSkudG9JbnQoKSA+Pj4gMCwgZGlnaXRzID0gaW50dmFsLnRvU3RyaW5nKHJhZGl4KTsKICAgICAgcmVtID0gcmVtRGl2OwogICAgICBpZiAocmVtLmlzWmVybygpKQogICAgICAgIHJldHVybiBkaWdpdHMgKyByZXN1bHQ7CiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNikKICAgICAgICAgIGRpZ2l0cyA9ICIwIiArIGRpZ2l0czsKICAgICAgICByZXN1bHQgPSAiIiArIGRpZ2l0cyArIHJlc3VsdDsKICAgICAgfQogICAgfQogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmdldEhpZ2hCaXRzID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHMoKSB7CiAgICByZXR1cm4gdGhpcy5oaWdoOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkgewogICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5nZXRMb3dCaXRzID0gZnVuY3Rpb24gZ2V0TG93Qml0cygpIHsKICAgIHJldHVybiB0aGlzLmxvdzsKICB9OwogIExvbmdQcm90b3R5cGUkMS5nZXRMb3dCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRMb3dCaXRzVW5zaWduZWQoKSB7CiAgICByZXR1cm4gdGhpcy5sb3cgPj4+IDA7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7CiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpCiAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSQxKSA/IDY0IDogdGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7CiAgICB2YXIgdmFsID0gdGhpcy5oaWdoICE9IDAgPyB0aGlzLmhpZ2ggOiB0aGlzLmxvdzsKICAgIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSkKICAgICAgaWYgKCh2YWwgJiAxIDw8IGJpdCkgIT0gMCkKICAgICAgICBicmVhazsKICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8oKSB7CiAgICByZXR1cm4gdGhpcy5oaWdoID09PSAwICYmIHRoaXMubG93ID09PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmVxeiA9IExvbmdQcm90b3R5cGUkMS5pc1plcm87CiAgTG9uZ1Byb3RvdHlwZSQxLmlzTmVnYXRpdmUgPSBmdW5jdGlvbiBpc05lZ2F0aXZlKCkgewogICAgcmV0dXJuICF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA8IDA7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7CiAgICByZXR1cm4gdGhpcy51bnNpZ25lZCB8fCB0aGlzLmhpZ2ggPj0gMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkgewogICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAxOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbigpIHsKICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHsKICAgIGlmICghaXNMb25nJDEob3RoZXIpKQogICAgICBvdGhlciA9IGZyb21WYWx1ZSQxKG90aGVyKTsKICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPj4+IDMxID09PSAxICYmIG90aGVyLmhpZ2ggPj4+IDMxID09PSAxKQogICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZXEgPSBMb25nUHJvdG90eXBlJDEuZXF1YWxzOwogIExvbmdQcm90b3R5cGUkMS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHsKICAgIHJldHVybiAhdGhpcy5lcShvdGhlcik7CiAgfTsKICBMb25nUHJvdG90eXBlJDEubmVxID0gTG9uZ1Byb3RvdHlwZSQxLm5vdEVxdWFsczsKICBMb25nUHJvdG90eXBlJDEubmUgPSBMb25nUHJvdG90eXBlJDEubm90RXF1YWxzOwogIExvbmdQcm90b3R5cGUkMS5sZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5jb21wKG90aGVyKSA8IDA7CiAgfTsKICBMb25nUHJvdG90eXBlJDEubHQgPSBMb25nUHJvdG90eXBlJDEubGVzc1RoYW47CiAgTG9uZ1Byb3RvdHlwZSQxLmxlc3NUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGxlc3NUaGFuT3JFcXVhbChvdGhlcikgewogICAgcmV0dXJuIHRoaXMuY29tcChvdGhlcikgPD0gMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5sdGUgPSBMb25nUHJvdG90eXBlJDEubGVzc1RoYW5PckVxdWFsOwogIExvbmdQcm90b3R5cGUkMS5sZSA9IExvbmdQcm90b3R5cGUkMS5sZXNzVGhhbk9yRXF1YWw7CiAgTG9uZ1Byb3RvdHlwZSQxLmdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gZ3JlYXRlclRoYW4ob3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmNvbXAob3RoZXIpID4gMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5ndCA9IExvbmdQcm90b3R5cGUkMS5ncmVhdGVyVGhhbjsKICBMb25nUHJvdG90eXBlJDEuZ3JlYXRlclRoYW5PckVxdWFsID0gZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5jb21wKG90aGVyKSA+PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmd0ZSA9IExvbmdQcm90b3R5cGUkMS5ncmVhdGVyVGhhbk9yRXF1YWw7CiAgTG9uZ1Byb3RvdHlwZSQxLmdlID0gTG9uZ1Byb3RvdHlwZSQxLmdyZWF0ZXJUaGFuT3JFcXVhbDsKICBMb25nUHJvdG90eXBlJDEuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHsKICAgIGlmICghaXNMb25nJDEob3RoZXIpKQogICAgICBvdGhlciA9IGZyb21WYWx1ZSQxKG90aGVyKTsKICAgIGlmICh0aGlzLmVxKG90aGVyKSkKICAgICAgcmV0dXJuIDA7CiAgICB2YXIgdGhpc05lZyA9IHRoaXMuaXNOZWdhdGl2ZSgpLCBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTsKICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZykKICAgICAgcmV0dXJuIC0xOwogICAgaWYgKCF0aGlzTmVnICYmIG90aGVyTmVnKQogICAgICByZXR1cm4gMTsKICAgIGlmICghdGhpcy51bnNpZ25lZCkKICAgICAgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7CiAgICByZXR1cm4gb3RoZXIuaGlnaCA+Pj4gMCA+IHRoaXMuaGlnaCA+Pj4gMCB8fCBvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgb3RoZXIubG93ID4+PiAwID4gdGhpcy5sb3cgPj4+IDAgPyAtMSA6IDE7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuY29tcCA9IExvbmdQcm90b3R5cGUkMS5jb21wYXJlOwogIExvbmdQcm90b3R5cGUkMS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7CiAgICBpZiAoIXRoaXMudW5zaWduZWQgJiYgdGhpcy5lcShNSU5fVkFMVUUkMSkpCiAgICAgIHJldHVybiBNSU5fVkFMVUUkMTsKICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUkMSk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEubmVnID0gTG9uZ1Byb3RvdHlwZSQxLm5lZ2F0ZTsKICBMb25nUHJvdG90eXBlJDEuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkgewogICAgaWYgKCFpc0xvbmckMShhZGRlbmQpKQogICAgICBhZGRlbmQgPSBmcm9tVmFsdWUkMShhZGRlbmQpOwogICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7CiAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgNjU1MzU7CiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2OwogICAgdmFyIGEwMCA9IHRoaXMubG93ICYgNjU1MzU7CiAgICB2YXIgYjQ4ID0gYWRkZW5kLmhpZ2ggPj4+IDE2OwogICAgdmFyIGIzMiA9IGFkZGVuZC5oaWdoICYgNjU1MzU7CiAgICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7CiAgICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDY1NTM1OwogICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7CiAgICBjMDAgKz0gYTAwICsgYjAwOwogICAgYzE2ICs9IGMwMCA+Pj4gMTY7CiAgICBjMDAgJj0gNjU1MzU7CiAgICBjMTYgKz0gYTE2ICsgYjE2OwogICAgYzMyICs9IGMxNiA+Pj4gMTY7CiAgICBjMTYgJj0gNjU1MzU7CiAgICBjMzIgKz0gYTMyICsgYjMyOwogICAgYzQ4ICs9IGMzMiA+Pj4gMTY7CiAgICBjMzIgJj0gNjU1MzU7CiAgICBjNDggKz0gYTQ4ICsgYjQ4OwogICAgYzQ4ICY9IDY1NTM1OwogICAgcmV0dXJuIGZyb21CaXRzJDEoYzE2IDw8IDE2IHwgYzAwLCBjNDggPDwgMTYgfCBjMzIsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkgewogICAgaWYgKCFpc0xvbmckMShzdWJ0cmFoZW5kKSkKICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZSQxKHN1YnRyYWhlbmQpOwogICAgcmV0dXJuIHRoaXMuYWRkKHN1YnRyYWhlbmQubmVnKCkpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnN1YiA9IExvbmdQcm90b3R5cGUkMS5zdWJ0cmFjdDsKICBMb25nUHJvdG90eXBlJDEubXVsdGlwbHkgPSBmdW5jdGlvbiBtdWx0aXBseShtdWx0aXBsaWVyKSB7CiAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBpZiAoIWlzTG9uZyQxKG11bHRpcGxpZXIpKQogICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlJDEobXVsdGlwbGllcik7CiAgICBpZiAod2FzbSQxKSB7CiAgICAgIHZhciBsb3cgPSB3YXNtJDFbIm11bCJdKAogICAgICAgIHRoaXMubG93LAogICAgICAgIHRoaXMuaGlnaCwKICAgICAgICBtdWx0aXBsaWVyLmxvdywKICAgICAgICBtdWx0aXBsaWVyLmhpZ2gKICAgICAgKTsKICAgICAgcmV0dXJuIGZyb21CaXRzJDEobG93LCB3YXNtJDFbImdldF9oaWdoIl0oKSwgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSkKICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyQxIDogWkVSTyQxOwogICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFJDEpKQogICAgICByZXR1cm4gbXVsdGlwbGllci5pc09kZCgpID8gTUlOX1ZBTFVFJDEgOiBaRVJPJDE7CiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUkMSkpCiAgICAgIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUkMSA6IFpFUk8kMTsKICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgewogICAgICBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpCiAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpOwogICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkKICAgICAgcmV0dXJuIHRoaXMubXVsKG11bHRpcGxpZXIubmVnKCkpLm5lZygpOwogICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCQxKSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQkMSkpCiAgICAgIHJldHVybiBmcm9tTnVtYmVyJDEodGhpcy50b051bWJlcigpICogbXVsdGlwbGllci50b051bWJlcigpLCB0aGlzLnVuc2lnbmVkKTsKICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2OwogICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDY1NTM1OwogICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjsKICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDY1NTM1OwogICAgdmFyIGI0OCA9IG11bHRpcGxpZXIuaGlnaCA+Pj4gMTY7CiAgICB2YXIgYjMyID0gbXVsdGlwbGllci5oaWdoICYgNjU1MzU7CiAgICB2YXIgYjE2ID0gbXVsdGlwbGllci5sb3cgPj4+IDE2OwogICAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgNjU1MzU7CiAgICB2YXIgYzQ4ID0gMCwgYzMyID0gMCwgYzE2ID0gMCwgYzAwID0gMDsKICAgIGMwMCArPSBhMDAgKiBiMDA7CiAgICBjMTYgKz0gYzAwID4+PiAxNjsKICAgIGMwMCAmPSA2NTUzNTsKICAgIGMxNiArPSBhMTYgKiBiMDA7CiAgICBjMzIgKz0gYzE2ID4+PiAxNjsKICAgIGMxNiAmPSA2NTUzNTsKICAgIGMxNiArPSBhMDAgKiBiMTY7CiAgICBjMzIgKz0gYzE2ID4+PiAxNjsKICAgIGMxNiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMzIgKiBiMDA7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMTYgKiBiMTY7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMDAgKiBiMzI7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGM0OCArPSBhNDggKiBiMDAgKyBhMzIgKiBiMTYgKyBhMTYgKiBiMzIgKyBhMDAgKiBiNDg7CiAgICBjNDggJj0gNjU1MzU7CiAgICByZXR1cm4gZnJvbUJpdHMkMShjMTYgPDwgMTYgfCBjMDAsIGM0OCA8PCAxNiB8IGMzMiwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEubXVsID0gTG9uZ1Byb3RvdHlwZSQxLm11bHRpcGx5OwogIExvbmdQcm90b3R5cGUkMS5kaXZpZGUgPSBmdW5jdGlvbiBkaXZpZGUoZGl2aXNvcikgewogICAgaWYgKCFpc0xvbmckMShkaXZpc29yKSkKICAgICAgZGl2aXNvciA9IGZyb21WYWx1ZSQxKGRpdmlzb3IpOwogICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpCiAgICAgIHRocm93IEVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7CiAgICBpZiAod2FzbSQxKSB7CiAgICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPT09IC0yMTQ3NDgzNjQ4ICYmIGRpdmlzb3IubG93ID09PSAtMSAmJiBkaXZpc29yLmhpZ2ggPT09IC0xKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbSQxWyJkaXZfdSJdIDogd2FzbSQxWyJkaXZfcyJdKSgKICAgICAgICB0aGlzLmxvdywKICAgICAgICB0aGlzLmhpZ2gsCiAgICAgICAgZGl2aXNvci5sb3csCiAgICAgICAgZGl2aXNvci5oaWdoCiAgICAgICk7CiAgICAgIHJldHVybiBmcm9tQml0cyQxKGxvdywgd2FzbSQxWyJnZXRfaGlnaCJdKCksIHRoaXMudW5zaWduZWQpOwogICAgfQogICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8kMSA6IFpFUk8kMTsKICAgIHZhciBhcHByb3gsIHJlbSwgcmVzOwogICAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7CiAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSQxKSkgewogICAgICAgIGlmIChkaXZpc29yLmVxKE9ORSQxKSB8fCBkaXZpc29yLmVxKE5FR19PTkUkMSkpCiAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFJDE7CiAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUkMSkpCiAgICAgICAgICByZXR1cm4gT05FJDE7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTsKICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7CiAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8kMSkpIHsKICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FJDEgOiBORUdfT05FJDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZW0gPSB0aGlzLnN1YihkaXZpc29yLm11bChhcHByb3gpKTsKICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUkMSkpCiAgICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyQxIDogWkVSTyQxOwogICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHsKICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IpLm5lZygpOwogICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKQogICAgICAgIHJldHVybiB0aGlzLmRpdihkaXZpc29yLm5lZygpKS5uZWcoKTsKICAgICAgcmVzID0gWkVSTyQxOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKQogICAgICAgIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTsKICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpCiAgICAgICAgcmV0dXJuIFVaRVJPJDE7CiAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpCiAgICAgICAgcmV0dXJuIFVPTkUkMTsKICAgICAgcmVzID0gVVpFUk8kMTsKICAgIH0KICAgIHJlbSA9IHRoaXM7CiAgICB3aGlsZSAocmVtLmd0ZShkaXZpc29yKSkgewogICAgICBhcHByb3ggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHJlbS50b051bWJlcigpIC8gZGl2aXNvci50b051bWJlcigpKSk7CiAgICAgIHZhciBsb2cyID0gTWF0aC5jZWlsKE1hdGgubG9nKGFwcHJveCkgLyBNYXRoLkxOMiksIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsJDEoMiwgbG9nMiAtIDQ4KSwgYXBwcm94UmVzID0gZnJvbU51bWJlciQxKGFwcHJveCksIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7CiAgICAgIHdoaWxlIChhcHByb3hSZW0uaXNOZWdhdGl2ZSgpIHx8IGFwcHJveFJlbS5ndChyZW0pKSB7CiAgICAgICAgYXBwcm94IC09IGRlbHRhOwogICAgICAgIGFwcHJveFJlcyA9IGZyb21OdW1iZXIkMShhcHByb3gsIHRoaXMudW5zaWduZWQpOwogICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7CiAgICAgIH0KICAgICAgaWYgKGFwcHJveFJlcy5pc1plcm8oKSkKICAgICAgICBhcHByb3hSZXMgPSBPTkUkMTsKICAgICAgcmVzID0gcmVzLmFkZChhcHByb3hSZXMpOwogICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmRpdiA9IExvbmdQcm90b3R5cGUkMS5kaXZpZGU7CiAgTG9uZ1Byb3RvdHlwZSQxLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7CiAgICBpZiAoIWlzTG9uZyQxKGRpdmlzb3IpKQogICAgICBkaXZpc29yID0gZnJvbVZhbHVlJDEoZGl2aXNvcik7CiAgICBpZiAod2FzbSQxKSB7CiAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20kMVsicmVtX3UiXSA6IHdhc20kMVsicmVtX3MiXSkoCiAgICAgICAgdGhpcy5sb3csCiAgICAgICAgdGhpcy5oaWdoLAogICAgICAgIGRpdmlzb3IubG93LAogICAgICAgIGRpdmlzb3IuaGlnaAogICAgICApOwogICAgICByZXR1cm4gZnJvbUJpdHMkMShsb3csIHdhc20kMVsiZ2V0X2hpZ2giXSgpLCB0aGlzLnVuc2lnbmVkKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLm1vZCA9IExvbmdQcm90b3R5cGUkMS5tb2R1bG87CiAgTG9uZ1Byb3RvdHlwZSQxLnJlbSA9IExvbmdQcm90b3R5cGUkMS5tb2R1bG87CiAgTG9uZ1Byb3RvdHlwZSQxLm5vdCA9IGZ1bmN0aW9uIG5vdCgpIHsKICAgIHJldHVybiBmcm9tQml0cyQxKH50aGlzLmxvdywgfnRoaXMuaGlnaCwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuY291bnRMZWFkaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudExlYWRpbmdaZXJvcygpIHsKICAgIHJldHVybiB0aGlzLmhpZ2ggPyBNYXRoLmNsejMyKHRoaXMuaGlnaCkgOiBNYXRoLmNsejMyKHRoaXMubG93KSArIDMyOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmNseiA9IExvbmdQcm90b3R5cGUkMS5jb3VudExlYWRpbmdaZXJvczsKICBMb25nUHJvdG90eXBlJDEuY291bnRUcmFpbGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRUcmFpbGluZ1plcm9zKCkgewogICAgcmV0dXJuIHRoaXMubG93ID8gY3R6MzIodGhpcy5sb3cpIDogY3R6MzIodGhpcy5oaWdoKSArIDMyOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmN0eiA9IExvbmdQcm90b3R5cGUkMS5jb3VudFRyYWlsaW5nWmVyb3M7CiAgTG9uZ1Byb3RvdHlwZSQxLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikgewogICAgaWYgKCFpc0xvbmckMShvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlJDEob3RoZXIpOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgJiBvdGhlci5sb3csIHRoaXMuaGlnaCAmIG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHsKICAgIGlmICghaXNMb25nJDEob3RoZXIpKQogICAgICBvdGhlciA9IGZyb21WYWx1ZSQxKG90aGVyKTsKICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMubG93IHwgb3RoZXIubG93LCB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHsKICAgIGlmICghaXNMb25nJDEob3RoZXIpKQogICAgICBvdGhlciA9IGZyb21WYWx1ZSQxKG90aGVyKTsKICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykgewogICAgaWYgKGlzTG9uZyQxKG51bUJpdHMpKQogICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpOwogICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMubG93IDw8IG51bUJpdHMsIHRoaXMuaGlnaCA8PCBudW1CaXRzIHwgdGhpcy5sb3cgPj4+IDMyIC0gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7CiAgICBlbHNlCiAgICAgIHJldHVybiBmcm9tQml0cyQxKDAsIHRoaXMubG93IDw8IG51bUJpdHMgLSAzMiwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuc2hsID0gTG9uZ1Byb3RvdHlwZSQxLnNoaWZ0TGVmdDsKICBMb25nUHJvdG90eXBlJDEuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykgewogICAgaWYgKGlzTG9uZyQxKG51bUJpdHMpKQogICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpOwogICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMubG93ID4+PiBudW1CaXRzIHwgdGhpcy5oaWdoIDw8IDMyIC0gbnVtQml0cywgdGhpcy5oaWdoID4+IG51bUJpdHMsIHRoaXMudW5zaWduZWQpOwogICAgZWxzZQogICAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmhpZ2ggPj4gbnVtQml0cyAtIDMyLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuc2hyID0gTG9uZ1Byb3RvdHlwZSQxLnNoaWZ0UmlnaHQ7CiAgTG9uZ1Byb3RvdHlwZSQxLnNoaWZ0UmlnaHRVbnNpZ25lZCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHRVbnNpZ25lZChudW1CaXRzKSB7CiAgICBpZiAoaXNMb25nJDEobnVtQml0cykpCiAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7CiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKQogICAgICByZXR1cm4gdGhpczsKICAgIGlmIChudW1CaXRzIDwgMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMubG93ID4+PiBudW1CaXRzIHwgdGhpcy5oaWdoIDw8IDMyIC0gbnVtQml0cywgdGhpcy5oaWdoID4+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTsKICAgIGlmIChudW1CaXRzID09PSAzMikKICAgICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5oaWdoLCAwLCB0aGlzLnVuc2lnbmVkKTsKICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyAtIDMyLCAwLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5zaHJ1ID0gTG9uZ1Byb3RvdHlwZSQxLnNoaWZ0UmlnaHRVbnNpZ25lZDsKICBMb25nUHJvdG90eXBlJDEuc2hyX3UgPSBMb25nUHJvdG90eXBlJDEuc2hpZnRSaWdodFVuc2lnbmVkOwogIExvbmdQcm90b3R5cGUkMS5yb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChudW1CaXRzKSB7CiAgICB2YXIgYjsKICAgIGlmIChpc0xvbmckMShudW1CaXRzKSkKICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTsKICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApCiAgICAgIHJldHVybiB0aGlzOwogICAgaWYgKG51bUJpdHMgPT09IDMyKQogICAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTsKICAgIGlmIChudW1CaXRzIDwgMzIpIHsKICAgICAgYiA9IDMyIC0gbnVtQml0czsKICAgICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgPDwgbnVtQml0cyB8IHRoaXMuaGlnaCA+Pj4gYiwgdGhpcy5oaWdoIDw8IG51bUJpdHMgfCB0aGlzLmxvdyA+Pj4gYiwgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgICBudW1CaXRzIC09IDMyOwogICAgYiA9IDMyIC0gbnVtQml0czsKICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMuaGlnaCA8PCBudW1CaXRzIHwgdGhpcy5sb3cgPj4+IGIsIHRoaXMubG93IDw8IG51bUJpdHMgfCB0aGlzLmhpZ2ggPj4+IGIsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnJvdGwgPSBMb25nUHJvdG90eXBlJDEucm90YXRlTGVmdDsKICBMb25nUHJvdG90eXBlJDEucm90YXRlUmlnaHQgPSBmdW5jdGlvbiByb3RhdGVSaWdodChudW1CaXRzKSB7CiAgICB2YXIgYjsKICAgIGlmIChpc0xvbmckMShudW1CaXRzKSkKICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTsKICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApCiAgICAgIHJldHVybiB0aGlzOwogICAgaWYgKG51bUJpdHMgPT09IDMyKQogICAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTsKICAgIGlmIChudW1CaXRzIDwgMzIpIHsKICAgICAgYiA9IDMyIC0gbnVtQml0czsKICAgICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5oaWdoIDw8IGIgfCB0aGlzLmxvdyA+Pj4gbnVtQml0cywgdGhpcy5sb3cgPDwgYiB8IHRoaXMuaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgICBudW1CaXRzIC09IDMyOwogICAgYiA9IDMyIC0gbnVtQml0czsKICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMubG93IDw8IGIgfCB0aGlzLmhpZ2ggPj4+IG51bUJpdHMsIHRoaXMuaGlnaCA8PCBiIHwgdGhpcy5sb3cgPj4+IG51bUJpdHMsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnJvdHIgPSBMb25nUHJvdG90eXBlJDEucm90YXRlUmlnaHQ7CiAgTG9uZ1Byb3RvdHlwZSQxLnRvU2lnbmVkID0gZnVuY3Rpb24gdG9TaWduZWQoKSB7CiAgICBpZiAoIXRoaXMudW5zaWduZWQpCiAgICAgIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3csIHRoaXMuaGlnaCwgZmFsc2UpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnRvVW5zaWduZWQgPSBmdW5jdGlvbiB0b1Vuc2lnbmVkKCkgewogICAgaWYgKHRoaXMudW5zaWduZWQpCiAgICAgIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3csIHRoaXMuaGlnaCwgdHJ1ZSk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMobGUpIHsKICAgIHJldHVybiBsZSA/IHRoaXMudG9CeXRlc0xFKCkgOiB0aGlzLnRvQnl0ZXNCRSgpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHsKICAgIHZhciBoaSA9IHRoaXMuaGlnaCwgbG8gPSB0aGlzLmxvdzsKICAgIHJldHVybiBbCiAgICAgIGxvICYgMjU1LAogICAgICBsbyA+Pj4gOCAmIDI1NSwKICAgICAgbG8gPj4+IDE2ICYgMjU1LAogICAgICBsbyA+Pj4gMjQsCiAgICAgIGhpICYgMjU1LAogICAgICBoaSA+Pj4gOCAmIDI1NSwKICAgICAgaGkgPj4+IDE2ICYgMjU1LAogICAgICBoaSA+Pj4gMjQKICAgIF07CiAgfTsKICBMb25nUHJvdG90eXBlJDEudG9CeXRlc0JFID0gZnVuY3Rpb24gdG9CeXRlc0JFKCkgewogICAgdmFyIGhpID0gdGhpcy5oaWdoLCBsbyA9IHRoaXMubG93OwogICAgcmV0dXJuIFsKICAgICAgaGkgPj4+IDI0LAogICAgICBoaSA+Pj4gMTYgJiAyNTUsCiAgICAgIGhpID4+PiA4ICYgMjU1LAogICAgICBoaSAmIDI1NSwKICAgICAgbG8gPj4+IDI0LAogICAgICBsbyA+Pj4gMTYgJiAyNTUsCiAgICAgIGxvID4+PiA4ICYgMjU1LAogICAgICBsbyAmIDI1NQogICAgXTsKICB9OwogIExvbmckMS5mcm9tQnl0ZXMgPSBmdW5jdGlvbiBmcm9tQnl0ZXMyKGJ5dGVzLCB1bnNpZ25lZCwgbGUpIHsKICAgIHJldHVybiBsZSA/IExvbmckMS5mcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIDogTG9uZyQxLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7CiAgfTsKICBMb25nJDEuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHsKICAgIHJldHVybiBuZXcgTG9uZyQxKAogICAgICBieXRlc1swXSB8IGJ5dGVzWzFdIDw8IDggfCBieXRlc1syXSA8PCAxNiB8IGJ5dGVzWzNdIDw8IDI0LAogICAgICBieXRlc1s0XSB8IGJ5dGVzWzVdIDw8IDggfCBieXRlc1s2XSA8PCAxNiB8IGJ5dGVzWzddIDw8IDI0LAogICAgICB1bnNpZ25lZAogICAgKTsKICB9OwogIExvbmckMS5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkgewogICAgcmV0dXJuIG5ldyBMb25nJDEoCiAgICAgIGJ5dGVzWzRdIDw8IDI0IHwgYnl0ZXNbNV0gPDwgMTYgfCBieXRlc1s2XSA8PCA4IHwgYnl0ZXNbN10sCiAgICAgIGJ5dGVzWzBdIDw8IDI0IHwgYnl0ZXNbMV0gPDwgMTYgfCBieXRlc1syXSA8PCA4IHwgYnl0ZXNbM10sCiAgICAgIHVuc2lnbmVkCiAgICApOwogIH07CiAgZnVuY3Rpb24gbG9uZ1RvTnVtYmVyKGxvbmcyKSB7CiAgICBpZiAobG9uZzIuZ3JlYXRlclRoYW4oTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHx8IGxvbmcyLmxlc3NUaGFuKE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoImludGVnZXIgb3ZlcmZsb3ciKTsKICAgIH0KICAgIHJldHVybiBsb25nMi50b051bWJlcigpOwogIH0KICBjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3IgewogIH0KICBmdW5jdGlvbiBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbCkgewogICAgaWYgKCFzaWduYWwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7CiAgICAgIGlmICh0eXBlb2YgRE9NRXhjZXB0aW9uICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oImFib3J0ZWQiLCAiQWJvcnRFcnJvciIpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGUgPSBuZXcgQWJvcnRFcnJvcigiYWJvcnRlZCIpOwogICAgICAgIGUuY29kZSA9ICJFUlJfQUJPUlRFRCI7CiAgICAgICAgdGhyb3cgZTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjYW5NZXJnZUJsb2NrcyhjaHVuazEsIGNodW5rMikgewogICAgcmV0dXJuIGNodW5rMi5taW52LmJsb2NrUG9zaXRpb24gLSBjaHVuazEubWF4di5ibG9ja1Bvc2l0aW9uIDwgNjVlMyAmJiBjaHVuazIubWF4di5ibG9ja1Bvc2l0aW9uIC0gY2h1bmsxLm1pbnYuYmxvY2tQb3NpdGlvbiA8IDVlNjsKICB9CiAgZnVuY3Rpb24gb3B0aW1pemVDaHVua3MoY2h1bmtzLCBsb3dlc3QpIHsKICAgIGNvbnN0IG1lcmdlZENodW5rcyA9IFtdOwogICAgbGV0IGxhc3RDaHVuayA9IG51bGw7CiAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gY2h1bmtzOwogICAgfQogICAgY2h1bmtzLnNvcnQoZnVuY3Rpb24oYzAsIGMxKSB7CiAgICAgIGNvbnN0IGRpZiA9IGMwLm1pbnYuYmxvY2tQb3NpdGlvbiAtIGMxLm1pbnYuYmxvY2tQb3NpdGlvbjsKICAgICAgaWYgKGRpZiAhPT0gMCkgewogICAgICAgIHJldHVybiBkaWY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGMwLm1pbnYuZGF0YVBvc2l0aW9uIC0gYzEubWludi5kYXRhUG9zaXRpb247CiAgICAgIH0KICAgIH0pOwogICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7CiAgICAgIGlmICghbG93ZXN0IHx8IGNodW5rLm1heHYuY29tcGFyZVRvKGxvd2VzdCkgPiAwKSB7CiAgICAgICAgaWYgKGxhc3RDaHVuayA9PT0gbnVsbCkgewogICAgICAgICAgbWVyZ2VkQ2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgICAgbGFzdENodW5rID0gY2h1bms7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChjYW5NZXJnZUJsb2NrcyhsYXN0Q2h1bmssIGNodW5rKSkgewogICAgICAgICAgICBpZiAoY2h1bmsubWF4di5jb21wYXJlVG8obGFzdENodW5rLm1heHYpID4gMCkgewogICAgICAgICAgICAgIGxhc3RDaHVuay5tYXh2ID0gY2h1bmsubWF4djsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWVyZ2VkQ2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgICAgICBsYXN0Q2h1bmsgPSBjaHVuazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIG1lcmdlZENodW5rczsKICB9CiAgdmFyIGxvbmcgPSBMb25nOwogIHZhciB3YXNtID0gbnVsbDsKICB0cnkgewogICAgd2FzbSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFsKICAgICAgMCwKICAgICAgOTcsCiAgICAgIDExNSwKICAgICAgMTA5LAogICAgICAxLAogICAgICAwLAogICAgICAwLAogICAgICAwLAogICAgICAxLAogICAgICAxMywKICAgICAgMiwKICAgICAgOTYsCiAgICAgIDAsCiAgICAgIDEsCiAgICAgIDEyNywKICAgICAgOTYsCiAgICAgIDQsCiAgICAgIDEyNywKICAgICAgMTI3LAogICAgICAxMjcsCiAgICAgIDEyNywKICAgICAgMSwKICAgICAgMTI3LAogICAgICAzLAogICAgICA3LAogICAgICA2LAogICAgICAwLAogICAgICAxLAogICAgICAxLAogICAgICAxLAogICAgICAxLAogICAgICAxLAogICAgICA2LAogICAgICA2LAogICAgICAxLAogICAgICAxMjcsCiAgICAgIDEsCiAgICAgIDY1LAogICAgICAwLAogICAgICAxMSwKICAgICAgNywKICAgICAgNTAsCiAgICAgIDYsCiAgICAgIDMsCiAgICAgIDEwOSwKICAgICAgMTE3LAogICAgICAxMDgsCiAgICAgIDAsCiAgICAgIDEsCiAgICAgIDUsCiAgICAgIDEwMCwKICAgICAgMTA1LAogICAgICAxMTgsCiAgICAgIDk1LAogICAgICAxMTUsCiAgICAgIDAsCiAgICAgIDIsCiAgICAgIDUsCiAgICAgIDEwMCwKICAgICAgMTA1LAogICAgICAxMTgsCiAgICAgIDk1LAogICAgICAxMTcsCiAgICAgIDAsCiAgICAgIDMsCiAgICAgIDUsCiAgICAgIDExNCwKICAgICAgMTAxLAogICAgICAxMDksCiAgICAgIDk1LAogICAgICAxMTUsCiAgICAgIDAsCiAgICAgIDQsCiAgICAgIDUsCiAgICAgIDExNCwKICAgICAgMTAxLAogICAgICAxMDksCiAgICAgIDk1LAogICAgICAxMTcsCiAgICAgIDAsCiAgICAgIDUsCiAgICAgIDgsCiAgICAgIDEwMywKICAgICAgMTAxLAogICAgICAxMTYsCiAgICAgIDk1LAogICAgICAxMDQsCiAgICAgIDEwNSwKICAgICAgMTAzLAogICAgICAxMDQsCiAgICAgIDAsCiAgICAgIDAsCiAgICAgIDEwLAogICAgICAxOTEsCiAgICAgIDEsCiAgICAgIDYsCiAgICAgIDQsCiAgICAgIDAsCiAgICAgIDM1LAogICAgICAwLAogICAgICAxMSwKICAgICAgMzYsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEyNiwKICAgICAgMzIsCiAgICAgIDAsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDEsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMzIsCiAgICAgIDIsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDMsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMTI2LAogICAgICAzNCwKICAgICAgNCwKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzUsCiAgICAgIDE2NywKICAgICAgMzYsCiAgICAgIDAsCiAgICAgIDMyLAogICAgICA0LAogICAgICAxNjcsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMjcsCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEyOCwKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMSwKICAgICAgMzYsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEyNiwKICAgICAgMzIsCiAgICAgIDAsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDEsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMzIsCiAgICAgIDIsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDMsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMTI5LAogICAgICAzNCwKICAgICAgNCwKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzUsCiAgICAgIDE2NywKICAgICAgMzYsCiAgICAgIDAsCiAgICAgIDMyLAogICAgICA0LAogICAgICAxNjcsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMzAsCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEKICAgIF0pKSwge30pLmV4cG9ydHM7CiAgfSBjYXRjaCAoZSkgewogIH0KICBmdW5jdGlvbiBMb25nKGxvdywgaGlnaCwgdW5zaWduZWQpIHsKICAgIHRoaXMubG93ID0gbG93IHwgMDsKICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwOwogICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7CiAgfQogIExvbmcucHJvdG90eXBlLl9faXNMb25nX187CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCAiX19pc0xvbmdfXyIsIHsgdmFsdWU6IHRydWUgfSk7CiAgZnVuY3Rpb24gaXNMb25nKG9iaikgewogICAgcmV0dXJuIChvYmogJiYgb2JqWyJfX2lzTG9uZ19fIl0pID09PSB0cnVlOwogIH0KICBMb25nLmlzTG9uZyA9IGlzTG9uZzsKICB2YXIgSU5UX0NBQ0hFID0ge307CiAgdmFyIFVJTlRfQ0FDSEUgPSB7fTsKICBmdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkgewogICAgdmFyIG9iaiwgY2FjaGVkT2JqLCBjYWNoZTsKICAgIGlmICh1bnNpZ25lZCkgewogICAgICB2YWx1ZSA+Pj49IDA7CiAgICAgIGlmIChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpIHsKICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTsKICAgICAgICBpZiAoY2FjaGVkT2JqKQogICAgICAgICAgcmV0dXJuIGNhY2hlZE9iajsKICAgICAgfQogICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgKHZhbHVlIHwgMCkgPCAwID8gLTEgOiAwLCB0cnVlKTsKICAgICAgaWYgKGNhY2hlKQogICAgICAgIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqOwogICAgICByZXR1cm4gb2JqOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWUgfD0gMDsKICAgICAgaWYgKGNhY2hlID0gLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkgewogICAgICAgIGNhY2hlZE9iaiA9IElOVF9DQUNIRVt2YWx1ZV07CiAgICAgICAgaWYgKGNhY2hlZE9iaikKICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7CiAgICAgIH0KICAgICAgb2JqID0gZnJvbUJpdHModmFsdWUsIHZhbHVlIDwgMCA/IC0xIDogMCwgZmFsc2UpOwogICAgICBpZiAoY2FjaGUpCiAgICAgICAgSU5UX0NBQ0hFW3ZhbHVlXSA9IG9iajsKICAgICAgcmV0dXJuIG9iajsKICAgIH0KICB9CiAgTG9uZy5mcm9tSW50ID0gZnJvbUludDsKICBmdW5jdGlvbiBmcm9tTnVtYmVyKHZhbHVlLCB1bnNpZ25lZCkgewogICAgaWYgKGlzTmFOKHZhbHVlKSkKICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPOwogICAgaWYgKHVuc2lnbmVkKSB7CiAgICAgIGlmICh2YWx1ZSA8IDApCiAgICAgICAgcmV0dXJuIFVaRVJPOwogICAgICBpZiAodmFsdWUgPj0gVFdPX1BXUl82NF9EQkwpCiAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpCiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsKICAgICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCkKICAgICAgICByZXR1cm4gTUFYX1ZBTFVFOwogICAgfQogICAgaWYgKHZhbHVlIDwgMCkKICAgICAgcmV0dXJuIGZyb21OdW1iZXIoLXZhbHVlLCB1bnNpZ25lZCkubmVnKCk7CiAgICByZXR1cm4gZnJvbUJpdHModmFsdWUgJSBUV09fUFdSXzMyX0RCTCB8IDAsIHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwgfCAwLCB1bnNpZ25lZCk7CiAgfQogIExvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7CiAgZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7CiAgICByZXR1cm4gbmV3IExvbmcobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTsKICB9CiAgTG9uZy5mcm9tQml0cyA9IGZyb21CaXRzOwogIHZhciBwb3dfZGJsID0gTWF0aC5wb3c7CiAgZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIsIHVuc2lnbmVkLCByYWRpeCkgewogICAgaWYgKHN0ci5sZW5ndGggPT09IDApCiAgICAgIHRocm93IEVycm9yKCJlbXB0eSBzdHJpbmciKTsKICAgIGlmIChzdHIgPT09ICJOYU4iIHx8IHN0ciA9PT0gIkluZmluaXR5IiB8fCBzdHIgPT09ICIrSW5maW5pdHkiIHx8IHN0ciA9PT0gIi1JbmZpbml0eSIpCiAgICAgIHJldHVybiBaRVJPOwogICAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gIm51bWJlciIpIHsKICAgICAgcmFkaXggPSB1bnNpZ25lZCwgdW5zaWduZWQgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDsKICAgIH0KICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7CiAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpCiAgICAgIHRocm93IFJhbmdlRXJyb3IoInJhZGl4Iik7CiAgICB2YXIgcDsKICAgIGlmICgocCA9IHN0ci5pbmRleE9mKCItIikpID4gMCkKICAgICAgdGhyb3cgRXJyb3IoImludGVyaW9yIGh5cGhlbiIpOwogICAgZWxzZSBpZiAocCA9PT0gMCkgewogICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpOwogICAgfQogICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpOwogICAgdmFyIHJlc3VsdCA9IFpFUk87CiAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc3RyLmxlbmd0aDsgaTIgKz0gOCkgewogICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpMiksIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpMiwgaTIgKyBzaXplKSwgcmFkaXgpOwogICAgICBpZiAoc2l6ZSA8IDgpIHsKICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHBvd2VyKS5hZGQoZnJvbU51bWJlcih2YWx1ZSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQuYWRkKGZyb21OdW1iZXIodmFsdWUpKTsKICAgICAgfQogICAgfQogICAgcmVzdWx0LnVuc2lnbmVkID0gdW5zaWduZWQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBMb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nOwogIGZ1bmN0aW9uIGZyb21WYWx1ZSh2YWwsIHVuc2lnbmVkKSB7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gIm51bWJlciIpCiAgICAgIHJldHVybiBmcm9tTnVtYmVyKHZhbCwgdW5zaWduZWQpOwogICAgaWYgKHR5cGVvZiB2YWwgPT09ICJzdHJpbmciKQogICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTsKICAgIHJldHVybiBmcm9tQml0cyh2YWwubG93LCB2YWwuaGlnaCwgdHlwZW9mIHVuc2lnbmVkID09PSAiYm9vbGVhbiIgPyB1bnNpZ25lZCA6IHZhbC51bnNpZ25lZCk7CiAgfQogIExvbmcuZnJvbVZhbHVlID0gZnJvbVZhbHVlOwogIHZhciBUV09fUFdSXzE2X0RCTCA9IDEgPDwgMTY7CiAgdmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDsKICB2YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMOwogIHZhciBUV09fUFdSXzY0X0RCTCA9IFRXT19QV1JfMzJfREJMICogVFdPX1BXUl8zMl9EQkw7CiAgdmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyOwogIHZhciBUV09fUFdSXzI0ID0gZnJvbUludChUV09fUFdSXzI0X0RCTCk7CiAgdmFyIFpFUk8gPSBmcm9tSW50KDApOwogIExvbmcuWkVSTyA9IFpFUk87CiAgdmFyIFVaRVJPID0gZnJvbUludCgwLCB0cnVlKTsKICBMb25nLlVaRVJPID0gVVpFUk87CiAgdmFyIE9ORSA9IGZyb21JbnQoMSk7CiAgTG9uZy5PTkUgPSBPTkU7CiAgdmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpOwogIExvbmcuVU9ORSA9IFVPTkU7CiAgdmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTsKICBMb25nLk5FR19PTkUgPSBORUdfT05FOwogIHZhciBNQVhfVkFMVUUgPSBmcm9tQml0cyg0Mjk0OTY3Mjk1IHwgMCwgMjE0NzQ4MzY0NyB8IDAsIGZhbHNlKTsKICBMb25nLk1BWF9WQUxVRSA9IE1BWF9WQUxVRTsKICB2YXIgTUFYX1VOU0lHTkVEX1ZBTFVFID0gZnJvbUJpdHMoNDI5NDk2NzI5NSB8IDAsIDQyOTQ5NjcyOTUgfCAwLCB0cnVlKTsKICBMb25nLk1BWF9VTlNJR05FRF9WQUxVRSA9IE1BWF9VTlNJR05FRF9WQUxVRTsKICB2YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMjE0NzQ4MzY0OCB8IDAsIGZhbHNlKTsKICBMb25nLk1JTl9WQUxVRSA9IE1JTl9WQUxVRTsKICB2YXIgTG9uZ1Byb3RvdHlwZSA9IExvbmcucHJvdG90eXBlOwogIExvbmdQcm90b3R5cGUudG9JbnQgPSBmdW5jdGlvbiB0b0ludCgpIHsKICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gdGhpcy5sb3cgPj4+IDAgOiB0aGlzLmxvdzsKICB9OwogIExvbmdQcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlcjIoKSB7CiAgICBpZiAodGhpcy51bnNpZ25lZCkKICAgICAgcmV0dXJuICh0aGlzLmhpZ2ggPj4+IDApICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApOwogICAgcmV0dXJuIHRoaXMuaGlnaCAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTsKICB9OwogIExvbmdQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZzIocmFkaXgpIHsKICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7CiAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpCiAgICAgIHRocm93IFJhbmdlRXJyb3IoInJhZGl4Iik7CiAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgcmV0dXJuICIwIjsKICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgewogICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7CiAgICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLCBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLCByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTsKICAgICAgICByZXR1cm4gZGl2LnRvU3RyaW5nKHJhZGl4KSArIHJlbTEudG9JbnQoKS50b1N0cmluZyhyYWRpeCk7CiAgICAgIH0gZWxzZQogICAgICAgIHJldHVybiAiLSIgKyB0aGlzLm5lZygpLnRvU3RyaW5nKHJhZGl4KTsKICAgIH0KICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDYpLCB0aGlzLnVuc2lnbmVkKSwgcmVtID0gdGhpczsKICAgIHZhciByZXN1bHQgPSAiIjsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLCBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpOwogICAgICByZW0gPSByZW1EaXY7CiAgICAgIGlmIChyZW0uaXNaZXJvKCkpCiAgICAgICAgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDsKICAgICAgZWxzZSB7CiAgICAgICAgd2hpbGUgKGRpZ2l0cy5sZW5ndGggPCA2KQogICAgICAgICAgZGlnaXRzID0gIjAiICsgZGlnaXRzOwogICAgICAgIHJlc3VsdCA9ICIiICsgZGlnaXRzICsgcmVzdWx0OwogICAgICB9CiAgICB9CiAgfTsKICBMb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHMoKSB7CiAgICByZXR1cm4gdGhpcy5oaWdoOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHNVbnNpZ25lZCgpIHsKICAgIHJldHVybiB0aGlzLmhpZ2ggPj4+IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmdldExvd0JpdHMgPSBmdW5jdGlvbiBnZXRMb3dCaXRzKCkgewogICAgcmV0dXJuIHRoaXMubG93OwogIH07CiAgTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRMb3dCaXRzVW5zaWduZWQoKSB7CiAgICByZXR1cm4gdGhpcy5sb3cgPj4+IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmdldE51bUJpdHNBYnMgPSBmdW5jdGlvbiBnZXROdW1CaXRzQWJzKCkgewogICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKQogICAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTsKICAgIHZhciB2YWwgPSB0aGlzLmhpZ2ggIT0gMCA/IHRoaXMuaGlnaCA6IHRoaXMubG93OwogICAgZm9yICh2YXIgYml0ID0gMzE7IGJpdCA+IDA7IGJpdC0tKQogICAgICBpZiAoKHZhbCAmIDEgPDwgYml0KSAhPSAwKQogICAgICAgIGJyZWFrOwogICAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8oKSB7CiAgICByZXR1cm4gdGhpcy5oaWdoID09PSAwICYmIHRoaXMubG93ID09PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5lcXogPSBMb25nUHJvdG90eXBlLmlzWmVybzsKICBMb25nUHJvdG90eXBlLmlzTmVnYXRpdmUgPSBmdW5jdGlvbiBpc05lZ2F0aXZlKCkgewogICAgcmV0dXJuICF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA8IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkgewogICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7CiAgICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7CiAgfTsKICBMb25nUHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbigpIHsKICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDsKICB9OwogIExvbmdQcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7CiAgICBpZiAoIWlzTG9uZyhvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTsKICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPj4+IDMxID09PSAxICYmIG90aGVyLmhpZ2ggPj4+IDMxID09PSAxKQogICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7CiAgfTsKICBMb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7CiAgTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHsKICAgIHJldHVybiAhdGhpcy5lcShvdGhlcik7CiAgfTsKICBMb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzOwogIExvbmdQcm90b3R5cGUubmUgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFsczsKICBMb25nUHJvdG90eXBlLmxlc3NUaGFuID0gZnVuY3Rpb24gbGVzc1RoYW4ob3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmNvbXAob3RoZXIpIDwgMDsKICB9OwogIExvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuOwogIExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5jb21wKG90aGVyKSA8PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDsKICBMb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7CiAgTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5jb21wKG90aGVyKSA+IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjsKICBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikgewogICAgcmV0dXJuIHRoaXMuY29tcChvdGhlcikgPj0gMDsKICB9OwogIExvbmdQcm90b3R5cGUuZ3RlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7CiAgTG9uZ1Byb3RvdHlwZS5nZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsOwogIExvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHsKICAgIGlmICghaXNMb25nKG90aGVyKSkKICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpOwogICAgaWYgKHRoaXMuZXEob3RoZXIpKQogICAgICByZXR1cm4gMDsKICAgIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksIG90aGVyTmVnID0gb3RoZXIuaXNOZWdhdGl2ZSgpOwogICAgaWYgKHRoaXNOZWcgJiYgIW90aGVyTmVnKQogICAgICByZXR1cm4gLTE7CiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpCiAgICAgIHJldHVybiAxOwogICAgaWYgKCF0aGlzLnVuc2lnbmVkKQogICAgICByZXR1cm4gdGhpcy5zdWIob3RoZXIpLmlzTmVnYXRpdmUoKSA/IC0xIDogMTsKICAgIHJldHVybiBvdGhlci5oaWdoID4+PiAwID4gdGhpcy5oaWdoID4+PiAwIHx8IG90aGVyLmhpZ2ggPT09IHRoaXMuaGlnaCAmJiBvdGhlci5sb3cgPj4+IDAgPiB0aGlzLmxvdyA+Pj4gMCA/IC0xIDogMTsKICB9OwogIExvbmdQcm90b3R5cGUuY29tcCA9IExvbmdQcm90b3R5cGUuY29tcGFyZTsKICBMb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHsKICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpCiAgICAgIHJldHVybiBNSU5fVkFMVUU7CiAgICByZXR1cm4gdGhpcy5ub3QoKS5hZGQoT05FKTsKICB9OwogIExvbmdQcm90b3R5cGUubmVnID0gTG9uZ1Byb3RvdHlwZS5uZWdhdGU7CiAgTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7CiAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKQogICAgICBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTsKICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2OwogICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDY1NTM1OwogICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjsKICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDY1NTM1OwogICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjsKICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDY1NTM1OwogICAgdmFyIGIxNiA9IGFkZGVuZC5sb3cgPj4+IDE2OwogICAgdmFyIGIwMCA9IGFkZGVuZC5sb3cgJiA2NTUzNTsKICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwOwogICAgYzAwICs9IGEwMCArIGIwMDsKICAgIGMxNiArPSBjMDAgPj4+IDE2OwogICAgYzAwICY9IDY1NTM1OwogICAgYzE2ICs9IGExNiArIGIxNjsKICAgIGMzMiArPSBjMTYgPj4+IDE2OwogICAgYzE2ICY9IDY1NTM1OwogICAgYzMyICs9IGEzMiArIGIzMjsKICAgIGM0OCArPSBjMzIgPj4+IDE2OwogICAgYzMyICY9IDY1NTM1OwogICAgYzQ4ICs9IGE0OCArIGI0ODsKICAgIGM0OCAmPSA2NTUzNTsKICAgIHJldHVybiBmcm9tQml0cyhjMTYgPDwgMTYgfCBjMDAsIGM0OCA8PCAxNiB8IGMzMiwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkgewogICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpCiAgICAgIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7CiAgICByZXR1cm4gdGhpcy5hZGQoc3VidHJhaGVuZC5uZWcoKSk7CiAgfTsKICBMb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7CiAgTG9uZ1Byb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KG11bHRpcGxpZXIpIHsKICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICByZXR1cm4gWkVSTzsKICAgIGlmICghaXNMb25nKG11bHRpcGxpZXIpKQogICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpOwogICAgaWYgKHdhc20pIHsKICAgICAgdmFyIGxvdyA9IHdhc20ubXVsKAogICAgICAgIHRoaXMubG93LAogICAgICAgIHRoaXMuaGlnaCwKICAgICAgICBtdWx0aXBsaWVyLmxvdywKICAgICAgICBtdWx0aXBsaWVyLmhpZ2gKICAgICAgKTsKICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTsKICAgIH0KICAgIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKQogICAgICByZXR1cm4gWkVSTzsKICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpCiAgICAgIHJldHVybiBtdWx0aXBsaWVyLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPOwogICAgaWYgKG11bHRpcGxpZXIuZXEoTUlOX1ZBTFVFKSkKICAgICAgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87CiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHsKICAgICAgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKQogICAgICAgIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyLm5lZygpKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyKS5uZWcoKTsKICAgIH0gZWxzZSBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpCiAgICAgIHJldHVybiB0aGlzLm11bChtdWx0aXBsaWVyLm5lZygpKS5uZWcoKTsKICAgIGlmICh0aGlzLmx0KFRXT19QV1JfMjQpICYmIG11bHRpcGxpZXIubHQoVFdPX1BXUl8yNCkpCiAgICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSAqIG11bHRpcGxpZXIudG9OdW1iZXIoKSwgdGhpcy51bnNpZ25lZCk7CiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjsKICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiA2NTUzNTsKICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7CiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiA2NTUzNTsKICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2OwogICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDY1NTM1OwogICAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjsKICAgIHZhciBiMDAgPSBtdWx0aXBsaWVyLmxvdyAmIDY1NTM1OwogICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7CiAgICBjMDAgKz0gYTAwICogYjAwOwogICAgYzE2ICs9IGMwMCA+Pj4gMTY7CiAgICBjMDAgJj0gNjU1MzU7CiAgICBjMTYgKz0gYTE2ICogYjAwOwogICAgYzMyICs9IGMxNiA+Pj4gMTY7CiAgICBjMTYgJj0gNjU1MzU7CiAgICBjMTYgKz0gYTAwICogYjE2OwogICAgYzMyICs9IGMxNiA+Pj4gMTY7CiAgICBjMTYgJj0gNjU1MzU7CiAgICBjMzIgKz0gYTMyICogYjAwOwogICAgYzQ4ICs9IGMzMiA+Pj4gMTY7CiAgICBjMzIgJj0gNjU1MzU7CiAgICBjMzIgKz0gYTE2ICogYjE2OwogICAgYzQ4ICs9IGMzMiA+Pj4gMTY7CiAgICBjMzIgJj0gNjU1MzU7CiAgICBjMzIgKz0gYTAwICogYjMyOwogICAgYzQ4ICs9IGMzMiA+Pj4gMTY7CiAgICBjMzIgJj0gNjU1MzU7CiAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4OwogICAgYzQ4ICY9IDY1NTM1OwogICAgcmV0dXJuIGZyb21CaXRzKGMxNiA8PCAxNiB8IGMwMCwgYzQ4IDw8IDE2IHwgYzMyLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTsKICBMb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7CiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSkKICAgICAgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTsKICAgIGlmIChkaXZpc29yLmlzWmVybygpKQogICAgICB0aHJvdyBFcnJvcigiZGl2aXNpb24gYnkgemVybyIpOwogICAgaWYgKHdhc20pIHsKICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA9PT0gLTIxNDc0ODM2NDggJiYgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtLmRpdl91IDogd2FzbS5kaXZfcykoCiAgICAgICAgdGhpcy5sb3csCiAgICAgICAgdGhpcy5oaWdoLAogICAgICAgIGRpdmlzb3IubG93LAogICAgICAgIGRpdmlzb3IuaGlnaAogICAgICApOwogICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpOwogICAgfQogICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPOwogICAgdmFyIGFwcHJveCwgcmVtLCByZXM7CiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHsKICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkgewogICAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSkKICAgICAgICAgIHJldHVybiBNSU5fVkFMVUU7CiAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKQogICAgICAgICAgcmV0dXJuIE9ORTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpOwogICAgICAgICAgYXBwcm94ID0gaGFsZlRoaXMuZGl2KGRpdmlzb3IpLnNobCgxKTsKICAgICAgICAgIGlmIChhcHByb3guZXEoWkVSTykpIHsKICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpOwogICAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpCiAgICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87CiAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgewogICAgICAgIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTsKICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvcikubmVnKCk7CiAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpCiAgICAgICAgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpOwogICAgICByZXMgPSBaRVJPOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKQogICAgICAgIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTsKICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpCiAgICAgICAgcmV0dXJuIFVaRVJPOwogICAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKQogICAgICAgIHJldHVybiBVT05FOwogICAgICByZXMgPSBVWkVSTzsKICAgIH0KICAgIHJlbSA9IHRoaXM7CiAgICB3aGlsZSAocmVtLmd0ZShkaXZpc29yKSkgewogICAgICBhcHByb3ggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHJlbS50b051bWJlcigpIC8gZGl2aXNvci50b051bWJlcigpKSk7CiAgICAgIHZhciBsb2cyID0gTWF0aC5jZWlsKE1hdGgubG9nKGFwcHJveCkgLyBNYXRoLkxOMiksIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksIGFwcHJveFJlcyA9IGZyb21OdW1iZXIoYXBwcm94KSwgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTsKICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHsKICAgICAgICBhcHByb3ggLT0gZGVsdGE7CiAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpOwogICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7CiAgICAgIH0KICAgICAgaWYgKGFwcHJveFJlcy5pc1plcm8oKSkKICAgICAgICBhcHByb3hSZXMgPSBPTkU7CiAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTsKICAgICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9OwogIExvbmdQcm90b3R5cGUuZGl2ID0gTG9uZ1Byb3RvdHlwZS5kaXZpZGU7CiAgTG9uZ1Byb3RvdHlwZS5tb2R1bG8gPSBmdW5jdGlvbiBtb2R1bG8oZGl2aXNvcikgewogICAgaWYgKCFpc0xvbmcoZGl2aXNvcikpCiAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7CiAgICBpZiAod2FzbSkgewogICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtLnJlbV91IDogd2FzbS5yZW1fcykoCiAgICAgICAgdGhpcy5sb3csCiAgICAgICAgdGhpcy5oaWdoLAogICAgICAgIGRpdmlzb3IubG93LAogICAgICAgIGRpdmlzb3IuaGlnaAogICAgICApOwogICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpOwogICAgfQogICAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7CiAgfTsKICBMb25nUHJvdG90eXBlLm1vZCA9IExvbmdQcm90b3R5cGUubW9kdWxvOwogIExvbmdQcm90b3R5cGUucmVtID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87CiAgTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7CiAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kKG90aGVyKSB7CiAgICBpZiAoIWlzTG9uZyhvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTsKICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHsKICAgIGlmICghaXNMb25nKG90aGVyKSkKICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpOwogICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IHwgb3RoZXIubG93LCB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7CiAgICBpZiAoIWlzTG9uZyhvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTsKICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyBeIG90aGVyLmxvdywgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uIHNoaWZ0TGVmdChudW1CaXRzKSB7CiAgICBpZiAoaXNMb25nKG51bUJpdHMpKQogICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpOwogICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyA8PCBudW1CaXRzLCB0aGlzLmhpZ2ggPDwgbnVtQml0cyB8IHRoaXMubG93ID4+PiAzMiAtIG51bUJpdHMsIHRoaXMudW5zaWduZWQpOwogICAgZWxzZQogICAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgbnVtQml0cyAtIDMyLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUuc2hsID0gTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQ7CiAgTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7CiAgICBpZiAoaXNMb25nKG51bUJpdHMpKQogICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpOwogICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyA+Pj4gbnVtQml0cyB8IHRoaXMuaGlnaCA8PCAzMiAtIG51bUJpdHMsIHRoaXMuaGlnaCA+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+PiBudW1CaXRzIC0gMzIsIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0OwogIExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHsKICAgIGlmIChpc0xvbmcobnVtQml0cykpCiAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7CiAgICBudW1CaXRzICY9IDYzOwogICAgaWYgKG51bUJpdHMgPT09IDApCiAgICAgIHJldHVybiB0aGlzOwogICAgZWxzZSB7CiAgICAgIHZhciBoaWdoID0gdGhpcy5oaWdoOwogICAgICBpZiAobnVtQml0cyA8IDMyKSB7CiAgICAgICAgdmFyIGxvdyA9IHRoaXMubG93OwogICAgICAgIHJldHVybiBmcm9tQml0cyhsb3cgPj4+IG51bUJpdHMgfCBoaWdoIDw8IDMyIC0gbnVtQml0cywgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7CiAgICAgIH0gZWxzZSBpZiAobnVtQml0cyA9PT0gMzIpCiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2gsIDAsIHRoaXMudW5zaWduZWQpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2ggPj4+IG51bUJpdHMgLSAzMiwgMCwgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgfTsKICBMb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDsKICBMb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7CiAgTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkgewogICAgaWYgKCF0aGlzLnVuc2lnbmVkKQogICAgICByZXR1cm4gdGhpczsKICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCBmYWxzZSk7CiAgfTsKICBMb25nUHJvdG90eXBlLnRvVW5zaWduZWQgPSBmdW5jdGlvbiB0b1Vuc2lnbmVkKCkgewogICAgaWYgKHRoaXMudW5zaWduZWQpCiAgICAgIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkgewogICAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7CiAgfTsKICBMb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHsKICAgIHZhciBoaSA9IHRoaXMuaGlnaCwgbG8gPSB0aGlzLmxvdzsKICAgIHJldHVybiBbCiAgICAgIGxvICYgMjU1LAogICAgICBsbyA+Pj4gOCAmIDI1NSwKICAgICAgbG8gPj4+IDE2ICYgMjU1LAogICAgICBsbyA+Pj4gMjQsCiAgICAgIGhpICYgMjU1LAogICAgICBoaSA+Pj4gOCAmIDI1NSwKICAgICAgaGkgPj4+IDE2ICYgMjU1LAogICAgICBoaSA+Pj4gMjQKICAgIF07CiAgfTsKICBMb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHsKICAgIHZhciBoaSA9IHRoaXMuaGlnaCwgbG8gPSB0aGlzLmxvdzsKICAgIHJldHVybiBbCiAgICAgIGhpID4+PiAyNCwKICAgICAgaGkgPj4+IDE2ICYgMjU1LAogICAgICBoaSA+Pj4gOCAmIDI1NSwKICAgICAgaGkgJiAyNTUsCiAgICAgIGxvID4+PiAyNCwKICAgICAgbG8gPj4+IDE2ICYgMjU1LAogICAgICBsbyA+Pj4gOCAmIDI1NSwKICAgICAgbG8gJiAyNTUKICAgIF07CiAgfTsKICBMb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlczIoYnl0ZXMsIHVuc2lnbmVkLCBsZSkgewogICAgcmV0dXJuIGxlID8gTG9uZy5mcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIDogTG9uZy5mcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpOwogIH07CiAgTG9uZy5mcm9tQnl0ZXNMRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgewogICAgcmV0dXJuIG5ldyBMb25nKAogICAgICBieXRlc1swXSB8IGJ5dGVzWzFdIDw8IDggfCBieXRlc1syXSA8PCAxNiB8IGJ5dGVzWzNdIDw8IDI0LAogICAgICBieXRlc1s0XSB8IGJ5dGVzWzVdIDw8IDggfCBieXRlc1s2XSA8PCAxNiB8IGJ5dGVzWzddIDw8IDI0LAogICAgICB1bnNpZ25lZAogICAgKTsKICB9OwogIExvbmcuZnJvbUJ5dGVzQkUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpIHsKICAgIHJldHVybiBuZXcgTG9uZygKICAgICAgYnl0ZXNbNF0gPDwgMjQgfCBieXRlc1s1XSA8PCAxNiB8IGJ5dGVzWzZdIDw8IDggfCBieXRlc1s3XSwKICAgICAgYnl0ZXNbMF0gPDwgMjQgfCBieXRlc1sxXSA8PCAxNiB8IGJ5dGVzWzJdIDw8IDggfCBieXRlc1szXSwKICAgICAgdW5zaWduZWQKICAgICk7CiAgfTsKICBjbGFzcyBWaXJ0dWFsT2Zmc2V0IHsKICAgIGNvbnN0cnVjdG9yKGJsb2NrUG9zaXRpb24sIGRhdGFQb3NpdGlvbikgewogICAgICB0aGlzLmJsb2NrUG9zaXRpb24gPSBibG9ja1Bvc2l0aW9uOwogICAgICB0aGlzLmRhdGFQb3NpdGlvbiA9IGRhdGFQb3NpdGlvbjsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gYCR7dGhpcy5ibG9ja1Bvc2l0aW9ufToke3RoaXMuZGF0YVBvc2l0aW9ufWA7CiAgICB9CiAgICBjb21wYXJlVG8oYikgewogICAgICByZXR1cm4gdGhpcy5ibG9ja1Bvc2l0aW9uIC0gYi5ibG9ja1Bvc2l0aW9uIHx8IHRoaXMuZGF0YVBvc2l0aW9uIC0gYi5kYXRhUG9zaXRpb247CiAgICB9CiAgICBzdGF0aWMgbWluKC4uLmFyZ3MpIHsKICAgICAgbGV0IG1pbjsKICAgICAgbGV0IGkyID0gMDsKICAgICAgZm9yICg7ICFtaW47IGkyICs9IDEpIHsKICAgICAgICBtaW4gPSBhcmdzW2kyXTsKICAgICAgfQogICAgICBmb3IgKDsgaTIgPCBhcmdzLmxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgIGlmIChtaW4uY29tcGFyZVRvKGFyZ3NbaTJdKSA+IDApIHsKICAgICAgICAgIG1pbiA9IGFyZ3NbaTJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogIH0KICBmdW5jdGlvbiBmcm9tQnl0ZXMoYnl0ZXMsIG9mZnNldCA9IDAsIGJpZ2VuZGlhbiA9IGZhbHNlKSB7CiAgICBpZiAoYmlnZW5kaWFuKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiYmlnLWVuZGlhbiB2aXJ0dWFsIGZpbGUgb2Zmc2V0cyBub3QgaW1wbGVtZW50ZWQiKTsKICAgIH0KICAgIHJldHVybiBuZXcgVmlydHVhbE9mZnNldChieXRlc1tvZmZzZXQgKyA3XSAqIDEwOTk1MTE2Mjc3NzYgKyBieXRlc1tvZmZzZXQgKyA2XSAqIDQyOTQ5NjcyOTYgKyBieXRlc1tvZmZzZXQgKyA1XSAqIDE2Nzc3MjE2ICsgYnl0ZXNbb2Zmc2V0ICsgNF0gKiA2NTUzNiArIGJ5dGVzW29mZnNldCArIDNdICogMjU2ICsgYnl0ZXNbb2Zmc2V0ICsgMl0sIGJ5dGVzW29mZnNldCArIDFdIDw8IDggfCBieXRlc1tvZmZzZXRdKTsKICB9CiAgY2xhc3MgQ2h1bmsgewogICAgY29uc3RydWN0b3IobWludiwgbWF4diwgYmluLCBmZXRjaGVkU2l6ZSA9IHZvaWQgMCkgewogICAgICB0aGlzLm1pbnYgPSBtaW52OwogICAgICB0aGlzLm1heHYgPSBtYXh2OwogICAgICB0aGlzLmJpbiA9IGJpbjsKICAgICAgdGhpcy5fZmV0Y2hlZFNpemUgPSBmZXRjaGVkU2l6ZTsKICAgIH0KICAgIHRvVW5pcXVlU3RyaW5nKCkgewogICAgICByZXR1cm4gYCR7dGhpcy5taW52fS4uJHt0aGlzLm1heHZ9IChiaW4gJHt0aGlzLmJpbn0sIGZldGNoZWRTaXplICR7dGhpcy5mZXRjaGVkU2l6ZSgpfSlgOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLnRvVW5pcXVlU3RyaW5nKCk7CiAgICB9CiAgICBjb21wYXJlVG8oYikgewogICAgICByZXR1cm4gdGhpcy5taW52LmNvbXBhcmVUbyhiLm1pbnYpIHx8IHRoaXMubWF4di5jb21wYXJlVG8oYi5tYXh2KSB8fCB0aGlzLmJpbiAtIGIuYmluOwogICAgfQogICAgZmV0Y2hlZFNpemUoKSB7CiAgICAgIGlmICh0aGlzLl9mZXRjaGVkU2l6ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoZWRTaXplOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm1heHYuYmxvY2tQb3NpdGlvbiArICgxIDw8IDE2KSAtIHRoaXMubWludi5ibG9ja1Bvc2l0aW9uOwogICAgfQogIH0KICBjbGFzcyBJbmRleEZpbGUgewogICAgY29uc3RydWN0b3IoeyBmaWxlaGFuZGxlLCByZW5hbWVSZWZTZXFzID0gKG4pID0+IG4gfSkgewogICAgICB0aGlzLmZpbGVoYW5kbGUgPSBmaWxlaGFuZGxlOwogICAgICB0aGlzLnJlbmFtZVJlZlNlcSA9IHJlbmFtZVJlZlNlcXM7CiAgICB9CiAgICBhc3luYyBnZXRNZXRhZGF0YShvcHRzID0ge30pIHsKICAgICAgY29uc3QgeyBpbmRpY2VzLCAuLi5yZXN0IH0gPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpOwogICAgICByZXR1cm4gcmVzdDsKICAgIH0KICAgIF9maW5kRmlyc3REYXRhKGN1cnJlbnRGZGwsIHZpcnR1YWxPZmZzZXQpIHsKICAgICAgaWYgKGN1cnJlbnRGZGwpIHsKICAgICAgICByZXR1cm4gY3VycmVudEZkbC5jb21wYXJlVG8odmlydHVhbE9mZnNldCkgPiAwID8gdmlydHVhbE9mZnNldCA6IGN1cnJlbnRGZGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZpcnR1YWxPZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHBhcnNlKG9wdHMgPSB7fSkgewogICAgICBpZiAoIXRoaXMucGFyc2VQKSB7CiAgICAgICAgdGhpcy5wYXJzZVAgPSB0aGlzLl9wYXJzZShvcHRzKS5jYXRjaCgoZSkgPT4gewogICAgICAgICAgdGhpcy5wYXJzZVAgPSB2b2lkIDA7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnBhcnNlUDsKICAgIH0KICAgIGFzeW5jIGhhc1JlZlNlcShzZXFJZCwgb3B0cyA9IHt9KSB7CiAgICAgIHJldHVybiAhISgoYXdhaXQgdGhpcy5wYXJzZShvcHRzKSkuaW5kaWNlc1tzZXFJZF0gfHwge30pLmJpbkluZGV4OwogICAgfQogIH0KICBjb25zdCBUQklfTUFHSUMgPSAyMTU3ODMyNDsKICBjb25zdCBUQURfTElEWF9TSElGVCA9IDE0OwogIGZ1bmN0aW9uIHJlZzJiaW5zKGJlZywgZW5kKSB7CiAgICBiZWcgKz0gMTsKICAgIGVuZCAtPSAxOwogICAgcmV0dXJuIFsKICAgICAgWzAsIDBdLAogICAgICBbMSArIChiZWcgPj4gMjYpLCAxICsgKGVuZCA+PiAyNildLAogICAgICBbOSArIChiZWcgPj4gMjMpLCA5ICsgKGVuZCA+PiAyMyldLAogICAgICBbNzMgKyAoYmVnID4+IDIwKSwgNzMgKyAoZW5kID4+IDIwKV0sCiAgICAgIFs1ODUgKyAoYmVnID4+IDE3KSwgNTg1ICsgKGVuZCA+PiAxNyldLAogICAgICBbNDY4MSArIChiZWcgPj4gMTQpLCA0NjgxICsgKGVuZCA+PiAxNCldCiAgICBdOwogIH0KICBjbGFzcyBUYWJpeEluZGV4IGV4dGVuZHMgSW5kZXhGaWxlIHsKICAgIGFzeW5jIGxpbmVDb3VudChyZWZOYW1lLCBvcHRzID0ge30pIHsKICAgICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5wYXJzZShvcHRzKTsKICAgICAgaWYgKCFpbmRleERhdGEpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgY29uc3QgcmVmSWQgPSBpbmRleERhdGEucmVmTmFtZVRvSWRbcmVmTmFtZV07CiAgICAgIGNvbnN0IGlkeCA9IGluZGV4RGF0YS5pbmRpY2VzW3JlZklkXTsKICAgICAgaWYgKCFpZHgpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgY29uc3QgeyBzdGF0cyB9ID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdOwogICAgICBpZiAoc3RhdHMpIHsKICAgICAgICByZXR1cm4gc3RhdHMubGluZUNvdW50OwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGFzeW5jIF9wYXJzZShvcHRzID0ge30pIHsKICAgICAgY29uc3QgYnVmID0gYXdhaXQgdGhpcy5maWxlaGFuZGxlLnJlYWRGaWxlKG9wdHMpOwogICAgICBjb25zdCBieXRlcyA9IGF3YWl0IHVuemlwKGJ1Zik7CiAgICAgIGNoZWNrQWJvcnRTaWduYWwob3B0cy5zaWduYWwpOwogICAgICBpZiAoYnl0ZXMucmVhZFVJbnQzMkxFKDApICE9PSBUQklfTUFHSUMpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBhIFRCSSBmaWxlIik7CiAgICAgIH0KICAgICAgY29uc3QgcmVmQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRSg0KTsKICAgICAgY29uc3QgZm9ybWF0RmxhZ3MgPSBieXRlcy5yZWFkSW50MzJMRSg4KTsKICAgICAgY29uc3QgY29vcmRpbmF0ZVR5cGUgPSBmb3JtYXRGbGFncyAmIDY1NTM2ID8gInplcm8tYmFzZWQtaGFsZi1vcGVuIiA6ICIxLWJhc2VkLWNsb3NlZCI7CiAgICAgIGNvbnN0IGZvcm1hdE9wdHMgPSB7CiAgICAgICAgMDogImdlbmVyaWMiLAogICAgICAgIDE6ICJTQU0iLAogICAgICAgIDI6ICJWQ0YiCiAgICAgIH07CiAgICAgIGNvbnN0IGZvcm1hdCA9IGZvcm1hdE9wdHNbZm9ybWF0RmxhZ3MgJiAxNV07CiAgICAgIGlmICghZm9ybWF0KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIFRhYml4IHByZXNldCBmb3JtYXQgZmxhZ3MgJHtmb3JtYXRGbGFnc31gKTsKICAgICAgfQogICAgICBjb25zdCBjb2x1bW5OdW1iZXJzID0gewogICAgICAgIHJlZjogYnl0ZXMucmVhZEludDMyTEUoMTIpLAogICAgICAgIHN0YXJ0OiBieXRlcy5yZWFkSW50MzJMRSgxNiksCiAgICAgICAgZW5kOiBieXRlcy5yZWFkSW50MzJMRSgyMCkKICAgICAgfTsKICAgICAgY29uc3QgbWV0YVZhbHVlID0gYnl0ZXMucmVhZEludDMyTEUoMjQpOwogICAgICBjb25zdCBkZXB0aCA9IDU7CiAgICAgIGNvbnN0IG1heEJpbk51bWJlciA9ICgoMSA8PCAoZGVwdGggKyAxKSAqIDMpIC0gMSkgLyA3OwogICAgICBjb25zdCBtYXhSZWZMZW5ndGggPSAyICoqICgxNCArIGRlcHRoICogMyk7CiAgICAgIGNvbnN0IG1ldGFDaGFyID0gbWV0YVZhbHVlID8gU3RyaW5nLmZyb21DaGFyQ29kZShtZXRhVmFsdWUpIDogbnVsbDsKICAgICAgY29uc3Qgc2tpcExpbmVzID0gYnl0ZXMucmVhZEludDMyTEUoMjgpOwogICAgICBjb25zdCBuYW1lU2VjdGlvbkxlbmd0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDMyKTsKICAgICAgY29uc3QgeyByZWZOYW1lVG9JZCwgcmVmSWRUb05hbWUgfSA9IHRoaXMuX3BhcnNlTmFtZUJ5dGVzKGJ5dGVzLnNsaWNlKDM2LCAzNiArIG5hbWVTZWN0aW9uTGVuZ3RoKSk7CiAgICAgIGxldCBjdXJyT2Zmc2V0ID0gMzYgKyBuYW1lU2VjdGlvbkxlbmd0aDsKICAgICAgbGV0IGZpcnN0RGF0YUxpbmU7CiAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgQXJyYXkocmVmQ291bnQpLmZpbGwoMCkubWFwKCgpID0+IHsKICAgICAgICBjb25zdCBiaW5Db3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKGN1cnJPZmZzZXQpOwogICAgICAgIGN1cnJPZmZzZXQgKz0gNDsKICAgICAgICBjb25zdCBiaW5JbmRleCA9IHt9OwogICAgICAgIGxldCBzdGF0czsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJpbkNvdW50OyBqICs9IDEpIHsKICAgICAgICAgIGNvbnN0IGJpbiA9IGJ5dGVzLnJlYWRVSW50MzJMRShjdXJyT2Zmc2V0KTsKICAgICAgICAgIGN1cnJPZmZzZXQgKz0gNDsKICAgICAgICAgIGlmIChiaW4gPiBtYXhCaW5OdW1iZXIgKyAxKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidGFiaXggaW5kZXggY29udGFpbnMgdG9vIG1hbnkgYmlucywgcGxlYXNlIHVzZSBhIENTSSBpbmRleCIpOwogICAgICAgICAgfSBlbHNlIGlmIChiaW4gPT09IG1heEJpbk51bWJlciArIDEpIHsKICAgICAgICAgICAgY29uc3QgY2h1bmtDb3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKGN1cnJPZmZzZXQpOwogICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDQ7CiAgICAgICAgICAgIGlmIChjaHVua0NvdW50ID09PSAyKSB7CiAgICAgICAgICAgICAgc3RhdHMgPSB0aGlzLnBhcnNlUHNldWRvQmluKGJ5dGVzLCBjdXJyT2Zmc2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDE2ICogY2h1bmtDb3VudDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGNodW5rQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0KTsKICAgICAgICAgICAgY3Vyck9mZnNldCArPSA0OwogICAgICAgICAgICBjb25zdCBjaHVua3MgPSBuZXcgQXJyYXkoY2h1bmtDb3VudCk7CiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2h1bmtDb3VudDsgayArPSAxKSB7CiAgICAgICAgICAgICAgY29uc3QgdSA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCk7CiAgICAgICAgICAgICAgY29uc3QgdiA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDgpOwogICAgICAgICAgICAgIGN1cnJPZmZzZXQgKz0gMTY7CiAgICAgICAgICAgICAgZmlyc3REYXRhTGluZSA9IHRoaXMuX2ZpbmRGaXJzdERhdGEoZmlyc3REYXRhTGluZSwgdSk7CiAgICAgICAgICAgICAgY2h1bmtzW2tdID0gbmV3IENodW5rKHUsIHYsIGJpbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmluSW5kZXhbYmluXSA9IGNodW5rczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZWFyQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0KTsKICAgICAgICBjdXJyT2Zmc2V0ICs9IDQ7CiAgICAgICAgY29uc3QgbGluZWFySW5kZXggPSBuZXcgQXJyYXkobGluZWFyQ291bnQpOwogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZWFyQ291bnQ7IGsgKz0gMSkgewogICAgICAgICAgbGluZWFySW5kZXhba10gPSBmcm9tQnl0ZXMoYnl0ZXMsIGN1cnJPZmZzZXQpOwogICAgICAgICAgY3Vyck9mZnNldCArPSA4OwogICAgICAgICAgZmlyc3REYXRhTGluZSA9IHRoaXMuX2ZpbmRGaXJzdERhdGEoZmlyc3REYXRhTGluZSwgbGluZWFySW5kZXhba10pOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBiaW5JbmRleCwgbGluZWFySW5kZXgsIHN0YXRzIH07CiAgICAgIH0pOwogICAgICByZXR1cm4gewogICAgICAgIGluZGljZXMsCiAgICAgICAgbWV0YUNoYXIsCiAgICAgICAgbWF4QmluTnVtYmVyLAogICAgICAgIG1heFJlZkxlbmd0aCwKICAgICAgICBza2lwTGluZXMsCiAgICAgICAgZmlyc3REYXRhTGluZSwKICAgICAgICBjb2x1bW5OdW1iZXJzLAogICAgICAgIGNvb3JkaW5hdGVUeXBlLAogICAgICAgIGZvcm1hdCwKICAgICAgICByZWZJZFRvTmFtZSwKICAgICAgICByZWZOYW1lVG9JZCwKICAgICAgICBtYXhCbG9ja1NpemU6IDEgPDwgMTYKICAgICAgfTsKICAgIH0KICAgIHBhcnNlUHNldWRvQmluKGJ5dGVzLCBvZmZzZXQpIHsKICAgICAgY29uc3QgbGluZUNvdW50ID0gbG9uZ1RvTnVtYmVyKGxvbmcuZnJvbUJ5dGVzTEUoYnl0ZXMuc2xpY2Uob2Zmc2V0ICsgMTYsIG9mZnNldCArIDI0KSwgdHJ1ZSkpOwogICAgICByZXR1cm4geyBsaW5lQ291bnQgfTsKICAgIH0KICAgIF9wYXJzZU5hbWVCeXRlcyhuYW1lc0J5dGVzKSB7CiAgICAgIGxldCBjdXJyUmVmSWQgPSAwOwogICAgICBsZXQgY3Vyck5hbWVTdGFydCA9IDA7CiAgICAgIGNvbnN0IHJlZklkVG9OYW1lID0gW107CiAgICAgIGNvbnN0IHJlZk5hbWVUb0lkID0ge307CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBuYW1lc0J5dGVzLmxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgIGlmICghbmFtZXNCeXRlc1tpMl0pIHsKICAgICAgICAgIGlmIChjdXJyTmFtZVN0YXJ0IDwgaTIpIHsKICAgICAgICAgICAgbGV0IHJlZk5hbWUgPSBuYW1lc0J5dGVzLnRvU3RyaW5nKCJ1dGY4IiwgY3Vyck5hbWVTdGFydCwgaTIpOwogICAgICAgICAgICByZWZOYW1lID0gdGhpcy5yZW5hbWVSZWZTZXEocmVmTmFtZSk7CiAgICAgICAgICAgIHJlZklkVG9OYW1lW2N1cnJSZWZJZF0gPSByZWZOYW1lOwogICAgICAgICAgICByZWZOYW1lVG9JZFtyZWZOYW1lXSA9IGN1cnJSZWZJZDsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJOYW1lU3RhcnQgPSBpMiArIDE7CiAgICAgICAgICBjdXJyUmVmSWQgKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsgcmVmTmFtZVRvSWQsIHJlZklkVG9OYW1lIH07CiAgICB9CiAgICBhc3luYyBibG9ja3NGb3JSYW5nZShyZWZOYW1lLCBtaW4sIG1heCwgb3B0cyA9IHt9KSB7CiAgICAgIGlmIChtaW4gPCAwKSB7CiAgICAgICAgbWluID0gMDsKICAgICAgfQogICAgICBjb25zdCBpbmRleERhdGEgPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpOwogICAgICBpZiAoIWluZGV4RGF0YSkgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICBjb25zdCByZWZJZCA9IGluZGV4RGF0YS5yZWZOYW1lVG9JZFtyZWZOYW1lXTsKICAgICAgY29uc3QgYmEgPSBpbmRleERhdGEuaW5kaWNlc1tyZWZJZF07CiAgICAgIGlmICghYmEpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgY29uc3QgbWluT2Zmc2V0ID0gYmEubGluZWFySW5kZXgubGVuZ3RoID8gYmEubGluZWFySW5kZXhbbWluID4+IFRBRF9MSURYX1NISUZUID49IGJhLmxpbmVhckluZGV4Lmxlbmd0aCA/IGJhLmxpbmVhckluZGV4Lmxlbmd0aCAtIDEgOiBtaW4gPj4gVEFEX0xJRFhfU0hJRlRdIDogbmV3IFZpcnR1YWxPZmZzZXQoMCwgMCk7CiAgICAgIGlmICghbWluT2Zmc2V0KSB7CiAgICAgICAgY29uc29sZS53YXJuKCJxdWVyeWluZyBvdXRzaWRlIG9mIHBvc3NpYmxlIHRhYml4IHJhbmdlIik7CiAgICAgIH0KICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdCaW5zID0gcmVnMmJpbnMobWluLCBtYXgpOwogICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgZm9yIChjb25zdCBbc3RhcnQsIGVuZF0gb2Ygb3ZlcmxhcHBpbmdCaW5zKSB7CiAgICAgICAgZm9yIChsZXQgYmluID0gc3RhcnQ7IGJpbiA8PSBlbmQ7IGJpbisrKSB7CiAgICAgICAgICBpZiAoYmEuYmluSW5kZXhbYmluXSkgewogICAgICAgICAgICBjb25zdCBiaW5DaHVua3MgPSBiYS5iaW5JbmRleFtiaW5dOwogICAgICAgICAgICBmb3IgKGxldCBjMiA9IDA7IGMyIDwgYmluQ2h1bmtzLmxlbmd0aDsgKytjMikgewogICAgICAgICAgICAgIGNodW5rcy5wdXNoKG5ldyBDaHVuayhiaW5DaHVua3NbYzJdLm1pbnYsIGJpbkNodW5rc1tjMl0ubWF4diwgYmluKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgbmludHYgPSBiYS5saW5lYXJJbmRleC5sZW5ndGg7CiAgICAgIGxldCBsb3dlc3QgPSBudWxsOwogICAgICBjb25zdCBtaW5MaW4gPSBNYXRoLm1pbihtaW4gPj4gMTQsIG5pbnR2IC0gMSk7CiAgICAgIGNvbnN0IG1heExpbiA9IE1hdGgubWluKG1heCA+PiAxNCwgbmludHYgLSAxKTsKICAgICAgZm9yIChsZXQgaTIgPSBtaW5MaW47IGkyIDw9IG1heExpbjsgKytpMikgewogICAgICAgIGNvbnN0IHZwID0gYmEubGluZWFySW5kZXhbaTJdOwogICAgICAgIGlmICh2cCkgewogICAgICAgICAgaWYgKCFsb3dlc3QgfHwgdnAuY29tcGFyZVRvKGxvd2VzdCkgPCAwKSB7CiAgICAgICAgICAgIGxvd2VzdCA9IHZwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb3B0aW1pemVDaHVua3MoY2h1bmtzLCBsb3dlc3QpOwogICAgfQogIH0KICBjb25zdCBDU0kxX01BR0lDID0gMjE1ODI2NTk7CiAgY29uc3QgQ1NJMl9NQUdJQyA9IDM4MzU5ODc1OwogIGZ1bmN0aW9uIGxzaGlmdChudW0sIGJpdHMpIHsKICAgIHJldHVybiBudW0gKiAyICoqIGJpdHM7CiAgfQogIGZ1bmN0aW9uIHJzaGlmdChudW0sIGJpdHMpIHsKICAgIHJldHVybiBNYXRoLmZsb29yKG51bSAvIDIgKiogYml0cyk7CiAgfQogIGNsYXNzIENTSSBleHRlbmRzIEluZGV4RmlsZSB7CiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7CiAgICAgIHN1cGVyKGFyZ3MpOwogICAgICB0aGlzLm1heEJpbk51bWJlciA9IDA7CiAgICAgIHRoaXMuZGVwdGggPSAwOwogICAgICB0aGlzLm1pblNoaWZ0ID0gMDsKICAgIH0KICAgIGFzeW5jIGxpbmVDb3VudChyZWZOYW1lLCBvcHRzID0ge30pIHsKICAgICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5wYXJzZShvcHRzKTsKICAgICAgaWYgKCFpbmRleERhdGEpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgY29uc3QgcmVmSWQgPSBpbmRleERhdGEucmVmTmFtZVRvSWRbcmVmTmFtZV07CiAgICAgIGNvbnN0IGlkeCA9IGluZGV4RGF0YS5pbmRpY2VzW3JlZklkXTsKICAgICAgaWYgKCFpZHgpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgY29uc3QgeyBzdGF0cyB9ID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdOwogICAgICBpZiAoc3RhdHMpIHsKICAgICAgICByZXR1cm4gc3RhdHMubGluZUNvdW50OwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGFzeW5jIGluZGV4Q292KCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkNTSSBpbmRleGVzIGRvIG5vdCBzdXBwb3J0IGluZGV4Y292Iik7CiAgICB9CiAgICBwYXJzZUF1eERhdGEoYnl0ZXMsIG9mZnNldCkgewogICAgICBjb25zdCBmb3JtYXRGbGFncyA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCk7CiAgICAgIGNvbnN0IGNvb3JkaW5hdGVUeXBlID0gZm9ybWF0RmxhZ3MgJiA2NTUzNiA/ICJ6ZXJvLWJhc2VkLWhhbGYtb3BlbiIgOiAiMS1iYXNlZC1jbG9zZWQiOwogICAgICBjb25zdCBmb3JtYXQgPSB7IDA6ICJnZW5lcmljIiwgMTogIlNBTSIsIDI6ICJWQ0YiIH1bZm9ybWF0RmxhZ3MgJiAxNV07CiAgICAgIGlmICghZm9ybWF0KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIFRhYml4IHByZXNldCBmb3JtYXQgZmxhZ3MgJHtmb3JtYXRGbGFnc31gKTsKICAgICAgfQogICAgICBjb25zdCBjb2x1bW5OdW1iZXJzID0gewogICAgICAgIHJlZjogYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgNCksCiAgICAgICAgc3RhcnQ6IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDgpLAogICAgICAgIGVuZDogYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgMTIpCiAgICAgIH07CiAgICAgIGNvbnN0IG1ldGFWYWx1ZSA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDE2KTsKICAgICAgY29uc3QgbWV0YUNoYXIgPSBtZXRhVmFsdWUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKG1ldGFWYWx1ZSkgOiBudWxsOwogICAgICBjb25zdCBza2lwTGluZXMgPSBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQgKyAyMCk7CiAgICAgIGNvbnN0IG5hbWVTZWN0aW9uTGVuZ3RoID0gYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgMjQpOwogICAgICBjb25zdCB7IHJlZklkVG9OYW1lLCByZWZOYW1lVG9JZCB9ID0gdGhpcy5fcGFyc2VOYW1lQnl0ZXMoYnl0ZXMuc2xpY2Uob2Zmc2V0ICsgMjgsIG9mZnNldCArIDI4ICsgbmFtZVNlY3Rpb25MZW5ndGgpKTsKICAgICAgcmV0dXJuIHsKICAgICAgICByZWZJZFRvTmFtZSwKICAgICAgICByZWZOYW1lVG9JZCwKICAgICAgICBza2lwTGluZXMsCiAgICAgICAgbWV0YUNoYXIsCiAgICAgICAgY29sdW1uTnVtYmVycywKICAgICAgICBmb3JtYXQsCiAgICAgICAgY29vcmRpbmF0ZVR5cGUKICAgICAgfTsKICAgIH0KICAgIF9wYXJzZU5hbWVCeXRlcyhuYW1lc0J5dGVzKSB7CiAgICAgIGxldCBjdXJyUmVmSWQgPSAwOwogICAgICBsZXQgY3Vyck5hbWVTdGFydCA9IDA7CiAgICAgIGNvbnN0IHJlZklkVG9OYW1lID0gW107CiAgICAgIGNvbnN0IHJlZk5hbWVUb0lkID0ge307CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBuYW1lc0J5dGVzLmxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgIGlmICghbmFtZXNCeXRlc1tpMl0pIHsKICAgICAgICAgIGlmIChjdXJyTmFtZVN0YXJ0IDwgaTIpIHsKICAgICAgICAgICAgbGV0IHJlZk5hbWUgPSBuYW1lc0J5dGVzLnRvU3RyaW5nKCJ1dGY4IiwgY3Vyck5hbWVTdGFydCwgaTIpOwogICAgICAgICAgICByZWZOYW1lID0gdGhpcy5yZW5hbWVSZWZTZXEocmVmTmFtZSk7CiAgICAgICAgICAgIHJlZklkVG9OYW1lW2N1cnJSZWZJZF0gPSByZWZOYW1lOwogICAgICAgICAgICByZWZOYW1lVG9JZFtyZWZOYW1lXSA9IGN1cnJSZWZJZDsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJOYW1lU3RhcnQgPSBpMiArIDE7CiAgICAgICAgICBjdXJyUmVmSWQgKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsgcmVmTmFtZVRvSWQsIHJlZklkVG9OYW1lIH07CiAgICB9CiAgICBhc3luYyBfcGFyc2Uob3B0cyA9IHt9KSB7CiAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgdW56aXAoYXdhaXQgdGhpcy5maWxlaGFuZGxlLnJlYWRGaWxlKG9wdHMpKTsKICAgICAgbGV0IGNzaVZlcnNpb247CiAgICAgIGlmIChieXRlcy5yZWFkVUludDMyTEUoMCkgPT09IENTSTFfTUFHSUMpIHsKICAgICAgICBjc2lWZXJzaW9uID0gMTsKICAgICAgfSBlbHNlIGlmIChieXRlcy5yZWFkVUludDMyTEUoMCkgPT09IENTSTJfTUFHSUMpIHsKICAgICAgICBjc2lWZXJzaW9uID0gMjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBhIENTSSBmaWxlIik7CiAgICAgIH0KICAgICAgdGhpcy5taW5TaGlmdCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDQpOwogICAgICB0aGlzLmRlcHRoID0gYnl0ZXMucmVhZEludDMyTEUoOCk7CiAgICAgIHRoaXMubWF4QmluTnVtYmVyID0gKCgxIDw8ICh0aGlzLmRlcHRoICsgMSkgKiAzKSAtIDEpIC8gNzsKICAgICAgY29uc3QgbWF4UmVmTGVuZ3RoID0gMiAqKiAodGhpcy5taW5TaGlmdCArIHRoaXMuZGVwdGggKiAzKTsKICAgICAgY29uc3QgYXV4TGVuZ3RoID0gYnl0ZXMucmVhZEludDMyTEUoMTIpOwogICAgICBjb25zdCBhdXggPSBhdXhMZW5ndGggJiYgYXV4TGVuZ3RoID49IDMwID8gdGhpcy5wYXJzZUF1eERhdGEoYnl0ZXMsIDE2KSA6IHsKICAgICAgICByZWZJZFRvTmFtZTogW10sCiAgICAgICAgcmVmTmFtZVRvSWQ6IHt9LAogICAgICAgIG1ldGFDaGFyOiBudWxsLAogICAgICAgIGNvbHVtbk51bWJlcnM6IHsgcmVmOiAwLCBzdGFydDogMSwgZW5kOiAyIH0sCiAgICAgICAgY29vcmRpbmF0ZVR5cGU6ICJ6ZXJvLWJhc2VkLWhhbGYtb3BlbiIsCiAgICAgICAgZm9ybWF0OiAiZ2VuZXJpYyIKICAgICAgfTsKICAgICAgY29uc3QgcmVmQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRSgxNiArIGF1eExlbmd0aCk7CiAgICAgIGxldCBmaXJzdERhdGFMaW5lOwogICAgICBsZXQgY3Vyck9mZnNldCA9IDE2ICsgYXV4TGVuZ3RoICsgNDsKICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBBcnJheShyZWZDb3VudCkuZmlsbCgwKS5tYXAoKCkgPT4gewogICAgICAgIGNvbnN0IGJpbkNvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoY3Vyck9mZnNldCk7CiAgICAgICAgY3Vyck9mZnNldCArPSA0OwogICAgICAgIGNvbnN0IGJpbkluZGV4ID0ge307CiAgICAgICAgbGV0IHN0YXRzOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmluQ291bnQ7IGogKz0gMSkgewogICAgICAgICAgY29uc3QgYmluID0gYnl0ZXMucmVhZFVJbnQzMkxFKGN1cnJPZmZzZXQpOwogICAgICAgICAgaWYgKGJpbiA+IHRoaXMubWF4QmluTnVtYmVyKSB7CiAgICAgICAgICAgIHN0YXRzID0gdGhpcy5wYXJzZVBzZXVkb0JpbihieXRlcywgY3Vyck9mZnNldCArIDQpOwogICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDQgKyA4ICsgNCArIDE2ICsgMTY7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBsb2Zmc2V0ID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0ICsgNCk7CiAgICAgICAgICAgIGZpcnN0RGF0YUxpbmUgPSB0aGlzLl9maW5kRmlyc3REYXRhKGZpcnN0RGF0YUxpbmUsIGxvZmZzZXQpOwogICAgICAgICAgICBjb25zdCBjaHVua0NvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoY3Vyck9mZnNldCArIDEyKTsKICAgICAgICAgICAgY3Vyck9mZnNldCArPSAxNjsKICAgICAgICAgICAgY29uc3QgY2h1bmtzID0gbmV3IEFycmF5KGNodW5rQ291bnQpOwogICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNodW5rQ291bnQ7IGsgKz0gMSkgewogICAgICAgICAgICAgIGNvbnN0IHUgPSBmcm9tQnl0ZXMoYnl0ZXMsIGN1cnJPZmZzZXQpOwogICAgICAgICAgICAgIGNvbnN0IHYgPSBmcm9tQnl0ZXMoYnl0ZXMsIGN1cnJPZmZzZXQgKyA4KTsKICAgICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDE2OwogICAgICAgICAgICAgIGNodW5rc1trXSA9IG5ldyBDaHVuayh1LCB2LCBiaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJpbkluZGV4W2Jpbl0gPSBjaHVua3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGJpbkluZGV4LCBzdGF0cyB9OwogICAgICB9KTsKICAgICAgcmV0dXJuIHsKICAgICAgICAuLi5hdXgsCiAgICAgICAgY3NpOiB0cnVlLAogICAgICAgIHJlZkNvdW50LAogICAgICAgIG1heEJsb2NrU2l6ZTogMSA8PCAxNiwKICAgICAgICBmaXJzdERhdGFMaW5lLAogICAgICAgIGNzaVZlcnNpb24sCiAgICAgICAgaW5kaWNlcywKICAgICAgICBkZXB0aDogdGhpcy5kZXB0aCwKICAgICAgICBtYXhCaW5OdW1iZXI6IHRoaXMubWF4QmluTnVtYmVyLAogICAgICAgIG1heFJlZkxlbmd0aAogICAgICB9OwogICAgfQogICAgcGFyc2VQc2V1ZG9CaW4oYnl0ZXMsIG9mZnNldCkgewogICAgICBjb25zdCBsaW5lQ291bnQgPSBsb25nVG9OdW1iZXIobG9uZy5mcm9tQnl0ZXNMRShieXRlcy5zbGljZShvZmZzZXQgKyAyOCwgb2Zmc2V0ICsgMzYpLCB0cnVlKSk7CiAgICAgIHJldHVybiB7IGxpbmVDb3VudCB9OwogICAgfQogICAgYXN5bmMgYmxvY2tzRm9yUmFuZ2UocmVmTmFtZSwgbWluLCBtYXgsIG9wdHMgPSB7fSkgewogICAgICBpZiAobWluIDwgMCkgewogICAgICAgIG1pbiA9IDA7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5wYXJzZShvcHRzKTsKICAgICAgaWYgKCFpbmRleERhdGEpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgY29uc3QgcmVmSWQgPSBpbmRleERhdGEucmVmTmFtZVRvSWRbcmVmTmFtZV07CiAgICAgIGNvbnN0IGJhID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdOwogICAgICBpZiAoIWJhKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQmlucyA9IHRoaXMucmVnMmJpbnMobWluLCBtYXgpOwogICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgZm9yIChjb25zdCBbc3RhcnQsIGVuZF0gb2Ygb3ZlcmxhcHBpbmdCaW5zKSB7CiAgICAgICAgZm9yIChsZXQgYmluID0gc3RhcnQ7IGJpbiA8PSBlbmQ7IGJpbisrKSB7CiAgICAgICAgICBpZiAoYmEuYmluSW5kZXhbYmluXSkgewogICAgICAgICAgICBjb25zdCBiaW5DaHVua3MgPSBiYS5iaW5JbmRleFtiaW5dOwogICAgICAgICAgICBmb3IgKGxldCBjMiA9IDA7IGMyIDwgYmluQ2h1bmtzLmxlbmd0aDsgKytjMikgewogICAgICAgICAgICAgIGNodW5rcy5wdXNoKG5ldyBDaHVuayhiaW5DaHVua3NbYzJdLm1pbnYsIGJpbkNodW5rc1tjMl0ubWF4diwgYmluKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGltaXplQ2h1bmtzKGNodW5rcywgbmV3IFZpcnR1YWxPZmZzZXQoMCwgMCkpOwogICAgfQogICAgcmVnMmJpbnMoYmVnLCBlbmQpIHsKICAgICAgYmVnIC09IDE7CiAgICAgIGlmIChiZWcgPCAxKSB7CiAgICAgICAgYmVnID0gMTsKICAgICAgfQogICAgICBpZiAoZW5kID4gMiAqKiA1MCkgewogICAgICAgIGVuZCA9IDIgKiogMzQ7CiAgICAgIH0KICAgICAgZW5kIC09IDE7CiAgICAgIGxldCBsID0gMDsKICAgICAgbGV0IHQgPSAwOwogICAgICBsZXQgcyA9IHRoaXMubWluU2hpZnQgKyB0aGlzLmRlcHRoICogMzsKICAgICAgY29uc3QgYmlucyA9IFtdOwogICAgICBmb3IgKDsgbCA8PSB0aGlzLmRlcHRoOyBzIC09IDMsIHQgKz0gbHNoaWZ0KDEsIGwgKiAzKSwgbCArPSAxKSB7CiAgICAgICAgY29uc3QgYiA9IHQgKyByc2hpZnQoYmVnLCBzKTsKICAgICAgICBjb25zdCBlID0gdCArIHJzaGlmdChlbmQsIHMpOwogICAgICAgIGlmIChlIC0gYiArIGJpbnMubGVuZ3RoID4gdGhpcy5tYXhCaW5OdW1iZXIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnkgJHtiZWd9LSR7ZW5kfSBpcyB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgYmlubmluZyBzY2hlbWUgKHNoaWZ0ICR7dGhpcy5taW5TaGlmdH0sIGRlcHRoICR7dGhpcy5kZXB0aH0pLCB0cnkgYSBzbWFsbGVyIHF1ZXJ5IG9yIGEgY29hcnNlciBpbmRleCBiaW5uaW5nIHNjaGVtZWApOwogICAgICAgIH0KICAgICAgICBiaW5zLnB1c2goW2IsIGVdKTsKICAgICAgfQogICAgICByZXR1cm4gYmluczsKICAgIH0KICB9CiAgY29uc3QgZGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoInV0Zi04IikgOiB2b2lkIDA7CiAgZnVuY3Rpb24gdGltZW91dCh0aW1lKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZSkpOwogIH0KICBjbGFzcyBUYWJpeEluZGV4ZWRGaWxlIHsKICAgIGNvbnN0cnVjdG9yKHsgcGF0aCwgZmlsZWhhbmRsZSwgdGJpUGF0aCwgdGJpRmlsZWhhbmRsZSwgY3NpUGF0aCwgY3NpRmlsZWhhbmRsZSwgeWllbGRUaW1lID0gNTAwLCBjaHVua1NpemVMaW1pdCA9IDVlNywgcmVuYW1lUmVmU2VxcyA9IChuKSA9PiBuLCBjaHVua0NhY2hlU2l6ZSA9IDUgKiAyICoqIDIwIH0pIHsKICAgICAgaWYgKGZpbGVoYW5kbGUpIHsKICAgICAgICB0aGlzLmZpbGVoYW5kbGUgPSBmaWxlaGFuZGxlOwogICAgICB9IGVsc2UgaWYgKHBhdGgpIHsKICAgICAgICB0aGlzLmZpbGVoYW5kbGUgPSBuZXcgTG9jYWxGaWxlKHBhdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIm11c3QgcHJvdmlkZSBlaXRoZXIgZmlsZWhhbmRsZSBvciBwYXRoIik7CiAgICAgIH0KICAgICAgaWYgKHRiaUZpbGVoYW5kbGUpIHsKICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRhYml4SW5kZXgoewogICAgICAgICAgZmlsZWhhbmRsZTogdGJpRmlsZWhhbmRsZSwKICAgICAgICAgIHJlbmFtZVJlZlNlcXMKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChjc2lGaWxlaGFuZGxlKSB7CiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBDU0koewogICAgICAgICAgZmlsZWhhbmRsZTogY3NpRmlsZWhhbmRsZSwKICAgICAgICAgIHJlbmFtZVJlZlNlcXMKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh0YmlQYXRoKSB7CiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBUYWJpeEluZGV4KHsKICAgICAgICAgIGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUodGJpUGF0aCksCiAgICAgICAgICByZW5hbWVSZWZTZXFzCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAoY3NpUGF0aCkgewogICAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsKICAgICAgICAgIGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoY3NpUGF0aCksCiAgICAgICAgICByZW5hbWVSZWZTZXFzCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAocGF0aCkgewogICAgICAgIHRoaXMuaW5kZXggPSBuZXcgVGFiaXhJbmRleCh7CiAgICAgICAgICBmaWxlaGFuZGxlOiBuZXcgTG9jYWxGaWxlKGAke3BhdGh9LnRiaWApLAogICAgICAgICAgcmVuYW1lUmVmU2VxcwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIm11c3QgcHJvdmlkZSBvbmUgb2YgdGJpRmlsZWhhbmRsZSwgdGJpUGF0aCwgY3NpRmlsZWhhbmRsZSwgb3IgY3NpUGF0aCIpOwogICAgICB9CiAgICAgIHRoaXMuY2h1bmtTaXplTGltaXQgPSBjaHVua1NpemVMaW1pdDsKICAgICAgdGhpcy5yZW5hbWVSZWZTZXEgPSByZW5hbWVSZWZTZXFzOwogICAgICB0aGlzLnlpZWxkVGltZSA9IHlpZWxkVGltZTsKICAgICAgdGhpcy5jaHVua0NhY2hlID0gbmV3IF9kZWZhdWx0KHsKICAgICAgICBjYWNoZTogbmV3IHF1aWNrTHJ1KHsgbWF4U2l6ZTogTWF0aC5mbG9vcihjaHVua0NhY2hlU2l6ZSAvICgxIDw8IDE2KSkgfSksCiAgICAgICAgZmlsbDogKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5yZWFkQ2h1bmsoYXJncywgeyBzaWduYWwgfSkKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBnZXRMaW5lcyhyZWZOYW1lLCBzdGFydCwgZW5kLCBvcHRzKSB7CiAgICAgIGxldCBzaWduYWw7CiAgICAgIGxldCBvcHRpb25zID0ge307CiAgICAgIGxldCBjYWxsYmFjazsKICAgICAgaWYgKHR5cGVvZiBvcHRzID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImxpbmUgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZCIpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGNhbGxiYWNrID0gb3B0czsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcHRpb25zID0gb3B0czsKICAgICAgICBjYWxsYmFjayA9IG9wdHMubGluZUNhbGxiYWNrOwogICAgICB9CiAgICAgIGlmIChyZWZOYW1lID09PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJtdXN0IHByb3ZpZGUgYSByZWZlcmVuY2Ugc2VxdWVuY2UgbmFtZSIpOwogICAgICB9CiAgICAgIGlmICghY2FsbGJhY2spIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJsaW5lIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQiKTsKICAgICAgfQogICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMuaW5kZXguZ2V0TWV0YWRhdGEob3B0aW9ucyk7CiAgICAgIGNoZWNrQWJvcnRTaWduYWwoc2lnbmFsKTsKICAgICAgaWYgKCFzdGFydCkgewogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfQogICAgICBpZiAoIWVuZCkgewogICAgICAgIGVuZCA9IG1ldGFkYXRhLm1heFJlZkxlbmd0aDsKICAgICAgfQogICAgICBpZiAoIShzdGFydCA8PSBlbmQpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdGFydCBhbmQgZW5kIGNvb3JkaW5hdGVzLiBzdGFydCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQiKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPT09IGVuZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjaHVua3MgPSBhd2FpdCB0aGlzLmluZGV4LmJsb2Nrc0ZvclJhbmdlKHJlZk5hbWUsIHN0YXJ0LCBlbmQsIG9wdGlvbnMpOwogICAgICBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbCk7CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBjaHVua3MubGVuZ3RoOyBpMiArPSAxKSB7CiAgICAgICAgY29uc3Qgc2l6ZSA9IGNodW5rc1tpMl0uZmV0Y2hlZFNpemUoKTsKICAgICAgICBpZiAoc2l6ZSA+IHRoaXMuY2h1bmtTaXplTGltaXQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vIG11Y2ggZGF0YS4gQ2h1bmsgc2l6ZSAke3NpemUudG9Mb2NhbGVTdHJpbmcoKX0gYnl0ZXMgZXhjZWVkcyBjaHVua1NpemVMaW1pdCBvZiAke3RoaXMuY2h1bmtTaXplTGltaXQudG9Mb2NhbGVTdHJpbmcoKX0uYCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBsYXN0ID0gRGF0ZS5ub3coKTsKICAgICAgZm9yIChsZXQgY2h1bmtOdW0gPSAwOyBjaHVua051bSA8IGNodW5rcy5sZW5ndGg7IGNodW5rTnVtICs9IDEpIHsKICAgICAgICBsZXQgcHJldmlvdXNTdGFydENvb3JkaW5hdGU7CiAgICAgICAgY29uc3QgYzIgPSBjaHVua3NbY2h1bmtOdW1dOwogICAgICAgIGNvbnN0IHsgYnVmZmVyOiBidWZmZXIyLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zIH0gPSBhd2FpdCB0aGlzLmNodW5rQ2FjaGUuZ2V0KGMyLnRvU3RyaW5nKCksIGMyKTsKICAgICAgICBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbCk7CiAgICAgICAgbGV0IGJsb2NrU3RhcnQgPSAwOwogICAgICAgIGxldCBwb3MgPSAwOwogICAgICAgIHdoaWxlIChibG9ja1N0YXJ0IDwgYnVmZmVyMi5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IG4gPSBidWZmZXIyLmluZGV4T2YoIlxuIiwgYmxvY2tTdGFydCk7CiAgICAgICAgICBpZiAobiA9PT0gLTEpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBiID0gYnVmZmVyMi5zbGljZShibG9ja1N0YXJ0LCBuKTsKICAgICAgICAgIGNvbnN0IGxpbmUgPSAoZGVjb2RlciA9PT0gbnVsbCB8fCBkZWNvZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWNvZGVyLmRlY29kZShiKSkgfHwgYi50b1N0cmluZygpOwogICAgICAgICAgaWYgKGRwb3NpdGlvbnMpIHsKICAgICAgICAgICAgd2hpbGUgKGJsb2NrU3RhcnQgKyBjMi5taW52LmRhdGFQb3NpdGlvbiA+PSBkcG9zaXRpb25zW3BvcysrXSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvcy0tOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgeyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzIH0gPSB0aGlzLmNoZWNrTGluZShtZXRhZGF0YSwgcmVmTmFtZSwgc3RhcnQsIGVuZCwgbGluZSk7CiAgICAgICAgICBpZiAocHJldmlvdXNTdGFydENvb3JkaW5hdGUgIT09IHZvaWQgMCAmJiBzdGFydENvb3JkaW5hdGUgIT09IHZvaWQgMCAmJiBwcmV2aW91c1N0YXJ0Q29vcmRpbmF0ZSA+IHN0YXJ0Q29vcmRpbmF0ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmVzIG5vdCBzb3J0ZWQgYnkgc3RhcnQgY29vcmRpbmF0ZSAoJHtwcmV2aW91c1N0YXJ0Q29vcmRpbmF0ZX0gPiAke3N0YXJ0Q29vcmRpbmF0ZX0pLCB0aGlzIGZpbGUgaXMgbm90IHVzYWJsZSB3aXRoIFRhYml4LmApOwogICAgICAgICAgfQogICAgICAgICAgcHJldmlvdXNTdGFydENvb3JkaW5hdGUgPSBzdGFydENvb3JkaW5hdGU7CiAgICAgICAgICBpZiAob3ZlcmxhcHMpIHsKICAgICAgICAgICAgY2FsbGJhY2soCiAgICAgICAgICAgICAgbGluZS50cmltKCksCiAgICAgICAgICAgICAgY3Bvc2l0aW9uc1twb3NdICogKDEgPDwgOCkgKyAoYmxvY2tTdGFydCAtIGRwb3NpdGlvbnNbcG9zXSkgKyBjMi5taW52LmRhdGFQb3NpdGlvbiArIDEKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRDb29yZGluYXRlICE9PSB2b2lkIDAgJiYgc3RhcnRDb29yZGluYXRlID49IGVuZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy55aWVsZFRpbWUgJiYgbGFzdCAtIERhdGUubm93KCkgPiB0aGlzLnlpZWxkVGltZSkgewogICAgICAgICAgICBsYXN0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY2hlY2tBYm9ydFNpZ25hbChzaWduYWwpOwogICAgICAgICAgICBhd2FpdCB0aW1lb3V0KDEpOwogICAgICAgICAgfQogICAgICAgICAgYmxvY2tTdGFydCA9IG4gKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgZ2V0TWV0YWRhdGEob3B0cyA9IHt9KSB7CiAgICAgIHJldHVybiB0aGlzLmluZGV4LmdldE1ldGFkYXRhKG9wdHMpOwogICAgfQogICAgYXN5bmMgZ2V0SGVhZGVyQnVmZmVyKG9wdHMgPSB7fSkgewogICAgICBjb25zdCB7IGZpcnN0RGF0YUxpbmUsIG1ldGFDaGFyLCBtYXhCbG9ja1NpemUgfSA9IGF3YWl0IHRoaXMuZ2V0TWV0YWRhdGEob3B0cyk7CiAgICAgIGNoZWNrQWJvcnRTaWduYWwob3B0cy5zaWduYWwpOwogICAgICBjb25zdCBtYXhGZXRjaCA9ICgoZmlyc3REYXRhTGluZSA9PT0gbnVsbCB8fCBmaXJzdERhdGFMaW5lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaXJzdERhdGFMaW5lLmJsb2NrUG9zaXRpb24pIHx8IDApICsgbWF4QmxvY2tTaXplOwogICAgICBsZXQgYnl0ZXMgPSBhd2FpdCB0aGlzLl9yZWFkUmVnaW9uKDAsIG1heEZldGNoLCBvcHRzKTsKICAgICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbCk7CiAgICAgIHRyeSB7CiAgICAgICAgYnl0ZXMgPSBhd2FpdCB1bnppcChieXRlcyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgIGBlcnJvciBkZWNvbXByZXNzaW5nIGJsb2NrICR7ZS5jb2RlfSBhdCAwIChsZW5ndGggJHttYXhGZXRjaH0pICR7ZX1gCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAobWV0YUNoYXIpIHsKICAgICAgICBsZXQgbGFzdE5ld2xpbmUgPSAtMTsKICAgICAgICBjb25zdCBuZXdsaW5lQnl0ZSA9ICJcbiIuY2hhckNvZGVBdCgwKTsKICAgICAgICBjb25zdCBtZXRhQnl0ZSA9IG1ldGFDaGFyLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGJ5dGVzLmxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgICAgaWYgKGkyID09PSBsYXN0TmV3bGluZSArIDEgJiYgYnl0ZXNbaTJdICE9PSBtZXRhQnl0ZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChieXRlc1tpMl0gPT09IG5ld2xpbmVCeXRlKSB7CiAgICAgICAgICAgIGxhc3ROZXdsaW5lID0gaTI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ5dGVzID0gYnl0ZXMuc2xpY2UoMCwgbGFzdE5ld2xpbmUgKyAxKTsKICAgICAgfQogICAgICByZXR1cm4gYnl0ZXM7CiAgICB9CiAgICBhc3luYyBnZXRIZWFkZXIob3B0cyA9IHt9KSB7CiAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgdGhpcy5nZXRIZWFkZXJCdWZmZXIob3B0cyk7CiAgICAgIHJldHVybiBieXRlcy50b1N0cmluZygidXRmOCIpOwogICAgfQogICAgYXN5bmMgZ2V0UmVmZXJlbmNlU2VxdWVuY2VOYW1lcyhvcHRzID0ge30pIHsKICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLmdldE1ldGFkYXRhKG9wdHMpOwogICAgICByZXR1cm4gbWV0YWRhdGEucmVmSWRUb05hbWU7CiAgICB9CiAgICBjaGVja0xpbmUobWV0YWRhdGEsIHJlZ2lvblJlZk5hbWUsIHJlZ2lvblN0YXJ0LCByZWdpb25FbmQsIGxpbmUpIHsKICAgICAgY29uc3QgeyBjb2x1bW5OdW1iZXJzLCBtZXRhQ2hhciwgY29vcmRpbmF0ZVR5cGUsIGZvcm1hdCB9ID0gbWV0YWRhdGE7CiAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gbWV0YUNoYXIpIHsKICAgICAgICByZXR1cm4geyBvdmVybGFwczogZmFsc2UgfTsKICAgICAgfQogICAgICBsZXQgeyByZWYsIHN0YXJ0LCBlbmQgfSA9IGNvbHVtbk51bWJlcnM7CiAgICAgIGlmICghcmVmKSB7CiAgICAgICAgcmVmID0gMDsKICAgICAgfQogICAgICBpZiAoIXN0YXJ0KSB7CiAgICAgICAgc3RhcnQgPSAwOwogICAgICB9CiAgICAgIGlmICghZW5kKSB7CiAgICAgICAgZW5kID0gMDsKICAgICAgfQogICAgICBpZiAoZm9ybWF0ID09PSAiVkNGIikgewogICAgICAgIGVuZCA9IDg7CiAgICAgIH0KICAgICAgY29uc3QgbWF4Q29sdW1uID0gTWF0aC5tYXgocmVmLCBzdGFydCwgZW5kKTsKICAgICAgbGV0IGN1cnJlbnRDb2x1bW5OdW1iZXIgPSAxOwogICAgICBsZXQgY3VycmVudENvbHVtblN0YXJ0ID0gMDsKICAgICAgbGV0IHJlZlNlcSA9ICIiOwogICAgICBsZXQgc3RhcnRDb29yZGluYXRlID0gLUluZmluaXR5OwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGluZS5sZW5ndGggKyAxOyBpMiArPSAxKSB7CiAgICAgICAgaWYgKGxpbmVbaTJdID09PSAiCSIgfHwgaTIgPT09IGxpbmUubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoY3VycmVudENvbHVtbk51bWJlciA9PT0gcmVmKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbmFtZVJlZlNlcShsaW5lLnNsaWNlKGN1cnJlbnRDb2x1bW5TdGFydCwgaTIpKSAhPT0gcmVnaW9uUmVmTmFtZSkgewogICAgICAgICAgICAgIHJldHVybiB7IG92ZXJsYXBzOiBmYWxzZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPT09IHN0YXJ0KSB7CiAgICAgICAgICAgIHN0YXJ0Q29vcmRpbmF0ZSA9IHBhcnNlSW50KGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpMiksIDEwKTsKICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVUeXBlID09PSAiMS1iYXNlZC1jbG9zZWQiKSB7CiAgICAgICAgICAgICAgc3RhcnRDb29yZGluYXRlIC09IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXJ0Q29vcmRpbmF0ZSA+PSByZWdpb25FbmQpIHsKICAgICAgICAgICAgICByZXR1cm4geyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzOiBmYWxzZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgPT09IDAgfHwgZW5kID09PSBzdGFydCkgewogICAgICAgICAgICAgIGlmIChzdGFydENvb3JkaW5hdGUgKyAxIDw9IHJlZ2lvblN0YXJ0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzOiBmYWxzZSB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICJWQ0YiICYmIGN1cnJlbnRDb2x1bW5OdW1iZXIgPT09IDQpIHsKICAgICAgICAgICAgcmVmU2VxID0gbGluZS5zbGljZShjdXJyZW50Q29sdW1uU3RhcnQsIGkyKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbHVtbk51bWJlciA9PT0gZW5kKSB7CiAgICAgICAgICAgIGxldCBlbmRDb29yZGluYXRlOwogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiVkNGIikgewogICAgICAgICAgICAgIGVuZENvb3JkaW5hdGUgPSB0aGlzLl9nZXRWY2ZFbmQoc3RhcnRDb29yZGluYXRlLCByZWZTZXEsIGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpMikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVuZENvb3JkaW5hdGUgPSBwYXJzZUludChsaW5lLnNsaWNlKGN1cnJlbnRDb2x1bW5TdGFydCwgaTIpLCAxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuZENvb3JkaW5hdGUgPD0gcmVnaW9uU3RhcnQpIHsKICAgICAgICAgICAgICByZXR1cm4geyBvdmVybGFwczogZmFsc2UgfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY3VycmVudENvbHVtblN0YXJ0ID0gaTIgKyAxOwogICAgICAgICAgY3VycmVudENvbHVtbk51bWJlciArPSAxOwogICAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPiBtYXhDb2x1bW4pIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IHN0YXJ0Q29vcmRpbmF0ZSwgb3ZlcmxhcHM6IHRydWUgfTsKICAgIH0KICAgIF9nZXRWY2ZFbmQoc3RhcnRDb29yZGluYXRlLCByZWZTZXEsIGluZm8pIHsKICAgICAgbGV0IGVuZENvb3JkaW5hdGUgPSBzdGFydENvb3JkaW5hdGUgKyByZWZTZXEubGVuZ3RoOwogICAgICBjb25zdCBpc1RSQSA9IGluZm8uaW5kZXhPZigiU1ZUWVBFPVRSQSIpICE9PSAtMTsKICAgICAgaWYgKGluZm9bMF0gIT09ICIuIiAmJiAhaXNUUkEpIHsKICAgICAgICBsZXQgcHJldkNoYXIgPSAiOyI7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmZvLmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICBpZiAocHJldkNoYXIgPT09ICI7IiAmJiBpbmZvLnNsaWNlKGosIGogKyA0KSA9PT0gIkVORD0iKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZUVuZCA9IGluZm8uaW5kZXhPZigiOyIsIGopOwogICAgICAgICAgICBpZiAodmFsdWVFbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgdmFsdWVFbmQgPSBpbmZvLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbmRDb29yZGluYXRlID0gcGFyc2VJbnQoaW5mby5zbGljZShqICsgNCwgdmFsdWVFbmQpLCAxMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcHJldkNoYXIgPSBpbmZvW2pdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc1RSQSkgewogICAgICAgIHJldHVybiBzdGFydENvb3JkaW5hdGUgKyAxOwogICAgICB9CiAgICAgIHJldHVybiBlbmRDb29yZGluYXRlOwogICAgfQogICAgYXN5bmMgbGluZUNvdW50KHJlZk5hbWUsIG9wdHMgPSB7fSkgewogICAgICByZXR1cm4gdGhpcy5pbmRleC5saW5lQ291bnQocmVmTmFtZSwgb3B0cyk7CiAgICB9CiAgICBhc3luYyBfcmVhZFJlZ2lvbihwb3MsIHNpemUsIG9wdHMgPSB7fSkgewogICAgICBjb25zdCBiID0gYnVmZmVyLkJ1ZmZlci5hbGxvYyhzaXplKTsKICAgICAgY29uc3QgeyBieXRlc1JlYWQsIGJ1ZmZlcjogYnVmZmVyJDEgfSA9IGF3YWl0IHRoaXMuZmlsZWhhbmRsZS5yZWFkKGIsIDAsIHNpemUsIHBvcywgb3B0cyk7CiAgICAgIHJldHVybiBidWZmZXIkMS5zbGljZSgwLCBieXRlc1JlYWQpOwogICAgfQogICAgYXN5bmMgcmVhZENodW5rKGMyLCBvcHRzID0ge30pIHsKICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX3JlYWRSZWdpb24oYzIubWludi5ibG9ja1Bvc2l0aW9uLCBjMi5mZXRjaGVkU2l6ZSgpLCBvcHRzKTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gdW56aXBDaHVua1NsaWNlKGRhdGEsIGMyKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IgZGVjb21wcmVzc2luZyBjICR7YzIudG9TdHJpbmcoKX0gJHtlfWApOwogICAgICB9CiAgICB9CiAgfQogIHZhciBFbWl0dGVyID0gcmVxdWlyZSQkMF9fZGVmYXVsdFsiZGVmYXVsdCJdOwogIGZ1bmN0aW9uIFN0cmVhbSgpIHsKICAgIEVtaXR0ZXIuY2FsbCh0aGlzKTsKICB9CiAgU3RyZWFtLnByb3RvdHlwZSA9IG5ldyBFbWl0dGVyKCk7CiAgdmFyIHN0cmVhbSA9IFN0cmVhbTsKICBTdHJlYW0uU3RyZWFtID0gU3RyZWFtOwogIFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIG9wdGlvbnMpIHsKICAgIHZhciBzb3VyY2UgPSB0aGlzOwogICAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7CiAgICAgIGlmIChkZXN0LndyaXRhYmxlKSB7CiAgICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHsKICAgICAgICAgIHNvdXJjZS5wYXVzZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc291cmNlLm9uKCJkYXRhIiwgb25kYXRhKTsKICAgIGZ1bmN0aW9uIG9uZHJhaW4oKSB7CiAgICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkgewogICAgICAgIHNvdXJjZS5yZXN1bWUoKTsKICAgICAgfQogICAgfQogICAgZGVzdC5vbigiZHJhaW4iLCBvbmRyYWluKTsKICAgIGlmICghZGVzdC5faXNTdGRpbyAmJiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5lbmQgIT09IGZhbHNlKSkgewogICAgICBzb3VyY2Uub24oImVuZCIsIG9uZW5kKTsKICAgICAgc291cmNlLm9uKCJjbG9zZSIsIG9uY2xvc2UpOwogICAgfQogICAgdmFyIGRpZE9uRW5kID0gZmFsc2U7CiAgICBmdW5jdGlvbiBvbmVuZCgpIHsKICAgICAgaWYgKGRpZE9uRW5kKQogICAgICAgIHJldHVybjsKICAgICAgZGlkT25FbmQgPSB0cnVlOwogICAgICBkZXN0LmVuZCgpOwogICAgfQogICAgZnVuY3Rpb24gb25jbG9zZSgpIHsKICAgICAgaWYgKGRpZE9uRW5kKQogICAgICAgIHJldHVybjsKICAgICAgZGlkT25FbmQgPSB0cnVlOwogICAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gImZ1bmN0aW9uIikKICAgICAgICBkZXN0LmRlc3Ryb3koKTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHsKICAgICAgY2xlYW51cCgpOwogICAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKCJlcnJvciIpKSB7CiAgICAgICAgdGhyb3cgZXI7CiAgICAgIH0KICAgIH0KICAgIHNvdXJjZS5vbigiZXJyb3IiLCBvbmVycm9yKTsKICAgIGRlc3Qub24oImVycm9yIiwgb25lcnJvcik7CiAgICBmdW5jdGlvbiBjbGVhbnVwKCkgewogICAgICBzb3VyY2Uub2ZmKCJkYXRhIiwgb25kYXRhKTsKICAgICAgZGVzdC5vZmYoImRyYWluIiwgb25kcmFpbik7CiAgICAgIHNvdXJjZS5vZmYoImVuZCIsIG9uZW5kKTsKICAgICAgc291cmNlLm9mZigiY2xvc2UiLCBvbmNsb3NlKTsKICAgICAgc291cmNlLm9mZigiZXJyb3IiLCBvbmVycm9yKTsKICAgICAgZGVzdC5vZmYoImVycm9yIiwgb25lcnJvcik7CiAgICAgIHNvdXJjZS5vZmYoImVuZCIsIGNsZWFudXApOwogICAgICBzb3VyY2Uub2ZmKCJjbG9zZSIsIGNsZWFudXApOwogICAgICBkZXN0Lm9mZigiZW5kIiwgY2xlYW51cCk7CiAgICAgIGRlc3Qub2ZmKCJjbG9zZSIsIGNsZWFudXApOwogICAgfQogICAgc291cmNlLm9uKCJlbmQiLCBjbGVhbnVwKTsKICAgIHNvdXJjZS5vbigiY2xvc2UiLCBjbGVhbnVwKTsKICAgIGRlc3Qub24oImVuZCIsIGNsZWFudXApOwogICAgZGVzdC5vbigiY2xvc2UiLCBjbGVhbnVwKTsKICAgIGRlc3QuZW1pdCgicGlwZSIsIHNvdXJjZSk7CiAgICByZXR1cm4gZGVzdDsKICB9OwogIHZhciBTdHJpbmdEZWNvZGVyXzE7CiAgdmFyIEJ1ZmZlciQxID0gYnVmZmVyLkJ1ZmZlcjsKICB2YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlciQxLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHsKICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkgewogICAgICBjYXNlICJoZXgiOgogICAgICBjYXNlICJ1dGY4IjoKICAgICAgY2FzZSAidXRmLTgiOgogICAgICBjYXNlICJhc2NpaSI6CiAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgIGNhc2UgInVjczIiOgogICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgIGNhc2UgInJhdyI6CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CiAgZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgfQogIH0KICB2YXIgU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXJfMSA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7CiAgICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgIiIpOwogICAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpOwogICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7CiAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInVjczIiOgogICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyOwogICAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7CiAgICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIkMSg2KTsKICAgIHRoaXMuY2hhclJlY2VpdmVkID0gMDsKICAgIHRoaXMuY2hhckxlbmd0aCA9IDA7CiAgfTsKICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcjIpIHsKICAgIHZhciBjaGFyU3RyID0gIiI7CiAgICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7CiAgICAgIHZhciBhdmFpbGFibGUgPSBidWZmZXIyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA/IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDogYnVmZmVyMi5sZW5ndGg7CiAgICAgIGJ1ZmZlcjIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpOwogICAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7CiAgICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBidWZmZXIyID0gYnVmZmVyMi5zbGljZShhdmFpbGFibGUsIGJ1ZmZlcjIubGVuZ3RoKTsKICAgICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpOwogICAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTsKICAgICAgaWYgKGNoYXJDb2RlID49IDU1Mjk2ICYmIGNoYXJDb2RlIDw9IDU2MzE5KSB7CiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTsKICAgICAgICBjaGFyU3RyID0gIiI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwOwogICAgICBpZiAoYnVmZmVyMi5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gY2hhclN0cjsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyMik7CiAgICB2YXIgZW5kID0gYnVmZmVyMi5sZW5ndGg7CiAgICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7CiAgICAgIGJ1ZmZlcjIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlcjIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7CiAgICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDsKICAgIH0KICAgIGNoYXJTdHIgKz0gYnVmZmVyMi50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpOwogICAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTsKICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpOwogICAgaWYgKGNoYXJDb2RlID49IDU1Mjk2ICYmIGNoYXJDb2RlIDw9IDU2MzE5KSB7CiAgICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplOwogICAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTsKICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTsKICAgICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTsKICAgICAgYnVmZmVyMi5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7CiAgICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpOwogICAgfQogICAgcmV0dXJuIGNoYXJTdHI7CiAgfTsKICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcjIpIHsKICAgIHZhciBpMiA9IGJ1ZmZlcjIubGVuZ3RoID49IDMgPyAzIDogYnVmZmVyMi5sZW5ndGg7CiAgICBmb3IgKDsgaTIgPiAwOyBpMi0tKSB7CiAgICAgIHZhciBjMiA9IGJ1ZmZlcjJbYnVmZmVyMi5sZW5ndGggLSBpMl07CiAgICAgIGlmIChpMiA9PSAxICYmIGMyID4+IDUgPT0gNikgewogICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGkyIDw9IDIgJiYgYzIgPj4gNCA9PSAxNCkgewogICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGkyIDw9IDMgJiYgYzIgPj4gMyA9PSAzMCkgewogICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY2hhclJlY2VpdmVkID0gaTI7CiAgfTsKICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIyKSB7CiAgICB2YXIgcmVzID0gIiI7CiAgICBpZiAoYnVmZmVyMiAmJiBidWZmZXIyLmxlbmd0aCkKICAgICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIyKTsKICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkgewogICAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDsKICAgICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjsKICAgICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7CiAgICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIyKSB7CiAgICByZXR1cm4gYnVmZmVyMi50b1N0cmluZyh0aGlzLmVuY29kaW5nKTsKICB9CiAgZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIyKSB7CiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlcjIubGVuZ3RoICUgMjsKICAgIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7CiAgfQogIGZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcjIpIHsKICAgIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyMi5sZW5ndGggJSAzOwogICAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDsKICB9CiAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nVmFsKSB7CiAgICByZXR1cm4gc3RyaW5nVmFsLnJlcGxhY2UoLyUoWzAtOUEtRmEtZl17Mn0pL2csIChfbWF0Y2gsIHNlcSkgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChzZXEsIDE2KSkpOwogIH0KICBmdW5jdGlvbiBfZXNjYXBlKHJlZ2V4LCBzKSB7CiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UocmVnZXgsIChjaCkgPT4gewogICAgICBjb25zdCBoZXggPSBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZFN0YXJ0KDIsICIwIik7CiAgICAgIHJldHVybiBgJSR7aGV4fWA7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZXNjYXBlKHJhd1ZhbCkgewogICAgcmV0dXJuIF9lc2NhcGUoL1tcbjtcclx0PSUmLFx4MDAtXHgxZlx4N2YtXHhmZl0vZywgcmF3VmFsKTsKICB9CiAgZnVuY3Rpb24gZXNjYXBlQ29sdW1uKHJhd1ZhbCkgewogICAgcmV0dXJuIF9lc2NhcGUoL1tcblxyXHQlXHgwMC1ceDFmXHg3Zi1ceGZmXS9nLCByYXdWYWwpOwogIH0KICBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMoYXR0clN0cmluZykgewogICAgaWYgKCEoYXR0clN0cmluZyAmJiBhdHRyU3RyaW5nLmxlbmd0aCkgfHwgYXR0clN0cmluZyA9PT0gIi4iKQogICAgICByZXR1cm4ge307CiAgICBjb25zdCBhdHRycyA9IHt9OwogICAgYXR0clN0cmluZy5yZXBsYWNlKC9ccj9cbiQvLCAiIikuc3BsaXQoIjsiKS5mb3JFYWNoKChhKSA9PiB7CiAgICAgIGNvbnN0IG52ID0gYS5zcGxpdCgiPSIsIDIpOwogICAgICBpZiAoIShudlsxXSAmJiBudlsxXS5sZW5ndGgpKQogICAgICAgIHJldHVybjsKICAgICAgbnZbMF0gPSBudlswXS50cmltKCk7CiAgICAgIGxldCBhcmVjID0gYXR0cnNbbnZbMF0udHJpbSgpXTsKICAgICAgaWYgKCFhcmVjKSB7CiAgICAgICAgYXJlYyA9IFtdOwogICAgICAgIGF0dHJzW252WzBdXSA9IGFyZWM7CiAgICAgIH0KICAgICAgYXJlYy5wdXNoKC4uLm52WzFdLnNwbGl0KCIsIikubWFwKChzKSA9PiBzLnRyaW0oKSkubWFwKHVuZXNjYXBlKSk7CiAgICB9KTsKICAgIHJldHVybiBhdHRyczsKICB9CiAgZnVuY3Rpb24gcGFyc2VGZWF0dXJlKGxpbmUpIHsKICAgIGNvbnN0IGYgPSBsaW5lLnNwbGl0KCIJIikubWFwKChhKSA9PiBhID09PSAiLiIgfHwgYSA9PT0gIiIgPyBudWxsIDogYSk7CiAgICBjb25zdCBwYXJzZWQgPSB7CiAgICAgIHNlcV9pZDogZlswXSAmJiB1bmVzY2FwZShmWzBdKSwKICAgICAgc291cmNlOiBmWzFdICYmIHVuZXNjYXBlKGZbMV0pLAogICAgICB0eXBlOiBmWzJdICYmIHVuZXNjYXBlKGZbMl0pLAogICAgICBzdGFydDogZlszXSA9PT0gbnVsbCA/IG51bGwgOiBwYXJzZUludChmWzNdLCAxMCksCiAgICAgIGVuZDogZls0XSA9PT0gbnVsbCA/IG51bGwgOiBwYXJzZUludChmWzRdLCAxMCksCiAgICAgIHNjb3JlOiBmWzVdID09PSBudWxsID8gbnVsbCA6IHBhcnNlRmxvYXQoZls1XSksCiAgICAgIHN0cmFuZDogZls2XSwKICAgICAgcGhhc2U6IGZbN10sCiAgICAgIGF0dHJpYnV0ZXM6IGZbOF0gPT09IG51bGwgPyBudWxsIDogcGFyc2VBdHRyaWJ1dGVzKGZbOF0pCiAgICB9OwogICAgcmV0dXJuIHBhcnNlZDsKICB9CiAgZnVuY3Rpb24gcGFyc2VEaXJlY3RpdmUobGluZSkgewogICAgY29uc3QgbWF0Y2ggPSAvXlxzKiMjXHMqKFxTKylccyooLiopLy5leGVjKGxpbmUpOwogICAgaWYgKCFtYXRjaCkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBbLCBuYW1lXSA9IG1hdGNoOwogICAgbGV0IFssICwgY29udGVudHNdID0gbWF0Y2g7CiAgICBjb25zdCBwYXJzZWQgPSB7IGRpcmVjdGl2ZTogbmFtZSB9OwogICAgaWYgKGNvbnRlbnRzLmxlbmd0aCkgewogICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoL1xyP1xuJC8sICIiKTsKICAgICAgcGFyc2VkLnZhbHVlID0gY29udGVudHM7CiAgICB9CiAgICBpZiAobmFtZSA9PT0gInNlcXVlbmNlLXJlZ2lvbiIpIHsKICAgICAgY29uc3QgYzIgPSBjb250ZW50cy5zcGxpdCgvXHMrLywgMyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgLi4ucGFyc2VkLAogICAgICAgIHNlcV9pZDogYzJbMF0sCiAgICAgICAgc3RhcnQ6IGMyWzFdICYmIGMyWzFdLnJlcGxhY2UoL1xEL2csICIiKSwKICAgICAgICBlbmQ6IGMyWzJdICYmIGMyWzJdLnJlcGxhY2UoL1xEL2csICIiKQogICAgICB9OwogICAgfSBlbHNlIGlmIChuYW1lID09PSAiZ2Vub21lLWJ1aWxkIikgewogICAgICBjb25zdCBbc291cmNlLCBidWlsZE5hbWVdID0gY29udGVudHMuc3BsaXQoL1xzKy8sIDIpOwogICAgICByZXR1cm4gewogICAgICAgIC4uLnBhcnNlZCwKICAgICAgICBzb3VyY2UsCiAgICAgICAgYnVpbGROYW1lCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gcGFyc2VkOwogIH0KICBmdW5jdGlvbiBmb3JtYXRBdHRyaWJ1dGVzKGF0dHJzKSB7CiAgICBjb25zdCBhdHRyT3JkZXIgPSBbXTsKICAgIE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbdGFnLCB2YWxdKSA9PiB7CiAgICAgIGlmICghdmFsKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IHZhbHN0cmluZzsKICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eSgidG9TdHJpbmciKSkgewogICAgICAgIHZhbHN0cmluZyA9IGVzY2FwZSh2YWwudG9TdHJpbmcoKSk7CiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgdmFsc3RyaW5nID0gdmFsLm1hcChlc2NhcGUpLmpvaW4oIiwiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWxzdHJpbmcgPSBlc2NhcGUodmFsKTsKICAgICAgfQogICAgICBhdHRyT3JkZXIucHVzaChgJHtlc2NhcGUodGFnKX09JHt2YWxzdHJpbmd9YCk7CiAgICB9KTsKICAgIHJldHVybiBhdHRyT3JkZXIubGVuZ3RoID8gYXR0ck9yZGVyLmpvaW4oIjsiKSA6ICIuIjsKICB9CiAgZnVuY3Rpb24gX2Zvcm1hdFNpbmdsZUZlYXR1cmUoZiwgc2VlbkZlYXR1cmUpIHsKICAgIGNvbnN0IGF0dHJTdHJpbmcgPSBmLmF0dHJpYnV0ZXMgPT09IG51bGwgfHwgZi5hdHRyaWJ1dGVzID09PSB2b2lkIDAgPyAiLiIgOiBmb3JtYXRBdHRyaWJ1dGVzKGYuYXR0cmlidXRlcyk7CiAgICBjb25zdCBmaWVsZHMgPSBbCiAgICAgIGYuc2VxX2lkID09PSBudWxsID8gIi4iIDogZXNjYXBlQ29sdW1uKGYuc2VxX2lkKSwKICAgICAgZi5zb3VyY2UgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi5zb3VyY2UpLAogICAgICBmLnR5cGUgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi50eXBlKSwKICAgICAgZi5zdGFydCA9PT0gbnVsbCA/ICIuIiA6IGVzY2FwZUNvbHVtbihmLnN0YXJ0KSwKICAgICAgZi5lbmQgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi5lbmQpLAogICAgICBmLnNjb3JlID09PSBudWxsID8gIi4iIDogZXNjYXBlQ29sdW1uKGYuc2NvcmUpLAogICAgICBmLnN0cmFuZCA9PT0gbnVsbCA/ICIuIiA6IGVzY2FwZUNvbHVtbihmLnN0cmFuZCksCiAgICAgIGYucGhhc2UgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi5waGFzZSksCiAgICAgIGF0dHJTdHJpbmcKICAgIF07CiAgICBjb25zdCBmb3JtYXR0ZWRTdHJpbmcgPSBgJHtmaWVsZHMuam9pbigiCSIpfQpgOwogICAgaWYgKHNlZW5GZWF0dXJlW2Zvcm1hdHRlZFN0cmluZ10pIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgc2VlbkZlYXR1cmVbZm9ybWF0dGVkU3RyaW5nXSA9IHRydWU7CiAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nOwogIH0KICBmdW5jdGlvbiBfZm9ybWF0RmVhdHVyZShmZWF0dXJlLCBzZWVuRmVhdHVyZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZSkpIHsKICAgICAgcmV0dXJuIGZlYXR1cmUubWFwKChmKSA9PiBfZm9ybWF0RmVhdHVyZShmLCBzZWVuRmVhdHVyZSkpLmpvaW4oIiIpOwogICAgfQogICAgY29uc3Qgc3RyaW5nczIgPSBbX2Zvcm1hdFNpbmdsZUZlYXR1cmUoZmVhdHVyZSwgc2VlbkZlYXR1cmUpXTsKICAgIGlmIChfaXNGZWF0dXJlTGluZVdpdGhSZWZzKGZlYXR1cmUpKSB7CiAgICAgIHN0cmluZ3MyLnB1c2goLi4uZmVhdHVyZS5jaGlsZF9mZWF0dXJlcy5tYXAoKGYpID0+IF9mb3JtYXRGZWF0dXJlKGYsIHNlZW5GZWF0dXJlKSksIC4uLmZlYXR1cmUuZGVyaXZlZF9mZWF0dXJlcy5tYXAoKGYpID0+IF9mb3JtYXRGZWF0dXJlKGYsIHNlZW5GZWF0dXJlKSkpOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3MyLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBmb3JtYXRGZWF0dXJlKGZlYXR1cmVPckZlYXR1cmVzKSB7CiAgICBjb25zdCBzZWVuID0ge307CiAgICByZXR1cm4gX2Zvcm1hdEZlYXR1cmUoZmVhdHVyZU9yRmVhdHVyZXMsIHNlZW4pOwogIH0KICBmdW5jdGlvbiBmb3JtYXREaXJlY3RpdmUoZGlyZWN0aXZlKSB7CiAgICBsZXQgc3RyID0gYCMjJHtkaXJlY3RpdmUuZGlyZWN0aXZlfWA7CiAgICBpZiAoZGlyZWN0aXZlLnZhbHVlKQogICAgICBzdHIgKz0gYCAke2RpcmVjdGl2ZS52YWx1ZX1gOwogICAgc3RyICs9ICJcbiI7CiAgICByZXR1cm4gc3RyOwogIH0KICBmdW5jdGlvbiBmb3JtYXRDb21tZW50KGNvbW1lbnQpIHsKICAgIHJldHVybiBgIyAke2NvbW1lbnQuY29tbWVudH0KYDsKICB9CiAgZnVuY3Rpb24gZm9ybWF0U2VxdWVuY2Uoc2VxKSB7CiAgICByZXR1cm4gYD4ke3NlcS5pZH0ke3NlcS5kZXNjcmlwdGlvbiA/IGAgJHtzZXEuZGVzY3JpcHRpb259YCA6ICIifQoke3NlcS5zZXF1ZW5jZX0KYDsKICB9CiAgZnVuY3Rpb24gZm9ybWF0SXRlbShpdGVtT3JJdGVtcykgewogICAgZnVuY3Rpb24gZm9ybWF0U2luZ2xlSXRlbShpdGVtKSB7CiAgICAgIGlmICgiYXR0cmlidXRlcyIgaW4gaXRlbSkKICAgICAgICByZXR1cm4gZm9ybWF0RmVhdHVyZShpdGVtKTsKICAgICAgaWYgKCJkaXJlY3RpdmUiIGluIGl0ZW0pCiAgICAgICAgcmV0dXJuIGZvcm1hdERpcmVjdGl2ZShpdGVtKTsKICAgICAgaWYgKCJzZXF1ZW5jZSIgaW4gaXRlbSkKICAgICAgICByZXR1cm4gZm9ybWF0U2VxdWVuY2UoaXRlbSk7CiAgICAgIGlmICgiY29tbWVudCIgaW4gaXRlbSkKICAgICAgICByZXR1cm4gZm9ybWF0Q29tbWVudChpdGVtKTsKICAgICAgcmV0dXJuICIjIChpbnZhbGlkIGl0ZW0gZm91bmQgZHVyaW5nIGZvcm1hdClcbiI7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtT3JJdGVtcykpIHsKICAgICAgcmV0dXJuIGl0ZW1Pckl0ZW1zLm1hcChmb3JtYXRTaW5nbGVJdGVtKTsKICAgIH0KICAgIHJldHVybiBmb3JtYXRTaW5nbGVJdGVtKGl0ZW1Pckl0ZW1zKTsKICB9CiAgZnVuY3Rpb24gX2lzRmVhdHVyZUxpbmVXaXRoUmVmcyhmZWF0dXJlTGluZSkgewogICAgcmV0dXJuIGZlYXR1cmVMaW5lLmNoaWxkX2ZlYXR1cmVzICE9PSB2b2lkIDAgJiYgZmVhdHVyZUxpbmUuZGVyaXZlZF9mZWF0dXJlcyAhPT0gdm9pZCAwOwogIH0KICB2YXIgdXRpbCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIHVuZXNjYXBlLAogICAgZXNjYXBlLAogICAgZXNjYXBlQ29sdW1uLAogICAgcGFyc2VBdHRyaWJ1dGVzLAogICAgcGFyc2VGZWF0dXJlLAogICAgcGFyc2VEaXJlY3RpdmUsCiAgICBmb3JtYXRBdHRyaWJ1dGVzLAogICAgZm9ybWF0RmVhdHVyZSwKICAgIGZvcm1hdERpcmVjdGl2ZSwKICAgIGZvcm1hdENvbW1lbnQsCiAgICBmb3JtYXRTZXF1ZW5jZSwKICAgIGZvcm1hdEl0ZW0KICB9KTsKICBjb25zdCBjb250YWluZXJBdHRyaWJ1dGVzID0gewogICAgUGFyZW50OiAiY2hpbGRfZmVhdHVyZXMiLAogICAgRGVyaXZlc19mcm9tOiAiZGVyaXZlZF9mZWF0dXJlcyIKICB9OwogIGNsYXNzIEZBU1RBUGFyc2VyIHsKICAgIGNvbnN0cnVjdG9yKHNlcUNhbGxiYWNrKSB7CiAgICAgIHRoaXMuc2VxQ2FsbGJhY2sgPSBzZXFDYWxsYmFjazsKICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB2b2lkIDA7CiAgICB9CiAgICBhZGRMaW5lKGxpbmUpIHsKICAgICAgY29uc3QgZGVmTWF0Y2ggPSAvXj5ccyooXFMrKVxzKiguKikvLmV4ZWMobGluZSk7CiAgICAgIGlmIChkZWZNYXRjaCkgewogICAgICAgIHRoaXMuX2ZsdXNoKCk7CiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB7IGlkOiBkZWZNYXRjaFsxXSwgc2VxdWVuY2U6ICIiIH07CiAgICAgICAgaWYgKGRlZk1hdGNoWzJdKQogICAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UuZGVzY3JpcHRpb24gPSBkZWZNYXRjaFsyXS50cmltKCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2UgJiYgL1xTLy50ZXN0KGxpbmUpKSB7CiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2Uuc2VxdWVuY2UgKz0gbGluZS5yZXBsYWNlKC9ccy9nLCAiIik7CiAgICAgIH0KICAgIH0KICAgIF9mbHVzaCgpIHsKICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlKQogICAgICAgIHRoaXMuc2VxQ2FsbGJhY2sodGhpcy5jdXJyZW50U2VxdWVuY2UpOwogICAgfQogICAgZmluaXNoKCkgewogICAgICB0aGlzLl9mbHVzaCgpOwogICAgfQogIH0KICBjbGFzcyBQYXJzZXIgewogICAgY29uc3RydWN0b3IoYXJncykgewogICAgICB0aGlzLmZhc3RhUGFyc2VyID0gdm9pZCAwOwogICAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgICB0aGlzLmxpbmVOdW1iZXIgPSAwOwogICAgICB0aGlzLl91bmRlckNvbnN0cnVjdGlvblRvcExldmVsID0gW107CiAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZCA9IHt9OwogICAgICB0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzID0ge307CiAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFucyA9IHt9OwogICAgICBjb25zdCBudWxsRnVuYyA9ICgpID0+IHsKICAgICAgfTsKICAgICAgdGhpcy5mZWF0dXJlQ2FsbGJhY2sgPSBhcmdzLmZlYXR1cmVDYWxsYmFjayB8fCBudWxsRnVuYzsKICAgICAgdGhpcy5lbmRDYWxsYmFjayA9IGFyZ3MuZW5kQ2FsbGJhY2sgfHwgbnVsbEZ1bmM7CiAgICAgIHRoaXMuY29tbWVudENhbGxiYWNrID0gYXJncy5jb21tZW50Q2FsbGJhY2sgfHwgbnVsbEZ1bmM7CiAgICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IGFyZ3MuZXJyb3JDYWxsYmFjayB8fCBudWxsRnVuYzsKICAgICAgdGhpcy5kaXJlY3RpdmVDYWxsYmFjayA9IGFyZ3MuZGlyZWN0aXZlQ2FsbGJhY2sgfHwgbnVsbEZ1bmM7CiAgICAgIHRoaXMuc2VxdWVuY2VDYWxsYmFjayA9IGFyZ3Muc2VxdWVuY2VDYWxsYmFjayB8fCBudWxsRnVuYzsKICAgICAgdGhpcy5kaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzID0gYXJncy5kaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzIHx8IGZhbHNlOwogICAgICB0aGlzLmJ1ZmZlclNpemUgPSBhcmdzLmJ1ZmZlclNpemUgPT09IHZvaWQgMCA/IDFlMyA6IGFyZ3MuYnVmZmVyU2l6ZTsKICAgIH0KICAgIGFkZExpbmUobGluZSkgewogICAgICBpZiAodGhpcy5mYXN0YVBhcnNlcikgewogICAgICAgIHRoaXMuZmFzdGFQYXJzZXIuYWRkTGluZShsaW5lKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubGluZU51bWJlciArPSAxOwogICAgICBpZiAoL15ccypbXiNccz5dLy50ZXN0KGxpbmUpKSB7CiAgICAgICAgdGhpcy5fYnVmZmVyTGluZShsaW5lKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbWF0Y2ggPSAvXlxzKigjKykoLiopLy5leGVjKGxpbmUpOwogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICBjb25zdCBbLCBoYXNoc2lnbnNdID0gbWF0Y2g7CiAgICAgICAgbGV0IFssICwgY29udGVudHNdID0gbWF0Y2g7CiAgICAgICAgaWYgKGhhc2hzaWducy5sZW5ndGggPT09IDMpIHsKICAgICAgICAgIHRoaXMuX2VtaXRBbGxVbmRlckNvbnN0cnVjdGlvbkZlYXR1cmVzKCk7CiAgICAgICAgfSBlbHNlIGlmIChoYXNoc2lnbnMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBwYXJzZURpcmVjdGl2ZShsaW5lKTsKICAgICAgICAgIGlmIChkaXJlY3RpdmUpIHsKICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZS5kaXJlY3RpdmUgPT09ICJGQVNUQSIpIHsKICAgICAgICAgICAgICB0aGlzLl9lbWl0QWxsVW5kZXJDb25zdHJ1Y3Rpb25GZWF0dXJlcygpOwogICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICAgICAgICB0aGlzLmZhc3RhUGFyc2VyID0gbmV3IEZBU1RBUGFyc2VyKHRoaXMuc2VxdWVuY2VDYWxsYmFjayk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5fZW1pdEl0ZW0oZGlyZWN0aXZlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoL1xzKi8sICIiKTsKICAgICAgICAgIHRoaXMuX2VtaXRJdGVtKHsgY29tbWVudDogY29udGVudHMgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKC9eXHMqJC8udGVzdChsaW5lKSkKICAgICAgICA7CiAgICAgIGVsc2UgaWYgKC9eXHMqPi8udGVzdChsaW5lKSkgewogICAgICAgIHRoaXMuX2VtaXRBbGxVbmRlckNvbnN0cnVjdGlvbkZlYXR1cmVzKCk7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIHRoaXMuZmFzdGFQYXJzZXIgPSBuZXcgRkFTVEFQYXJzZXIodGhpcy5zZXF1ZW5jZUNhbGxiYWNrKTsKICAgICAgICB0aGlzLmZhc3RhUGFyc2VyLmFkZExpbmUobGluZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZXJyTGluZSA9IGxpbmUucmVwbGFjZSgvXHI/XG4/JC9nLCAiIik7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHRkYzIHBhcnNlIGVycm9yLiAgQ2Fubm90IHBhcnNlICcke2VyckxpbmV9Jy5gKTsKICAgICAgfQogICAgfQogICAgZmluaXNoKCkgewogICAgICB0aGlzLl9lbWl0QWxsVW5kZXJDb25zdHJ1Y3Rpb25GZWF0dXJlcygpOwogICAgICBpZiAodGhpcy5mYXN0YVBhcnNlcikKICAgICAgICB0aGlzLmZhc3RhUGFyc2VyLmZpbmlzaCgpOwogICAgICB0aGlzLmVuZENhbGxiYWNrKCk7CiAgICB9CiAgICBfZW1pdEl0ZW0oaTIpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaTIpKQogICAgICAgIHRoaXMuZmVhdHVyZUNhbGxiYWNrKGkyKTsKICAgICAgZWxzZSBpZiAoImRpcmVjdGl2ZSIgaW4gaTIpCiAgICAgICAgdGhpcy5kaXJlY3RpdmVDYWxsYmFjayhpMik7CiAgICAgIGVsc2UgaWYgKCJjb21tZW50IiBpbiBpMikKICAgICAgICB0aGlzLmNvbW1lbnRDYWxsYmFjayhpMik7CiAgICB9CiAgICBfZW5mb3JjZUJ1ZmZlclNpemVMaW1pdChhZGRpdGlvbmFsSXRlbUNvdW50ID0gMCkgewogICAgICBjb25zdCBfdW5idWZmZXJJdGVtID0gKGl0ZW0pID0+IHsKICAgICAgICBpZiAoaXRlbSAmJiBBcnJheS5pc0FycmF5KGl0ZW0pICYmIGl0ZW1bMF0uYXR0cmlidXRlcyAmJiBpdGVtWzBdLmF0dHJpYnV0ZXMuSUQgJiYgaXRlbVswXS5hdHRyaWJ1dGVzLklEWzBdKSB7CiAgICAgICAgICBjb25zdCBpZHMgPSBpdGVtWzBdLmF0dHJpYnV0ZXMuSUQ7CiAgICAgICAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZFtpZF07CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzW2lkXTsKICAgICAgICAgIH0pOwogICAgICAgICAgaXRlbS5mb3JFYWNoKChpMikgPT4gewogICAgICAgICAgICBpZiAoaTIuY2hpbGRfZmVhdHVyZXMpCiAgICAgICAgICAgICAgaTIuY2hpbGRfZmVhdHVyZXMuZm9yRWFjaCgoYzIpID0+IF91bmJ1ZmZlckl0ZW0oYzIpKTsKICAgICAgICAgICAgaWYgKGkyLmRlcml2ZWRfZmVhdHVyZXMpCiAgICAgICAgICAgICAgaTIuZGVyaXZlZF9mZWF0dXJlcy5mb3JFYWNoKChkKSA9PiBfdW5idWZmZXJJdGVtKGQpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgICAgd2hpbGUgKHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uVG9wTGV2ZWwubGVuZ3RoICsgYWRkaXRpb25hbEl0ZW1Db3VudCA+IHRoaXMuYnVmZmVyU2l6ZSkgewogICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl91bmRlckNvbnN0cnVjdGlvblRvcExldmVsLnNoaWZ0KCk7CiAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgIHRoaXMuX2VtaXRJdGVtKGl0ZW0pOwogICAgICAgICAgX3VuYnVmZmVySXRlbShpdGVtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9lbWl0QWxsVW5kZXJDb25zdHJ1Y3Rpb25GZWF0dXJlcygpIHsKICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25Ub3BMZXZlbC5mb3JFYWNoKHRoaXMuX2VtaXRJdGVtLmJpbmQodGhpcykpOwogICAgICB0aGlzLl91bmRlckNvbnN0cnVjdGlvblRvcExldmVsID0gW107CiAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZCA9IHt9OwogICAgICB0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzID0ge307CiAgICAgIGlmIChBcnJheS5mcm9tKE9iamVjdC52YWx1ZXModGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25PcnBoYW5zKSkubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzb21lIGZlYXR1cmVzIHJlZmVyZW5jZSBvdGhlciBmZWF0dXJlcyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsZSAob3IgaW4gdGhlIHNhbWUgJyMjIycgc2NvcGUpLiAke09iamVjdC5rZXlzKHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFucyl9YCk7CiAgICAgIH0KICAgIH0KICAgIF9idWZmZXJMaW5lKGxpbmUpIHsKICAgICAgdmFyIF9hLCBfYiwgX2M7CiAgICAgIGNvbnN0IHJhd0ZlYXR1cmVMaW5lID0gcGFyc2VGZWF0dXJlKGxpbmUpOwogICAgICBjb25zdCBmZWF0dXJlTGluZSA9IHsKICAgICAgICAuLi5yYXdGZWF0dXJlTGluZSwKICAgICAgICBjaGlsZF9mZWF0dXJlczogW10sCiAgICAgICAgZGVyaXZlZF9mZWF0dXJlczogW10KICAgICAgfTsKICAgICAgY29uc3QgaWRzID0gKChfYSA9IGZlYXR1cmVMaW5lLmF0dHJpYnV0ZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5JRCkgfHwgW107CiAgICAgIGNvbnN0IHBhcmVudHMgPSAoKF9iID0gZmVhdHVyZUxpbmUuYXR0cmlidXRlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLlBhcmVudCkgfHwgW107CiAgICAgIGNvbnN0IGRlcml2ZXMgPSB0aGlzLmRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXMgPyBbXSA6ICgoX2MgPSBmZWF0dXJlTGluZS5hdHRyaWJ1dGVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuRGVyaXZlc19mcm9tKSB8fCBbXTsKICAgICAgaWYgKCFpZHMubGVuZ3RoICYmICFwYXJlbnRzLmxlbmd0aCAmJiAhZGVyaXZlcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9lbWl0SXRlbShbZmVhdHVyZUxpbmVdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGZlYXR1cmUgPSB2b2lkIDA7CiAgICAgIGlkcy5mb3JFYWNoKChpZCkgPT4gewogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25CeUlkW2lkXTsKICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgIGlmIChleGlzdGluZ1tleGlzdGluZy5sZW5ndGggLSAxXS50eXBlICE9PSBmZWF0dXJlTGluZS50eXBlKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcnNlRXJyb3IoYG11bHRpLWxpbmUgZmVhdHVyZSAiJHtpZH0iIGhhcyBpbmNvbnNpc3RlbnQgdHlwZXM6ICIke2ZlYXR1cmVMaW5lLnR5cGV9IiwgIiR7ZXhpc3RpbmdbZXhpc3RpbmcubGVuZ3RoIC0gMV0udHlwZX0iYCk7CiAgICAgICAgICB9CiAgICAgICAgICBleGlzdGluZy5wdXNoKGZlYXR1cmVMaW5lKTsKICAgICAgICAgIGZlYXR1cmUgPSBleGlzdGluZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmVhdHVyZSA9IFtmZWF0dXJlTGluZV07CiAgICAgICAgICB0aGlzLl9lbmZvcmNlQnVmZmVyU2l6ZUxpbWl0KDEpOwogICAgICAgICAgaWYgKCFwYXJlbnRzLmxlbmd0aCAmJiAhZGVyaXZlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25Ub3BMZXZlbC5wdXNoKGZlYXR1cmUpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25CeUlkW2lkXSA9IGZlYXR1cmU7CiAgICAgICAgICB0aGlzLl9yZXNvbHZlUmVmZXJlbmNlc1RvKGZlYXR1cmUsIGlkKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLl9yZXNvbHZlUmVmZXJlbmNlc0Zyb20oZmVhdHVyZSB8fCBbZmVhdHVyZUxpbmVdLCB7IFBhcmVudDogcGFyZW50cywgRGVyaXZlc19mcm9tOiBkZXJpdmVzIH0sIGlkcyk7CiAgICB9CiAgICBfcmVzb2x2ZVJlZmVyZW5jZXNUbyhmZWF0dXJlLCBpZCkgewogICAgICBjb25zdCByZWZlcmVuY2VzID0gdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25PcnBoYW5zW2lkXTsKICAgICAgaWYgKCFyZWZlcmVuY2VzKQogICAgICAgIHJldHVybjsKICAgICAgZmVhdHVyZS5mb3JFYWNoKChsb2MpID0+IHsKICAgICAgICBsb2MuY2hpbGRfZmVhdHVyZXMucHVzaCguLi5yZWZlcmVuY2VzLlBhcmVudCk7CiAgICAgIH0pOwogICAgICBmZWF0dXJlLmZvckVhY2goKGxvYykgPT4gewogICAgICAgIGxvYy5kZXJpdmVkX2ZlYXR1cmVzLnB1c2goLi4ucmVmZXJlbmNlcy5EZXJpdmVzX2Zyb20pOwogICAgICB9KTsKICAgICAgZGVsZXRlIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFuc1tpZF07CiAgICB9CiAgICBfcGFyc2VFcnJvcihtZXNzYWdlKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgdGhpcy5lcnJvckNhbGxiYWNrKGAke3RoaXMubGluZU51bWJlcn06ICR7bWVzc2FnZX1gKTsKICAgIH0KICAgIF9yZXNvbHZlUmVmZXJlbmNlc0Zyb20oZmVhdHVyZSwgcmVmZXJlbmNlcywgaWRzKSB7CiAgICAgIGZ1bmN0aW9uIHBvc3RTZXQob2JqLCBzbG90MSwgc2xvdDIpIHsKICAgICAgICBsZXQgc3ViT2JqID0gb2JqW3Nsb3QxXTsKICAgICAgICBpZiAoIXN1Yk9iaikgewogICAgICAgICAgc3ViT2JqID0ge307CiAgICAgICAgICBvYmpbc2xvdDFdID0gc3ViT2JqOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBzdWJPYmpbc2xvdDJdIHx8IGZhbHNlOwogICAgICAgIHN1Yk9ialtzbG90Ml0gPSB0cnVlOwogICAgICAgIHJldHVybiByZXR1cm5WYWw7CiAgICAgIH0KICAgICAgcmVmZXJlbmNlcy5QYXJlbnQuZm9yRWFjaCgodG9JZCkgPT4gewogICAgICAgIGNvbnN0IG90aGVyRmVhdHVyZSA9IHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZFt0b0lkXTsKICAgICAgICBpZiAob3RoZXJGZWF0dXJlKSB7CiAgICAgICAgICBjb25zdCBwbmFtZSA9IGNvbnRhaW5lckF0dHJpYnV0ZXMuUGFyZW50OwogICAgICAgICAgaWYgKCFpZHMuZmlsdGVyKChpZCkgPT4gcG9zdFNldCh0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzLCBpZCwgYFBhcmVudCwke3RvSWR9YCkpLmxlbmd0aCkgewogICAgICAgICAgICBvdGhlckZlYXR1cmUuZm9yRWFjaCgobG9jYXRpb24pID0+IHsKICAgICAgICAgICAgICBsb2NhdGlvbltwbmFtZV0ucHVzaChmZWF0dXJlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCByZWYgPSB0aGlzLl91bmRlckNvbnN0cnVjdGlvbk9ycGhhbnNbdG9JZF07CiAgICAgICAgICBpZiAoIXJlZikgewogICAgICAgICAgICByZWYgPSB7CiAgICAgICAgICAgICAgUGFyZW50OiBbXSwKICAgICAgICAgICAgICBEZXJpdmVzX2Zyb206IFtdCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFuc1t0b0lkXSA9IHJlZjsKICAgICAgICAgIH0KICAgICAgICAgIHJlZi5QYXJlbnQucHVzaChmZWF0dXJlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZWZlcmVuY2VzLkRlcml2ZXNfZnJvbS5mb3JFYWNoKCh0b0lkKSA9PiB7CiAgICAgICAgY29uc3Qgb3RoZXJGZWF0dXJlID0gdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25CeUlkW3RvSWRdOwogICAgICAgIGlmIChvdGhlckZlYXR1cmUpIHsKICAgICAgICAgIGNvbnN0IHBuYW1lID0gY29udGFpbmVyQXR0cmlidXRlcy5EZXJpdmVzX2Zyb207CiAgICAgICAgICBpZiAoIWlkcy5maWx0ZXIoKGlkKSA9PiBwb3N0U2V0KHRoaXMuX2NvbXBsZXRlZFJlZmVyZW5jZXMsIGlkLCBgRGVyaXZlc19mcm9tLCR7dG9JZH1gKSkubGVuZ3RoKSB7CiAgICAgICAgICAgIG90aGVyRmVhdHVyZS5mb3JFYWNoKChsb2NhdGlvbikgPT4gewogICAgICAgICAgICAgIGxvY2F0aW9uW3BuYW1lXS5wdXNoKGZlYXR1cmUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IHJlZiA9IHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFuc1t0b0lkXTsKICAgICAgICAgIGlmICghcmVmKSB7CiAgICAgICAgICAgIHJlZiA9IHsKICAgICAgICAgICAgICBQYXJlbnQ6IFtdLAogICAgICAgICAgICAgIERlcml2ZXNfZnJvbTogW10KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25PcnBoYW5zW3RvSWRdID0gcmVmOwogICAgICAgICAgfQogICAgICAgICAgcmVmLkRlcml2ZXNfZnJvbS5wdXNoKGZlYXR1cmUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jYWxsYmFjayhjYWxsYmFjaykgewogICAgaWYgKHByb2Nlc3MgJiYgcHJvY2Vzcy5uZXh0VGljaykKICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7CiAgICBlbHNlCiAgICAgIGNhbGxiYWNrKCk7CiAgfQogIGZ1bmN0aW9uIF9wcm9jZXNzUGFyc2VPcHRpb25zKG9wdGlvbnMpIHsKICAgIGNvbnN0IG91dCA9IHsKICAgICAgZW5jb2Rpbmc6ICJ1dGY4IiwKICAgICAgcGFyc2VGZWF0dXJlczogdHJ1ZSwKICAgICAgcGFyc2VEaXJlY3RpdmVzOiBmYWxzZSwKICAgICAgcGFyc2VTZXF1ZW5jZXM6IHRydWUsCiAgICAgIHBhcnNlQ29tbWVudHM6IGZhbHNlLAogICAgICBidWZmZXJTaXplOiAxZTMsCiAgICAgIGRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXM6IGZhbHNlLAogICAgICAuLi5vcHRpb25zCiAgICB9OwogICAgaWYgKG9wdGlvbnMucGFyc2VBbGwpIHsKICAgICAgb3V0LnBhcnNlRmVhdHVyZXMgPSB0cnVlOwogICAgICBvdXQucGFyc2VEaXJlY3RpdmVzID0gdHJ1ZTsKICAgICAgb3V0LnBhcnNlQ29tbWVudHMgPSB0cnVlOwogICAgICBvdXQucGFyc2VTZXF1ZW5jZXMgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIG91dDsKICB9CiAgY2xhc3MgR0ZGVHJhbnNmb3JtIGV4dGVuZHMgc3RyZWFtLlRyYW5zZm9ybSB7CiAgICBjb25zdHJ1Y3RvcihpbnB1dE9wdGlvbnMgPSB7fSkgewogICAgICBzdXBlcih7IG9iamVjdE1vZGU6IHRydWUgfSk7CiAgICAgIHRoaXMudGV4dEJ1ZmZlciA9ICIiOwogICAgICBjb25zdCBvcHRpb25zID0gX3Byb2Nlc3NQYXJzZU9wdGlvbnMoaW5wdXRPcHRpb25zKTsKICAgICAgdGhpcy5lbmNvZGluZyA9IGlucHV0T3B0aW9ucy5lbmNvZGluZyB8fCAidXRmOCI7CiAgICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyXzEoKTsKICAgICAgY29uc3QgcHVzaCA9IHRoaXMucHVzaC5iaW5kKHRoaXMpOwogICAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgIGZlYXR1cmVDYWxsYmFjazogb3B0aW9ucy5wYXJzZUZlYXR1cmVzID8gcHVzaCA6IHZvaWQgMCwKICAgICAgICBkaXJlY3RpdmVDYWxsYmFjazogb3B0aW9ucy5wYXJzZURpcmVjdGl2ZXMgPyBwdXNoIDogdm9pZCAwLAogICAgICAgIGNvbW1lbnRDYWxsYmFjazogb3B0aW9ucy5wYXJzZUNvbW1lbnRzID8gcHVzaCA6IHZvaWQgMCwKICAgICAgICBzZXF1ZW5jZUNhbGxiYWNrOiBvcHRpb25zLnBhcnNlU2VxdWVuY2VzID8gcHVzaCA6IHZvaWQgMCwKICAgICAgICBlcnJvckNhbGxiYWNrOiAoZXJyMikgPT4gdGhpcy5lbWl0KCJlcnJvciIsIGVycjIpLAogICAgICAgIGJ1ZmZlclNpemU6IG9wdGlvbnMuYnVmZmVyU2l6ZSwKICAgICAgICBkaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzOiBvcHRpb25zLmRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXMKICAgICAgfSk7CiAgICB9CiAgICBfYWRkTGluZShkYXRhKSB7CiAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgdGhpcy5wYXJzZXIuYWRkTGluZShkYXRhKTsKICAgICAgfQogICAgfQogICAgX25leHRUZXh0KGJ1ZmZlcjIpIHsKICAgICAgY29uc3QgcGllY2VzID0gKHRoaXMudGV4dEJ1ZmZlciArIGJ1ZmZlcjIpLnNwbGl0KC9ccj9cbi8pOwogICAgICB0aGlzLnRleHRCdWZmZXIgPSBwaWVjZXMucG9wKCkgfHwgIiI7CiAgICAgIHBpZWNlcy5mb3JFYWNoKChwaWVjZSkgPT4gdGhpcy5fYWRkTGluZShwaWVjZSkpOwogICAgfQogICAgX3RyYW5zZm9ybShjaHVuaywgX2VuY29kaW5nLCBjYWxsYmFjaykgewogICAgICB0aGlzLl9uZXh0VGV4dCh0aGlzLmRlY29kZXIud3JpdGUoY2h1bmspKTsKICAgICAgX2NhbGxiYWNrKGNhbGxiYWNrKTsKICAgIH0KICAgIF9mbHVzaChjYWxsYmFjaykgewogICAgICBpZiAodGhpcy5kZWNvZGVyLmVuZCkKICAgICAgICB0aGlzLl9uZXh0VGV4dCh0aGlzLmRlY29kZXIuZW5kKCkpOwogICAgICBpZiAodGhpcy50ZXh0QnVmZmVyICE9IG51bGwpCiAgICAgICAgdGhpcy5fYWRkTGluZSh0aGlzLnRleHRCdWZmZXIpOwogICAgICB0aGlzLnBhcnNlci5maW5pc2goKTsKICAgICAgX2NhbGxiYWNrKGNhbGxiYWNrKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcGFyc2VTdHJlYW0ob3B0aW9ucyA9IHt9KSB7CiAgICByZXR1cm4gbmV3IEdGRlRyYW5zZm9ybShvcHRpb25zKTsKICB9CiAgZnVuY3Rpb24gcGFyc2VTdHJpbmdTeW5jKHN0ciwgaW5wdXRPcHRpb25zID0ge30pIHsKICAgIGlmICghc3RyKQogICAgICByZXR1cm4gW107CiAgICBjb25zdCBvcHRpb25zID0gX3Byb2Nlc3NQYXJzZU9wdGlvbnMoaW5wdXRPcHRpb25zKTsKICAgIGNvbnN0IGl0ZW1zID0gW107CiAgICBjb25zdCBwdXNoID0gaXRlbXMucHVzaC5iaW5kKGl0ZW1zKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBmZWF0dXJlQ2FsbGJhY2s6IG9wdGlvbnMucGFyc2VGZWF0dXJlcyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgIGRpcmVjdGl2ZUNhbGxiYWNrOiBvcHRpb25zLnBhcnNlRGlyZWN0aXZlcyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgIGNvbW1lbnRDYWxsYmFjazogb3B0aW9ucy5wYXJzZUNvbW1lbnRzID8gcHVzaCA6IHZvaWQgMCwKICAgICAgc2VxdWVuY2VDYWxsYmFjazogb3B0aW9ucy5wYXJzZVNlcXVlbmNlcyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgIGRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXM6IG9wdGlvbnMuZGlzYWJsZURlcml2ZXNGcm9tUmVmZXJlbmNlcyB8fCBmYWxzZSwKICAgICAgYnVmZmVyU2l6ZTogSW5maW5pdHksCiAgICAgIGVycm9yQ2FsbGJhY2s6IChlcnIyKSA9PiB7CiAgICAgICAgdGhyb3cgZXJyMjsKICAgICAgfQogICAgfSk7CiAgICBzdHIuc3BsaXQoL1xyP1xuLykuZm9yRWFjaChwYXJzZXIuYWRkTGluZS5iaW5kKHBhcnNlcikpOwogICAgcGFyc2VyLmZpbmlzaCgpOwogICAgcmV0dXJuIGl0ZW1zOwogIH0KICBmdW5jdGlvbiBmb3JtYXRTeW5jKGl0ZW1zKSB7CiAgICBjb25zdCBvdGhlciA9IFtdOwogICAgY29uc3Qgc2VxdWVuY2VzID0gW107CiAgICBpdGVtcy5mb3JFYWNoKChpMikgPT4gewogICAgICBpZiAoInNlcXVlbmNlIiBpbiBpMikKICAgICAgICBzZXF1ZW5jZXMucHVzaChpMik7CiAgICAgIGVsc2UKICAgICAgICBvdGhlci5wdXNoKGkyKTsKICAgIH0pOwogICAgbGV0IHN0ciA9IG90aGVyLm1hcChmb3JtYXRJdGVtKS5qb2luKCIiKTsKICAgIGlmIChzZXF1ZW5jZXMubGVuZ3RoKSB7CiAgICAgIHN0ciArPSAiIyNGQVNUQVxuIjsKICAgICAgc3RyICs9IHNlcXVlbmNlcy5tYXAoZm9ybWF0U2VxdWVuY2UpLmpvaW4oIiIpOwogICAgfQogICAgcmV0dXJuIHN0cjsKICB9CiAgY2xhc3MgRm9ybWF0dGluZ1RyYW5zZm9ybSBleHRlbmRzIHN0cmVhbS5UcmFuc2Zvcm0gewogICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7CiAgICAgIHN1cGVyKE9iamVjdC5hc3NpZ24ob3B0aW9ucywgeyBvYmplY3RNb2RlOiB0cnVlIH0pKTsKICAgICAgdGhpcy5saW5lc1NpbmNlTGFzdFN5bmNNYXJrID0gMDsKICAgICAgdGhpcy5oYXZlV2VFbWl0dGVkRGF0YSA9IGZhbHNlOwogICAgICB0aGlzLmZhc3RhTW9kZSA9IGZhbHNlOwogICAgICB0aGlzLm1pbkxpbmVzQmV0d2VlblN5bmNNYXJrcyA9IG9wdGlvbnMubWluU3luY0xpbmVzIHx8IDEwMDsKICAgICAgdGhpcy5pbnNlcnRWZXJzaW9uRGlyZWN0aXZlID0gb3B0aW9ucy5pbnNlcnRWZXJzaW9uRGlyZWN0aXZlIHx8IGZhbHNlOwogICAgfQogICAgX3RyYW5zZm9ybShjaHVuaywgX2VuY29kaW5nLCBjYWxsYmFjaykgewogICAgICBsZXQgc3RyOwogICAgICBpZiAoIXRoaXMuaGF2ZVdlRW1pdHRlZERhdGEgJiYgdGhpcy5pbnNlcnRWZXJzaW9uRGlyZWN0aXZlKSB7CiAgICAgICAgY29uc3QgdGhpc0NodW5rID0gQXJyYXkuaXNBcnJheShjaHVuaykgPyBjaHVua1swXSA6IGNodW5rOwogICAgICAgIGlmICgiZGlyZWN0aXZlIiBpbiB0aGlzQ2h1bmspIHsKICAgICAgICAgIGlmICh0aGlzQ2h1bmsuZGlyZWN0aXZlICE9PSAiZ2ZmLXZlcnNpb24iKSB7CiAgICAgICAgICAgIHRoaXMucHVzaCgiIyNnZmYtdmVyc2lvbiAzXG4iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCJzZXF1ZW5jZSIgaW4gY2h1bmsgJiYgIXRoaXMuZmFzdGFNb2RlKSB7CiAgICAgICAgdGhpcy5wdXNoKCIjI0ZBU1RBXG4iKTsKICAgICAgICB0aGlzLmZhc3RhTW9kZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2h1bmspKQogICAgICAgIHN0ciA9IGNodW5rLm1hcChmb3JtYXRJdGVtKS5qb2luKCIiKTsKICAgICAgZWxzZQogICAgICAgIHN0ciA9IGZvcm1hdEl0ZW0oY2h1bmspOwogICAgICB0aGlzLnB1c2goc3RyKTsKICAgICAgaWYgKHRoaXMubGluZXNTaW5jZUxhc3RTeW5jTWFyayA+PSB0aGlzLm1pbkxpbmVzQmV0d2VlblN5bmNNYXJrcykgewogICAgICAgIHRoaXMucHVzaCgiIyMjXG4iKTsKICAgICAgICB0aGlzLmxpbmVzU2luY2VMYXN0U3luY01hcmsgPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHN0ci5sZW5ndGg7IGkyICs9IDEpIHsKICAgICAgICAgIGlmIChzdHJbaTJdID09PSAiXG4iKQogICAgICAgICAgICBjb3VudCArPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpbmVzU2luY2VMYXN0U3luY01hcmsgKz0gY291bnQ7CiAgICAgIH0KICAgICAgdGhpcy5oYXZlV2VFbWl0dGVkRGF0YSA9IHRydWU7CiAgICAgIF9jYWxsYmFjayhjYWxsYmFjayk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZvcm1hdFN0cmVhbShvcHRpb25zID0ge30pIHsKICAgIHJldHVybiBuZXcgRm9ybWF0dGluZ1RyYW5zZm9ybShvcHRpb25zKTsKICB9CiAgZnVuY3Rpb24gZm9ybWF0RmlsZShzdHJlYW0yLCB3cml0ZVN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCBuZXdPcHRpb25zID0gewogICAgICBpbnNlcnRWZXJzaW9uRGlyZWN0aXZlOiB0cnVlLAogICAgICAuLi5vcHRpb25zCiAgICB9OwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgc3RyZWFtMi5waXBlKG5ldyBGb3JtYXR0aW5nVHJhbnNmb3JtKG5ld09wdGlvbnMpKS5vbigiZW5kIiwgKCkgPT4gcmVzb2x2ZShudWxsKSkub24oImVycm9yIiwgcmVqZWN0KS5waXBlKHdyaXRlU3RyZWFtKTsKICAgIH0pOwogIH0KICB2YXIgR0ZGID0gewogICAgcGFyc2VTdHJlYW0sCiAgICBwYXJzZVN0cmluZ1N5bmMsCiAgICBmb3JtYXRTeW5jLAogICAgZm9ybWF0U3RyZWFtLAogICAgZm9ybWF0RmlsZSwKICAgIHV0aWwKICB9OwogIHZhciB3b3JrZXIgPSB7fTsKICB2YXIgaXNPYnNlcnZhYmxlID0gKHZhbHVlKSA9PiB7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0eXBlb2YgU3ltYm9sLm9ic2VydmFibGUgPT09ICJzeW1ib2wiICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wub2JzZXJ2YWJsZV0gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVtTeW1ib2wub2JzZXJ2YWJsZV0oKTsKICAgIH0KICAgIGlmICh0eXBlb2YgdmFsdWVbIkBAb2JzZXJ2YWJsZSJdID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVbIkBAb2JzZXJ2YWJsZSJdKCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKICB2YXIgY29tbW9uID0ge307CiAgdmFyIHNlcmlhbGl6ZXJzID0ge307CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZXJzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgc2VyaWFsaXplcnMuRGVmYXVsdFNlcmlhbGl6ZXIgPSBzZXJpYWxpemVycy5leHRlbmRTZXJpYWxpemVyID0gdm9pZCAwOwogIGZ1bmN0aW9uIGV4dGVuZFNlcmlhbGl6ZXIoZXh0ZW5kLCBpbXBsZW1lbnRhdGlvbikgewogICAgY29uc3QgZmFsbGJhY2tEZXNlcmlhbGl6ZXIgPSBleHRlbmQuZGVzZXJpYWxpemUuYmluZChleHRlbmQpOwogICAgY29uc3QgZmFsbGJhY2tTZXJpYWxpemVyID0gZXh0ZW5kLnNlcmlhbGl6ZS5iaW5kKGV4dGVuZCk7CiAgICByZXR1cm4gewogICAgICBkZXNlcmlhbGl6ZShtZXNzYWdlKSB7CiAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uLmRlc2VyaWFsaXplKG1lc3NhZ2UsIGZhbGxiYWNrRGVzZXJpYWxpemVyKTsKICAgICAgfSwKICAgICAgc2VyaWFsaXplKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uLnNlcmlhbGl6ZShpbnB1dCwgZmFsbGJhY2tTZXJpYWxpemVyKTsKICAgICAgfQogICAgfTsKICB9CiAgc2VyaWFsaXplcnMuZXh0ZW5kU2VyaWFsaXplciA9IGV4dGVuZFNlcmlhbGl6ZXI7CiAgY29uc3QgRGVmYXVsdEVycm9yU2VyaWFsaXplciA9IHsKICAgIGRlc2VyaWFsaXplKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IobWVzc2FnZS5tZXNzYWdlKSwgewogICAgICAgIG5hbWU6IG1lc3NhZ2UubmFtZSwKICAgICAgICBzdGFjazogbWVzc2FnZS5zdGFjawogICAgICB9KTsKICAgIH0sCiAgICBzZXJpYWxpemUoZXJyb3IpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBfX2Vycm9yX21hcmtlcjogIiQkZXJyb3IiLAogICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsCiAgICAgICAgbmFtZTogZXJyb3IubmFtZSwKICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2sKICAgICAgfTsKICAgIH0KICB9OwogIGNvbnN0IGlzU2VyaWFsaXplZEVycm9yID0gKHRoaW5nKSA9PiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiICYmICJfX2Vycm9yX21hcmtlciIgaW4gdGhpbmcgJiYgdGhpbmcuX19lcnJvcl9tYXJrZXIgPT09ICIkJGVycm9yIjsKICBzZXJpYWxpemVycy5EZWZhdWx0U2VyaWFsaXplciA9IHsKICAgIGRlc2VyaWFsaXplKG1lc3NhZ2UpIHsKICAgICAgaWYgKGlzU2VyaWFsaXplZEVycm9yKG1lc3NhZ2UpKSB7CiAgICAgICAgcmV0dXJuIERlZmF1bHRFcnJvclNlcmlhbGl6ZXIuZGVzZXJpYWxpemUobWVzc2FnZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgIH0KICAgIH0sCiAgICBzZXJpYWxpemUoaW5wdXQpIHsKICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICByZXR1cm4gRGVmYXVsdEVycm9yU2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgfQogICAgfQogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1vbiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIGNvbW1vbi5zZXJpYWxpemUgPSBjb21tb24uZGVzZXJpYWxpemUgPSBjb21tb24ucmVnaXN0ZXJTZXJpYWxpemVyID0gdm9pZCAwOwogIGNvbnN0IHNlcmlhbGl6ZXJzXzEgPSBzZXJpYWxpemVyczsKICBsZXQgcmVnaXN0ZXJlZFNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc18xLkRlZmF1bHRTZXJpYWxpemVyOwogIGZ1bmN0aW9uIHJlZ2lzdGVyU2VyaWFsaXplcihzZXJpYWxpemVyKSB7CiAgICByZWdpc3RlcmVkU2VyaWFsaXplciA9IHNlcmlhbGl6ZXJzXzEuZXh0ZW5kU2VyaWFsaXplcihyZWdpc3RlcmVkU2VyaWFsaXplciwgc2VyaWFsaXplcik7CiAgfQogIGNvbW1vbi5yZWdpc3RlclNlcmlhbGl6ZXIgPSByZWdpc3RlclNlcmlhbGl6ZXI7CiAgZnVuY3Rpb24gZGVzZXJpYWxpemUobWVzc2FnZSkgewogICAgcmV0dXJuIHJlZ2lzdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplKG1lc3NhZ2UpOwogIH0KICBjb21tb24uZGVzZXJpYWxpemUgPSBkZXNlcmlhbGl6ZTsKICBmdW5jdGlvbiBzZXJpYWxpemUoaW5wdXQpIHsKICAgIHJldHVybiByZWdpc3RlcmVkU2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQpOwogIH0KICBjb21tb24uc2VyaWFsaXplID0gc2VyaWFsaXplOwogIHZhciB0cmFuc2ZlcmFibGUgPSB7fTsKICB2YXIgc3ltYm9scyA9IHt9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzeW1ib2xzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgc3ltYm9scy4kd29ya2VyID0gc3ltYm9scy4kdHJhbnNmZXJhYmxlID0gc3ltYm9scy4kdGVybWluYXRlID0gc3ltYm9scy4kZXZlbnRzID0gc3ltYm9scy4kZXJyb3JzID0gdm9pZCAwOwogIHN5bWJvbHMuJGVycm9ycyA9IFN5bWJvbCgidGhyZWFkLmVycm9ycyIpOwogIHN5bWJvbHMuJGV2ZW50cyA9IFN5bWJvbCgidGhyZWFkLmV2ZW50cyIpOwogIHN5bWJvbHMuJHRlcm1pbmF0ZSA9IFN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpOwogIHN5bWJvbHMuJHRyYW5zZmVyYWJsZSA9IFN5bWJvbCgidGhyZWFkLnRyYW5zZmVyYWJsZSIpOwogIHN5bWJvbHMuJHdvcmtlciA9IFN5bWJvbCgidGhyZWFkLndvcmtlciIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFuc2ZlcmFibGUsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICB0cmFuc2ZlcmFibGUuVHJhbnNmZXIgPSB0cmFuc2ZlcmFibGUuaXNUcmFuc2ZlckRlc2NyaXB0b3IgPSB2b2lkIDA7CiAgY29uc3Qgc3ltYm9sc18xID0gc3ltYm9sczsKICBmdW5jdGlvbiBpc1RyYW5zZmVyYWJsZSh0aGluZykgewogICAgaWYgKCF0aGluZyB8fCB0eXBlb2YgdGhpbmcgIT09ICJvYmplY3QiKQogICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gaXNUcmFuc2ZlckRlc2NyaXB0b3IodGhpbmcpIHsKICAgIHJldHVybiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiICYmIHRoaW5nW3N5bWJvbHNfMS4kdHJhbnNmZXJhYmxlXTsKICB9CiAgdHJhbnNmZXJhYmxlLmlzVHJhbnNmZXJEZXNjcmlwdG9yID0gaXNUcmFuc2ZlckRlc2NyaXB0b3I7CiAgZnVuY3Rpb24gVHJhbnNmZXIkMShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKSB7CiAgICBpZiAoIXRyYW5zZmVyYWJsZXMpIHsKICAgICAgaWYgKCFpc1RyYW5zZmVyYWJsZShwYXlsb2FkKSkKICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICB0cmFuc2ZlcmFibGVzID0gW3BheWxvYWRdOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgW3N5bWJvbHNfMS4kdHJhbnNmZXJhYmxlXTogdHJ1ZSwKICAgICAgc2VuZDogcGF5bG9hZCwKICAgICAgdHJhbnNmZXJhYmxlcwogICAgfTsKICB9CiAgdHJhbnNmZXJhYmxlLlRyYW5zZmVyID0gVHJhbnNmZXIkMTsKICB2YXIgbWVzc2FnZXMgPSB7fTsKICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuV29ya2VyTWVzc2FnZVR5cGUgPSBleHBvcnRzMi5NYXN0ZXJNZXNzYWdlVHlwZSA9IHZvaWQgMDsKICAgIChmdW5jdGlvbihNYXN0ZXJNZXNzYWdlVHlwZSkgewogICAgICBNYXN0ZXJNZXNzYWdlVHlwZVsiY2FuY2VsIl0gPSAiY2FuY2VsIjsKICAgICAgTWFzdGVyTWVzc2FnZVR5cGVbInJ1biJdID0gInJ1biI7CiAgICB9KShleHBvcnRzMi5NYXN0ZXJNZXNzYWdlVHlwZSB8fCAoZXhwb3J0czIuTWFzdGVyTWVzc2FnZVR5cGUgPSB7fSkpOwogICAgKGZ1bmN0aW9uKFdvcmtlck1lc3NhZ2VUeXBlKSB7CiAgICAgIFdvcmtlck1lc3NhZ2VUeXBlWyJlcnJvciJdID0gImVycm9yIjsKICAgICAgV29ya2VyTWVzc2FnZVR5cGVbImluaXQiXSA9ICJpbml0IjsKICAgICAgV29ya2VyTWVzc2FnZVR5cGVbInJlc3VsdCJdID0gInJlc3VsdCI7CiAgICAgIFdvcmtlck1lc3NhZ2VUeXBlWyJydW5uaW5nIl0gPSAicnVubmluZyI7CiAgICAgIFdvcmtlck1lc3NhZ2VUeXBlWyJ1bmNhdWdodEVycm9yIl0gPSAidW5jYXVnaHRFcnJvciI7CiAgICB9KShleHBvcnRzMi5Xb3JrZXJNZXNzYWdlVHlwZSB8fCAoZXhwb3J0czIuV29ya2VyTWVzc2FnZVR5cGUgPSB7fSkpOwogIH0pKG1lc3NhZ2VzKTsKICB2YXIgaW1wbGVtZW50YXRpb25fYnJvd3NlciA9IHt9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBsZW1lbnRhdGlvbl9icm93c2VyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgY29uc3QgaXNXb3JrZXJSdW50aW1lID0gZnVuY3Rpb24gaXNXb3JrZXJSdW50aW1lMigpIHsKICAgIGNvbnN0IGlzV2luZG93Q29udGV4dCA9IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgV2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmIGluc3RhbmNlb2YgV2luZG93OwogICAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmLnBvc3RNZXNzYWdlICYmICFpc1dpbmRvd0NvbnRleHQgPyB0cnVlIDogZmFsc2U7CiAgfTsKICBjb25zdCBwb3N0TWVzc2FnZVRvTWFzdGVyID0gZnVuY3Rpb24gcG9zdE1lc3NhZ2VUb01hc3RlcjIoZGF0YSwgdHJhbnNmZXJMaXN0KSB7CiAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEsIHRyYW5zZmVyTGlzdCk7CiAgfTsKICBjb25zdCBzdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzID0gZnVuY3Rpb24gc3Vic2NyaWJlVG9NYXN0ZXJNZXNzYWdlczIob25NZXNzYWdlKSB7CiAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IChtZXNzYWdlRXZlbnQpID0+IHsKICAgICAgb25NZXNzYWdlKG1lc3NhZ2VFdmVudC5kYXRhKTsKICAgIH07CiAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHsKICAgICAgc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgbWVzc2FnZUhhbmRsZXIpOwogICAgfTsKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIG1lc3NhZ2VIYW5kbGVyKTsKICAgIHJldHVybiB1bnN1YnNjcmliZTsKICB9OwogIGltcGxlbWVudGF0aW9uX2Jyb3dzZXIuZGVmYXVsdCA9IHsKICAgIGlzV29ya2VyUnVudGltZSwKICAgIHBvc3RNZXNzYWdlVG9NYXN0ZXIsCiAgICBzdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzCiAgfTsKICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIHZhciBfX2F3YWl0ZXIgPSBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24odGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgewogICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7CiAgICAgICAgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIF9faW1wb3J0RGVmYXVsdDIgPSBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2ltcG9ydERlZmF1bHQgfHwgZnVuY3Rpb24obW9kKSB7CiAgICAgIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7ICJkZWZhdWx0IjogbW9kIH07CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5leHBvc2UgPSBleHBvcnRzMi5pc1dvcmtlclJ1bnRpbWUgPSBleHBvcnRzMi5UcmFuc2ZlciA9IGV4cG9ydHMyLnJlZ2lzdGVyU2VyaWFsaXplciA9IHZvaWQgMDsKICAgIGNvbnN0IGlzX29ic2VydmFibGVfMSA9IF9faW1wb3J0RGVmYXVsdDIoaXNPYnNlcnZhYmxlKTsKICAgIGNvbnN0IGNvbW1vbl8xID0gY29tbW9uOwogICAgY29uc3QgdHJhbnNmZXJhYmxlXzEgPSB0cmFuc2ZlcmFibGU7CiAgICBjb25zdCBtZXNzYWdlc18xID0gbWVzc2FnZXM7CiAgICBjb25zdCBpbXBsZW1lbnRhdGlvbl8xID0gX19pbXBvcnREZWZhdWx0MihpbXBsZW1lbnRhdGlvbl9icm93c2VyKTsKICAgIHZhciBjb21tb25fMiA9IGNvbW1vbjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJlZ2lzdGVyU2VyaWFsaXplciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbW1vbl8yLnJlZ2lzdGVyU2VyaWFsaXplcjsKICAgIH0gfSk7CiAgICB2YXIgdHJhbnNmZXJhYmxlXzIgPSB0cmFuc2ZlcmFibGU7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJUcmFuc2ZlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRyYW5zZmVyYWJsZV8yLlRyYW5zZmVyOwogICAgfSB9KTsKICAgIGV4cG9ydHMyLmlzV29ya2VyUnVudGltZSA9IGltcGxlbWVudGF0aW9uXzEuZGVmYXVsdC5pc1dvcmtlclJ1bnRpbWU7CiAgICBsZXQgZXhwb3NlQ2FsbGVkID0gZmFsc2U7CiAgICBjb25zdCBhY3RpdmVTdWJzY3JpcHRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGNvbnN0IGlzTWFzdGVySm9iQ2FuY2VsTWVzc2FnZSA9ICh0aGluZykgPT4gdGhpbmcgJiYgdGhpbmcudHlwZSA9PT0gbWVzc2FnZXNfMS5NYXN0ZXJNZXNzYWdlVHlwZS5jYW5jZWw7CiAgICBjb25zdCBpc01hc3RlckpvYlJ1bk1lc3NhZ2UgPSAodGhpbmcpID0+IHRoaW5nICYmIHRoaW5nLnR5cGUgPT09IG1lc3NhZ2VzXzEuTWFzdGVyTWVzc2FnZVR5cGUucnVuOwogICAgY29uc3QgaXNPYnNlcnZhYmxlJDEgPSAodGhpbmcpID0+IGlzX29ic2VydmFibGVfMS5kZWZhdWx0KHRoaW5nKSB8fCBpc1plbk9ic2VydmFibGUodGhpbmcpOwogICAgZnVuY3Rpb24gaXNaZW5PYnNlcnZhYmxlKHRoaW5nKSB7CiAgICAgIHJldHVybiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiICYmIHR5cGVvZiB0aGluZy5zdWJzY3JpYmUgPT09ICJmdW5jdGlvbiI7CiAgICB9CiAgICBmdW5jdGlvbiBkZWNvbnN0cnVjdFRyYW5zZmVyKHRoaW5nKSB7CiAgICAgIHJldHVybiB0cmFuc2ZlcmFibGVfMS5pc1RyYW5zZmVyRGVzY3JpcHRvcih0aGluZykgPyB7IHBheWxvYWQ6IHRoaW5nLnNlbmQsIHRyYW5zZmVyYWJsZXM6IHRoaW5nLnRyYW5zZmVyYWJsZXMgfSA6IHsgcGF5bG9hZDogdGhpbmcsIHRyYW5zZmVyYWJsZXM6IHZvaWQgMCB9OwogICAgfQogICAgZnVuY3Rpb24gcG9zdEZ1bmN0aW9uSW5pdE1lc3NhZ2UoKSB7CiAgICAgIGNvbnN0IGluaXRNZXNzYWdlID0gewogICAgICAgIHR5cGU6IG1lc3NhZ2VzXzEuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCwKICAgICAgICBleHBvc2VkOiB7CiAgICAgICAgICB0eXBlOiAiZnVuY3Rpb24iCiAgICAgICAgfQogICAgICB9OwogICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3Rlcihpbml0TWVzc2FnZSk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0TW9kdWxlSW5pdE1lc3NhZ2UobWV0aG9kTmFtZXMpIHsKICAgICAgY29uc3QgaW5pdE1lc3NhZ2UgPSB7CiAgICAgICAgdHlwZTogbWVzc2FnZXNfMS5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LAogICAgICAgIGV4cG9zZWQ6IHsKICAgICAgICAgIHR5cGU6ICJtb2R1bGUiLAogICAgICAgICAgbWV0aG9kczogbWV0aG9kTmFtZXMKICAgICAgICB9CiAgICAgIH07CiAgICAgIGltcGxlbWVudGF0aW9uXzEuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKGluaXRNZXNzYWdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RKb2JFcnJvck1lc3NhZ2UodWlkLCByYXdFcnJvcikgewogICAgICBjb25zdCB7IHBheWxvYWQ6IGVycm9yLCB0cmFuc2ZlcmFibGVzIH0gPSBkZWNvbnN0cnVjdFRyYW5zZmVyKHJhd0Vycm9yKTsKICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gewogICAgICAgIHR5cGU6IG1lc3NhZ2VzXzEuV29ya2VyTWVzc2FnZVR5cGUuZXJyb3IsCiAgICAgICAgdWlkLAogICAgICAgIGVycm9yOiBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpCiAgICAgIH07CiAgICAgIGltcGxlbWVudGF0aW9uXzEuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKGVycm9yTWVzc2FnZSwgdHJhbnNmZXJhYmxlcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0Sm9iUmVzdWx0TWVzc2FnZSh1aWQsIGNvbXBsZXRlZCwgcmVzdWx0VmFsdWUpIHsKICAgICAgY29uc3QgeyBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzIH0gPSBkZWNvbnN0cnVjdFRyYW5zZmVyKHJlc3VsdFZhbHVlKTsKICAgICAgY29uc3QgcmVzdWx0TWVzc2FnZSA9IHsKICAgICAgICB0eXBlOiBtZXNzYWdlc18xLldvcmtlck1lc3NhZ2VUeXBlLnJlc3VsdCwKICAgICAgICB1aWQsCiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlZCA/IHRydWUgOiB2b2lkIDAsCiAgICAgICAgcGF5bG9hZAogICAgICB9OwogICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihyZXN1bHRNZXNzYWdlLCB0cmFuc2ZlcmFibGVzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RKb2JTdGFydE1lc3NhZ2UodWlkLCByZXN1bHRUeXBlKSB7CiAgICAgIGNvbnN0IHN0YXJ0TWVzc2FnZSA9IHsKICAgICAgICB0eXBlOiBtZXNzYWdlc18xLldvcmtlck1lc3NhZ2VUeXBlLnJ1bm5pbmcsCiAgICAgICAgdWlkLAogICAgICAgIHJlc3VsdFR5cGUKICAgICAgfTsKICAgICAgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoc3RhcnRNZXNzYWdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShlcnJvcikgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHsKICAgICAgICAgIHR5cGU6IG1lc3NhZ2VzXzEuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvciwKICAgICAgICAgIGVycm9yOiBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpCiAgICAgICAgfTsKICAgICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihlcnJvck1lc3NhZ2UpOwogICAgICB9IGNhdGNoIChzdWJFcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIk5vdCByZXBvcnRpbmcgdW5jYXVnaHQgZXJyb3IgYmFjayB0byBtYXN0ZXIgdGhyZWFkIGFzIGl0IG9jY3VyZWQgd2hpbGUgcmVwb3J0aW5nIGFuIHVuY2F1Z2h0IGVycm9yIGFscmVhZHkuXG5MYXRlc3QgZXJyb3I6Iiwgc3ViRXJyb3IsICJcbk9yaWdpbmFsIGVycm9yOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcnVuRnVuY3Rpb24oam9iVUlELCBmbiwgYXJncykgewogICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIGxldCBzeW5jUmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICBzeW5jUmVzdWx0ID0gZm4oLi4uYXJncyk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIHJldHVybiBwb3N0Sm9iRXJyb3JNZXNzYWdlKGpvYlVJRCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRUeXBlID0gaXNPYnNlcnZhYmxlJDEoc3luY1Jlc3VsdCkgPyAib2JzZXJ2YWJsZSIgOiAicHJvbWlzZSI7CiAgICAgICAgcG9zdEpvYlN0YXJ0TWVzc2FnZShqb2JVSUQsIHJlc3VsdFR5cGUpOwogICAgICAgIGlmIChpc09ic2VydmFibGUkMShzeW5jUmVzdWx0KSkgewogICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3luY1Jlc3VsdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiBwb3N0Sm9iUmVzdWx0TWVzc2FnZShqb2JVSUQsIGZhbHNlLCBjb21tb25fMS5zZXJpYWxpemUodmFsdWUpKSwgKGVycm9yKSA9PiB7CiAgICAgICAgICAgIHBvc3RKb2JFcnJvck1lc3NhZ2Uoam9iVUlELCBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpKTsKICAgICAgICAgICAgYWN0aXZlU3Vic2NyaXB0aW9ucy5kZWxldGUoam9iVUlEKTsKICAgICAgICAgIH0sICgpID0+IHsKICAgICAgICAgICAgcG9zdEpvYlJlc3VsdE1lc3NhZ2Uoam9iVUlELCB0cnVlKTsKICAgICAgICAgICAgYWN0aXZlU3Vic2NyaXB0aW9ucy5kZWxldGUoam9iVUlEKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYWN0aXZlU3Vic2NyaXB0aW9ucy5zZXQoam9iVUlELCBzdWJzY3JpcHRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBzeW5jUmVzdWx0OwogICAgICAgICAgICBwb3N0Sm9iUmVzdWx0TWVzc2FnZShqb2JVSUQsIHRydWUsIGNvbW1vbl8xLnNlcmlhbGl6ZShyZXN1bHQpKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHBvc3RKb2JFcnJvck1lc3NhZ2Uoam9iVUlELCBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZXhwb3NlMihleHBvc2VkKSB7CiAgICAgIGlmICghaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoImV4cG9zZSgpIGNhbGxlZCBpbiB0aGUgbWFzdGVyIHRocmVhZC4iKTsKICAgICAgfQogICAgICBpZiAoZXhwb3NlQ2FsbGVkKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoImV4cG9zZSgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBub3QgcG9zc2libGUuIFBhc3MgYW4gb2JqZWN0IHRvIGV4cG9zZSgpIGlmIHlvdSB3YW50IHRvIGV4cG9zZSBtdWx0aXBsZSBmdW5jdGlvbnMuIik7CiAgICAgIH0KICAgICAgZXhwb3NlQ2FsbGVkID0gdHJ1ZTsKICAgICAgaWYgKHR5cGVvZiBleHBvc2VkID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LnN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXMoKG1lc3NhZ2VEYXRhKSA9PiB7CiAgICAgICAgICBpZiAoaXNNYXN0ZXJKb2JSdW5NZXNzYWdlKG1lc3NhZ2VEYXRhKSAmJiAhbWVzc2FnZURhdGEubWV0aG9kKSB7CiAgICAgICAgICAgIHJ1bkZ1bmN0aW9uKG1lc3NhZ2VEYXRhLnVpZCwgZXhwb3NlZCwgbWVzc2FnZURhdGEuYXJncy5tYXAoY29tbW9uXzEuZGVzZXJpYWxpemUpKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBwb3N0RnVuY3Rpb25Jbml0TWVzc2FnZSgpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvc2VkID09PSAib2JqZWN0IiAmJiBleHBvc2VkKSB7CiAgICAgICAgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LnN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXMoKG1lc3NhZ2VEYXRhKSA9PiB7CiAgICAgICAgICBpZiAoaXNNYXN0ZXJKb2JSdW5NZXNzYWdlKG1lc3NhZ2VEYXRhKSAmJiBtZXNzYWdlRGF0YS5tZXRob2QpIHsKICAgICAgICAgICAgcnVuRnVuY3Rpb24obWVzc2FnZURhdGEudWlkLCBleHBvc2VkW21lc3NhZ2VEYXRhLm1ldGhvZF0sIG1lc3NhZ2VEYXRhLmFyZ3MubWFwKGNvbW1vbl8xLmRlc2VyaWFsaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbWV0aG9kTmFtZXMgPSBPYmplY3Qua2V5cyhleHBvc2VkKS5maWx0ZXIoKGtleSkgPT4gdHlwZW9mIGV4cG9zZWRba2V5XSA9PT0gImZ1bmN0aW9uIik7CiAgICAgICAgcG9zdE1vZHVsZUluaXRNZXNzYWdlKG1ldGhvZE5hbWVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8gZXhwb3NlKCkuIEV4cGVjdGVkIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LCBnb3Q6ICR7ZXhwb3NlZH1gKTsKICAgICAgfQogICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQuc3Vic2NyaWJlVG9NYXN0ZXJNZXNzYWdlcygobWVzc2FnZURhdGEpID0+IHsKICAgICAgICBpZiAoaXNNYXN0ZXJKb2JDYW5jZWxNZXNzYWdlKG1lc3NhZ2VEYXRhKSkgewogICAgICAgICAgY29uc3Qgam9iVUlEID0gbWVzc2FnZURhdGEudWlkOwogICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYWN0aXZlU3Vic2NyaXB0aW9ucy5nZXQoam9iVUlEKTsKICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIGFjdGl2ZVN1YnNjcmlwdGlvbnMuZGVsZXRlKGpvYlVJRCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmV4cG9zZSA9IGV4cG9zZTI7CiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIgJiYgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKSB7CiAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCAoZXZlbnQpID0+IHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShldmVudC5lcnJvciB8fCBldmVudCksIDI1MCk7CiAgICAgIH0pOwogICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoInVuaGFuZGxlZHJlamVjdGlvbiIsIChldmVudCkgPT4gewogICAgICAgIGNvbnN0IGVycm9yID0gZXZlbnQucmVhc29uOwogICAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcG9zdFVuY2F1Z2h0RXJyb3JNZXNzYWdlKGVycm9yKSwgMjUwKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgcHJvY2Vzcy5vbiA9PT0gImZ1bmN0aW9uIiAmJiBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkpIHsKICAgICAgcHJvY2Vzcy5vbigidW5jYXVnaHRFeGNlcHRpb24iLCAoZXJyb3IpID0+IHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShlcnJvciksIDI1MCk7CiAgICAgIH0pOwogICAgICBwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCAoZXJyb3IpID0+IHsKICAgICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShlcnJvciksIDI1MCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KSh3b3JrZXIpOwogIHZhciBXb3JrZXJDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHdvcmtlcik7CiAgY29uc3QgZXhwb3NlID0gV29ya2VyQ29udGV4dC5leHBvc2U7CiAgV29ya2VyQ29udGV4dC5yZWdpc3RlclNlcmlhbGl6ZXI7CiAgY29uc3QgVHJhbnNmZXIgPSBXb3JrZXJDb250ZXh0LlRyYW5zZmVyOwogIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAib2JqZWN0IiAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDsKICB2YXIgZnJlZUdsb2JhbCQxID0gZnJlZUdsb2JhbDsKICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAib2JqZWN0IiAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjsKICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwkMSB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOwogIHZhciByb290JDEgPSByb290OwogIHZhciBTeW1ib2wkMSA9IHJvb3QkMS5TeW1ib2w7CiAgdmFyIFN5bWJvbCQyID0gU3ltYm9sJDE7CiAgdmFyIG9iamVjdFByb3RvJDUgPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBoYXNPd25Qcm9wZXJ0eSQzID0gb2JqZWN0UHJvdG8kNS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmckMSA9IG9iamVjdFByb3RvJDUudG9TdHJpbmc7CiAgdmFyIHN5bVRvU3RyaW5nVGFnJDEgPSBTeW1ib2wkMiA/IFN5bWJvbCQyLnRvU3RyaW5nVGFnIDogdm9pZCAwOwogIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkgewogICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkkMy5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyQxKSwgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWckMV07CiAgICB0cnkgewogICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXSA9IHZvaWQgMDsKICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgIH0KICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZyQxLmNhbGwodmFsdWUpOwogICAgaWYgKHVubWFza2VkKSB7CiAgICAgIGlmIChpc093bikgewogICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnJDFdID0gdGFnOwogICAgICB9IGVsc2UgewogICAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIG9iamVjdFByb3RvJDQgPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvJDQudG9TdHJpbmc7CiAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHsKICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTsKICB9CiAgdmFyIG51bGxUYWcgPSAiW29iamVjdCBOdWxsXSIsIHVuZGVmaW5lZFRhZyA9ICJbb2JqZWN0IFVuZGVmaW5lZF0iOwogIHZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCQyID8gU3ltYm9sJDIudG9TdHJpbmdUYWcgOiB2b2lkIDA7CiAgZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHZhbHVlID09PSB2b2lkIDAgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnOwogICAgfQogICAgcmV0dXJuIHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkgPyBnZXRSYXdUYWcodmFsdWUpIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpOwogIH0KICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAib2JqZWN0IjsKICB9CiAgdmFyIHN5bWJvbFRhZyA9ICJbb2JqZWN0IFN5bWJvbF0iOwogIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7CiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICJzeW1ib2wiIHx8IGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnOwogIH0KICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHsKICAgIHZhciBpbmRleCA9IC0xLCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCwgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CiAgdmFyIGlzQXJyYXkkMSA9IGlzQXJyYXk7CiAgdmFyIHJlV2hpdGVzcGFjZSA9IC9ccy87CiAgZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykgewogICAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDsKICAgIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkgewogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KICB2YXIgcmVUcmltU3RhcnQgPSAvXlxzKy87CiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgIiIpIDogc3RyaW5nOwogIH0KICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkgewogICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAib2JqZWN0IiB8fCB0eXBlID09ICJmdW5jdGlvbiIpOwogIH0KICB2YXIgTkFOID0gMCAvIDA7CiAgdmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTsKICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTsKICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTsKICB2YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7CiAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gIm51bWJlciIpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkgewogICAgICByZXR1cm4gTkFOOwogICAgfQogICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkgewogICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAiZnVuY3Rpb24iID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7CiAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gb3RoZXIgKyAiIiA6IG90aGVyOwogICAgfQogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAic3RyaW5nIikgewogICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTsKICAgIH0KICAgIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpOwogICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTsKICAgIHJldHVybiBpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpIDogcmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZTsKICB9CiAgdmFyIElORklOSVRZID0gMSAvIDAsIE1BWF9JTlRFR0VSID0gMTc5NzY5MzEzNDg2MjMxNTdlMjkyOwogIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDsKICAgIH0KICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpOwogICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7CiAgICAgIHZhciBzaWduID0gdmFsdWUgPCAwID8gLTEgOiAxOwogICAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSOwogICAgfQogICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDsKICB9CiAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7CiAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLCByZW1haW5kZXIgPSByZXN1bHQgJSAxOwogICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gcmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0IDogMDsKICB9CiAgdmFyIGFzeW5jVGFnID0gIltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLCBmdW5jVGFnJDEgPSAiW29iamVjdCBGdW5jdGlvbl0iLCBnZW5UYWcgPSAiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCBwcm94eVRhZyA9ICJbb2JqZWN0IFByb3h5XSI7CiAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpOwogICAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnJDEgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnOwogIH0KICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkgewogICAgdmFyIGluZGV4ID0gLTEsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTsKICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIHZhciBNQVhfU0FGRV9JTlRFR0VSJDEgPSA5MDA3MTk5MjU0NzQwOTkxOwogIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHsKICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlOwogICAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSJDEgOiBsZW5ndGg7CiAgICByZXR1cm4gISFsZW5ndGggJiYgKHR5cGUgPT0gIm51bWJlciIgfHwgdHlwZSAhPSAic3ltYm9sIiAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkgJiYgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpOwogIH0KICBmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHsKICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjsKICB9CiAgdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxOwogIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7CiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICJudW1iZXIiICYmIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjsKICB9CiAgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpOwogIH0KICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkgewogICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4OwogICAgaWYgKHR5cGUgPT0gIm51bWJlciIgPyBpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpIDogdHlwZSA9PSAic3RyaW5nIiAmJiBpbmRleCBpbiBvYmplY3QpIHsKICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgdmFyIG9iamVjdFByb3RvJDMgPSBPYmplY3QucHJvdG90eXBlOwogIGZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7CiAgICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLCBwcm90byA9IHR5cGVvZiBDdG9yID09ICJmdW5jdGlvbiIgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG8kMzsKICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87CiAgfQogIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkgewogICAgdmFyIGluZGV4ID0gLTEsIHJlc3VsdCA9IEFycmF5KG4pOwogICAgd2hpbGUgKCsraW5kZXggPCBuKSB7CiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgYXJnc1RhZyQxID0gIltvYmplY3QgQXJndW1lbnRzXSI7CiAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7CiAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnJDE7CiAgfQogIHZhciBvYmplY3RQcm90byQyID0gT2JqZWN0LnByb3RvdHlwZTsKICB2YXIgaGFzT3duUHJvcGVydHkkMiA9IG9iamVjdFByb3RvJDIuaGFzT3duUHJvcGVydHk7CiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8kMi5wcm9wZXJ0eUlzRW51bWVyYWJsZTsKICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYXJndW1lbnRzOwogIH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkkMi5jYWxsKHZhbHVlLCAiY2FsbGVlIikgJiYgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICJjYWxsZWUiKTsKICB9OwogIHZhciBpc0FyZ3VtZW50cyQxID0gaXNBcmd1bWVudHM7CiAgZnVuY3Rpb24gc3R1YkZhbHNlKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICB2YXIgZnJlZUV4cG9ydHMkMSA9IHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0czsKICB2YXIgZnJlZU1vZHVsZSQxID0gZnJlZUV4cG9ydHMkMSAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTsKICB2YXIgbW9kdWxlRXhwb3J0cyQxID0gZnJlZU1vZHVsZSQxICYmIGZyZWVNb2R1bGUkMS5leHBvcnRzID09PSBmcmVlRXhwb3J0cyQxOwogIHZhciBCdWZmZXIyID0gbW9kdWxlRXhwb3J0cyQxID8gcm9vdCQxLkJ1ZmZlciA6IHZvaWQgMDsKICB2YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIyID8gQnVmZmVyMi5pc0J1ZmZlciA6IHZvaWQgMDsKICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7CiAgdmFyIGlzQnVmZmVyJDEgPSBpc0J1ZmZlcjsKICB2YXIgYXJnc1RhZyA9ICJbb2JqZWN0IEFyZ3VtZW50c10iLCBhcnJheVRhZyA9ICJbb2JqZWN0IEFycmF5XSIsIGJvb2xUYWcgPSAiW29iamVjdCBCb29sZWFuXSIsIGRhdGVUYWcgPSAiW29iamVjdCBEYXRlXSIsIGVycm9yVGFnID0gIltvYmplY3QgRXJyb3JdIiwgZnVuY1RhZyA9ICJbb2JqZWN0IEZ1bmN0aW9uXSIsIG1hcFRhZyA9ICJbb2JqZWN0IE1hcF0iLCBudW1iZXJUYWcgPSAiW29iamVjdCBOdW1iZXJdIiwgb2JqZWN0VGFnID0gIltvYmplY3QgT2JqZWN0XSIsIHJlZ2V4cFRhZyA9ICJbb2JqZWN0IFJlZ0V4cF0iLCBzZXRUYWcgPSAiW29iamVjdCBTZXRdIiwgc3RyaW5nVGFnID0gIltvYmplY3QgU3RyaW5nXSIsIHdlYWtNYXBUYWcgPSAiW29iamVjdCBXZWFrTWFwXSI7CiAgdmFyIGFycmF5QnVmZmVyVGFnID0gIltvYmplY3QgQXJyYXlCdWZmZXJdIiwgZGF0YVZpZXdUYWcgPSAiW29iamVjdCBEYXRhVmlld10iLCBmbG9hdDMyVGFnID0gIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIGZsb2F0NjRUYWcgPSAiW29iamVjdCBGbG9hdDY0QXJyYXldIiwgaW50OFRhZyA9ICJbb2JqZWN0IEludDhBcnJheV0iLCBpbnQxNlRhZyA9ICJbb2JqZWN0IEludDE2QXJyYXldIiwgaW50MzJUYWcgPSAiW29iamVjdCBJbnQzMkFycmF5XSIsIHVpbnQ4VGFnID0gIltvYmplY3QgVWludDhBcnJheV0iLCB1aW50OENsYW1wZWRUYWcgPSAiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCB1aW50MTZUYWcgPSAiW29iamVjdCBVaW50MTZBcnJheV0iLCB1aW50MzJUYWcgPSAiW29iamVjdCBVaW50MzJBcnJheV0iOwogIHZhciB0eXBlZEFycmF5VGFncyA9IHt9OwogIHR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7CiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID0gdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPSB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID0gdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPSB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwogIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHsKICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07CiAgfQogIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmModmFsdWUpOwogICAgfTsKICB9CiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzOwogIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IiAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7CiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7CiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsJDEucHJvY2VzczsKICB2YXIgbm9kZVV0aWwgPSBmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgidXRpbCIpLnR5cGVzOwogICAgICBpZiAodHlwZXMpIHsKICAgICAgICByZXR1cm4gdHlwZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygidXRpbCIpOwogICAgfSBjYXRjaCAoZSkgewogICAgfQogIH0oKTsKICB2YXIgbm9kZVV0aWwkMSA9IG5vZGVVdGlsOwogIHZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwkMSAmJiBub2RlVXRpbCQxLmlzVHlwZWRBcnJheTsKICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7CiAgdmFyIGlzVHlwZWRBcnJheSQxID0gaXNUeXBlZEFycmF5OwogIHZhciBvYmplY3RQcm90byQxID0gT2JqZWN0LnByb3RvdHlwZTsKICB2YXIgaGFzT3duUHJvcGVydHkkMSA9IG9iamVjdFByb3RvJDEuaGFzT3duUHJvcGVydHk7CiAgZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7CiAgICB2YXIgaXNBcnIgPSBpc0FycmF5JDEodmFsdWUpLCBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyQxKHZhbHVlKSwgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlciQxKHZhbHVlKSwgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSQxKHZhbHVlKSwgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLCByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eSQxLmNhbGwodmFsdWUsIGtleSkpICYmICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAibGVuZ3RoIiB8fCBpc0J1ZmYgJiYgKGtleSA9PSAib2Zmc2V0IiB8fCBrZXkgPT0gInBhcmVudCIpIHx8IGlzVHlwZSAmJiAoa2V5ID09ICJidWZmZXIiIHx8IGtleSA9PSAiYnl0ZUxlbmd0aCIgfHwga2V5ID09ICJieXRlT2Zmc2V0IikgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkgewogICAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7CiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTsKICAgIH07CiAgfQogIHZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTsKICB2YXIgbmF0aXZlS2V5cyQxID0gbmF0aXZlS2V5czsKICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OwogIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkgewogICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7CiAgICAgIHJldHVybiBuYXRpdmVLZXlzJDEob2JqZWN0KTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBbXTsKICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkgewogICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICJjb25zdHJ1Y3RvciIpIHsKICAgICAgICByZXN1bHQucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewogICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpOwogIH0KICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHsKICAgIGlmIChudW1iZXIgPT09IG51bWJlcikgewogICAgICBpZiAodXBwZXIgIT09IHZvaWQgMCkgewogICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyOwogICAgICB9CiAgICAgIGlmIChsb3dlciAhPT0gdm9pZCAwKSB7CiAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudW1iZXI7CiAgfQogIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykgewogICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHsKICAgICAgcmV0dXJuIG9iamVjdFtrZXldOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHsKICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7CiAgfQogIHZhciBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tOwogIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7CiAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpOwogIH0KICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkgewogICAgdmFyIGluZGV4ID0gLTEsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTsKICAgIHNpemUgPSBzaXplID09PSB2b2lkIDAgPyBsZW5ndGggOiBzaXplOwogICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7CiAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSwgdmFsdWUgPSBhcnJheVtyYW5kXTsKICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07CiAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlOwogICAgfQogICAgYXJyYXkubGVuZ3RoID0gc2l6ZTsKICAgIHJldHVybiBhcnJheTsKICB9CiAgZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7CiAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpOwogIH0KICBmdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuKSB7CiAgICB2YXIgYXJyYXkgPSB2YWx1ZXMoY29sbGVjdGlvbik7CiAgICByZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTsKICB9CiAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkgewogICAgaWYgKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdm9pZCAwKSB7CiAgICAgIG4gPSAxOwogICAgfSBlbHNlIHsKICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgIH0KICAgIHZhciBmdW5jID0gaXNBcnJheSQxKGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7CiAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTsKICB9CiAgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHsKICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKICB9CiAgZnVuY3Rpb24gYmlzZWN0b3IoZikgewogICAgbGV0IGRlbHRhID0gZjsKICAgIGxldCBjb21wYXJlID0gZjsKICAgIGlmIChmLmxlbmd0aCA9PT0gMSkgewogICAgICBkZWx0YSA9IChkLCB4KSA9PiBmKGQpIC0geDsKICAgICAgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoZik7CiAgICB9CiAgICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvLCBoaSkgewogICAgICBpZiAobG8gPT0gbnVsbCkKICAgICAgICBsbyA9IDA7CiAgICAgIGlmIChoaSA9PSBudWxsKQogICAgICAgIGhpID0gYS5sZW5ndGg7CiAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgY29uc3QgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkKICAgICAgICAgIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICBoaSA9IG1pZDsKICAgICAgfQogICAgICByZXR1cm4gbG87CiAgICB9CiAgICBmdW5jdGlvbiByaWdodChhLCB4LCBsbywgaGkpIHsKICAgICAgaWYgKGxvID09IG51bGwpCiAgICAgICAgbG8gPSAwOwogICAgICBpZiAoaGkgPT0gbnVsbCkKICAgICAgICBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIGNvbnN0IG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApCiAgICAgICAgICBoaSA9IG1pZDsKICAgICAgICBlbHNlCiAgICAgICAgICBsbyA9IG1pZCArIDE7CiAgICAgIH0KICAgICAgcmV0dXJuIGxvOwogICAgfQogICAgZnVuY3Rpb24gY2VudGVyKGEsIHgsIGxvLCBoaSkgewogICAgICBpZiAobG8gPT0gbnVsbCkKICAgICAgICBsbyA9IDA7CiAgICAgIGlmIChoaSA9PSBudWxsKQogICAgICAgIGhpID0gYS5sZW5ndGg7CiAgICAgIGNvbnN0IGkyID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTsKICAgICAgcmV0dXJuIGkyID4gbG8gJiYgZGVsdGEoYVtpMiAtIDFdLCB4KSA+IC1kZWx0YShhW2kyXSwgeCkgPyBpMiAtIDEgOiBpMjsKICAgIH0KICAgIHJldHVybiB7IGxlZnQsIGNlbnRlciwgcmlnaHQgfTsKICB9CiAgZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7CiAgICByZXR1cm4gKGQsIHgpID0+IGFzY2VuZGluZyhmKGQpLCB4KTsKICB9CiAgY2xhc3MgRGF0YVNvdXJjZSB7CiAgICBjb25zdHJ1Y3RvcihmaWxlLCBjaHJvbVNpemVzLCBvcHRpb25zKSB7CiAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIHRoaXMuY2hyb21JbmZvID0gc2l6ZXNUb0Nocm9tSW5mbyhjaHJvbVNpemVzKTsKICAgICAgdGhpcy50aWxlc2V0SW5mbyA9IHRpbGVzZXRJbmZvRnJvbUNocm9tSW5mbyh0aGlzLmNocm9tSW5mbyk7CiAgICB9CiAgfQogIGNvbnN0IGNocm9tSW5mb0Jpc2VjdG9yID0gYmlzZWN0b3IoKGQpID0+IGQucG9zKS5sZWZ0OwogIGNvbnN0IGNoclRvQWJzID0gKGNocm9tLCBjaHJvbVBvcywgY2hyb21JbmZvKSA9PiBjaHJvbUluZm8uY2hyUG9zaXRpb25zW2Nocm9tXS5wb3MgKyBjaHJvbVBvczsKICBjb25zdCBhYnNUb0NociA9IChhYnNQb3NpdGlvbiwgY2hyb21JbmZvKSA9PiB7CiAgICBpZiAoIWNocm9tSW5mbyB8fCAhY2hyb21JbmZvLmN1bVBvc2l0aW9ucyB8fCAhY2hyb21JbmZvLmN1bVBvc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgaW5zZXJ0UG9pbnQgPSBjaHJvbUluZm9CaXNlY3RvcihjaHJvbUluZm8uY3VtUG9zaXRpb25zLCBhYnNQb3NpdGlvbik7CiAgICBjb25zdCBsYXN0Q2hyID0gY2hyb21JbmZvLmN1bVBvc2l0aW9uc1tjaHJvbUluZm8uY3VtUG9zaXRpb25zLmxlbmd0aCAtIDFdLmNocjsKICAgIGNvbnN0IGxhc3RMZW5ndGggPSBjaHJvbUluZm8uY2hyb21MZW5ndGhzW2xhc3RDaHJdOwogICAgaW5zZXJ0UG9pbnQgLT0gaW5zZXJ0UG9pbnQgPiAwICYmIDE7CiAgICBsZXQgY2hyUG9zaXRpb24gPSBNYXRoLmZsb29yKGFic1Bvc2l0aW9uIC0gY2hyb21JbmZvLmN1bVBvc2l0aW9uc1tpbnNlcnRQb2ludF0ucG9zKTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgaWYgKGNoclBvc2l0aW9uIDwgMCkgewogICAgICBvZmZzZXQgPSBjaHJQb3NpdGlvbiAtIDE7CiAgICAgIGNoclBvc2l0aW9uID0gMTsKICAgIH0KICAgIGlmIChpbnNlcnRQb2ludCA9PT0gY2hyb21JbmZvLmN1bVBvc2l0aW9ucy5sZW5ndGggLSAxICYmIGNoclBvc2l0aW9uID4gbGFzdExlbmd0aCkgewogICAgICBvZmZzZXQgPSBjaHJQb3NpdGlvbiAtIGxhc3RMZW5ndGg7CiAgICAgIGNoclBvc2l0aW9uID0gbGFzdExlbmd0aDsKICAgIH0KICAgIHJldHVybiBbY2hyb21JbmZvLmN1bVBvc2l0aW9uc1tpbnNlcnRQb2ludF0uY2hyLCBjaHJQb3NpdGlvbiwgb2Zmc2V0LCBpbnNlcnRQb2ludF07CiAgfTsKICBmdW5jdGlvbiB0aWxlc2V0SW5mb0Zyb21DaHJvbUluZm8oY2hyb21JbmZvLCB0aWxlU2l6ZSA9IDEwMjQpIHsKICAgIHJldHVybiB7CiAgICAgIHRpbGVfc2l6ZTogdGlsZVNpemUsCiAgICAgIGJpbnNfcGVyX2RpbWVuc2lvbjogdGlsZVNpemUsCiAgICAgIG1heF96b29tOiBNYXRoLmNlaWwoTWF0aC5sb2coY2hyb21JbmZvLnRvdGFsTGVuZ3RoIC8gdGlsZVNpemUpIC8gTWF0aC5sb2coMikpLAogICAgICBtYXhfd2lkdGg6IGNocm9tSW5mby50b3RhbExlbmd0aCwKICAgICAgbWluX3BvczogWzBdLAogICAgICBtYXhfcG9zOiBbY2hyb21JbmZvLnRvdGFsTGVuZ3RoXQogICAgfTsKICB9CiAgZnVuY3Rpb24gc2l6ZXNUb0Nocm9tSW5mbyhzaXplcykgewogICAgY29uc3QgaW5mbyA9IHsKICAgICAgY3VtUG9zaXRpb25zOiBbXSwKICAgICAgY2hyb21MZW5ndGhzOiB7fSwKICAgICAgY2hyUG9zaXRpb25zOiB7fSwKICAgICAgdG90YWxMZW5ndGg6IDAKICAgIH07CiAgICBzaXplcy5mb3JFYWNoKChbY2hyLCBsZW5ndGhdLCBpMikgPT4gewogICAgICBjb25zdCBjaHJQb3NpdGlvbiA9IHsgaWQ6IGkyLCBjaHIsIHBvczogaW5mby50b3RhbExlbmd0aCB9OwogICAgICBpbmZvLmNoclBvc2l0aW9uc1tjaHJdID0gY2hyUG9zaXRpb247CiAgICAgIGluZm8uY2hyb21MZW5ndGhzW2Nocl0gPSBsZW5ndGg7CiAgICAgIGluZm8uY3VtUG9zaXRpb25zLnB1c2goY2hyUG9zaXRpb24pOwogICAgICBpbmZvLnRvdGFsTGVuZ3RoICs9IGxlbmd0aDsKICAgIH0pOwogICAgcmV0dXJuIHsKICAgICAgLi4uaW5mbywKICAgICAgYWJzVG9DaHI6IChhYnNQb3MpID0+IGluZm8uY2hyUG9zaXRpb25zID8gYWJzVG9DaHIoYWJzUG9zLCBpbmZvKSA6IG51bGwsCiAgICAgIGNoclRvQWJzOiAoW2Nock5hbWUsIGNoclBvc10pID0+IGluZm8uY2hyUG9zaXRpb25zID8gY2hyVG9BYnMoY2hyTmFtZSwgY2hyUG9zLCBpbmZvKSA6IG51bGwKICAgIH07CiAgfQogIGNsYXNzIFJlbW90ZUZpbGUgZXh0ZW5kcyBSZW1vdGVGaWxlJDEgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIHRoaXMucmVhZCA9IGFzeW5jIChidWZmZXIyLCBvZmZzZXQgPSAwLCBsZW5ndGgsIHBvc2l0aW9uID0gMCwgb3B0cyA9IHt9KSA9PiB7CiAgICAgICAgY29uc3QgeyBoZWFkZXJzID0ge30sIHNpZ25hbCwgb3ZlcnJpZGVzID0ge30gfSA9IG9wdHM7CiAgICAgICAgaWYgKGxlbmd0aCA8IEluZmluaXR5KSB7CiAgICAgICAgICBoZWFkZXJzLnJhbmdlID0gYGJ5dGVzPSR7cG9zaXRpb259LSR7cG9zaXRpb24gKyBsZW5ndGh9YDsKICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gSW5maW5pdHkgJiYgcG9zaXRpb24gIT09IDApIHsKICAgICAgICAgIGhlYWRlcnMucmFuZ2UgPSBgYnl0ZXM9JHtwb3NpdGlvbn0tYDsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXJncyA9IHsKICAgICAgICAgIC4uLnRoaXMuYmFzZU92ZXJyaWRlcywKICAgICAgICAgIC4uLm92ZXJyaWRlcywKICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgLi4uaGVhZGVycywKICAgICAgICAgICAgLi4ub3ZlcnJpZGVzLmhlYWRlcnMsCiAgICAgICAgICAgIC4uLnRoaXMuYmFzZU92ZXJyaWRlcy5oZWFkZXJzCiAgICAgICAgICB9LAogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHJlZGlyZWN0OiAiZm9sbG93IiwKICAgICAgICAgIG1vZGU6ICJjb3JzIiwKICAgICAgICAgIHNpZ25hbAogICAgICAgIH07CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKHRoaXMudXJsLCBhcmdzKTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gJHt0aGlzLnVybH1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA2KSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckZyb21SZXNwb25zZShyZXNwb25zZSk7CiAgICAgICAgICBjb25zdCBieXRlc0NvcGllZCA9IHJlc3BvbnNlRGF0YS5jb3B5KGJ1ZmZlcjIsIG9mZnNldCwgMCwgTWF0aC5taW4obGVuZ3RoLCByZXNwb25zZURhdGEubGVuZ3RoKSk7CiAgICAgICAgICBjb25zdCByZXMgPSByZXNwb25zZS5oZWFkZXJzLmdldCgiY29udGVudC1yYW5nZSIpOwogICAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gL1wvKFxkKykkLy5leGVjKHJlcyB8fCAiIik7CiAgICAgICAgICBpZiAoc2l6ZU1hdGNoICYmIHNpemVNYXRjaFsxXSkgewogICAgICAgICAgICB0aGlzLl9zdGF0ID0geyBzaXplOiBwYXJzZUludChzaXplTWF0Y2hbMV0sIDEwKSB9OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsgYnl0ZXNSZWFkOiBieXRlc0NvcGllZCwgYnVmZmVyOiBidWZmZXIyIH07CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gZmV0Y2hpbmcgJHt0aGlzLnVybH1gKTsKICAgICAgfTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaXNHRkYzRmVhdHVyZShlbnRyeSkgewogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZW50cnkpOwogIH0KICBmdW5jdGlvbiBtYWtlUmFuZG9tU29ydGVkQXJyYXkobiwgbWF4VmFsdWUpIHsKICAgIGNvbnN0IHJhbmRvbUFycmF5ID0gW107CiAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbjsgaTIrKykgewogICAgICBjb25zdCByYW5kb21OdW1iZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4VmFsdWUgKyAxKSk7CiAgICAgIHJhbmRvbUFycmF5LnB1c2gocmFuZG9tTnVtYmVyKTsKICAgIH0KICAgIGNvbnN0IHNvcnRlZCA9IHJhbmRvbUFycmF5LnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKICAgIHJldHVybiBbLi4ubmV3IFNldChzb3J0ZWQpXTsKICB9CiAgY29uc3QgX0dmZkZpbGUgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0YmksIHVpZCkgewogICAgICBfX3ByaXZhdGVBZGQodGhpcywgX2dldE51bWJlckZlYXR1cmVzKTsKICAgICAgX19wcml2YXRlQWRkKHRoaXMsIF9nZXRMaW5lUHJvbWlzZXMpOwogICAgICBfX3ByaXZhdGVBZGQodGhpcywgX3VpZCwgdm9pZCAwKTsKICAgICAgX19wcml2YXRlQWRkKHRoaXMsIF9uX2ZlYXR1cmVzLCB2b2lkIDApOwogICAgICB0aGlzLnRiaSA9IHRiaTsKICAgICAgX19wcml2YXRlU2V0KHRoaXMsIF91aWQsIHVpZCk7CiAgICB9CiAgICBzdGF0aWMgZnJvbVVybCh1cmwsIGluZGV4VXJsLCB1aWQpIHsKICAgICAgY29uc3QgdGJpID0gbmV3IFRhYml4SW5kZXhlZEZpbGUoewogICAgICAgIGZpbGVoYW5kbGU6IG5ldyBSZW1vdGVGaWxlKHVybCksCiAgICAgICAgdGJpRmlsZWhhbmRsZTogbmV3IFJlbW90ZUZpbGUoaW5kZXhVcmwpCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IF9HZmZGaWxlKHRiaSwgdWlkKTsKICAgIH0KICAgIGFzeW5jIGdldFRpbGVEYXRhKG1pblgsIG1heFgpIHsKICAgICAgY29uc3Qgc291cmNlID0gZGF0YVNvdXJjZXMuZ2V0KF9fcHJpdmF0ZUdldCh0aGlzLCBfdWlkKSk7CiAgICAgIGNvbnN0IHNhbXBsZUxlbmd0aCA9IHNvdXJjZS5vcHRpb25zLnNhbXBsZUxlbmd0aDsKICAgICAgY29uc3QgYXR0cmlidXRlc1RvRmllbGRzID0gc291cmNlLm9wdGlvbnMuYXR0cmlidXRlc1RvRmllbGRzOwogICAgICBhd2FpdCBfX3ByaXZhdGVNZXRob2QodGhpcywgX2dldE51bWJlckZlYXR1cmVzLCBnZXROdW1iZXJGZWF0dXJlc19mbikuY2FsbCh0aGlzKTsKICAgICAgZnVuY3Rpb24gZmlsdGVyTGluZXMobGluZXMpIHsKICAgICAgICBjb25zdCBub25DaGlsZExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiB7CiAgICAgICAgICBjb25zdCBsaW5lQ29sdW1ucyA9IGxpbmUuc3BsaXQoIgkiKTsKICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBsaW5lQ29sdW1uc1s4XTsKICAgICAgICAgIHJldHVybiAhYXR0cmlidXRlcy5pbmNsdWRlcygiUGFyZW50PSIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzYW1wbGVTaXplKG5vbkNoaWxkTGluZXMsIHNhbXBsZUxlbmd0aCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGFyc2VkTGluZXNUb1RpbGVzKHBhcnNlZCkgewogICAgICAgIGxldCB0aWxlczIgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFyc2VkKSB7CiAgICAgICAgICBpZiAoaXNHRkYzRmVhdHVyZShsaW5lKSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgbGluZSkgewogICAgICAgICAgICAgIGlmIChmZWF0dXJlLnNlcV9pZCAmJiBmZWF0dXJlLnN0YXJ0KQogICAgICAgICAgICAgICAgZmVhdHVyZS5zdGFydCA9IHNvdXJjZS5jaHJvbUluZm8uY2hyVG9BYnMoW2ZlYXR1cmUuc2VxX2lkLCBmZWF0dXJlLnN0YXJ0XSk7CiAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuc2VxX2lkICYmIGZlYXR1cmUuZW5kKQogICAgICAgICAgICAgICAgZmVhdHVyZS5lbmQgPSBzb3VyY2UuY2hyb21JbmZvLmNoclRvQWJzKFtmZWF0dXJlLnNlcV9pZCwgZmVhdHVyZS5lbmRdKTsKICAgICAgICAgICAgICB0aWxlczIucHVzaChmZWF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYXR0cmlidXRlc1RvRmllbGRzKSB7CiAgICAgICAgICB0aWxlczIgPSB0aWxlczIubWFwKCh0aWxlMikgPT4gewogICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGlsZTIuYXR0cmlidXRlczsKICAgICAgICAgICAgY29uc3QgY2xlYW5BdHQgPSB7fTsKICAgICAgICAgICAgYXR0cmlidXRlc1RvRmllbGRzLmZvckVhY2goKGF0dE1hcCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IGF0dE5hbWUgPSBhdHRNYXAuYXR0cmlidXRlOwogICAgICAgICAgICAgIGNvbnN0IGF0dERlZmF1bHQgPSBhdHRNYXAuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgIShhdHROYW1lIGluIGF0dHJpYnV0ZXMpIHx8ICFBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXNbYXR0TmFtZV0pKQogICAgICAgICAgICAgICAgY2xlYW5BdHRbYXR0TmFtZV0gPSBhdHREZWZhdWx0OwogICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgYXR0VmFsID0gYXR0cmlidXRlc1thdHROYW1lXTsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGF0dFZhbCkpIHsKICAgICAgICAgICAgICAgICAgY2xlYW5BdHRbYXR0TmFtZV0gPSBhdHRWYWwubGVuZ3RoID09IDEgPyBhdHRWYWxbMF0gOiBhdHRWYWwuam9pbigiLCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB7IC4uLnRpbGUyLCAuLi5jbGVhbkF0dCB9OwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aWxlczI7CiAgICAgIH0KICAgICAgY29uc3QgbGluZVByb21pc2VzID0gX19wcml2YXRlTWV0aG9kKHRoaXMsIF9nZXRMaW5lUHJvbWlzZXMsIGdldExpbmVQcm9taXNlc19mbikuY2FsbCh0aGlzLCBtaW5YLCBtYXhYKTsKICAgICAgY29uc3QgYWxsTGluZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwobGluZVByb21pc2VzKSkuZmxhdCgpOwogICAgICBsZXQgbGluZXNUb1BhcnNlID0gW107CiAgICAgIGlmIChhbGxMaW5lcy5sZW5ndGggPiBzYW1wbGVMZW5ndGgpIHsKICAgICAgICBsaW5lc1RvUGFyc2UgPSBmaWx0ZXJMaW5lcyhhbGxMaW5lcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGluZXNUb1BhcnNlID0gYWxsTGluZXM7CiAgICAgIH0KICAgICAgY29uc3QgcGFyc2VPcHRpb25zID0gewogICAgICAgIGRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXM6IHRydWUsCiAgICAgICAgcGFyc2VGZWF0dXJlczogdHJ1ZSwKICAgICAgICBwYXJzZUNvbW1lbnRzOiBmYWxzZSwKICAgICAgICBwYXJzZURpcmVjdGl2ZXM6IGZhbHNlLAogICAgICAgIHBhcnNlU2VxdWVuY2VzOiBmYWxzZQogICAgICB9OwogICAgICBjb25zdCBwYXJzZWRMaW5lcyA9IEdGRi5wYXJzZVN0cmluZ1N5bmMobGluZXNUb1BhcnNlLmpvaW4oIlxuIiksIHBhcnNlT3B0aW9ucyk7CiAgICAgIGNvbnN0IHRpbGVzID0gcGFyc2VkTGluZXNUb1RpbGVzKHBhcnNlZExpbmVzKTsKICAgICAgcmV0dXJuIHRpbGVzOwogICAgfQogIH07CiAgbGV0IEdmZkZpbGUgPSBfR2ZmRmlsZTsKICBfdWlkID0gbmV3IFdlYWtNYXAoKTsKICBfbl9mZWF0dXJlcyA9IG5ldyBXZWFrTWFwKCk7CiAgX2dldE51bWJlckZlYXR1cmVzID0gbmV3IFdlYWtTZXQoKTsKICBnZXROdW1iZXJGZWF0dXJlc19mbiA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgaWYgKCFfX3ByaXZhdGVHZXQodGhpcywgX25fZmVhdHVyZXMpKSB7CiAgICAgIGNvbnN0IHNvdXJjZSA9IGRhdGFTb3VyY2VzLmdldChfX3ByaXZhdGVHZXQodGhpcywgX3VpZCkpOwogICAgICBjb25zdCB7IGN1bVBvc2l0aW9ucyB9ID0gc291cmNlLmNocm9tSW5mbzsKICAgICAgY29uc3QgY291bnRQcm9taXNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGN1bVBvcyBvZiBjdW1Qb3NpdGlvbnMpIHsKICAgICAgICBjb25zdCBjaHJvbU5hbWUgPSBjdW1Qb3MuY2hyOwogICAgICAgIGNvdW50UHJvbWlzZXMucHVzaCh0aGlzLnRiaS5saW5lQ291bnQoY2hyb21OYW1lKSk7CiAgICAgIH0KICAgICAgY29uc3QgY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY291bnRQcm9taXNlcyk7CiAgICAgIGNvbnN0IHRvdGFsX2NvdW50cyA9IGNvdW50cy5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKyBjdXIsIDApOwogICAgICBfX3ByaXZhdGVTZXQodGhpcywgX25fZmVhdHVyZXMsIHRvdGFsX2NvdW50cyk7CiAgICB9CiAgICByZXR1cm4gX19wcml2YXRlR2V0KHRoaXMsIF9uX2ZlYXR1cmVzKTsKICB9OwogIF9nZXRMaW5lUHJvbWlzZXMgPSBuZXcgV2Vha1NldCgpOwogIGdldExpbmVQcm9taXNlc19mbiA9IGZ1bmN0aW9uKG1pblgsIG1heFgpIHsKICAgIGNvbnN0IHNvdXJjZSA9IGRhdGFTb3VyY2VzLmdldChfX3ByaXZhdGVHZXQodGhpcywgX3VpZCkpOwogICAgbGV0IGN1ck1pblggPSBtaW5YOwogICAgY29uc3QgeyBjaHJvbUxlbmd0aHMsIGN1bVBvc2l0aW9ucyB9ID0gc291cmNlLmNocm9tSW5mbzsKICAgIGNvbnN0IGxpbmVQcm9taXNlcyA9IFtdOwogICAgY29uc3QgTUFYX0ZFQVRVUkVTID0gNWU1OwogICAgY29uc3QgTUFYX1dJTkRPVyA9IDRlNjsKICAgIGlmIChfX3ByaXZhdGVHZXQodGhpcywgX25fZmVhdHVyZXMpICYmIF9fcHJpdmF0ZUdldCh0aGlzLCBfbl9mZWF0dXJlcykgPiBNQVhfRkVBVFVSRVMgJiYgbWF4WCAtIG1pblggPiBNQVhfV0lORE9XKSB7CiAgICAgIGNvbnN0IGRpZmYgPSBtYXhYIC0gbWluWDsKICAgICAgY29uc3Qgd2luZG93U2l6ZSA9IDVlNDsKICAgICAgY29uc3Qgbl9zYW1wbGVzID0gMTAwOwogICAgICBjb25zdCB0b3RhbEJpbnMgPSBNYXRoLmZsb29yKGRpZmYgLyB3aW5kb3dTaXplKTsKICAgICAgY29uc3Qgc2VsZWN0ZWRCaW5zID0gbWFrZVJhbmRvbVNvcnRlZEFycmF5KG5fc2FtcGxlcywgdG90YWxCaW5zKTsKICAgICAgY29uc3QgYmluTGluZXMgPSBzZWxlY3RlZEJpbnMubWFwKChiaW4pID0+IHsKICAgICAgICBjb25zdCBiaW5TdGFydCA9IG1pblggKyBiaW4gKiB3aW5kb3dTaXplOwogICAgICAgIGNvbnN0IGJpbkVuZCA9IGJpblN0YXJ0ICsgd2luZG93U2l6ZTsKICAgICAgICByZXR1cm4gX19wcml2YXRlTWV0aG9kKHRoaXMsIF9nZXRMaW5lUHJvbWlzZXMsIGdldExpbmVQcm9taXNlc19mbikuY2FsbCh0aGlzLCBiaW5TdGFydCwgYmluRW5kKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBiaW5MaW5lcy5mbGF0KCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGN1bVBvcyBvZiBjdW1Qb3NpdGlvbnMpIHsKICAgICAgY29uc3QgY2hyb21OYW1lID0gY3VtUG9zLmNocjsKICAgICAgY29uc3QgY2hyb21TdGFydCA9IGN1bVBvcy5wb3M7CiAgICAgIGNvbnN0IGNocm9tRW5kID0gY3VtUG9zLnBvcyArIGNocm9tTGVuZ3Roc1tjaHJvbU5hbWVdOwogICAgICBsZXQgc3RhcnRQb3MsIGVuZFBvczsKICAgICAgaWYgKGNocm9tU3RhcnQgPiBjdXJNaW5YIHx8IGN1ck1pblggPj0gY2hyb21FbmQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBsaW5lUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgY29uc3QgbGluZXMgPSBbXTsKICAgICAgICBjb25zdCBsaW5lQ2FsbGJhY2sgPSAobGluZSkgPT4gewogICAgICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgICB9OwogICAgICAgIGlmIChtYXhYID4gY2hyb21FbmQpIHsKICAgICAgICAgIHN0YXJ0UG9zID0gY3VyTWluWCAtIGNocm9tU3RhcnQ7CiAgICAgICAgICBlbmRQb3MgPSBjaHJvbUVuZCAtIGNocm9tU3RhcnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXJ0UG9zID0gTWF0aC5mbG9vcihjdXJNaW5YIC0gY2hyb21TdGFydCk7CiAgICAgICAgICBlbmRQb3MgPSBNYXRoLmNlaWwobWF4WCAtIGNocm9tU3RhcnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnRiaS5nZXRMaW5lcyhjaHJvbU5hbWUsIHN0YXJ0UG9zLCBlbmRQb3MsIGxpbmVDYWxsYmFjaykudGhlbigoKSA9PiB7CiAgICAgICAgICByZXNvbHZlKGxpbmVzKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIGxpbmVQcm9taXNlcy5wdXNoKGxpbmVQcm9taXNlKTsKICAgICAgaWYgKG1heFggPD0gY2hyb21FbmQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjdXJNaW5YID0gY2hyb21FbmQ7CiAgICB9CiAgICByZXR1cm4gbGluZVByb21pc2VzOwogIH07CiAgY29uc3QgZ2ZmRmlsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGNvbnN0IHRpbGVWYWx1ZXMgPSB7fTsKICBjb25zdCBkYXRhU291cmNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgZnVuY3Rpb24gaW5pdCh1aWQsIGJlZCwgY2hyb21TaXplcywgb3B0aW9ucyA9IHt9KSB7CiAgICBsZXQgZ2ZmRmlsZSA9IGdmZkZpbGVzLmdldChiZWQudXJsKTsKICAgIGlmICghZ2ZmRmlsZSkgewogICAgICBnZmZGaWxlID0gR2ZmRmlsZS5mcm9tVXJsKGJlZC51cmwsIGJlZC5pbmRleFVybCwgdWlkKTsKICAgIH0KICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShnZmZGaWxlLCBjaHJvbVNpemVzLCB7CiAgICAgIHNhbXBsZUxlbmd0aDogMWUzLAogICAgICAuLi5vcHRpb25zCiAgICB9KTsKICAgIGRhdGFTb3VyY2VzLnNldCh1aWQsIGRhdGFTb3VyY2UpOwogIH0KICBjb25zdCB0aWxlc2V0SW5mbyA9ICh1aWQpID0+IHsKICAgIHJldHVybiBkYXRhU291cmNlcy5nZXQodWlkKS50aWxlc2V0SW5mbzsKICB9OwogIGNvbnN0IHRpbGUgPSBhc3luYyAodWlkLCB6LCB4KSA9PiB7CiAgICBjb25zdCBzb3VyY2UgPSBkYXRhU291cmNlcy5nZXQodWlkKTsKICAgIGNvbnN0IENBQ0hFX0tFWSA9IGAke3VpZH0uJHt6fS4ke3h9YDsKICAgIHRpbGVWYWx1ZXNbQ0FDSEVfS0VZXSA9IFtdOwogICAgY29uc3QgdGlsZVdpZHRoID0gK3NvdXJjZS50aWxlc2V0SW5mby5tYXhfd2lkdGggLyAyICoqICt6OwogICAgY29uc3QgbWluWCA9IHNvdXJjZS50aWxlc2V0SW5mby5taW5fcG9zWzBdICsgeCAqIHRpbGVXaWR0aDsKICAgIGNvbnN0IG1heFggPSBzb3VyY2UudGlsZXNldEluZm8ubWluX3Bvc1swXSArICh4ICsgMSkgKiB0aWxlV2lkdGg7CiAgICB0aWxlVmFsdWVzW0NBQ0hFX0tFWV0gPSBhd2FpdCBzb3VyY2UuZmlsZS5nZXRUaWxlRGF0YShtaW5YLCBtYXhYKTsKICAgIHJldHVybiBbXTsKICB9OwogIGNvbnN0IGZldGNoVGlsZXNEZWJvdW5jZWQgPSBhc3luYyAodWlkLCB0aWxlSWRzKSA9PiB7CiAgICBjb25zdCB0aWxlcyA9IHt9OwogICAgY29uc3QgdmFsaWRUaWxlSWRzID0gW107CiAgICBjb25zdCB0aWxlUHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgdGlsZUlkIG9mIHRpbGVJZHMpIHsKICAgICAgY29uc3QgcGFydHMgPSB0aWxlSWQuc3BsaXQoIi4iKTsKICAgICAgY29uc3QgeiA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7CiAgICAgIGNvbnN0IHggPSBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICBpZiAoTnVtYmVyLmlzTmFOKHgpIHx8IE51bWJlci5pc05hTih6KSkgewogICAgICAgIGNvbnNvbGUud2FybigiSW52YWxpZCB0aWxlIHpvb20gb3IgcG9zaXRpb246IiwgeiwgeCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmFsaWRUaWxlSWRzLnB1c2godGlsZUlkKTsKICAgICAgdGlsZVByb21pc2VzLnB1c2godGlsZSh1aWQsIHosIHgpKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbCh0aWxlUHJvbWlzZXMpLnRoZW4oKHZhbHVlczIpID0+IHsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHZhbHVlczIubGVuZ3RoOyBpMisrKSB7CiAgICAgICAgY29uc3QgdmFsaWRUaWxlSWQgPSB2YWxpZFRpbGVJZHNbaTJdOwogICAgICAgIHRpbGVzW3ZhbGlkVGlsZUlkXSA9IHsgdGlsZVBvc2l0aW9uSWQ6IHZhbGlkVGlsZUlkIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbGVzOwogICAgfSk7CiAgfTsKICBjb25zdCBnZXRUYWJ1bGFyRGF0YSA9ICh1aWQsIHRpbGVJZHMpID0+IHsKICAgIGNvbnN0IGRhdGEgPSBbXTsKICAgIHRpbGVJZHMuZm9yRWFjaCgodGlsZUlkKSA9PiB7CiAgICAgIGNvbnN0IHBhcnRzID0gdGlsZUlkLnNwbGl0KCIuIik7CiAgICAgIGNvbnN0IHogPSBwYXJzZUludChwYXJ0c1swXSwgMTApOwogICAgICBjb25zdCB4ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsKICAgICAgY29uc3QgdGlsZVZhbHVlID0gdGlsZVZhbHVlc1tgJHt1aWR9LiR7en0uJHt4fWBdOwogICAgICBpZiAoIXRpbGVWYWx1ZSkgewogICAgICAgIGNvbnNvbGUud2FybihgTm8gdGlsZSBkYXRhIGNvbnN0cnVjdGVkICgke3RpbGVJZH0pYCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKHRpbGVWYWx1ZSk7CiAgICB9KTsKICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdC52YWx1ZXMoZGF0YSkuZmxhdCgpOwogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKS5idWZmZXI7CiAgICByZXR1cm4gVHJhbnNmZXIoYnVmZmVyMiwgW2J1ZmZlcjJdKTsKICB9OwogIGNvbnN0IHRpbGVGdW5jdGlvbnMgPSB7CiAgICBpbml0LAogICAgdGlsZXNldEluZm8sCiAgICBmZXRjaFRpbGVzRGVib3VuY2VkLAogICAgdGlsZSwKICAgIGdldFRhYnVsYXJEYXRhCiAgfTsKICBleHBvc2UodGlsZUZ1bmN0aW9ucyk7Cn0pKHJlcXVpcmUkJDApOwovLyMgc291cmNlTWFwcGluZ1VSTD0vYXNzZXRzL2dmZi13b3JrZXIuYjFlMjEwZTQuanMubWFw";
187507
+ var encodedJs$1 = "dmFyIF9fYWNjZXNzQ2hlY2sgPSAob2JqLCBtZW1iZXIsIG1zZykgPT4gewogIGlmICghbWVtYmVyLmhhcyhvYmopKQogICAgdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIiArIG1zZyk7Cn07CnZhciBfX3ByaXZhdGVHZXQgPSAob2JqLCBtZW1iZXIsIGdldHRlcikgPT4gewogIF9fYWNjZXNzQ2hlY2sob2JqLCBtZW1iZXIsICJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpOwogIHJldHVybiBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogbWVtYmVyLmdldChvYmopOwp9Owp2YXIgX19wcml2YXRlQWRkID0gKG9iaiwgbWVtYmVyLCB2YWx1ZSkgPT4gewogIGlmIChtZW1iZXIuaGFzKG9iaikpCiAgICB0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTsKICBtZW1iZXIgaW5zdGFuY2VvZiBXZWFrU2V0ID8gbWVtYmVyLmFkZChvYmopIDogbWVtYmVyLnNldChvYmosIHZhbHVlKTsKfTsKdmFyIF9fcHJpdmF0ZVNldCA9IChvYmosIG1lbWJlciwgdmFsdWUsIHNldHRlcikgPT4gewogIF9fYWNjZXNzQ2hlY2sob2JqLCBtZW1iZXIsICJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIik7CiAgc2V0dGVyID8gc2V0dGVyLmNhbGwob2JqLCB2YWx1ZSkgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUpOwogIHJldHVybiB2YWx1ZTsKfTsKdmFyIF9fcHJpdmF0ZU1ldGhvZCA9IChvYmosIG1lbWJlciwgbWV0aG9kKSA9PiB7CiAgX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpOwogIHJldHVybiBtZXRob2Q7Cn07CihmdW5jdGlvbigpIHsKICB2YXIgX3VpZCwgX25fZmVhdHVyZXMsIF9nZXROdW1iZXJGZWF0dXJlcywgZ2V0TnVtYmVyRmVhdHVyZXNfZm4sIF9nZXRMaW5lUHJvbWlzZXMsIGdldExpbmVQcm9taXNlc19mbjsKICAidXNlIHN0cmljdCI7CiAgdmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDoge307CiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoeCkgewogICAgcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAiZGVmYXVsdCIpID8geFsiZGVmYXVsdCJdIDogeDsKICB9CiAgZnVuY3Rpb24gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKG4pIHsKICAgIGlmIChuLl9fZXNNb2R1bGUpCiAgICAgIHJldHVybiBuOwogICAgdmFyIGEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oaykgewogICAgICB2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobiwgayk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBrLCBkLmdldCA/IGQgOiB7CiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG5ba107CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGE7CiAgfQogIHZhciBlc20gPSB7fTsKICB2YXIgQWJvcnRhYmxlUHJvbWlzZUNhY2hlJDEgPSB7fTsKICB2YXIgYWJvcnRjb250cm9sbGVyUG9ueWZpbGwgPSB7fTsKICB2YXIgY2pzUG9ueWZpbGwgPSB7fTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2pzUG9ueWZpbGwsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skMShpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBwcm9wcy5sZW5ndGg7IGkyKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpMl07CiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKQogICAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpCiAgICAgIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykKICAgICAgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgcmV0dXJuIENvbnN0cnVjdG9yOwogIH0KICBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgaWYgKHN1cGVyQ2xhc3MpCiAgICAgIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7CiAgfQogIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mMihvMikgewogICAgICByZXR1cm4gbzIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvMik7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsKICB9CiAgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YyKG8yLCBwMikgewogICAgICBvMi5fX3Byb3RvX18gPSBwMjsKICAgICAgcmV0dXJuIG8yOwogICAgfTsKICAgIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7CiAgfQogIGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7CiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpCiAgICAgIHJldHVybiB0cnVlOwogICAgdHJ5IHsKICAgICAgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbigpIHsKICAgICAgfSkpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYyKSB7CiAgICBpZiAoc2VsZjIgPT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpOwogICAgfQogICAgcmV0dXJuIHNlbGYyOwogIH0KICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmMiwgY2FsbDIpIHsKICAgIGlmIChjYWxsMiAmJiAodHlwZW9mIGNhbGwyID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbDIgPT09ICJmdW5jdGlvbiIpKSB7CiAgICAgIHJldHVybiBjYWxsMjsKICAgIH0gZWxzZSBpZiAoY2FsbDIgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZjIpOwogIH0KICBmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgewogICAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7CiAgICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7CiAgICAgIHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OwogICAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgewogICAgICAgIHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7CiAgICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9CiAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgewogICAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsKICAgICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7CiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0OwogIH0KICBmdW5jdGlvbiBfZ2V0KCkgewogICAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSAidW5kZWZpbmVkIiAmJiBSZWZsZWN0LmdldCkgewogICAgICBfZ2V0ID0gUmVmbGVjdC5nZXQuYmluZCgpOwogICAgfSBlbHNlIHsKICAgICAgX2dldCA9IGZ1bmN0aW9uIF9nZXQyKHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICBpZiAoIWJhc2UpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTsKICAgICAgICBpZiAoZGVzYy5nZXQpIHsKICAgICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogcmVjZWl2ZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzYy52YWx1ZTsKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBfZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQogIHZhciBFbWl0dGVyID0gLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gRW1pdHRlcjIoKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIEVtaXR0ZXIyKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJsaXN0ZW5lcnMiLCB7CiAgICAgICAgdmFsdWU6IHt9LAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyQxKEVtaXR0ZXIyLCBbewogICAgICBrZXk6ICJhZGRFdmVudExpc3RlbmVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgICAgICBpZiAoISh0eXBlIGluIHRoaXMubGlzdGVuZXJzKSkgewogICAgICAgICAgdGhpcy5saXN0ZW5lcnNbdHlwZV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgdGhpcy5saXN0ZW5lcnNbdHlwZV0ucHVzaCh7CiAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgIG9wdGlvbnMKICAgICAgICB9KTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVFdmVudExpc3RlbmVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spIHsKICAgICAgICBpZiAoISh0eXBlIGluIHRoaXMubGlzdGVuZXJzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLmxpc3RlbmVyc1t0eXBlXTsKICAgICAgICBmb3IgKHZhciBpMiA9IDAsIGwgPSBzdGFjay5sZW5ndGg7IGkyIDwgbDsgaTIrKykgewogICAgICAgICAgaWYgKHN0YWNrW2kyXS5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHsKICAgICAgICAgICAgc3RhY2suc3BsaWNlKGkyLCAxKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJkaXNwYXRjaEV2ZW50IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsKICAgICAgICBpZiAoIShldmVudC50eXBlIGluIHRoaXMubGlzdGVuZXJzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLmxpc3RlbmVyc1tldmVudC50eXBlXTsKICAgICAgICB2YXIgc3RhY2tUb0NhbGwgPSBzdGFjay5zbGljZSgpOwogICAgICAgIGZvciAodmFyIGkyID0gMCwgbCA9IHN0YWNrVG9DYWxsLmxlbmd0aDsgaTIgPCBsOyBpMisrKSB7CiAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBzdGFja1RvQ2FsbFtpMl07CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjay5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsaXN0ZW5lci5vcHRpb25zICYmIGxpc3RlbmVyLm9wdGlvbnMub25jZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgbGlzdGVuZXIuY2FsbGJhY2spOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBFbWl0dGVyMjsKICB9KCk7CiAgdmFyIEFib3J0U2lnbmFsJDEgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oX0VtaXR0ZXIpIHsKICAgIF9pbmhlcml0cyhBYm9ydFNpZ25hbDIsIF9FbWl0dGVyKTsKICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQWJvcnRTaWduYWwyKTsKICAgIGZ1bmN0aW9uIEFib3J0U2lnbmFsMigpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBBYm9ydFNpZ25hbDIpOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpOwogICAgICBpZiAoIV90aGlzLmxpc3RlbmVycykgewogICAgICAgIEVtaXR0ZXIuY2FsbChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiYWJvcnRlZCIsIHsKICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJvbmFib3J0IiwgewogICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAicmVhc29uIiwgewogICAgICAgIHZhbHVlOiB2b2lkIDAsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICBfY3JlYXRlQ2xhc3MkMShBYm9ydFNpZ25hbDIsIFt7CiAgICAgIGtleTogInRvU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nMigpIHsKICAgICAgICByZXR1cm4gIltvYmplY3QgQWJvcnRTaWduYWxdIjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJkaXNwYXRjaEV2ZW50IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsKICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gImFib3J0IikgewogICAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vbmFib3J0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHRoaXMub25hYm9ydC5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoQWJvcnRTaWduYWwyLnByb3RvdHlwZSksICJkaXNwYXRjaEV2ZW50IiwgdGhpcykuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBBYm9ydFNpZ25hbDI7CiAgfShFbWl0dGVyKTsKICB2YXIgQWJvcnRDb250cm9sbGVyJDEgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBBYm9ydENvbnRyb2xsZXIyKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBBYm9ydENvbnRyb2xsZXIyKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJzaWduYWwiLCB7CiAgICAgICAgdmFsdWU6IG5ldyBBYm9ydFNpZ25hbCQxKCksCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogICAgX2NyZWF0ZUNsYXNzJDEoQWJvcnRDb250cm9sbGVyMiwgW3sKICAgICAga2V5OiAiYWJvcnQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQocmVhc29uKSB7CiAgICAgICAgdmFyIGV2ZW50OwogICAgICAgIHRyeSB7CiAgICAgICAgICBldmVudCA9IG5ldyBFdmVudCgiYWJvcnQiKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICBpZiAoIWRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CiAgICAgICAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpOwogICAgICAgICAgICAgIGV2ZW50LnR5cGUgPSAiYWJvcnQiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7CiAgICAgICAgICAgICAgZXZlbnQuaW5pdEV2ZW50KCJhYm9ydCIsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGV2ZW50ID0gewogICAgICAgICAgICAgIHR5cGU6ICJhYm9ydCIsCiAgICAgICAgICAgICAgYnViYmxlczogZmFsc2UsCiAgICAgICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHNpZ25hbFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICBpZiAoc2lnbmFsUmVhc29uID09PSB2b2lkIDApIHsKICAgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHNpZ25hbFJlYXNvbiA9IG5ldyBFcnJvcigiVGhpcyBvcGVyYXRpb24gd2FzIGFib3J0ZWQiKTsKICAgICAgICAgICAgc2lnbmFsUmVhc29uLm5hbWUgPSAiQWJvcnRFcnJvciI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHNpZ25hbFJlYXNvbiA9IG5ldyBET01FeGNlcHRpb24oInNpZ25hbCBpcyBhYm9ydGVkIHdpdGhvdXQgcmVhc29uIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycjIpIHsKICAgICAgICAgICAgICBzaWduYWxSZWFzb24gPSBuZXcgRXJyb3IoIlRoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkIik7CiAgICAgICAgICAgICAgc2lnbmFsUmVhc29uLm5hbWUgPSAiQWJvcnRFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gc2lnbmFsUmVhc29uOwogICAgICAgIHRoaXMuc2lnbmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInRvU3RyaW5nIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nMigpIHsKICAgICAgICByZXR1cm4gIltvYmplY3QgQWJvcnRDb250cm9sbGVyXSI7CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBBYm9ydENvbnRyb2xsZXIyOwogIH0oKTsKICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7CiAgICBBYm9ydENvbnRyb2xsZXIkMS5wcm90b3R5cGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICJBYm9ydENvbnRyb2xsZXIiOwogICAgQWJvcnRTaWduYWwkMS5wcm90b3R5cGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICJBYm9ydFNpZ25hbCI7CiAgfQogIGZ1bmN0aW9uIHBvbHlmaWxsTmVlZGVkKHNlbGYyKSB7CiAgICBpZiAoc2VsZjIuX19GT1JDRV9JTlNUQUxMX0FCT1JUQ09OVFJPTExFUl9QT0xZRklMTCkgewogICAgICBjb25zb2xlLmxvZygiX19GT1JDRV9JTlNUQUxMX0FCT1JUQ09OVFJPTExFUl9QT0xZRklMTD10cnVlIGlzIHNldCwgd2lsbCBmb3JjZSBpbnN0YWxsIHBvbHlmaWxsIik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHR5cGVvZiBzZWxmMi5SZXF1ZXN0ID09PSAiZnVuY3Rpb24iICYmICFzZWxmMi5SZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgic2lnbmFsIikgfHwgIXNlbGYyLkFib3J0Q29udHJvbGxlcjsKICB9CiAgZnVuY3Rpb24gYWJvcnRhYmxlRmV0Y2hEZWNvcmF0b3IocGF0Y2hUYXJnZXRzKSB7CiAgICBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHBhdGNoVGFyZ2V0cykgewogICAgICBwYXRjaFRhcmdldHMgPSB7CiAgICAgICAgZmV0Y2g6IHBhdGNoVGFyZ2V0cwogICAgICB9OwogICAgfQogICAgdmFyIF9wYXRjaFRhcmdldHMgPSBwYXRjaFRhcmdldHMsIGZldGNoID0gX3BhdGNoVGFyZ2V0cy5mZXRjaCwgX3BhdGNoVGFyZ2V0cyRSZXF1ZXN0ID0gX3BhdGNoVGFyZ2V0cy5SZXF1ZXN0LCBOYXRpdmVSZXF1ZXN0ID0gX3BhdGNoVGFyZ2V0cyRSZXF1ZXN0ID09PSB2b2lkIDAgPyBmZXRjaC5SZXF1ZXN0IDogX3BhdGNoVGFyZ2V0cyRSZXF1ZXN0LCBOYXRpdmVBYm9ydENvbnRyb2xsZXIgPSBfcGF0Y2hUYXJnZXRzLkFib3J0Q29udHJvbGxlciwgX3BhdGNoVGFyZ2V0cyRfX0ZPUkNFID0gX3BhdGNoVGFyZ2V0cy5fX0ZPUkNFX0lOU1RBTExfQUJPUlRDT05UUk9MTEVSX1BPTFlGSUxMLCBfX0ZPUkNFX0lOU1RBTExfQUJPUlRDT05UUk9MTEVSX1BPTFlGSUxMID0gX3BhdGNoVGFyZ2V0cyRfX0ZPUkNFID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXRjaFRhcmdldHMkX19GT1JDRTsKICAgIGlmICghcG9seWZpbGxOZWVkZWQoewogICAgICBmZXRjaCwKICAgICAgUmVxdWVzdDogTmF0aXZlUmVxdWVzdCwKICAgICAgQWJvcnRDb250cm9sbGVyOiBOYXRpdmVBYm9ydENvbnRyb2xsZXIsCiAgICAgIF9fRk9SQ0VfSU5TVEFMTF9BQk9SVENPTlRST0xMRVJfUE9MWUZJTEwKICAgIH0pKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZmV0Y2gsCiAgICAgICAgUmVxdWVzdAogICAgICB9OwogICAgfQogICAgdmFyIFJlcXVlc3QgPSBOYXRpdmVSZXF1ZXN0OwogICAgaWYgKFJlcXVlc3QgJiYgIVJlcXVlc3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KCJzaWduYWwiKSB8fCBfX0ZPUkNFX0lOU1RBTExfQUJPUlRDT05UUk9MTEVSX1BPTFlGSUxMKSB7CiAgICAgIFJlcXVlc3QgPSBmdW5jdGlvbiBSZXF1ZXN0MihpbnB1dCwgaW5pdDIpIHsKICAgICAgICB2YXIgc2lnbmFsOwogICAgICAgIGlmIChpbml0MiAmJiBpbml0Mi5zaWduYWwpIHsKICAgICAgICAgIHNpZ25hbCA9IGluaXQyLnNpZ25hbDsKICAgICAgICAgIGRlbGV0ZSBpbml0Mi5zaWduYWw7CiAgICAgICAgfQogICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IE5hdGl2ZVJlcXVlc3QoaW5wdXQsIGluaXQyKTsKICAgICAgICBpZiAoc2lnbmFsKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWVzdCwgInNpZ25hbCIsIHsKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogc2lnbmFsCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CiAgICAgIH07CiAgICAgIFJlcXVlc3QucHJvdG90eXBlID0gTmF0aXZlUmVxdWVzdC5wcm90b3R5cGU7CiAgICB9CiAgICB2YXIgcmVhbEZldGNoID0gZmV0Y2g7CiAgICB2YXIgYWJvcnRhYmxlRmV0Y2ggPSBmdW5jdGlvbiBhYm9ydGFibGVGZXRjaDIoaW5wdXQsIGluaXQyKSB7CiAgICAgIHZhciBzaWduYWwgPSBSZXF1ZXN0ICYmIFJlcXVlc3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoaW5wdXQpID8gaW5wdXQuc2lnbmFsIDogaW5pdDIgPyBpbml0Mi5zaWduYWwgOiB2b2lkIDA7CiAgICAgIGlmIChzaWduYWwpIHsKICAgICAgICB2YXIgYWJvcnRFcnJvcjsKICAgICAgICB0cnkgewogICAgICAgICAgYWJvcnRFcnJvciA9IG5ldyBET01FeGNlcHRpb24oIkFib3J0ZWQiLCAiQWJvcnRFcnJvciIpOwogICAgICAgIH0gY2F0Y2ggKGVycjIpIHsKICAgICAgICAgIGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoIkFib3J0ZWQiKTsKICAgICAgICAgIGFib3J0RXJyb3IubmFtZSA9ICJBYm9ydEVycm9yIjsKICAgICAgICB9CiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoYWJvcnRFcnJvcik7CiAgICAgICAgfQogICAgICAgIHZhciBjYW5jZWxsYXRpb24gPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfLCByZWplY3QpIHsKICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmVqZWN0KGFib3J0RXJyb3IpOwogICAgICAgICAgfSwgewogICAgICAgICAgICBvbmNlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBpZiAoaW5pdDIgJiYgaW5pdDIuc2lnbmFsKSB7CiAgICAgICAgICBkZWxldGUgaW5pdDIuc2lnbmFsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtjYW5jZWxsYXRpb24sIHJlYWxGZXRjaChpbnB1dCwgaW5pdDIpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlYWxGZXRjaChpbnB1dCwgaW5pdDIpOwogICAgfTsKICAgIHJldHVybiB7CiAgICAgIGZldGNoOiBhYm9ydGFibGVGZXRjaCwKICAgICAgUmVxdWVzdAogICAgfTsKICB9CiAgY2pzUG9ueWZpbGwuQWJvcnRDb250cm9sbGVyID0gQWJvcnRDb250cm9sbGVyJDE7CiAgY2pzUG9ueWZpbGwuQWJvcnRTaWduYWwgPSBBYm9ydFNpZ25hbCQxOwogIGNqc1BvbnlmaWxsLmFib3J0YWJsZUZldGNoID0gYWJvcnRhYmxlRmV0Y2hEZWNvcmF0b3I7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFib3J0Y29udHJvbGxlclBvbnlmaWxsLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgYWJvcnRjb250cm9sbGVyUG9ueWZpbGwuQWJvcnRTaWduYWwgPSBhYm9ydGNvbnRyb2xsZXJQb255ZmlsbC5BYm9ydENvbnRyb2xsZXIgPSB2b2lkIDA7CiAgY29uc3QgY2pzX3BvbnlmaWxsXzEgPSBjanNQb255ZmlsbDsKICB2YXIgZ2V0R2xvYmFsID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiBzZWxmOwogICAgfQogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiB3aW5kb3c7CiAgICB9CiAgICBpZiAodHlwZW9mIGNvbW1vbmpzR2xvYmFsICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gY29tbW9uanNHbG9iYWw7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoInVuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdCIpOwogIH07CiAgbGV0IEFib3J0Q29udHJvbGxlciA9IHR5cGVvZiBnZXRHbG9iYWwoKS5BYm9ydENvbnRyb2xsZXIgPT09ICJ1bmRlZmluZWQiID8gY2pzX3BvbnlmaWxsXzEuQWJvcnRDb250cm9sbGVyIDogZ2V0R2xvYmFsKCkuQWJvcnRDb250cm9sbGVyOwogIGFib3J0Y29udHJvbGxlclBvbnlmaWxsLkFib3J0Q29udHJvbGxlciA9IEFib3J0Q29udHJvbGxlcjsKICBsZXQgQWJvcnRTaWduYWwgPSB0eXBlb2YgZ2V0R2xvYmFsKCkuQWJvcnRDb250cm9sbGVyID09PSAidW5kZWZpbmVkIiA/IGNqc19wb255ZmlsbF8xLkFib3J0U2lnbmFsIDogZ2V0R2xvYmFsKCkuQWJvcnRTaWduYWw7CiAgYWJvcnRjb250cm9sbGVyUG9ueWZpbGwuQWJvcnRTaWduYWwgPSBBYm9ydFNpZ25hbDsKICB2YXIgQWdncmVnYXRlQWJvcnRDb250cm9sbGVyJDEgPSB7fTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWdncmVnYXRlQWJvcnRDb250cm9sbGVyJDEsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICBjb25zdCBhYm9ydGNvbnRyb2xsZXJfcG9ueWZpbGxfMSQxID0gYWJvcnRjb250cm9sbGVyUG9ueWZpbGw7CiAgY2xhc3MgTnVsbFNpZ25hbCB7CiAgfQogIGNsYXNzIEFnZ3JlZ2F0ZUFib3J0Q29udHJvbGxlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5zaWduYWxzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIgPSBuZXcgYWJvcnRjb250cm9sbGVyX3BvbnlmaWxsXzEkMS5BYm9ydENvbnRyb2xsZXIoKTsKICAgIH0KICAgIGFkZFNpZ25hbChzaWduYWwgPSBuZXcgTnVsbFNpZ25hbCgpKSB7CiAgICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgYWRkIGEgc2lnbmFsLCBhbHJlYWR5IGFib3J0ZWQhIik7CiAgICAgIH0KICAgICAgdGhpcy5zaWduYWxzLmFkZChzaWduYWwpOwogICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHsKICAgICAgICB0aGlzLmhhbmRsZUFib3J0ZWQoc2lnbmFsKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCAoKSA9PiB7CiAgICAgICAgICB0aGlzLmhhbmRsZUFib3J0ZWQoc2lnbmFsKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgaGFuZGxlQWJvcnRlZChzaWduYWwpIHsKICAgICAgdGhpcy5zaWduYWxzLmRlbGV0ZShzaWduYWwpOwogICAgICBpZiAodGhpcy5zaWduYWxzLnNpemUgPT09IDApIHsKICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICB9CiAgICB9CiAgICBnZXQgc2lnbmFsKCkgewogICAgICByZXR1cm4gdGhpcy5hYm9ydENvbnRyb2xsZXIuc2lnbmFsOwogICAgfQogICAgYWJvcnQoKSB7CiAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyLmFib3J0KCk7CiAgICB9CiAgfQogIEFnZ3JlZ2F0ZUFib3J0Q29udHJvbGxlciQxLmRlZmF1bHQgPSBBZ2dyZWdhdGVBYm9ydENvbnRyb2xsZXI7CiAgdmFyIEFnZ3JlZ2F0ZVN0YXR1c1JlcG9ydGVyJDEgPSB7fTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWdncmVnYXRlU3RhdHVzUmVwb3J0ZXIkMSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIGNsYXNzIEFnZ3JlZ2F0ZVN0YXR1c1JlcG9ydGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLmNhbGxiYWNrcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICB9CiAgICBhZGRDYWxsYmFjayhjYWxsYmFjayA9ICgpID0+IHsKICAgIH0pIHsKICAgICAgdGhpcy5jYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgY2FsbGJhY2sodGhpcy5jdXJyZW50TWVzc2FnZSk7CiAgICB9CiAgICBjYWxsYmFjayhtZXNzYWdlKSB7CiAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSBtZXNzYWdlOwogICAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKChlbHQpID0+IHsKICAgICAgICBlbHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgfQogIH0KICBBZ2dyZWdhdGVTdGF0dXNSZXBvcnRlciQxLmRlZmF1bHQgPSBBZ2dyZWdhdGVTdGF0dXNSZXBvcnRlcjsKICB2YXIgX19pbXBvcnREZWZhdWx0JDEgPSBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2ltcG9ydERlZmF1bHQgfHwgZnVuY3Rpb24obW9kKSB7CiAgICByZXR1cm4gbW9kICYmIG1vZC5fX2VzTW9kdWxlID8gbW9kIDogeyAiZGVmYXVsdCI6IG1vZCB9OwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFib3J0YWJsZVByb21pc2VDYWNoZSQxLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgY29uc3QgYWJvcnRjb250cm9sbGVyX3BvbnlmaWxsXzEgPSBhYm9ydGNvbnRyb2xsZXJQb255ZmlsbDsKICBjb25zdCBBZ2dyZWdhdGVBYm9ydENvbnRyb2xsZXJfMSA9IF9faW1wb3J0RGVmYXVsdCQxKEFnZ3JlZ2F0ZUFib3J0Q29udHJvbGxlciQxKTsKICBjb25zdCBBZ2dyZWdhdGVTdGF0dXNSZXBvcnRlcl8xID0gX19pbXBvcnREZWZhdWx0JDEoQWdncmVnYXRlU3RhdHVzUmVwb3J0ZXIkMSk7CiAgY2xhc3MgQWJvcnRhYmxlUHJvbWlzZUNhY2hlIHsKICAgIGNvbnN0cnVjdG9yKHsgZmlsbCwgY2FjaGUgfSkgewogICAgICBpZiAodHlwZW9mIGZpbGwgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJtdXN0IHBhc3MgYSBmaWxsIGZ1bmN0aW9uIik7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBjYWNoZSAhPT0gIm9iamVjdCIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJtdXN0IHBhc3MgYSBjYWNoZSBvYmplY3QiKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGNhY2hlLmdldCAhPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgY2FjaGUuc2V0ICE9PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBjYWNoZS5kZWxldGUgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWNoZSBtdXN0IGltcGxlbWVudCBnZXQoa2V5KSwgc2V0KGtleSwgdmFsKSwgYW5kIGFuZCBkZWxldGUoa2V5KSIpOwogICAgICB9CiAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKICAgICAgdGhpcy5maWxsQ2FsbGJhY2sgPSBmaWxsOwogICAgfQogICAgc3RhdGljIGlzQWJvcnRFeGNlcHRpb24oZXhjZXB0aW9uKSB7CiAgICAgIHJldHVybiBleGNlcHRpb24ubmFtZSA9PT0gIkFib3J0RXJyb3IiIHx8IGV4Y2VwdGlvbi5jb2RlID09PSAiRVJSX0FCT1JURUQiIHx8IGV4Y2VwdGlvbi5tZXNzYWdlID09PSAiQWJvcnRFcnJvcjogYWJvcnRlZCIgfHwgZXhjZXB0aW9uLm1lc3NhZ2UgPT09ICJFcnJvcjogYWJvcnRlZCI7CiAgICB9CiAgICBldmljdChrZXksIGVudHJ5KSB7CiAgICAgIGlmICh0aGlzLmNhY2hlLmdldChrZXkpID09PSBlbnRyeSkgewogICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7CiAgICAgIH0KICAgIH0KICAgIGZpbGwoa2V5LCBkYXRhLCBzaWduYWwsIHN0YXR1c0NhbGxiYWNrKSB7CiAgICAgIGNvbnN0IGFib3J0ZXIgPSBuZXcgQWdncmVnYXRlQWJvcnRDb250cm9sbGVyXzEuZGVmYXVsdCgpOwogICAgICBjb25zdCBzdGF0dXNSZXBvcnRlciA9IG5ldyBBZ2dyZWdhdGVTdGF0dXNSZXBvcnRlcl8xLmRlZmF1bHQoKTsKICAgICAgc3RhdHVzUmVwb3J0ZXIuYWRkQ2FsbGJhY2soc3RhdHVzQ2FsbGJhY2spOwogICAgICBjb25zdCBuZXdFbnRyeSA9IHsKICAgICAgICBhYm9ydGVyLAogICAgICAgIHByb21pc2U6IHRoaXMuZmlsbENhbGxiYWNrKGRhdGEsIGFib3J0ZXIuc2lnbmFsLCAobWVzc2FnZSkgPT4gewogICAgICAgICAgc3RhdHVzUmVwb3J0ZXIuY2FsbGJhY2sobWVzc2FnZSk7CiAgICAgICAgfSksCiAgICAgICAgc2V0dGxlZDogZmFsc2UsCiAgICAgICAgc3RhdHVzUmVwb3J0ZXIsCiAgICAgICAgZ2V0IGFib3J0ZWQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hYm9ydGVyLnNpZ25hbC5hYm9ydGVkOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbmV3RW50cnkuYWJvcnRlci5hZGRTaWduYWwoc2lnbmFsKTsKICAgICAgbmV3RW50cnkuYWJvcnRlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCAoKSA9PiB7CiAgICAgICAgaWYgKCFuZXdFbnRyeS5zZXR0bGVkKSB7CiAgICAgICAgICB0aGlzLmV2aWN0KGtleSwgbmV3RW50cnkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG5ld0VudHJ5LnByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgbmV3RW50cnkuc2V0dGxlZCA9IHRydWU7CiAgICAgIH0sICgpID0+IHsKICAgICAgICBuZXdFbnRyeS5zZXR0bGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmV2aWN0KGtleSwgbmV3RW50cnkpOwogICAgICB9KS5jYXRjaCgoZSkgPT4gewogICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgdGhyb3cgZTsKICAgICAgfSk7CiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgbmV3RW50cnkpOwogICAgfQogICAgc3RhdGljIGNoZWNrU2luZ2xlUHJvbWlzZShwcm9taXNlLCBzaWduYWwpIHsKICAgICAgZnVuY3Rpb24gY2hlY2tGb3JTaW5nbGVBYm9ydCgpIHsKICAgICAgICBpZiAoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSB7CiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiYWJvcnRlZCIpLCB7IGNvZGU6ICJFUlJfQUJPUlRFRCIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHJlc3VsdCkgPT4gewogICAgICAgIGNoZWNrRm9yU2luZ2xlQWJvcnQoKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9LCAoZXJyb3IpID0+IHsKICAgICAgICBjaGVja0ZvclNpbmdsZUFib3J0KCk7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0pOwogICAgfQogICAgaGFzKGtleSkgewogICAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoa2V5KTsKICAgIH0KICAgIGdldChrZXksIGRhdGEsIHNpZ25hbCwgc3RhdHVzQ2FsbGJhY2spIHsKICAgICAgaWYgKCFzaWduYWwgJiYgZGF0YSBpbnN0YW5jZW9mIGFib3J0Y29udHJvbGxlcl9wb255ZmlsbF8xLkFib3J0U2lnbmFsKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigic2Vjb25kIGdldCBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGFuIEFib3J0U2lnbmFsLCBwZXJoYXBzIHlvdSBtZWFudCB0byBwYXNzIGBudWxsYCBmb3IgdGhlIGZpbGwgZGF0YT8iKTsKICAgICAgfQogICAgICBjb25zdCBjYWNoZUVudHJ5ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTsKICAgICAgaWYgKGNhY2hlRW50cnkpIHsKICAgICAgICBpZiAoY2FjaGVFbnRyeS5hYm9ydGVkICYmICFjYWNoZUVudHJ5LnNldHRsZWQpIHsKICAgICAgICAgIHRoaXMuZXZpY3Qoa2V5LCBjYWNoZUVudHJ5KTsKICAgICAgICAgIHJldHVybiB0aGlzLmdldChrZXksIGRhdGEsIHNpZ25hbCwgc3RhdHVzQ2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICBpZiAoY2FjaGVFbnRyeS5zZXR0bGVkKSB7CiAgICAgICAgICByZXR1cm4gY2FjaGVFbnRyeS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBjYWNoZUVudHJ5LmFib3J0ZXIuYWRkU2lnbmFsKHNpZ25hbCk7CiAgICAgICAgY2FjaGVFbnRyeS5zdGF0dXNSZXBvcnRlci5hZGRDYWxsYmFjayhzdGF0dXNDYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIEFib3J0YWJsZVByb21pc2VDYWNoZS5jaGVja1NpbmdsZVByb21pc2UoY2FjaGVFbnRyeS5wcm9taXNlLCBzaWduYWwpOwogICAgICB9CiAgICAgIHRoaXMuZmlsbChrZXksIGRhdGEsIHNpZ25hbCwgc3RhdHVzQ2FsbGJhY2spOwogICAgICByZXR1cm4gQWJvcnRhYmxlUHJvbWlzZUNhY2hlLmNoZWNrU2luZ2xlUHJvbWlzZSgKICAgICAgICB0aGlzLmNhY2hlLmdldChrZXkpLnByb21pc2UsCiAgICAgICAgc2lnbmFsCiAgICAgICk7CiAgICB9CiAgICBkZWxldGUoa2V5KSB7CiAgICAgIGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTsKICAgICAgaWYgKGNhY2hlZEVudHJ5KSB7CiAgICAgICAgaWYgKCFjYWNoZWRFbnRyeS5zZXR0bGVkKSB7CiAgICAgICAgICBjYWNoZWRFbnRyeS5hYm9ydGVyLmFib3J0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7CiAgICAgIH0KICAgIH0KICAgIGNsZWFyKCkgewogICAgICBjb25zdCBrZXlJdGVyID0gdGhpcy5jYWNoZS5rZXlzKCk7CiAgICAgIGxldCBkZWxldGVDb3VudCA9IDA7CiAgICAgIGZvciAobGV0IHJlc3VsdCA9IGtleUl0ZXIubmV4dCgpOyAhcmVzdWx0LmRvbmU7IHJlc3VsdCA9IGtleUl0ZXIubmV4dCgpKSB7CiAgICAgICAgdGhpcy5kZWxldGUocmVzdWx0LnZhbHVlKTsKICAgICAgICBkZWxldGVDb3VudCArPSAxOwogICAgICB9CiAgICAgIHJldHVybiBkZWxldGVDb3VudDsKICAgIH0KICB9CiAgQWJvcnRhYmxlUHJvbWlzZUNhY2hlJDEuZGVmYXVsdCA9IEFib3J0YWJsZVByb21pc2VDYWNoZTsKICB2YXIgX19pbXBvcnREZWZhdWx0ID0gY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19pbXBvcnREZWZhdWx0IHx8IGZ1bmN0aW9uKG1vZCkgewogICAgcmV0dXJuIG1vZCAmJiBtb2QuX19lc01vZHVsZSA/IG1vZCA6IHsgImRlZmF1bHQiOiBtb2QgfTsKICB9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlc20sICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICBjb25zdCBBYm9ydGFibGVQcm9taXNlQ2FjaGVfMSA9IF9faW1wb3J0RGVmYXVsdChBYm9ydGFibGVQcm9taXNlQ2FjaGUkMSk7CiAgdmFyIF9kZWZhdWx0ID0gZXNtLmRlZmF1bHQgPSBBYm9ydGFibGVQcm9taXNlQ2FjaGVfMS5kZWZhdWx0OwogIGNsYXNzIFF1aWNrTFJVIHsKICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkgewogICAgICBpZiAoIShvcHRpb25zLm1heFNpemUgJiYgb3B0aW9ucy5tYXhTaXplID4gMCkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWF4U2l6ZWAgbXVzdCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMCIpOwogICAgICB9CiAgICAgIHRoaXMubWF4U2l6ZSA9IG9wdGlvbnMubWF4U2l6ZTsKICAgICAgdGhpcy5jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIHRoaXMub2xkQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0aGlzLl9zaXplID0gMDsKICAgIH0KICAgIF9zZXQoa2V5LCB2YWx1ZSkgewogICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTsKICAgICAgdGhpcy5fc2l6ZSsrOwogICAgICBpZiAodGhpcy5fc2l6ZSA+PSB0aGlzLm1heFNpemUpIHsKICAgICAgICB0aGlzLl9zaXplID0gMDsKICAgICAgICB0aGlzLm9sZENhY2hlID0gdGhpcy5jYWNoZTsKICAgICAgICB0aGlzLmNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgfQogICAgfQogICAgZ2V0KGtleSkgewogICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkgewogICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9sZENhY2hlLmhhcyhrZXkpKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm9sZENhY2hlLmdldChrZXkpOwogICAgICAgIHRoaXMub2xkQ2FjaGUuZGVsZXRlKGtleSk7CiAgICAgICAgdGhpcy5fc2V0KGtleSwgdmFsdWUpOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgfQogICAgc2V0KGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKGtleSkpIHsKICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9zZXQoa2V5LCB2YWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBoYXMoa2V5KSB7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhrZXkpIHx8IHRoaXMub2xkQ2FjaGUuaGFzKGtleSk7CiAgICB9CiAgICBwZWVrKGtleSkgewogICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkgewogICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9sZENhY2hlLmhhcyhrZXkpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub2xkQ2FjaGUuZ2V0KGtleSk7CiAgICAgIH0KICAgIH0KICAgIGRlbGV0ZShrZXkpIHsKICAgICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7CiAgICAgIGlmIChkZWxldGVkKSB7CiAgICAgICAgdGhpcy5fc2l6ZS0tOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm9sZENhY2hlLmRlbGV0ZShrZXkpIHx8IGRlbGV0ZWQ7CiAgICB9CiAgICBjbGVhcigpIHsKICAgICAgdGhpcy5jYWNoZS5jbGVhcigpOwogICAgICB0aGlzLm9sZENhY2hlLmNsZWFyKCk7CiAgICAgIHRoaXMuX3NpemUgPSAwOwogICAgfQogICAgKmtleXMoKSB7CiAgICAgIGZvciAoY29uc3QgW2tleV0gb2YgdGhpcykgewogICAgICAgIHlpZWxkIGtleTsKICAgICAgfQogICAgfQogICAgKnZhbHVlcygpIHsKICAgICAgZm9yIChjb25zdCBbLCB2YWx1ZV0gb2YgdGhpcykgewogICAgICAgIHlpZWxkIHZhbHVlOwogICAgICB9CiAgICB9CiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNhY2hlKSB7CiAgICAgICAgeWllbGQgaXRlbTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5vbGRDYWNoZSkgewogICAgICAgIGNvbnN0IFtrZXldID0gaXRlbTsKICAgICAgICBpZiAoIXRoaXMuY2FjaGUuaGFzKGtleSkpIHsKICAgICAgICAgIHlpZWxkIGl0ZW07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBnZXQgc2l6ZSgpIHsKICAgICAgbGV0IG9sZENhY2hlU2l6ZSA9IDA7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMub2xkQ2FjaGUua2V5cygpKSB7CiAgICAgICAgaWYgKCF0aGlzLmNhY2hlLmhhcyhrZXkpKSB7CiAgICAgICAgICBvbGRDYWNoZVNpemUrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3NpemUgKyBvbGRDYWNoZVNpemU7CiAgICB9CiAgfQogIHZhciBxdWlja0xydSA9IFF1aWNrTFJVOwogIHZhciBidWZmZXIgPSB7fTsKICB2YXIgYmFzZTY0SnMgPSB7fTsKICBiYXNlNjRKcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDsKICBiYXNlNjRKcy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5OwogIGJhc2U2NEpzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5OwogIHZhciBsb29rdXAgPSBbXTsKICB2YXIgcmV2TG9va3VwID0gW107CiAgdmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAidW5kZWZpbmVkIiA/IFVpbnQ4QXJyYXkgOiBBcnJheTsKICB2YXIgY29kZSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkgewogICAgbG9va3VwW2ldID0gY29kZVtpXTsKICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaTsKICB9CiAgcmV2TG9va3VwWyItIi5jaGFyQ29kZUF0KDApXSA9IDYyOwogIHJldkxvb2t1cFsiXyIuY2hhckNvZGVBdCgwKV0gPSA2MzsKICBmdW5jdGlvbiBnZXRMZW5zKGI2NCkgewogICAgdmFyIGxlbjIgPSBiNjQubGVuZ3RoOwogICAgaWYgKGxlbjIgJSA0ID4gMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTsKICAgIH0KICAgIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCI9Iik7CiAgICBpZiAodmFsaWRMZW4gPT09IC0xKQogICAgICB2YWxpZExlbiA9IGxlbjI7CiAgICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlbjIgPyAwIDogNCAtIHZhbGlkTGVuICUgNDsKICAgIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl07CiAgfQogIGZ1bmN0aW9uIGJ5dGVMZW5ndGgoYjY0KSB7CiAgICB2YXIgbGVucyA9IGdldExlbnMoYjY0KTsKICAgIHZhciB2YWxpZExlbiA9IGxlbnNbMF07CiAgICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXTsKICAgIHJldHVybiAodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQgLSBwbGFjZUhvbGRlcnNMZW47CiAgfQogIGZ1bmN0aW9uIF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikgewogICAgcmV0dXJuICh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0xlbjsKICB9CiAgZnVuY3Rpb24gdG9CeXRlQXJyYXkoYjY0KSB7CiAgICB2YXIgdG1wOwogICAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NCk7CiAgICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdOwogICAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07CiAgICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKTsKICAgIHZhciBjdXJCeXRlID0gMDsKICAgIHZhciBsZW4yID0gcGxhY2VIb2xkZXJzTGVuID4gMCA/IHZhbGlkTGVuIC0gNCA6IHZhbGlkTGVuOwogICAgdmFyIGkyOwogICAgZm9yIChpMiA9IDA7IGkyIDwgbGVuMjsgaTIgKz0gNCkgewogICAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIpXSA8PCAxOCB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpMiArIDEpXSA8PCAxMiB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpMiArIDIpXSA8PCA2IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkyICsgMyldOwogICAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiAxNiAmIDI1NTsKICAgICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gOCAmIDI1NTsKICAgICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAyNTU7CiAgICB9CiAgICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7CiAgICAgIHRtcCA9IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpMildIDw8IDIgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIgKyAxKV0gPj4gNDsKICAgICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAyNTU7CiAgICB9CiAgICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7CiAgICAgIHRtcCA9IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpMildIDw8IDEwIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkyICsgMSldIDw8IDQgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaTIgKyAyKV0gPj4gMjsKICAgICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gOCAmIDI1NTsKICAgICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAyNTU7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KICBmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQobnVtKSB7CiAgICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDYzXSArIGxvb2t1cFtudW0gPj4gMTIgJiA2M10gKyBsb29rdXBbbnVtID4+IDYgJiA2M10gKyBsb29rdXBbbnVtICYgNjNdOwogIH0KICBmdW5jdGlvbiBlbmNvZGVDaHVuayh1aW50OCwgc3RhcnQsIGVuZCkgewogICAgdmFyIHRtcDsKICAgIHZhciBvdXRwdXQgPSBbXTsKICAgIGZvciAodmFyIGkyID0gc3RhcnQ7IGkyIDwgZW5kOyBpMiArPSAzKSB7CiAgICAgIHRtcCA9ICh1aW50OFtpMl0gPDwgMTYgJiAxNjcxMTY4MCkgKyAodWludDhbaTIgKyAxXSA8PCA4ICYgNjUyODApICsgKHVpbnQ4W2kyICsgMl0gJiAyNTUpOwogICAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSk7CiAgICB9CiAgICByZXR1cm4gb3V0cHV0LmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBmcm9tQnl0ZUFycmF5KHVpbnQ4KSB7CiAgICB2YXIgdG1wOwogICAgdmFyIGxlbjIgPSB1aW50OC5sZW5ndGg7CiAgICB2YXIgZXh0cmFCeXRlcyA9IGxlbjIgJSAzOwogICAgdmFyIHBhcnRzID0gW107CiAgICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MzsKICAgIGZvciAodmFyIGkyID0gMCwgbGVuMjIgPSBsZW4yIC0gZXh0cmFCeXRlczsgaTIgPCBsZW4yMjsgaTIgKz0gbWF4Q2h1bmtMZW5ndGgpIHsKICAgICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaTIsIGkyICsgbWF4Q2h1bmtMZW5ndGggPiBsZW4yMiA/IGxlbjIyIDogaTIgKyBtYXhDaHVua0xlbmd0aCkpOwogICAgfQogICAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHsKICAgICAgdG1wID0gdWludDhbbGVuMiAtIDFdOwogICAgICBwYXJ0cy5wdXNoKAogICAgICAgIGxvb2t1cFt0bXAgPj4gMl0gKyBsb29rdXBbdG1wIDw8IDQgJiA2M10gKyAiPT0iCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHsKICAgICAgdG1wID0gKHVpbnQ4W2xlbjIgLSAyXSA8PCA4KSArIHVpbnQ4W2xlbjIgLSAxXTsKICAgICAgcGFydHMucHVzaCgKICAgICAgICBsb29rdXBbdG1wID4+IDEwXSArIGxvb2t1cFt0bXAgPj4gNCAmIDYzXSArIGxvb2t1cFt0bXAgPDwgMiAmIDYzXSArICI9IgogICAgICApOwogICAgfQogICAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpOwogIH0KICB2YXIgaWVlZTc1NCA9IHt9OwogIC8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovCiAgaWVlZTc1NC5yZWFkID0gZnVuY3Rpb24oYnVmZmVyMiwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHsKICAgIHZhciBlLCBtOwogICAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7CiAgICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTsKICAgIHZhciBlQmlhcyA9IGVNYXggPj4gMTsKICAgIHZhciBuQml0cyA9IC03OwogICAgdmFyIGkyID0gaXNMRSA/IG5CeXRlcyAtIDEgOiAwOwogICAgdmFyIGQgPSBpc0xFID8gLTEgOiAxOwogICAgdmFyIHMgPSBidWZmZXIyW29mZnNldCArIGkyXTsKICAgIGkyICs9IGQ7CiAgICBlID0gcyAmICgxIDw8IC1uQml0cykgLSAxOwogICAgcyA+Pj0gLW5CaXRzOwogICAgbkJpdHMgKz0gZUxlbjsKICAgIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyMltvZmZzZXQgKyBpMl0sIGkyICs9IGQsIG5CaXRzIC09IDgpIHsKICAgIH0KICAgIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7CiAgICBlID4+PSAtbkJpdHM7CiAgICBuQml0cyArPSBtTGVuOwogICAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXIyW29mZnNldCArIGkyXSwgaTIgKz0gZCwgbkJpdHMgLT0gOCkgewogICAgfQogICAgaWYgKGUgPT09IDApIHsKICAgICAgZSA9IDEgLSBlQmlhczsKICAgIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkgewogICAgICByZXR1cm4gbSA/IE5hTiA6IChzID8gLTEgOiAxKSAqIEluZmluaXR5OwogICAgfSBlbHNlIHsKICAgICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKTsKICAgICAgZSA9IGUgLSBlQmlhczsKICAgIH0KICAgIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pOwogIH07CiAgaWVlZTc1NC53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcjIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykgewogICAgdmFyIGUsIG0sIGMyOwogICAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7CiAgICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTsKICAgIHZhciBlQmlhcyA9IGVNYXggPj4gMTsKICAgIHZhciBydCA9IG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwOwogICAgdmFyIGkyID0gaXNMRSA/IDAgOiBuQnl0ZXMgLSAxOwogICAgdmFyIGQgPSBpc0xFID8gMSA6IC0xOwogICAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwOwogICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7CiAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkgewogICAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDA7CiAgICAgIGUgPSBlTWF4OwogICAgfSBlbHNlIHsKICAgICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpOwogICAgICBpZiAodmFsdWUgKiAoYzIgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkgewogICAgICAgIGUtLTsKICAgICAgICBjMiAqPSAyOwogICAgICB9CiAgICAgIGlmIChlICsgZUJpYXMgPj0gMSkgewogICAgICAgIHZhbHVlICs9IHJ0IC8gYzI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSAqIGMyID49IDIpIHsKICAgICAgICBlKys7CiAgICAgICAgYzIgLz0gMjsKICAgICAgfQogICAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHsKICAgICAgICBtID0gMDsKICAgICAgICBlID0gZU1heDsKICAgICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkgewogICAgICAgIG0gPSAodmFsdWUgKiBjMiAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7CiAgICAgICAgZSA9IGUgKyBlQmlhczsKICAgICAgfSBlbHNlIHsKICAgICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7CiAgICAgICAgZSA9IDA7CiAgICAgIH0KICAgIH0KICAgIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcjJbb2Zmc2V0ICsgaTJdID0gbSAmIDI1NSwgaTIgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkgewogICAgfQogICAgZSA9IGUgPDwgbUxlbiB8IG07CiAgICBlTGVuICs9IG1MZW47CiAgICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcjJbb2Zmc2V0ICsgaTJdID0gZSAmIDI1NSwgaTIgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkgewogICAgfQogICAgYnVmZmVyMltvZmZzZXQgKyBpMiAtIGRdIHw9IHMgKiAxMjg7CiAgfTsKICAvKiEKICAgKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICAgKgogICAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+CiAgICogQGxpY2Vuc2UgIE1JVAogICAqLwogIChmdW5jdGlvbihleHBvcnRzMikgewogICAgY29uc3QgYmFzZTY0ID0gYmFzZTY0SnM7CiAgICBjb25zdCBpZWVlNzU0JDEgPSBpZWVlNzU0OwogICAgY29uc3QgY3VzdG9tSW5zcGVjdFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbFsiZm9yIl0gPT09ICJmdW5jdGlvbiIgPyBTeW1ib2xbImZvciJdKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpIDogbnVsbDsKICAgIGV4cG9ydHMyLkJ1ZmZlciA9IEJ1ZmZlcjM7CiAgICBleHBvcnRzMi5TbG93QnVmZmVyID0gU2xvd0J1ZmZlcjsKICAgIGV4cG9ydHMyLklOU1BFQ1RfTUFYX0JZVEVTID0gNTA7CiAgICBjb25zdCBLX01BWF9MRU5HVEggPSAyMTQ3NDgzNjQ3OwogICAgZXhwb3J0czIua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSDsKICAgIEJ1ZmZlcjMuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KCk7CiAgICBpZiAoIUJ1ZmZlcjMuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAiVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGBidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuIgogICAgICApOwogICAgfQogICAgZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSk7CiAgICAgICAgY29uc3QgcHJvdG8gPSB7IGZvbzogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gNDI7CiAgICAgICAgfSB9OwogICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpOwogICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKTsKICAgICAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MjsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlcjMucHJvdG90eXBlLCAicGFyZW50IiwgewogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghQnVmZmVyMy5pc0J1ZmZlcih0aGlzKSkKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIzLnByb3RvdHlwZSwgIm9mZnNldCIsIHsKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIodGhpcykpCiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIHJldHVybiB0aGlzLmJ5dGVPZmZzZXQ7CiAgICAgIH0KICAgIH0pOwogICAgZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGxlbmd0aCkgewogICAgICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIGxlbmd0aCArICciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKTsKICAgICAgfQogICAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIzLnByb3RvdHlwZSk7CiAgICAgIHJldHVybiBidWY7CiAgICB9CiAgICBmdW5jdGlvbiBCdWZmZXIzKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7CiAgICAgIGlmICh0eXBlb2YgYXJnID09PSAibnVtYmVyIikgewogICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAgICdUaGUgInN0cmluZyIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKTsKICAgICAgfQogICAgICByZXR1cm4gZnJvbTIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgfQogICAgQnVmZmVyMy5wb29sU2l6ZSA9IDgxOTI7CiAgICBmdW5jdGlvbiBmcm9tMih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KTsKICAgICAgfQogICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkgewogICAgICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKTsKICAgICAgfQogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgIiArIHR5cGVvZiB2YWx1ZQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fCB2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSB7CiAgICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyICE9PSAidW5kZWZpbmVkIiAmJiAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBTaGFyZWRBcnJheUJ1ZmZlcikpKSB7CiAgICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAnVGhlICJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJwogICAgICAgICk7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpOwogICAgICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIEJ1ZmZlcjMuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgICB9CiAgICAgIGNvbnN0IGIgPSBmcm9tT2JqZWN0KHZhbHVlKTsKICAgICAgaWYgKGIpCiAgICAgICAgcmV0dXJuIGI7CiAgICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiBCdWZmZXIzLmZyb20odmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgic3RyaW5nIiksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgIiArIHR5cGVvZiB2YWx1ZQogICAgICApOwogICAgfQogICAgQnVmZmVyMy5mcm9tID0gZnVuY3Rpb24odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkgewogICAgICByZXR1cm4gZnJvbTIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7CiAgICB9OwogICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlcjMucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSk7CiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyMywgVWludDhBcnJheSk7CiAgICBmdW5jdGlvbiBhc3NlcnRTaXplKHNpemUpIHsKICAgICAgaWYgKHR5cGVvZiBzaXplICE9PSAibnVtYmVyIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7CiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlICInICsgc2l6ZSArICciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHsKICAgICAgYXNzZXJ0U2l6ZShzaXplKTsKICAgICAgaWYgKHNpemUgPD0gMCkgewogICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSk7CiAgICAgIH0KICAgICAgaWYgKGZpbGwgIT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICJzdHJpbmciID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKTsKICAgIH0KICAgIEJ1ZmZlcjMuYWxsb2MgPSBmdW5jdGlvbihzaXplLCBmaWxsLCBlbmNvZGluZykgewogICAgICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpOwogICAgfTsKICAgIGZ1bmN0aW9uIGFsbG9jVW5zYWZlKHNpemUpIHsKICAgICAgYXNzZXJ0U2l6ZShzaXplKTsKICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMCk7CiAgICB9CiAgICBCdWZmZXIzLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24oc2l6ZSkgewogICAgICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSk7CiAgICB9OwogICAgQnVmZmVyMy5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbihzaXplKSB7CiAgICAgIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKTsKICAgIH07CiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nMihzdHJpbmcsIGVuY29kaW5nKSB7CiAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICJzdHJpbmciIHx8IGVuY29kaW5nID09PSAiIikgewogICAgICAgIGVuY29kaW5nID0gInV0ZjgiOwogICAgICB9CiAgICAgIGlmICghQnVmZmVyMy5pc0VuY29kaW5nKGVuY29kaW5nKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyk7CiAgICAgIH0KICAgICAgY29uc3QgbGVuZ3RoID0gYnl0ZUxlbmd0aDIoc3RyaW5nLCBlbmNvZGluZykgfCAwOwogICAgICBsZXQgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aCk7CiAgICAgIGNvbnN0IGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKTsKICAgICAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7CiAgICAgICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ1ZjsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwOwogICAgICBjb25zdCBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgIGJ1ZltpMl0gPSBhcnJheVtpMl0gJiAyNTU7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ1ZjsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21BcnJheVZpZXcoYXJyYXlWaWV3KSB7CiAgICAgIGlmIChpc0luc3RhbmNlKGFycmF5VmlldywgVWludDhBcnJheSkpIHsKICAgICAgICBjb25zdCBjb3B5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlWaWV3KTsKICAgICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKGNvcHkuYnVmZmVyLCBjb3B5LmJ5dGVPZmZzZXQsIGNvcHkuYnl0ZUxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KTsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlcihhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcib2Zmc2V0IiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTsKICAgICAgfQogICAgICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJsZW5ndGgiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpOwogICAgICB9CiAgICAgIGxldCBidWY7CiAgICAgIGlmIChieXRlT2Zmc2V0ID09PSB2b2lkIDAgJiYgbGVuZ3RoID09PSB2b2lkIDApIHsKICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSk7CiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB2b2lkIDApIHsKICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgICAgIH0KICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyMy5wcm90b3R5cGUpOwogICAgICByZXR1cm4gYnVmOwogICAgfQogICAgZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHsKICAgICAgaWYgKEJ1ZmZlcjMuaXNCdWZmZXIob2JqKSkgewogICAgICAgIGNvbnN0IGxlbjIgPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMDsKICAgICAgICBjb25zdCBidWYgPSBjcmVhdGVCdWZmZXIobGVuMik7CiAgICAgICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJldHVybiBidWY7CiAgICAgICAgfQogICAgICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuMik7CiAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICAgfQogICAgICBpZiAob2JqLmxlbmd0aCAhPT0gdm9pZCAwKSB7CiAgICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAibnVtYmVyIiB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkgewogICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcigwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKTsKICAgICAgfQogICAgICBpZiAob2JqLnR5cGUgPT09ICJCdWZmZXIiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpKSB7CiAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjaGVja2VkKGxlbmd0aCkgewogICAgICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IiArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAiIGJ5dGVzIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxlbmd0aCB8IDA7CiAgICB9CiAgICBmdW5jdGlvbiBTbG93QnVmZmVyKGxlbmd0aCkgewogICAgICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsKICAgICAgICBsZW5ndGggPSAwOwogICAgICB9CiAgICAgIHJldHVybiBCdWZmZXIzLmFsbG9jKCtsZW5ndGgpOwogICAgfQogICAgQnVmZmVyMy5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyMihiKSB7CiAgICAgIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiYgYiAhPT0gQnVmZmVyMy5wcm90b3R5cGU7CiAgICB9OwogICAgQnVmZmVyMy5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7CiAgICAgIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKQogICAgICAgIGEgPSBCdWZmZXIzLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aCk7CiAgICAgIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKQogICAgICAgIGIgPSBCdWZmZXIzLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aCk7CiAgICAgIGlmICghQnVmZmVyMy5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyMy5pc0J1ZmZlcihiKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAnVGhlICJidWYxIiwgImJ1ZjIiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5JwogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKGEgPT09IGIpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGxldCB4ID0gYS5sZW5ndGg7CiAgICAgIGxldCB5ID0gYi5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkyID0gMCwgbGVuMiA9IE1hdGgubWluKHgsIHkpOyBpMiA8IGxlbjI7ICsraTIpIHsKICAgICAgICBpZiAoYVtpMl0gIT09IGJbaTJdKSB7CiAgICAgICAgICB4ID0gYVtpMl07CiAgICAgICAgICB5ID0gYltpMl07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHggPCB5KQogICAgICAgIHJldHVybiAtMTsKICAgICAgaWYgKHkgPCB4KQogICAgICAgIHJldHVybiAxOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICBCdWZmZXIzLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nMihlbmNvZGluZykgewogICAgICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkgewogICAgICAgIGNhc2UgImhleCI6CiAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICBjYXNlICJsYXRpbjEiOgogICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfTsKICAgIEJ1ZmZlcjMuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KGxpc3QsIGxlbmd0aCkgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7CiAgICAgIH0KICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJ1ZmZlcjMuYWxsb2MoMCk7CiAgICAgIH0KICAgICAgbGV0IGkyOwogICAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHsKICAgICAgICBsZW5ndGggPSAwOwogICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IGxpc3QubGVuZ3RoOyArK2kyKSB7CiAgICAgICAgICBsZW5ndGggKz0gbGlzdFtpMl0ubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBidWZmZXIyID0gQnVmZmVyMy5hbGxvY1Vuc2FmZShsZW5ndGgpOwogICAgICBsZXQgcG9zID0gMDsKICAgICAgZm9yIChpMiA9IDA7IGkyIDwgbGlzdC5sZW5ndGg7ICsraTIpIHsKICAgICAgICBsZXQgYnVmID0gbGlzdFtpMl07CiAgICAgICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkgewogICAgICAgICAgaWYgKHBvcyArIGJ1Zi5sZW5ndGggPiBidWZmZXIyLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIoYnVmKSkKICAgICAgICAgICAgICBidWYgPSBCdWZmZXIzLmZyb20oYnVmKTsKICAgICAgICAgICAgYnVmLmNvcHkoYnVmZmVyMiwgcG9zKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKAogICAgICAgICAgICAgIGJ1ZmZlcjIsCiAgICAgICAgICAgICAgYnVmLAogICAgICAgICAgICAgIHBvcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIUJ1ZmZlcjMuaXNCdWZmZXIoYnVmKSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBidWYuY29weShidWZmZXIyLCBwb3MpOwogICAgICAgIH0KICAgICAgICBwb3MgKz0gYnVmLmxlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gYnVmZmVyMjsKICAgIH07CiAgICBmdW5jdGlvbiBieXRlTGVuZ3RoMihzdHJpbmcsIGVuY29kaW5nKSB7CiAgICAgIGlmIChCdWZmZXIzLmlzQnVmZmVyKHN0cmluZykpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkgewogICAgICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aDsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHN0cmluZyAhPT0gInN0cmluZyIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZwogICAgICAgICk7CiAgICAgIH0KICAgICAgY29uc3QgbGVuMiA9IHN0cmluZy5sZW5ndGg7CiAgICAgIGNvbnN0IG11c3RNYXRjaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZTsKICAgICAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuMiA9PT0gMCkKICAgICAgICByZXR1cm4gMDsKICAgICAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2U7CiAgICAgIGZvciAoOyA7ICkgewogICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICByZXR1cm4gbGVuMjsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7CiAgICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICAgIGNhc2UgInVjcy0yIjoKICAgICAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgICAgICByZXR1cm4gbGVuMiAqIDI7CiAgICAgICAgICBjYXNlICJoZXgiOgogICAgICAgICAgICByZXR1cm4gbGVuMiA+Pj4gMTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5jb2RpbmcgPSAoIiIgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgQnVmZmVyMy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDI7CiAgICBmdW5jdGlvbiBzbG93VG9TdHJpbmcoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHsKICAgICAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2U7CiAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwIHx8IHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBpZiAoZW5kID09PSB2b2lkIDAgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHsKICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoZW5kIDw9IDApIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgICAgZW5kID4+Pj0gMDsKICAgICAgc3RhcnQgPj4+PSAwOwogICAgICBpZiAoZW5kIDw9IHN0YXJ0KSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICAgIGlmICghZW5jb2RpbmcpCiAgICAgICAgZW5jb2RpbmcgPSAidXRmOCI7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgc3dpdGNoIChlbmNvZGluZykgewogICAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpOwogICAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgICBjYXNlICJ1dGYtOCI6CiAgICAgICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZCk7CiAgICAgICAgICBjYXNlICJhc2NpaSI6CiAgICAgICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpOwogICAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKTsKICAgICAgICAgIGNhc2UgInVjczIiOgogICAgICAgICAgY2FzZSAidWNzLTIiOgogICAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAobG93ZXJlZENhc2UpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nKTsKICAgICAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZTsKICAgIGZ1bmN0aW9uIHN3YXAoYiwgbiwgbSkgewogICAgICBjb25zdCBpMiA9IGJbbl07CiAgICAgIGJbbl0gPSBiW21dOwogICAgICBiW21dID0gaTI7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYoKSB7CiAgICAgIGNvbnN0IGxlbjIgPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKGxlbjIgJSAyICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGxlbjI7IGkyICs9IDIpIHsKICAgICAgICBzd2FwKHRoaXMsIGkyLCBpMiArIDEpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMigpIHsKICAgICAgY29uc3QgbGVuMiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAobGVuMiAlIDQgIT09IDApIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGVuMjsgaTIgKz0gNCkgewogICAgICAgIHN3YXAodGhpcywgaTIsIGkyICsgMyk7CiAgICAgICAgc3dhcCh0aGlzLCBpMiArIDEsIGkyICsgMik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0KCkgewogICAgICBjb25zdCBsZW4yID0gdGhpcy5sZW5ndGg7CiAgICAgIGlmIChsZW4yICUgOCAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBsZW4yOyBpMiArPSA4KSB7CiAgICAgICAgc3dhcCh0aGlzLCBpMiwgaTIgKyA3KTsKICAgICAgICBzd2FwKHRoaXMsIGkyICsgMSwgaTIgKyA2KTsKICAgICAgICBzd2FwKHRoaXMsIGkyICsgMiwgaTIgKyA1KTsKICAgICAgICBzd2FwKHRoaXMsIGkyICsgMywgaTIgKyA0KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nMigpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuICIiOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aCk7CiAgICAgIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlcjMucHJvdG90eXBlLnRvU3RyaW5nOwogICAgQnVmZmVyMy5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKGIpIHsKICAgICAgaWYgKCFCdWZmZXIzLmlzQnVmZmVyKGIpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTsKICAgICAgaWYgKHRoaXMgPT09IGIpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBCdWZmZXIzLmNvbXBhcmUodGhpcywgYikgPT09IDA7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QyKCkgewogICAgICBsZXQgc3RyID0gIiI7CiAgICAgIGNvbnN0IG1heCA9IGV4cG9ydHMyLklOU1BFQ1RfTUFYX0JZVEVTOwogICAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCJoZXgiLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAiJDEgIikudHJpbSgpOwogICAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpCiAgICAgICAgc3RyICs9ICIgLi4uICI7CiAgICAgIHJldHVybiAiPEJ1ZmZlciAiICsgc3RyICsgIj4iOwogICAgfTsKICAgIGlmIChjdXN0b21JbnNwZWN0U3ltYm9sKSB7CiAgICAgIEJ1ZmZlcjMucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gQnVmZmVyMy5wcm90b3R5cGUuaW5zcGVjdDsKICAgIH0KICAgIEJ1ZmZlcjMucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7CiAgICAgIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHsKICAgICAgICB0YXJnZXQgPSBCdWZmZXIzLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aCk7CiAgICAgIH0KICAgICAgaWYgKCFCdWZmZXIzLmlzQnVmZmVyKHRhcmdldCkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgJ1RoZSAidGFyZ2V0IiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdGFyZ2V0CiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPT09IHZvaWQgMCkgewogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfQogICAgICBpZiAoZW5kID09PSB2b2lkIDApIHsKICAgICAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMDsKICAgICAgfQogICAgICBpZiAodGhpc1N0YXJ0ID09PSB2b2lkIDApIHsKICAgICAgICB0aGlzU3RhcnQgPSAwOwogICAgICB9CiAgICAgIGlmICh0aGlzRW5kID09PSB2b2lkIDApIHsKICAgICAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGg7CiAgICAgIH0KICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpOwogICAgICB9CiAgICAgIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgaWYgKHN0YXJ0ID49IGVuZCkgewogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICAgIHN0YXJ0ID4+Pj0gMDsKICAgICAgZW5kID4+Pj0gMDsKICAgICAgdGhpc1N0YXJ0ID4+Pj0gMDsKICAgICAgdGhpc0VuZCA+Pj49IDA7CiAgICAgIGlmICh0aGlzID09PSB0YXJnZXQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGxldCB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydDsKICAgICAgbGV0IHkgPSBlbmQgLSBzdGFydDsKICAgICAgY29uc3QgbGVuMiA9IE1hdGgubWluKHgsIHkpOwogICAgICBjb25zdCB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKTsKICAgICAgY29uc3QgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGxlbjI7ICsraTIpIHsKICAgICAgICBpZiAodGhpc0NvcHlbaTJdICE9PSB0YXJnZXRDb3B5W2kyXSkgewogICAgICAgICAgeCA9IHRoaXNDb3B5W2kyXTsKICAgICAgICAgIHkgPSB0YXJnZXRDb3B5W2kyXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoeCA8IHkpCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZiAoeSA8IHgpCiAgICAgICAgcmV0dXJuIDE7CiAgICAgIHJldHVybiAwOwogICAgfTsKICAgIGZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKGJ1ZmZlcjIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikgewogICAgICBpZiAoYnVmZmVyMi5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0OwogICAgICAgIGJ5dGVPZmZzZXQgPSAwOwogICAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAyMTQ3NDgzNjQ3KSB7CiAgICAgICAgYnl0ZU9mZnNldCA9IDIxNDc0ODM2NDc7CiAgICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0yMTQ3NDgzNjQ4KSB7CiAgICAgICAgYnl0ZU9mZnNldCA9IC0yMTQ3NDgzNjQ4OwogICAgICB9CiAgICAgIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldDsKICAgICAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7CiAgICAgICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiBidWZmZXIyLmxlbmd0aCAtIDE7CiAgICAgIH0KICAgICAgaWYgKGJ5dGVPZmZzZXQgPCAwKQogICAgICAgIGJ5dGVPZmZzZXQgPSBidWZmZXIyLmxlbmd0aCArIGJ5dGVPZmZzZXQ7CiAgICAgIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlcjIubGVuZ3RoKSB7CiAgICAgICAgaWYgKGRpcikKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBlbHNlCiAgICAgICAgICBieXRlT2Zmc2V0ID0gYnVmZmVyMi5sZW5ndGggLSAxOwogICAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7CiAgICAgICAgaWYgKGRpcikKICAgICAgICAgIGJ5dGVPZmZzZXQgPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHZhbCA9PT0gInN0cmluZyIpIHsKICAgICAgICB2YWwgPSBCdWZmZXIzLmZyb20odmFsLCBlbmNvZGluZyk7CiAgICAgIH0KICAgICAgaWYgKEJ1ZmZlcjMuaXNCdWZmZXIodmFsKSkgewogICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyMiwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAibnVtYmVyIikgewogICAgICAgIHZhbCA9IHZhbCAmIDI1NTsKICAgICAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGlmIChkaXIpIHsKICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIyLCB2YWwsIGJ5dGVPZmZzZXQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyMiwgdmFsLCBieXRlT2Zmc2V0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIyLCBbdmFsXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcik7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIik7CiAgICB9CiAgICBmdW5jdGlvbiBhcnJheUluZGV4T2YoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHsKICAgICAgbGV0IGluZGV4U2l6ZSA9IDE7CiAgICAgIGxldCBhcnJMZW5ndGggPSBhcnIubGVuZ3RoOwogICAgICBsZXQgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aDsKICAgICAgaWYgKGVuY29kaW5nICE9PSB2b2lkIDApIHsKICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoZW5jb2RpbmcgPT09ICJ1Y3MyIiB8fCBlbmNvZGluZyA9PT0gInVjcy0yIiB8fCBlbmNvZGluZyA9PT0gInV0ZjE2bGUiIHx8IGVuY29kaW5nID09PSAidXRmLTE2bGUiKSB7CiAgICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXhTaXplID0gMjsKICAgICAgICAgIGFyckxlbmd0aCAvPSAyOwogICAgICAgICAgdmFsTGVuZ3RoIC89IDI7CiAgICAgICAgICBieXRlT2Zmc2V0IC89IDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHJlYWQoYnVmLCBpMykgewogICAgICAgIGlmIChpbmRleFNpemUgPT09IDEpIHsKICAgICAgICAgIHJldHVybiBidWZbaTNdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpMyAqIGluZGV4U2l6ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBpMjsKICAgICAgaWYgKGRpcikgewogICAgICAgIGxldCBmb3VuZEluZGV4ID0gLTE7CiAgICAgICAgZm9yIChpMiA9IGJ5dGVPZmZzZXQ7IGkyIDwgYXJyTGVuZ3RoOyBpMisrKSB7CiAgICAgICAgICBpZiAocmVhZChhcnIsIGkyKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkyIC0gZm91bmRJbmRleCkpIHsKICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKQogICAgICAgICAgICAgIGZvdW5kSW5kZXggPSBpMjsKICAgICAgICAgICAgaWYgKGkyIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkKICAgICAgICAgICAgICByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkKICAgICAgICAgICAgICBpMiAtPSBpMiAtIGZvdW5kSW5kZXg7CiAgICAgICAgICAgIGZvdW5kSW5kZXggPSAtMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpCiAgICAgICAgICBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoOwogICAgICAgIGZvciAoaTIgPSBieXRlT2Zmc2V0OyBpMiA+PSAwOyBpMi0tKSB7CiAgICAgICAgICBsZXQgZm91bmQgPSB0cnVlOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykgewogICAgICAgICAgICBpZiAocmVhZChhcnIsIGkyICsgaikgIT09IHJlYWQodmFsLCBqKSkgewogICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmb3VuZCkKICAgICAgICAgICAgcmV0dXJuIGkyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzMih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mMih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7CiAgICAgIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHsKICAgICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKTsKICAgIH07CiAgICBmdW5jdGlvbiBoZXhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMDsKICAgICAgY29uc3QgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldDsKICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7CiAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykgewogICAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoOwogICAgICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikgewogICAgICAgIGxlbmd0aCA9IHN0ckxlbiAvIDI7CiAgICAgIH0KICAgICAgbGV0IGkyOwogICAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW5ndGg7ICsraTIpIHsKICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkyICogMiwgMiksIDE2KTsKICAgICAgICBpZiAobnVtYmVySXNOYU4ocGFyc2VkKSkKICAgICAgICAgIHJldHVybiBpMjsKICAgICAgICBidWZbb2Zmc2V0ICsgaTJdID0gcGFyc2VkOwogICAgICB9CiAgICAgIHJldHVybiBpMjsKICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgICBmdW5jdGlvbiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkgewogICAgICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlNjRXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHVjczJXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7CiAgICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkgewogICAgICAgIGVuY29kaW5nID0gInV0ZjgiOwogICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgICAgIG9mZnNldCA9IDA7CiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB2b2lkIDAgJiYgdHlwZW9mIG9mZnNldCA9PT0gInN0cmluZyIpIHsKICAgICAgICBlbmNvZGluZyA9IG9mZnNldDsKICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgICAgICBvZmZzZXQgPSAwOwogICAgICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHsKICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMDsKICAgICAgICAgIGlmIChlbmNvZGluZyA9PT0gdm9pZCAwKQogICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7CiAgICAgICAgICBsZW5ndGggPSB2b2lkIDA7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIKICAgICAgICApOwogICAgICB9CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0OwogICAgICBpZiAobGVuZ3RoID09PSB2b2lkIDAgfHwgbGVuZ3RoID4gcmVtYWluaW5nKQogICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZzsKICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7CiAgICAgIH0KICAgICAgaWYgKCFlbmNvZGluZykKICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IjsKICAgICAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2U7CiAgICAgIGZvciAoOyA7ICkgewogICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKICAgICAgICAgIGNhc2UgImhleCI6CiAgICAgICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSAiYXNjaWkiOgogICAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICAgY2FzZSAidWNzMiI6CiAgICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgICAgICAgICBlbmNvZGluZyA9ICgiIiArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6ICJCdWZmZXIiLAogICAgICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKQogICAgICB9OwogICAgfTsKICAgIGZ1bmN0aW9uIGJhc2U2NFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkgewogICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjhTbGljZShidWYsIHN0YXJ0LCBlbmQpIHsKICAgICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTsKICAgICAgY29uc3QgcmVzID0gW107CiAgICAgIGxldCBpMiA9IHN0YXJ0OwogICAgICB3aGlsZSAoaTIgPCBlbmQpIHsKICAgICAgICBjb25zdCBmaXJzdEJ5dGUgPSBidWZbaTJdOwogICAgICAgIGxldCBjb2RlUG9pbnQgPSBudWxsOwogICAgICAgIGxldCBieXRlc1BlclNlcXVlbmNlID0gZmlyc3RCeXRlID4gMjM5ID8gNCA6IGZpcnN0Qnl0ZSA+IDIyMyA/IDMgOiBmaXJzdEJ5dGUgPiAxOTEgPyAyIDogMTsKICAgICAgICBpZiAoaTIgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkgewogICAgICAgICAgbGV0IHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludDsKICAgICAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDEyOCkgewogICAgICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaTIgKyAxXTsKICAgICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAxOTIpID09PSAxMjgpIHsKICAgICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMzEpIDw8IDYgfCBzZWNvbmRCeXRlICYgNjM7CiAgICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDEyNykgewogICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaTIgKyAxXTsKICAgICAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaTIgKyAyXTsKICAgICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAxOTIpID09PSAxMjggJiYgKHRoaXJkQnl0ZSAmIDE5MikgPT09IDEyOCkgewogICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAxNSkgPDwgMTIgfCAoc2Vjb25kQnl0ZSAmIDYzKSA8PCA2IHwgdGhpcmRCeXRlICYgNjM7CiAgICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDIwNDcgJiYgKHRlbXBDb2RlUG9pbnQgPCA1NTI5NiB8fCB0ZW1wQ29kZVBvaW50ID4gNTczNDMpKSB7CiAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpMiArIDFdOwogICAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpMiArIDJdOwogICAgICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaTIgKyAzXTsKICAgICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAxOTIpID09PSAxMjggJiYgKHRoaXJkQnl0ZSAmIDE5MikgPT09IDEyOCAmJiAoZm91cnRoQnl0ZSAmIDE5MikgPT09IDEyOCkgewogICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAxNSkgPDwgMTggfCAoc2Vjb25kQnl0ZSAmIDYzKSA8PCAxMiB8ICh0aGlyZEJ5dGUgJiA2MykgPDwgNiB8IGZvdXJ0aEJ5dGUgJiA2MzsKICAgICAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gNjU1MzUgJiYgdGVtcENvZGVQb2ludCA8IDExMTQxMTIpIHsKICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHsKICAgICAgICAgIGNvZGVQb2ludCA9IDY1NTMzOwogICAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiA2NTUzNSkgewogICAgICAgICAgY29kZVBvaW50IC09IDY1NTM2OwogICAgICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDEwMjMgfCA1NTI5Nik7CiAgICAgICAgICBjb2RlUG9pbnQgPSA1NjMyMCB8IGNvZGVQb2ludCAmIDEwMjM7CiAgICAgICAgfQogICAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCk7CiAgICAgICAgaTIgKz0gYnl0ZXNQZXJTZXF1ZW5jZTsKICAgICAgfQogICAgICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcyk7CiAgICB9CiAgICBjb25zdCBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDQwOTY7CiAgICBmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkoY29kZVBvaW50cykgewogICAgICBjb25zdCBsZW4yID0gY29kZVBvaW50cy5sZW5ndGg7CiAgICAgIGlmIChsZW4yIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTsKICAgICAgfQogICAgICBsZXQgcmVzID0gIiI7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIHdoaWxlIChpMiA8IGxlbjIpIHsKICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgKICAgICAgICAgIFN0cmluZywKICAgICAgICAgIGNvZGVQb2ludHMuc2xpY2UoaTIsIGkyICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKQogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIGZ1bmN0aW9uIGFzY2lpU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7CiAgICAgIGxldCByZXQgPSAiIjsKICAgICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTsKICAgICAgZm9yIChsZXQgaTIgPSBzdGFydDsgaTIgPCBlbmQ7ICsraTIpIHsKICAgICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaTJdICYgMTI3KTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7CiAgICAgIGxldCByZXQgPSAiIjsKICAgICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTsKICAgICAgZm9yIChsZXQgaTIgPSBzdGFydDsgaTIgPCBlbmQ7ICsraTIpIHsKICAgICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaTJdKTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gaGV4U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7CiAgICAgIGNvbnN0IGxlbjIgPSBidWYubGVuZ3RoOwogICAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkKICAgICAgICBzdGFydCA9IDA7CiAgICAgIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuMikKICAgICAgICBlbmQgPSBsZW4yOwogICAgICBsZXQgb3V0ID0gIiI7CiAgICAgIGZvciAobGV0IGkyID0gc3RhcnQ7IGkyIDwgZW5kOyArK2kyKSB7CiAgICAgICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2kyXV07CiAgICAgIH0KICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjE2bGVTbGljZShidWYsIHN0YXJ0LCBlbmQpIHsKICAgICAgY29uc3QgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgIGxldCByZXMgPSAiIjsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGJ5dGVzLmxlbmd0aCAtIDE7IGkyICs9IDIpIHsKICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpMl0gKyBieXRlc1tpMiArIDFdICogMjU2KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7CiAgICAgIGNvbnN0IGxlbjIgPSB0aGlzLmxlbmd0aDsKICAgICAgc3RhcnQgPSB+fnN0YXJ0OwogICAgICBlbmQgPSBlbmQgPT09IHZvaWQgMCA/IGxlbjIgOiB+fmVuZDsKICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ICs9IGxlbjI7CiAgICAgICAgaWYgKHN0YXJ0IDwgMCkKICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfSBlbHNlIGlmIChzdGFydCA+IGxlbjIpIHsKICAgICAgICBzdGFydCA9IGxlbjI7CiAgICAgIH0KICAgICAgaWYgKGVuZCA8IDApIHsKICAgICAgICBlbmQgKz0gbGVuMjsKICAgICAgICBpZiAoZW5kIDwgMCkKICAgICAgICAgIGVuZCA9IDA7CiAgICAgIH0gZWxzZSBpZiAoZW5kID4gbGVuMikgewogICAgICAgIGVuZCA9IGxlbjI7CiAgICAgIH0KICAgICAgaWYgKGVuZCA8IHN0YXJ0KQogICAgICAgIGVuZCA9IHN0YXJ0OwogICAgICBjb25zdCBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpOwogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIzLnByb3RvdHlwZSk7CiAgICAgIHJldHVybiBuZXdCdWY7CiAgICB9OwogICAgZnVuY3Rpb24gY2hlY2tPZmZzZXQob2Zmc2V0LCBleHQsIGxlbmd0aCkgewogICAgICBpZiAob2Zmc2V0ICUgMSAhPT0gMCB8fCBvZmZzZXQgPCAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTsKICAgICAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpOwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZFVpbnRMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFKG9mZnNldCwgYnl0ZUxlbmd0aDMsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgYnl0ZUxlbmd0aDMgPSBieXRlTGVuZ3RoMyA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgzLCB0aGlzLmxlbmd0aCk7CiAgICAgIGxldCB2YWwgPSB0aGlzW29mZnNldF07CiAgICAgIGxldCBtdWwgPSAxOwogICAgICBsZXQgaTIgPSAwOwogICAgICB3aGlsZSAoKytpMiA8IGJ5dGVMZW5ndGgzICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGkyXSAqIG11bDsKICAgICAgfQogICAgICByZXR1cm4gdmFsOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVaW50QkUgPSBCdWZmZXIzLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgzLCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGJ5dGVMZW5ndGgzID0gYnl0ZUxlbmd0aDMgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgzLCB0aGlzLmxlbmd0aCk7CiAgICAgIH0KICAgICAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoM107CiAgICAgIGxldCBtdWwgPSAxOwogICAgICB3aGlsZSAoYnl0ZUxlbmd0aDMgPiAwICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aDNdICogbXVsOwogICAgICB9CiAgICAgIHJldHVybiB2YWw7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZFVpbnQ4ID0gQnVmZmVyMy5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4KG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpOwogICAgICByZXR1cm4gdGhpc1tvZmZzZXRdOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVaW50MTZMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPSBCdWZmZXIzLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzW29mZnNldF0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMV07CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZFVpbnQzMkxFID0gQnVmZmVyMy5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFKG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpOwogICAgICByZXR1cm4gKHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpICsgdGhpc1tvZmZzZXQgKyAzXSAqIDE2Nzc3MjE2OwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVaW50MzJCRSA9IEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSAqIDE2Nzc3MjE2ICsgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYgfCB0aGlzW29mZnNldCArIDJdIDw8IDggfCB0aGlzW29mZnNldCArIDNdKTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NExFKG9mZnNldCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgIm9mZnNldCIpOwogICAgICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XTsKICAgICAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN107CiAgICAgIGlmIChmaXJzdCA9PT0gdm9pZCAwIHx8IGxhc3QgPT09IHZvaWQgMCkgewogICAgICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KTsKICAgICAgfQogICAgICBjb25zdCBsbyA9IGZpcnN0ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDggKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQ7CiAgICAgIGNvbnN0IGhpID0gdGhpc1srK29mZnNldF0gKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArIGxhc3QgKiAyICoqIDI0OwogICAgICByZXR1cm4gQmlnSW50KGxvKSArIChCaWdJbnQoaGkpIDw8IEJpZ0ludCgzMikpOwogICAgfSk7CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NEJFKG9mZnNldCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgIm9mZnNldCIpOwogICAgICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XTsKICAgICAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN107CiAgICAgIGlmIChmaXJzdCA9PT0gdm9pZCAwIHx8IGxhc3QgPT09IHZvaWQgMCkgewogICAgICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KTsKICAgICAgfQogICAgICBjb25zdCBoaSA9IGZpcnN0ICogMiAqKiAyNCArIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICsgdGhpc1srK29mZnNldF07CiAgICAgIGNvbnN0IGxvID0gdGhpc1srK29mZnNldF0gKiAyICoqIDI0ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDggKyBsYXN0OwogICAgICByZXR1cm4gKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQobG8pOwogICAgfSk7CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUob2Zmc2V0LCBieXRlTGVuZ3RoMywgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBieXRlTGVuZ3RoMyA9IGJ5dGVMZW5ndGgzID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aDMsIHRoaXMubGVuZ3RoKTsKICAgICAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0XTsKICAgICAgbGV0IG11bCA9IDE7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIHdoaWxlICgrK2kyIDwgYnl0ZUxlbmd0aDMgJiYgKG11bCAqPSAyNTYpKSB7CiAgICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaTJdICogbXVsOwogICAgICB9CiAgICAgIG11bCAqPSAxMjg7CiAgICAgIGlmICh2YWwgPj0gbXVsKQogICAgICAgIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aDMpOwogICAgICByZXR1cm4gdmFsOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgzLCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGJ5dGVMZW5ndGgzID0gYnl0ZUxlbmd0aDMgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoMywgdGhpcy5sZW5ndGgpOwogICAgICBsZXQgaTIgPSBieXRlTGVuZ3RoMzsKICAgICAgbGV0IG11bCA9IDE7CiAgICAgIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0taTJdOwogICAgICB3aGlsZSAoaTIgPiAwICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taTJdICogbXVsOwogICAgICB9CiAgICAgIG11bCAqPSAxMjg7CiAgICAgIGlmICh2YWwgPj0gbXVsKQogICAgICAgIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aDMpOwogICAgICByZXR1cm4gdmFsOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDgob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7CiAgICAgIGlmICghKHRoaXNbb2Zmc2V0XSAmIDEyOCkpCiAgICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XTsKICAgICAgcmV0dXJuICgyNTUgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODsKICAgICAgcmV0dXJuIHZhbCAmIDMyNzY4ID8gdmFsIHwgNDI5NDkwMTc2MCA6IHZhbDsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpOwogICAgICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgdGhpc1tvZmZzZXRdIDw8IDg7CiAgICAgIHJldHVybiB2YWwgJiAzMjc2OCA/IHZhbCB8IDQyOTQ5MDE3NjAgOiB2YWw7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYgfCB0aGlzW29mZnNldCArIDNdIDw8IDI0OwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzW29mZnNldF0gPDwgMjQgfCB0aGlzW29mZnNldCArIDFdIDw8IDE2IHwgdGhpc1tvZmZzZXQgKyAyXSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAzXTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnSW50NjRMRShvZmZzZXQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICJvZmZzZXQiKTsKICAgICAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF07CiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddOwogICAgICBpZiAoZmlyc3QgPT09IHZvaWQgMCB8fCBsYXN0ID09PSB2b2lkIDApIHsKICAgICAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIH0KICAgICAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyA0XSArIHRoaXNbb2Zmc2V0ICsgNV0gKiAyICoqIDggKyB0aGlzW29mZnNldCArIDZdICogMiAqKiAxNiArIChsYXN0IDw8IDI0KTsKICAgICAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChmaXJzdCArIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICsgdGhpc1srK29mZnNldF0gKiAyICoqIDI0KTsKICAgIH0pOwogICAgQnVmZmVyMy5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUob2Zmc2V0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAib2Zmc2V0Iik7CiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdOwogICAgICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XTsKICAgICAgaWYgKGZpcnN0ID09PSB2b2lkIDAgfHwgbGFzdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpOwogICAgICB9CiAgICAgIGNvbnN0IHZhbCA9IChmaXJzdCA8PCAyNCkgKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgKyB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArIHRoaXNbKytvZmZzZXRdOwogICAgICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KHRoaXNbKytvZmZzZXRdICogMiAqKiAyNCArIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICsgbGFzdCk7CiAgICB9KTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUob2Zmc2V0LCBub0Fzc2VydCkgewogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7CiAgICAgIHJldHVybiBpZWVlNzU0JDEucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFKG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpOwogICAgICByZXR1cm4gaWVlZTc1NCQxLnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIGllZWU3NTQkMS5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRShvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTsKICAgICAgcmV0dXJuIGllZWU3NTQkMS5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KTsKICAgIH07CiAgICBmdW5jdGlvbiBjaGVja0ludChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHsKICAgICAgaWYgKCFCdWZmZXIzLmlzQnVmZmVyKGJ1ZikpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpOwogICAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpOwogICAgICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVpbnRMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aDMsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGJ5dGVMZW5ndGgzID0gYnl0ZUxlbmd0aDMgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjb25zdCBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoMykgLSAxOwogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgzLCBtYXhCeXRlcywgMCk7CiAgICAgIH0KICAgICAgbGV0IG11bCA9IDE7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMjU1OwogICAgICB3aGlsZSAoKytpMiA8IGJ5dGVMZW5ndGgzICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHRoaXNbb2Zmc2V0ICsgaTJdID0gdmFsdWUgLyBtdWwgJiAyNTU7CiAgICAgIH0KICAgICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGgzOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludEJFID0gQnVmZmVyMy5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoMywgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgYnl0ZUxlbmd0aDMgPSBieXRlTGVuZ3RoMyA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkgewogICAgICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgzKSAtIDE7CiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aDMsIG1heEJ5dGVzLCAwKTsKICAgICAgfQogICAgICBsZXQgaTIgPSBieXRlTGVuZ3RoMyAtIDE7CiAgICAgIGxldCBtdWwgPSAxOwogICAgICB0aGlzW29mZnNldCArIGkyXSA9IHZhbHVlICYgMjU1OwogICAgICB3aGlsZSAoLS1pMiA+PSAwICYmIChtdWwgKj0gMjU2KSkgewogICAgICAgIHRoaXNbb2Zmc2V0ICsgaTJdID0gdmFsdWUgLyBtdWwgJiAyNTU7CiAgICAgIH0KICAgICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGgzOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludDggPSBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDI1NSwgMCk7CiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMjU1OwogICAgICByZXR1cm4gb2Zmc2V0ICsgMTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFID0gQnVmZmVyMy5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCA2NTUzNSwgMCk7CiAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMjU1OwogICAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDg7CiAgICAgIHJldHVybiBvZmZzZXQgKyAyOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludDE2QkUgPSBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDY1NTM1LCAwKTsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDg7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDI1NTsKICAgICAgcmV0dXJuIG9mZnNldCArIDI7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9IEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgNDI5NDk2NzI5NSwgMCk7CiAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjQ7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gMTY7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAyNTU7CiAgICAgIHJldHVybiBvZmZzZXQgKyA0OwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlVWludDMyQkUgPSBCdWZmZXIzLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDQyOTQ5NjcyOTUsIDApOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQ7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODsKICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMjU1OwogICAgICByZXR1cm4gb2Zmc2V0ICsgNDsKICAgIH07CiAgICBmdW5jdGlvbiB3cnRCaWdVSW50NjRMRShidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7CiAgICAgIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNyk7CiAgICAgIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIGJ1ZltvZmZzZXQrK10gPSBsbzsKICAgICAgbG8gPSBsbyA+PiA4OwogICAgICBidWZbb2Zmc2V0KytdID0gbG87CiAgICAgIGxvID0gbG8gPj4gODsKICAgICAgYnVmW29mZnNldCsrXSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQrK10gPSBsbzsKICAgICAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoNDI5NDk2NzI5NSkpOwogICAgICBidWZbb2Zmc2V0KytdID0gaGk7CiAgICAgIGhpID0gaGkgPj4gODsKICAgICAgYnVmW29mZnNldCsrXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQrK10gPSBoaTsKICAgICAgaGkgPSBoaSA+PiA4OwogICAgICBidWZbb2Zmc2V0KytdID0gaGk7CiAgICAgIHJldHVybiBvZmZzZXQ7CiAgICB9CiAgICBmdW5jdGlvbiB3cnRCaWdVSW50NjRCRShidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7CiAgICAgIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNyk7CiAgICAgIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIGJ1ZltvZmZzZXQgKyA3XSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyA2XSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyA1XSA9IGxvOwogICAgICBsbyA9IGxvID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyA0XSA9IGxvOwogICAgICBsZXQgaGkgPSBOdW1iZXIodmFsdWUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIGJ1ZltvZmZzZXQgKyAzXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyAyXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXQgKyAxXSA9IGhpOwogICAgICBoaSA9IGhpID4+IDg7CiAgICAgIGJ1ZltvZmZzZXRdID0gaGk7CiAgICAgIHJldHVybiBvZmZzZXQgKyA4OwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLCBvZmZzZXQgPSAwKSB7CiAgICAgIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOwogICAgfSk7CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0QkUodmFsdWUsIG9mZnNldCA9IDApIHsKICAgICAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIEJpZ0ludCgwKSwgQmlnSW50KCIweGZmZmZmZmZmZmZmZmZmZmYiKSk7CiAgICB9KTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgzLCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KSB7CiAgICAgICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aDMgLSAxKTsKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoMywgbGltaXQgLSAxLCAtbGltaXQpOwogICAgICB9CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIGxldCBtdWwgPSAxOwogICAgICBsZXQgc3ViID0gMDsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAyNTU7CiAgICAgIHdoaWxlICgrK2kyIDwgYnl0ZUxlbmd0aDMgJiYgKG11bCAqPSAyNTYpKSB7CiAgICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpMiAtIDFdICE9PSAwKSB7CiAgICAgICAgICBzdWIgPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzW29mZnNldCArIGkyXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDI1NTsKICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDM7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aDMsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjb25zdCBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoMyAtIDEpOwogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgzLCBsaW1pdCAtIDEsIC1saW1pdCk7CiAgICAgIH0KICAgICAgbGV0IGkyID0gYnl0ZUxlbmd0aDMgLSAxOwogICAgICBsZXQgbXVsID0gMTsKICAgICAgbGV0IHN1YiA9IDA7CiAgICAgIHRoaXNbb2Zmc2V0ICsgaTJdID0gdmFsdWUgJiAyNTU7CiAgICAgIHdoaWxlICgtLWkyID49IDAgJiYgKG11bCAqPSAyNTYpKSB7CiAgICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpMiArIDFdICE9PSAwKSB7CiAgICAgICAgICBzdWIgPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzW29mZnNldCArIGkyXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDI1NTsKICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDM7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMTI3LCAtMTI4KTsKICAgICAgaWYgKHZhbHVlIDwgMCkKICAgICAgICB2YWx1ZSA9IDI1NSArIHZhbHVlICsgMTsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAyNTU7CiAgICAgIHJldHVybiBvZmZzZXQgKyAxOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KQogICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDMyNzY3LCAtMzI3NjgpOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDI1NTsKICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4OwogICAgICByZXR1cm4gb2Zmc2V0ICsgMjsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAzMjc2NywgLTMyNzY4KTsKICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDg7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDI1NTsKICAgICAgcmV0dXJuIG9mZnNldCArIDI7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpCiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMjE0NzQ4MzY0NywgLTIxNDc0ODM2NDgpOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDI1NTsKICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4OwogICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDE2OwogICAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgPj4+IDI0OwogICAgICByZXR1cm4gb2Zmc2V0ICsgNDsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDsKICAgICAgaWYgKCFub0Fzc2VydCkKICAgICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OCk7CiAgICAgIGlmICh2YWx1ZSA8IDApCiAgICAgICAgdmFsdWUgPSA0Mjk0OTY3Mjk1ICsgdmFsdWUgKyAxOwogICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQ7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7CiAgICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODsKICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMjU1OwogICAgICByZXR1cm4gb2Zmc2V0ICsgNDsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFKHZhbHVlLCBvZmZzZXQgPSAwKSB7CiAgICAgIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAtQmlnSW50KCIweDgwMDAwMDAwMDAwMDAwMDAiKSwgQmlnSW50KCIweDdmZmZmZmZmZmZmZmZmZmYiKSk7CiAgICB9KTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUodmFsdWUsIG9mZnNldCA9IDApIHsKICAgICAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoIjB4ODAwMDAwMDAwMDAwMDAwMCIpLCBCaWdJbnQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKICAgIH0pOwogICAgZnVuY3Rpb24gY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikgewogICAgICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgIGlmIChvZmZzZXQgPCAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRmxvYXQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7CiAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7CiAgICAgIGlmICghbm9Bc3NlcnQpIHsKICAgICAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0KTsKICAgICAgfQogICAgICBpZWVlNzU0JDEud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KTsKICAgICAgcmV0dXJuIG9mZnNldCArIDQ7CiAgICB9CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpOwogICAgfTsKICAgIEJ1ZmZlcjMucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpOwogICAgfTsKICAgIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkgewogICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwOwogICAgICBpZiAoIW5vQXNzZXJ0KSB7CiAgICAgICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCk7CiAgICAgIH0KICAgICAgaWVlZTc1NCQxLndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7CiAgICAgIHJldHVybiBvZmZzZXQgKyA4OwogICAgfQogICAgQnVmZmVyMy5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKICAgICAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgewogICAgICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KTsKICAgIH07CiAgICBCdWZmZXIzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7CiAgICAgIGlmICghQnVmZmVyMy5pc0J1ZmZlcih0YXJnZXQpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlciIpOwogICAgICBpZiAoIXN0YXJ0KQogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKQogICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkKICAgICAgICB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGg7CiAgICAgIGlmICghdGFyZ2V0U3RhcnQpCiAgICAgICAgdGFyZ2V0U3RhcnQgPSAwOwogICAgICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkKICAgICAgICBlbmQgPSBzdGFydDsKICAgICAgaWYgKGVuZCA9PT0gc3RhcnQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAwOwogICAgICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgaWYgKGVuZCA8IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7CiAgICAgIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkKICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7CiAgICAgICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnQ7CiAgICAgIH0KICAgICAgY29uc3QgbGVuMiA9IGVuZCAtIHN0YXJ0OwogICAgICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCgKICAgICAgICAgIHRhcmdldCwKICAgICAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksCiAgICAgICAgICB0YXJnZXRTdGFydAogICAgICAgICk7CiAgICAgIH0KICAgICAgcmV0dXJuIGxlbjI7CiAgICB9OwogICAgQnVmZmVyMy5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykgewogICAgICBpZiAodHlwZW9mIHZhbCA9PT0gInN0cmluZyIpIHsKICAgICAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAic3RyaW5nIikgewogICAgICAgICAgZW5jb2RpbmcgPSBzdGFydDsKICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGVuY29kaW5nID0gZW5kOwogICAgICAgICAgZW5kID0gdGhpcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGlmIChlbmNvZGluZyAhPT0gdm9pZCAwICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gInN0cmluZyIpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gInN0cmluZyIgJiYgIUJ1ZmZlcjMuaXNFbmNvZGluZyhlbmNvZGluZykpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICBjb25zdCBjb2RlMiA9IHZhbC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgaWYgKGVuY29kaW5nID09PSAidXRmOCIgJiYgY29kZTIgPCAxMjggfHwgZW5jb2RpbmcgPT09ICJsYXRpbjEiKSB7CiAgICAgICAgICAgIHZhbCA9IGNvZGUyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAibnVtYmVyIikgewogICAgICAgIHZhbCA9IHZhbCAmIDI1NTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAiYm9vbGVhbiIpIHsKICAgICAgICB2YWwgPSBOdW1iZXIodmFsKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7CiAgICAgIH0KICAgICAgaWYgKGVuZCA8PSBzdGFydCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHN0YXJ0ID0gc3RhcnQgPj4+IDA7CiAgICAgIGVuZCA9IGVuZCA9PT0gdm9pZCAwID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDA7CiAgICAgIGlmICghdmFsKQogICAgICAgIHZhbCA9IDA7CiAgICAgIGxldCBpMjsKICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICJudW1iZXIiKSB7CiAgICAgICAgZm9yIChpMiA9IHN0YXJ0OyBpMiA8IGVuZDsgKytpMikgewogICAgICAgICAgdGhpc1tpMl0gPSB2YWw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyMy5pc0J1ZmZlcih2YWwpID8gdmFsIDogQnVmZmVyMy5mcm9tKHZhbCwgZW5jb2RpbmcpOwogICAgICAgIGNvbnN0IGxlbjIgPSBieXRlcy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbjIgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIHZhbCArICciIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50ICJ2YWx1ZSInKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgZW5kIC0gc3RhcnQ7ICsraTIpIHsKICAgICAgICAgIHRoaXNbaTIgKyBzdGFydF0gPSBieXRlc1tpMiAlIGxlbjJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBjb25zdCBlcnJvcnMgPSB7fTsKICAgIGZ1bmN0aW9uIEUoc3ltLCBnZXRNZXNzYWdlLCBCYXNlKSB7CiAgICAgIGVycm9yc1tzeW1dID0gY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJtZXNzYWdlIiwgewogICAgICAgICAgICB2YWx1ZTogZ2V0TWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7c3ltfV1gOwogICAgICAgICAgdGhpcy5zdGFjazsKICAgICAgICAgIGRlbGV0ZSB0aGlzLm5hbWU7CiAgICAgICAgfQogICAgICAgIGdldCBjb2RlKCkgewogICAgICAgICAgcmV0dXJuIHN5bTsKICAgICAgICB9CiAgICAgICAgc2V0IGNvZGUodmFsdWUpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiY29kZSIsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3N5bX1dOiAke3RoaXMubWVzc2FnZX1gOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIEUoCiAgICAgICJFUlJfQlVGRkVSX09VVF9PRl9CT1VORFMiLAogICAgICBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgIHJldHVybiBgJHtuYW1lfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiOwogICAgICB9LAogICAgICBSYW5nZUVycm9yCiAgICApOwogICAgRSgKICAgICAgIkVSUl9JTlZBTElEX0FSR19UWVBFIiwKICAgICAgZnVuY3Rpb24obmFtZSwgYWN0dWFsKSB7CiAgICAgICAgcmV0dXJuIGBUaGUgIiR7bmFtZX0iIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWA7CiAgICAgIH0sCiAgICAgIFR5cGVFcnJvcgogICAgKTsKICAgIEUoCiAgICAgICJFUlJfT1VUX09GX1JBTkdFIiwKICAgICAgZnVuY3Rpb24oc3RyLCByYW5nZSwgaW5wdXQpIHsKICAgICAgICBsZXQgbXNnMiA9IGBUaGUgdmFsdWUgb2YgIiR7c3RyfSIgaXMgb3V0IG9mIHJhbmdlLmA7CiAgICAgICAgbGV0IHJlY2VpdmVkID0gaW5wdXQ7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5wdXQpICYmIE1hdGguYWJzKGlucHV0KSA+IDIgKiogMzIpIHsKICAgICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKFN0cmluZyhpbnB1dCkpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAiYmlnaW50IikgewogICAgICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpOwogICAgICAgICAgaWYgKGlucHV0ID4gQmlnSW50KDIpICoqIEJpZ0ludCgzMikgfHwgaW5wdXQgPCAtKEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpKSkgewogICAgICAgICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihyZWNlaXZlZCk7CiAgICAgICAgICB9CiAgICAgICAgICByZWNlaXZlZCArPSAibiI7CiAgICAgICAgfQogICAgICAgIG1zZzIgKz0gYCBJdCBtdXN0IGJlICR7cmFuZ2V9LiBSZWNlaXZlZCAke3JlY2VpdmVkfWA7CiAgICAgICAgcmV0dXJuIG1zZzI7CiAgICAgIH0sCiAgICAgIFJhbmdlRXJyb3IKICAgICk7CiAgICBmdW5jdGlvbiBhZGROdW1lcmljYWxTZXBhcmF0b3IodmFsKSB7CiAgICAgIGxldCByZXMgPSAiIjsKICAgICAgbGV0IGkyID0gdmFsLmxlbmd0aDsKICAgICAgY29uc3Qgc3RhcnQgPSB2YWxbMF0gPT09ICItIiA/IDEgOiAwOwogICAgICBmb3IgKDsgaTIgPj0gc3RhcnQgKyA0OyBpMiAtPSAzKSB7CiAgICAgICAgcmVzID0gYF8ke3ZhbC5zbGljZShpMiAtIDMsIGkyKX0ke3Jlc31gOwogICAgICB9CiAgICAgIHJldHVybiBgJHt2YWwuc2xpY2UoMCwgaTIpfSR7cmVzfWA7CiAgICB9CiAgICBmdW5jdGlvbiBjaGVja0JvdW5kcyhidWYsIG9mZnNldCwgYnl0ZUxlbmd0aDMpIHsKICAgICAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAib2Zmc2V0Iik7CiAgICAgIGlmIChidWZbb2Zmc2V0XSA9PT0gdm9pZCAwIHx8IGJ1ZltvZmZzZXQgKyBieXRlTGVuZ3RoM10gPT09IHZvaWQgMCkgewogICAgICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgYnVmLmxlbmd0aCAtIChieXRlTGVuZ3RoMyArIDEpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2hlY2tJbnRCSSh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoMykgewogICAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHsKICAgICAgICBjb25zdCBuID0gdHlwZW9mIG1pbiA9PT0gImJpZ2ludCIgPyAibiIgOiAiIjsKICAgICAgICBsZXQgcmFuZ2U7CiAgICAgICAgaWYgKGJ5dGVMZW5ndGgzID4gMykgewogICAgICAgICAgaWYgKG1pbiA9PT0gMCB8fCBtaW4gPT09IEJpZ0ludCgwKSkgewogICAgICAgICAgICByYW5nZSA9IGA+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkeyhieXRlTGVuZ3RoMyArIDEpICogOH0ke259YDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJhbmdlID0gYD49IC0oMiR7bn0gKiogJHsoYnl0ZUxlbmd0aDMgKyAxKSAqIDggLSAxfSR7bn0pIGFuZCA8IDIgKiogJHsoYnl0ZUxlbmd0aDMgKyAxKSAqIDggLSAxfSR7bn1gOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByYW5nZSA9IGA+PSAke21pbn0ke259IGFuZCA8PSAke21heH0ke259YDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKCJ2YWx1ZSIsIHJhbmdlLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgY2hlY2tCb3VuZHMoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCBuYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJudW1iZXIiKSB7CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAibnVtYmVyIiwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBib3VuZHNFcnJvcih2YWx1ZSwgbGVuZ3RoLCB0eXBlKSB7CiAgICAgIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUpIHsKICAgICAgICB2YWxpZGF0ZU51bWJlcih2YWx1ZSwgdHlwZSk7CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgIm9mZnNldCIsICJhbiBpbnRlZ2VyIiwgdmFsdWUpOwogICAgICB9CiAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UoCiAgICAgICAgdHlwZSB8fCAib2Zmc2V0IiwKICAgICAgICBgPj0gJHt0eXBlID8gMSA6IDB9IGFuZCA8PSAke2xlbmd0aH1gLAogICAgICAgIHZhbHVlCiAgICAgICk7CiAgICB9CiAgICBjb25zdCBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2c7CiAgICBmdW5jdGlvbiBiYXNlNjRjbGVhbihzdHIpIHsKICAgICAgc3RyID0gc3RyLnNwbGl0KCI9IilbMF07CiAgICAgIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgIiIpOwogICAgICBpZiAoc3RyLmxlbmd0aCA8IDIpCiAgICAgICAgcmV0dXJuICIiOwogICAgICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHsKICAgICAgICBzdHIgPSBzdHIgKyAiPSI7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZywgdW5pdHMpIHsKICAgICAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eTsKICAgICAgbGV0IGNvZGVQb2ludDsKICAgICAgY29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgICAgbGV0IGxlYWRTdXJyb2dhdGUgPSBudWxsOwogICAgICBjb25zdCBieXRlcyA9IFtdOwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGVuZ3RoOyArK2kyKSB7CiAgICAgICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaTIpOwogICAgICAgIGlmIChjb2RlUG9pbnQgPiA1NTI5NSAmJiBjb2RlUG9pbnQgPCA1NzM0NCkgewogICAgICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7CiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPiA1NjMxOSkgewogICAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkKICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goMjM5LCAxOTEsIDE4OSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaTIgKyAxID09PSBsZW5ndGgpIHsKICAgICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpCiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKDIzOSwgMTkxLCAxODkpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDU2MzIwKSB7CiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkKICAgICAgICAgICAgICBieXRlcy5wdXNoKDIzOSwgMTkxLCAxODkpOwogICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50OwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gNTUyOTYgPDwgMTAgfCBjb2RlUG9pbnQgLSA1NjMyMCkgKyA2NTUzNjsKICAgICAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHsKICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkKICAgICAgICAgICAgYnl0ZXMucHVzaCgyMzksIDE5MSwgMTg5KTsKICAgICAgICB9CiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7CiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDEyOCkgewogICAgICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpOwogICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMjA0OCkgewogICAgICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYnl0ZXMucHVzaCgKICAgICAgICAgICAgY29kZVBvaW50ID4+IDYgfCAxOTIsCiAgICAgICAgICAgIGNvZGVQb2ludCAmIDYzIHwgMTI4CiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgNjU1MzYpIHsKICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGJ5dGVzLnB1c2goCiAgICAgICAgICAgIGNvZGVQb2ludCA+PiAxMiB8IDIyNCwKICAgICAgICAgICAgY29kZVBvaW50ID4+IDYgJiA2MyB8IDEyOCwKICAgICAgICAgICAgY29kZVBvaW50ICYgNjMgfCAxMjgKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAxMTE0MTEyKSB7CiAgICAgICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBieXRlcy5wdXNoKAogICAgICAgICAgICBjb2RlUG9pbnQgPj4gMTggfCAyNDAsCiAgICAgICAgICAgIGNvZGVQb2ludCA+PiAxMiAmIDYzIHwgMTI4LAogICAgICAgICAgICBjb2RlUG9pbnQgPj4gNiAmIDYzIHwgMTI4LAogICAgICAgICAgICBjb2RlUG9pbnQgJiA2MyB8IDEyOAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJ5dGVzOwogICAgfQogICAgZnVuY3Rpb24gYXNjaWlUb0J5dGVzKHN0cikgewogICAgICBjb25zdCBieXRlQXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHN0ci5sZW5ndGg7ICsraTIpIHsKICAgICAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpMikgJiAyNTUpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlQXJyYXk7CiAgICB9CiAgICBmdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyhzdHIsIHVuaXRzKSB7CiAgICAgIGxldCBjMiwgaGksIGxvOwogICAgICBjb25zdCBieXRlQXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHN0ci5sZW5ndGg7ICsraTIpIHsKICAgICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkKICAgICAgICAgIGJyZWFrOwogICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaTIpOwogICAgICAgIGhpID0gYzIgPj4gODsKICAgICAgICBsbyA9IGMyICUgMjU2OwogICAgICAgIGJ5dGVBcnJheS5wdXNoKGxvKTsKICAgICAgICBieXRlQXJyYXkucHVzaChoaSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ5dGVBcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMoc3RyKSB7CiAgICAgIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBibGl0QnVmZmVyKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkgewogICAgICBsZXQgaTI7CiAgICAgIGZvciAoaTIgPSAwOyBpMiA8IGxlbmd0aDsgKytpMikgewogICAgICAgIGlmIChpMiArIG9mZnNldCA+PSBkc3QubGVuZ3RoIHx8IGkyID49IHNyYy5sZW5ndGgpCiAgICAgICAgICBicmVhazsKICAgICAgICBkc3RbaTIgKyBvZmZzZXRdID0gc3JjW2kyXTsKICAgICAgfQogICAgICByZXR1cm4gaTI7CiAgICB9CiAgICBmdW5jdGlvbiBpc0luc3RhbmNlKG9iaiwgdHlwZSkgewogICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fCBvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWU7CiAgICB9CiAgICBmdW5jdGlvbiBudW1iZXJJc05hTihvYmopIHsKICAgICAgcmV0dXJuIG9iaiAhPT0gb2JqOwogICAgfQogICAgY29uc3QgaGV4U2xpY2VMb29rdXBUYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBhbHBoYWJldCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKICAgICAgY29uc3QgdGFibGUgPSBuZXcgQXJyYXkoMjU2KTsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IDE2OyArK2kyKSB7CiAgICAgICAgY29uc3QgaTE2ID0gaTIgKiAxNjsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaTJdICsgYWxwaGFiZXRbal07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0YWJsZTsKICAgIH0oKTsKICAgIGZ1bmN0aW9uIGRlZmluZUJpZ0ludE1ldGhvZChmbikgewogICAgICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gInVuZGVmaW5lZCIgPyBCdWZmZXJCaWdJbnROb3REZWZpbmVkIDogZm47CiAgICB9CiAgICBmdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgfSkoYnVmZmVyKTsKICB2YXIgTG9jYWxGaWxlID0gbmV3IFByb3h5KHt9LCB7CiAgICBnZXQoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlICIiIGhhcyBiZWVuIGV4dGVybmFsaXplZCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5IGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgaW4gY2xpZW50IGNvZGUuJyk7CiAgICB9CiAgfSk7CiAgdmFyIF9fdml0ZUJyb3dzZXJFeHRlcm5hbCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICJkZWZhdWx0IjogTG9jYWxGaWxlCiAgfSk7CiAgY29uc3QgbXlHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB7IGZldGNoOiB2b2lkIDAgfTsKICBjbGFzcyBSZW1vdGVGaWxlJDEgewogICAgYXN5bmMgZ2V0QnVmZmVyRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJ1ZmZlcigpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXNwb25zZS5hcnJheUJ1ZmZlciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIHJldHVybiBidWZmZXIuQnVmZmVyLmZyb20ocmVzcCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBIVFRQIHJlc3BvbnNlIG9iamVjdCwgaGFzIG5vIGJ1ZmZlciBtZXRob2QsIGFuZCBubyBhcnJheUJ1ZmZlciBtZXRob2QiKTsKICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3Ioc291cmNlLCBvcHRzID0ge30pIHsKICAgICAgdGhpcy5iYXNlT3ZlcnJpZGVzID0ge307CiAgICAgIHRoaXMudXJsID0gc291cmNlOwogICAgICBjb25zdCBmZXRjaCA9IG9wdHMuZmV0Y2ggfHwgbXlHbG9iYWwuZmV0Y2ggJiYgbXlHbG9iYWwuZmV0Y2guYmluZChteUdsb2JhbCk7CiAgICAgIGlmICghZmV0Y2gpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBubyBmZXRjaCBmdW5jdGlvbiBzdXBwbGllZCwgYW5kIG5vbmUgZm91bmQgaW4gZ2xvYmFsIGVudmlyb25tZW50YCk7CiAgICAgIH0KICAgICAgaWYgKG9wdHMub3ZlcnJpZGVzKSB7CiAgICAgICAgdGhpcy5iYXNlT3ZlcnJpZGVzID0gb3B0cy5vdmVycmlkZXM7CiAgICAgIH0KICAgICAgdGhpcy5mZXRjaEltcGxlbWVudGF0aW9uID0gZmV0Y2g7CiAgICB9CiAgICBhc3luYyBmZXRjaChpbnB1dCwgaW5pdDIpIHsKICAgICAgbGV0IHJlc3BvbnNlOwogICAgICB0cnkgewogICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGxlbWVudGF0aW9uKGlucHV0LCBpbml0Mik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoYCR7ZX1gLmluY2x1ZGVzKCJGYWlsZWQgdG8gZmV0Y2giKSkgewogICAgICAgICAgY29uc29sZS53YXJuKGBnZW5lcmljLWZpbGVoYW5kbGU6IHJlZmV0Y2hpbmcgJHtpbnB1dH0gdG8gYXR0ZW1wdCB0byB3b3JrIGFyb3VuZCBjaHJvbWUgQ09SUyBoZWFkZXIgY2FjaGluZyBidWdgKTsKICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGxlbWVudGF0aW9uKGlucHV0LCB7CiAgICAgICAgICAgIC4uLmluaXQyLAogICAgICAgICAgICBjYWNoZTogInJlbG9hZCIKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9CiAgICBhc3luYyByZWFkKGJ1ZmZlcjIsIG9mZnNldCA9IDAsIGxlbmd0aCwgcG9zaXRpb24gPSAwLCBvcHRzID0ge30pIHsKICAgICAgY29uc3QgeyBoZWFkZXJzID0ge30sIHNpZ25hbCwgb3ZlcnJpZGVzID0ge30gfSA9IG9wdHM7CiAgICAgIGlmIChsZW5ndGggPCBJbmZpbml0eSkgewogICAgICAgIGhlYWRlcnMucmFuZ2UgPSBgYnl0ZXM9JHtwb3NpdGlvbn0tJHtwb3NpdGlvbiArIGxlbmd0aH1gOwogICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gSW5maW5pdHkgJiYgcG9zaXRpb24gIT09IDApIHsKICAgICAgICBoZWFkZXJzLnJhbmdlID0gYGJ5dGVzPSR7cG9zaXRpb259LWA7CiAgICAgIH0KICAgICAgY29uc3QgYXJncyA9IHsKICAgICAgICAuLi50aGlzLmJhc2VPdmVycmlkZXMsCiAgICAgICAgLi4ub3ZlcnJpZGVzLAogICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgIC4uLmhlYWRlcnMsCiAgICAgICAgICAuLi5vdmVycmlkZXMuaGVhZGVycywKICAgICAgICAgIC4uLnRoaXMuYmFzZU92ZXJyaWRlcy5oZWFkZXJzCiAgICAgICAgfSwKICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgIHJlZGlyZWN0OiAiZm9sbG93IiwKICAgICAgICBtb2RlOiAiY29ycyIsCiAgICAgICAgc2lnbmFsCiAgICAgIH07CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaCh0aGlzLnVybCwgYXJncyk7CiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gJHt0aGlzLnVybH1gKTsKICAgICAgfQogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDAgJiYgcG9zaXRpb24gPT09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDYpIHsKICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckZyb21SZXNwb25zZShyZXNwb25zZSk7CiAgICAgICAgY29uc3QgYnl0ZXNDb3BpZWQgPSByZXNwb25zZURhdGEuY29weShidWZmZXIyLCBvZmZzZXQsIDAsIE1hdGgubWluKGxlbmd0aCwgcmVzcG9uc2VEYXRhLmxlbmd0aCkpOwogICAgICAgIGNvbnN0IHJlcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCJjb250ZW50LXJhbmdlIik7CiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gL1wvKFxkKykkLy5leGVjKHJlcyB8fCAiIik7CiAgICAgICAgaWYgKHNpemVNYXRjaCAmJiBzaXplTWF0Y2hbMV0pIHsKICAgICAgICAgIHRoaXMuX3N0YXQgPSB7IHNpemU6IHBhcnNlSW50KHNpemVNYXRjaFsxXSwgMTApIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGJ5dGVzUmVhZDogYnl0ZXNDb3BpZWQsIGJ1ZmZlcjogYnVmZmVyMiB9OwogICAgICB9CiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiJHt0aGlzLnVybH0gZmV0Y2ggcmV0dXJuZWQgc3RhdHVzIDIwMCwgZXhwZWN0ZWQgMjA2Iik7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSBmZXRjaGluZyAke3RoaXMudXJsfWApOwogICAgfQogICAgYXN5bmMgcmVhZEZpbGUob3B0aW9ucyA9IHt9KSB7CiAgICAgIGxldCBlbmNvZGluZzsKICAgICAgbGV0IG9wdHM7CiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIpIHsKICAgICAgICBlbmNvZGluZyA9IG9wdGlvbnM7CiAgICAgICAgb3B0cyA9IHt9OwogICAgICB9IGVsc2UgewogICAgICAgIGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZzsKICAgICAgICBvcHRzID0gb3B0aW9uczsKICAgICAgICBkZWxldGUgb3B0cy5lbmNvZGluZzsKICAgICAgfQogICAgICBjb25zdCB7IGhlYWRlcnMgPSB7fSwgc2lnbmFsLCBvdmVycmlkZXMgPSB7fSB9ID0gb3B0czsKICAgICAgY29uc3QgYXJncyA9IHsKICAgICAgICBoZWFkZXJzLAogICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgcmVkaXJlY3Q6ICJmb2xsb3ciLAogICAgICAgIG1vZGU6ICJjb3JzIiwKICAgICAgICBzaWduYWwsCiAgICAgICAgLi4udGhpcy5iYXNlT3ZlcnJpZGVzLAogICAgICAgIC4uLm92ZXJyaWRlcwogICAgICB9OwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godGhpcy51cmwsIGFyZ3MpOwogICAgICBpZiAoIXJlc3BvbnNlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJnZW5lcmljLWZpbGVoYW5kbGUgZmFpbGVkIHRvIGZldGNoIik7CiAgICAgIH0KICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9IGZldGNoaW5nICR7dGhpcy51cmx9YCksIHsKICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGVuY29kaW5nID09PSAidXRmOCIpIHsKICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgICB9CiAgICAgIGlmIChlbmNvZGluZykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKICAgIH0KICAgIGFzeW5jIHN0YXQoKSB7CiAgICAgIGlmICghdGhpcy5fc3RhdCkgewogICAgICAgIGNvbnN0IGJ1ZiA9IGJ1ZmZlci5CdWZmZXIuYWxsb2NVbnNhZmUoMTApOwogICAgICAgIGF3YWl0IHRoaXMucmVhZChidWYsIDAsIDEwLCAwKTsKICAgICAgICBpZiAoIXRoaXMuX3N0YXQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5hYmxlIHRvIGRldGVybWluZSBzaXplIG9mIGZpbGUgYXQgJHt0aGlzLnVybH1gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3N0YXQ7CiAgICB9CiAgICBhc3luYyBjbG9zZSgpIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICB2YXIgY29tbW9uJDEgPSB7fTsKICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIHZhciBUWVBFRF9PSyA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgVWludDE2QXJyYXkgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAidW5kZWZpbmVkIjsKICAgIGZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7CiAgICB9CiAgICBleHBvcnRzMi5hc3NpZ24gPSBmdW5jdGlvbihvYmopIHsKICAgICAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHsKICAgICAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpOwogICAgICAgIGlmICghc291cmNlKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICJtdXN0IGJlIG5vbi1vYmplY3QiKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHsKICAgICAgICAgIGlmIChfaGFzKHNvdXJjZSwgcCkpIHsKICAgICAgICAgICAgb2JqW3BdID0gc291cmNlW3BdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqOwogICAgfTsKICAgIGV4cG9ydHMyLnNocmlua0J1ZiA9IGZ1bmN0aW9uKGJ1Ziwgc2l6ZSkgewogICAgICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgewogICAgICAgIHJldHVybiBidWY7CiAgICAgIH0KICAgICAgaWYgKGJ1Zi5zdWJhcnJheSkgewogICAgICAgIHJldHVybiBidWYuc3ViYXJyYXkoMCwgc2l6ZSk7CiAgICAgIH0KICAgICAgYnVmLmxlbmd0aCA9IHNpemU7CiAgICAgIHJldHVybiBidWY7CiAgICB9OwogICAgdmFyIGZuVHlwZWQgPSB7CiAgICAgIGFycmF5U2V0OiBmdW5jdGlvbihkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4yLCBkZXN0X29mZnMpIHsKICAgICAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHsKICAgICAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4yKSwgZGVzdF9vZmZzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IGxlbjI7IGkyKyspIHsKICAgICAgICAgIGRlc3RbZGVzdF9vZmZzICsgaTJdID0gc3JjW3NyY19vZmZzICsgaTJdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24oY2h1bmtzKSB7CiAgICAgICAgdmFyIGkyLCBsLCBsZW4yLCBwb3MsIGNodW5rLCByZXN1bHQ7CiAgICAgICAgbGVuMiA9IDA7CiAgICAgICAgZm9yIChpMiA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpMiA8IGw7IGkyKyspIHsKICAgICAgICAgIGxlbjIgKz0gY2h1bmtzW2kyXS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbjIpOwogICAgICAgIHBvcyA9IDA7CiAgICAgICAgZm9yIChpMiA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpMiA8IGw7IGkyKyspIHsKICAgICAgICAgIGNodW5rID0gY2h1bmtzW2kyXTsKICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7CiAgICAgICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9OwogICAgdmFyIGZuVW50eXBlZCA9IHsKICAgICAgYXJyYXlTZXQ6IGZ1bmN0aW9uKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbjIsIGRlc3Rfb2ZmcykgewogICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBsZW4yOyBpMisrKSB7CiAgICAgICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGkyXSA9IHNyY1tzcmNfb2ZmcyArIGkyXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uKGNodW5rcykgewogICAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5zZXRUeXBlZCA9IGZ1bmN0aW9uKG9uKSB7CiAgICAgIGlmIChvbikgewogICAgICAgIGV4cG9ydHMyLkJ1ZjggPSBVaW50OEFycmF5OwogICAgICAgIGV4cG9ydHMyLkJ1ZjE2ID0gVWludDE2QXJyYXk7CiAgICAgICAgZXhwb3J0czIuQnVmMzIgPSBJbnQzMkFycmF5OwogICAgICAgIGV4cG9ydHMyLmFzc2lnbihleHBvcnRzMiwgZm5UeXBlZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXhwb3J0czIuQnVmOCA9IEFycmF5OwogICAgICAgIGV4cG9ydHMyLkJ1ZjE2ID0gQXJyYXk7CiAgICAgICAgZXhwb3J0czIuQnVmMzIgPSBBcnJheTsKICAgICAgICBleHBvcnRzMi5hc3NpZ24oZXhwb3J0czIsIGZuVW50eXBlZCk7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzMi5zZXRUeXBlZChUWVBFRF9PSyk7CiAgfSkoY29tbW9uJDEpOwogIHZhciBkZWZsYXRlJDQgPSB7fTsKICB2YXIgZGVmbGF0ZSQzID0ge307CiAgdmFyIHRyZWVzJDEgPSB7fTsKICB2YXIgdXRpbHMkNiA9IGNvbW1vbiQxOwogIHZhciBaX0ZJWEVEJDEgPSA0OwogIHZhciBaX0JJTkFSWSA9IDA7CiAgdmFyIFpfVEVYVCA9IDE7CiAgdmFyIFpfVU5LTk9XTiQxID0gMjsKICBmdW5jdGlvbiB6ZXJvJDEoYnVmKSB7CiAgICB2YXIgbGVuMiA9IGJ1Zi5sZW5ndGg7CiAgICB3aGlsZSAoLS1sZW4yID49IDApIHsKICAgICAgYnVmW2xlbjJdID0gMDsKICAgIH0KICB9CiAgdmFyIFNUT1JFRF9CTE9DSyA9IDA7CiAgdmFyIFNUQVRJQ19UUkVFUyA9IDE7CiAgdmFyIERZTl9UUkVFUyA9IDI7CiAgdmFyIE1JTl9NQVRDSCQxID0gMzsKICB2YXIgTUFYX01BVENIJDEgPSAyNTg7CiAgdmFyIExFTkdUSF9DT0RFUyQxID0gMjk7CiAgdmFyIExJVEVSQUxTJDEgPSAyNTY7CiAgdmFyIExfQ09ERVMkMSA9IExJVEVSQUxTJDEgKyAxICsgTEVOR1RIX0NPREVTJDE7CiAgdmFyIERfQ09ERVMkMSA9IDMwOwogIHZhciBCTF9DT0RFUyQxID0gMTk7CiAgdmFyIEhFQVBfU0laRSQxID0gMiAqIExfQ09ERVMkMSArIDE7CiAgdmFyIE1BWF9CSVRTJDEgPSAxNTsKICB2YXIgQnVmX3NpemUgPSAxNjsKICB2YXIgTUFYX0JMX0JJVFMgPSA3OwogIHZhciBFTkRfQkxPQ0sgPSAyNTY7CiAgdmFyIFJFUF8zXzYgPSAxNjsKICB2YXIgUkVQWl8zXzEwID0gMTc7CiAgdmFyIFJFUFpfMTFfMTM4ID0gMTg7CiAgdmFyIGV4dHJhX2xiaXRzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDBdOwogIHZhciBleHRyYV9kYml0cyA9IFswLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTNdOwogIHZhciBleHRyYV9ibGJpdHMgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgN107CiAgdmFyIGJsX29yZGVyID0gWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdOwogIHZhciBESVNUX0NPREVfTEVOID0gNTEyOwogIHZhciBzdGF0aWNfbHRyZWUgPSBuZXcgQXJyYXkoKExfQ09ERVMkMSArIDIpICogMik7CiAgemVybyQxKHN0YXRpY19sdHJlZSk7CiAgdmFyIHN0YXRpY19kdHJlZSA9IG5ldyBBcnJheShEX0NPREVTJDEgKiAyKTsKICB6ZXJvJDEoc3RhdGljX2R0cmVlKTsKICB2YXIgX2Rpc3RfY29kZSA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTsKICB6ZXJvJDEoX2Rpc3RfY29kZSk7CiAgdmFyIF9sZW5ndGhfY29kZSA9IG5ldyBBcnJheShNQVhfTUFUQ0gkMSAtIE1JTl9NQVRDSCQxICsgMSk7CiAgemVybyQxKF9sZW5ndGhfY29kZSk7CiAgdmFyIGJhc2VfbGVuZ3RoID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyQxKTsKICB6ZXJvJDEoYmFzZV9sZW5ndGgpOwogIHZhciBiYXNlX2Rpc3QgPSBuZXcgQXJyYXkoRF9DT0RFUyQxKTsKICB6ZXJvJDEoYmFzZV9kaXN0KTsKICBmdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHsKICAgIHRoaXMuc3RhdGljX3RyZWUgPSBzdGF0aWNfdHJlZTsKICAgIHRoaXMuZXh0cmFfYml0cyA9IGV4dHJhX2JpdHM7CiAgICB0aGlzLmV4dHJhX2Jhc2UgPSBleHRyYV9iYXNlOwogICAgdGhpcy5lbGVtcyA9IGVsZW1zOwogICAgdGhpcy5tYXhfbGVuZ3RoID0gbWF4X2xlbmd0aDsKICAgIHRoaXMuaGFzX3N0cmVlID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoOwogIH0KICB2YXIgc3RhdGljX2xfZGVzYzsKICB2YXIgc3RhdGljX2RfZGVzYzsKICB2YXIgc3RhdGljX2JsX2Rlc2M7CiAgZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykgewogICAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOwogICAgdGhpcy5tYXhfY29kZSA9IDA7CiAgICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsKICB9CiAgZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHsKICAgIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTsKICB9CiAgZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHsKICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gdyAmIDI1NTsKICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gdyA+Pj4gOCAmIDI1NTsKICB9CiAgZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHsKICAgIGlmIChzLmJpX3ZhbGlkID4gQnVmX3NpemUgLSBsZW5ndGgpIHsKICAgICAgcy5iaV9idWYgfD0gdmFsdWUgPDwgcy5iaV92YWxpZCAmIDY1NTM1OwogICAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpOwogICAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IEJ1Zl9zaXplIC0gcy5iaV92YWxpZDsKICAgICAgcy5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKICAgIH0gZWxzZSB7CiAgICAgIHMuYmlfYnVmIHw9IHZhbHVlIDw8IHMuYmlfdmFsaWQgJiA2NTUzNTsKICAgICAgcy5iaV92YWxpZCArPSBsZW5ndGg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNlbmRfY29kZShzLCBjMiwgdHJlZSkgewogICAgc2VuZF9iaXRzKHMsIHRyZWVbYzIgKiAyXSwgdHJlZVtjMiAqIDIgKyAxXSk7CiAgfQogIGZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZTIsIGxlbjIpIHsKICAgIHZhciByZXMgPSAwOwogICAgZG8gewogICAgICByZXMgfD0gY29kZTIgJiAxOwogICAgICBjb2RlMiA+Pj49IDE7CiAgICAgIHJlcyA8PD0gMTsKICAgIH0gd2hpbGUgKC0tbGVuMiA+IDApOwogICAgcmV0dXJuIHJlcyA+Pj4gMTsKICB9CiAgZnVuY3Rpb24gYmlfZmx1c2gocykgewogICAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7CiAgICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7CiAgICAgIHMuYmlfYnVmID0gMDsKICAgICAgcy5iaV92YWxpZCA9IDA7CiAgICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkgewogICAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMjU1OwogICAgICBzLmJpX2J1ZiA+Pj0gODsKICAgICAgcy5iaV92YWxpZCAtPSA4OwogICAgfQogIH0KICBmdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpIHsKICAgIHZhciB0cmVlID0gZGVzYy5keW5fdHJlZTsKICAgIHZhciBtYXhfY29kZSA9IGRlc2MubWF4X2NvZGU7CiAgICB2YXIgc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTsKICAgIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7CiAgICB2YXIgZXh0cmEgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzOwogICAgdmFyIGJhc2UgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlOwogICAgdmFyIG1heF9sZW5ndGggPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoOwogICAgdmFyIGg7CiAgICB2YXIgbiwgbTsKICAgIHZhciBiaXRzOwogICAgdmFyIHhiaXRzOwogICAgdmFyIGY7CiAgICB2YXIgb3ZlcmZsb3cgPSAwOwogICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHsKICAgICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7CiAgICB9CiAgICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXSA9IDA7CiAgICBmb3IgKGggPSBzLmhlYXBfbWF4ICsgMTsgaCA8IEhFQVBfU0laRSQxOyBoKyspIHsKICAgICAgbiA9IHMuaGVhcFtoXTsKICAgICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdICogMiArIDFdICsgMTsKICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7CiAgICAgICAgYml0cyA9IG1heF9sZW5ndGg7CiAgICAgICAgb3ZlcmZsb3crKzsKICAgICAgfQogICAgICB0cmVlW24gKiAyICsgMV0gPSBiaXRzOwogICAgICBpZiAobiA+IG1heF9jb2RlKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcy5ibF9jb3VudFtiaXRzXSsrOwogICAgICB4Yml0cyA9IDA7CiAgICAgIGlmIChuID49IGJhc2UpIHsKICAgICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTsKICAgICAgfQogICAgICBmID0gdHJlZVtuICogMl07CiAgICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7CiAgICAgIGlmIChoYXNfc3RyZWUpIHsKICAgICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdICsgeGJpdHMpOwogICAgICB9CiAgICB9CiAgICBpZiAob3ZlcmZsb3cgPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZG8gewogICAgICBiaXRzID0gbWF4X2xlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7CiAgICAgICAgYml0cy0tOwogICAgICB9CiAgICAgIHMuYmxfY291bnRbYml0c10tLTsKICAgICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsKICAgICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOwogICAgICBvdmVyZmxvdyAtPSAyOwogICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKICAgIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT09IDA7IGJpdHMtLSkgewogICAgICBuID0gcy5ibF9jb3VudFtiaXRzXTsKICAgICAgd2hpbGUgKG4gIT09IDApIHsKICAgICAgICBtID0gcy5oZWFwWy0taF07CiAgICAgICAgaWYgKG0gPiBtYXhfY29kZSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0cmVlW20gKiAyICsgMV0gIT09IGJpdHMpIHsKICAgICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXSkgKiB0cmVlW20gKiAyXTsKICAgICAgICAgIHRyZWVbbSAqIDIgKyAxXSA9IGJpdHM7CiAgICAgICAgfQogICAgICAgIG4tLTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KSB7CiAgICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTJDEgKyAxKTsKICAgIHZhciBjb2RlMiA9IDA7CiAgICB2YXIgYml0czsKICAgIHZhciBuOwogICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHsKICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZTIgPSBjb2RlMiArIGJsX2NvdW50W2JpdHMgLSAxXSA8PCAxOwogICAgfQogICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CiAgICAgIHZhciBsZW4yID0gdHJlZVtuICogMiArIDFdOwogICAgICBpZiAobGVuMiA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRyZWVbbiAqIDJdID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuMl0rKywgbGVuMik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkgewogICAgdmFyIG47CiAgICB2YXIgYml0czsKICAgIHZhciBsZW5ndGg7CiAgICB2YXIgY29kZTI7CiAgICB2YXIgZGlzdDsKICAgIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyQxICsgMSk7CiAgICBsZW5ndGggPSAwOwogICAgZm9yIChjb2RlMiA9IDA7IGNvZGUyIDwgTEVOR1RIX0NPREVTJDEgLSAxOyBjb2RlMisrKSB7CiAgICAgIGJhc2VfbGVuZ3RoW2NvZGUyXSA9IGxlbmd0aDsKICAgICAgZm9yIChuID0gMDsgbiA8IDEgPDwgZXh0cmFfbGJpdHNbY29kZTJdOyBuKyspIHsKICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTI7CiAgICAgIH0KICAgIH0KICAgIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGUyOwogICAgZGlzdCA9IDA7CiAgICBmb3IgKGNvZGUyID0gMDsgY29kZTIgPCAxNjsgY29kZTIrKykgewogICAgICBiYXNlX2Rpc3RbY29kZTJdID0gZGlzdDsKICAgICAgZm9yIChuID0gMDsgbiA8IDEgPDwgZXh0cmFfZGJpdHNbY29kZTJdOyBuKyspIHsKICAgICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlMjsKICAgICAgfQogICAgfQogICAgZGlzdCA+Pj0gNzsKICAgIGZvciAoOyBjb2RlMiA8IERfQ09ERVMkMTsgY29kZTIrKykgewogICAgICBiYXNlX2Rpc3RbY29kZTJdID0gZGlzdCA8PCA3OwogICAgICBmb3IgKG4gPSAwOyBuIDwgMSA8PCBleHRyYV9kYml0c1tjb2RlMl0gLSA3OyBuKyspIHsKICAgICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlMjsKICAgICAgfQogICAgfQogICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHsKICAgICAgYmxfY291bnRbYml0c10gPSAwOwogICAgfQogICAgbiA9IDA7CiAgICB3aGlsZSAobiA8PSAxNDMpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA4OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzhdKys7CiAgICB9CiAgICB3aGlsZSAobiA8PSAyNTUpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA5OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzldKys7CiAgICB9CiAgICB3aGlsZSAobiA8PSAyNzkpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA3OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzddKys7CiAgICB9CiAgICB3aGlsZSAobiA8PSAyODcpIHsKICAgICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gPSA4OwogICAgICBuKys7CiAgICAgIGJsX2NvdW50WzhdKys7CiAgICB9CiAgICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTJDEgKyAxLCBibF9jb3VudCk7CiAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUyQxOyBuKyspIHsKICAgICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0gPSA1OwogICAgICBzdGF0aWNfZHRyZWVbbiAqIDJdID0gYmlfcmV2ZXJzZShuLCA1KTsKICAgIH0KICAgIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMkMSArIDEsIExfQ09ERVMkMSwgTUFYX0JJVFMkMSk7CiAgICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsIERfQ09ERVMkMSwgTUFYX0JJVFMkMSk7CiAgICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgQkxfQ09ERVMkMSwgTUFYX0JMX0JJVFMpOwogIH0KICBmdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHsKICAgIHZhciBuOwogICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVMkMTsgbisrKSB7CiAgICAgIHMuZHluX2x0cmVlW24gKiAyXSA9IDA7CiAgICB9CiAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUyQxOyBuKyspIHsKICAgICAgcy5keW5fZHRyZWVbbiAqIDJdID0gMDsKICAgIH0KICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUyQxOyBuKyspIHsKICAgICAgcy5ibF90cmVlW24gKiAyXSA9IDA7CiAgICB9CiAgICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXSA9IDE7CiAgICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwOwogICAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7CiAgfQogIGZ1bmN0aW9uIGJpX3dpbmR1cChzKSB7CiAgICBpZiAocy5iaV92YWxpZCA+IDgpIHsKICAgICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTsKICAgIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHsKICAgICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjsKICAgIH0KICAgIHMuYmlfYnVmID0gMDsKICAgIHMuYmlfdmFsaWQgPSAwOwogIH0KICBmdW5jdGlvbiBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuMiwgaGVhZGVyKSB7CiAgICBiaV93aW5kdXAocyk7CiAgICBpZiAoaGVhZGVyKSB7CiAgICAgIHB1dF9zaG9ydChzLCBsZW4yKTsKICAgICAgcHV0X3Nob3J0KHMsIH5sZW4yKTsKICAgIH0KICAgIHV0aWxzJDYuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuMiwgcy5wZW5kaW5nKTsKICAgIHMucGVuZGluZyArPSBsZW4yOwogIH0KICBmdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7CiAgICB2YXIgX24yID0gbiAqIDI7CiAgICB2YXIgX20yID0gbSAqIDI7CiAgICByZXR1cm4gdHJlZVtfbjJdIDwgdHJlZVtfbTJdIHx8IHRyZWVbX24yXSA9PT0gdHJlZVtfbTJdICYmIGRlcHRoW25dIDw9IGRlcHRoW21dOwogIH0KICBmdW5jdGlvbiBwcWRvd25oZWFwKHMsIHRyZWUsIGspIHsKICAgIHZhciB2MiA9IHMuaGVhcFtrXTsKICAgIHZhciBqID0gayA8PCAxOwogICAgd2hpbGUgKGogPD0gcy5oZWFwX2xlbikgewogICAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiYgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7CiAgICAgICAgaisrOwogICAgICB9CiAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYyLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdOwogICAgICBrID0gajsKICAgICAgaiA8PD0gMTsKICAgIH0KICAgIHMuaGVhcFtrXSA9IHYyOwogIH0KICBmdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpIHsKICAgIHZhciBkaXN0OwogICAgdmFyIGxjOwogICAgdmFyIGx4ID0gMDsKICAgIHZhciBjb2RlMjsKICAgIHZhciBleHRyYTsKICAgIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7CiAgICAgIGRvIHsKICAgICAgICBkaXN0ID0gcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyXSA8PCA4IHwgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV07CiAgICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07CiAgICAgICAgbHgrKzsKICAgICAgICBpZiAoZGlzdCA9PT0gMCkgewogICAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvZGUyID0gX2xlbmd0aF9jb2RlW2xjXTsKICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlMiArIExJVEVSQUxTJDEgKyAxLCBsdHJlZSk7CiAgICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGUyXTsKICAgICAgICAgIGlmIChleHRyYSAhPT0gMCkgewogICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlMl07CiAgICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOwogICAgICAgICAgfQogICAgICAgICAgZGlzdC0tOwogICAgICAgICAgY29kZTIgPSBkX2NvZGUoZGlzdCk7CiAgICAgICAgICBzZW5kX2NvZGUocywgY29kZTIsIGR0cmVlKTsKICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZTJdOwogICAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7CiAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGUyXTsKICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gd2hpbGUgKGx4IDwgcy5sYXN0X2xpdCk7CiAgICB9CiAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkX3RyZWUocywgZGVzYykgewogICAgdmFyIHRyZWUgPSBkZXNjLmR5bl90cmVlOwogICAgdmFyIHN0cmVlID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7CiAgICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlOwogICAgdmFyIGVsZW1zID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7CiAgICB2YXIgbiwgbTsKICAgIHZhciBtYXhfY29kZSA9IC0xOwogICAgdmFyIG5vZGU7CiAgICBzLmhlYXBfbGVuID0gMDsKICAgIHMuaGVhcF9tYXggPSBIRUFQX1NJWkUkMTsKICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7CiAgICAgIGlmICh0cmVlW24gKiAyXSAhPT0gMCkgewogICAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuOwogICAgICAgIHMuZGVwdGhbbl0gPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRyZWVbbiAqIDIgKyAxXSA9IDA7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChzLmhlYXBfbGVuIDwgMikgewogICAgICBub2RlID0gcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMDsKICAgICAgdHJlZVtub2RlICogMl0gPSAxOwogICAgICBzLmRlcHRoW25vZGVdID0gMDsKICAgICAgcy5vcHRfbGVuLS07CiAgICAgIGlmIChoYXNfc3RyZWUpIHsKICAgICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXTsKICAgICAgfQogICAgfQogICAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlOwogICAgZm9yIChuID0gcy5oZWFwX2xlbiA+PiAxOyBuID49IDE7IG4tLSkgewogICAgICBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOwogICAgfQogICAgbm9kZSA9IGVsZW1zOwogICAgZG8gewogICAgICBuID0gcy5oZWFwWzFdOwogICAgICBzLmhlYXBbMV0gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTsKICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCAxKTsKICAgICAgbSA9IHMuaGVhcFsxXTsKICAgICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOwogICAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07CiAgICAgIHRyZWVbbm9kZSAqIDJdID0gdHJlZVtuICogMl0gKyB0cmVlW20gKiAyXTsKICAgICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxOwogICAgICB0cmVlW24gKiAyICsgMV0gPSB0cmVlW20gKiAyICsgMV0gPSBub2RlOwogICAgICBzLmhlYXBbMV0gPSBub2RlKys7CiAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgMSk7CiAgICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpOwogICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMV07CiAgICBnZW5fYml0bGVuKHMsIGRlc2MpOwogICAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTsKICB9CiAgZnVuY3Rpb24gc2Nhbl90cmVlKHMsIHRyZWUsIG1heF9jb2RlKSB7CiAgICB2YXIgbjsKICAgIHZhciBwcmV2bGVuID0gLTE7CiAgICB2YXIgY3VybGVuOwogICAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV07CiAgICB2YXIgY291bnQgPSAwOwogICAgdmFyIG1heF9jb3VudCA9IDc7CiAgICB2YXIgbWluX2NvdW50ID0gNDsKICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgIG1heF9jb3VudCA9IDEzODsKICAgICAgbWluX2NvdW50ID0gMzsKICAgIH0KICAgIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0gPSA2NTUzNTsKICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgewogICAgICBjdXJsZW4gPSBuZXh0bGVuOwogICAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdOwogICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewogICAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXSArPSBjb3VudDsKICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHsKICAgICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7CiAgICAgICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0rKzsKICAgICAgICB9CiAgICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXSsrOwogICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CiAgICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4ICogMl0rKzsKICAgICAgfQogICAgICBjb3VudCA9IDA7CiAgICAgIHByZXZsZW4gPSBjdXJsZW47CiAgICAgIGlmIChuZXh0bGVuID09PSAwKSB7CiAgICAgICAgbWF4X2NvdW50ID0gMTM4OwogICAgICAgIG1pbl9jb3VudCA9IDM7CiAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7CiAgICAgICAgbWF4X2NvdW50ID0gNjsKICAgICAgICBtaW5fY291bnQgPSAzOwogICAgICB9IGVsc2UgewogICAgICAgIG1heF9jb3VudCA9IDc7CiAgICAgICAgbWluX2NvdW50ID0gNDsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpIHsKICAgIHZhciBuOwogICAgdmFyIHByZXZsZW4gPSAtMTsKICAgIHZhciBjdXJsZW47CiAgICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXTsKICAgIHZhciBjb3VudCA9IDA7CiAgICB2YXIgbWF4X2NvdW50ID0gNzsKICAgIHZhciBtaW5fY291bnQgPSA0OwogICAgaWYgKG5leHRsZW4gPT09IDApIHsKICAgICAgbWF4X2NvdW50ID0gMTM4OwogICAgICBtaW5fY291bnQgPSAzOwogICAgfQogICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CiAgICAgIGN1cmxlbiA9IG5leHRsZW47CiAgICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV07CiAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CiAgICAgICAgZG8gewogICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsKICAgICAgICB9IHdoaWxlICgtLWNvdW50ICE9PSAwKTsKICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHsKICAgICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7CiAgICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOwogICAgICAgICAgY291bnQtLTsKICAgICAgICB9CiAgICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7CiAgICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7CiAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKICAgICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpOwogICAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDMpOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTsKICAgICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7CiAgICAgIH0KICAgICAgY291bnQgPSAwOwogICAgICBwcmV2bGVuID0gY3VybGVuOwogICAgICBpZiAobmV4dGxlbiA9PT0gMCkgewogICAgICAgIG1heF9jb3VudCA9IDEzODsKICAgICAgICBtaW5fY291bnQgPSAzOwogICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikgewogICAgICAgIG1heF9jb3VudCA9IDY7CiAgICAgICAgbWluX2NvdW50ID0gMzsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXhfY291bnQgPSA3OwogICAgICAgIG1pbl9jb3VudCA9IDQ7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7CiAgICB2YXIgbWF4X2JsaW5kZXg7CiAgICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTsKICAgIHNjYW5fdHJlZShzLCBzLmR5bl9kdHJlZSwgcy5kX2Rlc2MubWF4X2NvZGUpOwogICAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpOwogICAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTJDEgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CiAgICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdICE9PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7CiAgICByZXR1cm4gbWF4X2JsaW5kZXg7CiAgfQogIGZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKSB7CiAgICB2YXIgcmFuazI7CiAgICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsKICAgIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCA1KTsKICAgIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgNCk7CiAgICBmb3IgKHJhbmsyID0gMDsgcmFuazIgPCBibGNvZGVzOyByYW5rMisrKSB7CiAgICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFuazJdICogMiArIDFdLCAzKTsKICAgIH0KICAgIHNlbmRfdHJlZShzLCBzLmR5bl9sdHJlZSwgbGNvZGVzIC0gMSk7CiAgICBzZW5kX3RyZWUocywgcy5keW5fZHRyZWUsIGRjb2RlcyAtIDEpOwogIH0KICBmdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHsKICAgIHZhciBibGFja19tYXNrID0gNDA5MzYyNDQ0NzsKICAgIHZhciBuOwogICAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkgewogICAgICBpZiAoYmxhY2tfbWFzayAmIDEgJiYgcy5keW5fbHRyZWVbbiAqIDJdICE9PSAwKSB7CiAgICAgICAgcmV0dXJuIFpfQklOQVJZOwogICAgICB9CiAgICB9CiAgICBpZiAocy5keW5fbHRyZWVbOSAqIDJdICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0gIT09IDAgfHwgcy5keW5fbHRyZWVbMTMgKiAyXSAhPT0gMCkgewogICAgICByZXR1cm4gWl9URVhUOwogICAgfQogICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUyQxOyBuKyspIHsKICAgICAgaWYgKHMuZHluX2x0cmVlW24gKiAyXSAhPT0gMCkgewogICAgICAgIHJldHVybiBaX1RFWFQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBaX0JJTkFSWTsKICB9CiAgdmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTsKICBmdW5jdGlvbiBfdHJfaW5pdChzKSB7CiAgICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHsKICAgICAgdHJfc3RhdGljX2luaXQoKTsKICAgICAgc3RhdGljX2luaXRfZG9uZSA9IHRydWU7CiAgICB9CiAgICBzLmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7CiAgICBzLmRfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7CiAgICBzLmJsX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5ibF90cmVlLCBzdGF0aWNfYmxfZGVzYyk7CiAgICBzLmJpX2J1ZiA9IDA7CiAgICBzLmJpX3ZhbGlkID0gMDsKICAgIGluaXRfYmxvY2socyk7CiAgfQogIGZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KSB7CiAgICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsKICAgIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gX3RyX2FsaWduKHMpIHsKICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVMgPDwgMSwgMyk7CiAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOwogICAgYmlfZmx1c2gocyk7CiAgfQogIGZ1bmN0aW9uIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpIHsKICAgIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7CiAgICB2YXIgbWF4X2JsaW5kZXggPSAwOwogICAgaWYgKHMubGV2ZWwgPiAwKSB7CiAgICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04kMSkgewogICAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpOwogICAgICB9CiAgICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpOwogICAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTsKICAgICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpOwogICAgICBvcHRfbGVuYiA9IHMub3B0X2xlbiArIDMgKyA3ID4+PiAzOwogICAgICBzdGF0aWNfbGVuYiA9IHMuc3RhdGljX2xlbiArIDMgKyA3ID4+PiAzOwogICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsKICAgICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7CiAgICB9CiAgICBpZiAoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIgJiYgYnVmICE9PSAtMSkgewogICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7CiAgICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQkMSB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHsKICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7CiAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOwogICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTsKICAgICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTsKICAgIH0KICAgIGluaXRfYmxvY2socyk7CiAgICBpZiAobGFzdCkgewogICAgICBiaV93aW5kdXAocyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYykgewogICAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdID0gZGlzdCA+Pj4gOCAmIDI1NTsKICAgIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMjU1OwogICAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDI1NTsKICAgIHMubGFzdF9saXQrKzsKICAgIGlmIChkaXN0ID09PSAwKSB7CiAgICAgIHMuZHluX2x0cmVlW2xjICogMl0rKzsKICAgIH0gZWxzZSB7CiAgICAgIHMubWF0Y2hlcysrOwogICAgICBkaXN0LS07CiAgICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMkMSArIDEpICogMl0rKzsKICAgICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0rKzsKICAgIH0KICAgIHJldHVybiBzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMTsKICB9CiAgdHJlZXMkMS5fdHJfaW5pdCA9IF90cl9pbml0OwogIHRyZWVzJDEuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7CiAgdHJlZXMkMS5fdHJfZmx1c2hfYmxvY2sgPSBfdHJfZmx1c2hfYmxvY2s7CiAgdHJlZXMkMS5fdHJfdGFsbHkgPSBfdHJfdGFsbHk7CiAgdHJlZXMkMS5fdHJfYWxpZ24gPSBfdHJfYWxpZ247CiAgZnVuY3Rpb24gYWRsZXIzMiQyKGFkbGVyLCBidWYsIGxlbjIsIHBvcykgewogICAgdmFyIHMxID0gYWRsZXIgJiA2NTUzNSB8IDAsIHMyID0gYWRsZXIgPj4+IDE2ICYgNjU1MzUgfCAwLCBuID0gMDsKICAgIHdoaWxlIChsZW4yICE9PSAwKSB7CiAgICAgIG4gPSBsZW4yID4gMmUzID8gMmUzIDogbGVuMjsKICAgICAgbGVuMiAtPSBuOwogICAgICBkbyB7CiAgICAgICAgczEgPSBzMSArIGJ1Zltwb3MrK10gfCAwOwogICAgICAgIHMyID0gczIgKyBzMSB8IDA7CiAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgIHMxICU9IDY1NTIxOwogICAgICBzMiAlPSA2NTUyMTsKICAgIH0KICAgIHJldHVybiBzMSB8IHMyIDw8IDE2IHwgMDsKICB9CiAgdmFyIGFkbGVyMzJfMSA9IGFkbGVyMzIkMjsKICBmdW5jdGlvbiBtYWtlVGFibGUoKSB7CiAgICB2YXIgYzIsIHRhYmxlID0gW107CiAgICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7CiAgICAgIGMyID0gbjsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHsKICAgICAgICBjMiA9IGMyICYgMSA/IDM5ODgyOTIzODQgXiBjMiA+Pj4gMSA6IGMyID4+PiAxOwogICAgICB9CiAgICAgIHRhYmxlW25dID0gYzI7CiAgICB9CiAgICByZXR1cm4gdGFibGU7CiAgfQogIHZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpOwogIGZ1bmN0aW9uIGNyYzMyJDIoY3JjLCBidWYsIGxlbjIsIHBvcykgewogICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuMjsKICAgIGNyYyBePSAtMTsKICAgIGZvciAodmFyIGkyID0gcG9zOyBpMiA8IGVuZDsgaTIrKykgewogICAgICBjcmMgPSBjcmMgPj4+IDggXiB0WyhjcmMgXiBidWZbaTJdKSAmIDI1NV07CiAgICB9CiAgICByZXR1cm4gY3JjIF4gLTE7CiAgfQogIHZhciBjcmMzMl8xID0gY3JjMzIkMjsKICB2YXIgbWVzc2FnZXMkMSA9IHsKICAgIDI6ICJuZWVkIGRpY3Rpb25hcnkiLAogICAgMTogInN0cmVhbSBlbmQiLAogICAgMDogIiIsCiAgICAiLTEiOiAiZmlsZSBlcnJvciIsCiAgICAiLTIiOiAic3RyZWFtIGVycm9yIiwKICAgICItMyI6ICJkYXRhIGVycm9yIiwKICAgICItNCI6ICJpbnN1ZmZpY2llbnQgbWVtb3J5IiwKICAgICItNSI6ICJidWZmZXIgZXJyb3IiLAogICAgIi02IjogImluY29tcGF0aWJsZSB2ZXJzaW9uIgogIH07CiAgdmFyIHV0aWxzJDUgPSBjb21tb24kMTsKICB2YXIgdHJlZXMgPSB0cmVlcyQxOwogIHZhciBhZGxlcjMyJDEgPSBhZGxlcjMyXzE7CiAgdmFyIGNyYzMyJDEgPSBjcmMzMl8xOwogIHZhciBtc2ckMiA9IG1lc3NhZ2VzJDE7CiAgdmFyIFpfTk9fRkxVU0gkMSA9IDA7CiAgdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7CiAgdmFyIFpfRlVMTF9GTFVTSCA9IDM7CiAgdmFyIFpfRklOSVNIJDIgPSA0OwogIHZhciBaX0JMT0NLJDEgPSA1OwogIHZhciBaX09LJDIgPSAwOwogIHZhciBaX1NUUkVBTV9FTkQkMiA9IDE7CiAgdmFyIFpfU1RSRUFNX0VSUk9SJDEgPSAtMjsKICB2YXIgWl9EQVRBX0VSUk9SJDEgPSAtMzsKICB2YXIgWl9CVUZfRVJST1IkMSA9IC01OwogIHZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04kMSA9IC0xOwogIHZhciBaX0ZJTFRFUkVEID0gMTsKICB2YXIgWl9IVUZGTUFOX09OTFkgPSAyOwogIHZhciBaX1JMRSA9IDM7CiAgdmFyIFpfRklYRUQgPSA0OwogIHZhciBaX0RFRkFVTFRfU1RSQVRFR1kkMSA9IDA7CiAgdmFyIFpfVU5LTk9XTiA9IDI7CiAgdmFyIFpfREVGTEFURUQkMiA9IDg7CiAgdmFyIE1BWF9NRU1fTEVWRUwgPSA5OwogIHZhciBNQVhfV0JJVFMkMSA9IDE1OwogIHZhciBERUZfTUVNX0xFVkVMID0gODsKICB2YXIgTEVOR1RIX0NPREVTID0gMjk7CiAgdmFyIExJVEVSQUxTID0gMjU2OwogIHZhciBMX0NPREVTID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTOwogIHZhciBEX0NPREVTID0gMzA7CiAgdmFyIEJMX0NPREVTID0gMTk7CiAgdmFyIEhFQVBfU0laRSA9IDIgKiBMX0NPREVTICsgMTsKICB2YXIgTUFYX0JJVFMgPSAxNTsKICB2YXIgTUlOX01BVENIID0gMzsKICB2YXIgTUFYX01BVENIID0gMjU4OwogIHZhciBNSU5fTE9PS0FIRUFEID0gTUFYX01BVENIICsgTUlOX01BVENIICsgMTsKICB2YXIgUFJFU0VUX0RJQ1QgPSAzMjsKICB2YXIgSU5JVF9TVEFURSA9IDQyOwogIHZhciBFWFRSQV9TVEFURSA9IDY5OwogIHZhciBOQU1FX1NUQVRFID0gNzM7CiAgdmFyIENPTU1FTlRfU1RBVEUgPSA5MTsKICB2YXIgSENSQ19TVEFURSA9IDEwMzsKICB2YXIgQlVTWV9TVEFURSA9IDExMzsKICB2YXIgRklOSVNIX1NUQVRFID0gNjY2OwogIHZhciBCU19ORUVEX01PUkUgPSAxOwogIHZhciBCU19CTE9DS19ET05FID0gMjsKICB2YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOwogIHZhciBCU19GSU5JU0hfRE9ORSA9IDQ7CiAgdmFyIE9TX0NPREUgPSAzOwogIGZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHsKICAgIHN0cm0ubXNnID0gbXNnJDJbZXJyb3JDb2RlXTsKICAgIHJldHVybiBlcnJvckNvZGU7CiAgfQogIGZ1bmN0aW9uIHJhbmsoZikgewogICAgcmV0dXJuIChmIDw8IDEpIC0gKGYgPiA0ID8gOSA6IDApOwogIH0KICBmdW5jdGlvbiB6ZXJvKGJ1ZikgewogICAgdmFyIGxlbjIgPSBidWYubGVuZ3RoOwogICAgd2hpbGUgKC0tbGVuMiA+PSAwKSB7CiAgICAgIGJ1ZltsZW4yXSA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkgewogICAgdmFyIHMgPSBzdHJtLnN0YXRlOwogICAgdmFyIGxlbjIgPSBzLnBlbmRpbmc7CiAgICBpZiAobGVuMiA+IHN0cm0uYXZhaWxfb3V0KSB7CiAgICAgIGxlbjIgPSBzdHJtLmF2YWlsX291dDsKICAgIH0KICAgIGlmIChsZW4yID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHV0aWxzJDUuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbjIsIHN0cm0ubmV4dF9vdXQpOwogICAgc3RybS5uZXh0X291dCArPSBsZW4yOwogICAgcy5wZW5kaW5nX291dCArPSBsZW4yOwogICAgc3RybS50b3RhbF9vdXQgKz0gbGVuMjsKICAgIHN0cm0uYXZhaWxfb3V0IC09IGxlbjI7CiAgICBzLnBlbmRpbmcgLT0gbGVuMjsKICAgIGlmIChzLnBlbmRpbmcgPT09IDApIHsKICAgICAgcy5wZW5kaW5nX291dCA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkgewogICAgdHJlZXMuX3RyX2ZsdXNoX2Jsb2NrKHMsIHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpOwogICAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7CiAgICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7CiAgfQogIGZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHsKICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjsKICB9CiAgZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikgewogICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiID4+PiA4ICYgMjU1OwogICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMjU1OwogIH0KICBmdW5jdGlvbiByZWFkX2J1ZihzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSB7CiAgICB2YXIgbGVuMiA9IHN0cm0uYXZhaWxfaW47CiAgICBpZiAobGVuMiA+IHNpemUpIHsKICAgICAgbGVuMiA9IHNpemU7CiAgICB9CiAgICBpZiAobGVuMiA9PT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHN0cm0uYXZhaWxfaW4gLT0gbGVuMjsKICAgIHV0aWxzJDUuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbjIsIHN0YXJ0KTsKICAgIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDEpIHsKICAgICAgc3RybS5hZGxlciA9IGFkbGVyMzIkMShzdHJtLmFkbGVyLCBidWYsIGxlbjIsIHN0YXJ0KTsKICAgIH0gZWxzZSBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAyKSB7CiAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMiQxKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuMiwgc3RhcnQpOwogICAgfQogICAgc3RybS5uZXh0X2luICs9IGxlbjI7CiAgICBzdHJtLnRvdGFsX2luICs9IGxlbjI7CiAgICByZXR1cm4gbGVuMjsKICB9CiAgZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpIHsKICAgIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7CiAgICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7CiAgICB2YXIgbWF0Y2g7CiAgICB2YXIgbGVuMjsKICAgIHZhciBiZXN0X2xlbiA9IHMucHJldl9sZW5ndGg7CiAgICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsKICAgIHZhciBsaW1pdCA9IHMuc3Ryc3RhcnQgPiBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQgPyBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwOwogICAgdmFyIF93aW4gPSBzLndpbmRvdzsKICAgIHZhciB3bWFzayA9IHMud19tYXNrOwogICAgdmFyIHByZXYgPSBzLnByZXY7CiAgICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDsKICAgIHZhciBzY2FuX2VuZDEgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdOwogICAgdmFyIHNjYW5fZW5kID0gX3dpbltzY2FuICsgYmVzdF9sZW5dOwogICAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7CiAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKICAgIH0KICAgIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsKICAgICAgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOwogICAgfQogICAgZG8gewogICAgICBtYXRjaCA9IGN1cl9tYXRjaDsKICAgICAgaWYgKF93aW5bbWF0Y2ggKyBiZXN0X2xlbl0gIT09IHNjYW5fZW5kIHx8IF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHwgX3dpblttYXRjaF0gIT09IF93aW5bc2Nhbl0gfHwgX3dpblsrK21hdGNoXSAhPT0gX3dpbltzY2FuICsgMV0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzY2FuICs9IDI7CiAgICAgIG1hdGNoKys7CiAgICAgIGRvIHsKICAgICAgfSB3aGlsZSAoX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBzY2FuIDwgc3RyZW5kKTsKICAgICAgbGVuMiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTsKICAgICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDsKICAgICAgaWYgKGxlbjIgPiBiZXN0X2xlbikgewogICAgICAgIHMubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CiAgICAgICAgYmVzdF9sZW4gPSBsZW4yOwogICAgICAgIGlmIChsZW4yID49IG5pY2VfbWF0Y2gpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzY2FuX2VuZDEgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdOwogICAgICAgIHNjYW5fZW5kID0gX3dpbltzY2FuICsgYmVzdF9sZW5dOwogICAgICB9CiAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApOwogICAgaWYgKGJlc3RfbGVuIDw9IHMubG9va2FoZWFkKSB7CiAgICAgIHJldHVybiBiZXN0X2xlbjsKICAgIH0KICAgIHJldHVybiBzLmxvb2thaGVhZDsKICB9CiAgZnVuY3Rpb24gZmlsbF93aW5kb3cocykgewogICAgdmFyIF93X3NpemUgPSBzLndfc2l6ZTsKICAgIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7CiAgICBkbyB7CiAgICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0OwogICAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkgewogICAgICAgIHV0aWxzJDUuYXJyYXlTZXQocy53aW5kb3csIHMud2luZG93LCBfd19zaXplLCBfd19zaXplLCAwKTsKICAgICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7CiAgICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplOwogICAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTsKICAgICAgICBuID0gcy5oYXNoX3NpemU7CiAgICAgICAgcCA9IG47CiAgICAgICAgZG8gewogICAgICAgICAgbSA9IHMuaGVhZFstLXBdOwogICAgICAgICAgcy5oZWFkW3BdID0gbSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwOwogICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgbiA9IF93X3NpemU7CiAgICAgICAgcCA9IG47CiAgICAgICAgZG8gewogICAgICAgICAgbSA9IHMucHJldlstLXBdOwogICAgICAgICAgcy5wcmV2W3BdID0gbSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwOwogICAgICAgIH0gd2hpbGUgKC0tbik7CiAgICAgICAgbW9yZSArPSBfd19zaXplOwogICAgICB9CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTsKICAgICAgcy5sb29rYWhlYWQgKz0gbjsKICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0OwogICAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdOwogICAgICAgIHMuaW5zX2ggPSAocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgICB3aGlsZSAocy5pbnNlcnQpIHsKICAgICAgICAgIHMuaW5zX2ggPSAocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7CiAgICAgICAgICBzdHIrKzsKICAgICAgICAgIHMuaW5zZXJ0LS07CiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApOwogIH0KICBmdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkgewogICAgdmFyIG1heF9ibG9ja19zaXplID0gNjU1MzU7CiAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CiAgICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTsKICAgIH0KICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkgewogICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgIH0KICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkOwogICAgICBzLmxvb2thaGVhZCA9IDA7CiAgICAgIHZhciBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CiAgICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CiAgICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0OwogICAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7CiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHMuaW5zZXJ0ID0gMDsKICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgICAgfQogICAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgICB9CiAgICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7CiAgICB2YXIgaGFzaF9oZWFkOwogICAgdmFyIGJmbHVzaDsKICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CiAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgIH0KICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBoYXNoX2hlYWQgPSAwOwogICAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgcy5pbnNfaCA9IChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzazsKICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0OwogICAgICB9CiAgICAgIGlmIChoYXNoX2hlYWQgIT09IDAgJiYgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTsKICAgICAgfQogICAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CiAgICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7CiAgICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2ggJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgICBzLm1hdGNoX2xlbmd0aC0tOwogICAgICAgICAgZG8gewogICAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgICAgIHMuaW5zX2ggPSAocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7CiAgICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0OwogICAgICAgICAgfSB3aGlsZSAoLS1zLm1hdGNoX2xlbmd0aCAhPT0gMCk7CiAgICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7CiAgICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07CiAgICAgICAgICBzLmluc19oID0gKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0IF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pOwogICAgICAgIHMubG9va2FoZWFkLS07CiAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICB9CiAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTsKICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgICAgfQogICAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgICB9CiAgICBpZiAocy5sYXN0X2xpdCkgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7CiAgICB2YXIgaGFzaF9oZWFkOwogICAgdmFyIGJmbHVzaDsKICAgIHZhciBtYXhfaW5zZXJ0OwogICAgZm9yICg7IDsgKSB7CiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDEpIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc2hfaGVhZCA9IDA7CiAgICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgICBzLmluc19oID0gKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0IF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdOwogICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7CiAgICAgIH0KICAgICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoOwogICAgICBzLnByZXZfbWF0Y2ggPSBzLm1hdGNoX3N0YXJ0OwogICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgICAgIGlmIChoYXNoX2hlYWQgIT09IDAgJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiYgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTsKICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCBzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5NikpIHsKICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHsKICAgICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIOwogICAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7CiAgICAgICAgcy5sb29rYWhlYWQgLT0gcy5wcmV2X2xlbmd0aCAtIDE7CiAgICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmICgrK3Muc3Ryc3RhcnQgPD0gbWF4X2luc2VydCkgewogICAgICAgICAgICBzLmluc19oID0gKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0IF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTsKICAgICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApOwogICAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpOwogICAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHsKICAgICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTsKICAgICAgICBpZiAoYmZsdXNoKSB7CiAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcy5zdHJzdGFydCsrOwogICAgICAgIHMubG9va2FoZWFkLS07CiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTsKICAgICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgICAgcy5sb29rYWhlYWQtLTsKICAgICAgfQogICAgfQogICAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7CiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pOwogICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICB9CiAgICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7CiAgICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgfQogICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7CiAgICB2YXIgYmZsdXNoOwogICAgdmFyIHByZXY7CiAgICB2YXIgc2Nhbiwgc3RyZW5kOwogICAgdmFyIF93aW4gPSBzLndpbmRvdzsKICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIKSB7CiAgICAgICAgZmlsbF93aW5kb3cocyk7CiAgICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICAgIH0KICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7CiAgICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCA+IDApIHsKICAgICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7CiAgICAgICAgcHJldiA9IF93aW5bc2Nhbl07CiAgICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7CiAgICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIOwogICAgICAgICAgZG8gewogICAgICAgICAgfSB3aGlsZSAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBzY2FuIDwgc3RyZW5kKTsKICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pOwogICAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHsKICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLmxvb2thaGVhZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgewogICAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7CiAgICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7CiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDsKICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTsKICAgICAgICBzLmxvb2thaGVhZC0tOwogICAgICAgIHMuc3Ryc3RhcnQrKzsKICAgICAgfQogICAgICBpZiAoYmZsdXNoKSB7CiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzLmluc2VydCA9IDA7CiAgICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FOwogICAgfQogICAgaWYgKHMubGFzdF9saXQpIHsKICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7CiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgewogICAgdmFyIGJmbHVzaDsKICAgIGZvciAoOyA7ICkgewogICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICBmaWxsX3dpbmRvdyhzKTsKICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsKICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7CiAgICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcy5tYXRjaF9sZW5ndGggPSAwOwogICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pOwogICAgICBzLmxvb2thaGVhZC0tOwogICAgICBzLnN0cnN0YXJ0Kys7CiAgICAgIGlmIChiZmx1c2gpIHsKICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHMuaW5zZXJ0ID0gMDsKICAgIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpOwogICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDsKICAgICAgfQogICAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7CiAgICB9CiAgICBpZiAocy5sYXN0X2xpdCkgewogICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTsKICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQlNfQkxPQ0tfRE9ORTsKICB9CiAgZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykgewogICAgdGhpcy5nb29kX2xlbmd0aCA9IGdvb2RfbGVuZ3RoOwogICAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5OwogICAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoOwogICAgdGhpcy5tYXhfY2hhaW4gPSBtYXhfY2hhaW47CiAgICB0aGlzLmZ1bmMgPSBmdW5jOwogIH0KICB2YXIgY29uZmlndXJhdGlvbl90YWJsZTsKICBjb25maWd1cmF0aW9uX3RhYmxlID0gWwogICAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksCiAgICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksCiAgICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLAogICAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksCiAgICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwKICAgIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwKICAgIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLAogICAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksCiAgICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwKICAgIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpCiAgXTsKICBmdW5jdGlvbiBsbV9pbml0KHMpIHsKICAgIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7CiAgICB6ZXJvKHMuaGVhZCk7CiAgICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTsKICAgIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7CiAgICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoOwogICAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47CiAgICBzLnN0cnN0YXJ0ID0gMDsKICAgIHMuYmxvY2tfc3RhcnQgPSAwOwogICAgcy5sb29rYWhlYWQgPSAwOwogICAgcy5pbnNlcnQgPSAwOwogICAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgIHMuaW5zX2ggPSAwOwogIH0KICBmdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7CiAgICB0aGlzLnN0cm0gPSBudWxsOwogICAgdGhpcy5zdGF0dXMgPSAwOwogICAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7CiAgICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOwogICAgdGhpcy5wZW5kaW5nX291dCA9IDA7CiAgICB0aGlzLnBlbmRpbmcgPSAwOwogICAgdGhpcy53cmFwID0gMDsKICAgIHRoaXMuZ3poZWFkID0gbnVsbDsKICAgIHRoaXMuZ3ppbmRleCA9IDA7CiAgICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQkMjsKICAgIHRoaXMubGFzdF9mbHVzaCA9IC0xOwogICAgdGhpcy53X3NpemUgPSAwOwogICAgdGhpcy53X2JpdHMgPSAwOwogICAgdGhpcy53X21hc2sgPSAwOwogICAgdGhpcy53aW5kb3cgPSBudWxsOwogICAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7CiAgICB0aGlzLnByZXYgPSBudWxsOwogICAgdGhpcy5oZWFkID0gbnVsbDsKICAgIHRoaXMuaW5zX2ggPSAwOwogICAgdGhpcy5oYXNoX3NpemUgPSAwOwogICAgdGhpcy5oYXNoX2JpdHMgPSAwOwogICAgdGhpcy5oYXNoX21hc2sgPSAwOwogICAgdGhpcy5oYXNoX3NoaWZ0ID0gMDsKICAgIHRoaXMuYmxvY2tfc3RhcnQgPSAwOwogICAgdGhpcy5tYXRjaF9sZW5ndGggPSAwOwogICAgdGhpcy5wcmV2X21hdGNoID0gMDsKICAgIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgIHRoaXMuc3Ryc3RhcnQgPSAwOwogICAgdGhpcy5tYXRjaF9zdGFydCA9IDA7CiAgICB0aGlzLmxvb2thaGVhZCA9IDA7CiAgICB0aGlzLnByZXZfbGVuZ3RoID0gMDsKICAgIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7CiAgICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDsKICAgIHRoaXMubGV2ZWwgPSAwOwogICAgdGhpcy5zdHJhdGVneSA9IDA7CiAgICB0aGlzLmdvb2RfbWF0Y2ggPSAwOwogICAgdGhpcy5uaWNlX21hdGNoID0gMDsKICAgIHRoaXMuZHluX2x0cmVlID0gbmV3IHV0aWxzJDUuQnVmMTYoSEVBUF9TSVpFICogMik7CiAgICB0aGlzLmR5bl9kdHJlZSA9IG5ldyB1dGlscyQ1LkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7CiAgICB0aGlzLmJsX3RyZWUgPSBuZXcgdXRpbHMkNS5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTsKICAgIHplcm8odGhpcy5keW5fbHRyZWUpOwogICAgemVybyh0aGlzLmR5bl9kdHJlZSk7CiAgICB6ZXJvKHRoaXMuYmxfdHJlZSk7CiAgICB0aGlzLmxfZGVzYyA9IG51bGw7CiAgICB0aGlzLmRfZGVzYyA9IG51bGw7CiAgICB0aGlzLmJsX2Rlc2MgPSBudWxsOwogICAgdGhpcy5ibF9jb3VudCA9IG5ldyB1dGlscyQ1LkJ1ZjE2KE1BWF9CSVRTICsgMSk7CiAgICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMkNS5CdWYxNigyICogTF9DT0RFUyArIDEpOwogICAgemVybyh0aGlzLmhlYXApOwogICAgdGhpcy5oZWFwX2xlbiA9IDA7CiAgICB0aGlzLmhlYXBfbWF4ID0gMDsKICAgIHRoaXMuZGVwdGggPSBuZXcgdXRpbHMkNS5CdWYxNigyICogTF9DT0RFUyArIDEpOwogICAgemVybyh0aGlzLmRlcHRoKTsKICAgIHRoaXMubF9idWYgPSAwOwogICAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7CiAgICB0aGlzLmxhc3RfbGl0ID0gMDsKICAgIHRoaXMuZF9idWYgPSAwOwogICAgdGhpcy5vcHRfbGVuID0gMDsKICAgIHRoaXMuc3RhdGljX2xlbiA9IDA7CiAgICB0aGlzLm1hdGNoZXMgPSAwOwogICAgdGhpcy5pbnNlcnQgPSAwOwogICAgdGhpcy5iaV9idWYgPSAwOwogICAgdGhpcy5iaV92YWxpZCA9IDA7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSkgewogICAgdmFyIHM7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQxKTsKICAgIH0KICAgIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7CiAgICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKICAgIHMgPSBzdHJtLnN0YXRlOwogICAgcy5wZW5kaW5nID0gMDsKICAgIHMucGVuZGluZ19vdXQgPSAwOwogICAgaWYgKHMud3JhcCA8IDApIHsKICAgICAgcy53cmFwID0gLXMud3JhcDsKICAgIH0KICAgIHMuc3RhdHVzID0gcy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7CiAgICBzdHJtLmFkbGVyID0gcy53cmFwID09PSAyID8gMCA6IDE7CiAgICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIJDE7CiAgICB0cmVlcy5fdHJfaW5pdChzKTsKICAgIHJldHVybiBaX09LJDI7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7CiAgICB2YXIgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTsKICAgIGlmIChyZXQgPT09IFpfT0skMikgewogICAgICBsbV9pbml0KHN0cm0uc3RhdGUpOwogICAgfQogICAgcmV0dXJuIHJldDsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7CiAgICB9CiAgICBpZiAoc3RybS5zdGF0ZS53cmFwICE9PSAyKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxOwogICAgfQogICAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkOwogICAgcmV0dXJuIFpfT0skMjsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QyLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIHsKICAgIGlmICghc3RybSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTsKICAgIH0KICAgIHZhciB3cmFwID0gMTsKICAgIGlmIChsZXZlbCA9PT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OJDEpIHsKICAgICAgbGV2ZWwgPSA2OwogICAgfQogICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CiAgICAgIHdyYXAgPSAwOwogICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CiAgICB9IGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkgewogICAgICB3cmFwID0gMjsKICAgICAgd2luZG93Qml0cyAtPSAxNjsKICAgIH0KICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZDIgIT09IFpfREVGTEFURUQkMiB8fCB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fCBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7CiAgICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IkMSk7CiAgICB9CiAgICBpZiAod2luZG93Qml0cyA9PT0gOCkgewogICAgICB3aW5kb3dCaXRzID0gOTsKICAgIH0KICAgIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpOwogICAgc3RybS5zdGF0ZSA9IHM7CiAgICBzLnN0cm0gPSBzdHJtOwogICAgcy53cmFwID0gd3JhcDsKICAgIHMuZ3poZWFkID0gbnVsbDsKICAgIHMud19iaXRzID0gd2luZG93Qml0czsKICAgIHMud19zaXplID0gMSA8PCBzLndfYml0czsKICAgIHMud19tYXNrID0gcy53X3NpemUgLSAxOwogICAgcy5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7CiAgICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7CiAgICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTsKICAgIHMuaGFzaF9zaGlmdCA9IH5+KChzLmhhc2hfYml0cyArIE1JTl9NQVRDSCAtIDEpIC8gTUlOX01BVENIKTsKICAgIHMud2luZG93ID0gbmV3IHV0aWxzJDUuQnVmOChzLndfc2l6ZSAqIDIpOwogICAgcy5oZWFkID0gbmV3IHV0aWxzJDUuQnVmMTYocy5oYXNoX3NpemUpOwogICAgcy5wcmV2ID0gbmV3IHV0aWxzJDUuQnVmMTYocy53X3NpemUpOwogICAgcy5saXRfYnVmc2l6ZSA9IDEgPDwgbWVtTGV2ZWwgKyA2OwogICAgcy5wZW5kaW5nX2J1Zl9zaXplID0gcy5saXRfYnVmc2l6ZSAqIDQ7CiAgICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzJDUuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpOwogICAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplOwogICAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplOwogICAgcy5sZXZlbCA9IGxldmVsOwogICAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwogICAgcy5tZXRob2QgPSBtZXRob2QyOwogICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHsKICAgIHJldHVybiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQkMiwgTUFYX1dCSVRTJDEsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSQxKTsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZSQyKHN0cm0sIGZsdXNoKSB7CiAgICB2YXIgb2xkX2ZsdXNoLCBzOwogICAgdmFyIGJlZywgdmFsOwogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8IGZsdXNoID4gWl9CTE9DSyQxIHx8IGZsdXNoIDwgMCkgewogICAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQxKSA6IFpfU1RSRUFNX0VSUk9SJDE7CiAgICB9CiAgICBzID0gc3RybS5zdGF0ZTsKICAgIGlmICghc3RybS5vdXRwdXQgfHwgIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9PSBaX0ZJTklTSCQyKSB7CiAgICAgIHJldHVybiBlcnIoc3RybSwgc3RybS5hdmFpbF9vdXQgPT09IDAgPyBaX0JVRl9FUlJPUiQxIDogWl9TVFJFQU1fRVJST1IkMSk7CiAgICB9CiAgICBzLnN0cm0gPSBzdHJtOwogICAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoOwogICAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7CiAgICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHsKICAgICAgaWYgKHMud3JhcCA9PT0gMikgewogICAgICAgIHN0cm0uYWRsZXIgPSAwOwogICAgICAgIHB1dF9ieXRlKHMsIDMxKTsKICAgICAgICBwdXRfYnl0ZShzLCAxMzkpOwogICAgICAgIHB1dF9ieXRlKHMsIDgpOwogICAgICAgIGlmICghcy5nemhlYWQpIHsKICAgICAgICAgIHB1dF9ieXRlKHMsIDApOwogICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKICAgICAgICAgIHB1dF9ieXRlKHMsIDApOwogICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6IHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgPyA0IDogMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTsKICAgICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHV0X2J5dGUoCiAgICAgICAgICAgIHMsCiAgICAgICAgICAgIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICsgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgKyAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICsgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICsgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KQogICAgICAgICAgKTsKICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAyNTUpOwogICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSA+PiA4ICYgMjU1KTsKICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgPj4gMTYgJiAyNTUpOwogICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSA+PiAyNCAmIDI1NSk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6IHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgPyA0IDogMCk7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDI1NSk7CiAgICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7CiAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDI1NSk7CiAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4ICYgMjU1KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7CiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMiQxKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7CiAgICAgICAgICB9CiAgICAgICAgICBzLmd6aW5kZXggPSAwOwogICAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGhlYWRlciA9IFpfREVGTEFURUQkMiArIChzLndfYml0cyAtIDggPDwgNCkgPDwgODsKICAgICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTsKICAgICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikgewogICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOwogICAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHsKICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKICAgICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHsKICAgICAgICAgIGxldmVsX2ZsYWdzID0gMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOwogICAgICAgIH0KICAgICAgICBoZWFkZXIgfD0gbGV2ZWxfZmxhZ3MgPDwgNjsKICAgICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgICAgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOwogICAgICAgIH0KICAgICAgICBoZWFkZXIgKz0gMzEgLSBoZWFkZXIgJSAzMTsKICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7CiAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKICAgICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgewogICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpOwogICAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDY1NTM1KTsKICAgICAgICB9CiAgICAgICAgc3RybS5hZGxlciA9IDE7CiAgICAgIH0KICAgIH0KICAgIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHsKICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhKSB7CiAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgNjU1MzUpKSB7CiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyJDEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgICAgICAgIGJlZyA9IHMucGVuZGluZzsKICAgICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAyNTUpOwogICAgICAgICAgcy5nemluZGV4Kys7CiAgICAgICAgfQogICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykgewogICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyJDEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpOwogICAgICAgIH0KICAgICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHsKICAgICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTsKICAgICAgfQogICAgfQogICAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7CiAgICAgIGlmIChzLmd6aGVhZC5uYW1lKSB7CiAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICB2YWwgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDI1NTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwogICAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7CiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgIHMuZ3ppbmRleCA9IDA7CiAgICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTsKICAgICAgfQogICAgfQogICAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7CiAgICAgIGlmIChzLmd6aGVhZC5jb21tZW50KSB7CiAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHsKICAgICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICAgICAgYmVnID0gcy5wZW5kaW5nOwogICAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHsKICAgICAgICAgICAgICB2YWwgPSAxOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDI1NTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwogICAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7CiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7CiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIkMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWwgPT09IDApIHsKICAgICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFOwogICAgICB9CiAgICB9CiAgICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHsKICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHsKICAgICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkgewogICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgICAgICB9CiAgICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7CiAgICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMjU1KTsKICAgICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgPj4gOCAmIDI1NSk7CiAgICAgICAgICBzdHJtLmFkbGVyID0gMDsKICAgICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFOwogICAgICB9CiAgICB9CiAgICBpZiAocy5wZW5kaW5nICE9PSAwKSB7CiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOwogICAgICAgIHJldHVybiBaX09LJDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiYgZmx1c2ggIT09IFpfRklOSVNIJDIpIHsKICAgICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUiQxKTsKICAgIH0KICAgIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHsKICAgICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUiQxKTsKICAgIH0KICAgIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8IGZsdXNoICE9PSBaX05PX0ZMVVNIJDEgJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkgewogICAgICB2YXIgYnN0YXRlID0gcy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDogcy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOiBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpOwogICAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7CiAgICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CiAgICAgIH0KICAgICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHsKICAgICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gWl9PSyQyOwogICAgICB9CiAgICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHsKICAgICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkgewogICAgICAgICAgdHJlZXMuX3RyX2FsaWduKHMpOwogICAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0skMSkgewogICAgICAgICAgdHJlZXMuX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7CiAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkgewogICAgICAgICAgICB6ZXJvKHMuaGVhZCk7CiAgICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgewogICAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwOwogICAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwOwogICAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwogICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7CiAgICAgICAgICByZXR1cm4gWl9PSyQyOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCQyKSB7CiAgICAgIHJldHVybiBaX09LJDI7CiAgICB9CiAgICBpZiAocy53cmFwIDw9IDApIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORCQyOwogICAgfQogICAgaWYgKHMud3JhcCA9PT0gMikgewogICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciA+PiA4ICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciA+PiAxNiAmIDI1NSk7CiAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgPj4gMjQgJiAyNTUpOwogICAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiA+PiA4ICYgMjU1KTsKICAgICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiA+PiAxNiAmIDI1NSk7CiAgICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gPj4gMjQgJiAyNTUpOwogICAgfSBlbHNlIHsKICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpOwogICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgNjU1MzUpOwogICAgfQogICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKICAgIGlmIChzLndyYXAgPiAwKSB7CiAgICAgIHMud3JhcCA9IC1zLndyYXA7CiAgICB9CiAgICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyQyIDogWl9TVFJFQU1fRU5EJDI7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkgewogICAgdmFyIHN0YXR1czsKICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTsKICAgIH0KICAgIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzOwogICAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJiBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJiBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiYgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJiBzdGF0dXMgIT09IEZJTklTSF9TVEFURSkgewogICAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDEpOwogICAgfQogICAgc3RybS5zdGF0ZSA9IG51bGw7CiAgICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUiQxKSA6IFpfT0skMjsKICB9CiAgZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkgewogICAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDsKICAgIHZhciBzOwogICAgdmFyIHN0ciwgbjsKICAgIHZhciB3cmFwOwogICAgdmFyIGF2YWlsOwogICAgdmFyIG5leHQ7CiAgICB2YXIgaW5wdXQ7CiAgICB2YXIgdG1wRGljdDsKICAgIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTsKICAgIH0KICAgIHMgPSBzdHJtLnN0YXRlOwogICAgd3JhcCA9IHMud3JhcDsKICAgIGlmICh3cmFwID09PSAyIHx8IHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUgfHwgcy5sb29rYWhlYWQpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7CiAgICB9CiAgICBpZiAod3JhcCA9PT0gMSkgewogICAgICBzdHJtLmFkbGVyID0gYWRsZXIzMiQxKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApOwogICAgfQogICAgcy53cmFwID0gMDsKICAgIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7CiAgICAgIGlmICh3cmFwID09PSAwKSB7CiAgICAgICAgemVybyhzLmhlYWQpOwogICAgICAgIHMuc3Ryc3RhcnQgPSAwOwogICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwOwogICAgICAgIHMuaW5zZXJ0ID0gMDsKICAgICAgfQogICAgICB0bXBEaWN0ID0gbmV3IHV0aWxzJDUuQnVmOChzLndfc2l6ZSk7CiAgICAgIHV0aWxzJDUuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7CiAgICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0OwogICAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7CiAgICB9CiAgICBhdmFpbCA9IHN0cm0uYXZhaWxfaW47CiAgICBuZXh0ID0gc3RybS5uZXh0X2luOwogICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7CiAgICBzdHJtLm5leHRfaW4gPSAwOwogICAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7CiAgICBmaWxsX3dpbmRvdyhzKTsKICAgIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKICAgICAgc3RyID0gcy5zdHJzdGFydDsKICAgICAgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpOwogICAgICBkbyB7CiAgICAgICAgcy5pbnNfaCA9IChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrOwogICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07CiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyOwogICAgICAgIHN0cisrOwogICAgICB9IHdoaWxlICgtLW4pOwogICAgICBzLnN0cnN0YXJ0ID0gc3RyOwogICAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7CiAgICAgIGZpbGxfd2luZG93KHMpOwogICAgfQogICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDsKICAgIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0OwogICAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDsKICAgIHMubG9va2FoZWFkID0gMDsKICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICBzdHJtLm5leHRfaW4gPSBuZXh0OwogICAgc3RybS5pbnB1dCA9IGlucHV0OwogICAgc3RybS5hdmFpbF9pbiA9IGF2YWlsOwogICAgcy53cmFwID0gd3JhcDsKICAgIHJldHVybiBaX09LJDI7CiAgfQogIGRlZmxhdGUkMy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0OwogIGRlZmxhdGUkMy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7CiAgZGVmbGF0ZSQzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDsKICBkZWZsYXRlJDMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7CiAgZGVmbGF0ZSQzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyOwogIGRlZmxhdGUkMy5kZWZsYXRlID0gZGVmbGF0ZSQyOwogIGRlZmxhdGUkMy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDsKICBkZWZsYXRlJDMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTsKICBkZWZsYXRlJDMuZGVmbGF0ZUluZm8gPSAicGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7CiAgdmFyIHN0cmluZ3MkMiA9IHt9OwogIHZhciB1dGlscyQ0ID0gY29tbW9uJDE7CiAgdmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7CiAgdmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlOwogIHRyeSB7CiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFswXSk7CiAgfSBjYXRjaCAoX18pIHsKICAgIFNUUl9BUFBMWV9PSyA9IGZhbHNlOwogIH0KICB0cnkgewogICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7CiAgfSBjYXRjaCAoX18pIHsKICAgIFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsKICB9CiAgdmFyIF91dGY4bGVuID0gbmV3IHV0aWxzJDQuQnVmOCgyNTYpOwogIGZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHsKICAgIF91dGY4bGVuW3FdID0gcSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMTsKICB9CiAgX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOwogIHN0cmluZ3MkMi5zdHJpbmcyYnVmID0gZnVuY3Rpb24oc3RyKSB7CiAgICB2YXIgYnVmLCBjMiwgYzIyLCBtX3BvcywgaTIsIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDsKICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHsKICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7CiAgICAgIGlmICgoYzIgJiA2NDUxMikgPT09IDU1Mjk2ICYmIG1fcG9zICsgMSA8IHN0cl9sZW4pIHsKICAgICAgICBjMjIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpOwogICAgICAgIGlmICgoYzIyICYgNjQ1MTIpID09PSA1NjMyMCkgewogICAgICAgICAgYzIgPSA2NTUzNiArIChjMiAtIDU1Mjk2IDw8IDEwKSArIChjMjIgLSA1NjMyMCk7CiAgICAgICAgICBtX3BvcysrOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZfbGVuICs9IGMyIDwgMTI4ID8gMSA6IGMyIDwgMjA0OCA/IDIgOiBjMiA8IDY1NTM2ID8gMyA6IDQ7CiAgICB9CiAgICBidWYgPSBuZXcgdXRpbHMkNC5CdWY4KGJ1Zl9sZW4pOwogICAgZm9yIChpMiA9IDAsIG1fcG9zID0gMDsgaTIgPCBidWZfbGVuOyBtX3BvcysrKSB7CiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpOwogICAgICBpZiAoKGMyICYgNjQ1MTIpID09PSA1NTI5NiAmJiBtX3BvcyArIDEgPCBzdHJfbGVuKSB7CiAgICAgICAgYzIyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTsKICAgICAgICBpZiAoKGMyMiAmIDY0NTEyKSA9PT0gNTYzMjApIHsKICAgICAgICAgIGMyID0gNjU1MzYgKyAoYzIgLSA1NTI5NiA8PCAxMCkgKyAoYzIyIC0gNTYzMjApOwogICAgICAgICAgbV9wb3MrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGMyIDwgMTI4KSB7CiAgICAgICAgYnVmW2kyKytdID0gYzI7CiAgICAgIH0gZWxzZSBpZiAoYzIgPCAyMDQ4KSB7CiAgICAgICAgYnVmW2kyKytdID0gMTkyIHwgYzIgPj4+IDY7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgJiA2MzsKICAgICAgfSBlbHNlIGlmIChjMiA8IDY1NTM2KSB7CiAgICAgICAgYnVmW2kyKytdID0gMjI0IHwgYzIgPj4+IDEyOwogICAgICAgIGJ1ZltpMisrXSA9IDEyOCB8IGMyID4+PiA2ICYgNjM7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgJiA2MzsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZbaTIrK10gPSAyNDAgfCBjMiA+Pj4gMTg7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgPj4+IDEyICYgNjM7CiAgICAgICAgYnVmW2kyKytdID0gMTI4IHwgYzIgPj4+IDYgJiA2MzsKICAgICAgICBidWZbaTIrK10gPSAxMjggfCBjMiAmIDYzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmOwogIH07CiAgZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbjIpIHsKICAgIGlmIChsZW4yIDwgNjU1MzQpIHsKICAgICAgaWYgKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LIHx8ICFidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX09LKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRpbHMkNC5zaHJpbmtCdWYoYnVmLCBsZW4yKSk7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBsZW4yOyBpMisrKSB7CiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpMl0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgc3RyaW5ncyQyLmJ1ZjJiaW5zdHJpbmcgPSBmdW5jdGlvbihidWYpIHsKICAgIHJldHVybiBidWYyYmluc3RyaW5nKGJ1ZiwgYnVmLmxlbmd0aCk7CiAgfTsKICBzdHJpbmdzJDIuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uKHN0cikgewogICAgdmFyIGJ1ZiA9IG5ldyB1dGlscyQ0LkJ1Zjgoc3RyLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpMiA9IDAsIGxlbjIgPSBidWYubGVuZ3RoOyBpMiA8IGxlbjI7IGkyKyspIHsKICAgICAgYnVmW2kyXSA9IHN0ci5jaGFyQ29kZUF0KGkyKTsKICAgIH0KICAgIHJldHVybiBidWY7CiAgfTsKICBzdHJpbmdzJDIuYnVmMnN0cmluZyA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7CiAgICB2YXIgaTIsIG91dCwgYzIsIGNfbGVuOwogICAgdmFyIGxlbjIgPSBtYXggfHwgYnVmLmxlbmd0aDsKICAgIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4yICogMik7CiAgICBmb3IgKG91dCA9IDAsIGkyID0gMDsgaTIgPCBsZW4yOyApIHsKICAgICAgYzIgPSBidWZbaTIrK107CiAgICAgIGlmIChjMiA8IDEyOCkgewogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGMyOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNfbGVuID0gX3V0ZjhsZW5bYzJdOwogICAgICBpZiAoY19sZW4gPiA0KSB7CiAgICAgICAgdXRmMTZidWZbb3V0KytdID0gNjU1MzM7CiAgICAgICAgaTIgKz0gY19sZW4gLSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGMyICY9IGNfbGVuID09PSAyID8gMzEgOiBjX2xlbiA9PT0gMyA/IDE1IDogNzsKICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpMiA8IGxlbjIpIHsKICAgICAgICBjMiA9IGMyIDw8IDYgfCBidWZbaTIrK10gJiA2MzsKICAgICAgICBjX2xlbi0tOwogICAgICB9CiAgICAgIGlmIChjX2xlbiA+IDEpIHsKICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSA2NTUzMzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoYzIgPCA2NTUzNikgewogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGMyOwogICAgICB9IGVsc2UgewogICAgICAgIGMyIC09IDY1NTM2OwogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDU1Mjk2IHwgYzIgPj4gMTAgJiAxMDIzOwogICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDU2MzIwIHwgYzIgJiAxMDIzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTsKICB9OwogIHN0cmluZ3MkMi51dGY4Ym9yZGVyID0gZnVuY3Rpb24oYnVmLCBtYXgpIHsKICAgIHZhciBwb3M7CiAgICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDsKICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7CiAgICAgIG1heCA9IGJ1Zi5sZW5ndGg7CiAgICB9CiAgICBwb3MgPSBtYXggLSAxOwogICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDE5MikgPT09IDEyOCkgewogICAgICBwb3MtLTsKICAgIH0KICAgIGlmIChwb3MgPCAwKSB7CiAgICAgIHJldHVybiBtYXg7CiAgICB9CiAgICBpZiAocG9zID09PSAwKSB7CiAgICAgIHJldHVybiBtYXg7CiAgICB9CiAgICByZXR1cm4gcG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4ID8gcG9zIDogbWF4OwogIH07CiAgZnVuY3Rpb24gWlN0cmVhbSQyKCkgewogICAgdGhpcy5pbnB1dCA9IG51bGw7CiAgICB0aGlzLm5leHRfaW4gPSAwOwogICAgdGhpcy5hdmFpbF9pbiA9IDA7CiAgICB0aGlzLnRvdGFsX2luID0gMDsKICAgIHRoaXMub3V0cHV0ID0gbnVsbDsKICAgIHRoaXMubmV4dF9vdXQgPSAwOwogICAgdGhpcy5hdmFpbF9vdXQgPSAwOwogICAgdGhpcy50b3RhbF9vdXQgPSAwOwogICAgdGhpcy5tc2cgPSAiIjsKICAgIHRoaXMuc3RhdGUgPSBudWxsOwogICAgdGhpcy5kYXRhX3R5cGUgPSAyOwogICAgdGhpcy5hZGxlciA9IDA7CiAgfQogIHZhciB6c3RyZWFtID0gWlN0cmVhbSQyOwogIHZhciB6bGliX2RlZmxhdGUgPSBkZWZsYXRlJDM7CiAgdmFyIHV0aWxzJDMgPSBjb21tb24kMTsKICB2YXIgc3RyaW5ncyQxID0gc3RyaW5ncyQyOwogIHZhciBtc2ckMSA9IG1lc3NhZ2VzJDE7CiAgdmFyIFpTdHJlYW0kMSA9IHpzdHJlYW07CiAgdmFyIHRvU3RyaW5nJDEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogIHZhciBaX05PX0ZMVVNIID0gMDsKICB2YXIgWl9GSU5JU0gkMSA9IDQ7CiAgdmFyIFpfT0skMSA9IDA7CiAgdmFyIFpfU1RSRUFNX0VORCQxID0gMTsKICB2YXIgWl9TWU5DX0ZMVVNIID0gMjsKICB2YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7CiAgdmFyIFpfREVGQVVMVF9TVFJBVEVHWSA9IDA7CiAgdmFyIFpfREVGTEFURUQkMSA9IDg7CiAgZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpCiAgICAgIHJldHVybiBuZXcgRGVmbGF0ZShvcHRpb25zKTsKICAgIHRoaXMub3B0aW9ucyA9IHV0aWxzJDMuYXNzaWduKHsKICAgICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTiwKICAgICAgbWV0aG9kOiBaX0RFRkxBVEVEJDEsCiAgICAgIGNodW5rU2l6ZTogMTYzODQsCiAgICAgIHdpbmRvd0JpdHM6IDE1LAogICAgICBtZW1MZXZlbDogOCwKICAgICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSwKICAgICAgdG86ICIiCiAgICB9LCBvcHRpb25zIHx8IHt9KTsKICAgIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7CiAgICBpZiAob3B0LnJhdyAmJiBvcHQud2luZG93Qml0cyA+IDApIHsKICAgICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7CiAgICB9IGVsc2UgaWYgKG9wdC5nemlwICYmIG9wdC53aW5kb3dCaXRzID4gMCAmJiBvcHQud2luZG93Qml0cyA8IDE2KSB7CiAgICAgIG9wdC53aW5kb3dCaXRzICs9IDE2OwogICAgfQogICAgdGhpcy5lcnIgPSAwOwogICAgdGhpcy5tc2cgPSAiIjsKICAgIHRoaXMuZW5kZWQgPSBmYWxzZTsKICAgIHRoaXMuY2h1bmtzID0gW107CiAgICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSQxKCk7CiAgICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDsKICAgIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKAogICAgICB0aGlzLnN0cm0sCiAgICAgIG9wdC5sZXZlbCwKICAgICAgb3B0Lm1ldGhvZCwKICAgICAgb3B0LndpbmRvd0JpdHMsCiAgICAgIG9wdC5tZW1MZXZlbCwKICAgICAgb3B0LnN0cmF0ZWd5CiAgICApOwogICAgaWYgKHN0YXR1cyAhPT0gWl9PSyQxKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihtc2ckMVtzdGF0dXNdKTsKICAgIH0KICAgIGlmIChvcHQuaGVhZGVyKSB7CiAgICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7CiAgICB9CiAgICBpZiAob3B0LmRpY3Rpb25hcnkpIHsKICAgICAgdmFyIGRpY3Q7CiAgICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZGljdCA9IHN0cmluZ3MkMS5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgfSBlbHNlIGlmICh0b1N0cmluZyQxLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7CiAgICAgIH0KICAgICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7CiAgICAgIGlmIChzdGF0dXMgIT09IFpfT0skMSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihtc2ckMVtzdGF0dXNdKTsKICAgICAgfQogICAgICB0aGlzLl9kaWN0X3NldCA9IHRydWU7CiAgICB9CiAgfQogIERlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihkYXRhLCBtb2RlKSB7CiAgICB2YXIgc3RybSA9IHRoaXMuc3RybTsKICAgIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplOwogICAgdmFyIHN0YXR1cywgX21vZGU7CiAgICBpZiAodGhpcy5lbmRlZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBfbW9kZSA9IG1vZGUgPT09IH5+bW9kZSA/IG1vZGUgOiBtb2RlID09PSB0cnVlID8gWl9GSU5JU0gkMSA6IFpfTk9fRkxVU0g7CiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzJDEuc3RyaW5nMmJ1ZihkYXRhKTsKICAgIH0gZWxzZSBpZiAodG9TdHJpbmckMS5jYWxsKGRhdGEpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CiAgICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cm0uaW5wdXQgPSBkYXRhOwogICAgfQogICAgc3RybS5uZXh0X2luID0gMDsKICAgIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDsKICAgIGRvIHsKICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMkMy5CdWY4KGNodW5rU2l6ZSk7CiAgICAgICAgc3RybS5uZXh0X291dCA9IDA7CiAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7CiAgICAgIH0KICAgICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOwogICAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQkMSAmJiBzdGF0dXMgIT09IFpfT0skMSkgewogICAgICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgICAgICB0aGlzLmVuZGVkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCQxIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MkMS5idWYyYmluc3RyaW5nKHV0aWxzJDMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscyQzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCQxKTsKICAgIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gkMSkgewogICAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pOwogICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7CiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlOwogICAgICByZXR1cm4gc3RhdHVzID09PSBaX09LJDE7CiAgICB9CiAgICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkgewogICAgICB0aGlzLm9uRW5kKFpfT0skMSk7CiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gMDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9OwogIERlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uKGNodW5rKSB7CiAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICB9OwogIERlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24oc3RhdHVzKSB7CiAgICBpZiAoc3RhdHVzID09PSBaX09LJDEpIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oIiIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMkMy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTsKICAgICAgfQogICAgfQogICAgdGhpcy5jaHVua3MgPSBbXTsKICAgIHRoaXMuZXJyID0gc3RhdHVzOwogICAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnOwogIH07CiAgZnVuY3Rpb24gZGVmbGF0ZSQxKGlucHV0LCBvcHRpb25zKSB7CiAgICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTsKICAgIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpOwogICAgaWYgKGRlZmxhdG9yLmVycikgewogICAgICB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnJDFbZGVmbGF0b3IuZXJyXTsKICAgIH0KICAgIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGRlZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy5yYXcgPSB0cnVlOwogICAgcmV0dXJuIGRlZmxhdGUkMShpbnB1dCwgb3B0aW9ucyk7CiAgfQogIGZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy5nemlwID0gdHJ1ZTsKICAgIHJldHVybiBkZWZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpOwogIH0KICBkZWZsYXRlJDQuRGVmbGF0ZSA9IERlZmxhdGU7CiAgZGVmbGF0ZSQ0LmRlZmxhdGUgPSBkZWZsYXRlJDE7CiAgZGVmbGF0ZSQ0LmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3OwogIGRlZmxhdGUkNC5nemlwID0gZ3ppcDsKICB2YXIgaW5mbGF0ZSQ0ID0ge307CiAgdmFyIGluZmxhdGUkMyA9IHt9OwogIHZhciBCQUQkMSA9IDMwOwogIHZhciBUWVBFJDEgPSAxMjsKICB2YXIgaW5mZmFzdCA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdDIoc3RybSwgc3RhcnQpIHsKICAgIHZhciBzdGF0ZTI7CiAgICB2YXIgX2luOwogICAgdmFyIGxhc3Q7CiAgICB2YXIgX291dDsKICAgIHZhciBiZWc7CiAgICB2YXIgZW5kOwogICAgdmFyIGRtYXg7CiAgICB2YXIgd3NpemU7CiAgICB2YXIgd2hhdmU7CiAgICB2YXIgd25leHQ7CiAgICB2YXIgc193aW5kb3c7CiAgICB2YXIgaG9sZDsKICAgIHZhciBiaXRzOwogICAgdmFyIGxjb2RlOwogICAgdmFyIGRjb2RlOwogICAgdmFyIGxtYXNrOwogICAgdmFyIGRtYXNrOwogICAgdmFyIGhlcmU7CiAgICB2YXIgb3A7CiAgICB2YXIgbGVuMjsKICAgIHZhciBkaXN0OwogICAgdmFyIGZyb20yOwogICAgdmFyIGZyb21fc291cmNlOwogICAgdmFyIGlucHV0LCBvdXRwdXQ7CiAgICBzdGF0ZTIgPSBzdHJtLnN0YXRlOwogICAgX2luID0gc3RybS5uZXh0X2luOwogICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7CiAgICBfb3V0ID0gc3RybS5uZXh0X291dDsKICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0OwogICAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTsKICAgIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpOwogICAgZG1heCA9IHN0YXRlMi5kbWF4OwogICAgd3NpemUgPSBzdGF0ZTIud3NpemU7CiAgICB3aGF2ZSA9IHN0YXRlMi53aGF2ZTsKICAgIHduZXh0ID0gc3RhdGUyLnduZXh0OwogICAgc193aW5kb3cgPSBzdGF0ZTIud2luZG93OwogICAgaG9sZCA9IHN0YXRlMi5ob2xkOwogICAgYml0cyA9IHN0YXRlMi5iaXRzOwogICAgbGNvZGUgPSBzdGF0ZTIubGVuY29kZTsKICAgIGRjb2RlID0gc3RhdGUyLmRpc3Rjb2RlOwogICAgbG1hc2sgPSAoMSA8PCBzdGF0ZTIubGVuYml0cykgLSAxOwogICAgZG1hc2sgPSAoMSA8PCBzdGF0ZTIuZGlzdGJpdHMpIC0gMTsKICAgIHRvcDoKICAgICAgZG8gewogICAgICAgIGlmIChiaXRzIDwgMTUpIHsKICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKICAgICAgICBkb2xlbjoKICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICAgIGJpdHMgLT0gb3A7CiAgICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgIGlmIChvcCA9PT0gMCkgewogICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICB9IGVsc2UgaWYgKG9wICYgMTYpIHsKICAgICAgICAgICAgICBsZW4yID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgIG9wICY9IDE1OwogICAgICAgICAgICAgIGlmIChvcCkgewogICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgewogICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZW4yICs9IGhvbGQgJiAoMSA8PCBvcCkgLSAxOwogICAgICAgICAgICAgICAgaG9sZCA+Pj49IG9wOwogICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGJpdHMgPCAxNSkgewogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdOwogICAgICAgICAgICAgIGRvZGlzdDoKICAgICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CiAgICAgICAgICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7CiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgICAgICBvcCAmPSAxNTsKICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgxIDw8IG9wKSAtIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRCQxOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBob2xkID4+Pj0gb3A7CiAgICAgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKICAgICAgICAgICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgewogICAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUyLnNhbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBCQUQkMTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB0b3A7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGZyb20yID0gMDsKICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTIgKz0gd3NpemUgLSBvcDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuMikgewogICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tMisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tMiA9IF9vdXQgLSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHduZXh0IDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTIgKz0gd3NpemUgKyB3bmV4dCAtIG9wOwogICAgICAgICAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuMikgewogICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tMisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tMiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20yID0gX291dCAtIGRpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20yICs9IHduZXh0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbjIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4yIC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTIgPSBfb3V0IC0gZGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbjIgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGxlbjIgLT0gMzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgZnJvbTIgPSBfb3V0IC0gZGlzdDsKICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20yKytdOwogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tMisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuMiAtPSAzOwogICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuMiA+IDIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbjIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbTIrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4yID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20yKytdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDY1NTM1KSArIChob2xkICYgKDEgPDwgb3ApIC0gMSldOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwogICAgICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEJDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgewogICAgICAgICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDY1NTM1KSArIChob2xkICYgKDEgPDwgb3ApIC0gMSldOwogICAgICAgICAgICAgIGNvbnRpbnVlIGRvbGVuOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9wICYgMzIpIHsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IFRZUEUkMTsKICAgICAgICAgICAgICBicmVhayB0b3A7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRCQxOwogICAgICAgICAgICAgIGJyZWFrIHRvcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTsKICAgIGxlbjIgPSBiaXRzID4+IDM7CiAgICBfaW4gLT0gbGVuMjsKICAgIGJpdHMgLT0gbGVuMiA8PCAzOwogICAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7CiAgICBzdHJtLm5leHRfaW4gPSBfaW47CiAgICBzdHJtLm5leHRfb3V0ID0gX291dDsKICAgIHN0cm0uYXZhaWxfaW4gPSBfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCk7CiAgICBzdHJtLmF2YWlsX291dCA9IF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCk7CiAgICBzdGF0ZTIuaG9sZCA9IGhvbGQ7CiAgICBzdGF0ZTIuYml0cyA9IGJpdHM7CiAgICByZXR1cm47CiAgfTsKICB2YXIgdXRpbHMkMiA9IGNvbW1vbiQxOwogIHZhciBNQVhCSVRTID0gMTU7CiAgdmFyIEVOT1VHSF9MRU5TJDEgPSA4NTI7CiAgdmFyIEVOT1VHSF9ESVNUUyQxID0gNTkyOwogIHZhciBDT0RFUyQxID0gMDsKICB2YXIgTEVOUyQxID0gMTsKICB2YXIgRElTVFMkMSA9IDI7CiAgdmFyIGxiYXNlID0gWwogICAgMywKICAgIDQsCiAgICA1LAogICAgNiwKICAgIDcsCiAgICA4LAogICAgOSwKICAgIDEwLAogICAgMTEsCiAgICAxMywKICAgIDE1LAogICAgMTcsCiAgICAxOSwKICAgIDIzLAogICAgMjcsCiAgICAzMSwKICAgIDM1LAogICAgNDMsCiAgICA1MSwKICAgIDU5LAogICAgNjcsCiAgICA4MywKICAgIDk5LAogICAgMTE1LAogICAgMTMxLAogICAgMTYzLAogICAgMTk1LAogICAgMjI3LAogICAgMjU4LAogICAgMCwKICAgIDAKICBdOwogIHZhciBsZXh0ID0gWwogICAgMTYsCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE3LAogICAgMTcsCiAgICAxNywKICAgIDE3LAogICAgMTgsCiAgICAxOCwKICAgIDE4LAogICAgMTgsCiAgICAxOSwKICAgIDE5LAogICAgMTksCiAgICAxOSwKICAgIDIwLAogICAgMjAsCiAgICAyMCwKICAgIDIwLAogICAgMjEsCiAgICAyMSwKICAgIDIxLAogICAgMjEsCiAgICAxNiwKICAgIDcyLAogICAgNzgKICBdOwogIHZhciBkYmFzZSA9IFsKICAgIDEsCiAgICAyLAogICAgMywKICAgIDQsCiAgICA1LAogICAgNywKICAgIDksCiAgICAxMywKICAgIDE3LAogICAgMjUsCiAgICAzMywKICAgIDQ5LAogICAgNjUsCiAgICA5NywKICAgIDEyOSwKICAgIDE5MywKICAgIDI1NywKICAgIDM4NSwKICAgIDUxMywKICAgIDc2OSwKICAgIDEwMjUsCiAgICAxNTM3LAogICAgMjA0OSwKICAgIDMwNzMsCiAgICA0MDk3LAogICAgNjE0NSwKICAgIDgxOTMsCiAgICAxMjI4OSwKICAgIDE2Mzg1LAogICAgMjQ1NzcsCiAgICAwLAogICAgMAogIF07CiAgdmFyIGRleHQgPSBbCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE3LAogICAgMTcsCiAgICAxOCwKICAgIDE4LAogICAgMTksCiAgICAxOSwKICAgIDIwLAogICAgMjAsCiAgICAyMSwKICAgIDIxLAogICAgMjIsCiAgICAyMiwKICAgIDIzLAogICAgMjMsCiAgICAyNCwKICAgIDI0LAogICAgMjUsCiAgICAyNSwKICAgIDI2LAogICAgMjYsCiAgICAyNywKICAgIDI3LAogICAgMjgsCiAgICAyOCwKICAgIDI5LAogICAgMjksCiAgICA2NCwKICAgIDY0CiAgXTsKICB2YXIgaW5mdHJlZXMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlMih0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlczIsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cykgewogICAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7CiAgICB2YXIgbGVuMiA9IDA7CiAgICB2YXIgc3ltID0gMDsKICAgIHZhciBtaW4gPSAwLCBtYXggPSAwOwogICAgdmFyIHJvb3QyID0gMDsKICAgIHZhciBjdXJyID0gMDsKICAgIHZhciBkcm9wID0gMDsKICAgIHZhciBsZWZ0ID0gMDsKICAgIHZhciB1c2VkID0gMDsKICAgIHZhciBodWZmID0gMDsKICAgIHZhciBpbmNyOwogICAgdmFyIGZpbGw7CiAgICB2YXIgbG93OwogICAgdmFyIG1hc2s7CiAgICB2YXIgbmV4dDsKICAgIHZhciBiYXNlID0gbnVsbDsKICAgIHZhciBiYXNlX2luZGV4ID0gMDsKICAgIHZhciBlbmQ7CiAgICB2YXIgY291bnQgPSBuZXcgdXRpbHMkMi5CdWYxNihNQVhCSVRTICsgMSk7CiAgICB2YXIgb2ZmcyA9IG5ldyB1dGlscyQyLkJ1ZjE2KE1BWEJJVFMgKyAxKTsKICAgIHZhciBleHRyYSA9IG51bGw7CiAgICB2YXIgZXh0cmFfaW5kZXggPSAwOwogICAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7CiAgICBmb3IgKGxlbjIgPSAwOyBsZW4yIDw9IE1BWEJJVFM7IGxlbjIrKykgewogICAgICBjb3VudFtsZW4yXSA9IDA7CiAgICB9CiAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzMjsgc3ltKyspIHsKICAgICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKzsKICAgIH0KICAgIHJvb3QyID0gYml0czsKICAgIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7CiAgICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChyb290MiA+IG1heCkgewogICAgICByb290MiA9IG1heDsKICAgIH0KICAgIGlmIChtYXggPT09IDApIHsKICAgICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAxIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9IDEgPDwgMjQgfCA2NCA8PCAxNiB8IDA7CiAgICAgIG9wdHMuYml0cyA9IDE7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7CiAgICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChyb290MiA8IG1pbikgewogICAgICByb290MiA9IG1pbjsKICAgIH0KICAgIGxlZnQgPSAxOwogICAgZm9yIChsZW4yID0gMTsgbGVuMiA8PSBNQVhCSVRTOyBsZW4yKyspIHsKICAgICAgbGVmdCA8PD0gMTsKICAgICAgbGVmdCAtPSBjb3VudFtsZW4yXTsKICAgICAgaWYgKGxlZnQgPCAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICB9CiAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTJDEgfHwgbWF4ICE9PSAxKSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBvZmZzWzFdID0gMDsKICAgIGZvciAobGVuMiA9IDE7IGxlbjIgPCBNQVhCSVRTOyBsZW4yKyspIHsKICAgICAgb2Zmc1tsZW4yICsgMV0gPSBvZmZzW2xlbjJdICsgY291bnRbbGVuMl07CiAgICB9CiAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzMjsgc3ltKyspIHsKICAgICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHsKICAgICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlID09PSBDT0RFUyQxKSB7CiAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7CiAgICAgIGVuZCA9IDE5OwogICAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TJDEpIHsKICAgICAgYmFzZSA9IGxiYXNlOwogICAgICBiYXNlX2luZGV4IC09IDI1NzsKICAgICAgZXh0cmEgPSBsZXh0OwogICAgICBleHRyYV9pbmRleCAtPSAyNTc7CiAgICAgIGVuZCA9IDI1NjsKICAgIH0gZWxzZSB7CiAgICAgIGJhc2UgPSBkYmFzZTsKICAgICAgZXh0cmEgPSBkZXh0OwogICAgICBlbmQgPSAtMTsKICAgIH0KICAgIGh1ZmYgPSAwOwogICAgc3ltID0gMDsKICAgIGxlbjIgPSBtaW47CiAgICBuZXh0ID0gdGFibGVfaW5kZXg7CiAgICBjdXJyID0gcm9vdDI7CiAgICBkcm9wID0gMDsKICAgIGxvdyA9IC0xOwogICAgdXNlZCA9IDEgPDwgcm9vdDI7CiAgICBtYXNrID0gdXNlZCAtIDE7CiAgICBpZiAodHlwZSA9PT0gTEVOUyQxICYmIHVzZWQgPiBFTk9VR0hfTEVOUyQxIHx8IHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgZm9yICg7IDsgKSB7CiAgICAgIGhlcmVfYml0cyA9IGxlbjIgLSBkcm9wOwogICAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7CiAgICAgICAgaGVyZV9vcCA9IDA7CiAgICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07CiAgICAgIH0gZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7CiAgICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTsKICAgICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7CiAgICAgICAgaGVyZV92YWwgPSAwOwogICAgICB9CiAgICAgIGluY3IgPSAxIDw8IGxlbjIgLSBkcm9wOwogICAgICBmaWxsID0gMSA8PCBjdXJyOwogICAgICBtaW4gPSBmaWxsOwogICAgICBkbyB7CiAgICAgICAgZmlsbCAtPSBpbmNyOwogICAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gaGVyZV9iaXRzIDw8IDI0IHwgaGVyZV9vcCA8PCAxNiB8IGhlcmVfdmFsIHwgMDsKICAgICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7CiAgICAgIGluY3IgPSAxIDw8IGxlbjIgLSAxOwogICAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHsKICAgICAgICBpbmNyID4+PSAxOwogICAgICB9CiAgICAgIGlmIChpbmNyICE9PSAwKSB7CiAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKICAgICAgICBodWZmICs9IGluY3I7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaHVmZiA9IDA7CiAgICAgIH0KICAgICAgc3ltKys7CiAgICAgIGlmICgtLWNvdW50W2xlbjJdID09PSAwKSB7CiAgICAgICAgaWYgKGxlbjIgPT09IG1heCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxlbjIgPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dOwogICAgICB9CiAgICAgIGlmIChsZW4yID4gcm9vdDIgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7CiAgICAgICAgaWYgKGRyb3AgPT09IDApIHsKICAgICAgICAgIGRyb3AgPSByb290MjsKICAgICAgICB9CiAgICAgICAgbmV4dCArPSBtaW47CiAgICAgICAgY3VyciA9IGxlbjIgLSBkcm9wOwogICAgICAgIGxlZnQgPSAxIDw8IGN1cnI7CiAgICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7CiAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKICAgICAgICAgIGlmIChsZWZ0IDw9IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyKys7CiAgICAgICAgICBsZWZ0IDw8PSAxOwogICAgICAgIH0KICAgICAgICB1c2VkICs9IDEgPDwgY3VycjsKICAgICAgICBpZiAodHlwZSA9PT0gTEVOUyQxICYmIHVzZWQgPiBFTk9VR0hfTEVOUyQxIHx8IHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgbG93ID0gaHVmZiAmIG1hc2s7CiAgICAgICAgdGFibGVbbG93XSA9IHJvb3QyIDw8IDI0IHwgY3VyciA8PCAxNiB8IG5leHQgLSB0YWJsZV9pbmRleCB8IDA7CiAgICAgIH0KICAgIH0KICAgIGlmIChodWZmICE9PSAwKSB7CiAgICAgIHRhYmxlW25leHQgKyBodWZmXSA9IGxlbjIgLSBkcm9wIDw8IDI0IHwgNjQgPDwgMTYgfCAwOwogICAgfQogICAgb3B0cy5iaXRzID0gcm9vdDI7CiAgICByZXR1cm4gMDsKICB9OwogIHZhciB1dGlscyQxID0gY29tbW9uJDE7CiAgdmFyIGFkbGVyMzIgPSBhZGxlcjMyXzE7CiAgdmFyIGNyYzMyID0gY3JjMzJfMTsKICB2YXIgaW5mbGF0ZV9mYXN0ID0gaW5mZmFzdDsKICB2YXIgaW5mbGF0ZV90YWJsZSA9IGluZnRyZWVzOwogIHZhciBDT0RFUyA9IDA7CiAgdmFyIExFTlMgPSAxOwogIHZhciBESVNUUyA9IDI7CiAgdmFyIFpfRklOSVNIID0gNDsKICB2YXIgWl9CTE9DSyA9IDU7CiAgdmFyIFpfVFJFRVMgPSA2OwogIHZhciBaX09LID0gMDsKICB2YXIgWl9TVFJFQU1fRU5EID0gMTsKICB2YXIgWl9ORUVEX0RJQ1QgPSAyOwogIHZhciBaX1NUUkVBTV9FUlJPUiA9IC0yOwogIHZhciBaX0RBVEFfRVJST1IgPSAtMzsKICB2YXIgWl9NRU1fRVJST1IgPSAtNDsKICB2YXIgWl9CVUZfRVJST1IgPSAtNTsKICB2YXIgWl9ERUZMQVRFRCA9IDg7CiAgdmFyIEhFQUQgPSAxOwogIHZhciBGTEFHUyA9IDI7CiAgdmFyIFRJTUUgPSAzOwogIHZhciBPUyA9IDQ7CiAgdmFyIEVYTEVOID0gNTsKICB2YXIgRVhUUkEgPSA2OwogIHZhciBOQU1FID0gNzsKICB2YXIgQ09NTUVOVCA9IDg7CiAgdmFyIEhDUkMgPSA5OwogIHZhciBESUNUSUQgPSAxMDsKICB2YXIgRElDVCA9IDExOwogIHZhciBUWVBFID0gMTI7CiAgdmFyIFRZUEVETyA9IDEzOwogIHZhciBTVE9SRUQgPSAxNDsKICB2YXIgQ09QWV8gPSAxNTsKICB2YXIgQ09QWSA9IDE2OwogIHZhciBUQUJMRSA9IDE3OwogIHZhciBMRU5MRU5TID0gMTg7CiAgdmFyIENPREVMRU5TID0gMTk7CiAgdmFyIExFTl8gPSAyMDsKICB2YXIgTEVOID0gMjE7CiAgdmFyIExFTkVYVCA9IDIyOwogIHZhciBESVNUID0gMjM7CiAgdmFyIERJU1RFWFQgPSAyNDsKICB2YXIgTUFUQ0ggPSAyNTsKICB2YXIgTElUID0gMjY7CiAgdmFyIENIRUNLID0gMjc7CiAgdmFyIExFTkdUSCA9IDI4OwogIHZhciBET05FID0gMjk7CiAgdmFyIEJBRCA9IDMwOwogIHZhciBNRU0gPSAzMTsKICB2YXIgU1lOQyA9IDMyOwogIHZhciBFTk9VR0hfTEVOUyA9IDg1MjsKICB2YXIgRU5PVUdIX0RJU1RTID0gNTkyOwogIHZhciBNQVhfV0JJVFMgPSAxNTsKICB2YXIgREVGX1dCSVRTID0gTUFYX1dCSVRTOwogIGZ1bmN0aW9uIHpzd2FwMzIocTIpIHsKICAgIHJldHVybiAocTIgPj4+IDI0ICYgMjU1KSArIChxMiA+Pj4gOCAmIDY1MjgwKSArICgocTIgJiA2NTI4MCkgPDwgOCkgKyAoKHEyICYgMjU1KSA8PCAyNCk7CiAgfQogIGZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHsKICAgIHRoaXMubW9kZSA9IDA7CiAgICB0aGlzLmxhc3QgPSBmYWxzZTsKICAgIHRoaXMud3JhcCA9IDA7CiAgICB0aGlzLmhhdmVkaWN0ID0gZmFsc2U7CiAgICB0aGlzLmZsYWdzID0gMDsKICAgIHRoaXMuZG1heCA9IDA7CiAgICB0aGlzLmNoZWNrID0gMDsKICAgIHRoaXMudG90YWwgPSAwOwogICAgdGhpcy5oZWFkID0gbnVsbDsKICAgIHRoaXMud2JpdHMgPSAwOwogICAgdGhpcy53c2l6ZSA9IDA7CiAgICB0aGlzLndoYXZlID0gMDsKICAgIHRoaXMud25leHQgPSAwOwogICAgdGhpcy53aW5kb3cgPSBudWxsOwogICAgdGhpcy5ob2xkID0gMDsKICAgIHRoaXMuYml0cyA9IDA7CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB0aGlzLmV4dHJhID0gMDsKICAgIHRoaXMubGVuY29kZSA9IG51bGw7CiAgICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsKICAgIHRoaXMubGVuYml0cyA9IDA7CiAgICB0aGlzLmRpc3RiaXRzID0gMDsKICAgIHRoaXMubmNvZGUgPSAwOwogICAgdGhpcy5ubGVuID0gMDsKICAgIHRoaXMubmRpc3QgPSAwOwogICAgdGhpcy5oYXZlID0gMDsKICAgIHRoaXMubmV4dCA9IG51bGw7CiAgICB0aGlzLmxlbnMgPSBuZXcgdXRpbHMkMS5CdWYxNigzMjApOwogICAgdGhpcy53b3JrID0gbmV3IHV0aWxzJDEuQnVmMTYoMjg4KTsKICAgIHRoaXMubGVuZHluID0gbnVsbDsKICAgIHRoaXMuZGlzdGR5biA9IG51bGw7CiAgICB0aGlzLnNhbmUgPSAwOwogICAgdGhpcy5iYWNrID0gMDsKICAgIHRoaXMud2FzID0gMDsKICB9CiAgZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7CiAgICB2YXIgc3RhdGUyOwogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICAgIHN0YXRlMiA9IHN0cm0uc3RhdGU7CiAgICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZTIudG90YWwgPSAwOwogICAgc3RybS5tc2cgPSAiIjsKICAgIGlmIChzdGF0ZTIud3JhcCkgewogICAgICBzdHJtLmFkbGVyID0gc3RhdGUyLndyYXAgJiAxOwogICAgfQogICAgc3RhdGUyLm1vZGUgPSBIRUFEOwogICAgc3RhdGUyLmxhc3QgPSAwOwogICAgc3RhdGUyLmhhdmVkaWN0ID0gMDsKICAgIHN0YXRlMi5kbWF4ID0gMzI3Njg7CiAgICBzdGF0ZTIuaGVhZCA9IG51bGw7CiAgICBzdGF0ZTIuaG9sZCA9IDA7CiAgICBzdGF0ZTIuYml0cyA9IDA7CiAgICBzdGF0ZTIubGVuY29kZSA9IHN0YXRlMi5sZW5keW4gPSBuZXcgdXRpbHMkMS5CdWYzMihFTk9VR0hfTEVOUyk7CiAgICBzdGF0ZTIuZGlzdGNvZGUgPSBzdGF0ZTIuZGlzdGR5biA9IG5ldyB1dGlscyQxLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7CiAgICBzdGF0ZTIuc2FuZSA9IDE7CiAgICBzdGF0ZTIuYmFjayA9IC0xOwogICAgcmV0dXJuIFpfT0s7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7CiAgICB2YXIgc3RhdGUyOwogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICAgIHN0YXRlMiA9IHN0cm0uc3RhdGU7CiAgICBzdGF0ZTIud3NpemUgPSAwOwogICAgc3RhdGUyLndoYXZlID0gMDsKICAgIHN0YXRlMi53bmV4dCA9IDA7CiAgICByZXR1cm4gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKTsKICB9CiAgZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7CiAgICB2YXIgd3JhcDsKICAgIHZhciBzdGF0ZTI7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUyID0gc3RybS5zdGF0ZTsKICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgewogICAgICB3cmFwID0gMDsKICAgICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzOwogICAgfSBlbHNlIHsKICAgICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTsKICAgICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkgewogICAgICAgIHdpbmRvd0JpdHMgJj0gMTU7CiAgICAgIH0KICAgIH0KICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICAgIGlmIChzdGF0ZTIud2luZG93ICE9PSBudWxsICYmIHN0YXRlMi53Yml0cyAhPT0gd2luZG93Qml0cykgewogICAgICBzdGF0ZTIud2luZG93ID0gbnVsbDsKICAgIH0KICAgIHN0YXRlMi53cmFwID0gd3JhcDsKICAgIHN0YXRlMi53Yml0cyA9IHdpbmRvd0JpdHM7CiAgICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pOwogIH0KICBmdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgewogICAgdmFyIHJldDsKICAgIHZhciBzdGF0ZTI7CiAgICBpZiAoIXN0cm0pIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUyID0gbmV3IEluZmxhdGVTdGF0ZSgpOwogICAgc3RybS5zdGF0ZSA9IHN0YXRlMjsKICAgIHN0YXRlMi53aW5kb3cgPSBudWxsOwogICAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKICAgIGlmIChyZXQgIT09IFpfT0spIHsKICAgICAgc3RybS5zdGF0ZSA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gcmV0OwogIH0KICBmdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7CiAgICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7CiAgfQogIHZhciB2aXJnaW4gPSB0cnVlOwogIHZhciBsZW5maXgsIGRpc3RmaXg7CiAgZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUyKSB7CiAgICBpZiAodmlyZ2luKSB7CiAgICAgIHZhciBzeW07CiAgICAgIGxlbmZpeCA9IG5ldyB1dGlscyQxLkJ1ZjMyKDUxMik7CiAgICAgIGRpc3RmaXggPSBuZXcgdXRpbHMkMS5CdWYzMigzMik7CiAgICAgIHN5bSA9IDA7CiAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHsKICAgICAgICBzdGF0ZTIubGVuc1tzeW0rK10gPSA4OwogICAgICB9CiAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHsKICAgICAgICBzdGF0ZTIubGVuc1tzeW0rK10gPSA5OwogICAgICB9CiAgICAgIHdoaWxlIChzeW0gPCAyODApIHsKICAgICAgICBzdGF0ZTIubGVuc1tzeW0rK10gPSA3OwogICAgICB9CiAgICAgIHdoaWxlIChzeW0gPCAyODgpIHsKICAgICAgICBzdGF0ZTIubGVuc1tzeW0rK10gPSA4OwogICAgICB9CiAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUyLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAwLCBzdGF0ZTIud29yaywgeyBiaXRzOiA5IH0pOwogICAgICBzeW0gPSAwOwogICAgICB3aGlsZSAoc3ltIDwgMzIpIHsKICAgICAgICBzdGF0ZTIubGVuc1tzeW0rK10gPSA1OwogICAgICB9CiAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlMi5sZW5zLCAwLCAzMiwgZGlzdGZpeCwgMCwgc3RhdGUyLndvcmssIHsgYml0czogNSB9KTsKICAgICAgdmlyZ2luID0gZmFsc2U7CiAgICB9CiAgICBzdGF0ZTIubGVuY29kZSA9IGxlbmZpeDsKICAgIHN0YXRlMi5sZW5iaXRzID0gOTsKICAgIHN0YXRlMi5kaXN0Y29kZSA9IGRpc3RmaXg7CiAgICBzdGF0ZTIuZGlzdGJpdHMgPSA1OwogIH0KICBmdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHsKICAgIHZhciBkaXN0OwogICAgdmFyIHN0YXRlMiA9IHN0cm0uc3RhdGU7CiAgICBpZiAoc3RhdGUyLndpbmRvdyA9PT0gbnVsbCkgewogICAgICBzdGF0ZTIud3NpemUgPSAxIDw8IHN0YXRlMi53Yml0czsKICAgICAgc3RhdGUyLnduZXh0ID0gMDsKICAgICAgc3RhdGUyLndoYXZlID0gMDsKICAgICAgc3RhdGUyLndpbmRvdyA9IG5ldyB1dGlscyQxLkJ1Zjgoc3RhdGUyLndzaXplKTsKICAgIH0KICAgIGlmIChjb3B5ID49IHN0YXRlMi53c2l6ZSkgewogICAgICB1dGlscyQxLmFycmF5U2V0KHN0YXRlMi53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUyLndzaXplLCBzdGF0ZTIud3NpemUsIDApOwogICAgICBzdGF0ZTIud25leHQgPSAwOwogICAgICBzdGF0ZTIud2hhdmUgPSBzdGF0ZTIud3NpemU7CiAgICB9IGVsc2UgewogICAgICBkaXN0ID0gc3RhdGUyLndzaXplIC0gc3RhdGUyLnduZXh0OwogICAgICBpZiAoZGlzdCA+IGNvcHkpIHsKICAgICAgICBkaXN0ID0gY29weTsKICAgICAgfQogICAgICB1dGlscyQxLmFycmF5U2V0KHN0YXRlMi53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUyLnduZXh0KTsKICAgICAgY29weSAtPSBkaXN0OwogICAgICBpZiAoY29weSkgewogICAgICAgIHV0aWxzJDEuYXJyYXlTZXQoc3RhdGUyLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTsKICAgICAgICBzdGF0ZTIud25leHQgPSBjb3B5OwogICAgICAgIHN0YXRlMi53aGF2ZSA9IHN0YXRlMi53c2l6ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZTIud25leHQgKz0gZGlzdDsKICAgICAgICBpZiAoc3RhdGUyLnduZXh0ID09PSBzdGF0ZTIud3NpemUpIHsKICAgICAgICAgIHN0YXRlMi53bmV4dCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZTIud2hhdmUgPCBzdGF0ZTIud3NpemUpIHsKICAgICAgICAgIHN0YXRlMi53aGF2ZSArPSBkaXN0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGUkMihzdHJtLCBmbHVzaCkgewogICAgdmFyIHN0YXRlMjsKICAgIHZhciBpbnB1dCwgb3V0cHV0OwogICAgdmFyIG5leHQ7CiAgICB2YXIgcHV0OwogICAgdmFyIGhhdmUsIGxlZnQ7CiAgICB2YXIgaG9sZDsKICAgIHZhciBiaXRzOwogICAgdmFyIF9pbiwgX291dDsKICAgIHZhciBjb3B5OwogICAgdmFyIGZyb20yOwogICAgdmFyIGZyb21fc291cmNlOwogICAgdmFyIGhlcmUgPSAwOwogICAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7CiAgICB2YXIgbGFzdF9iaXRzLCBsYXN0X29wLCBsYXN0X3ZhbDsKICAgIHZhciBsZW4yOwogICAgdmFyIHJldDsKICAgIHZhciBoYnVmID0gbmV3IHV0aWxzJDEuQnVmOCg0KTsKICAgIHZhciBvcHRzOwogICAgdmFyIG47CiAgICB2YXIgb3JkZXIgPSBbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV07CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8ICFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUyID0gc3RybS5zdGF0ZTsKICAgIGlmIChzdGF0ZTIubW9kZSA9PT0gVFlQRSkgewogICAgICBzdGF0ZTIubW9kZSA9IFRZUEVETzsKICAgIH0KICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7CiAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDsKICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDsKICAgIG5leHQgPSBzdHJtLm5leHRfaW47CiAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7CiAgICBoYXZlID0gc3RybS5hdmFpbF9pbjsKICAgIGhvbGQgPSBzdGF0ZTIuaG9sZDsKICAgIGJpdHMgPSBzdGF0ZTIuYml0czsKICAgIF9pbiA9IGhhdmU7CiAgICBfb3V0ID0gbGVmdDsKICAgIHJldCA9IFpfT0s7CiAgICBpbmZfbGVhdmU6CiAgICAgIGZvciAoOyA7ICkgewogICAgICAgIHN3aXRjaCAoc3RhdGUyLm1vZGUpIHsKICAgICAgICAgIGNhc2UgSEVBRDoKICAgICAgICAgICAgaWYgKHN0YXRlMi53cmFwID09PSAwKSB7CiAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBUWVBFRE87CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlMi53cmFwICYgMiAmJiBob2xkID09PSAzNTYxNSkgewogICAgICAgICAgICAgIHN0YXRlMi5jaGVjayA9IDA7CiAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgc3RhdGUyLmNoZWNrID0gY3JjMzIoc3RhdGUyLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEZMQUdTOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5mbGFncyA9IDA7CiAgICAgICAgICAgIGlmIChzdGF0ZTIuaGVhZCkgewogICAgICAgICAgICAgIHN0YXRlMi5oZWFkLmRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShzdGF0ZTIud3JhcCAmIDEpIHx8ICgoKGhvbGQgJiAyNTUpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGhvbGQgJiAxNSkgIT09IFpfREVGTEFURUQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CiAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaG9sZCA+Pj49IDQ7CiAgICAgICAgICAgIGJpdHMgLT0gNDsKICAgICAgICAgICAgbGVuMiA9IChob2xkICYgMTUpICsgODsKICAgICAgICAgICAgaWYgKHN0YXRlMi53Yml0cyA9PT0gMCkgewogICAgICAgICAgICAgIHN0YXRlMi53Yml0cyA9IGxlbjI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuMiA+IHN0YXRlMi53Yml0cykgewogICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgd2luZG93IHNpemUiOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5kbWF4ID0gMSA8PCBsZW4yOwogICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUyLmNoZWNrID0gMTsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBob2xkICYgNTEyID8gRElDVElEIDogVFlQRTsKICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgRkxBR1M6CiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5mbGFncyA9IGhvbGQ7CiAgICAgICAgICAgIGlmICgoc3RhdGUyLmZsYWdzICYgMjU1KSAhPT0gWl9ERUZMQVRFRCkgewogICAgICAgICAgICAgIHN0cm0ubXNnID0gInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUyLmZsYWdzICYgNTczNDQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZTIuaGVhZCkgewogICAgICAgICAgICAgIHN0YXRlMi5oZWFkLnRleHQgPSBob2xkID4+IDggJiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZTIuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICBoYnVmWzFdID0gaG9sZCA+Pj4gOCAmIDI1NTsKICAgICAgICAgICAgICBzdGF0ZTIuY2hlY2sgPSBjcmMzMihzdGF0ZTIuY2hlY2ssIGhidWYsIDIsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBUSU1FOwogICAgICAgICAgY2FzZSBUSU1FOgogICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUyLmhlYWQpIHsKICAgICAgICAgICAgICBzdGF0ZTIuaGVhZC50aW1lID0gaG9sZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUyLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsxXSA9IGhvbGQgPj4+IDggJiAyNTU7CiAgICAgICAgICAgICAgaGJ1ZlsyXSA9IGhvbGQgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgIGhidWZbM10gPSBob2xkID4+PiAyNCAmIDI1NTsKICAgICAgICAgICAgICBzdGF0ZTIuY2hlY2sgPSBjcmMzMihzdGF0ZTIuY2hlY2ssIGhidWYsIDQsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBPUzsKICAgICAgICAgIGNhc2UgT1M6CiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZTIuaGVhZCkgewogICAgICAgICAgICAgIHN0YXRlMi5oZWFkLnhmbGFncyA9IGhvbGQgJiAyNTU7CiAgICAgICAgICAgICAgc3RhdGUyLmhlYWQub3MgPSBob2xkID4+IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlMi5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMjU1OwogICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgIHN0YXRlMi5jaGVjayA9IGNyYzMyKHN0YXRlMi5jaGVjaywgaGJ1ZiwgMiwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEVYTEVOOwogICAgICAgICAgY2FzZSBFWExFTjoKICAgICAgICAgICAgaWYgKHN0YXRlMi5mbGFncyAmIDEwMjQpIHsKICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RhdGUyLmxlbmd0aCA9IGhvbGQ7CiAgICAgICAgICAgICAgaWYgKHN0YXRlMi5oZWFkKSB7CiAgICAgICAgICAgICAgICBzdGF0ZTIuaGVhZC5leHRyYV9sZW4gPSBob2xkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc3RhdGUyLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDI1NTsKICAgICAgICAgICAgICAgIGhidWZbMV0gPSBob2xkID4+PiA4ICYgMjU1OwogICAgICAgICAgICAgICAgc3RhdGUyLmNoZWNrID0gY3JjMzIoc3RhdGUyLmNoZWNrLCBoYnVmLCAyLCAwKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUyLmhlYWQpIHsKICAgICAgICAgICAgICBzdGF0ZTIuaGVhZC5leHRyYSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBFWFRSQTsKICAgICAgICAgIGNhc2UgRVhUUkE6CiAgICAgICAgICAgIGlmIChzdGF0ZTIuZmxhZ3MgJiAxMDI0KSB7CiAgICAgICAgICAgICAgY29weSA9IHN0YXRlMi5sZW5ndGg7CiAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7CiAgICAgICAgICAgICAgICBjb3B5ID0gaGF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZTIuaGVhZCkgewogICAgICAgICAgICAgICAgICBsZW4yID0gc3RhdGUyLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUyLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZTIuaGVhZC5leHRyYSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlMi5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlMi5oZWFkLmV4dHJhX2xlbik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdXRpbHMkMS5hcnJheVNldCgKICAgICAgICAgICAgICAgICAgICBzdGF0ZTIuaGVhZC5leHRyYSwKICAgICAgICAgICAgICAgICAgICBpbnB1dCwKICAgICAgICAgICAgICAgICAgICBuZXh0LAogICAgICAgICAgICAgICAgICAgIGNvcHksCiAgICAgICAgICAgICAgICAgICAgbGVuMgogICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlMi5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgICAgICBzdGF0ZTIuY2hlY2sgPSBjcmMzMihzdGF0ZTIuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKICAgICAgICAgICAgICAgIHN0YXRlMi5sZW5ndGggLT0gY29weTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0YXRlMi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gTkFNRTsKICAgICAgICAgIGNhc2UgTkFNRToKICAgICAgICAgICAgaWYgKHN0YXRlMi5mbGFncyAmIDIwNDgpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb3B5ID0gMDsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBsZW4yID0gaW5wdXRbbmV4dCArIGNvcHkrK107CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUyLmhlYWQgJiYgbGVuMiAmJiBzdGF0ZTIubGVuZ3RoIDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICAgc3RhdGUyLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbjIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gd2hpbGUgKGxlbjIgJiYgY29weSA8IGhhdmUpOwogICAgICAgICAgICAgIGlmIChzdGF0ZTIuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICAgIHN0YXRlMi5jaGVjayA9IGNyYzMyKHN0YXRlMi5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgICAgICAgIGlmIChsZW4yKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMi5oZWFkKSB7CiAgICAgICAgICAgICAgc3RhdGUyLmhlYWQubmFtZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQ09NTUVOVDsKICAgICAgICAgIGNhc2UgQ09NTUVOVDoKICAgICAgICAgICAgaWYgKHN0YXRlMi5mbGFncyAmIDQwOTYpIHsKICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb3B5ID0gMDsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBsZW4yID0gaW5wdXRbbmV4dCArIGNvcHkrK107CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUyLmhlYWQgJiYgbGVuMiAmJiBzdGF0ZTIubGVuZ3RoIDwgNjU1MzYpIHsKICAgICAgICAgICAgICAgICAgc3RhdGUyLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbjIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gd2hpbGUgKGxlbjIgJiYgY29weSA8IGhhdmUpOwogICAgICAgICAgICAgIGlmIChzdGF0ZTIuZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgICAgIHN0YXRlMi5jaGVjayA9IGNyYzMyKHN0YXRlMi5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CiAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwogICAgICAgICAgICAgIGlmIChsZW4yKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMi5oZWFkKSB7CiAgICAgICAgICAgICAgc3RhdGUyLmhlYWQuY29tbWVudCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBIQ1JDOwogICAgICAgICAgY2FzZSBIQ1JDOgogICAgICAgICAgICBpZiAoc3RhdGUyLmZsYWdzICYgNTEyKSB7CiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikgewogICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUyLmNoZWNrICYgNjU1MzUpKSB7CiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJoZWFkZXIgY3JjIG1pc21hdGNoIjsKICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZTIuaGVhZCkgewogICAgICAgICAgICAgIHN0YXRlMi5oZWFkLmhjcmMgPSBzdGF0ZTIuZmxhZ3MgPj4gOSAmIDE7CiAgICAgICAgICAgICAgc3RhdGUyLmhlYWQuZG9uZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlMi5jaGVjayA9IDA7CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERJQ1RJRDoKICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlMi5jaGVjayA9IHpzd2FwMzIoaG9sZCk7CiAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICBiaXRzID0gMDsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBESUNUOwogICAgICAgICAgY2FzZSBESUNUOgogICAgICAgICAgICBpZiAoc3RhdGUyLmhhdmVkaWN0ID09PSAwKSB7CiAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDsKICAgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgICAgICAgICAgICBzdGF0ZTIuaG9sZCA9IGhvbGQ7CiAgICAgICAgICAgICAgc3RhdGUyLmJpdHMgPSBiaXRzOwogICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUyLmNoZWNrID0gMTsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBUWVBFOwogICAgICAgICAgY2FzZSBUWVBFOgogICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsKICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgVFlQRURPOgogICAgICAgICAgICBpZiAoc3RhdGUyLmxhc3QpIHsKICAgICAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7CiAgICAgICAgICAgICAgYml0cyAtPSBiaXRzICYgNzsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IENIRUNLOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMykgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLmxhc3QgPSBob2xkICYgMTsKICAgICAgICAgICAgaG9sZCA+Pj49IDE7CiAgICAgICAgICAgIGJpdHMgLT0gMTsKICAgICAgICAgICAgc3dpdGNoIChob2xkICYgMykgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gU1RPUkVEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUyKTsKICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gTEVOXzsKICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gMjsKICAgICAgICAgICAgICAgICAgYml0cyAtPSAyOwogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IFRBQkxFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBibG9jayB0eXBlIjsKICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBTVE9SRUQ6CiAgICAgICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNzsKICAgICAgICAgICAgYml0cyAtPSBiaXRzICYgNzsKICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikgewogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChob2xkICYgNjU1MzUpICE9PSAoaG9sZCA+Pj4gMTYgXiA2NTUzNSkpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTIubGVuZ3RoID0gaG9sZCAmIDY1NTM1OwogICAgICAgICAgICBob2xkID0gMDsKICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQ09QWV87CiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgewogICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBDT1BZXzoKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBDT1BZOwogICAgICAgICAgY2FzZSBDT1BZOgogICAgICAgICAgICBjb3B5ID0gc3RhdGUyLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGNvcHkpIHsKICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBoYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsKICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoY29weSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1dGlscyQxLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7CiAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OwogICAgICAgICAgICAgIG5leHQgKz0gY29weTsKICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CiAgICAgICAgICAgICAgcHV0ICs9IGNvcHk7CiAgICAgICAgICAgICAgc3RhdGUyLmxlbmd0aCAtPSBjb3B5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFRBQkxFOgogICAgICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7CiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTIubmxlbiA9IChob2xkICYgMzEpICsgMjU3OwogICAgICAgICAgICBob2xkID4+Pj0gNTsKICAgICAgICAgICAgYml0cyAtPSA1OwogICAgICAgICAgICBzdGF0ZTIubmRpc3QgPSAoaG9sZCAmIDMxKSArIDE7CiAgICAgICAgICAgIGhvbGQgPj4+PSA1OwogICAgICAgICAgICBiaXRzIC09IDU7CiAgICAgICAgICAgIHN0YXRlMi5uY29kZSA9IChob2xkICYgMTUpICsgNDsKICAgICAgICAgICAgaG9sZCA+Pj49IDQ7CiAgICAgICAgICAgIGJpdHMgLT0gNDsKICAgICAgICAgICAgaWYgKHN0YXRlMi5ubGVuID4gMjg2IHx8IHN0YXRlMi5uZGlzdCA+IDMwKSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5oYXZlID0gMDsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBMRU5MRU5TOwogICAgICAgICAgY2FzZSBMRU5MRU5TOgogICAgICAgICAgICB3aGlsZSAoc3RhdGUyLmhhdmUgPCBzdGF0ZTIubmNvZGUpIHsKICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHsKICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGF0ZTIubGVuc1tvcmRlcltzdGF0ZTIuaGF2ZSsrXV0gPSBob2xkICYgNzsKICAgICAgICAgICAgICBob2xkID4+Pj0gMzsKICAgICAgICAgICAgICBiaXRzIC09IDM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHN0YXRlMi5oYXZlIDwgMTkpIHsKICAgICAgICAgICAgICBzdGF0ZTIubGVuc1tvcmRlcltzdGF0ZTIuaGF2ZSsrXV0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5sZW5jb2RlID0gc3RhdGUyLmxlbmR5bjsKICAgICAgICAgICAgc3RhdGUyLmxlbmJpdHMgPSA3OwogICAgICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZTIubGVuYml0cyB9OwogICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZTIubGVucywgMCwgMTksIHN0YXRlMi5sZW5jb2RlLCAwLCBzdGF0ZTIud29yaywgb3B0cyk7CiAgICAgICAgICAgIHN0YXRlMi5sZW5iaXRzID0gb3B0cy5iaXRzOwogICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTIuaGF2ZSA9IDA7CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQ09ERUxFTlM7CiAgICAgICAgICBjYXNlIENPREVMRU5TOgogICAgICAgICAgICB3aGlsZSAoc3RhdGUyLmhhdmUgPCBzdGF0ZTIubmxlbiArIHN0YXRlMi5uZGlzdCkgewogICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlMi5sZW5jb2RlW2hvbGQgJiAoMSA8PCBzdGF0ZTIubGVuYml0cykgLSAxXTsKICAgICAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICAgICAgaGVyZV9vcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgNjU1MzU7CiAgICAgICAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHsKICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgIHN0YXRlMi5sZW5zW3N0YXRlMi5oYXZlKytdID0gaGVyZV92YWw7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHsKICAgICAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7CiAgICAgICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZTIuaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOwogICAgICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGxlbjIgPSBzdGF0ZTIubGVuc1tzdGF0ZTIuaGF2ZSAtIDFdOwogICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMyk7CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSAyOwogICAgICAgICAgICAgICAgICBiaXRzIC09IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlcmVfdmFsID09PSAxNykgewogICAgICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMzsKICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGF2ZS0tOwogICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgICAgICAgbGVuMiA9IDA7CiAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiA3KTsKICAgICAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gMzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3OwogICAgICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzOwogICAgICAgICAgICAgICAgICBsZW4yID0gMDsKICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAxMjcpOwogICAgICAgICAgICAgICAgICBob2xkID4+Pj0gNzsKICAgICAgICAgICAgICAgICAgYml0cyAtPSA3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlMi5oYXZlICsgY29weSA+IHN0YXRlMi5ubGVuICsgc3RhdGUyLm5kaXN0KSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOwogICAgICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoY29weS0tKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlMi5sZW5zW3N0YXRlMi5oYXZlKytdID0gbGVuMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlMi5tb2RlID09PSBCQUQpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUyLmxlbnNbMjU2XSA9PT0gMCkgewogICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayI7CiAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLmxlbmJpdHMgPSA5OwogICAgICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZTIubGVuYml0cyB9OwogICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlMi5sZW5zLCAwLCBzdGF0ZTIubmxlbiwgc3RhdGUyLmxlbmNvZGUsIDAsIHN0YXRlMi53b3JrLCBvcHRzKTsKICAgICAgICAgICAgc3RhdGUyLmxlbmJpdHMgPSBvcHRzLmJpdHM7CiAgICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5kaXN0Yml0cyA9IDY7CiAgICAgICAgICAgIHN0YXRlMi5kaXN0Y29kZSA9IHN0YXRlMi5kaXN0ZHluOwogICAgICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZTIuZGlzdGJpdHMgfTsKICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUyLmxlbnMsIHN0YXRlMi5ubGVuLCBzdGF0ZTIubmRpc3QsIHN0YXRlMi5kaXN0Y29kZSwgMCwgc3RhdGUyLndvcmssIG9wdHMpOwogICAgICAgICAgICBzdGF0ZTIuZGlzdGJpdHMgPSBvcHRzLmJpdHM7CiAgICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gTEVOXzsKICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7CiAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlIExFTl86CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gTEVOOwogICAgICAgICAgY2FzZSBMRU46CiAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKICAgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0OwogICAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDsKICAgICAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0OwogICAgICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlOwogICAgICAgICAgICAgIHN0YXRlMi5ob2xkID0gaG9sZDsKICAgICAgICAgICAgICBzdGF0ZTIuYml0cyA9IGJpdHM7CiAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpOwogICAgICAgICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7CiAgICAgICAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7CiAgICAgICAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0OwogICAgICAgICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47CiAgICAgICAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0OwogICAgICAgICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luOwogICAgICAgICAgICAgIGhvbGQgPSBzdGF0ZTIuaG9sZDsKICAgICAgICAgICAgICBiaXRzID0gc3RhdGUyLmJpdHM7CiAgICAgICAgICAgICAgaWYgKHN0YXRlMi5tb2RlID09PSBUWVBFKSB7CiAgICAgICAgICAgICAgICBzdGF0ZTIuYmFjayA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTIuYmFjayA9IDA7CiAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZTIubGVuY29kZVtob2xkICYgKDEgPDwgc3RhdGUyLmxlbmJpdHMpIC0gMV07CiAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgaGVyZV9vcCA9IGhlcmUgPj4+IDE2ICYgMjU1OwogICAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDY1NTM1OwogICAgICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhlcmVfb3AgJiYgKGhlcmVfb3AgJiAyNDApID09PSAwKSB7CiAgICAgICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzOwogICAgICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wOwogICAgICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7CiAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUyLmxlbmNvZGVbbGFzdF92YWwgKyAoKGhvbGQgJiAoMSA8PCBsYXN0X2JpdHMgKyBsYXN0X29wKSAtIDEpID4+IGxhc3RfYml0cyldOwogICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICBoZXJlX29wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgIGlmIChsYXN0X2JpdHMgKyBoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzOwogICAgICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzOwogICAgICAgICAgICAgIHN0YXRlMi5iYWNrICs9IGxhc3RfYml0czsKICAgICAgICAgICAgfQogICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgc3RhdGUyLmJhY2sgKz0gaGVyZV9iaXRzOwogICAgICAgICAgICBzdGF0ZTIubGVuZ3RoID0gaGVyZV92YWw7CiAgICAgICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7CiAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBMSVQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhlcmVfb3AgJiAzMikgewogICAgICAgICAgICAgIHN0YXRlMi5iYWNrID0gLTE7CiAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBUWVBFOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoZXJlX29wICYgNjQpIHsKICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5leHRyYSA9IGhlcmVfb3AgJiAxNTsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBMRU5FWFQ7CiAgICAgICAgICBjYXNlIExFTkVYVDoKICAgICAgICAgICAgaWYgKHN0YXRlMi5leHRyYSkgewogICAgICAgICAgICAgIG4gPSBzdGF0ZTIuZXh0cmE7CiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RhdGUyLmxlbmd0aCArPSBob2xkICYgKDEgPDwgc3RhdGUyLmV4dHJhKSAtIDE7CiAgICAgICAgICAgICAgaG9sZCA+Pj49IHN0YXRlMi5leHRyYTsKICAgICAgICAgICAgICBiaXRzIC09IHN0YXRlMi5leHRyYTsKICAgICAgICAgICAgICBzdGF0ZTIuYmFjayArPSBzdGF0ZTIuZXh0cmE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLndhcyA9IHN0YXRlMi5sZW5ndGg7CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gRElTVDsKICAgICAgICAgIGNhc2UgRElTVDoKICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlMi5kaXN0Y29kZVtob2xkICYgKDEgPDwgc3RhdGUyLmRpc3RiaXRzKSAtIDFdOwogICAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0OwogICAgICAgICAgICAgIGhlcmVfb3AgPSBoZXJlID4+PiAxNiAmIDI1NTsKICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7CiAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoaGVyZV9vcCAmIDI0MCkgPT09IDApIHsKICAgICAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7CiAgICAgICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7CiAgICAgICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDsKICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZTIuZGlzdGNvZGVbbGFzdF92YWwgKyAoKGhvbGQgJiAoMSA8PCBsYXN0X2JpdHMgKyBsYXN0X29wKSAtIDEpID4+IGxhc3RfYml0cyldOwogICAgICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICBoZXJlX29wID0gaGVyZSA+Pj4gMTYgJiAyNTU7CiAgICAgICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiA2NTUzNTsKICAgICAgICAgICAgICAgIGlmIChsYXN0X2JpdHMgKyBoZXJlX2JpdHMgPD0gYml0cykgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzOwogICAgICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzOwogICAgICAgICAgICAgIHN0YXRlMi5iYWNrICs9IGxhc3RfYml0czsKICAgICAgICAgICAgfQogICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzOwogICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0czsKICAgICAgICAgICAgc3RhdGUyLmJhY2sgKz0gaGVyZV9iaXRzOwogICAgICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IEJBRDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTIub2Zmc2V0ID0gaGVyZV92YWw7CiAgICAgICAgICAgIHN0YXRlMi5leHRyYSA9IGhlcmVfb3AgJiAxNTsKICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBESVNURVhUOwogICAgICAgICAgY2FzZSBESVNURVhUOgogICAgICAgICAgICBpZiAoc3RhdGUyLmV4dHJhKSB7CiAgICAgICAgICAgICAgbiA9IHN0YXRlMi5leHRyYTsKICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHsKICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGF0ZTIub2Zmc2V0ICs9IGhvbGQgJiAoMSA8PCBzdGF0ZTIuZXh0cmEpIC0gMTsKICAgICAgICAgICAgICBob2xkID4+Pj0gc3RhdGUyLmV4dHJhOwogICAgICAgICAgICAgIGJpdHMgLT0gc3RhdGUyLmV4dHJhOwogICAgICAgICAgICAgIHN0YXRlMi5iYWNrICs9IHN0YXRlMi5leHRyYTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUyLm9mZnNldCA+IHN0YXRlMi5kbWF4KSB7CiAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwogICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gTUFUQ0g7CiAgICAgICAgICBjYXNlIE1BVENIOgogICAgICAgICAgICBpZiAobGVmdCA9PT0gMCkgewogICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3B5ID0gX291dCAtIGxlZnQ7CiAgICAgICAgICAgIGlmIChzdGF0ZTIub2Zmc2V0ID4gY29weSkgewogICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZTIub2Zmc2V0IC0gY29weTsKICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlMi53aGF2ZSkgewogICAgICAgICAgICAgICAgaWYgKHN0YXRlMi5zYW5lKSB7CiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKICAgICAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlMi53bmV4dCkgewogICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZTIud25leHQ7CiAgICAgICAgICAgICAgICBmcm9tMiA9IHN0YXRlMi53c2l6ZSAtIGNvcHk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZyb20yID0gc3RhdGUyLnduZXh0IC0gY29weTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZTIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUyLmxlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZTIud2luZG93OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0OwogICAgICAgICAgICAgIGZyb20yID0gcHV0IC0gc3RhdGUyLm9mZnNldDsKICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUyLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsKICAgICAgICAgICAgICBjb3B5ID0gbGVmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWZ0IC09IGNvcHk7CiAgICAgICAgICAgIHN0YXRlMi5sZW5ndGggLT0gY29weTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tMisrXTsKICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKICAgICAgICAgICAgaWYgKHN0YXRlMi5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBzdGF0ZTIubW9kZSA9IExFTjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgTElUOgogICAgICAgICAgICBpZiAobGVmdCA9PT0gMCkgewogICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUyLmxlbmd0aDsKICAgICAgICAgICAgbGVmdC0tOwogICAgICAgICAgICBzdGF0ZTIubW9kZSA9IExFTjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIENIRUNLOgogICAgICAgICAgICBpZiAoc3RhdGUyLndyYXApIHsKICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7CiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoYXZlLS07CiAgICAgICAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0czsKICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX291dCAtPSBsZWZ0OwogICAgICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7CiAgICAgICAgICAgICAgc3RhdGUyLnRvdGFsICs9IF9vdXQ7CiAgICAgICAgICAgICAgaWYgKF9vdXQpIHsKICAgICAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZTIuY2hlY2sgPSBzdGF0ZTIuZmxhZ3MgPyBjcmMzMihzdGF0ZTIuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlMi5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX291dCA9IGxlZnQ7CiAgICAgICAgICAgICAgaWYgKChzdGF0ZTIuZmxhZ3MgPyBob2xkIDogenN3YXAzMihob2xkKSkgIT09IHN0YXRlMi5jaGVjaykgewogICAgICAgICAgICAgICAgc3RybS5tc2cgPSAiaW5jb3JyZWN0IGRhdGEgY2hlY2siOwogICAgICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaG9sZCA9IDA7CiAgICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUyLm1vZGUgPSBMRU5HVEg7CiAgICAgICAgICBjYXNlIExFTkdUSDoKICAgICAgICAgICAgaWYgKHN0YXRlMi53cmFwICYmIHN0YXRlMi5mbGFncykgewogICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHsKICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGhhdmUtLTsKICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzOwogICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlMi50b3RhbCAmIDQyOTQ5NjcyOTUpKSB7CiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIjsKICAgICAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGhvbGQgPSAwOwogICAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlMi5tb2RlID0gRE9ORTsKICAgICAgICAgIGNhc2UgRE9ORToKICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOwogICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICBjYXNlIEJBRDoKICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOwogICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7CiAgICAgICAgICBjYXNlIE1FTToKICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwogICAgICAgICAgY2FzZSBTWU5DOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgc3RybS5uZXh0X291dCA9IHB1dDsKICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDsKICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7CiAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTsKICAgIHN0YXRlMi5ob2xkID0gaG9sZDsKICAgIHN0YXRlMi5iaXRzID0gYml0czsKICAgIGlmIChzdGF0ZTIud3NpemUgfHwgX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUyLm1vZGUgPCBCQUQgJiYgKHN0YXRlMi5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkgewogICAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKQogICAgICAgIDsKICAgIH0KICAgIF9pbiAtPSBzdHJtLmF2YWlsX2luOwogICAgX291dCAtPSBzdHJtLmF2YWlsX291dDsKICAgIHN0cm0udG90YWxfaW4gKz0gX2luOwogICAgc3RybS50b3RhbF9vdXQgKz0gX291dDsKICAgIHN0YXRlMi50b3RhbCArPSBfb3V0OwogICAgaWYgKHN0YXRlMi53cmFwICYmIF9vdXQpIHsKICAgICAgc3RybS5hZGxlciA9IHN0YXRlMi5jaGVjayA9IHN0YXRlMi5mbGFncyA/IGNyYzMyKHN0YXRlMi5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlMi5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCk7CiAgICB9CiAgICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlMi5iaXRzICsgKHN0YXRlMi5sYXN0ID8gNjQgOiAwKSArIChzdGF0ZTIubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICsgKHN0YXRlMi5tb2RlID09PSBMRU5fIHx8IHN0YXRlMi5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApOwogICAgaWYgKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykgewogICAgICByZXQgPSBaX0JVRl9FUlJPUjsKICAgIH0KICAgIHJldHVybiByZXQ7CiAgfQogIGZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkgewogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICAgIHZhciBzdGF0ZTIgPSBzdHJtLnN0YXRlOwogICAgaWYgKHN0YXRlMi53aW5kb3cpIHsKICAgICAgc3RhdGUyLndpbmRvdyA9IG51bGw7CiAgICB9CiAgICBzdHJtLnN0YXRlID0gbnVsbDsKICAgIHJldHVybiBaX09LOwogIH0KICBmdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHsKICAgIHZhciBzdGF0ZTI7CiAgICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgc3RhdGUyID0gc3RybS5zdGF0ZTsKICAgIGlmICgoc3RhdGUyLndyYXAgJiAyKSA9PT0gMCkgewogICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgICB9CiAgICBzdGF0ZTIuaGVhZCA9IGhlYWQ7CiAgICBoZWFkLmRvbmUgPSBmYWxzZTsKICAgIHJldHVybiBaX09LOwogIH0KICBmdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7CiAgICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoOwogICAgdmFyIHN0YXRlMjsKICAgIHZhciBkaWN0aWQ7CiAgICB2YXIgcmV0OwogICAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7CiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgIH0KICAgIHN0YXRlMiA9IHN0cm0uc3RhdGU7CiAgICBpZiAoc3RhdGUyLndyYXAgIT09IDAgJiYgc3RhdGUyLm1vZGUgIT09IERJQ1QpIHsKICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgfQogICAgaWYgKHN0YXRlMi5tb2RlID09PSBESUNUKSB7CiAgICAgIGRpY3RpZCA9IDE7CiAgICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTsKICAgICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUyLmNoZWNrKSB7CiAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKICAgICAgfQogICAgfQogICAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpOwogICAgaWYgKHJldCkgewogICAgICBzdGF0ZTIubW9kZSA9IE1FTTsKICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwogICAgfQogICAgc3RhdGUyLmhhdmVkaWN0ID0gMTsKICAgIHJldHVybiBaX09LOwogIH0KICBpbmZsYXRlJDMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0OwogIGluZmxhdGUkMy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjsKICBpbmZsYXRlJDMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7CiAgaW5mbGF0ZSQzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7CiAgaW5mbGF0ZSQzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjsKICBpbmZsYXRlJDMuaW5mbGF0ZSA9IGluZmxhdGUkMjsKICBpbmZsYXRlJDMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7CiAgaW5mbGF0ZSQzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyOwogIGluZmxhdGUkMy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5OwogIGluZmxhdGUkMy5pbmZsYXRlSW5mbyA9ICJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIjsKICB2YXIgY29uc3RhbnRzJDEgPSB7CiAgICBaX05PX0ZMVVNIOiAwLAogICAgWl9QQVJUSUFMX0ZMVVNIOiAxLAogICAgWl9TWU5DX0ZMVVNIOiAyLAogICAgWl9GVUxMX0ZMVVNIOiAzLAogICAgWl9GSU5JU0g6IDQsCiAgICBaX0JMT0NLOiA1LAogICAgWl9UUkVFUzogNiwKICAgIFpfT0s6IDAsCiAgICBaX1NUUkVBTV9FTkQ6IDEsCiAgICBaX05FRURfRElDVDogMiwKICAgIFpfRVJSTk86IC0xLAogICAgWl9TVFJFQU1fRVJST1I6IC0yLAogICAgWl9EQVRBX0VSUk9SOiAtMywKICAgIFpfQlVGX0VSUk9SOiAtNSwKICAgIFpfTk9fQ09NUFJFU1NJT046IDAsCiAgICBaX0JFU1RfU1BFRUQ6IDEsCiAgICBaX0JFU1RfQ09NUFJFU1NJT046IDksCiAgICBaX0RFRkFVTFRfQ09NUFJFU1NJT046IC0xLAogICAgWl9GSUxURVJFRDogMSwKICAgIFpfSFVGRk1BTl9PTkxZOiAyLAogICAgWl9STEU6IDMsCiAgICBaX0ZJWEVEOiA0LAogICAgWl9ERUZBVUxUX1NUUkFURUdZOiAwLAogICAgWl9CSU5BUlk6IDAsCiAgICBaX1RFWFQ6IDEsCiAgICBaX1VOS05PV046IDIsCiAgICBaX0RFRkxBVEVEOiA4CiAgfTsKICBmdW5jdGlvbiBHWmhlYWRlciQxKCkgewogICAgdGhpcy50ZXh0ID0gMDsKICAgIHRoaXMudGltZSA9IDA7CiAgICB0aGlzLnhmbGFncyA9IDA7CiAgICB0aGlzLm9zID0gMDsKICAgIHRoaXMuZXh0cmEgPSBudWxsOwogICAgdGhpcy5leHRyYV9sZW4gPSAwOwogICAgdGhpcy5uYW1lID0gIiI7CiAgICB0aGlzLmNvbW1lbnQgPSAiIjsKICAgIHRoaXMuaGNyYyA9IDA7CiAgICB0aGlzLmRvbmUgPSBmYWxzZTsKICB9CiAgdmFyIGd6aGVhZGVyID0gR1poZWFkZXIkMTsKICB2YXIgemxpYl9pbmZsYXRlID0gaW5mbGF0ZSQzOwogIHZhciB1dGlscyA9IGNvbW1vbiQxOwogIHZhciBzdHJpbmdzID0gc3RyaW5ncyQyOwogIHZhciBjID0gY29uc3RhbnRzJDE7CiAgdmFyIG1zZyA9IG1lc3NhZ2VzJDE7CiAgdmFyIFpTdHJlYW0gPSB6c3RyZWFtOwogIHZhciBHWmhlYWRlciA9IGd6aGVhZGVyOwogIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgZnVuY3Rpb24gSW5mbGF0ZShvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpCiAgICAgIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTsKICAgIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7CiAgICAgIGNodW5rU2l6ZTogMTYzODQsCiAgICAgIHdpbmRvd0JpdHM6IDAsCiAgICAgIHRvOiAiIgogICAgfSwgb3B0aW9ucyB8fCB7fSk7CiAgICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zOwogICAgaWYgKG9wdC5yYXcgJiYgb3B0LndpbmRvd0JpdHMgPj0gMCAmJiBvcHQud2luZG93Qml0cyA8IDE2KSB7CiAgICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzOwogICAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsKICAgICAgICBvcHQud2luZG93Qml0cyA9IC0xNTsKICAgICAgfQogICAgfQogICAgaWYgKG9wdC53aW5kb3dCaXRzID49IDAgJiYgb3B0LndpbmRvd0JpdHMgPCAxNiAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkgewogICAgICBvcHQud2luZG93Qml0cyArPSAzMjsKICAgIH0KICAgIGlmIChvcHQud2luZG93Qml0cyA+IDE1ICYmIG9wdC53aW5kb3dCaXRzIDwgNDgpIHsKICAgICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkgewogICAgICAgIG9wdC53aW5kb3dCaXRzIHw9IDE1OwogICAgICB9CiAgICB9CiAgICB0aGlzLmVyciA9IDA7CiAgICB0aGlzLm1zZyA9ICIiOwogICAgdGhpcy5lbmRlZCA9IGZhbHNlOwogICAgdGhpcy5jaHVua3MgPSBbXTsKICAgIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7CiAgICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDsKICAgIHZhciBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUluaXQyKAogICAgICB0aGlzLnN0cm0sCiAgICAgIG9wdC53aW5kb3dCaXRzCiAgICApOwogICAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7CiAgICB9CiAgICB0aGlzLmhlYWRlciA9IG5ldyBHWmhlYWRlcigpOwogICAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7CiAgICBpZiAob3B0LmRpY3Rpb25hcnkpIHsKICAgICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gInN0cmluZyIpIHsKICAgICAgICBvcHQuZGljdGlvbmFyeSA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7CiAgICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgICBvcHQuZGljdGlvbmFyeSA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgfQogICAgICBpZiAob3B0LnJhdykgewogICAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIG9wdC5kaWN0aW9uYXJ5KTsKICAgICAgICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIEluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihkYXRhLCBtb2RlKSB7CiAgICB2YXIgc3RybSA9IHRoaXMuc3RybTsKICAgIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplOwogICAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTsKICAgIHZhciBzdGF0dXMsIF9tb2RlOwogICAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7CiAgICB2YXIgYWxsb3dCdWZFcnJvciA9IGZhbHNlOwogICAgaWYgKHRoaXMuZW5kZWQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX21vZGUgPSBtb2RlID09PSB+fm1vZGUgPyBtb2RlIDogbW9kZSA9PT0gdHJ1ZSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0g7CiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7CiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgc3RybS5pbnB1dCA9IGRhdGE7CiAgICB9CiAgICBzdHJtLm5leHRfaW4gPSAwOwogICAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoOwogICAgZG8gewogICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHsKICAgICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7CiAgICAgICAgc3RybS5uZXh0X291dCA9IDA7CiAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7CiAgICAgIH0KICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsKICAgICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7CiAgICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdGlvbmFyeSk7CiAgICAgIH0KICAgICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7CiAgICAgICAgc3RhdHVzID0gYy5aX09LOwogICAgICAgIGFsbG93QnVmRXJyb3IgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IGMuWl9PSykgewogICAgICAgIHRoaXMub25FbmQoc3RhdHVzKTsKICAgICAgICB0aGlzLmVuZGVkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHN0cm0ubmV4dF9vdXQpIHsKICAgICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCBzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCB8fCBfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpKSB7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAic3RyaW5nIikgewogICAgICAgICAgICBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTsKICAgICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4OwogICAgICAgICAgICB1dGY4c3RyID0gc3RyaW5ncy5idWYyc3RyaW5nKHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4KTsKICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7CiAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplIC0gdGFpbDsKICAgICAgICAgICAgaWYgKHRhaWwpIHsKICAgICAgICAgICAgICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgsIHRhaWwsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7CiAgICAgICAgYWxsb3dCdWZFcnJvciA9IHRydWU7CiAgICAgIH0KICAgIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCk7CiAgICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkgewogICAgICBfbW9kZSA9IGMuWl9GSU5JU0g7CiAgICB9CiAgICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHsKICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTsKICAgICAgdGhpcy5vbkVuZChzdGF0dXMpOwogICAgICB0aGlzLmVuZGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHN0YXR1cyA9PT0gYy5aX09LOwogICAgfQogICAgaWYgKF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkgewogICAgICB0aGlzLm9uRW5kKGMuWl9PSyk7CiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gMDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9OwogIEluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uKGNodW5rKSB7CiAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICB9OwogIEluZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24oc3RhdHVzKSB7CiAgICBpZiAoc3RhdHVzID09PSBjLlpfT0spIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gInN0cmluZyIpIHsKICAgICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oIiIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY2h1bmtzID0gW107CiAgICB0aGlzLmVyciA9IHN0YXR1czsKICAgIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZzsKICB9OwogIGZ1bmN0aW9uIGluZmxhdGUkMShpbnB1dCwgb3B0aW9ucykgewogICAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7CiAgICBpbmZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTsKICAgIGlmIChpbmZsYXRvci5lcnIpIHsKICAgICAgdGhyb3cgaW5mbGF0b3IubXNnIHx8IG1zZ1tpbmZsYXRvci5lcnJdOwogICAgfQogICAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDsKICB9CiAgZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBvcHRpb25zLnJhdyA9IHRydWU7CiAgICByZXR1cm4gaW5mbGF0ZSQxKGlucHV0LCBvcHRpb25zKTsKICB9CiAgaW5mbGF0ZSQ0LkluZmxhdGUgPSBJbmZsYXRlOwogIGluZmxhdGUkNC5pbmZsYXRlID0gaW5mbGF0ZSQxOwogIGluZmxhdGUkNC5pbmZsYXRlUmF3ID0gaW5mbGF0ZVJhdzsKICBpbmZsYXRlJDQudW5nemlwID0gaW5mbGF0ZSQxOwogIHZhciBhc3NpZ24gPSBjb21tb24kMS5hc3NpZ247CiAgdmFyIGRlZmxhdGUgPSBkZWZsYXRlJDQ7CiAgdmFyIGluZmxhdGUgPSBpbmZsYXRlJDQ7CiAgdmFyIGNvbnN0YW50cyA9IGNvbnN0YW50cyQxOwogIHZhciBwYWtvID0ge307CiAgYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7CiAgdmFyIHBha29fMSA9IHBha287CiAgYXN5bmMgZnVuY3Rpb24gdW56aXAoaW5wdXREYXRhKSB7CiAgICB0cnkgewogICAgICBsZXQgc3RybTsKICAgICAgbGV0IHBvcyA9IDA7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICBsZXQgdG90YWxTaXplID0gMDsKICAgICAgbGV0IGluZmxhdG9yOwogICAgICBkbyB7CiAgICAgICAgY29uc3QgcmVtYWluaW5nSW5wdXQgPSBpbnB1dERhdGEuc3ViYXJyYXkocG9zKTsKICAgICAgICBpbmZsYXRvciA9IG5ldyBwYWtvXzEuSW5mbGF0ZSgpOwogICAgICAgICh7IHN0cm0gfSA9IGluZmxhdG9yKTsKICAgICAgICBpbmZsYXRvci5wdXNoKHJlbWFpbmluZ0lucHV0LCBwYWtvXzEuWl9TWU5DX0ZMVVNIKTsKICAgICAgICBpZiAoaW5mbGF0b3IuZXJyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0b3IubXNnKTsKICAgICAgICB9CiAgICAgICAgcG9zICs9IHN0cm0ubmV4dF9pbjsKICAgICAgICBjaHVua3NbaTJdID0gaW5mbGF0b3IucmVzdWx0OwogICAgICAgIHRvdGFsU2l6ZSArPSBjaHVua3NbaTJdLmxlbmd0aDsKICAgICAgICBpMiArPSAxOwogICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX2luKTsKICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTsKICAgICAgZm9yIChsZXQgaTMgPSAwLCBvZmZzZXQgPSAwOyBpMyA8IGNodW5rcy5sZW5ndGg7IGkzKyspIHsKICAgICAgICByZXN1bHQuc2V0KGNodW5rc1tpM10sIG9mZnNldCk7CiAgICAgICAgb2Zmc2V0ICs9IGNodW5rc1tpM10ubGVuZ3RoOwogICAgICB9CiAgICAgIHJldHVybiBidWZmZXIuQnVmZmVyLmZyb20ocmVzdWx0KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKGAke2V9YC5tYXRjaCgvaW5jb3JyZWN0IGhlYWRlciBjaGVjay8pKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJwcm9ibGVtIGRlY29tcHJlc3NpbmcgYmxvY2s6IGluY29ycmVjdCBnemlwIGhlYWRlciBjaGVjayIpOwogICAgICB9CiAgICAgIHRocm93IGU7CiAgICB9CiAgfQogIGFzeW5jIGZ1bmN0aW9uIHVuemlwQ2h1bmtTbGljZShpbnB1dERhdGEsIGNodW5rKSB7CiAgICB0cnkgewogICAgICBsZXQgc3RybTsKICAgICAgY29uc3QgeyBtaW52LCBtYXh2IH0gPSBjaHVuazsKICAgICAgbGV0IGNwb3MgPSBtaW52LmJsb2NrUG9zaXRpb247CiAgICAgIGxldCBkcG9zID0gbWludi5kYXRhUG9zaXRpb247CiAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICBjb25zdCBjcG9zaXRpb25zID0gW107CiAgICAgIGNvbnN0IGRwb3NpdGlvbnMgPSBbXTsKICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7CiAgICAgIGxldCBpMiA9IDA7CiAgICAgIGRvIHsKICAgICAgICBjb25zdCByZW1haW5pbmdJbnB1dCA9IGlucHV0RGF0YS5zdWJhcnJheShjcG9zIC0gbWludi5ibG9ja1Bvc2l0aW9uKTsKICAgICAgICBjb25zdCBpbmZsYXRvciA9IG5ldyBwYWtvXzEuSW5mbGF0ZSgpOwogICAgICAgICh7IHN0cm0gfSA9IGluZmxhdG9yKTsKICAgICAgICBpbmZsYXRvci5wdXNoKHJlbWFpbmluZ0lucHV0LCBwYWtvXzEuWl9TWU5DX0ZMVVNIKTsKICAgICAgICBpZiAoaW5mbGF0b3IuZXJyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0b3IubXNnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYnVmZmVyMiA9IGluZmxhdG9yLnJlc3VsdDsKICAgICAgICBjaHVua3MucHVzaChidWZmZXIyKTsKICAgICAgICBsZXQgbGVuMiA9IGJ1ZmZlcjIubGVuZ3RoOwogICAgICAgIGNwb3NpdGlvbnMucHVzaChjcG9zKTsKICAgICAgICBkcG9zaXRpb25zLnB1c2goZHBvcyk7CiAgICAgICAgaWYgKGNodW5rcy5sZW5ndGggPT09IDEgJiYgbWludi5kYXRhUG9zaXRpb24pIHsKICAgICAgICAgIGNodW5rc1swXSA9IGNodW5rc1swXS5zdWJhcnJheShtaW52LmRhdGFQb3NpdGlvbik7CiAgICAgICAgICBsZW4yID0gY2h1bmtzWzBdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3JpZ0Nwb3MgPSBjcG9zOwogICAgICAgIGNwb3MgKz0gc3RybS5uZXh0X2luOwogICAgICAgIGRwb3MgKz0gbGVuMjsKICAgICAgICBpZiAob3JpZ0Nwb3MgPj0gbWF4di5ibG9ja1Bvc2l0aW9uKSB7CiAgICAgICAgICBjaHVua3NbaTJdID0gY2h1bmtzW2kyXS5zdWJhcnJheSgwLCBtYXh2LmJsb2NrUG9zaXRpb24gPT09IG1pbnYuYmxvY2tQb3NpdGlvbiA/IG1heHYuZGF0YVBvc2l0aW9uIC0gbWludi5kYXRhUG9zaXRpb24gKyAxIDogbWF4di5kYXRhUG9zaXRpb24gKyAxKTsKICAgICAgICAgIGNwb3NpdGlvbnMucHVzaChjcG9zKTsKICAgICAgICAgIGRwb3NpdGlvbnMucHVzaChkcG9zKTsKICAgICAgICAgIHRvdGFsU2l6ZSArPSBjaHVua3NbaTJdLmxlbmd0aDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b3RhbFNpemUgKz0gY2h1bmtzW2kyXS5sZW5ndGg7CiAgICAgICAgaTIrKzsKICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9pbik7CiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7CiAgICAgIGZvciAobGV0IGkzID0gMCwgb2Zmc2V0ID0gMDsgaTMgPCBjaHVua3MubGVuZ3RoOyBpMysrKSB7CiAgICAgICAgcmVzdWx0LnNldChjaHVua3NbaTNdLCBvZmZzZXQpOwogICAgICAgIG9mZnNldCArPSBjaHVua3NbaTNdLmxlbmd0aDsKICAgICAgfQogICAgICBjb25zdCBidWZmZXIkMSA9IGJ1ZmZlci5CdWZmZXIuZnJvbShyZXN1bHQpOwogICAgICByZXR1cm4geyBidWZmZXI6IGJ1ZmZlciQxLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zIH07CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChgJHtlfWAubWF0Y2goL2luY29ycmVjdCBoZWFkZXIgY2hlY2svKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigicHJvYmxlbSBkZWNvbXByZXNzaW5nIGJsb2NrOiBpbmNvcnJlY3QgZ3ppcCBoZWFkZXIgY2hlY2siKTsKICAgICAgfQogICAgICB0aHJvdyBlOwogICAgfQogIH0KICAvKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDA5IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycwogICAqIENvcHlyaWdodCAyMDIwIERhbmllbCBXaXJ0eiAvIFRoZSBsb25nLmpzIEF1dGhvcnMuCiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICoKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogICAqLwogIHZhciB3YXNtJDEgPSBudWxsOwogIHRyeSB7CiAgICB3YXNtJDEgPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbCiAgICAgIDAsCiAgICAgIDk3LAogICAgICAxMTUsCiAgICAgIDEwOSwKICAgICAgMSwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMSwKICAgICAgMTMsCiAgICAgIDIsCiAgICAgIDk2LAogICAgICAwLAogICAgICAxLAogICAgICAxMjcsCiAgICAgIDk2LAogICAgICA0LAogICAgICAxMjcsCiAgICAgIDEyNywKICAgICAgMTI3LAogICAgICAxMjcsCiAgICAgIDEsCiAgICAgIDEyNywKICAgICAgMywKICAgICAgNywKICAgICAgNiwKICAgICAgMCwKICAgICAgMSwKICAgICAgMSwKICAgICAgMSwKICAgICAgMSwKICAgICAgMSwKICAgICAgNiwKICAgICAgNiwKICAgICAgMSwKICAgICAgMTI3LAogICAgICAxLAogICAgICA2NSwKICAgICAgMCwKICAgICAgMTEsCiAgICAgIDcsCiAgICAgIDUwLAogICAgICA2LAogICAgICAzLAogICAgICAxMDksCiAgICAgIDExNywKICAgICAgMTA4LAogICAgICAwLAogICAgICAxLAogICAgICA1LAogICAgICAxMDAsCiAgICAgIDEwNSwKICAgICAgMTE4LAogICAgICA5NSwKICAgICAgMTE1LAogICAgICAwLAogICAgICAyLAogICAgICA1LAogICAgICAxMDAsCiAgICAgIDEwNSwKICAgICAgMTE4LAogICAgICA5NSwKICAgICAgMTE3LAogICAgICAwLAogICAgICAzLAogICAgICA1LAogICAgICAxMTQsCiAgICAgIDEwMSwKICAgICAgMTA5LAogICAgICA5NSwKICAgICAgMTE1LAogICAgICAwLAogICAgICA0LAogICAgICA1LAogICAgICAxMTQsCiAgICAgIDEwMSwKICAgICAgMTA5LAogICAgICA5NSwKICAgICAgMTE3LAogICAgICAwLAogICAgICA1LAogICAgICA4LAogICAgICAxMDMsCiAgICAgIDEwMSwKICAgICAgMTE2LAogICAgICA5NSwKICAgICAgMTA0LAogICAgICAxMDUsCiAgICAgIDEwMywKICAgICAgMTA0LAogICAgICAwLAogICAgICAwLAogICAgICAxMCwKICAgICAgMTkxLAogICAgICAxLAogICAgICA2LAogICAgICA0LAogICAgICAwLAogICAgICAzNSwKICAgICAgMCwKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEyNiwKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMSwKICAgICAgMzYsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEyNiwKICAgICAgMzIsCiAgICAgIDAsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDEsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMzIsCiAgICAgIDIsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDMsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMTI3LAogICAgICAzNCwKICAgICAgNCwKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzUsCiAgICAgIDE2NywKICAgICAgMzYsCiAgICAgIDAsCiAgICAgIDMyLAogICAgICA0LAogICAgICAxNjcsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMjgsCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEyOSwKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMSwKICAgICAgMzYsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEyNiwKICAgICAgMzIsCiAgICAgIDAsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDEsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMzIsCiAgICAgIDIsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDMsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMTMwLAogICAgICAzNCwKICAgICAgNCwKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzUsCiAgICAgIDE2NywKICAgICAgMzYsCiAgICAgIDAsCiAgICAgIDMyLAogICAgICA0LAogICAgICAxNjcsCiAgICAgIDExCiAgICBdKSksIHt9KS5leHBvcnRzOwogIH0gY2F0Y2ggKGUpIHsKICB9CiAgZnVuY3Rpb24gTG9uZyQxKGxvdywgaGlnaCwgdW5zaWduZWQpIHsKICAgIHRoaXMubG93ID0gbG93IHwgMDsKICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwOwogICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7CiAgfQogIExvbmckMS5wcm90b3R5cGUuX19pc0xvbmdfXzsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTG9uZyQxLnByb3RvdHlwZSwgIl9faXNMb25nX18iLCB7IHZhbHVlOiB0cnVlIH0pOwogIGZ1bmN0aW9uIGlzTG9uZyQxKG9iaikgewogICAgcmV0dXJuIChvYmogJiYgb2JqWyJfX2lzTG9uZ19fIl0pID09PSB0cnVlOwogIH0KICBmdW5jdGlvbiBjdHozMih2YWx1ZSkgewogICAgdmFyIGMyID0gTWF0aC5jbHozMih2YWx1ZSAmIC12YWx1ZSk7CiAgICByZXR1cm4gdmFsdWUgPyAzMSAtIGMyIDogYzI7CiAgfQogIExvbmckMS5pc0xvbmcgPSBpc0xvbmckMTsKICB2YXIgSU5UX0NBQ0hFJDEgPSB7fTsKICB2YXIgVUlOVF9DQUNIRSQxID0ge307CiAgZnVuY3Rpb24gZnJvbUludCQxKHZhbHVlLCB1bnNpZ25lZCkgewogICAgdmFyIG9iaiwgY2FjaGVkT2JqLCBjYWNoZTsKICAgIGlmICh1bnNpZ25lZCkgewogICAgICB2YWx1ZSA+Pj49IDA7CiAgICAgIGlmIChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpIHsKICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFJDFbdmFsdWVdOwogICAgICAgIGlmIChjYWNoZWRPYmopCiAgICAgICAgICByZXR1cm4gY2FjaGVkT2JqOwogICAgICB9CiAgICAgIG9iaiA9IGZyb21CaXRzJDEodmFsdWUsIDAsIHRydWUpOwogICAgICBpZiAoY2FjaGUpCiAgICAgICAgVUlOVF9DQUNIRSQxW3ZhbHVlXSA9IG9iajsKICAgICAgcmV0dXJuIG9iajsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlIHw9IDA7CiAgICAgIGlmIChjYWNoZSA9IC0xMjggPD0gdmFsdWUgJiYgdmFsdWUgPCAxMjgpIHsKICAgICAgICBjYWNoZWRPYmogPSBJTlRfQ0FDSEUkMVt2YWx1ZV07CiAgICAgICAgaWYgKGNhY2hlZE9iaikKICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7CiAgICAgIH0KICAgICAgb2JqID0gZnJvbUJpdHMkMSh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7CiAgICAgIGlmIChjYWNoZSkKICAgICAgICBJTlRfQ0FDSEUkMVt2YWx1ZV0gPSBvYmo7CiAgICAgIHJldHVybiBvYmo7CiAgICB9CiAgfQogIExvbmckMS5mcm9tSW50ID0gZnJvbUludCQxOwogIGZ1bmN0aW9uIGZyb21OdW1iZXIkMSh2YWx1ZSwgdW5zaWduZWQpIHsKICAgIGlmIChpc05hTih2YWx1ZSkpCiAgICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPJDEgOiBaRVJPJDE7CiAgICBpZiAodW5zaWduZWQpIHsKICAgICAgaWYgKHZhbHVlIDwgMCkKICAgICAgICByZXR1cm4gVVpFUk8kMTsKICAgICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMJDEpCiAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRSQxOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTCQxKQogICAgICAgIHJldHVybiBNSU5fVkFMVUUkMTsKICAgICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCQxKQogICAgICAgIHJldHVybiBNQVhfVkFMVUUkMTsKICAgIH0KICAgIGlmICh2YWx1ZSA8IDApCiAgICAgIHJldHVybiBmcm9tTnVtYmVyJDEoLXZhbHVlLCB1bnNpZ25lZCkubmVnKCk7CiAgICByZXR1cm4gZnJvbUJpdHMkMSh2YWx1ZSAlIFRXT19QV1JfMzJfREJMJDEgfCAwLCB2YWx1ZSAvIFRXT19QV1JfMzJfREJMJDEgfCAwLCB1bnNpZ25lZCk7CiAgfQogIExvbmckMS5mcm9tTnVtYmVyID0gZnJvbU51bWJlciQxOwogIGZ1bmN0aW9uIGZyb21CaXRzJDEobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7CiAgICByZXR1cm4gbmV3IExvbmckMShsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpOwogIH0KICBMb25nJDEuZnJvbUJpdHMgPSBmcm9tQml0cyQxOwogIHZhciBwb3dfZGJsJDEgPSBNYXRoLnBvdzsKICBmdW5jdGlvbiBmcm9tU3RyaW5nJDEoc3RyLCB1bnNpZ25lZCwgcmFkaXgpIHsKICAgIGlmIChzdHIubGVuZ3RoID09PSAwKQogICAgICB0aHJvdyBFcnJvcigiZW1wdHkgc3RyaW5nIik7CiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAibnVtYmVyIikgewogICAgICByYWRpeCA9IHVuc2lnbmVkOwogICAgICB1bnNpZ25lZCA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgdW5zaWduZWQgPSAhIXVuc2lnbmVkOwogICAgfQogICAgaWYgKHN0ciA9PT0gIk5hTiIgfHwgc3RyID09PSAiSW5maW5pdHkiIHx8IHN0ciA9PT0gIitJbmZpbml0eSIgfHwgc3RyID09PSAiLUluZmluaXR5IikKICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8kMSA6IFpFUk8kMTsKICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7CiAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpCiAgICAgIHRocm93IFJhbmdlRXJyb3IoInJhZGl4Iik7CiAgICB2YXIgcDsKICAgIGlmICgocCA9IHN0ci5pbmRleE9mKCItIikpID4gMCkKICAgICAgdGhyb3cgRXJyb3IoImludGVyaW9yIGh5cGhlbiIpOwogICAgZWxzZSBpZiAocCA9PT0gMCkgewogICAgICByZXR1cm4gZnJvbVN0cmluZyQxKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7CiAgICB9CiAgICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlciQxKHBvd19kYmwkMShyYWRpeCwgOCkpOwogICAgdmFyIHJlc3VsdCA9IFpFUk8kMTsKICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzdHIubGVuZ3RoOyBpMiArPSA4KSB7CiAgICAgIHZhciBzaXplID0gTWF0aC5taW4oOCwgc3RyLmxlbmd0aCAtIGkyKSwgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGkyLCBpMiArIHNpemUpLCByYWRpeCk7CiAgICAgIGlmIChzaXplIDwgOCkgewogICAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIkMShwb3dfZGJsJDEocmFkaXgsIHNpemUpKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHBvd2VyKS5hZGQoZnJvbU51bWJlciQxKHZhbHVlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpOwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlciQxKHZhbHVlKSk7CiAgICAgIH0KICAgIH0KICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgTG9uZyQxLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nJDE7CiAgZnVuY3Rpb24gZnJvbVZhbHVlJDEodmFsLCB1bnNpZ25lZCkgewogICAgaWYgKHR5cGVvZiB2YWwgPT09ICJudW1iZXIiKQogICAgICByZXR1cm4gZnJvbU51bWJlciQxKHZhbCwgdW5zaWduZWQpOwogICAgaWYgKHR5cGVvZiB2YWwgPT09ICJzdHJpbmciKQogICAgICByZXR1cm4gZnJvbVN0cmluZyQxKHZhbCwgdW5zaWduZWQpOwogICAgcmV0dXJuIGZyb21CaXRzJDEodmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gImJvb2xlYW4iID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpOwogIH0KICBMb25nJDEuZnJvbVZhbHVlID0gZnJvbVZhbHVlJDE7CiAgdmFyIFRXT19QV1JfMTZfREJMJDEgPSAxIDw8IDE2OwogIHZhciBUV09fUFdSXzI0X0RCTCQxID0gMSA8PCAyNDsKICB2YXIgVFdPX1BXUl8zMl9EQkwkMSA9IFRXT19QV1JfMTZfREJMJDEgKiBUV09fUFdSXzE2X0RCTCQxOwogIHZhciBUV09fUFdSXzY0X0RCTCQxID0gVFdPX1BXUl8zMl9EQkwkMSAqIFRXT19QV1JfMzJfREJMJDE7CiAgdmFyIFRXT19QV1JfNjNfREJMJDEgPSBUV09fUFdSXzY0X0RCTCQxIC8gMjsKICB2YXIgVFdPX1BXUl8yNCQxID0gZnJvbUludCQxKFRXT19QV1JfMjRfREJMJDEpOwogIHZhciBaRVJPJDEgPSBmcm9tSW50JDEoMCk7CiAgTG9uZyQxLlpFUk8gPSBaRVJPJDE7CiAgdmFyIFVaRVJPJDEgPSBmcm9tSW50JDEoMCwgdHJ1ZSk7CiAgTG9uZyQxLlVaRVJPID0gVVpFUk8kMTsKICB2YXIgT05FJDEgPSBmcm9tSW50JDEoMSk7CiAgTG9uZyQxLk9ORSA9IE9ORSQxOwogIHZhciBVT05FJDEgPSBmcm9tSW50JDEoMSwgdHJ1ZSk7CiAgTG9uZyQxLlVPTkUgPSBVT05FJDE7CiAgdmFyIE5FR19PTkUkMSA9IGZyb21JbnQkMSgtMSk7CiAgTG9uZyQxLk5FR19PTkUgPSBORUdfT05FJDE7CiAgdmFyIE1BWF9WQUxVRSQxID0gZnJvbUJpdHMkMSg0Mjk0OTY3Mjk1IHwgMCwgMjE0NzQ4MzY0NyB8IDAsIGZhbHNlKTsKICBMb25nJDEuTUFYX1ZBTFVFID0gTUFYX1ZBTFVFJDE7CiAgdmFyIE1BWF9VTlNJR05FRF9WQUxVRSQxID0gZnJvbUJpdHMkMSg0Mjk0OTY3Mjk1IHwgMCwgNDI5NDk2NzI5NSB8IDAsIHRydWUpOwogIExvbmckMS5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUUkMTsKICB2YXIgTUlOX1ZBTFVFJDEgPSBmcm9tQml0cyQxKDAsIDIxNDc0ODM2NDggfCAwLCBmYWxzZSk7CiAgTG9uZyQxLk1JTl9WQUxVRSA9IE1JTl9WQUxVRSQxOwogIHZhciBMb25nUHJvdG90eXBlJDEgPSBMb25nJDEucHJvdG90eXBlOwogIExvbmdQcm90b3R5cGUkMS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkgewogICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93OwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIyKCkgewogICAgaWYgKHRoaXMudW5zaWduZWQpCiAgICAgIHJldHVybiAodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMJDEgKyAodGhpcy5sb3cgPj4+IDApOwogICAgcmV0dXJuIHRoaXMuaGlnaCAqIFRXT19QV1JfMzJfREJMJDEgKyAodGhpcy5sb3cgPj4+IDApOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcyKHJhZGl4KSB7CiAgICByYWRpeCA9IHJhZGl4IHx8IDEwOwogICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KQogICAgICB0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpOwogICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgIHJldHVybiAiMCI7CiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHsKICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFJDEpKSB7CiAgICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIkMShyYWRpeCksIGRpdiA9IHRoaXMuZGl2KHJhZGl4TG9uZyksIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpOwogICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTsKICAgICAgfSBlbHNlCiAgICAgICAgcmV0dXJuICItIiArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpOwogICAgfQogICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIkMShwb3dfZGJsJDEocmFkaXgsIDYpLCB0aGlzLnVuc2lnbmVkKSwgcmVtID0gdGhpczsKICAgIHZhciByZXN1bHQgPSAiIjsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLCBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpOwogICAgICByZW0gPSByZW1EaXY7CiAgICAgIGlmIChyZW0uaXNaZXJvKCkpCiAgICAgICAgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDsKICAgICAgZWxzZSB7CiAgICAgICAgd2hpbGUgKGRpZ2l0cy5sZW5ndGggPCA2KQogICAgICAgICAgZGlnaXRzID0gIjAiICsgZGlnaXRzOwogICAgICAgIHJlc3VsdCA9ICIiICsgZGlnaXRzICsgcmVzdWx0OwogICAgICB9CiAgICB9CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZ2V0SGlnaEJpdHMgPSBmdW5jdGlvbiBnZXRIaWdoQml0cygpIHsKICAgIHJldHVybiB0aGlzLmhpZ2g7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZ2V0SGlnaEJpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzVW5zaWduZWQoKSB7CiAgICByZXR1cm4gdGhpcy5oaWdoID4+PiAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmdldExvd0JpdHMgPSBmdW5jdGlvbiBnZXRMb3dCaXRzKCkgewogICAgcmV0dXJuIHRoaXMubG93OwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmdldExvd0JpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldExvd0JpdHNVbnNpZ25lZCgpIHsKICAgIHJldHVybiB0aGlzLmxvdyA+Pj4gMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5nZXROdW1CaXRzQWJzID0gZnVuY3Rpb24gZ2V0TnVtQml0c0FicygpIHsKICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkKICAgICAgcmV0dXJuIHRoaXMuZXEoTUlOX1ZBTFVFJDEpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTsKICAgIHZhciB2YWwgPSB0aGlzLmhpZ2ggIT0gMCA/IHRoaXMuaGlnaCA6IHRoaXMubG93OwogICAgZm9yICh2YXIgYml0ID0gMzE7IGJpdCA+IDA7IGJpdC0tKQogICAgICBpZiAoKHZhbCAmIDEgPDwgYml0KSAhPSAwKQogICAgICAgIGJyZWFrOwogICAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHsKICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZXF6ID0gTG9uZ1Byb3RvdHlwZSQxLmlzWmVybzsKICBMb25nUHJvdG90eXBlJDEuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7CiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5pc1Bvc2l0aXZlID0gZnVuY3Rpb24gaXNQb3NpdGl2ZSgpIHsKICAgIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7CiAgICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkgewogICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikgewogICAgaWYgKCFpc0xvbmckMShvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlJDEob3RoZXIpOwogICAgaWYgKHRoaXMudW5zaWduZWQgIT09IG90aGVyLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiYgb3RoZXIuaGlnaCA+Pj4gMzEgPT09IDEpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IG90aGVyLmhpZ2ggJiYgdGhpcy5sb3cgPT09IG90aGVyLmxvdzsKICB9OwogIExvbmdQcm90b3R5cGUkMS5lcSA9IExvbmdQcm90b3R5cGUkMS5lcXVhbHM7CiAgTG9uZ1Byb3RvdHlwZSQxLm5vdEVxdWFscyA9IGZ1bmN0aW9uIG5vdEVxdWFscyhvdGhlcikgewogICAgcmV0dXJuICF0aGlzLmVxKG90aGVyKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5uZXEgPSBMb25nUHJvdG90eXBlJDEubm90RXF1YWxzOwogIExvbmdQcm90b3R5cGUkMS5uZSA9IExvbmdQcm90b3R5cGUkMS5ub3RFcXVhbHM7CiAgTG9uZ1Byb3RvdHlwZSQxLmxlc3NUaGFuID0gZnVuY3Rpb24gbGVzc1RoYW4ob3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmNvbXAob3RoZXIpIDwgMDsKICB9OwogIExvbmdQcm90b3R5cGUkMS5sdCA9IExvbmdQcm90b3R5cGUkMS5sZXNzVGhhbjsKICBMb25nUHJvdG90eXBlJDEubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5jb21wKG90aGVyKSA8PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmx0ZSA9IExvbmdQcm90b3R5cGUkMS5sZXNzVGhhbk9yRXF1YWw7CiAgTG9uZ1Byb3RvdHlwZSQxLmxlID0gTG9uZ1Byb3RvdHlwZSQxLmxlc3NUaGFuT3JFcXVhbDsKICBMb25nUHJvdG90eXBlJDEuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikgewogICAgcmV0dXJuIHRoaXMuY29tcChvdGhlcikgPiAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLmd0ID0gTG9uZ1Byb3RvdHlwZSQxLmdyZWF0ZXJUaGFuOwogIExvbmdQcm90b3R5cGUkMS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmNvbXAob3RoZXIpID49IDA7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZ3RlID0gTG9uZ1Byb3RvdHlwZSQxLmdyZWF0ZXJUaGFuT3JFcXVhbDsKICBMb25nUHJvdG90eXBlJDEuZ2UgPSBMb25nUHJvdG90eXBlJDEuZ3JlYXRlclRoYW5PckVxdWFsOwogIExvbmdQcm90b3R5cGUkMS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShvdGhlcikgewogICAgaWYgKCFpc0xvbmckMShvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlJDEob3RoZXIpOwogICAgaWYgKHRoaXMuZXEob3RoZXIpKQogICAgICByZXR1cm4gMDsKICAgIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksIG90aGVyTmVnID0gb3RoZXIuaXNOZWdhdGl2ZSgpOwogICAgaWYgKHRoaXNOZWcgJiYgIW90aGVyTmVnKQogICAgICByZXR1cm4gLTE7CiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpCiAgICAgIHJldHVybiAxOwogICAgaWYgKCF0aGlzLnVuc2lnbmVkKQogICAgICByZXR1cm4gdGhpcy5zdWIob3RoZXIpLmlzTmVnYXRpdmUoKSA/IC0xIDogMTsKICAgIHJldHVybiBvdGhlci5oaWdoID4+PiAwID4gdGhpcy5oaWdoID4+PiAwIHx8IG90aGVyLmhpZ2ggPT09IHRoaXMuaGlnaCAmJiBvdGhlci5sb3cgPj4+IDAgPiB0aGlzLmxvdyA+Pj4gMCA/IC0xIDogMTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5jb21wID0gTG9uZ1Byb3RvdHlwZSQxLmNvbXBhcmU7CiAgTG9uZ1Byb3RvdHlwZSQxLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHsKICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSQxKSkKICAgICAgcmV0dXJuIE1JTl9WQUxVRSQxOwogICAgcmV0dXJuIHRoaXMubm90KCkuYWRkKE9ORSQxKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5uZWcgPSBMb25nUHJvdG90eXBlJDEubmVnYXRlOwogIExvbmdQcm90b3R5cGUkMS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7CiAgICBpZiAoIWlzTG9uZyQxKGFkZGVuZCkpCiAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZSQxKGFkZGVuZCk7CiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjsKICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiA2NTUzNTsKICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7CiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiA2NTUzNTsKICAgIHZhciBiNDggPSBhZGRlbmQuaGlnaCA+Pj4gMTY7CiAgICB2YXIgYjMyID0gYWRkZW5kLmhpZ2ggJiA2NTUzNTsKICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjsKICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgNjU1MzU7CiAgICB2YXIgYzQ4ID0gMCwgYzMyID0gMCwgYzE2ID0gMCwgYzAwID0gMDsKICAgIGMwMCArPSBhMDAgKyBiMDA7CiAgICBjMTYgKz0gYzAwID4+PiAxNjsKICAgIGMwMCAmPSA2NTUzNTsKICAgIGMxNiArPSBhMTYgKyBiMTY7CiAgICBjMzIgKz0gYzE2ID4+PiAxNjsKICAgIGMxNiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMzIgKyBiMzI7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGM0OCArPSBhNDggKyBiNDg7CiAgICBjNDggJj0gNjU1MzU7CiAgICByZXR1cm4gZnJvbUJpdHMkMShjMTYgPDwgMTYgfCBjMDAsIGM0OCA8PCAxNiB8IGMzMiwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdChzdWJ0cmFoZW5kKSB7CiAgICBpZiAoIWlzTG9uZyQxKHN1YnRyYWhlbmQpKQogICAgICBzdWJ0cmFoZW5kID0gZnJvbVZhbHVlJDEoc3VidHJhaGVuZCk7CiAgICByZXR1cm4gdGhpcy5hZGQoc3VidHJhaGVuZC5uZWcoKSk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuc3ViID0gTG9uZ1Byb3RvdHlwZSQxLnN1YnRyYWN0OwogIExvbmdQcm90b3R5cGUkMS5tdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KG11bHRpcGxpZXIpIHsKICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICByZXR1cm4gdGhpczsKICAgIGlmICghaXNMb25nJDEobXVsdGlwbGllcikpCiAgICAgIG11bHRpcGxpZXIgPSBmcm9tVmFsdWUkMShtdWx0aXBsaWVyKTsKICAgIGlmICh3YXNtJDEpIHsKICAgICAgdmFyIGxvdyA9IHdhc20kMVsibXVsIl0oCiAgICAgICAgdGhpcy5sb3csCiAgICAgICAgdGhpcy5oaWdoLAogICAgICAgIG11bHRpcGxpZXIubG93LAogICAgICAgIG11bHRpcGxpZXIuaGlnaAogICAgICApOwogICAgICByZXR1cm4gZnJvbUJpdHMkMShsb3csIHdhc20kMVsiZ2V0X2hpZ2giXSgpLCB0aGlzLnVuc2lnbmVkKTsKICAgIH0KICAgIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKQogICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPJDEgOiBaRVJPJDE7CiAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUkMSkpCiAgICAgIHJldHVybiBtdWx0aXBsaWVyLmlzT2RkKCkgPyBNSU5fVkFMVUUkMSA6IFpFUk8kMTsKICAgIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSQxKSkKICAgICAgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSQxIDogWkVSTyQxOwogICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7CiAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkKICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllci5uZWcoKSk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllcikubmVnKCk7CiAgICB9IGVsc2UgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKQogICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7CiAgICBpZiAodGhpcy5sdChUV09fUFdSXzI0JDEpICYmIG11bHRpcGxpZXIubHQoVFdPX1BXUl8yNCQxKSkKICAgICAgcmV0dXJuIGZyb21OdW1iZXIkMSh0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpOwogICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7CiAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgNjU1MzU7CiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2OwogICAgdmFyIGEwMCA9IHRoaXMubG93ICYgNjU1MzU7CiAgICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjsKICAgIHZhciBiMzIgPSBtdWx0aXBsaWVyLmhpZ2ggJiA2NTUzNTsKICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7CiAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiA2NTUzNTsKICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwOwogICAgYzAwICs9IGEwMCAqIGIwMDsKICAgIGMxNiArPSBjMDAgPj4+IDE2OwogICAgYzAwICY9IDY1NTM1OwogICAgYzE2ICs9IGExNiAqIGIwMDsKICAgIGMzMiArPSBjMTYgPj4+IDE2OwogICAgYzE2ICY9IDY1NTM1OwogICAgYzE2ICs9IGEwMCAqIGIxNjsKICAgIGMzMiArPSBjMTYgPj4+IDE2OwogICAgYzE2ICY9IDY1NTM1OwogICAgYzMyICs9IGEzMiAqIGIwMDsKICAgIGM0OCArPSBjMzIgPj4+IDE2OwogICAgYzMyICY9IDY1NTM1OwogICAgYzMyICs9IGExNiAqIGIxNjsKICAgIGM0OCArPSBjMzIgPj4+IDE2OwogICAgYzMyICY9IDY1NTM1OwogICAgYzMyICs9IGEwMCAqIGIzMjsKICAgIGM0OCArPSBjMzIgPj4+IDE2OwogICAgYzMyICY9IDY1NTM1OwogICAgYzQ4ICs9IGE0OCAqIGIwMCArIGEzMiAqIGIxNiArIGExNiAqIGIzMiArIGEwMCAqIGI0ODsKICAgIGM0OCAmPSA2NTUzNTsKICAgIHJldHVybiBmcm9tQml0cyQxKGMxNiA8PCAxNiB8IGMwMCwgYzQ4IDw8IDE2IHwgYzMyLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5tdWwgPSBMb25nUHJvdG90eXBlJDEubXVsdGlwbHk7CiAgTG9uZ1Byb3RvdHlwZSQxLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7CiAgICBpZiAoIWlzTG9uZyQxKGRpdmlzb3IpKQogICAgICBkaXZpc29yID0gZnJvbVZhbHVlJDEoZGl2aXNvcik7CiAgICBpZiAoZGl2aXNvci5pc1plcm8oKSkKICAgICAgdGhyb3cgRXJyb3IoImRpdmlzaW9uIGJ5IHplcm8iKTsKICAgIGlmICh3YXNtJDEpIHsKICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA9PT0gLTIxNDc0ODM2NDggJiYgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtJDFbImRpdl91Il0gOiB3YXNtJDFbImRpdl9zIl0pKAogICAgICAgIHRoaXMubG93LAogICAgICAgIHRoaXMuaGlnaCwKICAgICAgICBkaXZpc29yLmxvdywKICAgICAgICBkaXZpc29yLmhpZ2gKICAgICAgKTsKICAgICAgcmV0dXJuIGZyb21CaXRzJDEobG93LCB3YXNtJDFbImdldF9oaWdoIl0oKSwgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyQxIDogWkVSTyQxOwogICAgdmFyIGFwcHJveCwgcmVtLCByZXM7CiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHsKICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFJDEpKSB7CiAgICAgICAgaWYgKGRpdmlzb3IuZXEoT05FJDEpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSQxKSkKICAgICAgICAgIHJldHVybiBNSU5fVkFMVUUkMTsKICAgICAgICBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSQxKSkKICAgICAgICAgIHJldHVybiBPTkUkMTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpOwogICAgICAgICAgYXBwcm94ID0gaGFsZlRoaXMuZGl2KGRpdmlzb3IpLnNobCgxKTsKICAgICAgICAgIGlmIChhcHByb3guZXEoWkVSTyQxKSkgewogICAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUkMSA6IE5FR19PTkUkMTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpOwogICAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSQxKSkKICAgICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPJDEgOiBaRVJPJDE7CiAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgewogICAgICAgIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTsKICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvcikubmVnKCk7CiAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpCiAgICAgICAgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpOwogICAgICByZXMgPSBaRVJPJDE7CiAgICB9IGVsc2UgewogICAgICBpZiAoIWRpdmlzb3IudW5zaWduZWQpCiAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpOwogICAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSkKICAgICAgICByZXR1cm4gVVpFUk8kMTsKICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSkKICAgICAgICByZXR1cm4gVU9ORSQxOwogICAgICByZXMgPSBVWkVSTyQxOwogICAgfQogICAgcmVtID0gdGhpczsKICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7CiAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTsKICAgICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSwgZGVsdGEgPSBsb2cyIDw9IDQ4ID8gMSA6IHBvd19kYmwkMSgyLCBsb2cyIC0gNDgpLCBhcHByb3hSZXMgPSBmcm9tTnVtYmVyJDEoYXBwcm94KSwgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTsKICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHsKICAgICAgICBhcHByb3ggLT0gZGVsdGE7CiAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlciQxKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7CiAgICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTsKICAgICAgfQogICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKQogICAgICAgIGFwcHJveFJlcyA9IE9ORSQxOwogICAgICByZXMgPSByZXMuYWRkKGFwcHJveFJlcyk7CiAgICAgIHJlbSA9IHJlbS5zdWIoYXBwcm94UmVtKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuZGl2ID0gTG9uZ1Byb3RvdHlwZSQxLmRpdmlkZTsKICBMb25nUHJvdG90eXBlJDEubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHsKICAgIGlmICghaXNMb25nJDEoZGl2aXNvcikpCiAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUkMShkaXZpc29yKTsKICAgIGlmICh3YXNtJDEpIHsKICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbSQxWyJyZW1fdSJdIDogd2FzbSQxWyJyZW1fcyJdKSgKICAgICAgICB0aGlzLmxvdywKICAgICAgICB0aGlzLmhpZ2gsCiAgICAgICAgZGl2aXNvci5sb3csCiAgICAgICAgZGl2aXNvci5oaWdoCiAgICAgICk7CiAgICAgIHJldHVybiBmcm9tQml0cyQxKGxvdywgd2FzbSQxWyJnZXRfaGlnaCJdKCksIHRoaXMudW5zaWduZWQpOwogICAgfQogICAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEubW9kID0gTG9uZ1Byb3RvdHlwZSQxLm1vZHVsbzsKICBMb25nUHJvdG90eXBlJDEucmVtID0gTG9uZ1Byb3RvdHlwZSQxLm1vZHVsbzsKICBMb25nUHJvdG90eXBlJDEubm90ID0gZnVuY3Rpb24gbm90KCkgewogICAgcmV0dXJuIGZyb21CaXRzJDEofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5jb3VudExlYWRpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50TGVhZGluZ1plcm9zKCkgewogICAgcmV0dXJuIHRoaXMuaGlnaCA/IE1hdGguY2x6MzIodGhpcy5oaWdoKSA6IE1hdGguY2x6MzIodGhpcy5sb3cpICsgMzI7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuY2x6ID0gTG9uZ1Byb3RvdHlwZSQxLmNvdW50TGVhZGluZ1plcm9zOwogIExvbmdQcm90b3R5cGUkMS5jb3VudFRyYWlsaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudFRyYWlsaW5nWmVyb3MoKSB7CiAgICByZXR1cm4gdGhpcy5sb3cgPyBjdHozMih0aGlzLmxvdykgOiBjdHozMih0aGlzLmhpZ2gpICsgMzI7CiAgfTsKICBMb25nUHJvdG90eXBlJDEuY3R6ID0gTG9uZ1Byb3RvdHlwZSQxLmNvdW50VHJhaWxpbmdaZXJvczsKICBMb25nUHJvdG90eXBlJDEuYW5kID0gZnVuY3Rpb24gYW5kKG90aGVyKSB7CiAgICBpZiAoIWlzTG9uZyQxKG90aGVyKSkKICAgICAgb3RoZXIgPSBmcm9tVmFsdWUkMShvdGhlcik7CiAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEub3IgPSBmdW5jdGlvbiBvcihvdGhlcikgewogICAgaWYgKCFpc0xvbmckMShvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlJDEob3RoZXIpOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnhvciA9IGZ1bmN0aW9uIHhvcihvdGhlcikgewogICAgaWYgKCFpc0xvbmckMShvdGhlcikpCiAgICAgIG90aGVyID0gZnJvbVZhbHVlJDEob3RoZXIpOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgXiBvdGhlci5sb3csIHRoaXMuaGlnaCBeIG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uIHNoaWZ0TGVmdChudW1CaXRzKSB7CiAgICBpZiAoaXNMb25nJDEobnVtQml0cykpCiAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7CiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKQogICAgICByZXR1cm4gdGhpczsKICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMikKICAgICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgPDwgbnVtQml0cywgdGhpcy5oaWdoIDw8IG51bUJpdHMgfCB0aGlzLmxvdyA+Pj4gMzIgLSBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIGZyb21CaXRzJDEoMCwgdGhpcy5sb3cgPDwgbnVtQml0cyAtIDMyLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5zaGwgPSBMb25nUHJvdG90eXBlJDEuc2hpZnRMZWZ0OwogIExvbmdQcm90b3R5cGUkMS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7CiAgICBpZiAoaXNMb25nJDEobnVtQml0cykpCiAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7CiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKQogICAgICByZXR1cm4gdGhpczsKICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMikKICAgICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgPj4+IG51bUJpdHMgfCB0aGlzLmhpZ2ggPDwgMzIgLSBudW1CaXRzLCB0aGlzLmhpZ2ggPj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7CiAgICBlbHNlCiAgICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMuaGlnaCA+PiBudW1CaXRzIC0gMzIsIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS5zaHIgPSBMb25nUHJvdG90eXBlJDEuc2hpZnRSaWdodDsKICBMb25nUHJvdG90eXBlJDEuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHsKICAgIGlmIChpc0xvbmckMShudW1CaXRzKSkKICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTsKICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApCiAgICAgIHJldHVybiB0aGlzOwogICAgaWYgKG51bUJpdHMgPCAzMikKICAgICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgPj4+IG51bUJpdHMgfCB0aGlzLmhpZ2ggPDwgMzIgLSBudW1CaXRzLCB0aGlzLmhpZ2ggPj4+IG51bUJpdHMsIHRoaXMudW5zaWduZWQpOwogICAgaWYgKG51bUJpdHMgPT09IDMyKQogICAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmhpZ2gsIDAsIHRoaXMudW5zaWduZWQpOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5oaWdoID4+PiBudW1CaXRzIC0gMzIsIDAsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZSQxLnNocnUgPSBMb25nUHJvdG90eXBlJDEuc2hpZnRSaWdodFVuc2lnbmVkOwogIExvbmdQcm90b3R5cGUkMS5zaHJfdSA9IExvbmdQcm90b3R5cGUkMS5zaGlmdFJpZ2h0VW5zaWduZWQ7CiAgTG9uZ1Byb3RvdHlwZSQxLnJvdGF0ZUxlZnQgPSBmdW5jdGlvbiByb3RhdGVMZWZ0KG51bUJpdHMpIHsKICAgIHZhciBiOwogICAgaWYgKGlzTG9uZyQxKG51bUJpdHMpKQogICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpOwogICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBpZiAobnVtQml0cyA9PT0gMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpOwogICAgaWYgKG51bUJpdHMgPCAzMikgewogICAgICBiID0gMzIgLSBudW1CaXRzOwogICAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmxvdyA8PCBudW1CaXRzIHwgdGhpcy5oaWdoID4+PiBiLCB0aGlzLmhpZ2ggPDwgbnVtQml0cyB8IHRoaXMubG93ID4+PiBiLCB0aGlzLnVuc2lnbmVkKTsKICAgIH0KICAgIG51bUJpdHMgLT0gMzI7CiAgICBiID0gMzIgLSBudW1CaXRzOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5oaWdoIDw8IG51bUJpdHMgfCB0aGlzLmxvdyA+Pj4gYiwgdGhpcy5sb3cgPDwgbnVtQml0cyB8IHRoaXMuaGlnaCA+Pj4gYiwgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEucm90bCA9IExvbmdQcm90b3R5cGUkMS5yb3RhdGVMZWZ0OwogIExvbmdQcm90b3R5cGUkMS5yb3RhdGVSaWdodCA9IGZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KG51bUJpdHMpIHsKICAgIHZhciBiOwogICAgaWYgKGlzTG9uZyQxKG51bUJpdHMpKQogICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpOwogICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBpZiAobnVtQml0cyA9PT0gMzIpCiAgICAgIHJldHVybiBmcm9tQml0cyQxKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpOwogICAgaWYgKG51bUJpdHMgPCAzMikgewogICAgICBiID0gMzIgLSBudW1CaXRzOwogICAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmhpZ2ggPDwgYiB8IHRoaXMubG93ID4+PiBudW1CaXRzLCB0aGlzLmxvdyA8PCBiIHwgdGhpcy5oaWdoID4+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTsKICAgIH0KICAgIG51bUJpdHMgLT0gMzI7CiAgICBiID0gMzIgLSBudW1CaXRzOwogICAgcmV0dXJuIGZyb21CaXRzJDEodGhpcy5sb3cgPDwgYiB8IHRoaXMuaGlnaCA+Pj4gbnVtQml0cywgdGhpcy5oaWdoIDw8IGIgfCB0aGlzLmxvdyA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEucm90ciA9IExvbmdQcm90b3R5cGUkMS5yb3RhdGVSaWdodDsKICBMb25nUHJvdG90eXBlJDEudG9TaWduZWQgPSBmdW5jdGlvbiB0b1NpZ25lZCgpIHsKICAgIGlmICghdGhpcy51bnNpZ25lZCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmxvdywgdGhpcy5oaWdoLCBmYWxzZSk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7CiAgICBpZiAodGhpcy51bnNpZ25lZCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gZnJvbUJpdHMkMSh0aGlzLmxvdywgdGhpcy5oaWdoLCB0cnVlKTsKICB9OwogIExvbmdQcm90b3R5cGUkMS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkgewogICAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7CiAgfTsKICBMb25nUHJvdG90eXBlJDEudG9CeXRlc0xFID0gZnVuY3Rpb24gdG9CeXRlc0xFKCkgewogICAgdmFyIGhpID0gdGhpcy5oaWdoLCBsbyA9IHRoaXMubG93OwogICAgcmV0dXJuIFsKICAgICAgbG8gJiAyNTUsCiAgICAgIGxvID4+PiA4ICYgMjU1LAogICAgICBsbyA+Pj4gMTYgJiAyNTUsCiAgICAgIGxvID4+PiAyNCwKICAgICAgaGkgJiAyNTUsCiAgICAgIGhpID4+PiA4ICYgMjU1LAogICAgICBoaSA+Pj4gMTYgJiAyNTUsCiAgICAgIGhpID4+PiAyNAogICAgXTsKICB9OwogIExvbmdQcm90b3R5cGUkMS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7CiAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsIGxvID0gdGhpcy5sb3c7CiAgICByZXR1cm4gWwogICAgICBoaSA+Pj4gMjQsCiAgICAgIGhpID4+PiAxNiAmIDI1NSwKICAgICAgaGkgPj4+IDggJiAyNTUsCiAgICAgIGhpICYgMjU1LAogICAgICBsbyA+Pj4gMjQsCiAgICAgIGxvID4+PiAxNiAmIDI1NSwKICAgICAgbG8gPj4+IDggJiAyNTUsCiAgICAgIGxvICYgMjU1CiAgICBdOwogIH07CiAgTG9uZyQxLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlczIoYnl0ZXMsIHVuc2lnbmVkLCBsZSkgewogICAgcmV0dXJuIGxlID8gTG9uZyQxLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nJDEuZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKTsKICB9OwogIExvbmckMS5mcm9tQnl0ZXNMRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgewogICAgcmV0dXJuIG5ldyBMb25nJDEoCiAgICAgIGJ5dGVzWzBdIHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbM10gPDwgMjQsCiAgICAgIGJ5dGVzWzRdIHwgYnl0ZXNbNV0gPDwgOCB8IGJ5dGVzWzZdIDw8IDE2IHwgYnl0ZXNbN10gPDwgMjQsCiAgICAgIHVuc2lnbmVkCiAgICApOwogIH07CiAgTG9uZyQxLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7CiAgICByZXR1cm4gbmV3IExvbmckMSgKICAgICAgYnl0ZXNbNF0gPDwgMjQgfCBieXRlc1s1XSA8PCAxNiB8IGJ5dGVzWzZdIDw8IDggfCBieXRlc1s3XSwKICAgICAgYnl0ZXNbMF0gPDwgMjQgfCBieXRlc1sxXSA8PCAxNiB8IGJ5dGVzWzJdIDw8IDggfCBieXRlc1szXSwKICAgICAgdW5zaWduZWQKICAgICk7CiAgfTsKICBmdW5jdGlvbiBsb25nVG9OdW1iZXIobG9uZzIpIHsKICAgIGlmIChsb25nMi5ncmVhdGVyVGhhbihOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgfHwgbG9uZzIubGVzc1RoYW4oTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiaW50ZWdlciBvdmVyZmxvdyIpOwogICAgfQogICAgcmV0dXJuIGxvbmcyLnRvTnVtYmVyKCk7CiAgfQogIGNsYXNzIEFib3J0RXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgfQogIGZ1bmN0aW9uIGNoZWNrQWJvcnRTaWduYWwoc2lnbmFsKSB7CiAgICBpZiAoIXNpZ25hbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHsKICAgICAgaWYgKHR5cGVvZiBET01FeGNlcHRpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiYWJvcnRlZCIsICJBYm9ydEVycm9yIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZSA9IG5ldyBBYm9ydEVycm9yKCJhYm9ydGVkIik7CiAgICAgICAgZS5jb2RlID0gIkVSUl9BQk9SVEVEIjsKICAgICAgICB0aHJvdyBlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNhbk1lcmdlQmxvY2tzKGNodW5rMSwgY2h1bmsyKSB7CiAgICByZXR1cm4gY2h1bmsyLm1pbnYuYmxvY2tQb3NpdGlvbiAtIGNodW5rMS5tYXh2LmJsb2NrUG9zaXRpb24gPCA2NWUzICYmIGNodW5rMi5tYXh2LmJsb2NrUG9zaXRpb24gLSBjaHVuazEubWludi5ibG9ja1Bvc2l0aW9uIDwgNWU2OwogIH0KICBmdW5jdGlvbiBvcHRpbWl6ZUNodW5rcyhjaHVua3MsIGxvd2VzdCkgewogICAgY29uc3QgbWVyZ2VkQ2h1bmtzID0gW107CiAgICBsZXQgbGFzdENodW5rID0gbnVsbDsKICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBjaHVua3M7CiAgICB9CiAgICBjaHVua3Muc29ydChmdW5jdGlvbihjMCwgYzEpIHsKICAgICAgY29uc3QgZGlmID0gYzAubWludi5ibG9ja1Bvc2l0aW9uIC0gYzEubWludi5ibG9ja1Bvc2l0aW9uOwogICAgICBpZiAoZGlmICE9PSAwKSB7CiAgICAgICAgcmV0dXJuIGRpZjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gYzAubWludi5kYXRhUG9zaXRpb24gLSBjMS5taW52LmRhdGFQb3NpdGlvbjsKICAgICAgfQogICAgfSk7CiAgICBjaHVua3MuZm9yRWFjaCgoY2h1bmspID0+IHsKICAgICAgaWYgKCFsb3dlc3QgfHwgY2h1bmsubWF4di5jb21wYXJlVG8obG93ZXN0KSA+IDApIHsKICAgICAgICBpZiAobGFzdENodW5rID09PSBudWxsKSB7CiAgICAgICAgICBtZXJnZWRDaHVua3MucHVzaChjaHVuayk7CiAgICAgICAgICBsYXN0Q2h1bmsgPSBjaHVuazsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGNhbk1lcmdlQmxvY2tzKGxhc3RDaHVuaywgY2h1bmspKSB7CiAgICAgICAgICAgIGlmIChjaHVuay5tYXh2LmNvbXBhcmVUbyhsYXN0Q2h1bmsubWF4dikgPiAwKSB7CiAgICAgICAgICAgICAgbGFzdENodW5rLm1heHYgPSBjaHVuay5tYXh2OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXJnZWRDaHVua3MucHVzaChjaHVuayk7CiAgICAgICAgICAgIGxhc3RDaHVuayA9IGNodW5rOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbWVyZ2VkQ2h1bmtzOwogIH0KICB2YXIgbG9uZyA9IExvbmc7CiAgdmFyIHdhc20gPSBudWxsOwogIHRyeSB7CiAgICB3YXNtID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUobmV3IFVpbnQ4QXJyYXkoWwogICAgICAwLAogICAgICA5NywKICAgICAgMTE1LAogICAgICAxMDksCiAgICAgIDEsCiAgICAgIDAsCiAgICAgIDAsCiAgICAgIDAsCiAgICAgIDEsCiAgICAgIDEzLAogICAgICAyLAogICAgICA5NiwKICAgICAgMCwKICAgICAgMSwKICAgICAgMTI3LAogICAgICA5NiwKICAgICAgNCwKICAgICAgMTI3LAogICAgICAxMjcsCiAgICAgIDEyNywKICAgICAgMTI3LAogICAgICAxLAogICAgICAxMjcsCiAgICAgIDMsCiAgICAgIDcsCiAgICAgIDYsCiAgICAgIDAsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDYsCiAgICAgIDYsCiAgICAgIDEsCiAgICAgIDEyNywKICAgICAgMSwKICAgICAgNjUsCiAgICAgIDAsCiAgICAgIDExLAogICAgICA3LAogICAgICA1MCwKICAgICAgNiwKICAgICAgMywKICAgICAgMTA5LAogICAgICAxMTcsCiAgICAgIDEwOCwKICAgICAgMCwKICAgICAgMSwKICAgICAgNSwKICAgICAgMTAwLAogICAgICAxMDUsCiAgICAgIDExOCwKICAgICAgOTUsCiAgICAgIDExNSwKICAgICAgMCwKICAgICAgMiwKICAgICAgNSwKICAgICAgMTAwLAogICAgICAxMDUsCiAgICAgIDExOCwKICAgICAgOTUsCiAgICAgIDExNywKICAgICAgMCwKICAgICAgMywKICAgICAgNSwKICAgICAgMTE0LAogICAgICAxMDEsCiAgICAgIDEwOSwKICAgICAgOTUsCiAgICAgIDExNSwKICAgICAgMCwKICAgICAgNCwKICAgICAgNSwKICAgICAgMTE0LAogICAgICAxMDEsCiAgICAgIDEwOSwKICAgICAgOTUsCiAgICAgIDExNywKICAgICAgMCwKICAgICAgNSwKICAgICAgOCwKICAgICAgMTAzLAogICAgICAxMDEsCiAgICAgIDExNiwKICAgICAgOTUsCiAgICAgIDEwNCwKICAgICAgMTA1LAogICAgICAxMDMsCiAgICAgIDEwNCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMTAsCiAgICAgIDE5MSwKICAgICAgMSwKICAgICAgNiwKICAgICAgNCwKICAgICAgMCwKICAgICAgMzUsCiAgICAgIDAsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMjYsCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEyNywKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMSwKICAgICAgMzYsCiAgICAgIDEsCiAgICAgIDEsCiAgICAgIDEyNiwKICAgICAgMzIsCiAgICAgIDAsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDEsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMzIsCiAgICAgIDIsCiAgICAgIDE3MywKICAgICAgMzIsCiAgICAgIDMsCiAgICAgIDE3MywKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzQsCiAgICAgIDEzMiwKICAgICAgMTI4LAogICAgICAzNCwKICAgICAgNCwKICAgICAgNjYsCiAgICAgIDMyLAogICAgICAxMzUsCiAgICAgIDE2NywKICAgICAgMzYsCiAgICAgIDAsCiAgICAgIDMyLAogICAgICA0LAogICAgICAxNjcsCiAgICAgIDExLAogICAgICAzNiwKICAgICAgMSwKICAgICAgMSwKICAgICAgMTI2LAogICAgICAzMiwKICAgICAgMCwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMSwKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAzMiwKICAgICAgMiwKICAgICAgMTczLAogICAgICAzMiwKICAgICAgMywKICAgICAgMTczLAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNCwKICAgICAgMTMyLAogICAgICAxMjksCiAgICAgIDM0LAogICAgICA0LAogICAgICA2NiwKICAgICAgMzIsCiAgICAgIDEzNSwKICAgICAgMTY3LAogICAgICAzNiwKICAgICAgMCwKICAgICAgMzIsCiAgICAgIDQsCiAgICAgIDE2NywKICAgICAgMTEsCiAgICAgIDM2LAogICAgICAxLAogICAgICAxLAogICAgICAxMjYsCiAgICAgIDMyLAogICAgICAwLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAxLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDMyLAogICAgICAyLAogICAgICAxNzMsCiAgICAgIDMyLAogICAgICAzLAogICAgICAxNzMsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM0LAogICAgICAxMzIsCiAgICAgIDEzMCwKICAgICAgMzQsCiAgICAgIDQsCiAgICAgIDY2LAogICAgICAzMiwKICAgICAgMTM1LAogICAgICAxNjcsCiAgICAgIDM2LAogICAgICAwLAogICAgICAzMiwKICAgICAgNCwKICAgICAgMTY3LAogICAgICAxMQogICAgXSkpLCB7fSkuZXhwb3J0czsKICB9IGNhdGNoIChlKSB7CiAgfQogIGZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkgewogICAgdGhpcy5sb3cgPSBsb3cgfCAwOwogICAgdGhpcy5oaWdoID0gaGlnaCB8IDA7CiAgICB0aGlzLnVuc2lnbmVkID0gISF1bnNpZ25lZDsKICB9CiAgTG9uZy5wcm90b3R5cGUuX19pc0xvbmdfXzsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTG9uZy5wcm90b3R5cGUsICJfX2lzTG9uZ19fIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICBmdW5jdGlvbiBpc0xvbmcob2JqKSB7CiAgICByZXR1cm4gKG9iaiAmJiBvYmpbIl9faXNMb25nX18iXSkgPT09IHRydWU7CiAgfQogIExvbmcuaXNMb25nID0gaXNMb25nOwogIHZhciBJTlRfQ0FDSEUgPSB7fTsKICB2YXIgVUlOVF9DQUNIRSA9IHt9OwogIGZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7CiAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlOwogICAgaWYgKHVuc2lnbmVkKSB7CiAgICAgIHZhbHVlID4+Pj0gMDsKICAgICAgaWYgKGNhY2hlID0gMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDI1NikgewogICAgICAgIGNhY2hlZE9iaiA9IFVJTlRfQ0FDSEVbdmFsdWVdOwogICAgICAgIGlmIChjYWNoZWRPYmopCiAgICAgICAgICByZXR1cm4gY2FjaGVkT2JqOwogICAgICB9CiAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAodmFsdWUgfCAwKSA8IDAgPyAtMSA6IDAsIHRydWUpOwogICAgICBpZiAoY2FjaGUpCiAgICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7CiAgICAgIHJldHVybiBvYmo7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSB8PSAwOwogICAgICBpZiAoY2FjaGUgPSAtMTI4IDw9IHZhbHVlICYmIHZhbHVlIDwgMTI4KSB7CiAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTsKICAgICAgICBpZiAoY2FjaGVkT2JqKQogICAgICAgICAgcmV0dXJuIGNhY2hlZE9iajsKICAgICAgfQogICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7CiAgICAgIGlmIChjYWNoZSkKICAgICAgICBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqOwogICAgICByZXR1cm4gb2JqOwogICAgfQogIH0KICBMb25nLmZyb21JbnQgPSBmcm9tSW50OwogIGZ1bmN0aW9uIGZyb21OdW1iZXIodmFsdWUsIHVuc2lnbmVkKSB7CiAgICBpZiAoaXNOYU4odmFsdWUpKQogICAgICByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87CiAgICBpZiAodW5zaWduZWQpIHsKICAgICAgaWYgKHZhbHVlIDwgMCkKICAgICAgICByZXR1cm4gVVpFUk87CiAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTCkKICAgICAgICByZXR1cm4gTUFYX1VOU0lHTkVEX1ZBTFVFOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTCkKICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOwogICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKQogICAgICAgIHJldHVybiBNQVhfVkFMVUU7CiAgICB9CiAgICBpZiAodmFsdWUgPCAwKQogICAgICByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTsKICAgIHJldHVybiBmcm9tQml0cyh2YWx1ZSAlIFRXT19QV1JfMzJfREJMIHwgMCwgdmFsdWUgLyBUV09fUFdSXzMyX0RCTCB8IDAsIHVuc2lnbmVkKTsKICB9CiAgTG9uZy5mcm9tTnVtYmVyID0gZnJvbU51bWJlcjsKICBmdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHsKICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpOwogIH0KICBMb25nLmZyb21CaXRzID0gZnJvbUJpdHM7CiAgdmFyIHBvd19kYmwgPSBNYXRoLnBvdzsKICBmdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7CiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkKICAgICAgdGhyb3cgRXJyb3IoImVtcHR5IHN0cmluZyIpOwogICAgaWYgKHN0ciA9PT0gIk5hTiIgfHwgc3RyID09PSAiSW5maW5pdHkiIHx8IHN0ciA9PT0gIitJbmZpbml0eSIgfHwgc3RyID09PSAiLUluZmluaXR5IikKICAgICAgcmV0dXJuIFpFUk87CiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAibnVtYmVyIikgewogICAgICByYWRpeCA9IHVuc2lnbmVkLCB1bnNpZ25lZCA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgdW5zaWduZWQgPSAhIXVuc2lnbmVkOwogICAgfQogICAgcmFkaXggPSByYWRpeCB8fCAxMDsKICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkKICAgICAgdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTsKICAgIHZhciBwOwogICAgaWYgKChwID0gc3RyLmluZGV4T2YoIi0iKSkgPiAwKQogICAgICB0aHJvdyBFcnJvcigiaW50ZXJpb3IgaHlwaGVuIik7CiAgICBlbHNlIGlmIChwID09PSAwKSB7CiAgICAgIHJldHVybiBmcm9tU3RyaW5nKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7CiAgICB9CiAgICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7CiAgICB2YXIgcmVzdWx0ID0gWkVSTzsKICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzdHIubGVuZ3RoOyBpMiArPSA4KSB7CiAgICAgIHZhciBzaXplID0gTWF0aC5taW4oOCwgc3RyLmxlbmd0aCAtIGkyKSwgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGkyLCBpMiArIHNpemUpLCByYWRpeCk7CiAgICAgIGlmIChzaXplIDwgOCkgewogICAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgc2l6ZSkpOwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpOwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpOwogICAgICB9CiAgICB9CiAgICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIExvbmcuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7CiAgZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHsKICAgIGlmICh0eXBlb2YgdmFsID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIGZyb21OdW1iZXIodmFsLCB1bnNpZ25lZCk7CiAgICBpZiAodHlwZW9mIHZhbCA9PT0gInN0cmluZyIpCiAgICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbCwgdW5zaWduZWQpOwogICAgcmV0dXJuIGZyb21CaXRzKHZhbC5sb3csIHZhbC5oaWdoLCB0eXBlb2YgdW5zaWduZWQgPT09ICJib29sZWFuIiA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkKTsKICB9CiAgTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7CiAgdmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjsKICB2YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0OwogIHZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7CiAgdmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDsKICB2YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7CiAgdmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTsKICB2YXIgWkVSTyA9IGZyb21JbnQoMCk7CiAgTG9uZy5aRVJPID0gWkVSTzsKICB2YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpOwogIExvbmcuVVpFUk8gPSBVWkVSTzsKICB2YXIgT05FID0gZnJvbUludCgxKTsKICBMb25nLk9ORSA9IE9ORTsKICB2YXIgVU9ORSA9IGZyb21JbnQoMSwgdHJ1ZSk7CiAgTG9uZy5VT05FID0gVU9ORTsKICB2YXIgTkVHX09ORSA9IGZyb21JbnQoLTEpOwogIExvbmcuTkVHX09ORSA9IE5FR19PTkU7CiAgdmFyIE1BWF9WQUxVRSA9IGZyb21CaXRzKDQyOTQ5NjcyOTUgfCAwLCAyMTQ3NDgzNjQ3IHwgMCwgZmFsc2UpOwogIExvbmcuTUFYX1ZBTFVFID0gTUFYX1ZBTFVFOwogIHZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cyg0Mjk0OTY3Mjk1IHwgMCwgNDI5NDk2NzI5NSB8IDAsIHRydWUpOwogIExvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFOwogIHZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAyMTQ3NDgzNjQ4IHwgMCwgZmFsc2UpOwogIExvbmcuTUlOX1ZBTFVFID0gTUlOX1ZBTFVFOwogIHZhciBMb25nUHJvdG90eXBlID0gTG9uZy5wcm90b3R5cGU7CiAgTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkgewogICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93OwogIH07CiAgTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyMigpIHsKICAgIGlmICh0aGlzLnVuc2lnbmVkKQogICAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7CiAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApOwogIH07CiAgTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nMihyYWRpeCkgewogICAgcmFkaXggPSByYWRpeCB8fCAxMDsKICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkKICAgICAgdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTsKICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICByZXR1cm4gIjAiOwogICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7CiAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHsKICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksIGRpdiA9IHRoaXMuZGl2KHJhZGl4TG9uZyksIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpOwogICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTsKICAgICAgfSBlbHNlCiAgICAgICAgcmV0dXJuICItIiArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpOwogICAgfQogICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLCByZW0gPSB0aGlzOwogICAgdmFyIHJlc3VsdCA9ICIiOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIHJlbURpdiA9IHJlbS5kaXYocmFkaXhUb1Bvd2VyKSwgaW50dmFsID0gcmVtLnN1YihyZW1EaXYubXVsKHJhZGl4VG9Qb3dlcikpLnRvSW50KCkgPj4+IDAsIGRpZ2l0cyA9IGludHZhbC50b1N0cmluZyhyYWRpeCk7CiAgICAgIHJlbSA9IHJlbURpdjsKICAgICAgaWYgKHJlbS5pc1plcm8oKSkKICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0OwogICAgICBlbHNlIHsKICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpCiAgICAgICAgICBkaWdpdHMgPSAiMCIgKyBkaWdpdHM7CiAgICAgICAgcmVzdWx0ID0gIiIgKyBkaWdpdHMgKyByZXN1bHQ7CiAgICAgIH0KICAgIH0KICB9OwogIExvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHMgPSBmdW5jdGlvbiBnZXRIaWdoQml0cygpIHsKICAgIHJldHVybiB0aGlzLmhpZ2g7CiAgfTsKICBMb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkgewogICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDsKICB9OwogIExvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7CiAgICByZXR1cm4gdGhpcy5sb3c7CiAgfTsKICBMb25nUHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldExvd0JpdHNVbnNpZ25lZCgpIHsKICAgIHJldHVybiB0aGlzLmxvdyA+Pj4gMDsKICB9OwogIExvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7CiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpCiAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpOwogICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7CiAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pCiAgICAgIGlmICgodmFsICYgMSA8PCBiaXQpICE9IDApCiAgICAgICAgYnJlYWs7CiAgICByZXR1cm4gdGhpcy5oaWdoICE9IDAgPyBiaXQgKyAzMyA6IGJpdCArIDE7CiAgfTsKICBMb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHsKICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvOwogIExvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7CiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDsKICB9OwogIExvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7CiAgICByZXR1cm4gdGhpcy51bnNpZ25lZCB8fCB0aGlzLmhpZ2ggPj0gMDsKICB9OwogIExvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHsKICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTsKICB9OwogIExvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkgewogICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHsKICAgIGlmICghaXNMb25nKG90aGVyKSkKICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpOwogICAgaWYgKHRoaXMudW5zaWduZWQgIT09IG90aGVyLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiYgb3RoZXIuaGlnaCA+Pj4gMzEgPT09IDEpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IG90aGVyLmhpZ2ggJiYgdGhpcy5sb3cgPT09IG90aGVyLmxvdzsKICB9OwogIExvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFsczsKICBMb25nUHJvdG90eXBlLm5vdEVxdWFscyA9IGZ1bmN0aW9uIG5vdEVxdWFscyhvdGhlcikgewogICAgcmV0dXJuICF0aGlzLmVxKG90aGVyKTsKICB9OwogIExvbmdQcm90b3R5cGUubmVxID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7CiAgTG9uZ1Byb3RvdHlwZS5uZSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzOwogIExvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikgewogICAgcmV0dXJuIHRoaXMuY29tcChvdGhlcikgPCAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5sdCA9IExvbmdQcm90b3R5cGUubGVzc1RoYW47CiAgTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmNvbXAob3RoZXIpIDw9IDA7CiAgfTsKICBMb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsOwogIExvbmdQcm90b3R5cGUubGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDsKICBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gZ3JlYXRlclRoYW4ob3RoZXIpIHsKICAgIHJldHVybiB0aGlzLmNvbXAob3RoZXIpID4gMDsKICB9OwogIExvbmdQcm90b3R5cGUuZ3QgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuOwogIExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsID0gZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKG90aGVyKSB7CiAgICByZXR1cm4gdGhpcy5jb21wKG90aGVyKSA+PSAwOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5ndGUgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDsKICBMb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7CiAgTG9uZ1Byb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShvdGhlcikgewogICAgaWYgKCFpc0xvbmcob3RoZXIpKQogICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7CiAgICBpZiAodGhpcy5lcShvdGhlcikpCiAgICAgIHJldHVybiAwOwogICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSwgb3RoZXJOZWcgPSBvdGhlci5pc05lZ2F0aXZlKCk7CiAgICBpZiAodGhpc05lZyAmJiAhb3RoZXJOZWcpCiAgICAgIHJldHVybiAtMTsKICAgIGlmICghdGhpc05lZyAmJiBvdGhlck5lZykKICAgICAgcmV0dXJuIDE7CiAgICBpZiAoIXRoaXMudW5zaWduZWQpCiAgICAgIHJldHVybiB0aGlzLnN1YihvdGhlcikuaXNOZWdhdGl2ZSgpID8gLTEgOiAxOwogICAgcmV0dXJuIG90aGVyLmhpZ2ggPj4+IDAgPiB0aGlzLmhpZ2ggPj4+IDAgfHwgb3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIG90aGVyLmxvdyA+Pj4gMCA+IHRoaXMubG93ID4+PiAwID8gLTEgOiAxOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlOwogIExvbmdQcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkgewogICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuZXEoTUlOX1ZBTFVFKSkKICAgICAgcmV0dXJuIE1JTl9WQUxVRTsKICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5uZWcgPSBMb25nUHJvdG90eXBlLm5lZ2F0ZTsKICBMb25nUHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChhZGRlbmQpIHsKICAgIGlmICghaXNMb25nKGFkZGVuZCkpCiAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpOwogICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7CiAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgNjU1MzU7CiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2OwogICAgdmFyIGEwMCA9IHRoaXMubG93ICYgNjU1MzU7CiAgICB2YXIgYjQ4ID0gYWRkZW5kLmhpZ2ggPj4+IDE2OwogICAgdmFyIGIzMiA9IGFkZGVuZC5oaWdoICYgNjU1MzU7CiAgICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7CiAgICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDY1NTM1OwogICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7CiAgICBjMDAgKz0gYTAwICsgYjAwOwogICAgYzE2ICs9IGMwMCA+Pj4gMTY7CiAgICBjMDAgJj0gNjU1MzU7CiAgICBjMTYgKz0gYTE2ICsgYjE2OwogICAgYzMyICs9IGMxNiA+Pj4gMTY7CiAgICBjMTYgJj0gNjU1MzU7CiAgICBjMzIgKz0gYTMyICsgYjMyOwogICAgYzQ4ICs9IGMzMiA+Pj4gMTY7CiAgICBjMzIgJj0gNjU1MzU7CiAgICBjNDggKz0gYTQ4ICsgYjQ4OwogICAgYzQ4ICY9IDY1NTM1OwogICAgcmV0dXJuIGZyb21CaXRzKGMxNiA8PCAxNiB8IGMwMCwgYzQ4IDw8IDE2IHwgYzMyLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdChzdWJ0cmFoZW5kKSB7CiAgICBpZiAoIWlzTG9uZyhzdWJ0cmFoZW5kKSkKICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTsKICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTsKICB9OwogIExvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDsKICBMb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikgewogICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgIHJldHVybiBaRVJPOwogICAgaWYgKCFpc0xvbmcobXVsdGlwbGllcikpCiAgICAgIG11bHRpcGxpZXIgPSBmcm9tVmFsdWUobXVsdGlwbGllcik7CiAgICBpZiAod2FzbSkgewogICAgICB2YXIgbG93ID0gd2FzbS5tdWwoCiAgICAgICAgdGhpcy5sb3csCiAgICAgICAgdGhpcy5oaWdoLAogICAgICAgIG11bHRpcGxpZXIubG93LAogICAgICAgIG11bHRpcGxpZXIuaGlnaAogICAgICApOwogICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpOwogICAgfQogICAgaWYgKG11bHRpcGxpZXIuaXNaZXJvKCkpCiAgICAgIHJldHVybiBaRVJPOwogICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkKICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87CiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKQogICAgICByZXR1cm4gdGhpcy5pc09kZCgpID8gTUlOX1ZBTFVFIDogWkVSTzsKICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgewogICAgICBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpCiAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpOwogICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkKICAgICAgcmV0dXJuIHRoaXMubXVsKG11bHRpcGxpZXIubmVnKCkpLm5lZygpOwogICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSkKICAgICAgcmV0dXJuIGZyb21OdW1iZXIodGhpcy50b051bWJlcigpICogbXVsdGlwbGllci50b051bWJlcigpLCB0aGlzLnVuc2lnbmVkKTsKICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2OwogICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDY1NTM1OwogICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjsKICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDY1NTM1OwogICAgdmFyIGI0OCA9IG11bHRpcGxpZXIuaGlnaCA+Pj4gMTY7CiAgICB2YXIgYjMyID0gbXVsdGlwbGllci5oaWdoICYgNjU1MzU7CiAgICB2YXIgYjE2ID0gbXVsdGlwbGllci5sb3cgPj4+IDE2OwogICAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgNjU1MzU7CiAgICB2YXIgYzQ4ID0gMCwgYzMyID0gMCwgYzE2ID0gMCwgYzAwID0gMDsKICAgIGMwMCArPSBhMDAgKiBiMDA7CiAgICBjMTYgKz0gYzAwID4+PiAxNjsKICAgIGMwMCAmPSA2NTUzNTsKICAgIGMxNiArPSBhMTYgKiBiMDA7CiAgICBjMzIgKz0gYzE2ID4+PiAxNjsKICAgIGMxNiAmPSA2NTUzNTsKICAgIGMxNiArPSBhMDAgKiBiMTY7CiAgICBjMzIgKz0gYzE2ID4+PiAxNjsKICAgIGMxNiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMzIgKiBiMDA7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMTYgKiBiMTY7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGMzMiArPSBhMDAgKiBiMzI7CiAgICBjNDggKz0gYzMyID4+PiAxNjsKICAgIGMzMiAmPSA2NTUzNTsKICAgIGM0OCArPSBhNDggKiBiMDAgKyBhMzIgKiBiMTYgKyBhMTYgKiBiMzIgKyBhMDAgKiBiNDg7CiAgICBjNDggJj0gNjU1MzU7CiAgICByZXR1cm4gZnJvbUJpdHMoYzE2IDw8IDE2IHwgYzAwLCBjNDggPDwgMTYgfCBjMzIsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5OwogIExvbmdQcm90b3R5cGUuZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGRpdmlzb3IpIHsKICAgIGlmICghaXNMb25nKGRpdmlzb3IpKQogICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpOwogICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpCiAgICAgIHRocm93IEVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7CiAgICBpZiAod2FzbSkgewogICAgICBpZiAoIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoID09PSAtMjE0NzQ4MzY0OCAmJiBkaXZpc29yLmxvdyA9PT0gLTEgJiYgZGl2aXNvci5oaWdoID09PSAtMSkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20uZGl2X3UgOiB3YXNtLmRpdl9zKSgKICAgICAgICB0aGlzLmxvdywKICAgICAgICB0aGlzLmhpZ2gsCiAgICAgICAgZGl2aXNvci5sb3csCiAgICAgICAgZGl2aXNvci5oaWdoCiAgICAgICk7CiAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc20uZ2V0X2hpZ2goKSwgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87CiAgICB2YXIgYXBwcm94LCByZW0sIHJlczsKICAgIGlmICghdGhpcy51bnNpZ25lZCkgewogICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7CiAgICAgICAgaWYgKGRpdmlzb3IuZXEoT05FKSB8fCBkaXZpc29yLmVxKE5FR19PTkUpKQogICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsKICAgICAgICBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpCiAgICAgICAgICByZXR1cm4gT05FOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGhhbGZUaGlzID0gdGhpcy5zaHIoMSk7CiAgICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpOwogICAgICAgICAgaWYgKGFwcHJveC5lcShaRVJPKSkgewogICAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUgOiBORUdfT05FOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7CiAgICAgICAgICAgIHJlcyA9IGFwcHJveC5hZGQocmVtLmRpdihkaXZpc29yKSk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkKICAgICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTzsKICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7CiAgICAgICAgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IubmVnKCkpOwogICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTsKICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkKICAgICAgICByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7CiAgICAgIHJlcyA9IFpFUk87CiAgICB9IGVsc2UgewogICAgICBpZiAoIWRpdmlzb3IudW5zaWduZWQpCiAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpOwogICAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSkKICAgICAgICByZXR1cm4gVVpFUk87CiAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpCiAgICAgICAgcmV0dXJuIFVPTkU7CiAgICAgIHJlcyA9IFVaRVJPOwogICAgfQogICAgcmVtID0gdGhpczsKICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7CiAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTsKICAgICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSwgZGVsdGEgPSBsb2cyIDw9IDQ4ID8gMSA6IHBvd19kYmwoMiwgbG9nMiAtIDQ4KSwgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLCBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpOwogICAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkgewogICAgICAgIGFwcHJveCAtPSBkZWx0YTsKICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7CiAgICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTsKICAgICAgfQogICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKQogICAgICAgIGFwcHJveFJlcyA9IE9ORTsKICAgICAgcmVzID0gcmVzLmFkZChhcHByb3hSZXMpOwogICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTsKICBMb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7CiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSkKICAgICAgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTsKICAgIGlmICh3YXNtKSB7CiAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20ucmVtX3UgOiB3YXNtLnJlbV9zKSgKICAgICAgICB0aGlzLmxvdywKICAgICAgICB0aGlzLmhpZ2gsCiAgICAgICAgZGl2aXNvci5sb3csCiAgICAgICAgZGl2aXNvci5oaWdoCiAgICAgICk7CiAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc20uZ2V0X2hpZ2goKSwgdGhpcy51bnNpZ25lZCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTsKICB9OwogIExvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87CiAgTG9uZ1Byb3RvdHlwZS5yZW0gPSBMb25nUHJvdG90eXBlLm1vZHVsbzsKICBMb25nUHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uIG5vdCgpIHsKICAgIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHsKICAgIGlmICghaXNMb25nKG90aGVyKSkKICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpOwogICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93ICYgb3RoZXIubG93LCB0aGlzLmhpZ2ggJiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvcihvdGhlcikgewogICAgaWYgKCFpc0xvbmcob3RoZXIpKQogICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7CiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHsKICAgIGlmICghaXNMb25nKG90aGVyKSkKICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpOwogICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTsKICB9OwogIExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0ID0gZnVuY3Rpb24gc2hpZnRMZWZ0KG51bUJpdHMpIHsKICAgIGlmIChpc0xvbmcobnVtQml0cykpCiAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7CiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKQogICAgICByZXR1cm4gdGhpczsKICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMikKICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IDw8IG51bUJpdHMsIHRoaXMuaGlnaCA8PCBudW1CaXRzIHwgdGhpcy5sb3cgPj4+IDMyIC0gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7CiAgICBlbHNlCiAgICAgIHJldHVybiBmcm9tQml0cygwLCB0aGlzLmxvdyA8PCBudW1CaXRzIC0gMzIsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDsKICBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0KG51bUJpdHMpIHsKICAgIGlmIChpc0xvbmcobnVtQml0cykpCiAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7CiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKQogICAgICByZXR1cm4gdGhpczsKICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMikKICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93ID4+PiBudW1CaXRzIHwgdGhpcy5oaWdoIDw8IDMyIC0gbnVtQml0cywgdGhpcy5oaWdoID4+IG51bUJpdHMsIHRoaXMudW5zaWduZWQpOwogICAgZWxzZQogICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IG51bUJpdHMgLSAzMiwgdGhpcy5oaWdoID49IDAgPyAwIDogLTEsIHRoaXMudW5zaWduZWQpOwogIH07CiAgTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7CiAgTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykgewogICAgaWYgKGlzTG9uZyhudW1CaXRzKSkKICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTsKICAgIG51bUJpdHMgJj0gNjM7CiAgICBpZiAobnVtQml0cyA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBlbHNlIHsKICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7CiAgICAgIGlmIChudW1CaXRzIDwgMzIpIHsKICAgICAgICB2YXIgbG93ID0gdGhpcy5sb3c7CiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdyA+Pj4gbnVtQml0cyB8IGhpZ2ggPDwgMzIgLSBudW1CaXRzLCBoaWdoID4+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTsKICAgICAgfSBlbHNlIGlmIChudW1CaXRzID09PSAzMikKICAgICAgICByZXR1cm4gZnJvbUJpdHMoaGlnaCwgMCwgdGhpcy51bnNpZ25lZCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gZnJvbUJpdHMoaGlnaCA+Pj4gbnVtQml0cyAtIDMyLCAwLCB0aGlzLnVuc2lnbmVkKTsKICAgIH0KICB9OwogIExvbmdQcm90b3R5cGUuc2hydSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkOwogIExvbmdQcm90b3R5cGUuc2hyX3UgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDsKICBMb25nUHJvdG90eXBlLnRvU2lnbmVkID0gZnVuY3Rpb24gdG9TaWduZWQoKSB7CiAgICBpZiAoIXRoaXMudW5zaWduZWQpCiAgICAgIHJldHVybiB0aGlzOwogICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTsKICB9OwogIExvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7CiAgICBpZiAodGhpcy51bnNpZ25lZCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgdHJ1ZSk7CiAgfTsKICBMb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7CiAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTsKICB9OwogIExvbmdQcm90b3R5cGUudG9CeXRlc0xFID0gZnVuY3Rpb24gdG9CeXRlc0xFKCkgewogICAgdmFyIGhpID0gdGhpcy5oaWdoLCBsbyA9IHRoaXMubG93OwogICAgcmV0dXJuIFsKICAgICAgbG8gJiAyNTUsCiAgICAgIGxvID4+PiA4ICYgMjU1LAogICAgICBsbyA+Pj4gMTYgJiAyNTUsCiAgICAgIGxvID4+PiAyNCwKICAgICAgaGkgJiAyNTUsCiAgICAgIGhpID4+PiA4ICYgMjU1LAogICAgICBoaSA+Pj4gMTYgJiAyNTUsCiAgICAgIGhpID4+PiAyNAogICAgXTsKICB9OwogIExvbmdQcm90b3R5cGUudG9CeXRlc0JFID0gZnVuY3Rpb24gdG9CeXRlc0JFKCkgewogICAgdmFyIGhpID0gdGhpcy5oaWdoLCBsbyA9IHRoaXMubG93OwogICAgcmV0dXJuIFsKICAgICAgaGkgPj4+IDI0LAogICAgICBoaSA+Pj4gMTYgJiAyNTUsCiAgICAgIGhpID4+PiA4ICYgMjU1LAogICAgICBoaSAmIDI1NSwKICAgICAgbG8gPj4+IDI0LAogICAgICBsbyA+Pj4gMTYgJiAyNTUsCiAgICAgIGxvID4+PiA4ICYgMjU1LAogICAgICBsbyAmIDI1NQogICAgXTsKICB9OwogIExvbmcuZnJvbUJ5dGVzID0gZnVuY3Rpb24gZnJvbUJ5dGVzMihieXRlcywgdW5zaWduZWQsIGxlKSB7CiAgICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7CiAgfTsKICBMb25nLmZyb21CeXRlc0xFID0gZnVuY3Rpb24gZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKSB7CiAgICByZXR1cm4gbmV3IExvbmcoCiAgICAgIGJ5dGVzWzBdIHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbM10gPDwgMjQsCiAgICAgIGJ5dGVzWzRdIHwgYnl0ZXNbNV0gPDwgOCB8IGJ5dGVzWzZdIDw8IDE2IHwgYnl0ZXNbN10gPDwgMjQsCiAgICAgIHVuc2lnbmVkCiAgICApOwogIH07CiAgTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkgewogICAgcmV0dXJuIG5ldyBMb25nKAogICAgICBieXRlc1s0XSA8PCAyNCB8IGJ5dGVzWzVdIDw8IDE2IHwgYnl0ZXNbNl0gPDwgOCB8IGJ5dGVzWzddLAogICAgICBieXRlc1swXSA8PCAyNCB8IGJ5dGVzWzFdIDw8IDE2IHwgYnl0ZXNbMl0gPDwgOCB8IGJ5dGVzWzNdLAogICAgICB1bnNpZ25lZAogICAgKTsKICB9OwogIGNsYXNzIFZpcnR1YWxPZmZzZXQgewogICAgY29uc3RydWN0b3IoYmxvY2tQb3NpdGlvbiwgZGF0YVBvc2l0aW9uKSB7CiAgICAgIHRoaXMuYmxvY2tQb3NpdGlvbiA9IGJsb2NrUG9zaXRpb247CiAgICAgIHRoaXMuZGF0YVBvc2l0aW9uID0gZGF0YVBvc2l0aW9uOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiBgJHt0aGlzLmJsb2NrUG9zaXRpb259OiR7dGhpcy5kYXRhUG9zaXRpb259YDsKICAgIH0KICAgIGNvbXBhcmVUbyhiKSB7CiAgICAgIHJldHVybiB0aGlzLmJsb2NrUG9zaXRpb24gLSBiLmJsb2NrUG9zaXRpb24gfHwgdGhpcy5kYXRhUG9zaXRpb24gLSBiLmRhdGFQb3NpdGlvbjsKICAgIH0KICAgIHN0YXRpYyBtaW4oLi4uYXJncykgewogICAgICBsZXQgbWluOwogICAgICBsZXQgaTIgPSAwOwogICAgICBmb3IgKDsgIW1pbjsgaTIgKz0gMSkgewogICAgICAgIG1pbiA9IGFyZ3NbaTJdOwogICAgICB9CiAgICAgIGZvciAoOyBpMiA8IGFyZ3MubGVuZ3RoOyBpMiArPSAxKSB7CiAgICAgICAgaWYgKG1pbi5jb21wYXJlVG8oYXJnc1tpMl0pID4gMCkgewogICAgICAgICAgbWluID0gYXJnc1tpMl07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtaW47CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgb2Zmc2V0ID0gMCwgYmlnZW5kaWFuID0gZmFsc2UpIHsKICAgIGlmIChiaWdlbmRpYW4pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJiaWctZW5kaWFuIHZpcnR1YWwgZmlsZSBvZmZzZXRzIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgfQogICAgcmV0dXJuIG5ldyBWaXJ0dWFsT2Zmc2V0KGJ5dGVzW29mZnNldCArIDddICogMTA5OTUxMTYyNzc3NiArIGJ5dGVzW29mZnNldCArIDZdICogNDI5NDk2NzI5NiArIGJ5dGVzW29mZnNldCArIDVdICogMTY3NzcyMTYgKyBieXRlc1tvZmZzZXQgKyA0XSAqIDY1NTM2ICsgYnl0ZXNbb2Zmc2V0ICsgM10gKiAyNTYgKyBieXRlc1tvZmZzZXQgKyAyXSwgYnl0ZXNbb2Zmc2V0ICsgMV0gPDwgOCB8IGJ5dGVzW29mZnNldF0pOwogIH0KICBjbGFzcyBDaHVuayB7CiAgICBjb25zdHJ1Y3RvcihtaW52LCBtYXh2LCBiaW4sIGZldGNoZWRTaXplID0gdm9pZCAwKSB7CiAgICAgIHRoaXMubWludiA9IG1pbnY7CiAgICAgIHRoaXMubWF4diA9IG1heHY7CiAgICAgIHRoaXMuYmluID0gYmluOwogICAgICB0aGlzLl9mZXRjaGVkU2l6ZSA9IGZldGNoZWRTaXplOwogICAgfQogICAgdG9VbmlxdWVTdHJpbmcoKSB7CiAgICAgIHJldHVybiBgJHt0aGlzLm1pbnZ9Li4ke3RoaXMubWF4dn0gKGJpbiAke3RoaXMuYmlufSwgZmV0Y2hlZFNpemUgJHt0aGlzLmZldGNoZWRTaXplKCl9KWA7CiAgICB9CiAgICB0b1N0cmluZygpIHsKICAgICAgcmV0dXJuIHRoaXMudG9VbmlxdWVTdHJpbmcoKTsKICAgIH0KICAgIGNvbXBhcmVUbyhiKSB7CiAgICAgIHJldHVybiB0aGlzLm1pbnYuY29tcGFyZVRvKGIubWludikgfHwgdGhpcy5tYXh2LmNvbXBhcmVUbyhiLm1heHYpIHx8IHRoaXMuYmluIC0gYi5iaW47CiAgICB9CiAgICBmZXRjaGVkU2l6ZSgpIHsKICAgICAgaWYgKHRoaXMuX2ZldGNoZWRTaXplICE9PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hlZFNpemU7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMubWF4di5ibG9ja1Bvc2l0aW9uICsgKDEgPDwgMTYpIC0gdGhpcy5taW52LmJsb2NrUG9zaXRpb247CiAgICB9CiAgfQogIGNsYXNzIEluZGV4RmlsZSB7CiAgICBjb25zdHJ1Y3Rvcih7IGZpbGVoYW5kbGUsIHJlbmFtZVJlZlNlcXMgPSAobikgPT4gbiB9KSB7CiAgICAgIHRoaXMuZmlsZWhhbmRsZSA9IGZpbGVoYW5kbGU7CiAgICAgIHRoaXMucmVuYW1lUmVmU2VxID0gcmVuYW1lUmVmU2VxczsKICAgIH0KICAgIGFzeW5jIGdldE1ldGFkYXRhKG9wdHMgPSB7fSkgewogICAgICBjb25zdCB7IGluZGljZXMsIC4uLnJlc3QgfSA9IGF3YWl0IHRoaXMucGFyc2Uob3B0cyk7CiAgICAgIHJldHVybiByZXN0OwogICAgfQogICAgX2ZpbmRGaXJzdERhdGEoY3VycmVudEZkbCwgdmlydHVhbE9mZnNldCkgewogICAgICBpZiAoY3VycmVudEZkbCkgewogICAgICAgIHJldHVybiBjdXJyZW50RmRsLmNvbXBhcmVUbyh2aXJ0dWFsT2Zmc2V0KSA+IDAgPyB2aXJ0dWFsT2Zmc2V0IDogY3VycmVudEZkbDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdmlydHVhbE9mZnNldDsKICAgICAgfQogICAgfQogICAgYXN5bmMgcGFyc2Uob3B0cyA9IHt9KSB7CiAgICAgIGlmICghdGhpcy5wYXJzZVApIHsKICAgICAgICB0aGlzLnBhcnNlUCA9IHRoaXMuX3BhcnNlKG9wdHMpLmNhdGNoKChlKSA9PiB7CiAgICAgICAgICB0aGlzLnBhcnNlUCA9IHZvaWQgMDsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMucGFyc2VQOwogICAgfQogICAgYXN5bmMgaGFzUmVmU2VxKHNlcUlkLCBvcHRzID0ge30pIHsKICAgICAgcmV0dXJuICEhKChhd2FpdCB0aGlzLnBhcnNlKG9wdHMpKS5pbmRpY2VzW3NlcUlkXSB8fCB7fSkuYmluSW5kZXg7CiAgICB9CiAgfQogIGNvbnN0IFRCSV9NQUdJQyA9IDIxNTc4MzI0OwogIGNvbnN0IFRBRF9MSURYX1NISUZUID0gMTQ7CiAgZnVuY3Rpb24gcmVnMmJpbnMoYmVnLCBlbmQpIHsKICAgIGJlZyArPSAxOwogICAgZW5kIC09IDE7CiAgICByZXR1cm4gWwogICAgICBbMCwgMF0sCiAgICAgIFsxICsgKGJlZyA+PiAyNiksIDEgKyAoZW5kID4+IDI2KV0sCiAgICAgIFs5ICsgKGJlZyA+PiAyMyksIDkgKyAoZW5kID4+IDIzKV0sCiAgICAgIFs3MyArIChiZWcgPj4gMjApLCA3MyArIChlbmQgPj4gMjApXSwKICAgICAgWzU4NSArIChiZWcgPj4gMTcpLCA1ODUgKyAoZW5kID4+IDE3KV0sCiAgICAgIFs0NjgxICsgKGJlZyA+PiAxNCksIDQ2ODEgKyAoZW5kID4+IDE0KV0KICAgIF07CiAgfQogIGNsYXNzIFRhYml4SW5kZXggZXh0ZW5kcyBJbmRleEZpbGUgewogICAgYXN5bmMgbGluZUNvdW50KHJlZk5hbWUsIG9wdHMgPSB7fSkgewogICAgICBjb25zdCBpbmRleERhdGEgPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpOwogICAgICBpZiAoIWluZGV4RGF0YSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCByZWZJZCA9IGluZGV4RGF0YS5yZWZOYW1lVG9JZFtyZWZOYW1lXTsKICAgICAgY29uc3QgaWR4ID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdOwogICAgICBpZiAoIWlkeCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCB7IHN0YXRzIH0gPSBpbmRleERhdGEuaW5kaWNlc1tyZWZJZF07CiAgICAgIGlmIChzdGF0cykgewogICAgICAgIHJldHVybiBzdGF0cy5saW5lQ291bnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgYXN5bmMgX3BhcnNlKG9wdHMgPSB7fSkgewogICAgICBjb25zdCBidWYgPSBhd2FpdCB0aGlzLmZpbGVoYW5kbGUucmVhZEZpbGUob3B0cyk7CiAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgdW56aXAoYnVmKTsKICAgICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbCk7CiAgICAgIGlmIChieXRlcy5yZWFkVUludDMyTEUoMCkgIT09IFRCSV9NQUdJQykgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IGEgVEJJIGZpbGUiKTsKICAgICAgfQogICAgICBjb25zdCByZWZDb3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDQpOwogICAgICBjb25zdCBmb3JtYXRGbGFncyA9IGJ5dGVzLnJlYWRJbnQzMkxFKDgpOwogICAgICBjb25zdCBjb29yZGluYXRlVHlwZSA9IGZvcm1hdEZsYWdzICYgNjU1MzYgPyAiemVyby1iYXNlZC1oYWxmLW9wZW4iIDogIjEtYmFzZWQtY2xvc2VkIjsKICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IHsKICAgICAgICAwOiAiZ2VuZXJpYyIsCiAgICAgICAgMTogIlNBTSIsCiAgICAgICAgMjogIlZDRiIKICAgICAgfTsKICAgICAgY29uc3QgZm9ybWF0ID0gZm9ybWF0T3B0c1tmb3JtYXRGbGFncyAmIDE1XTsKICAgICAgaWYgKCFmb3JtYXQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgVGFiaXggcHJlc2V0IGZvcm1hdCBmbGFncyAke2Zvcm1hdEZsYWdzfWApOwogICAgICB9CiAgICAgIGNvbnN0IGNvbHVtbk51bWJlcnMgPSB7CiAgICAgICAgcmVmOiBieXRlcy5yZWFkSW50MzJMRSgxMiksCiAgICAgICAgc3RhcnQ6IGJ5dGVzLnJlYWRJbnQzMkxFKDE2KSwKICAgICAgICBlbmQ6IGJ5dGVzLnJlYWRJbnQzMkxFKDIwKQogICAgICB9OwogICAgICBjb25zdCBtZXRhVmFsdWUgPSBieXRlcy5yZWFkSW50MzJMRSgyNCk7CiAgICAgIGNvbnN0IGRlcHRoID0gNTsKICAgICAgY29uc3QgbWF4QmluTnVtYmVyID0gKCgxIDw8IChkZXB0aCArIDEpICogMykgLSAxKSAvIDc7CiAgICAgIGNvbnN0IG1heFJlZkxlbmd0aCA9IDIgKiogKDE0ICsgZGVwdGggKiAzKTsKICAgICAgY29uc3QgbWV0YUNoYXIgPSBtZXRhVmFsdWUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKG1ldGFWYWx1ZSkgOiBudWxsOwogICAgICBjb25zdCBza2lwTGluZXMgPSBieXRlcy5yZWFkSW50MzJMRSgyOCk7CiAgICAgIGNvbnN0IG5hbWVTZWN0aW9uTGVuZ3RoID0gYnl0ZXMucmVhZEludDMyTEUoMzIpOwogICAgICBjb25zdCB7IHJlZk5hbWVUb0lkLCByZWZJZFRvTmFtZSB9ID0gdGhpcy5fcGFyc2VOYW1lQnl0ZXMoYnl0ZXMuc2xpY2UoMzYsIDM2ICsgbmFtZVNlY3Rpb25MZW5ndGgpKTsKICAgICAgbGV0IGN1cnJPZmZzZXQgPSAzNiArIG5hbWVTZWN0aW9uTGVuZ3RoOwogICAgICBsZXQgZmlyc3REYXRhTGluZTsKICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBBcnJheShyZWZDb3VudCkuZmlsbCgwKS5tYXAoKCkgPT4gewogICAgICAgIGNvbnN0IGJpbkNvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoY3Vyck9mZnNldCk7CiAgICAgICAgY3Vyck9mZnNldCArPSA0OwogICAgICAgIGNvbnN0IGJpbkluZGV4ID0ge307CiAgICAgICAgbGV0IHN0YXRzOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmluQ291bnQ7IGogKz0gMSkgewogICAgICAgICAgY29uc3QgYmluID0gYnl0ZXMucmVhZFVJbnQzMkxFKGN1cnJPZmZzZXQpOwogICAgICAgICAgY3Vyck9mZnNldCArPSA0OwogICAgICAgICAgaWYgKGJpbiA+IG1heEJpbk51bWJlciArIDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0YWJpeCBpbmRleCBjb250YWlucyB0b28gbWFueSBiaW5zLCBwbGVhc2UgdXNlIGEgQ1NJIGluZGV4Iik7CiAgICAgICAgICB9IGVsc2UgaWYgKGJpbiA9PT0gbWF4QmluTnVtYmVyICsgMSkgewogICAgICAgICAgICBjb25zdCBjaHVua0NvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoY3Vyck9mZnNldCk7CiAgICAgICAgICAgIGN1cnJPZmZzZXQgKz0gNDsKICAgICAgICAgICAgaWYgKGNodW5rQ291bnQgPT09IDIpIHsKICAgICAgICAgICAgICBzdGF0cyA9IHRoaXMucGFyc2VQc2V1ZG9CaW4oYnl0ZXMsIGN1cnJPZmZzZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJPZmZzZXQgKz0gMTYgKiBjaHVua0NvdW50OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgY2h1bmtDb3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKGN1cnJPZmZzZXQpOwogICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDQ7CiAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IG5ldyBBcnJheShjaHVua0NvdW50KTsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjaHVua0NvdW50OyBrICs9IDEpIHsKICAgICAgICAgICAgICBjb25zdCB1ID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0KTsKICAgICAgICAgICAgICBjb25zdCB2MiA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDgpOwogICAgICAgICAgICAgIGN1cnJPZmZzZXQgKz0gMTY7CiAgICAgICAgICAgICAgZmlyc3REYXRhTGluZSA9IHRoaXMuX2ZpbmRGaXJzdERhdGEoZmlyc3REYXRhTGluZSwgdSk7CiAgICAgICAgICAgICAgY2h1bmtzW2tdID0gbmV3IENodW5rKHUsIHYyLCBiaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJpbkluZGV4W2Jpbl0gPSBjaHVua3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxpbmVhckNvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoY3Vyck9mZnNldCk7CiAgICAgICAgY3Vyck9mZnNldCArPSA0OwogICAgICAgIGNvbnN0IGxpbmVhckluZGV4ID0gbmV3IEFycmF5KGxpbmVhckNvdW50KTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxpbmVhckNvdW50OyBrICs9IDEpIHsKICAgICAgICAgIGxpbmVhckluZGV4W2tdID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0KTsKICAgICAgICAgIGN1cnJPZmZzZXQgKz0gODsKICAgICAgICAgIGZpcnN0RGF0YUxpbmUgPSB0aGlzLl9maW5kRmlyc3REYXRhKGZpcnN0RGF0YUxpbmUsIGxpbmVhckluZGV4W2tdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgYmluSW5kZXgsIGxpbmVhckluZGV4LCBzdGF0cyB9OwogICAgICB9KTsKICAgICAgcmV0dXJuIHsKICAgICAgICBpbmRpY2VzLAogICAgICAgIG1ldGFDaGFyLAogICAgICAgIG1heEJpbk51bWJlciwKICAgICAgICBtYXhSZWZMZW5ndGgsCiAgICAgICAgc2tpcExpbmVzLAogICAgICAgIGZpcnN0RGF0YUxpbmUsCiAgICAgICAgY29sdW1uTnVtYmVycywKICAgICAgICBjb29yZGluYXRlVHlwZSwKICAgICAgICBmb3JtYXQsCiAgICAgICAgcmVmSWRUb05hbWUsCiAgICAgICAgcmVmTmFtZVRvSWQsCiAgICAgICAgbWF4QmxvY2tTaXplOiAxIDw8IDE2CiAgICAgIH07CiAgICB9CiAgICBwYXJzZVBzZXVkb0JpbihieXRlcywgb2Zmc2V0KSB7CiAgICAgIGNvbnN0IGxpbmVDb3VudCA9IGxvbmdUb051bWJlcihsb25nLmZyb21CeXRlc0xFKGJ5dGVzLnNsaWNlKG9mZnNldCArIDE2LCBvZmZzZXQgKyAyNCksIHRydWUpKTsKICAgICAgcmV0dXJuIHsgbGluZUNvdW50IH07CiAgICB9CiAgICBfcGFyc2VOYW1lQnl0ZXMobmFtZXNCeXRlcykgewogICAgICBsZXQgY3VyclJlZklkID0gMDsKICAgICAgbGV0IGN1cnJOYW1lU3RhcnQgPSAwOwogICAgICBjb25zdCByZWZJZFRvTmFtZSA9IFtdOwogICAgICBjb25zdCByZWZOYW1lVG9JZCA9IHt9OwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbmFtZXNCeXRlcy5sZW5ndGg7IGkyICs9IDEpIHsKICAgICAgICBpZiAoIW5hbWVzQnl0ZXNbaTJdKSB7CiAgICAgICAgICBpZiAoY3Vyck5hbWVTdGFydCA8IGkyKSB7CiAgICAgICAgICAgIGxldCByZWZOYW1lID0gbmFtZXNCeXRlcy50b1N0cmluZygidXRmOCIsIGN1cnJOYW1lU3RhcnQsIGkyKTsKICAgICAgICAgICAgcmVmTmFtZSA9IHRoaXMucmVuYW1lUmVmU2VxKHJlZk5hbWUpOwogICAgICAgICAgICByZWZJZFRvTmFtZVtjdXJyUmVmSWRdID0gcmVmTmFtZTsKICAgICAgICAgICAgcmVmTmFtZVRvSWRbcmVmTmFtZV0gPSBjdXJyUmVmSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyTmFtZVN0YXJ0ID0gaTIgKyAxOwogICAgICAgICAgY3VyclJlZklkICs9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IHJlZk5hbWVUb0lkLCByZWZJZFRvTmFtZSB9OwogICAgfQogICAgYXN5bmMgYmxvY2tzRm9yUmFuZ2UocmVmTmFtZSwgbWluLCBtYXgsIG9wdHMgPSB7fSkgewogICAgICBpZiAobWluIDwgMCkgewogICAgICAgIG1pbiA9IDA7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5wYXJzZShvcHRzKTsKICAgICAgaWYgKCFpbmRleERhdGEpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgY29uc3QgcmVmSWQgPSBpbmRleERhdGEucmVmTmFtZVRvSWRbcmVmTmFtZV07CiAgICAgIGNvbnN0IGJhID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdOwogICAgICBpZiAoIWJhKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGNvbnN0IG1pbk9mZnNldCA9IGJhLmxpbmVhckluZGV4Lmxlbmd0aCA/IGJhLmxpbmVhckluZGV4W21pbiA+PiBUQURfTElEWF9TSElGVCA+PSBiYS5saW5lYXJJbmRleC5sZW5ndGggPyBiYS5saW5lYXJJbmRleC5sZW5ndGggLSAxIDogbWluID4+IFRBRF9MSURYX1NISUZUXSA6IG5ldyBWaXJ0dWFsT2Zmc2V0KDAsIDApOwogICAgICBpZiAoIW1pbk9mZnNldCkgewogICAgICAgIGNvbnNvbGUud2FybigicXVlcnlpbmcgb3V0c2lkZSBvZiBwb3NzaWJsZSB0YWJpeCByYW5nZSIpOwogICAgICB9CiAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQmlucyA9IHJlZzJiaW5zKG1pbiwgbWF4KTsKICAgICAgY29uc3QgY2h1bmtzID0gW107CiAgICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIG92ZXJsYXBwaW5nQmlucykgewogICAgICAgIGZvciAobGV0IGJpbiA9IHN0YXJ0OyBiaW4gPD0gZW5kOyBiaW4rKykgewogICAgICAgICAgaWYgKGJhLmJpbkluZGV4W2Jpbl0pIHsKICAgICAgICAgICAgY29uc3QgYmluQ2h1bmtzID0gYmEuYmluSW5kZXhbYmluXTsKICAgICAgICAgICAgZm9yIChsZXQgYzIgPSAwOyBjMiA8IGJpbkNodW5rcy5sZW5ndGg7ICsrYzIpIHsKICAgICAgICAgICAgICBjaHVua3MucHVzaChuZXcgQ2h1bmsoYmluQ2h1bmtzW2MyXS5taW52LCBiaW5DaHVua3NbYzJdLm1heHYsIGJpbikpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG5pbnR2ID0gYmEubGluZWFySW5kZXgubGVuZ3RoOwogICAgICBsZXQgbG93ZXN0ID0gbnVsbDsKICAgICAgY29uc3QgbWluTGluID0gTWF0aC5taW4obWluID4+IDE0LCBuaW50diAtIDEpOwogICAgICBjb25zdCBtYXhMaW4gPSBNYXRoLm1pbihtYXggPj4gMTQsIG5pbnR2IC0gMSk7CiAgICAgIGZvciAobGV0IGkyID0gbWluTGluOyBpMiA8PSBtYXhMaW47ICsraTIpIHsKICAgICAgICBjb25zdCB2cCA9IGJhLmxpbmVhckluZGV4W2kyXTsKICAgICAgICBpZiAodnApIHsKICAgICAgICAgIGlmICghbG93ZXN0IHx8IHZwLmNvbXBhcmVUbyhsb3dlc3QpIDwgMCkgewogICAgICAgICAgICBsb3dlc3QgPSB2cDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGltaXplQ2h1bmtzKGNodW5rcywgbG93ZXN0KTsKICAgIH0KICB9CiAgY29uc3QgQ1NJMV9NQUdJQyA9IDIxNTgyNjU5OwogIGNvbnN0IENTSTJfTUFHSUMgPSAzODM1OTg3NTsKICBmdW5jdGlvbiBsc2hpZnQobnVtLCBiaXRzKSB7CiAgICByZXR1cm4gbnVtICogMiAqKiBiaXRzOwogIH0KICBmdW5jdGlvbiByc2hpZnQobnVtLCBiaXRzKSB7CiAgICByZXR1cm4gTWF0aC5mbG9vcihudW0gLyAyICoqIGJpdHMpOwogIH0KICBjbGFzcyBDU0kgZXh0ZW5kcyBJbmRleEZpbGUgewogICAgY29uc3RydWN0b3IoYXJncykgewogICAgICBzdXBlcihhcmdzKTsKICAgICAgdGhpcy5tYXhCaW5OdW1iZXIgPSAwOwogICAgICB0aGlzLmRlcHRoID0gMDsKICAgICAgdGhpcy5taW5TaGlmdCA9IDA7CiAgICB9CiAgICBhc3luYyBsaW5lQ291bnQocmVmTmFtZSwgb3B0cyA9IHt9KSB7CiAgICAgIGNvbnN0IGluZGV4RGF0YSA9IGF3YWl0IHRoaXMucGFyc2Uob3B0cyk7CiAgICAgIGlmICghaW5kZXhEYXRhKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGNvbnN0IHJlZklkID0gaW5kZXhEYXRhLnJlZk5hbWVUb0lkW3JlZk5hbWVdOwogICAgICBjb25zdCBpZHggPSBpbmRleERhdGEuaW5kaWNlc1tyZWZJZF07CiAgICAgIGlmICghaWR4KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGNvbnN0IHsgc3RhdHMgfSA9IGluZGV4RGF0YS5pbmRpY2VzW3JlZklkXTsKICAgICAgaWYgKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHN0YXRzLmxpbmVDb3VudDsKICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBhc3luYyBpbmRleENvdigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJDU0kgaW5kZXhlcyBkbyBub3Qgc3VwcG9ydCBpbmRleGNvdiIpOwogICAgfQogICAgcGFyc2VBdXhEYXRhKGJ5dGVzLCBvZmZzZXQpIHsKICAgICAgY29uc3QgZm9ybWF0RmxhZ3MgPSBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQpOwogICAgICBjb25zdCBjb29yZGluYXRlVHlwZSA9IGZvcm1hdEZsYWdzICYgNjU1MzYgPyAiemVyby1iYXNlZC1oYWxmLW9wZW4iIDogIjEtYmFzZWQtY2xvc2VkIjsKICAgICAgY29uc3QgZm9ybWF0ID0geyAwOiAiZ2VuZXJpYyIsIDE6ICJTQU0iLCAyOiAiVkNGIiB9W2Zvcm1hdEZsYWdzICYgMTVdOwogICAgICBpZiAoIWZvcm1hdCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBUYWJpeCBwcmVzZXQgZm9ybWF0IGZsYWdzICR7Zm9ybWF0RmxhZ3N9YCk7CiAgICAgIH0KICAgICAgY29uc3QgY29sdW1uTnVtYmVycyA9IHsKICAgICAgICByZWY6IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDQpLAogICAgICAgIHN0YXJ0OiBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQgKyA4KSwKICAgICAgICBlbmQ6IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDEyKQogICAgICB9OwogICAgICBjb25zdCBtZXRhVmFsdWUgPSBieXRlcy5yZWFkSW50MzJMRShvZmZzZXQgKyAxNik7CiAgICAgIGNvbnN0IG1ldGFDaGFyID0gbWV0YVZhbHVlID8gU3RyaW5nLmZyb21DaGFyQ29kZShtZXRhVmFsdWUpIDogbnVsbDsKICAgICAgY29uc3Qgc2tpcExpbmVzID0gYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgMjApOwogICAgICBjb25zdCBuYW1lU2VjdGlvbkxlbmd0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDI0KTsKICAgICAgY29uc3QgeyByZWZJZFRvTmFtZSwgcmVmTmFtZVRvSWQgfSA9IHRoaXMuX3BhcnNlTmFtZUJ5dGVzKGJ5dGVzLnNsaWNlKG9mZnNldCArIDI4LCBvZmZzZXQgKyAyOCArIG5hbWVTZWN0aW9uTGVuZ3RoKSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgcmVmSWRUb05hbWUsCiAgICAgICAgcmVmTmFtZVRvSWQsCiAgICAgICAgc2tpcExpbmVzLAogICAgICAgIG1ldGFDaGFyLAogICAgICAgIGNvbHVtbk51bWJlcnMsCiAgICAgICAgZm9ybWF0LAogICAgICAgIGNvb3JkaW5hdGVUeXBlCiAgICAgIH07CiAgICB9CiAgICBfcGFyc2VOYW1lQnl0ZXMobmFtZXNCeXRlcykgewogICAgICBsZXQgY3VyclJlZklkID0gMDsKICAgICAgbGV0IGN1cnJOYW1lU3RhcnQgPSAwOwogICAgICBjb25zdCByZWZJZFRvTmFtZSA9IFtdOwogICAgICBjb25zdCByZWZOYW1lVG9JZCA9IHt9OwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbmFtZXNCeXRlcy5sZW5ndGg7IGkyICs9IDEpIHsKICAgICAgICBpZiAoIW5hbWVzQnl0ZXNbaTJdKSB7CiAgICAgICAgICBpZiAoY3Vyck5hbWVTdGFydCA8IGkyKSB7CiAgICAgICAgICAgIGxldCByZWZOYW1lID0gbmFtZXNCeXRlcy50b1N0cmluZygidXRmOCIsIGN1cnJOYW1lU3RhcnQsIGkyKTsKICAgICAgICAgICAgcmVmTmFtZSA9IHRoaXMucmVuYW1lUmVmU2VxKHJlZk5hbWUpOwogICAgICAgICAgICByZWZJZFRvTmFtZVtjdXJyUmVmSWRdID0gcmVmTmFtZTsKICAgICAgICAgICAgcmVmTmFtZVRvSWRbcmVmTmFtZV0gPSBjdXJyUmVmSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyTmFtZVN0YXJ0ID0gaTIgKyAxOwogICAgICAgICAgY3VyclJlZklkICs9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IHJlZk5hbWVUb0lkLCByZWZJZFRvTmFtZSB9OwogICAgfQogICAgYXN5bmMgX3BhcnNlKG9wdHMgPSB7fSkgewogICAgICBjb25zdCBieXRlcyA9IGF3YWl0IHVuemlwKGF3YWl0IHRoaXMuZmlsZWhhbmRsZS5yZWFkRmlsZShvcHRzKSk7CiAgICAgIGxldCBjc2lWZXJzaW9uOwogICAgICBpZiAoYnl0ZXMucmVhZFVJbnQzMkxFKDApID09PSBDU0kxX01BR0lDKSB7CiAgICAgICAgY3NpVmVyc2lvbiA9IDE7CiAgICAgIH0gZWxzZSBpZiAoYnl0ZXMucmVhZFVJbnQzMkxFKDApID09PSBDU0kyX01BR0lDKSB7CiAgICAgICAgY3NpVmVyc2lvbiA9IDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgYSBDU0kgZmlsZSIpOwogICAgICB9CiAgICAgIHRoaXMubWluU2hpZnQgPSBieXRlcy5yZWFkSW50MzJMRSg0KTsKICAgICAgdGhpcy5kZXB0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDgpOwogICAgICB0aGlzLm1heEJpbk51bWJlciA9ICgoMSA8PCAodGhpcy5kZXB0aCArIDEpICogMykgLSAxKSAvIDc7CiAgICAgIGNvbnN0IG1heFJlZkxlbmd0aCA9IDIgKiogKHRoaXMubWluU2hpZnQgKyB0aGlzLmRlcHRoICogMyk7CiAgICAgIGNvbnN0IGF1eExlbmd0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDEyKTsKICAgICAgY29uc3QgYXV4ID0gYXV4TGVuZ3RoICYmIGF1eExlbmd0aCA+PSAzMCA/IHRoaXMucGFyc2VBdXhEYXRhKGJ5dGVzLCAxNikgOiB7CiAgICAgICAgcmVmSWRUb05hbWU6IFtdLAogICAgICAgIHJlZk5hbWVUb0lkOiB7fSwKICAgICAgICBtZXRhQ2hhcjogbnVsbCwKICAgICAgICBjb2x1bW5OdW1iZXJzOiB7IHJlZjogMCwgc3RhcnQ6IDEsIGVuZDogMiB9LAogICAgICAgIGNvb3JkaW5hdGVUeXBlOiAiemVyby1iYXNlZC1oYWxmLW9wZW4iLAogICAgICAgIGZvcm1hdDogImdlbmVyaWMiCiAgICAgIH07CiAgICAgIGNvbnN0IHJlZkNvdW50ID0gYnl0ZXMucmVhZEludDMyTEUoMTYgKyBhdXhMZW5ndGgpOwogICAgICBsZXQgZmlyc3REYXRhTGluZTsKICAgICAgbGV0IGN1cnJPZmZzZXQgPSAxNiArIGF1eExlbmd0aCArIDQ7CiAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgQXJyYXkocmVmQ291bnQpLmZpbGwoMCkubWFwKCgpID0+IHsKICAgICAgICBjb25zdCBiaW5Db3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKGN1cnJPZmZzZXQpOwogICAgICAgIGN1cnJPZmZzZXQgKz0gNDsKICAgICAgICBjb25zdCBiaW5JbmRleCA9IHt9OwogICAgICAgIGxldCBzdGF0czsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJpbkNvdW50OyBqICs9IDEpIHsKICAgICAgICAgIGNvbnN0IGJpbiA9IGJ5dGVzLnJlYWRVSW50MzJMRShjdXJyT2Zmc2V0KTsKICAgICAgICAgIGlmIChiaW4gPiB0aGlzLm1heEJpbk51bWJlcikgewogICAgICAgICAgICBzdGF0cyA9IHRoaXMucGFyc2VQc2V1ZG9CaW4oYnl0ZXMsIGN1cnJPZmZzZXQgKyA0KTsKICAgICAgICAgICAgY3Vyck9mZnNldCArPSA0ICsgOCArIDQgKyAxNiArIDE2OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbG9mZnNldCA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDQpOwogICAgICAgICAgICBmaXJzdERhdGFMaW5lID0gdGhpcy5fZmluZEZpcnN0RGF0YShmaXJzdERhdGFMaW5lLCBsb2Zmc2V0KTsKICAgICAgICAgICAgY29uc3QgY2h1bmtDb3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKGN1cnJPZmZzZXQgKyAxMik7CiAgICAgICAgICAgIGN1cnJPZmZzZXQgKz0gMTY7CiAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IG5ldyBBcnJheShjaHVua0NvdW50KTsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjaHVua0NvdW50OyBrICs9IDEpIHsKICAgICAgICAgICAgICBjb25zdCB1ID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0KTsKICAgICAgICAgICAgICBjb25zdCB2MiA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDgpOwogICAgICAgICAgICAgIGN1cnJPZmZzZXQgKz0gMTY7CiAgICAgICAgICAgICAgY2h1bmtzW2tdID0gbmV3IENodW5rKHUsIHYyLCBiaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJpbkluZGV4W2Jpbl0gPSBjaHVua3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGJpbkluZGV4LCBzdGF0cyB9OwogICAgICB9KTsKICAgICAgcmV0dXJuIHsKICAgICAgICAuLi5hdXgsCiAgICAgICAgY3NpOiB0cnVlLAogICAgICAgIHJlZkNvdW50LAogICAgICAgIG1heEJsb2NrU2l6ZTogMSA8PCAxNiwKICAgICAgICBmaXJzdERhdGFMaW5lLAogICAgICAgIGNzaVZlcnNpb24sCiAgICAgICAgaW5kaWNlcywKICAgICAgICBkZXB0aDogdGhpcy5kZXB0aCwKICAgICAgICBtYXhCaW5OdW1iZXI6IHRoaXMubWF4QmluTnVtYmVyLAogICAgICAgIG1heFJlZkxlbmd0aAogICAgICB9OwogICAgfQogICAgcGFyc2VQc2V1ZG9CaW4oYnl0ZXMsIG9mZnNldCkgewogICAgICBjb25zdCBsaW5lQ291bnQgPSBsb25nVG9OdW1iZXIobG9uZy5mcm9tQnl0ZXNMRShieXRlcy5zbGljZShvZmZzZXQgKyAyOCwgb2Zmc2V0ICsgMzYpLCB0cnVlKSk7CiAgICAgIHJldHVybiB7IGxpbmVDb3VudCB9OwogICAgfQogICAgYXN5bmMgYmxvY2tzRm9yUmFuZ2UocmVmTmFtZSwgbWluLCBtYXgsIG9wdHMgPSB7fSkgewogICAgICBpZiAobWluIDwgMCkgewogICAgICAgIG1pbiA9IDA7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5wYXJzZShvcHRzKTsKICAgICAgaWYgKCFpbmRleERhdGEpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgY29uc3QgcmVmSWQgPSBpbmRleERhdGEucmVmTmFtZVRvSWRbcmVmTmFtZV07CiAgICAgIGNvbnN0IGJhID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdOwogICAgICBpZiAoIWJhKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQmlucyA9IHRoaXMucmVnMmJpbnMobWluLCBtYXgpOwogICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgZm9yIChjb25zdCBbc3RhcnQsIGVuZF0gb2Ygb3ZlcmxhcHBpbmdCaW5zKSB7CiAgICAgICAgZm9yIChsZXQgYmluID0gc3RhcnQ7IGJpbiA8PSBlbmQ7IGJpbisrKSB7CiAgICAgICAgICBpZiAoYmEuYmluSW5kZXhbYmluXSkgewogICAgICAgICAgICBjb25zdCBiaW5DaHVua3MgPSBiYS5iaW5JbmRleFtiaW5dOwogICAgICAgICAgICBmb3IgKGxldCBjMiA9IDA7IGMyIDwgYmluQ2h1bmtzLmxlbmd0aDsgKytjMikgewogICAgICAgICAgICAgIGNodW5rcy5wdXNoKG5ldyBDaHVuayhiaW5DaHVua3NbYzJdLm1pbnYsIGJpbkNodW5rc1tjMl0ubWF4diwgYmluKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGltaXplQ2h1bmtzKGNodW5rcywgbmV3IFZpcnR1YWxPZmZzZXQoMCwgMCkpOwogICAgfQogICAgcmVnMmJpbnMoYmVnLCBlbmQpIHsKICAgICAgYmVnIC09IDE7CiAgICAgIGlmIChiZWcgPCAxKSB7CiAgICAgICAgYmVnID0gMTsKICAgICAgfQogICAgICBpZiAoZW5kID4gMiAqKiA1MCkgewogICAgICAgIGVuZCA9IDIgKiogMzQ7CiAgICAgIH0KICAgICAgZW5kIC09IDE7CiAgICAgIGxldCBsID0gMDsKICAgICAgbGV0IHQgPSAwOwogICAgICBsZXQgcyA9IHRoaXMubWluU2hpZnQgKyB0aGlzLmRlcHRoICogMzsKICAgICAgY29uc3QgYmlucyA9IFtdOwogICAgICBmb3IgKDsgbCA8PSB0aGlzLmRlcHRoOyBzIC09IDMsIHQgKz0gbHNoaWZ0KDEsIGwgKiAzKSwgbCArPSAxKSB7CiAgICAgICAgY29uc3QgYiA9IHQgKyByc2hpZnQoYmVnLCBzKTsKICAgICAgICBjb25zdCBlID0gdCArIHJzaGlmdChlbmQsIHMpOwogICAgICAgIGlmIChlIC0gYiArIGJpbnMubGVuZ3RoID4gdGhpcy5tYXhCaW5OdW1iZXIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnkgJHtiZWd9LSR7ZW5kfSBpcyB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgYmlubmluZyBzY2hlbWUgKHNoaWZ0ICR7dGhpcy5taW5TaGlmdH0sIGRlcHRoICR7dGhpcy5kZXB0aH0pLCB0cnkgYSBzbWFsbGVyIHF1ZXJ5IG9yIGEgY29hcnNlciBpbmRleCBiaW5uaW5nIHNjaGVtZWApOwogICAgICAgIH0KICAgICAgICBiaW5zLnB1c2goW2IsIGVdKTsKICAgICAgfQogICAgICByZXR1cm4gYmluczsKICAgIH0KICB9CiAgY29uc3QgZGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoInV0Zi04IikgOiB2b2lkIDA7CiAgZnVuY3Rpb24gdGltZW91dCh0aW1lKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZSkpOwogIH0KICBjbGFzcyBUYWJpeEluZGV4ZWRGaWxlIHsKICAgIGNvbnN0cnVjdG9yKHsgcGF0aCwgZmlsZWhhbmRsZSwgdGJpUGF0aCwgdGJpRmlsZWhhbmRsZSwgY3NpUGF0aCwgY3NpRmlsZWhhbmRsZSwgeWllbGRUaW1lID0gNTAwLCBjaHVua1NpemVMaW1pdCA9IDVlNywgcmVuYW1lUmVmU2VxcyA9IChuKSA9PiBuLCBjaHVua0NhY2hlU2l6ZSA9IDUgKiAyICoqIDIwIH0pIHsKICAgICAgaWYgKGZpbGVoYW5kbGUpIHsKICAgICAgICB0aGlzLmZpbGVoYW5kbGUgPSBmaWxlaGFuZGxlOwogICAgICB9IGVsc2UgaWYgKHBhdGgpIHsKICAgICAgICB0aGlzLmZpbGVoYW5kbGUgPSBuZXcgTG9jYWxGaWxlKHBhdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIm11c3QgcHJvdmlkZSBlaXRoZXIgZmlsZWhhbmRsZSBvciBwYXRoIik7CiAgICAgIH0KICAgICAgaWYgKHRiaUZpbGVoYW5kbGUpIHsKICAgICAgICB0aGlzLmluZGV4ID0gbmV3IFRhYml4SW5kZXgoewogICAgICAgICAgZmlsZWhhbmRsZTogdGJpRmlsZWhhbmRsZSwKICAgICAgICAgIHJlbmFtZVJlZlNlcXMKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChjc2lGaWxlaGFuZGxlKSB7CiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBDU0koewogICAgICAgICAgZmlsZWhhbmRsZTogY3NpRmlsZWhhbmRsZSwKICAgICAgICAgIHJlbmFtZVJlZlNlcXMKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh0YmlQYXRoKSB7CiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBUYWJpeEluZGV4KHsKICAgICAgICAgIGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUodGJpUGF0aCksCiAgICAgICAgICByZW5hbWVSZWZTZXFzCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAoY3NpUGF0aCkgewogICAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsKICAgICAgICAgIGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoY3NpUGF0aCksCiAgICAgICAgICByZW5hbWVSZWZTZXFzCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAocGF0aCkgewogICAgICAgIHRoaXMuaW5kZXggPSBuZXcgVGFiaXhJbmRleCh7CiAgICAgICAgICBmaWxlaGFuZGxlOiBuZXcgTG9jYWxGaWxlKGAke3BhdGh9LnRiaWApLAogICAgICAgICAgcmVuYW1lUmVmU2VxcwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIm11c3QgcHJvdmlkZSBvbmUgb2YgdGJpRmlsZWhhbmRsZSwgdGJpUGF0aCwgY3NpRmlsZWhhbmRsZSwgb3IgY3NpUGF0aCIpOwogICAgICB9CiAgICAgIHRoaXMuY2h1bmtTaXplTGltaXQgPSBjaHVua1NpemVMaW1pdDsKICAgICAgdGhpcy5yZW5hbWVSZWZTZXEgPSByZW5hbWVSZWZTZXFzOwogICAgICB0aGlzLnlpZWxkVGltZSA9IHlpZWxkVGltZTsKICAgICAgdGhpcy5jaHVua0NhY2hlID0gbmV3IF9kZWZhdWx0KHsKICAgICAgICBjYWNoZTogbmV3IHF1aWNrTHJ1KHsgbWF4U2l6ZTogTWF0aC5mbG9vcihjaHVua0NhY2hlU2l6ZSAvICgxIDw8IDE2KSkgfSksCiAgICAgICAgZmlsbDogKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5yZWFkQ2h1bmsoYXJncywgeyBzaWduYWwgfSkKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBnZXRMaW5lcyhyZWZOYW1lLCBzdGFydCwgZW5kLCBvcHRzKSB7CiAgICAgIGxldCBzaWduYWw7CiAgICAgIGxldCBvcHRpb25zID0ge307CiAgICAgIGxldCBjYWxsYmFjazsKICAgICAgaWYgKHR5cGVvZiBvcHRzID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImxpbmUgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZCIpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGNhbGxiYWNrID0gb3B0czsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcHRpb25zID0gb3B0czsKICAgICAgICBjYWxsYmFjayA9IG9wdHMubGluZUNhbGxiYWNrOwogICAgICB9CiAgICAgIGlmIChyZWZOYW1lID09PSB2b2lkIDApIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJtdXN0IHByb3ZpZGUgYSByZWZlcmVuY2Ugc2VxdWVuY2UgbmFtZSIpOwogICAgICB9CiAgICAgIGlmICghY2FsbGJhY2spIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJsaW5lIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQiKTsKICAgICAgfQogICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMuaW5kZXguZ2V0TWV0YWRhdGEob3B0aW9ucyk7CiAgICAgIGNoZWNrQWJvcnRTaWduYWwoc2lnbmFsKTsKICAgICAgaWYgKCFzdGFydCkgewogICAgICAgIHN0YXJ0ID0gMDsKICAgICAgfQogICAgICBpZiAoIWVuZCkgewogICAgICAgIGVuZCA9IG1ldGFkYXRhLm1heFJlZkxlbmd0aDsKICAgICAgfQogICAgICBpZiAoIShzdGFydCA8PSBlbmQpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdGFydCBhbmQgZW5kIGNvb3JkaW5hdGVzLiBzdGFydCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQiKTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgPT09IGVuZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjaHVua3MgPSBhd2FpdCB0aGlzLmluZGV4LmJsb2Nrc0ZvclJhbmdlKHJlZk5hbWUsIHN0YXJ0LCBlbmQsIG9wdGlvbnMpOwogICAgICBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbCk7CiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBjaHVua3MubGVuZ3RoOyBpMiArPSAxKSB7CiAgICAgICAgY29uc3Qgc2l6ZSA9IGNodW5rc1tpMl0uZmV0Y2hlZFNpemUoKTsKICAgICAgICBpZiAoc2l6ZSA+IHRoaXMuY2h1bmtTaXplTGltaXQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9vIG11Y2ggZGF0YS4gQ2h1bmsgc2l6ZSAke3NpemUudG9Mb2NhbGVTdHJpbmcoKX0gYnl0ZXMgZXhjZWVkcyBjaHVua1NpemVMaW1pdCBvZiAke3RoaXMuY2h1bmtTaXplTGltaXQudG9Mb2NhbGVTdHJpbmcoKX0uYCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBsYXN0ID0gRGF0ZS5ub3coKTsKICAgICAgZm9yIChsZXQgY2h1bmtOdW0gPSAwOyBjaHVua051bSA8IGNodW5rcy5sZW5ndGg7IGNodW5rTnVtICs9IDEpIHsKICAgICAgICBsZXQgcHJldmlvdXNTdGFydENvb3JkaW5hdGU7CiAgICAgICAgY29uc3QgYzIgPSBjaHVua3NbY2h1bmtOdW1dOwogICAgICAgIGNvbnN0IHsgYnVmZmVyOiBidWZmZXIyLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zIH0gPSBhd2FpdCB0aGlzLmNodW5rQ2FjaGUuZ2V0KGMyLnRvU3RyaW5nKCksIGMyKTsKICAgICAgICBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbCk7CiAgICAgICAgbGV0IGJsb2NrU3RhcnQgPSAwOwogICAgICAgIGxldCBwb3MgPSAwOwogICAgICAgIHdoaWxlIChibG9ja1N0YXJ0IDwgYnVmZmVyMi5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IG4gPSBidWZmZXIyLmluZGV4T2YoIlxuIiwgYmxvY2tTdGFydCk7CiAgICAgICAgICBpZiAobiA9PT0gLTEpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBiID0gYnVmZmVyMi5zbGljZShibG9ja1N0YXJ0LCBuKTsKICAgICAgICAgIGNvbnN0IGxpbmUgPSAoZGVjb2RlciA9PT0gbnVsbCB8fCBkZWNvZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWNvZGVyLmRlY29kZShiKSkgfHwgYi50b1N0cmluZygpOwogICAgICAgICAgaWYgKGRwb3NpdGlvbnMpIHsKICAgICAgICAgICAgd2hpbGUgKGJsb2NrU3RhcnQgKyBjMi5taW52LmRhdGFQb3NpdGlvbiA+PSBkcG9zaXRpb25zW3BvcysrXSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvcy0tOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgeyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzIH0gPSB0aGlzLmNoZWNrTGluZShtZXRhZGF0YSwgcmVmTmFtZSwgc3RhcnQsIGVuZCwgbGluZSk7CiAgICAgICAgICBpZiAocHJldmlvdXNTdGFydENvb3JkaW5hdGUgIT09IHZvaWQgMCAmJiBzdGFydENvb3JkaW5hdGUgIT09IHZvaWQgMCAmJiBwcmV2aW91c1N0YXJ0Q29vcmRpbmF0ZSA+IHN0YXJ0Q29vcmRpbmF0ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmVzIG5vdCBzb3J0ZWQgYnkgc3RhcnQgY29vcmRpbmF0ZSAoJHtwcmV2aW91c1N0YXJ0Q29vcmRpbmF0ZX0gPiAke3N0YXJ0Q29vcmRpbmF0ZX0pLCB0aGlzIGZpbGUgaXMgbm90IHVzYWJsZSB3aXRoIFRhYml4LmApOwogICAgICAgICAgfQogICAgICAgICAgcHJldmlvdXNTdGFydENvb3JkaW5hdGUgPSBzdGFydENvb3JkaW5hdGU7CiAgICAgICAgICBpZiAob3ZlcmxhcHMpIHsKICAgICAgICAgICAgY2FsbGJhY2soCiAgICAgICAgICAgICAgbGluZS50cmltKCksCiAgICAgICAgICAgICAgY3Bvc2l0aW9uc1twb3NdICogKDEgPDwgOCkgKyAoYmxvY2tTdGFydCAtIGRwb3NpdGlvbnNbcG9zXSkgKyBjMi5taW52LmRhdGFQb3NpdGlvbiArIDEKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRDb29yZGluYXRlICE9PSB2b2lkIDAgJiYgc3RhcnRDb29yZGluYXRlID49IGVuZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy55aWVsZFRpbWUgJiYgbGFzdCAtIERhdGUubm93KCkgPiB0aGlzLnlpZWxkVGltZSkgewogICAgICAgICAgICBsYXN0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY2hlY2tBYm9ydFNpZ25hbChzaWduYWwpOwogICAgICAgICAgICBhd2FpdCB0aW1lb3V0KDEpOwogICAgICAgICAgfQogICAgICAgICAgYmxvY2tTdGFydCA9IG4gKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgZ2V0TWV0YWRhdGEob3B0cyA9IHt9KSB7CiAgICAgIHJldHVybiB0aGlzLmluZGV4LmdldE1ldGFkYXRhKG9wdHMpOwogICAgfQogICAgYXN5bmMgZ2V0SGVhZGVyQnVmZmVyKG9wdHMgPSB7fSkgewogICAgICBjb25zdCB7IGZpcnN0RGF0YUxpbmUsIG1ldGFDaGFyLCBtYXhCbG9ja1NpemUgfSA9IGF3YWl0IHRoaXMuZ2V0TWV0YWRhdGEob3B0cyk7CiAgICAgIGNoZWNrQWJvcnRTaWduYWwob3B0cy5zaWduYWwpOwogICAgICBjb25zdCBtYXhGZXRjaCA9ICgoZmlyc3REYXRhTGluZSA9PT0gbnVsbCB8fCBmaXJzdERhdGFMaW5lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaXJzdERhdGFMaW5lLmJsb2NrUG9zaXRpb24pIHx8IDApICsgbWF4QmxvY2tTaXplOwogICAgICBsZXQgYnl0ZXMgPSBhd2FpdCB0aGlzLl9yZWFkUmVnaW9uKDAsIG1heEZldGNoLCBvcHRzKTsKICAgICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbCk7CiAgICAgIHRyeSB7CiAgICAgICAgYnl0ZXMgPSBhd2FpdCB1bnppcChieXRlcyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgIGBlcnJvciBkZWNvbXByZXNzaW5nIGJsb2NrICR7ZS5jb2RlfSBhdCAwIChsZW5ndGggJHttYXhGZXRjaH0pICR7ZX1gCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAobWV0YUNoYXIpIHsKICAgICAgICBsZXQgbGFzdE5ld2xpbmUgPSAtMTsKICAgICAgICBjb25zdCBuZXdsaW5lQnl0ZSA9ICJcbiIuY2hhckNvZGVBdCgwKTsKICAgICAgICBjb25zdCBtZXRhQnl0ZSA9IG1ldGFDaGFyLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGJ5dGVzLmxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgICAgaWYgKGkyID09PSBsYXN0TmV3bGluZSArIDEgJiYgYnl0ZXNbaTJdICE9PSBtZXRhQnl0ZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChieXRlc1tpMl0gPT09IG5ld2xpbmVCeXRlKSB7CiAgICAgICAgICAgIGxhc3ROZXdsaW5lID0gaTI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ5dGVzID0gYnl0ZXMuc2xpY2UoMCwgbGFzdE5ld2xpbmUgKyAxKTsKICAgICAgfQogICAgICByZXR1cm4gYnl0ZXM7CiAgICB9CiAgICBhc3luYyBnZXRIZWFkZXIob3B0cyA9IHt9KSB7CiAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgdGhpcy5nZXRIZWFkZXJCdWZmZXIob3B0cyk7CiAgICAgIHJldHVybiBieXRlcy50b1N0cmluZygidXRmOCIpOwogICAgfQogICAgYXN5bmMgZ2V0UmVmZXJlbmNlU2VxdWVuY2VOYW1lcyhvcHRzID0ge30pIHsKICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLmdldE1ldGFkYXRhKG9wdHMpOwogICAgICByZXR1cm4gbWV0YWRhdGEucmVmSWRUb05hbWU7CiAgICB9CiAgICBjaGVja0xpbmUobWV0YWRhdGEsIHJlZ2lvblJlZk5hbWUsIHJlZ2lvblN0YXJ0LCByZWdpb25FbmQsIGxpbmUpIHsKICAgICAgY29uc3QgeyBjb2x1bW5OdW1iZXJzLCBtZXRhQ2hhciwgY29vcmRpbmF0ZVR5cGUsIGZvcm1hdCB9ID0gbWV0YWRhdGE7CiAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gbWV0YUNoYXIpIHsKICAgICAgICByZXR1cm4geyBvdmVybGFwczogZmFsc2UgfTsKICAgICAgfQogICAgICBsZXQgeyByZWYsIHN0YXJ0LCBlbmQgfSA9IGNvbHVtbk51bWJlcnM7CiAgICAgIGlmICghcmVmKSB7CiAgICAgICAgcmVmID0gMDsKICAgICAgfQogICAgICBpZiAoIXN0YXJ0KSB7CiAgICAgICAgc3RhcnQgPSAwOwogICAgICB9CiAgICAgIGlmICghZW5kKSB7CiAgICAgICAgZW5kID0gMDsKICAgICAgfQogICAgICBpZiAoZm9ybWF0ID09PSAiVkNGIikgewogICAgICAgIGVuZCA9IDg7CiAgICAgIH0KICAgICAgY29uc3QgbWF4Q29sdW1uID0gTWF0aC5tYXgocmVmLCBzdGFydCwgZW5kKTsKICAgICAgbGV0IGN1cnJlbnRDb2x1bW5OdW1iZXIgPSAxOwogICAgICBsZXQgY3VycmVudENvbHVtblN0YXJ0ID0gMDsKICAgICAgbGV0IHJlZlNlcSA9ICIiOwogICAgICBsZXQgc3RhcnRDb29yZGluYXRlID0gLUluZmluaXR5OwogICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbGluZS5sZW5ndGggKyAxOyBpMiArPSAxKSB7CiAgICAgICAgaWYgKGxpbmVbaTJdID09PSAiCSIgfHwgaTIgPT09IGxpbmUubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoY3VycmVudENvbHVtbk51bWJlciA9PT0gcmVmKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbmFtZVJlZlNlcShsaW5lLnNsaWNlKGN1cnJlbnRDb2x1bW5TdGFydCwgaTIpKSAhPT0gcmVnaW9uUmVmTmFtZSkgewogICAgICAgICAgICAgIHJldHVybiB7IG92ZXJsYXBzOiBmYWxzZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPT09IHN0YXJ0KSB7CiAgICAgICAgICAgIHN0YXJ0Q29vcmRpbmF0ZSA9IHBhcnNlSW50KGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpMiksIDEwKTsKICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVUeXBlID09PSAiMS1iYXNlZC1jbG9zZWQiKSB7CiAgICAgICAgICAgICAgc3RhcnRDb29yZGluYXRlIC09IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXJ0Q29vcmRpbmF0ZSA+PSByZWdpb25FbmQpIHsKICAgICAgICAgICAgICByZXR1cm4geyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzOiBmYWxzZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgPT09IDAgfHwgZW5kID09PSBzdGFydCkgewogICAgICAgICAgICAgIGlmIChzdGFydENvb3JkaW5hdGUgKyAxIDw9IHJlZ2lvblN0YXJ0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzOiBmYWxzZSB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICJWQ0YiICYmIGN1cnJlbnRDb2x1bW5OdW1iZXIgPT09IDQpIHsKICAgICAgICAgICAgcmVmU2VxID0gbGluZS5zbGljZShjdXJyZW50Q29sdW1uU3RhcnQsIGkyKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbHVtbk51bWJlciA9PT0gZW5kKSB7CiAgICAgICAgICAgIGxldCBlbmRDb29yZGluYXRlOwogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiVkNGIikgewogICAgICAgICAgICAgIGVuZENvb3JkaW5hdGUgPSB0aGlzLl9nZXRWY2ZFbmQoc3RhcnRDb29yZGluYXRlLCByZWZTZXEsIGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpMikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVuZENvb3JkaW5hdGUgPSBwYXJzZUludChsaW5lLnNsaWNlKGN1cnJlbnRDb2x1bW5TdGFydCwgaTIpLCAxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuZENvb3JkaW5hdGUgPD0gcmVnaW9uU3RhcnQpIHsKICAgICAgICAgICAgICByZXR1cm4geyBvdmVybGFwczogZmFsc2UgfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY3VycmVudENvbHVtblN0YXJ0ID0gaTIgKyAxOwogICAgICAgICAgY3VycmVudENvbHVtbk51bWJlciArPSAxOwogICAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPiBtYXhDb2x1bW4pIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IHN0YXJ0Q29vcmRpbmF0ZSwgb3ZlcmxhcHM6IHRydWUgfTsKICAgIH0KICAgIF9nZXRWY2ZFbmQoc3RhcnRDb29yZGluYXRlLCByZWZTZXEsIGluZm8pIHsKICAgICAgbGV0IGVuZENvb3JkaW5hdGUgPSBzdGFydENvb3JkaW5hdGUgKyByZWZTZXEubGVuZ3RoOwogICAgICBjb25zdCBpc1RSQSA9IGluZm8uaW5kZXhPZigiU1ZUWVBFPVRSQSIpICE9PSAtMTsKICAgICAgaWYgKGluZm9bMF0gIT09ICIuIiAmJiAhaXNUUkEpIHsKICAgICAgICBsZXQgcHJldkNoYXIgPSAiOyI7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmZvLmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICBpZiAocHJldkNoYXIgPT09ICI7IiAmJiBpbmZvLnNsaWNlKGosIGogKyA0KSA9PT0gIkVORD0iKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZUVuZCA9IGluZm8uaW5kZXhPZigiOyIsIGopOwogICAgICAgICAgICBpZiAodmFsdWVFbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgdmFsdWVFbmQgPSBpbmZvLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbmRDb29yZGluYXRlID0gcGFyc2VJbnQoaW5mby5zbGljZShqICsgNCwgdmFsdWVFbmQpLCAxMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcHJldkNoYXIgPSBpbmZvW2pdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc1RSQSkgewogICAgICAgIHJldHVybiBzdGFydENvb3JkaW5hdGUgKyAxOwogICAgICB9CiAgICAgIHJldHVybiBlbmRDb29yZGluYXRlOwogICAgfQogICAgYXN5bmMgbGluZUNvdW50KHJlZk5hbWUsIG9wdHMgPSB7fSkgewogICAgICByZXR1cm4gdGhpcy5pbmRleC5saW5lQ291bnQocmVmTmFtZSwgb3B0cyk7CiAgICB9CiAgICBhc3luYyBfcmVhZFJlZ2lvbihwb3MsIHNpemUsIG9wdHMgPSB7fSkgewogICAgICBjb25zdCBiID0gYnVmZmVyLkJ1ZmZlci5hbGxvYyhzaXplKTsKICAgICAgY29uc3QgeyBieXRlc1JlYWQsIGJ1ZmZlcjogYnVmZmVyJDEgfSA9IGF3YWl0IHRoaXMuZmlsZWhhbmRsZS5yZWFkKGIsIDAsIHNpemUsIHBvcywgb3B0cyk7CiAgICAgIHJldHVybiBidWZmZXIkMS5zbGljZSgwLCBieXRlc1JlYWQpOwogICAgfQogICAgYXN5bmMgcmVhZENodW5rKGMyLCBvcHRzID0ge30pIHsKICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX3JlYWRSZWdpb24oYzIubWludi5ibG9ja1Bvc2l0aW9uLCBjMi5mZXRjaGVkU2l6ZSgpLCBvcHRzKTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gdW56aXBDaHVua1NsaWNlKGRhdGEsIGMyKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IgZGVjb21wcmVzc2luZyBjICR7YzIudG9TdHJpbmcoKX0gJHtlfWApOwogICAgICB9CiAgICB9CiAgfQogIHZhciBldmVudHMgPSB7IGV4cG9ydHM6IHt9IH07CiAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gIm9iamVjdCIgPyBSZWZsZWN0IDogbnVsbDsKICB2YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gImZ1bmN0aW9uIiA/IFIuYXBwbHkgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkyKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHsKICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTsKICB9OwogIHZhciBSZWZsZWN0T3duS2V5czsKICBpZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAiZnVuY3Rpb24iKSB7CiAgICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5czsKICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXMyKHRhcmdldCkgewogICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTsKICAgIH07CiAgfSBlbHNlIHsKICAgIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXMyKHRhcmdldCkgewogICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7CiAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pCiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICB9CiAgdmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOMih2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICB9OwogIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHsKICAgIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7CiAgfQogIGV2ZW50cy5leHBvcnRzID0gRXZlbnRFbWl0dGVyOwogIGV2ZW50cy5leHBvcnRzLm9uY2UgPSBvbmNlJDI7CiAgRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB2b2lkIDA7CiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHZvaWQgMDsKICB2YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwOwogIGZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHsKICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgfQogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAiZGVmYXVsdE1heExpc3RlbmVycyIsIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVyczsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uKGFyZykgewogICAgICBpZiAodHlwZW9mIGFyZyAhPT0gIm51bWJlciIgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICIuIik7CiAgICAgIH0KICAgICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZzsKICAgIH0KICB9KTsKICBFdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdm9pZCAwIHx8IHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgdGhpcy5fZXZlbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgIH0KICAgIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB2b2lkIDA7CiAgfTsKICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7CiAgICBpZiAodHlwZW9mIG4gIT09ICJudW1iZXIiIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgIi4iKTsKICAgIH0KICAgIHRoaXMuX21heExpc3RlbmVycyA9IG47CiAgICByZXR1cm4gdGhpczsKICB9OwogIGZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkgewogICAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdm9pZCAwKQogICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzOwogIH0KICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHsKICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogIH07CiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7CiAgICB2YXIgYXJncyA9IFtdOwogICAgZm9yICh2YXIgaTIgPSAxOyBpMiA8IGFyZ3VtZW50cy5sZW5ndGg7IGkyKyspCiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaTJdKTsKICAgIHZhciBkb0Vycm9yID0gdHlwZSA9PT0gImVycm9yIjsKICAgIHZhciBldmVudHMyID0gdGhpcy5fZXZlbnRzOwogICAgaWYgKGV2ZW50czIgIT09IHZvaWQgMCkKICAgICAgZG9FcnJvciA9IGRvRXJyb3IgJiYgZXZlbnRzMi5lcnJvciA9PT0gdm9pZCAwOwogICAgZWxzZSBpZiAoIWRvRXJyb3IpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmIChkb0Vycm9yKSB7CiAgICAgIHZhciBlcjsKICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkKICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgdGhyb3cgZXI7CiAgICAgIH0KICAgICAgdmFyIGVycjIgPSBuZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iICsgKGVyID8gIiAoIiArIGVyLm1lc3NhZ2UgKyAiKSIgOiAiIikpOwogICAgICBlcnIyLmNvbnRleHQgPSBlcjsKICAgICAgdGhyb3cgZXJyMjsKICAgIH0KICAgIHZhciBoYW5kbGVyID0gZXZlbnRzMlt0eXBlXTsKICAgIGlmIChoYW5kbGVyID09PSB2b2lkIDApCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gImZ1bmN0aW9uIikgewogICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbGVuMiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4yKTsKICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IGxlbjI7ICsraTIpCiAgICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpMl0sIHRoaXMsIGFyZ3MpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfTsKICBmdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkgewogICAgdmFyIG07CiAgICB2YXIgZXZlbnRzMjsKICAgIHZhciBleGlzdGluZzsKICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgZXZlbnRzMiA9IHRhcmdldC5fZXZlbnRzOwogICAgaWYgKGV2ZW50czIgPT09IHZvaWQgMCkgewogICAgICBldmVudHMyID0gdGFyZ2V0Ll9ldmVudHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7CiAgICB9IGVsc2UgewogICAgICBpZiAoZXZlbnRzMi5uZXdMaXN0ZW5lciAhPT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0LmVtaXQoCiAgICAgICAgICAibmV3TGlzdGVuZXIiLAogICAgICAgICAgdHlwZSwKICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcgogICAgICAgICk7CiAgICAgICAgZXZlbnRzMiA9IHRhcmdldC5fZXZlbnRzOwogICAgICB9CiAgICAgIGV4aXN0aW5nID0gZXZlbnRzMlt0eXBlXTsKICAgIH0KICAgIGlmIChleGlzdGluZyA9PT0gdm9pZCAwKSB7CiAgICAgIGV4aXN0aW5nID0gZXZlbnRzMlt0eXBlXSA9IGxpc3RlbmVyOwogICAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgZXhpc3RpbmcgPSBldmVudHMyW3R5cGVdID0gcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07CiAgICAgIH0gZWxzZSBpZiAocHJlcGVuZCkgewogICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpOwogICAgICB9CiAgICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7CiAgICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHsKICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgIHZhciB3ID0gbmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIgKyBleGlzdGluZy5sZW5ndGggKyAiICIgKyBTdHJpbmcodHlwZSkgKyAiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTsKICAgICAgICB3Lm5hbWUgPSAiTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIjsKICAgICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7CiAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoOwogICAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgfTsKICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjsKICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9IGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcjIodHlwZSwgbGlzdGVuZXIpIHsKICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogIH07CiAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICBpZiAoIXRoaXMuZmlyZWQpIHsKICAgICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7CiAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTsKICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7CiAgICB2YXIgc3RhdGUyID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdm9pZCAwLCB0YXJnZXQsIHR5cGUsIGxpc3RlbmVyIH07CiAgICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUyKTsKICAgIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgIHN0YXRlMi53cmFwRm4gPSB3cmFwcGVkOwogICAgcmV0dXJuIHdyYXBwZWQ7CiAgfQogIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9IGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgdmFyIGxpc3QsIGV2ZW50czIsIHBvc2l0aW9uLCBpMiwgb3JpZ2luYWxMaXN0ZW5lcjsKICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgZXZlbnRzMiA9IHRoaXMuX2V2ZW50czsKICAgIGlmIChldmVudHMyID09PSB2b2lkIDApCiAgICAgIHJldHVybiB0aGlzOwogICAgbGlzdCA9IGV2ZW50czJbdHlwZV07CiAgICBpZiAobGlzdCA9PT0gdm9pZCAwKQogICAgICByZXR1cm4gdGhpczsKICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICB0aGlzLl9ldmVudHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZWxzZSB7CiAgICAgICAgZGVsZXRlIGV2ZW50czJbdHlwZV07CiAgICAgICAgaWYgKGV2ZW50czIucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICB0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIiwgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgcG9zaXRpb24gPSAtMTsKICAgICAgZm9yIChpMiA9IGxpc3QubGVuZ3RoIC0gMTsgaTIgPj0gMDsgaTItLSkgewogICAgICAgIGlmIChsaXN0W2kyXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpMl0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7CiAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpMl0ubGlzdGVuZXI7CiAgICAgICAgICBwb3NpdGlvbiA9IGkyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwb3NpdGlvbiA8IDApCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIGlmIChwb3NpdGlvbiA9PT0gMCkKICAgICAgICBsaXN0LnNoaWZ0KCk7CiAgICAgIGVsc2UgewogICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7CiAgICAgIH0KICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgIGV2ZW50czJbdHlwZV0gPSBsaXN0WzBdOwogICAgICBpZiAoZXZlbnRzMi5yZW1vdmVMaXN0ZW5lciAhPT0gdm9pZCAwKQogICAgICAgIHRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH07CiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwogIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHsKICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50czIsIGkyOwogICAgZXZlbnRzMiA9IHRoaXMuX2V2ZW50czsKICAgIGlmIChldmVudHMyID09PSB2b2lkIDApCiAgICAgIHJldHVybiB0aGlzOwogICAgaWYgKGV2ZW50czIucmVtb3ZlTGlzdGVuZXIgPT09IHZvaWQgMCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHRoaXMuX2V2ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIGlmIChldmVudHMyW3R5cGVdICE9PSB2b2lkIDApIHsKICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGVsc2UKICAgICAgICAgIGRlbGV0ZSBldmVudHMyW3R5cGVdOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgdmFyIGtleXMyID0gT2JqZWN0LmtleXMoZXZlbnRzMik7CiAgICAgIHZhciBrZXk7CiAgICAgIGZvciAoaTIgPSAwOyBpMiA8IGtleXMyLmxlbmd0aDsgKytpMikgewogICAgICAgIGtleSA9IGtleXMyW2kyXTsKICAgICAgICBpZiAoa2V5ID09PSAicmVtb3ZlTGlzdGVuZXIiKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTsKICAgICAgfQogICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKTsKICAgICAgdGhpcy5fZXZlbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBsaXN0ZW5lcnMgPSBldmVudHMyW3R5cGVdOwogICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpOwogICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHZvaWQgMCkgewogICAgICBmb3IgKGkyID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkyID49IDA7IGkyLS0pIHsKICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpMl0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9OwogIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgIHZhciBldmVudHMyID0gdGFyZ2V0Ll9ldmVudHM7CiAgICBpZiAoZXZlbnRzMiA9PT0gdm9pZCAwKQogICAgICByZXR1cm4gW107CiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50czJbdHlwZV07CiAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdm9pZCAwKQogICAgICByZXR1cm4gW107CiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICJmdW5jdGlvbiIpCiAgICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTsKICAgIHJldHVybiB1bndyYXAgPyB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICB9CiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkgewogICAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7CiAgfTsKICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7CiAgfTsKICBFdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHsKICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgfQogIH07CiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDsKICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgIHZhciBldmVudHMyID0gdGhpcy5fZXZlbnRzOwogICAgaWYgKGV2ZW50czIgIT09IHZvaWQgMCkgewogICAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50czJbdHlwZV07CiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiAxOwogICAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7CiAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogIH07CiAgZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHsKICAgIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pOwogICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IG47ICsraTIpCiAgICAgIGNvcHlbaTJdID0gYXJyW2kyXTsKICAgIHJldHVybiBjb3B5OwogIH0KICBmdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHsKICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07CiAgICBsaXN0LnBvcCgpOwogIH0KICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOwogICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHJldC5sZW5ndGg7ICsraTIpIHsKICAgICAgcmV0W2kyXSA9IGFycltpMl0ubGlzdGVuZXIgfHwgYXJyW2kyXTsKICAgIH0KICAgIHJldHVybiByZXQ7CiAgfQogIGZ1bmN0aW9uIG9uY2UkMihlbWl0dGVyLCBuYW1lKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyMikgewogICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpOwogICAgICAgIHJlamVjdChlcnIyKTsKICAgICAgfQogICAgICBmdW5jdGlvbiByZXNvbHZlcigpIHsKICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgZXJyb3JMaXN0ZW5lcik7CiAgICAgICAgfQogICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgfQogICAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgaWYgKG5hbWUgIT09ICJlcnJvciIpIHsKICAgICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIH0KICAgIH0pOwogIH0KICBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykgewogICAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAiZXJyb3IiLCBoYW5kbGVyLCBmbGFncyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHsKICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gImZ1bmN0aW9uIikgewogICAgICBpZiAoZmxhZ3Mub25jZSkgewogICAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTsKICAgICAgICB9CiAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgIH0KICB9CiAgdmFyIGluaGVyaXRzX2Jyb3dzZXIgPSB7IGV4cG9ydHM6IHt9IH07CiAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAiZnVuY3Rpb24iKSB7CiAgICBpbmhlcml0c19icm93c2VyLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0czIoY3Rvciwgc3VwZXJDdG9yKSB7CiAgICAgIGlmIChzdXBlckN0b3IpIHsKICAgICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjsKICAgICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwgewogICAgICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICAgICAgdmFsdWU6IGN0b3IsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgfSBlbHNlIHsKICAgIGluaGVyaXRzX2Jyb3dzZXIuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzMihjdG9yLCBzdXBlckN0b3IpIHsKICAgICAgaWYgKHN1cGVyQ3RvcikgewogICAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yOwogICAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uKCkgewogICAgICAgIH07CiAgICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTsKICAgICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpOwogICAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjsKICAgICAgfQogICAgfTsKICB9CiAgdmFyIHN0cmVhbUJyb3dzZXIgPSBldmVudHMuZXhwb3J0cy5FdmVudEVtaXR0ZXI7CiAgdmFyIHJlcXVpcmUkJDMgPSAvKiBAX19QVVJFX18gKi8gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKF9fdml0ZUJyb3dzZXJFeHRlcm5hbCk7CiAgZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICB2YXIga2V5czIgPSBPYmplY3Qua2V5cyhvYmplY3QpOwogICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgdmFyIHN5bWJvbHMyID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9sczIgPSBzeW1ib2xzMi5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7CiAgICAgIH0pKSwga2V5czIucHVzaC5hcHBseShrZXlzMiwgc3ltYm9sczIpOwogICAgfQogICAgcmV0dXJuIGtleXMyOwogIH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgewogICAgZm9yICh2YXIgaTIgPSAxOyBpMiA8IGFyZ3VtZW50cy5sZW5ndGg7IGkyKyspIHsKICAgICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2kyXSA/IGFyZ3VtZW50c1tpMl0gOiB7fTsKICAgICAgaTIgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICBfZGVmaW5lUHJvcGVydHkkMSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOwogICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSBfdG9Qcm9wZXJ0eUtleSQxKGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBwcm9wcy5sZW5ndGg7IGkyKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpMl07CiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKQogICAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleSQxKGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKQogICAgICBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgaWYgKHN0YXRpY1Byb3BzKQogICAgICBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7CiAgICByZXR1cm4gQ29uc3RydWN0b3I7CiAgfQogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5JDEoYXJnKSB7CiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlJDEoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlJDEoaW5wdXQsIGhpbnQpIHsKICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICJvYmplY3QiIHx8IGlucHV0ID09PSBudWxsKQogICAgICByZXR1cm4gaW5wdXQ7CiAgICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgICBpZiAocHJpbSAhPT0gdm9pZCAwKSB7CiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgImRlZmF1bHQiKTsKICAgICAgaWYgKHR5cGVvZiByZXMgIT09ICJvYmplY3QiKQogICAgICAgIHJldHVybiByZXM7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIik7CiAgICB9CiAgICByZXR1cm4gKGhpbnQgPT09ICJzdHJpbmciID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7CiAgfQogIHZhciBfcmVxdWlyZSQyID0gYnVmZmVyLCBCdWZmZXIkNSA9IF9yZXF1aXJlJDIuQnVmZmVyOwogIHZhciBfcmVxdWlyZTIgPSByZXF1aXJlJCQzLCBpbnNwZWN0ID0gX3JlcXVpcmUyLmluc3BlY3Q7CiAgdmFyIGN1c3RvbSA9IGluc3BlY3QgJiYgaW5zcGVjdC5jdXN0b20gfHwgImluc3BlY3QiOwogIGZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkgewogICAgQnVmZmVyJDUucHJvdG90eXBlLmNvcHkuY2FsbChzcmMsIHRhcmdldCwgb2Zmc2V0KTsKICB9CiAgdmFyIGJ1ZmZlcl9saXN0ID0gLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gQnVmZmVyTGlzdDIoKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0Mik7CiAgICAgIHRoaXMuaGVhZCA9IG51bGw7CiAgICAgIHRoaXMudGFpbCA9IG51bGw7CiAgICAgIHRoaXMubGVuZ3RoID0gMDsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhCdWZmZXJMaXN0MiwgW3sKICAgICAga2V5OiAicHVzaCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKHYyKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gewogICAgICAgICAgZGF0YTogdjIsCiAgICAgICAgICBuZXh0OiBudWxsCiAgICAgICAgfTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAwKQogICAgICAgICAgdGhpcy50YWlsLm5leHQgPSBlbnRyeTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmhlYWQgPSBlbnRyeTsKICAgICAgICB0aGlzLnRhaWwgPSBlbnRyeTsKICAgICAgICArK3RoaXMubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInVuc2hpZnQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCh2MikgewogICAgICAgIHZhciBlbnRyeSA9IHsKICAgICAgICAgIGRhdGE6IHYyLAogICAgICAgICAgbmV4dDogdGhpcy5oZWFkCiAgICAgICAgfTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApCiAgICAgICAgICB0aGlzLnRhaWwgPSBlbnRyeTsKICAgICAgICB0aGlzLmhlYWQgPSBlbnRyeTsKICAgICAgICArK3RoaXMubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNoaWZ0IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0KCkgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKQogICAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDsKICAgICAgICAtLXRoaXMubGVuZ3RoOwogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiY2xlYXIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7CiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDsKICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiam9pbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBqb2luKHMpIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7CiAgICAgICAgdmFyIHJldCA9ICIiICsgcC5kYXRhOwogICAgICAgIHdoaWxlIChwID0gcC5uZXh0KQogICAgICAgICAgcmV0ICs9IHMgKyBwLmRhdGE7CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJjb25jYXQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KG4pIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm4gQnVmZmVyJDUuYWxsb2MoMCk7CiAgICAgICAgdmFyIHJldCA9IEJ1ZmZlciQ1LmFsbG9jVW5zYWZlKG4gPj4+IDApOwogICAgICAgIHZhciBwID0gdGhpcy5oZWFkOwogICAgICAgIHZhciBpMiA9IDA7CiAgICAgICAgd2hpbGUgKHApIHsKICAgICAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkyKTsKICAgICAgICAgIGkyICs9IHAuZGF0YS5sZW5ndGg7CiAgICAgICAgICBwID0gcC5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImNvbnN1bWUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3VtZShuLCBoYXNTdHJpbmdzKSB7CiAgICAgICAgdmFyIHJldDsKICAgICAgICBpZiAobiA8IHRoaXMuaGVhZC5kYXRhLmxlbmd0aCkgewogICAgICAgICAgcmV0ID0gdGhpcy5oZWFkLmRhdGEuc2xpY2UoMCwgbik7CiAgICAgICAgICB0aGlzLmhlYWQuZGF0YSA9IHRoaXMuaGVhZC5kYXRhLnNsaWNlKG4pOwogICAgICAgIH0gZWxzZSBpZiAobiA9PT0gdGhpcy5oZWFkLmRhdGEubGVuZ3RoKSB7CiAgICAgICAgICByZXQgPSB0aGlzLnNoaWZ0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldCA9IGhhc1N0cmluZ3MgPyB0aGlzLl9nZXRTdHJpbmcobikgOiB0aGlzLl9nZXRCdWZmZXIobik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZmlyc3QiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZmlyc3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZC5kYXRhOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9nZXRTdHJpbmciLAogICAgICB2YWx1ZTogZnVuY3Rpb24gX2dldFN0cmluZyhuKSB7CiAgICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7CiAgICAgICAgdmFyIGMyID0gMTsKICAgICAgICB2YXIgcmV0ID0gcC5kYXRhOwogICAgICAgIG4gLT0gcmV0Lmxlbmd0aDsKICAgICAgICB3aGlsZSAocCA9IHAubmV4dCkgewogICAgICAgICAgdmFyIHN0ciA9IHAuZGF0YTsKICAgICAgICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47CiAgICAgICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpCiAgICAgICAgICAgIHJldCArPSBzdHI7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldCArPSBzdHIuc2xpY2UoMCwgbik7CiAgICAgICAgICBuIC09IG5iOwogICAgICAgICAgaWYgKG4gPT09IDApIHsKICAgICAgICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgKytjMjsKICAgICAgICAgICAgICBpZiAocC5uZXh0KQogICAgICAgICAgICAgICAgdGhpcy5oZWFkID0gcC5uZXh0OwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5oZWFkID0gcDsKICAgICAgICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytjMjsKICAgICAgICB9CiAgICAgICAgdGhpcy5sZW5ndGggLT0gYzI7CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZ2V0QnVmZmVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRCdWZmZXIobikgewogICAgICAgIHZhciByZXQgPSBCdWZmZXIkNS5hbGxvY1Vuc2FmZShuKTsKICAgICAgICB2YXIgcCA9IHRoaXMuaGVhZDsKICAgICAgICB2YXIgYzIgPSAxOwogICAgICAgIHAuZGF0YS5jb3B5KHJldCk7CiAgICAgICAgbiAtPSBwLmRhdGEubGVuZ3RoOwogICAgICAgIHdoaWxlIChwID0gcC5uZXh0KSB7CiAgICAgICAgICB2YXIgYnVmID0gcC5kYXRhOwogICAgICAgICAgdmFyIG5iID0gbiA+IGJ1Zi5sZW5ndGggPyBidWYubGVuZ3RoIDogbjsKICAgICAgICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTsKICAgICAgICAgIG4gLT0gbmI7CiAgICAgICAgICBpZiAobiA9PT0gMCkgewogICAgICAgICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHsKICAgICAgICAgICAgICArK2MyOwogICAgICAgICAgICAgIGlmIChwLm5leHQpCiAgICAgICAgICAgICAgICB0aGlzLmhlYWQgPSBwLm5leHQ7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmhlYWQgPSBwOwogICAgICAgICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICArK2MyOwogICAgICAgIH0KICAgICAgICB0aGlzLmxlbmd0aCAtPSBjMjsKICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogY3VzdG9tLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoXywgb3B0aW9ucykgewogICAgICAgIHJldHVybiBpbnNwZWN0KHRoaXMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7CiAgICAgICAgICBkZXB0aDogMCwKICAgICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gQnVmZmVyTGlzdDI7CiAgfSgpOwogIGZ1bmN0aW9uIGRlc3Ryb3koZXJyMiwgY2IpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICB2YXIgcmVhZGFibGVEZXN0cm95ZWQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkOwogICAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDsKICAgIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkgewogICAgICBpZiAoY2IpIHsKICAgICAgICBjYihlcnIyKTsKICAgICAgfSBlbHNlIGlmIChlcnIyKSB7CiAgICAgICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7CiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIyKTsKICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkgewogICAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyMik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHsKICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlOwogICAgfQogICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHsKICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlOwogICAgfQogICAgdGhpcy5fZGVzdHJveShlcnIyIHx8IG51bGwsIGZ1bmN0aW9uKGVycjMpIHsKICAgICAgaWYgKCFjYiAmJiBlcnIzKSB7CiAgICAgICAgaWYgKCFfdGhpcy5fd3JpdGFibGVTdGF0ZSkgewogICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZU5ULCBfdGhpcywgZXJyMyk7CiAgICAgICAgfSBlbHNlIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSB7CiAgICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZU5ULCBfdGhpcywgZXJyMyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIF90aGlzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2IpIHsKICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCBfdGhpcyk7CiAgICAgICAgY2IoZXJyMyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCwgX3RoaXMpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBmdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZU5UKHNlbGYyLCBlcnIyKSB7CiAgICBlbWl0RXJyb3JOVChzZWxmMiwgZXJyMik7CiAgICBlbWl0Q2xvc2VOVChzZWxmMik7CiAgfQogIGZ1bmN0aW9uIGVtaXRDbG9zZU5UKHNlbGYyKSB7CiAgICBpZiAoc2VsZjIuX3dyaXRhYmxlU3RhdGUgJiYgIXNlbGYyLl93cml0YWJsZVN0YXRlLmVtaXRDbG9zZSkKICAgICAgcmV0dXJuOwogICAgaWYgKHNlbGYyLl9yZWFkYWJsZVN0YXRlICYmICFzZWxmMi5fcmVhZGFibGVTdGF0ZS5lbWl0Q2xvc2UpCiAgICAgIHJldHVybjsKICAgIHNlbGYyLmVtaXQoImNsb3NlIik7CiAgfQogIGZ1bmN0aW9uIHVuZGVzdHJveSgpIHsKICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlOwogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlOwogICAgfQogICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHsKICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlOwogICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlOwogICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkID0gZmFsc2U7CiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQgPSBmYWxzZTsKICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlOwogICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmMiwgZXJyMikgewogICAgc2VsZjIuZW1pdCgiZXJyb3IiLCBlcnIyKTsKICB9CiAgZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3kkMihzdHJlYW0sIGVycjIpIHsKICAgIHZhciByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7CiAgICB2YXIgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlOwogICAgaWYgKHJTdGF0ZSAmJiByU3RhdGUuYXV0b0Rlc3Ryb3kgfHwgd1N0YXRlICYmIHdTdGF0ZS5hdXRvRGVzdHJveSkKICAgICAgc3RyZWFtLmRlc3Ryb3koZXJyMik7CiAgICBlbHNlCiAgICAgIHN0cmVhbS5lbWl0KCJlcnJvciIsIGVycjIpOwogIH0KICB2YXIgZGVzdHJveV8xID0gewogICAgZGVzdHJveSwKICAgIHVuZGVzdHJveSwKICAgIGVycm9yT3JEZXN0cm95OiBlcnJvck9yRGVzdHJveSQyCiAgfTsKICB2YXIgZXJyb3JzQnJvd3NlciA9IHt9OwogIGZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsKICAgIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOwogICAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsKICB9CiAgdmFyIGNvZGVzID0ge307CiAgZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUyLCBtZXNzYWdlLCBCYXNlKSB7CiAgICBpZiAoIUJhc2UpIHsKICAgICAgQmFzZSA9IEVycm9yOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKSB7CiAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKTsKICAgICAgfQogICAgfQogICAgdmFyIE5vZGVFcnJvciA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbihfQmFzZSkgewogICAgICBfaW5oZXJpdHNMb29zZShOb2RlRXJyb3IyLCBfQmFzZSk7CiAgICAgIGZ1bmN0aW9uIE5vZGVFcnJvcjIoYXJnMSwgYXJnMiwgYXJnMykgewogICAgICAgIHJldHVybiBfQmFzZS5jYWxsKHRoaXMsIGdldE1lc3NhZ2UoYXJnMSwgYXJnMiwgYXJnMykpIHx8IHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIE5vZGVFcnJvcjI7CiAgICB9KEJhc2UpOwogICAgTm9kZUVycm9yLnByb3RvdHlwZS5uYW1lID0gQmFzZS5uYW1lOwogICAgTm9kZUVycm9yLnByb3RvdHlwZS5jb2RlID0gY29kZTI7CiAgICBjb2Rlc1tjb2RlMl0gPSBOb2RlRXJyb3I7CiAgfQogIGZ1bmN0aW9uIG9uZU9mKGV4cGVjdGVkLCB0aGluZykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7CiAgICAgIHZhciBsZW4yID0gZXhwZWN0ZWQubGVuZ3RoOwogICAgICBleHBlY3RlZCA9IGV4cGVjdGVkLm1hcChmdW5jdGlvbihpMikgewogICAgICAgIHJldHVybiBTdHJpbmcoaTIpOwogICAgICB9KTsKICAgICAgaWYgKGxlbjIgPiAyKSB7CiAgICAgICAgcmV0dXJuICJvbmUgb2YgIi5jb25jYXQodGhpbmcsICIgIikuY29uY2F0KGV4cGVjdGVkLnNsaWNlKDAsIGxlbjIgLSAxKS5qb2luKCIsICIpLCAiLCBvciAiKSArIGV4cGVjdGVkW2xlbjIgLSAxXTsKICAgICAgfSBlbHNlIGlmIChsZW4yID09PSAyKSB7CiAgICAgICAgcmV0dXJuICJvbmUgb2YgIi5jb25jYXQodGhpbmcsICIgIikuY29uY2F0KGV4cGVjdGVkWzBdLCAiIG9yICIpLmNvbmNhdChleHBlY3RlZFsxXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICJvZiAiLmNvbmNhdCh0aGluZywgIiAiKS5jb25jYXQoZXhwZWN0ZWRbMF0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIm9mICIuY29uY2F0KHRoaW5nLCAiICIpLmNvbmNhdChTdHJpbmcoZXhwZWN0ZWQpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHNlYXJjaCwgcG9zKSB7CiAgICByZXR1cm4gc3RyLnN1YnN0cighcG9zIHx8IHBvcyA8IDAgPyAwIDogK3Bvcywgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDsKICB9CiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzZWFyY2gsIHRoaXNfbGVuKSB7CiAgICBpZiAodGhpc19sZW4gPT09IHZvaWQgMCB8fCB0aGlzX2xlbiA+IHN0ci5sZW5ndGgpIHsKICAgICAgdGhpc19sZW4gPSBzdHIubGVuZ3RoOwogICAgfQogICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcodGhpc19sZW4gLSBzZWFyY2gubGVuZ3RoLCB0aGlzX2xlbikgPT09IHNlYXJjaDsKICB9CiAgZnVuY3Rpb24gaW5jbHVkZXMoc3RyLCBzZWFyY2gsIHN0YXJ0KSB7CiAgICBpZiAodHlwZW9mIHN0YXJ0ICE9PSAibnVtYmVyIikgewogICAgICBzdGFydCA9IDA7CiAgICB9CiAgICBpZiAoc3RhcnQgKyBzZWFyY2gubGVuZ3RoID4gc3RyLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3RyLmluZGV4T2Yoc2VhcmNoLCBzdGFydCkgIT09IC0xOwogICAgfQogIH0KICBjcmVhdGVFcnJvclR5cGUoIkVSUl9JTlZBTElEX09QVF9WQUxVRSIsIGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gJ1RoZSB2YWx1ZSAiJyArIHZhbHVlICsgJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICInICsgbmFtZSArICciJzsKICB9LCBUeXBlRXJyb3IpOwogIGNyZWF0ZUVycm9yVHlwZSgiRVJSX0lOVkFMSURfQVJHX1RZUEUiLCBmdW5jdGlvbihuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7CiAgICB2YXIgZGV0ZXJtaW5lcjsKICAgIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICJzdHJpbmciICYmIHN0YXJ0c1dpdGgoZXhwZWN0ZWQsICJub3QgIikpIHsKICAgICAgZGV0ZXJtaW5lciA9ICJtdXN0IG5vdCBiZSI7CiAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQucmVwbGFjZSgvXm5vdCAvLCAiIik7CiAgICB9IGVsc2UgewogICAgICBkZXRlcm1pbmVyID0gIm11c3QgYmUiOwogICAgfQogICAgdmFyIG1zZzI7CiAgICBpZiAoZW5kc1dpdGgobmFtZSwgIiBhcmd1bWVudCIpKSB7CiAgICAgIG1zZzIgPSAiVGhlICIuY29uY2F0KG5hbWUsICIgIikuY29uY2F0KGRldGVybWluZXIsICIgIikuY29uY2F0KG9uZU9mKGV4cGVjdGVkLCAidHlwZSIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB0eXBlID0gaW5jbHVkZXMobmFtZSwgIi4iKSA/ICJwcm9wZXJ0eSIgOiAiYXJndW1lbnQiOwogICAgICBtc2cyID0gJ1RoZSAiJy5jb25jYXQobmFtZSwgJyIgJykuY29uY2F0KHR5cGUsICIgIikuY29uY2F0KGRldGVybWluZXIsICIgIikuY29uY2F0KG9uZU9mKGV4cGVjdGVkLCAidHlwZSIpKTsKICAgIH0KICAgIG1zZzIgKz0gIi4gUmVjZWl2ZWQgdHlwZSAiLmNvbmNhdCh0eXBlb2YgYWN0dWFsKTsKICAgIHJldHVybiBtc2cyOwogIH0sIFR5cGVFcnJvcik7CiAgY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GIiwgInN0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GIik7CiAgY3JlYXRlRXJyb3JUeXBlKCJFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCIsIGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJldHVybiAiVGhlICIgKyBuYW1lICsgIiBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIjsKICB9KTsKICBjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFIiwgIlByZW1hdHVyZSBjbG9zZSIpOwogIGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9ERVNUUk9ZRUQiLCBmdW5jdGlvbihuYW1lKSB7CiAgICByZXR1cm4gIkNhbm5vdCBjYWxsICIgKyBuYW1lICsgIiBhZnRlciBhIHN0cmVhbSB3YXMgZGVzdHJveWVkIjsKICB9KTsKICBjcmVhdGVFcnJvclR5cGUoIkVSUl9NVUxUSVBMRV9DQUxMQkFDSyIsICJDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMiKTsKICBjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUiLCAiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpOwogIGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQiLCAid3JpdGUgYWZ0ZXIgZW5kIik7CiAgY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX05VTExfVkFMVUVTIiwgIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIiwgVHlwZUVycm9yKTsKICBjcmVhdGVFcnJvclR5cGUoIkVSUl9VTktOT1dOX0VOQ09ESU5HIiwgZnVuY3Rpb24oYXJnKSB7CiAgICByZXR1cm4gIlVua25vd24gZW5jb2Rpbmc6ICIgKyBhcmc7CiAgfSwgVHlwZUVycm9yKTsKICBjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQiLCAic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQiKTsKICBlcnJvcnNCcm93c2VyLmNvZGVzID0gY29kZXM7CiAgdmFyIEVSUl9JTlZBTElEX09QVF9WQUxVRSA9IGVycm9yc0Jyb3dzZXIuY29kZXMuRVJSX0lOVkFMSURfT1BUX1ZBTFVFOwogIGZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpIHsKICAgIHJldHVybiBvcHRpb25zLmhpZ2hXYXRlck1hcmsgIT0gbnVsbCA/IG9wdGlvbnMuaGlnaFdhdGVyTWFyayA6IGlzRHVwbGV4ID8gb3B0aW9uc1tkdXBsZXhLZXldIDogbnVsbDsKICB9CiAgZnVuY3Rpb24gZ2V0SGlnaFdhdGVyTWFyayQyKHN0YXRlMiwgb3B0aW9ucywgZHVwbGV4S2V5LCBpc0R1cGxleCkgewogICAgdmFyIGh3bSA9IGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpOwogICAgaWYgKGh3bSAhPSBudWxsKSB7CiAgICAgIGlmICghKGlzRmluaXRlKGh3bSkgJiYgTWF0aC5mbG9vcihod20pID09PSBod20pIHx8IGh3bSA8IDApIHsKICAgICAgICB2YXIgbmFtZSA9IGlzRHVwbGV4ID8gZHVwbGV4S2V5IDogImhpZ2hXYXRlck1hcmsiOwogICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9PUFRfVkFMVUUobmFtZSwgaHdtKTsKICAgICAgfQogICAgICByZXR1cm4gTWF0aC5mbG9vcihod20pOwogICAgfQogICAgcmV0dXJuIHN0YXRlMi5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7CiAgfQogIHZhciBzdGF0ZSA9IHsKICAgIGdldEhpZ2hXYXRlck1hcms6IGdldEhpZ2hXYXRlck1hcmskMgogIH07CiAgdmFyIGJyb3dzZXIgPSBkZXByZWNhdGU7CiAgZnVuY3Rpb24gZGVwcmVjYXRlKGZuLCBtc2cyKSB7CiAgICBpZiAoY29uZmlnKCJub0RlcHJlY2F0aW9uIikpIHsKICAgICAgcmV0dXJuIGZuOwogICAgfQogICAgdmFyIHdhcm5lZCA9IGZhbHNlOwogICAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHsKICAgICAgaWYgKCF3YXJuZWQpIHsKICAgICAgICBpZiAoY29uZmlnKCJ0aHJvd0RlcHJlY2F0aW9uIikpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cyKTsKICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZygidHJhY2VEZXByZWNhdGlvbiIpKSB7CiAgICAgICAgICBjb25zb2xlLnRyYWNlKG1zZzIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLndhcm4obXNnMik7CiAgICAgICAgfQogICAgICAgIHdhcm5lZCA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgICByZXR1cm4gZGVwcmVjYXRlZDsKICB9CiAgZnVuY3Rpb24gY29uZmlnKG5hbWUpIHsKICAgIHRyeSB7CiAgICAgIGlmICghY29tbW9uanNHbG9iYWwubG9jYWxTdG9yYWdlKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyIHZhbCA9IGNvbW1vbmpzR2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTsKICAgIGlmIChudWxsID09IHZhbCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIjsKICB9CiAgdmFyIF9zdHJlYW1fd3JpdGFibGUgPSBXcml0YWJsZSQxOwogIGZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUyKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdGhpcy5uZXh0ID0gbnVsbDsKICAgIHRoaXMuZW50cnkgPSBudWxsOwogICAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbigpIHsKICAgICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlMik7CiAgICB9OwogIH0KICB2YXIgRHVwbGV4JDM7CiAgV3JpdGFibGUkMS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTsKICB2YXIgaW50ZXJuYWxVdGlsID0gewogICAgZGVwcmVjYXRlOiBicm93c2VyCiAgfTsKICB2YXIgU3RyZWFtJDIgPSBzdHJlYW1Ccm93c2VyOwogIHZhciBCdWZmZXIkNCA9IGJ1ZmZlci5CdWZmZXI7CiAgdmFyIE91clVpbnQ4QXJyYXkkMSA9ICh0eXBlb2YgY29tbW9uanNHbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gY29tbW9uanNHbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbigpIHsKICB9OwogIGZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIkMShjaHVuaykgewogICAgcmV0dXJuIEJ1ZmZlciQ0LmZyb20oY2h1bmspOwogIH0KICBmdW5jdGlvbiBfaXNVaW50OEFycmF5JDEob2JqKSB7CiAgICByZXR1cm4gQnVmZmVyJDQuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5JDE7CiAgfQogIHZhciBkZXN0cm95SW1wbCQxID0gZGVzdHJveV8xOwogIHZhciBfcmVxdWlyZSQxID0gc3RhdGUsIGdldEhpZ2hXYXRlck1hcmskMSA9IF9yZXF1aXJlJDEuZ2V0SGlnaFdhdGVyTWFyazsKICB2YXIgX3JlcXVpcmUkY29kZXMkMyA9IGVycm9yc0Jyb3dzZXIuY29kZXMsIEVSUl9JTlZBTElEX0FSR19UWVBFJDEgPSBfcmVxdWlyZSRjb2RlcyQzLkVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCQyID0gX3JlcXVpcmUkY29kZXMkMy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCwgRVJSX01VTFRJUExFX0NBTExCQUNLJDEgPSBfcmVxdWlyZSRjb2RlcyQzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSywgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSA9IF9yZXF1aXJlJGNvZGVzJDMuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSwgRVJSX1NUUkVBTV9ERVNUUk9ZRUQkMSA9IF9yZXF1aXJlJGNvZGVzJDMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMgPSBfcmVxdWlyZSRjb2RlcyQzLkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EID0gX3JlcXVpcmUkY29kZXMkMy5FUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCwgRVJSX1VOS05PV05fRU5DT0RJTkcgPSBfcmVxdWlyZSRjb2RlcyQzLkVSUl9VTktOT1dOX0VOQ09ESU5HOwogIHZhciBlcnJvck9yRGVzdHJveSQxID0gZGVzdHJveUltcGwkMS5lcnJvck9yRGVzdHJveTsKICBpbmhlcml0c19icm93c2VyLmV4cG9ydHMoV3JpdGFibGUkMSwgU3RyZWFtJDIpOwogIGZ1bmN0aW9uIG5vcCgpIHsKICB9CiAgZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7CiAgICBEdXBsZXgkMyA9IER1cGxleCQzIHx8IF9zdHJlYW1fZHVwbGV4OwogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAiYm9vbGVhbiIpCiAgICAgIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4JDM7CiAgICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTsKICAgIGlmIChpc0R1cGxleCkKICAgICAgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7CiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBnZXRIaWdoV2F0ZXJNYXJrJDEodGhpcywgb3B0aW9ucywgIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsIGlzRHVwbGV4KTsKICAgIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZTsKICAgIHRoaXMubmVlZERyYWluID0gZmFsc2U7CiAgICB0aGlzLmVuZGluZyA9IGZhbHNlOwogICAgdGhpcy5lbmRlZCA9IGZhbHNlOwogICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlOwogICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKICAgIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7CiAgICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7CiAgICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICJ1dGY4IjsKICAgIHRoaXMubGVuZ3RoID0gMDsKICAgIHRoaXMud3JpdGluZyA9IGZhbHNlOwogICAgdGhpcy5jb3JrZWQgPSAwOwogICAgdGhpcy5zeW5jID0gdHJ1ZTsKICAgIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlOwogICAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24oZXIpIHsKICAgICAgb253cml0ZShzdHJlYW0sIGVyKTsKICAgIH07CiAgICB0aGlzLndyaXRlY2IgPSBudWxsOwogICAgdGhpcy53cml0ZWxlbiA9IDA7CiAgICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7CiAgICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsOwogICAgdGhpcy5wZW5kaW5nY2IgPSAwOwogICAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlOwogICAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTsKICAgIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlOwogICAgdGhpcy5hdXRvRGVzdHJveSA9ICEhb3B0aW9ucy5hdXRvRGVzdHJveTsKICAgIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwOwogICAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTsKICB9CiAgV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkgewogICAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDsKICAgIHZhciBvdXQgPSBbXTsKICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgIG91dC5wdXNoKGN1cnJlbnQpOwogICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgfQogICAgcmV0dXJuIG91dDsKICB9OwogIChmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgImJ1ZmZlciIsIHsKICAgICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gd3JpdGFibGVTdGF0ZUJ1ZmZlckdldHRlcigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpOwogICAgICAgIH0sICJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsICJERVAwMDAzIikKICAgICAgfSk7CiAgICB9IGNhdGNoIChfKSB7CiAgICB9CiAgfSkoKTsKICB2YXIgcmVhbEhhc0luc3RhbmNlOwogIGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICJmdW5jdGlvbiIpIHsKICAgIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlJDEsIFN5bWJvbC5oYXNJbnN0YW5jZSwgewogICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUob2JqZWN0KSB7CiAgICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUkMSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7CiAgICAgIH0KICAgIH0pOwogIH0gZWxzZSB7CiAgICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiByZWFsSGFzSW5zdGFuY2UyKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpczsKICAgIH07CiAgfQogIGZ1bmN0aW9uIFdyaXRhYmxlJDEob3B0aW9ucykgewogICAgRHVwbGV4JDMgPSBEdXBsZXgkMyB8fCBfc3RyZWFtX2R1cGxleDsKICAgIHZhciBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgkMzsKICAgIGlmICghaXNEdXBsZXggJiYgIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlJDEsIHRoaXMpKQogICAgICByZXR1cm4gbmV3IFdyaXRhYmxlJDEob3B0aW9ucyk7CiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpOwogICAgdGhpcy53cml0YWJsZSA9IHRydWU7CiAgICBpZiAob3B0aW9ucykgewogICAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlOwogICAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAiZnVuY3Rpb24iKQogICAgICAgIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2OwogICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gImZ1bmN0aW9uIikKICAgICAgICB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95OwogICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsOwogICAgfQogICAgU3RyZWFtJDIuY2FsbCh0aGlzKTsKICB9CiAgV3JpdGFibGUkMS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkgewogICAgZXJyb3JPckRlc3Ryb3kkMSh0aGlzLCBuZXcgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSgpKTsKICB9OwogIGZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikgewogICAgdmFyIGVyID0gbmV3IEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EKCk7CiAgICBlcnJvck9yRGVzdHJveSQxKHN0cmVhbSwgZXIpOwogICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpOwogIH0KICBmdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUyLCBjaHVuaywgY2IpIHsKICAgIHZhciBlcjsKICAgIGlmIChjaHVuayA9PT0gbnVsbCkgewogICAgICBlciA9IG5ldyBFUlJfU1RSRUFNX05VTExfVkFMVUVTKCk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gInN0cmluZyIgJiYgIXN0YXRlMi5vYmplY3RNb2RlKSB7CiAgICAgIGVyID0gbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFJDEoImNodW5rIiwgWyJzdHJpbmciLCAiQnVmZmVyIl0sIGNodW5rKTsKICAgIH0KICAgIGlmIChlcikgewogICAgICBlcnJvck9yRGVzdHJveSQxKHN0cmVhbSwgZXIpOwogICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBXcml0YWJsZSQxLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHsKICAgIHZhciBzdGF0ZTIgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgdmFyIHJldCA9IGZhbHNlOwogICAgdmFyIGlzQnVmID0gIXN0YXRlMi5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkkMShjaHVuayk7CiAgICBpZiAoaXNCdWYgJiYgIUJ1ZmZlciQ0LmlzQnVmZmVyKGNodW5rKSkgewogICAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIkMShjaHVuayk7CiAgICB9CiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNiID0gZW5jb2Rpbmc7CiAgICAgIGVuY29kaW5nID0gbnVsbDsKICAgIH0KICAgIGlmIChpc0J1ZikKICAgICAgZW5jb2RpbmcgPSAiYnVmZmVyIjsKICAgIGVsc2UgaWYgKCFlbmNvZGluZykKICAgICAgZW5jb2RpbmcgPSBzdGF0ZTIuZGVmYXVsdEVuY29kaW5nOwogICAgaWYgKHR5cGVvZiBjYiAhPT0gImZ1bmN0aW9uIikKICAgICAgY2IgPSBub3A7CiAgICBpZiAoc3RhdGUyLmVuZGluZykKICAgICAgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7CiAgICBlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlMiwgY2h1bmssIGNiKSkgewogICAgICBzdGF0ZTIucGVuZGluZ2NiKys7CiAgICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUyLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7CiAgICB9CiAgICByZXR1cm4gcmV0OwogIH07CiAgV3JpdGFibGUkMS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrKzsKICB9OwogIFdyaXRhYmxlJDEucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHN0YXRlMiA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7CiAgICBpZiAoc3RhdGUyLmNvcmtlZCkgewogICAgICBzdGF0ZTIuY29ya2VkLS07CiAgICAgIGlmICghc3RhdGUyLndyaXRpbmcgJiYgIXN0YXRlMi5jb3JrZWQgJiYgIXN0YXRlMi5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlMi5idWZmZXJlZFJlcXVlc3QpCiAgICAgICAgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUyKTsKICAgIH0KICB9OwogIFdyaXRhYmxlJDEucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykgewogICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gInN0cmluZyIpCiAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTsKICAgIGlmICghKFsiaGV4IiwgInV0ZjgiLCAidXRmLTgiLCAiYXNjaWkiLCAiYmluYXJ5IiwgImJhc2U2NCIsICJ1Y3MyIiwgInVjcy0yIiwgInV0ZjE2bGUiLCAidXRmLTE2bGUiLCAicmF3Il0uaW5kZXhPZigoZW5jb2RpbmcgKyAiIikudG9Mb3dlckNhc2UoKSkgPiAtMSkpCiAgICAgIHRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZyk7CiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUkMS5wcm90b3R5cGUsICJ3cml0YWJsZUJ1ZmZlciIsIHsKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7CiAgICB9CiAgfSk7CiAgZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUyLCBjaHVuaywgZW5jb2RpbmcpIHsKICAgIGlmICghc3RhdGUyLm9iamVjdE1vZGUgJiYgc3RhdGUyLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gInN0cmluZyIpIHsKICAgICAgY2h1bmsgPSBCdWZmZXIkNC5mcm9tKGNodW5rLCBlbmNvZGluZyk7CiAgICB9CiAgICByZXR1cm4gY2h1bms7CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSQxLnByb3RvdHlwZSwgIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsIHsKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7CiAgICB9CiAgfSk7CiAgZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlMiwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHsKICAgIGlmICghaXNCdWYpIHsKICAgICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUyLCBjaHVuaywgZW5jb2RpbmcpOwogICAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7CiAgICAgICAgaXNCdWYgPSB0cnVlOwogICAgICAgIGVuY29kaW5nID0gImJ1ZmZlciI7CiAgICAgICAgY2h1bmsgPSBuZXdDaHVuazsKICAgICAgfQogICAgfQogICAgdmFyIGxlbjIgPSBzdGF0ZTIub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7CiAgICBzdGF0ZTIubGVuZ3RoICs9IGxlbjI7CiAgICB2YXIgcmV0ID0gc3RhdGUyLmxlbmd0aCA8IHN0YXRlMi5oaWdoV2F0ZXJNYXJrOwogICAgaWYgKCFyZXQpCiAgICAgIHN0YXRlMi5uZWVkRHJhaW4gPSB0cnVlOwogICAgaWYgKHN0YXRlMi53cml0aW5nIHx8IHN0YXRlMi5jb3JrZWQpIHsKICAgICAgdmFyIGxhc3QgPSBzdGF0ZTIubGFzdEJ1ZmZlcmVkUmVxdWVzdDsKICAgICAgc3RhdGUyLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7CiAgICAgICAgY2h1bmssCiAgICAgICAgZW5jb2RpbmcsCiAgICAgICAgaXNCdWYsCiAgICAgICAgY2FsbGJhY2s6IGNiLAogICAgICAgIG5leHQ6IG51bGwKICAgICAgfTsKICAgICAgaWYgKGxhc3QpIHsKICAgICAgICBsYXN0Lm5leHQgPSBzdGF0ZTIubGFzdEJ1ZmZlcmVkUmVxdWVzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZTIuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUyLmxhc3RCdWZmZXJlZFJlcXVlc3Q7CiAgICAgIH0KICAgICAgc3RhdGUyLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7CiAgICB9IGVsc2UgewogICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUyLCBmYWxzZSwgbGVuMiwgY2h1bmssIGVuY29kaW5nLCBjYik7CiAgICB9CiAgICByZXR1cm4gcmV0OwogIH0KICBmdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUyLCB3cml0ZXYsIGxlbjIsIGNodW5rLCBlbmNvZGluZywgY2IpIHsKICAgIHN0YXRlMi53cml0ZWxlbiA9IGxlbjI7CiAgICBzdGF0ZTIud3JpdGVjYiA9IGNiOwogICAgc3RhdGUyLndyaXRpbmcgPSB0cnVlOwogICAgc3RhdGUyLnN5bmMgPSB0cnVlOwogICAgaWYgKHN0YXRlMi5kZXN0cm95ZWQpCiAgICAgIHN0YXRlMi5vbndyaXRlKG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCQxKCJ3cml0ZSIpKTsKICAgIGVsc2UgaWYgKHdyaXRldikKICAgICAgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlMi5vbndyaXRlKTsKICAgIGVsc2UKICAgICAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlMi5vbndyaXRlKTsKICAgIHN0YXRlMi5zeW5jID0gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlMiwgc3luYywgZXIsIGNiKSB7CiAgICAtLXN0YXRlMi5wZW5kaW5nY2I7CiAgICBpZiAoc3luYykgewogICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7CiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUyKTsKICAgICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7CiAgICAgIGVycm9yT3JEZXN0cm95JDEoc3RyZWFtLCBlcik7CiAgICB9IGVsc2UgewogICAgICBjYihlcik7CiAgICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlOwogICAgICBlcnJvck9yRGVzdHJveSQxKHN0cmVhbSwgZXIpOwogICAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlMik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZTIpIHsKICAgIHN0YXRlMi53cml0aW5nID0gZmFsc2U7CiAgICBzdGF0ZTIud3JpdGVjYiA9IG51bGw7CiAgICBzdGF0ZTIubGVuZ3RoIC09IHN0YXRlMi53cml0ZWxlbjsKICAgIHN0YXRlMi53cml0ZWxlbiA9IDA7CiAgfQogIGZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikgewogICAgdmFyIHN0YXRlMiA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTsKICAgIHZhciBzeW5jID0gc3RhdGUyLnN5bmM7CiAgICB2YXIgY2IgPSBzdGF0ZTIud3JpdGVjYjsKICAgIGlmICh0eXBlb2YgY2IgIT09ICJmdW5jdGlvbiIpCiAgICAgIHRocm93IG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0skMSgpOwogICAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlMik7CiAgICBpZiAoZXIpCiAgICAgIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlMiwgc3luYywgZXIsIGNiKTsKICAgIGVsc2UgewogICAgICB2YXIgZmluaXNoZWQyID0gbmVlZEZpbmlzaChzdGF0ZTIpIHx8IHN0cmVhbS5kZXN0cm95ZWQ7CiAgICAgIGlmICghZmluaXNoZWQyICYmICFzdGF0ZTIuY29ya2VkICYmICFzdGF0ZTIuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZTIuYnVmZmVyZWRSZXF1ZXN0KSB7CiAgICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZTIpOwogICAgICB9CiAgICAgIGlmIChzeW5jKSB7CiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlMiwgZmluaXNoZWQyLCBjYik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlMiwgZmluaXNoZWQyLCBjYik7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlMiwgZmluaXNoZWQyLCBjYikgewogICAgaWYgKCFmaW5pc2hlZDIpCiAgICAgIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlMik7CiAgICBzdGF0ZTIucGVuZGluZ2NiLS07CiAgICBjYigpOwogICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZTIpOwogIH0KICBmdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZTIpIHsKICAgIGlmIChzdGF0ZTIubGVuZ3RoID09PSAwICYmIHN0YXRlMi5uZWVkRHJhaW4pIHsKICAgICAgc3RhdGUyLm5lZWREcmFpbiA9IGZhbHNlOwogICAgICBzdHJlYW0uZW1pdCgiZHJhaW4iKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZTIpIHsKICAgIHN0YXRlMi5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTsKICAgIHZhciBlbnRyeSA9IHN0YXRlMi5idWZmZXJlZFJlcXVlc3Q7CiAgICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkgewogICAgICB2YXIgbCA9IHN0YXRlMi5idWZmZXJlZFJlcXVlc3RDb3VudDsKICAgICAgdmFyIGJ1ZmZlcjIgPSBuZXcgQXJyYXkobCk7CiAgICAgIHZhciBob2xkZXIgPSBzdGF0ZTIuY29ya2VkUmVxdWVzdHNGcmVlOwogICAgICBob2xkZXIuZW50cnkgPSBlbnRyeTsKICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgdmFyIGFsbEJ1ZmZlcnMgPSB0cnVlOwogICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBidWZmZXIyW2NvdW50XSA9IGVudHJ5OwogICAgICAgIGlmICghZW50cnkuaXNCdWYpCiAgICAgICAgICBhbGxCdWZmZXJzID0gZmFsc2U7CiAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgICAgIGNvdW50ICs9IDE7CiAgICAgIH0KICAgICAgYnVmZmVyMi5hbGxCdWZmZXJzID0gYWxsQnVmZmVyczsKICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlMiwgdHJ1ZSwgc3RhdGUyLmxlbmd0aCwgYnVmZmVyMiwgIiIsIGhvbGRlci5maW5pc2gpOwogICAgICBzdGF0ZTIucGVuZGluZ2NiKys7CiAgICAgIHN0YXRlMi5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDsKICAgICAgaWYgKGhvbGRlci5uZXh0KSB7CiAgICAgICAgc3RhdGUyLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0OwogICAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZTIuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUyKTsKICAgICAgfQogICAgICBzdGF0ZTIuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwOwogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7CiAgICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7CiAgICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7CiAgICAgICAgdmFyIGxlbjIgPSBzdGF0ZTIub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7CiAgICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlMiwgZmFsc2UsIGxlbjIsIGNodW5rLCBlbmNvZGluZywgY2IpOwogICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgICBzdGF0ZTIuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTsKICAgICAgICBpZiAoc3RhdGUyLndyaXRpbmcpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW50cnkgPT09IG51bGwpCiAgICAgICAgc3RhdGUyLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsOwogICAgfQogICAgc3RhdGUyLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5OwogICAgc3RhdGUyLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTsKICB9CiAgV3JpdGFibGUkMS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikgewogICAgY2IobmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEJDIoIl93cml0ZSgpIikpOwogIH07CiAgV3JpdGFibGUkMS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7CiAgV3JpdGFibGUkMS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikgewogICAgdmFyIHN0YXRlMiA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7CiAgICBpZiAodHlwZW9mIGNodW5rID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNiID0gY2h1bms7CiAgICAgIGNodW5rID0gbnVsbDsKICAgICAgZW5jb2RpbmcgPSBudWxsOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgY2IgPSBlbmNvZGluZzsKICAgICAgZW5jb2RpbmcgPSBudWxsOwogICAgfQogICAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB2b2lkIDApCiAgICAgIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTsKICAgIGlmIChzdGF0ZTIuY29ya2VkKSB7CiAgICAgIHN0YXRlMi5jb3JrZWQgPSAxOwogICAgICB0aGlzLnVuY29yaygpOwogICAgfQogICAgaWYgKCFzdGF0ZTIuZW5kaW5nKQogICAgICBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZTIsIGNiKTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlJDEucHJvdG90eXBlLCAid3JpdGFibGVMZW5ndGgiLCB7CiAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7CiAgICB9CiAgfSk7CiAgZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZTIpIHsKICAgIHJldHVybiBzdGF0ZTIuZW5kaW5nICYmIHN0YXRlMi5sZW5ndGggPT09IDAgJiYgc3RhdGUyLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUyLmZpbmlzaGVkICYmICFzdGF0ZTIud3JpdGluZzsKICB9CiAgZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUyKSB7CiAgICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uKGVycjIpIHsKICAgICAgc3RhdGUyLnBlbmRpbmdjYi0tOwogICAgICBpZiAoZXJyMikgewogICAgICAgIGVycm9yT3JEZXN0cm95JDEoc3RyZWFtLCBlcnIyKTsKICAgICAgfQogICAgICBzdGF0ZTIucHJlZmluaXNoZWQgPSB0cnVlOwogICAgICBzdHJlYW0uZW1pdCgicHJlZmluaXNoIik7CiAgICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUyKTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBwcmVmaW5pc2gkMShzdHJlYW0sIHN0YXRlMikgewogICAgaWYgKCFzdGF0ZTIucHJlZmluaXNoZWQgJiYgIXN0YXRlMi5maW5hbENhbGxlZCkgewogICAgICBpZiAodHlwZW9mIHN0cmVhbS5fZmluYWwgPT09ICJmdW5jdGlvbiIgJiYgIXN0YXRlMi5kZXN0cm95ZWQpIHsKICAgICAgICBzdGF0ZTIucGVuZGluZ2NiKys7CiAgICAgICAgc3RhdGUyLmZpbmFsQ2FsbGVkID0gdHJ1ZTsKICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxGaW5hbCwgc3RyZWFtLCBzdGF0ZTIpOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRlMi5wcmVmaW5pc2hlZCA9IHRydWU7CiAgICAgICAgc3RyZWFtLmVtaXQoInByZWZpbmlzaCIpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUyKSB7CiAgICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUyKTsKICAgIGlmIChuZWVkKSB7CiAgICAgIHByZWZpbmlzaCQxKHN0cmVhbSwgc3RhdGUyKTsKICAgICAgaWYgKHN0YXRlMi5wZW5kaW5nY2IgPT09IDApIHsKICAgICAgICBzdGF0ZTIuZmluaXNoZWQgPSB0cnVlOwogICAgICAgIHN0cmVhbS5lbWl0KCJmaW5pc2giKTsKICAgICAgICBpZiAoc3RhdGUyLmF1dG9EZXN0cm95KSB7CiAgICAgICAgICB2YXIgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlOwogICAgICAgICAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmF1dG9EZXN0cm95ICYmIHJTdGF0ZS5lbmRFbWl0dGVkKSB7CiAgICAgICAgICAgIHN0cmVhbS5kZXN0cm95KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZDsKICB9CiAgZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZTIsIGNiKSB7CiAgICBzdGF0ZTIuZW5kaW5nID0gdHJ1ZTsKICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUyKTsKICAgIGlmIChjYikgewogICAgICBpZiAoc3RhdGUyLmZpbmlzaGVkKQogICAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IpOwogICAgICBlbHNlCiAgICAgICAgc3RyZWFtLm9uY2UoImZpbmlzaCIsIGNiKTsKICAgIH0KICAgIHN0YXRlMi5lbmRlZCA9IHRydWU7CiAgICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTsKICB9CiAgZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUyLCBlcnIyKSB7CiAgICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5OwogICAgY29ya1JlcS5lbnRyeSA9IG51bGw7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7CiAgICAgIHN0YXRlMi5wZW5kaW5nY2ItLTsKICAgICAgY2IoZXJyMik7CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHN0YXRlMi5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSQxLnByb3RvdHlwZSwgImRlc3Ryb3llZCIsIHsKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkOwogICAgfSwKICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7CiAgICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlOwogICAgfQogIH0pOwogIFdyaXRhYmxlJDEucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbCQxLmRlc3Ryb3k7CiAgV3JpdGFibGUkMS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsJDEudW5kZXN0cm95OwogIFdyaXRhYmxlJDEucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24oZXJyMiwgY2IpIHsKICAgIGNiKGVycjIpOwogIH07CiAgdmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbihvYmopIHsKICAgIHZhciBrZXlzMiA9IFtdOwogICAgZm9yICh2YXIga2V5IGluIG9iaikKICAgICAga2V5czIucHVzaChrZXkpOwogICAgcmV0dXJuIGtleXMyOwogIH07CiAgdmFyIF9zdHJlYW1fZHVwbGV4ID0gRHVwbGV4JDI7CiAgdmFyIFJlYWRhYmxlJDEgPSBfc3RyZWFtX3JlYWRhYmxlOwogIHZhciBXcml0YWJsZSA9IF9zdHJlYW1fd3JpdGFibGU7CiAgaW5oZXJpdHNfYnJvd3Nlci5leHBvcnRzKER1cGxleCQyLCBSZWFkYWJsZSQxKTsKICB7CiAgICB2YXIga2V5cyQxID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpOwogICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzJDEubGVuZ3RoOyB2KyspIHsKICAgICAgdmFyIG1ldGhvZCA9IGtleXMkMVt2XTsKICAgICAgaWYgKCFEdXBsZXgkMi5wcm90b3R5cGVbbWV0aG9kXSkKICAgICAgICBEdXBsZXgkMi5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdOwogICAgfQogIH0KICBmdW5jdGlvbiBEdXBsZXgkMihvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4JDIpKQogICAgICByZXR1cm4gbmV3IER1cGxleCQyKG9wdGlvbnMpOwogICAgUmVhZGFibGUkMS5jYWxsKHRoaXMsIG9wdGlvbnMpOwogICAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTsKICAgIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7CiAgICBpZiAob3B0aW9ucykgewogICAgICBpZiAob3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpCiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlOwogICAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpCiAgICAgICAgdGhpcy53cml0YWJsZSA9IGZhbHNlOwogICAgICBpZiAob3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgewogICAgICAgIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlOwogICAgICAgIHRoaXMub25jZSgiZW5kIiwgb25lbmQpOwogICAgICB9CiAgICB9CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgkMi5wcm90b3R5cGUsICJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLCB7CiAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrOwogICAgfQogIH0pOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgkMi5wcm90b3R5cGUsICJ3cml0YWJsZUJ1ZmZlciIsIHsKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7CiAgICB9CiAgfSk7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleCQyLnByb3RvdHlwZSwgIndyaXRhYmxlTGVuZ3RoIiwgewogICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoOwogICAgfQogIH0pOwogIGZ1bmN0aW9uIG9uZW5kKCkgewogICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpCiAgICAgIHJldHVybjsKICAgIHByb2Nlc3MubmV4dFRpY2sob25FbmROVCwgdGhpcyk7CiAgfQogIGZ1bmN0aW9uIG9uRW5kTlQoc2VsZjIpIHsKICAgIHNlbGYyLmVuZCgpOwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4JDIucHJvdG90eXBlLCAiZGVzdHJveWVkIiwgewogICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHZvaWQgMCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkOwogICAgfSwKICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7CiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB2b2lkIDAgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7CiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7CiAgICB9CiAgfSk7CiAgdmFyIHN0cmluZ19kZWNvZGVyID0ge307CiAgdmFyIHNhZmVCdWZmZXIgPSB7IGV4cG9ydHM6IHt9IH07CiAgLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovCiAgKGZ1bmN0aW9uKG1vZHVsZTIsIGV4cG9ydHMyKSB7CiAgICB2YXIgYnVmZmVyJDEgPSBidWZmZXI7CiAgICB2YXIgQnVmZmVyMyA9IGJ1ZmZlciQxLkJ1ZmZlcjsKICAgIGZ1bmN0aW9uIGNvcHlQcm9wcyhzcmMsIGRzdCkgewogICAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7CiAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTsKICAgICAgfQogICAgfQogICAgaWYgKEJ1ZmZlcjMuZnJvbSAmJiBCdWZmZXIzLmFsbG9jICYmIEJ1ZmZlcjMuYWxsb2NVbnNhZmUgJiYgQnVmZmVyMy5hbGxvY1Vuc2FmZVNsb3cpIHsKICAgICAgbW9kdWxlMi5leHBvcnRzID0gYnVmZmVyJDE7CiAgICB9IGVsc2UgewogICAgICBjb3B5UHJvcHMoYnVmZmVyJDEsIGV4cG9ydHMyKTsKICAgICAgZXhwb3J0czIuQnVmZmVyID0gU2FmZUJ1ZmZlcjsKICAgIH0KICAgIGZ1bmN0aW9uIFNhZmVCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgcmV0dXJuIEJ1ZmZlcjMoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgfQogICAgU2FmZUJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJ1ZmZlcjMucHJvdG90eXBlKTsKICAgIGNvcHlQcm9wcyhCdWZmZXIzLCBTYWZlQnVmZmVyKTsKICAgIFNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7CiAgICAgIGlmICh0eXBlb2YgYXJnID09PSAibnVtYmVyIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7CiAgICAgIH0KICAgICAgcmV0dXJuIEJ1ZmZlcjMoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpOwogICAgfTsKICAgIFNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbihzaXplLCBmaWxsLCBlbmNvZGluZykgewogICAgICBpZiAodHlwZW9mIHNpemUgIT09ICJudW1iZXIiKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpOwogICAgICB9CiAgICAgIHZhciBidWYgPSBCdWZmZXIzKHNpemUpOwogICAgICBpZiAoZmlsbCAhPT0gdm9pZCAwKSB7CiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnVmLmZpbGwoZmlsbCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGJ1Zi5maWxsKDApOwogICAgICB9CiAgICAgIHJldHVybiBidWY7CiAgICB9OwogICAgU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgaWYgKHR5cGVvZiBzaXplICE9PSAibnVtYmVyIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTsKICAgICAgfQogICAgICByZXR1cm4gQnVmZmVyMyhzaXplKTsKICAgIH07CiAgICBTYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgaWYgKHR5cGVvZiBzaXplICE9PSAibnVtYmVyIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTsKICAgICAgfQogICAgICByZXR1cm4gYnVmZmVyJDEuU2xvd0J1ZmZlcihzaXplKTsKICAgIH07CiAgfSkoc2FmZUJ1ZmZlciwgc2FmZUJ1ZmZlci5leHBvcnRzKTsKICB2YXIgQnVmZmVyJDMgPSBzYWZlQnVmZmVyLmV4cG9ydHMuQnVmZmVyOwogIHZhciBpc0VuY29kaW5nID0gQnVmZmVyJDMuaXNFbmNvZGluZyB8fCBmdW5jdGlvbihlbmNvZGluZykgewogICAgZW5jb2RpbmcgPSAiIiArIGVuY29kaW5nOwogICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7CiAgICAgIGNhc2UgImhleCI6CiAgICAgIGNhc2UgInV0ZjgiOgogICAgICBjYXNlICJ1dGYtOCI6CiAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgY2FzZSAiYmluYXJ5IjoKICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgY2FzZSAidWNzMiI6CiAgICAgIGNhc2UgInVjcy0yIjoKICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgY2FzZSAicmF3IjoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7CiAgICBpZiAoIWVuYykKICAgICAgcmV0dXJuICJ1dGY4IjsKICAgIHZhciByZXRyaWVkOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgc3dpdGNoIChlbmMpIHsKICAgICAgICBjYXNlICJ1dGY4IjoKICAgICAgICBjYXNlICJ1dGYtOCI6CiAgICAgICAgICByZXR1cm4gInV0ZjgiOwogICAgICAgIGNhc2UgInVjczIiOgogICAgICAgIGNhc2UgInVjcy0yIjoKICAgICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgICAgICByZXR1cm4gInV0ZjE2bGUiOwogICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgY2FzZSAiYmluYXJ5IjoKICAgICAgICAgIHJldHVybiAibGF0aW4xIjsKICAgICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICBjYXNlICJoZXgiOgogICAgICAgICAgcmV0dXJuIGVuYzsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHJldHJpZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGVuYyA9ICgiIiArIGVuYykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIHJldHJpZWQgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykgewogICAgdmFyIG5lbmMgPSBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKTsKICAgIGlmICh0eXBlb2YgbmVuYyAhPT0gInN0cmluZyIgJiYgKEJ1ZmZlciQzLmlzRW5jb2RpbmcgPT09IGlzRW5jb2RpbmcgfHwgIWlzRW5jb2RpbmcoZW5jKSkpCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIiArIGVuYyk7CiAgICByZXR1cm4gbmVuYyB8fCBlbmM7CiAgfQogIHN0cmluZ19kZWNvZGVyLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyJDI7CiAgZnVuY3Rpb24gU3RyaW5nRGVjb2RlciQyKGVuY29kaW5nKSB7CiAgICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpOwogICAgdmFyIG5iOwogICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7CiAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICAgIHRoaXMudGV4dCA9IHV0ZjE2VGV4dDsKICAgICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kOwogICAgICAgIG5iID0gNDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDsKICAgICAgICBuYiA9IDQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgdGhpcy50ZXh0ID0gYmFzZTY0VGV4dDsKICAgICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDsKICAgICAgICBuYiA9IDM7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlOwogICAgICAgIHRoaXMuZW5kID0gc2ltcGxlRW5kOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMubGFzdE5lZWQgPSAwOwogICAgdGhpcy5sYXN0VG90YWwgPSAwOwogICAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlciQzLmFsbG9jVW5zYWZlKG5iKTsKICB9CiAgU3RyaW5nRGVjb2RlciQyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgewogICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApCiAgICAgIHJldHVybiAiIjsKICAgIHZhciByOwogICAgdmFyIGkyOwogICAgaWYgKHRoaXMubGFzdE5lZWQpIHsKICAgICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTsKICAgICAgaWYgKHIgPT09IHZvaWQgMCkKICAgICAgICByZXR1cm4gIiI7CiAgICAgIGkyID0gdGhpcy5sYXN0TmVlZDsKICAgICAgdGhpcy5sYXN0TmVlZCA9IDA7CiAgICB9IGVsc2UgewogICAgICBpMiA9IDA7CiAgICB9CiAgICBpZiAoaTIgPCBidWYubGVuZ3RoKQogICAgICByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpMikgOiB0aGlzLnRleHQoYnVmLCBpMik7CiAgICByZXR1cm4gciB8fCAiIjsKICB9OwogIFN0cmluZ0RlY29kZXIkMi5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDsKICBTdHJpbmdEZWNvZGVyJDIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDsKICBTdHJpbmdEZWNvZGVyJDIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24oYnVmKSB7CiAgICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7CiAgICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdGhpcy5sYXN0TmVlZCk7CiAgICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTsKICAgIH0KICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgYnVmLmxlbmd0aCk7CiAgICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7CiAgfTsKICBmdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHsKICAgIGlmIChieXRlIDw9IDEyNykKICAgICAgcmV0dXJuIDA7CiAgICBlbHNlIGlmIChieXRlID4+IDUgPT09IDYpCiAgICAgIHJldHVybiAyOwogICAgZWxzZSBpZiAoYnl0ZSA+PiA0ID09PSAxNCkKICAgICAgcmV0dXJuIDM7CiAgICBlbHNlIGlmIChieXRlID4+IDMgPT09IDMwKQogICAgICByZXR1cm4gNDsKICAgIHJldHVybiBieXRlID4+IDYgPT09IDIgPyAtMSA6IC0yOwogIH0KICBmdW5jdGlvbiB1dGY4Q2hlY2tJbmNvbXBsZXRlKHNlbGYyLCBidWYsIGkyKSB7CiAgICB2YXIgaiA9IGJ1Zi5sZW5ndGggLSAxOwogICAgaWYgKGogPCBpMikKICAgICAgcmV0dXJuIDA7CiAgICB2YXIgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7CiAgICBpZiAobmIgPj0gMCkgewogICAgICBpZiAobmIgPiAwKQogICAgICAgIHNlbGYyLmxhc3ROZWVkID0gbmIgLSAxOwogICAgICByZXR1cm4gbmI7CiAgICB9CiAgICBpZiAoLS1qIDwgaTIgfHwgbmIgPT09IC0yKQogICAgICByZXR1cm4gMDsKICAgIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pOwogICAgaWYgKG5iID49IDApIHsKICAgICAgaWYgKG5iID4gMCkKICAgICAgICBzZWxmMi5sYXN0TmVlZCA9IG5iIC0gMjsKICAgICAgcmV0dXJuIG5iOwogICAgfQogICAgaWYgKC0taiA8IGkyIHx8IG5iID09PSAtMikKICAgICAgcmV0dXJuIDA7CiAgICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTsKICAgIGlmIChuYiA+PSAwKSB7CiAgICAgIGlmIChuYiA+IDApIHsKICAgICAgICBpZiAobmIgPT09IDIpCiAgICAgICAgICBuYiA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgc2VsZjIubGFzdE5lZWQgPSBuYiAtIDM7CiAgICAgIH0KICAgICAgcmV0dXJuIG5iOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGZ1bmN0aW9uIHV0ZjhDaGVja0V4dHJhQnl0ZXMoc2VsZjIsIGJ1ZiwgcCkgewogICAgaWYgKChidWZbMF0gJiAxOTIpICE9PSAxMjgpIHsKICAgICAgc2VsZjIubGFzdE5lZWQgPSAwOwogICAgICByZXR1cm4gIlx1RkZGRCI7CiAgICB9CiAgICBpZiAoc2VsZjIubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7CiAgICAgIGlmICgoYnVmWzFdICYgMTkyKSAhPT0gMTI4KSB7CiAgICAgICAgc2VsZjIubGFzdE5lZWQgPSAxOwogICAgICAgIHJldHVybiAiXHVGRkZEIjsKICAgICAgfQogICAgICBpZiAoc2VsZjIubGFzdE5lZWQgPiAyICYmIGJ1Zi5sZW5ndGggPiAyKSB7CiAgICAgICAgaWYgKChidWZbMl0gJiAxOTIpICE9PSAxMjgpIHsKICAgICAgICAgIHNlbGYyLmxhc3ROZWVkID0gMjsKICAgICAgICAgIHJldHVybiAiXHVGRkZEIjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gdXRmOEZpbGxMYXN0KGJ1ZikgewogICAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7CiAgICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmKTsKICAgIGlmIChyICE9PSB2b2lkIDApCiAgICAgIHJldHVybiByOwogICAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkgewogICAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTsKICAgICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpOwogICAgfQogICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7CiAgICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7CiAgfQogIGZ1bmN0aW9uIHV0ZjhUZXh0KGJ1ZiwgaTIpIHsKICAgIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpMik7CiAgICBpZiAoIXRoaXMubGFzdE5lZWQpCiAgICAgIHJldHVybiBidWYudG9TdHJpbmcoInV0ZjgiLCBpMik7CiAgICB0aGlzLmxhc3RUb3RhbCA9IHRvdGFsOwogICAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTsKICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7CiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCJ1dGY4IiwgaTIsIGVuZCk7CiAgfQogIGZ1bmN0aW9uIHV0ZjhFbmQoYnVmKSB7CiAgICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogIiI7CiAgICBpZiAodGhpcy5sYXN0TmVlZCkKICAgICAgcmV0dXJuIHIgKyAiXHVGRkZEIjsKICAgIHJldHVybiByOwogIH0KICBmdW5jdGlvbiB1dGYxNlRleHQoYnVmLCBpMikgewogICAgaWYgKChidWYubGVuZ3RoIC0gaTIpICUgMiA9PT0gMCkgewogICAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygidXRmMTZsZSIsIGkyKTsKICAgICAgaWYgKHIpIHsKICAgICAgICB2YXIgYzIgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTsKICAgICAgICBpZiAoYzIgPj0gNTUyOTYgJiYgYzIgPD0gNTYzMTkpIHsKICAgICAgICAgIHRoaXMubGFzdE5lZWQgPSAyOwogICAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0OwogICAgICAgICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07CiAgICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTsKICAgICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICB0aGlzLmxhc3ROZWVkID0gMTsKICAgIHRoaXMubGFzdFRvdGFsID0gMjsKICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdOwogICAgcmV0dXJuIGJ1Zi50b1N0cmluZygidXRmMTZsZSIsIGkyLCBidWYubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9uIHV0ZjE2RW5kKGJ1ZikgewogICAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICIiOwogICAgaWYgKHRoaXMubGFzdE5lZWQpIHsKICAgICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDsKICAgICAgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJ1dGYxNmxlIiwgMCwgZW5kKTsKICAgIH0KICAgIHJldHVybiByOwogIH0KICBmdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaTIpIHsKICAgIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpMikgJSAzOwogICAgaWYgKG4gPT09IDApCiAgICAgIHJldHVybiBidWYudG9TdHJpbmcoImJhc2U2NCIsIGkyKTsKICAgIHRoaXMubGFzdE5lZWQgPSAzIC0gbjsKICAgIHRoaXMubGFzdFRvdGFsID0gMzsKICAgIGlmIChuID09PSAxKSB7CiAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07CiAgICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdOwogICAgfQogICAgcmV0dXJuIGJ1Zi50b1N0cmluZygiYmFzZTY0IiwgaTIsIGJ1Zi5sZW5ndGggLSBuKTsKICB9CiAgZnVuY3Rpb24gYmFzZTY0RW5kKGJ1ZikgewogICAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICIiOwogICAgaWYgKHRoaXMubGFzdE5lZWQpCiAgICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygiYmFzZTY0IiwgMCwgMyAtIHRoaXMubGFzdE5lZWQpOwogICAgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1ZikgewogICAgcmV0dXJuIGJ1Zi50b1N0cmluZyh0aGlzLmVuY29kaW5nKTsKICB9CiAgZnVuY3Rpb24gc2ltcGxlRW5kKGJ1ZikgewogICAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogIiI7CiAgfQogIHZhciBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSA9IGVycm9yc0Jyb3dzZXIuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7CiAgZnVuY3Rpb24gb25jZSQxKGNhbGxiYWNrKSB7CiAgICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIGlmIChjYWxsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBjYWxsZWQgPSB0cnVlOwogICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gbm9vcCQxKCkgewogIH0KICBmdW5jdGlvbiBpc1JlcXVlc3QkMShzdHJlYW0pIHsKICAgIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICJmdW5jdGlvbiI7CiAgfQogIGZ1bmN0aW9uIGVvcyQxKHN0cmVhbSwgb3B0cywgY2FsbGJhY2spIHsKICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gImZ1bmN0aW9uIikKICAgICAgcmV0dXJuIGVvcyQxKHN0cmVhbSwgbnVsbCwgb3B0cyk7CiAgICBpZiAoIW9wdHMpCiAgICAgIG9wdHMgPSB7fTsKICAgIGNhbGxiYWNrID0gb25jZSQxKGNhbGxiYWNrIHx8IG5vb3AkMSk7CiAgICB2YXIgcmVhZGFibGUgPSBvcHRzLnJlYWRhYmxlIHx8IG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZTsKICAgIHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgb3B0cy53cml0YWJsZSAhPT0gZmFsc2UgJiYgc3RyZWFtLndyaXRhYmxlOwogICAgdmFyIG9ubGVnYWN5ZmluaXNoID0gZnVuY3Rpb24gb25sZWdhY3lmaW5pc2gyKCkgewogICAgICBpZiAoIXN0cmVhbS53cml0YWJsZSkKICAgICAgICBvbmZpbmlzaCgpOwogICAgfTsKICAgIHZhciB3cml0YWJsZUVuZGVkID0gc3RyZWFtLl93cml0YWJsZVN0YXRlICYmIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZDsKICAgIHZhciBvbmZpbmlzaCA9IGZ1bmN0aW9uIG9uZmluaXNoMigpIHsKICAgICAgd3JpdGFibGUgPSBmYWxzZTsKICAgICAgd3JpdGFibGVFbmRlZCA9IHRydWU7CiAgICAgIGlmICghcmVhZGFibGUpCiAgICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pOwogICAgfTsKICAgIHZhciByZWFkYWJsZUVuZGVkID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkOwogICAgdmFyIG9uZW5kMiA9IGZ1bmN0aW9uIG9uZW5kMygpIHsKICAgICAgcmVhZGFibGUgPSBmYWxzZTsKICAgICAgcmVhZGFibGVFbmRlZCA9IHRydWU7CiAgICAgIGlmICghd3JpdGFibGUpCiAgICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pOwogICAgfTsKICAgIHZhciBvbmVycm9yID0gZnVuY3Rpb24gb25lcnJvcjIoZXJyMikgewogICAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyMik7CiAgICB9OwogICAgdmFyIG9uY2xvc2UgPSBmdW5jdGlvbiBvbmNsb3NlMigpIHsKICAgICAgdmFyIGVycjI7CiAgICAgIGlmIChyZWFkYWJsZSAmJiAhcmVhZGFibGVFbmRlZCkgewogICAgICAgIGlmICghc3RyZWFtLl9yZWFkYWJsZVN0YXRlIHx8ICFzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kZWQpCiAgICAgICAgICBlcnIyID0gbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCk7CiAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnIyKTsKICAgICAgfQogICAgICBpZiAod3JpdGFibGUgJiYgIXdyaXRhYmxlRW5kZWQpIHsKICAgICAgICBpZiAoIXN0cmVhbS5fd3JpdGFibGVTdGF0ZSB8fCAhc3RyZWFtLl93cml0YWJsZVN0YXRlLmVuZGVkKQogICAgICAgICAgZXJyMiA9IG5ldyBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSgpOwogICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyMik7CiAgICAgIH0KICAgIH07CiAgICB2YXIgb25yZXF1ZXN0ID0gZnVuY3Rpb24gb25yZXF1ZXN0MigpIHsKICAgICAgc3RyZWFtLnJlcS5vbigiZmluaXNoIiwgb25maW5pc2gpOwogICAgfTsKICAgIGlmIChpc1JlcXVlc3QkMShzdHJlYW0pKSB7CiAgICAgIHN0cmVhbS5vbigiY29tcGxldGUiLCBvbmZpbmlzaCk7CiAgICAgIHN0cmVhbS5vbigiYWJvcnQiLCBvbmNsb3NlKTsKICAgICAgaWYgKHN0cmVhbS5yZXEpCiAgICAgICAgb25yZXF1ZXN0KCk7CiAgICAgIGVsc2UKICAgICAgICBzdHJlYW0ub24oInJlcXVlc3QiLCBvbnJlcXVlc3QpOwogICAgfSBlbHNlIGlmICh3cml0YWJsZSAmJiAhc3RyZWFtLl93cml0YWJsZVN0YXRlKSB7CiAgICAgIHN0cmVhbS5vbigiZW5kIiwgb25sZWdhY3lmaW5pc2gpOwogICAgICBzdHJlYW0ub24oImNsb3NlIiwgb25sZWdhY3lmaW5pc2gpOwogICAgfQogICAgc3RyZWFtLm9uKCJlbmQiLCBvbmVuZDIpOwogICAgc3RyZWFtLm9uKCJmaW5pc2giLCBvbmZpbmlzaCk7CiAgICBpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpCiAgICAgIHN0cmVhbS5vbigiZXJyb3IiLCBvbmVycm9yKTsKICAgIHN0cmVhbS5vbigiY2xvc2UiLCBvbmNsb3NlKTsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJjb21wbGV0ZSIsIG9uZmluaXNoKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJhYm9ydCIsIG9uY2xvc2UpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoInJlcXVlc3QiLCBvbnJlcXVlc3QpOwogICAgICBpZiAoc3RyZWFtLnJlcSkKICAgICAgICBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCBvbmZpbmlzaCk7CiAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiZW5kIiwgb25sZWdhY3lmaW5pc2gpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgb25sZWdhY3lmaW5pc2gpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsIG9uZmluaXNoKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlbmQiLCBvbmVuZDIpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgb25lcnJvcik7CiAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLCBvbmNsb3NlKTsKICAgIH07CiAgfQogIHZhciBlbmRPZlN0cmVhbSA9IGVvcyQxOwogIHZhciBfT2JqZWN0JHNldFByb3RvdHlwZU87CiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgewogICAga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsKICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsKICAgIH0gZWxzZSB7CiAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsKICAgIHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gInN5bWJvbCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsKICB9CiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7CiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAib2JqZWN0IiB8fCBpbnB1dCA9PT0gbnVsbCkKICAgICAgcmV0dXJuIGlucHV0OwogICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHByaW0gIT09IHZvaWQgMCkgewogICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmICh0eXBlb2YgcmVzICE9PSAib2JqZWN0IikKICAgICAgICByZXR1cm4gcmVzOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuIChoaW50ID09PSAic3RyaW5nIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOwogIH0KICB2YXIgZmluaXNoZWQgPSBlbmRPZlN0cmVhbTsKICB2YXIga0xhc3RSZXNvbHZlID0gU3ltYm9sKCJsYXN0UmVzb2x2ZSIpOwogIHZhciBrTGFzdFJlamVjdCA9IFN5bWJvbCgibGFzdFJlamVjdCIpOwogIHZhciBrRXJyb3IgPSBTeW1ib2woImVycm9yIik7CiAgdmFyIGtFbmRlZCA9IFN5bWJvbCgiZW5kZWQiKTsKICB2YXIga0xhc3RQcm9taXNlID0gU3ltYm9sKCJsYXN0UHJvbWlzZSIpOwogIHZhciBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgiaGFuZGxlUHJvbWlzZSIpOwogIHZhciBrU3RyZWFtID0gU3ltYm9sKCJzdHJlYW0iKTsKICBmdW5jdGlvbiBjcmVhdGVJdGVyUmVzdWx0KHZhbHVlLCBkb25lMikgewogICAgcmV0dXJuIHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmU6IGRvbmUyCiAgICB9OwogIH0KICBmdW5jdGlvbiByZWFkQW5kUmVzb2x2ZShpdGVyKSB7CiAgICB2YXIgcmVzb2x2ZSA9IGl0ZXJba0xhc3RSZXNvbHZlXTsKICAgIGlmIChyZXNvbHZlICE9PSBudWxsKSB7CiAgICAgIHZhciBkYXRhID0gaXRlcltrU3RyZWFtXS5yZWFkKCk7CiAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgICAgaXRlcltrTGFzdFByb21pc2VdID0gbnVsbDsKICAgICAgICBpdGVyW2tMYXN0UmVzb2x2ZV0gPSBudWxsOwogICAgICAgIGl0ZXJba0xhc3RSZWplY3RdID0gbnVsbDsKICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwgZmFsc2UpKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBvblJlYWRhYmxlKGl0ZXIpIHsKICAgIHByb2Nlc3MubmV4dFRpY2socmVhZEFuZFJlc29sdmUsIGl0ZXIpOwogIH0KICBmdW5jdGlvbiB3cmFwRm9yTmV4dChsYXN0UHJvbWlzZSwgaXRlcikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICBsYXN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChpdGVyW2tFbmRlZF0pIHsKICAgICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsIHRydWUpKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgfSwgcmVqZWN0KTsKICAgIH07CiAgfQogIHZhciBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uKCkgewogIH0pOwogIHZhciBSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YoKF9PYmplY3Qkc2V0UHJvdG90eXBlTyA9IHsKICAgIGdldCBzdHJlYW0oKSB7CiAgICAgIHJldHVybiB0aGlzW2tTdHJlYW1dOwogICAgfSwKICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBlcnJvciA9IHRoaXNba0Vycm9yXTsKICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsKICAgICAgfQogICAgICBpZiAodGhpc1trRW5kZWRdKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KHZvaWQgMCwgdHJ1ZSkpOwogICAgICB9CiAgICAgIGlmICh0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChfdGhpc1trRXJyb3JdKSB7CiAgICAgICAgICAgICAgcmVqZWN0KF90aGlzW2tFcnJvcl0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsIHRydWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdmFyIGxhc3RQcm9taXNlID0gdGhpc1trTGFzdFByb21pc2VdOwogICAgICB2YXIgcHJvbWlzZTsKICAgICAgaWYgKGxhc3RQcm9taXNlKSB7CiAgICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHdyYXBGb3JOZXh0KGxhc3RQcm9taXNlLCB0aGlzKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGRhdGEgPSB0aGlzW2tTdHJlYW1dLnJlYWQoKTsKICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7CiAgICAgICAgfQogICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSh0aGlzW2tIYW5kbGVQcm9taXNlXSk7CiAgICAgIH0KICAgICAgdGhpc1trTGFzdFByb21pc2VdID0gcHJvbWlzZTsKICAgICAgcmV0dXJuIHByb21pc2U7CiAgICB9CiAgfSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgU3ltYm9sLmFzeW5jSXRlcmF0b3IsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JHNldFByb3RvdHlwZU8sICJyZXR1cm4iLCBmdW5jdGlvbiBfcmV0dXJuKCkgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIF90aGlzMltrU3RyZWFtXS5kZXN0cm95KG51bGwsIGZ1bmN0aW9uKGVycjIpIHsKICAgICAgICBpZiAoZXJyMikgewogICAgICAgICAgcmVqZWN0KGVycjIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCB0cnVlKSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSksIF9PYmplY3Qkc2V0UHJvdG90eXBlTyksIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpOwogIHZhciBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IkMSA9IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcjIoc3RyZWFtKSB7CiAgICB2YXIgX09iamVjdCRjcmVhdGU7CiAgICB2YXIgaXRlcmF0b3IgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgKF9PYmplY3QkY3JlYXRlID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga1N0cmVhbSwgewogICAgICB2YWx1ZTogc3RyZWFtLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZXNvbHZlLCB7CiAgICAgIHZhbHVlOiBudWxsLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZWplY3QsIHsKICAgICAgdmFsdWU6IG51bGwsCiAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRXJyb3IsIHsKICAgICAgdmFsdWU6IG51bGwsCiAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRW5kZWQsIHsKICAgICAgdmFsdWU6IHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0hhbmRsZVByb21pc2UsIHsKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciBkYXRhID0gaXRlcmF0b3Jba1N0cmVhbV0ucmVhZCgpOwogICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDsKICAgICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV0gPSBudWxsOwogICAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDsKICAgICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCBmYWxzZSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTsKICAgICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IHJlamVjdDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICB9KSwgX09iamVjdCRjcmVhdGUpKTsKICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsOwogICAgZmluaXNoZWQoc3RyZWFtLCBmdW5jdGlvbihlcnIyKSB7CiAgICAgIGlmIChlcnIyICYmIGVycjIuY29kZSAhPT0gIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFIikgewogICAgICAgIHZhciByZWplY3QgPSBpdGVyYXRvcltrTGFzdFJlamVjdF07CiAgICAgICAgaWYgKHJlamVjdCAhPT0gbnVsbCkgewogICAgICAgICAgaXRlcmF0b3Jba0xhc3RQcm9taXNlXSA9IG51bGw7CiAgICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDsKICAgICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7CiAgICAgICAgICByZWplY3QoZXJyMik7CiAgICAgICAgfQogICAgICAgIGl0ZXJhdG9yW2tFcnJvcl0gPSBlcnIyOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcmVzb2x2ZSA9IGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV07CiAgICAgIGlmIChyZXNvbHZlICE9PSBudWxsKSB7CiAgICAgICAgaXRlcmF0b3Jba0xhc3RQcm9taXNlXSA9IG51bGw7CiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7CiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDsKICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCB0cnVlKSk7CiAgICAgIH0KICAgICAgaXRlcmF0b3Jba0VuZGVkXSA9IHRydWU7CiAgICB9KTsKICAgIHN0cmVhbS5vbigicmVhZGFibGUiLCBvblJlYWRhYmxlLmJpbmQobnVsbCwgaXRlcmF0b3IpKTsKICAgIHJldHVybiBpdGVyYXRvcjsKICB9OwogIHZhciBhc3luY19pdGVyYXRvciA9IGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciQxOwogIHZhciBmcm9tQnJvd3NlciA9IGZ1bmN0aW9uKCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIiKTsKICB9OwogIHZhciBfc3RyZWFtX3JlYWRhYmxlID0gUmVhZGFibGU7CiAgdmFyIER1cGxleCQxOwogIFJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlOwogIGV2ZW50cy5leHBvcnRzLkV2ZW50RW1pdHRlcjsKICB2YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gRUVsaXN0ZW5lckNvdW50MihlbWl0dGVyLCB0eXBlKSB7CiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoOwogIH07CiAgdmFyIFN0cmVhbSQxID0gc3RyZWFtQnJvd3NlcjsKICB2YXIgQnVmZmVyJDIgPSBidWZmZXIuQnVmZmVyOwogIHZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBjb21tb25qc0dsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBjb21tb25qc0dsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHt9KS5VaW50OEFycmF5IHx8IGZ1bmN0aW9uKCkgewogIH07CiAgZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykgewogICAgcmV0dXJuIEJ1ZmZlciQyLmZyb20oY2h1bmspOwogIH0KICBmdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikgewogICAgcmV0dXJuIEJ1ZmZlciQyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTsKICB9CiAgdmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUkJDM7CiAgdmFyIGRlYnVnOwogIGlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7CiAgICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygic3RyZWFtIik7CiAgfSBlbHNlIHsKICAgIGRlYnVnID0gZnVuY3Rpb24gZGVidWcyKCkgewogICAgfTsKICB9CiAgdmFyIEJ1ZmZlckxpc3QgPSBidWZmZXJfbGlzdDsKICB2YXIgZGVzdHJveUltcGwgPSBkZXN0cm95XzE7CiAgdmFyIF9yZXF1aXJlID0gc3RhdGUsIGdldEhpZ2hXYXRlck1hcmsgPSBfcmVxdWlyZS5nZXRIaWdoV2F0ZXJNYXJrOwogIHZhciBfcmVxdWlyZSRjb2RlcyQyID0gZXJyb3JzQnJvd3Nlci5jb2RlcywgRVJSX0lOVkFMSURfQVJHX1RZUEUgPSBfcmVxdWlyZSRjb2RlcyQyLkVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GID0gX3JlcXVpcmUkY29kZXMkMi5FUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLCBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCQxID0gX3JlcXVpcmUkY29kZXMkMi5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCwgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzJDIuRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVDsKICB2YXIgU3RyaW5nRGVjb2RlciQxOwogIHZhciBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3I7CiAgdmFyIGZyb207CiAgaW5oZXJpdHNfYnJvd3Nlci5leHBvcnRzKFJlYWRhYmxlLCBTdHJlYW0kMSk7CiAgdmFyIGVycm9yT3JEZXN0cm95ID0gZGVzdHJveUltcGwuZXJyb3JPckRlc3Ryb3k7CiAgdmFyIGtQcm94eUV2ZW50cyA9IFsiZXJyb3IiLCAiY2xvc2UiLCAiZGVzdHJveSIsICJwYXVzZSIsICJyZXN1bWUiXTsKICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7CiAgICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAiZnVuY3Rpb24iKQogICAgICByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTsKICAgIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKQogICAgICBlbWl0dGVyLm9uKGV2ZW50LCBmbik7CiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKQogICAgICBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pOwogICAgZWxzZQogICAgICBlbWl0dGVyLl9ldmVudHNbZXZlbnRdID0gW2ZuLCBlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTsKICB9CiAgZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7CiAgICBEdXBsZXgkMSA9IER1cGxleCQxIHx8IF9zdHJlYW1fZHVwbGV4OwogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAiYm9vbGVhbiIpCiAgICAgIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4JDE7CiAgICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTsKICAgIGlmIChpc0R1cGxleCkKICAgICAgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7CiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLCBpc0R1cGxleCk7CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBCdWZmZXJMaXN0KCk7CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICB0aGlzLnBpcGVzID0gbnVsbDsKICAgIHRoaXMucGlwZXNDb3VudCA9IDA7CiAgICB0aGlzLmZsb3dpbmcgPSBudWxsOwogICAgdGhpcy5lbmRlZCA9IGZhbHNlOwogICAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7CiAgICB0aGlzLnJlYWRpbmcgPSBmYWxzZTsKICAgIHRoaXMuc3luYyA9IHRydWU7CiAgICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlOwogICAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTsKICAgIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTsKICAgIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7CiAgICB0aGlzLnBhdXNlZCA9IHRydWU7CiAgICB0aGlzLmVtaXRDbG9zZSA9IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZTsKICAgIHRoaXMuYXV0b0Rlc3Ryb3kgPSAhIW9wdGlvbnMuYXV0b0Rlc3Ryb3k7CiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOwogICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAidXRmOCI7CiAgICB0aGlzLmF3YWl0RHJhaW4gPSAwOwogICAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlOwogICAgdGhpcy5kZWNvZGVyID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOwogICAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHsKICAgICAgaWYgKCFTdHJpbmdEZWNvZGVyJDEpCiAgICAgICAgU3RyaW5nRGVjb2RlciQxID0gc3RyaW5nX2RlY29kZXIuU3RyaW5nRGVjb2RlcjsKICAgICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIkMShvcHRpb25zLmVuY29kaW5nKTsKICAgICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7CiAgICB9CiAgfQogIGZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHsKICAgIER1cGxleCQxID0gRHVwbGV4JDEgfHwgX3N0cmVhbV9kdXBsZXg7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKQogICAgICByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpOwogICAgdmFyIGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIER1cGxleCQxOwogICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KTsKICAgIHRoaXMucmVhZGFibGUgPSB0cnVlOwogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDsKICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTsKICAgIH0KICAgIFN0cmVhbSQxLmNhbGwodGhpcyk7CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICJkZXN0cm95ZWQiLCB7CiAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkgewogICAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTsKICAgIH0KICB9KTsKICBSZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7CiAgUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7CiAgUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24oZXJyMiwgY2IpIHsKICAgIGNiKGVycjIpOwogIH07CiAgUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHsKICAgIHZhciBzdGF0ZTIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgdmFyIHNraXBDaHVua0NoZWNrOwogICAgaWYgKCFzdGF0ZTIub2JqZWN0TW9kZSkgewogICAgICBpZiAodHlwZW9mIGNodW5rID09PSAic3RyaW5nIikgewogICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUyLmRlZmF1bHRFbmNvZGluZzsKICAgICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlMi5lbmNvZGluZykgewogICAgICAgICAgY2h1bmsgPSBCdWZmZXIkMi5mcm9tKGNodW5rLCBlbmNvZGluZyk7CiAgICAgICAgICBlbmNvZGluZyA9ICIiOwogICAgICAgIH0KICAgICAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UsIHNraXBDaHVua0NoZWNrKTsKICB9OwogIFJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oY2h1bmspIHsKICAgIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7CiAgfTsKICBmdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykgewogICAgZGVidWcoInJlYWRhYmxlQWRkQ2h1bmsiLCBjaHVuayk7CiAgICB2YXIgc3RhdGUyID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlOwogICAgaWYgKGNodW5rID09PSBudWxsKSB7CiAgICAgIHN0YXRlMi5yZWFkaW5nID0gZmFsc2U7CiAgICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZTIpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGVyOwogICAgICBpZiAoIXNraXBDaHVua0NoZWNrKQogICAgICAgIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlMiwgY2h1bmspOwogICAgICBpZiAoZXIpIHsKICAgICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTsKICAgICAgfSBlbHNlIGlmIChzdGF0ZTIub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gInN0cmluZyIgJiYgIXN0YXRlMi5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlciQyLnByb3RvdHlwZSkgewogICAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHsKICAgICAgICAgIGlmIChzdGF0ZTIuZW5kRW1pdHRlZCkKICAgICAgICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCgpKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZTIsIGNodW5rLCB0cnVlKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMi5lbmRlZCkgewogICAgICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBuZXcgRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRigpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMi5kZXN0cm95ZWQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUyLnJlYWRpbmcgPSBmYWxzZTsKICAgICAgICAgIGlmIChzdGF0ZTIuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHsKICAgICAgICAgICAgY2h1bmsgPSBzdGF0ZTIuZGVjb2Rlci53cml0ZShjaHVuayk7CiAgICAgICAgICAgIGlmIChzdGF0ZTIub2JqZWN0TW9kZSB8fCBjaHVuay5sZW5ndGggIT09IDApCiAgICAgICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZTIsIGNodW5rLCBmYWxzZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFkZENodW5rKHN0cmVhbSwgc3RhdGUyLCBjaHVuaywgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkgewogICAgICAgIHN0YXRlMi5yZWFkaW5nID0gZmFsc2U7CiAgICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlMik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAhc3RhdGUyLmVuZGVkICYmIChzdGF0ZTIubGVuZ3RoIDwgc3RhdGUyLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUyLmxlbmd0aCA9PT0gMCk7CiAgfQogIGZ1bmN0aW9uIGFkZENodW5rKHN0cmVhbSwgc3RhdGUyLCBjaHVuaywgYWRkVG9Gcm9udCkgewogICAgaWYgKHN0YXRlMi5mbG93aW5nICYmIHN0YXRlMi5sZW5ndGggPT09IDAgJiYgIXN0YXRlMi5zeW5jKSB7CiAgICAgIHN0YXRlMi5hd2FpdERyYWluID0gMDsKICAgICAgc3RyZWFtLmVtaXQoImRhdGEiLCBjaHVuayk7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZTIubGVuZ3RoICs9IHN0YXRlMi5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDsKICAgICAgaWYgKGFkZFRvRnJvbnQpCiAgICAgICAgc3RhdGUyLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTsKICAgICAgZWxzZQogICAgICAgIHN0YXRlMi5idWZmZXIucHVzaChjaHVuayk7CiAgICAgIGlmIChzdGF0ZTIubmVlZFJlYWRhYmxlKQogICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pOwogICAgfQogICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlMik7CiAgfQogIGZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZTIsIGNodW5rKSB7CiAgICB2YXIgZXI7CiAgICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gInN0cmluZyIgJiYgY2h1bmsgIT09IHZvaWQgMCAmJiAhc3RhdGUyLm9iamVjdE1vZGUpIHsKICAgICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoImNodW5rIiwgWyJzdHJpbmciLCAiQnVmZmVyIiwgIlVpbnQ4QXJyYXkiXSwgY2h1bmspOwogICAgfQogICAgcmV0dXJuIGVyOwogIH0KICBSZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlOwogIH07CiAgUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7CiAgICBpZiAoIVN0cmluZ0RlY29kZXIkMSkKICAgICAgU3RyaW5nRGVjb2RlciQxID0gc3RyaW5nX2RlY29kZXIuU3RyaW5nRGVjb2RlcjsKICAgIHZhciBkZWNvZGVyMiA9IG5ldyBTdHJpbmdEZWNvZGVyJDEoZW5jKTsKICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IGRlY29kZXIyOwogICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZzsKICAgIHZhciBwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZDsKICAgIHZhciBjb250ZW50ID0gIiI7CiAgICB3aGlsZSAocCAhPT0gbnVsbCkgewogICAgICBjb250ZW50ICs9IGRlY29kZXIyLndyaXRlKHAuZGF0YSk7CiAgICAgIHAgPSBwLm5leHQ7CiAgICB9CiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5jbGVhcigpOwogICAgaWYgKGNvbnRlbnQgIT09ICIiKQogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5wdXNoKGNvbnRlbnQpOwogICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aDsKICAgIHJldHVybiB0aGlzOwogIH07CiAgdmFyIE1BWF9IV00gPSAxMDczNzQxODI0OwogIGZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHsKICAgIGlmIChuID49IE1BWF9IV00pIHsKICAgICAgbiA9IE1BWF9IV007CiAgICB9IGVsc2UgewogICAgICBuLS07CiAgICAgIG4gfD0gbiA+Pj4gMTsKICAgICAgbiB8PSBuID4+PiAyOwogICAgICBuIHw9IG4gPj4+IDQ7CiAgICAgIG4gfD0gbiA+Pj4gODsKICAgICAgbiB8PSBuID4+PiAxNjsKICAgICAgbisrOwogICAgfQogICAgcmV0dXJuIG47CiAgfQogIGZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUyKSB7CiAgICBpZiAobiA8PSAwIHx8IHN0YXRlMi5sZW5ndGggPT09IDAgJiYgc3RhdGUyLmVuZGVkKQogICAgICByZXR1cm4gMDsKICAgIGlmIChzdGF0ZTIub2JqZWN0TW9kZSkKICAgICAgcmV0dXJuIDE7CiAgICBpZiAobiAhPT0gbikgewogICAgICBpZiAoc3RhdGUyLmZsb3dpbmcgJiYgc3RhdGUyLmxlbmd0aCkKICAgICAgICByZXR1cm4gc3RhdGUyLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHN0YXRlMi5sZW5ndGg7CiAgICB9CiAgICBpZiAobiA+IHN0YXRlMi5oaWdoV2F0ZXJNYXJrKQogICAgICBzdGF0ZTIuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pOwogICAgaWYgKG4gPD0gc3RhdGUyLmxlbmd0aCkKICAgICAgcmV0dXJuIG47CiAgICBpZiAoIXN0YXRlMi5lbmRlZCkgewogICAgICBzdGF0ZTIubmVlZFJlYWRhYmxlID0gdHJ1ZTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gc3RhdGUyLmxlbmd0aDsKICB9CiAgUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihuKSB7CiAgICBkZWJ1ZygicmVhZCIsIG4pOwogICAgbiA9IHBhcnNlSW50KG4sIDEwKTsKICAgIHZhciBzdGF0ZTIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgdmFyIG5PcmlnID0gbjsKICAgIGlmIChuICE9PSAwKQogICAgICBzdGF0ZTIuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7CiAgICBpZiAobiA9PT0gMCAmJiBzdGF0ZTIubmVlZFJlYWRhYmxlICYmICgoc3RhdGUyLmhpZ2hXYXRlck1hcmsgIT09IDAgPyBzdGF0ZTIubGVuZ3RoID49IHN0YXRlMi5oaWdoV2F0ZXJNYXJrIDogc3RhdGUyLmxlbmd0aCA+IDApIHx8IHN0YXRlMi5lbmRlZCkpIHsKICAgICAgZGVidWcoInJlYWQ6IGVtaXRSZWFkYWJsZSIsIHN0YXRlMi5sZW5ndGgsIHN0YXRlMi5lbmRlZCk7CiAgICAgIGlmIChzdGF0ZTIubGVuZ3RoID09PSAwICYmIHN0YXRlMi5lbmRlZCkKICAgICAgICBlbmRSZWFkYWJsZSh0aGlzKTsKICAgICAgZWxzZQogICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZTIpOwogICAgaWYgKG4gPT09IDAgJiYgc3RhdGUyLmVuZGVkKSB7CiAgICAgIGlmIChzdGF0ZTIubGVuZ3RoID09PSAwKQogICAgICAgIGVuZFJlYWRhYmxlKHRoaXMpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBkb1JlYWQgPSBzdGF0ZTIubmVlZFJlYWRhYmxlOwogICAgZGVidWcoIm5lZWQgcmVhZGFibGUiLCBkb1JlYWQpOwogICAgaWYgKHN0YXRlMi5sZW5ndGggPT09IDAgfHwgc3RhdGUyLmxlbmd0aCAtIG4gPCBzdGF0ZTIuaGlnaFdhdGVyTWFyaykgewogICAgICBkb1JlYWQgPSB0cnVlOwogICAgICBkZWJ1ZygibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLCBkb1JlYWQpOwogICAgfQogICAgaWYgKHN0YXRlMi5lbmRlZCB8fCBzdGF0ZTIucmVhZGluZykgewogICAgICBkb1JlYWQgPSBmYWxzZTsKICAgICAgZGVidWcoInJlYWRpbmcgb3IgZW5kZWQiLCBkb1JlYWQpOwogICAgfSBlbHNlIGlmIChkb1JlYWQpIHsKICAgICAgZGVidWcoImRvIHJlYWQiKTsKICAgICAgc3RhdGUyLnJlYWRpbmcgPSB0cnVlOwogICAgICBzdGF0ZTIuc3luYyA9IHRydWU7CiAgICAgIGlmIChzdGF0ZTIubGVuZ3RoID09PSAwKQogICAgICAgIHN0YXRlMi5uZWVkUmVhZGFibGUgPSB0cnVlOwogICAgICB0aGlzLl9yZWFkKHN0YXRlMi5oaWdoV2F0ZXJNYXJrKTsKICAgICAgc3RhdGUyLnN5bmMgPSBmYWxzZTsKICAgICAgaWYgKCFzdGF0ZTIucmVhZGluZykKICAgICAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUyKTsKICAgIH0KICAgIHZhciByZXQ7CiAgICBpZiAobiA+IDApCiAgICAgIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlMik7CiAgICBlbHNlCiAgICAgIHJldCA9IG51bGw7CiAgICBpZiAocmV0ID09PSBudWxsKSB7CiAgICAgIHN0YXRlMi5uZWVkUmVhZGFibGUgPSBzdGF0ZTIubGVuZ3RoIDw9IHN0YXRlMi5oaWdoV2F0ZXJNYXJrOwogICAgICBuID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlMi5sZW5ndGggLT0gbjsKICAgICAgc3RhdGUyLmF3YWl0RHJhaW4gPSAwOwogICAgfQogICAgaWYgKHN0YXRlMi5sZW5ndGggPT09IDApIHsKICAgICAgaWYgKCFzdGF0ZTIuZW5kZWQpCiAgICAgICAgc3RhdGUyLm5lZWRSZWFkYWJsZSA9IHRydWU7CiAgICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZTIuZW5kZWQpCiAgICAgICAgZW5kUmVhZGFibGUodGhpcyk7CiAgICB9CiAgICBpZiAocmV0ICE9PSBudWxsKQogICAgICB0aGlzLmVtaXQoImRhdGEiLCByZXQpOwogICAgcmV0dXJuIHJldDsKICB9OwogIGZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZTIpIHsKICAgIGRlYnVnKCJvbkVvZkNodW5rIik7CiAgICBpZiAoc3RhdGUyLmVuZGVkKQogICAgICByZXR1cm47CiAgICBpZiAoc3RhdGUyLmRlY29kZXIpIHsKICAgICAgdmFyIGNodW5rID0gc3RhdGUyLmRlY29kZXIuZW5kKCk7CiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHsKICAgICAgICBzdGF0ZTIuYnVmZmVyLnB1c2goY2h1bmspOwogICAgICAgIHN0YXRlMi5sZW5ndGggKz0gc3RhdGUyLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoOwogICAgICB9CiAgICB9CiAgICBzdGF0ZTIuZW5kZWQgPSB0cnVlOwogICAgaWYgKHN0YXRlMi5zeW5jKSB7CiAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGUyLm5lZWRSZWFkYWJsZSA9IGZhbHNlOwogICAgICBpZiAoIXN0YXRlMi5lbWl0dGVkUmVhZGFibGUpIHsKICAgICAgICBzdGF0ZTIuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTsKICAgICAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkgewogICAgdmFyIHN0YXRlMiA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTsKICAgIGRlYnVnKCJlbWl0UmVhZGFibGUiLCBzdGF0ZTIubmVlZFJlYWRhYmxlLCBzdGF0ZTIuZW1pdHRlZFJlYWRhYmxlKTsKICAgIHN0YXRlMi5uZWVkUmVhZGFibGUgPSBmYWxzZTsKICAgIGlmICghc3RhdGUyLmVtaXR0ZWRSZWFkYWJsZSkgewogICAgICBkZWJ1ZygiZW1pdFJlYWRhYmxlIiwgc3RhdGUyLmZsb3dpbmcpOwogICAgICBzdGF0ZTIuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTsKICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pOwogICAgfQogIH0KICBmdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkgewogICAgdmFyIHN0YXRlMiA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTsKICAgIGRlYnVnKCJlbWl0UmVhZGFibGVfIiwgc3RhdGUyLmRlc3Ryb3llZCwgc3RhdGUyLmxlbmd0aCwgc3RhdGUyLmVuZGVkKTsKICAgIGlmICghc3RhdGUyLmRlc3Ryb3llZCAmJiAoc3RhdGUyLmxlbmd0aCB8fCBzdGF0ZTIuZW5kZWQpKSB7CiAgICAgIHN0cmVhbS5lbWl0KCJyZWFkYWJsZSIpOwogICAgICBzdGF0ZTIuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7CiAgICB9CiAgICBzdGF0ZTIubmVlZFJlYWRhYmxlID0gIXN0YXRlMi5mbG93aW5nICYmICFzdGF0ZTIuZW5kZWQgJiYgc3RhdGUyLmxlbmd0aCA8PSBzdGF0ZTIuaGlnaFdhdGVyTWFyazsKICAgIGZsb3coc3RyZWFtKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlMikgewogICAgaWYgKCFzdGF0ZTIucmVhZGluZ01vcmUpIHsKICAgICAgc3RhdGUyLnJlYWRpbmdNb3JlID0gdHJ1ZTsKICAgICAgcHJvY2Vzcy5uZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZTIpOwogICAgfQogIH0KICBmdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlMikgewogICAgd2hpbGUgKCFzdGF0ZTIucmVhZGluZyAmJiAhc3RhdGUyLmVuZGVkICYmIChzdGF0ZTIubGVuZ3RoIDwgc3RhdGUyLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUyLmZsb3dpbmcgJiYgc3RhdGUyLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgdmFyIGxlbjIgPSBzdGF0ZTIubGVuZ3RoOwogICAgICBkZWJ1ZygibWF5YmVSZWFkTW9yZSByZWFkIDAiKTsKICAgICAgc3RyZWFtLnJlYWQoMCk7CiAgICAgIGlmIChsZW4yID09PSBzdGF0ZTIubGVuZ3RoKQogICAgICAgIGJyZWFrOwogICAgfQogICAgc3RhdGUyLnJlYWRpbmdNb3JlID0gZmFsc2U7CiAgfQogIFJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHsKICAgIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCQxKCJfcmVhZCgpIikpOwogIH07CiAgUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykgewogICAgdmFyIHNyYyA9IHRoaXM7CiAgICB2YXIgc3RhdGUyID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgIHN3aXRjaCAoc3RhdGUyLnBpcGVzQ291bnQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIHN0YXRlMi5waXBlcyA9IGRlc3Q7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBzdGF0ZTIucGlwZXMgPSBbc3RhdGUyLnBpcGVzLCBkZXN0XTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBzdGF0ZTIucGlwZXMucHVzaChkZXN0KTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHN0YXRlMi5waXBlc0NvdW50ICs9IDE7CiAgICBkZWJ1ZygicGlwZSBjb3VudD0lZCBvcHRzPSVqIiwgc3RhdGUyLnBpcGVzQ291bnQsIHBpcGVPcHRzKTsKICAgIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7CiAgICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kMiA6IHVucGlwZTsKICAgIGlmIChzdGF0ZTIuZW5kRW1pdHRlZCkKICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRGbik7CiAgICBlbHNlCiAgICAgIHNyYy5vbmNlKCJlbmQiLCBlbmRGbik7CiAgICBkZXN0Lm9uKCJ1bnBpcGUiLCBvbnVucGlwZSk7CiAgICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykgewogICAgICBkZWJ1Zygib251bnBpcGUiKTsKICAgICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHsKICAgICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7CiAgICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlOwogICAgICAgICAgY2xlYW51cCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gb25lbmQyKCkgewogICAgICBkZWJ1Zygib25lbmQiKTsKICAgICAgZGVzdC5lbmQoKTsKICAgIH0KICAgIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTsKICAgIGRlc3Qub24oImRyYWluIiwgb25kcmFpbik7CiAgICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7CiAgICBmdW5jdGlvbiBjbGVhbnVwKCkgewogICAgICBkZWJ1ZygiY2xlYW51cCIpOwogICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIG9uY2xvc2UpOwogICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCBvbmZpbmlzaCk7CiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoImRyYWluIiwgb25kcmFpbik7CiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgb25lcnJvcik7CiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsIG9udW5waXBlKTsKICAgICAgc3JjLnJlbW92ZUxpc3RlbmVyKCJlbmQiLCBvbmVuZDIpOwogICAgICBzcmMucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHVucGlwZSk7CiAgICAgIHNyYy5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsIG9uZGF0YSk7CiAgICAgIGNsZWFuZWRVcCA9IHRydWU7CiAgICAgIGlmIChzdGF0ZTIuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKQogICAgICAgIG9uZHJhaW4oKTsKICAgIH0KICAgIHNyYy5vbigiZGF0YSIsIG9uZGF0YSk7CiAgICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHsKICAgICAgZGVidWcoIm9uZGF0YSIpOwogICAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7CiAgICAgIGRlYnVnKCJkZXN0LndyaXRlIiwgcmV0KTsKICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHsKICAgICAgICBpZiAoKHN0YXRlMi5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlMi5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZTIucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZTIucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkgewogICAgICAgICAgZGVidWcoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsIHN0YXRlMi5hd2FpdERyYWluKTsKICAgICAgICAgIHN0YXRlMi5hd2FpdERyYWluKys7CiAgICAgICAgfQogICAgICAgIHNyYy5wYXVzZSgpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7CiAgICAgIGRlYnVnKCJvbmVycm9yIiwgZXIpOwogICAgICB1bnBpcGUoKTsKICAgICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLCBvbmVycm9yKTsKICAgICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAiZXJyb3IiKSA9PT0gMCkKICAgICAgICBlcnJvck9yRGVzdHJveShkZXN0LCBlcik7CiAgICB9CiAgICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgImVycm9yIiwgb25lcnJvcik7CiAgICBmdW5jdGlvbiBvbmNsb3NlKCkgewogICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCBvbmZpbmlzaCk7CiAgICAgIHVucGlwZSgpOwogICAgfQogICAgZGVzdC5vbmNlKCJjbG9zZSIsIG9uY2xvc2UpOwogICAgZnVuY3Rpb24gb25maW5pc2goKSB7CiAgICAgIGRlYnVnKCJvbmZpbmlzaCIpOwogICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIG9uY2xvc2UpOwogICAgICB1bnBpcGUoKTsKICAgIH0KICAgIGRlc3Qub25jZSgiZmluaXNoIiwgb25maW5pc2gpOwogICAgZnVuY3Rpb24gdW5waXBlKCkgewogICAgICBkZWJ1ZygidW5waXBlIik7CiAgICAgIHNyYy51bnBpcGUoZGVzdCk7CiAgICB9CiAgICBkZXN0LmVtaXQoInBpcGUiLCBzcmMpOwogICAgaWYgKCFzdGF0ZTIuZmxvd2luZykgewogICAgICBkZWJ1ZygicGlwZSByZXN1bWUiKTsKICAgICAgc3JjLnJlc3VtZSgpOwogICAgfQogICAgcmV0dXJuIGRlc3Q7CiAgfTsKICBmdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHsKICAgIHJldHVybiBmdW5jdGlvbiBwaXBlT25EcmFpbkZ1bmN0aW9uUmVzdWx0KCkgewogICAgICB2YXIgc3RhdGUyID0gc3JjLl9yZWFkYWJsZVN0YXRlOwogICAgICBkZWJ1ZygicGlwZU9uRHJhaW4iLCBzdGF0ZTIuYXdhaXREcmFpbik7CiAgICAgIGlmIChzdGF0ZTIuYXdhaXREcmFpbikKICAgICAgICBzdGF0ZTIuYXdhaXREcmFpbi0tOwogICAgICBpZiAoc3RhdGUyLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgImRhdGEiKSkgewogICAgICAgIHN0YXRlMi5mbG93aW5nID0gdHJ1ZTsKICAgICAgICBmbG93KHNyYyk7CiAgICAgIH0KICAgIH07CiAgfQogIFJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbihkZXN0KSB7CiAgICB2YXIgc3RhdGUyID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgIHZhciB1bnBpcGVJbmZvID0gewogICAgICBoYXNVbnBpcGVkOiBmYWxzZQogICAgfTsKICAgIGlmIChzdGF0ZTIucGlwZXNDb3VudCA9PT0gMCkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBpZiAoc3RhdGUyLnBpcGVzQ291bnQgPT09IDEpIHsKICAgICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUyLnBpcGVzKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICBpZiAoIWRlc3QpCiAgICAgICAgZGVzdCA9IHN0YXRlMi5waXBlczsKICAgICAgc3RhdGUyLnBpcGVzID0gbnVsbDsKICAgICAgc3RhdGUyLnBpcGVzQ291bnQgPSAwOwogICAgICBzdGF0ZTIuZmxvd2luZyA9IGZhbHNlOwogICAgICBpZiAoZGVzdCkKICAgICAgICBkZXN0LmVtaXQoInVucGlwZSIsIHRoaXMsIHVucGlwZUluZm8pOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGlmICghZGVzdCkgewogICAgICB2YXIgZGVzdHMgPSBzdGF0ZTIucGlwZXM7CiAgICAgIHZhciBsZW4yID0gc3RhdGUyLnBpcGVzQ291bnQ7CiAgICAgIHN0YXRlMi5waXBlcyA9IG51bGw7CiAgICAgIHN0YXRlMi5waXBlc0NvdW50ID0gMDsKICAgICAgc3RhdGUyLmZsb3dpbmcgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IGxlbjI7IGkyKyspCiAgICAgICAgZGVzdHNbaTJdLmVtaXQoInVucGlwZSIsIHRoaXMsIHsKICAgICAgICAgIGhhc1VucGlwZWQ6IGZhbHNlCiAgICAgICAgfSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZTIucGlwZXMsIGRlc3QpOwogICAgaWYgKGluZGV4ID09PSAtMSkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBzdGF0ZTIucGlwZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgIHN0YXRlMi5waXBlc0NvdW50IC09IDE7CiAgICBpZiAoc3RhdGUyLnBpcGVzQ291bnQgPT09IDEpCiAgICAgIHN0YXRlMi5waXBlcyA9IHN0YXRlMi5waXBlc1swXTsKICAgIGRlc3QuZW1pdCgidW5waXBlIiwgdGhpcywgdW5waXBlSW5mbyk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIFJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikgewogICAgdmFyIHJlcyA9IFN0cmVhbSQxLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7CiAgICB2YXIgc3RhdGUyID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgIGlmIChldiA9PT0gImRhdGEiKSB7CiAgICAgIHN0YXRlMi5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgicmVhZGFibGUiKSA+IDA7CiAgICAgIGlmIChzdGF0ZTIuZmxvd2luZyAhPT0gZmFsc2UpCiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgIH0gZWxzZSBpZiAoZXYgPT09ICJyZWFkYWJsZSIpIHsKICAgICAgaWYgKCFzdGF0ZTIuZW5kRW1pdHRlZCAmJiAhc3RhdGUyLnJlYWRhYmxlTGlzdGVuaW5nKSB7CiAgICAgICAgc3RhdGUyLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUyLm5lZWRSZWFkYWJsZSA9IHRydWU7CiAgICAgICAgc3RhdGUyLmZsb3dpbmcgPSBmYWxzZTsKICAgICAgICBzdGF0ZTIuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7CiAgICAgICAgZGVidWcoIm9uIHJlYWRhYmxlIiwgc3RhdGUyLmxlbmd0aCwgc3RhdGUyLnJlYWRpbmcpOwogICAgICAgIGlmIChzdGF0ZTIubGVuZ3RoKSB7CiAgICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7CiAgICAgICAgfSBlbHNlIGlmICghc3RhdGUyLnJlYWRpbmcpIHsKICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uOwogIFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2LCBmbikgewogICAgdmFyIHJlcyA9IFN0cmVhbSQxLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbik7CiAgICBpZiAoZXYgPT09ICJyZWFkYWJsZSIpIHsKICAgICAgcHJvY2Vzcy5uZXh0VGljayh1cGRhdGVSZWFkYWJsZUxpc3RlbmluZywgdGhpcyk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgcmVzID0gU3RyZWFtJDEucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKGV2ID09PSAicmVhZGFibGUiIHx8IGV2ID09PSB2b2lkIDApIHsKICAgICAgcHJvY2Vzcy5uZXh0VGljayh1cGRhdGVSZWFkYWJsZUxpc3RlbmluZywgdGhpcyk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZjIpIHsKICAgIHZhciBzdGF0ZTIgPSBzZWxmMi5fcmVhZGFibGVTdGF0ZTsKICAgIHN0YXRlMi5yZWFkYWJsZUxpc3RlbmluZyA9IHNlbGYyLmxpc3RlbmVyQ291bnQoInJlYWRhYmxlIikgPiAwOwogICAgaWYgKHN0YXRlMi5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlMi5wYXVzZWQpIHsKICAgICAgc3RhdGUyLmZsb3dpbmcgPSB0cnVlOwogICAgfSBlbHNlIGlmIChzZWxmMi5saXN0ZW5lckNvdW50KCJkYXRhIikgPiAwKSB7CiAgICAgIHNlbGYyLnJlc3VtZSgpOwogICAgfQogIH0KICBmdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYyKSB7CiAgICBkZWJ1ZygicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIik7CiAgICBzZWxmMi5yZWFkKDApOwogIH0KICBSZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhdGUyID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgIGlmICghc3RhdGUyLmZsb3dpbmcpIHsKICAgICAgZGVidWcoInJlc3VtZSIpOwogICAgICBzdGF0ZTIuZmxvd2luZyA9ICFzdGF0ZTIucmVhZGFibGVMaXN0ZW5pbmc7CiAgICAgIHJlc3VtZSh0aGlzLCBzdGF0ZTIpOwogICAgfQogICAgc3RhdGUyLnBhdXNlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBmdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZTIpIHsKICAgIGlmICghc3RhdGUyLnJlc3VtZVNjaGVkdWxlZCkgewogICAgICBzdGF0ZTIucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlMik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLCBzdGF0ZTIpIHsKICAgIGRlYnVnKCJyZXN1bWUiLCBzdGF0ZTIucmVhZGluZyk7CiAgICBpZiAoIXN0YXRlMi5yZWFkaW5nKSB7CiAgICAgIHN0cmVhbS5yZWFkKDApOwogICAgfQogICAgc3RhdGUyLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlOwogICAgc3RyZWFtLmVtaXQoInJlc3VtZSIpOwogICAgZmxvdyhzdHJlYW0pOwogICAgaWYgKHN0YXRlMi5mbG93aW5nICYmICFzdGF0ZTIucmVhZGluZykKICAgICAgc3RyZWFtLnJlYWQoMCk7CiAgfQogIFJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgZGVidWcoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7CiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgewogICAgICBkZWJ1ZygicGF1c2UiKTsKICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuZW1pdCgicGF1c2UiKTsKICAgIH0KICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkID0gdHJ1ZTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHsKICAgIHZhciBzdGF0ZTIgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7CiAgICBkZWJ1ZygiZmxvdyIsIHN0YXRlMi5mbG93aW5nKTsKICAgIHdoaWxlIChzdGF0ZTIuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKQogICAgICA7CiAgfQogIFJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgdmFyIHN0YXRlMiA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7CiAgICB2YXIgcGF1c2VkID0gZmFsc2U7CiAgICBzdHJlYW0ub24oImVuZCIsIGZ1bmN0aW9uKCkgewogICAgICBkZWJ1Zygid3JhcHBlZCBlbmQiKTsKICAgICAgaWYgKHN0YXRlMi5kZWNvZGVyICYmICFzdGF0ZTIuZW5kZWQpIHsKICAgICAgICB2YXIgY2h1bmsgPSBzdGF0ZTIuZGVjb2Rlci5lbmQoKTsKICAgICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKQogICAgICAgICAgX3RoaXMucHVzaChjaHVuayk7CiAgICAgIH0KICAgICAgX3RoaXMucHVzaChudWxsKTsKICAgIH0pOwogICAgc3RyZWFtLm9uKCJkYXRhIiwgZnVuY3Rpb24oY2h1bmspIHsKICAgICAgZGVidWcoIndyYXBwZWQgZGF0YSIpOwogICAgICBpZiAoc3RhdGUyLmRlY29kZXIpCiAgICAgICAgY2h1bmsgPSBzdGF0ZTIuZGVjb2Rlci53cml0ZShjaHVuayk7CiAgICAgIGlmIChzdGF0ZTIub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHZvaWQgMCkpCiAgICAgICAgcmV0dXJuOwogICAgICBlbHNlIGlmICghc3RhdGUyLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkKICAgICAgICByZXR1cm47CiAgICAgIHZhciByZXQgPSBfdGhpcy5wdXNoKGNodW5rKTsKICAgICAgaWYgKCFyZXQpIHsKICAgICAgICBwYXVzZWQgPSB0cnVlOwogICAgICAgIHN0cmVhbS5wYXVzZSgpOwogICAgICB9CiAgICB9KTsKICAgIGZvciAodmFyIGkyIGluIHN0cmVhbSkgewogICAgICBpZiAodGhpc1tpMl0gPT09IHZvaWQgMCAmJiB0eXBlb2Ygc3RyZWFtW2kyXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHRoaXNbaTJdID0gZnVuY3Rpb24gbWV0aG9kV3JhcChtZXRob2QyKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbWV0aG9kV3JhcFJldHVybkZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZDJdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTsKICAgICAgICAgIH07CiAgICAgICAgfShpMik7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7CiAgICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpOwogICAgfQogICAgdGhpcy5fcmVhZCA9IGZ1bmN0aW9uKG4yKSB7CiAgICAgIGRlYnVnKCJ3cmFwcGVkIF9yZWFkIiwgbjIpOwogICAgICBpZiAocGF1c2VkKSB7CiAgICAgICAgcGF1c2VkID0gZmFsc2U7CiAgICAgICAgc3RyZWFtLnJlc3VtZSgpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIikgewogICAgUmVhZGFibGUucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yID09PSB2b2lkIDApIHsKICAgICAgICBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPSBhc3luY19pdGVyYXRvcjsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHRoaXMpOwogICAgfTsKICB9CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsIHsKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7CiAgICB9CiAgfSk7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgInJlYWRhYmxlQnVmZmVyIiwgewogICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXI7CiAgICB9CiAgfSk7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgInJlYWRhYmxlRmxvd2luZyIsIHsKICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc7CiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiBzZXQoc3RhdGUyKSB7CiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7CiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gc3RhdGUyOwogICAgICB9CiAgICB9CiAgfSk7CiAgUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgInJlYWRhYmxlTGVuZ3RoIiwgewogICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoOwogICAgfQogIH0pOwogIGZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlMikgewogICAgaWYgKHN0YXRlMi5sZW5ndGggPT09IDApCiAgICAgIHJldHVybiBudWxsOwogICAgdmFyIHJldDsKICAgIGlmIChzdGF0ZTIub2JqZWN0TW9kZSkKICAgICAgcmV0ID0gc3RhdGUyLmJ1ZmZlci5zaGlmdCgpOwogICAgZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZTIubGVuZ3RoKSB7CiAgICAgIGlmIChzdGF0ZTIuZGVjb2RlcikKICAgICAgICByZXQgPSBzdGF0ZTIuYnVmZmVyLmpvaW4oIiIpOwogICAgICBlbHNlIGlmIChzdGF0ZTIuYnVmZmVyLmxlbmd0aCA9PT0gMSkKICAgICAgICByZXQgPSBzdGF0ZTIuYnVmZmVyLmZpcnN0KCk7CiAgICAgIGVsc2UKICAgICAgICByZXQgPSBzdGF0ZTIuYnVmZmVyLmNvbmNhdChzdGF0ZTIubGVuZ3RoKTsKICAgICAgc3RhdGUyLmJ1ZmZlci5jbGVhcigpOwogICAgfSBlbHNlIHsKICAgICAgcmV0ID0gc3RhdGUyLmJ1ZmZlci5jb25zdW1lKG4sIHN0YXRlMi5kZWNvZGVyKTsKICAgIH0KICAgIHJldHVybiByZXQ7CiAgfQogIGZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkgewogICAgdmFyIHN0YXRlMiA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTsKICAgIGRlYnVnKCJlbmRSZWFkYWJsZSIsIHN0YXRlMi5lbmRFbWl0dGVkKTsKICAgIGlmICghc3RhdGUyLmVuZEVtaXR0ZWQpIHsKICAgICAgc3RhdGUyLmVuZGVkID0gdHJ1ZTsKICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZTIsIHN0cmVhbSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUyLCBzdHJlYW0pIHsKICAgIGRlYnVnKCJlbmRSZWFkYWJsZU5UIiwgc3RhdGUyLmVuZEVtaXR0ZWQsIHN0YXRlMi5sZW5ndGgpOwogICAgaWYgKCFzdGF0ZTIuZW5kRW1pdHRlZCAmJiBzdGF0ZTIubGVuZ3RoID09PSAwKSB7CiAgICAgIHN0YXRlMi5lbmRFbWl0dGVkID0gdHJ1ZTsKICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7CiAgICAgIHN0cmVhbS5lbWl0KCJlbmQiKTsKICAgICAgaWYgKHN0YXRlMi5hdXRvRGVzdHJveSkgewogICAgICAgIHZhciB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7CiAgICAgICAgaWYgKCF3U3RhdGUgfHwgd1N0YXRlLmF1dG9EZXN0cm95ICYmIHdTdGF0ZS5maW5pc2hlZCkgewogICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIpIHsKICAgIFJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSwgb3B0cykgewogICAgICBpZiAoZnJvbSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZnJvbSA9IGZyb21Ccm93c2VyOwogICAgICB9CiAgICAgIHJldHVybiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7CiAgICBmb3IgKHZhciBpMiA9IDAsIGwgPSB4cy5sZW5ndGg7IGkyIDwgbDsgaTIrKykgewogICAgICBpZiAoeHNbaTJdID09PSB4KQogICAgICAgIHJldHVybiBpMjsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgdmFyIF9zdHJlYW1fdHJhbnNmb3JtID0gVHJhbnNmb3JtJDE7CiAgdmFyIF9yZXF1aXJlJGNvZGVzJDEgPSBlcnJvcnNCcm93c2VyLmNvZGVzLCBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IF9yZXF1aXJlJGNvZGVzJDEuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzJDEuRVJSX01VTFRJUExFX0NBTExCQUNLLCBFUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HID0gX3JlcXVpcmUkY29kZXMkMS5FUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HLCBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAgPSBfcmVxdWlyZSRjb2RlcyQxLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMDsKICB2YXIgRHVwbGV4ID0gX3N0cmVhbV9kdXBsZXg7CiAgaW5oZXJpdHNfYnJvd3Nlci5leHBvcnRzKFRyYW5zZm9ybSQxLCBEdXBsZXgpOwogIGZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKGVyLCBkYXRhKSB7CiAgICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTsKICAgIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlOwogICAgdmFyIGNiID0gdHMud3JpdGVjYjsKICAgIGlmIChjYiA9PT0gbnVsbCkgewogICAgICByZXR1cm4gdGhpcy5lbWl0KCJlcnJvciIsIG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSk7CiAgICB9CiAgICB0cy53cml0ZWNodW5rID0gbnVsbDsKICAgIHRzLndyaXRlY2IgPSBudWxsOwogICAgaWYgKGRhdGEgIT0gbnVsbCkKICAgICAgdGhpcy5wdXNoKGRhdGEpOwogICAgY2IoZXIpOwogICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgIHJzLnJlYWRpbmcgPSBmYWxzZTsKICAgIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgewogICAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspOwogICAgfQogIH0KICBmdW5jdGlvbiBUcmFuc2Zvcm0kMShvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtJDEpKQogICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybSQxKG9wdGlvbnMpOwogICAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7CiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IHsKICAgICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksCiAgICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLAogICAgICB0cmFuc2Zvcm1pbmc6IGZhbHNlLAogICAgICB3cml0ZWNiOiBudWxsLAogICAgICB3cml0ZWNodW5rOiBudWxsLAogICAgICB3cml0ZWVuY29kaW5nOiBudWxsCiAgICB9OwogICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlOwogICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7CiAgICBpZiAob3B0aW9ucykgewogICAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAiZnVuY3Rpb24iKQogICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtOwogICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICJmdW5jdGlvbiIpCiAgICAgICAgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoOwogICAgfQogICAgdGhpcy5vbigicHJlZmluaXNoIiwgcHJlZmluaXNoKTsKICB9CiAgZnVuY3Rpb24gcHJlZmluaXNoKCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICJmdW5jdGlvbiIgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkKSB7CiAgICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uKGVyLCBkYXRhKSB7CiAgICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7CiAgICB9CiAgfQogIFRyYW5zZm9ybSQxLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nKSB7CiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7CiAgICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTsKICB9OwogIFRyYW5zZm9ybSQxLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikgewogICAgY2IobmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCJfdHJhbnNmb3JtKCkiKSk7CiAgfTsKICBUcmFuc2Zvcm0kMS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikgewogICAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7CiAgICB0cy53cml0ZWNiID0gY2I7CiAgICB0cy53cml0ZWNodW5rID0gY2h1bms7CiAgICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7CiAgICBpZiAoIXRzLnRyYW5zZm9ybWluZykgewogICAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykKICAgICAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspOwogICAgfQogIH07CiAgVHJhbnNmb3JtJDEucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikgewogICAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7CiAgICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiAhdHMudHJhbnNmb3JtaW5nKSB7CiAgICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7CiAgICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7CiAgICB9IGVsc2UgewogICAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTsKICAgIH0KICB9OwogIFRyYW5zZm9ybSQxLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uKGVycjIsIGNiKSB7CiAgICBEdXBsZXgucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcywgZXJyMiwgZnVuY3Rpb24oZXJyMjIpIHsKICAgICAgY2IoZXJyMjIpOwogICAgfSk7CiAgfTsKICBmdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHsKICAgIGlmIChlcikKICAgICAgcmV0dXJuIHN0cmVhbS5lbWl0KCJlcnJvciIsIGVyKTsKICAgIGlmIChkYXRhICE9IG51bGwpCiAgICAgIHN0cmVhbS5wdXNoKGRhdGEpOwogICAgaWYgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpCiAgICAgIHRocm93IG5ldyBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAoKTsKICAgIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykKICAgICAgdGhyb3cgbmV3IEVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcoKTsKICAgIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTsKICB9CiAgdmFyIF9zdHJlYW1fcGFzc3Rocm91Z2ggPSBQYXNzVGhyb3VnaDsKICB2YXIgVHJhbnNmb3JtID0gX3N0cmVhbV90cmFuc2Zvcm07CiAgaW5oZXJpdHNfYnJvd3Nlci5leHBvcnRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pOwogIGZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHsKICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpCiAgICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7CiAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTsKICB9CiAgUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7CiAgICBjYihudWxsLCBjaHVuayk7CiAgfTsKICB2YXIgZW9zOwogIGZ1bmN0aW9uIG9uY2UoY2FsbGJhY2spIHsKICAgIHZhciBjYWxsZWQgPSBmYWxzZTsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgaWYgKGNhbGxlZCkKICAgICAgICByZXR1cm47CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTsKICAgIH07CiAgfQogIHZhciBfcmVxdWlyZSRjb2RlcyA9IGVycm9yc0Jyb3dzZXIuY29kZXMsIEVSUl9NSVNTSU5HX0FSR1MgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUlTU0lOR19BUkdTLCBFUlJfU1RSRUFNX0RFU1RST1lFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVEOwogIGZ1bmN0aW9uIG5vb3AoZXJyMikgewogICAgaWYgKGVycjIpCiAgICAgIHRocm93IGVycjI7CiAgfQogIGZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pIHsKICAgIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICJmdW5jdGlvbiI7CiAgfQogIGZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGNhbGxiYWNrKSB7CiAgICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spOwogICAgdmFyIGNsb3NlZCA9IGZhbHNlOwogICAgc3RyZWFtLm9uKCJjbG9zZSIsIGZ1bmN0aW9uKCkgewogICAgICBjbG9zZWQgPSB0cnVlOwogICAgfSk7CiAgICBpZiAoZW9zID09PSB2b2lkIDApCiAgICAgIGVvcyA9IGVuZE9mU3RyZWFtOwogICAgZW9zKHN0cmVhbSwgewogICAgICByZWFkYWJsZTogcmVhZGluZywKICAgICAgd3JpdGFibGU6IHdyaXRpbmcKICAgIH0sIGZ1bmN0aW9uKGVycjIpIHsKICAgICAgaWYgKGVycjIpCiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycjIpOwogICAgICBjbG9zZWQgPSB0cnVlOwogICAgICBjYWxsYmFjaygpOwogICAgfSk7CiAgICB2YXIgZGVzdHJveWVkID0gZmFsc2U7CiAgICByZXR1cm4gZnVuY3Rpb24oZXJyMikgewogICAgICBpZiAoY2xvc2VkKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKGRlc3Ryb3llZCkKICAgICAgICByZXR1cm47CiAgICAgIGRlc3Ryb3llZCA9IHRydWU7CiAgICAgIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkKICAgICAgICByZXR1cm4gc3RyZWFtLmFib3J0KCk7CiAgICAgIGlmICh0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgcmV0dXJuIHN0cmVhbS5kZXN0cm95KCk7CiAgICAgIGNhbGxiYWNrKGVycjIgfHwgbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCJwaXBlIikpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gY2FsbChmbikgewogICAgZm4oKTsKICB9CiAgZnVuY3Rpb24gcGlwZShmcm9tMiwgdG8pIHsKICAgIHJldHVybiBmcm9tMi5waXBlKHRvKTsKICB9CiAgZnVuY3Rpb24gcG9wQ2FsbGJhY2soc3RyZWFtcykgewogICAgaWYgKCFzdHJlYW1zLmxlbmd0aCkKICAgICAgcmV0dXJuIG5vb3A7CiAgICBpZiAodHlwZW9mIHN0cmVhbXNbc3RyZWFtcy5sZW5ndGggLSAxXSAhPT0gImZ1bmN0aW9uIikKICAgICAgcmV0dXJuIG5vb3A7CiAgICByZXR1cm4gc3RyZWFtcy5wb3AoKTsKICB9CiAgZnVuY3Rpb24gcGlwZWxpbmUoKSB7CiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3RyZWFtcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgc3RyZWFtc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgIH0KICAgIHZhciBjYWxsYmFjayA9IHBvcENhbGxiYWNrKHN0cmVhbXMpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoc3RyZWFtc1swXSkpCiAgICAgIHN0cmVhbXMgPSBzdHJlYW1zWzBdOwogICAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikgewogICAgICB0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygic3RyZWFtcyIpOwogICAgfQogICAgdmFyIGVycm9yOwogICAgdmFyIGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24oc3RyZWFtLCBpMikgewogICAgICB2YXIgcmVhZGluZyA9IGkyIDwgc3RyZWFtcy5sZW5ndGggLSAxOwogICAgICB2YXIgd3JpdGluZyA9IGkyID4gMDsKICAgICAgcmV0dXJuIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGZ1bmN0aW9uKGVycjIpIHsKICAgICAgICBpZiAoIWVycm9yKQogICAgICAgICAgZXJyb3IgPSBlcnIyOwogICAgICAgIGlmIChlcnIyKQogICAgICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKTsKICAgICAgICBpZiAocmVhZGluZykKICAgICAgICAgIHJldHVybjsKICAgICAgICBkZXN0cm95cy5mb3JFYWNoKGNhbGwpOwogICAgICAgIGNhbGxiYWNrKGVycm9yKTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKTsKICB9CiAgdmFyIHBpcGVsaW5lXzEgPSBwaXBlbGluZTsKICB2YXIgc3RyZWFtQnJvd3NlcmlmeSA9IFN0cmVhbTsKICB2YXIgRUUgPSBldmVudHMuZXhwb3J0cy5FdmVudEVtaXR0ZXI7CiAgdmFyIGluaGVyaXRzID0gaW5oZXJpdHNfYnJvd3Nlci5leHBvcnRzOwogIGluaGVyaXRzKFN0cmVhbSwgRUUpOwogIFN0cmVhbS5SZWFkYWJsZSA9IF9zdHJlYW1fcmVhZGFibGU7CiAgU3RyZWFtLldyaXRhYmxlID0gX3N0cmVhbV93cml0YWJsZTsKICBTdHJlYW0uRHVwbGV4ID0gX3N0cmVhbV9kdXBsZXg7CiAgU3RyZWFtLlRyYW5zZm9ybSA9IF9zdHJlYW1fdHJhbnNmb3JtOwogIFN0cmVhbS5QYXNzVGhyb3VnaCA9IF9zdHJlYW1fcGFzc3Rocm91Z2g7CiAgU3RyZWFtLmZpbmlzaGVkID0gZW5kT2ZTdHJlYW07CiAgU3RyZWFtLnBpcGVsaW5lID0gcGlwZWxpbmVfMTsKICBTdHJlYW0uU3RyZWFtID0gU3RyZWFtOwogIGZ1bmN0aW9uIFN0cmVhbSgpIHsKICAgIEVFLmNhbGwodGhpcyk7CiAgfQogIFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIG9wdGlvbnMpIHsKICAgIHZhciBzb3VyY2UgPSB0aGlzOwogICAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7CiAgICAgIGlmIChkZXN0LndyaXRhYmxlKSB7CiAgICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHsKICAgICAgICAgIHNvdXJjZS5wYXVzZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc291cmNlLm9uKCJkYXRhIiwgb25kYXRhKTsKICAgIGZ1bmN0aW9uIG9uZHJhaW4oKSB7CiAgICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkgewogICAgICAgIHNvdXJjZS5yZXN1bWUoKTsKICAgICAgfQogICAgfQogICAgZGVzdC5vbigiZHJhaW4iLCBvbmRyYWluKTsKICAgIGlmICghZGVzdC5faXNTdGRpbyAmJiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5lbmQgIT09IGZhbHNlKSkgewogICAgICBzb3VyY2Uub24oImVuZCIsIG9uZW5kMik7CiAgICAgIHNvdXJjZS5vbigiY2xvc2UiLCBvbmNsb3NlKTsKICAgIH0KICAgIHZhciBkaWRPbkVuZCA9IGZhbHNlOwogICAgZnVuY3Rpb24gb25lbmQyKCkgewogICAgICBpZiAoZGlkT25FbmQpCiAgICAgICAgcmV0dXJuOwogICAgICBkaWRPbkVuZCA9IHRydWU7CiAgICAgIGRlc3QuZW5kKCk7CiAgICB9CiAgICBmdW5jdGlvbiBvbmNsb3NlKCkgewogICAgICBpZiAoZGlkT25FbmQpCiAgICAgICAgcmV0dXJuOwogICAgICBkaWRPbkVuZCA9IHRydWU7CiAgICAgIGlmICh0eXBlb2YgZGVzdC5kZXN0cm95ID09PSAiZnVuY3Rpb24iKQogICAgICAgIGRlc3QuZGVzdHJveSgpOwogICAgfQogICAgZnVuY3Rpb24gb25lcnJvcihlcikgewogICAgICBjbGVhbnVwKCk7CiAgICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICJlcnJvciIpID09PSAwKSB7CiAgICAgICAgdGhyb3cgZXI7CiAgICAgIH0KICAgIH0KICAgIHNvdXJjZS5vbigiZXJyb3IiLCBvbmVycm9yKTsKICAgIGRlc3Qub24oImVycm9yIiwgb25lcnJvcik7CiAgICBmdW5jdGlvbiBjbGVhbnVwKCkgewogICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoImRhdGEiLCBvbmRhdGEpOwogICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsIG9uZHJhaW4pOwogICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoImVuZCIsIG9uZW5kMik7CiAgICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLCBvbmNsb3NlKTsKICAgICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIG9uZXJyb3IpOwogICAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIG9uZXJyb3IpOwogICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoImVuZCIsIGNsZWFudXApOwogICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgY2xlYW51cCk7CiAgICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgY2xlYW51cCk7CiAgICB9CiAgICBzb3VyY2Uub24oImVuZCIsIGNsZWFudXApOwogICAgc291cmNlLm9uKCJjbG9zZSIsIGNsZWFudXApOwogICAgZGVzdC5vbigiY2xvc2UiLCBjbGVhbnVwKTsKICAgIGRlc3QuZW1pdCgicGlwZSIsIHNvdXJjZSk7CiAgICByZXR1cm4gZGVzdDsKICB9OwogIHZhciBTdHJpbmdEZWNvZGVyXzE7CiAgdmFyIEJ1ZmZlciQxID0gYnVmZmVyLkJ1ZmZlcjsKICB2YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlciQxLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHsKICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkgewogICAgICBjYXNlICJoZXgiOgogICAgICBjYXNlICJ1dGY4IjoKICAgICAgY2FzZSAidXRmLTgiOgogICAgICBjYXNlICJhc2NpaSI6CiAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgIGNhc2UgInVjczIiOgogICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgIGNhc2UgInJhdyI6CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CiAgZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcpOwogICAgfQogIH0KICB2YXIgU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXJfMSA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7CiAgICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgIiIpOwogICAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpOwogICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7CiAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInVjczIiOgogICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyOwogICAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7CiAgICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIkMSg2KTsKICAgIHRoaXMuY2hhclJlY2VpdmVkID0gMDsKICAgIHRoaXMuY2hhckxlbmd0aCA9IDA7CiAgfTsKICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcjIpIHsKICAgIHZhciBjaGFyU3RyID0gIiI7CiAgICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7CiAgICAgIHZhciBhdmFpbGFibGUgPSBidWZmZXIyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA/IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDogYnVmZmVyMi5sZW5ndGg7CiAgICAgIGJ1ZmZlcjIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpOwogICAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7CiAgICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBidWZmZXIyID0gYnVmZmVyMi5zbGljZShhdmFpbGFibGUsIGJ1ZmZlcjIubGVuZ3RoKTsKICAgICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpOwogICAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTsKICAgICAgaWYgKGNoYXJDb2RlID49IDU1Mjk2ICYmIGNoYXJDb2RlIDw9IDU2MzE5KSB7CiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTsKICAgICAgICBjaGFyU3RyID0gIiI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwOwogICAgICBpZiAoYnVmZmVyMi5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gY2hhclN0cjsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyMik7CiAgICB2YXIgZW5kID0gYnVmZmVyMi5sZW5ndGg7CiAgICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7CiAgICAgIGJ1ZmZlcjIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlcjIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7CiAgICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDsKICAgIH0KICAgIGNoYXJTdHIgKz0gYnVmZmVyMi50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpOwogICAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTsKICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpOwogICAgaWYgKGNoYXJDb2RlID49IDU1Mjk2ICYmIGNoYXJDb2RlIDw9IDU2MzE5KSB7CiAgICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplOwogICAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTsKICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTsKICAgICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTsKICAgICAgYnVmZmVyMi5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7CiAgICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpOwogICAgfQogICAgcmV0dXJuIGNoYXJTdHI7CiAgfTsKICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcjIpIHsKICAgIHZhciBpMiA9IGJ1ZmZlcjIubGVuZ3RoID49IDMgPyAzIDogYnVmZmVyMi5sZW5ndGg7CiAgICBmb3IgKDsgaTIgPiAwOyBpMi0tKSB7CiAgICAgIHZhciBjMiA9IGJ1ZmZlcjJbYnVmZmVyMi5sZW5ndGggLSBpMl07CiAgICAgIGlmIChpMiA9PSAxICYmIGMyID4+IDUgPT0gNikgewogICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGkyIDw9IDIgJiYgYzIgPj4gNCA9PSAxNCkgewogICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGkyIDw9IDMgJiYgYzIgPj4gMyA9PSAzMCkgewogICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY2hhclJlY2VpdmVkID0gaTI7CiAgfTsKICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIyKSB7CiAgICB2YXIgcmVzID0gIiI7CiAgICBpZiAoYnVmZmVyMiAmJiBidWZmZXIyLmxlbmd0aCkKICAgICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIyKTsKICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkgewogICAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDsKICAgICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjsKICAgICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7CiAgICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH07CiAgZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIyKSB7CiAgICByZXR1cm4gYnVmZmVyMi50b1N0cmluZyh0aGlzLmVuY29kaW5nKTsKICB9CiAgZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIyKSB7CiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlcjIubGVuZ3RoICUgMjsKICAgIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7CiAgfQogIGZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcjIpIHsKICAgIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyMi5sZW5ndGggJSAzOwogICAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDsKICB9CiAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nVmFsKSB7CiAgICByZXR1cm4gc3RyaW5nVmFsLnJlcGxhY2UoLyUoWzAtOUEtRmEtZl17Mn0pL2csIChfbWF0Y2gsIHNlcSkgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChzZXEsIDE2KSkpOwogIH0KICBmdW5jdGlvbiBfZXNjYXBlKHJlZ2V4LCBzKSB7CiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UocmVnZXgsIChjaCkgPT4gewogICAgICBjb25zdCBoZXggPSBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZFN0YXJ0KDIsICIwIik7CiAgICAgIHJldHVybiBgJSR7aGV4fWA7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZXNjYXBlKHJhd1ZhbCkgewogICAgcmV0dXJuIF9lc2NhcGUoL1tcbjtcclx0PSUmLFx4MDAtXHgxZlx4N2YtXHhmZl0vZywgcmF3VmFsKTsKICB9CiAgZnVuY3Rpb24gZXNjYXBlQ29sdW1uKHJhd1ZhbCkgewogICAgcmV0dXJuIF9lc2NhcGUoL1tcblxyXHQlXHgwMC1ceDFmXHg3Zi1ceGZmXS9nLCByYXdWYWwpOwogIH0KICBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMoYXR0clN0cmluZykgewogICAgaWYgKCEoYXR0clN0cmluZyAmJiBhdHRyU3RyaW5nLmxlbmd0aCkgfHwgYXR0clN0cmluZyA9PT0gIi4iKQogICAgICByZXR1cm4ge307CiAgICBjb25zdCBhdHRycyA9IHt9OwogICAgYXR0clN0cmluZy5yZXBsYWNlKC9ccj9cbiQvLCAiIikuc3BsaXQoIjsiKS5mb3JFYWNoKChhKSA9PiB7CiAgICAgIGNvbnN0IG52ID0gYS5zcGxpdCgiPSIsIDIpOwogICAgICBpZiAoIShudlsxXSAmJiBudlsxXS5sZW5ndGgpKQogICAgICAgIHJldHVybjsKICAgICAgbnZbMF0gPSBudlswXS50cmltKCk7CiAgICAgIGxldCBhcmVjID0gYXR0cnNbbnZbMF0udHJpbSgpXTsKICAgICAgaWYgKCFhcmVjKSB7CiAgICAgICAgYXJlYyA9IFtdOwogICAgICAgIGF0dHJzW252WzBdXSA9IGFyZWM7CiAgICAgIH0KICAgICAgYXJlYy5wdXNoKC4uLm52WzFdLnNwbGl0KCIsIikubWFwKChzKSA9PiBzLnRyaW0oKSkubWFwKHVuZXNjYXBlKSk7CiAgICB9KTsKICAgIHJldHVybiBhdHRyczsKICB9CiAgZnVuY3Rpb24gcGFyc2VGZWF0dXJlKGxpbmUpIHsKICAgIGNvbnN0IGYgPSBsaW5lLnNwbGl0KCIJIikubWFwKChhKSA9PiBhID09PSAiLiIgfHwgYSA9PT0gIiIgPyBudWxsIDogYSk7CiAgICBjb25zdCBwYXJzZWQgPSB7CiAgICAgIHNlcV9pZDogZlswXSAmJiB1bmVzY2FwZShmWzBdKSwKICAgICAgc291cmNlOiBmWzFdICYmIHVuZXNjYXBlKGZbMV0pLAogICAgICB0eXBlOiBmWzJdICYmIHVuZXNjYXBlKGZbMl0pLAogICAgICBzdGFydDogZlszXSA9PT0gbnVsbCA/IG51bGwgOiBwYXJzZUludChmWzNdLCAxMCksCiAgICAgIGVuZDogZls0XSA9PT0gbnVsbCA/IG51bGwgOiBwYXJzZUludChmWzRdLCAxMCksCiAgICAgIHNjb3JlOiBmWzVdID09PSBudWxsID8gbnVsbCA6IHBhcnNlRmxvYXQoZls1XSksCiAgICAgIHN0cmFuZDogZls2XSwKICAgICAgcGhhc2U6IGZbN10sCiAgICAgIGF0dHJpYnV0ZXM6IGZbOF0gPT09IG51bGwgPyBudWxsIDogcGFyc2VBdHRyaWJ1dGVzKGZbOF0pCiAgICB9OwogICAgcmV0dXJuIHBhcnNlZDsKICB9CiAgZnVuY3Rpb24gcGFyc2VEaXJlY3RpdmUobGluZSkgewogICAgY29uc3QgbWF0Y2ggPSAvXlxzKiMjXHMqKFxTKylccyooLiopLy5leGVjKGxpbmUpOwogICAgaWYgKCFtYXRjaCkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBbLCBuYW1lXSA9IG1hdGNoOwogICAgbGV0IFssICwgY29udGVudHNdID0gbWF0Y2g7CiAgICBjb25zdCBwYXJzZWQgPSB7IGRpcmVjdGl2ZTogbmFtZSB9OwogICAgaWYgKGNvbnRlbnRzLmxlbmd0aCkgewogICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoL1xyP1xuJC8sICIiKTsKICAgICAgcGFyc2VkLnZhbHVlID0gY29udGVudHM7CiAgICB9CiAgICBpZiAobmFtZSA9PT0gInNlcXVlbmNlLXJlZ2lvbiIpIHsKICAgICAgY29uc3QgYzIgPSBjb250ZW50cy5zcGxpdCgvXHMrLywgMyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgLi4ucGFyc2VkLAogICAgICAgIHNlcV9pZDogYzJbMF0sCiAgICAgICAgc3RhcnQ6IGMyWzFdICYmIGMyWzFdLnJlcGxhY2UoL1xEL2csICIiKSwKICAgICAgICBlbmQ6IGMyWzJdICYmIGMyWzJdLnJlcGxhY2UoL1xEL2csICIiKQogICAgICB9OwogICAgfSBlbHNlIGlmIChuYW1lID09PSAiZ2Vub21lLWJ1aWxkIikgewogICAgICBjb25zdCBbc291cmNlLCBidWlsZE5hbWVdID0gY29udGVudHMuc3BsaXQoL1xzKy8sIDIpOwogICAgICByZXR1cm4gewogICAgICAgIC4uLnBhcnNlZCwKICAgICAgICBzb3VyY2UsCiAgICAgICAgYnVpbGROYW1lCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gcGFyc2VkOwogIH0KICBmdW5jdGlvbiBmb3JtYXRBdHRyaWJ1dGVzKGF0dHJzKSB7CiAgICBjb25zdCBhdHRyT3JkZXIgPSBbXTsKICAgIE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbdGFnLCB2YWxdKSA9PiB7CiAgICAgIGlmICghdmFsKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IHZhbHN0cmluZzsKICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eSgidG9TdHJpbmciKSkgewogICAgICAgIHZhbHN0cmluZyA9IGVzY2FwZSh2YWwudG9TdHJpbmcoKSk7CiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgdmFsc3RyaW5nID0gdmFsLm1hcChlc2NhcGUpLmpvaW4oIiwiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWxzdHJpbmcgPSBlc2NhcGUodmFsKTsKICAgICAgfQogICAgICBhdHRyT3JkZXIucHVzaChgJHtlc2NhcGUodGFnKX09JHt2YWxzdHJpbmd9YCk7CiAgICB9KTsKICAgIHJldHVybiBhdHRyT3JkZXIubGVuZ3RoID8gYXR0ck9yZGVyLmpvaW4oIjsiKSA6ICIuIjsKICB9CiAgZnVuY3Rpb24gX2Zvcm1hdFNpbmdsZUZlYXR1cmUoZiwgc2VlbkZlYXR1cmUpIHsKICAgIGNvbnN0IGF0dHJTdHJpbmcgPSBmLmF0dHJpYnV0ZXMgPT09IG51bGwgfHwgZi5hdHRyaWJ1dGVzID09PSB2b2lkIDAgPyAiLiIgOiBmb3JtYXRBdHRyaWJ1dGVzKGYuYXR0cmlidXRlcyk7CiAgICBjb25zdCBmaWVsZHMgPSBbCiAgICAgIGYuc2VxX2lkID09PSBudWxsID8gIi4iIDogZXNjYXBlQ29sdW1uKGYuc2VxX2lkKSwKICAgICAgZi5zb3VyY2UgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi5zb3VyY2UpLAogICAgICBmLnR5cGUgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi50eXBlKSwKICAgICAgZi5zdGFydCA9PT0gbnVsbCA/ICIuIiA6IGVzY2FwZUNvbHVtbihmLnN0YXJ0KSwKICAgICAgZi5lbmQgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi5lbmQpLAogICAgICBmLnNjb3JlID09PSBudWxsID8gIi4iIDogZXNjYXBlQ29sdW1uKGYuc2NvcmUpLAogICAgICBmLnN0cmFuZCA9PT0gbnVsbCA/ICIuIiA6IGVzY2FwZUNvbHVtbihmLnN0cmFuZCksCiAgICAgIGYucGhhc2UgPT09IG51bGwgPyAiLiIgOiBlc2NhcGVDb2x1bW4oZi5waGFzZSksCiAgICAgIGF0dHJTdHJpbmcKICAgIF07CiAgICBjb25zdCBmb3JtYXR0ZWRTdHJpbmcgPSBgJHtmaWVsZHMuam9pbigiCSIpfQpgOwogICAgaWYgKHNlZW5GZWF0dXJlW2Zvcm1hdHRlZFN0cmluZ10pIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgc2VlbkZlYXR1cmVbZm9ybWF0dGVkU3RyaW5nXSA9IHRydWU7CiAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nOwogIH0KICBmdW5jdGlvbiBfZm9ybWF0RmVhdHVyZShmZWF0dXJlLCBzZWVuRmVhdHVyZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZSkpIHsKICAgICAgcmV0dXJuIGZlYXR1cmUubWFwKChmKSA9PiBfZm9ybWF0RmVhdHVyZShmLCBzZWVuRmVhdHVyZSkpLmpvaW4oIiIpOwogICAgfQogICAgY29uc3Qgc3RyaW5nczIgPSBbX2Zvcm1hdFNpbmdsZUZlYXR1cmUoZmVhdHVyZSwgc2VlbkZlYXR1cmUpXTsKICAgIGlmIChfaXNGZWF0dXJlTGluZVdpdGhSZWZzKGZlYXR1cmUpKSB7CiAgICAgIHN0cmluZ3MyLnB1c2goLi4uZmVhdHVyZS5jaGlsZF9mZWF0dXJlcy5tYXAoKGYpID0+IF9mb3JtYXRGZWF0dXJlKGYsIHNlZW5GZWF0dXJlKSksIC4uLmZlYXR1cmUuZGVyaXZlZF9mZWF0dXJlcy5tYXAoKGYpID0+IF9mb3JtYXRGZWF0dXJlKGYsIHNlZW5GZWF0dXJlKSkpOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3MyLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBmb3JtYXRGZWF0dXJlKGZlYXR1cmVPckZlYXR1cmVzKSB7CiAgICBjb25zdCBzZWVuID0ge307CiAgICByZXR1cm4gX2Zvcm1hdEZlYXR1cmUoZmVhdHVyZU9yRmVhdHVyZXMsIHNlZW4pOwogIH0KICBmdW5jdGlvbiBmb3JtYXREaXJlY3RpdmUoZGlyZWN0aXZlKSB7CiAgICBsZXQgc3RyID0gYCMjJHtkaXJlY3RpdmUuZGlyZWN0aXZlfWA7CiAgICBpZiAoZGlyZWN0aXZlLnZhbHVlKQogICAgICBzdHIgKz0gYCAke2RpcmVjdGl2ZS52YWx1ZX1gOwogICAgc3RyICs9ICJcbiI7CiAgICByZXR1cm4gc3RyOwogIH0KICBmdW5jdGlvbiBmb3JtYXRDb21tZW50KGNvbW1lbnQpIHsKICAgIHJldHVybiBgIyAke2NvbW1lbnQuY29tbWVudH0KYDsKICB9CiAgZnVuY3Rpb24gZm9ybWF0U2VxdWVuY2Uoc2VxKSB7CiAgICByZXR1cm4gYD4ke3NlcS5pZH0ke3NlcS5kZXNjcmlwdGlvbiA/IGAgJHtzZXEuZGVzY3JpcHRpb259YCA6ICIifQoke3NlcS5zZXF1ZW5jZX0KYDsKICB9CiAgZnVuY3Rpb24gZm9ybWF0SXRlbShpdGVtT3JJdGVtcykgewogICAgZnVuY3Rpb24gZm9ybWF0U2luZ2xlSXRlbShpdGVtKSB7CiAgICAgIGlmICgiYXR0cmlidXRlcyIgaW4gaXRlbSkKICAgICAgICByZXR1cm4gZm9ybWF0RmVhdHVyZShpdGVtKTsKICAgICAgaWYgKCJkaXJlY3RpdmUiIGluIGl0ZW0pCiAgICAgICAgcmV0dXJuIGZvcm1hdERpcmVjdGl2ZShpdGVtKTsKICAgICAgaWYgKCJzZXF1ZW5jZSIgaW4gaXRlbSkKICAgICAgICByZXR1cm4gZm9ybWF0U2VxdWVuY2UoaXRlbSk7CiAgICAgIGlmICgiY29tbWVudCIgaW4gaXRlbSkKICAgICAgICByZXR1cm4gZm9ybWF0Q29tbWVudChpdGVtKTsKICAgICAgcmV0dXJuICIjIChpbnZhbGlkIGl0ZW0gZm91bmQgZHVyaW5nIGZvcm1hdClcbiI7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtT3JJdGVtcykpIHsKICAgICAgcmV0dXJuIGl0ZW1Pckl0ZW1zLm1hcChmb3JtYXRTaW5nbGVJdGVtKTsKICAgIH0KICAgIHJldHVybiBmb3JtYXRTaW5nbGVJdGVtKGl0ZW1Pckl0ZW1zKTsKICB9CiAgZnVuY3Rpb24gX2lzRmVhdHVyZUxpbmVXaXRoUmVmcyhmZWF0dXJlTGluZSkgewogICAgcmV0dXJuIGZlYXR1cmVMaW5lLmNoaWxkX2ZlYXR1cmVzICE9PSB2b2lkIDAgJiYgZmVhdHVyZUxpbmUuZGVyaXZlZF9mZWF0dXJlcyAhPT0gdm9pZCAwOwogIH0KICB2YXIgdXRpbCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIHVuZXNjYXBlLAogICAgZXNjYXBlLAogICAgZXNjYXBlQ29sdW1uLAogICAgcGFyc2VBdHRyaWJ1dGVzLAogICAgcGFyc2VGZWF0dXJlLAogICAgcGFyc2VEaXJlY3RpdmUsCiAgICBmb3JtYXRBdHRyaWJ1dGVzLAogICAgZm9ybWF0RmVhdHVyZSwKICAgIGZvcm1hdERpcmVjdGl2ZSwKICAgIGZvcm1hdENvbW1lbnQsCiAgICBmb3JtYXRTZXF1ZW5jZSwKICAgIGZvcm1hdEl0ZW0KICB9KTsKICBjb25zdCBjb250YWluZXJBdHRyaWJ1dGVzID0gewogICAgUGFyZW50OiAiY2hpbGRfZmVhdHVyZXMiLAogICAgRGVyaXZlc19mcm9tOiAiZGVyaXZlZF9mZWF0dXJlcyIKICB9OwogIGNsYXNzIEZBU1RBUGFyc2VyIHsKICAgIGNvbnN0cnVjdG9yKHNlcUNhbGxiYWNrKSB7CiAgICAgIHRoaXMuc2VxQ2FsbGJhY2sgPSBzZXFDYWxsYmFjazsKICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB2b2lkIDA7CiAgICB9CiAgICBhZGRMaW5lKGxpbmUpIHsKICAgICAgY29uc3QgZGVmTWF0Y2ggPSAvXj5ccyooXFMrKVxzKiguKikvLmV4ZWMobGluZSk7CiAgICAgIGlmIChkZWZNYXRjaCkgewogICAgICAgIHRoaXMuX2ZsdXNoKCk7CiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB7IGlkOiBkZWZNYXRjaFsxXSwgc2VxdWVuY2U6ICIiIH07CiAgICAgICAgaWYgKGRlZk1hdGNoWzJdKQogICAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UuZGVzY3JpcHRpb24gPSBkZWZNYXRjaFsyXS50cmltKCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2UgJiYgL1xTLy50ZXN0KGxpbmUpKSB7CiAgICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2Uuc2VxdWVuY2UgKz0gbGluZS5yZXBsYWNlKC9ccy9nLCAiIik7CiAgICAgIH0KICAgIH0KICAgIF9mbHVzaCgpIHsKICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlKQogICAgICAgIHRoaXMuc2VxQ2FsbGJhY2sodGhpcy5jdXJyZW50U2VxdWVuY2UpOwogICAgfQogICAgZmluaXNoKCkgewogICAgICB0aGlzLl9mbHVzaCgpOwogICAgfQogIH0KICBjbGFzcyBQYXJzZXIgewogICAgY29uc3RydWN0b3IoYXJncykgewogICAgICB0aGlzLmZhc3RhUGFyc2VyID0gdm9pZCAwOwogICAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgICB0aGlzLmxpbmVOdW1iZXIgPSAwOwogICAgICB0aGlzLl91bmRlckNvbnN0cnVjdGlvblRvcExldmVsID0gW107CiAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZCA9IHt9OwogICAgICB0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzID0ge307CiAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFucyA9IHt9OwogICAgICBjb25zdCBudWxsRnVuYyA9ICgpID0+IHsKICAgICAgfTsKICAgICAgdGhpcy5mZWF0dXJlQ2FsbGJhY2sgPSBhcmdzLmZlYXR1cmVDYWxsYmFjayB8fCBudWxsRnVuYzsKICAgICAgdGhpcy5lbmRDYWxsYmFjayA9IGFyZ3MuZW5kQ2FsbGJhY2sgfHwgbnVsbEZ1bmM7CiAgICAgIHRoaXMuY29tbWVudENhbGxiYWNrID0gYXJncy5jb21tZW50Q2FsbGJhY2sgfHwgbnVsbEZ1bmM7CiAgICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IGFyZ3MuZXJyb3JDYWxsYmFjayB8fCBudWxsRnVuYzsKICAgICAgdGhpcy5kaXJlY3RpdmVDYWxsYmFjayA9IGFyZ3MuZGlyZWN0aXZlQ2FsbGJhY2sgfHwgbnVsbEZ1bmM7CiAgICAgIHRoaXMuc2VxdWVuY2VDYWxsYmFjayA9IGFyZ3Muc2VxdWVuY2VDYWxsYmFjayB8fCBudWxsRnVuYzsKICAgICAgdGhpcy5kaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzID0gYXJncy5kaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzIHx8IGZhbHNlOwogICAgICB0aGlzLmJ1ZmZlclNpemUgPSBhcmdzLmJ1ZmZlclNpemUgPT09IHZvaWQgMCA/IDFlMyA6IGFyZ3MuYnVmZmVyU2l6ZTsKICAgIH0KICAgIGFkZExpbmUobGluZSkgewogICAgICBpZiAodGhpcy5mYXN0YVBhcnNlcikgewogICAgICAgIHRoaXMuZmFzdGFQYXJzZXIuYWRkTGluZShsaW5lKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubGluZU51bWJlciArPSAxOwogICAgICBpZiAoL15ccypbXiNccz5dLy50ZXN0KGxpbmUpKSB7CiAgICAgICAgdGhpcy5fYnVmZmVyTGluZShsaW5lKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbWF0Y2ggPSAvXlxzKigjKykoLiopLy5leGVjKGxpbmUpOwogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICBjb25zdCBbLCBoYXNoc2lnbnNdID0gbWF0Y2g7CiAgICAgICAgbGV0IFssICwgY29udGVudHNdID0gbWF0Y2g7CiAgICAgICAgaWYgKGhhc2hzaWducy5sZW5ndGggPT09IDMpIHsKICAgICAgICAgIHRoaXMuX2VtaXRBbGxVbmRlckNvbnN0cnVjdGlvbkZlYXR1cmVzKCk7CiAgICAgICAgfSBlbHNlIGlmIChoYXNoc2lnbnMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBwYXJzZURpcmVjdGl2ZShsaW5lKTsKICAgICAgICAgIGlmIChkaXJlY3RpdmUpIHsKICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZS5kaXJlY3RpdmUgPT09ICJGQVNUQSIpIHsKICAgICAgICAgICAgICB0aGlzLl9lbWl0QWxsVW5kZXJDb25zdHJ1Y3Rpb25GZWF0dXJlcygpOwogICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICAgICAgICB0aGlzLmZhc3RhUGFyc2VyID0gbmV3IEZBU1RBUGFyc2VyKHRoaXMuc2VxdWVuY2VDYWxsYmFjayk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5fZW1pdEl0ZW0oZGlyZWN0aXZlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoL1xzKi8sICIiKTsKICAgICAgICAgIHRoaXMuX2VtaXRJdGVtKHsgY29tbWVudDogY29udGVudHMgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKC9eXHMqJC8udGVzdChsaW5lKSkKICAgICAgICA7CiAgICAgIGVsc2UgaWYgKC9eXHMqPi8udGVzdChsaW5lKSkgewogICAgICAgIHRoaXMuX2VtaXRBbGxVbmRlckNvbnN0cnVjdGlvbkZlYXR1cmVzKCk7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIHRoaXMuZmFzdGFQYXJzZXIgPSBuZXcgRkFTVEFQYXJzZXIodGhpcy5zZXF1ZW5jZUNhbGxiYWNrKTsKICAgICAgICB0aGlzLmZhc3RhUGFyc2VyLmFkZExpbmUobGluZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZXJyTGluZSA9IGxpbmUucmVwbGFjZSgvXHI/XG4/JC9nLCAiIik7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHRkYzIHBhcnNlIGVycm9yLiAgQ2Fubm90IHBhcnNlICcke2VyckxpbmV9Jy5gKTsKICAgICAgfQogICAgfQogICAgZmluaXNoKCkgewogICAgICB0aGlzLl9lbWl0QWxsVW5kZXJDb25zdHJ1Y3Rpb25GZWF0dXJlcygpOwogICAgICBpZiAodGhpcy5mYXN0YVBhcnNlcikKICAgICAgICB0aGlzLmZhc3RhUGFyc2VyLmZpbmlzaCgpOwogICAgICB0aGlzLmVuZENhbGxiYWNrKCk7CiAgICB9CiAgICBfZW1pdEl0ZW0oaTIpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaTIpKQogICAgICAgIHRoaXMuZmVhdHVyZUNhbGxiYWNrKGkyKTsKICAgICAgZWxzZSBpZiAoImRpcmVjdGl2ZSIgaW4gaTIpCiAgICAgICAgdGhpcy5kaXJlY3RpdmVDYWxsYmFjayhpMik7CiAgICAgIGVsc2UgaWYgKCJjb21tZW50IiBpbiBpMikKICAgICAgICB0aGlzLmNvbW1lbnRDYWxsYmFjayhpMik7CiAgICB9CiAgICBfZW5mb3JjZUJ1ZmZlclNpemVMaW1pdChhZGRpdGlvbmFsSXRlbUNvdW50ID0gMCkgewogICAgICBjb25zdCBfdW5idWZmZXJJdGVtID0gKGl0ZW0pID0+IHsKICAgICAgICBpZiAoaXRlbSAmJiBBcnJheS5pc0FycmF5KGl0ZW0pICYmIGl0ZW1bMF0uYXR0cmlidXRlcyAmJiBpdGVtWzBdLmF0dHJpYnV0ZXMuSUQgJiYgaXRlbVswXS5hdHRyaWJ1dGVzLklEWzBdKSB7CiAgICAgICAgICBjb25zdCBpZHMgPSBpdGVtWzBdLmF0dHJpYnV0ZXMuSUQ7CiAgICAgICAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZFtpZF07CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzW2lkXTsKICAgICAgICAgIH0pOwogICAgICAgICAgaXRlbS5mb3JFYWNoKChpMikgPT4gewogICAgICAgICAgICBpZiAoaTIuY2hpbGRfZmVhdHVyZXMpCiAgICAgICAgICAgICAgaTIuY2hpbGRfZmVhdHVyZXMuZm9yRWFjaCgoYzIpID0+IF91bmJ1ZmZlckl0ZW0oYzIpKTsKICAgICAgICAgICAgaWYgKGkyLmRlcml2ZWRfZmVhdHVyZXMpCiAgICAgICAgICAgICAgaTIuZGVyaXZlZF9mZWF0dXJlcy5mb3JFYWNoKChkKSA9PiBfdW5idWZmZXJJdGVtKGQpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgICAgd2hpbGUgKHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uVG9wTGV2ZWwubGVuZ3RoICsgYWRkaXRpb25hbEl0ZW1Db3VudCA+IHRoaXMuYnVmZmVyU2l6ZSkgewogICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl91bmRlckNvbnN0cnVjdGlvblRvcExldmVsLnNoaWZ0KCk7CiAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgIHRoaXMuX2VtaXRJdGVtKGl0ZW0pOwogICAgICAgICAgX3VuYnVmZmVySXRlbShpdGVtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9lbWl0QWxsVW5kZXJDb25zdHJ1Y3Rpb25GZWF0dXJlcygpIHsKICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25Ub3BMZXZlbC5mb3JFYWNoKHRoaXMuX2VtaXRJdGVtLmJpbmQodGhpcykpOwogICAgICB0aGlzLl91bmRlckNvbnN0cnVjdGlvblRvcExldmVsID0gW107CiAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZCA9IHt9OwogICAgICB0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzID0ge307CiAgICAgIGlmIChBcnJheS5mcm9tKE9iamVjdC52YWx1ZXModGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25PcnBoYW5zKSkubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzb21lIGZlYXR1cmVzIHJlZmVyZW5jZSBvdGhlciBmZWF0dXJlcyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsZSAob3IgaW4gdGhlIHNhbWUgJyMjIycgc2NvcGUpLiAke09iamVjdC5rZXlzKHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFucyl9YCk7CiAgICAgIH0KICAgIH0KICAgIF9idWZmZXJMaW5lKGxpbmUpIHsKICAgICAgdmFyIF9hLCBfYiwgX2M7CiAgICAgIGNvbnN0IHJhd0ZlYXR1cmVMaW5lID0gcGFyc2VGZWF0dXJlKGxpbmUpOwogICAgICBjb25zdCBmZWF0dXJlTGluZSA9IHsKICAgICAgICAuLi5yYXdGZWF0dXJlTGluZSwKICAgICAgICBjaGlsZF9mZWF0dXJlczogW10sCiAgICAgICAgZGVyaXZlZF9mZWF0dXJlczogW10KICAgICAgfTsKICAgICAgY29uc3QgaWRzID0gKChfYSA9IGZlYXR1cmVMaW5lLmF0dHJpYnV0ZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5JRCkgfHwgW107CiAgICAgIGNvbnN0IHBhcmVudHMgPSAoKF9iID0gZmVhdHVyZUxpbmUuYXR0cmlidXRlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLlBhcmVudCkgfHwgW107CiAgICAgIGNvbnN0IGRlcml2ZXMgPSB0aGlzLmRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXMgPyBbXSA6ICgoX2MgPSBmZWF0dXJlTGluZS5hdHRyaWJ1dGVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuRGVyaXZlc19mcm9tKSB8fCBbXTsKICAgICAgaWYgKCFpZHMubGVuZ3RoICYmICFwYXJlbnRzLmxlbmd0aCAmJiAhZGVyaXZlcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9lbWl0SXRlbShbZmVhdHVyZUxpbmVdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGZlYXR1cmUgPSB2b2lkIDA7CiAgICAgIGlkcy5mb3JFYWNoKChpZCkgPT4gewogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25CeUlkW2lkXTsKICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgIGlmIChleGlzdGluZ1tleGlzdGluZy5sZW5ndGggLSAxXS50eXBlICE9PSBmZWF0dXJlTGluZS50eXBlKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcnNlRXJyb3IoYG11bHRpLWxpbmUgZmVhdHVyZSAiJHtpZH0iIGhhcyBpbmNvbnNpc3RlbnQgdHlwZXM6ICIke2ZlYXR1cmVMaW5lLnR5cGV9IiwgIiR7ZXhpc3RpbmdbZXhpc3RpbmcubGVuZ3RoIC0gMV0udHlwZX0iYCk7CiAgICAgICAgICB9CiAgICAgICAgICBleGlzdGluZy5wdXNoKGZlYXR1cmVMaW5lKTsKICAgICAgICAgIGZlYXR1cmUgPSBleGlzdGluZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmVhdHVyZSA9IFtmZWF0dXJlTGluZV07CiAgICAgICAgICB0aGlzLl9lbmZvcmNlQnVmZmVyU2l6ZUxpbWl0KDEpOwogICAgICAgICAgaWYgKCFwYXJlbnRzLmxlbmd0aCAmJiAhZGVyaXZlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25Ub3BMZXZlbC5wdXNoKGZlYXR1cmUpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25CeUlkW2lkXSA9IGZlYXR1cmU7CiAgICAgICAgICB0aGlzLl9yZXNvbHZlUmVmZXJlbmNlc1RvKGZlYXR1cmUsIGlkKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLl9yZXNvbHZlUmVmZXJlbmNlc0Zyb20oZmVhdHVyZSB8fCBbZmVhdHVyZUxpbmVdLCB7IFBhcmVudDogcGFyZW50cywgRGVyaXZlc19mcm9tOiBkZXJpdmVzIH0sIGlkcyk7CiAgICB9CiAgICBfcmVzb2x2ZVJlZmVyZW5jZXNUbyhmZWF0dXJlLCBpZCkgewogICAgICBjb25zdCByZWZlcmVuY2VzID0gdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25PcnBoYW5zW2lkXTsKICAgICAgaWYgKCFyZWZlcmVuY2VzKQogICAgICAgIHJldHVybjsKICAgICAgZmVhdHVyZS5mb3JFYWNoKChsb2MpID0+IHsKICAgICAgICBsb2MuY2hpbGRfZmVhdHVyZXMucHVzaCguLi5yZWZlcmVuY2VzLlBhcmVudCk7CiAgICAgIH0pOwogICAgICBmZWF0dXJlLmZvckVhY2goKGxvYykgPT4gewogICAgICAgIGxvYy5kZXJpdmVkX2ZlYXR1cmVzLnB1c2goLi4ucmVmZXJlbmNlcy5EZXJpdmVzX2Zyb20pOwogICAgICB9KTsKICAgICAgZGVsZXRlIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFuc1tpZF07CiAgICB9CiAgICBfcGFyc2VFcnJvcihtZXNzYWdlKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgdGhpcy5lcnJvckNhbGxiYWNrKGAke3RoaXMubGluZU51bWJlcn06ICR7bWVzc2FnZX1gKTsKICAgIH0KICAgIF9yZXNvbHZlUmVmZXJlbmNlc0Zyb20oZmVhdHVyZSwgcmVmZXJlbmNlcywgaWRzKSB7CiAgICAgIGZ1bmN0aW9uIHBvc3RTZXQob2JqLCBzbG90MSwgc2xvdDIpIHsKICAgICAgICBsZXQgc3ViT2JqID0gb2JqW3Nsb3QxXTsKICAgICAgICBpZiAoIXN1Yk9iaikgewogICAgICAgICAgc3ViT2JqID0ge307CiAgICAgICAgICBvYmpbc2xvdDFdID0gc3ViT2JqOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBzdWJPYmpbc2xvdDJdIHx8IGZhbHNlOwogICAgICAgIHN1Yk9ialtzbG90Ml0gPSB0cnVlOwogICAgICAgIHJldHVybiByZXR1cm5WYWw7CiAgICAgIH0KICAgICAgcmVmZXJlbmNlcy5QYXJlbnQuZm9yRWFjaCgodG9JZCkgPT4gewogICAgICAgIGNvbnN0IG90aGVyRmVhdHVyZSA9IHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uQnlJZFt0b0lkXTsKICAgICAgICBpZiAob3RoZXJGZWF0dXJlKSB7CiAgICAgICAgICBjb25zdCBwbmFtZSA9IGNvbnRhaW5lckF0dHJpYnV0ZXMuUGFyZW50OwogICAgICAgICAgaWYgKCFpZHMuZmlsdGVyKChpZCkgPT4gcG9zdFNldCh0aGlzLl9jb21wbGV0ZWRSZWZlcmVuY2VzLCBpZCwgYFBhcmVudCwke3RvSWR9YCkpLmxlbmd0aCkgewogICAgICAgICAgICBvdGhlckZlYXR1cmUuZm9yRWFjaCgobG9jYXRpb24pID0+IHsKICAgICAgICAgICAgICBsb2NhdGlvbltwbmFtZV0ucHVzaChmZWF0dXJlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCByZWYgPSB0aGlzLl91bmRlckNvbnN0cnVjdGlvbk9ycGhhbnNbdG9JZF07CiAgICAgICAgICBpZiAoIXJlZikgewogICAgICAgICAgICByZWYgPSB7CiAgICAgICAgICAgICAgUGFyZW50OiBbXSwKICAgICAgICAgICAgICBEZXJpdmVzX2Zyb206IFtdCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFuc1t0b0lkXSA9IHJlZjsKICAgICAgICAgIH0KICAgICAgICAgIHJlZi5QYXJlbnQucHVzaChmZWF0dXJlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZWZlcmVuY2VzLkRlcml2ZXNfZnJvbS5mb3JFYWNoKCh0b0lkKSA9PiB7CiAgICAgICAgY29uc3Qgb3RoZXJGZWF0dXJlID0gdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25CeUlkW3RvSWRdOwogICAgICAgIGlmIChvdGhlckZlYXR1cmUpIHsKICAgICAgICAgIGNvbnN0IHBuYW1lID0gY29udGFpbmVyQXR0cmlidXRlcy5EZXJpdmVzX2Zyb207CiAgICAgICAgICBpZiAoIWlkcy5maWx0ZXIoKGlkKSA9PiBwb3N0U2V0KHRoaXMuX2NvbXBsZXRlZFJlZmVyZW5jZXMsIGlkLCBgRGVyaXZlc19mcm9tLCR7dG9JZH1gKSkubGVuZ3RoKSB7CiAgICAgICAgICAgIG90aGVyRmVhdHVyZS5mb3JFYWNoKChsb2NhdGlvbikgPT4gewogICAgICAgICAgICAgIGxvY2F0aW9uW3BuYW1lXS5wdXNoKGZlYXR1cmUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IHJlZiA9IHRoaXMuX3VuZGVyQ29uc3RydWN0aW9uT3JwaGFuc1t0b0lkXTsKICAgICAgICAgIGlmICghcmVmKSB7CiAgICAgICAgICAgIHJlZiA9IHsKICAgICAgICAgICAgICBQYXJlbnQ6IFtdLAogICAgICAgICAgICAgIERlcml2ZXNfZnJvbTogW10KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fdW5kZXJDb25zdHJ1Y3Rpb25PcnBoYW5zW3RvSWRdID0gcmVmOwogICAgICAgICAgfQogICAgICAgICAgcmVmLkRlcml2ZXNfZnJvbS5wdXNoKGZlYXR1cmUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9jYWxsYmFjayhjYWxsYmFjaykgewogICAgaWYgKHByb2Nlc3MgJiYgcHJvY2Vzcy5uZXh0VGljaykKICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7CiAgICBlbHNlCiAgICAgIGNhbGxiYWNrKCk7CiAgfQogIGZ1bmN0aW9uIF9wcm9jZXNzUGFyc2VPcHRpb25zKG9wdGlvbnMpIHsKICAgIGNvbnN0IG91dCA9IHsKICAgICAgZW5jb2Rpbmc6ICJ1dGY4IiwKICAgICAgcGFyc2VGZWF0dXJlczogdHJ1ZSwKICAgICAgcGFyc2VEaXJlY3RpdmVzOiBmYWxzZSwKICAgICAgcGFyc2VTZXF1ZW5jZXM6IHRydWUsCiAgICAgIHBhcnNlQ29tbWVudHM6IGZhbHNlLAogICAgICBidWZmZXJTaXplOiAxZTMsCiAgICAgIGRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXM6IGZhbHNlLAogICAgICAuLi5vcHRpb25zCiAgICB9OwogICAgaWYgKG9wdGlvbnMucGFyc2VBbGwpIHsKICAgICAgb3V0LnBhcnNlRmVhdHVyZXMgPSB0cnVlOwogICAgICBvdXQucGFyc2VEaXJlY3RpdmVzID0gdHJ1ZTsKICAgICAgb3V0LnBhcnNlQ29tbWVudHMgPSB0cnVlOwogICAgICBvdXQucGFyc2VTZXF1ZW5jZXMgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIG91dDsKICB9CiAgY2xhc3MgR0ZGVHJhbnNmb3JtIGV4dGVuZHMgc3RyZWFtQnJvd3NlcmlmeS5UcmFuc2Zvcm0gewogICAgY29uc3RydWN0b3IoaW5wdXRPcHRpb25zID0ge30pIHsKICAgICAgc3VwZXIoeyBvYmplY3RNb2RlOiB0cnVlIH0pOwogICAgICB0aGlzLnRleHRCdWZmZXIgPSAiIjsKICAgICAgY29uc3Qgb3B0aW9ucyA9IF9wcm9jZXNzUGFyc2VPcHRpb25zKGlucHV0T3B0aW9ucyk7CiAgICAgIHRoaXMuZW5jb2RpbmcgPSBpbnB1dE9wdGlvbnMuZW5jb2RpbmcgfHwgInV0ZjgiOwogICAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2Rlcl8xKCk7CiAgICAgIGNvbnN0IHB1c2ggPSB0aGlzLnB1c2guYmluZCh0aGlzKTsKICAgICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyKHsKICAgICAgICBmZWF0dXJlQ2FsbGJhY2s6IG9wdGlvbnMucGFyc2VGZWF0dXJlcyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgICAgZGlyZWN0aXZlQ2FsbGJhY2s6IG9wdGlvbnMucGFyc2VEaXJlY3RpdmVzID8gcHVzaCA6IHZvaWQgMCwKICAgICAgICBjb21tZW50Q2FsbGJhY2s6IG9wdGlvbnMucGFyc2VDb21tZW50cyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgICAgc2VxdWVuY2VDYWxsYmFjazogb3B0aW9ucy5wYXJzZVNlcXVlbmNlcyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgICAgZXJyb3JDYWxsYmFjazogKGVycjIpID0+IHRoaXMuZW1pdCgiZXJyb3IiLCBlcnIyKSwKICAgICAgICBidWZmZXJTaXplOiBvcHRpb25zLmJ1ZmZlclNpemUsCiAgICAgICAgZGlzYWJsZURlcml2ZXNGcm9tUmVmZXJlbmNlczogb3B0aW9ucy5kaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzCiAgICAgIH0pOwogICAgfQogICAgX2FkZExpbmUoZGF0YSkgewogICAgICBpZiAoZGF0YSkgewogICAgICAgIHRoaXMucGFyc2VyLmFkZExpbmUoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIF9uZXh0VGV4dChidWZmZXIyKSB7CiAgICAgIGNvbnN0IHBpZWNlcyA9ICh0aGlzLnRleHRCdWZmZXIgKyBidWZmZXIyKS5zcGxpdCgvXHI/XG4vKTsKICAgICAgdGhpcy50ZXh0QnVmZmVyID0gcGllY2VzLnBvcCgpIHx8ICIiOwogICAgICBwaWVjZXMuZm9yRWFjaCgocGllY2UpID0+IHRoaXMuX2FkZExpbmUocGllY2UpKTsKICAgIH0KICAgIF90cmFuc2Zvcm0oY2h1bmssIF9lbmNvZGluZywgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fbmV4dFRleHQodGhpcy5kZWNvZGVyLndyaXRlKGNodW5rKSk7CiAgICAgIF9jYWxsYmFjayhjYWxsYmFjayk7CiAgICB9CiAgICBfZmx1c2goY2FsbGJhY2spIHsKICAgICAgaWYgKHRoaXMuZGVjb2Rlci5lbmQpCiAgICAgICAgdGhpcy5fbmV4dFRleHQodGhpcy5kZWNvZGVyLmVuZCgpKTsKICAgICAgaWYgKHRoaXMudGV4dEJ1ZmZlciAhPSBudWxsKQogICAgICAgIHRoaXMuX2FkZExpbmUodGhpcy50ZXh0QnVmZmVyKTsKICAgICAgdGhpcy5wYXJzZXIuZmluaXNoKCk7CiAgICAgIF9jYWxsYmFjayhjYWxsYmFjayk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHBhcnNlU3RyZWFtKG9wdGlvbnMgPSB7fSkgewogICAgcmV0dXJuIG5ldyBHRkZUcmFuc2Zvcm0ob3B0aW9ucyk7CiAgfQogIGZ1bmN0aW9uIHBhcnNlU3RyaW5nU3luYyhzdHIsIGlucHV0T3B0aW9ucyA9IHt9KSB7CiAgICBpZiAoIXN0cikKICAgICAgcmV0dXJuIFtdOwogICAgY29uc3Qgb3B0aW9ucyA9IF9wcm9jZXNzUGFyc2VPcHRpb25zKGlucHV0T3B0aW9ucyk7CiAgICBjb25zdCBpdGVtcyA9IFtdOwogICAgY29uc3QgcHVzaCA9IGl0ZW1zLnB1c2guYmluZChpdGVtcyk7CiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHsKICAgICAgZmVhdHVyZUNhbGxiYWNrOiBvcHRpb25zLnBhcnNlRmVhdHVyZXMgPyBwdXNoIDogdm9pZCAwLAogICAgICBkaXJlY3RpdmVDYWxsYmFjazogb3B0aW9ucy5wYXJzZURpcmVjdGl2ZXMgPyBwdXNoIDogdm9pZCAwLAogICAgICBjb21tZW50Q2FsbGJhY2s6IG9wdGlvbnMucGFyc2VDb21tZW50cyA/IHB1c2ggOiB2b2lkIDAsCiAgICAgIHNlcXVlbmNlQ2FsbGJhY2s6IG9wdGlvbnMucGFyc2VTZXF1ZW5jZXMgPyBwdXNoIDogdm9pZCAwLAogICAgICBkaXNhYmxlRGVyaXZlc0Zyb21SZWZlcmVuY2VzOiBvcHRpb25zLmRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXMgfHwgZmFsc2UsCiAgICAgIGJ1ZmZlclNpemU6IEluZmluaXR5LAogICAgICBlcnJvckNhbGxiYWNrOiAoZXJyMikgPT4gewogICAgICAgIHRocm93IGVycjI7CiAgICAgIH0KICAgIH0pOwogICAgc3RyLnNwbGl0KC9ccj9cbi8pLmZvckVhY2gocGFyc2VyLmFkZExpbmUuYmluZChwYXJzZXIpKTsKICAgIHBhcnNlci5maW5pc2goKTsKICAgIHJldHVybiBpdGVtczsKICB9CiAgZnVuY3Rpb24gZm9ybWF0U3luYyhpdGVtcykgewogICAgY29uc3Qgb3RoZXIgPSBbXTsKICAgIGNvbnN0IHNlcXVlbmNlcyA9IFtdOwogICAgaXRlbXMuZm9yRWFjaCgoaTIpID0+IHsKICAgICAgaWYgKCJzZXF1ZW5jZSIgaW4gaTIpCiAgICAgICAgc2VxdWVuY2VzLnB1c2goaTIpOwogICAgICBlbHNlCiAgICAgICAgb3RoZXIucHVzaChpMik7CiAgICB9KTsKICAgIGxldCBzdHIgPSBvdGhlci5tYXAoZm9ybWF0SXRlbSkuam9pbigiIik7CiAgICBpZiAoc2VxdWVuY2VzLmxlbmd0aCkgewogICAgICBzdHIgKz0gIiMjRkFTVEFcbiI7CiAgICAgIHN0ciArPSBzZXF1ZW5jZXMubWFwKGZvcm1hdFNlcXVlbmNlKS5qb2luKCIiKTsKICAgIH0KICAgIHJldHVybiBzdHI7CiAgfQogIGNsYXNzIEZvcm1hdHRpbmdUcmFuc2Zvcm0gZXh0ZW5kcyBzdHJlYW1Ccm93c2VyaWZ5LlRyYW5zZm9ybSB7CiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IG9iamVjdE1vZGU6IHRydWUgfSkpOwogICAgICB0aGlzLmxpbmVzU2luY2VMYXN0U3luY01hcmsgPSAwOwogICAgICB0aGlzLmhhdmVXZUVtaXR0ZWREYXRhID0gZmFsc2U7CiAgICAgIHRoaXMuZmFzdGFNb2RlID0gZmFsc2U7CiAgICAgIHRoaXMubWluTGluZXNCZXR3ZWVuU3luY01hcmtzID0gb3B0aW9ucy5taW5TeW5jTGluZXMgfHwgMTAwOwogICAgICB0aGlzLmluc2VydFZlcnNpb25EaXJlY3RpdmUgPSBvcHRpb25zLmluc2VydFZlcnNpb25EaXJlY3RpdmUgfHwgZmFsc2U7CiAgICB9CiAgICBfdHJhbnNmb3JtKGNodW5rLCBfZW5jb2RpbmcsIGNhbGxiYWNrKSB7CiAgICAgIGxldCBzdHI7CiAgICAgIGlmICghdGhpcy5oYXZlV2VFbWl0dGVkRGF0YSAmJiB0aGlzLmluc2VydFZlcnNpb25EaXJlY3RpdmUpIHsKICAgICAgICBjb25zdCB0aGlzQ2h1bmsgPSBBcnJheS5pc0FycmF5KGNodW5rKSA/IGNodW5rWzBdIDogY2h1bms7CiAgICAgICAgaWYgKCJkaXJlY3RpdmUiIGluIHRoaXNDaHVuaykgewogICAgICAgICAgaWYgKHRoaXNDaHVuay5kaXJlY3RpdmUgIT09ICJnZmYtdmVyc2lvbiIpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCIjI2dmZi12ZXJzaW9uIDNcbiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoInNlcXVlbmNlIiBpbiBjaHVuayAmJiAhdGhpcy5mYXN0YU1vZGUpIHsKICAgICAgICB0aGlzLnB1c2goIiMjRkFTVEFcbiIpOwogICAgICAgIHRoaXMuZmFzdGFNb2RlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoQXJyYXkuaXNBcnJheShjaHVuaykpCiAgICAgICAgc3RyID0gY2h1bmsubWFwKGZvcm1hdEl0ZW0pLmpvaW4oIiIpOwogICAgICBlbHNlCiAgICAgICAgc3RyID0gZm9ybWF0SXRlbShjaHVuayk7CiAgICAgIHRoaXMucHVzaChzdHIpOwogICAgICBpZiAodGhpcy5saW5lc1NpbmNlTGFzdFN5bmNNYXJrID49IHRoaXMubWluTGluZXNCZXR3ZWVuU3luY01hcmtzKSB7CiAgICAgICAgdGhpcy5wdXNoKCIjIyNcbiIpOwogICAgICAgIHRoaXMubGluZXNTaW5jZUxhc3RTeW5jTWFyayA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgc3RyLmxlbmd0aDsgaTIgKz0gMSkgewogICAgICAgICAgaWYgKHN0cltpMl0gPT09ICJcbiIpCiAgICAgICAgICAgIGNvdW50ICs9IDE7CiAgICAgICAgfQogICAgICAgIHRoaXMubGluZXNTaW5jZUxhc3RTeW5jTWFyayArPSBjb3VudDsKICAgICAgfQogICAgICB0aGlzLmhhdmVXZUVtaXR0ZWREYXRhID0gdHJ1ZTsKICAgICAgX2NhbGxiYWNrKGNhbGxiYWNrKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZm9ybWF0U3RyZWFtKG9wdGlvbnMgPSB7fSkgewogICAgcmV0dXJuIG5ldyBGb3JtYXR0aW5nVHJhbnNmb3JtKG9wdGlvbnMpOwogIH0KICBmdW5jdGlvbiBmb3JtYXRGaWxlKHN0cmVhbSwgd3JpdGVTdHJlYW0sIG9wdGlvbnMgPSB7fSkgewogICAgY29uc3QgbmV3T3B0aW9ucyA9IHsKICAgICAgaW5zZXJ0VmVyc2lvbkRpcmVjdGl2ZTogdHJ1ZSwKICAgICAgLi4ub3B0aW9ucwogICAgfTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIHN0cmVhbS5waXBlKG5ldyBGb3JtYXR0aW5nVHJhbnNmb3JtKG5ld09wdGlvbnMpKS5vbigiZW5kIiwgKCkgPT4gcmVzb2x2ZShudWxsKSkub24oImVycm9yIiwgcmVqZWN0KS5waXBlKHdyaXRlU3RyZWFtKTsKICAgIH0pOwogIH0KICB2YXIgR0ZGID0gewogICAgcGFyc2VTdHJlYW0sCiAgICBwYXJzZVN0cmluZ1N5bmMsCiAgICBmb3JtYXRTeW5jLAogICAgZm9ybWF0U3RyZWFtLAogICAgZm9ybWF0RmlsZSwKICAgIHV0aWwKICB9OwogIHZhciB3b3JrZXIgPSB7fTsKICB2YXIgaXNPYnNlcnZhYmxlID0gKHZhbHVlKSA9PiB7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0eXBlb2YgU3ltYm9sLm9ic2VydmFibGUgPT09ICJzeW1ib2wiICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wub2JzZXJ2YWJsZV0gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVtTeW1ib2wub2JzZXJ2YWJsZV0oKTsKICAgIH0KICAgIGlmICh0eXBlb2YgdmFsdWVbIkBAb2JzZXJ2YWJsZSJdID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVbIkBAb2JzZXJ2YWJsZSJdKCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKICB2YXIgY29tbW9uID0ge307CiAgdmFyIHNlcmlhbGl6ZXJzID0ge307CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZXJzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgc2VyaWFsaXplcnMuRGVmYXVsdFNlcmlhbGl6ZXIgPSBzZXJpYWxpemVycy5leHRlbmRTZXJpYWxpemVyID0gdm9pZCAwOwogIGZ1bmN0aW9uIGV4dGVuZFNlcmlhbGl6ZXIoZXh0ZW5kLCBpbXBsZW1lbnRhdGlvbikgewogICAgY29uc3QgZmFsbGJhY2tEZXNlcmlhbGl6ZXIgPSBleHRlbmQuZGVzZXJpYWxpemUuYmluZChleHRlbmQpOwogICAgY29uc3QgZmFsbGJhY2tTZXJpYWxpemVyID0gZXh0ZW5kLnNlcmlhbGl6ZS5iaW5kKGV4dGVuZCk7CiAgICByZXR1cm4gewogICAgICBkZXNlcmlhbGl6ZShtZXNzYWdlKSB7CiAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uLmRlc2VyaWFsaXplKG1lc3NhZ2UsIGZhbGxiYWNrRGVzZXJpYWxpemVyKTsKICAgICAgfSwKICAgICAgc2VyaWFsaXplKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uLnNlcmlhbGl6ZShpbnB1dCwgZmFsbGJhY2tTZXJpYWxpemVyKTsKICAgICAgfQogICAgfTsKICB9CiAgc2VyaWFsaXplcnMuZXh0ZW5kU2VyaWFsaXplciA9IGV4dGVuZFNlcmlhbGl6ZXI7CiAgY29uc3QgRGVmYXVsdEVycm9yU2VyaWFsaXplciA9IHsKICAgIGRlc2VyaWFsaXplKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IobWVzc2FnZS5tZXNzYWdlKSwgewogICAgICAgIG5hbWU6IG1lc3NhZ2UubmFtZSwKICAgICAgICBzdGFjazogbWVzc2FnZS5zdGFjawogICAgICB9KTsKICAgIH0sCiAgICBzZXJpYWxpemUoZXJyb3IpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBfX2Vycm9yX21hcmtlcjogIiQkZXJyb3IiLAogICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsCiAgICAgICAgbmFtZTogZXJyb3IubmFtZSwKICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2sKICAgICAgfTsKICAgIH0KICB9OwogIGNvbnN0IGlzU2VyaWFsaXplZEVycm9yID0gKHRoaW5nKSA9PiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiICYmICJfX2Vycm9yX21hcmtlciIgaW4gdGhpbmcgJiYgdGhpbmcuX19lcnJvcl9tYXJrZXIgPT09ICIkJGVycm9yIjsKICBzZXJpYWxpemVycy5EZWZhdWx0U2VyaWFsaXplciA9IHsKICAgIGRlc2VyaWFsaXplKG1lc3NhZ2UpIHsKICAgICAgaWYgKGlzU2VyaWFsaXplZEVycm9yKG1lc3NhZ2UpKSB7CiAgICAgICAgcmV0dXJuIERlZmF1bHRFcnJvclNlcmlhbGl6ZXIuZGVzZXJpYWxpemUobWVzc2FnZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICAgIH0KICAgIH0sCiAgICBzZXJpYWxpemUoaW5wdXQpIHsKICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICByZXR1cm4gRGVmYXVsdEVycm9yU2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgfQogICAgfQogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1vbiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIGNvbW1vbi5zZXJpYWxpemUgPSBjb21tb24uZGVzZXJpYWxpemUgPSBjb21tb24ucmVnaXN0ZXJTZXJpYWxpemVyID0gdm9pZCAwOwogIGNvbnN0IHNlcmlhbGl6ZXJzXzEgPSBzZXJpYWxpemVyczsKICBsZXQgcmVnaXN0ZXJlZFNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc18xLkRlZmF1bHRTZXJpYWxpemVyOwogIGZ1bmN0aW9uIHJlZ2lzdGVyU2VyaWFsaXplcihzZXJpYWxpemVyKSB7CiAgICByZWdpc3RlcmVkU2VyaWFsaXplciA9IHNlcmlhbGl6ZXJzXzEuZXh0ZW5kU2VyaWFsaXplcihyZWdpc3RlcmVkU2VyaWFsaXplciwgc2VyaWFsaXplcik7CiAgfQogIGNvbW1vbi5yZWdpc3RlclNlcmlhbGl6ZXIgPSByZWdpc3RlclNlcmlhbGl6ZXI7CiAgZnVuY3Rpb24gZGVzZXJpYWxpemUobWVzc2FnZSkgewogICAgcmV0dXJuIHJlZ2lzdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplKG1lc3NhZ2UpOwogIH0KICBjb21tb24uZGVzZXJpYWxpemUgPSBkZXNlcmlhbGl6ZTsKICBmdW5jdGlvbiBzZXJpYWxpemUoaW5wdXQpIHsKICAgIHJldHVybiByZWdpc3RlcmVkU2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQpOwogIH0KICBjb21tb24uc2VyaWFsaXplID0gc2VyaWFsaXplOwogIHZhciB0cmFuc2ZlcmFibGUgPSB7fTsKICB2YXIgc3ltYm9scyA9IHt9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzeW1ib2xzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgc3ltYm9scy4kd29ya2VyID0gc3ltYm9scy4kdHJhbnNmZXJhYmxlID0gc3ltYm9scy4kdGVybWluYXRlID0gc3ltYm9scy4kZXZlbnRzID0gc3ltYm9scy4kZXJyb3JzID0gdm9pZCAwOwogIHN5bWJvbHMuJGVycm9ycyA9IFN5bWJvbCgidGhyZWFkLmVycm9ycyIpOwogIHN5bWJvbHMuJGV2ZW50cyA9IFN5bWJvbCgidGhyZWFkLmV2ZW50cyIpOwogIHN5bWJvbHMuJHRlcm1pbmF0ZSA9IFN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpOwogIHN5bWJvbHMuJHRyYW5zZmVyYWJsZSA9IFN5bWJvbCgidGhyZWFkLnRyYW5zZmVyYWJsZSIpOwogIHN5bWJvbHMuJHdvcmtlciA9IFN5bWJvbCgidGhyZWFkLndvcmtlciIpOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFuc2ZlcmFibGUsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICB0cmFuc2ZlcmFibGUuVHJhbnNmZXIgPSB0cmFuc2ZlcmFibGUuaXNUcmFuc2ZlckRlc2NyaXB0b3IgPSB2b2lkIDA7CiAgY29uc3Qgc3ltYm9sc18xID0gc3ltYm9sczsKICBmdW5jdGlvbiBpc1RyYW5zZmVyYWJsZSh0aGluZykgewogICAgaWYgKCF0aGluZyB8fCB0eXBlb2YgdGhpbmcgIT09ICJvYmplY3QiKQogICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gaXNUcmFuc2ZlckRlc2NyaXB0b3IodGhpbmcpIHsKICAgIHJldHVybiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiICYmIHRoaW5nW3N5bWJvbHNfMS4kdHJhbnNmZXJhYmxlXTsKICB9CiAgdHJhbnNmZXJhYmxlLmlzVHJhbnNmZXJEZXNjcmlwdG9yID0gaXNUcmFuc2ZlckRlc2NyaXB0b3I7CiAgZnVuY3Rpb24gVHJhbnNmZXIkMShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKSB7CiAgICBpZiAoIXRyYW5zZmVyYWJsZXMpIHsKICAgICAgaWYgKCFpc1RyYW5zZmVyYWJsZShwYXlsb2FkKSkKICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICB0cmFuc2ZlcmFibGVzID0gW3BheWxvYWRdOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgW3N5bWJvbHNfMS4kdHJhbnNmZXJhYmxlXTogdHJ1ZSwKICAgICAgc2VuZDogcGF5bG9hZCwKICAgICAgdHJhbnNmZXJhYmxlcwogICAgfTsKICB9CiAgdHJhbnNmZXJhYmxlLlRyYW5zZmVyID0gVHJhbnNmZXIkMTsKICB2YXIgbWVzc2FnZXMgPSB7fTsKICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0czIuV29ya2VyTWVzc2FnZVR5cGUgPSBleHBvcnRzMi5NYXN0ZXJNZXNzYWdlVHlwZSA9IHZvaWQgMDsKICAgIChmdW5jdGlvbihNYXN0ZXJNZXNzYWdlVHlwZSkgewogICAgICBNYXN0ZXJNZXNzYWdlVHlwZVsiY2FuY2VsIl0gPSAiY2FuY2VsIjsKICAgICAgTWFzdGVyTWVzc2FnZVR5cGVbInJ1biJdID0gInJ1biI7CiAgICB9KShleHBvcnRzMi5NYXN0ZXJNZXNzYWdlVHlwZSB8fCAoZXhwb3J0czIuTWFzdGVyTWVzc2FnZVR5cGUgPSB7fSkpOwogICAgKGZ1bmN0aW9uKFdvcmtlck1lc3NhZ2VUeXBlKSB7CiAgICAgIFdvcmtlck1lc3NhZ2VUeXBlWyJlcnJvciJdID0gImVycm9yIjsKICAgICAgV29ya2VyTWVzc2FnZVR5cGVbImluaXQiXSA9ICJpbml0IjsKICAgICAgV29ya2VyTWVzc2FnZVR5cGVbInJlc3VsdCJdID0gInJlc3VsdCI7CiAgICAgIFdvcmtlck1lc3NhZ2VUeXBlWyJydW5uaW5nIl0gPSAicnVubmluZyI7CiAgICAgIFdvcmtlck1lc3NhZ2VUeXBlWyJ1bmNhdWdodEVycm9yIl0gPSAidW5jYXVnaHRFcnJvciI7CiAgICB9KShleHBvcnRzMi5Xb3JrZXJNZXNzYWdlVHlwZSB8fCAoZXhwb3J0czIuV29ya2VyTWVzc2FnZVR5cGUgPSB7fSkpOwogIH0pKG1lc3NhZ2VzKTsKICB2YXIgaW1wbGVtZW50YXRpb25fYnJvd3NlciA9IHt9OwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBsZW1lbnRhdGlvbl9icm93c2VyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgY29uc3QgaXNXb3JrZXJSdW50aW1lID0gZnVuY3Rpb24gaXNXb3JrZXJSdW50aW1lMigpIHsKICAgIGNvbnN0IGlzV2luZG93Q29udGV4dCA9IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgV2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmIGluc3RhbmNlb2YgV2luZG93OwogICAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiBzZWxmLnBvc3RNZXNzYWdlICYmICFpc1dpbmRvd0NvbnRleHQgPyB0cnVlIDogZmFsc2U7CiAgfTsKICBjb25zdCBwb3N0TWVzc2FnZVRvTWFzdGVyID0gZnVuY3Rpb24gcG9zdE1lc3NhZ2VUb01hc3RlcjIoZGF0YSwgdHJhbnNmZXJMaXN0KSB7CiAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEsIHRyYW5zZmVyTGlzdCk7CiAgfTsKICBjb25zdCBzdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzID0gZnVuY3Rpb24gc3Vic2NyaWJlVG9NYXN0ZXJNZXNzYWdlczIob25NZXNzYWdlKSB7CiAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IChtZXNzYWdlRXZlbnQpID0+IHsKICAgICAgb25NZXNzYWdlKG1lc3NhZ2VFdmVudC5kYXRhKTsKICAgIH07CiAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHsKICAgICAgc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgbWVzc2FnZUhhbmRsZXIpOwogICAgfTsKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIG1lc3NhZ2VIYW5kbGVyKTsKICAgIHJldHVybiB1bnN1YnNjcmliZTsKICB9OwogIGltcGxlbWVudGF0aW9uX2Jyb3dzZXIuZGVmYXVsdCA9IHsKICAgIGlzV29ya2VyUnVudGltZSwKICAgIHBvc3RNZXNzYWdlVG9NYXN0ZXIsCiAgICBzdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzCiAgfTsKICAoZnVuY3Rpb24oZXhwb3J0czIpIHsKICAgIHZhciBfX2F3YWl0ZXIgPSBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24odGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgewogICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7CiAgICAgICAgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIF9faW1wb3J0RGVmYXVsdDIgPSBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2ltcG9ydERlZmF1bHQgfHwgZnVuY3Rpb24obW9kKSB7CiAgICAgIHJldHVybiBtb2QgJiYgbW9kLl9fZXNNb2R1bGUgPyBtb2QgOiB7ICJkZWZhdWx0IjogbW9kIH07CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzMi5leHBvc2UgPSBleHBvcnRzMi5pc1dvcmtlclJ1bnRpbWUgPSBleHBvcnRzMi5UcmFuc2ZlciA9IGV4cG9ydHMyLnJlZ2lzdGVyU2VyaWFsaXplciA9IHZvaWQgMDsKICAgIGNvbnN0IGlzX29ic2VydmFibGVfMSA9IF9faW1wb3J0RGVmYXVsdDIoaXNPYnNlcnZhYmxlKTsKICAgIGNvbnN0IGNvbW1vbl8xID0gY29tbW9uOwogICAgY29uc3QgdHJhbnNmZXJhYmxlXzEgPSB0cmFuc2ZlcmFibGU7CiAgICBjb25zdCBtZXNzYWdlc18xID0gbWVzc2FnZXM7CiAgICBjb25zdCBpbXBsZW1lbnRhdGlvbl8xID0gX19pbXBvcnREZWZhdWx0MihpbXBsZW1lbnRhdGlvbl9icm93c2VyKTsKICAgIHZhciBjb21tb25fMiA9IGNvbW1vbjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzMiwgInJlZ2lzdGVyU2VyaWFsaXplciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbW1vbl8yLnJlZ2lzdGVyU2VyaWFsaXplcjsKICAgIH0gfSk7CiAgICB2YXIgdHJhbnNmZXJhYmxlXzIgPSB0cmFuc2ZlcmFibGU7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0czIsICJUcmFuc2ZlciIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRyYW5zZmVyYWJsZV8yLlRyYW5zZmVyOwogICAgfSB9KTsKICAgIGV4cG9ydHMyLmlzV29ya2VyUnVudGltZSA9IGltcGxlbWVudGF0aW9uXzEuZGVmYXVsdC5pc1dvcmtlclJ1bnRpbWU7CiAgICBsZXQgZXhwb3NlQ2FsbGVkID0gZmFsc2U7CiAgICBjb25zdCBhY3RpdmVTdWJzY3JpcHRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGNvbnN0IGlzTWFzdGVySm9iQ2FuY2VsTWVzc2FnZSA9ICh0aGluZykgPT4gdGhpbmcgJiYgdGhpbmcudHlwZSA9PT0gbWVzc2FnZXNfMS5NYXN0ZXJNZXNzYWdlVHlwZS5jYW5jZWw7CiAgICBjb25zdCBpc01hc3RlckpvYlJ1bk1lc3NhZ2UgPSAodGhpbmcpID0+IHRoaW5nICYmIHRoaW5nLnR5cGUgPT09IG1lc3NhZ2VzXzEuTWFzdGVyTWVzc2FnZVR5cGUucnVuOwogICAgY29uc3QgaXNPYnNlcnZhYmxlJDEgPSAodGhpbmcpID0+IGlzX29ic2VydmFibGVfMS5kZWZhdWx0KHRoaW5nKSB8fCBpc1plbk9ic2VydmFibGUodGhpbmcpOwogICAgZnVuY3Rpb24gaXNaZW5PYnNlcnZhYmxlKHRoaW5nKSB7CiAgICAgIHJldHVybiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiICYmIHR5cGVvZiB0aGluZy5zdWJzY3JpYmUgPT09ICJmdW5jdGlvbiI7CiAgICB9CiAgICBmdW5jdGlvbiBkZWNvbnN0cnVjdFRyYW5zZmVyKHRoaW5nKSB7CiAgICAgIHJldHVybiB0cmFuc2ZlcmFibGVfMS5pc1RyYW5zZmVyRGVzY3JpcHRvcih0aGluZykgPyB7IHBheWxvYWQ6IHRoaW5nLnNlbmQsIHRyYW5zZmVyYWJsZXM6IHRoaW5nLnRyYW5zZmVyYWJsZXMgfSA6IHsgcGF5bG9hZDogdGhpbmcsIHRyYW5zZmVyYWJsZXM6IHZvaWQgMCB9OwogICAgfQogICAgZnVuY3Rpb24gcG9zdEZ1bmN0aW9uSW5pdE1lc3NhZ2UoKSB7CiAgICAgIGNvbnN0IGluaXRNZXNzYWdlID0gewogICAgICAgIHR5cGU6IG1lc3NhZ2VzXzEuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCwKICAgICAgICBleHBvc2VkOiB7CiAgICAgICAgICB0eXBlOiAiZnVuY3Rpb24iCiAgICAgICAgfQogICAgICB9OwogICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3Rlcihpbml0TWVzc2FnZSk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0TW9kdWxlSW5pdE1lc3NhZ2UobWV0aG9kTmFtZXMpIHsKICAgICAgY29uc3QgaW5pdE1lc3NhZ2UgPSB7CiAgICAgICAgdHlwZTogbWVzc2FnZXNfMS5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LAogICAgICAgIGV4cG9zZWQ6IHsKICAgICAgICAgIHR5cGU6ICJtb2R1bGUiLAogICAgICAgICAgbWV0aG9kczogbWV0aG9kTmFtZXMKICAgICAgICB9CiAgICAgIH07CiAgICAgIGltcGxlbWVudGF0aW9uXzEuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKGluaXRNZXNzYWdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RKb2JFcnJvck1lc3NhZ2UodWlkLCByYXdFcnJvcikgewogICAgICBjb25zdCB7IHBheWxvYWQ6IGVycm9yLCB0cmFuc2ZlcmFibGVzIH0gPSBkZWNvbnN0cnVjdFRyYW5zZmVyKHJhd0Vycm9yKTsKICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gewogICAgICAgIHR5cGU6IG1lc3NhZ2VzXzEuV29ya2VyTWVzc2FnZVR5cGUuZXJyb3IsCiAgICAgICAgdWlkLAogICAgICAgIGVycm9yOiBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpCiAgICAgIH07CiAgICAgIGltcGxlbWVudGF0aW9uXzEuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKGVycm9yTWVzc2FnZSwgdHJhbnNmZXJhYmxlcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0Sm9iUmVzdWx0TWVzc2FnZSh1aWQsIGNvbXBsZXRlZCwgcmVzdWx0VmFsdWUpIHsKICAgICAgY29uc3QgeyBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzIH0gPSBkZWNvbnN0cnVjdFRyYW5zZmVyKHJlc3VsdFZhbHVlKTsKICAgICAgY29uc3QgcmVzdWx0TWVzc2FnZSA9IHsKICAgICAgICB0eXBlOiBtZXNzYWdlc18xLldvcmtlck1lc3NhZ2VUeXBlLnJlc3VsdCwKICAgICAgICB1aWQsCiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlZCA/IHRydWUgOiB2b2lkIDAsCiAgICAgICAgcGF5bG9hZAogICAgICB9OwogICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihyZXN1bHRNZXNzYWdlLCB0cmFuc2ZlcmFibGVzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RKb2JTdGFydE1lc3NhZ2UodWlkLCByZXN1bHRUeXBlKSB7CiAgICAgIGNvbnN0IHN0YXJ0TWVzc2FnZSA9IHsKICAgICAgICB0eXBlOiBtZXNzYWdlc18xLldvcmtlck1lc3NhZ2VUeXBlLnJ1bm5pbmcsCiAgICAgICAgdWlkLAogICAgICAgIHJlc3VsdFR5cGUKICAgICAgfTsKICAgICAgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoc3RhcnRNZXNzYWdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShlcnJvcikgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHsKICAgICAgICAgIHR5cGU6IG1lc3NhZ2VzXzEuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvciwKICAgICAgICAgIGVycm9yOiBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpCiAgICAgICAgfTsKICAgICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihlcnJvck1lc3NhZ2UpOwogICAgICB9IGNhdGNoIChzdWJFcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIk5vdCByZXBvcnRpbmcgdW5jYXVnaHQgZXJyb3IgYmFjayB0byBtYXN0ZXIgdGhyZWFkIGFzIGl0IG9jY3VyZWQgd2hpbGUgcmVwb3J0aW5nIGFuIHVuY2F1Z2h0IGVycm9yIGFscmVhZHkuXG5MYXRlc3QgZXJyb3I6Iiwgc3ViRXJyb3IsICJcbk9yaWdpbmFsIGVycm9yOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcnVuRnVuY3Rpb24oam9iVUlELCBmbiwgYXJncykgewogICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIGxldCBzeW5jUmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICBzeW5jUmVzdWx0ID0gZm4oLi4uYXJncyk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIHJldHVybiBwb3N0Sm9iRXJyb3JNZXNzYWdlKGpvYlVJRCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHRUeXBlID0gaXNPYnNlcnZhYmxlJDEoc3luY1Jlc3VsdCkgPyAib2JzZXJ2YWJsZSIgOiAicHJvbWlzZSI7CiAgICAgICAgcG9zdEpvYlN0YXJ0TWVzc2FnZShqb2JVSUQsIHJlc3VsdFR5cGUpOwogICAgICAgIGlmIChpc09ic2VydmFibGUkMShzeW5jUmVzdWx0KSkgewogICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3luY1Jlc3VsdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiBwb3N0Sm9iUmVzdWx0TWVzc2FnZShqb2JVSUQsIGZhbHNlLCBjb21tb25fMS5zZXJpYWxpemUodmFsdWUpKSwgKGVycm9yKSA9PiB7CiAgICAgICAgICAgIHBvc3RKb2JFcnJvck1lc3NhZ2Uoam9iVUlELCBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpKTsKICAgICAgICAgICAgYWN0aXZlU3Vic2NyaXB0aW9ucy5kZWxldGUoam9iVUlEKTsKICAgICAgICAgIH0sICgpID0+IHsKICAgICAgICAgICAgcG9zdEpvYlJlc3VsdE1lc3NhZ2Uoam9iVUlELCB0cnVlKTsKICAgICAgICAgICAgYWN0aXZlU3Vic2NyaXB0aW9ucy5kZWxldGUoam9iVUlEKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYWN0aXZlU3Vic2NyaXB0aW9ucy5zZXQoam9iVUlELCBzdWJzY3JpcHRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBzeW5jUmVzdWx0OwogICAgICAgICAgICBwb3N0Sm9iUmVzdWx0TWVzc2FnZShqb2JVSUQsIHRydWUsIGNvbW1vbl8xLnNlcmlhbGl6ZShyZXN1bHQpKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHBvc3RKb2JFcnJvck1lc3NhZ2Uoam9iVUlELCBjb21tb25fMS5zZXJpYWxpemUoZXJyb3IpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZXhwb3NlMihleHBvc2VkKSB7CiAgICAgIGlmICghaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoImV4cG9zZSgpIGNhbGxlZCBpbiB0aGUgbWFzdGVyIHRocmVhZC4iKTsKICAgICAgfQogICAgICBpZiAoZXhwb3NlQ2FsbGVkKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoImV4cG9zZSgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBub3QgcG9zc2libGUuIFBhc3MgYW4gb2JqZWN0IHRvIGV4cG9zZSgpIGlmIHlvdSB3YW50IHRvIGV4cG9zZSBtdWx0aXBsZSBmdW5jdGlvbnMuIik7CiAgICAgIH0KICAgICAgZXhwb3NlQ2FsbGVkID0gdHJ1ZTsKICAgICAgaWYgKHR5cGVvZiBleHBvc2VkID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LnN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXMoKG1lc3NhZ2VEYXRhKSA9PiB7CiAgICAgICAgICBpZiAoaXNNYXN0ZXJKb2JSdW5NZXNzYWdlKG1lc3NhZ2VEYXRhKSAmJiAhbWVzc2FnZURhdGEubWV0aG9kKSB7CiAgICAgICAgICAgIHJ1bkZ1bmN0aW9uKG1lc3NhZ2VEYXRhLnVpZCwgZXhwb3NlZCwgbWVzc2FnZURhdGEuYXJncy5tYXAoY29tbW9uXzEuZGVzZXJpYWxpemUpKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBwb3N0RnVuY3Rpb25Jbml0TWVzc2FnZSgpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvc2VkID09PSAib2JqZWN0IiAmJiBleHBvc2VkKSB7CiAgICAgICAgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LnN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXMoKG1lc3NhZ2VEYXRhKSA9PiB7CiAgICAgICAgICBpZiAoaXNNYXN0ZXJKb2JSdW5NZXNzYWdlKG1lc3NhZ2VEYXRhKSAmJiBtZXNzYWdlRGF0YS5tZXRob2QpIHsKICAgICAgICAgICAgcnVuRnVuY3Rpb24obWVzc2FnZURhdGEudWlkLCBleHBvc2VkW21lc3NhZ2VEYXRhLm1ldGhvZF0sIG1lc3NhZ2VEYXRhLmFyZ3MubWFwKGNvbW1vbl8xLmRlc2VyaWFsaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbWV0aG9kTmFtZXMgPSBPYmplY3Qua2V5cyhleHBvc2VkKS5maWx0ZXIoKGtleSkgPT4gdHlwZW9mIGV4cG9zZWRba2V5XSA9PT0gImZ1bmN0aW9uIik7CiAgICAgICAgcG9zdE1vZHVsZUluaXRNZXNzYWdlKG1ldGhvZE5hbWVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8gZXhwb3NlKCkuIEV4cGVjdGVkIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LCBnb3Q6ICR7ZXhwb3NlZH1gKTsKICAgICAgfQogICAgICBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQuc3Vic2NyaWJlVG9NYXN0ZXJNZXNzYWdlcygobWVzc2FnZURhdGEpID0+IHsKICAgICAgICBpZiAoaXNNYXN0ZXJKb2JDYW5jZWxNZXNzYWdlKG1lc3NhZ2VEYXRhKSkgewogICAgICAgICAgY29uc3Qgam9iVUlEID0gbWVzc2FnZURhdGEudWlkOwogICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYWN0aXZlU3Vic2NyaXB0aW9ucy5nZXQoam9iVUlEKTsKICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIGFjdGl2ZVN1YnNjcmlwdGlvbnMuZGVsZXRlKGpvYlVJRCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGV4cG9ydHMyLmV4cG9zZSA9IGV4cG9zZTI7CiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIgJiYgaW1wbGVtZW50YXRpb25fMS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKSB7CiAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCAoZXZlbnQpID0+IHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShldmVudC5lcnJvciB8fCBldmVudCksIDI1MCk7CiAgICAgIH0pOwogICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoInVuaGFuZGxlZHJlamVjdGlvbiIsIChldmVudCkgPT4gewogICAgICAgIGNvbnN0IGVycm9yID0gZXZlbnQucmVhc29uOwogICAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcG9zdFVuY2F1Z2h0RXJyb3JNZXNzYWdlKGVycm9yKSwgMjUwKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgcHJvY2Vzcy5vbiA9PT0gImZ1bmN0aW9uIiAmJiBpbXBsZW1lbnRhdGlvbl8xLmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkpIHsKICAgICAgcHJvY2Vzcy5vbigidW5jYXVnaHRFeGNlcHRpb24iLCAoZXJyb3IpID0+IHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShlcnJvciksIDI1MCk7CiAgICAgIH0pOwogICAgICBwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCAoZXJyb3IpID0+IHsKICAgICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHBvc3RVbmNhdWdodEVycm9yTWVzc2FnZShlcnJvciksIDI1MCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KSh3b3JrZXIpOwogIHZhciBXb3JrZXJDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHdvcmtlcik7CiAgY29uc3QgZXhwb3NlID0gV29ya2VyQ29udGV4dC5leHBvc2U7CiAgV29ya2VyQ29udGV4dC5yZWdpc3RlclNlcmlhbGl6ZXI7CiAgY29uc3QgVHJhbnNmZXIgPSBXb3JrZXJDb250ZXh0LlRyYW5zZmVyOwogIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAib2JqZWN0IiAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDsKICB2YXIgZnJlZUdsb2JhbCQxID0gZnJlZUdsb2JhbDsKICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAib2JqZWN0IiAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjsKICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwkMSB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOwogIHZhciByb290JDEgPSByb290OwogIHZhciBTeW1ib2wkMSA9IHJvb3QkMS5TeW1ib2w7CiAgdmFyIFN5bWJvbCQyID0gU3ltYm9sJDE7CiAgdmFyIG9iamVjdFByb3RvJDUgPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBoYXNPd25Qcm9wZXJ0eSQzID0gb2JqZWN0UHJvdG8kNS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmckMSA9IG9iamVjdFByb3RvJDUudG9TdHJpbmc7CiAgdmFyIHN5bVRvU3RyaW5nVGFnJDEgPSBTeW1ib2wkMiA/IFN5bWJvbCQyLnRvU3RyaW5nVGFnIDogdm9pZCAwOwogIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkgewogICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkkMy5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyQxKSwgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWckMV07CiAgICB0cnkgewogICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXSA9IHZvaWQgMDsKICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgIH0KICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZyQxLmNhbGwodmFsdWUpOwogICAgaWYgKHVubWFza2VkKSB7CiAgICAgIGlmIChpc093bikgewogICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnJDFdID0gdGFnOwogICAgICB9IGVsc2UgewogICAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIG9iamVjdFByb3RvJDQgPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvJDQudG9TdHJpbmc7CiAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHsKICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTsKICB9CiAgdmFyIG51bGxUYWcgPSAiW29iamVjdCBOdWxsXSIsIHVuZGVmaW5lZFRhZyA9ICJbb2JqZWN0IFVuZGVmaW5lZF0iOwogIHZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCQyID8gU3ltYm9sJDIudG9TdHJpbmdUYWcgOiB2b2lkIDA7CiAgZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgcmV0dXJuIHZhbHVlID09PSB2b2lkIDAgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnOwogICAgfQogICAgcmV0dXJuIHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkgPyBnZXRSYXdUYWcodmFsdWUpIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpOwogIH0KICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAib2JqZWN0IjsKICB9CiAgdmFyIHN5bWJvbFRhZyA9ICJbb2JqZWN0IFN5bWJvbF0iOwogIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7CiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICJzeW1ib2wiIHx8IGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnOwogIH0KICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHsKICAgIHZhciBpbmRleCA9IC0xLCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCwgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CiAgdmFyIGlzQXJyYXkkMSA9IGlzQXJyYXk7CiAgdmFyIHJlV2hpdGVzcGFjZSA9IC9ccy87CiAgZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykgewogICAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDsKICAgIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkgewogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KICB2YXIgcmVUcmltU3RhcnQgPSAvXlxzKy87CiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgIiIpIDogc3RyaW5nOwogIH0KICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkgewogICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAib2JqZWN0IiB8fCB0eXBlID09ICJmdW5jdGlvbiIpOwogIH0KICB2YXIgTkFOID0gMCAvIDA7CiAgdmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTsKICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTsKICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTsKICB2YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7CiAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gIm51bWJlciIpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkgewogICAgICByZXR1cm4gTkFOOwogICAgfQogICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkgewogICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAiZnVuY3Rpb24iID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7CiAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gb3RoZXIgKyAiIiA6IG90aGVyOwogICAgfQogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAic3RyaW5nIikgewogICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTsKICAgIH0KICAgIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpOwogICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTsKICAgIHJldHVybiBpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpIDogcmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZTsKICB9CiAgdmFyIElORklOSVRZID0gMSAvIDAsIE1BWF9JTlRFR0VSID0gMTc5NzY5MzEzNDg2MjMxNTdlMjkyOwogIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDsKICAgIH0KICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpOwogICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7CiAgICAgIHZhciBzaWduID0gdmFsdWUgPCAwID8gLTEgOiAxOwogICAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSOwogICAgfQogICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDsKICB9CiAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7CiAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLCByZW1haW5kZXIgPSByZXN1bHQgJSAxOwogICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gcmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0IDogMDsKICB9CiAgdmFyIGFzeW5jVGFnID0gIltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLCBmdW5jVGFnJDEgPSAiW29iamVjdCBGdW5jdGlvbl0iLCBnZW5UYWcgPSAiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCBwcm94eVRhZyA9ICJbb2JqZWN0IFByb3h5XSI7CiAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpOwogICAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnJDEgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnOwogIH0KICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkgewogICAgdmFyIGluZGV4ID0gLTEsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTsKICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIHZhciBNQVhfU0FGRV9JTlRFR0VSJDEgPSA5MDA3MTk5MjU0NzQwOTkxOwogIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHsKICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlOwogICAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSJDEgOiBsZW5ndGg7CiAgICByZXR1cm4gISFsZW5ndGggJiYgKHR5cGUgPT0gIm51bWJlciIgfHwgdHlwZSAhPSAic3ltYm9sIiAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkgJiYgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpOwogIH0KICBmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHsKICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjsKICB9CiAgdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxOwogIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7CiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICJudW1iZXIiICYmIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjsKICB9CiAgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpOwogIH0KICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkgewogICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4OwogICAgaWYgKHR5cGUgPT0gIm51bWJlciIgPyBpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpIDogdHlwZSA9PSAic3RyaW5nIiAmJiBpbmRleCBpbiBvYmplY3QpIHsKICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgdmFyIG9iamVjdFByb3RvJDMgPSBPYmplY3QucHJvdG90eXBlOwogIGZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7CiAgICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLCBwcm90byA9IHR5cGVvZiBDdG9yID09ICJmdW5jdGlvbiIgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG8kMzsKICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87CiAgfQogIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkgewogICAgdmFyIGluZGV4ID0gLTEsIHJlc3VsdCA9IEFycmF5KG4pOwogICAgd2hpbGUgKCsraW5kZXggPCBuKSB7CiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgYXJnc1RhZyQxID0gIltvYmplY3QgQXJndW1lbnRzXSI7CiAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7CiAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnJDE7CiAgfQogIHZhciBvYmplY3RQcm90byQyID0gT2JqZWN0LnByb3RvdHlwZTsKICB2YXIgaGFzT3duUHJvcGVydHkkMiA9IG9iamVjdFByb3RvJDIuaGFzT3duUHJvcGVydHk7CiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8kMi5wcm9wZXJ0eUlzRW51bWVyYWJsZTsKICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gYXJndW1lbnRzOwogIH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkkMi5jYWxsKHZhbHVlLCAiY2FsbGVlIikgJiYgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICJjYWxsZWUiKTsKICB9OwogIHZhciBpc0FyZ3VtZW50cyQxID0gaXNBcmd1bWVudHM7CiAgZnVuY3Rpb24gc3R1YkZhbHNlKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICB2YXIgZnJlZUV4cG9ydHMkMSA9IHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0czsKICB2YXIgZnJlZU1vZHVsZSQxID0gZnJlZUV4cG9ydHMkMSAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTsKICB2YXIgbW9kdWxlRXhwb3J0cyQxID0gZnJlZU1vZHVsZSQxICYmIGZyZWVNb2R1bGUkMS5leHBvcnRzID09PSBmcmVlRXhwb3J0cyQxOwogIHZhciBCdWZmZXIyID0gbW9kdWxlRXhwb3J0cyQxID8gcm9vdCQxLkJ1ZmZlciA6IHZvaWQgMDsKICB2YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIyID8gQnVmZmVyMi5pc0J1ZmZlciA6IHZvaWQgMDsKICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7CiAgdmFyIGlzQnVmZmVyJDEgPSBpc0J1ZmZlcjsKICB2YXIgYXJnc1RhZyA9ICJbb2JqZWN0IEFyZ3VtZW50c10iLCBhcnJheVRhZyA9ICJbb2JqZWN0IEFycmF5XSIsIGJvb2xUYWcgPSAiW29iamVjdCBCb29sZWFuXSIsIGRhdGVUYWcgPSAiW29iamVjdCBEYXRlXSIsIGVycm9yVGFnID0gIltvYmplY3QgRXJyb3JdIiwgZnVuY1RhZyA9ICJbb2JqZWN0IEZ1bmN0aW9uXSIsIG1hcFRhZyA9ICJbb2JqZWN0IE1hcF0iLCBudW1iZXJUYWcgPSAiW29iamVjdCBOdW1iZXJdIiwgb2JqZWN0VGFnID0gIltvYmplY3QgT2JqZWN0XSIsIHJlZ2V4cFRhZyA9ICJbb2JqZWN0IFJlZ0V4cF0iLCBzZXRUYWcgPSAiW29iamVjdCBTZXRdIiwgc3RyaW5nVGFnID0gIltvYmplY3QgU3RyaW5nXSIsIHdlYWtNYXBUYWcgPSAiW29iamVjdCBXZWFrTWFwXSI7CiAgdmFyIGFycmF5QnVmZmVyVGFnID0gIltvYmplY3QgQXJyYXlCdWZmZXJdIiwgZGF0YVZpZXdUYWcgPSAiW29iamVjdCBEYXRhVmlld10iLCBmbG9hdDMyVGFnID0gIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIGZsb2F0NjRUYWcgPSAiW29iamVjdCBGbG9hdDY0QXJyYXldIiwgaW50OFRhZyA9ICJbb2JqZWN0IEludDhBcnJheV0iLCBpbnQxNlRhZyA9ICJbb2JqZWN0IEludDE2QXJyYXldIiwgaW50MzJUYWcgPSAiW29iamVjdCBJbnQzMkFycmF5XSIsIHVpbnQ4VGFnID0gIltvYmplY3QgVWludDhBcnJheV0iLCB1aW50OENsYW1wZWRUYWcgPSAiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCB1aW50MTZUYWcgPSAiW29iamVjdCBVaW50MTZBcnJheV0iLCB1aW50MzJUYWcgPSAiW29iamVjdCBVaW50MzJBcnJheV0iOwogIHZhciB0eXBlZEFycmF5VGFncyA9IHt9OwogIHR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7CiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID0gdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPSB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID0gdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPSB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwogIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHsKICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07CiAgfQogIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmModmFsdWUpOwogICAgfTsKICB9CiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzOwogIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IiAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7CiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7CiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsJDEucHJvY2VzczsKICB2YXIgbm9kZVV0aWwgPSBmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgidXRpbCIpLnR5cGVzOwogICAgICBpZiAodHlwZXMpIHsKICAgICAgICByZXR1cm4gdHlwZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygidXRpbCIpOwogICAgfSBjYXRjaCAoZSkgewogICAgfQogIH0oKTsKICB2YXIgbm9kZVV0aWwkMSA9IG5vZGVVdGlsOwogIHZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwkMSAmJiBub2RlVXRpbCQxLmlzVHlwZWRBcnJheTsKICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7CiAgdmFyIGlzVHlwZWRBcnJheSQxID0gaXNUeXBlZEFycmF5OwogIHZhciBvYmplY3RQcm90byQxID0gT2JqZWN0LnByb3RvdHlwZTsKICB2YXIgaGFzT3duUHJvcGVydHkkMSA9IG9iamVjdFByb3RvJDEuaGFzT3duUHJvcGVydHk7CiAgZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7CiAgICB2YXIgaXNBcnIgPSBpc0FycmF5JDEodmFsdWUpLCBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyQxKHZhbHVlKSwgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlciQxKHZhbHVlKSwgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSQxKHZhbHVlKSwgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLCByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eSQxLmNhbGwodmFsdWUsIGtleSkpICYmICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAibGVuZ3RoIiB8fCBpc0J1ZmYgJiYgKGtleSA9PSAib2Zmc2V0IiB8fCBrZXkgPT0gInBhcmVudCIpIHx8IGlzVHlwZSAmJiAoa2V5ID09ICJidWZmZXIiIHx8IGtleSA9PSAiYnl0ZUxlbmd0aCIgfHwga2V5ID09ICJieXRlT2Zmc2V0IikgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkgewogICAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7CiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTsKICAgIH07CiAgfQogIHZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTsKICB2YXIgbmF0aXZlS2V5cyQxID0gbmF0aXZlS2V5czsKICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OwogIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkgewogICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7CiAgICAgIHJldHVybiBuYXRpdmVLZXlzJDEob2JqZWN0KTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBbXTsKICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkgewogICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICJjb25zdHJ1Y3RvciIpIHsKICAgICAgICByZXN1bHQucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewogICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpOwogIH0KICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHsKICAgIGlmIChudW1iZXIgPT09IG51bWJlcikgewogICAgICBpZiAodXBwZXIgIT09IHZvaWQgMCkgewogICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyOwogICAgICB9CiAgICAgIGlmIChsb3dlciAhPT0gdm9pZCAwKSB7CiAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudW1iZXI7CiAgfQogIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykgewogICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHsKICAgICAgcmV0dXJuIG9iamVjdFtrZXldOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHsKICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7CiAgfQogIHZhciBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tOwogIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7CiAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpOwogIH0KICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkgewogICAgdmFyIGluZGV4ID0gLTEsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTsKICAgIHNpemUgPSBzaXplID09PSB2b2lkIDAgPyBsZW5ndGggOiBzaXplOwogICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7CiAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSwgdmFsdWUgPSBhcnJheVtyYW5kXTsKICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07CiAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlOwogICAgfQogICAgYXJyYXkubGVuZ3RoID0gc2l6ZTsKICAgIHJldHVybiBhcnJheTsKICB9CiAgZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7CiAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpOwogIH0KICBmdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuKSB7CiAgICB2YXIgYXJyYXkgPSB2YWx1ZXMoY29sbGVjdGlvbik7CiAgICByZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTsKICB9CiAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkgewogICAgaWYgKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdm9pZCAwKSB7CiAgICAgIG4gPSAxOwogICAgfSBlbHNlIHsKICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgIH0KICAgIHZhciBmdW5jID0gaXNBcnJheSQxKGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7CiAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTsKICB9CiAgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHsKICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKICB9CiAgZnVuY3Rpb24gYmlzZWN0b3IoZikgewogICAgbGV0IGRlbHRhID0gZjsKICAgIGxldCBjb21wYXJlID0gZjsKICAgIGlmIChmLmxlbmd0aCA9PT0gMSkgewogICAgICBkZWx0YSA9IChkLCB4KSA9PiBmKGQpIC0geDsKICAgICAgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoZik7CiAgICB9CiAgICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvLCBoaSkgewogICAgICBpZiAobG8gPT0gbnVsbCkKICAgICAgICBsbyA9IDA7CiAgICAgIGlmIChoaSA9PSBudWxsKQogICAgICAgIGhpID0gYS5sZW5ndGg7CiAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgY29uc3QgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkKICAgICAgICAgIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICBoaSA9IG1pZDsKICAgICAgfQogICAgICByZXR1cm4gbG87CiAgICB9CiAgICBmdW5jdGlvbiByaWdodChhLCB4LCBsbywgaGkpIHsKICAgICAgaWYgKGxvID09IG51bGwpCiAgICAgICAgbG8gPSAwOwogICAgICBpZiAoaGkgPT0gbnVsbCkKICAgICAgICBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIGNvbnN0IG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApCiAgICAgICAgICBoaSA9IG1pZDsKICAgICAgICBlbHNlCiAgICAgICAgICBsbyA9IG1pZCArIDE7CiAgICAgIH0KICAgICAgcmV0dXJuIGxvOwogICAgfQogICAgZnVuY3Rpb24gY2VudGVyKGEsIHgsIGxvLCBoaSkgewogICAgICBpZiAobG8gPT0gbnVsbCkKICAgICAgICBsbyA9IDA7CiAgICAgIGlmIChoaSA9PSBudWxsKQogICAgICAgIGhpID0gYS5sZW5ndGg7CiAgICAgIGNvbnN0IGkyID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTsKICAgICAgcmV0dXJuIGkyID4gbG8gJiYgZGVsdGEoYVtpMiAtIDFdLCB4KSA+IC1kZWx0YShhW2kyXSwgeCkgPyBpMiAtIDEgOiBpMjsKICAgIH0KICAgIHJldHVybiB7IGxlZnQsIGNlbnRlciwgcmlnaHQgfTsKICB9CiAgZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7CiAgICByZXR1cm4gKGQsIHgpID0+IGFzY2VuZGluZyhmKGQpLCB4KTsKICB9CiAgY2xhc3MgRGF0YVNvdXJjZSB7CiAgICBjb25zdHJ1Y3RvcihmaWxlLCBjaHJvbVNpemVzLCBvcHRpb25zKSB7CiAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIHRoaXMuY2hyb21JbmZvID0gc2l6ZXNUb0Nocm9tSW5mbyhjaHJvbVNpemVzKTsKICAgICAgdGhpcy50aWxlc2V0SW5mbyA9IHRpbGVzZXRJbmZvRnJvbUNocm9tSW5mbyh0aGlzLmNocm9tSW5mbyk7CiAgICB9CiAgfQogIGNvbnN0IGNocm9tSW5mb0Jpc2VjdG9yID0gYmlzZWN0b3IoKGQpID0+IGQucG9zKS5sZWZ0OwogIGNvbnN0IGNoclRvQWJzID0gKGNocm9tLCBjaHJvbVBvcywgY2hyb21JbmZvKSA9PiBjaHJvbUluZm8uY2hyUG9zaXRpb25zW2Nocm9tXS5wb3MgKyBjaHJvbVBvczsKICBjb25zdCBhYnNUb0NociA9IChhYnNQb3NpdGlvbiwgY2hyb21JbmZvKSA9PiB7CiAgICBpZiAoIWNocm9tSW5mbyB8fCAhY2hyb21JbmZvLmN1bVBvc2l0aW9ucyB8fCAhY2hyb21JbmZvLmN1bVBvc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgaW5zZXJ0UG9pbnQgPSBjaHJvbUluZm9CaXNlY3RvcihjaHJvbUluZm8uY3VtUG9zaXRpb25zLCBhYnNQb3NpdGlvbik7CiAgICBjb25zdCBsYXN0Q2hyID0gY2hyb21JbmZvLmN1bVBvc2l0aW9uc1tjaHJvbUluZm8uY3VtUG9zaXRpb25zLmxlbmd0aCAtIDFdLmNocjsKICAgIGNvbnN0IGxhc3RMZW5ndGggPSBjaHJvbUluZm8uY2hyb21MZW5ndGhzW2xhc3RDaHJdOwogICAgaW5zZXJ0UG9pbnQgLT0gaW5zZXJ0UG9pbnQgPiAwICYmIDE7CiAgICBsZXQgY2hyUG9zaXRpb24gPSBNYXRoLmZsb29yKGFic1Bvc2l0aW9uIC0gY2hyb21JbmZvLmN1bVBvc2l0aW9uc1tpbnNlcnRQb2ludF0ucG9zKTsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgaWYgKGNoclBvc2l0aW9uIDwgMCkgewogICAgICBvZmZzZXQgPSBjaHJQb3NpdGlvbiAtIDE7CiAgICAgIGNoclBvc2l0aW9uID0gMTsKICAgIH0KICAgIGlmIChpbnNlcnRQb2ludCA9PT0gY2hyb21JbmZvLmN1bVBvc2l0aW9ucy5sZW5ndGggLSAxICYmIGNoclBvc2l0aW9uID4gbGFzdExlbmd0aCkgewogICAgICBvZmZzZXQgPSBjaHJQb3NpdGlvbiAtIGxhc3RMZW5ndGg7CiAgICAgIGNoclBvc2l0aW9uID0gbGFzdExlbmd0aDsKICAgIH0KICAgIHJldHVybiBbY2hyb21JbmZvLmN1bVBvc2l0aW9uc1tpbnNlcnRQb2ludF0uY2hyLCBjaHJQb3NpdGlvbiwgb2Zmc2V0LCBpbnNlcnRQb2ludF07CiAgfTsKICBmdW5jdGlvbiB0aWxlc2V0SW5mb0Zyb21DaHJvbUluZm8oY2hyb21JbmZvLCB0aWxlU2l6ZSA9IDEwMjQpIHsKICAgIHJldHVybiB7CiAgICAgIHRpbGVfc2l6ZTogdGlsZVNpemUsCiAgICAgIGJpbnNfcGVyX2RpbWVuc2lvbjogdGlsZVNpemUsCiAgICAgIG1heF96b29tOiBNYXRoLmNlaWwoTWF0aC5sb2coY2hyb21JbmZvLnRvdGFsTGVuZ3RoIC8gdGlsZVNpemUpIC8gTWF0aC5sb2coMikpLAogICAgICBtYXhfd2lkdGg6IGNocm9tSW5mby50b3RhbExlbmd0aCwKICAgICAgbWluX3BvczogWzBdLAogICAgICBtYXhfcG9zOiBbY2hyb21JbmZvLnRvdGFsTGVuZ3RoXQogICAgfTsKICB9CiAgZnVuY3Rpb24gc2l6ZXNUb0Nocm9tSW5mbyhzaXplcykgewogICAgY29uc3QgaW5mbyA9IHsKICAgICAgY3VtUG9zaXRpb25zOiBbXSwKICAgICAgY2hyb21MZW5ndGhzOiB7fSwKICAgICAgY2hyUG9zaXRpb25zOiB7fSwKICAgICAgdG90YWxMZW5ndGg6IDAKICAgIH07CiAgICBzaXplcy5mb3JFYWNoKChbY2hyLCBsZW5ndGhdLCBpMikgPT4gewogICAgICBjb25zdCBjaHJQb3NpdGlvbiA9IHsgaWQ6IGkyLCBjaHIsIHBvczogaW5mby50b3RhbExlbmd0aCB9OwogICAgICBpbmZvLmNoclBvc2l0aW9uc1tjaHJdID0gY2hyUG9zaXRpb247CiAgICAgIGluZm8uY2hyb21MZW5ndGhzW2Nocl0gPSBsZW5ndGg7CiAgICAgIGluZm8uY3VtUG9zaXRpb25zLnB1c2goY2hyUG9zaXRpb24pOwogICAgICBpbmZvLnRvdGFsTGVuZ3RoICs9IGxlbmd0aDsKICAgIH0pOwogICAgcmV0dXJuIHsKICAgICAgLi4uaW5mbywKICAgICAgYWJzVG9DaHI6IChhYnNQb3MpID0+IGluZm8uY2hyUG9zaXRpb25zID8gYWJzVG9DaHIoYWJzUG9zLCBpbmZvKSA6IG51bGwsCiAgICAgIGNoclRvQWJzOiAoW2Nock5hbWUsIGNoclBvc10pID0+IGluZm8uY2hyUG9zaXRpb25zID8gY2hyVG9BYnMoY2hyTmFtZSwgY2hyUG9zLCBpbmZvKSA6IG51bGwKICAgIH07CiAgfQogIGNsYXNzIFJlbW90ZUZpbGUgZXh0ZW5kcyBSZW1vdGVGaWxlJDEgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIHRoaXMucmVhZCA9IGFzeW5jIChidWZmZXIyLCBvZmZzZXQgPSAwLCBsZW5ndGgsIHBvc2l0aW9uID0gMCwgb3B0cyA9IHt9KSA9PiB7CiAgICAgICAgY29uc3QgeyBoZWFkZXJzID0ge30sIHNpZ25hbCwgb3ZlcnJpZGVzID0ge30gfSA9IG9wdHM7CiAgICAgICAgaWYgKGxlbmd0aCA8IEluZmluaXR5KSB7CiAgICAgICAgICBoZWFkZXJzLnJhbmdlID0gYGJ5dGVzPSR7cG9zaXRpb259LSR7cG9zaXRpb24gKyBsZW5ndGh9YDsKICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gSW5maW5pdHkgJiYgcG9zaXRpb24gIT09IDApIHsKICAgICAgICAgIGhlYWRlcnMucmFuZ2UgPSBgYnl0ZXM9JHtwb3NpdGlvbn0tYDsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXJncyA9IHsKICAgICAgICAgIC4uLnRoaXMuYmFzZU92ZXJyaWRlcywKICAgICAgICAgIC4uLm92ZXJyaWRlcywKICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgLi4uaGVhZGVycywKICAgICAgICAgICAgLi4ub3ZlcnJpZGVzLmhlYWRlcnMsCiAgICAgICAgICAgIC4uLnRoaXMuYmFzZU92ZXJyaWRlcy5oZWFkZXJzCiAgICAgICAgICB9LAogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHJlZGlyZWN0OiAiZm9sbG93IiwKICAgICAgICAgIG1vZGU6ICJjb3JzIiwKICAgICAgICAgIHNpZ25hbAogICAgICAgIH07CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKHRoaXMudXJsLCBhcmdzKTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gJHt0aGlzLnVybH1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA2KSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmdldEJ1ZmZlckZyb21SZXNwb25zZShyZXNwb25zZSk7CiAgICAgICAgICBjb25zdCBieXRlc0NvcGllZCA9IHJlc3BvbnNlRGF0YS5jb3B5KGJ1ZmZlcjIsIG9mZnNldCwgMCwgTWF0aC5taW4obGVuZ3RoLCByZXNwb25zZURhdGEubGVuZ3RoKSk7CiAgICAgICAgICBjb25zdCByZXMgPSByZXNwb25zZS5oZWFkZXJzLmdldCgiY29udGVudC1yYW5nZSIpOwogICAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gL1wvKFxkKykkLy5leGVjKHJlcyB8fCAiIik7CiAgICAgICAgICBpZiAoc2l6ZU1hdGNoICYmIHNpemVNYXRjaFsxXSkgewogICAgICAgICAgICB0aGlzLl9zdGF0ID0geyBzaXplOiBwYXJzZUludChzaXplTWF0Y2hbMV0sIDEwKSB9OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsgYnl0ZXNSZWFkOiBieXRlc0NvcGllZCwgYnVmZmVyOiBidWZmZXIyIH07CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gZmV0Y2hpbmcgJHt0aGlzLnVybH1gKTsKICAgICAgfTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaXNHRkYzRmVhdHVyZShlbnRyeSkgewogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZW50cnkpOwogIH0KICBmdW5jdGlvbiBtYWtlUmFuZG9tU29ydGVkQXJyYXkobiwgbWF4VmFsdWUpIHsKICAgIGNvbnN0IHJhbmRvbUFycmF5ID0gW107CiAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgbjsgaTIrKykgewogICAgICBjb25zdCByYW5kb21OdW1iZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4VmFsdWUgKyAxKSk7CiAgICAgIHJhbmRvbUFycmF5LnB1c2gocmFuZG9tTnVtYmVyKTsKICAgIH0KICAgIGNvbnN0IHNvcnRlZCA9IHJhbmRvbUFycmF5LnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKICAgIHJldHVybiBbLi4ubmV3IFNldChzb3J0ZWQpXTsKICB9CiAgY29uc3QgX0dmZkZpbGUgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0YmksIHVpZCkgewogICAgICBfX3ByaXZhdGVBZGQodGhpcywgX2dldE51bWJlckZlYXR1cmVzKTsKICAgICAgX19wcml2YXRlQWRkKHRoaXMsIF9nZXRMaW5lUHJvbWlzZXMpOwogICAgICBfX3ByaXZhdGVBZGQodGhpcywgX3VpZCwgdm9pZCAwKTsKICAgICAgX19wcml2YXRlQWRkKHRoaXMsIF9uX2ZlYXR1cmVzLCB2b2lkIDApOwogICAgICB0aGlzLnRiaSA9IHRiaTsKICAgICAgX19wcml2YXRlU2V0KHRoaXMsIF91aWQsIHVpZCk7CiAgICB9CiAgICBzdGF0aWMgZnJvbVVybCh1cmwsIGluZGV4VXJsLCB1aWQpIHsKICAgICAgY29uc3QgdGJpID0gbmV3IFRhYml4SW5kZXhlZEZpbGUoewogICAgICAgIGZpbGVoYW5kbGU6IG5ldyBSZW1vdGVGaWxlKHVybCksCiAgICAgICAgdGJpRmlsZWhhbmRsZTogbmV3IFJlbW90ZUZpbGUoaW5kZXhVcmwpCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IF9HZmZGaWxlKHRiaSwgdWlkKTsKICAgIH0KICAgIGFzeW5jIGdldFRpbGVEYXRhKG1pblgsIG1heFgpIHsKICAgICAgY29uc3Qgc291cmNlID0gZGF0YVNvdXJjZXMuZ2V0KF9fcHJpdmF0ZUdldCh0aGlzLCBfdWlkKSk7CiAgICAgIGNvbnN0IHNhbXBsZUxlbmd0aCA9IHNvdXJjZS5vcHRpb25zLnNhbXBsZUxlbmd0aDsKICAgICAgY29uc3QgYXR0cmlidXRlc1RvRmllbGRzID0gc291cmNlLm9wdGlvbnMuYXR0cmlidXRlc1RvRmllbGRzOwogICAgICBhd2FpdCBfX3ByaXZhdGVNZXRob2QodGhpcywgX2dldE51bWJlckZlYXR1cmVzLCBnZXROdW1iZXJGZWF0dXJlc19mbikuY2FsbCh0aGlzKTsKICAgICAgZnVuY3Rpb24gZmlsdGVyTGluZXMobGluZXMpIHsKICAgICAgICBjb25zdCBub25DaGlsZExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiB7CiAgICAgICAgICBjb25zdCBsaW5lQ29sdW1ucyA9IGxpbmUuc3BsaXQoIgkiKTsKICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBsaW5lQ29sdW1uc1s4XTsKICAgICAgICAgIHJldHVybiAhYXR0cmlidXRlcy5pbmNsdWRlcygiUGFyZW50PSIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzYW1wbGVTaXplKG5vbkNoaWxkTGluZXMsIHNhbXBsZUxlbmd0aCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGFyc2VkTGluZXNUb1RpbGVzKHBhcnNlZCkgewogICAgICAgIGxldCB0aWxlczIgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFyc2VkKSB7CiAgICAgICAgICBpZiAoaXNHRkYzRmVhdHVyZShsaW5lKSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgbGluZSkgewogICAgICAgICAgICAgIGlmIChmZWF0dXJlLnNlcV9pZCAmJiBmZWF0dXJlLnN0YXJ0KQogICAgICAgICAgICAgICAgZmVhdHVyZS5zdGFydCA9IHNvdXJjZS5jaHJvbUluZm8uY2hyVG9BYnMoW2ZlYXR1cmUuc2VxX2lkLCBmZWF0dXJlLnN0YXJ0XSk7CiAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuc2VxX2lkICYmIGZlYXR1cmUuZW5kKQogICAgICAgICAgICAgICAgZmVhdHVyZS5lbmQgPSBzb3VyY2UuY2hyb21JbmZvLmNoclRvQWJzKFtmZWF0dXJlLnNlcV9pZCwgZmVhdHVyZS5lbmRdKTsKICAgICAgICAgICAgICB0aWxlczIucHVzaChmZWF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYXR0cmlidXRlc1RvRmllbGRzKSB7CiAgICAgICAgICB0aWxlczIgPSB0aWxlczIubWFwKCh0aWxlMikgPT4gewogICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGlsZTIuYXR0cmlidXRlczsKICAgICAgICAgICAgY29uc3QgY2xlYW5BdHQgPSB7fTsKICAgICAgICAgICAgYXR0cmlidXRlc1RvRmllbGRzLmZvckVhY2goKGF0dE1hcCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IGF0dE5hbWUgPSBhdHRNYXAuYXR0cmlidXRlOwogICAgICAgICAgICAgIGNvbnN0IGF0dERlZmF1bHQgPSBhdHRNYXAuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgIShhdHROYW1lIGluIGF0dHJpYnV0ZXMpIHx8ICFBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXNbYXR0TmFtZV0pKQogICAgICAgICAgICAgICAgY2xlYW5BdHRbYXR0TmFtZV0gPSBhdHREZWZhdWx0OwogICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgYXR0VmFsID0gYXR0cmlidXRlc1thdHROYW1lXTsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGF0dFZhbCkpIHsKICAgICAgICAgICAgICAgICAgY2xlYW5BdHRbYXR0TmFtZV0gPSBhdHRWYWwubGVuZ3RoID09IDEgPyBhdHRWYWxbMF0gOiBhdHRWYWwuam9pbigiLCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB7IC4uLnRpbGUyLCAuLi5jbGVhbkF0dCB9OwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aWxlczI7CiAgICAgIH0KICAgICAgY29uc3QgbGluZVByb21pc2VzID0gX19wcml2YXRlTWV0aG9kKHRoaXMsIF9nZXRMaW5lUHJvbWlzZXMsIGdldExpbmVQcm9taXNlc19mbikuY2FsbCh0aGlzLCBtaW5YLCBtYXhYKTsKICAgICAgY29uc3QgYWxsTGluZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwobGluZVByb21pc2VzKSkuZmxhdCgpOwogICAgICBsZXQgbGluZXNUb1BhcnNlID0gW107CiAgICAgIGlmIChhbGxMaW5lcy5sZW5ndGggPiBzYW1wbGVMZW5ndGgpIHsKICAgICAgICBsaW5lc1RvUGFyc2UgPSBmaWx0ZXJMaW5lcyhhbGxMaW5lcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGluZXNUb1BhcnNlID0gYWxsTGluZXM7CiAgICAgIH0KICAgICAgY29uc3QgcGFyc2VPcHRpb25zID0gewogICAgICAgIGRpc2FibGVEZXJpdmVzRnJvbVJlZmVyZW5jZXM6IHRydWUsCiAgICAgICAgcGFyc2VGZWF0dXJlczogdHJ1ZSwKICAgICAgICBwYXJzZUNvbW1lbnRzOiBmYWxzZSwKICAgICAgICBwYXJzZURpcmVjdGl2ZXM6IGZhbHNlLAogICAgICAgIHBhcnNlU2VxdWVuY2VzOiBmYWxzZQogICAgICB9OwogICAgICBjb25zdCBwYXJzZWRMaW5lcyA9IEdGRi5wYXJzZVN0cmluZ1N5bmMobGluZXNUb1BhcnNlLmpvaW4oIlxuIiksIHBhcnNlT3B0aW9ucyk7CiAgICAgIGNvbnN0IHRpbGVzID0gcGFyc2VkTGluZXNUb1RpbGVzKHBhcnNlZExpbmVzKTsKICAgICAgcmV0dXJuIHRpbGVzOwogICAgfQogIH07CiAgbGV0IEdmZkZpbGUgPSBfR2ZmRmlsZTsKICBfdWlkID0gbmV3IFdlYWtNYXAoKTsKICBfbl9mZWF0dXJlcyA9IG5ldyBXZWFrTWFwKCk7CiAgX2dldE51bWJlckZlYXR1cmVzID0gbmV3IFdlYWtTZXQoKTsKICBnZXROdW1iZXJGZWF0dXJlc19mbiA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgaWYgKCFfX3ByaXZhdGVHZXQodGhpcywgX25fZmVhdHVyZXMpKSB7CiAgICAgIGNvbnN0IHNvdXJjZSA9IGRhdGFTb3VyY2VzLmdldChfX3ByaXZhdGVHZXQodGhpcywgX3VpZCkpOwogICAgICBjb25zdCB7IGN1bVBvc2l0aW9ucyB9ID0gc291cmNlLmNocm9tSW5mbzsKICAgICAgY29uc3QgY291bnRQcm9taXNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGN1bVBvcyBvZiBjdW1Qb3NpdGlvbnMpIHsKICAgICAgICBjb25zdCBjaHJvbU5hbWUgPSBjdW1Qb3MuY2hyOwogICAgICAgIGNvdW50UHJvbWlzZXMucHVzaCh0aGlzLnRiaS5saW5lQ291bnQoY2hyb21OYW1lKSk7CiAgICAgIH0KICAgICAgY29uc3QgY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY291bnRQcm9taXNlcyk7CiAgICAgIGNvbnN0IHRvdGFsX2NvdW50cyA9IGNvdW50cy5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKyBjdXIsIDApOwogICAgICBfX3ByaXZhdGVTZXQodGhpcywgX25fZmVhdHVyZXMsIHRvdGFsX2NvdW50cyk7CiAgICB9CiAgICByZXR1cm4gX19wcml2YXRlR2V0KHRoaXMsIF9uX2ZlYXR1cmVzKTsKICB9OwogIF9nZXRMaW5lUHJvbWlzZXMgPSBuZXcgV2Vha1NldCgpOwogIGdldExpbmVQcm9taXNlc19mbiA9IGZ1bmN0aW9uKG1pblgsIG1heFgpIHsKICAgIGNvbnN0IHNvdXJjZSA9IGRhdGFTb3VyY2VzLmdldChfX3ByaXZhdGVHZXQodGhpcywgX3VpZCkpOwogICAgbGV0IGN1ck1pblggPSBtaW5YOwogICAgY29uc3QgeyBjaHJvbUxlbmd0aHMsIGN1bVBvc2l0aW9ucyB9ID0gc291cmNlLmNocm9tSW5mbzsKICAgIGNvbnN0IGxpbmVQcm9taXNlcyA9IFtdOwogICAgY29uc3QgTUFYX0ZFQVRVUkVTID0gNWU1OwogICAgY29uc3QgTUFYX1dJTkRPVyA9IDRlNjsKICAgIGlmIChfX3ByaXZhdGVHZXQodGhpcywgX25fZmVhdHVyZXMpICYmIF9fcHJpdmF0ZUdldCh0aGlzLCBfbl9mZWF0dXJlcykgPiBNQVhfRkVBVFVSRVMgJiYgbWF4WCAtIG1pblggPiBNQVhfV0lORE9XKSB7CiAgICAgIGNvbnN0IGRpZmYgPSBtYXhYIC0gbWluWDsKICAgICAgY29uc3Qgd2luZG93U2l6ZSA9IDVlNDsKICAgICAgY29uc3Qgbl9zYW1wbGVzID0gMTAwOwogICAgICBjb25zdCB0b3RhbEJpbnMgPSBNYXRoLmZsb29yKGRpZmYgLyB3aW5kb3dTaXplKTsKICAgICAgY29uc3Qgc2VsZWN0ZWRCaW5zID0gbWFrZVJhbmRvbVNvcnRlZEFycmF5KG5fc2FtcGxlcywgdG90YWxCaW5zKTsKICAgICAgY29uc3QgYmluTGluZXMgPSBzZWxlY3RlZEJpbnMubWFwKChiaW4pID0+IHsKICAgICAgICBjb25zdCBiaW5TdGFydCA9IG1pblggKyBiaW4gKiB3aW5kb3dTaXplOwogICAgICAgIGNvbnN0IGJpbkVuZCA9IGJpblN0YXJ0ICsgd2luZG93U2l6ZTsKICAgICAgICByZXR1cm4gX19wcml2YXRlTWV0aG9kKHRoaXMsIF9nZXRMaW5lUHJvbWlzZXMsIGdldExpbmVQcm9taXNlc19mbikuY2FsbCh0aGlzLCBiaW5TdGFydCwgYmluRW5kKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBiaW5MaW5lcy5mbGF0KCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGN1bVBvcyBvZiBjdW1Qb3NpdGlvbnMpIHsKICAgICAgY29uc3QgY2hyb21OYW1lID0gY3VtUG9zLmNocjsKICAgICAgY29uc3QgY2hyb21TdGFydCA9IGN1bVBvcy5wb3M7CiAgICAgIGNvbnN0IGNocm9tRW5kID0gY3VtUG9zLnBvcyArIGNocm9tTGVuZ3Roc1tjaHJvbU5hbWVdOwogICAgICBsZXQgc3RhcnRQb3MsIGVuZFBvczsKICAgICAgaWYgKGNocm9tU3RhcnQgPiBjdXJNaW5YIHx8IGN1ck1pblggPj0gY2hyb21FbmQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBsaW5lUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgY29uc3QgbGluZXMgPSBbXTsKICAgICAgICBjb25zdCBsaW5lQ2FsbGJhY2sgPSAobGluZSkgPT4gewogICAgICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgICB9OwogICAgICAgIGlmIChtYXhYID4gY2hyb21FbmQpIHsKICAgICAgICAgIHN0YXJ0UG9zID0gY3VyTWluWCAtIGNocm9tU3RhcnQ7CiAgICAgICAgICBlbmRQb3MgPSBjaHJvbUVuZCAtIGNocm9tU3RhcnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXJ0UG9zID0gTWF0aC5mbG9vcihjdXJNaW5YIC0gY2hyb21TdGFydCk7CiAgICAgICAgICBlbmRQb3MgPSBNYXRoLmNlaWwobWF4WCAtIGNocm9tU3RhcnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnRiaS5nZXRMaW5lcyhjaHJvbU5hbWUsIHN0YXJ0UG9zLCBlbmRQb3MsIGxpbmVDYWxsYmFjaykudGhlbigoKSA9PiB7CiAgICAgICAgICByZXNvbHZlKGxpbmVzKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIGxpbmVQcm9taXNlcy5wdXNoKGxpbmVQcm9taXNlKTsKICAgICAgaWYgKG1heFggPD0gY2hyb21FbmQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjdXJNaW5YID0gY2hyb21FbmQ7CiAgICB9CiAgICByZXR1cm4gbGluZVByb21pc2VzOwogIH07CiAgY29uc3QgZ2ZmRmlsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGNvbnN0IHRpbGVWYWx1ZXMgPSB7fTsKICBjb25zdCBkYXRhU291cmNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgZnVuY3Rpb24gaW5pdCh1aWQsIGJlZCwgY2hyb21TaXplcywgb3B0aW9ucyA9IHt9KSB7CiAgICBsZXQgZ2ZmRmlsZSA9IGdmZkZpbGVzLmdldChiZWQudXJsKTsKICAgIGlmICghZ2ZmRmlsZSkgewogICAgICBnZmZGaWxlID0gR2ZmRmlsZS5mcm9tVXJsKGJlZC51cmwsIGJlZC5pbmRleFVybCwgdWlkKTsKICAgIH0KICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShnZmZGaWxlLCBjaHJvbVNpemVzLCB7CiAgICAgIHNhbXBsZUxlbmd0aDogMWUzLAogICAgICAuLi5vcHRpb25zCiAgICB9KTsKICAgIGRhdGFTb3VyY2VzLnNldCh1aWQsIGRhdGFTb3VyY2UpOwogIH0KICBjb25zdCB0aWxlc2V0SW5mbyA9ICh1aWQpID0+IHsKICAgIHJldHVybiBkYXRhU291cmNlcy5nZXQodWlkKS50aWxlc2V0SW5mbzsKICB9OwogIGNvbnN0IHRpbGUgPSBhc3luYyAodWlkLCB6LCB4KSA9PiB7CiAgICBjb25zdCBzb3VyY2UgPSBkYXRhU291cmNlcy5nZXQodWlkKTsKICAgIGNvbnN0IENBQ0hFX0tFWSA9IGAke3VpZH0uJHt6fS4ke3h9YDsKICAgIHRpbGVWYWx1ZXNbQ0FDSEVfS0VZXSA9IFtdOwogICAgY29uc3QgdGlsZVdpZHRoID0gK3NvdXJjZS50aWxlc2V0SW5mby5tYXhfd2lkdGggLyAyICoqICt6OwogICAgY29uc3QgbWluWCA9IHNvdXJjZS50aWxlc2V0SW5mby5taW5fcG9zWzBdICsgeCAqIHRpbGVXaWR0aDsKICAgIGNvbnN0IG1heFggPSBzb3VyY2UudGlsZXNldEluZm8ubWluX3Bvc1swXSArICh4ICsgMSkgKiB0aWxlV2lkdGg7CiAgICB0aWxlVmFsdWVzW0NBQ0hFX0tFWV0gPSBhd2FpdCBzb3VyY2UuZmlsZS5nZXRUaWxlRGF0YShtaW5YLCBtYXhYKTsKICAgIHJldHVybiBbXTsKICB9OwogIGNvbnN0IGZldGNoVGlsZXNEZWJvdW5jZWQgPSBhc3luYyAodWlkLCB0aWxlSWRzKSA9PiB7CiAgICBjb25zdCB0aWxlcyA9IHt9OwogICAgY29uc3QgdmFsaWRUaWxlSWRzID0gW107CiAgICBjb25zdCB0aWxlUHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgdGlsZUlkIG9mIHRpbGVJZHMpIHsKICAgICAgY29uc3QgcGFydHMgPSB0aWxlSWQuc3BsaXQoIi4iKTsKICAgICAgY29uc3QgeiA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7CiAgICAgIGNvbnN0IHggPSBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICBpZiAoTnVtYmVyLmlzTmFOKHgpIHx8IE51bWJlci5pc05hTih6KSkgewogICAgICAgIGNvbnNvbGUud2FybigiSW52YWxpZCB0aWxlIHpvb20gb3IgcG9zaXRpb246IiwgeiwgeCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmFsaWRUaWxlSWRzLnB1c2godGlsZUlkKTsKICAgICAgdGlsZVByb21pc2VzLnB1c2godGlsZSh1aWQsIHosIHgpKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbCh0aWxlUHJvbWlzZXMpLnRoZW4oKHZhbHVlczIpID0+IHsKICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHZhbHVlczIubGVuZ3RoOyBpMisrKSB7CiAgICAgICAgY29uc3QgdmFsaWRUaWxlSWQgPSB2YWxpZFRpbGVJZHNbaTJdOwogICAgICAgIHRpbGVzW3ZhbGlkVGlsZUlkXSA9IHsgdGlsZVBvc2l0aW9uSWQ6IHZhbGlkVGlsZUlkIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbGVzOwogICAgfSk7CiAgfTsKICBjb25zdCBnZXRUYWJ1bGFyRGF0YSA9ICh1aWQsIHRpbGVJZHMpID0+IHsKICAgIGNvbnN0IGRhdGEgPSBbXTsKICAgIHRpbGVJZHMuZm9yRWFjaCgodGlsZUlkKSA9PiB7CiAgICAgIGNvbnN0IHBhcnRzID0gdGlsZUlkLnNwbGl0KCIuIik7CiAgICAgIGNvbnN0IHogPSBwYXJzZUludChwYXJ0c1swXSwgMTApOwogICAgICBjb25zdCB4ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsKICAgICAgY29uc3QgdGlsZVZhbHVlID0gdGlsZVZhbHVlc1tgJHt1aWR9LiR7en0uJHt4fWBdOwogICAgICBpZiAoIXRpbGVWYWx1ZSkgewogICAgICAgIGNvbnNvbGUud2FybihgTm8gdGlsZSBkYXRhIGNvbnN0cnVjdGVkICgke3RpbGVJZH0pYCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKHRpbGVWYWx1ZSk7CiAgICB9KTsKICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdC52YWx1ZXMoZGF0YSkuZmxhdCgpOwogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShvdXRwdXQpKS5idWZmZXI7CiAgICByZXR1cm4gVHJhbnNmZXIoYnVmZmVyMiwgW2J1ZmZlcjJdKTsKICB9OwogIGNvbnN0IHRpbGVGdW5jdGlvbnMgPSB7CiAgICBpbml0LAogICAgdGlsZXNldEluZm8sCiAgICBmZXRjaFRpbGVzRGVib3VuY2VkLAogICAgdGlsZSwKICAgIGdldFRhYnVsYXJEYXRhCiAgfTsKICBleHBvc2UodGlsZUZ1bmN0aW9ucyk7Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPS9hc3NldHMvZ2ZmLXdvcmtlci43MTcwYjMxYS5qcy5tYXA=";
187508
187508
  var blob$1 = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs$1)], { type: "text/javascript;charset=utf-8" });
187509
187509
  function WorkerWrapper$1() {
187510
187510
  const objURL = blob$1 && (window.URL || window.webkitURL).createObjectURL(blob$1);