@vonage/ml-transformers 5.1.1 → 5.1.2
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.
|
@@ -21858,7 +21858,7 @@ class z2 {
|
|
|
21858
21858
|
};
|
|
21859
21859
|
}
|
|
21860
21860
|
}
|
|
21861
|
-
const j2 = "5.1.
|
|
21861
|
+
const j2 = "5.1.2";
|
|
21862
21862
|
class No {
|
|
21863
21863
|
constructor() {
|
|
21864
21864
|
gt(this, "canvas");
|
|
@@ -24090,7 +24090,11 @@ class oc extends co {
|
|
|
24090
24090
|
gt(this, "backgroundImageResizerCanvas");
|
|
24091
24091
|
gt(this, "backgroundImageResizerContext");
|
|
24092
24092
|
gt(this, "backgroundImageResizer");
|
|
24093
|
-
this.pipeline = new ec(this.context)
|
|
24093
|
+
this.pipeline = new ec(this.context);
|
|
24094
|
+
const r = new OffscreenCanvas(0, 0), f = r.getContext("webgl2");
|
|
24095
|
+
if (!f)
|
|
24096
|
+
throw "Fail to retrieve webgl context";
|
|
24097
|
+
this.backgroundImageResizerCanvas = r, this.backgroundImageResizerContext = f, this.backgroundImageResizer = new i3(
|
|
24094
24098
|
this.backgroundImageResizerContext,
|
|
24095
24099
|
0,
|
|
24096
24100
|
0
|
|
@@ -24576,7 +24580,7 @@ let wo = ds;
|
|
|
24576
24580
|
(() => {
|
|
24577
24581
|
y2("ProcessorWorker", ds);
|
|
24578
24582
|
})();
|
|
24579
|
-
const sc = "dmFyICRsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgV2w9KEosUSxWKT0+USBpbiBKPyRsKEosUSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Vn0pOkpbUV09Vjt2YXIgbD0oSixRLFYpPT4oV2woSix0eXBlb2YgUSE9InN5bWJvbCI/USsiIjpRLFYpLFYpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBKKHIsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCB0PWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHRbcl18fCh0W3JdPWUpLHRbcl19Y29uc3QgUT1KKCJnbG9iYWxzIix7fSk7dmFyIFY9KHI9PihyLklOSVQ9IklOSVQiLHIuRk9SV0FSRD0iRk9SV0FSRCIsci5URVJNSU5BVEU9IlRFUk1JTkFURSIsci5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIsci5FVkVOVD0iRVZFTlQiLHIpKShWfHx7fSk7ZnVuY3Rpb24gR2kocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKHQ9PnIgaW5zdGFuY2VvZiB0KX1mdW5jdGlvbiBVZShyLGUpe2NvbnN0e2lkOnQsdHlwZTpufT1yLGk9QXJyYXkuaXNBcnJheShlKT9lOltlXTtwb3N0TWVzc2FnZSh7aWQ6dCx0eXBlOm4scmVzdWx0OmV9LGkuZmlsdGVyKG89PkdpKG8pKSl9Sigid29ya2VyaXplZCIse30pO2Z1bmN0aW9uIFlyKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1mdW5jdGlvbiBldChyLGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZS5zcGxpY2UoMCxlLmxlbmd0aCk7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpZm9yKGNvbnN0IHQgaW4gZSlkZWxldGUgZVt0XTtmb3IoY29uc3QgdCBpbiByKUFycmF5LmlzQXJyYXkoclt0XSk/KGVbdF09W10sZXQoclt0XSxlW3RdKSk6dHlwZW9mIHJbdF09PSJvYmplY3QiPyhlW3RdPXt9LGV0KHJbdF0sZVt0XSkpOmVbdF09clt0XX1jb25zdCB0ZT1uZXcgV2Vha01hcCxoZT1uZXcgV2Vha01hcCxaPW5ldyBXZWFrTWFwLHR0PVN5bWJvbCgiYW55UHJvZHVjZXIiKSxYcj1Qcm9taXNlLnJlc29sdmUoKSxydD1TeW1ib2woImxpc3RlbmVyQWRkZWQiKSxudD1TeW1ib2woImxpc3RlbmVyUmVtb3ZlZCIpO2xldCBpdD0hMSxIdD0hMTtmdW5jdGlvbiBBZShyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIiYmdHlwZW9mIHIhPSJudW1iZXIiKXRocm93IG5ldyBUeXBlRXJyb3IoImBldmVudE5hbWVgIG11c3QgYmUgYSBzdHJpbmcsIHN5bWJvbCwgb3IgbnVtYmVyIil9ZnVuY3Rpb24gb3Qocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gSWUocixlKXtjb25zdCB0PWhlLmdldChyKTtpZighIXQuaGFzKGUpKXJldHVybiB0LmdldChlKX1mdW5jdGlvbiBOZShyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCJ8fHR5cGVvZiBlPT0ibnVtYmVyIj9lOnR0LG49Wi5nZXQocik7aWYoISFuLmhhcyh0KSlyZXR1cm4gbi5nZXQodCl9ZnVuY3Rpb24gJGkocixlLHQpe2NvbnN0IG49Wi5nZXQocik7aWYobi5oYXMoZSkpZm9yKGNvbnN0IGkgb2Ygbi5nZXQoZSkpaS5lbnF1ZXVlKHQpO2lmKG4uaGFzKHR0KSl7Y29uc3QgaT1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygbi5nZXQodHQpKW8uZW5xdWV1ZShpKX19ZnVuY3Rpb24gUXIocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEsbj0oKT0+e30saT1bXTtjb25zdCBvPXtlbnF1ZXVlKHMpe2kucHVzaChzKSxuKCl9LGZpbmlzaCgpe3Q9ITAsbigpfX07Zm9yKGNvbnN0IHMgb2YgZSl7bGV0IGE9TmUocixzKTthfHwoYT1uZXcgU2V0LFouZ2V0KHIpLnNldChzLGEpKSxhLmFkZChvKX1yZXR1cm57YXN5bmMgbmV4dCgpe3JldHVybiBpP2kubGVuZ3RoPT09MD90PyhpPXZvaWQgMCx0aGlzLm5leHQoKSk6KGF3YWl0IG5ldyBQcm9taXNlKHM9PntuPXN9KSx0aGlzLm5leHQoKSk6e2RvbmU6ITEsdmFsdWU6YXdhaXQgaS5zaGlmdCgpfTp7ZG9uZTohMH19LGFzeW5jIHJldHVybihzKXtpPXZvaWQgMDtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCB1PU5lKHIsYSk7dSYmKHUuZGVsZXRlKG8pLHUuc2l6ZT09PTAmJlouZ2V0KHIpLmRlbGV0ZShhKSl9cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgc306e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBxcihyKXtpZihyPT09dm9pZCAwKXJldHVybiBLcjtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIUtyLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgU2U9cj0+cj09PXJ0fHxyPT09bnQ7ZnVuY3Rpb24gc3QocixlLHQpe2lmKFNlKGUpKXRyeXtpdD0hMCxyLmVtaXQoZSx0KX1maW5hbGx5e2l0PSExfX1jbGFzcyBSZXtzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1xcih0KSxuPT57aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBzIG9mIHQpaWYobi5wcm90b3R5cGVbc10hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke3N9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIGkoKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgUmV9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDppfSk7Y29uc3Qgbz1zPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtzXSguLi5hKX07Zm9yKGNvbnN0IHMgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUscyx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKHMpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXt2YXIgZSx0O2lmKHR5cGVvZigoZT1nbG9iYWxUaGlzLnByb2Nlc3MpPT1udWxsP3ZvaWQgMDplLmVudikhPSJvYmplY3QiKXJldHVybiBIdDtjb25zdHtlbnY6bn09KHQ9Z2xvYmFsVGhpcy5wcm9jZXNzKSE9bnVsbD90OntlbnY6e319O3JldHVybiBuLkRFQlVHPT09ImVtaXR0ZXJ5Inx8bi5ERUJVRz09PSIqInx8SHR9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtIdD1lfWNvbnN0cnVjdG9yKGU9e30pe3ZhciB0O3RlLnNldCh0aGlzLG5ldyBTZXQpLGhlLnNldCh0aGlzLG5ldyBNYXApLFouc2V0KHRoaXMsbmV3IE1hcCksWi5nZXQodGhpcykuc2V0KHR0LG5ldyBTZXQpLHRoaXMuZGVidWc9KHQ9ZS5kZWJ1ZykhPW51bGw/dDp7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KG4saSxvLHMpPT57dHJ5e3M9SlNPTi5zdHJpbmdpZnkocyl9Y2F0Y2h7cz1gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzIGZhaWxlZCB0byBzdHJpbmdpZnk6ICR7T2JqZWN0LmtleXMocykuam9pbigiLCIpfWB9KHR5cGVvZiBvPT0ic3ltYm9sInx8dHlwZW9mIG89PSJudW1iZXIiKSYmKG89by50b1N0cmluZygpKTtjb25zdCBhPW5ldyBEYXRlLHU9YCR7YS5nZXRIb3VycygpfToke2EuZ2V0TWludXRlcygpfToke2EuZ2V0U2Vjb25kcygpfS4ke2EuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7dX1dW2VtaXR0ZXJ5OiR7bn1dWyR7aX1dIEV2ZW50IE5hbWU6ICR7b30KCWRhdGE6ICR7c31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxuKXsoUmUuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtvdCh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSl7QWUobik7bGV0IGk9SWUodGhpcyxuKTtpfHwoaT1uZXcgU2V0LGhlLmdldCh0aGlzKS5zZXQobixpKSksaS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksU2Uobil8fHN0KHRoaXMscnQse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KX1yZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7b3QodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpe0FlKG4pO2NvbnN0IGk9SWUodGhpcyxuKTtpJiYoaS5kZWxldGUodCksaS5zaXplPT09MCYmaGUuZ2V0KHRoaXMpLmRlbGV0ZShuKSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxTZShuKXx8c3QodGhpcyxudCx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfX1vbmNlKGUpe2xldCB0O2NvbnN0IG49bmV3IFByb21pc2UoaT0+e3Q9dGhpcy5vbihlLG89Pnt0KCksaShvKX0pfSk7cmV0dXJuIG4ub2ZmPXQsbn1ldmVudHMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpQWUodCk7cmV0dXJuIFFyKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe3ZhciBuO2lmKEFlKGUpLFNlKGUpJiYhaXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiYGV2ZW50TmFtZWAgY2Fubm90IGJlIG1ldGEgZXZlbnQgYGxpc3RlbmVyQWRkZWRgIG9yIGBsaXN0ZW5lclJlbW92ZWRgIik7dGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSwkaSh0aGlzLGUsdCk7Y29uc3QgaT0obj1JZSh0aGlzLGUpKSE9bnVsbD9uOm5ldyBTZXQsbz10ZS5nZXQodGhpcykscz1bLi4uaV0sYT1TZShlKT9bXTpbLi4ub107YXdhaXQgWHIsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnMubWFwKGFzeW5jIHU9PntpZihpLmhhcyh1KSlyZXR1cm4gdSh0KX0pLC4uLmEubWFwKGFzeW5jIHU9PntpZihvLmhhcyh1KSlyZXR1cm4gdShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7dmFyIG47aWYoQWUoZSksU2UoZSkmJiFpdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgZXZlbnROYW1lYCBjYW5ub3QgYmUgbWV0YSBldmVudCBgbGlzdGVuZXJBZGRlZGAgb3IgYGxpc3RlbmVyUmVtb3ZlZGAiKTt0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IGk9KG49SWUodGhpcyxlKSkhPW51bGw/bjpuZXcgU2V0LG89dGUuZ2V0KHRoaXMpLHM9Wy4uLmldLGE9Wy4uLm9dO2F3YWl0IFhyO2Zvcihjb25zdCB1IG9mIHMpaS5oYXModSkmJmF3YWl0IHUodCk7Zm9yKGNvbnN0IHUgb2YgYSlvLmhhcyh1KSYmYXdhaXQgdShlLHQpfW9uQW55KGUpe3JldHVybiBvdChlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRlLmdldCh0aGlzKS5hZGQoZSksc3QodGhpcyxydCx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBRcih0aGlzKX1vZmZBbnkoZSl7b3QoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHN0KHRoaXMsbnQse2xpc3RlbmVyOmV9KSx0ZS5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCJ8fHR5cGVvZiB0PT0ibnVtYmVyIil7Y29uc3Qgbj1JZSh0aGlzLHQpO24mJm4uY2xlYXIoKTtjb25zdCBpPU5lKHRoaXMsdCk7aWYoaSl7Zm9yKGNvbnN0IG8gb2YgaSlvLmZpbmlzaCgpO2kuY2xlYXIoKX19ZWxzZXt0ZS5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3RbbixpXW9mIGhlLmdldCh0aGlzKS5lbnRyaWVzKCkpaS5jbGVhcigpLGhlLmdldCh0aGlzKS5kZWxldGUobik7Zm9yKGNvbnN0W24saV1vZiBaLmdldCh0aGlzKS5lbnRyaWVzKCkpe2Zvcihjb25zdCBvIG9mIGkpby5maW5pc2goKTtpLmNsZWFyKCksWi5nZXQodGhpcykuZGVsZXRlKG4pfX19bGlzdGVuZXJDb3VudChlKXt2YXIgdCxuLGksbyxzLGE7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB1PTA7Zm9yKGNvbnN0IGYgb2YgZSl7aWYodHlwZW9mIGY9PSJzdHJpbmciKXt1Kz10ZS5nZXQodGhpcykuc2l6ZSsoKG49KHQ9SWUodGhpcyxmKSk9PW51bGw/dm9pZCAwOnQuc2l6ZSkhPW51bGw/bjowKSsoKG89KGk9TmUodGhpcyxmKSk9PW51bGw/dm9pZCAwOmkuc2l6ZSkhPW51bGw/bzowKSsoKGE9KHM9TmUodGhpcykpPT1udWxsP3ZvaWQgMDpzLnNpemUpIT1udWxsP2E6MCk7Y29udGludWV9dHlwZW9mIGY8InUiJiZBZShmKSx1Kz10ZS5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgZCBvZiBoZS5nZXQodGhpcykudmFsdWVzKCkpdSs9ZC5zaXplO2Zvcihjb25zdCBkIG9mIFouZ2V0KHRoaXMpLnZhbHVlcygpKXUrPWQuc2l6ZX1yZXR1cm4gdX1iaW5kTWV0aG9kcyhlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXFyKHQpO2Zvcihjb25zdCBuIG9mIHQpe2lmKGVbbl0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke259XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITEsdmFsdWU6dGhpc1tuXS5iaW5kKHRoaXMpfSl9fX1jb25zdCBLcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhSZS5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6cnQsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmUsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOm50LHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7ZnVuY3Rpb24gV2kocil7cmV0dXJuIHIub25BbnkmJnIuZW1pdH1hc3luYyBmdW5jdGlvbiBWaShyLGUpe2NvbnN0e2Z1bmN0aW9uTmFtZTp0LGFyZ3M6bn09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2lmKCF0KXRocm93Im1pc3NpbmcgZnVuY3Rpb24gbmFtZSB0byBjYWxsIjtpZighZS5pbnN0YW5jZVt0XSl0aHJvd2B1bmRlZmluZWQgZnVuY3Rpb24gWyR7dH1dIGluIGNsYXNzICR7ZS5pbnN0YW5jZS5jb25zdHJ1Y3Rvci53b3JrZXJJZH1gO1VlKHIsYXdhaXQgZS5pbnN0YW5jZVt0XSguLi5uIT1udWxsP246W10pKX1jb25zdCBKcj1KKCJyZWdpc3RlcmVkV29ya2VycyIse30pO2Z1bmN0aW9uIEhpKHIsZSl7ZS53b3JrZXJJZD1yLFlyKCkmJihKcltlLndvcmtlcklkXT1lKX1mdW5jdGlvbiBqaShyLGUpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBjbGFzc05hbWUgd2hpbGUgaW5pdGlhbGl6aW5nIHdvcmtlciI7Y29uc3RbdCxuXT1yLmFyZ3MsaT1Kclt0XTtpZihpKWUuaW5zdGFuY2U9bmV3IGkoci5hcmdzLnNsaWNlKDEpKTtlbHNlIHRocm93YHVua25vd24gd29ya2VyIGNsYXNzICR7dH1gO2V0KG4sUSksV2koZS5pbnN0YW5jZSkmJmUuaW5zdGFuY2Uub25BbnkoKG8scyk9PntVZSh7dHlwZTpWLkVWRU5UfSx7bmFtZTpvLGRhdGE6c30pfSksVWUocix0eXBlb2YgZS5pbnN0YW5jZSE9PXZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gWWkocixlKXtjb25zdHthcmdzOnR9PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtsZXQgbjtlLmluc3RhbmNlLnRlcm1pbmF0ZSYmKG49YXdhaXQgZS5pbnN0YW5jZS50ZXJtaW5hdGUoLi4udCE9bnVsbD90OltdKSksVWUocixuKX1mdW5jdGlvbiBYaShyKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgZ2xvYmFscyB3aGlsZSBzeW5jaW5nIjtldChyLmFyZ3NbMF0sUSksVWUocix7fSl9ZnVuY3Rpb24gUWkoKXtjb25zdCByPXt9O29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSBWLklOSVQ6amkodCxyKTticmVhaztjYXNlIFYuRk9SV0FSRDpWaSh0LHIpO2JyZWFrO2Nhc2UgVi5URVJNSU5BVEU6WWkodCxyKTticmVhaztjYXNlIFYuR0xPQkFMU19TWU5DOlhpKHQpO2JyZWFrfX19WXIoKSYmUWkoKTt2YXIgcWk9T2JqZWN0LmRlZmluZVByb3BlcnR5LEtpPShyLGUsdCk9PmUgaW4gcj9xaShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpyW2VdPXQsdz0ocixlLHQpPT4oS2kocix0eXBlb2YgZSE9InN5bWJvbCI/ZSsiIjplLHQpLHQpO2NsYXNzIGVle313KGVlLCJ1cGRhdGVzIix7dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSksdyhlZSwiZXJyb3JzIix7dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifSk7Y29uc3QgcmU9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsTGU9bmV3IFdlYWtNYXAsanQ9U3ltYm9sKCJhbnlQcm9kdWNlciIpLFpyPVByb21pc2UucmVzb2x2ZSgpLHV0PVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLGN0PVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IFl0PSExO2Z1bmN0aW9uIEZlKHIpe2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdHlwZW9mIHIhPSJzeW1ib2wiKXRocm93IG5ldyBUeXBlRXJyb3IoImV2ZW50TmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sIil9ZnVuY3Rpb24gZnQocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gUGUocixlKXtjb25zdCB0PWF0LmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gemUocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6anQsbj1MZS5nZXQocik7cmV0dXJuIG4uaGFzKHQpfHxuLnNldCh0LG5ldyBTZXQpLG4uZ2V0KHQpfWZ1bmN0aW9uIEppKHIsZSx0KXtjb25zdCBuPUxlLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgaSBvZiBuLmdldChlKSlpLmVucXVldWUodCk7aWYobi5oYXMoanQpKXtjb25zdCBpPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgbyBvZiBuLmdldChqdCkpby5lbnF1ZXVlKGkpfX1mdW5jdGlvbiBlbihyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxpPVtdO2NvbnN0IG89e2VucXVldWUocyl7aS5wdXNoKHMpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgcyBvZiBlKXplKHIscykuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIGk/aS5sZW5ndGg9PT0wP3Q/KGk9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2Uocz0+e249c30pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBpLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKHMpe2k9dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpemUocixhKS5kZWxldGUobyk7cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgc306e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiB0bihyKXtpZihyPT09dm9pZCAwKXJldHVybiBybjtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIXJuLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgWHQ9cj0+cj09PXV0fHxyPT09Y3Q7Y2xhc3MgbWV7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9dG4odCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgcyBvZiB0KWlmKG4ucHJvdG90eXBlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBpKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IG1lfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6aX0pO2NvbnN0IG89cz0+ZnVuY3Rpb24oLi4uYSl7cmV0dXJuIHRoaXNbZV1bc10oLi4uYSl9O2Zvcihjb25zdCBzIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLHMse2VudW1lcmFibGU6ITEsdmFsdWU6byhzKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBZdDtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxZdH1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe1l0PWV9Y29uc3RydWN0b3IoZT17fSl7cmUuc2V0KHRoaXMsbmV3IFNldCksYXQuc2V0KHRoaXMsbmV3IE1hcCksTGUuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixpLG8pPT57dHJ5e289SlNPTi5zdHJpbmdpZnkobyl9Y2F0Y2h7bz1gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzIGZhaWxlZCB0byBzdHJpbmdpZnk6ICR7T2JqZWN0LmtleXMobykuam9pbigiLCIpfWB9dHlwZW9mIGk9PSJzeW1ib2wiJiYoaT1pLnRvU3RyaW5nKCkpO2NvbnN0IHM9bmV3IERhdGUsYT1gJHtzLmdldEhvdXJzKCl9OiR7cy5nZXRNaW51dGVzKCl9OiR7cy5nZXRTZWNvbmRzKCl9LiR7cy5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHthfV1bZW1pdHRlcnk6JHt0fV1bJHtufV0gRXZlbnQgTmFtZTogJHtpfQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LG4peyhtZS5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUsdCxuKX1vbihlLHQpe2Z0KHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKUZlKG4pLFBlKHRoaXMsbikuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLFh0KG4pfHx0aGlzLmVtaXQodXQse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7ZnQodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpRmUobiksUGUodGhpcyxuKS5kZWxldGUodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxYdChuKXx8dGhpcy5lbWl0KGN0LHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IG49dGhpcy5vbihlLGk9PntuKCksdChpKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUZlKHQpO3JldHVybiBlbih0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtGZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0IixlLHQpLEppKHRoaXMsZSx0KTtjb25zdCBuPVBlKHRoaXMsZSksaT1yZS5nZXQodGhpcyksbz1bLi4ubl0scz1YdChlKT9bXTpbLi4uaV07YXdhaXQgWnIsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm8ubWFwKGFzeW5jIGE9PntpZihuLmhhcyhhKSlyZXR1cm4gYSh0KX0pLC4uLnMubWFwKGFzeW5jIGE9PntpZihpLmhhcyhhKSlyZXR1cm4gYShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7RmUoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdFNlcmlhbCIsZSx0KTtjb25zdCBuPVBlKHRoaXMsZSksaT1yZS5nZXQodGhpcyksbz1bLi4ubl0scz1bLi4uaV07YXdhaXQgWnI7Zm9yKGNvbnN0IGEgb2YgbyluLmhhcyhhKSYmYXdhaXQgYSh0KTtmb3IoY29uc3QgYSBvZiBzKWkuaGFzKGEpJiZhd2FpdCBhKGUsdCl9b25BbnkoZSl7cmV0dXJuIGZ0KGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCkscmUuZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQodXQse2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gZW4odGhpcyl9b2ZmQW55KGUpe2Z0KGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSx0aGlzLmVtaXQoY3Qse2xpc3RlbmVyOmV9KSxyZS5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe1BlKHRoaXMsdCkuY2xlYXIoKTtjb25zdCBuPXplKHRoaXMsdCk7Zm9yKGNvbnN0IGkgb2YgbilpLmZpbmlzaCgpO24uY2xlYXIoKX1lbHNle3JlLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBuIG9mIGF0LmdldCh0aGlzKS52YWx1ZXMoKSluLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgTGUuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgaSBvZiBuKWkuZmluaXNoKCk7bi5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXtpZih0eXBlb2Ygbj09InN0cmluZyIpe3QrPXJlLmdldCh0aGlzKS5zaXplK1BlKHRoaXMsbikuc2l6ZSt6ZSh0aGlzLG4pLnNpemUremUodGhpcykuc2l6ZTtjb250aW51ZX10eXBlb2YgbjwidSImJkZlKG4pLHQrPXJlLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBpIG9mIGF0LmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1pLnNpemU7Zm9yKGNvbnN0IGkgb2YgTGUuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPWkuc2l6ZX1yZXR1cm4gdH1iaW5kTWV0aG9kcyhlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXRuKHQpO2Zvcihjb25zdCBuIG9mIHQpe2lmKGVbbl0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke259XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITEsdmFsdWU6dGhpc1tuXS5iaW5kKHRoaXMpfSl9fX1jb25zdCBybj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtZS5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6dXQsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobWUsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOmN0LHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7dmFyIFF0PW1lO2Z1bmN0aW9uIFppKHIpe3JldHVybiB0eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsJiYibWVzc2FnZSJpbiByJiZ0eXBlb2Ygci5tZXNzYWdlPT0ic3RyaW5nIn1mdW5jdGlvbiBlbyhyKXtpZihaaShyKSlyZXR1cm4gcjt0cnl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2h7cmV0dXJuIG5ldyBFcnJvcihTdHJpbmcocikpfX1mdW5jdGlvbiBxdChyKXtyZXR1cm4gZW8ocikubWVzc2FnZX12YXIgdG89T2JqZWN0LmRlZmluZVByb3BlcnR5LHJvPShyLGUsdCk9PmUgaW4gcj90byhyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpyW2VdPXQsbm89KHIsZSx0KT0+KHJvKHIsdHlwZW9mIGUhPSJzeW1ib2wiP2UrIiI6ZSx0KSx0KTtjb25zdCBpbz0iaGxnLnRva2JveC5jb20vcHJvZC9sb2dnaW5nL3ZjcF93ZWJydGMiLG9vPSJodHRwczovLyIsc289MWU0O2xldCBsdDtjb25zdCBhbz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gdW8oKXtpZighbHQmJihsdD10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byksIWx0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGx0KGFvKX1jb25zdCBDPVtdO2ZvcihsZXQgcj0wO3I8MjU2OysrcilDLnB1c2goKHIrMjU2KS50b1N0cmluZygxNikuc2xpY2UoMSkpO2Z1bmN0aW9uIGNvKHIsZT0wKXtyZXR1cm4oQ1tyW2UrMF1dK0NbcltlKzFdXStDW3JbZSsyXV0rQ1tyW2UrM11dKyItIitDW3JbZSs0XV0rQ1tyW2UrNV1dKyItIitDW3JbZSs2XV0rQ1tyW2UrN11dKyItIitDW3JbZSs4XV0rQ1tyW2UrOV1dKyItIitDW3JbZSsxMF1dK0NbcltlKzExXV0rQ1tyW2UrMTJdXStDW3JbZSsxM11dK0NbcltlKzE0XV0rQ1tyW2UrMTVdXSkudG9Mb3dlckNhc2UoKX1jb25zdCBmbz10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLnJhbmRvbVVVSUQmJmNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKSxubj17cmFuZG9tVVVJRDpmb307ZnVuY3Rpb24gbG8ocixlLHQpe2lmKG5uLnJhbmRvbVVVSUQmJiFlJiYhcilyZXR1cm4gbm4ucmFuZG9tVVVJRCgpO3I9cnx8e307Y29uc3Qgbj1yLnJhbmRvbXx8KHIucm5nfHx1bykoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKGxldCBpPTA7aTwxNjsrK2kpZVt0K2ldPW5baV07cmV0dXJuIGV9cmV0dXJuIGNvKG4pfWZ1bmN0aW9uIEt0KHIsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCB0PWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHRbcl18fCh0W3JdPWUpLHRbcl19Y29uc3QgbmU9S3QoImdsb2JhbHMiLHt9KTt2YXIgcGU9KHI9PihyLklOSVQ9IklOSVQiLHIuRk9SV0FSRD0iRk9SV0FSRCIsci5URVJNSU5BVEU9IlRFUk1JTkFURSIsci5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIscikpKHBlfHx7fSk7ZnVuY3Rpb24gb24ocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnIgaW5zdGFuY2VvZiBlKX1sZXQgaG89MDtmdW5jdGlvbiBtbyhyLGUsdCxuLGkpe2NvbnN0IG89aG8rKztyZXR1cm4gci5wb3N0TWVzc2FnZSh7aWQ6byx0eXBlOmUsZnVuY3Rpb25OYW1lOnQsYXJnczpufSxuLmZpbHRlcihzPT5vbihzKSkpLG5ldyBQcm9taXNlKHM9PntpPT1udWxsfHxpLnNldChvLHMpfSl9ZnVuY3Rpb24gR2UocixlKXtjb25zdHtpZDp0LHR5cGU6bn09cixpPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnQsdHlwZTpuLHJlc3VsdDplfSxpLmZpbHRlcihvPT5vbihvKSkpfWNvbnN0IHNuPUt0KCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gYW4oKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWFzeW5jIGZ1bmN0aW9uIHBvKCl7aWYoYW4oKSlHZSh7dHlwZTpwZS5HTE9CQUxTX1NZTkN9LG5lKTtlbHNle2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgaW4gc24pe2NvbnN0e3dvcmtlcjp0LHJlc29sdmVyczpufT1zbltlXS53b3JrZXJDb250ZXh0O3QmJnIucHVzaChtbyh0LHBlLkdMT0JBTFNfU1lOQywiIixbbmVdLG4pKX1hd2FpdCBQcm9taXNlLmFsbChyKX19ZnVuY3Rpb24gZHQocixlKXtpZihBcnJheS5pc0FycmF5KGUpKWUuc3BsaWNlKDAsZS5sZW5ndGgpO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcihjb25zdCB0IGluIGUpZGVsZXRlIGVbdF07Zm9yKGNvbnN0IHQgaW4gcilBcnJheS5pc0FycmF5KHJbdF0pPyhlW3RdPVtdLGR0KHJbdF0sZVt0XSkpOnR5cGVvZiByW3RdPT0ib2JqZWN0Ij8oZVt0XT17fSxkdChyW3RdLGVbdF0pKTplW3RdPXJbdF19YXN5bmMgZnVuY3Rpb24gZ28ocixlKXtjb25zdHtmdW5jdGlvbk5hbWU6dCxhcmdzOm59PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighdCl0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2VbdF0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3R9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDtHZShyLGF3YWl0IGUuaW5zdGFuY2VbdF0oLi4ubiE9bnVsbD9uOltdKSl9Y29uc3QgeW89S3QoInJlZ2lzdGVyZWRXb3JrZXJzIix7fSk7ZnVuY3Rpb24gYm8ocixlKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgY2xhc3NOYW1lIHdoaWxlIGluaXRpYWxpemluZyB3b3JrZXIiO2NvbnN0W3Qsbl09ci5hcmdzLGk9eW9bdF07aWYoaSllLmluc3RhbmNlPW5ldyBpKHIuYXJncy5zbGljZSgxKSk7ZWxzZSB0aHJvd2B1bmtub3duIHdvcmtlciBjbGFzcyAke3R9YDtkdChuLG5lKSxHZShyLHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBfbyhyLGUpe2NvbnN0e2FyZ3M6dH09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi50IT1udWxsP3Q6W10pKSxHZShyLG4pfWZ1bmN0aW9uIHhvKHIpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBnbG9iYWxzIHdoaWxlIHN5bmNpbmciO2R0KHIuYXJnc1swXSxuZSksR2Uocix7fSl9ZnVuY3Rpb24gdm8oKXtjb25zdCByPXt9O29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSBwZS5JTklUOmJvKHQscik7YnJlYWs7Y2FzZSBwZS5GT1JXQVJEOmdvKHQscik7YnJlYWs7Y2FzZSBwZS5URVJNSU5BVEU6X28odCxyKTticmVhaztjYXNlIHBlLkdMT0JBTFNfU1lOQzp4byh0KTticmVha319fWFuKCkmJnZvKCk7ZnVuY3Rpb24gRW8ocixlKXtyZXR1cm4gbmVbcl18fChuZVtyXT1lKSxbKCk9Pm5lW3JdLGFzeW5jIHQ9PntuZVtyXT10LGF3YWl0IHBvKCl9XX1mdW5jdGlvbiBUbyhyLGUpe3JldHVybiBFbyhyLGUpfWNvbnN0W3dvLEFvXT1UbygibWV0YWRhdGEiKTtmdW5jdGlvbiBJbyhyKXtBbyhyKX1mdW5jdGlvbiBKdCgpe3JldHVybiB3bygpfWNsYXNzIFp0e2NvbnN0cnVjdG9yKGUpe25vKHRoaXMsInV1aWQiLGxvKCkpLHRoaXMuY29uZmlnPWV9YXN5bmMgc2VuZChlKXt2YXIgdCxuLGk7Y29uc3R7YXBwSWQ6byxzb3VyY2VUeXBlOnN9PSh0PUp0KCkpIT1udWxsP3Q6e307aWYoIW98fCFzKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBhPW5ldyBBYm9ydENvbnRyb2xsZXIsdT1zZXRUaW1lb3V0KCgpPT5hLmFib3J0KCksc28pO3JldHVybiBhd2FpdCgoaT0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP2k6ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDphLnNpZ25hbH0pLGNsZWFyVGltZW91dCh1KSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHQ9KGU9SnQoKS5wcm94eVVybCkhPW51bGw/ZTpvbztyZXR1cm4gdCs9KHQuYXQoLTEpPT09Ii8iPyIiOiIvIikraW8sdH1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3QgdD1KdCgpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6dC5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDp0LnByb3h5VXJsLHNvdXJjZTp0LnNvdXJjZVR5cGV9fX1jb25zdCBodD0iMi4wLjMiO2NsYXNzIFNve2NvbnN0cnVjdG9yKGUpe3codGhpcywiZnJhbWVUcmFuc2Zvcm1lZENvdW50IiwwKSx3KHRoaXMsImZyYW1lRnJvbVNvdXJjZUNvdW50IiwwKSx3KHRoaXMsInN0YXJ0QXQiLDApLHcodGhpcywicmVwb3J0ZXIiKSx0aGlzLmNvbmZpZz1lLHRoaXMucmVwb3J0ZXI9bmV3IFp0KGUpfWFzeW5jIG9uRnJhbWVGcm9tU291cmNlKCl7dGhpcy5mcmFtZUZyb21Tb3VyY2VDb3VudCsrfWdldCBmcHMoKXtjb25zdHtzdGFydEF0OmUsZnJhbWVGcm9tU291cmNlQ291bnQ6dH09dGhpcyxuPShEYXRlLm5vdygpLWUpLzFlMztyZXR1cm4gdC9ufWFzeW5jIG9uRnJhbWVUcmFuc2Zvcm1lZChlPXt9LHQ9ITEpe3RoaXMuc3RhcnRBdD09PTAmJih0aGlzLnN0YXJ0QXQ9RGF0ZS5ub3coKSksdGhpcy5mcmFtZVRyYW5zZm9ybWVkQ291bnQrKztjb25zdHtzdGFydEF0Om4sZnJhbWVUcmFuc2Zvcm1lZENvdW50OmksZnJhbWVGcm9tU291cmNlQ291bnQ6b309dGhpcyxzPURhdGUubm93KCksYT0ocy1uKS8xZTMsdT1pL2EsZj1vL2E7cmV0dXJuIHR8fHRoaXMuZnJhbWVUcmFuc2Zvcm1lZENvdW50Pj10aGlzLmNvbmZpZy5sb2dnaW5nSW50ZXJ2YWxGcmFtZUNvdW50Pyh0aGlzLmZyYW1lRnJvbVNvdXJjZUNvdW50PTAsdGhpcy5mcmFtZVRyYW5zZm9ybWVkQ291bnQ9MCx0aGlzLnN0YXJ0QXQ9cyx0aGlzLnJlcG9ydGVyLmNvbmZpZz10aGlzLmNvbmZpZyx0aGlzLnJlcG9ydGVyLnNlbmQoey4uLnRoaXMuY29uZmlnLnJlcG9ydCx2YXJpYXRpb246IlFvUyIsZnBzOmYsdHJhbnNmb3JtZWRGcHM6dSxmcmFtZXNUcmFuc2Zvcm1lZDppLC4uLmV9KSk6InN1Y2Nlc3MifX12YXIgZXI9KHI9PihyLnBpcGVsaW5lX2VuZGVkPSJwaXBlbGluZV9lbmRlZCIsci5waXBlbGluZV9lbmRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9lbmRlZF93aXRoX2Vycm9yIixyLnBpcGVsaW5lX3N0YXJ0ZWQ9InBpcGVsaW5lX3N0YXJ0ZWQiLHIucGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiLHIucGlwZWxpbmVfcmVzdGFydGVkPSJwaXBlbGluZV9yZXN0YXJ0ZWQiLHIucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3I9InBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yIixyKSkoZXJ8fHt9KTtjb25zdCBSbz01MDAsRm89Ljg7Y2xhc3MgUG8gZXh0ZW5kcyBRdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCksdyh0aGlzLCJyZXBvcnRlcl8iLG5ldyBadCksdyh0aGlzLCJyZXBvcnRlclFvc18iLG5ldyBTbyh7bG9nZ2luZ0ludGVydmFsRnJhbWVDb3VudDpSbyxyZXBvcnQ6e3ZlcnNpb246aHR9fSkpLHcodGhpcywidHJhbnNmb3JtZXJUeXBlXyIpLHcodGhpcywidHJhbnNmb3JtZXJfIiksdyh0aGlzLCJzaG91bGRTdG9wXyIpLHcodGhpcywiaXNGbGFzaGVkXyIpLHcodGhpcywibWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXyIpLHcodGhpcywidmlkZW9IZWlnaHRfIiksdyh0aGlzLCJ2aWRlb1dpZHRoXyIpLHcodGhpcywidHJhY2tFeHBlY3RlZFJhdGVfIiksdyh0aGlzLCJpbmRleF8iKSx3KHRoaXMsImNvbnRyb2xsZXJfIiksdGhpcy5pbmRleF89dCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMudmlkZW9IZWlnaHRfPTAsdGhpcy52aWRlb1dpZHRoXz0wLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMudHJhbnNmb3JtZXJUeXBlXz0iQ3VzdG9tIiwiZ2V0VHJhbnNmb3JtZXJUeXBlImluIGUmJih0aGlzLnRyYW5zZm9ybWVyVHlwZV89ZS5nZXRUcmFuc2Zvcm1lclR5cGUoKSksdGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiQ3JlYXRlIn0pfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWV9YXN5bmMgc3RhcnQoZSl7aWYodGhpcy5jb250cm9sbGVyXz1lLHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe3RoaXMucmVwb3J0KHttZXNzYWdlOmVlLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCx2YXJpYXRpb246IkVycm9yIixlcnJvcjpxdCh0KX0pO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBuLGksbyxzO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShpPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9pOjApLHRoaXMucmVwb3J0ZXJRb3NfLm9uRnJhbWVGcm9tU291cmNlKCksdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyljb25zb2xlLndhcm4oIltQaXBlbGluZV0gZmx1c2ggZnJvbSB0cmFuc2Zvcm0iKSxlLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2V7dHJ5e2F3YWl0KChzPShvPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDpzLmNhbGwobyxlLHQpKSx0aGlzLnJlcG9ydFFvcygpfWNhdGNoKGEpe3RoaXMucmVwb3J0KHttZXNzYWdlOmVlLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0sdmFyaWF0aW9uOiJFcnJvciIsZXJyb3I6cXQoYSl9KTtjb25zdCB1PXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIix1KX1pZih0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKkZvPnRoaXMucmVwb3J0ZXJRb3NfLmZwcyl7Y29uc3QgYT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6ImZwc19kcm9wIixkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dGhpcy5yZXBvcnRlclFvc18uZnBzfX07dGhpcy5lbWl0KCJ3YXJuIixhKX19fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2godCl7dGhpcy5yZXBvcnQoe21lc3NhZ2U6ZWUuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoLHZhcmlhdGlvbjoiRXJyb3IiLGVycm9yOnF0KHQpfSk7Y29uc3Qgbj17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixuKX19dGhpcy5yZXBvcnRRb3MoITApLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkRlbGV0ZSJ9KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1yZXBvcnQoZSl7dGhpcy5yZXBvcnRlcl8uc2VuZCh7dmVyc2lvbjpodCxhY3Rpb246Ik1lZGlhVHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyVHlwZTp0aGlzLnRyYW5zZm9ybWVyVHlwZV8sLi4uZX0pfXJlcG9ydFFvcyhlPSExKXt0aGlzLnJlcG9ydGVyUW9zXy5jb25maWc9ey4uLnRoaXMucmVwb3J0ZXJRb3NfLmNvbmZpZ30sdGhpcy5yZXBvcnRlclFvc18ub25GcmFtZVRyYW5zZm9ybWVkKHt2ZXJzaW9uOmh0LGFjdGlvbjoiTWVkaWFUcmFuc2Zvcm1lciIsdHJhbnNmb3JtZXJUeXBlOnRoaXMudHJhbnNmb3JtZXJUeXBlXyx2aWRlb1dpZHRoOnRoaXMudmlkZW9XaWR0aF8sdmlkZW9IZWlnaHQ6dGhpcy52aWRlb0hlaWdodF99LGUpfX1jbGFzcyBrbyBleHRlbmRzIFF0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdyh0aGlzLCJ0cmFuc2Zvcm1lcnNfIiksdyh0aGlzLCJ0cmFja0V4cGVjdGVkUmF0ZV8iKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPW5ldyBQbyhlW3RdLHQpO24ub24oImVycm9yIixpPT57dGhpcy5lbWl0KCJlcnJvciIsaSl9KSxuLm9uKCJ3YXJuIixpPT57dGhpcy5lbWl0KCJ3YXJuIixpKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKG4pfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IG49ZTtmb3IobGV0IGkgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKGkpKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgbi5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX2VuZGVkIil9KS5jYXRjaChhc3luYyBpPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KGkpLGF3YWl0IG4uY2FuY2VsKGkpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIpfSl9Y2F0Y2h7dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiKSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkIiksY29uc29sZS5sb2coIltQaXBlbGluZV0gUGlwZWxpbmUgc3RhcnRlZC4iKX1hc3luYyBkZXN0cm95KCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gRGVzdHJveWluZyBQaXBlbGluZS4iKTtmb3IobGV0IGUgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWUuc3RvcCgpfX1jbGFzcyBEbyBleHRlbmRzIFF0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx3KHRoaXMsInJlcG9ydGVyXyIpLHcodGhpcywicGlwZWxpbmVfIiksdyh0aGlzLCJ0cmFuc2Zvcm1lcnNfIiksdyh0aGlzLCJyZWFkYWJsZV8iKSx3KHRoaXMsIndyaXRhYmxlXyIpLHcodGhpcywidHJhY2tFeHBlY3RlZFJhdGVfIiksdGhpcy5yZXBvcnRlcl89bmV3IFp0LHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkNyZWF0ZSJ9KX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUsdCl7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89dCx0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXt0aGlzLnJlcG9ydCh7bWVzc2FnZTplZS5lcnJvcnMudHJhbnNmb3JtZXJfbm9uZSx2YXJpYXRpb246IkVycm9yIn0pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe3RoaXMucmVwb3J0KHt2YXJpYXRpb246IkVycm9yIixtZXNzYWdlOmVlLmVycm9ycy5yZWFkYWJsZV9udWxsfSksdCgiW01lZGlhUHJvY2Vzc29yXSBSZWFkYWJsZSBpcyBudWxsLiIpO3JldHVybn1pZighdGhpcy53cml0YWJsZV8pe3RoaXMucmVwb3J0KHt2YXJpYXRpb246IkVycm9yIixtZXNzYWdlOmVlLmVycm9ycy53cml0YWJsZV9udWxsfSksdCgiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgbj0hMTt0aGlzLnBpcGVsaW5lXyYmKG49ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBrbyh0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixpPT57dGhpcy5lbWl0KCJ3YXJuIixpKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsaT0+e3RoaXMuZW1pdCgiZXJyb3IiLGkpfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIsaT0+e24mJihpPT09InBpcGVsaW5lX3N0YXJ0ZWQiP2k9ZXIucGlwZWxpbmVfcmVzdGFydGVkOmk9PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKGk9ZXIucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsaSl9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKGk9Pnt0KGkpfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7cmV0dXJuIHRoaXMucmVwb3J0KHt2YXJpYXRpb246IlVwZGF0ZSIsbWVzc2FnZTplZS51cGRhdGVzLnRyYW5zZm9ybWVyX25ld30pLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyBlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKSx0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJEZWxldGUifSksZSgpfSl9cmVwb3J0KGUpe3RoaXMucmVwb3J0ZXJfLnNlbmQoe3ZlcnNpb246aHQsYWN0aW9uOiJNZWRpYVByb2Nlc3NvciIsLi4uZX0pfX12YXIgQ289T2JqZWN0LmRlZmluZVByb3BlcnR5LEJvPShyLGUsdCk9PmUgaW4gcj9DbyhyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpyW2VdPXQsTW89KHIsZSx0KT0+KEJvKHIsdHlwZW9mIGUhPSJzeW1ib2wiP2UrIiI6ZSx0KSx0KTtjb25zdCBPbz0iaGxnLnRva2JveC5jb20vcHJvZC9sb2dnaW5nL3ZjcF93ZWJydGMiLFVvPSJodHRwczovLyIsTm89MWU0O2xldCBtdDtjb25zdCBMbz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gem8oKXtpZighbXQmJihtdD10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byksIW10KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIG10KExvKX1jb25zdCBCPVtdO2ZvcihsZXQgcj0wO3I8MjU2OysrcilCLnB1c2goKHIrMjU2KS50b1N0cmluZygxNikuc2xpY2UoMSkpO2Z1bmN0aW9uIEdvKHIsZT0wKXtyZXR1cm4oQltyW2UrMF1dK0JbcltlKzFdXStCW3JbZSsyXV0rQltyW2UrM11dKyItIitCW3JbZSs0XV0rQltyW2UrNV1dKyItIitCW3JbZSs2XV0rQltyW2UrN11dKyItIitCW3JbZSs4XV0rQltyW2UrOV1dKyItIitCW3JbZSsxMF1dK0JbcltlKzExXV0rQltyW2UrMTJdXStCW3JbZSsxM11dK0JbcltlKzE0XV0rQltyW2UrMTVdXSkudG9Mb3dlckNhc2UoKX1jb25zdCAkbz10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLnJhbmRvbVVVSUQmJmNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKSx1bj17cmFuZG9tVVVJRDokb307ZnVuY3Rpb24gV28ocixlLHQpe2lmKHVuLnJhbmRvbVVVSUQmJiFlJiYhcilyZXR1cm4gdW4ucmFuZG9tVVVJRCgpO3I9cnx8e307Y29uc3Qgbj1yLnJhbmRvbXx8KHIucm5nfHx6bykoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKGxldCBpPTA7aTwxNjsrK2kpZVt0K2ldPW5baV07cmV0dXJuIGV9cmV0dXJuIEdvKG4pfWZ1bmN0aW9uIHRyKHIsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCB0PWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHRbcl18fCh0W3JdPWUpLHRbcl19Y29uc3QgaWU9dHIoImdsb2JhbHMiLHt9KTt2YXIgZ2U9KHI9PihyLklOSVQ9IklOSVQiLHIuRk9SV0FSRD0iRk9SV0FSRCIsci5URVJNSU5BVEU9IlRFUk1JTkFURSIsci5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIscikpKGdlfHx7fSk7ZnVuY3Rpb24gY24ocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnIgaW5zdGFuY2VvZiBlKX1sZXQgVm89MDtmdW5jdGlvbiBIbyhyLGUsdCxuLGkpe2NvbnN0IG89Vm8rKztyZXR1cm4gci5wb3N0TWVzc2FnZSh7aWQ6byx0eXBlOmUsZnVuY3Rpb25OYW1lOnQsYXJnczpufSxuLmZpbHRlcihzPT5jbihzKSkpLG5ldyBQcm9taXNlKHM9PntpPT1udWxsfHxpLnNldChvLHMpfSl9ZnVuY3Rpb24gJGUocixlKXtjb25zdHtpZDp0LHR5cGU6bn09cixpPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnQsdHlwZTpuLHJlc3VsdDplfSxpLmZpbHRlcihvPT5jbihvKSkpfWNvbnN0IGZuPXRyKCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gbG4oKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWFzeW5jIGZ1bmN0aW9uIGpvKCl7aWYobG4oKSkkZSh7dHlwZTpnZS5HTE9CQUxTX1NZTkN9LGllKTtlbHNle2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgaW4gZm4pe2NvbnN0e3dvcmtlcjp0LHJlc29sdmVyczpufT1mbltlXS53b3JrZXJDb250ZXh0O3QmJnIucHVzaChIbyh0LGdlLkdMT0JBTFNfU1lOQywiIixbaWVdLG4pKX1hd2FpdCBQcm9taXNlLmFsbChyKX19ZnVuY3Rpb24gcHQocixlKXtpZihBcnJheS5pc0FycmF5KGUpKWUuc3BsaWNlKDAsZS5sZW5ndGgpO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcihjb25zdCB0IGluIGUpZGVsZXRlIGVbdF07Zm9yKGNvbnN0IHQgaW4gcilBcnJheS5pc0FycmF5KHJbdF0pPyhlW3RdPVtdLHB0KHJbdF0sZVt0XSkpOnR5cGVvZiByW3RdPT0ib2JqZWN0Ij8oZVt0XT17fSxwdChyW3RdLGVbdF0pKTplW3RdPXJbdF19YXN5bmMgZnVuY3Rpb24gWW8ocixlKXtjb25zdHtmdW5jdGlvbk5hbWU6dCxhcmdzOm59PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighdCl0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2VbdF0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3R9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDskZShyLGF3YWl0IGUuaW5zdGFuY2VbdF0oLi4ubiE9bnVsbD9uOltdKSl9Y29uc3QgWG89dHIoInJlZ2lzdGVyZWRXb3JrZXJzIix7fSk7ZnVuY3Rpb24gUW8ocixlKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgY2xhc3NOYW1lIHdoaWxlIGluaXRpYWxpemluZyB3b3JrZXIiO2NvbnN0W3Qsbl09ci5hcmdzLGk9WG9bdF07aWYoaSllLmluc3RhbmNlPW5ldyBpKHIuYXJncy5zbGljZSgxKSk7ZWxzZSB0aHJvd2B1bmtub3duIHdvcmtlciBjbGFzcyAke3R9YDtwdChuLGllKSwkZShyLHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBxbyhyLGUpe2NvbnN0e2FyZ3M6dH09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi50IT1udWxsP3Q6W10pKSwkZShyLG4pfWZ1bmN0aW9uIEtvKHIpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBnbG9iYWxzIHdoaWxlIHN5bmNpbmciO3B0KHIuYXJnc1swXSxpZSksJGUocix7fSl9ZnVuY3Rpb24gSm8oKXtjb25zdCByPXt9O29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSBnZS5JTklUOlFvKHQscik7YnJlYWs7Y2FzZSBnZS5GT1JXQVJEOllvKHQscik7YnJlYWs7Y2FzZSBnZS5URVJNSU5BVEU6cW8odCxyKTticmVhaztjYXNlIGdlLkdMT0JBTFNfU1lOQzpLbyh0KTticmVha319fWxuKCkmJkpvKCk7ZnVuY3Rpb24gWm8ocixlKXtyZXR1cm4gaWVbcl18fChpZVtyXT1lKSxbKCk9PmllW3JdLGFzeW5jIHQ9PntpZVtyXT10LGF3YWl0IGpvKCl9XX1mdW5jdGlvbiBlcyhyLGUpe3JldHVybiBabyhyLGUpfWNvbnN0W3RzLFZsXT1lcygibWV0YWRhdGEiKTtmdW5jdGlvbiBycigpe3JldHVybiB0cygpfWNsYXNzIHJze2NvbnN0cnVjdG9yKGUpe01vKHRoaXMsInV1aWQiLFdvKCkpLHRoaXMuY29uZmlnPWV9YXN5bmMgc2VuZChlKXt2YXIgdCxuLGk7Y29uc3R7YXBwSWQ6byxzb3VyY2VUeXBlOnN9PSh0PXJyKCkpIT1udWxsP3Q6e307aWYoIW98fCFzKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBhPW5ldyBBYm9ydENvbnRyb2xsZXIsdT1zZXRUaW1lb3V0KCgpPT5hLmFib3J0KCksTm8pO3JldHVybiBhd2FpdCgoaT0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP2k6ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDphLnNpZ25hbH0pLGNsZWFyVGltZW91dCh1KSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHQ9KGU9cnIoKS5wcm94eVVybCkhPW51bGw/ZTpVbztyZXR1cm4gdCs9KHQuYXQoLTEpPT09Ii8iPyIiOiIvIikrT28sdH1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3QgdD1ycigpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6dC5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDp0LnByb3h5VXJsLHNvdXJjZTp0LnNvdXJjZVR5cGV9fX1jb25zdCBucz0iNS4xLjEiO3ZhciBndD0ocj0+KHIuTG93PSJMb3ciLHIuSGlnaD0iSGlnaCIscikpKGd0fHx7fSksbnI9KHI9PihyLkZBU1Q9IkZBU1QiLHIuUFJFQ0lTRT0iUFJFQ0lTRSIscikpKG5yfHx7fSkseXQ9KHI9PihyLkNBTlZBUz0iQ0FOVkFTIixyLldFQkdMPSJXRUJHTCIscikpKHl0fHx7fSksaXM9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZTwidSI/ZTp7fSxuLGk7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihjLG0pe249YyxpPW19KTt2YXIgbz17fSxzO2ZvcihzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYmKG9bc109dFtzXSk7dmFyIGE9Ii4vdGhpcy5wcm9ncmFtIix1PWZ1bmN0aW9uKGMsbSl7dGhyb3cgbX0sZj0hMCxkPSIiO2Z1bmN0aW9uIHAoYyl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUoYyxkKTpkK2N9dmFyIGc7dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGQ9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihkPXIpLGQuaW5kZXhPZigiYmxvYjoiKSE9PTA/ZD1kLnN1YnN0cigwLGQucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpkPSIiO3ZhciBiPXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksaD10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IocyBpbiBvKW8uaGFzT3duUHJvcGVydHkocykmJih0W3NdPW9bc10pO289bnVsbCx0LmFyZ3VtZW50cyYmdC5hcmd1bWVudHMsdC50aGlzUHJvZ3JhbSYmKGE9dC50aGlzUHJvZ3JhbSksdC5xdWl0JiYodT10LnF1aXQpO3ZhciBfO3Qud2FzbUJpbmFyeSYmKF89dC53YXNtQmluYXJ5KTt2YXIgRT10Lm5vRXhpdFJ1bnRpbWV8fCEwO3R5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJmRlKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIHYsRj0hMSxrPXR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwO2Z1bmN0aW9uIEcoYyxtLHkpe2Zvcih2YXIgVD1tK3ksRD1tO2NbRF0mJiEoRD49VCk7KSsrRDtpZihELW0+MTYmJmMuc3ViYXJyYXkmJmspcmV0dXJuIGsuZGVjb2RlKGMuc3ViYXJyYXkobSxEKSk7Zm9yKHZhciBNPSIiO208RDspe3ZhciBBPWNbbSsrXTtpZighKEEmMTI4KSl7TSs9U3RyaW5nLmZyb21DaGFyQ29kZShBKTtjb250aW51ZX12YXIgVT1jW20rK10mNjM7aWYoKEEmMjI0KT09MTkyKXtNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChBJjMxKTw8NnxVKTtjb250aW51ZX12YXIgSz1jW20rK10mNjM7aWYoKEEmMjQwKT09MjI0P0E9KEEmMTUpPDwxMnxVPDw2fEs6QT0oQSY3KTw8MTh8VTw8MTJ8Szw8NnxjW20rK10mNjMsQTw2NTUzNilNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKEEpO2Vsc2V7dmFyIHppPUEtNjU1MzY7TSs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5Nnx6aT4+MTAsNTYzMjB8emkmMTAyMyl9fXJldHVybiBNfWZ1bmN0aW9uIHooYyxtKXtyZXR1cm4gYz9HKGxlLGMsbSk6IiJ9ZnVuY3Rpb24gSChjLG0seSl7Zm9yKHZhciBUPTA7VDxjLmxlbmd0aDsrK1QpVGVbbSsrPj4wXT1jLmNoYXJDb2RlQXQoVCk7eXx8KFRlW20+PjBdPTApfWZ1bmN0aW9uICQoYyxtKXtyZXR1cm4gYyVtPjAmJihjKz1tLWMlbSksY312YXIgS2UsVGUsbGUsVztmdW5jdGlvbiBDaShjKXtLZT1jLHQuSEVBUDg9VGU9bmV3IEludDhBcnJheShjKSx0LkhFQVAxNj1uZXcgSW50MTZBcnJheShjKSx0LkhFQVAzMj1XPW5ldyBJbnQzMkFycmF5KGMpLHQuSEVBUFU4PWxlPW5ldyBVaW50OEFycmF5KGMpLHQuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYyksdC5IRUFQVTMyPW5ldyBVaW50MzJBcnJheShjKSx0LkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShjKSx0LkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShjKX10LklOSVRJQUxfTUVNT1JZO3ZhciBXcixCaT1bXSxNaT1bXSxPaT1bXSxvbD0wO2Z1bmN0aW9uIHNsKCl7cmV0dXJuIEV8fG9sPjB9ZnVuY3Rpb24gYWwoKXtpZih0LnByZVJ1bilmb3IodHlwZW9mIHQucHJlUnVuPT0iZnVuY3Rpb24iJiYodC5wcmVSdW49W3QucHJlUnVuXSk7dC5wcmVSdW4ubGVuZ3RoOylmbCh0LnByZVJ1bi5zaGlmdCgpKTtWcihCaSl9ZnVuY3Rpb24gdWwoKXtWcihNaSl9ZnVuY3Rpb24gY2woKXtpZih0LnBvc3RSdW4pZm9yKHR5cGVvZiB0LnBvc3RSdW49PSJmdW5jdGlvbiImJih0LnBvc3RSdW49W3QucG9zdFJ1bl0pO3QucG9zdFJ1bi5sZW5ndGg7KWRsKHQucG9zdFJ1bi5zaGlmdCgpKTtWcihPaSl9ZnVuY3Rpb24gZmwoYyl7QmkudW5zaGlmdChjKX1mdW5jdGlvbiBsbChjKXtNaS51bnNoaWZ0KGMpfWZ1bmN0aW9uIGRsKGMpe09pLnVuc2hpZnQoYyl9dmFyIHdlPTAsSmU9bnVsbDtmdW5jdGlvbiBobChjKXt3ZSsrLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKHdlKX1mdW5jdGlvbiBtbChjKXtpZih3ZS0tLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKHdlKSx3ZT09MCYmSmUpe3ZhciBtPUplO0plPW51bGwsbSgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBkZShjKXt0Lm9uQWJvcnQmJnQub25BYm9ydChjKSxjPSJBYm9ydGVkKCIrYysiKSIsaChjKSxGPSEwLGMrPSIuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgbT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGMpO3Rocm93IGkobSksbX12YXIgcGw9ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIFVpKGMpe3JldHVybiBjLnN0YXJ0c1dpdGgocGwpfXZhciBYO1g9InRmbGl0ZS1zaW1kLndhc20iLFVpKFgpfHwoWD1wKFgpKTtmdW5jdGlvbiBOaShjKXt0cnl7aWYoYz09WCYmXylyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoXyk7aWYoIWcpdGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKG0pe2RlKG0pfX1mdW5jdGlvbiBnbCgpe3JldHVybiFfJiZmJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goWCx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oYyl7aWYoIWMub2spdGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIitYKyInIjtyZXR1cm4gYy5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gTmkoWCl9KTpQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIE5pKFgpfSl9ZnVuY3Rpb24geWwoKXt2YXIgYz17YTpObH07ZnVuY3Rpb24gbShBLFUpe3ZhciBLPUEuZXhwb3J0czt0LmFzbT1LLHY9dC5hc20ucSxDaSh2LmJ1ZmZlciksV3I9dC5hc20uRSxsbCh0LmFzbS5yKSxtbCgpfWhsKCk7ZnVuY3Rpb24geShBKXttKEEuaW5zdGFuY2UpfWZ1bmN0aW9uIFQoQSl7cmV0dXJuIGdsKCkudGhlbihmdW5jdGlvbihVKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoVSxjKX0pLnRoZW4oZnVuY3Rpb24oVSl7cmV0dXJuIFV9KS50aGVuKEEsZnVuY3Rpb24oVSl7aCgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitVKSxkZShVKX0pfWZ1bmN0aW9uIEQoKXtyZXR1cm4hXyYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhVWkoWCkmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChYLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihBKXt2YXIgVT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhBLGMpO3JldHVybiBVLnRoZW4oeSxmdW5jdGlvbihLKXtyZXR1cm4gaCgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrSyksaCgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxUKHkpfSl9KTpUKHkpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgTT10Lmluc3RhbnRpYXRlV2FzbShjLG0pO3JldHVybiBNfWNhdGNoKEEpe3JldHVybiBoKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK0EpLCExfXJldHVybiBEKCkuY2F0Y2goaSkse319ZnVuY3Rpb24gVnIoYyl7Zm9yKDtjLmxlbmd0aD4wOyl7dmFyIG09Yy5zaGlmdCgpO2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKXttKHQpO2NvbnRpbnVlfXZhciB5PW0uZnVuYzt0eXBlb2YgeT09Im51bWJlciI/bS5hcmc9PT12b2lkIDA/V3IuZ2V0KHkpKCk6V3IuZ2V0KHkpKG0uYXJnKTp5KG0uYXJnPT09dm9pZCAwP251bGw6bS5hcmcpfX1mdW5jdGlvbiBibChjLG0seSxUKXtkZSgiQXNzZXJ0aW9uIGZhaWxlZDogIit6KGMpKyIsIGF0OiAiK1ttP3oobSk6InVua25vd24gZmlsZW5hbWUiLHksVD96KFQpOiJ1bmtub3duIGZ1bmN0aW9uIl0pfWZ1bmN0aW9uIF9sKGMsbSl7ZGUoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIHhsKGMsbSl7ZGUoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIHZsKCl7ZGUoIiIpfXZhciBHdDtHdD1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07dmFyIEVsPSEwO2Z1bmN0aW9uIFRsKGMpe3JldHVybiBXW0xpKCk+PjJdPWMsY31mdW5jdGlvbiB3bChjLG0pe3ZhciB5O2lmKGM9PT0wKXk9RGF0ZS5ub3coKTtlbHNlIGlmKChjPT09MXx8Yz09PTQpJiZFbCl5PUd0KCk7ZWxzZSByZXR1cm4gVGwoMjgpLC0xO3JldHVybiBXW20+PjJdPXkvMWUzfDAsV1ttKzQ+PjJdPXklMWUzKjFlMyoxZTN8MCwwfWZ1bmN0aW9uIEFsKCl7cmV0dXJuIDIxNDc0ODM2NDh9ZnVuY3Rpb24gSWwoYyxtLHkpe2xlLmNvcHlXaXRoaW4oYyxtLG0reSl9ZnVuY3Rpb24gU2woYyl7dHJ5e3JldHVybiB2Lmdyb3coYy1LZS5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLENpKHYuYnVmZmVyKSwxfWNhdGNoe319ZnVuY3Rpb24gUmwoYyl7dmFyIG09bGUubGVuZ3RoO2M9Yz4+PjA7dmFyIHk9MjE0NzQ4MzY0ODtpZihjPnkpcmV0dXJuITE7Zm9yKHZhciBUPTE7VDw9NDtUKj0yKXt2YXIgRD1tKigxKy4yL1QpO0Q9TWF0aC5taW4oRCxjKzEwMDY2MzI5Nik7dmFyIE09TWF0aC5taW4oeSwkKE1hdGgubWF4KGMsRCksNjU1MzYpKSxBPVNsKE0pO2lmKEEpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gRmwoYyl7Zm9yKHZhciBtPUd0KCk7R3QoKS1tPGM7KTt9dmFyIEhyPXt9O2Z1bmN0aW9uIFBsKCl7cmV0dXJuIGF8fCIuL3RoaXMucHJvZ3JhbSJ9ZnVuY3Rpb24gWmUoKXtpZighWmUuc3RyaW5ncyl7dmFyIGM9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsbT17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmMsXzpQbCgpfTtmb3IodmFyIHkgaW4gSHIpSHJbeV09PT12b2lkIDA/ZGVsZXRlIG1beV06bVt5XT1Iclt5XTt2YXIgVD1bXTtmb3IodmFyIHkgaW4gbSlULnB1c2goeSsiPSIrbVt5XSk7WmUuc3RyaW5ncz1UfXJldHVybiBaZS5zdHJpbmdzfXZhciAkdD17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGMsbSl7dmFyIHk9JHQuYnVmZmVyc1tjXTttPT09MHx8bT09PTEwPygoYz09PTE/YjpoKShHKHksMCkpLHkubGVuZ3RoPTApOnkucHVzaChtKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7JHQudmFyYXJncys9NDt2YXIgYz1XWyR0LnZhcmFyZ3MtND4+Ml07cmV0dXJuIGN9LGdldFN0cjpmdW5jdGlvbihjKXt2YXIgbT16KGMpO3JldHVybiBtfSxnZXQ2NDpmdW5jdGlvbihjLG0pe3JldHVybiBjfX07ZnVuY3Rpb24ga2woYyxtKXt2YXIgeT0wO3JldHVybiBaZSgpLmZvckVhY2goZnVuY3Rpb24oVCxEKXt2YXIgTT1tK3k7V1tjK0QqND4+Ml09TSxIKFQsTSkseSs9VC5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gRGwoYyxtKXt2YXIgeT1aZSgpO1dbYz4+Ml09eS5sZW5ndGg7dmFyIFQ9MDtyZXR1cm4geS5mb3JFYWNoKGZ1bmN0aW9uKEQpe1QrPUQubGVuZ3RoKzF9KSxXW20+PjJdPVQsMH1mdW5jdGlvbiBDbChjKXt6bChjKX1mdW5jdGlvbiBCbChjKXtyZXR1cm4gMH1mdW5jdGlvbiBNbChjLG0seSxULEQpe31mdW5jdGlvbiBPbChjLG0seSxUKXtmb3IodmFyIEQ9MCxNPTA7TTx5O00rKyl7Zm9yKHZhciBBPVdbbStNKjg+PjJdLFU9V1ttKyhNKjgrNCk+PjJdLEs9MDtLPFU7SysrKSR0LnByaW50Q2hhcihjLGxlW0ErS10pO0QrPVV9cmV0dXJuIFdbVD4+Ml09RCwwfWZ1bmN0aW9uIFVsKCl7aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXt2YXIgYz1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhjKSxjWzBdfX1lbHNlIHJldHVybiBmdW5jdGlvbigpe2RlKCJyYW5kb21EZXZpY2UiKX19ZnVuY3Rpb24gV3QoYyxtKXtXdC5yYW5kb21EZXZpY2V8fChXdC5yYW5kb21EZXZpY2U9VWwoKSk7Zm9yKHZhciB5PTA7eTxtO3krKylUZVtjK3k+PjBdPVd0LnJhbmRvbURldmljZSgpO3JldHVybiAwfXZhciBObD17YTpibCxlOl9sLGQ6eGwsYjp2bCxuOndsLGg6QWwsbDpJbCxtOlJsLHA6RmwsZjprbCxnOkRsLGo6Q2wsaTpCbCxrOk1sLGM6T2wsbzpXdH07eWwoKSx0Ll9fX3dhc21fY2FsbF9jdG9ycz1mdW5jdGlvbigpe3JldHVybih0Ll9fX3dhc21fY2FsbF9jdG9ycz10LmFzbS5yKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0PXQuYXNtLnMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQ9dC5hc20udCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dEhlaWdodD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dEhlaWdodD10LmFzbS51KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRXaWR0aD10LmFzbS52KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0Q2hhbm5lbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0Q2hhbm5lbENvdW50PXQuYXNtLncpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD10LmFzbS54KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dEhlaWdodD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRIZWlnaHQ9dC5hc20ueSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRXaWR0aD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRXaWR0aD10LmFzbS56KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9dC5hc20uQSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9sb2FkTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4odC5fbG9hZE1vZGVsPXQuYXNtLkIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fcnVuSW5mZXJlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX3J1bkluZmVyZW5jZT10LmFzbS5DKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2lzR1BVRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybih0Ll9pc0dQVUVuYWJsZWQ9dC5hc20uRCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgTGk9dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybihMaT10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVnQ7ZnVuY3Rpb24gTGwoYyl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitjKyIpIix0aGlzLnN0YXR1cz1jfUplPWZ1bmN0aW9uIGMoKXtWdHx8anIoKSxWdHx8KEplPWMpfTtmdW5jdGlvbiBqcihjKXtpZih3ZT4wfHwoYWwoKSx3ZT4wKSlyZXR1cm47ZnVuY3Rpb24gbSgpe1Z0fHwoVnQ9ITAsdC5jYWxsZWRSdW49ITAsIUYmJih1bCgpLG4odCksdC5vblJ1bnRpbWVJbml0aWFsaXplZCYmdC5vblJ1bnRpbWVJbml0aWFsaXplZCgpLGNsKCkpKX10LnNldFN0YXR1cz8odC5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0U3RhdHVzKCIiKX0sMSksbSgpfSwxKSk6bSgpfXQucnVuPWpyO2Z1bmN0aW9uIHpsKGMsbSl7R2woYyl9ZnVuY3Rpb24gR2woYyl7c2woKXx8KHQub25FeGl0JiZ0Lm9uRXhpdChjKSxGPSEwKSx1KGMsbmV3IExsKGMpKX1pZih0LnByZUluaXQpZm9yKHR5cGVvZiB0LnByZUluaXQ9PSJmdW5jdGlvbiImJih0LnByZUluaXQ9W3QucHJlSW5pdF0pO3QucHJlSW5pdC5sZW5ndGg+MDspdC5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIGpyKCksZS5yZWFkeX19KCk7Y2xhc3Mgb3N7Y29uc3RydWN0b3IoKXtsKHRoaXMsInNlbGVjdGVkVEZMaXRlIik7bCh0aGlzLCJpc1NJTURTdXBwb3J0ZWQiLCExKTtsKHRoaXMsImlzVGhyZWFkc1N1cHBvcnRlZCIsITEpO2wodGhpcywiaW5wdXRXaWR0aCIsMCk7bCh0aGlzLCJpbnB1dEhlaWdodCIsMCk7bCh0aGlzLCJpbnB1dENoYW5uZWxDb3VudCIsMCk7bCh0aGlzLCJpbnB1dE1lbW9yeU9mZnNldCIsMCk7bCh0aGlzLCJvdXRwdXRXaWR0aCIsMCk7bCh0aGlzLCJvdXRwdXRIZWlnaHQiLDApO2wodGhpcywib3V0cHV0Q2hhbm5lbENvdW50IiwwKTtsKHRoaXMsIm91dHB1dE1lbW9yeU9mZnNldCIsMCl9fWNvbnN0IHNzPSJodHRwczovL2Qzb3Bxam1xenhmMDU3LmNsb3VkZnJvbnQubmV0L3ZvbmFnZS10ZW5zb3JmbG93LXdhc20vdGZsaXRlLXNpbWQtd2FzbS8xLjEuMy8iLGFzPSJodHRwczovL2Qzb3Bxam1xenhmMDU3LmNsb3VkZnJvbnQubmV0L21sL3NlbGZpZV9zZWdtZW50YXRpb24vNC4wLjAvIjthc3luYyBmdW5jdGlvbiB1cyhyPXNzLGU9YXMpe2xldCB0PW5ldyBvczt2YXIgbj1uZXcgUHJvbWlzZShmdW5jdGlvbihpLG8pe2FzeW5jIGZ1bmN0aW9uIHMoKXtyZXR1cm4gaXMoe2xvY2F0ZUZpbGU6ZnVuY3Rpb24oZil7cmV0dXJuIHIrZn19KX1hc3luYyBmdW5jdGlvbiBhKHUpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhmLGQpPT57Y29uc3QgcD11O2lmKHR5cGVvZiBwPiJ1IilyZXR1cm4gZCgiVEZMaXRlIGJhY2tlbmQgdW5hdmFpbGFibGU6IHdhc21TaW1kIik7Y29uc3QgZz0ic2VsZmllX3NlZ21lbnRhdGlvbl9sYW5kc2NhcGUiO2NvbnNvbGUubG9nKCJMb2FkaW5nIHRmbGl0ZSBtb2RlbDoiLGcpO2xldCBiPWUrYCR7Z30udGZsaXRlYDtjb25zb2xlLmxvZygiVEZMaXRlIG1vZGVsVXJsOiAiK2IpO3RyeXtjb25zdCBfPWF3YWl0KGF3YWl0IGZldGNoKGIpKS5hcnJheUJ1ZmZlcigpO2NvbnNvbGUubG9nKCJNb2RlbCBidWZmZXIgc2l6ZToiLF8uYnl0ZUxlbmd0aCk7Y29uc3QgRT1wLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpO2NvbnNvbGUubG9nKCJNb2RlbCBidWZmZXIgbWVtb3J5IG9mZnNldDoiLEUpLGNvbnNvbGUubG9nKCJMb2FkaW5nIG1vZGVsIGJ1ZmZlci4uLiIpLHAuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShfKSxFKTtjb25zdCB2PXAuX2xvYWRNb2RlbChfLmJ5dGVMZW5ndGgpO2lmKGNvbnNvbGUubG9nKCJMb2FkIG1vZGVsIHJlc3VsdDoiLHYpLHYhPT0wKXtkKCJDYW5ub3QgbG9hZCBtb2RlbCIpO3JldHVybn10LmlucHV0V2lkdGg9cC5fZ2V0SW5wdXRXaWR0aCgpLHQuaW5wdXRIZWlnaHQ9cC5fZ2V0SW5wdXRIZWlnaHQoKSx0LmlucHV0Q2hhbm5lbENvdW50PXAuX2dldElucHV0Q2hhbm5lbENvdW50KCksdC5pbnB1dE1lbW9yeU9mZnNldD1wLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpLGNvbnNvbGUubG9nKCJJbnB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5pbnB1dE1lbW9yeU9mZnNldCksY29uc29sZS5sb2coIklucHV0IGhlaWdodDoiLHQuaW5wdXRIZWlnaHQpLGNvbnNvbGUubG9nKCJJbnB1dCB3aWR0aDoiLHQuaW5wdXRXaWR0aCksY29uc29sZS5sb2coIklucHV0IGNoYW5uZWxzOiIsdC5pbnB1dENoYW5uZWxDb3VudCksdC5vdXRwdXRNZW1vcnlPZmZzZXQ9cC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0KCksdC5vdXRwdXRXaWR0aD1wLl9nZXRPdXRwdXRXaWR0aCgpLHQub3V0cHV0SGVpZ2h0PXAuX2dldE91dHB1dEhlaWdodCgpLHQub3V0cHV0Q2hhbm5lbENvdW50PXAuX2dldE91dHB1dENoYW5uZWxDb3VudCgpLGNvbnNvbGUubG9nKCJPdXRwdXQgbWVtb3J5IG9mZnNldDoiLHQub3V0cHV0TWVtb3J5T2Zmc2V0KSxjb25zb2xlLmxvZygiT3V0cHV0IGhlaWdodDoiLHQub3V0cHV0SGVpZ2h0KSxjb25zb2xlLmxvZygiT3V0cHV0IHdpZHRoOiIsdC5vdXRwdXRXaWR0aCksY29uc29sZS5sb2coIk91dHB1dCBjaGFubmVsczoiLHQub3V0cHV0Q2hhbm5lbENvdW50KSx0LnNlbGVjdGVkVEZMaXRlPXB9Y2F0Y2goaCl7ZChoKTtyZXR1cm59ZigpfSl9cygpLnRoZW4odT0+e2lmKHU9PT1udWxsKXRocm93IGNvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgbnVsbCIpLCJsb2FkVEZMaXRlIG51bGwiO2EodSkudGhlbihmPT57aSh0KX0pLmNhdGNoKGY9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKSxvKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKX0pfSkuY2F0Y2godT0+e2NvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgZXJyb3I6Iix1KSxvKCJsb2FkVEZMaXRlIGVycm9yOiIrdSl9KX0pO3JldHVybiBufWNsYXNzIGNze2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJjYW52YXMiLG5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSk7bCh0aGlzLCJjb250ZXh0Iix0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIse3dpbGxSZWFkRnJlcXVlbnRseTohMH0pKTtsKHRoaXMsInBpeGVsQ291bnQiLDApO2wodGhpcywiaW5wdXRPZmZzZXQiLDApO2wodGhpcywib3V0cHV0T2Zmc2V0IiwwKTtsKHRoaXMsImluZm9zIik7bCh0aGlzLCJtYXNrIil9YXN5bmMgaW5pdChlLHQpe2F3YWl0IHRoaXMuaW5pdFdhc20oZSx0KSx0aGlzLmluZm9zJiYodGhpcy5jYW52YXMud2lkdGg9dGhpcy5pbmZvcy5pbnB1dFdpZHRoLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmluZm9zLmlucHV0SGVpZ2h0LHRoaXMucGl4ZWxDb3VudD10aGlzLmluZm9zLmlucHV0V2lkdGgqdGhpcy5pbmZvcy5pbnB1dEhlaWdodCx0aGlzLm1hc2s9bmV3IEltYWdlRGF0YSh0aGlzLmluZm9zLmlucHV0V2lkdGgsdGhpcy5pbmZvcy5pbnB1dEhlaWdodCksdGhpcy5pbnB1dE9mZnNldD10aGlzLmluZm9zLmlucHV0TWVtb3J5T2Zmc2V0LzQsdGhpcy5vdXRwdXRPZmZzZXQ9dGhpcy5pbmZvcy5vdXRwdXRNZW1vcnlPZmZzZXQvNCl9YXN5bmMgaW5pdFdhc20oZSx0KXt0aGlzLmluZm9zPWF3YWl0IHVzKGUsdCl9Z2V0T3V0cHV0RGltZW5zaW9ucygpe3ZhciBlLHQsbixpO3JldHVybnt3aWR0aDoodD0oZT10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6ZS5vdXRwdXRXaWR0aCkhPW51bGw/dDowLGhlaWdodDooaT0obj10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6bi5vdXRwdXRIZWlnaHQpIT1udWxsP2k6MH19YXN5bmMgcHJvY2VzcyhlKXtpZighdGhpcy5tYXNrfHwhdGhpcy5pbmZvcylyZXR1cm47Y29uc3QgdD10aGlzLmluZm9zLmlucHV0V2lkdGgsbj10aGlzLmluZm9zLmlucHV0SGVpZ2h0O3RoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCwwLDAsdCxuKTtjb25zdCBpPXRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHQsbiksbz10aGlzLmluZm9zLnNlbGVjdGVkVEZMaXRlLkhFQVBGMzI7Zm9yKGxldCBzPTA7czx0aGlzLnBpeGVsQ291bnQ7cysrKXtjb25zdCBhPXRoaXMuaW5wdXRPZmZzZXQrcyozO29bYV09aS5kYXRhW3MqNF0vMjU1LG9bYSsxXT1pLmRhdGFbcyo0KzFdLzI1NSxvW2ErMl09aS5kYXRhW3MqNCsyXS8yNTV9dGhpcy5pbmZvcy5zZWxlY3RlZFRGTGl0ZS5fcnVuSW5mZXJlbmNlKCk7Zm9yKGxldCBzPTA7czx0aGlzLnBpeGVsQ291bnQ7cysrKXtjb25zdCBhPXRoaXMuaW5mb3Muc2VsZWN0ZWRURkxpdGUuSEVBUEYzMlt0aGlzLm91dHB1dE9mZnNldCtzXTt0aGlzLm1hc2suZGF0YVtzKjRdPXRoaXMubWFzay5kYXRhW3MqNCszXT0yNTUqYX1yZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5tYXNrKX1pc0dwdVN1cHBvcnRlZCgpe3ZhciBlLHQsbjtyZXR1cm4obj0odD0oZT10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6ZS5zZWxlY3RlZFRGTGl0ZSk9PW51bGw/dm9pZCAwOnQuX2lzR1BVRW5hYmxlZCgpKSE9bnVsbD9uOiExfX1mdW5jdGlvbiBmcygpe3JldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCkuZ2V0Q29udGV4dCgid2ViZ2wyIix7ZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDohMH0pP3tzdXBwb3J0ZWQ6ITB9OntzdXBwb3J0ZWQ6ITEsbWVzc2FnZToiWW91ciBoYXJkd2FyZSBkb2VzIG5vdCBwZXJmb3JtIGdvb2QgZW5vdWdoIHRvIHJ1biB0aGUgbGlicmFyeSBlZmZpY2llbnRseSJ9fWNsYXNzIGlye2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJjYW52YXMiKTtsKHRoaXMsImNvbnRleHQiKTtjb25zdCBlPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSx0PWUuZ2V0Q29udGV4dCgiMmQiKTtpZighdCl0aHJvdyJGYWlsIHRvIHJldHJpZXZlIHdlYmdsMiBjb250ZXh0Ijt0aGlzLmNhbnZhcz1lLHRoaXMuY29udGV4dD10fXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe31lbmFibGVQb3N0UHJvY2Vzc2luZygpe31kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKXt9YXN5bmMgcHJvZmlsZVdlYmdsKGUpe3JldHVybltdfWFzeW5jIHJlbmRlcihlLHQpe3JldHVybiB0aGlzLmNhbnZhc31yZXNpemVDYW52YXMoZSl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09ZTt0aGlzLmNhbnZhcy53aWR0aD10LHRoaXMuY2FudmFzLmhlaWdodD1ufXJlbmRlclNpbGhvdWV0dGUoZSx0LG49Im5vbmUiKXtjb25zdHt3aWR0aDppLGhlaWdodDpvfT1lO3RoaXMuY29udGV4dC5zYXZlKCksdGhpcy5jb250ZXh0LmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0LDAsMCxpLG8pLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiIsdGhpcy5jb250ZXh0LmZpbHRlcj1uLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsaSxvLDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpLHRoaXMuY29udGV4dC5yZXN0b3JlKCl9fWNsYXNzIGxzIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnJhZGl1cz1lfWFzeW5jIHJlbmRlcihlLHQpe3JldHVybiBzdXBlci5yZXNpemVDYW52YXMoZSksdGhpcy5yZW5kZXJTaWxob3VldHRlKGUsdCksdGhpcy5jb250ZXh0LnNhdmUoKSx0aGlzLmNvbnRleHQuZmlsdGVyPWBibHVyKCR7dGhpcy5yYWRpdXN9cHgpYCx0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHRoaXMuY29udGV4dC5yZXN0b3JlKCksc3VwZXIucmVuZGVyKGUsdCl9fWNsYXNzIGRzIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnJhZGl1cz1lfWFzeW5jIHJlbmRlcihlLHQpe3JldHVybiBzdXBlci5yZXNpemVDYW52YXMoZSksdGhpcy5yZW5kZXJTaWxob3VldHRlKGUsdCxgYmx1cigke3RoaXMucmFkaXVzfXB4KWApLHRoaXMuY29udGV4dC5zYXZlKCksdGhpcy5jb250ZXh0LmZpbHRlcj0ibm9uZSIsdGhpcy5jb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5jb250ZXh0LmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLmNvbnRleHQucmVzdG9yZSgpLHN1cGVyLnJlbmRlcihlLHQpfX1jbGFzcyBocyBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtsKHRoaXMsImJhY2tncm91bmRJbWFnZSIpfXNldEJhY2tncm91bmRJbWFnZSh0KXt0aGlzLmJhY2tncm91bmRJbWFnZT10fWFzeW5jIHJlbmRlcih0LG4pe3JldHVybiBzdXBlci5yZXNpemVDYW52YXModCksdGhpcy5yZW5kZXJTaWxob3VldHRlKHQsbiksdGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJih0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9Im5vbmUiLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UodGhpcy5iYWNrZ3JvdW5kSW1hZ2UsMCwwLHRoaXMuYmFja2dyb3VuZEltYWdlLndpZHRoLHRoaXMuYmFja2dyb3VuZEltYWdlLmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSksc3VwZXIucmVuZGVyKHQsbil9fS8qIEBsaWNlbnNlIHR3Z2wuanMgNS41LjEgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBvcj01MTIwLFdlPTUxMjEsc3I9NTEyMixhcj01MTIzLHVyPTUxMjQsY3I9NTEyNSxmcj01MTI2LG1zPTMyODE5LHBzPTMyODIwLGdzPTMzNjM1LHlzPTUxMzEsYnM9MzM2NDAsX3M9MzU4OTkseHM9MzU5MDIsdnM9MzYyNjksRXM9MzQwNDIsZG49e307e2NvbnN0IHI9ZG47cltvcl09SW50OEFycmF5LHJbV2VdPVVpbnQ4QXJyYXkscltzcl09SW50MTZBcnJheSxyW2FyXT1VaW50MTZBcnJheSxyW3VyXT1JbnQzMkFycmF5LHJbY3JdPVVpbnQzMkFycmF5LHJbZnJdPUZsb2F0MzJBcnJheSxyW21zXT1VaW50MTZBcnJheSxyW3BzXT1VaW50MTZBcnJheSxyW2dzXT1VaW50MTZBcnJheSxyW3lzXT1VaW50MTZBcnJheSxyW2JzXT1VaW50MzJBcnJheSxyW19zXT1VaW50MzJBcnJheSxyW3hzXT1VaW50MzJBcnJheSxyW3ZzXT1VaW50MzJBcnJheSxyW0VzXT1VaW50MzJBcnJheX1mdW5jdGlvbiBscihyKXtpZihyIGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBvcjtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheXx8ciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBXZTtpZihyIGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gc3I7aWYociBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBhcjtpZihyIGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gdXI7aWYociBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBjcjtpZihyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXJldHVybiBmcjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBobihyKXtpZihyPT09SW50OEFycmF5KXJldHVybiBvcjtpZihyPT09VWludDhBcnJheXx8cj09PVVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBXZTtpZihyPT09SW50MTZBcnJheSlyZXR1cm4gc3I7aWYocj09PVVpbnQxNkFycmF5KXJldHVybiBhcjtpZihyPT09SW50MzJBcnJheSlyZXR1cm4gdXI7aWYocj09PVVpbnQzMkFycmF5KXJldHVybiBjcjtpZihyPT09RmxvYXQzMkFycmF5KXJldHVybiBmcjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBtbihyKXtjb25zdCBlPWRuW3JdO2lmKCFlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBnbCB0eXBlIik7cmV0dXJuIGV9Y29uc3QgYnQ9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5idWZmZXImJihlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTtmdW5jdGlvbiBwbiguLi5yKXtjb25zb2xlLmVycm9yKC4uLnIpfWNvbnN0IGduPW5ldyBNYXA7ZnVuY3Rpb24gX3QocixlKXtpZighcnx8dHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiExO2xldCB0PWduLmdldChlKTt0fHwodD1uZXcgV2Vha01hcCxnbi5zZXQoZSx0KSk7bGV0IG49dC5nZXQocik7aWYobj09PXZvaWQgMCl7Y29uc3QgaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocik7bj1pLnN1YnN0cmluZyg4LGkubGVuZ3RoLTEpPT09ZSx0LnNldChyLG4pfXJldHVybiBufWZ1bmN0aW9uIFRzKHIsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTEJ1ZmZlcjwidSImJl90KGUsIldlYkdMQnVmZmVyIil9ZnVuY3Rpb24gd3MocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMUmVuZGVyYnVmZmVyPCJ1IiYmX3QoZSwiV2ViR0xSZW5kZXJidWZmZXIiKX1mdW5jdGlvbiBkcihyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlPCJ1IiYmX3QoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gQXMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlcjwidSImJl90KGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IHluPTM1MDQ0LHllPTM0OTYyLElzPTM0OTYzLFNzPTM0NjYwLFJzPTUxMjAsRnM9NTEyMSxQcz01MTIyLGtzPTUxMjMsRHM9NTEyNCxDcz01MTI1LGJuPTUxMjYsX249e2F0dHJpYlByZWZpeDoiIn07ZnVuY3Rpb24gQnMocixlLHQsbixpKXtyLmJpbmRCdWZmZXIoZSx0KSxyLmJ1ZmZlckRhdGEoZSxuLGl8fHluKX1mdW5jdGlvbiB4bihyLGUsdCxuKXtpZihUcyhyLGUpKXJldHVybiBlO3Q9dHx8eWU7Y29uc3QgaT1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiBCcyhyLHQsaSxlLG4pLGl9ZnVuY3Rpb24gdm4ocil7cmV0dXJuIHI9PT0iaW5kaWNlcyJ9ZnVuY3Rpb24gTXMocil7cmV0dXJuIHI9PT1JbnQ4QXJyYXl8fHI9PT1VaW50OEFycmF5fWZ1bmN0aW9uIE9zKHIpe3JldHVybiByLmxlbmd0aD9yOnIuZGF0YX1jb25zdCBVcz0vY29vcmR8dGV4dHVyZS9pLE5zPS9jb2xvcnxjb2xvdXIvaTtmdW5jdGlvbiBMcyhyLGUpe2xldCB0O2lmKFVzLnRlc3Qocik/dD0yOk5zLnRlc3Qocik/dD00OnQ9MyxlJXQ+MCl0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZ3Vlc3MgbnVtQ29tcG9uZW50cyBmb3IgYXR0cmlidXRlICcke3J9Jy4gVHJpZWQgJHt0fSBidXQgJHtlfSB2YWx1ZXMgaXMgbm90IGV2ZW5seSBkaXZpc2libGUgYnkgJHt0fS4gWW91IHNob3VsZCBzcGVjaWZ5IGl0LmApO3JldHVybiB0fWZ1bmN0aW9uIHpzKHIsZSx0KXtyZXR1cm4gci5udW1Db21wb25lbnRzfHxyLnNpemV8fExzKGUsdHx8T3MocikubGVuZ3RoKX1mdW5jdGlvbiBFbihyLGUpe2lmKGJ0KHIpKXJldHVybiByO2lmKGJ0KHIuZGF0YSkpcmV0dXJuIHIuZGF0YTtBcnJheS5pc0FycmF5KHIpJiYocj17ZGF0YTpyfSk7bGV0IHQ9ci50eXBlP2hyKHIudHlwZSk6dm9pZCAwO3JldHVybiB0fHwodm4oZSk/dD1VaW50MTZBcnJheTp0PUZsb2F0MzJBcnJheSksbmV3IHQoci5kYXRhKX1mdW5jdGlvbiBHcyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP3I6cj9obihyKTpibn1mdW5jdGlvbiBocihyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP21uKHIpOnJ8fEZsb2F0MzJBcnJheX1mdW5jdGlvbiAkcyhyLGUpe3JldHVybntidWZmZXI6ZS5idWZmZXIsbnVtVmFsdWVzOjIqMyo0LHR5cGU6R3MoZS50eXBlKSxhcnJheVR5cGU6aHIoZS50eXBlKX19ZnVuY3Rpb24gV3MocixlKXtjb25zdCB0PWUuZGF0YXx8ZSxuPWhyKGUudHlwZSksaT10Km4uQllURVNfUEVSX0VMRU1FTlQsbz1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiByLmJpbmRCdWZmZXIoeWUsbyksci5idWZmZXJEYXRhKHllLGksZS5kcmF3VHlwZXx8eW4pLHtidWZmZXI6byxudW1WYWx1ZXM6dCx0eXBlOmhuKG4pLGFycmF5VHlwZTpufX1mdW5jdGlvbiBWcyhyLGUsdCl7Y29uc3Qgbj1FbihlLHQpO3JldHVybnthcnJheVR5cGU6bi5jb25zdHJ1Y3RvcixidWZmZXI6eG4ocixuLHZvaWQgMCxlLmRyYXdUeXBlKSx0eXBlOmxyKG4pLG51bVZhbHVlczowfX1mdW5jdGlvbiBIcyhyLGUpe2NvbnN0IHQ9e307cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24obil7aWYoIXZuKG4pKXtjb25zdCBpPWVbbl0sbz1pLmF0dHJpYnx8aS5uYW1lfHxpLmF0dHJpYk5hbWV8fF9uLmF0dHJpYlByZWZpeCtuO2lmKGkudmFsdWUpe2lmKCFBcnJheS5pc0FycmF5KGkudmFsdWUpJiYhYnQoaS52YWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJhcnJheS52YWx1ZSBpcyBub3QgYXJyYXkgb3IgdHlwZWRhcnJheSIpO3Rbb109e3ZhbHVlOmkudmFsdWV9fWVsc2V7bGV0IHM7aS5idWZmZXImJmkuYnVmZmVyIGluc3RhbmNlb2YgV2ViR0xCdWZmZXI/cz0kczp0eXBlb2YgaT09Im51bWJlciJ8fHR5cGVvZiBpLmRhdGE9PSJudW1iZXIiP3M9V3M6cz1Wcztjb25zdHtidWZmZXI6YSx0eXBlOnUsbnVtVmFsdWVzOmYsYXJyYXlUeXBlOmR9PXMocixpLG4pLHA9aS5ub3JtYWxpemUhPT12b2lkIDA/aS5ub3JtYWxpemU6TXMoZCksZz16cyhpLG4sZik7dFtvXT17YnVmZmVyOmEsbnVtQ29tcG9uZW50czpnLHR5cGU6dSxub3JtYWxpemU6cCxzdHJpZGU6aS5zdHJpZGV8fDAsb2Zmc2V0Omkub2Zmc2V0fHwwLGRpdmlzb3I6aS5kaXZpc29yPT09dm9pZCAwP3ZvaWQgMDppLmRpdmlzb3IsZHJhd1R5cGU6aS5kcmF3VHlwZX19fX0pLHIuYmluZEJ1ZmZlcih5ZSxudWxsKSx0fWZ1bmN0aW9uIGpzKHIsZSl7cmV0dXJuIGU9PT1Sc3x8ZT09PUZzPzE6ZT09PVBzfHxlPT09a3M/MjplPT09RHN8fGU9PT1Dc3x8ZT09PWJuPzQ6MH1jb25zdCBtcj1bInBvc2l0aW9uIiwicG9zaXRpb25zIiwiYV9wb3NpdGlvbiJdO2Z1bmN0aW9uIFlzKHIsZSl7bGV0IHQsbjtmb3Iobj0wO248bXIubGVuZ3RoJiYodD1tcltuXSwhKHQgaW4gZXx8KHQ9X24uYXR0cmliUHJlZml4K3QsdCBpbiBlKSkpOysrbik7bj09PW1yLmxlbmd0aCYmKHQ9T2JqZWN0LmtleXMoZSlbMF0pO2NvbnN0IGk9ZVt0XTtpZighaS5idWZmZXIpcmV0dXJuIDE7ci5iaW5kQnVmZmVyKHllLGkuYnVmZmVyKTtjb25zdCBvPXIuZ2V0QnVmZmVyUGFyYW1ldGVyKHllLFNzKTtyLmJpbmRCdWZmZXIoeWUsbnVsbCk7Y29uc3Qgcz1qcyhyLGkudHlwZSksYT1vL3MsdT1pLm51bUNvbXBvbmVudHN8fGkuc2l6ZSxmPWEvdTtpZihmJTEhPT0wKXRocm93IG5ldyBFcnJvcihgbnVtQ29tcG9uZW50cyAke3V9IG5vdCBjb3JyZWN0IGZvciBsZW5ndGggJHtsZW5ndGh9YCk7cmV0dXJuIGZ9ZnVuY3Rpb24gWHMocixlLHQpe2NvbnN0IG49SHMocixlKSxpPU9iamVjdC5hc3NpZ24oe30sdHx8e30pO2kuYXR0cmlicz1PYmplY3QuYXNzaWduKHt9LHQ/dC5hdHRyaWJzOnt9LG4pO2NvbnN0IG89ZS5pbmRpY2VzO2lmKG8pe2NvbnN0IHM9RW4obywiaW5kaWNlcyIpO2kuaW5kaWNlcz14bihyLHMsSXMpLGkubnVtRWxlbWVudHM9cy5sZW5ndGgsaS5lbGVtZW50VHlwZT1scihzKX1lbHNlIGkubnVtRWxlbWVudHN8fChpLm51bUVsZW1lbnRzPVlzKHIsaS5hdHRyaWJzKSk7cmV0dXJuIGl9ZnVuY3Rpb24gVmUocil7cmV0dXJuISFyLnRleFN0b3JhZ2UyRH1jb25zdCBUbj1mdW5jdGlvbigpe2NvbnN0IHI9e30sZT17fTtmdW5jdGlvbiB0KG4pe2NvbnN0IGk9bi5jb25zdHJ1Y3Rvci5uYW1lO2lmKCFyW2ldKXtmb3IoY29uc3QgbyBpbiBuKWlmKHR5cGVvZiBuW29dPT0ibnVtYmVyIil7Y29uc3Qgcz1lW25bb11dO2VbbltvXV09cz9gJHtzfSB8ICR7b31gOm99cltpXT0hMH19cmV0dXJuIGZ1bmN0aW9uKGksbyl7cmV0dXJuIHQoaSksZVtvXXx8KHR5cGVvZiBvPT0ibnVtYmVyIj9gMHgke28udG9TdHJpbmcoMTYpfWA6byl9fSgpLG9lPXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sSGU9YnQsd249ZnVuY3Rpb24oKXtsZXQgcjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcj1yfHwodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHJ9fSgpLEFuPTY0MDYscT02NDA3LFI9NjQwOCxJbj02NDA5LFNuPTY0MTAsamU9NjQwMixSbj0zNDA0MSx4dD0zMzA3MSxRcz05NzI4LHFzPTk3Mjksc2U9MzU1MyxhZT0zNDA2NyxiZT0zMjg3OSxfZT0zNTg2Nixwcj0zNDA2OSxLcz0zNDA3MCxKcz0zNDA3MSxacz0zNDA3MixlYT0zNDA3Myx0YT0zNDA3NCxncj0xMDI0MSx5cj0xMDI0MCx2dD0xMDI0MixFdD0xMDI0MyxGbj0zMjg4MixyYT0zMzA4MixuYT0zMzA4MyxpYT0zMzA4NCxvYT0zMzA4NSxzYT0zNDg5MixhYT0zNDg5Myxicj0zMzE3LFBuPTMzMTQsa249MzI4NzgsRG49MzMxNixDbj0zMzE1LEJuPTMyODc3LHVhPTM3NDQzLGNhPTM3NDQxLGZhPTM3NDQwLGxhPTMzMzIxLGRhPTM2NzU2LGhhPTMzMzI1LG1hPTMzMzI2LHBhPTMzMzMwLGdhPTMzMzI5LHlhPTMzMzM4LGJhPTMzMzM3LF9hPTMzMzQwLHhhPTMzMzM5LHZhPTMzMzIzLEVhPTM2NzU3LFRhPTMzMzI3LHdhPTMzMzI4LEFhPTMzMzM2LElhPTMzMzM1LFNhPTMzMzMyLFJhPTMzMzMxLEZhPTMzMzM0LFBhPTMzMzMzLGthPTMyODQ5LERhPTM1OTA1LENhPTM2MTk0LEJhPTM2NzU4LE1hPTM1ODk4LE9hPTM1OTAxLFVhPTM0ODQzLE5hPTM0ODM3LExhPTM2MjIxLHphPTM2MjM5LEdhPTM2MjE1LCRhPTM2MjMzLFdhPTM2MjA5LFZhPTM2MjI3LEhhPTMyODU2LGphPTM1OTA3LFlhPTM2NzU5LFhhPTMyODU1LFFhPTMyODU0LHFhPTMyODU3LEthPTM0ODQyLEphPTM0ODM2LFphPTM2MjIwLGV1PTM2MjM4LHR1PTM2OTc1LHJ1PTM2MjE0LG51PTM2MjMyLGl1PTM2MjI2LG91PTM2MjA4LHN1PTMzMTg5LGF1PTMzMTkwLHV1PTM2MDEyLGN1PTM2MDEzLGZ1PTM1MDU2LHVlPTUxMjAsUz01MTIxLFR0PTUxMjIsa2U9NTEyMyx3dD01MTI0LHhlPTUxMjUsTz01MTI2LE1uPTMyODE5LE9uPTMyODIwLFVuPTMzNjM1LGo9NTEzMSxZZT0zNjE5Myxfcj0zMzY0MCxsdT0zNTg5OSxkdT0zNTkwMixodT0zNjI2OSxtdT0zNDA0MixBdD0zMzMxOSxEZT0zMzMyMCxJdD02NDAzLENlPTM2MjQ0LEJlPTM2MjQ4LHZlPTM2MjQ5O2xldCB4cjtmdW5jdGlvbiBTdChyKXtpZigheHIpe2NvbnN0IGU9e307ZVtBbl09e3RleHR1cmVGb3JtYXQ6QW4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbUyxqLFllLE9dfSxlW0luXT17dGV4dHVyZUZvcm1hdDpJbixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxLDIsMiw0XSx0eXBlOltTLGosWWUsT119LGVbU25dPXt0ZXh0dXJlRm9ybWF0OlNuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzIsNCw0LDhdLHR5cGU6W1MsaixZZSxPXX0sZVtxXT17dGV4dHVyZUZvcm1hdDpxLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzMsNiw2LDEyLDJdLHR5cGU6W1MsaixZZSxPLFVuXX0sZVtSXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsOCw4LDE2LDIsMl0sdHlwZTpbUyxqLFllLE8sTW4sT25dfSxlW2plXT17dGV4dHVyZUZvcm1hdDpqZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyLDRdLHR5cGU6W3hlLGtlXX0sZVtsYV09e3RleHR1cmVGb3JtYXQ6SXQsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbZGFdPXt0ZXh0dXJlRm9ybWF0Okl0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3VlXX0sZVtoYV09e3RleHR1cmVGb3JtYXQ6SXQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltPLGpdfSxlW21hXT17dGV4dHVyZUZvcm1hdDpJdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltPXX0sZVtwYV09e3RleHR1cmVGb3JtYXQ6Q2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbZ2FdPXt0ZXh0dXJlRm9ybWF0OkNlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3VlXX0sZVtTYV09e3RleHR1cmVGb3JtYXQ6Q2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpba2VdfSxlW1JhXT17dGV4dHVyZUZvcm1hdDpDZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltUdF19LGVbRmFdPXt0ZXh0dXJlRm9ybWF0OkNlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hlXX0sZVtQYV09e3RleHR1cmVGb3JtYXQ6Q2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbd3RdfSxlW3ZhXT17dGV4dHVyZUZvcm1hdDpBdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtFYV09e3RleHR1cmVGb3JtYXQ6QXQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbdWVdfSxlW1RhXT17dGV4dHVyZUZvcm1hdDpBdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols4LDRdLHR5cGU6W08sal19LGVbd2FdPXt0ZXh0dXJlRm9ybWF0OkF0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W09dfSxlW0FhXT17dGV4dHVyZUZvcm1hdDpEZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtJYV09e3RleHR1cmVGb3JtYXQ6RGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbdWVdfSxlW3lhXT17dGV4dHVyZUZvcm1hdDpEZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltrZV19LGVbYmFdPXt0ZXh0dXJlRm9ybWF0OkRlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W1R0XX0sZVtfYV09e3RleHR1cmVGb3JtYXQ6RGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbeGVdfSxlW3hhXT17dGV4dHVyZUZvcm1hdDpEZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOlt3dF19LGVba2FdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbRGFdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbQ2FdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltTLFVuXX0sZVtCYV09e3RleHR1cmVGb3JtYXQ6cSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOlt1ZV19LGVbTWFdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltPLGosbHVdfSxlW09hXT17dGV4dHVyZUZvcm1hdDpxLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDYsNF0sdHlwZTpbTyxqLGR1XX0sZVtVYV09e3RleHR1cmVGb3JtYXQ6cSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2XSx0eXBlOltPLGpdfSxlW05hXT17dGV4dHVyZUZvcm1hdDpxLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltPXX0sZVtMYV09e3RleHR1cmVGb3JtYXQ6QmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbemFdPXt0ZXh0dXJlRm9ybWF0OkJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzNdLHR5cGU6W3VlXX0sZVtHYV09e3RleHR1cmVGb3JtYXQ6QmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpba2VdfSxlWyRhXT17dGV4dHVyZUZvcm1hdDpCZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols2XSx0eXBlOltUdF19LGVbV2FdPXt0ZXh0dXJlRm9ybWF0OkJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlt4ZV19LGVbVmFdPXt0ZXh0dXJlRm9ybWF0OkJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlt3dF19LGVbSGFdPXt0ZXh0dXJlRm9ybWF0OlIsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbamFdPXt0ZXh0dXJlRm9ybWF0OlIsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbWWFdPXt0ZXh0dXJlRm9ybWF0OlIsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbdWVdfSxlW1hhXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltTLE9uLF9yXX0sZVtRYV09e3RleHR1cmVGb3JtYXQ6Uixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W1MsTW5dfSxlW3FhXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W19yXX0sZVtLYV09e3RleHR1cmVGb3JtYXQ6Uixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltPLGpdfSxlW0phXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltPXX0sZVtaYV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbZXVdPXt0ZXh0dXJlRm9ybWF0OnZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3VlXX0sZVt0dV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbX3JdfSxlW3J1XT17dGV4dHVyZUZvcm1hdDp2ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltrZV19LGVbbnVdPXt0ZXh0dXJlRm9ybWF0OnZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W1R0XX0sZVtpdV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W3d0XX0sZVtvdV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W3hlXX0sZVtzdV09e3RleHR1cmVGb3JtYXQ6amUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltrZSx4ZV19LGVbYXVdPXt0ZXh0dXJlRm9ybWF0OmplLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hlXX0sZVt1dV09e3RleHR1cmVGb3JtYXQ6amUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbT119LGVbZnVdPXt0ZXh0dXJlRm9ybWF0OlJuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W211XX0sZVtjdV09e3RleHR1cmVGb3JtYXQ6Um4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbaHVdfSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2NvbnN0IG49ZVt0XTtuLmJ5dGVzUGVyRWxlbWVudE1hcD17fSxuLmJ5dGVzUGVyRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGksbyl7Y29uc3Qgcz1uLnR5cGVbb107bi5ieXRlc1BlckVsZW1lbnRNYXBbc109aX0pfSkseHI9ZX1yZXR1cm4geHJbcl19ZnVuY3Rpb24gcHUocixlKXtjb25zdCB0PVN0KHIpO2lmKCF0KXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0Ijtjb25zdCBuPXQuYnl0ZXNQZXJFbGVtZW50TWFwW2VdO2lmKG49PT12b2lkIDApdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBufWZ1bmN0aW9uIFhlKHIpe2NvbnN0IGU9U3Qocik7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybntmb3JtYXQ6ZS50ZXh0dXJlRm9ybWF0LHR5cGU6ZS50eXBlWzBdfX1mdW5jdGlvbiBObihyKXtyZXR1cm4ociZyLTEpPT09MH1mdW5jdGlvbiBndShyLGUsdCxuKXtpZighVmUocikpcmV0dXJuIE5uKGUpJiZObih0KTtjb25zdCBpPVN0KG4pO2lmKCFpKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gaS5jb2xvclJlbmRlcmFibGUmJmkudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24geXUocil7Y29uc3QgZT1TdChyKTtpZighZSl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIGUudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gYnUocixlLHQpe3JldHVybiBIZShlKT9scihlKTp0fHxTfWZ1bmN0aW9uIFJ0KHIsZSx0LG4saSl7aWYoaSUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBkaW1lbnNpb25zIjtpZighdCYmIW4pe2NvbnN0IG89TWF0aC5zcXJ0KGkvKGU9PT1hZT82OjEpKTtvJTE9PT0wPyh0PW8sbj1vKToodD1pLG49MSl9ZWxzZSBpZihuKXtpZighdCYmKHQ9aS9uLHQlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPWkvdCxuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIE1lKHIsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmci5waXhlbFN0b3JlaSh1YSxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnIucGl4ZWxTdG9yZWkoY2EsZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZyLnBpeGVsU3RvcmVpKGZhLGUuZmxpcFkpfWZ1bmN0aW9uIExuKHIpe3IucGl4ZWxTdG9yZWkoYnIsNCksVmUocikmJihyLnBpeGVsU3RvcmVpKFBuLDApLHIucGl4ZWxTdG9yZWkoa24sMCksci5waXhlbFN0b3JlaShEbiwwKSxyLnBpeGVsU3RvcmVpKENuLDApLHIucGl4ZWxTdG9yZWkoQm4sMCkpfWZ1bmN0aW9uIF91KHIsZSx0LG4pe24ubWluTWFnJiYodC5jYWxsKHIsZSxncixuLm1pbk1hZyksdC5jYWxsKHIsZSx5cixuLm1pbk1hZykpLG4ubWluJiZ0LmNhbGwocixlLGdyLG4ubWluKSxuLm1hZyYmdC5jYWxsKHIsZSx5cixuLm1hZyksbi53cmFwJiYodC5jYWxsKHIsZSx2dCxuLndyYXApLHQuY2FsbChyLGUsRXQsbi53cmFwKSwoZT09PWJlfHxBcyhyLGUpKSYmdC5jYWxsKHIsZSxGbixuLndyYXApKSxuLndyYXBSJiZ0LmNhbGwocixlLEZuLG4ud3JhcFIpLG4ud3JhcFMmJnQuY2FsbChyLGUsdnQsbi53cmFwUyksbi53cmFwVCYmdC5jYWxsKHIsZSxFdCxuLndyYXBUKSxuLm1pbkxvZCE9PXZvaWQgMCYmdC5jYWxsKHIsZSxyYSxuLm1pbkxvZCksbi5tYXhMb2QhPT12b2lkIDAmJnQuY2FsbChyLGUsbmEsbi5tYXhMb2QpLG4uYmFzZUxldmVsIT09dm9pZCAwJiZ0LmNhbGwocixlLGlhLG4uYmFzZUxldmVsKSxuLm1heExldmVsIT09dm9pZCAwJiZ0LmNhbGwocixlLG9hLG4ubWF4TGV2ZWwpLG4uY29tcGFyZUZ1bmMhPT12b2lkIDAmJnQuY2FsbChyLGUsYWEsbi5jb21wYXJlRnVuYyksbi5jb21wYXJlTW9kZSE9PXZvaWQgMCYmdC5jYWxsKHIsZSxzYSxuLmNvbXBhcmVNb2RlKX1mdW5jdGlvbiB6bihyLGUsdCl7Y29uc3Qgbj10LnRhcmdldHx8c2U7ci5iaW5kVGV4dHVyZShuLGUpLF91KHIsbixyLnRleFBhcmFtZXRlcmksdCl9ZnVuY3Rpb24geHUocil7cmV0dXJuIHI9cnx8b2UudGV4dHVyZUNvbG9yLEhlKHIpP3I6bmV3IFVpbnQ4QXJyYXkoW3JbMF0qMjU1LHJbMV0qMjU1LHJbMl0qMjU1LHJbM10qMjU1XSl9ZnVuY3Rpb24gdnIocixlLHQsbixpLG8pe3Q9dHx8b2UudGV4dHVyZU9wdGlvbnMsbz1vfHxSO2NvbnN0IHM9dC50YXJnZXR8fHNlO2lmKG49bnx8dC53aWR0aCxpPWl8fHQuaGVpZ2h0LHIuYmluZFRleHR1cmUocyxlKSxndShyLG4saSxvKSlyLmdlbmVyYXRlTWlwbWFwKHMpO2Vsc2V7Y29uc3QgYT15dShvKT9xczpRcztyLnRleFBhcmFtZXRlcmkocyxncixhKSxyLnRleFBhcmFtZXRlcmkocyx5cixhKSxyLnRleFBhcmFtZXRlcmkocyx2dCx4dCksci50ZXhQYXJhbWV0ZXJpKHMsRXQseHQpfX1mdW5jdGlvbiBRZShyKXtyZXR1cm4gci5hdXRvPT09ITB8fHIuYXV0bz09PXZvaWQgMCYmci5sZXZlbD09PXZvaWQgMH1mdW5jdGlvbiBFcihyLGUpe3JldHVybiBlPWV8fHt9LGUuY3ViZUZhY2VPcmRlcnx8W3ByLEtzLEpzLFpzLGVhLHRhXX1mdW5jdGlvbiBUcihyLGUpe2NvbnN0IG49RXIocixlKS5tYXAoZnVuY3Rpb24oaSxvKXtyZXR1cm57ZmFjZTppLG5keDpvfX0pO3JldHVybiBuLnNvcnQoZnVuY3Rpb24oaSxvKXtyZXR1cm4gaS5mYWNlLW8uZmFjZX0pLG59ZnVuY3Rpb24gR24ocixlLHQsbil7bj1ufHxvZS50ZXh0dXJlT3B0aW9ucztjb25zdCBpPW4udGFyZ2V0fHxzZSxvPW4ubGV2ZWx8fDA7bGV0IHM9dC53aWR0aCxhPXQuaGVpZ2h0O2NvbnN0IHU9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fFIsZj1YZSh1KSxkPW4uZm9ybWF0fHxmLmZvcm1hdCxwPW4udHlwZXx8Zi50eXBlO2lmKE1lKHIsbiksci5iaW5kVGV4dHVyZShpLGUpLGk9PT1hZSl7Y29uc3QgZz10LndpZHRoLGI9dC5oZWlnaHQ7bGV0IGgsXztpZihnLzY9PT1iKWg9YixfPVswLDAsMSwwLDIsMCwzLDAsNCwwLDUsMF07ZWxzZSBpZihiLzY9PT1nKWg9ZyxfPVswLDAsMCwxLDAsMiwwLDMsMCw0LDAsNV07ZWxzZSBpZihnLzM9PT1iLzIpaD1nLzMsXz1bMCwwLDEsMCwyLDAsMCwxLDEsMSwyLDFdO2Vsc2UgaWYoZy8yPT09Yi8zKWg9Zy8yLF89WzAsMCwxLDAsMCwxLDEsMSwwLDIsMSwyXTtlbHNlIHRocm93ImNhbid0IGZpZ3VyZSBvdXQgY3ViZSBtYXAgZnJvbSBlbGVtZW50OiAiKyh0LnNyYz90LnNyYzp0Lm5vZGVOYW1lKTtjb25zdCBFPXduKCk7RT8oRS5jYW52YXMud2lkdGg9aCxFLmNhbnZhcy5oZWlnaHQ9aCxzPWgsYT1oLFRyKHIsbikuZm9yRWFjaChmdW5jdGlvbih2KXtjb25zdCBGPV9bdi5uZHgqMiswXSpoLGs9X1t2Lm5keCoyKzFdKmg7RS5kcmF3SW1hZ2UodCxGLGssaCxoLDAsMCxoLGgpLHIudGV4SW1hZ2UyRCh2LmZhY2Usbyx1LGQscCxFLmNhbnZhcyl9KSxFLmNhbnZhcy53aWR0aD0xLEUuY2FudmFzLmhlaWdodD0xKTp0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXA8InUiJiYocz1oLGE9aCxUcihyLG4pLmZvckVhY2goZnVuY3Rpb24odil7Y29uc3QgRj1fW3YubmR4KjIrMF0qaCxrPV9bdi5uZHgqMisxXSpoO3IudGV4SW1hZ2UyRCh2LmZhY2Usbyx1LGgsaCwwLGQscCxudWxsKSxjcmVhdGVJbWFnZUJpdG1hcCh0LEYsayxoLGgse3ByZW11bHRpcGx5QWxwaGE6Im5vbmUiLGNvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pLnRoZW4oZnVuY3Rpb24oRyl7TWUocixuKSxyLmJpbmRUZXh0dXJlKGksZSksci50ZXhJbWFnZTJEKHYuZmFjZSxvLHUsZCxwLEcpLFFlKG4pJiZ2cihyLGUsbixzLGEsdSl9KX0pKX1lbHNlIGlmKGk9PT1iZXx8aT09PV9lKXtjb25zdCBnPU1hdGgubWluKHQud2lkdGgsdC5oZWlnaHQpLGI9TWF0aC5tYXgodC53aWR0aCx0LmhlaWdodCksaD1iL2c7aWYoaCUxIT09MCl0aHJvdyJjYW4gbm90IGNvbXB1dGUgM0QgZGltZW5zaW9ucyBvZiBlbGVtZW50Ijtjb25zdCBfPXQud2lkdGg9PT1iPzE6MCxFPXQuaGVpZ2h0PT09Yj8xOjA7ci5waXhlbFN0b3JlaShiciwxKSxyLnBpeGVsU3RvcmVpKFBuLHQud2lkdGgpLHIucGl4ZWxTdG9yZWkoa24sMCksci5waXhlbFN0b3JlaShCbiwwKSxyLnRleEltYWdlM0QoaSxvLHUsZyxnLGcsMCxkLHAsbnVsbCk7Zm9yKGxldCB2PTA7djxoOysrdil7Y29uc3QgRj12KmcqXyxrPXYqZypFO3IucGl4ZWxTdG9yZWkoRG4sRiksci5waXhlbFN0b3JlaShDbixrKSxyLnRleFN1YkltYWdlM0QoaSxvLDAsMCx2LGcsZywxLGQscCx0KX1MbihyKX1lbHNlIHIudGV4SW1hZ2UyRChpLG8sdSxkLHAsdCk7UWUobikmJnZyKHIsZSxuLHMsYSx1KSx6bihyLGUsbil9ZnVuY3Rpb24gcWUoKXt9ZnVuY3Rpb24gdnUocil7aWYodHlwZW9mIGRvY3VtZW50PCJ1Iil7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIGUuaHJlZj1yLGUuaG9zdG5hbWU9PT1sb2NhdGlvbi5ob3N0bmFtZSYmZS5wb3J0PT09bG9jYXRpb24ucG9ydCYmZS5wcm90b2NvbD09PWxvY2F0aW9uLnByb3RvY29sfWVsc2V7Y29uc3QgZT1uZXcgVVJMKGxvY2F0aW9uLmhyZWYpLm9yaWdpbjtyZXR1cm4gbmV3IFVSTChyLGxvY2F0aW9uLmhyZWYpLm9yaWdpbj09PWV9fWZ1bmN0aW9uIEV1KHIsZSl7cmV0dXJuIGU9PT12b2lkIDAmJiF2dShyKT8iYW5vbnltb3VzIjplfWZ1bmN0aW9uIFR1KHIsZSx0KXt0PXR8fHFlO2xldCBuO2lmKGU9ZSE9PXZvaWQgMD9lOm9lLmNyb3NzT3JpZ2luLGU9RXUocixlKSx0eXBlb2YgSW1hZ2U8InUiKXtuPW5ldyBJbWFnZSxlIT09dm9pZCAwJiYobi5jcm9zc09yaWdpbj1lKTtjb25zdCBpPWZ1bmN0aW9uKCl7bi5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixzKSxuPW51bGx9LG89ZnVuY3Rpb24oKXtjb25zdCB1PSJjb3VsZG4ndCBsb2FkIGltYWdlOiAiK3I7cG4odSksdCh1LG4pLGkoKX0scz1mdW5jdGlvbigpe3QobnVsbCxuKSxpKCl9O3JldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixvKSxuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHMpLG4uc3JjPXIsbn1lbHNlIGlmKHR5cGVvZiBJbWFnZUJpdG1hcDwidSIpe2xldCBpLG87Y29uc3Qgcz1mdW5jdGlvbigpe3QoaSxvKX0sYT17fTtlJiYoYS5tb2RlPSJjb3JzIiksZmV0Y2gocixhKS50aGVuKGZ1bmN0aW9uKHUpe2lmKCF1Lm9rKXRocm93IHU7cmV0dXJuIHUuYmxvYigpfSkudGhlbihmdW5jdGlvbih1KXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodSx7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSl9KS50aGVuKGZ1bmN0aW9uKHUpe289dSxzZXRUaW1lb3V0KHMpfSkuY2F0Y2goZnVuY3Rpb24odSl7aT11LHNldFRpbWVvdXQocyl9KSxuPW51bGx9cmV0dXJuIG59ZnVuY3Rpb24gJG4ocil7cmV0dXJuIHR5cGVvZiBJbWFnZUJpdG1hcDwidSImJnIgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcHx8dHlwZW9mIEltYWdlRGF0YTwidSImJnIgaW5zdGFuY2VvZiBJbWFnZURhdGF8fHR5cGVvZiBIVE1MRWxlbWVudDwidSImJnIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH1mdW5jdGlvbiB3cihyLGUsdCl7cmV0dXJuICRuKHIpPyhzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dChudWxsLHIpfSkscik6VHUocixlLHQpfWZ1bmN0aW9uIEFyKHIsZSx0KXt0PXR8fG9lLnRleHR1cmVPcHRpb25zO2NvbnN0IG49dC50YXJnZXR8fHNlO2lmKHIuYmluZFRleHR1cmUobixlKSx0LmNvbG9yPT09ITEpcmV0dXJuO2NvbnN0IGk9eHUodC5jb2xvcik7aWYobj09PWFlKWZvcihsZXQgbz0wO288NjsrK28pci50ZXhJbWFnZTJEKHByK28sMCxSLDEsMSwwLFIsUyxpKTtlbHNlIG49PT1iZXx8bj09PV9lP3IudGV4SW1hZ2UzRChuLDAsUiwxLDEsMSwwLFIsUyxpKTpyLnRleEltYWdlMkQobiwwLFIsMSwxLDAsUixTLGkpfWZ1bmN0aW9uIHd1KHIsZSx0LG4pe3JldHVybiBuPW58fHFlLHQ9dHx8b2UudGV4dHVyZU9wdGlvbnMsQXIocixlLHQpLHQ9T2JqZWN0LmFzc2lnbih7fSx0KSx3cih0LnNyYyx0LmNyb3NzT3JpZ2luLGZ1bmN0aW9uKG8scyl7bz9uKG8sZSxzKTooR24ocixlLHMsdCksbihudWxsLGUscykpfSl9ZnVuY3Rpb24gQXUocixlLHQsbil7bj1ufHxxZTtjb25zdCBpPXQuc3JjO2lmKGkubGVuZ3RoIT09Nil0aHJvdyJ0aGVyZSBtdXN0IGJlIDYgdXJscyBmb3IgYSBjdWJlbWFwIjtjb25zdCBvPXQubGV2ZWx8fDAscz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8UixhPVhlKHMpLHU9dC5mb3JtYXR8fGEuZm9ybWF0LGY9dC50eXBlfHxTLGQ9dC50YXJnZXR8fHNlO2lmKGQhPT1hZSl0aHJvdyJ0YXJnZXQgbXVzdCBiZSBURVhUVVJFX0NVQkVfTUFQIjtBcihyLGUsdCksdD1PYmplY3QuYXNzaWduKHt9LHQpO2xldCBwPTY7Y29uc3QgZz1bXSxiPUVyKHIsdCk7bGV0IGg7ZnVuY3Rpb24gXyhFKXtyZXR1cm4gZnVuY3Rpb24odixGKXstLXAsdj9nLnB1c2godik6Ri53aWR0aCE9PUYuaGVpZ2h0P2cucHVzaCgiY3ViZW1hcCBmYWNlIGltZyBpcyBub3QgYSBzcXVhcmU6ICIrRi5zcmMpOihNZShyLHQpLHIuYmluZFRleHR1cmUoZCxlKSxwPT09NT9FcigpLmZvckVhY2goZnVuY3Rpb24oayl7ci50ZXhJbWFnZTJEKGssbyxzLHUsZixGKX0pOnIudGV4SW1hZ2UyRChFLG8scyx1LGYsRiksUWUodCkmJnIuZ2VuZXJhdGVNaXBtYXAoZCkpLHA9PT0wJiZuKGcubGVuZ3RoP2c6dm9pZCAwLGUsaCl9fWg9aS5tYXAoZnVuY3Rpb24oRSx2KXtyZXR1cm4gd3IoRSx0LmNyb3NzT3JpZ2luLF8oYlt2XSkpfSl9ZnVuY3Rpb24gSXUocixlLHQsbil7bj1ufHxxZTtjb25zdCBpPXQuc3JjLG89dC5pbnRlcm5hbEZvcm1hdHx8dC5mb3JtYXR8fFIscz1YZShvKSxhPXQuZm9ybWF0fHxzLmZvcm1hdCx1PXQudHlwZXx8UyxmPXQudGFyZ2V0fHxfZTtpZihmIT09YmUmJmYhPT1fZSl0aHJvdyJ0YXJnZXQgbXVzdCBiZSBURVhUVVJFXzNEIG9yIFRFWFRVUkVfMkRfQVJSQVkiO0FyKHIsZSx0KSx0PU9iamVjdC5hc3NpZ24oe30sdCk7bGV0IGQ9aS5sZW5ndGg7Y29uc3QgcD1bXTtsZXQgZztjb25zdCBiPXQubGV2ZWx8fDA7bGV0IGg9dC53aWR0aCxfPXQuaGVpZ2h0O2NvbnN0IEU9aS5sZW5ndGg7bGV0IHY9ITA7ZnVuY3Rpb24gRihrKXtyZXR1cm4gZnVuY3Rpb24oRyx6KXtpZigtLWQsRylwLnB1c2goRyk7ZWxzZXtpZihNZShyLHQpLHIuYmluZFRleHR1cmUoZixlKSx2KXt2PSExLGg9dC53aWR0aHx8ei53aWR0aCxfPXQuaGVpZ2h0fHx6LmhlaWdodCxyLnRleEltYWdlM0QoZixiLG8saCxfLEUsMCxhLHUsbnVsbCk7Zm9yKGxldCBIPTA7SDxFOysrSClyLnRleFN1YkltYWdlM0QoZixiLDAsMCxILGgsXywxLGEsdSx6KX1lbHNle2xldCBIPXosJDsoei53aWR0aCE9PWh8fHouaGVpZ2h0IT09XykmJigkPXduKCksSD0kLmNhbnZhcywkLmNhbnZhcy53aWR0aD1oLCQuY2FudmFzLmhlaWdodD1fLCQuZHJhd0ltYWdlKHosMCwwLGgsXykpLHIudGV4U3ViSW1hZ2UzRChmLGIsMCwwLGssaCxfLDEsYSx1LEgpLCQmJkg9PT0kLmNhbnZhcyYmKCQuY2FudmFzLndpZHRoPTAsJC5jYW52YXMuaGVpZ2h0PTApfVFlKHQpJiZyLmdlbmVyYXRlTWlwbWFwKGYpfWQ9PT0wJiZuKHAubGVuZ3RoP3A6dm9pZCAwLGUsZyl9fWc9aS5tYXAoZnVuY3Rpb24oayxHKXtyZXR1cm4gd3Ioayx0LmNyb3NzT3JpZ2luLEYoRykpfSl9ZnVuY3Rpb24gU3UocixlLHQsbil7bj1ufHxvZS50ZXh0dXJlT3B0aW9ucztjb25zdCBpPW4udGFyZ2V0fHxzZTtyLmJpbmRUZXh0dXJlKGksZSk7bGV0IG89bi53aWR0aCxzPW4uaGVpZ2h0LGE9bi5kZXB0aDtjb25zdCB1PW4ubGV2ZWx8fDAsZj1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8UixkPVhlKGYpLHA9bi5mb3JtYXR8fGQuZm9ybWF0LGc9bi50eXBlfHxidShyLHQsZC50eXBlKTtpZihIZSh0KSl0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkmJih0PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSk7ZWxzZXtjb25zdCBFPW1uKGcpO3Q9bmV3IEUodCl9Y29uc3QgYj1wdShmLGcpLGg9dC5ieXRlTGVuZ3RoL2I7aWYoaCUxKXRocm93Imxlbmd0aCB3cm9uZyBzaXplIGZvciBmb3JtYXQ6ICIrVG4ocixwKTtsZXQgXztpZihpPT09YmV8fGk9PT1fZSlpZighbyYmIXMmJiFhKXtjb25zdCBFPU1hdGguY2JydChoKTtpZihFJTEhPT0wKXRocm93ImNhbid0IGd1ZXNzIGN1YmUgc2l6ZSBvZiBhcnJheSBvZiBudW1FbGVtZW50czogIitoO289RSxzPUUsYT1FfWVsc2UgbyYmKCFzfHwhYSk/KF89UnQocixpLHMsYSxoL28pLHM9Xy53aWR0aCxhPV8uaGVpZ2h0KTpzJiYoIW98fCFhKT8oXz1SdChyLGksbyxhLGgvcyksbz1fLndpZHRoLGE9Xy5oZWlnaHQpOihfPVJ0KHIsaSxvLHMsaC9hKSxvPV8ud2lkdGgscz1fLmhlaWdodCk7ZWxzZSBfPVJ0KHIsaSxvLHMsaCksbz1fLndpZHRoLHM9Xy5oZWlnaHQ7aWYoTG4ociksci5waXhlbFN0b3JlaShicixuLnVucGFja0FsaWdubWVudHx8MSksTWUocixuKSxpPT09YWUpe2NvbnN0IEU9Yi90LkJZVEVTX1BFUl9FTEVNRU5ULHY9aC82KkU7VHIocixuKS5mb3JFYWNoKEY9Pntjb25zdCBrPXYqRi5uZHgsRz10LnN1YmFycmF5KGssayt2KTtyLnRleEltYWdlMkQoRi5mYWNlLHUsZixvLHMsMCxwLGcsRyl9KX1lbHNlIGk9PT1iZXx8aT09PV9lP3IudGV4SW1hZ2UzRChpLHUsZixvLHMsYSwwLHAsZyx0KTpyLnRleEltYWdlMkQoaSx1LGYsbyxzLDAscCxnLHQpO3JldHVybnt3aWR0aDpvLGhlaWdodDpzLGRlcHRoOmEsdHlwZTpnfX1mdW5jdGlvbiBSdShyLGUsdCl7Y29uc3Qgbj10LnRhcmdldHx8c2U7ci5iaW5kVGV4dHVyZShuLGUpO2NvbnN0IGk9dC5sZXZlbHx8MCxvPXQuaW50ZXJuYWxGb3JtYXR8fHQuZm9ybWF0fHxSLHM9WGUobyksYT10LmZvcm1hdHx8cy5mb3JtYXQsdT10LnR5cGV8fHMudHlwZTtpZihNZShyLHQpLG49PT1hZSlmb3IobGV0IGY9MDtmPDY7KytmKXIudGV4SW1hZ2UyRChwcitmLGksbyx0LndpZHRoLHQuaGVpZ2h0LDAsYSx1LG51bGwpO2Vsc2Ugbj09PWJlfHxuPT09X2U/ci50ZXhJbWFnZTNEKG4saSxvLHQud2lkdGgsdC5oZWlnaHQsdC5kZXB0aCwwLGEsdSxudWxsKTpyLnRleEltYWdlMkQobixpLG8sdC53aWR0aCx0LmhlaWdodCwwLGEsdSxudWxsKX1mdW5jdGlvbiBXbihyLGUsdCl7dD10fHxxZSxlPWV8fG9lLnRleHR1cmVPcHRpb25zO2NvbnN0IG49ci5jcmVhdGVUZXh0dXJlKCksaT1lLnRhcmdldHx8c2U7bGV0IG89ZS53aWR0aHx8MSxzPWUuaGVpZ2h0fHwxO2NvbnN0IGE9ZS5pbnRlcm5hbEZvcm1hdHx8UjtyLmJpbmRUZXh0dXJlKGksbiksaT09PWFlJiYoci50ZXhQYXJhbWV0ZXJpKGksdnQseHQpLHIudGV4UGFyYW1ldGVyaShpLEV0LHh0KSk7bGV0IHU9ZS5zcmM7aWYodSlpZih0eXBlb2YgdT09ImZ1bmN0aW9uIiYmKHU9dShyLGUpKSx0eXBlb2YgdT09InN0cmluZyIpd3UocixuLGUsdCk7ZWxzZSBpZihIZSh1KXx8QXJyYXkuaXNBcnJheSh1KSYmKHR5cGVvZiB1WzBdPT0ibnVtYmVyInx8QXJyYXkuaXNBcnJheSh1WzBdKXx8SGUodVswXSkpKXtjb25zdCBmPVN1KHIsbix1LGUpO289Zi53aWR0aCxzPWYuaGVpZ2h0fWVsc2UgQXJyYXkuaXNBcnJheSh1KSYmKHR5cGVvZiB1WzBdPT0ic3RyaW5nInx8JG4odVswXSkpP2k9PT1hZT9BdShyLG4sZSx0KTpJdShyLG4sZSx0KTooR24ocixuLHUsZSksbz11LndpZHRoLHM9dS5oZWlnaHQpO2Vsc2UgUnUocixuLGUpO3JldHVybiBRZShlKSYmdnIocixuLGUsbyxzLGEpLHpuKHIsbixlKSxufWNvbnN0IElyPXBuO2Z1bmN0aW9uIFZuKHIpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChyKTpudWxsfWNvbnN0IEZ0PTMzOTg0LFB0PTM0OTYyLEZ1PTM0OTYzLFB1PTM1NzEzLGt1PTM1NzE0LER1PTM1NjMyLEN1PTM1NjMzLEJ1PTM1OTgxLEhuPTM1NzE4LE11PTM1NzIxLE91PTM1OTcxLFV1PTM1MzgyLE51PTM1Mzk2LEx1PTM1Mzk4LHp1PTM1MzkyLEd1PTM1Mzk1LGt0PTUxMjYsam49MzU2NjQsWW49MzU2NjUsWG49MzU2NjYsU3I9NTEyNCxRbj0zNTY2Nyxxbj0zNTY2OCxLbj0zNTY2OSxKbj0zNTY3MCxabj0zNTY3MSxlaT0zNTY3Mix0aT0zNTY3MyxyaT0zNTY3NCxuaT0zNTY3NSxpaT0zNTY3NiwkdT0zNTY3OCxXdT0zNTY4MCxWdT0zNTY3OSxIdT0zNTY4MixqdT0zNTY4NSxZdT0zNTY4NixYdT0zNTY4NyxRdT0zNTY4OCxxdT0zNTY4OSxLdT0zNTY5MCxKdT0zNjI4OSxadT0zNjI5MixlYz0zNjI5MyxScj01MTI1LG9pPTM2Mjk0LHNpPTM2Mjk1LGFpPTM2Mjk2LHRjPTM2Mjk4LHJjPTM2Mjk5LG5jPTM2MzAwLGljPTM2MzAzLG9jPTM2MzA2LHNjPTM2MzA3LGFjPTM2MzA4LHVjPTM2MzExLER0PTM1NTMsQ3Q9MzQwNjcsRnI9MzI4NzksQnQ9MzU4NjYseD17fTtmdW5jdGlvbiB1aShyLGUpe3JldHVybiB4W2VdLmJpbmRQb2ludH1mdW5jdGlvbiBjYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xZihlLHQpfX1mdW5jdGlvbiBmYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xZnYoZSx0KX19ZnVuY3Rpb24gbGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMmZ2KGUsdCl9fWZ1bmN0aW9uIGRjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTNmdihlLHQpfX1mdW5jdGlvbiBoYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm00ZnYoZSx0KX19ZnVuY3Rpb24gY2kocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWkoZSx0KX19ZnVuY3Rpb24gZmkocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWl2KGUsdCl9fWZ1bmN0aW9uIGxpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJpdihlLHQpfX1mdW5jdGlvbiBkaShyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0zaXYoZSx0KX19ZnVuY3Rpb24gaGkocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNGl2KGUsdCl9fWZ1bmN0aW9uIG1jKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTF1aShlLHQpfX1mdW5jdGlvbiBwYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xdWl2KGUsdCl9fWZ1bmN0aW9uIGdjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJ1aXYoZSx0KX19ZnVuY3Rpb24geWMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtM3VpdihlLHQpfX1mdW5jdGlvbiBiYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm00dWl2KGUsdCl9fWZ1bmN0aW9uIF9jKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDJmdihlLCExLHQpfX1mdW5jdGlvbiB4YyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzZnYoZSwhMSx0KX19ZnVuY3Rpb24gdmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtTWF0cml4NGZ2KGUsITEsdCl9fWZ1bmN0aW9uIEVjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDJ4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIFRjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDN4MmZ2KGUsITEsdCl9fWZ1bmN0aW9uIHdjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDJ4NGZ2KGUsITEsdCl9fWZ1bmN0aW9uIEFjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDR4MmZ2KGUsITEsdCl9fWZ1bmN0aW9uIEljKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDN4NGZ2KGUsITEsdCl9fWZ1bmN0aW9uIFNjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDR4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIE4ocixlLHQsbil7Y29uc3QgaT11aShyLGUpO3JldHVybiBWZShyKT9mdW5jdGlvbihvKXtsZXQgcyxhOyFvfHxkcihyLG8pPyhzPW8sYT1udWxsKToocz1vLnRleHR1cmUsYT1vLnNhbXBsZXIpLHIudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKEZ0K3QpLHIuYmluZFRleHR1cmUoaSxzKSxyLmJpbmRTYW1wbGVyKHQsYSl9OmZ1bmN0aW9uKG8pe3IudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKEZ0K3QpLHIuYmluZFRleHR1cmUoaSxvKX19ZnVuY3Rpb24gTChyLGUsdCxuLGkpe2NvbnN0IG89dWkocixlKSxzPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgYT0wO2E8aTsrK2Epc1thXT10K2E7cmV0dXJuIFZlKHIpP2Z1bmN0aW9uKGEpe3IudW5pZm9ybTFpdihuLHMpLGEuZm9yRWFjaChmdW5jdGlvbih1LGYpe3IuYWN0aXZlVGV4dHVyZShGdCtzW2ZdKTtsZXQgZCxwOyF1fHxkcihyLHUpPyhkPXUscD1udWxsKTooZD11LnRleHR1cmUscD11LnNhbXBsZXIpLHIuYmluZFNhbXBsZXIodCxwKSxyLmJpbmRUZXh0dXJlKG8sZCl9KX06ZnVuY3Rpb24oYSl7ci51bmlmb3JtMWl2KG4scyksYS5mb3JFYWNoKGZ1bmN0aW9uKHUsZil7ci5hY3RpdmVUZXh0dXJlKEZ0K3NbZl0pLHIuYmluZFRleHR1cmUobyx1KX0pfX14W2t0XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0LHNldHRlcjpjYyxhcnJheVNldHRlcjpmY30seFtqbl09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6OCxzZXR0ZXI6bGMsY29sczoyfSx4W1luXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6ZGMsY29sczozfSx4W1huXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6aGMsY29sczo0fSx4W1NyXT17VHlwZTpJbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6Y2ksYXJyYXlTZXR0ZXI6Zml9LHhbUW5dPXtUeXBlOkludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpsaSxjb2xzOjJ9LHhbcW5dPXtUeXBlOkludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6ZGksY29sczozfSx4W0tuXT17VHlwZTpJbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOmhpLGNvbHM6NH0seFtScl09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo0LHNldHRlcjptYyxhcnJheVNldHRlcjpwY30seFtvaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpnYyxjb2xzOjJ9LHhbc2ldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTIsc2V0dGVyOnljLGNvbHM6M30seFthaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6YmMsY29sczo0fSx4W0puXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOmNpLGFycmF5U2V0dGVyOmZpfSx4W1puXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOmxpLGNvbHM6Mn0seFtlaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6ZGksY29sczozfSx4W3RpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpoaSxjb2xzOjR9LHhbcmldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpfYyxyb3dzOjIsY29sczoyfSx4W25pXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6eGMscm93czozLGNvbHM6M30seFtpaV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOnZjLHJvd3M6NCxjb2xzOjR9LHhbanVdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpFYyxyb3dzOjIsY29sczozfSx4W1l1XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTozMixzZXR0ZXI6d2Mscm93czoyLGNvbHM6NH0seFtYdV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOlRjLHJvd3M6Myxjb2xzOjJ9LHhbUXVdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpJYyxyb3dzOjMsY29sczo0fSx4W3F1XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6QWMscm93czo0LGNvbHM6Mn0seFtLdV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOlNjLHJvd3M6NCxjb2xzOjN9LHhbJHVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkR0fSx4W1d1XT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpDdH0seFtWdV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6RnJ9LHhbSHVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkR0fSx4W0p1XT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpCdH0seFtadV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6QnR9LHhbZWNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkN0fSx4W3RjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpEdH0seFtyY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6RnJ9LHhbbmNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkN0fSx4W2ljXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpCdH0seFtvY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6RHR9LHhbc2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkZyfSx4W2FjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpDdH0seFt1Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6QnR9O2Z1bmN0aW9uIE10KHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKHQudmFsdWUpc3dpdGNoKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmFsdWUubGVuZ3RoKXtjYXNlIDQ6ci52ZXJ0ZXhBdHRyaWI0ZnYoZSx0LnZhbHVlKTticmVhaztjYXNlIDM6ci52ZXJ0ZXhBdHRyaWIzZnYoZSx0LnZhbHVlKTticmVhaztjYXNlIDI6ci52ZXJ0ZXhBdHRyaWIyZnYoZSx0LnZhbHVlKTticmVhaztjYXNlIDE6ci52ZXJ0ZXhBdHRyaWIxZnYoZSx0LnZhbHVlKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBhIGZsb2F0IGNvbnN0YW50IHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0ISIpfWVsc2Ugci5iaW5kQnVmZmVyKFB0LHQuYnVmZmVyKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHIudmVydGV4QXR0cmliUG9pbnRlcihlLHQubnVtQ29tcG9uZW50c3x8dC5zaXplLHQudHlwZXx8a3QsdC5ub3JtYWxpemV8fCExLHQuc3RyaWRlfHwwLHQub2Zmc2V0fHwwKSxyLnZlcnRleEF0dHJpYkRpdmlzb3ImJnIudmVydGV4QXR0cmliRGl2aXNvcihlLHQuZGl2aXNvcnx8MCl9fWZ1bmN0aW9uIGNlKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKHQudmFsdWUpaWYoci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSksdC52YWx1ZS5sZW5ndGg9PT00KXIudmVydGV4QXR0cmliNGl2KGUsdC52YWx1ZSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRoZSBsZW5ndGggb2YgYW4gaW50ZWdlciBjb25zdGFudCB2YWx1ZSBtdXN0IGJlIDQhIik7ZWxzZSByLmJpbmRCdWZmZXIoUHQsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLHQubnVtQ29tcG9uZW50c3x8dC5zaXplLHQudHlwZXx8U3IsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gT3QocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlpZihyLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZhbHVlLmxlbmd0aD09PTQpci52ZXJ0ZXhBdHRyaWI0dWl2KGUsdC52YWx1ZSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRoZSBsZW5ndGggb2YgYW4gdW5zaWduZWQgaW50ZWdlciBjb25zdGFudCB2YWx1ZSBtdXN0IGJlIDQhIik7ZWxzZSByLmJpbmRCdWZmZXIoUHQsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLHQubnVtQ29tcG9uZW50c3x8dC5zaXplLHQudHlwZXx8UnIsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gUHIocixlLHQpe2NvbnN0IG49dC5zaXplLGk9dC5jb3VudDtyZXR1cm4gZnVuY3Rpb24obyl7ci5iaW5kQnVmZmVyKFB0LG8uYnVmZmVyKTtjb25zdCBzPW8uc2l6ZXx8by5udW1Db21wb25lbnRzfHxuLGE9cy9pLHU9by50eXBlfHxrdCxkPXhbdV0uc2l6ZSpzLHA9by5ub3JtYWxpemV8fCExLGc9by5vZmZzZXR8fDAsYj1kL2k7Zm9yKGxldCBoPTA7aDxpOysraClyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUraCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUraCxhLHUscCxkLGcrYipoKSxyLnZlcnRleEF0dHJpYkRpdmlzb3ImJnIudmVydGV4QXR0cmliRGl2aXNvcihlK2gsby5kaXZpc29yfHwwKX19Y29uc3QgUD17fTtQW2t0XT17c2l6ZTo0LHNldHRlcjpNdH0sUFtqbl09e3NpemU6OCxzZXR0ZXI6TXR9LFBbWW5dPXtzaXplOjEyLHNldHRlcjpNdH0sUFtYbl09e3NpemU6MTYsc2V0dGVyOk10fSxQW1NyXT17c2l6ZTo0LHNldHRlcjpjZX0sUFtRbl09e3NpemU6OCxzZXR0ZXI6Y2V9LFBbcW5dPXtzaXplOjEyLHNldHRlcjpjZX0sUFtLbl09e3NpemU6MTYsc2V0dGVyOmNlfSxQW1JyXT17c2l6ZTo0LHNldHRlcjpPdH0sUFtvaV09e3NpemU6OCxzZXR0ZXI6T3R9LFBbc2ldPXtzaXplOjEyLHNldHRlcjpPdH0sUFthaV09e3NpemU6MTYsc2V0dGVyOk90fSxQW0puXT17c2l6ZTo0LHNldHRlcjpjZX0sUFtabl09e3NpemU6OCxzZXR0ZXI6Y2V9LFBbZWldPXtzaXplOjEyLHNldHRlcjpjZX0sUFt0aV09e3NpemU6MTYsc2V0dGVyOmNlfSxQW3JpXT17c2l6ZTo0LHNldHRlcjpQcixjb3VudDoyfSxQW25pXT17c2l6ZTo5LHNldHRlcjpQcixjb3VudDozfSxQW2lpXT17c2l6ZToxNixzZXR0ZXI6UHIsY291bnQ6NH07Y29uc3QgUmM9L0VSUk9SOlxzKlxkKzooXGQrKS9naTtmdW5jdGlvbiBGYyhyLGU9IiIsdD0wKXtjb25zdCBuPVsuLi5lLm1hdGNoQWxsKFJjKV0saT1uZXcgTWFwKG4ubWFwKChvLHMpPT57Y29uc3QgYT1wYXJzZUludChvWzFdKSx1PW5bcysxXSxmPXU/dS5pbmRleDplLmxlbmd0aCxkPWUuc3Vic3RyaW5nKG8uaW5kZXgsZik7cmV0dXJuW2EtMSxkXX0pKTtyZXR1cm4gci5zcGxpdChgCmApLm1hcCgobyxzKT0+e2NvbnN0IGE9aS5nZXQocyk7cmV0dXJuYCR7cysxK3R9OiAke299JHthP2AKCl5eXiAke2F9YDoiIn1gfSkuam9pbihgCmApfWNvbnN0IG1pPS9eWyBcdF0qXG4vO2Z1bmN0aW9uIHBpKHIpe2xldCBlPTA7cmV0dXJuIG1pLnRlc3QocikmJihlPTEscj1yLnJlcGxhY2UobWksIiIpKSx7bGluZU9mZnNldDplLHNoYWRlclNvdXJjZTpyfX1mdW5jdGlvbiBQYyhyLGUpe3JldHVybiByLmVycm9yQ2FsbGJhY2soZSksci5jYWxsYmFjayYmc2V0VGltZW91dCgoKT0+e3IuY2FsbGJhY2soYCR7ZX0KJHtyLmVycm9ycy5qb2luKGAKYCl9YCl9KSxudWxsfWZ1bmN0aW9uIGtjKHIsZSx0LG4pe2lmKG49bnx8SXIsIXIuZ2V0U2hhZGVyUGFyYW1ldGVyKHQsUHUpKXtjb25zdCBvPXIuZ2V0U2hhZGVySW5mb0xvZyh0KSx7bGluZU9mZnNldDpzLHNoYWRlclNvdXJjZTphfT1waShyLmdldFNoYWRlclNvdXJjZSh0KSksdT1gJHtGYyhhLG8scyl9CkVycm9yIGNvbXBpbGluZyAke1RuKHIsZSl9OiAke299YDtyZXR1cm4gbih1KSx1fXJldHVybiIifWZ1bmN0aW9uIGtyKHIsZSx0KXtsZXQgbixpLG87aWYodHlwZW9mIGU9PSJmdW5jdGlvbiImJih0PWUsZT12b2lkIDApLHR5cGVvZiByPT0iZnVuY3Rpb24iKXQ9cixyPXZvaWQgMDtlbHNlIGlmKHImJiFBcnJheS5pc0FycmF5KHIpKXtjb25zdCBmPXI7dD1mLmVycm9yQ2FsbGJhY2sscj1mLmF0dHJpYkxvY2F0aW9ucyxuPWYudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyxpPWYudHJhbnNmb3JtRmVlZGJhY2tNb2RlLG89Zi5jYWxsYmFja31jb25zdCBzPXR8fElyLGE9W10sdT17ZXJyb3JDYWxsYmFjayhmLC4uLmQpe2EucHVzaChmKSxzKGYsLi4uZCl9LHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6bix0cmFuc2Zvcm1GZWVkYmFja01vZGU6aSxjYWxsYmFjazpvLGVycm9yczphfTt7bGV0IGY9e307QXJyYXkuaXNBcnJheShyKT9yLmZvckVhY2goZnVuY3Rpb24oZCxwKXtmW2RdPWU/ZVtwXTpwfSk6Zj1yfHx7fSx1LmF0dHJpYkxvY2F0aW9ucz1mfXJldHVybiB1fWNvbnN0IERjPVsiVkVSVEVYX1NIQURFUiIsIkZSQUdNRU5UX1NIQURFUiJdO2Z1bmN0aW9uIENjKHIsZSl7aWYoZS5pbmRleE9mKCJmcmFnIik+PTApcmV0dXJuIER1O2lmKGUuaW5kZXhPZigidmVydCIpPj0wKXJldHVybiBDdX1mdW5jdGlvbiBCYyhyLGUsdCl7Y29uc3Qgbj1yLmdldEF0dGFjaGVkU2hhZGVycyhlKTtmb3IoY29uc3QgaSBvZiBuKXQuaGFzKGkpJiZyLmRlbGV0ZVNoYWRlcihpKTtyLmRlbGV0ZVByb2dyYW0oZSl9Y29uc3QgTWM9KHI9MCk9Pm5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoZSxyKSk7ZnVuY3Rpb24gT2MocixlLHQpe2NvbnN0IG49ci5jcmVhdGVQcm9ncmFtKCkse2F0dHJpYkxvY2F0aW9uczppLHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6byx0cmFuc2Zvcm1GZWVkYmFja01vZGU6c309a3IodCk7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDsrK2Epe2xldCB1PWVbYV07aWYodHlwZW9mIHU9PSJzdHJpbmciKXtjb25zdCBmPVZuKHUpLGQ9Zj9mLnRleHQ6dTtsZXQgcD1yW0RjW2FdXTtmJiZmLnR5cGUmJihwPUNjKHIsZi50eXBlKXx8cCksdT1yLmNyZWF0ZVNoYWRlcihwKSxyLnNoYWRlclNvdXJjZSh1LHBpKGQpLnNoYWRlclNvdXJjZSksci5jb21waWxlU2hhZGVyKHUpLHIuYXR0YWNoU2hhZGVyKG4sdSl9fU9iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goKFthLHVdKT0+ci5iaW5kQXR0cmliTG9jYXRpb24obix1LGEpKTt7bGV0IGE9bzthJiYoYS5hdHRyaWJzJiYoYT1hLmF0dHJpYnMpLEFycmF5LmlzQXJyYXkoYSl8fChhPU9iamVjdC5rZXlzKGEpKSxyLnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MobixhLHN8fEJ1KSl9cmV0dXJuIHIubGlua1Byb2dyYW0obiksbn1mdW5jdGlvbiBVYyhyLGUsdCxuLGkpe2NvbnN0IG89a3IodCxuLGkpLHM9bmV3IFNldChlKSxhPU9jKHIsZSxvKTtmdW5jdGlvbiB1KGYsZCl7Y29uc3QgcD1MYyhmLGQsby5lcnJvckNhbGxiYWNrKTtyZXR1cm4gcCYmQmMoZixkLHMpLHB9aWYoby5jYWxsYmFjayl7TmMocixhKS50aGVuKCgpPT57Y29uc3QgZj11KHIsYSk7by5jYWxsYmFjayhmLGY/dm9pZCAwOmEpfSk7cmV0dXJufXJldHVybiB1KHIsYSk/dm9pZCAwOmF9YXN5bmMgZnVuY3Rpb24gTmMocixlKXtjb25zdCB0PXIuZ2V0RXh0ZW5zaW9uKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSxuPXQ/KG8scyk9Pm8uZ2V0UHJvZ3JhbVBhcmFtZXRlcihzLHQuQ09NUExFVElPTl9TVEFUVVNfS0hSKTooKT0+ITA7bGV0IGk9MDtkbyBhd2FpdCBNYyhpKSxpPTFlMy82MDt3aGlsZSghbihyLGUpKX1mdW5jdGlvbiBMYyhyLGUsdCl7aWYodD10fHxJciwhci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsa3UpKXtjb25zdCBpPXIuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7dChgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke2l9YCk7Y29uc3Qgcz1yLmdldEF0dGFjaGVkU2hhZGVycyhlKS5tYXAoYT0+a2MocixyLmdldFNoYWRlclBhcmFtZXRlcihhLHIuU0hBREVSX1RZUEUpLGEsdCkpO3JldHVybmAke2l9CiR7cy5maWx0ZXIoYT0+YSkuam9pbihgCmApfWB9fWZ1bmN0aW9uIHpjKHIsZSx0LG4saSl7cmV0dXJuIFVjKHIsZSx0LG4saSl9ZnVuY3Rpb24gZ2kocil7Y29uc3QgZT1yLm5hbWU7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZ2xfIil8fGUuc3RhcnRzV2l0aCgid2ViZ2xfIil9Y29uc3QgR2M9LyhcLnxcW3xdfFx3KykvZywkYz1yPT5yPj0iMCImJnI8PSI5IjtmdW5jdGlvbiBXYyhyLGUsdCxuKXtjb25zdCBpPXIuc3BsaXQoR2MpLmZpbHRlcihhPT5hIT09IiIpO2xldCBvPTAscz0iIjtmb3IoOzspe2NvbnN0IGE9aVtvKytdO3MrPWE7Y29uc3QgdT0kYyhhWzBdKSxmPXU/cGFyc2VJbnQoYSk6YTtpZih1JiYocys9aVtvKytdKSxvPT09aS5sZW5ndGgpe3RbZl09ZTticmVha31lbHNle2NvbnN0IHA9aVtvKytdLGc9cD09PSJbIixiPXRbZl18fChnP1tdOnt9KTt0W2ZdPWIsdD1iLG5bc109bltzXXx8ZnVuY3Rpb24oaCl7cmV0dXJuIGZ1bmN0aW9uKF8pe3lpKGgsXyl9fShiKSxzKz1wfX19ZnVuY3Rpb24gVmMocixlKXtsZXQgdD0wO2Z1bmN0aW9uIG4oYSx1LGYpe2NvbnN0IGQ9dS5uYW1lLmVuZHNXaXRoKCJbMF0iKSxwPXUudHlwZSxnPXhbcF07aWYoIWcpdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGU6IDB4JHtwLnRvU3RyaW5nKDE2KX1gKTtsZXQgYjtpZihnLmJpbmRQb2ludCl7Y29uc3QgaD10O3QrPXUuc2l6ZSxkP2I9Zy5hcnJheVNldHRlcihyLHAsaCxmLHUuc2l6ZSk6Yj1nLnNldHRlcihyLHAsaCxmLHUuc2l6ZSl9ZWxzZSBnLmFycmF5U2V0dGVyJiZkP2I9Zy5hcnJheVNldHRlcihyLGYpOmI9Zy5zZXR0ZXIocixmKTtyZXR1cm4gYi5sb2NhdGlvbj1mLGJ9Y29uc3QgaT17fSxvPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsSG4pO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7aWYoZ2kodSkpY29udGludWU7bGV0IGY9dS5uYW1lO2YuZW5kc1dpdGgoIlswXSIpJiYoZj1mLnN1YnN0cigwLGYubGVuZ3RoLTMpKTtjb25zdCBkPXIuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdS5uYW1lKTtpZihkKXtjb25zdCBwPW4oZSx1LGQpO2lbZl09cCxXYyhmLHAsbyxpKX19cmV0dXJuIGl9ZnVuY3Rpb24gSGMocixlKXtjb25zdCB0PXt9LG49ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsT3UpO2ZvcihsZXQgaT0wO2k8bjsrK2kpe2NvbnN0IG89ci5nZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoZSxpKTt0W28ubmFtZV09e2luZGV4OmksdHlwZTpvLnR5cGUsc2l6ZTpvLnNpemV9fXJldHVybiB0fWZ1bmN0aW9uIGpjKHIsZSl7Y29uc3QgdD1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxIbiksbj1bXSxpPVtdO2ZvcihsZXQgYT0wO2E8dDsrK2Epe2kucHVzaChhKSxuLnB1c2goe30pO2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7blthXS5uYW1lPXUubmFtZX1bWyJVTklGT1JNX1RZUEUiLCJ0eXBlIl0sWyJVTklGT1JNX1NJWkUiLCJzaXplIl0sWyJVTklGT1JNX0JMT0NLX0lOREVYIiwiYmxvY2tOZHgiXSxbIlVOSUZPUk1fT0ZGU0VUIiwib2Zmc2V0Il1dLmZvckVhY2goZnVuY3Rpb24oYSl7Y29uc3QgdT1hWzBdLGY9YVsxXTtyLmdldEFjdGl2ZVVuaWZvcm1zKGUsaSxyW3VdKS5mb3JFYWNoKGZ1bmN0aW9uKGQscCl7bltwXVtmXT1kfSl9KTtjb25zdCBvPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsVXUpO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKGUsYSksZj17aW5kZXg6ci5nZXRVbmlmb3JtQmxvY2tJbmRleChlLHUpLHVzZWRCeVZlcnRleFNoYWRlcjpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsTnUpLHVzZWRCeUZyYWdtZW50U2hhZGVyOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxMdSksc2l6ZTpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsenUpLHVuaWZvcm1JbmRpY2VzOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxHdSl9O2YudXNlZD1mLnVzZWRCeVZlcnRleFNoYWRlcnx8Zi51c2VkQnlGcmFnbWVudFNoYWRlcixvW3VdPWZ9cmV0dXJue2Jsb2NrU3BlY3M6byx1bmlmb3JtRGF0YTpufX1mdW5jdGlvbiB5aShyLGUpe2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IG49clt0XTt0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGVbdF0pOnlpKHJbdF0sZVt0XSl9fWZ1bmN0aW9uIGJpKHIsLi4uZSl7Y29uc3QgdD1yLnVuaWZvcm1TZXR0ZXJzfHxyLG49ZS5sZW5ndGg7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1lW2ldO2lmKEFycmF5LmlzQXJyYXkobykpe2NvbnN0IHM9by5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzOysrYSliaSh0LG9bYV0pfWVsc2UgZm9yKGNvbnN0IHMgaW4gbyl7Y29uc3QgYT10W3NdO2EmJmEob1tzXSl9fX1mdW5jdGlvbiBZYyhyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxNdSk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1yLmdldEFjdGl2ZUF0dHJpYihlLGkpO2lmKGdpKG8pKWNvbnRpbnVlO2NvbnN0IHM9ci5nZXRBdHRyaWJMb2NhdGlvbihlLG8ubmFtZSksYT1QW28udHlwZV0sdT1hLnNldHRlcihyLHMsYSk7dS5sb2NhdGlvbj1zLHRbby5uYW1lXT11fXJldHVybiB0fWZ1bmN0aW9uIFhjKHIsZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1yW3RdO24mJm4oZVt0XSl9fWZ1bmN0aW9uIFFjKHIsZSx0KXt0LnZlcnRleEFycmF5T2JqZWN0P3IuYmluZFZlcnRleEFycmF5KHQudmVydGV4QXJyYXlPYmplY3QpOihYYyhlLmF0dHJpYlNldHRlcnN8fGUsdC5hdHRyaWJzKSx0LmluZGljZXMmJnIuYmluZEJ1ZmZlcihGdSx0LmluZGljZXMpKX1mdW5jdGlvbiBfaShyLGUpe2NvbnN0IHQ9VmMocixlKSxuPVljKHIsZSksaT17cHJvZ3JhbTplLHVuaWZvcm1TZXR0ZXJzOnQsYXR0cmliU2V0dGVyczpufTtyZXR1cm4gVmUocikmJihpLnVuaWZvcm1CbG9ja1NwZWM9amMocixlKSxpLnRyYW5zZm9ybUZlZWRiYWNrSW5mbz1IYyhyLGUpKSxpfWNvbnN0IHFjPS9cc3x7fH18Oy87ZnVuY3Rpb24gS2MocixlLHQsbixpKXtjb25zdCBvPWtyKHQsbixpKSxzPVtdO2lmKGU9ZS5tYXAoZnVuY3Rpb24oZil7aWYoIXFjLnRlc3QoZikpe2NvbnN0IGQ9Vm4oZik7aWYoZClmPWQudGV4dDtlbHNle2NvbnN0IHA9YG5vIGVsZW1lbnQgd2l0aCBpZDogJHtmfWA7by5lcnJvckNhbGxiYWNrKHApLHMucHVzaChwKX19cmV0dXJuIGZ9KSxzLmxlbmd0aClyZXR1cm4gUGMobywiIik7Y29uc3QgYT1vLmNhbGxiYWNrO2EmJihvLmNhbGxiYWNrPShmLGQpPT57YShmLGY/dm9pZCAwOl9pKHIsZCkpfSk7Y29uc3QgdT16YyhyLGUsbyk7cmV0dXJuIHU/X2kocix1KTpudWxsfWNvbnN0IEpjPTQseGk9NTEyMztmdW5jdGlvbiBaYyhyLGUsdCxuLGksbyl7dD10PT09dm9pZCAwP0pjOnQ7Y29uc3Qgcz1lLmluZGljZXMsYT1lLmVsZW1lbnRUeXBlLHU9bj09PXZvaWQgMD9lLm51bUVsZW1lbnRzOm47aT1pPT09dm9pZCAwPzA6aSxhfHxzP28hPT12b2lkIDA/ci5kcmF3RWxlbWVudHNJbnN0YW5jZWQodCx1LGE9PT12b2lkIDA/eGk6ZS5lbGVtZW50VHlwZSxpLG8pOnIuZHJhd0VsZW1lbnRzKHQsdSxhPT09dm9pZCAwP3hpOmUuZWxlbWVudFR5cGUsaSk6byE9PXZvaWQgMD9yLmRyYXdBcnJheXNJbnN0YW5jZWQodCxpLHUsbyk6ci5kcmF3QXJyYXlzKHQsaSx1KX1jb25zdCB2aT0zNjE2MCxVdD0zNjE2MSxlZj0zNTUzLHRmPTUxMjEscmY9NjQwMixuZj02NDA4LG9mPTMzMTkwLHNmPTM2MDEyLGFmPTM1MDU2LHVmPTM2MDEzLGNmPTMyODU0LGZmPTMyODU1LGxmPTM2MTk0LEVpPTMzMTg5LFRpPTY0MDEsd2k9MzYxNjgsRHI9MzQwNDEsQ3I9MzYwNjQsTnQ9MzYwOTYsQWk9MzYxMjgsQnI9MzMzMDYsTXI9MzMwNzEsT3I9OTcyOSxkZj1be2Zvcm1hdDpuZix0eXBlOnRmLG1pbjpPcix3cmFwOk1yfSx7Zm9ybWF0OkRyfV0sWT17fTtZW0RyXT1CcixZW1RpXT1BaSxZW3dpXT1BaSxZW3JmXT1OdCxZW0VpXT1OdCxZW29mXT1OdCxZW3NmXT1OdCxZW2FmXT1CcixZW3VmXT1CcjtmdW5jdGlvbiBoZihyLGUpe3JldHVybiBZW3JdfHxZW2VdfWNvbnN0IGZlPXt9O2ZlW2NmXT0hMCxmZVtmZl09ITAsZmVbbGZdPSEwLGZlW0RyXT0hMCxmZVtFaV09ITAsZmVbVGldPSEwLGZlW3dpXT0hMDtmdW5jdGlvbiBtZihyKXtyZXR1cm4gZmVbcl19Y29uc3QgcGY9MzI7ZnVuY3Rpb24gZ2Yocil7cmV0dXJuIHI+PUNyJiZyPENyK3BmfWZ1bmN0aW9uIEx0KHIsZSx0LG4pe2NvbnN0IGk9dmksbz1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ci5iaW5kRnJhbWVidWZmZXIoaSxvKSx0PXR8fHIuZHJhd2luZ0J1ZmZlcldpZHRoLG49bnx8ci5kcmF3aW5nQnVmZmVySGVpZ2h0LGU9ZXx8ZGY7Y29uc3Qgcz1bXSxhPXtmcmFtZWJ1ZmZlcjpvLGF0dGFjaG1lbnRzOltdLHdpZHRoOnQsaGVpZ2h0Om59O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24odSxmKXtsZXQgZD11LmF0dGFjaG1lbnQ7Y29uc3QgcD11LnNhbXBsZXMsZz11LmZvcm1hdDtsZXQgYj11LmF0dGFjaG1lbnRQb2ludHx8aGYoZyx1LmludGVybmFsRm9ybWF0KTtpZihifHwoYj1DcitmKSxnZihiKSYmcy5wdXNoKGIpLCFkKWlmKHAhPT12b2lkIDB8fG1mKGcpKWQ9ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxyLmJpbmRSZW5kZXJidWZmZXIoVXQsZCkscD4xP3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKFV0LHAsZyx0LG4pOnIucmVuZGVyYnVmZmVyU3RvcmFnZShVdCxnLHQsbik7ZWxzZXtjb25zdCBoPU9iamVjdC5hc3NpZ24oe30sdSk7aC53aWR0aD10LGguaGVpZ2h0PW4saC5hdXRvPT09dm9pZCAwJiYoaC5hdXRvPSExLGgubWluPWgubWlufHxoLm1pbk1hZ3x8T3IsaC5tYWc9aC5tYWd8fGgubWluTWFnfHxPcixoLndyYXBTPWgud3JhcFN8fGgud3JhcHx8TXIsaC53cmFwVD1oLndyYXBUfHxoLndyYXB8fE1yKSxkPVduKHIsaCl9aWYod3MocixkKSlyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGksYixVdCxkKTtlbHNlIGlmKGRyKHIsZCkpdS5sYXllciE9PXZvaWQgMD9yLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKGksYixkLHUubGV2ZWx8fDAsdS5sYXllcik6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLGIsdS50YXJnZXR8fGVmLGQsdS5sZXZlbHx8MCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gYXR0YWNobWVudCB0eXBlIik7YS5hdHRhY2htZW50cy5wdXNoKGQpfSksci5kcmF3QnVmZmVycyYmci5kcmF3QnVmZmVycyhzKSxhfWZ1bmN0aW9uIHlmKHIsZSx0KXt0PXR8fHZpLGU/KHIuYmluZEZyYW1lYnVmZmVyKHQsZS5mcmFtZWJ1ZmZlciksci52aWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCkpOihyLmJpbmRGcmFtZWJ1ZmZlcih0LG51bGwpLHIudmlld3BvcnQoMCwwLHIuZHJhd2luZ0J1ZmZlcldpZHRoLHIuZHJhd2luZ0J1ZmZlckhlaWdodCkpfWZ1bmN0aW9uIEkocixlKXtyZXR1cm4oKT0+ZSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT9lOlduKHIse3NyYzplLHdyYXA6ci5DTEFNUF9UT19FREdFfSl9Y29uc3QgT2U9MjtjbGFzcyBFZXtjb25zdHJ1Y3RvcihlKXtsKHRoaXMsImlkIiwiXyIpO2wodGhpcywiY29udGV4dCIpO2wodGhpcywib3V0cHV0Iik7bCh0aGlzLCJmYmkiKTtsKHRoaXMsIm9wdGlvbnMiKTtsKHRoaXMsInByb2dyYW1JbmZvIik7bCh0aGlzLCJidWZmZXJJbmZvIik7bCh0aGlzLCJwcm9maWxlciIpO2wodGhpcywibGFzdFJ1biIpO2NvbnN0e2NvbnRleHQ6dCx3aWR0aDpuLGhlaWdodDppfT1lO3RoaXMuY29udGV4dD10LHRoaXMub3B0aW9ucz1lO2NvbnN0IG89dGhpcy5idWlsZERlZmluZXMoKTt0aGlzLnByb2dyYW1JbmZvPUtjKHRoaXMuY29udGV4dCxbbyt0aGlzLmdldFZlcnRleFNoYWRlcigpLG8rdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpXSksdGhpcy5idWZmZXJJbmZvPVhzKHRoaXMuY29udGV4dCx0aGlzLmdldEJ1ZmZlcnMoKSksdGhpcy5mYmk9THQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLG4saSksdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF19cmVzaXplT3V0cHV0KGUsdCl7dGhpcy5mYmk9THQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLGUsdCksdGhpcy5vcHRpb25zLndpZHRoPWUsdGhpcy5vcHRpb25zLmhlaWdodD10LHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdfWdldERlZmluZXMoKXtyZXR1cm57fX1nZXRCdWZmZXJzKCl7cmV0dXJue3Bvc2l0aW9uOntudW1Db21wb25lbnRzOjIsZGF0YTpbLTEsLTEsLTEsMSwxLC0xLDEsMSwtMSwxLDEsLTFdfSx0ZXh0dXJlX2Nvb3JkOntudW1Db21wb25lbnRzOjIsZGF0YTpbMCwwLDAsMSwxLDAsMSwxLDAsMSwxLDBdfX19YnVpbGREZWZpbmVzKCl7bGV0IGU9IiI7Y29uc3QgdD10aGlzLmdldERlZmluZXMoKTtmb3IobGV0IG4gaW4gdCllKz1gI2RlZmluZSAke259ICR7dFtuXS50b0ZpeGVkKDEpfQpgO3JldHVybiBlfXJ1bihlKXt2YXIgaSxvLHMsYSx1LGY7KGk9dGhpcy5wcm9maWxlcik9PW51bGx8fGkucHVzaENvbnRleHQoYFske3RoaXMuaWR9XSBQUk9HIDogJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YCksKG89dGhpcy5wcm9maWxlcik9PW51bGx8fG8ucHVzaENvbnRleHQoYFske3RoaXMuaWR9XSBVTklGT1JNU2ApO2Zvcihjb25zdCBkIGluIGUpdHlwZW9mIGVbZF09PSJmdW5jdGlvbiImJigocz10aGlzLnByb2ZpbGVyKT09bnVsbHx8cy5wdXNoQ29udGV4dChgWyR7dGhpcy5pZH1dIFVOSSA6ICR7ZH1gKSxlW2RdPWVbZF0oKSwoYT10aGlzLnByb2ZpbGVyKT09bnVsbHx8YS5wb3BDb250ZXh0KGBbJHt0aGlzLmlkfV0gVU5JIDogJHtkfWApKTsodT10aGlzLnByb2ZpbGVyKT09bnVsbHx8dS5wb3BDb250ZXh0KGBbJHt0aGlzLmlkfV0gVU5JRk9STVNgKTtjb25zdCB0PURhdGUubm93KCk7bGV0IG49MDt0aGlzLmxhc3RSdW4mJihuPSh0LXRoaXMubGFzdFJ1bikvMWUzKSx0aGlzLmxhc3RSdW49dCx0aGlzLmNvbnRleHQudmlld3BvcnQoMCwwLHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQpLHRoaXMuY29udGV4dC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbUluZm8ucHJvZ3JhbSksUWModGhpcy5jb250ZXh0LHRoaXMucHJvZ3JhbUluZm8sdGhpcy5idWZmZXJJbmZvKSxiaSh0aGlzLnByb2dyYW1JbmZvLHtkZWx0YTpuLGNhbnZhczpbdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCx0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodF0sLi4uZX0pLHlmKHRoaXMuY29udGV4dCx0aGlzLm9wdGlvbnMuZGlzYWJsZUZyYW1lYnVmZmVyP251bGw6dGhpcy5mYmkpLFpjKHRoaXMuY29udGV4dCx0aGlzLmJ1ZmZlckluZm8pLChmPXRoaXMucHJvZmlsZXIpPT1udWxsfHxmLnBvcENvbnRleHQoYFske3RoaXMuaWR9XSBQUk9HIDogJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YCl9c2V0UHJvZmlsZXIoZSl7dGhpcy5wcm9maWxlcj1lfX12YXIgYmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSBzYW1wbGVyMkQgYmFja2dyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgZm9yZWdyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwoKdm9pZCBtYWluKCkgewogIHZlYzQgYmFja2dyb3VuZENvbG9yID0gdGV4dHVyZTJEKGJhY2tncm91bmQsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IGZvcmVncm91bmRDb2xvciA9IHRleHR1cmUyRChmb3JlZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCB0cmVzaG9sZENvbG9yID0gdGV4dHVyZTJEKHRocmVzaG9sZCwgX3RleHR1cmVfY29vcmQpOwogIGdsX0ZyYWdDb2xvciA9IGZvcmVncm91bmRDb2xvciAqIHRyZXNob2xkQ29sb3IuYSArCiAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yICogKDEuIC0gdHJlc2hvbGRDb2xvci5hKTsKfQpgLF9mPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwogIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKfQpgO2NsYXNzIFVyIGV4dGVuZHMgRWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gYmZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIF9mfX1jbGFzcyBOcntjb25zdHJ1Y3Rvcigpe2wodGhpcywic3RlcHMiLFtdKTtsKHRoaXMsInByb2ZpbGVyIil9YWRkU3RlcChlKXt0aGlzLnN0ZXBzLnB1c2goZSl9YXN5bmMgcnVuKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVwcyllLnByb2dyYW0ucnVuKGUuZ2V0VW5pZm9ybXMoKSl9cmVzaXplT3V0cHV0KGUsdCl7dmFyIG4saTsobj10aGlzLnByb2ZpbGVyKT09bnVsbHx8bi5wdXNoQ29udGV4dChgUElQIFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dYCk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5zdGVwcylvLnByZXZlbnRSZXNpemV8fG8ucHJvZ3JhbS5yZXNpemVPdXRwdXQoZSx0KTsoaT10aGlzLnByb2ZpbGVyKT09bnVsbHx8aS5wb3BDb250ZXh0KGBQSVAgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV1gKX1zZXRQcm9maWxlcihlKXt0aGlzLnByb2ZpbGVyPWU7Zm9yKGNvbnN0IHQgb2YgdGhpcy5zdGVwcyl0LnByb2dyYW0uc2V0UHJvZmlsZXIoZSl9c2V0SWQoZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5zdGVwcyl0LnByb2dyYW0uaWQ9ZX19Y2xhc3MgTHIgZXh0ZW5kcyBOcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7bCh0aGlzLCJwcmVjaXNlTWFza0VuYWJsZWQiLCExKX19Y2xhc3MgSWkgZXh0ZW5kcyBMcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2wodGhpcywiaW5wdXRJbWFnZSIpO2wodGhpcywiaW5wdXRCYWNrZ3JvdW5kSW1hZ2UiKTtsKHRoaXMsImlucHV0TWFzayIpO2wodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMCk7dGhpcy5jb250ZXh0PXQ7Y29uc3Qgbj17Y29udGV4dDp0LGhlaWdodDp0LmNhbnZhcy5oZWlnaHQsd2lkdGg6dC5jYW52YXMud2lkdGh9LGk9bmV3IFVyKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6SSh0LHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6SSh0LHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOkkodCx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEodCxuKXt0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufX12YXIgeGY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOyB9CmAsdmY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIGJvb2wgaW52ZXJ0X3k7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBpZiAoaW52ZXJ0X3kpIHsKICAgIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKICB9Cn0KYDtjbGFzcyBFZiBleHRlbmRzIEVle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHhmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiB2Zn19Y2xhc3MgVGYgZXh0ZW5kcyBOcntjb25zdHJ1Y3Rvcih0LG4saSl7c3VwZXIoKTtsKHRoaXMsImlucHV0SW1hZ2UiKTt0aGlzLmNvbnRleHQ9dDtjb25zdCBvPXtjb250ZXh0OnQsaGVpZ2h0Omksd2lkdGg6bn07dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm5ldyBFZih7Li4ubyxkaXNhYmxlRnJhbWVidWZmZXI6ITB9KSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOkkodCx0aGlzLmlucHV0SW1hZ2UpLGludmVydF95OiEwfSl9KX1zZXREYXRhKHQpe3RoaXMuaW5wdXRJbWFnZT10fX1hc3luYyBmdW5jdGlvbiBTaShyKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3NldFRpbWVvdXQoKCk9PntlKCl9LHIpfSl9dmFyIHdmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2ZWM0IGxvb3AoKTsKCnZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gbG9vcCgpOyB9CmAsQWY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYCx6cj0ocj0+KHJbci5MSU5FQVI9MF09IkxJTkVBUiIscltyLkdBVVNTSUFOPTFdPSJHQVVTU0lBTiIscikpKHpyfHx7fSk7Y2xhc3MgUmkgZXh0ZW5kcyBFZXtnZXREZWZpbmVzKCl7dmFyIGU7cmV0dXJue1JBRElVUzooZT10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD9lOjF9fWdldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHdmK3RoaXMuY3JlYXRlTG9vcEZ1bmN0aW9uKCl9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIEFmfWNyZWF0ZUxvb3BGdW5jdGlvbigpe3ZhciB0O2xldCBlPSh0PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3Q6MTtyZXR1cm5gCgogICAgICAgIHZlYzQgbG9vcCgpIHsgCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLDAsMCwwKTsKICAgICAgICAgICAgZmxvYXQgZmFjdG9yU3VtID0gMC47CgogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRSYWRpdXMgPSB2ZWMyKC0ke2V9LikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZEluY3JlbWVudCA9IHZlYzIoMS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIGRpZmYgPSBub3JtYWxpemVkUmFkaXVzOwoKICAgICAgICAgICAgZm9yKGludCB5PS0ke2V9OyB5PCR7ZSsxfTsgKyt5KSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHg9LSR7ZX07IHg8JHtlKzF9OyArK3gpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAxLjsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZmFjdG9yICogdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkICsgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgZmFjdG9yU3VtICs9IGZhY3RvcjsKICAgICAgICAgICAgICAgICAgICBkaWZmLnggKz0gbm9ybWFsaXplZEluY3JlbWVudC54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlmZi55ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueTsKICAgICAgICAgICAgICAgIGRpZmYueCA9IG5vcm1hbGl6ZWRSYWRpdXMueDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IC8gZmFjdG9yU3VtOwogICAgICAgIH1gfWdldEZhY3RvcihlLHQpe3N3aXRjaCh0aGlzLm9wdGlvbnMudHlwZSl7Y2FzZSAxOnJldHVybiB0aGlzLmdldExpbmVhckZhY3RvcihlLHQpO2Nhc2UgMDpkZWZhdWx0OnJldHVybiB0aGlzLmdldExpbmVhckZhY3RvcihlLHQpfX1nZXRMaW5lYXJGYWN0b3IoZSx0KXtyZXR1cm4gMX1nZXRHYXVzc2lhbkZhY3RvcihlLHQpe3ZhciB1O2NvbnN0IG49TWF0aC5QSSoyLGk9TWF0aC5tYXgoKHU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/dToxLDEpLG89MS8obippKioyKSxzPS0oZSoqMit0KioyKSxhPW8qcztyZXR1cm4gbypNYXRoLkUqKmF9fWNsYXNzIEdyIGV4dGVuZHMgRWV7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7bCh0aGlzLCJmYmkyIik7dGhpcy5mYmkyPUx0KHQuY29udGV4dCxbe2Zvcm1hdDp0LmNvbnRleHQuUkdCQSx0eXBlOnQuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0LmNvbnRleHQuTElORUFSLG1hZzp0LmNvbnRleHQuTElORUFSLHdyYXA6dC5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSx0LndpZHRoLHQuaGVpZ2h0KX1ydW4odCl7Y29uc3Qgbj10aGlzLmZiaTt0aGlzLmZiaT10aGlzLmZiaTIsdGhpcy5mYmkyPW4sdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF0sc3VwZXIucnVuKHsuLi50LHByZXZpb3VzX3JlbmRlcmluZzp0aGlzLmZiaTIuYXR0YWNobWVudHNbMF19KX1yZXNpemVPdXRwdXQodCxuKXtzdXBlci5yZXNpemVPdXRwdXQodCxuKSx0aGlzLmZiaTI9THQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLHQsbil9fXZhciBJZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgovLyB1bmlmb3JtIGZsb2F0IHRyZXNob2xkOwp1bmlmb3JtIHNhbXBsZXIyRCBpbWFnZV9ub3c7CnVuaWZvcm0gc2FtcGxlcjJEIGltYWdlX2JlZm9yZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFza19ub3c7CnVuaWZvcm0gc2FtcGxlcjJEIG1hc2tfYmVmb3JlOwp1bmlmb3JtIHNhbXBsZXIyRCBwcmV2aW91c19yZW5kZXJpbmc7CnVuaWZvcm0gdmVjMiBjYW52YXM7Cgp1bmlmb3JtIGZsb2F0IGRlbHRhOwoKZmxvYXQgY3VycmVudF9mYWN0b3IgPSAwLjY5OwpmbG9hdCBwcmV2aW91c19mYWN0b3IgPSAwLjc0OwpmbG9hdCB0aHJlc2hvbGRfYWN0aXZhdGlvbiA9IDAuNTQ7CgpmbG9hdCBtYXAoZmxvYXQgdmFsdWUsIGZsb2F0IG1pbjEsIGZsb2F0IG1heDEsIGZsb2F0IG1pbjIsIGZsb2F0IG1heDIpIHsKICByZXR1cm4gbWluMiArICh2YWx1ZSAtIG1pbjEpICogKG1heDIgLSBtaW4yKSAvIChtYXgxIC0gbWluMSk7Cn0KCmZsb2F0IGdldFRocmVzaG9sZCgpIHsKICB2ZWM0IGNvbG9yID0gdmVjNCgwLik7CiAgZm9yIChmbG9hdCB5ID0gLTYuOyB5IDwgNy47IHkgKz0gMS4pIHsKICAgIGZvciAoZmxvYXQgeCA9IC02LjsgeCA8IDcuOyB4ICs9IDEuKSB7CiAgICAgIHZlYzQgaW1hZ2Vfbm93X2NvbG9yID0KICAgICAgICAgIHRleHR1cmUyRChpbWFnZV9ub3csIF90ZXh0dXJlX2Nvb3JkICsgdmVjMih4LCB5KSAvIGNhbnZhcyk7CiAgICAgIHZlYzQgaW1hZ2VfYmVmb3JlX2NvbG9yID0KICAgICAgICAgIHRleHR1cmUyRChpbWFnZV9iZWZvcmUsIF90ZXh0dXJlX2Nvb3JkICsgdmVjMih4LCB5KSAvIGNhbnZhcyk7CiAgICAgIGNvbG9yICs9IGFicyhpbWFnZV9iZWZvcmVfY29sb3IgLSBpbWFnZV9ub3dfY29sb3IpOwogICAgfQogIH0KICByZXR1cm4gKGNvbG9yLnggKyBjb2xvci55ICsgY29sb3IueikgLyAoMy4gKiA5Lik7Cn0KCnZvaWQgbWFpbigpIHsKICBmbG9hdCB0cmVzaG9sZF9pbnB1dCA9IC40OwogIGZsb2F0IHRyZXNob2xkX3ByZXZpb3VzX3JlbmRlcmluZyA9IC45ODsKCiAgdmVjNCBtYXNrX25vd19jb2xvciA9IHRleHR1cmUyRChtYXNrX25vdywgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgbWFza19iZWZvcmVfY29sb3IgPSB0ZXh0dXJlMkQobWFza19iZWZvcmUsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IHByZXZpb3VzX3JlbmRlcmluZ19jb2xvciA9IHRleHR1cmUyRChwcmV2aW91c19yZW5kZXJpbmcsIF90ZXh0dXJlX2Nvb3JkKTsKCiAgdmVjMyBtYXNrX2RpZmYgPSBhYnMobWFza19iZWZvcmVfY29sb3IueHl6IC0gbWFza19ub3dfY29sb3IueHl6KTsKICBmbG9hdCBmbGlja2VyaW5nID0gbWFza19kaWZmLng7CiAgZmxvYXQgdGhyZXNob2xkID0gZ2V0VGhyZXNob2xkKCk7CiAgaWYgKHRocmVzaG9sZCA8IHRocmVzaG9sZF9hY3RpdmF0aW9uKSB7CiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGZsaWNrZXJpbmcsIDAuLCAwLiwgMS4pICogY3VycmVudF9mYWN0b3IgKwogICAgICAgICAgICAgICAgICAgcHJldmlvdXNfcmVuZGVyaW5nX2NvbG9yICogcHJldmlvdXNfZmFjdG9yOwogICAgZ2xfRnJhZ0NvbG9yICo9ICgxLiAtIHRocmVzaG9sZCk7CiAgfQp9CmAsU2Y9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBSZiBleHRlbmRzIEdye2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIElmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBTZn19dmFyIEZmPWAjdmVyc2lvbiAzMDAgZXMKLy8gaHR0cHM6Ly9naXRodWIuY29tL1ZvbGNvbWl4L3ZpcnR1YWwtYmFja2dyb3VuZC9ibG9iL21haW4vc3JjL3BpcGVsaW5lcy93ZWJnbDIvam9pbnRCaWxhdGVyYWxGaWx0ZXJTdGFnZS50cwoKcHJlY2lzaW9uIGhpZ2hwIGZsb2F0Owp1bmlmb3JtIHNhbXBsZXIyRCBpbnB1dF9mcmFtZTsKdW5pZm9ybSBzYW1wbGVyMkQgc2VnbWVudGF0aW9uX21hc2s7CnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKdW5pZm9ybSB2ZWMyIHRleGVsX3NpemU7CnVuaWZvcm0gZmxvYXQgc3RlcDsKdW5pZm9ybSBmbG9hdCByYWRpdXM7CnVuaWZvcm0gZmxvYXQgb2Zmc2V0Owp1bmlmb3JtIGZsb2F0IHNpZ21hX3RleGVsOwp1bmlmb3JtIGZsb2F0IHNpZ21hX2NvbG9yOwoKaW4gdmVjMiBfdGV4dHVyZV9jb29yZDsKb3V0IHZlYzQgb3V0Q29sb3I7CgpmbG9hdCBnYXVzc2lhbihmbG9hdCB4LCBmbG9hdCBzaWdtYSkgewogIGZsb2F0IGNvZWZmID0gLTAuNSAvIChzaWdtYSAqIHNpZ21hICogNC4wICsgMS4wZS02KTsKICByZXR1cm4gZXhwKCh4ICogeCkgKiBjb2VmZik7Cn0KCnZvaWQgbWFpbigpIHsKICB2ZWMyIGNlbnRlckNvb3JkID0gX3RleHR1cmVfY29vcmQ7CiAgdmVjMyBjZW50ZXJDb2xvciA9IHRleHR1cmUoaW5wdXRfZnJhbWUsIGNlbnRlckNvb3JkKS5yZ2I7CiAgZmxvYXQgbmV3VmFsID0gMC4wOwogIGZsb2F0IHNwYWNlV2VpZ2h0ID0gMC4wOwogIGZsb2F0IGNvbG9yV2VpZ2h0ID0gMC4wOwogIGZsb2F0IHRvdGFsV2VpZ2h0ID0gMC4wOwogIC8vIFN1YnNhbXBsZSBrZXJuZWwgc3BhY2UuCiAgZm9yIChmbG9hdCBpID0gLXJhZGl1cyArIG9mZnNldDsgaSA8PSByYWRpdXM7IGkgKz0gc3RlcCkgewogICAgZm9yIChmbG9hdCBqID0gLXJhZGl1cyArIG9mZnNldDsgaiA8PSByYWRpdXM7IGogKz0gc3RlcCkgewogICAgICB2ZWMyIHNoaWZ0ID0gdmVjMihqLCBpKSAqIHRleGVsX3NpemU7CiAgICAgIHZlYzIgY29vcmQgPSB2ZWMyKGNlbnRlckNvb3JkICsgc2hpZnQpOwogICAgICB2ZWMzIGZyYW1lQ29sb3IgPSB0ZXh0dXJlKGlucHV0X2ZyYW1lLCBjb29yZCkucmdiOwogICAgICBmbG9hdCB0aHJlc2hvbGQgPSB0ZXh0dXJlKHRocmVzaG9sZCwgY29vcmQpLmE7CiAgICAgIGZsb2F0IG91dFZhbCA9IHRleHR1cmUoc2VnbWVudGF0aW9uX21hc2ssIGNvb3JkKS5hOwoKICAgICAgc3BhY2VXZWlnaHQgPSBnYXVzc2lhbihkaXN0YW5jZShjZW50ZXJDb29yZCwgY29vcmQpLCBzaWdtYV90ZXhlbCk7CiAgICAgIGNvbG9yV2VpZ2h0ID0gZ2F1c3NpYW4oZGlzdGFuY2UoY2VudGVyQ29sb3IsIGZyYW1lQ29sb3IpLCBzaWdtYV9jb2xvcik7CiAgICAgIHRvdGFsV2VpZ2h0ICs9IHNwYWNlV2VpZ2h0ICogY29sb3JXZWlnaHQ7CiAgICAgIG5ld1ZhbCArPSBzcGFjZVdlaWdodCAqIGNvbG9yV2VpZ2h0ICogb3V0VmFsICogdGhyZXNob2xkOwogICAgfQogIH0KICBuZXdWYWwgLz0gdG90YWxXZWlnaHQ7CiAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4pLCBuZXdWYWwpOwp9YCxQZj1gI3ZlcnNpb24gMzAwIGVzCmluIHZlYzIgcG9zaXRpb247CmluIHZlYzIgdGV4dHVyZV9jb29yZDsKb3V0IHZlYzIgX3RleHR1cmVfY29vcmQ7CnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn1gO2NsYXNzIGtmIGV4dGVuZHMgRWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gRmZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIFBmfX12YXIgRGY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKCnZvaWQgbWFpbigpIHsKICBpbnQgY291bnQgPSAwOwogIGZvciAoZmxvYXQgeSA9IC0xLjsgeSA8IDIuOyB5ICs9IDEuKSB7CiAgICBmb3IgKGZsb2F0IHggPSAtMS47IHggPCAyLjsgeCArPSAxLikgewogICAgICB2ZWMyIGNvb3JkID0gX3RleHR1cmVfY29vcmQgKyB2ZWMyKHksIHgpIC8gY2FudmFzOwogICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIGNvb3JkKTsKICAgICAgaWYgKGNvbG9yLnIgPiAuMSkgewogICAgICAgIGNvdW50Kys7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGNvdW50ID4gNSkgewogICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkKTsKICB9Cn0KYCxDZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIEJmIGV4dGVuZHMgRWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gRGZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIENmfX12YXIgTWY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkKTsKICBmb3IgKGZsb2F0IHkgPSAtMi47IHkgPCAzLjsgeSArPSAxLikgewogICAgZm9yIChmbG9hdCB4ID0gLTIuOyB4IDwgMy47IHggKz0gMS4pIHsKICAgICAgdmVjMiBjb29yZCA9IF90ZXh0dXJlX2Nvb3JkOwogICAgICBjb29yZCArPSB2ZWMyKHksIHgpIC8gY2FudmFzOwogICAgICBjb2xvciArPSB0ZXh0dXJlMkQodGV4dHVyZSwgY29vcmQpICogKDEuIC8gNC4pOwogICAgfQogIH0KCiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7Cn0KYCxPZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIFVmIGV4dGVuZHMgR3J7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gTWZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIE9mfX12YXIgTmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwp1bmlmb3JtIHNhbXBsZXIyRCBpbnB1dHM7Cgp2b2lkIG1haW4oKSB7CiAgdmVjNCBpbnB1dHNfY29sb3IgPSB0ZXh0dXJlMkQoaW5wdXRzLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCB0aHJlc2hvbGRfY29sb3IgPSB0ZXh0dXJlMkQodGhyZXNob2xkLCBfdGV4dHVyZV9jb29yZCk7CiAgaWYgKHRocmVzaG9sZF9jb2xvci5yIDwgLjEgJiYgaW5wdXRzX2NvbG9yLnIgPiAuNSkgewogICAgZ2xfRnJhZ0NvbG9yID0gaW5wdXRzX2NvbG9yOwogIH0KfQpgLExmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3MgemYgZXh0ZW5kcyBHcntnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBOZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gTGZ9fWNsYXNzIEdmIGV4dGVuZHMgTnJ7Y29uc3RydWN0b3IodCxuLGkpe3N1cGVyKCk7bCh0aGlzLCJpbnB1dEltYWdlIik7bCh0aGlzLCJpbnB1dE1hc2siKTtsKHRoaXMsInByZXZpb3VzSW5wdXRJbWFnZSIpO2wodGhpcywicHJldmlvdXNJbnB1dE1hc2siKTtsKHRoaXMsIm91dHB1dCIpO2wodGhpcywib3B0aW9ucyIse2N1cnJlbnRUaHJlc2hvbGRNaW5pbXVtOjAsY3VycmVudFRocmVzaG9sZE1heGltdW06MSxwcmV2aW91c1RocmVzaG9sZE1pbmltdW06MCxwcmV2aW91c1RocmVzaG9sZE1heGltdW06MSx0aHJlc2hvbGRNaW5pbXVtOjAsdGhyZXNob2xkTWF4aW11bToxLHRocmVzaG9sZEZhY3RvcjoxfSk7bCh0aGlzLCJqb2ludEJpbGF0ZXJhbCIpO3RoaXMuY29udGV4dD10O2NvbnN0IG89e2NvbnRleHQ6dCxoZWlnaHQ6aSx3aWR0aDpufSxzPW5ldyBSZihvKSxhPW5ldyBSaSh7Li4ubyxyYWRpdXM6MSx0eXBlOnpyLkdBVVNTSUFOfSksdT1uZXcgemYobyksZj1uZXcgVWYobyksZD1uZXcgQmYobyk7dGhpcy5qb2ludEJpbGF0ZXJhbD1uZXcga2YobyksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOnMsZ2V0VW5pZm9ybXM6KCk9Pih7aW1hZ2Vfbm93OkkodCx0aGlzLmlucHV0SW1hZ2UpLGltYWdlX2JlZm9yZTpJKHQsdGhpcy5wcmV2aW91c0lucHV0SW1hZ2UpLG1hc2tfbm93OkkodCx0aGlzLmlucHV0TWFzayksbWFza19iZWZvcmU6SSh0LHRoaXMucHJldmlvdXNJbnB1dE1hc2spLGN1cnJlbnRfdGhyZXNob2xkX21pbmltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNaW5pbXVtLGN1cnJlbnRfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNYXhpbXVtLHByZXZpb3VzX3RocmVzaG9sZF9taW5pbXVtOnRoaXMub3B0aW9ucy5wcmV2aW91c1RocmVzaG9sZE1pbmltdW0scHJldmlvdXNfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLnByZXZpb3VzVGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfbWluaW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWluaW11bSx0aHJlc2hvbGRfbWF4aW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfZmFjdG9yOnRoaXMub3B0aW9ucy50aHJlc2hvbGRGYWN0b3J9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTp1LGdldFVuaWZvcm1zOigpPT4oe2lucHV0czpJKHQsdGhpcy5pbnB1dE1hc2spLHRocmVzaG9sZDpJKHQscy5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06ZCxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOkkodCx1Lm91dHB1dCl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpmLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6SSh0LGQub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmEsZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpJKHQsZi5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06dGhpcy5qb2ludEJpbGF0ZXJhbCxnZXRVbmlmb3JtczooKT0+e3ZhciBHLHosSCwkLEtlLFRlLGxlLFc7Y29uc3QgZz0oej0oRz10aGlzLmlucHV0SW1hZ2UpPT1udWxsP3ZvaWQgMDpHLndpZHRoKSE9bnVsbD96OjEsYj0oJD0oSD10aGlzLmlucHV0SW1hZ2UpPT1udWxsP3ZvaWQgMDpILmhlaWdodCkhPW51bGw/JDoxLGg9KFRlPShLZT10aGlzLmlucHV0TWFzayk9PW51bGw/dm9pZCAwOktlLndpZHRoKSE9bnVsbD9UZToxLF89KFc9KGxlPXRoaXMuaW5wdXRNYXNrKT09bnVsbD92b2lkIDA6bGUuaGVpZ2h0KSE9bnVsbD9XOjEsRT1NYXRoLm1heChnL2gsYi9fKSx2PU1hdGgubWF4KDEsTWF0aC5zcXJ0KEUpKi42NiksRj0xL2csaz0xL2I7cmV0dXJue2lucHV0X2ZyYW1lOkkodCx0aGlzLmlucHV0SW1hZ2UpLHNlZ21lbnRhdGlvbl9tYXNrOkkodCx0aGlzLmlucHV0TWFzayksdGhyZXNob2xkOkkodCxhLm91dHB1dCksdGV4ZWxfc2l6ZTpbRixrXSxzdGVwOnYscmFkaXVzOkUsb2Zmc2V0OnY+MT92Ki41OjAsc2lnbWFfdGV4ZWw6TWF0aC5tYXgoRixrKSpFLHNpZ21hX2NvbG9yOi4xfX19KSx0aGlzLm91dHB1dD10aGlzLmpvaW50QmlsYXRlcmFsLm91dHB1dH1zZXREYXRhKHQsbil7dGhpcy5wcmV2aW91c0lucHV0SW1hZ2U9dGhpcy5pbnB1dEltYWdlP3RoaXMuaW5wdXRJbWFnZTp0LHRoaXMucHJldmlvdXNJbnB1dE1hc2s9dGhpcy5pbnB1dE1hc2s/dGhpcy5pbnB1dE1hc2s6bix0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufXNldE9wdGlvbnModCl7dGhpcy5vcHRpb25zPXR9cmVzaXplT3V0cHV0KHQsbil7c3VwZXIucmVzaXplT3V0cHV0KHQsbiksdGhpcy5vdXRwdXQ9dGhpcy5qb2ludEJpbGF0ZXJhbC5vdXRwdXR9fWNsYXNzICRme2NvbnN0cnVjdG9yKGUpe2wodGhpcywiY29udGV4dCIpO2wodGhpcywiZXh0ZW5zaW9uIik7bCh0aGlzLCJxdWVyaWVzIixbXSk7bCh0aGlzLCJhY3RpdmVRdWVyeSIpO3RoaXMuY29udGV4dD1lLHRoaXMuZXh0ZW5zaW9uPWUuZ2V0RXh0ZW5zaW9uKCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIil9c3RhcnQoKXt9c3RvcCgpe3RoaXMuYWN0aXZlUXVlcnkmJnRoaXMuY29udGV4dC5lbmRRdWVyeSh0aGlzLmV4dGVuc2lvbi5USU1FX0VMQVBTRURfRVhUKX1wdXNoQ29udGV4dChlKXt0aGlzLmNyZWF0ZVF1ZXJ5KCJQVVNIIixlKX1wb3BDb250ZXh0KGUpe3RoaXMuY3JlYXRlUXVlcnkoIlBPUCIsZSl9Y3JlYXRlUXVlcnkoZSx0KXt0aGlzLmFjdGl2ZVF1ZXJ5JiZ0aGlzLmNvbnRleHQuZW5kUXVlcnkodGhpcy5leHRlbnNpb24uVElNRV9FTEFQU0VEX0VYVCksdGhpcy5hY3RpdmVRdWVyeT10aGlzLmNvbnRleHQuY3JlYXRlUXVlcnkoKSx0aGlzLmNvbnRleHQuYmVnaW5RdWVyeSh0aGlzLmV4dGVuc2lvbi5USU1FX0VMQVBTRURfRVhULHRoaXMuYWN0aXZlUXVlcnkpLHRoaXMucXVlcmllcy5wdXNoKHtuYW1lOnQsYWN0aW9uOmUscXVlcnk6dGhpcy5hY3RpdmVRdWVyeX0pfWFzeW5jIGdldFJlc29sdmVkUXVlcmllcygpe2NvbnN0IGU9KGF3YWl0IFByb21pc2UuYWxsKFsuLi50aGlzLnF1ZXJpZXNdLm1hcCh0PT50aGlzLnJlc29sdmVRdWVyeSh0KSkpKS5maWx0ZXIodD0+dCk7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDsrK3QpZVt0XS50aW1lc3RhbXArPWVbdC0xXS5kdXJhdGlvbitlW3QtMV0udGltZXN0YW1wO3JldHVybiBlfWFzeW5jIHJlc29sdmVRdWVyeShlKXtpZighYXdhaXQgdGhpcy5hd2FpdFF1ZXJ5QXZhaWxhYmxlKGUpKXtjb25zb2xlLmxvZygiVW5hd2FpdGFibGUgcXVlcnkiLGUpO3JldHVybn1pZih0aGlzLmNvbnRleHQuZ2V0UGFyYW1ldGVyKHRoaXMuZXh0ZW5zaW9uLkdQVV9ESVNKT0lOVF9FWFQpKXtjb25zb2xlLmxvZygiRGlzam9pbnRlZCBxdWVyeSIsZSk7cmV0dXJufXJldHVybnsuLi5lLGR1cmF0aW9uOnRoaXMuY29udGV4dC5nZXRRdWVyeVBhcmFtZXRlcihlLnF1ZXJ5LHRoaXMuY29udGV4dC5RVUVSWV9SRVNVTFQpLHRpbWVzdGFtcDowfX1hc3luYyBhd2FpdFF1ZXJ5QXZhaWxhYmxlKGUpe2ZvcihsZXQgdD0wO3Q8MTA7Kyt0KXtpZih0aGlzLmNvbnRleHQuZ2V0UXVlcnlQYXJhbWV0ZXIoZS5xdWVyeSx0aGlzLmNvbnRleHQuUVVFUllfUkVTVUxUX0FWQUlMQUJMRSkpcmV0dXJuIGU7YXdhaXQgU2koMjAwKX19fWNsYXNzIHp0e2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJjYW52YXMiKTtsKHRoaXMsImNvbnRleHQiKTtsKHRoaXMsInBpcGVsaW5lIik7bCh0aGlzLCJwcmV2aW91c0ltYWdlV2lkdGgiLDApO2wodGhpcywicHJldmlvdXNJbWFnZUhlaWdodCIsMCk7bCh0aGlzLCJwcmV2aW91c01hc2tXaWR0aCIsT2UpO2wodGhpcywicHJldmlvdXNNYXNrSGVpZ2h0IixPZSk7bCh0aGlzLCJwcm9maWxlciIpO2wodGhpcywicG9zdFByb2Nlc3NpbmdFbmFibGVkIiwhMCk7bCh0aGlzLCJpbXByb3ZlTWFzayIpO2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHQ9ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiKTtpZighdCl0aHJvdyJGYWlsIHRvIHJldHJpZXZlIHdlYmdsMiBjb250ZXh0Ijt0aGlzLmNhbnZhcz1lLHRoaXMuY29udGV4dD10LHRoaXMuaW1wcm92ZU1hc2s9bmV3IEdmKHRoaXMuY29udGV4dCxPZSxPZSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dGhpcy5pbXByb3ZlTWFzay5zZXRPcHRpb25zKGUpfWVuYWJsZVBvc3RQcm9jZXNzaW5nKCl7dGhpcy5wb3N0UHJvY2Vzc2luZ0VuYWJsZWQ9ITB9ZGlzYWJsZVBvc3RQcm9jZXNzaW5nKCl7dGhpcy5wb3N0UHJvY2Vzc2luZ0VuYWJsZWQ9ITF9YXN5bmMgcHJvZmlsZVdlYmdsKGUpe2NvbnN0IHQ9bmV3ICRmKHRoaXMuY29udGV4dCk7cmV0dXJuIHRoaXMucHJvZmlsZXI9dCx0LnN0YXJ0KCksYXdhaXQgU2koZSksdGhpcy5wcm9maWxlcj12b2lkIDAsdC5zdG9wKCksdC5nZXRSZXNvbHZlZFF1ZXJpZXMoKX1hc3luYyByZW5kZXIoZSx0KXt2YXIgbyxzO2lmKCF0aGlzLnBpcGVsaW5lKXRocm93Im1pc3NpbmcgcGlwZWxpbmUiOyh0aGlzLnByZXZpb3VzSW1hZ2VIZWlnaHQhPT1lLmhlaWdodHx8dGhpcy5wcmV2aW91c0ltYWdlV2lkdGghPT1lLndpZHRoKSYmdGhpcy5yZXNpemVPdXRwdXQoZS53aWR0aCxlLmhlaWdodCksKHRoaXMucHJldmlvdXNNYXNrSGVpZ2h0IT09dC5oZWlnaHR8fHRoaXMucHJldmlvdXNNYXNrV2lkdGghPT10LndpZHRoKSYmKHRoaXMuaW1wcm92ZU1hc2sucmVzaXplT3V0cHV0KHQud2lkdGgsdC5oZWlnaHQpLHRoaXMucHJldmlvdXNNYXNrV2lkdGg9dC53aWR0aCx0aGlzLnByZXZpb3VzTWFza0hlaWdodD10LmhlaWdodCk7Y29uc3Qgbj0icmVuZGVyZXIiOyhvPXRoaXMucHJvZmlsZXIpPT1udWxsfHxvLnB1c2hDb250ZXh0KG4pLHRoaXMuaW1wcm92ZU1hc2suc2V0UHJvZmlsZXIodGhpcy5wcm9maWxlciksdGhpcy5waXBlbGluZS5zZXRQcm9maWxlcih0aGlzLnByb2ZpbGVyKTtsZXQgaT10O3JldHVybiB0aGlzLnBvc3RQcm9jZXNzaW5nRW5hYmxlZCYmKHRoaXMuaW1wcm92ZU1hc2suc2V0RGF0YShlLHQpLHRoaXMuaW1wcm92ZU1hc2sucnVuKCksaT10aGlzLmltcHJvdmVNYXNrLm91dHB1dCksdGhpcy5waXBlbGluZS5zZXREYXRhKGUsaSksYXdhaXQgdGhpcy5waXBlbGluZS5ydW4oKSwocz10aGlzLnByb2ZpbGVyKT09bnVsbHx8cy5wb3BDb250ZXh0KG4pLHRoaXMuY2FudmFzfXJlc2l6ZU91dHB1dChlLHQpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXQsKG49dGhpcy5waXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsdCksdGhpcy5wcmV2aW91c0ltYWdlV2lkdGg9ZSx0aGlzLnByZXZpb3VzSW1hZ2VIZWlnaHQ9dH19Y2xhc3MgRmkgZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7bCh0aGlzLCJwaXBlbGluZSIpO2wodGhpcywiYmFja2dyb3VuZEltYWdlIik7bCh0aGlzLCJiYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzIik7bCh0aGlzLCJiYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ29udGV4dCIpO2wodGhpcywiYmFja2dyb3VuZEltYWdlUmVzaXplciIpO3RoaXMucGlwZWxpbmU9bmV3IElpKHRoaXMuY29udGV4dCksdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzPXRoaXMuY2FudmFzLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplckNvbnRleHQ9dGhpcy5jb250ZXh0LHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplcj1uZXcgVGYodGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ29udGV4dCwwLDApfXNldEJhY2tncm91bmRJbWFnZSh0KXt0aGlzLmJhY2tncm91bmRJbWFnZT10LHRoaXMudXBkYXRlQmFja2dyb3VuZEltYWdlKCl9dXBkYXRlQmFja2dyb3VuZEltYWdlKCl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09dGhpcy5jYW52YXM7dGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyLnJlc2l6ZU91dHB1dCh0LG4pLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplci5zZXREYXRhKHRoaXMuYmFja2dyb3VuZEltYWdlKSx0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXIucnVuKCksdGhpcy5waXBlbGluZS5pbnB1dEJhY2tncm91bmRJbWFnZT10aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXJDYW52YXN9cmVzaXplT3V0cHV0KHQsbil7c3VwZXIucmVzaXplT3V0cHV0KHQsbiksdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzLndpZHRoPXQsdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzLmhlaWdodD1uLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplci5yZXNpemVPdXRwdXQodCxuKSx0aGlzLnVwZGF0ZUJhY2tncm91bmRJbWFnZSgpfX1jbGFzcyBXZiBleHRlbmRzIEZpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtsKHRoaXMsImZyYW1lUmVhZGVyIil9c2V0QmFja2dyb3VuZFZpZGVvKHQpe3RoaXMuZnJhbWVSZWFkZXI9dH1hc3luYyByZW5kZXIodCxuKXtyZXR1cm4gYXdhaXQgdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSxzdXBlci5yZW5kZXIodCxuKX1hc3luYyByZWFkTmV4dFZpZGVvRnJhbWUoKXt2YXIgbjtjb25zdCB0PWF3YWl0KChuPXRoaXMuZnJhbWVSZWFkZXIpPT1udWxsP3ZvaWQgMDpuLnJlYWQoKSk7aWYodCE9bnVsbCYmdC52YWx1ZSl7Y29uc3QgaT1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0LnZhbHVlKTt0aGlzLnNldEJhY2tncm91bmRJbWFnZShpKSx0LnZhbHVlLmNsb3NlKCl9fX1jbGFzcyBQaXtibHVyQmFja2dyb3VuZChlKXtyZXR1cm4gbmV3IGxzKGUpfWJsdXJTaWxob3VldHRlKGUpe3JldHVybiBuZXcgZHMoZSl9aW1hZ2VCYWNrZ3JvdW5kKCl7cmV0dXJuIG5ldyBoc312aWRlb0JhY2tncm91bmQoKXtyZXR1cm4gbmV3IFdmfX12YXIgVmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKCnZlYzQgbG9vcCgpOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSBsb29wKCk7IH0KYCxIZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIGpmIGV4dGVuZHMgRWV7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBWZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBIZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKICAgICAgICAgICAgZmxvYXQgbWF4TGVuZ3RoID0gbGVuZ3RoKG5vcm1hbGl6ZWRSYWRpdXMpOwoKICAgICAgICAgICAgZm9yKGludCB5PS0ke2V9OyB5PCR7ZSsxfTsgKyt5KSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHg9LSR7ZX07IHg8JHtlKzF9OyArK3gpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAoMS4tIHRleHR1cmUyRChtYXNrLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpLmEpICogKG1heExlbmd0aCAtIGxlbmd0aChkaWZmKSkgLyBtYXhMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH19Y29uc3QgWWY9MTAsWGY9MixRZj04O2NsYXNzIHFmIGV4dGVuZHMgTHJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpO2wodGhpcywiaW5wdXRJbWFnZSIpO2wodGhpcywiaW5wdXRNYXNrIik7bCh0aGlzLCJibHVyIik7dGhpcy5jb250ZXh0PXQsdGhpcy5yYWRpdXM9bjtjb25zdCBpPXtjb250ZXh0OnQsaGVpZ2h0OnQuY2FudmFzLmhlaWdodCx3aWR0aDp0LmNhbnZhcy53aWR0aH07dGhpcy5ibHVyPW5ldyBqZih7Li4uaSxyYWRpdXM6biwuLi50aGlzLmdldEJsdXJUZXh0dXJlU2l6ZSh0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpfSk7Y29uc3Qgbz1uZXcgVXIoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOnRoaXMuYmx1cixwcmV2ZW50UmVzaXplOiEwLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6SSh0LHRoaXMuaW5wdXRJbWFnZSksbWFzazpJKHQsdGhpcy5pbnB1dE1hc2spfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06byxnZXRVbmlmb3JtczooKT0+KHtiYWNrZ3JvdW5kOkkodCx0aGlzLmJsdXIub3V0cHV0KSxmb3JlZ3JvdW5kOkkodCx0aGlzLmlucHV0SW1hZ2UpLHRocmVzaG9sZDpJKHQsdGhpcy5pbnB1dE1hc2spfSl9KX1nZXRCbHVyVGV4dHVyZVNpemUodCxuKXtjb25zdCBpPXRoaXMucmFkaXVzPllmP1FmOlhmO3JldHVybnt3aWR0aDpNYXRoLm1heChPZSx0L2kpLGhlaWdodDpNYXRoLm1heChPZSxuL2kpfX1zZXREYXRhKHQsbil7dGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn1yZXNpemVPdXRwdXQodCxuKXtzdXBlci5yZXNpemVPdXRwdXQodCxuKTtjb25zdCBpPXRoaXMuZ2V0Qmx1clRleHR1cmVTaXplKHQsbik7dGhpcy5ibHVyLnJlc2l6ZU91dHB1dChpLndpZHRoLGkuaGVpZ2h0KX19Y2xhc3MgS2YgZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2wodGhpcywicGlwZWxpbmUiKTt0aGlzLnBpcGVsaW5lPW5ldyBxZih0aGlzLmNvbnRleHQsdCksdGhpcy5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKX19Y2xhc3MgSmYgZXh0ZW5kcyBMcntjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKCk7bCh0aGlzLCJpbnB1dEltYWdlIik7bCh0aGlzLCJpbnB1dE1hc2siKTt0aGlzLmNvbnRleHQ9dDtjb25zdCBpPXtjb250ZXh0OnQsaGVpZ2h0OnQuY2FudmFzLmhlaWdodCx3aWR0aDp0LmNhbnZhcy53aWR0aH0sbz1uZXcgUmkoey4uLmkscmFkaXVzOm4sdHlwZTp6ci5HQVVTU0lBTn0pLHM9bmV3IFVyKHsuLi5pLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpvLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6SSh0LHRoaXMuaW5wdXRJbWFnZSl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6SSh0LHRoaXMuaW5wdXRJbWFnZSksZm9yZWdyb3VuZDpJKHQsby5vdXRwdXQpLHRocmVzaG9sZDpJKHQsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKHQsbil7dGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn19Y2xhc3MgWmYgZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2wodGhpcywicGlwZWxpbmUiKTt0aGlzLnBpcGVsaW5lPW5ldyBKZih0aGlzLmNvbnRleHQsdCksdGhpcy5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKX19Y2xhc3MgZWwgZXh0ZW5kcyBJaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7bCh0aGlzLCJmcmFtZVJlYWRlciIpO2wodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMCl9c2V0IHJlYWRlcih0KXt0aGlzLmZyYW1lUmVhZGVyPXR9YXN5bmMgcnVuKCl7dGhpcy5mcmFtZVJlYWRlciYmKGF3YWl0IHRoaXMucmVhZE5leHRWaWRlb0ZyYW1lKCksYXdhaXQgc3VwZXIucnVuKCkpfWFzeW5jIHJlYWROZXh0VmlkZW9GcmFtZSgpe3ZhciBuO2NvbnN0IHQ9YXdhaXQoKG49dGhpcy5mcmFtZVJlYWRlcik9PW51bGw/dm9pZCAwOm4ucmVhZCgpKTt0IT1udWxsJiZ0LnZhbHVlJiYodGhpcy5pbnB1dEJhY2tncm91bmRJbWFnZT1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0LnZhbHVlKSx0LnZhbHVlLmNsb3NlKCkpfX1jbGFzcyB0bCBleHRlbmRzIHp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtsKHRoaXMsInBpcGVsaW5lIik7dGhpcy5waXBlbGluZT1uZXcgZWwodGhpcy5jb250ZXh0KX1zZXRCYWNrZ3JvdW5kVmlkZW8odCl7dGhpcy5waXBlbGluZS5yZWFkZXI9dH19Y2xhc3Mga2l7Ymx1ckJhY2tncm91bmQoZSl7cmV0dXJuIG5ldyBLZihlKX1ibHVyU2lsaG91ZXR0ZShlKXtyZXR1cm4gbmV3IFpmKGUpfWltYWdlQmFja2dyb3VuZCgpe3JldHVybiBuZXcgRml9dmlkZW9CYWNrZ3JvdW5kKCl7cmV0dXJuIG5ldyB0bH19Y2xhc3Mgcmx7Y29uc3RydWN0b3IoZSl7bCh0aGlzLCJmYWN0b3J5Iik7c3dpdGNoKGUpe2Nhc2UgeXQuQ0FOVkFTOnRoaXMuZmFjdG9yeT1uZXcgUGk7YnJlYWs7Y2FzZSB5dC5XRUJHTDp0aGlzLmZhY3Rvcnk9bmV3IGtpO2JyZWFrO2RlZmF1bHQ6Y29uc3QgdD1mcygpO3RoaXMuZmFjdG9yeT10LnN1cHBvcnRlZD9uZXcga2k6bmV3IFBpfX1ibHVyQmFja2dyb3VuZChlKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuYmx1ckJhY2tncm91bmQoZSl9Ymx1clNpbGhvdWV0dGUoZSl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJsdXJTaWxob3VldHRlKGUpfWltYWdlQmFja2dyb3VuZCgpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5pbWFnZUJhY2tncm91bmQoKX12aWRlb0JhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkudmlkZW9CYWNrZ3JvdW5kKCl9Z2V0RmFjdG9yeSgpe2lmKCF0aGlzLmZhY3RvcnkpdGhyb3ciRmFjdG9yeSBpcyBub3QgaW5pdGlhbGl6ZWQiO3JldHVybiB0aGlzLmZhY3Rvcnl9fWNsYXNzIG5se2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJyZW5kZXJlciIpO2wodGhpcywiYmFja2dyb3VuZFZpZGVvIik7bCh0aGlzLCJiYWNrZ3JvdW5kSW1hZ2UiKX1zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgbixpO2NvbnN0IHQ9bmV3IHJsKChuPWUucmVuZGVyaW5nT3B0aW9ucyk9PW51bGw/dm9pZCAwOm4udHlwZSk7c3dpdGNoKGUudHJhbnNmb3JtZXJUeXBlKXtjYXNlIkJhY2tncm91bmRCbHVyIjp0aGlzLnJlbmRlcmVyPXQuYmx1ckJhY2tncm91bmQodGhpcy5nZXRCbHVyU2l6ZShlLnJhZGl1cykpO2JyZWFrO2Nhc2UiU2lsaG91ZXR0ZUJsdXIiOnRoaXMucmVuZGVyZXI9dC5ibHVyU2lsaG91ZXR0ZSh0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJWaWRlb0JhY2tncm91bmQiOmNvbnN0IG89dC52aWRlb0JhY2tncm91bmQoKTt0aGlzLmJhY2tncm91bmRWaWRlbyYmby5zZXRCYWNrZ3JvdW5kVmlkZW8odGhpcy5iYWNrZ3JvdW5kVmlkZW8pLHRoaXMucmVuZGVyZXI9bzticmVhaztjYXNlIlZpcnR1YWxCYWNrZ3JvdW5kIjpjb25zdCBzPXQuaW1hZ2VCYWNrZ3JvdW5kKCk7dGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJnMuc2V0QmFja2dyb3VuZEltYWdlKHRoaXMuYmFja2dyb3VuZEltYWdlKSx0aGlzLnJlbmRlcmVyPXM7YnJlYWs7ZGVmYXVsdDp0aHJvd2BVbmtub3duIHJlbmRlcmluZyB0eXBlIFske2UudHJhbnNmb3JtZXJUeXBlfV1gfSgoaT1lLnJlbmRlcmluZ09wdGlvbnMpPT1udWxsP3ZvaWQgMDppLnR5cGUpPT09eXQuV0VCR0wmJihlLnJlbmRlcmluZ09wdGlvbnMuc2VsZmllU2VnbWVudGF0aW9uVHlwZT09PW5yLlBSRUNJU0U/dGhpcy5yZW5kZXJlci5lbmFibGVQb3N0UHJvY2Vzc2luZygpOmUucmVuZGVyaW5nT3B0aW9ucy5zZWxmaWVTZWdtZW50YXRpb25UeXBlPT09bnIuRkFTVCYmdGhpcy5yZW5kZXJlci5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dmFyIHQ7KHQ9dGhpcy5yZW5kZXJlcik9PW51bGx8fHQuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFZpZGVvPWUuZ2V0UmVhZGVyKCk7Y29uc3QgdD10aGlzLnJlbmRlcmVyO3QhPW51bGwmJnQuc2V0QmFja2dyb3VuZFZpZGVvJiZ0LnNldEJhY2tncm91bmRWaWRlbyh0aGlzLmJhY2tncm91bmRWaWRlbyl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7Y29uc3QgdD10aGlzLnJlbmRlcmVyO3QhPW51bGwmJnQuc2V0QmFja2dyb3VuZEltYWdlJiZ0LnNldEJhY2tncm91bmRJbWFnZShlKSx0aGlzLmJhY2tncm91bmRJbWFnZT1lfWFzeW5jIHByb2Nlc3MoZSx0KXtpZih0aGlzLnJlbmRlcmVyKXJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlcihlLHQpfWFzeW5jIHJlc2l6ZUZvcmVncm91bmQoZSx0KXt9Z2V0Qmx1clNpemUoZT1ndC5Mb3cpe3N3aXRjaChlKXtjYXNlIGd0LkxvdzpyZXR1cm4gNTtjYXNlIGd0LkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfWFzeW5jIHByb2ZpbGUoZSl7dmFyIHQsbjtyZXR1cm4obj0odD10aGlzLnJlbmRlcmVyKT09bnVsbD92b2lkIDA6dC5wcm9maWxlV2ViZ2woZSkpIT1udWxsP246W119fWNsYXNzIGlse2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJzZWxmaWVTZWdtZW50YXRpb24iLG5ldyBjcyk7bCh0aGlzLCJiYWNrZ3JvdW5kRmlsdGVyIik7bCh0aGlzLCJyZXBvcnRlciIsbmV3IHJzKTtsKHRoaXMsImlzRW5hYmxlZCIsITApO2wodGhpcywiYmFja2dyb3VuZE9wdGlvbnMiKX1hc3luYyBpbml0KGUsdCl7YXdhaXQgdGhpcy5zZWxmaWVTZWdtZW50YXRpb24uaW5pdCh0Lndhc21Bc3NldFVyaVBhdGgsdC50ZmxpdGVBc3NldFVyaVBhdGgpLHRoaXMuYmFja2dyb3VuZEZpbHRlcj1uZXcgbmwsdGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiQ3JlYXRlIn0pfWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBhLHU7aWYoIXRoaXMuaXNFbmFibGVkKXJldHVybiB0LmVucXVldWUoZSk7bGV0IG47Y29uc3QgaT0oYT1lLnRpbWVzdGFtcCkhPW51bGw/YTowLG89YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZSkscz1hd2FpdCB0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5wcm9jZXNzKG8pO3MmJihuPWF3YWl0KCh1PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnUucHJvY2VzcyhvLHMpKSksbj8oZS5jbG9zZSgpLHQuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZShuLHt0aW1lc3RhbXA6aSxhbHBoYToiZGlzY2FyZCJ9KSkpOnQuZW5xdWV1ZShlKX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDt0aGlzLmJhY2tncm91bmRPcHRpb25zPWUsYXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKSksdGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiVXBkYXRlIn0pfWFzeW5jIHNldFZpZGVvQkdSZWFkYWJsZShlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDp0LnNldFZpZGVvQkdSZWFkYWJsZShlKSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRWaXJ0dWFsQkdJbWFnZShlKSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dmFyIHQ7KHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbHx8dC5zZXRGbGlja2VyaW5nT3B0aW9ucyhlKSx0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJVcGRhdGUifSl9YXN5bmMgcHJvZmlsZShlKXt2YXIgdCxuO3JldHVybihuPSh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnQucHJvZmlsZShlKSkhPW51bGw/bjpbXX1nZXRUcmFuc2Zvcm1lclR5cGUoKXt2YXIgZSx0O3JldHVybih0PShlPXRoaXMuYmFja2dyb3VuZE9wdGlvbnMpPT1udWxsP3ZvaWQgMDplLnRyYW5zZm9ybWVyVHlwZSkhPW51bGw/dDoiVW5kZWZpbmVkIn1lbmFibGUoKXt0aGlzLmlzRW5hYmxlZD0hMH1kaXNhYmxlKCl7dGhpcy5pc0VuYWJsZWQ9ITF9cmVwb3J0KGUpe3ZhciB0O3RoaXMucmVwb3J0ZXIuc2VuZCh7dmVyc2lvbjpucyxhY3Rpb246Ik1sVHJhbnNmb3JtZXJzIix0cmFuc2Zvcm1lclR5cGU6KHQ9dGhpcy5iYWNrZ3JvdW5kT3B0aW9ucyk9PW51bGw/dm9pZCAwOnQudHJhbnNmb3JtZXJUeXBlLGNvbmZpZzpKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tncm91bmRPcHRpb25zKSwuLi5lfSl9fWNvbnN0ICRyPWNsYXNze2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJiYWNrZ3JvdW5kVHJhbnNmb3JtZXIiLG5ldyBpbCk7bCh0aGlzLCJtZWRpYVByb2Nlc3NvciIsbmV3IERvKTtsKHRoaXMsInJhdGUiLDMwKTtsKHRoaXMsInJlc29sdmVPbk1lZGlhUHJvY2Vzc29yIik7bCh0aGlzLCJldmVudHNRdWV1ZSIsW10pfWFzeW5jIGluaXQoZSx0KXthd2FpdCB0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5pbml0KGUsdCksYXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFuc2Zvcm1lcnMoW3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyXSksdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnJhdGUpLHRoaXMubWVkaWFQcm9jZXNzb3Iub25BbnkoKG4saSk9Pnt0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yPyh0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yKHtuYW1lOm4sZGF0YTppfSksdGhpcy5yZXNvbHZlT25NZWRpYVByb2Nlc3Nvcj12b2lkIDApOnRoaXMuZXZlbnRzUXVldWUucHVzaCh7bmFtZTpuLGRhdGE6aX0pfSl9ZW5hYmxlKCl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuZW5hYmxlKCl9ZGlzYWJsZSgpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLmRpc2FibGUoKX1hc3luYyBvbk1lZGlhUHJvY2Vzc29yRXZlbnQoKXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoZT0+e3RoaXMuZXZlbnRzUXVldWUubGVuZ3RoPjA/ZSh0aGlzLmV2ZW50c1F1ZXVlLnNoaWZ0KCkpOnRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I9ZX0pfWFzeW5jIHNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMucmF0ZT1lLHRoaXMubWVkaWFQcm9jZXNzb3Iuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl9YXN5bmMgdHJhbnNmb3JtKGUsdCl7dGhpcy5tZWRpYVByb2Nlc3Nvci50cmFuc2Zvcm0oZSx0KX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcik9PW51bGw/dm9pZCAwOnQuc2V0QmFja2dyb3VuZE9wdGlvbnMoZSkpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaWRlb0JHUmVhZGFibGUoZSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlydHVhbEJHSW1hZ2UoZSl9YXN5bmMgdGVybWluYXRlKCl7YXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5kZXN0cm95KCl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9c2V0Vm9uYWdlTWV0YWRhdGEoZSl7SW8oZSl9YXN5bmMgcHJvZmlsZShlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIucHJvZmlsZShlKSl9fTtsZXQgRGk9JHI7KCgpPT57SGkoIlByb2Nlc3NvcldvcmtlciIsJHIpfSkoKX0pKCk7Cg==", zs = typeof window < "u" && window.Blob && new Blob([atob(sc)], { type: "text/javascript;charset=utf-8" });
|
|
24583
|
+
const sc = "dmFyICRsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgV2w9KEosUSxWKT0+USBpbiBKPyRsKEosUSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Vn0pOkpbUV09Vjt2YXIgbD0oSixRLFYpPT4oV2woSix0eXBlb2YgUSE9InN5bWJvbCI/USsiIjpRLFYpLFYpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBKKHIsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCB0PWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHRbcl18fCh0W3JdPWUpLHRbcl19Y29uc3QgUT1KKCJnbG9iYWxzIix7fSk7dmFyIFY9KHI9PihyLklOSVQ9IklOSVQiLHIuRk9SV0FSRD0iRk9SV0FSRCIsci5URVJNSU5BVEU9IlRFUk1JTkFURSIsci5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIsci5FVkVOVD0iRVZFTlQiLHIpKShWfHx7fSk7ZnVuY3Rpb24gJG8ocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKHQ9PnIgaW5zdGFuY2VvZiB0KX1mdW5jdGlvbiBVZShyLGUpe2NvbnN0e2lkOnQsdHlwZTpufT1yLG89QXJyYXkuaXNBcnJheShlKT9lOltlXTtwb3N0TWVzc2FnZSh7aWQ6dCx0eXBlOm4scmVzdWx0OmV9LG8uZmlsdGVyKGk9PiRvKGkpKSl9Sigid29ya2VyaXplZCIse30pO2Z1bmN0aW9uIFlyKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1mdW5jdGlvbiBldChyLGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZS5zcGxpY2UoMCxlLmxlbmd0aCk7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpZm9yKGNvbnN0IHQgaW4gZSlkZWxldGUgZVt0XTtmb3IoY29uc3QgdCBpbiByKUFycmF5LmlzQXJyYXkoclt0XSk/KGVbdF09W10sZXQoclt0XSxlW3RdKSk6dHlwZW9mIHJbdF09PSJvYmplY3QiPyhlW3RdPXt9LGV0KHJbdF0sZVt0XSkpOmVbdF09clt0XX1jb25zdCB0ZT1uZXcgV2Vha01hcCxoZT1uZXcgV2Vha01hcCxaPW5ldyBXZWFrTWFwLHR0PVN5bWJvbCgiYW55UHJvZHVjZXIiKSxYcj1Qcm9taXNlLnJlc29sdmUoKSxydD1TeW1ib2woImxpc3RlbmVyQWRkZWQiKSxudD1TeW1ib2woImxpc3RlbmVyUmVtb3ZlZCIpO2xldCBvdD0hMSxIdD0hMTtmdW5jdGlvbiBBZShyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIiYmdHlwZW9mIHIhPSJudW1iZXIiKXRocm93IG5ldyBUeXBlRXJyb3IoImBldmVudE5hbWVgIG11c3QgYmUgYSBzdHJpbmcsIHN5bWJvbCwgb3IgbnVtYmVyIil9ZnVuY3Rpb24gaXQocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gSWUocixlKXtjb25zdCB0PWhlLmdldChyKTtpZighIXQuaGFzKGUpKXJldHVybiB0LmdldChlKX1mdW5jdGlvbiBOZShyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCJ8fHR5cGVvZiBlPT0ibnVtYmVyIj9lOnR0LG49Wi5nZXQocik7aWYoISFuLmhhcyh0KSlyZXR1cm4gbi5nZXQodCl9ZnVuY3Rpb24gV28ocixlLHQpe2NvbnN0IG49Wi5nZXQocik7aWYobi5oYXMoZSkpZm9yKGNvbnN0IG8gb2Ygbi5nZXQoZSkpby5lbnF1ZXVlKHQpO2lmKG4uaGFzKHR0KSl7Y29uc3Qgbz1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IGkgb2Ygbi5nZXQodHQpKWkuZW5xdWV1ZShvKX19ZnVuY3Rpb24gUXIocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEsbj0oKT0+e30sbz1bXTtjb25zdCBpPXtlbnF1ZXVlKHMpe28ucHVzaChzKSxuKCl9LGZpbmlzaCgpe3Q9ITAsbigpfX07Zm9yKGNvbnN0IHMgb2YgZSl7bGV0IGE9TmUocixzKTthfHwoYT1uZXcgU2V0LFouZ2V0KHIpLnNldChzLGEpKSxhLmFkZChpKX1yZXR1cm57YXN5bmMgbmV4dCgpe3JldHVybiBvP28ubGVuZ3RoPT09MD90PyhvPXZvaWQgMCx0aGlzLm5leHQoKSk6KGF3YWl0IG5ldyBQcm9taXNlKHM9PntuPXN9KSx0aGlzLm5leHQoKSk6e2RvbmU6ITEsdmFsdWU6YXdhaXQgby5zaGlmdCgpfTp7ZG9uZTohMH19LGFzeW5jIHJldHVybihzKXtvPXZvaWQgMDtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCB1PU5lKHIsYSk7dSYmKHUuZGVsZXRlKGkpLHUuc2l6ZT09PTAmJlouZ2V0KHIpLmRlbGV0ZShhKSl9cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgc306e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBxcihyKXtpZihyPT09dm9pZCAwKXJldHVybiBLcjtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIUtyLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgU2U9cj0+cj09PXJ0fHxyPT09bnQ7ZnVuY3Rpb24gc3QocixlLHQpe2lmKFNlKGUpKXRyeXtvdD0hMCxyLmVtaXQoZSx0KX1maW5hbGx5e290PSExfX1jbGFzcyBSZXtzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1xcih0KSxuPT57aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBzIG9mIHQpaWYobi5wcm90b3R5cGVbc10hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke3N9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIG8oKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgUmV9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpvfSk7Y29uc3QgaT1zPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtzXSguLi5hKX07Zm9yKGNvbnN0IHMgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUscyx7ZW51bWVyYWJsZTohMSx2YWx1ZTppKHMpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXt2YXIgZSx0O2lmKHR5cGVvZigoZT1nbG9iYWxUaGlzLnByb2Nlc3MpPT1udWxsP3ZvaWQgMDplLmVudikhPSJvYmplY3QiKXJldHVybiBIdDtjb25zdHtlbnY6bn09KHQ9Z2xvYmFsVGhpcy5wcm9jZXNzKSE9bnVsbD90OntlbnY6e319O3JldHVybiBuLkRFQlVHPT09ImVtaXR0ZXJ5Inx8bi5ERUJVRz09PSIqInx8SHR9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtIdD1lfWNvbnN0cnVjdG9yKGU9e30pe3ZhciB0O3RlLnNldCh0aGlzLG5ldyBTZXQpLGhlLnNldCh0aGlzLG5ldyBNYXApLFouc2V0KHRoaXMsbmV3IE1hcCksWi5nZXQodGhpcykuc2V0KHR0LG5ldyBTZXQpLHRoaXMuZGVidWc9KHQ9ZS5kZWJ1ZykhPW51bGw/dDp7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KG4sbyxpLHMpPT57dHJ5e3M9SlNPTi5zdHJpbmdpZnkocyl9Y2F0Y2h7cz1gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzIGZhaWxlZCB0byBzdHJpbmdpZnk6ICR7T2JqZWN0LmtleXMocykuam9pbigiLCIpfWB9KHR5cGVvZiBpPT0ic3ltYm9sInx8dHlwZW9mIGk9PSJudW1iZXIiKSYmKGk9aS50b1N0cmluZygpKTtjb25zdCBhPW5ldyBEYXRlLHU9YCR7YS5nZXRIb3VycygpfToke2EuZ2V0TWludXRlcygpfToke2EuZ2V0U2Vjb25kcygpfS4ke2EuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7dX1dW2VtaXR0ZXJ5OiR7bn1dWyR7b31dIEV2ZW50IE5hbWU6ICR7aX0KCWRhdGE6ICR7c31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxuKXsoUmUuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtpdCh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSl7QWUobik7bGV0IG89SWUodGhpcyxuKTtvfHwobz1uZXcgU2V0LGhlLmdldCh0aGlzKS5zZXQobixvKSksby5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksU2Uobil8fHN0KHRoaXMscnQse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KX1yZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7aXQodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpe0FlKG4pO2NvbnN0IG89SWUodGhpcyxuKTtvJiYoby5kZWxldGUodCksby5zaXplPT09MCYmaGUuZ2V0KHRoaXMpLmRlbGV0ZShuKSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxTZShuKXx8c3QodGhpcyxudCx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pfX1vbmNlKGUpe2xldCB0O2NvbnN0IG49bmV3IFByb21pc2Uobz0+e3Q9dGhpcy5vbihlLGk9Pnt0KCksbyhpKX0pfSk7cmV0dXJuIG4ub2ZmPXQsbn1ldmVudHMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpQWUodCk7cmV0dXJuIFFyKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe3ZhciBuO2lmKEFlKGUpLFNlKGUpJiYhb3QpdGhyb3cgbmV3IFR5cGVFcnJvcigiYGV2ZW50TmFtZWAgY2Fubm90IGJlIG1ldGEgZXZlbnQgYGxpc3RlbmVyQWRkZWRgIG9yIGBsaXN0ZW5lclJlbW92ZWRgIik7dGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSxXbyh0aGlzLGUsdCk7Y29uc3Qgbz0obj1JZSh0aGlzLGUpKSE9bnVsbD9uOm5ldyBTZXQsaT10ZS5nZXQodGhpcykscz1bLi4ub10sYT1TZShlKT9bXTpbLi4uaV07YXdhaXQgWHIsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnMubWFwKGFzeW5jIHU9PntpZihvLmhhcyh1KSlyZXR1cm4gdSh0KX0pLC4uLmEubWFwKGFzeW5jIHU9PntpZihpLmhhcyh1KSlyZXR1cm4gdShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7dmFyIG47aWYoQWUoZSksU2UoZSkmJiFvdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgZXZlbnROYW1lYCBjYW5ub3QgYmUgbWV0YSBldmVudCBgbGlzdGVuZXJBZGRlZGAgb3IgYGxpc3RlbmVyUmVtb3ZlZGAiKTt0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IG89KG49SWUodGhpcyxlKSkhPW51bGw/bjpuZXcgU2V0LGk9dGUuZ2V0KHRoaXMpLHM9Wy4uLm9dLGE9Wy4uLmldO2F3YWl0IFhyO2Zvcihjb25zdCB1IG9mIHMpby5oYXModSkmJmF3YWl0IHUodCk7Zm9yKGNvbnN0IHUgb2YgYSlpLmhhcyh1KSYmYXdhaXQgdShlLHQpfW9uQW55KGUpe3JldHVybiBpdChlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRlLmdldCh0aGlzKS5hZGQoZSksc3QodGhpcyxydCx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBRcih0aGlzKX1vZmZBbnkoZSl7aXQoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHN0KHRoaXMsbnQse2xpc3RlbmVyOmV9KSx0ZS5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCJ8fHR5cGVvZiB0PT0ibnVtYmVyIil7Y29uc3Qgbj1JZSh0aGlzLHQpO24mJm4uY2xlYXIoKTtjb25zdCBvPU5lKHRoaXMsdCk7aWYobyl7Zm9yKGNvbnN0IGkgb2YgbylpLmZpbmlzaCgpO28uY2xlYXIoKX19ZWxzZXt0ZS5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3RbbixvXW9mIGhlLmdldCh0aGlzKS5lbnRyaWVzKCkpby5jbGVhcigpLGhlLmdldCh0aGlzKS5kZWxldGUobik7Zm9yKGNvbnN0W24sb11vZiBaLmdldCh0aGlzKS5lbnRyaWVzKCkpe2Zvcihjb25zdCBpIG9mIG8paS5maW5pc2goKTtvLmNsZWFyKCksWi5nZXQodGhpcykuZGVsZXRlKG4pfX19bGlzdGVuZXJDb3VudChlKXt2YXIgdCxuLG8saSxzLGE7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB1PTA7Zm9yKGNvbnN0IGYgb2YgZSl7aWYodHlwZW9mIGY9PSJzdHJpbmciKXt1Kz10ZS5nZXQodGhpcykuc2l6ZSsoKG49KHQ9SWUodGhpcyxmKSk9PW51bGw/dm9pZCAwOnQuc2l6ZSkhPW51bGw/bjowKSsoKGk9KG89TmUodGhpcyxmKSk9PW51bGw/dm9pZCAwOm8uc2l6ZSkhPW51bGw/aTowKSsoKGE9KHM9TmUodGhpcykpPT1udWxsP3ZvaWQgMDpzLnNpemUpIT1udWxsP2E6MCk7Y29udGludWV9dHlwZW9mIGY8InUiJiZBZShmKSx1Kz10ZS5nZXQodGhpcykuc2l6ZTtmb3IoY29uc3QgZCBvZiBoZS5nZXQodGhpcykudmFsdWVzKCkpdSs9ZC5zaXplO2Zvcihjb25zdCBkIG9mIFouZ2V0KHRoaXMpLnZhbHVlcygpKXUrPWQuc2l6ZX1yZXR1cm4gdX1iaW5kTWV0aG9kcyhlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXFyKHQpO2Zvcihjb25zdCBuIG9mIHQpe2lmKGVbbl0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke259XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITEsdmFsdWU6dGhpc1tuXS5iaW5kKHRoaXMpfSl9fX1jb25zdCBLcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhSZS5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6cnQsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmUsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOm50LHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7ZnVuY3Rpb24gVm8ocil7cmV0dXJuIHIub25BbnkmJnIuZW1pdH1hc3luYyBmdW5jdGlvbiBIbyhyLGUpe2NvbnN0e2Z1bmN0aW9uTmFtZTp0LGFyZ3M6bn09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2lmKCF0KXRocm93Im1pc3NpbmcgZnVuY3Rpb24gbmFtZSB0byBjYWxsIjtpZighZS5pbnN0YW5jZVt0XSl0aHJvd2B1bmRlZmluZWQgZnVuY3Rpb24gWyR7dH1dIGluIGNsYXNzICR7ZS5pbnN0YW5jZS5jb25zdHJ1Y3Rvci53b3JrZXJJZH1gO1VlKHIsYXdhaXQgZS5pbnN0YW5jZVt0XSguLi5uIT1udWxsP246W10pKX1jb25zdCBKcj1KKCJyZWdpc3RlcmVkV29ya2VycyIse30pO2Z1bmN0aW9uIGpvKHIsZSl7ZS53b3JrZXJJZD1yLFlyKCkmJihKcltlLndvcmtlcklkXT1lKX1mdW5jdGlvbiBZbyhyLGUpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBjbGFzc05hbWUgd2hpbGUgaW5pdGlhbGl6aW5nIHdvcmtlciI7Y29uc3RbdCxuXT1yLmFyZ3Msbz1Kclt0XTtpZihvKWUuaW5zdGFuY2U9bmV3IG8oci5hcmdzLnNsaWNlKDEpKTtlbHNlIHRocm93YHVua25vd24gd29ya2VyIGNsYXNzICR7dH1gO2V0KG4sUSksVm8oZS5pbnN0YW5jZSkmJmUuaW5zdGFuY2Uub25BbnkoKGkscyk9PntVZSh7dHlwZTpWLkVWRU5UfSx7bmFtZTppLGRhdGE6c30pfSksVWUocix0eXBlb2YgZS5pbnN0YW5jZSE9PXZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gWG8ocixlKXtjb25zdHthcmdzOnR9PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtsZXQgbjtlLmluc3RhbmNlLnRlcm1pbmF0ZSYmKG49YXdhaXQgZS5pbnN0YW5jZS50ZXJtaW5hdGUoLi4udCE9bnVsbD90OltdKSksVWUocixuKX1mdW5jdGlvbiBRbyhyKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgZ2xvYmFscyB3aGlsZSBzeW5jaW5nIjtldChyLmFyZ3NbMF0sUSksVWUocix7fSl9ZnVuY3Rpb24gcW8oKXtjb25zdCByPXt9O29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSBWLklOSVQ6WW8odCxyKTticmVhaztjYXNlIFYuRk9SV0FSRDpIbyh0LHIpO2JyZWFrO2Nhc2UgVi5URVJNSU5BVEU6WG8odCxyKTticmVhaztjYXNlIFYuR0xPQkFMU19TWU5DOlFvKHQpO2JyZWFrfX19WXIoKSYmcW8oKTt2YXIgS289T2JqZWN0LmRlZmluZVByb3BlcnR5LEpvPShyLGUsdCk9PmUgaW4gcj9LbyhyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpyW2VdPXQsdz0ocixlLHQpPT4oSm8ocix0eXBlb2YgZSE9InN5bWJvbCI/ZSsiIjplLHQpLHQpO2NsYXNzIGVle313KGVlLCJ1cGRhdGVzIix7dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSksdyhlZSwiZXJyb3JzIix7dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifSk7Y29uc3QgcmU9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsTGU9bmV3IFdlYWtNYXAsanQ9U3ltYm9sKCJhbnlQcm9kdWNlciIpLFpyPVByb21pc2UucmVzb2x2ZSgpLHV0PVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLGN0PVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IFl0PSExO2Z1bmN0aW9uIEZlKHIpe2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdHlwZW9mIHIhPSJzeW1ib2wiKXRocm93IG5ldyBUeXBlRXJyb3IoImV2ZW50TmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sIil9ZnVuY3Rpb24gZnQocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gUGUocixlKXtjb25zdCB0PWF0LmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gemUocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6anQsbj1MZS5nZXQocik7cmV0dXJuIG4uaGFzKHQpfHxuLnNldCh0LG5ldyBTZXQpLG4uZ2V0KHQpfWZ1bmN0aW9uIFpvKHIsZSx0KXtjb25zdCBuPUxlLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgbyBvZiBuLmdldChlKSlvLmVucXVldWUodCk7aWYobi5oYXMoanQpKXtjb25zdCBvPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgaSBvZiBuLmdldChqdCkpaS5lbnF1ZXVlKG8pfX1mdW5jdGlvbiBlbihyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxvPVtdO2NvbnN0IGk9e2VucXVldWUocyl7by5wdXNoKHMpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgcyBvZiBlKXplKHIscykuYWRkKGkpO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIG8/by5sZW5ndGg9PT0wP3Q/KG89dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2Uocz0+e249c30pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBvLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKHMpe289dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpemUocixhKS5kZWxldGUoaSk7cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgc306e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiB0bihyKXtpZihyPT09dm9pZCAwKXJldHVybiBybjtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIXJuLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgWHQ9cj0+cj09PXV0fHxyPT09Y3Q7Y2xhc3MgbWV7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9dG4odCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgcyBvZiB0KWlmKG4ucHJvdG90eXBlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBvKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IG1lfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6b30pO2NvbnN0IGk9cz0+ZnVuY3Rpb24oLi4uYSl7cmV0dXJuIHRoaXNbZV1bc10oLi4uYSl9O2Zvcihjb25zdCBzIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLHMse2VudW1lcmFibGU6ITEsdmFsdWU6aShzKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBZdDtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxZdH1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe1l0PWV9Y29uc3RydWN0b3IoZT17fSl7cmUuc2V0KHRoaXMsbmV3IFNldCksYXQuc2V0KHRoaXMsbmV3IE1hcCksTGUuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixvLGkpPT57dHJ5e2k9SlNPTi5zdHJpbmdpZnkoaSl9Y2F0Y2h7aT1gT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzIGZhaWxlZCB0byBzdHJpbmdpZnk6ICR7T2JqZWN0LmtleXMoaSkuam9pbigiLCIpfWB9dHlwZW9mIG89PSJzeW1ib2wiJiYobz1vLnRvU3RyaW5nKCkpO2NvbnN0IHM9bmV3IERhdGUsYT1gJHtzLmdldEhvdXJzKCl9OiR7cy5nZXRNaW51dGVzKCl9OiR7cy5nZXRTZWNvbmRzKCl9LiR7cy5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHthfV1bZW1pdHRlcnk6JHt0fV1bJHtufV0gRXZlbnQgTmFtZTogJHtvfQoJZGF0YTogJHtpfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LG4peyhtZS5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUsdCxuKX1vbihlLHQpe2Z0KHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgbiBvZiBlKUZlKG4pLFBlKHRoaXMsbikuYWRkKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZSIsbix2b2lkIDApLFh0KG4pfHx0aGlzLmVtaXQodXQse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7ZnQodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpRmUobiksUGUodGhpcyxuKS5kZWxldGUodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxYdChuKXx8dGhpcy5lbWl0KGN0LHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IG49dGhpcy5vbihlLG89PntuKCksdChvKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUZlKHQpO3JldHVybiBlbih0aGlzLGUpfWFzeW5jIGVtaXQoZSx0KXtGZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0IixlLHQpLFpvKHRoaXMsZSx0KTtjb25zdCBuPVBlKHRoaXMsZSksbz1yZS5nZXQodGhpcyksaT1bLi4ubl0scz1YdChlKT9bXTpbLi4ub107YXdhaXQgWnIsYXdhaXQgUHJvbWlzZS5hbGwoWy4uLmkubWFwKGFzeW5jIGE9PntpZihuLmhhcyhhKSlyZXR1cm4gYSh0KX0pLC4uLnMubWFwKGFzeW5jIGE9PntpZihvLmhhcyhhKSlyZXR1cm4gYShlLHQpfSldKX1hc3luYyBlbWl0U2VyaWFsKGUsdCl7RmUoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdFNlcmlhbCIsZSx0KTtjb25zdCBuPVBlKHRoaXMsZSksbz1yZS5nZXQodGhpcyksaT1bLi4ubl0scz1bLi4ub107YXdhaXQgWnI7Zm9yKGNvbnN0IGEgb2YgaSluLmhhcyhhKSYmYXdhaXQgYSh0KTtmb3IoY29uc3QgYSBvZiBzKW8uaGFzKGEpJiZhd2FpdCBhKGUsdCl9b25BbnkoZSl7cmV0dXJuIGZ0KGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCkscmUuZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQodXQse2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gZW4odGhpcyl9b2ZmQW55KGUpe2Z0KGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSx0aGlzLmVtaXQoY3Qse2xpc3RlbmVyOmV9KSxyZS5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe1BlKHRoaXMsdCkuY2xlYXIoKTtjb25zdCBuPXplKHRoaXMsdCk7Zm9yKGNvbnN0IG8gb2YgbilvLmZpbmlzaCgpO24uY2xlYXIoKX1lbHNle3JlLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBuIG9mIGF0LmdldCh0aGlzKS52YWx1ZXMoKSluLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgTGUuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgbyBvZiBuKW8uZmluaXNoKCk7bi5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXtpZih0eXBlb2Ygbj09InN0cmluZyIpe3QrPXJlLmdldCh0aGlzKS5zaXplK1BlKHRoaXMsbikuc2l6ZSt6ZSh0aGlzLG4pLnNpemUremUodGhpcykuc2l6ZTtjb250aW51ZX10eXBlb2YgbjwidSImJkZlKG4pLHQrPXJlLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBvIG9mIGF0LmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1vLnNpemU7Zm9yKGNvbnN0IG8gb2YgTGUuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPW8uc2l6ZX1yZXR1cm4gdH1iaW5kTWV0aG9kcyhlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXRuKHQpO2Zvcihjb25zdCBuIG9mIHQpe2lmKGVbbl0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke259XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITEsdmFsdWU6dGhpc1tuXS5iaW5kKHRoaXMpfSl9fX1jb25zdCBybj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtZS5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLCJsaXN0ZW5lckFkZGVkIix7dmFsdWU6dXQsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobWUsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOmN0LHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSk7dmFyIFF0PW1lO2Z1bmN0aW9uIGVpKHIpe3JldHVybiB0eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsJiYibWVzc2FnZSJpbiByJiZ0eXBlb2Ygci5tZXNzYWdlPT0ic3RyaW5nIn1mdW5jdGlvbiB0aShyKXtpZihlaShyKSlyZXR1cm4gcjt0cnl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2h7cmV0dXJuIG5ldyBFcnJvcihTdHJpbmcocikpfX1mdW5jdGlvbiBxdChyKXtyZXR1cm4gdGkocikubWVzc2FnZX12YXIgcmk9T2JqZWN0LmRlZmluZVByb3BlcnR5LG5pPShyLGUsdCk9PmUgaW4gcj9yaShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpyW2VdPXQsb2k9KHIsZSx0KT0+KG5pKHIsdHlwZW9mIGUhPSJzeW1ib2wiP2UrIiI6ZSx0KSx0KTtjb25zdCBpaT0iaGxnLnRva2JveC5jb20vcHJvZC9sb2dnaW5nL3ZjcF93ZWJydGMiLHNpPSJodHRwczovLyIsYWk9MWU0O2xldCBsdDtjb25zdCB1aT1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gY2koKXtpZighbHQmJihsdD10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byksIWx0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGx0KHVpKX1jb25zdCBDPVtdO2ZvcihsZXQgcj0wO3I8MjU2OysrcilDLnB1c2goKHIrMjU2KS50b1N0cmluZygxNikuc2xpY2UoMSkpO2Z1bmN0aW9uIGZpKHIsZT0wKXtyZXR1cm4oQ1tyW2UrMF1dK0NbcltlKzFdXStDW3JbZSsyXV0rQ1tyW2UrM11dKyItIitDW3JbZSs0XV0rQ1tyW2UrNV1dKyItIitDW3JbZSs2XV0rQ1tyW2UrN11dKyItIitDW3JbZSs4XV0rQ1tyW2UrOV1dKyItIitDW3JbZSsxMF1dK0NbcltlKzExXV0rQ1tyW2UrMTJdXStDW3JbZSsxM11dK0NbcltlKzE0XV0rQ1tyW2UrMTVdXSkudG9Mb3dlckNhc2UoKX1jb25zdCBsaT10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLnJhbmRvbVVVSUQmJmNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKSxubj17cmFuZG9tVVVJRDpsaX07ZnVuY3Rpb24gZGkocixlLHQpe2lmKG5uLnJhbmRvbVVVSUQmJiFlJiYhcilyZXR1cm4gbm4ucmFuZG9tVVVJRCgpO3I9cnx8e307Y29uc3Qgbj1yLnJhbmRvbXx8KHIucm5nfHxjaSkoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKGxldCBvPTA7bzwxNjsrK28pZVt0K29dPW5bb107cmV0dXJuIGV9cmV0dXJuIGZpKG4pfWZ1bmN0aW9uIEt0KHIsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCB0PWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHRbcl18fCh0W3JdPWUpLHRbcl19Y29uc3QgbmU9S3QoImdsb2JhbHMiLHt9KTt2YXIgcGU9KHI9PihyLklOSVQ9IklOSVQiLHIuRk9SV0FSRD0iRk9SV0FSRCIsci5URVJNSU5BVEU9IlRFUk1JTkFURSIsci5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIscikpKHBlfHx7fSk7ZnVuY3Rpb24gb24ocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnIgaW5zdGFuY2VvZiBlKX1sZXQgaGk9MDtmdW5jdGlvbiBtaShyLGUsdCxuLG8pe2NvbnN0IGk9aGkrKztyZXR1cm4gci5wb3N0TWVzc2FnZSh7aWQ6aSx0eXBlOmUsZnVuY3Rpb25OYW1lOnQsYXJnczpufSxuLmZpbHRlcihzPT5vbihzKSkpLG5ldyBQcm9taXNlKHM9PntvPT1udWxsfHxvLnNldChpLHMpfSl9ZnVuY3Rpb24gR2UocixlKXtjb25zdHtpZDp0LHR5cGU6bn09cixvPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnQsdHlwZTpuLHJlc3VsdDplfSxvLmZpbHRlcihpPT5vbihpKSkpfWNvbnN0IHNuPUt0KCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gYW4oKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWFzeW5jIGZ1bmN0aW9uIHBpKCl7aWYoYW4oKSlHZSh7dHlwZTpwZS5HTE9CQUxTX1NZTkN9LG5lKTtlbHNle2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgaW4gc24pe2NvbnN0e3dvcmtlcjp0LHJlc29sdmVyczpufT1zbltlXS53b3JrZXJDb250ZXh0O3QmJnIucHVzaChtaSh0LHBlLkdMT0JBTFNfU1lOQywiIixbbmVdLG4pKX1hd2FpdCBQcm9taXNlLmFsbChyKX19ZnVuY3Rpb24gZHQocixlKXtpZihBcnJheS5pc0FycmF5KGUpKWUuc3BsaWNlKDAsZS5sZW5ndGgpO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcihjb25zdCB0IGluIGUpZGVsZXRlIGVbdF07Zm9yKGNvbnN0IHQgaW4gcilBcnJheS5pc0FycmF5KHJbdF0pPyhlW3RdPVtdLGR0KHJbdF0sZVt0XSkpOnR5cGVvZiByW3RdPT0ib2JqZWN0Ij8oZVt0XT17fSxkdChyW3RdLGVbdF0pKTplW3RdPXJbdF19YXN5bmMgZnVuY3Rpb24gZ2kocixlKXtjb25zdHtmdW5jdGlvbk5hbWU6dCxhcmdzOm59PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighdCl0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2VbdF0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3R9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDtHZShyLGF3YWl0IGUuaW5zdGFuY2VbdF0oLi4ubiE9bnVsbD9uOltdKSl9Y29uc3QgeWk9S3QoInJlZ2lzdGVyZWRXb3JrZXJzIix7fSk7ZnVuY3Rpb24gYmkocixlKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgY2xhc3NOYW1lIHdoaWxlIGluaXRpYWxpemluZyB3b3JrZXIiO2NvbnN0W3Qsbl09ci5hcmdzLG89eWlbdF07aWYobyllLmluc3RhbmNlPW5ldyBvKHIuYXJncy5zbGljZSgxKSk7ZWxzZSB0aHJvd2B1bmtub3duIHdvcmtlciBjbGFzcyAke3R9YDtkdChuLG5lKSxHZShyLHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiB4aShyLGUpe2NvbnN0e2FyZ3M6dH09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi50IT1udWxsP3Q6W10pKSxHZShyLG4pfWZ1bmN0aW9uIF9pKHIpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBnbG9iYWxzIHdoaWxlIHN5bmNpbmciO2R0KHIuYXJnc1swXSxuZSksR2Uocix7fSl9ZnVuY3Rpb24gdmkoKXtjb25zdCByPXt9O29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSBwZS5JTklUOmJpKHQscik7YnJlYWs7Y2FzZSBwZS5GT1JXQVJEOmdpKHQscik7YnJlYWs7Y2FzZSBwZS5URVJNSU5BVEU6eGkodCxyKTticmVhaztjYXNlIHBlLkdMT0JBTFNfU1lOQzpfaSh0KTticmVha319fWFuKCkmJnZpKCk7ZnVuY3Rpb24gRWkocixlKXtyZXR1cm4gbmVbcl18fChuZVtyXT1lKSxbKCk9Pm5lW3JdLGFzeW5jIHQ9PntuZVtyXT10LGF3YWl0IHBpKCl9XX1mdW5jdGlvbiBUaShyLGUpe3JldHVybiBFaShyLGUpfWNvbnN0W3dpLEFpXT1UaSgibWV0YWRhdGEiKTtmdW5jdGlvbiBJaShyKXtBaShyKX1mdW5jdGlvbiBKdCgpe3JldHVybiB3aSgpfWNsYXNzIFp0e2NvbnN0cnVjdG9yKGUpe29pKHRoaXMsInV1aWQiLGRpKCkpLHRoaXMuY29uZmlnPWV9YXN5bmMgc2VuZChlKXt2YXIgdCxuLG87Y29uc3R7YXBwSWQ6aSxzb3VyY2VUeXBlOnN9PSh0PUp0KCkpIT1udWxsP3Q6e307aWYoIWl8fCFzKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBhPW5ldyBBYm9ydENvbnRyb2xsZXIsdT1zZXRUaW1lb3V0KCgpPT5hLmFib3J0KCksYWkpO3JldHVybiBhd2FpdCgobz0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP286ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDphLnNpZ25hbH0pLGNsZWFyVGltZW91dCh1KSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHQ9KGU9SnQoKS5wcm94eVVybCkhPW51bGw/ZTpzaTtyZXR1cm4gdCs9KHQuYXQoLTEpPT09Ii8iPyIiOiIvIikraWksdH1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3QgdD1KdCgpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6dC5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDp0LnByb3h5VXJsLHNvdXJjZTp0LnNvdXJjZVR5cGV9fX1jb25zdCBodD0iMi4wLjMiO2NsYXNzIFNpe2NvbnN0cnVjdG9yKGUpe3codGhpcywiZnJhbWVUcmFuc2Zvcm1lZENvdW50IiwwKSx3KHRoaXMsImZyYW1lRnJvbVNvdXJjZUNvdW50IiwwKSx3KHRoaXMsInN0YXJ0QXQiLDApLHcodGhpcywicmVwb3J0ZXIiKSx0aGlzLmNvbmZpZz1lLHRoaXMucmVwb3J0ZXI9bmV3IFp0KGUpfWFzeW5jIG9uRnJhbWVGcm9tU291cmNlKCl7dGhpcy5mcmFtZUZyb21Tb3VyY2VDb3VudCsrfWdldCBmcHMoKXtjb25zdHtzdGFydEF0OmUsZnJhbWVGcm9tU291cmNlQ291bnQ6dH09dGhpcyxuPShEYXRlLm5vdygpLWUpLzFlMztyZXR1cm4gdC9ufWFzeW5jIG9uRnJhbWVUcmFuc2Zvcm1lZChlPXt9LHQ9ITEpe3RoaXMuc3RhcnRBdD09PTAmJih0aGlzLnN0YXJ0QXQ9RGF0ZS5ub3coKSksdGhpcy5mcmFtZVRyYW5zZm9ybWVkQ291bnQrKztjb25zdHtzdGFydEF0Om4sZnJhbWVUcmFuc2Zvcm1lZENvdW50Om8sZnJhbWVGcm9tU291cmNlQ291bnQ6aX09dGhpcyxzPURhdGUubm93KCksYT0ocy1uKS8xZTMsdT1vL2EsZj1pL2E7cmV0dXJuIHR8fHRoaXMuZnJhbWVUcmFuc2Zvcm1lZENvdW50Pj10aGlzLmNvbmZpZy5sb2dnaW5nSW50ZXJ2YWxGcmFtZUNvdW50Pyh0aGlzLmZyYW1lRnJvbVNvdXJjZUNvdW50PTAsdGhpcy5mcmFtZVRyYW5zZm9ybWVkQ291bnQ9MCx0aGlzLnN0YXJ0QXQ9cyx0aGlzLnJlcG9ydGVyLmNvbmZpZz10aGlzLmNvbmZpZyx0aGlzLnJlcG9ydGVyLnNlbmQoey4uLnRoaXMuY29uZmlnLnJlcG9ydCx2YXJpYXRpb246IlFvUyIsZnBzOmYsdHJhbnNmb3JtZWRGcHM6dSxmcmFtZXNUcmFuc2Zvcm1lZDpvLC4uLmV9KSk6InN1Y2Nlc3MifX12YXIgZXI9KHI9PihyLnBpcGVsaW5lX2VuZGVkPSJwaXBlbGluZV9lbmRlZCIsci5waXBlbGluZV9lbmRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9lbmRlZF93aXRoX2Vycm9yIixyLnBpcGVsaW5lX3N0YXJ0ZWQ9InBpcGVsaW5lX3N0YXJ0ZWQiLHIucGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yPSJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiLHIucGlwZWxpbmVfcmVzdGFydGVkPSJwaXBlbGluZV9yZXN0YXJ0ZWQiLHIucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3I9InBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yIixyKSkoZXJ8fHt9KTtjb25zdCBSaT01MDAsRmk9Ljg7Y2xhc3MgUGkgZXh0ZW5kcyBRdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCksdyh0aGlzLCJyZXBvcnRlcl8iLG5ldyBadCksdyh0aGlzLCJyZXBvcnRlclFvc18iLG5ldyBTaSh7bG9nZ2luZ0ludGVydmFsRnJhbWVDb3VudDpSaSxyZXBvcnQ6e3ZlcnNpb246aHR9fSkpLHcodGhpcywidHJhbnNmb3JtZXJUeXBlXyIpLHcodGhpcywidHJhbnNmb3JtZXJfIiksdyh0aGlzLCJzaG91bGRTdG9wXyIpLHcodGhpcywiaXNGbGFzaGVkXyIpLHcodGhpcywibWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXyIpLHcodGhpcywidmlkZW9IZWlnaHRfIiksdyh0aGlzLCJ2aWRlb1dpZHRoXyIpLHcodGhpcywidHJhY2tFeHBlY3RlZFJhdGVfIiksdyh0aGlzLCJpbmRleF8iKSx3KHRoaXMsImNvbnRyb2xsZXJfIiksdGhpcy5pbmRleF89dCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMudmlkZW9IZWlnaHRfPTAsdGhpcy52aWRlb1dpZHRoXz0wLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMudHJhbnNmb3JtZXJUeXBlXz0iQ3VzdG9tIiwiZ2V0VHJhbnNmb3JtZXJUeXBlImluIGUmJih0aGlzLnRyYW5zZm9ybWVyVHlwZV89ZS5nZXRUcmFuc2Zvcm1lclR5cGUoKSksdGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiQ3JlYXRlIn0pfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWV9YXN5bmMgc3RhcnQoZSl7aWYodGhpcy5jb250cm9sbGVyXz1lLHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe3RoaXMucmVwb3J0KHttZXNzYWdlOmVlLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCx2YXJpYXRpb246IkVycm9yIixlcnJvcjpxdCh0KX0pO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBuLG8saSxzO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0obj1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP246MCx0aGlzLnZpZGVvV2lkdGhfPShvPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9vOjApLHRoaXMucmVwb3J0ZXJRb3NfLm9uRnJhbWVGcm9tU291cmNlKCksdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyljb25zb2xlLndhcm4oIltQaXBlbGluZV0gZmx1c2ggZnJvbSB0cmFuc2Zvcm0iKSxlLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2V7dHJ5e2F3YWl0KChzPShpPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDpzLmNhbGwoaSxlLHQpKSx0aGlzLnJlcG9ydFFvcygpfWNhdGNoKGEpe3RoaXMucmVwb3J0KHttZXNzYWdlOmVlLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0sdmFyaWF0aW9uOiJFcnJvciIsZXJyb3I6cXQoYSl9KTtjb25zdCB1PXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIix1KX1pZih0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKkZpPnRoaXMucmVwb3J0ZXJRb3NfLmZwcyl7Y29uc3QgYT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6ImZwc19kcm9wIixkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dGhpcy5yZXBvcnRlclFvc18uZnBzfX07dGhpcy5lbWl0KCJ3YXJuIixhKX19fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2godCl7dGhpcy5yZXBvcnQoe21lc3NhZ2U6ZWUuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoLHZhcmlhdGlvbjoiRXJyb3IiLGVycm9yOnF0KHQpfSk7Y29uc3Qgbj17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixuKX19dGhpcy5yZXBvcnRRb3MoITApLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkRlbGV0ZSJ9KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1yZXBvcnQoZSl7dGhpcy5yZXBvcnRlcl8uc2VuZCh7dmVyc2lvbjpodCxhY3Rpb246Ik1lZGlhVHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyVHlwZTp0aGlzLnRyYW5zZm9ybWVyVHlwZV8sLi4uZX0pfXJlcG9ydFFvcyhlPSExKXt0aGlzLnJlcG9ydGVyUW9zXy5jb25maWc9ey4uLnRoaXMucmVwb3J0ZXJRb3NfLmNvbmZpZ30sdGhpcy5yZXBvcnRlclFvc18ub25GcmFtZVRyYW5zZm9ybWVkKHt2ZXJzaW9uOmh0LGFjdGlvbjoiTWVkaWFUcmFuc2Zvcm1lciIsdHJhbnNmb3JtZXJUeXBlOnRoaXMudHJhbnNmb3JtZXJUeXBlXyx2aWRlb1dpZHRoOnRoaXMudmlkZW9XaWR0aF8sdmlkZW9IZWlnaHQ6dGhpcy52aWRlb0hlaWdodF99LGUpfX1jbGFzcyBraSBleHRlbmRzIFF0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdyh0aGlzLCJ0cmFuc2Zvcm1lcnNfIiksdyh0aGlzLCJ0cmFja0V4cGVjdGVkUmF0ZV8iKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPW5ldyBQaShlW3RdLHQpO24ub24oImVycm9yIixvPT57dGhpcy5lbWl0KCJlcnJvciIsbyl9KSxuLm9uKCJ3YXJuIixvPT57dGhpcy5lbWl0KCJ3YXJuIixvKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKG4pfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IG49ZTtmb3IobGV0IG8gb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKG8pKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgbi5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX2VuZGVkIil9KS5jYXRjaChhc3luYyBvPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2goaT0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsaSl9KSxhd2FpdCB0LmFib3J0KG8pLGF3YWl0IG4uY2FuY2VsKG8pLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIpfSl9Y2F0Y2h7dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiKSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkIiksY29uc29sZS5sb2coIltQaXBlbGluZV0gUGlwZWxpbmUgc3RhcnRlZC4iKX1hc3luYyBkZXN0cm95KCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gRGVzdHJveWluZyBQaXBlbGluZS4iKTtmb3IobGV0IGUgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWUuc3RvcCgpfX1jbGFzcyBEaSBleHRlbmRzIFF0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx3KHRoaXMsInJlcG9ydGVyXyIpLHcodGhpcywicGlwZWxpbmVfIiksdyh0aGlzLCJ0cmFuc2Zvcm1lcnNfIiksdyh0aGlzLCJyZWFkYWJsZV8iKSx3KHRoaXMsIndyaXRhYmxlXyIpLHcodGhpcywidHJhY2tFeHBlY3RlZFJhdGVfIiksdGhpcy5yZXBvcnRlcl89bmV3IFp0LHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMucmVwb3J0KHt2YXJpYXRpb246IkNyZWF0ZSJ9KX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUsdCl7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89dCx0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZSx0KT0+e2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXt0aGlzLnJlcG9ydCh7bWVzc2FnZTplZS5lcnJvcnMudHJhbnNmb3JtZXJfbm9uZSx2YXJpYXRpb246IkVycm9yIn0pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe3RoaXMucmVwb3J0KHt2YXJpYXRpb246IkVycm9yIixtZXNzYWdlOmVlLmVycm9ycy5yZWFkYWJsZV9udWxsfSksdCgiW01lZGlhUHJvY2Vzc29yXSBSZWFkYWJsZSBpcyBudWxsLiIpO3JldHVybn1pZighdGhpcy53cml0YWJsZV8pe3RoaXMucmVwb3J0KHt2YXJpYXRpb246IkVycm9yIixtZXNzYWdlOmVlLmVycm9ycy53cml0YWJsZV9udWxsfSksdCgiW01lZGlhUHJvY2Vzc29yXSBXcml0YWJsZSBpcyBudWxsLiIpO3JldHVybn1sZXQgbj0hMTt0aGlzLnBpcGVsaW5lXyYmKG49ITAsdGhpcy5waXBlbGluZV8uY2xlYXJMaXN0ZW5lcnMoKSx0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCkpLHRoaXMucGlwZWxpbmVfPW5ldyBraSh0aGlzLnRyYW5zZm9ybWVyc18pLHRoaXMucGlwZWxpbmVfLm9uKCJ3YXJuIixvPT57dGhpcy5lbWl0KCJ3YXJuIixvKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJlcnJvciIsbz0+e3RoaXMuZW1pdCgiZXJyb3IiLG8pfSksdGhpcy5waXBlbGluZV8ub24oInBpcGVsaW5lSW5mbyIsbz0+e24mJihvPT09InBpcGVsaW5lX3N0YXJ0ZWQiP289ZXIucGlwZWxpbmVfcmVzdGFydGVkOm89PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKG89ZXIucGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IpKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsbyl9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKG89Pnt0KG8pfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7cmV0dXJuIHRoaXMucmVwb3J0KHt2YXJpYXRpb246IlVwZGF0ZSIsbWVzc2FnZTplZS51cGRhdGVzLnRyYW5zZm9ybWVyX25ld30pLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyBlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKSx0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJEZWxldGUifSksZSgpfSl9cmVwb3J0KGUpe3RoaXMucmVwb3J0ZXJfLnNlbmQoe3ZlcnNpb246aHQsYWN0aW9uOiJNZWRpYVByb2Nlc3NvciIsLi4uZX0pfX12YXIgQ2k9T2JqZWN0LmRlZmluZVByb3BlcnR5LEJpPShyLGUsdCk9PmUgaW4gcj9DaShyLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpyW2VdPXQsTWk9KHIsZSx0KT0+KEJpKHIsdHlwZW9mIGUhPSJzeW1ib2wiP2UrIiI6ZSx0KSx0KTtjb25zdCBPaT0iaGxnLnRva2JveC5jb20vcHJvZC9sb2dnaW5nL3ZjcF93ZWJydGMiLFVpPSJodHRwczovLyIsTmk9MWU0O2xldCBtdDtjb25zdCBMaT1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gemkoKXtpZighbXQmJihtdD10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byksIW10KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIG10KExpKX1jb25zdCBCPVtdO2ZvcihsZXQgcj0wO3I8MjU2OysrcilCLnB1c2goKHIrMjU2KS50b1N0cmluZygxNikuc2xpY2UoMSkpO2Z1bmN0aW9uIEdpKHIsZT0wKXtyZXR1cm4oQltyW2UrMF1dK0JbcltlKzFdXStCW3JbZSsyXV0rQltyW2UrM11dKyItIitCW3JbZSs0XV0rQltyW2UrNV1dKyItIitCW3JbZSs2XV0rQltyW2UrN11dKyItIitCW3JbZSs4XV0rQltyW2UrOV1dKyItIitCW3JbZSsxMF1dK0JbcltlKzExXV0rQltyW2UrMTJdXStCW3JbZSsxM11dK0JbcltlKzE0XV0rQltyW2UrMTVdXSkudG9Mb3dlckNhc2UoKX1jb25zdCAkaT10eXBlb2YgY3J5cHRvPCJ1IiYmY3J5cHRvLnJhbmRvbVVVSUQmJmNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKSx1bj17cmFuZG9tVVVJRDokaX07ZnVuY3Rpb24gV2kocixlLHQpe2lmKHVuLnJhbmRvbVVVSUQmJiFlJiYhcilyZXR1cm4gdW4ucmFuZG9tVVVJRCgpO3I9cnx8e307Y29uc3Qgbj1yLnJhbmRvbXx8KHIucm5nfHx6aSkoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKGxldCBvPTA7bzwxNjsrK28pZVt0K29dPW5bb107cmV0dXJuIGV9cmV0dXJuIEdpKG4pfWZ1bmN0aW9uIHRyKHIsZSl7Z2xvYmFsVGhpcy52b25hZ2V8fChnbG9iYWxUaGlzLnZvbmFnZT17fSksZ2xvYmFsVGhpcy52b25hZ2Uud29ya2VyaXplcnx8KGdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI9e30pO2xldCB0PWdsb2JhbFRoaXMudm9uYWdlLndvcmtlcml6ZXI7cmV0dXJuIHRbcl18fCh0W3JdPWUpLHRbcl19Y29uc3Qgb2U9dHIoImdsb2JhbHMiLHt9KTt2YXIgZ2U9KHI9PihyLklOSVQ9IklOSVQiLHIuRk9SV0FSRD0iRk9SV0FSRCIsci5URVJNSU5BVEU9IlRFUk1JTkFURSIsci5HTE9CQUxTX1NZTkM9IkdMT0JBTFNfU1lOQyIscikpKGdlfHx7fSk7ZnVuY3Rpb24gY24ocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnIgaW5zdGFuY2VvZiBlKX1sZXQgVmk9MDtmdW5jdGlvbiBIaShyLGUsdCxuLG8pe2NvbnN0IGk9VmkrKztyZXR1cm4gci5wb3N0TWVzc2FnZSh7aWQ6aSx0eXBlOmUsZnVuY3Rpb25OYW1lOnQsYXJnczpufSxuLmZpbHRlcihzPT5jbihzKSkpLG5ldyBQcm9taXNlKHM9PntvPT1udWxsfHxvLnNldChpLHMpfSl9ZnVuY3Rpb24gJGUocixlKXtjb25zdHtpZDp0LHR5cGU6bn09cixvPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07cG9zdE1lc3NhZ2Uoe2lkOnQsdHlwZTpuLHJlc3VsdDplfSxvLmZpbHRlcihpPT5jbihpKSkpfWNvbnN0IGZuPXRyKCJ3b3JrZXJpemVkIix7fSk7ZnVuY3Rpb24gbG4oKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWFzeW5jIGZ1bmN0aW9uIGppKCl7aWYobG4oKSkkZSh7dHlwZTpnZS5HTE9CQUxTX1NZTkN9LG9lKTtlbHNle2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgaW4gZm4pe2NvbnN0e3dvcmtlcjp0LHJlc29sdmVyczpufT1mbltlXS53b3JrZXJDb250ZXh0O3QmJnIucHVzaChIaSh0LGdlLkdMT0JBTFNfU1lOQywiIixbb2VdLG4pKX1hd2FpdCBQcm9taXNlLmFsbChyKX19ZnVuY3Rpb24gcHQocixlKXtpZihBcnJheS5pc0FycmF5KGUpKWUuc3BsaWNlKDAsZS5sZW5ndGgpO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcihjb25zdCB0IGluIGUpZGVsZXRlIGVbdF07Zm9yKGNvbnN0IHQgaW4gcilBcnJheS5pc0FycmF5KHJbdF0pPyhlW3RdPVtdLHB0KHJbdF0sZVt0XSkpOnR5cGVvZiByW3RdPT0ib2JqZWN0Ij8oZVt0XT17fSxwdChyW3RdLGVbdF0pKTplW3RdPXJbdF19YXN5bmMgZnVuY3Rpb24gWWkocixlKXtjb25zdHtmdW5jdGlvbk5hbWU6dCxhcmdzOm59PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtpZighdCl0aHJvdyJtaXNzaW5nIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbCI7aWYoIWUuaW5zdGFuY2VbdF0pdGhyb3dgdW5kZWZpbmVkIGZ1bmN0aW9uIFske3R9XSBpbiBjbGFzcyAke2UuaW5zdGFuY2UuY29uc3RydWN0b3Iud29ya2VySWR9YDskZShyLGF3YWl0IGUuaW5zdGFuY2VbdF0oLi4ubiE9bnVsbD9uOltdKSl9Y29uc3QgWGk9dHIoInJlZ2lzdGVyZWRXb3JrZXJzIix7fSk7ZnVuY3Rpb24gUWkocixlKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgY2xhc3NOYW1lIHdoaWxlIGluaXRpYWxpemluZyB3b3JrZXIiO2NvbnN0W3Qsbl09ci5hcmdzLG89WGlbdF07aWYobyllLmluc3RhbmNlPW5ldyBvKHIuYXJncy5zbGljZSgxKSk7ZWxzZSB0aHJvd2B1bmtub3duIHdvcmtlciBjbGFzcyAke3R9YDtwdChuLG9lKSwkZShyLHR5cGVvZiBlLmluc3RhbmNlIT09dm9pZCAwKX1hc3luYyBmdW5jdGlvbiBxaShyLGUpe2NvbnN0e2FyZ3M6dH09cjtpZighZS5pbnN0YW5jZSl0aHJvdyJpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQiO2xldCBuO2UuaW5zdGFuY2UudGVybWluYXRlJiYobj1hd2FpdCBlLmluc3RhbmNlLnRlcm1pbmF0ZSguLi50IT1udWxsP3Q6W10pKSwkZShyLG4pfWZ1bmN0aW9uIEtpKHIpe2lmKCFyLmFyZ3MpdGhyb3ciTWlzc2luZyBnbG9iYWxzIHdoaWxlIHN5bmNpbmciO3B0KHIuYXJnc1swXSxvZSksJGUocix7fSl9ZnVuY3Rpb24gSmkoKXtjb25zdCByPXt9O29ubWVzc2FnZT1hc3luYyBlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSBnZS5JTklUOlFpKHQscik7YnJlYWs7Y2FzZSBnZS5GT1JXQVJEOllpKHQscik7YnJlYWs7Y2FzZSBnZS5URVJNSU5BVEU6cWkodCxyKTticmVhaztjYXNlIGdlLkdMT0JBTFNfU1lOQzpLaSh0KTticmVha319fWxuKCkmJkppKCk7ZnVuY3Rpb24gWmkocixlKXtyZXR1cm4gb2Vbcl18fChvZVtyXT1lKSxbKCk9Pm9lW3JdLGFzeW5jIHQ9PntvZVtyXT10LGF3YWl0IGppKCl9XX1mdW5jdGlvbiBlcyhyLGUpe3JldHVybiBaaShyLGUpfWNvbnN0W3RzLFZsXT1lcygibWV0YWRhdGEiKTtmdW5jdGlvbiBycigpe3JldHVybiB0cygpfWNsYXNzIHJze2NvbnN0cnVjdG9yKGUpe01pKHRoaXMsInV1aWQiLFdpKCkpLHRoaXMuY29uZmlnPWV9YXN5bmMgc2VuZChlKXt2YXIgdCxuLG87Y29uc3R7YXBwSWQ6aSxzb3VyY2VUeXBlOnN9PSh0PXJyKCkpIT1udWxsP3Q6e307aWYoIWl8fCFzKXJldHVybiJtZXRhZGF0YSBtaXNzaW5nIjtjb25zdCBhPW5ldyBBYm9ydENvbnRyb2xsZXIsdT1zZXRUaW1lb3V0KCgpPT5hLmFib3J0KCksTmkpO3JldHVybiBhd2FpdCgobz0obj10aGlzLmNvbmZpZyk9PW51bGw/dm9pZCAwOm4uZmV0Y2gpIT1udWxsP286ZmV0Y2gpKHRoaXMuZ2V0VXJsKCkse21ldGhvZDoiUE9TVCIsaGVhZGVyczp0aGlzLmdldEhlYWRlcnMoKSxib2R5OkpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRSZXBvcnQoZSkpLHNpZ25hbDphLnNpZ25hbH0pLGNsZWFyVGltZW91dCh1KSwic3VjY2VzcyJ9Z2V0VXJsKCl7dmFyIGU7bGV0IHQ9KGU9cnIoKS5wcm94eVVybCkhPW51bGw/ZTpVaTtyZXR1cm4gdCs9KHQuYXQoLTEpPT09Ii8iPyIiOiIvIikrT2ksdH1nZXRIZWFkZXJzKCl7cmV0dXJueyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19YnVpbGRSZXBvcnQoZSl7Y29uc3QgdD1ycigpO3JldHVybntndWlkOnRoaXMudXVpZCwuLi5lLGFwcGxpY2F0aW9uSWQ6dC5hcHBJZCx0aW1lc3RhbXA6RGF0ZS5ub3coKSxwcm94eVVybDp0LnByb3h5VXJsLHNvdXJjZTp0LnNvdXJjZVR5cGV9fX1jb25zdCBucz0iNS4xLjIiO3ZhciBndD0ocj0+KHIuTG93PSJMb3ciLHIuSGlnaD0iSGlnaCIscikpKGd0fHx7fSksbnI9KHI9PihyLkZBU1Q9IkZBU1QiLHIuUFJFQ0lTRT0iUFJFQ0lTRSIscikpKG5yfHx7fSkseXQ9KHI9PihyLkNBTlZBUz0iQ0FOVkFTIixyLldFQkdMPSJXRUJHTCIscikpKHl0fHx7fSksb3M9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZTwidSI/ZTp7fSxuLG87dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihjLG0pe249YyxvPW19KTt2YXIgaT17fSxzO2ZvcihzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYmKGlbc109dFtzXSk7dmFyIGE9Ii4vdGhpcy5wcm9ncmFtIix1PWZ1bmN0aW9uKGMsbSl7dGhyb3cgbX0sZj0hMCxkPSIiO2Z1bmN0aW9uIHAoYyl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUoYyxkKTpkK2N9dmFyIGc7dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGQ9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihkPXIpLGQuaW5kZXhPZigiYmxvYjoiKSE9PTA/ZD1kLnN1YnN0cigwLGQucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpkPSIiO3ZhciBiPXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksaD10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IocyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJih0W3NdPWlbc10pO2k9bnVsbCx0LmFyZ3VtZW50cyYmdC5hcmd1bWVudHMsdC50aGlzUHJvZ3JhbSYmKGE9dC50aGlzUHJvZ3JhbSksdC5xdWl0JiYodT10LnF1aXQpO3ZhciB4O3Qud2FzbUJpbmFyeSYmKHg9dC53YXNtQmluYXJ5KTt2YXIgRT10Lm5vRXhpdFJ1bnRpbWV8fCEwO3R5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJmRlKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIHYsRj0hMSxrPXR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwO2Z1bmN0aW9uIEcoYyxtLHkpe2Zvcih2YXIgVD1tK3ksRD1tO2NbRF0mJiEoRD49VCk7KSsrRDtpZihELW0+MTYmJmMuc3ViYXJyYXkmJmspcmV0dXJuIGsuZGVjb2RlKGMuc3ViYXJyYXkobSxEKSk7Zm9yKHZhciBNPSIiO208RDspe3ZhciBBPWNbbSsrXTtpZighKEEmMTI4KSl7TSs9U3RyaW5nLmZyb21DaGFyQ29kZShBKTtjb250aW51ZX12YXIgVT1jW20rK10mNjM7aWYoKEEmMjI0KT09MTkyKXtNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChBJjMxKTw8NnxVKTtjb250aW51ZX12YXIgSz1jW20rK10mNjM7aWYoKEEmMjQwKT09MjI0P0E9KEEmMTUpPDwxMnxVPDw2fEs6QT0oQSY3KTw8MTh8VTw8MTJ8Szw8NnxjW20rK10mNjMsQTw2NTUzNilNKz1TdHJpbmcuZnJvbUNoYXJDb2RlKEEpO2Vsc2V7dmFyIEdvPUEtNjU1MzY7TSs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxHbz4+MTAsNTYzMjB8R28mMTAyMyl9fXJldHVybiBNfWZ1bmN0aW9uIHooYyxtKXtyZXR1cm4gYz9HKGxlLGMsbSk6IiJ9ZnVuY3Rpb24gSChjLG0seSl7Zm9yKHZhciBUPTA7VDxjLmxlbmd0aDsrK1QpVGVbbSsrPj4wXT1jLmNoYXJDb2RlQXQoVCk7eXx8KFRlW20+PjBdPTApfWZ1bmN0aW9uICQoYyxtKXtyZXR1cm4gYyVtPjAmJihjKz1tLWMlbSksY312YXIgS2UsVGUsbGUsVztmdW5jdGlvbiBCbyhjKXtLZT1jLHQuSEVBUDg9VGU9bmV3IEludDhBcnJheShjKSx0LkhFQVAxNj1uZXcgSW50MTZBcnJheShjKSx0LkhFQVAzMj1XPW5ldyBJbnQzMkFycmF5KGMpLHQuSEVBUFU4PWxlPW5ldyBVaW50OEFycmF5KGMpLHQuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYyksdC5IRUFQVTMyPW5ldyBVaW50MzJBcnJheShjKSx0LkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShjKSx0LkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShjKX10LklOSVRJQUxfTUVNT1JZO3ZhciBXcixNbz1bXSxPbz1bXSxVbz1bXSxpbD0wO2Z1bmN0aW9uIHNsKCl7cmV0dXJuIEV8fGlsPjB9ZnVuY3Rpb24gYWwoKXtpZih0LnByZVJ1bilmb3IodHlwZW9mIHQucHJlUnVuPT0iZnVuY3Rpb24iJiYodC5wcmVSdW49W3QucHJlUnVuXSk7dC5wcmVSdW4ubGVuZ3RoOylmbCh0LnByZVJ1bi5zaGlmdCgpKTtWcihNbyl9ZnVuY3Rpb24gdWwoKXtWcihPbyl9ZnVuY3Rpb24gY2woKXtpZih0LnBvc3RSdW4pZm9yKHR5cGVvZiB0LnBvc3RSdW49PSJmdW5jdGlvbiImJih0LnBvc3RSdW49W3QucG9zdFJ1bl0pO3QucG9zdFJ1bi5sZW5ndGg7KWRsKHQucG9zdFJ1bi5zaGlmdCgpKTtWcihVbyl9ZnVuY3Rpb24gZmwoYyl7TW8udW5zaGlmdChjKX1mdW5jdGlvbiBsbChjKXtPby51bnNoaWZ0KGMpfWZ1bmN0aW9uIGRsKGMpe1VvLnVuc2hpZnQoYyl9dmFyIHdlPTAsSmU9bnVsbDtmdW5jdGlvbiBobChjKXt3ZSsrLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKHdlKX1mdW5jdGlvbiBtbChjKXtpZih3ZS0tLHQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKHdlKSx3ZT09MCYmSmUpe3ZhciBtPUplO0plPW51bGwsbSgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBkZShjKXt0Lm9uQWJvcnQmJnQub25BYm9ydChjKSxjPSJBYm9ydGVkKCIrYysiKSIsaChjKSxGPSEwLGMrPSIuIEJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIGZvciBtb3JlIGluZm8uIjt2YXIgbT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGMpO3Rocm93IG8obSksbX12YXIgcGw9ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiO2Z1bmN0aW9uIE5vKGMpe3JldHVybiBjLnN0YXJ0c1dpdGgocGwpfXZhciBYO1g9InRmbGl0ZS1zaW1kLndhc20iLE5vKFgpfHwoWD1wKFgpKTtmdW5jdGlvbiBMbyhjKXt0cnl7aWYoYz09WCYmeClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeCk7aWYoIWcpdGhyb3ciYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWNhdGNoKG0pe2RlKG0pfX1mdW5jdGlvbiBnbCgpe3JldHVybiF4JiZmJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goWCx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oZnVuY3Rpb24oYyl7aWYoIWMub2spdGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIitYKyInIjtyZXR1cm4gYy5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gTG8oWCl9KTpQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIExvKFgpfSl9ZnVuY3Rpb24geWwoKXt2YXIgYz17YTpObH07ZnVuY3Rpb24gbShBLFUpe3ZhciBLPUEuZXhwb3J0czt0LmFzbT1LLHY9dC5hc20ucSxCbyh2LmJ1ZmZlciksV3I9dC5hc20uRSxsbCh0LmFzbS5yKSxtbCgpfWhsKCk7ZnVuY3Rpb24geShBKXttKEEuaW5zdGFuY2UpfWZ1bmN0aW9uIFQoQSl7cmV0dXJuIGdsKCkudGhlbihmdW5jdGlvbihVKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoVSxjKX0pLnRoZW4oZnVuY3Rpb24oVSl7cmV0dXJuIFV9KS50aGVuKEEsZnVuY3Rpb24oVSl7aCgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitVKSxkZShVKX0pfWZ1bmN0aW9uIEQoKXtyZXR1cm4heCYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhTm8oWCkmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChYLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihBKXt2YXIgVT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhBLGMpO3JldHVybiBVLnRoZW4oeSxmdW5jdGlvbihLKXtyZXR1cm4gaCgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrSyksaCgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxUKHkpfSl9KTpUKHkpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgTT10Lmluc3RhbnRpYXRlV2FzbShjLG0pO3JldHVybiBNfWNhdGNoKEEpe3JldHVybiBoKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK0EpLCExfXJldHVybiBEKCkuY2F0Y2gobykse319ZnVuY3Rpb24gVnIoYyl7Zm9yKDtjLmxlbmd0aD4wOyl7dmFyIG09Yy5zaGlmdCgpO2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKXttKHQpO2NvbnRpbnVlfXZhciB5PW0uZnVuYzt0eXBlb2YgeT09Im51bWJlciI/bS5hcmc9PT12b2lkIDA/V3IuZ2V0KHkpKCk6V3IuZ2V0KHkpKG0uYXJnKTp5KG0uYXJnPT09dm9pZCAwP251bGw6bS5hcmcpfX1mdW5jdGlvbiBibChjLG0seSxUKXtkZSgiQXNzZXJ0aW9uIGZhaWxlZDogIit6KGMpKyIsIGF0OiAiK1ttP3oobSk6InVua25vd24gZmlsZW5hbWUiLHksVD96KFQpOiJ1bmtub3duIGZ1bmN0aW9uIl0pfWZ1bmN0aW9uIHhsKGMsbSl7ZGUoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIF9sKGMsbSl7ZGUoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIHZsKCl7ZGUoIiIpfXZhciBHdDtHdD1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07dmFyIEVsPSEwO2Z1bmN0aW9uIFRsKGMpe3JldHVybiBXW3pvKCk+PjJdPWMsY31mdW5jdGlvbiB3bChjLG0pe3ZhciB5O2lmKGM9PT0wKXk9RGF0ZS5ub3coKTtlbHNlIGlmKChjPT09MXx8Yz09PTQpJiZFbCl5PUd0KCk7ZWxzZSByZXR1cm4gVGwoMjgpLC0xO3JldHVybiBXW20+PjJdPXkvMWUzfDAsV1ttKzQ+PjJdPXklMWUzKjFlMyoxZTN8MCwwfWZ1bmN0aW9uIEFsKCl7cmV0dXJuIDIxNDc0ODM2NDh9ZnVuY3Rpb24gSWwoYyxtLHkpe2xlLmNvcHlXaXRoaW4oYyxtLG0reSl9ZnVuY3Rpb24gU2woYyl7dHJ5e3JldHVybiB2Lmdyb3coYy1LZS5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLEJvKHYuYnVmZmVyKSwxfWNhdGNoe319ZnVuY3Rpb24gUmwoYyl7dmFyIG09bGUubGVuZ3RoO2M9Yz4+PjA7dmFyIHk9MjE0NzQ4MzY0ODtpZihjPnkpcmV0dXJuITE7Zm9yKHZhciBUPTE7VDw9NDtUKj0yKXt2YXIgRD1tKigxKy4yL1QpO0Q9TWF0aC5taW4oRCxjKzEwMDY2MzI5Nik7dmFyIE09TWF0aC5taW4oeSwkKE1hdGgubWF4KGMsRCksNjU1MzYpKSxBPVNsKE0pO2lmKEEpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gRmwoYyl7Zm9yKHZhciBtPUd0KCk7R3QoKS1tPGM7KTt9dmFyIEhyPXt9O2Z1bmN0aW9uIFBsKCl7cmV0dXJuIGF8fCIuL3RoaXMucHJvZ3JhbSJ9ZnVuY3Rpb24gWmUoKXtpZighWmUuc3RyaW5ncyl7dmFyIGM9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsbT17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmMsXzpQbCgpfTtmb3IodmFyIHkgaW4gSHIpSHJbeV09PT12b2lkIDA/ZGVsZXRlIG1beV06bVt5XT1Iclt5XTt2YXIgVD1bXTtmb3IodmFyIHkgaW4gbSlULnB1c2goeSsiPSIrbVt5XSk7WmUuc3RyaW5ncz1UfXJldHVybiBaZS5zdHJpbmdzfXZhciAkdD17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGMsbSl7dmFyIHk9JHQuYnVmZmVyc1tjXTttPT09MHx8bT09PTEwPygoYz09PTE/YjpoKShHKHksMCkpLHkubGVuZ3RoPTApOnkucHVzaChtKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7JHQudmFyYXJncys9NDt2YXIgYz1XWyR0LnZhcmFyZ3MtND4+Ml07cmV0dXJuIGN9LGdldFN0cjpmdW5jdGlvbihjKXt2YXIgbT16KGMpO3JldHVybiBtfSxnZXQ2NDpmdW5jdGlvbihjLG0pe3JldHVybiBjfX07ZnVuY3Rpb24ga2woYyxtKXt2YXIgeT0wO3JldHVybiBaZSgpLmZvckVhY2goZnVuY3Rpb24oVCxEKXt2YXIgTT1tK3k7V1tjK0QqND4+Ml09TSxIKFQsTSkseSs9VC5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gRGwoYyxtKXt2YXIgeT1aZSgpO1dbYz4+Ml09eS5sZW5ndGg7dmFyIFQ9MDtyZXR1cm4geS5mb3JFYWNoKGZ1bmN0aW9uKEQpe1QrPUQubGVuZ3RoKzF9KSxXW20+PjJdPVQsMH1mdW5jdGlvbiBDbChjKXt6bChjKX1mdW5jdGlvbiBCbChjKXtyZXR1cm4gMH1mdW5jdGlvbiBNbChjLG0seSxULEQpe31mdW5jdGlvbiBPbChjLG0seSxUKXtmb3IodmFyIEQ9MCxNPTA7TTx5O00rKyl7Zm9yKHZhciBBPVdbbStNKjg+PjJdLFU9V1ttKyhNKjgrNCk+PjJdLEs9MDtLPFU7SysrKSR0LnByaW50Q2hhcihjLGxlW0ErS10pO0QrPVV9cmV0dXJuIFdbVD4+Ml09RCwwfWZ1bmN0aW9uIFVsKCl7aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXt2YXIgYz1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhjKSxjWzBdfX1lbHNlIHJldHVybiBmdW5jdGlvbigpe2RlKCJyYW5kb21EZXZpY2UiKX19ZnVuY3Rpb24gV3QoYyxtKXtXdC5yYW5kb21EZXZpY2V8fChXdC5yYW5kb21EZXZpY2U9VWwoKSk7Zm9yKHZhciB5PTA7eTxtO3krKylUZVtjK3k+PjBdPVd0LnJhbmRvbURldmljZSgpO3JldHVybiAwfXZhciBObD17YTpibCxlOnhsLGQ6X2wsYjp2bCxuOndsLGg6QWwsbDpJbCxtOlJsLHA6RmwsZjprbCxnOkRsLGo6Q2wsaTpCbCxrOk1sLGM6T2wsbzpXdH07eWwoKSx0Ll9fX3dhc21fY2FsbF9jdG9ycz1mdW5jdGlvbigpe3JldHVybih0Ll9fX3dhc21fY2FsbF9jdG9ycz10LmFzbS5yKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0PXQuYXNtLnMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQ9dC5hc20udCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dEhlaWdodD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dEhlaWdodD10LmFzbS51KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRXaWR0aD10LmFzbS52KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0Q2hhbm5lbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0Q2hhbm5lbENvdW50PXQuYXNtLncpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD10LmFzbS54KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dEhlaWdodD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRIZWlnaHQ9dC5hc20ueSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRXaWR0aD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRXaWR0aD10LmFzbS56KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9dC5hc20uQSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9sb2FkTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4odC5fbG9hZE1vZGVsPXQuYXNtLkIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fcnVuSW5mZXJlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX3J1bkluZmVyZW5jZT10LmFzbS5DKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2lzR1BVRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybih0Ll9pc0dQVUVuYWJsZWQ9dC5hc20uRCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgem89dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybih6bz10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVnQ7ZnVuY3Rpb24gTGwoYyl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitjKyIpIix0aGlzLnN0YXR1cz1jfUplPWZ1bmN0aW9uIGMoKXtWdHx8anIoKSxWdHx8KEplPWMpfTtmdW5jdGlvbiBqcihjKXtpZih3ZT4wfHwoYWwoKSx3ZT4wKSlyZXR1cm47ZnVuY3Rpb24gbSgpe1Z0fHwoVnQ9ITAsdC5jYWxsZWRSdW49ITAsIUYmJih1bCgpLG4odCksdC5vblJ1bnRpbWVJbml0aWFsaXplZCYmdC5vblJ1bnRpbWVJbml0aWFsaXplZCgpLGNsKCkpKX10LnNldFN0YXR1cz8odC5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0U3RhdHVzKCIiKX0sMSksbSgpfSwxKSk6bSgpfXQucnVuPWpyO2Z1bmN0aW9uIHpsKGMsbSl7R2woYyl9ZnVuY3Rpb24gR2woYyl7c2woKXx8KHQub25FeGl0JiZ0Lm9uRXhpdChjKSxGPSEwKSx1KGMsbmV3IExsKGMpKX1pZih0LnByZUluaXQpZm9yKHR5cGVvZiB0LnByZUluaXQ9PSJmdW5jdGlvbiImJih0LnByZUluaXQ9W3QucHJlSW5pdF0pO3QucHJlSW5pdC5sZW5ndGg+MDspdC5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIGpyKCksZS5yZWFkeX19KCk7Y2xhc3MgaXN7Y29uc3RydWN0b3IoKXtsKHRoaXMsInNlbGVjdGVkVEZMaXRlIik7bCh0aGlzLCJpc1NJTURTdXBwb3J0ZWQiLCExKTtsKHRoaXMsImlzVGhyZWFkc1N1cHBvcnRlZCIsITEpO2wodGhpcywiaW5wdXRXaWR0aCIsMCk7bCh0aGlzLCJpbnB1dEhlaWdodCIsMCk7bCh0aGlzLCJpbnB1dENoYW5uZWxDb3VudCIsMCk7bCh0aGlzLCJpbnB1dE1lbW9yeU9mZnNldCIsMCk7bCh0aGlzLCJvdXRwdXRXaWR0aCIsMCk7bCh0aGlzLCJvdXRwdXRIZWlnaHQiLDApO2wodGhpcywib3V0cHV0Q2hhbm5lbENvdW50IiwwKTtsKHRoaXMsIm91dHB1dE1lbW9yeU9mZnNldCIsMCl9fWNvbnN0IHNzPSJodHRwczovL2Qzb3Bxam1xenhmMDU3LmNsb3VkZnJvbnQubmV0L3ZvbmFnZS10ZW5zb3JmbG93LXdhc20vdGZsaXRlLXNpbWQtd2FzbS8xLjEuMy8iLGFzPSJodHRwczovL2Qzb3Bxam1xenhmMDU3LmNsb3VkZnJvbnQubmV0L21sL3NlbGZpZV9zZWdtZW50YXRpb24vNC4wLjAvIjthc3luYyBmdW5jdGlvbiB1cyhyPXNzLGU9YXMpe2xldCB0PW5ldyBpczt2YXIgbj1uZXcgUHJvbWlzZShmdW5jdGlvbihvLGkpe2FzeW5jIGZ1bmN0aW9uIHMoKXtyZXR1cm4gb3Moe2xvY2F0ZUZpbGU6ZnVuY3Rpb24oZil7cmV0dXJuIHIrZn19KX1hc3luYyBmdW5jdGlvbiBhKHUpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhmLGQpPT57Y29uc3QgcD11O2lmKHR5cGVvZiBwPiJ1IilyZXR1cm4gZCgiVEZMaXRlIGJhY2tlbmQgdW5hdmFpbGFibGU6IHdhc21TaW1kIik7Y29uc3QgZz0ic2VsZmllX3NlZ21lbnRhdGlvbl9sYW5kc2NhcGUiO2NvbnNvbGUubG9nKCJMb2FkaW5nIHRmbGl0ZSBtb2RlbDoiLGcpO2xldCBiPWUrYCR7Z30udGZsaXRlYDtjb25zb2xlLmxvZygiVEZMaXRlIG1vZGVsVXJsOiAiK2IpO3RyeXtjb25zdCB4PWF3YWl0KGF3YWl0IGZldGNoKGIpKS5hcnJheUJ1ZmZlcigpO2NvbnNvbGUubG9nKCJNb2RlbCBidWZmZXIgc2l6ZToiLHguYnl0ZUxlbmd0aCk7Y29uc3QgRT1wLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpO2NvbnNvbGUubG9nKCJNb2RlbCBidWZmZXIgbWVtb3J5IG9mZnNldDoiLEUpLGNvbnNvbGUubG9nKCJMb2FkaW5nIG1vZGVsIGJ1ZmZlci4uLiIpLHAuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh4KSxFKTtjb25zdCB2PXAuX2xvYWRNb2RlbCh4LmJ5dGVMZW5ndGgpO2lmKGNvbnNvbGUubG9nKCJMb2FkIG1vZGVsIHJlc3VsdDoiLHYpLHYhPT0wKXtkKCJDYW5ub3QgbG9hZCBtb2RlbCIpO3JldHVybn10LmlucHV0V2lkdGg9cC5fZ2V0SW5wdXRXaWR0aCgpLHQuaW5wdXRIZWlnaHQ9cC5fZ2V0SW5wdXRIZWlnaHQoKSx0LmlucHV0Q2hhbm5lbENvdW50PXAuX2dldElucHV0Q2hhbm5lbENvdW50KCksdC5pbnB1dE1lbW9yeU9mZnNldD1wLl9nZXRJbnB1dE1lbW9yeU9mZnNldCgpLGNvbnNvbGUubG9nKCJJbnB1dCBtZW1vcnkgb2Zmc2V0OiIsdC5pbnB1dE1lbW9yeU9mZnNldCksY29uc29sZS5sb2coIklucHV0IGhlaWdodDoiLHQuaW5wdXRIZWlnaHQpLGNvbnNvbGUubG9nKCJJbnB1dCB3aWR0aDoiLHQuaW5wdXRXaWR0aCksY29uc29sZS5sb2coIklucHV0IGNoYW5uZWxzOiIsdC5pbnB1dENoYW5uZWxDb3VudCksdC5vdXRwdXRNZW1vcnlPZmZzZXQ9cC5fZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0KCksdC5vdXRwdXRXaWR0aD1wLl9nZXRPdXRwdXRXaWR0aCgpLHQub3V0cHV0SGVpZ2h0PXAuX2dldE91dHB1dEhlaWdodCgpLHQub3V0cHV0Q2hhbm5lbENvdW50PXAuX2dldE91dHB1dENoYW5uZWxDb3VudCgpLGNvbnNvbGUubG9nKCJPdXRwdXQgbWVtb3J5IG9mZnNldDoiLHQub3V0cHV0TWVtb3J5T2Zmc2V0KSxjb25zb2xlLmxvZygiT3V0cHV0IGhlaWdodDoiLHQub3V0cHV0SGVpZ2h0KSxjb25zb2xlLmxvZygiT3V0cHV0IHdpZHRoOiIsdC5vdXRwdXRXaWR0aCksY29uc29sZS5sb2coIk91dHB1dCBjaGFubmVsczoiLHQub3V0cHV0Q2hhbm5lbENvdW50KSx0LnNlbGVjdGVkVEZMaXRlPXB9Y2F0Y2goaCl7ZChoKTtyZXR1cm59ZigpfSl9cygpLnRoZW4odT0+e2lmKHU9PT1udWxsKXRocm93IGNvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgbnVsbCIpLCJsb2FkVEZMaXRlIG51bGwiO2EodSkudGhlbihmPT57byh0KX0pLmNhdGNoKGY9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKSxpKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKX0pfSkuY2F0Y2godT0+e2NvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgZXJyb3I6Iix1KSxpKCJsb2FkVEZMaXRlIGVycm9yOiIrdSl9KX0pO3JldHVybiBufWNsYXNzIGNze2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJjYW52YXMiLG5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSk7bCh0aGlzLCJjb250ZXh0Iix0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIse3dpbGxSZWFkRnJlcXVlbnRseTohMH0pKTtsKHRoaXMsInBpeGVsQ291bnQiLDApO2wodGhpcywiaW5wdXRPZmZzZXQiLDApO2wodGhpcywib3V0cHV0T2Zmc2V0IiwwKTtsKHRoaXMsImluZm9zIik7bCh0aGlzLCJtYXNrIil9YXN5bmMgaW5pdChlLHQpe2F3YWl0IHRoaXMuaW5pdFdhc20oZSx0KSx0aGlzLmluZm9zJiYodGhpcy5jYW52YXMud2lkdGg9dGhpcy5pbmZvcy5pbnB1dFdpZHRoLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLmluZm9zLmlucHV0SGVpZ2h0LHRoaXMucGl4ZWxDb3VudD10aGlzLmluZm9zLmlucHV0V2lkdGgqdGhpcy5pbmZvcy5pbnB1dEhlaWdodCx0aGlzLm1hc2s9bmV3IEltYWdlRGF0YSh0aGlzLmluZm9zLmlucHV0V2lkdGgsdGhpcy5pbmZvcy5pbnB1dEhlaWdodCksdGhpcy5pbnB1dE9mZnNldD10aGlzLmluZm9zLmlucHV0TWVtb3J5T2Zmc2V0LzQsdGhpcy5vdXRwdXRPZmZzZXQ9dGhpcy5pbmZvcy5vdXRwdXRNZW1vcnlPZmZzZXQvNCl9YXN5bmMgaW5pdFdhc20oZSx0KXt0aGlzLmluZm9zPWF3YWl0IHVzKGUsdCl9Z2V0T3V0cHV0RGltZW5zaW9ucygpe3ZhciBlLHQsbixvO3JldHVybnt3aWR0aDoodD0oZT10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6ZS5vdXRwdXRXaWR0aCkhPW51bGw/dDowLGhlaWdodDoobz0obj10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6bi5vdXRwdXRIZWlnaHQpIT1udWxsP286MH19YXN5bmMgcHJvY2VzcyhlKXtpZighdGhpcy5tYXNrfHwhdGhpcy5pbmZvcylyZXR1cm47Y29uc3QgdD10aGlzLmluZm9zLmlucHV0V2lkdGgsbj10aGlzLmluZm9zLmlucHV0SGVpZ2h0O3RoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsZS53aWR0aCxlLmhlaWdodCwwLDAsdCxuKTtjb25zdCBvPXRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoMCwwLHQsbiksaT10aGlzLmluZm9zLnNlbGVjdGVkVEZMaXRlLkhFQVBGMzI7Zm9yKGxldCBzPTA7czx0aGlzLnBpeGVsQ291bnQ7cysrKXtjb25zdCBhPXRoaXMuaW5wdXRPZmZzZXQrcyozO2lbYV09by5kYXRhW3MqNF0vMjU1LGlbYSsxXT1vLmRhdGFbcyo0KzFdLzI1NSxpW2ErMl09by5kYXRhW3MqNCsyXS8yNTV9dGhpcy5pbmZvcy5zZWxlY3RlZFRGTGl0ZS5fcnVuSW5mZXJlbmNlKCk7Zm9yKGxldCBzPTA7czx0aGlzLnBpeGVsQ291bnQ7cysrKXtjb25zdCBhPXRoaXMuaW5mb3Muc2VsZWN0ZWRURkxpdGUuSEVBUEYzMlt0aGlzLm91dHB1dE9mZnNldCtzXTt0aGlzLm1hc2suZGF0YVtzKjRdPXRoaXMubWFzay5kYXRhW3MqNCszXT0yNTUqYX1yZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5tYXNrKX1pc0dwdVN1cHBvcnRlZCgpe3ZhciBlLHQsbjtyZXR1cm4obj0odD0oZT10aGlzLmluZm9zKT09bnVsbD92b2lkIDA6ZS5zZWxlY3RlZFRGTGl0ZSk9PW51bGw/dm9pZCAwOnQuX2lzR1BVRW5hYmxlZCgpKSE9bnVsbD9uOiExfX1mdW5jdGlvbiBmcygpe3JldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCkuZ2V0Q29udGV4dCgid2ViZ2wyIix7ZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDohMH0pP3tzdXBwb3J0ZWQ6ITB9OntzdXBwb3J0ZWQ6ITEsbWVzc2FnZToiWW91ciBoYXJkd2FyZSBkb2VzIG5vdCBwZXJmb3JtIGdvb2QgZW5vdWdoIHRvIHJ1biB0aGUgbGlicmFyeSBlZmZpY2llbnRseSJ9fWNsYXNzIG9ye2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJjYW52YXMiKTtsKHRoaXMsImNvbnRleHQiKTtjb25zdCBlPW5ldyBPZmZzY3JlZW5DYW52YXMoMCwwKSx0PWUuZ2V0Q29udGV4dCgiMmQiKTtpZighdCl0aHJvdyJGYWlsIHRvIHJldHJpZXZlIHdlYmdsMiBjb250ZXh0Ijt0aGlzLmNhbnZhcz1lLHRoaXMuY29udGV4dD10fXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe31lbmFibGVQb3N0UHJvY2Vzc2luZygpe31kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKXt9YXN5bmMgcHJvZmlsZVdlYmdsKGUpe3JldHVybltdfWFzeW5jIHJlbmRlcihlLHQpe3JldHVybiB0aGlzLmNhbnZhc31yZXNpemVDYW52YXMoZSl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09ZTt0aGlzLmNhbnZhcy53aWR0aD10LHRoaXMuY2FudmFzLmhlaWdodD1ufXJlbmRlclNpbGhvdWV0dGUoZSx0LG49Im5vbmUiKXtjb25zdHt3aWR0aDpvLGhlaWdodDppfT1lO3RoaXMuY29udGV4dC5zYXZlKCksdGhpcy5jb250ZXh0LmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0LDAsMCxvLGkpLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiIsdGhpcy5jb250ZXh0LmZpbHRlcj1uLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoZSwwLDAsbyxpLDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpLHRoaXMuY29udGV4dC5yZXN0b3JlKCl9fWNsYXNzIGxzIGV4dGVuZHMgb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnJhZGl1cz1lfWFzeW5jIHJlbmRlcihlLHQpe3JldHVybiBzdXBlci5yZXNpemVDYW52YXMoZSksdGhpcy5yZW5kZXJTaWxob3VldHRlKGUsdCksdGhpcy5jb250ZXh0LnNhdmUoKSx0aGlzLmNvbnRleHQuZmlsdGVyPWBibHVyKCR7dGhpcy5yYWRpdXN9cHgpYCx0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHRoaXMuY29udGV4dC5yZXN0b3JlKCksc3VwZXIucmVuZGVyKGUsdCl9fWNsYXNzIGRzIGV4dGVuZHMgb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnJhZGl1cz1lfWFzeW5jIHJlbmRlcihlLHQpe3JldHVybiBzdXBlci5yZXNpemVDYW52YXMoZSksdGhpcy5yZW5kZXJTaWxob3VldHRlKGUsdCxgYmx1cigke3RoaXMucmFkaXVzfXB4KWApLHRoaXMuY29udGV4dC5zYXZlKCksdGhpcy5jb250ZXh0LmZpbHRlcj0ibm9uZSIsdGhpcy5jb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5jb250ZXh0LmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLmNvbnRleHQucmVzdG9yZSgpLHN1cGVyLnJlbmRlcihlLHQpfX1jbGFzcyBocyBleHRlbmRzIG9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtsKHRoaXMsImJhY2tncm91bmRJbWFnZSIpfXNldEJhY2tncm91bmRJbWFnZSh0KXt0aGlzLmJhY2tncm91bmRJbWFnZT10fWFzeW5jIHJlbmRlcih0LG4pe3JldHVybiBzdXBlci5yZXNpemVDYW52YXModCksdGhpcy5yZW5kZXJTaWxob3VldHRlKHQsbiksdGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJih0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC5maWx0ZXI9Im5vbmUiLHRoaXMuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLHRoaXMuY29udGV4dC5kcmF3SW1hZ2UodGhpcy5iYWNrZ3JvdW5kSW1hZ2UsMCwwLHRoaXMuYmFja2dyb3VuZEltYWdlLndpZHRoLHRoaXMuYmFja2dyb3VuZEltYWdlLmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKSksc3VwZXIucmVuZGVyKHQsbil9fS8qIEBsaWNlbnNlIHR3Z2wuanMgNS41LjEgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBpcj01MTIwLFdlPTUxMjEsc3I9NTEyMixhcj01MTIzLHVyPTUxMjQsY3I9NTEyNSxmcj01MTI2LG1zPTMyODE5LHBzPTMyODIwLGdzPTMzNjM1LHlzPTUxMzEsYnM9MzM2NDAseHM9MzU4OTksX3M9MzU5MDIsdnM9MzYyNjksRXM9MzQwNDIsZG49e307e2NvbnN0IHI9ZG47cltpcl09SW50OEFycmF5LHJbV2VdPVVpbnQ4QXJyYXkscltzcl09SW50MTZBcnJheSxyW2FyXT1VaW50MTZBcnJheSxyW3VyXT1JbnQzMkFycmF5LHJbY3JdPVVpbnQzMkFycmF5LHJbZnJdPUZsb2F0MzJBcnJheSxyW21zXT1VaW50MTZBcnJheSxyW3BzXT1VaW50MTZBcnJheSxyW2dzXT1VaW50MTZBcnJheSxyW3lzXT1VaW50MTZBcnJheSxyW2JzXT1VaW50MzJBcnJheSxyW3hzXT1VaW50MzJBcnJheSxyW19zXT1VaW50MzJBcnJheSxyW3ZzXT1VaW50MzJBcnJheSxyW0VzXT1VaW50MzJBcnJheX1mdW5jdGlvbiBscihyKXtpZihyIGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBpcjtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheXx8ciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBXZTtpZihyIGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gc3I7aWYociBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBhcjtpZihyIGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gdXI7aWYociBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBjcjtpZihyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXJldHVybiBmcjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBobihyKXtpZihyPT09SW50OEFycmF5KXJldHVybiBpcjtpZihyPT09VWludDhBcnJheXx8cj09PVVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBXZTtpZihyPT09SW50MTZBcnJheSlyZXR1cm4gc3I7aWYocj09PVVpbnQxNkFycmF5KXJldHVybiBhcjtpZihyPT09SW50MzJBcnJheSlyZXR1cm4gdXI7aWYocj09PVVpbnQzMkFycmF5KXJldHVybiBjcjtpZihyPT09RmxvYXQzMkFycmF5KXJldHVybiBmcjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBtbihyKXtjb25zdCBlPWRuW3JdO2lmKCFlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBnbCB0eXBlIik7cmV0dXJuIGV9Y29uc3QgYnQ9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5idWZmZXImJihlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTtmdW5jdGlvbiBwbiguLi5yKXtjb25zb2xlLmVycm9yKC4uLnIpfWNvbnN0IGduPW5ldyBNYXA7ZnVuY3Rpb24geHQocixlKXtpZighcnx8dHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiExO2xldCB0PWduLmdldChlKTt0fHwodD1uZXcgV2Vha01hcCxnbi5zZXQoZSx0KSk7bGV0IG49dC5nZXQocik7aWYobj09PXZvaWQgMCl7Y29uc3Qgbz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocik7bj1vLnN1YnN0cmluZyg4LG8ubGVuZ3RoLTEpPT09ZSx0LnNldChyLG4pfXJldHVybiBufWZ1bmN0aW9uIFRzKHIsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTEJ1ZmZlcjwidSImJnh0KGUsIldlYkdMQnVmZmVyIil9ZnVuY3Rpb24gd3MocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMUmVuZGVyYnVmZmVyPCJ1IiYmeHQoZSwiV2ViR0xSZW5kZXJidWZmZXIiKX1mdW5jdGlvbiBkcihyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlPCJ1IiYmeHQoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gQXMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlcjwidSImJnh0KGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IHluPTM1MDQ0LHllPTM0OTYyLElzPTM0OTYzLFNzPTM0NjYwLFJzPTUxMjAsRnM9NTEyMSxQcz01MTIyLGtzPTUxMjMsRHM9NTEyNCxDcz01MTI1LGJuPTUxMjYseG49e2F0dHJpYlByZWZpeDoiIn07ZnVuY3Rpb24gQnMocixlLHQsbixvKXtyLmJpbmRCdWZmZXIoZSx0KSxyLmJ1ZmZlckRhdGEoZSxuLG98fHluKX1mdW5jdGlvbiBfbihyLGUsdCxuKXtpZihUcyhyLGUpKXJldHVybiBlO3Q9dHx8eWU7Y29uc3Qgbz1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiBCcyhyLHQsbyxlLG4pLG99ZnVuY3Rpb24gdm4ocil7cmV0dXJuIHI9PT0iaW5kaWNlcyJ9ZnVuY3Rpb24gTXMocil7cmV0dXJuIHI9PT1JbnQ4QXJyYXl8fHI9PT1VaW50OEFycmF5fWZ1bmN0aW9uIE9zKHIpe3JldHVybiByLmxlbmd0aD9yOnIuZGF0YX1jb25zdCBVcz0vY29vcmR8dGV4dHVyZS9pLE5zPS9jb2xvcnxjb2xvdXIvaTtmdW5jdGlvbiBMcyhyLGUpe2xldCB0O2lmKFVzLnRlc3Qocik/dD0yOk5zLnRlc3Qocik/dD00OnQ9MyxlJXQ+MCl0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZ3Vlc3MgbnVtQ29tcG9uZW50cyBmb3IgYXR0cmlidXRlICcke3J9Jy4gVHJpZWQgJHt0fSBidXQgJHtlfSB2YWx1ZXMgaXMgbm90IGV2ZW5seSBkaXZpc2libGUgYnkgJHt0fS4gWW91IHNob3VsZCBzcGVjaWZ5IGl0LmApO3JldHVybiB0fWZ1bmN0aW9uIHpzKHIsZSx0KXtyZXR1cm4gci5udW1Db21wb25lbnRzfHxyLnNpemV8fExzKGUsdHx8T3MocikubGVuZ3RoKX1mdW5jdGlvbiBFbihyLGUpe2lmKGJ0KHIpKXJldHVybiByO2lmKGJ0KHIuZGF0YSkpcmV0dXJuIHIuZGF0YTtBcnJheS5pc0FycmF5KHIpJiYocj17ZGF0YTpyfSk7bGV0IHQ9ci50eXBlP2hyKHIudHlwZSk6dm9pZCAwO3JldHVybiB0fHwodm4oZSk/dD1VaW50MTZBcnJheTp0PUZsb2F0MzJBcnJheSksbmV3IHQoci5kYXRhKX1mdW5jdGlvbiBHcyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP3I6cj9obihyKTpibn1mdW5jdGlvbiBocihyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP21uKHIpOnJ8fEZsb2F0MzJBcnJheX1mdW5jdGlvbiAkcyhyLGUpe3JldHVybntidWZmZXI6ZS5idWZmZXIsbnVtVmFsdWVzOjIqMyo0LHR5cGU6R3MoZS50eXBlKSxhcnJheVR5cGU6aHIoZS50eXBlKX19ZnVuY3Rpb24gV3MocixlKXtjb25zdCB0PWUuZGF0YXx8ZSxuPWhyKGUudHlwZSksbz10Km4uQllURVNfUEVSX0VMRU1FTlQsaT1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiByLmJpbmRCdWZmZXIoeWUsaSksci5idWZmZXJEYXRhKHllLG8sZS5kcmF3VHlwZXx8eW4pLHtidWZmZXI6aSxudW1WYWx1ZXM6dCx0eXBlOmhuKG4pLGFycmF5VHlwZTpufX1mdW5jdGlvbiBWcyhyLGUsdCl7Y29uc3Qgbj1FbihlLHQpO3JldHVybnthcnJheVR5cGU6bi5jb25zdHJ1Y3RvcixidWZmZXI6X24ocixuLHZvaWQgMCxlLmRyYXdUeXBlKSx0eXBlOmxyKG4pLG51bVZhbHVlczowfX1mdW5jdGlvbiBIcyhyLGUpe2NvbnN0IHQ9e307cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24obil7aWYoIXZuKG4pKXtjb25zdCBvPWVbbl0saT1vLmF0dHJpYnx8by5uYW1lfHxvLmF0dHJpYk5hbWV8fHhuLmF0dHJpYlByZWZpeCtuO2lmKG8udmFsdWUpe2lmKCFBcnJheS5pc0FycmF5KG8udmFsdWUpJiYhYnQoby52YWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJhcnJheS52YWx1ZSBpcyBub3QgYXJyYXkgb3IgdHlwZWRhcnJheSIpO3RbaV09e3ZhbHVlOm8udmFsdWV9fWVsc2V7bGV0IHM7by5idWZmZXImJm8uYnVmZmVyIGluc3RhbmNlb2YgV2ViR0xCdWZmZXI/cz0kczp0eXBlb2Ygbz09Im51bWJlciJ8fHR5cGVvZiBvLmRhdGE9PSJudW1iZXIiP3M9V3M6cz1Wcztjb25zdHtidWZmZXI6YSx0eXBlOnUsbnVtVmFsdWVzOmYsYXJyYXlUeXBlOmR9PXMocixvLG4pLHA9by5ub3JtYWxpemUhPT12b2lkIDA/by5ub3JtYWxpemU6TXMoZCksZz16cyhvLG4sZik7dFtpXT17YnVmZmVyOmEsbnVtQ29tcG9uZW50czpnLHR5cGU6dSxub3JtYWxpemU6cCxzdHJpZGU6by5zdHJpZGV8fDAsb2Zmc2V0Om8ub2Zmc2V0fHwwLGRpdmlzb3I6by5kaXZpc29yPT09dm9pZCAwP3ZvaWQgMDpvLmRpdmlzb3IsZHJhd1R5cGU6by5kcmF3VHlwZX19fX0pLHIuYmluZEJ1ZmZlcih5ZSxudWxsKSx0fWZ1bmN0aW9uIGpzKHIsZSl7cmV0dXJuIGU9PT1Sc3x8ZT09PUZzPzE6ZT09PVBzfHxlPT09a3M/MjplPT09RHN8fGU9PT1Dc3x8ZT09PWJuPzQ6MH1jb25zdCBtcj1bInBvc2l0aW9uIiwicG9zaXRpb25zIiwiYV9wb3NpdGlvbiJdO2Z1bmN0aW9uIFlzKHIsZSl7bGV0IHQsbjtmb3Iobj0wO248bXIubGVuZ3RoJiYodD1tcltuXSwhKHQgaW4gZXx8KHQ9eG4uYXR0cmliUHJlZml4K3QsdCBpbiBlKSkpOysrbik7bj09PW1yLmxlbmd0aCYmKHQ9T2JqZWN0LmtleXMoZSlbMF0pO2NvbnN0IG89ZVt0XTtpZighby5idWZmZXIpcmV0dXJuIDE7ci5iaW5kQnVmZmVyKHllLG8uYnVmZmVyKTtjb25zdCBpPXIuZ2V0QnVmZmVyUGFyYW1ldGVyKHllLFNzKTtyLmJpbmRCdWZmZXIoeWUsbnVsbCk7Y29uc3Qgcz1qcyhyLG8udHlwZSksYT1pL3MsdT1vLm51bUNvbXBvbmVudHN8fG8uc2l6ZSxmPWEvdTtpZihmJTEhPT0wKXRocm93IG5ldyBFcnJvcihgbnVtQ29tcG9uZW50cyAke3V9IG5vdCBjb3JyZWN0IGZvciBsZW5ndGggJHtsZW5ndGh9YCk7cmV0dXJuIGZ9ZnVuY3Rpb24gWHMocixlLHQpe2NvbnN0IG49SHMocixlKSxvPU9iamVjdC5hc3NpZ24oe30sdHx8e30pO28uYXR0cmlicz1PYmplY3QuYXNzaWduKHt9LHQ/dC5hdHRyaWJzOnt9LG4pO2NvbnN0IGk9ZS5pbmRpY2VzO2lmKGkpe2NvbnN0IHM9RW4oaSwiaW5kaWNlcyIpO28uaW5kaWNlcz1fbihyLHMsSXMpLG8ubnVtRWxlbWVudHM9cy5sZW5ndGgsby5lbGVtZW50VHlwZT1scihzKX1lbHNlIG8ubnVtRWxlbWVudHN8fChvLm51bUVsZW1lbnRzPVlzKHIsby5hdHRyaWJzKSk7cmV0dXJuIG99ZnVuY3Rpb24gVmUocil7cmV0dXJuISFyLnRleFN0b3JhZ2UyRH1jb25zdCBUbj1mdW5jdGlvbigpe2NvbnN0IHI9e30sZT17fTtmdW5jdGlvbiB0KG4pe2NvbnN0IG89bi5jb25zdHJ1Y3Rvci5uYW1lO2lmKCFyW29dKXtmb3IoY29uc3QgaSBpbiBuKWlmKHR5cGVvZiBuW2ldPT0ibnVtYmVyIil7Y29uc3Qgcz1lW25baV1dO2VbbltpXV09cz9gJHtzfSB8ICR7aX1gOml9cltvXT0hMH19cmV0dXJuIGZ1bmN0aW9uKG8saSl7cmV0dXJuIHQobyksZVtpXXx8KHR5cGVvZiBpPT0ibnVtYmVyIj9gMHgke2kudG9TdHJpbmcoMTYpfWA6aSl9fSgpLGllPXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sSGU9YnQsd249ZnVuY3Rpb24oKXtsZXQgcjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcj1yfHwodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHJ9fSgpLEFuPTY0MDYscT02NDA3LFI9NjQwOCxJbj02NDA5LFNuPTY0MTAsamU9NjQwMixSbj0zNDA0MSxfdD0zMzA3MSxRcz05NzI4LHFzPTk3Mjksc2U9MzU1MyxhZT0zNDA2NyxiZT0zMjg3OSx4ZT0zNTg2Nixwcj0zNDA2OSxLcz0zNDA3MCxKcz0zNDA3MSxacz0zNDA3MixlYT0zNDA3Myx0YT0zNDA3NCxncj0xMDI0MSx5cj0xMDI0MCx2dD0xMDI0MixFdD0xMDI0MyxGbj0zMjg4MixyYT0zMzA4MixuYT0zMzA4MyxvYT0zMzA4NCxpYT0zMzA4NSxzYT0zNDg5MixhYT0zNDg5Myxicj0zMzE3LFBuPTMzMTQsa249MzI4NzgsRG49MzMxNixDbj0zMzE1LEJuPTMyODc3LHVhPTM3NDQzLGNhPTM3NDQxLGZhPTM3NDQwLGxhPTMzMzIxLGRhPTM2NzU2LGhhPTMzMzI1LG1hPTMzMzI2LHBhPTMzMzMwLGdhPTMzMzI5LHlhPTMzMzM4LGJhPTMzMzM3LHhhPTMzMzQwLF9hPTMzMzM5LHZhPTMzMzIzLEVhPTM2NzU3LFRhPTMzMzI3LHdhPTMzMzI4LEFhPTMzMzM2LElhPTMzMzM1LFNhPTMzMzMyLFJhPTMzMzMxLEZhPTMzMzM0LFBhPTMzMzMzLGthPTMyODQ5LERhPTM1OTA1LENhPTM2MTk0LEJhPTM2NzU4LE1hPTM1ODk4LE9hPTM1OTAxLFVhPTM0ODQzLE5hPTM0ODM3LExhPTM2MjIxLHphPTM2MjM5LEdhPTM2MjE1LCRhPTM2MjMzLFdhPTM2MjA5LFZhPTM2MjI3LEhhPTMyODU2LGphPTM1OTA3LFlhPTM2NzU5LFhhPTMyODU1LFFhPTMyODU0LHFhPTMyODU3LEthPTM0ODQyLEphPTM0ODM2LFphPTM2MjIwLGV1PTM2MjM4LHR1PTM2OTc1LHJ1PTM2MjE0LG51PTM2MjMyLG91PTM2MjI2LGl1PTM2MjA4LHN1PTMzMTg5LGF1PTMzMTkwLHV1PTM2MDEyLGN1PTM2MDEzLGZ1PTM1MDU2LHVlPTUxMjAsUz01MTIxLFR0PTUxMjIsa2U9NTEyMyx3dD01MTI0LF9lPTUxMjUsTz01MTI2LE1uPTMyODE5LE9uPTMyODIwLFVuPTMzNjM1LGo9NTEzMSxZZT0zNjE5Myx4cj0zMzY0MCxsdT0zNTg5OSxkdT0zNTkwMixodT0zNjI2OSxtdT0zNDA0MixBdD0zMzMxOSxEZT0zMzMyMCxJdD02NDAzLENlPTM2MjQ0LEJlPTM2MjQ4LHZlPTM2MjQ5O2xldCBfcjtmdW5jdGlvbiBTdChyKXtpZighX3Ipe2NvbnN0IGU9e307ZVtBbl09e3RleHR1cmVGb3JtYXQ6QW4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbUyxqLFllLE9dfSxlW0luXT17dGV4dHVyZUZvcm1hdDpJbixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxLDIsMiw0XSx0eXBlOltTLGosWWUsT119LGVbU25dPXt0ZXh0dXJlRm9ybWF0OlNuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzIsNCw0LDhdLHR5cGU6W1MsaixZZSxPXX0sZVtxXT17dGV4dHVyZUZvcm1hdDpxLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzMsNiw2LDEyLDJdLHR5cGU6W1MsaixZZSxPLFVuXX0sZVtSXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsOCw4LDE2LDIsMl0sdHlwZTpbUyxqLFllLE8sTW4sT25dfSxlW2plXT17dGV4dHVyZUZvcm1hdDpqZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyLDRdLHR5cGU6W19lLGtlXX0sZVtsYV09e3RleHR1cmVGb3JtYXQ6SXQsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbZGFdPXt0ZXh0dXJlRm9ybWF0Okl0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3VlXX0sZVtoYV09e3RleHR1cmVGb3JtYXQ6SXQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltPLGpdfSxlW21hXT17dGV4dHVyZUZvcm1hdDpJdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltPXX0sZVtwYV09e3RleHR1cmVGb3JtYXQ6Q2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbU119LGVbZ2FdPXt0ZXh0dXJlRm9ybWF0OkNlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W3VlXX0sZVtTYV09e3RleHR1cmVGb3JtYXQ6Q2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpba2VdfSxlW1JhXT17dGV4dHVyZUZvcm1hdDpDZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltUdF19LGVbRmFdPXt0ZXh0dXJlRm9ybWF0OkNlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W19lXX0sZVtQYV09e3RleHR1cmVGb3JtYXQ6Q2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbd3RdfSxlW3ZhXT17dGV4dHVyZUZvcm1hdDpBdCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtFYV09e3RleHR1cmVGb3JtYXQ6QXQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbdWVdfSxlW1RhXT17dGV4dHVyZUZvcm1hdDpBdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols4LDRdLHR5cGU6W08sal19LGVbd2FdPXt0ZXh0dXJlRm9ybWF0OkF0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W09dfSxlW0FhXT17dGV4dHVyZUZvcm1hdDpEZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltTXX0sZVtJYV09e3RleHR1cmVGb3JtYXQ6RGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbdWVdfSxlW3lhXT17dGV4dHVyZUZvcm1hdDpEZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltrZV19LGVbYmFdPXt0ZXh0dXJlRm9ybWF0OkRlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W1R0XX0sZVt4YV09e3RleHR1cmVGb3JtYXQ6RGUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbX2VdfSxlW19hXT17dGV4dHVyZUZvcm1hdDpEZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOlt3dF19LGVba2FdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbRGFdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbQ2FdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltTLFVuXX0sZVtCYV09e3RleHR1cmVGb3JtYXQ6cSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOlt1ZV19LGVbTWFdPXt0ZXh0dXJlRm9ybWF0OnEsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltPLGosbHVdfSxlW09hXT17dGV4dHVyZUZvcm1hdDpxLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDYsNF0sdHlwZTpbTyxqLGR1XX0sZVtVYV09e3RleHR1cmVGb3JtYXQ6cSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2XSx0eXBlOltPLGpdfSxlW05hXT17dGV4dHVyZUZvcm1hdDpxLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltPXX0sZVtMYV09e3RleHR1cmVGb3JtYXQ6QmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbU119LGVbemFdPXt0ZXh0dXJlRm9ybWF0OkJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzNdLHR5cGU6W3VlXX0sZVtHYV09e3RleHR1cmVGb3JtYXQ6QmUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpba2VdfSxlWyRhXT17dGV4dHVyZUZvcm1hdDpCZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols2XSx0eXBlOltUdF19LGVbV2FdPXt0ZXh0dXJlRm9ybWF0OkJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltfZV19LGVbVmFdPXt0ZXh0dXJlRm9ybWF0OkJlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlt3dF19LGVbSGFdPXt0ZXh0dXJlRm9ybWF0OlIsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbamFdPXt0ZXh0dXJlRm9ybWF0OlIsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbWWFdPXt0ZXh0dXJlRm9ybWF0OlIsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbdWVdfSxlW1hhXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltTLE9uLHhyXX0sZVtRYV09e3RleHR1cmVGb3JtYXQ6Uixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W1MsTW5dfSxlW3FhXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hyXX0sZVtLYV09e3RleHR1cmVGb3JtYXQ6Uixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltPLGpdfSxlW0phXT17dGV4dHVyZUZvcm1hdDpSLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltPXX0sZVtaYV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbU119LGVbZXVdPXt0ZXh0dXJlRm9ybWF0OnZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3VlXX0sZVt0dV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbeHJdfSxlW3J1XT17dGV4dHVyZUZvcm1hdDp2ZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltrZV19LGVbbnVdPXt0ZXh0dXJlRm9ybWF0OnZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W1R0XX0sZVtvdV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W3d0XX0sZVtpdV09e3RleHR1cmVGb3JtYXQ6dmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W19lXX0sZVtzdV09e3RleHR1cmVGb3JtYXQ6amUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltrZSxfZV19LGVbYXVdPXt0ZXh0dXJlRm9ybWF0OmplLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W19lXX0sZVt1dV09e3RleHR1cmVGb3JtYXQ6amUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbT119LGVbZnVdPXt0ZXh0dXJlRm9ybWF0OlJuLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W211XX0sZVtjdV09e3RleHR1cmVGb3JtYXQ6Um4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbaHVdfSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2NvbnN0IG49ZVt0XTtuLmJ5dGVzUGVyRWxlbWVudE1hcD17fSxuLmJ5dGVzUGVyRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKG8saSl7Y29uc3Qgcz1uLnR5cGVbaV07bi5ieXRlc1BlckVsZW1lbnRNYXBbc109b30pfSksX3I9ZX1yZXR1cm4gX3Jbcl19ZnVuY3Rpb24gcHUocixlKXtjb25zdCB0PVN0KHIpO2lmKCF0KXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0Ijtjb25zdCBuPXQuYnl0ZXNQZXJFbGVtZW50TWFwW2VdO2lmKG49PT12b2lkIDApdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBufWZ1bmN0aW9uIFhlKHIpe2NvbnN0IGU9U3Qocik7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybntmb3JtYXQ6ZS50ZXh0dXJlRm9ybWF0LHR5cGU6ZS50eXBlWzBdfX1mdW5jdGlvbiBObihyKXtyZXR1cm4ociZyLTEpPT09MH1mdW5jdGlvbiBndShyLGUsdCxuKXtpZighVmUocikpcmV0dXJuIE5uKGUpJiZObih0KTtjb25zdCBvPVN0KG4pO2lmKCFvKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gby5jb2xvclJlbmRlcmFibGUmJm8udGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24geXUocil7Y29uc3QgZT1TdChyKTtpZighZSl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIGUudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gYnUocixlLHQpe3JldHVybiBIZShlKT9scihlKTp0fHxTfWZ1bmN0aW9uIFJ0KHIsZSx0LG4sbyl7aWYobyUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBkaW1lbnNpb25zIjtpZighdCYmIW4pe2NvbnN0IGk9TWF0aC5zcXJ0KG8vKGU9PT1hZT82OjEpKTtpJTE9PT0wPyh0PWksbj1pKToodD1vLG49MSl9ZWxzZSBpZihuKXtpZighdCYmKHQ9by9uLHQlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPW8vdCxuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIE1lKHIsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmci5waXhlbFN0b3JlaSh1YSxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnIucGl4ZWxTdG9yZWkoY2EsZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZyLnBpeGVsU3RvcmVpKGZhLGUuZmxpcFkpfWZ1bmN0aW9uIExuKHIpe3IucGl4ZWxTdG9yZWkoYnIsNCksVmUocikmJihyLnBpeGVsU3RvcmVpKFBuLDApLHIucGl4ZWxTdG9yZWkoa24sMCksci5waXhlbFN0b3JlaShEbiwwKSxyLnBpeGVsU3RvcmVpKENuLDApLHIucGl4ZWxTdG9yZWkoQm4sMCkpfWZ1bmN0aW9uIHh1KHIsZSx0LG4pe24ubWluTWFnJiYodC5jYWxsKHIsZSxncixuLm1pbk1hZyksdC5jYWxsKHIsZSx5cixuLm1pbk1hZykpLG4ubWluJiZ0LmNhbGwocixlLGdyLG4ubWluKSxuLm1hZyYmdC5jYWxsKHIsZSx5cixuLm1hZyksbi53cmFwJiYodC5jYWxsKHIsZSx2dCxuLndyYXApLHQuY2FsbChyLGUsRXQsbi53cmFwKSwoZT09PWJlfHxBcyhyLGUpKSYmdC5jYWxsKHIsZSxGbixuLndyYXApKSxuLndyYXBSJiZ0LmNhbGwocixlLEZuLG4ud3JhcFIpLG4ud3JhcFMmJnQuY2FsbChyLGUsdnQsbi53cmFwUyksbi53cmFwVCYmdC5jYWxsKHIsZSxFdCxuLndyYXBUKSxuLm1pbkxvZCE9PXZvaWQgMCYmdC5jYWxsKHIsZSxyYSxuLm1pbkxvZCksbi5tYXhMb2QhPT12b2lkIDAmJnQuY2FsbChyLGUsbmEsbi5tYXhMb2QpLG4uYmFzZUxldmVsIT09dm9pZCAwJiZ0LmNhbGwocixlLG9hLG4uYmFzZUxldmVsKSxuLm1heExldmVsIT09dm9pZCAwJiZ0LmNhbGwocixlLGlhLG4ubWF4TGV2ZWwpLG4uY29tcGFyZUZ1bmMhPT12b2lkIDAmJnQuY2FsbChyLGUsYWEsbi5jb21wYXJlRnVuYyksbi5jb21wYXJlTW9kZSE9PXZvaWQgMCYmdC5jYWxsKHIsZSxzYSxuLmNvbXBhcmVNb2RlKX1mdW5jdGlvbiB6bihyLGUsdCl7Y29uc3Qgbj10LnRhcmdldHx8c2U7ci5iaW5kVGV4dHVyZShuLGUpLHh1KHIsbixyLnRleFBhcmFtZXRlcmksdCl9ZnVuY3Rpb24gX3Uocil7cmV0dXJuIHI9cnx8aWUudGV4dHVyZUNvbG9yLEhlKHIpP3I6bmV3IFVpbnQ4QXJyYXkoW3JbMF0qMjU1LHJbMV0qMjU1LHJbMl0qMjU1LHJbM10qMjU1XSl9ZnVuY3Rpb24gdnIocixlLHQsbixvLGkpe3Q9dHx8aWUudGV4dHVyZU9wdGlvbnMsaT1pfHxSO2NvbnN0IHM9dC50YXJnZXR8fHNlO2lmKG49bnx8dC53aWR0aCxvPW98fHQuaGVpZ2h0LHIuYmluZFRleHR1cmUocyxlKSxndShyLG4sbyxpKSlyLmdlbmVyYXRlTWlwbWFwKHMpO2Vsc2V7Y29uc3QgYT15dShpKT9xczpRcztyLnRleFBhcmFtZXRlcmkocyxncixhKSxyLnRleFBhcmFtZXRlcmkocyx5cixhKSxyLnRleFBhcmFtZXRlcmkocyx2dCxfdCksci50ZXhQYXJhbWV0ZXJpKHMsRXQsX3QpfX1mdW5jdGlvbiBRZShyKXtyZXR1cm4gci5hdXRvPT09ITB8fHIuYXV0bz09PXZvaWQgMCYmci5sZXZlbD09PXZvaWQgMH1mdW5jdGlvbiBFcihyLGUpe3JldHVybiBlPWV8fHt9LGUuY3ViZUZhY2VPcmRlcnx8W3ByLEtzLEpzLFpzLGVhLHRhXX1mdW5jdGlvbiBUcihyLGUpe2NvbnN0IG49RXIocixlKS5tYXAoZnVuY3Rpb24obyxpKXtyZXR1cm57ZmFjZTpvLG5keDppfX0pO3JldHVybiBuLnNvcnQoZnVuY3Rpb24obyxpKXtyZXR1cm4gby5mYWNlLWkuZmFjZX0pLG59ZnVuY3Rpb24gR24ocixlLHQsbil7bj1ufHxpZS50ZXh0dXJlT3B0aW9ucztjb25zdCBvPW4udGFyZ2V0fHxzZSxpPW4ubGV2ZWx8fDA7bGV0IHM9dC53aWR0aCxhPXQuaGVpZ2h0O2NvbnN0IHU9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fFIsZj1YZSh1KSxkPW4uZm9ybWF0fHxmLmZvcm1hdCxwPW4udHlwZXx8Zi50eXBlO2lmKE1lKHIsbiksci5iaW5kVGV4dHVyZShvLGUpLG89PT1hZSl7Y29uc3QgZz10LndpZHRoLGI9dC5oZWlnaHQ7bGV0IGgseDtpZihnLzY9PT1iKWg9Yix4PVswLDAsMSwwLDIsMCwzLDAsNCwwLDUsMF07ZWxzZSBpZihiLzY9PT1nKWg9Zyx4PVswLDAsMCwxLDAsMiwwLDMsMCw0LDAsNV07ZWxzZSBpZihnLzM9PT1iLzIpaD1nLzMseD1bMCwwLDEsMCwyLDAsMCwxLDEsMSwyLDFdO2Vsc2UgaWYoZy8yPT09Yi8zKWg9Zy8yLHg9WzAsMCwxLDAsMCwxLDEsMSwwLDIsMSwyXTtlbHNlIHRocm93ImNhbid0IGZpZ3VyZSBvdXQgY3ViZSBtYXAgZnJvbSBlbGVtZW50OiAiKyh0LnNyYz90LnNyYzp0Lm5vZGVOYW1lKTtjb25zdCBFPXduKCk7RT8oRS5jYW52YXMud2lkdGg9aCxFLmNhbnZhcy5oZWlnaHQ9aCxzPWgsYT1oLFRyKHIsbikuZm9yRWFjaChmdW5jdGlvbih2KXtjb25zdCBGPXhbdi5uZHgqMiswXSpoLGs9eFt2Lm5keCoyKzFdKmg7RS5kcmF3SW1hZ2UodCxGLGssaCxoLDAsMCxoLGgpLHIudGV4SW1hZ2UyRCh2LmZhY2UsaSx1LGQscCxFLmNhbnZhcyl9KSxFLmNhbnZhcy53aWR0aD0xLEUuY2FudmFzLmhlaWdodD0xKTp0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXA8InUiJiYocz1oLGE9aCxUcihyLG4pLmZvckVhY2goZnVuY3Rpb24odil7Y29uc3QgRj14W3YubmR4KjIrMF0qaCxrPXhbdi5uZHgqMisxXSpoO3IudGV4SW1hZ2UyRCh2LmZhY2UsaSx1LGgsaCwwLGQscCxudWxsKSxjcmVhdGVJbWFnZUJpdG1hcCh0LEYsayxoLGgse3ByZW11bHRpcGx5QWxwaGE6Im5vbmUiLGNvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pLnRoZW4oZnVuY3Rpb24oRyl7TWUocixuKSxyLmJpbmRUZXh0dXJlKG8sZSksci50ZXhJbWFnZTJEKHYuZmFjZSxpLHUsZCxwLEcpLFFlKG4pJiZ2cihyLGUsbixzLGEsdSl9KX0pKX1lbHNlIGlmKG89PT1iZXx8bz09PXhlKXtjb25zdCBnPU1hdGgubWluKHQud2lkdGgsdC5oZWlnaHQpLGI9TWF0aC5tYXgodC53aWR0aCx0LmhlaWdodCksaD1iL2c7aWYoaCUxIT09MCl0aHJvdyJjYW4gbm90IGNvbXB1dGUgM0QgZGltZW5zaW9ucyBvZiBlbGVtZW50Ijtjb25zdCB4PXQud2lkdGg9PT1iPzE6MCxFPXQuaGVpZ2h0PT09Yj8xOjA7ci5waXhlbFN0b3JlaShiciwxKSxyLnBpeGVsU3RvcmVpKFBuLHQud2lkdGgpLHIucGl4ZWxTdG9yZWkoa24sMCksci5waXhlbFN0b3JlaShCbiwwKSxyLnRleEltYWdlM0QobyxpLHUsZyxnLGcsMCxkLHAsbnVsbCk7Zm9yKGxldCB2PTA7djxoOysrdil7Y29uc3QgRj12KmcqeCxrPXYqZypFO3IucGl4ZWxTdG9yZWkoRG4sRiksci5waXhlbFN0b3JlaShDbixrKSxyLnRleFN1YkltYWdlM0QobyxpLDAsMCx2LGcsZywxLGQscCx0KX1MbihyKX1lbHNlIHIudGV4SW1hZ2UyRChvLGksdSxkLHAsdCk7UWUobikmJnZyKHIsZSxuLHMsYSx1KSx6bihyLGUsbil9ZnVuY3Rpb24gcWUoKXt9ZnVuY3Rpb24gdnUocil7aWYodHlwZW9mIGRvY3VtZW50PCJ1Iil7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIGUuaHJlZj1yLGUuaG9zdG5hbWU9PT1sb2NhdGlvbi5ob3N0bmFtZSYmZS5wb3J0PT09bG9jYXRpb24ucG9ydCYmZS5wcm90b2NvbD09PWxvY2F0aW9uLnByb3RvY29sfWVsc2V7Y29uc3QgZT1uZXcgVVJMKGxvY2F0aW9uLmhyZWYpLm9yaWdpbjtyZXR1cm4gbmV3IFVSTChyLGxvY2F0aW9uLmhyZWYpLm9yaWdpbj09PWV9fWZ1bmN0aW9uIEV1KHIsZSl7cmV0dXJuIGU9PT12b2lkIDAmJiF2dShyKT8iYW5vbnltb3VzIjplfWZ1bmN0aW9uIFR1KHIsZSx0KXt0PXR8fHFlO2xldCBuO2lmKGU9ZSE9PXZvaWQgMD9lOmllLmNyb3NzT3JpZ2luLGU9RXUocixlKSx0eXBlb2YgSW1hZ2U8InUiKXtuPW5ldyBJbWFnZSxlIT09dm9pZCAwJiYobi5jcm9zc09yaWdpbj1lKTtjb25zdCBvPWZ1bmN0aW9uKCl7bi5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsaSksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixzKSxuPW51bGx9LGk9ZnVuY3Rpb24oKXtjb25zdCB1PSJjb3VsZG4ndCBsb2FkIGltYWdlOiAiK3I7cG4odSksdCh1LG4pLG8oKX0scz1mdW5jdGlvbigpe3QobnVsbCxuKSxvKCl9O3JldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixpKSxuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHMpLG4uc3JjPXIsbn1lbHNlIGlmKHR5cGVvZiBJbWFnZUJpdG1hcDwidSIpe2xldCBvLGk7Y29uc3Qgcz1mdW5jdGlvbigpe3QobyxpKX0sYT17fTtlJiYoYS5tb2RlPSJjb3JzIiksZmV0Y2gocixhKS50aGVuKGZ1bmN0aW9uKHUpe2lmKCF1Lm9rKXRocm93IHU7cmV0dXJuIHUuYmxvYigpfSkudGhlbihmdW5jdGlvbih1KXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodSx7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSl9KS50aGVuKGZ1bmN0aW9uKHUpe2k9dSxzZXRUaW1lb3V0KHMpfSkuY2F0Y2goZnVuY3Rpb24odSl7bz11LHNldFRpbWVvdXQocyl9KSxuPW51bGx9cmV0dXJuIG59ZnVuY3Rpb24gJG4ocil7cmV0dXJuIHR5cGVvZiBJbWFnZUJpdG1hcDwidSImJnIgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcHx8dHlwZW9mIEltYWdlRGF0YTwidSImJnIgaW5zdGFuY2VvZiBJbWFnZURhdGF8fHR5cGVvZiBIVE1MRWxlbWVudDwidSImJnIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH1mdW5jdGlvbiB3cihyLGUsdCl7cmV0dXJuICRuKHIpPyhzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dChudWxsLHIpfSkscik6VHUocixlLHQpfWZ1bmN0aW9uIEFyKHIsZSx0KXt0PXR8fGllLnRleHR1cmVPcHRpb25zO2NvbnN0IG49dC50YXJnZXR8fHNlO2lmKHIuYmluZFRleHR1cmUobixlKSx0LmNvbG9yPT09ITEpcmV0dXJuO2NvbnN0IG89X3UodC5jb2xvcik7aWYobj09PWFlKWZvcihsZXQgaT0wO2k8NjsrK2kpci50ZXhJbWFnZTJEKHByK2ksMCxSLDEsMSwwLFIsUyxvKTtlbHNlIG49PT1iZXx8bj09PXhlP3IudGV4SW1hZ2UzRChuLDAsUiwxLDEsMSwwLFIsUyxvKTpyLnRleEltYWdlMkQobiwwLFIsMSwxLDAsUixTLG8pfWZ1bmN0aW9uIHd1KHIsZSx0LG4pe3JldHVybiBuPW58fHFlLHQ9dHx8aWUudGV4dHVyZU9wdGlvbnMsQXIocixlLHQpLHQ9T2JqZWN0LmFzc2lnbih7fSx0KSx3cih0LnNyYyx0LmNyb3NzT3JpZ2luLGZ1bmN0aW9uKGkscyl7aT9uKGksZSxzKTooR24ocixlLHMsdCksbihudWxsLGUscykpfSl9ZnVuY3Rpb24gQXUocixlLHQsbil7bj1ufHxxZTtjb25zdCBvPXQuc3JjO2lmKG8ubGVuZ3RoIT09Nil0aHJvdyJ0aGVyZSBtdXN0IGJlIDYgdXJscyBmb3IgYSBjdWJlbWFwIjtjb25zdCBpPXQubGV2ZWx8fDAscz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8UixhPVhlKHMpLHU9dC5mb3JtYXR8fGEuZm9ybWF0LGY9dC50eXBlfHxTLGQ9dC50YXJnZXR8fHNlO2lmKGQhPT1hZSl0aHJvdyJ0YXJnZXQgbXVzdCBiZSBURVhUVVJFX0NVQkVfTUFQIjtBcihyLGUsdCksdD1PYmplY3QuYXNzaWduKHt9LHQpO2xldCBwPTY7Y29uc3QgZz1bXSxiPUVyKHIsdCk7bGV0IGg7ZnVuY3Rpb24geChFKXtyZXR1cm4gZnVuY3Rpb24odixGKXstLXAsdj9nLnB1c2godik6Ri53aWR0aCE9PUYuaGVpZ2h0P2cucHVzaCgiY3ViZW1hcCBmYWNlIGltZyBpcyBub3QgYSBzcXVhcmU6ICIrRi5zcmMpOihNZShyLHQpLHIuYmluZFRleHR1cmUoZCxlKSxwPT09NT9FcigpLmZvckVhY2goZnVuY3Rpb24oayl7ci50ZXhJbWFnZTJEKGssaSxzLHUsZixGKX0pOnIudGV4SW1hZ2UyRChFLGkscyx1LGYsRiksUWUodCkmJnIuZ2VuZXJhdGVNaXBtYXAoZCkpLHA9PT0wJiZuKGcubGVuZ3RoP2c6dm9pZCAwLGUsaCl9fWg9by5tYXAoZnVuY3Rpb24oRSx2KXtyZXR1cm4gd3IoRSx0LmNyb3NzT3JpZ2luLHgoYlt2XSkpfSl9ZnVuY3Rpb24gSXUocixlLHQsbil7bj1ufHxxZTtjb25zdCBvPXQuc3JjLGk9dC5pbnRlcm5hbEZvcm1hdHx8dC5mb3JtYXR8fFIscz1YZShpKSxhPXQuZm9ybWF0fHxzLmZvcm1hdCx1PXQudHlwZXx8UyxmPXQudGFyZ2V0fHx4ZTtpZihmIT09YmUmJmYhPT14ZSl0aHJvdyJ0YXJnZXQgbXVzdCBiZSBURVhUVVJFXzNEIG9yIFRFWFRVUkVfMkRfQVJSQVkiO0FyKHIsZSx0KSx0PU9iamVjdC5hc3NpZ24oe30sdCk7bGV0IGQ9by5sZW5ndGg7Y29uc3QgcD1bXTtsZXQgZztjb25zdCBiPXQubGV2ZWx8fDA7bGV0IGg9dC53aWR0aCx4PXQuaGVpZ2h0O2NvbnN0IEU9by5sZW5ndGg7bGV0IHY9ITA7ZnVuY3Rpb24gRihrKXtyZXR1cm4gZnVuY3Rpb24oRyx6KXtpZigtLWQsRylwLnB1c2goRyk7ZWxzZXtpZihNZShyLHQpLHIuYmluZFRleHR1cmUoZixlKSx2KXt2PSExLGg9dC53aWR0aHx8ei53aWR0aCx4PXQuaGVpZ2h0fHx6LmhlaWdodCxyLnRleEltYWdlM0QoZixiLGksaCx4LEUsMCxhLHUsbnVsbCk7Zm9yKGxldCBIPTA7SDxFOysrSClyLnRleFN1YkltYWdlM0QoZixiLDAsMCxILGgseCwxLGEsdSx6KX1lbHNle2xldCBIPXosJDsoei53aWR0aCE9PWh8fHouaGVpZ2h0IT09eCkmJigkPXduKCksSD0kLmNhbnZhcywkLmNhbnZhcy53aWR0aD1oLCQuY2FudmFzLmhlaWdodD14LCQuZHJhd0ltYWdlKHosMCwwLGgseCkpLHIudGV4U3ViSW1hZ2UzRChmLGIsMCwwLGssaCx4LDEsYSx1LEgpLCQmJkg9PT0kLmNhbnZhcyYmKCQuY2FudmFzLndpZHRoPTAsJC5jYW52YXMuaGVpZ2h0PTApfVFlKHQpJiZyLmdlbmVyYXRlTWlwbWFwKGYpfWQ9PT0wJiZuKHAubGVuZ3RoP3A6dm9pZCAwLGUsZyl9fWc9by5tYXAoZnVuY3Rpb24oayxHKXtyZXR1cm4gd3Ioayx0LmNyb3NzT3JpZ2luLEYoRykpfSl9ZnVuY3Rpb24gU3UocixlLHQsbil7bj1ufHxpZS50ZXh0dXJlT3B0aW9ucztjb25zdCBvPW4udGFyZ2V0fHxzZTtyLmJpbmRUZXh0dXJlKG8sZSk7bGV0IGk9bi53aWR0aCxzPW4uaGVpZ2h0LGE9bi5kZXB0aDtjb25zdCB1PW4ubGV2ZWx8fDAsZj1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8UixkPVhlKGYpLHA9bi5mb3JtYXR8fGQuZm9ybWF0LGc9bi50eXBlfHxidShyLHQsZC50eXBlKTtpZihIZSh0KSl0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkmJih0PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSk7ZWxzZXtjb25zdCBFPW1uKGcpO3Q9bmV3IEUodCl9Y29uc3QgYj1wdShmLGcpLGg9dC5ieXRlTGVuZ3RoL2I7aWYoaCUxKXRocm93Imxlbmd0aCB3cm9uZyBzaXplIGZvciBmb3JtYXQ6ICIrVG4ocixwKTtsZXQgeDtpZihvPT09YmV8fG89PT14ZSlpZighaSYmIXMmJiFhKXtjb25zdCBFPU1hdGguY2JydChoKTtpZihFJTEhPT0wKXRocm93ImNhbid0IGd1ZXNzIGN1YmUgc2l6ZSBvZiBhcnJheSBvZiBudW1FbGVtZW50czogIitoO2k9RSxzPUUsYT1FfWVsc2UgaSYmKCFzfHwhYSk/KHg9UnQocixvLHMsYSxoL2kpLHM9eC53aWR0aCxhPXguaGVpZ2h0KTpzJiYoIWl8fCFhKT8oeD1SdChyLG8saSxhLGgvcyksaT14LndpZHRoLGE9eC5oZWlnaHQpOih4PVJ0KHIsbyxpLHMsaC9hKSxpPXgud2lkdGgscz14LmhlaWdodCk7ZWxzZSB4PVJ0KHIsbyxpLHMsaCksaT14LndpZHRoLHM9eC5oZWlnaHQ7aWYoTG4ociksci5waXhlbFN0b3JlaShicixuLnVucGFja0FsaWdubWVudHx8MSksTWUocixuKSxvPT09YWUpe2NvbnN0IEU9Yi90LkJZVEVTX1BFUl9FTEVNRU5ULHY9aC82KkU7VHIocixuKS5mb3JFYWNoKEY9Pntjb25zdCBrPXYqRi5uZHgsRz10LnN1YmFycmF5KGssayt2KTtyLnRleEltYWdlMkQoRi5mYWNlLHUsZixpLHMsMCxwLGcsRyl9KX1lbHNlIG89PT1iZXx8bz09PXhlP3IudGV4SW1hZ2UzRChvLHUsZixpLHMsYSwwLHAsZyx0KTpyLnRleEltYWdlMkQobyx1LGYsaSxzLDAscCxnLHQpO3JldHVybnt3aWR0aDppLGhlaWdodDpzLGRlcHRoOmEsdHlwZTpnfX1mdW5jdGlvbiBSdShyLGUsdCl7Y29uc3Qgbj10LnRhcmdldHx8c2U7ci5iaW5kVGV4dHVyZShuLGUpO2NvbnN0IG89dC5sZXZlbHx8MCxpPXQuaW50ZXJuYWxGb3JtYXR8fHQuZm9ybWF0fHxSLHM9WGUoaSksYT10LmZvcm1hdHx8cy5mb3JtYXQsdT10LnR5cGV8fHMudHlwZTtpZihNZShyLHQpLG49PT1hZSlmb3IobGV0IGY9MDtmPDY7KytmKXIudGV4SW1hZ2UyRChwcitmLG8saSx0LndpZHRoLHQuaGVpZ2h0LDAsYSx1LG51bGwpO2Vsc2Ugbj09PWJlfHxuPT09eGU/ci50ZXhJbWFnZTNEKG4sbyxpLHQud2lkdGgsdC5oZWlnaHQsdC5kZXB0aCwwLGEsdSxudWxsKTpyLnRleEltYWdlMkQobixvLGksdC53aWR0aCx0LmhlaWdodCwwLGEsdSxudWxsKX1mdW5jdGlvbiBXbihyLGUsdCl7dD10fHxxZSxlPWV8fGllLnRleHR1cmVPcHRpb25zO2NvbnN0IG49ci5jcmVhdGVUZXh0dXJlKCksbz1lLnRhcmdldHx8c2U7bGV0IGk9ZS53aWR0aHx8MSxzPWUuaGVpZ2h0fHwxO2NvbnN0IGE9ZS5pbnRlcm5hbEZvcm1hdHx8UjtyLmJpbmRUZXh0dXJlKG8sbiksbz09PWFlJiYoci50ZXhQYXJhbWV0ZXJpKG8sdnQsX3QpLHIudGV4UGFyYW1ldGVyaShvLEV0LF90KSk7bGV0IHU9ZS5zcmM7aWYodSlpZih0eXBlb2YgdT09ImZ1bmN0aW9uIiYmKHU9dShyLGUpKSx0eXBlb2YgdT09InN0cmluZyIpd3UocixuLGUsdCk7ZWxzZSBpZihIZSh1KXx8QXJyYXkuaXNBcnJheSh1KSYmKHR5cGVvZiB1WzBdPT0ibnVtYmVyInx8QXJyYXkuaXNBcnJheSh1WzBdKXx8SGUodVswXSkpKXtjb25zdCBmPVN1KHIsbix1LGUpO2k9Zi53aWR0aCxzPWYuaGVpZ2h0fWVsc2UgQXJyYXkuaXNBcnJheSh1KSYmKHR5cGVvZiB1WzBdPT0ic3RyaW5nInx8JG4odVswXSkpP289PT1hZT9BdShyLG4sZSx0KTpJdShyLG4sZSx0KTooR24ocixuLHUsZSksaT11LndpZHRoLHM9dS5oZWlnaHQpO2Vsc2UgUnUocixuLGUpO3JldHVybiBRZShlKSYmdnIocixuLGUsaSxzLGEpLHpuKHIsbixlKSxufWNvbnN0IElyPXBuO2Z1bmN0aW9uIFZuKHIpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChyKTpudWxsfWNvbnN0IEZ0PTMzOTg0LFB0PTM0OTYyLEZ1PTM0OTYzLFB1PTM1NzEzLGt1PTM1NzE0LER1PTM1NjMyLEN1PTM1NjMzLEJ1PTM1OTgxLEhuPTM1NzE4LE11PTM1NzIxLE91PTM1OTcxLFV1PTM1MzgyLE51PTM1Mzk2LEx1PTM1Mzk4LHp1PTM1MzkyLEd1PTM1Mzk1LGt0PTUxMjYsam49MzU2NjQsWW49MzU2NjUsWG49MzU2NjYsU3I9NTEyNCxRbj0zNTY2Nyxxbj0zNTY2OCxLbj0zNTY2OSxKbj0zNTY3MCxabj0zNTY3MSxlbz0zNTY3Mix0bz0zNTY3Myxybz0zNTY3NCxubz0zNTY3NSxvbz0zNTY3NiwkdT0zNTY3OCxXdT0zNTY4MCxWdT0zNTY3OSxIdT0zNTY4MixqdT0zNTY4NSxZdT0zNTY4NixYdT0zNTY4NyxRdT0zNTY4OCxxdT0zNTY4OSxLdT0zNTY5MCxKdT0zNjI4OSxadT0zNjI5MixlYz0zNjI5MyxScj01MTI1LGlvPTM2Mjk0LHNvPTM2Mjk1LGFvPTM2Mjk2LHRjPTM2Mjk4LHJjPTM2Mjk5LG5jPTM2MzAwLG9jPTM2MzAzLGljPTM2MzA2LHNjPTM2MzA3LGFjPTM2MzA4LHVjPTM2MzExLER0PTM1NTMsQ3Q9MzQwNjcsRnI9MzI4NzksQnQ9MzU4NjYsXz17fTtmdW5jdGlvbiB1byhyLGUpe3JldHVybiBfW2VdLmJpbmRQb2ludH1mdW5jdGlvbiBjYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xZihlLHQpfX1mdW5jdGlvbiBmYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xZnYoZSx0KX19ZnVuY3Rpb24gbGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMmZ2KGUsdCl9fWZ1bmN0aW9uIGRjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTNmdihlLHQpfX1mdW5jdGlvbiBoYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm00ZnYoZSx0KX19ZnVuY3Rpb24gY28ocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWkoZSx0KX19ZnVuY3Rpb24gZm8ocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWl2KGUsdCl9fWZ1bmN0aW9uIGxvKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJpdihlLHQpfX1mdW5jdGlvbiBobyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0zaXYoZSx0KX19ZnVuY3Rpb24gbW8ocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNGl2KGUsdCl9fWZ1bmN0aW9uIG1jKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTF1aShlLHQpfX1mdW5jdGlvbiBwYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xdWl2KGUsdCl9fWZ1bmN0aW9uIGdjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJ1aXYoZSx0KX19ZnVuY3Rpb24geWMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtM3VpdihlLHQpfX1mdW5jdGlvbiBiYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm00dWl2KGUsdCl9fWZ1bmN0aW9uIHhjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDJmdihlLCExLHQpfX1mdW5jdGlvbiBfYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzZnYoZSwhMSx0KX19ZnVuY3Rpb24gdmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtTWF0cml4NGZ2KGUsITEsdCl9fWZ1bmN0aW9uIEVjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDJ4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIFRjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDN4MmZ2KGUsITEsdCl9fWZ1bmN0aW9uIHdjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDJ4NGZ2KGUsITEsdCl9fWZ1bmN0aW9uIEFjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDR4MmZ2KGUsITEsdCl9fWZ1bmN0aW9uIEljKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDN4NGZ2KGUsITEsdCl9fWZ1bmN0aW9uIFNjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDR4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIE4ocixlLHQsbil7Y29uc3Qgbz11byhyLGUpO3JldHVybiBWZShyKT9mdW5jdGlvbihpKXtsZXQgcyxhOyFpfHxkcihyLGkpPyhzPWksYT1udWxsKToocz1pLnRleHR1cmUsYT1pLnNhbXBsZXIpLHIudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKEZ0K3QpLHIuYmluZFRleHR1cmUobyxzKSxyLmJpbmRTYW1wbGVyKHQsYSl9OmZ1bmN0aW9uKGkpe3IudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKEZ0K3QpLHIuYmluZFRleHR1cmUobyxpKX19ZnVuY3Rpb24gTChyLGUsdCxuLG8pe2NvbnN0IGk9dW8ocixlKSxzPW5ldyBJbnQzMkFycmF5KG8pO2ZvcihsZXQgYT0wO2E8bzsrK2Epc1thXT10K2E7cmV0dXJuIFZlKHIpP2Z1bmN0aW9uKGEpe3IudW5pZm9ybTFpdihuLHMpLGEuZm9yRWFjaChmdW5jdGlvbih1LGYpe3IuYWN0aXZlVGV4dHVyZShGdCtzW2ZdKTtsZXQgZCxwOyF1fHxkcihyLHUpPyhkPXUscD1udWxsKTooZD11LnRleHR1cmUscD11LnNhbXBsZXIpLHIuYmluZFNhbXBsZXIodCxwKSxyLmJpbmRUZXh0dXJlKGksZCl9KX06ZnVuY3Rpb24oYSl7ci51bmlmb3JtMWl2KG4scyksYS5mb3JFYWNoKGZ1bmN0aW9uKHUsZil7ci5hY3RpdmVUZXh0dXJlKEZ0K3NbZl0pLHIuYmluZFRleHR1cmUoaSx1KX0pfX1fW2t0XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0LHNldHRlcjpjYyxhcnJheVNldHRlcjpmY30sX1tqbl09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6OCxzZXR0ZXI6bGMsY29sczoyfSxfW1luXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6ZGMsY29sczozfSxfW1huXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6aGMsY29sczo0fSxfW1NyXT17VHlwZTpJbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6Y28sYXJyYXlTZXR0ZXI6Zm99LF9bUW5dPXtUeXBlOkludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpsbyxjb2xzOjJ9LF9bcW5dPXtUeXBlOkludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6aG8sY29sczozfSxfW0tuXT17VHlwZTpJbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOm1vLGNvbHM6NH0sX1tScl09e1R5cGU6VWludDMyQXJyYXksc2l6ZTo0LHNldHRlcjptYyxhcnJheVNldHRlcjpwY30sX1tpb109e1R5cGU6VWludDMyQXJyYXksc2l6ZTo4LHNldHRlcjpnYyxjb2xzOjJ9LF9bc29dPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTIsc2V0dGVyOnljLGNvbHM6M30sX1thb109e1R5cGU6VWludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6YmMsY29sczo0fSxfW0puXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOmNvLGFycmF5U2V0dGVyOmZvfSxfW1puXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOmxvLGNvbHM6Mn0sX1tlb109e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6aG8sY29sczozfSxfW3RvXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjptbyxjb2xzOjR9LF9bcm9dPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjp4Yyxyb3dzOjIsY29sczoyfSxfW25vXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6X2Mscm93czozLGNvbHM6M30sX1tvb109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOnZjLHJvd3M6NCxjb2xzOjR9LF9banVdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpFYyxyb3dzOjIsY29sczozfSxfW1l1XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTozMixzZXR0ZXI6d2Mscm93czoyLGNvbHM6NH0sX1tYdV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOlRjLHJvd3M6Myxjb2xzOjJ9LF9bUXVdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpJYyxyb3dzOjMsY29sczo0fSxfW3F1XT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6QWMscm93czo0LGNvbHM6Mn0sX1tLdV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NjQsc2V0dGVyOlNjLHJvd3M6NCxjb2xzOjN9LF9bJHVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkR0fSxfW1d1XT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpDdH0sX1tWdV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6RnJ9LF9bSHVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkR0fSxfW0p1XT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpCdH0sX1tadV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6QnR9LF9bZWNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkN0fSxfW3RjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpEdH0sX1tyY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6RnJ9LF9bbmNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkN0fSxfW29jXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpCdH0sX1tpY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6RHR9LF9bc2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpOLGFycmF5U2V0dGVyOkwsYmluZFBvaW50OkZyfSxfW2FjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TixhcnJheVNldHRlcjpMLGJpbmRQb2ludDpDdH0sX1t1Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOk4sYXJyYXlTZXR0ZXI6TCxiaW5kUG9pbnQ6QnR9O2Z1bmN0aW9uIE10KHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKHQudmFsdWUpc3dpdGNoKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmFsdWUubGVuZ3RoKXtjYXNlIDQ6ci52ZXJ0ZXhBdHRyaWI0ZnYoZSx0LnZhbHVlKTticmVhaztjYXNlIDM6ci52ZXJ0ZXhBdHRyaWIzZnYoZSx0LnZhbHVlKTticmVhaztjYXNlIDI6ci52ZXJ0ZXhBdHRyaWIyZnYoZSx0LnZhbHVlKTticmVhaztjYXNlIDE6ci52ZXJ0ZXhBdHRyaWIxZnYoZSx0LnZhbHVlKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBhIGZsb2F0IGNvbnN0YW50IHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0ISIpfWVsc2Ugci5iaW5kQnVmZmVyKFB0LHQuYnVmZmVyKSxyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHIudmVydGV4QXR0cmliUG9pbnRlcihlLHQubnVtQ29tcG9uZW50c3x8dC5zaXplLHQudHlwZXx8a3QsdC5ub3JtYWxpemV8fCExLHQuc3RyaWRlfHwwLHQub2Zmc2V0fHwwKSxyLnZlcnRleEF0dHJpYkRpdmlzb3ImJnIudmVydGV4QXR0cmliRGl2aXNvcihlLHQuZGl2aXNvcnx8MCl9fWZ1bmN0aW9uIGNlKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKHQudmFsdWUpaWYoci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSksdC52YWx1ZS5sZW5ndGg9PT00KXIudmVydGV4QXR0cmliNGl2KGUsdC52YWx1ZSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRoZSBsZW5ndGggb2YgYW4gaW50ZWdlciBjb25zdGFudCB2YWx1ZSBtdXN0IGJlIDQhIik7ZWxzZSByLmJpbmRCdWZmZXIoUHQsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLHQubnVtQ29tcG9uZW50c3x8dC5zaXplLHQudHlwZXx8U3IsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gT3QocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlpZihyLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZhbHVlLmxlbmd0aD09PTQpci52ZXJ0ZXhBdHRyaWI0dWl2KGUsdC52YWx1ZSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRoZSBsZW5ndGggb2YgYW4gdW5zaWduZWQgaW50ZWdlciBjb25zdGFudCB2YWx1ZSBtdXN0IGJlIDQhIik7ZWxzZSByLmJpbmRCdWZmZXIoUHQsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLHQubnVtQ29tcG9uZW50c3x8dC5zaXplLHQudHlwZXx8UnIsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gUHIocixlLHQpe2NvbnN0IG49dC5zaXplLG89dC5jb3VudDtyZXR1cm4gZnVuY3Rpb24oaSl7ci5iaW5kQnVmZmVyKFB0LGkuYnVmZmVyKTtjb25zdCBzPWkuc2l6ZXx8aS5udW1Db21wb25lbnRzfHxuLGE9cy9vLHU9aS50eXBlfHxrdCxkPV9bdV0uc2l6ZSpzLHA9aS5ub3JtYWxpemV8fCExLGc9aS5vZmZzZXR8fDAsYj1kL287Zm9yKGxldCBoPTA7aDxvOysraClyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUraCksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUraCxhLHUscCxkLGcrYipoKSxyLnZlcnRleEF0dHJpYkRpdmlzb3ImJnIudmVydGV4QXR0cmliRGl2aXNvcihlK2gsaS5kaXZpc29yfHwwKX19Y29uc3QgUD17fTtQW2t0XT17c2l6ZTo0LHNldHRlcjpNdH0sUFtqbl09e3NpemU6OCxzZXR0ZXI6TXR9LFBbWW5dPXtzaXplOjEyLHNldHRlcjpNdH0sUFtYbl09e3NpemU6MTYsc2V0dGVyOk10fSxQW1NyXT17c2l6ZTo0LHNldHRlcjpjZX0sUFtRbl09e3NpemU6OCxzZXR0ZXI6Y2V9LFBbcW5dPXtzaXplOjEyLHNldHRlcjpjZX0sUFtLbl09e3NpemU6MTYsc2V0dGVyOmNlfSxQW1JyXT17c2l6ZTo0LHNldHRlcjpPdH0sUFtpb109e3NpemU6OCxzZXR0ZXI6T3R9LFBbc29dPXtzaXplOjEyLHNldHRlcjpPdH0sUFthb109e3NpemU6MTYsc2V0dGVyOk90fSxQW0puXT17c2l6ZTo0LHNldHRlcjpjZX0sUFtabl09e3NpemU6OCxzZXR0ZXI6Y2V9LFBbZW9dPXtzaXplOjEyLHNldHRlcjpjZX0sUFt0b109e3NpemU6MTYsc2V0dGVyOmNlfSxQW3JvXT17c2l6ZTo0LHNldHRlcjpQcixjb3VudDoyfSxQW25vXT17c2l6ZTo5LHNldHRlcjpQcixjb3VudDozfSxQW29vXT17c2l6ZToxNixzZXR0ZXI6UHIsY291bnQ6NH07Y29uc3QgUmM9L0VSUk9SOlxzKlxkKzooXGQrKS9naTtmdW5jdGlvbiBGYyhyLGU9IiIsdD0wKXtjb25zdCBuPVsuLi5lLm1hdGNoQWxsKFJjKV0sbz1uZXcgTWFwKG4ubWFwKChpLHMpPT57Y29uc3QgYT1wYXJzZUludChpWzFdKSx1PW5bcysxXSxmPXU/dS5pbmRleDplLmxlbmd0aCxkPWUuc3Vic3RyaW5nKGkuaW5kZXgsZik7cmV0dXJuW2EtMSxkXX0pKTtyZXR1cm4gci5zcGxpdChgCmApLm1hcCgoaSxzKT0+e2NvbnN0IGE9by5nZXQocyk7cmV0dXJuYCR7cysxK3R9OiAke2l9JHthP2AKCl5eXiAke2F9YDoiIn1gfSkuam9pbihgCmApfWNvbnN0IHBvPS9eWyBcdF0qXG4vO2Z1bmN0aW9uIGdvKHIpe2xldCBlPTA7cmV0dXJuIHBvLnRlc3QocikmJihlPTEscj1yLnJlcGxhY2UocG8sIiIpKSx7bGluZU9mZnNldDplLHNoYWRlclNvdXJjZTpyfX1mdW5jdGlvbiBQYyhyLGUpe3JldHVybiByLmVycm9yQ2FsbGJhY2soZSksci5jYWxsYmFjayYmc2V0VGltZW91dCgoKT0+e3IuY2FsbGJhY2soYCR7ZX0KJHtyLmVycm9ycy5qb2luKGAKYCl9YCl9KSxudWxsfWZ1bmN0aW9uIGtjKHIsZSx0LG4pe2lmKG49bnx8SXIsIXIuZ2V0U2hhZGVyUGFyYW1ldGVyKHQsUHUpKXtjb25zdCBpPXIuZ2V0U2hhZGVySW5mb0xvZyh0KSx7bGluZU9mZnNldDpzLHNoYWRlclNvdXJjZTphfT1nbyhyLmdldFNoYWRlclNvdXJjZSh0KSksdT1gJHtGYyhhLGkscyl9CkVycm9yIGNvbXBpbGluZyAke1RuKHIsZSl9OiAke2l9YDtyZXR1cm4gbih1KSx1fXJldHVybiIifWZ1bmN0aW9uIGtyKHIsZSx0KXtsZXQgbixvLGk7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiImJih0PWUsZT12b2lkIDApLHR5cGVvZiByPT0iZnVuY3Rpb24iKXQ9cixyPXZvaWQgMDtlbHNlIGlmKHImJiFBcnJheS5pc0FycmF5KHIpKXtjb25zdCBmPXI7dD1mLmVycm9yQ2FsbGJhY2sscj1mLmF0dHJpYkxvY2F0aW9ucyxuPWYudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyxvPWYudHJhbnNmb3JtRmVlZGJhY2tNb2RlLGk9Zi5jYWxsYmFja31jb25zdCBzPXR8fElyLGE9W10sdT17ZXJyb3JDYWxsYmFjayhmLC4uLmQpe2EucHVzaChmKSxzKGYsLi4uZCl9LHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6bix0cmFuc2Zvcm1GZWVkYmFja01vZGU6byxjYWxsYmFjazppLGVycm9yczphfTt7bGV0IGY9e307QXJyYXkuaXNBcnJheShyKT9yLmZvckVhY2goZnVuY3Rpb24oZCxwKXtmW2RdPWU/ZVtwXTpwfSk6Zj1yfHx7fSx1LmF0dHJpYkxvY2F0aW9ucz1mfXJldHVybiB1fWNvbnN0IERjPVsiVkVSVEVYX1NIQURFUiIsIkZSQUdNRU5UX1NIQURFUiJdO2Z1bmN0aW9uIENjKHIsZSl7aWYoZS5pbmRleE9mKCJmcmFnIik+PTApcmV0dXJuIER1O2lmKGUuaW5kZXhPZigidmVydCIpPj0wKXJldHVybiBDdX1mdW5jdGlvbiBCYyhyLGUsdCl7Y29uc3Qgbj1yLmdldEF0dGFjaGVkU2hhZGVycyhlKTtmb3IoY29uc3QgbyBvZiBuKXQuaGFzKG8pJiZyLmRlbGV0ZVNoYWRlcihvKTtyLmRlbGV0ZVByb2dyYW0oZSl9Y29uc3QgTWM9KHI9MCk9Pm5ldyBQcm9taXNlKGU9PnNldFRpbWVvdXQoZSxyKSk7ZnVuY3Rpb24gT2MocixlLHQpe2NvbnN0IG49ci5jcmVhdGVQcm9ncmFtKCkse2F0dHJpYkxvY2F0aW9uczpvLHRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3M6aSx0cmFuc2Zvcm1GZWVkYmFja01vZGU6c309a3IodCk7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDsrK2Epe2xldCB1PWVbYV07aWYodHlwZW9mIHU9PSJzdHJpbmciKXtjb25zdCBmPVZuKHUpLGQ9Zj9mLnRleHQ6dTtsZXQgcD1yW0RjW2FdXTtmJiZmLnR5cGUmJihwPUNjKHIsZi50eXBlKXx8cCksdT1yLmNyZWF0ZVNoYWRlcihwKSxyLnNoYWRlclNvdXJjZSh1LGdvKGQpLnNoYWRlclNvdXJjZSksci5jb21waWxlU2hhZGVyKHUpLHIuYXR0YWNoU2hhZGVyKG4sdSl9fU9iamVjdC5lbnRyaWVzKG8pLmZvckVhY2goKFthLHVdKT0+ci5iaW5kQXR0cmliTG9jYXRpb24obix1LGEpKTt7bGV0IGE9aTthJiYoYS5hdHRyaWJzJiYoYT1hLmF0dHJpYnMpLEFycmF5LmlzQXJyYXkoYSl8fChhPU9iamVjdC5rZXlzKGEpKSxyLnRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MobixhLHN8fEJ1KSl9cmV0dXJuIHIubGlua1Byb2dyYW0obiksbn1mdW5jdGlvbiBVYyhyLGUsdCxuLG8pe2NvbnN0IGk9a3IodCxuLG8pLHM9bmV3IFNldChlKSxhPU9jKHIsZSxpKTtmdW5jdGlvbiB1KGYsZCl7Y29uc3QgcD1MYyhmLGQsaS5lcnJvckNhbGxiYWNrKTtyZXR1cm4gcCYmQmMoZixkLHMpLHB9aWYoaS5jYWxsYmFjayl7TmMocixhKS50aGVuKCgpPT57Y29uc3QgZj11KHIsYSk7aS5jYWxsYmFjayhmLGY/dm9pZCAwOmEpfSk7cmV0dXJufXJldHVybiB1KHIsYSk/dm9pZCAwOmF9YXN5bmMgZnVuY3Rpb24gTmMocixlKXtjb25zdCB0PXIuZ2V0RXh0ZW5zaW9uKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSxuPXQ/KGkscyk9PmkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihzLHQuQ09NUExFVElPTl9TVEFUVVNfS0hSKTooKT0+ITA7bGV0IG89MDtkbyBhd2FpdCBNYyhvKSxvPTFlMy82MDt3aGlsZSghbihyLGUpKX1mdW5jdGlvbiBMYyhyLGUsdCl7aWYodD10fHxJciwhci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsa3UpKXtjb25zdCBvPXIuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7dChgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke299YCk7Y29uc3Qgcz1yLmdldEF0dGFjaGVkU2hhZGVycyhlKS5tYXAoYT0+a2MocixyLmdldFNoYWRlclBhcmFtZXRlcihhLHIuU0hBREVSX1RZUEUpLGEsdCkpO3JldHVybmAke299CiR7cy5maWx0ZXIoYT0+YSkuam9pbihgCmApfWB9fWZ1bmN0aW9uIHpjKHIsZSx0LG4sbyl7cmV0dXJuIFVjKHIsZSx0LG4sbyl9ZnVuY3Rpb24geW8ocil7Y29uc3QgZT1yLm5hbWU7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZ2xfIil8fGUuc3RhcnRzV2l0aCgid2ViZ2xfIil9Y29uc3QgR2M9LyhcLnxcW3xdfFx3KykvZywkYz1yPT5yPj0iMCImJnI8PSI5IjtmdW5jdGlvbiBXYyhyLGUsdCxuKXtjb25zdCBvPXIuc3BsaXQoR2MpLmZpbHRlcihhPT5hIT09IiIpO2xldCBpPTAscz0iIjtmb3IoOzspe2NvbnN0IGE9b1tpKytdO3MrPWE7Y29uc3QgdT0kYyhhWzBdKSxmPXU/cGFyc2VJbnQoYSk6YTtpZih1JiYocys9b1tpKytdKSxpPT09by5sZW5ndGgpe3RbZl09ZTticmVha31lbHNle2NvbnN0IHA9b1tpKytdLGc9cD09PSJbIixiPXRbZl18fChnP1tdOnt9KTt0W2ZdPWIsdD1iLG5bc109bltzXXx8ZnVuY3Rpb24oaCl7cmV0dXJuIGZ1bmN0aW9uKHgpe2JvKGgseCl9fShiKSxzKz1wfX19ZnVuY3Rpb24gVmMocixlKXtsZXQgdD0wO2Z1bmN0aW9uIG4oYSx1LGYpe2NvbnN0IGQ9dS5uYW1lLmVuZHNXaXRoKCJbMF0iKSxwPXUudHlwZSxnPV9bcF07aWYoIWcpdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGU6IDB4JHtwLnRvU3RyaW5nKDE2KX1gKTtsZXQgYjtpZihnLmJpbmRQb2ludCl7Y29uc3QgaD10O3QrPXUuc2l6ZSxkP2I9Zy5hcnJheVNldHRlcihyLHAsaCxmLHUuc2l6ZSk6Yj1nLnNldHRlcihyLHAsaCxmLHUuc2l6ZSl9ZWxzZSBnLmFycmF5U2V0dGVyJiZkP2I9Zy5hcnJheVNldHRlcihyLGYpOmI9Zy5zZXR0ZXIocixmKTtyZXR1cm4gYi5sb2NhdGlvbj1mLGJ9Y29uc3Qgbz17fSxpPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsSG4pO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7aWYoeW8odSkpY29udGludWU7bGV0IGY9dS5uYW1lO2YuZW5kc1dpdGgoIlswXSIpJiYoZj1mLnN1YnN0cigwLGYubGVuZ3RoLTMpKTtjb25zdCBkPXIuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdS5uYW1lKTtpZihkKXtjb25zdCBwPW4oZSx1LGQpO29bZl09cCxXYyhmLHAsaSxvKX19cmV0dXJuIG99ZnVuY3Rpb24gSGMocixlKXtjb25zdCB0PXt9LG49ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsT3UpO2ZvcihsZXQgbz0wO288bjsrK28pe2NvbnN0IGk9ci5nZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcoZSxvKTt0W2kubmFtZV09e2luZGV4Om8sdHlwZTppLnR5cGUsc2l6ZTppLnNpemV9fXJldHVybiB0fWZ1bmN0aW9uIGpjKHIsZSl7Y29uc3QgdD1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxIbiksbj1bXSxvPVtdO2ZvcihsZXQgYT0wO2E8dDsrK2Epe28ucHVzaChhKSxuLnB1c2goe30pO2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtKGUsYSk7blthXS5uYW1lPXUubmFtZX1bWyJVTklGT1JNX1RZUEUiLCJ0eXBlIl0sWyJVTklGT1JNX1NJWkUiLCJzaXplIl0sWyJVTklGT1JNX0JMT0NLX0lOREVYIiwiYmxvY2tOZHgiXSxbIlVOSUZPUk1fT0ZGU0VUIiwib2Zmc2V0Il1dLmZvckVhY2goZnVuY3Rpb24oYSl7Y29uc3QgdT1hWzBdLGY9YVsxXTtyLmdldEFjdGl2ZVVuaWZvcm1zKGUsbyxyW3VdKS5mb3JFYWNoKGZ1bmN0aW9uKGQscCl7bltwXVtmXT1kfSl9KTtjb25zdCBpPXt9LHM9ci5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsVXUpO2ZvcihsZXQgYT0wO2E8czsrK2Epe2NvbnN0IHU9ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKGUsYSksZj17aW5kZXg6ci5nZXRVbmlmb3JtQmxvY2tJbmRleChlLHUpLHVzZWRCeVZlcnRleFNoYWRlcjpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsTnUpLHVzZWRCeUZyYWdtZW50U2hhZGVyOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxMdSksc2l6ZTpyLmdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlcihlLGEsenUpLHVuaWZvcm1JbmRpY2VzOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxHdSl9O2YudXNlZD1mLnVzZWRCeVZlcnRleFNoYWRlcnx8Zi51c2VkQnlGcmFnbWVudFNoYWRlcixpW3VdPWZ9cmV0dXJue2Jsb2NrU3BlY3M6aSx1bmlmb3JtRGF0YTpufX1mdW5jdGlvbiBibyhyLGUpe2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IG49clt0XTt0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKGVbdF0pOmJvKHJbdF0sZVt0XSl9fWZ1bmN0aW9uIHhvKHIsLi4uZSl7Y29uc3QgdD1yLnVuaWZvcm1TZXR0ZXJzfHxyLG49ZS5sZW5ndGg7Zm9yKGxldCBvPTA7bzxuOysrbyl7Y29uc3QgaT1lW29dO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IHM9aS5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzOysrYSl4byh0LGlbYV0pfWVsc2UgZm9yKGNvbnN0IHMgaW4gaSl7Y29uc3QgYT10W3NdO2EmJmEoaVtzXSl9fX1mdW5jdGlvbiBZYyhyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxNdSk7Zm9yKGxldCBvPTA7bzxuOysrbyl7Y29uc3QgaT1yLmdldEFjdGl2ZUF0dHJpYihlLG8pO2lmKHlvKGkpKWNvbnRpbnVlO2NvbnN0IHM9ci5nZXRBdHRyaWJMb2NhdGlvbihlLGkubmFtZSksYT1QW2kudHlwZV0sdT1hLnNldHRlcihyLHMsYSk7dS5sb2NhdGlvbj1zLHRbaS5uYW1lXT11fXJldHVybiB0fWZ1bmN0aW9uIFhjKHIsZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1yW3RdO24mJm4oZVt0XSl9fWZ1bmN0aW9uIFFjKHIsZSx0KXt0LnZlcnRleEFycmF5T2JqZWN0P3IuYmluZFZlcnRleEFycmF5KHQudmVydGV4QXJyYXlPYmplY3QpOihYYyhlLmF0dHJpYlNldHRlcnN8fGUsdC5hdHRyaWJzKSx0LmluZGljZXMmJnIuYmluZEJ1ZmZlcihGdSx0LmluZGljZXMpKX1mdW5jdGlvbiBfbyhyLGUpe2NvbnN0IHQ9VmMocixlKSxuPVljKHIsZSksbz17cHJvZ3JhbTplLHVuaWZvcm1TZXR0ZXJzOnQsYXR0cmliU2V0dGVyczpufTtyZXR1cm4gVmUocikmJihvLnVuaWZvcm1CbG9ja1NwZWM9amMocixlKSxvLnRyYW5zZm9ybUZlZWRiYWNrSW5mbz1IYyhyLGUpKSxvfWNvbnN0IHFjPS9cc3x7fH18Oy87ZnVuY3Rpb24gS2MocixlLHQsbixvKXtjb25zdCBpPWtyKHQsbixvKSxzPVtdO2lmKGU9ZS5tYXAoZnVuY3Rpb24oZil7aWYoIXFjLnRlc3QoZikpe2NvbnN0IGQ9Vm4oZik7aWYoZClmPWQudGV4dDtlbHNle2NvbnN0IHA9YG5vIGVsZW1lbnQgd2l0aCBpZDogJHtmfWA7aS5lcnJvckNhbGxiYWNrKHApLHMucHVzaChwKX19cmV0dXJuIGZ9KSxzLmxlbmd0aClyZXR1cm4gUGMoaSwiIik7Y29uc3QgYT1pLmNhbGxiYWNrO2EmJihpLmNhbGxiYWNrPShmLGQpPT57YShmLGY/dm9pZCAwOl9vKHIsZCkpfSk7Y29uc3QgdT16YyhyLGUsaSk7cmV0dXJuIHU/X28ocix1KTpudWxsfWNvbnN0IEpjPTQsdm89NTEyMztmdW5jdGlvbiBaYyhyLGUsdCxuLG8saSl7dD10PT09dm9pZCAwP0pjOnQ7Y29uc3Qgcz1lLmluZGljZXMsYT1lLmVsZW1lbnRUeXBlLHU9bj09PXZvaWQgMD9lLm51bUVsZW1lbnRzOm47bz1vPT09dm9pZCAwPzA6byxhfHxzP2khPT12b2lkIDA/ci5kcmF3RWxlbWVudHNJbnN0YW5jZWQodCx1LGE9PT12b2lkIDA/dm86ZS5lbGVtZW50VHlwZSxvLGkpOnIuZHJhd0VsZW1lbnRzKHQsdSxhPT09dm9pZCAwP3ZvOmUuZWxlbWVudFR5cGUsbyk6aSE9PXZvaWQgMD9yLmRyYXdBcnJheXNJbnN0YW5jZWQodCxvLHUsaSk6ci5kcmF3QXJyYXlzKHQsbyx1KX1jb25zdCBFbz0zNjE2MCxVdD0zNjE2MSxlZj0zNTUzLHRmPTUxMjEscmY9NjQwMixuZj02NDA4LG9mPTMzMTkwLHNmPTM2MDEyLGFmPTM1MDU2LHVmPTM2MDEzLGNmPTMyODU0LGZmPTMyODU1LGxmPTM2MTk0LFRvPTMzMTg5LHdvPTY0MDEsQW89MzYxNjgsRHI9MzQwNDEsQ3I9MzYwNjQsTnQ9MzYwOTYsSW89MzYxMjgsQnI9MzMzMDYsTXI9MzMwNzEsT3I9OTcyOSxkZj1be2Zvcm1hdDpuZix0eXBlOnRmLG1pbjpPcix3cmFwOk1yfSx7Zm9ybWF0OkRyfV0sWT17fTtZW0RyXT1CcixZW3dvXT1JbyxZW0FvXT1JbyxZW3JmXT1OdCxZW1RvXT1OdCxZW29mXT1OdCxZW3NmXT1OdCxZW2FmXT1CcixZW3VmXT1CcjtmdW5jdGlvbiBoZihyLGUpe3JldHVybiBZW3JdfHxZW2VdfWNvbnN0IGZlPXt9O2ZlW2NmXT0hMCxmZVtmZl09ITAsZmVbbGZdPSEwLGZlW0RyXT0hMCxmZVtUb109ITAsZmVbd29dPSEwLGZlW0FvXT0hMDtmdW5jdGlvbiBtZihyKXtyZXR1cm4gZmVbcl19Y29uc3QgcGY9MzI7ZnVuY3Rpb24gZ2Yocil7cmV0dXJuIHI+PUNyJiZyPENyK3BmfWZ1bmN0aW9uIEx0KHIsZSx0LG4pe2NvbnN0IG89RW8saT1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ci5iaW5kRnJhbWVidWZmZXIobyxpKSx0PXR8fHIuZHJhd2luZ0J1ZmZlcldpZHRoLG49bnx8ci5kcmF3aW5nQnVmZmVySGVpZ2h0LGU9ZXx8ZGY7Y29uc3Qgcz1bXSxhPXtmcmFtZWJ1ZmZlcjppLGF0dGFjaG1lbnRzOltdLHdpZHRoOnQsaGVpZ2h0Om59O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24odSxmKXtsZXQgZD11LmF0dGFjaG1lbnQ7Y29uc3QgcD11LnNhbXBsZXMsZz11LmZvcm1hdDtsZXQgYj11LmF0dGFjaG1lbnRQb2ludHx8aGYoZyx1LmludGVybmFsRm9ybWF0KTtpZihifHwoYj1DcitmKSxnZihiKSYmcy5wdXNoKGIpLCFkKWlmKHAhPT12b2lkIDB8fG1mKGcpKWQ9ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxyLmJpbmRSZW5kZXJidWZmZXIoVXQsZCkscD4xP3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKFV0LHAsZyx0LG4pOnIucmVuZGVyYnVmZmVyU3RvcmFnZShVdCxnLHQsbik7ZWxzZXtjb25zdCBoPU9iamVjdC5hc3NpZ24oe30sdSk7aC53aWR0aD10LGguaGVpZ2h0PW4saC5hdXRvPT09dm9pZCAwJiYoaC5hdXRvPSExLGgubWluPWgubWlufHxoLm1pbk1hZ3x8T3IsaC5tYWc9aC5tYWd8fGgubWluTWFnfHxPcixoLndyYXBTPWgud3JhcFN8fGgud3JhcHx8TXIsaC53cmFwVD1oLndyYXBUfHxoLndyYXB8fE1yKSxkPVduKHIsaCl9aWYod3MocixkKSlyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKG8sYixVdCxkKTtlbHNlIGlmKGRyKHIsZCkpdS5sYXllciE9PXZvaWQgMD9yLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKG8sYixkLHUubGV2ZWx8fDAsdS5sYXllcik6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChvLGIsdS50YXJnZXR8fGVmLGQsdS5sZXZlbHx8MCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gYXR0YWNobWVudCB0eXBlIik7YS5hdHRhY2htZW50cy5wdXNoKGQpfSksci5kcmF3QnVmZmVycyYmci5kcmF3QnVmZmVycyhzKSxhfWZ1bmN0aW9uIHlmKHIsZSx0KXt0PXR8fEVvLGU/KHIuYmluZEZyYW1lYnVmZmVyKHQsZS5mcmFtZWJ1ZmZlciksci52aWV3cG9ydCgwLDAsZS53aWR0aCxlLmhlaWdodCkpOihyLmJpbmRGcmFtZWJ1ZmZlcih0LG51bGwpLHIudmlld3BvcnQoMCwwLHIuZHJhd2luZ0J1ZmZlcldpZHRoLHIuZHJhd2luZ0J1ZmZlckhlaWdodCkpfWZ1bmN0aW9uIEkocixlKXtyZXR1cm4oKT0+ZSBpbnN0YW5jZW9mIFdlYkdMVGV4dHVyZT9lOlduKHIse3NyYzplLHdyYXA6ci5DTEFNUF9UT19FREdFfSl9Y29uc3QgT2U9MjtjbGFzcyBFZXtjb25zdHJ1Y3RvcihlKXtsKHRoaXMsImlkIiwiXyIpO2wodGhpcywiY29udGV4dCIpO2wodGhpcywib3V0cHV0Iik7bCh0aGlzLCJmYmkiKTtsKHRoaXMsIm9wdGlvbnMiKTtsKHRoaXMsInByb2dyYW1JbmZvIik7bCh0aGlzLCJidWZmZXJJbmZvIik7bCh0aGlzLCJwcm9maWxlciIpO2wodGhpcywibGFzdFJ1biIpO2NvbnN0e2NvbnRleHQ6dCx3aWR0aDpuLGhlaWdodDpvfT1lO3RoaXMuY29udGV4dD10LHRoaXMub3B0aW9ucz1lO2NvbnN0IGk9dGhpcy5idWlsZERlZmluZXMoKTt0aGlzLnByb2dyYW1JbmZvPUtjKHRoaXMuY29udGV4dCxbaSt0aGlzLmdldFZlcnRleFNoYWRlcigpLGkrdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpXSksdGhpcy5idWZmZXJJbmZvPVhzKHRoaXMuY29udGV4dCx0aGlzLmdldEJ1ZmZlcnMoKSksdGhpcy5mYmk9THQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLG4sbyksdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF19cmVzaXplT3V0cHV0KGUsdCl7dGhpcy5mYmk9THQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLGUsdCksdGhpcy5vcHRpb25zLndpZHRoPWUsdGhpcy5vcHRpb25zLmhlaWdodD10LHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdfWdldERlZmluZXMoKXtyZXR1cm57fX1nZXRCdWZmZXJzKCl7cmV0dXJue3Bvc2l0aW9uOntudW1Db21wb25lbnRzOjIsZGF0YTpbLTEsLTEsLTEsMSwxLC0xLDEsMSwtMSwxLDEsLTFdfSx0ZXh0dXJlX2Nvb3JkOntudW1Db21wb25lbnRzOjIsZGF0YTpbMCwwLDAsMSwxLDAsMSwxLDAsMSwxLDBdfX19YnVpbGREZWZpbmVzKCl7bGV0IGU9IiI7Y29uc3QgdD10aGlzLmdldERlZmluZXMoKTtmb3IobGV0IG4gaW4gdCllKz1gI2RlZmluZSAke259ICR7dFtuXS50b0ZpeGVkKDEpfQpgO3JldHVybiBlfXJ1bihlKXt2YXIgbyxpLHMsYSx1LGY7KG89dGhpcy5wcm9maWxlcik9PW51bGx8fG8ucHVzaENvbnRleHQoYFske3RoaXMuaWR9XSBQUk9HIDogJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YCksKGk9dGhpcy5wcm9maWxlcik9PW51bGx8fGkucHVzaENvbnRleHQoYFske3RoaXMuaWR9XSBVTklGT1JNU2ApO2Zvcihjb25zdCBkIGluIGUpdHlwZW9mIGVbZF09PSJmdW5jdGlvbiImJigocz10aGlzLnByb2ZpbGVyKT09bnVsbHx8cy5wdXNoQ29udGV4dChgWyR7dGhpcy5pZH1dIFVOSSA6ICR7ZH1gKSxlW2RdPWVbZF0oKSwoYT10aGlzLnByb2ZpbGVyKT09bnVsbHx8YS5wb3BDb250ZXh0KGBbJHt0aGlzLmlkfV0gVU5JIDogJHtkfWApKTsodT10aGlzLnByb2ZpbGVyKT09bnVsbHx8dS5wb3BDb250ZXh0KGBbJHt0aGlzLmlkfV0gVU5JRk9STVNgKTtjb25zdCB0PURhdGUubm93KCk7bGV0IG49MDt0aGlzLmxhc3RSdW4mJihuPSh0LXRoaXMubGFzdFJ1bikvMWUzKSx0aGlzLmxhc3RSdW49dCx0aGlzLmNvbnRleHQudmlld3BvcnQoMCwwLHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQpLHRoaXMuY29udGV4dC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbUluZm8ucHJvZ3JhbSksUWModGhpcy5jb250ZXh0LHRoaXMucHJvZ3JhbUluZm8sdGhpcy5idWZmZXJJbmZvKSx4byh0aGlzLnByb2dyYW1JbmZvLHtkZWx0YTpuLGNhbnZhczpbdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCx0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodF0sLi4uZX0pLHlmKHRoaXMuY29udGV4dCx0aGlzLm9wdGlvbnMuZGlzYWJsZUZyYW1lYnVmZmVyP251bGw6dGhpcy5mYmkpLFpjKHRoaXMuY29udGV4dCx0aGlzLmJ1ZmZlckluZm8pLChmPXRoaXMucHJvZmlsZXIpPT1udWxsfHxmLnBvcENvbnRleHQoYFske3RoaXMuaWR9XSBQUk9HIDogJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YCl9c2V0UHJvZmlsZXIoZSl7dGhpcy5wcm9maWxlcj1lfX12YXIgYmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSBzYW1wbGVyMkQgYmFja2dyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgZm9yZWdyb3VuZDsKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwoKdm9pZCBtYWluKCkgewogIHZlYzQgYmFja2dyb3VuZENvbG9yID0gdGV4dHVyZTJEKGJhY2tncm91bmQsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IGZvcmVncm91bmRDb2xvciA9IHRleHR1cmUyRChmb3JlZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCB0cmVzaG9sZENvbG9yID0gdGV4dHVyZTJEKHRocmVzaG9sZCwgX3RleHR1cmVfY29vcmQpOwogIGdsX0ZyYWdDb2xvciA9IGZvcmVncm91bmRDb2xvciAqIHRyZXNob2xkQ29sb3IuYSArCiAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yICogKDEuIC0gdHJlc2hvbGRDb2xvci5hKTsKfQpgLHhmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwogIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKfQpgO2NsYXNzIFVyIGV4dGVuZHMgRWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gYmZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIHhmfX1jbGFzcyBOcntjb25zdHJ1Y3Rvcigpe2wodGhpcywic3RlcHMiLFtdKTtsKHRoaXMsInByb2ZpbGVyIil9YWRkU3RlcChlKXt0aGlzLnN0ZXBzLnB1c2goZSl9YXN5bmMgcnVuKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVwcyllLnByb2dyYW0ucnVuKGUuZ2V0VW5pZm9ybXMoKSl9cmVzaXplT3V0cHV0KGUsdCl7dmFyIG4sbzsobj10aGlzLnByb2ZpbGVyKT09bnVsbHx8bi5wdXNoQ29udGV4dChgUElQIFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dYCk7Zm9yKGNvbnN0IGkgb2YgdGhpcy5zdGVwcylpLnByZXZlbnRSZXNpemV8fGkucHJvZ3JhbS5yZXNpemVPdXRwdXQoZSx0KTsobz10aGlzLnByb2ZpbGVyKT09bnVsbHx8by5wb3BDb250ZXh0KGBQSVAgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV1gKX1zZXRQcm9maWxlcihlKXt0aGlzLnByb2ZpbGVyPWU7Zm9yKGNvbnN0IHQgb2YgdGhpcy5zdGVwcyl0LnByb2dyYW0uc2V0UHJvZmlsZXIoZSl9c2V0SWQoZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5zdGVwcyl0LnByb2dyYW0uaWQ9ZX19Y2xhc3MgTHIgZXh0ZW5kcyBOcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7bCh0aGlzLCJwcmVjaXNlTWFza0VuYWJsZWQiLCExKX19Y2xhc3MgU28gZXh0ZW5kcyBMcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2wodGhpcywiaW5wdXRJbWFnZSIpO2wodGhpcywiaW5wdXRCYWNrZ3JvdW5kSW1hZ2UiKTtsKHRoaXMsImlucHV0TWFzayIpO2wodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMCk7dGhpcy5jb250ZXh0PXQ7Y29uc3Qgbj17Y29udGV4dDp0LGhlaWdodDp0LmNhbnZhcy5oZWlnaHQsd2lkdGg6dC5jYW52YXMud2lkdGh9LG89bmV3IFVyKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTpvLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6SSh0LHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6SSh0LHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOkkodCx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEodCxuKXt0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufX12YXIgX2Y9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOyB9CmAsdmY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIGJvb2wgaW52ZXJ0X3k7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBpZiAoaW52ZXJ0X3kpIHsKICAgIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKICB9Cn0KYDtjbGFzcyBFZiBleHRlbmRzIEVle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIF9mfWdldFZlcnRleFNoYWRlcigpe3JldHVybiB2Zn19Y2xhc3MgVGYgZXh0ZW5kcyBOcntjb25zdHJ1Y3Rvcih0LG4sbyl7c3VwZXIoKTtsKHRoaXMsImlucHV0SW1hZ2UiKTt0aGlzLmNvbnRleHQ9dDtjb25zdCBpPXtjb250ZXh0OnQsaGVpZ2h0Om8sd2lkdGg6bn07dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm5ldyBFZih7Li4uaSxkaXNhYmxlRnJhbWVidWZmZXI6ITB9KSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOkkodCx0aGlzLmlucHV0SW1hZ2UpLGludmVydF95OiEwfSl9KX1zZXREYXRhKHQpe3RoaXMuaW5wdXRJbWFnZT10fX1hc3luYyBmdW5jdGlvbiBSbyhyKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3NldFRpbWVvdXQoKCk9PntlKCl9LHIpfSl9dmFyIHdmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2ZWM0IGxvb3AoKTsKCnZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gbG9vcCgpOyB9CmAsQWY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYCx6cj0ocj0+KHJbci5MSU5FQVI9MF09IkxJTkVBUiIscltyLkdBVVNTSUFOPTFdPSJHQVVTU0lBTiIscikpKHpyfHx7fSk7Y2xhc3MgRm8gZXh0ZW5kcyBFZXtnZXREZWZpbmVzKCl7dmFyIGU7cmV0dXJue1JBRElVUzooZT10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD9lOjF9fWdldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHdmK3RoaXMuY3JlYXRlTG9vcEZ1bmN0aW9uKCl9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIEFmfWNyZWF0ZUxvb3BGdW5jdGlvbigpe3ZhciB0O2xldCBlPSh0PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3Q6MTtyZXR1cm5gCgogICAgICAgIHZlYzQgbG9vcCgpIHsgCiAgICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLDAsMCwwKTsKICAgICAgICAgICAgZmxvYXQgZmFjdG9yU3VtID0gMC47CgogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRSYWRpdXMgPSB2ZWMyKC0ke2V9LikgLyBjYW52YXM7CiAgICAgICAgICAgIHZlYzIgbm9ybWFsaXplZEluY3JlbWVudCA9IHZlYzIoMS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIGRpZmYgPSBub3JtYWxpemVkUmFkaXVzOwoKICAgICAgICAgICAgZm9yKGludCB5PS0ke2V9OyB5PCR7ZSsxfTsgKyt5KSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHg9LSR7ZX07IHg8JHtlKzF9OyArK3gpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAxLjsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZmFjdG9yICogdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkICsgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgZmFjdG9yU3VtICs9IGZhY3RvcjsKICAgICAgICAgICAgICAgICAgICBkaWZmLnggKz0gbm9ybWFsaXplZEluY3JlbWVudC54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlmZi55ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueTsKICAgICAgICAgICAgICAgIGRpZmYueCA9IG5vcm1hbGl6ZWRSYWRpdXMueDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IC8gZmFjdG9yU3VtOwogICAgICAgIH1gfWdldEZhY3RvcihlLHQpe3N3aXRjaCh0aGlzLm9wdGlvbnMudHlwZSl7Y2FzZSAxOnJldHVybiB0aGlzLmdldExpbmVhckZhY3RvcihlLHQpO2Nhc2UgMDpkZWZhdWx0OnJldHVybiB0aGlzLmdldExpbmVhckZhY3RvcihlLHQpfX1nZXRMaW5lYXJGYWN0b3IoZSx0KXtyZXR1cm4gMX1nZXRHYXVzc2lhbkZhY3RvcihlLHQpe3ZhciB1O2NvbnN0IG49TWF0aC5QSSoyLG89TWF0aC5tYXgoKHU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/dToxLDEpLGk9MS8obipvKioyKSxzPS0oZSoqMit0KioyKSxhPWkqcztyZXR1cm4gaSpNYXRoLkUqKmF9fWNsYXNzIEdyIGV4dGVuZHMgRWV7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7bCh0aGlzLCJmYmkyIik7dGhpcy5mYmkyPUx0KHQuY29udGV4dCxbe2Zvcm1hdDp0LmNvbnRleHQuUkdCQSx0eXBlOnQuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0LmNvbnRleHQuTElORUFSLG1hZzp0LmNvbnRleHQuTElORUFSLHdyYXA6dC5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSx0LndpZHRoLHQuaGVpZ2h0KX1ydW4odCl7Y29uc3Qgbj10aGlzLmZiaTt0aGlzLmZiaT10aGlzLmZiaTIsdGhpcy5mYmkyPW4sdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF0sc3VwZXIucnVuKHsuLi50LHByZXZpb3VzX3JlbmRlcmluZzp0aGlzLmZiaTIuYXR0YWNobWVudHNbMF19KX1yZXNpemVPdXRwdXQodCxuKXtzdXBlci5yZXNpemVPdXRwdXQodCxuKSx0aGlzLmZiaTI9THQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLHQsbil9fXZhciBJZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgovLyB1bmlmb3JtIGZsb2F0IHRyZXNob2xkOwp1bmlmb3JtIHNhbXBsZXIyRCBpbWFnZV9ub3c7CnVuaWZvcm0gc2FtcGxlcjJEIGltYWdlX2JlZm9yZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFza19ub3c7CnVuaWZvcm0gc2FtcGxlcjJEIG1hc2tfYmVmb3JlOwp1bmlmb3JtIHNhbXBsZXIyRCBwcmV2aW91c19yZW5kZXJpbmc7CnVuaWZvcm0gdmVjMiBjYW52YXM7Cgp1bmlmb3JtIGZsb2F0IGRlbHRhOwoKZmxvYXQgY3VycmVudF9mYWN0b3IgPSAwLjY5OwpmbG9hdCBwcmV2aW91c19mYWN0b3IgPSAwLjc0OwpmbG9hdCB0aHJlc2hvbGRfYWN0aXZhdGlvbiA9IDAuNTQ7CgpmbG9hdCBtYXAoZmxvYXQgdmFsdWUsIGZsb2F0IG1pbjEsIGZsb2F0IG1heDEsIGZsb2F0IG1pbjIsIGZsb2F0IG1heDIpIHsKICByZXR1cm4gbWluMiArICh2YWx1ZSAtIG1pbjEpICogKG1heDIgLSBtaW4yKSAvIChtYXgxIC0gbWluMSk7Cn0KCmZsb2F0IGdldFRocmVzaG9sZCgpIHsKICB2ZWM0IGNvbG9yID0gdmVjNCgwLik7CiAgZm9yIChmbG9hdCB5ID0gLTYuOyB5IDwgNy47IHkgKz0gMS4pIHsKICAgIGZvciAoZmxvYXQgeCA9IC02LjsgeCA8IDcuOyB4ICs9IDEuKSB7CiAgICAgIHZlYzQgaW1hZ2Vfbm93X2NvbG9yID0KICAgICAgICAgIHRleHR1cmUyRChpbWFnZV9ub3csIF90ZXh0dXJlX2Nvb3JkICsgdmVjMih4LCB5KSAvIGNhbnZhcyk7CiAgICAgIHZlYzQgaW1hZ2VfYmVmb3JlX2NvbG9yID0KICAgICAgICAgIHRleHR1cmUyRChpbWFnZV9iZWZvcmUsIF90ZXh0dXJlX2Nvb3JkICsgdmVjMih4LCB5KSAvIGNhbnZhcyk7CiAgICAgIGNvbG9yICs9IGFicyhpbWFnZV9iZWZvcmVfY29sb3IgLSBpbWFnZV9ub3dfY29sb3IpOwogICAgfQogIH0KICByZXR1cm4gKGNvbG9yLnggKyBjb2xvci55ICsgY29sb3IueikgLyAoMy4gKiA5Lik7Cn0KCnZvaWQgbWFpbigpIHsKICBmbG9hdCB0cmVzaG9sZF9pbnB1dCA9IC40OwogIGZsb2F0IHRyZXNob2xkX3ByZXZpb3VzX3JlbmRlcmluZyA9IC45ODsKCiAgdmVjNCBtYXNrX25vd19jb2xvciA9IHRleHR1cmUyRChtYXNrX25vdywgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgbWFza19iZWZvcmVfY29sb3IgPSB0ZXh0dXJlMkQobWFza19iZWZvcmUsIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IHByZXZpb3VzX3JlbmRlcmluZ19jb2xvciA9IHRleHR1cmUyRChwcmV2aW91c19yZW5kZXJpbmcsIF90ZXh0dXJlX2Nvb3JkKTsKCiAgdmVjMyBtYXNrX2RpZmYgPSBhYnMobWFza19iZWZvcmVfY29sb3IueHl6IC0gbWFza19ub3dfY29sb3IueHl6KTsKICBmbG9hdCBmbGlja2VyaW5nID0gbWFza19kaWZmLng7CiAgZmxvYXQgdGhyZXNob2xkID0gZ2V0VGhyZXNob2xkKCk7CiAgaWYgKHRocmVzaG9sZCA8IHRocmVzaG9sZF9hY3RpdmF0aW9uKSB7CiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGZsaWNrZXJpbmcsIDAuLCAwLiwgMS4pICogY3VycmVudF9mYWN0b3IgKwogICAgICAgICAgICAgICAgICAgcHJldmlvdXNfcmVuZGVyaW5nX2NvbG9yICogcHJldmlvdXNfZmFjdG9yOwogICAgZ2xfRnJhZ0NvbG9yICo9ICgxLiAtIHRocmVzaG9sZCk7CiAgfQp9CmAsU2Y9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBSZiBleHRlbmRzIEdye2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIElmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBTZn19dmFyIEZmPWAjdmVyc2lvbiAzMDAgZXMKLy8gaHR0cHM6Ly9naXRodWIuY29tL1ZvbGNvbWl4L3ZpcnR1YWwtYmFja2dyb3VuZC9ibG9iL21haW4vc3JjL3BpcGVsaW5lcy93ZWJnbDIvam9pbnRCaWxhdGVyYWxGaWx0ZXJTdGFnZS50cwoKcHJlY2lzaW9uIGhpZ2hwIGZsb2F0Owp1bmlmb3JtIHNhbXBsZXIyRCBpbnB1dF9mcmFtZTsKdW5pZm9ybSBzYW1wbGVyMkQgc2VnbWVudGF0aW9uX21hc2s7CnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKdW5pZm9ybSB2ZWMyIHRleGVsX3NpemU7CnVuaWZvcm0gZmxvYXQgc3RlcDsKdW5pZm9ybSBmbG9hdCByYWRpdXM7CnVuaWZvcm0gZmxvYXQgb2Zmc2V0Owp1bmlmb3JtIGZsb2F0IHNpZ21hX3RleGVsOwp1bmlmb3JtIGZsb2F0IHNpZ21hX2NvbG9yOwoKaW4gdmVjMiBfdGV4dHVyZV9jb29yZDsKb3V0IHZlYzQgb3V0Q29sb3I7CgpmbG9hdCBnYXVzc2lhbihmbG9hdCB4LCBmbG9hdCBzaWdtYSkgewogIGZsb2F0IGNvZWZmID0gLTAuNSAvIChzaWdtYSAqIHNpZ21hICogNC4wICsgMS4wZS02KTsKICByZXR1cm4gZXhwKCh4ICogeCkgKiBjb2VmZik7Cn0KCnZvaWQgbWFpbigpIHsKICB2ZWMyIGNlbnRlckNvb3JkID0gX3RleHR1cmVfY29vcmQ7CiAgdmVjMyBjZW50ZXJDb2xvciA9IHRleHR1cmUoaW5wdXRfZnJhbWUsIGNlbnRlckNvb3JkKS5yZ2I7CiAgZmxvYXQgbmV3VmFsID0gMC4wOwogIGZsb2F0IHNwYWNlV2VpZ2h0ID0gMC4wOwogIGZsb2F0IGNvbG9yV2VpZ2h0ID0gMC4wOwogIGZsb2F0IHRvdGFsV2VpZ2h0ID0gMC4wOwogIC8vIFN1YnNhbXBsZSBrZXJuZWwgc3BhY2UuCiAgZm9yIChmbG9hdCBpID0gLXJhZGl1cyArIG9mZnNldDsgaSA8PSByYWRpdXM7IGkgKz0gc3RlcCkgewogICAgZm9yIChmbG9hdCBqID0gLXJhZGl1cyArIG9mZnNldDsgaiA8PSByYWRpdXM7IGogKz0gc3RlcCkgewogICAgICB2ZWMyIHNoaWZ0ID0gdmVjMihqLCBpKSAqIHRleGVsX3NpemU7CiAgICAgIHZlYzIgY29vcmQgPSB2ZWMyKGNlbnRlckNvb3JkICsgc2hpZnQpOwogICAgICB2ZWMzIGZyYW1lQ29sb3IgPSB0ZXh0dXJlKGlucHV0X2ZyYW1lLCBjb29yZCkucmdiOwogICAgICBmbG9hdCB0aHJlc2hvbGQgPSB0ZXh0dXJlKHRocmVzaG9sZCwgY29vcmQpLmE7CiAgICAgIGZsb2F0IG91dFZhbCA9IHRleHR1cmUoc2VnbWVudGF0aW9uX21hc2ssIGNvb3JkKS5hOwoKICAgICAgc3BhY2VXZWlnaHQgPSBnYXVzc2lhbihkaXN0YW5jZShjZW50ZXJDb29yZCwgY29vcmQpLCBzaWdtYV90ZXhlbCk7CiAgICAgIGNvbG9yV2VpZ2h0ID0gZ2F1c3NpYW4oZGlzdGFuY2UoY2VudGVyQ29sb3IsIGZyYW1lQ29sb3IpLCBzaWdtYV9jb2xvcik7CiAgICAgIHRvdGFsV2VpZ2h0ICs9IHNwYWNlV2VpZ2h0ICogY29sb3JXZWlnaHQ7CiAgICAgIG5ld1ZhbCArPSBzcGFjZVdlaWdodCAqIGNvbG9yV2VpZ2h0ICogb3V0VmFsICogdGhyZXNob2xkOwogICAgfQogIH0KICBuZXdWYWwgLz0gdG90YWxXZWlnaHQ7CiAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4pLCBuZXdWYWwpOwp9YCxQZj1gI3ZlcnNpb24gMzAwIGVzCmluIHZlYzIgcG9zaXRpb247CmluIHZlYzIgdGV4dHVyZV9jb29yZDsKb3V0IHZlYzIgX3RleHR1cmVfY29vcmQ7CnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn1gO2NsYXNzIGtmIGV4dGVuZHMgRWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gRmZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIFBmfX12YXIgRGY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKCnZvaWQgbWFpbigpIHsKICBpbnQgY291bnQgPSAwOwogIGZvciAoZmxvYXQgeSA9IC0xLjsgeSA8IDIuOyB5ICs9IDEuKSB7CiAgICBmb3IgKGZsb2F0IHggPSAtMS47IHggPCAyLjsgeCArPSAxLikgewogICAgICB2ZWMyIGNvb3JkID0gX3RleHR1cmVfY29vcmQgKyB2ZWMyKHksIHgpIC8gY2FudmFzOwogICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIGNvb3JkKTsKICAgICAgaWYgKGNvbG9yLnIgPiAuMSkgewogICAgICAgIGNvdW50Kys7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGNvdW50ID4gNSkgewogICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkKTsKICB9Cn0KYCxDZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIEJmIGV4dGVuZHMgRWV7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gRGZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIENmfX12YXIgTWY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIF90ZXh0dXJlX2Nvb3JkKTsKICBmb3IgKGZsb2F0IHkgPSAtMi47IHkgPCAzLjsgeSArPSAxLikgewogICAgZm9yIChmbG9hdCB4ID0gLTIuOyB4IDwgMy47IHggKz0gMS4pIHsKICAgICAgdmVjMiBjb29yZCA9IF90ZXh0dXJlX2Nvb3JkOwogICAgICBjb29yZCArPSB2ZWMyKHksIHgpIC8gY2FudmFzOwogICAgICBjb2xvciArPSB0ZXh0dXJlMkQodGV4dHVyZSwgY29vcmQpICogKDEuIC8gNC4pOwogICAgfQogIH0KCiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7Cn0KYCxPZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIFVmIGV4dGVuZHMgR3J7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gTWZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIE9mfX12YXIgTmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSBzYW1wbGVyMkQgdGhyZXNob2xkOwp1bmlmb3JtIHNhbXBsZXIyRCBpbnB1dHM7Cgp2b2lkIG1haW4oKSB7CiAgdmVjNCBpbnB1dHNfY29sb3IgPSB0ZXh0dXJlMkQoaW5wdXRzLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCB0aHJlc2hvbGRfY29sb3IgPSB0ZXh0dXJlMkQodGhyZXNob2xkLCBfdGV4dHVyZV9jb29yZCk7CiAgaWYgKHRocmVzaG9sZF9jb2xvci5yIDwgLjEgJiYgaW5wdXRzX2NvbG9yLnIgPiAuNSkgewogICAgZ2xfRnJhZ0NvbG9yID0gaW5wdXRzX2NvbG9yOwogIH0KfQpgLExmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3MgemYgZXh0ZW5kcyBHcntnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBOZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gTGZ9fWNsYXNzIEdmIGV4dGVuZHMgTnJ7Y29uc3RydWN0b3IodCxuLG8pe3N1cGVyKCk7bCh0aGlzLCJpbnB1dEltYWdlIik7bCh0aGlzLCJpbnB1dE1hc2siKTtsKHRoaXMsInByZXZpb3VzSW5wdXRJbWFnZSIpO2wodGhpcywicHJldmlvdXNJbnB1dE1hc2siKTtsKHRoaXMsIm91dHB1dCIpO2wodGhpcywib3B0aW9ucyIse2N1cnJlbnRUaHJlc2hvbGRNaW5pbXVtOjAsY3VycmVudFRocmVzaG9sZE1heGltdW06MSxwcmV2aW91c1RocmVzaG9sZE1pbmltdW06MCxwcmV2aW91c1RocmVzaG9sZE1heGltdW06MSx0aHJlc2hvbGRNaW5pbXVtOjAsdGhyZXNob2xkTWF4aW11bToxLHRocmVzaG9sZEZhY3RvcjoxfSk7bCh0aGlzLCJqb2ludEJpbGF0ZXJhbCIpO3RoaXMuY29udGV4dD10O2NvbnN0IGk9e2NvbnRleHQ6dCxoZWlnaHQ6byx3aWR0aDpufSxzPW5ldyBSZihpKSxhPW5ldyBGbyh7Li4uaSxyYWRpdXM6MSx0eXBlOnpyLkdBVVNTSUFOfSksdT1uZXcgemYoaSksZj1uZXcgVWYoaSksZD1uZXcgQmYoaSk7dGhpcy5qb2ludEJpbGF0ZXJhbD1uZXcga2YoaSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOnMsZ2V0VW5pZm9ybXM6KCk9Pih7aW1hZ2Vfbm93OkkodCx0aGlzLmlucHV0SW1hZ2UpLGltYWdlX2JlZm9yZTpJKHQsdGhpcy5wcmV2aW91c0lucHV0SW1hZ2UpLG1hc2tfbm93OkkodCx0aGlzLmlucHV0TWFzayksbWFza19iZWZvcmU6SSh0LHRoaXMucHJldmlvdXNJbnB1dE1hc2spLGN1cnJlbnRfdGhyZXNob2xkX21pbmltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNaW5pbXVtLGN1cnJlbnRfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNYXhpbXVtLHByZXZpb3VzX3RocmVzaG9sZF9taW5pbXVtOnRoaXMub3B0aW9ucy5wcmV2aW91c1RocmVzaG9sZE1pbmltdW0scHJldmlvdXNfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLnByZXZpb3VzVGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfbWluaW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWluaW11bSx0aHJlc2hvbGRfbWF4aW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfZmFjdG9yOnRoaXMub3B0aW9ucy50aHJlc2hvbGRGYWN0b3J9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTp1LGdldFVuaWZvcm1zOigpPT4oe2lucHV0czpJKHQsdGhpcy5pbnB1dE1hc2spLHRocmVzaG9sZDpJKHQscy5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06ZCxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOkkodCx1Lm91dHB1dCl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpmLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6SSh0LGQub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmEsZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpJKHQsZi5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06dGhpcy5qb2ludEJpbGF0ZXJhbCxnZXRVbmlmb3JtczooKT0+e3ZhciBHLHosSCwkLEtlLFRlLGxlLFc7Y29uc3QgZz0oej0oRz10aGlzLmlucHV0SW1hZ2UpPT1udWxsP3ZvaWQgMDpHLndpZHRoKSE9bnVsbD96OjEsYj0oJD0oSD10aGlzLmlucHV0SW1hZ2UpPT1udWxsP3ZvaWQgMDpILmhlaWdodCkhPW51bGw/JDoxLGg9KFRlPShLZT10aGlzLmlucHV0TWFzayk9PW51bGw/dm9pZCAwOktlLndpZHRoKSE9bnVsbD9UZToxLHg9KFc9KGxlPXRoaXMuaW5wdXRNYXNrKT09bnVsbD92b2lkIDA6bGUuaGVpZ2h0KSE9bnVsbD9XOjEsRT1NYXRoLm1heChnL2gsYi94KSx2PU1hdGgubWF4KDEsTWF0aC5zcXJ0KEUpKi42NiksRj0xL2csaz0xL2I7cmV0dXJue2lucHV0X2ZyYW1lOkkodCx0aGlzLmlucHV0SW1hZ2UpLHNlZ21lbnRhdGlvbl9tYXNrOkkodCx0aGlzLmlucHV0TWFzayksdGhyZXNob2xkOkkodCxhLm91dHB1dCksdGV4ZWxfc2l6ZTpbRixrXSxzdGVwOnYscmFkaXVzOkUsb2Zmc2V0OnY+MT92Ki41OjAsc2lnbWFfdGV4ZWw6TWF0aC5tYXgoRixrKSpFLHNpZ21hX2NvbG9yOi4xfX19KSx0aGlzLm91dHB1dD10aGlzLmpvaW50QmlsYXRlcmFsLm91dHB1dH1zZXREYXRhKHQsbil7dGhpcy5wcmV2aW91c0lucHV0SW1hZ2U9dGhpcy5pbnB1dEltYWdlP3RoaXMuaW5wdXRJbWFnZTp0LHRoaXMucHJldmlvdXNJbnB1dE1hc2s9dGhpcy5pbnB1dE1hc2s/dGhpcy5pbnB1dE1hc2s6bix0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufXNldE9wdGlvbnModCl7dGhpcy5vcHRpb25zPXR9cmVzaXplT3V0cHV0KHQsbil7c3VwZXIucmVzaXplT3V0cHV0KHQsbiksdGhpcy5vdXRwdXQ9dGhpcy5qb2ludEJpbGF0ZXJhbC5vdXRwdXR9fWNsYXNzICRme2NvbnN0cnVjdG9yKGUpe2wodGhpcywiY29udGV4dCIpO2wodGhpcywiZXh0ZW5zaW9uIik7bCh0aGlzLCJxdWVyaWVzIixbXSk7bCh0aGlzLCJhY3RpdmVRdWVyeSIpO3RoaXMuY29udGV4dD1lLHRoaXMuZXh0ZW5zaW9uPWUuZ2V0RXh0ZW5zaW9uKCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIil9c3RhcnQoKXt9c3RvcCgpe3RoaXMuYWN0aXZlUXVlcnkmJnRoaXMuY29udGV4dC5lbmRRdWVyeSh0aGlzLmV4dGVuc2lvbi5USU1FX0VMQVBTRURfRVhUKX1wdXNoQ29udGV4dChlKXt0aGlzLmNyZWF0ZVF1ZXJ5KCJQVVNIIixlKX1wb3BDb250ZXh0KGUpe3RoaXMuY3JlYXRlUXVlcnkoIlBPUCIsZSl9Y3JlYXRlUXVlcnkoZSx0KXt0aGlzLmFjdGl2ZVF1ZXJ5JiZ0aGlzLmNvbnRleHQuZW5kUXVlcnkodGhpcy5leHRlbnNpb24uVElNRV9FTEFQU0VEX0VYVCksdGhpcy5hY3RpdmVRdWVyeT10aGlzLmNvbnRleHQuY3JlYXRlUXVlcnkoKSx0aGlzLmNvbnRleHQuYmVnaW5RdWVyeSh0aGlzLmV4dGVuc2lvbi5USU1FX0VMQVBTRURfRVhULHRoaXMuYWN0aXZlUXVlcnkpLHRoaXMucXVlcmllcy5wdXNoKHtuYW1lOnQsYWN0aW9uOmUscXVlcnk6dGhpcy5hY3RpdmVRdWVyeX0pfWFzeW5jIGdldFJlc29sdmVkUXVlcmllcygpe2NvbnN0IGU9KGF3YWl0IFByb21pc2UuYWxsKFsuLi50aGlzLnF1ZXJpZXNdLm1hcCh0PT50aGlzLnJlc29sdmVRdWVyeSh0KSkpKS5maWx0ZXIodD0+dCk7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDsrK3QpZVt0XS50aW1lc3RhbXArPWVbdC0xXS5kdXJhdGlvbitlW3QtMV0udGltZXN0YW1wO3JldHVybiBlfWFzeW5jIHJlc29sdmVRdWVyeShlKXtpZighYXdhaXQgdGhpcy5hd2FpdFF1ZXJ5QXZhaWxhYmxlKGUpKXtjb25zb2xlLmxvZygiVW5hd2FpdGFibGUgcXVlcnkiLGUpO3JldHVybn1pZih0aGlzLmNvbnRleHQuZ2V0UGFyYW1ldGVyKHRoaXMuZXh0ZW5zaW9uLkdQVV9ESVNKT0lOVF9FWFQpKXtjb25zb2xlLmxvZygiRGlzam9pbnRlZCBxdWVyeSIsZSk7cmV0dXJufXJldHVybnsuLi5lLGR1cmF0aW9uOnRoaXMuY29udGV4dC5nZXRRdWVyeVBhcmFtZXRlcihlLnF1ZXJ5LHRoaXMuY29udGV4dC5RVUVSWV9SRVNVTFQpLHRpbWVzdGFtcDowfX1hc3luYyBhd2FpdFF1ZXJ5QXZhaWxhYmxlKGUpe2ZvcihsZXQgdD0wO3Q8MTA7Kyt0KXtpZih0aGlzLmNvbnRleHQuZ2V0UXVlcnlQYXJhbWV0ZXIoZS5xdWVyeSx0aGlzLmNvbnRleHQuUVVFUllfUkVTVUxUX0FWQUlMQUJMRSkpcmV0dXJuIGU7YXdhaXQgUm8oMjAwKX19fWNsYXNzIHp0e2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJjYW52YXMiKTtsKHRoaXMsImNvbnRleHQiKTtsKHRoaXMsInBpcGVsaW5lIik7bCh0aGlzLCJwcmV2aW91c0ltYWdlV2lkdGgiLDApO2wodGhpcywicHJldmlvdXNJbWFnZUhlaWdodCIsMCk7bCh0aGlzLCJwcmV2aW91c01hc2tXaWR0aCIsT2UpO2wodGhpcywicHJldmlvdXNNYXNrSGVpZ2h0IixPZSk7bCh0aGlzLCJwcm9maWxlciIpO2wodGhpcywicG9zdFByb2Nlc3NpbmdFbmFibGVkIiwhMCk7bCh0aGlzLCJpbXByb3ZlTWFzayIpO2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHQ9ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiKTtpZighdCl0aHJvdyJGYWlsIHRvIHJldHJpZXZlIHdlYmdsMiBjb250ZXh0Ijt0aGlzLmNhbnZhcz1lLHRoaXMuY29udGV4dD10LHRoaXMuaW1wcm92ZU1hc2s9bmV3IEdmKHRoaXMuY29udGV4dCxPZSxPZSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dGhpcy5pbXByb3ZlTWFzay5zZXRPcHRpb25zKGUpfWVuYWJsZVBvc3RQcm9jZXNzaW5nKCl7dGhpcy5wb3N0UHJvY2Vzc2luZ0VuYWJsZWQ9ITB9ZGlzYWJsZVBvc3RQcm9jZXNzaW5nKCl7dGhpcy5wb3N0UHJvY2Vzc2luZ0VuYWJsZWQ9ITF9YXN5bmMgcHJvZmlsZVdlYmdsKGUpe2NvbnN0IHQ9bmV3ICRmKHRoaXMuY29udGV4dCk7cmV0dXJuIHRoaXMucHJvZmlsZXI9dCx0LnN0YXJ0KCksYXdhaXQgUm8oZSksdGhpcy5wcm9maWxlcj12b2lkIDAsdC5zdG9wKCksdC5nZXRSZXNvbHZlZFF1ZXJpZXMoKX1hc3luYyByZW5kZXIoZSx0KXt2YXIgaSxzO2lmKCF0aGlzLnBpcGVsaW5lKXRocm93Im1pc3NpbmcgcGlwZWxpbmUiOyh0aGlzLnByZXZpb3VzSW1hZ2VIZWlnaHQhPT1lLmhlaWdodHx8dGhpcy5wcmV2aW91c0ltYWdlV2lkdGghPT1lLndpZHRoKSYmdGhpcy5yZXNpemVPdXRwdXQoZS53aWR0aCxlLmhlaWdodCksKHRoaXMucHJldmlvdXNNYXNrSGVpZ2h0IT09dC5oZWlnaHR8fHRoaXMucHJldmlvdXNNYXNrV2lkdGghPT10LndpZHRoKSYmKHRoaXMuaW1wcm92ZU1hc2sucmVzaXplT3V0cHV0KHQud2lkdGgsdC5oZWlnaHQpLHRoaXMucHJldmlvdXNNYXNrV2lkdGg9dC53aWR0aCx0aGlzLnByZXZpb3VzTWFza0hlaWdodD10LmhlaWdodCk7Y29uc3Qgbj0icmVuZGVyZXIiOyhpPXRoaXMucHJvZmlsZXIpPT1udWxsfHxpLnB1c2hDb250ZXh0KG4pLHRoaXMuaW1wcm92ZU1hc2suc2V0UHJvZmlsZXIodGhpcy5wcm9maWxlciksdGhpcy5waXBlbGluZS5zZXRQcm9maWxlcih0aGlzLnByb2ZpbGVyKTtsZXQgbz10O3JldHVybiB0aGlzLnBvc3RQcm9jZXNzaW5nRW5hYmxlZCYmKHRoaXMuaW1wcm92ZU1hc2suc2V0RGF0YShlLHQpLHRoaXMuaW1wcm92ZU1hc2sucnVuKCksbz10aGlzLmltcHJvdmVNYXNrLm91dHB1dCksdGhpcy5waXBlbGluZS5zZXREYXRhKGUsbyksYXdhaXQgdGhpcy5waXBlbGluZS5ydW4oKSwocz10aGlzLnByb2ZpbGVyKT09bnVsbHx8cy5wb3BDb250ZXh0KG4pLHRoaXMuY2FudmFzfXJlc2l6ZU91dHB1dChlLHQpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXQsKG49dGhpcy5waXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsdCksdGhpcy5wcmV2aW91c0ltYWdlV2lkdGg9ZSx0aGlzLnByZXZpb3VzSW1hZ2VIZWlnaHQ9dH19Y2xhc3MgUG8gZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7bCh0aGlzLCJwaXBlbGluZSIpO2wodGhpcywiYmFja2dyb3VuZEltYWdlIik7bCh0aGlzLCJiYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzIik7bCh0aGlzLCJiYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ29udGV4dCIpO2wodGhpcywiYmFja2dyb3VuZEltYWdlUmVzaXplciIpO3RoaXMucGlwZWxpbmU9bmV3IFNvKHRoaXMuY29udGV4dCk7Y29uc3QgdD1uZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCksbj10LmdldENvbnRleHQoIndlYmdsMiIpO2lmKCFuKXRocm93IkZhaWwgdG8gcmV0cmlldmUgd2ViZ2wgY29udGV4dCI7dGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzPXQsdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ29udGV4dD1uLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplcj1uZXcgVGYodGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ29udGV4dCwwLDApfXNldEJhY2tncm91bmRJbWFnZSh0KXt0aGlzLmJhY2tncm91bmRJbWFnZT10LHRoaXMudXBkYXRlQmFja2dyb3VuZEltYWdlKCl9dXBkYXRlQmFja2dyb3VuZEltYWdlKCl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09dGhpcy5jYW52YXM7dGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyLnJlc2l6ZU91dHB1dCh0LG4pLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplci5zZXREYXRhKHRoaXMuYmFja2dyb3VuZEltYWdlKSx0aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXIucnVuKCksdGhpcy5waXBlbGluZS5pbnB1dEJhY2tncm91bmRJbWFnZT10aGlzLmJhY2tncm91bmRJbWFnZVJlc2l6ZXJDYW52YXN9cmVzaXplT3V0cHV0KHQsbil7c3VwZXIucmVzaXplT3V0cHV0KHQsbiksdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzLndpZHRoPXQsdGhpcy5iYWNrZ3JvdW5kSW1hZ2VSZXNpemVyQ2FudmFzLmhlaWdodD1uLHRoaXMuYmFja2dyb3VuZEltYWdlUmVzaXplci5yZXNpemVPdXRwdXQodCxuKSx0aGlzLnVwZGF0ZUJhY2tncm91bmRJbWFnZSgpfX1jbGFzcyBXZiBleHRlbmRzIFBve2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtsKHRoaXMsImZyYW1lUmVhZGVyIil9c2V0QmFja2dyb3VuZFZpZGVvKHQpe3RoaXMuZnJhbWVSZWFkZXI9dH1hc3luYyByZW5kZXIodCxuKXtyZXR1cm4gYXdhaXQgdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSxzdXBlci5yZW5kZXIodCxuKX1hc3luYyByZWFkTmV4dFZpZGVvRnJhbWUoKXt2YXIgbjtjb25zdCB0PWF3YWl0KChuPXRoaXMuZnJhbWVSZWFkZXIpPT1udWxsP3ZvaWQgMDpuLnJlYWQoKSk7aWYodCE9bnVsbCYmdC52YWx1ZSl7Y29uc3Qgbz1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0LnZhbHVlKTt0aGlzLnNldEJhY2tncm91bmRJbWFnZShvKSx0LnZhbHVlLmNsb3NlKCl9fX1jbGFzcyBrb3tibHVyQmFja2dyb3VuZChlKXtyZXR1cm4gbmV3IGxzKGUpfWJsdXJTaWxob3VldHRlKGUpe3JldHVybiBuZXcgZHMoZSl9aW1hZ2VCYWNrZ3JvdW5kKCl7cmV0dXJuIG5ldyBoc312aWRlb0JhY2tncm91bmQoKXtyZXR1cm4gbmV3IFdmfX12YXIgVmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKCnZlYzQgbG9vcCgpOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSBsb29wKCk7IH0KYCxIZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIGpmIGV4dGVuZHMgRWV7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBWZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBIZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKICAgICAgICAgICAgZmxvYXQgbWF4TGVuZ3RoID0gbGVuZ3RoKG5vcm1hbGl6ZWRSYWRpdXMpOwoKICAgICAgICAgICAgZm9yKGludCB5PS0ke2V9OyB5PCR7ZSsxfTsgKyt5KSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHg9LSR7ZX07IHg8JHtlKzF9OyArK3gpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAoMS4tIHRleHR1cmUyRChtYXNrLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpLmEpICogKG1heExlbmd0aCAtIGxlbmd0aChkaWZmKSkgLyBtYXhMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH19Y29uc3QgWWY9MTAsWGY9MixRZj04O2NsYXNzIHFmIGV4dGVuZHMgTHJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpO2wodGhpcywiaW5wdXRJbWFnZSIpO2wodGhpcywiaW5wdXRNYXNrIik7bCh0aGlzLCJibHVyIik7dGhpcy5jb250ZXh0PXQsdGhpcy5yYWRpdXM9bjtjb25zdCBvPXtjb250ZXh0OnQsaGVpZ2h0OnQuY2FudmFzLmhlaWdodCx3aWR0aDp0LmNhbnZhcy53aWR0aH07dGhpcy5ibHVyPW5ldyBqZih7Li4ubyxyYWRpdXM6biwuLi50aGlzLmdldEJsdXJUZXh0dXJlU2l6ZSh0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpfSk7Y29uc3QgaT1uZXcgVXIoey4uLm8sZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOnRoaXMuYmx1cixwcmV2ZW50UmVzaXplOiEwLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6SSh0LHRoaXMuaW5wdXRJbWFnZSksbWFzazpJKHQsdGhpcy5pbnB1dE1hc2spfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06aSxnZXRVbmlmb3JtczooKT0+KHtiYWNrZ3JvdW5kOkkodCx0aGlzLmJsdXIub3V0cHV0KSxmb3JlZ3JvdW5kOkkodCx0aGlzLmlucHV0SW1hZ2UpLHRocmVzaG9sZDpJKHQsdGhpcy5pbnB1dE1hc2spfSl9KX1nZXRCbHVyVGV4dHVyZVNpemUodCxuKXtjb25zdCBvPXRoaXMucmFkaXVzPllmP1FmOlhmO3JldHVybnt3aWR0aDpNYXRoLm1heChPZSx0L28pLGhlaWdodDpNYXRoLm1heChPZSxuL28pfX1zZXREYXRhKHQsbil7dGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn1yZXNpemVPdXRwdXQodCxuKXtzdXBlci5yZXNpemVPdXRwdXQodCxuKTtjb25zdCBvPXRoaXMuZ2V0Qmx1clRleHR1cmVTaXplKHQsbik7dGhpcy5ibHVyLnJlc2l6ZU91dHB1dChvLndpZHRoLG8uaGVpZ2h0KX19Y2xhc3MgS2YgZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2wodGhpcywicGlwZWxpbmUiKTt0aGlzLnBpcGVsaW5lPW5ldyBxZih0aGlzLmNvbnRleHQsdCksdGhpcy5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKX19Y2xhc3MgSmYgZXh0ZW5kcyBMcntjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKCk7bCh0aGlzLCJpbnB1dEltYWdlIik7bCh0aGlzLCJpbnB1dE1hc2siKTt0aGlzLmNvbnRleHQ9dDtjb25zdCBvPXtjb250ZXh0OnQsaGVpZ2h0OnQuY2FudmFzLmhlaWdodCx3aWR0aDp0LmNhbnZhcy53aWR0aH0saT1uZXcgRm8oey4uLm8scmFkaXVzOm4sdHlwZTp6ci5HQVVTU0lBTn0pLHM9bmV3IFVyKHsuLi5vLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6SSh0LHRoaXMuaW5wdXRJbWFnZSl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6SSh0LHRoaXMuaW5wdXRJbWFnZSksZm9yZWdyb3VuZDpJKHQsaS5vdXRwdXQpLHRocmVzaG9sZDpJKHQsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKHQsbil7dGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn19Y2xhc3MgWmYgZXh0ZW5kcyB6dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2wodGhpcywicGlwZWxpbmUiKTt0aGlzLnBpcGVsaW5lPW5ldyBKZih0aGlzLmNvbnRleHQsdCksdGhpcy5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKX19Y2xhc3MgZWwgZXh0ZW5kcyBTb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7bCh0aGlzLCJmcmFtZVJlYWRlciIpO2wodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMCl9c2V0IHJlYWRlcih0KXt0aGlzLmZyYW1lUmVhZGVyPXR9YXN5bmMgcnVuKCl7dGhpcy5mcmFtZVJlYWRlciYmKGF3YWl0IHRoaXMucmVhZE5leHRWaWRlb0ZyYW1lKCksYXdhaXQgc3VwZXIucnVuKCkpfWFzeW5jIHJlYWROZXh0VmlkZW9GcmFtZSgpe3ZhciBuO2NvbnN0IHQ9YXdhaXQoKG49dGhpcy5mcmFtZVJlYWRlcik9PW51bGw/dm9pZCAwOm4ucmVhZCgpKTt0IT1udWxsJiZ0LnZhbHVlJiYodGhpcy5pbnB1dEJhY2tncm91bmRJbWFnZT1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0LnZhbHVlKSx0LnZhbHVlLmNsb3NlKCkpfX1jbGFzcyB0bCBleHRlbmRzIHp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtsKHRoaXMsInBpcGVsaW5lIik7dGhpcy5waXBlbGluZT1uZXcgZWwodGhpcy5jb250ZXh0KX1zZXRCYWNrZ3JvdW5kVmlkZW8odCl7dGhpcy5waXBlbGluZS5yZWFkZXI9dH19Y2xhc3MgRG97Ymx1ckJhY2tncm91bmQoZSl7cmV0dXJuIG5ldyBLZihlKX1ibHVyU2lsaG91ZXR0ZShlKXtyZXR1cm4gbmV3IFpmKGUpfWltYWdlQmFja2dyb3VuZCgpe3JldHVybiBuZXcgUG99dmlkZW9CYWNrZ3JvdW5kKCl7cmV0dXJuIG5ldyB0bH19Y2xhc3Mgcmx7Y29uc3RydWN0b3IoZSl7bCh0aGlzLCJmYWN0b3J5Iik7c3dpdGNoKGUpe2Nhc2UgeXQuQ0FOVkFTOnRoaXMuZmFjdG9yeT1uZXcga287YnJlYWs7Y2FzZSB5dC5XRUJHTDp0aGlzLmZhY3Rvcnk9bmV3IERvO2JyZWFrO2RlZmF1bHQ6Y29uc3QgdD1mcygpO3RoaXMuZmFjdG9yeT10LnN1cHBvcnRlZD9uZXcgRG86bmV3IGtvfX1ibHVyQmFja2dyb3VuZChlKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuYmx1ckJhY2tncm91bmQoZSl9Ymx1clNpbGhvdWV0dGUoZSl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJsdXJTaWxob3VldHRlKGUpfWltYWdlQmFja2dyb3VuZCgpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5pbWFnZUJhY2tncm91bmQoKX12aWRlb0JhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkudmlkZW9CYWNrZ3JvdW5kKCl9Z2V0RmFjdG9yeSgpe2lmKCF0aGlzLmZhY3RvcnkpdGhyb3ciRmFjdG9yeSBpcyBub3QgaW5pdGlhbGl6ZWQiO3JldHVybiB0aGlzLmZhY3Rvcnl9fWNsYXNzIG5se2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJyZW5kZXJlciIpO2wodGhpcywiYmFja2dyb3VuZFZpZGVvIik7bCh0aGlzLCJiYWNrZ3JvdW5kSW1hZ2UiKX1zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgbixvO2NvbnN0IHQ9bmV3IHJsKChuPWUucmVuZGVyaW5nT3B0aW9ucyk9PW51bGw/dm9pZCAwOm4udHlwZSk7c3dpdGNoKGUudHJhbnNmb3JtZXJUeXBlKXtjYXNlIkJhY2tncm91bmRCbHVyIjp0aGlzLnJlbmRlcmVyPXQuYmx1ckJhY2tncm91bmQodGhpcy5nZXRCbHVyU2l6ZShlLnJhZGl1cykpO2JyZWFrO2Nhc2UiU2lsaG91ZXR0ZUJsdXIiOnRoaXMucmVuZGVyZXI9dC5ibHVyU2lsaG91ZXR0ZSh0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJWaWRlb0JhY2tncm91bmQiOmNvbnN0IGk9dC52aWRlb0JhY2tncm91bmQoKTt0aGlzLmJhY2tncm91bmRWaWRlbyYmaS5zZXRCYWNrZ3JvdW5kVmlkZW8odGhpcy5iYWNrZ3JvdW5kVmlkZW8pLHRoaXMucmVuZGVyZXI9aTticmVhaztjYXNlIlZpcnR1YWxCYWNrZ3JvdW5kIjpjb25zdCBzPXQuaW1hZ2VCYWNrZ3JvdW5kKCk7dGhpcy5iYWNrZ3JvdW5kSW1hZ2UmJnMuc2V0QmFja2dyb3VuZEltYWdlKHRoaXMuYmFja2dyb3VuZEltYWdlKSx0aGlzLnJlbmRlcmVyPXM7YnJlYWs7ZGVmYXVsdDp0aHJvd2BVbmtub3duIHJlbmRlcmluZyB0eXBlIFske2UudHJhbnNmb3JtZXJUeXBlfV1gfSgobz1lLnJlbmRlcmluZ09wdGlvbnMpPT1udWxsP3ZvaWQgMDpvLnR5cGUpPT09eXQuV0VCR0wmJihlLnJlbmRlcmluZ09wdGlvbnMuc2VsZmllU2VnbWVudGF0aW9uVHlwZT09PW5yLlBSRUNJU0U/dGhpcy5yZW5kZXJlci5lbmFibGVQb3N0UHJvY2Vzc2luZygpOmUucmVuZGVyaW5nT3B0aW9ucy5zZWxmaWVTZWdtZW50YXRpb25UeXBlPT09bnIuRkFTVCYmdGhpcy5yZW5kZXJlci5kaXNhYmxlUG9zdFByb2Nlc3NpbmcoKSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dmFyIHQ7KHQ9dGhpcy5yZW5kZXJlcik9PW51bGx8fHQuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9c2V0VmlkZW9CR1JlYWRhYmxlKGUpe3RoaXMuYmFja2dyb3VuZFZpZGVvPWUuZ2V0UmVhZGVyKCk7Y29uc3QgdD10aGlzLnJlbmRlcmVyO3QhPW51bGwmJnQuc2V0QmFja2dyb3VuZFZpZGVvJiZ0LnNldEJhY2tncm91bmRWaWRlbyh0aGlzLmJhY2tncm91bmRWaWRlbyl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7Y29uc3QgdD10aGlzLnJlbmRlcmVyO3QhPW51bGwmJnQuc2V0QmFja2dyb3VuZEltYWdlJiZ0LnNldEJhY2tncm91bmRJbWFnZShlKSx0aGlzLmJhY2tncm91bmRJbWFnZT1lfWFzeW5jIHByb2Nlc3MoZSx0KXtpZih0aGlzLnJlbmRlcmVyKXJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlcihlLHQpfWFzeW5jIHJlc2l6ZUZvcmVncm91bmQoZSx0KXt9Z2V0Qmx1clNpemUoZT1ndC5Mb3cpe3N3aXRjaChlKXtjYXNlIGd0LkxvdzpyZXR1cm4gNTtjYXNlIGd0LkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfWFzeW5jIHByb2ZpbGUoZSl7dmFyIHQsbjtyZXR1cm4obj0odD10aGlzLnJlbmRlcmVyKT09bnVsbD92b2lkIDA6dC5wcm9maWxlV2ViZ2woZSkpIT1udWxsP246W119fWNsYXNzIG9se2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJzZWxmaWVTZWdtZW50YXRpb24iLG5ldyBjcyk7bCh0aGlzLCJiYWNrZ3JvdW5kRmlsdGVyIik7bCh0aGlzLCJyZXBvcnRlciIsbmV3IHJzKTtsKHRoaXMsImlzRW5hYmxlZCIsITApO2wodGhpcywiYmFja2dyb3VuZE9wdGlvbnMiKX1hc3luYyBpbml0KGUsdCl7YXdhaXQgdGhpcy5zZWxmaWVTZWdtZW50YXRpb24uaW5pdCh0Lndhc21Bc3NldFVyaVBhdGgsdC50ZmxpdGVBc3NldFVyaVBhdGgpLHRoaXMuYmFja2dyb3VuZEZpbHRlcj1uZXcgbmwsdGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiQ3JlYXRlIn0pfWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBhLHU7aWYoIXRoaXMuaXNFbmFibGVkKXJldHVybiB0LmVucXVldWUoZSk7bGV0IG47Y29uc3Qgbz0oYT1lLnRpbWVzdGFtcCkhPW51bGw/YTowLGk9YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZSkscz1hd2FpdCB0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5wcm9jZXNzKGkpO3MmJihuPWF3YWl0KCh1PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnUucHJvY2VzcyhpLHMpKSksbj8oZS5jbG9zZSgpLHQuZW5xdWV1ZShuZXcgVmlkZW9GcmFtZShuLHt0aW1lc3RhbXA6byxhbHBoYToiZGlzY2FyZCJ9KSkpOnQuZW5xdWV1ZShlKX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDt0aGlzLmJhY2tncm91bmRPcHRpb25zPWUsYXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKSksdGhpcy5yZXBvcnQoe3ZhcmlhdGlvbjoiVXBkYXRlIn0pfWFzeW5jIHNldFZpZGVvQkdSZWFkYWJsZShlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDp0LnNldFZpZGVvQkdSZWFkYWJsZShlKSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRWaXJ0dWFsQkdJbWFnZShlKSl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dmFyIHQ7KHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbHx8dC5zZXRGbGlja2VyaW5nT3B0aW9ucyhlKSx0aGlzLnJlcG9ydCh7dmFyaWF0aW9uOiJVcGRhdGUifSl9YXN5bmMgcHJvZmlsZShlKXt2YXIgdCxuO3JldHVybihuPSh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnQucHJvZmlsZShlKSkhPW51bGw/bjpbXX1nZXRUcmFuc2Zvcm1lclR5cGUoKXt2YXIgZSx0O3JldHVybih0PShlPXRoaXMuYmFja2dyb3VuZE9wdGlvbnMpPT1udWxsP3ZvaWQgMDplLnRyYW5zZm9ybWVyVHlwZSkhPW51bGw/dDoiVW5kZWZpbmVkIn1lbmFibGUoKXt0aGlzLmlzRW5hYmxlZD0hMH1kaXNhYmxlKCl7dGhpcy5pc0VuYWJsZWQ9ITF9cmVwb3J0KGUpe3ZhciB0O3RoaXMucmVwb3J0ZXIuc2VuZCh7dmVyc2lvbjpucyxhY3Rpb246Ik1sVHJhbnNmb3JtZXJzIix0cmFuc2Zvcm1lclR5cGU6KHQ9dGhpcy5iYWNrZ3JvdW5kT3B0aW9ucyk9PW51bGw/dm9pZCAwOnQudHJhbnNmb3JtZXJUeXBlLGNvbmZpZzpKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tncm91bmRPcHRpb25zKSwuLi5lfSl9fWNvbnN0ICRyPWNsYXNze2NvbnN0cnVjdG9yKCl7bCh0aGlzLCJiYWNrZ3JvdW5kVHJhbnNmb3JtZXIiLG5ldyBvbCk7bCh0aGlzLCJtZWRpYVByb2Nlc3NvciIsbmV3IERpKTtsKHRoaXMsInJhdGUiLDMwKTtsKHRoaXMsInJlc29sdmVPbk1lZGlhUHJvY2Vzc29yIik7bCh0aGlzLCJldmVudHNRdWV1ZSIsW10pfWFzeW5jIGluaXQoZSx0KXthd2FpdCB0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5pbml0KGUsdCksYXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFuc2Zvcm1lcnMoW3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyXSksdGhpcy5tZWRpYVByb2Nlc3Nvci5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnJhdGUpLHRoaXMubWVkaWFQcm9jZXNzb3Iub25BbnkoKG4sbyk9Pnt0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yPyh0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yKHtuYW1lOm4sZGF0YTpvfSksdGhpcy5yZXNvbHZlT25NZWRpYVByb2Nlc3Nvcj12b2lkIDApOnRoaXMuZXZlbnRzUXVldWUucHVzaCh7bmFtZTpuLGRhdGE6b30pfSl9ZW5hYmxlKCl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuZW5hYmxlKCl9ZGlzYWJsZSgpe3RoaXMuYmFja2dyb3VuZFRyYW5zZm9ybWVyLmRpc2FibGUoKX1hc3luYyBvbk1lZGlhUHJvY2Vzc29yRXZlbnQoKXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoZT0+e3RoaXMuZXZlbnRzUXVldWUubGVuZ3RoPjA/ZSh0aGlzLmV2ZW50c1F1ZXVlLnNoaWZ0KCkpOnRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I9ZX0pfWFzeW5jIHNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMucmF0ZT1lLHRoaXMubWVkaWFQcm9jZXNzb3Iuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl9YXN5bmMgdHJhbnNmb3JtKGUsdCl7dGhpcy5tZWRpYVByb2Nlc3Nvci50cmFuc2Zvcm0oZSx0KX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcik9PW51bGw/dm9pZCAwOnQuc2V0QmFja2dyb3VuZE9wdGlvbnMoZSkpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaWRlb0JHUmVhZGFibGUoZSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlydHVhbEJHSW1hZ2UoZSl9YXN5bmMgdGVybWluYXRlKCl7YXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5kZXN0cm95KCl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9c2V0Vm9uYWdlTWV0YWRhdGEoZSl7SWkoZSl9YXN5bmMgcHJvZmlsZShlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIucHJvZmlsZShlKSl9fTtsZXQgQ289JHI7KCgpPT57am8oIlByb2Nlc3NvcldvcmtlciIsJHIpfSkoKX0pKCk7Cg==", zs = typeof window < "u" && window.Blob && new Blob([atob(sc)], { type: "text/javascript;charset=utf-8" });
|
|
24580
24584
|
function U3() {
|
|
24581
24585
|
const i = zs && (window.URL || window.webkitURL).createObjectURL(zs);
|
|
24582
24586
|
try {
|