ol-cesium
Version:
OpenLayers Cesium integration library
68 lines (66 loc) • 12.9 MB
JavaScript
/**
* @license
* Cesium - https://github.com/CesiumGS/cesium
* Version 1.113
*
* Copyright 2011-2022 Cesium Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Columbus View (Pat. Pend.)
*
* Portions licensed separately.
* See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details.
*/
var Cesium = (() => {
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
get: (a3, b) => (typeof require !== "undefined" ? require : a3)[b]
}) : x)(function(x) {
if (typeof require !== "undefined")
return require.apply(this, arguments);
throw Error('Dynamic require of "' + x + '" is not supported');
});
var __commonJS = (cb, mod2) => function __require2() {
return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target,
mod2
));
var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2);
// Build/InlineWorkers.js
var require_InlineWorkers = __commonJS({
"Build/InlineWorkers.js"() {
globalThis.CESIUM_WORKERS = atob("dmFyIENlc2l1bVdvcmtlcnMgPSAoKCkgPT4gewogIHZhciBfX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7CiAgdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICB2YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgdmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICB2YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgX19yZXF1aXJlID0gLyogQF9fUFVSRV9fICovICgoeCkgPT4gdHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZSA6IHR5cGVvZiBQcm94eSAhPT0gInVuZGVmaW5lZCIgPyBuZXcgUHJveHkoeCwgewogICAgZ2V0OiAoYTMsIGIpID0+ICh0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogYTMpW2JdCiAgfSkgOiB4KShmdW5jdGlvbih4KSB7CiAgICBpZiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiKQogICAgICByZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyArIHggKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgfSk7CiAgdmFyIF9fZ2xvYiA9IChtYXApID0+IChwYXRoKSA9PiB7CiAgICB2YXIgZm4gPSBtYXBbcGF0aF07CiAgICBpZiAoZm4pCiAgICAgIHJldHVybiBmbigpOwogICAgdGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIiArIHBhdGgpOwogIH07CiAgdmFyIF9fZXNtID0gKGZuLCByZXMpID0+IGZ1bmN0aW9uIF9faW5pdCgpIHsKICAgIHJldHVybiBmbiAmJiAocmVzID0gKDAsIGZuW19fZ2V0T3duUHJvcE5hbWVzKGZuKVswXV0pKGZuID0gMCkpLCByZXM7CiAgfTsKICB2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogICAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7CiAgfTsKICB2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHsKICAgIGZvciAodmFyIG5hbWUgaW4gYWxsKQogICAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwogIH07CiAgdmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHsKICAgIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSAib2JqZWN0IiB8fCB0eXBlb2YgZnJvbSA9PT0gImZ1bmN0aW9uIikgewogICAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpCiAgICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdCkKICAgICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICAgIH0KICAgIHJldHVybiB0bzsKICB9OwogIHZhciBfX3RvRVNNID0gKG1vZCwgaXNOb2RlTW9kZSwgdGFyZ2V0KSA9PiAodGFyZ2V0ID0gbW9kICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kKSkgOiB7fSwgX19jb3B5UHJvcHMoCiAgICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNCiAgICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogICAgLy8gY29tcGF0aWJsZSB0cmFuc2Zvcm0gKGkuZS4gIl9fZXNNb2R1bGUiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldAogICAgLy8gImRlZmF1bHQiIHRvIHRoZSBDb21tb25KUyAibW9kdWxlLmV4cG9ydHMiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuCiAgICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgICBtb2QKICApKTsKICB2YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9kZWZpbmVkLmpzCiAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWUgIT09IG51bGw7CiAgfQogIHZhciBkZWZpbmVkX2RlZmF1bHQ7CiAgdmFyIGluaXRfZGVmaW5lZCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvZGVmaW5lZC5qcyIoKSB7CiAgICAgIGRlZmluZWRfZGVmYXVsdCA9IGRlZmluZWQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9EZXZlbG9wZXJFcnJvci5qcwogIGZ1bmN0aW9uIERldmVsb3BlckVycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJEZXZlbG9wZXJFcnJvciI7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgbGV0IHN0YWNrOwogICAgdHJ5IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHN0YWNrID0gZS5zdGFjazsKICAgIH0KICAgIHRoaXMuc3RhY2sgPSBzdGFjazsKICB9CiAgdmFyIERldmVsb3BlckVycm9yX2RlZmF1bHQ7CiAgdmFyIGluaXRfRGV2ZWxvcGVyRXJyb3IgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0RldmVsb3BlckVycm9yLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoT2JqZWN0LmNyZWF0ZSkpIHsKICAgICAgICBEZXZlbG9wZXJFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGV2ZWxvcGVyRXJyb3I7CiAgICAgIH0KICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IHN0ciA9IGAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLnN0YWNrKSkgewogICAgICAgICAgc3RyICs9IGAKJHt0aGlzLnN0YWNrLnRvU3RyaW5nKCl9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfTsKICAgICAgRGV2ZWxvcGVyRXJyb3IudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3IoCiAgICAgICAgICAiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIgogICAgICAgICk7CiAgICAgIH07CiAgICAgIERldmVsb3BlckVycm9yX2RlZmF1bHQgPSBEZXZlbG9wZXJFcnJvcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NoZWNrLmpzCiAgZnVuY3Rpb24gZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpIHsKICAgIHJldHVybiBgJHtuYW1lfSBpcyByZXF1aXJlZCwgYWN0dWFsIHZhbHVlIHdhcyB1bmRlZmluZWRgOwogIH0KICBmdW5jdGlvbiBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQsIG5hbWUpIHsKICAgIHJldHVybiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSB0eXBlb2YgJHtleHBlY3RlZH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7YWN0dWFsfWA7CiAgfQogIHZhciBDaGVjaywgQ2hlY2tfZGVmYXVsdDsKICB2YXIgaW5pdF9DaGVjayA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2hlY2suanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDaGVjayA9IHt9OwogICAgICBDaGVjay50eXBlT2YgPSB7fTsKICAgICAgQ2hlY2suZGVmaW5lZCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0ZXN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5mdW5jID0gZnVuY3Rpb24obmFtZSwgdGVzdCkgewogICAgICAgIGlmICh0eXBlb2YgdGVzdCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJmdW5jdGlvbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLnN0cmluZyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgInN0cmluZyIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlciA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm51bWJlciIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5sZXNzVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGxlc3MgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm9iamVjdCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm9iamVjdCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJvb2wgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAiYm9vbGVhbiIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKHR5cGVvZiB0ZXN0LCAiYm9vbGVhbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJpZ2ludCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJiaWdpbnQiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgImJpZ2ludCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5lcXVhbHMgPSBmdW5jdGlvbihuYW1lMSwgbmFtZTIsIHRlc3QxLCB0ZXN0MikgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZTEsIHRlc3QxKTsKICAgICAgICBDaGVjay50eXBlT2YubnVtYmVyKG5hbWUyLCB0ZXN0Mik7CiAgICAgICAgaWYgKHRlc3QxICE9PSB0ZXN0MikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGAke25hbWUxfSBtdXN0IGJlIGVxdWFsIHRvICR7bmFtZTJ9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHt0ZXN0MX0gYW5kICR7dGVzdDJ9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrX2RlZmF1bHQgPSBDaGVjazsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlZmF1bHRWYWx1ZS5qcwogIGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShhMywgYikgewogICAgaWYgKGEzICE9PSB2b2lkIDAgJiYgYTMgIT09IG51bGwpIHsKICAgICAgcmV0dXJuIGEzOwogICAgfQogICAgcmV0dXJuIGI7CiAgfQogIHZhciBkZWZhdWx0VmFsdWVfZGVmYXVsdDsKICB2YXIgaW5pdF9kZWZhdWx0VmFsdWUgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlZmF1bHRWYWx1ZS5qcyIoKSB7CiAgICAgIGRlZmF1bHRWYWx1ZS5FTVBUWV9PQkpFQ1QgPSBPYmplY3QuZnJlZXplKHt9KTsKICAgICAgZGVmYXVsdFZhbHVlX2RlZmF1bHQgPSBkZWZhdWx0VmFsdWU7CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9tZXJzZW5uZS10d2lzdGVyL3NyYy9tZXJzZW5uZS10d2lzdGVyLmpzCiAgdmFyIHJlcXVpcmVfbWVyc2VubmVfdHdpc3RlciA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9tZXJzZW5uZS10d2lzdGVyL3NyYy9tZXJzZW5uZS10d2lzdGVyLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgIHZhciBNZXJzZW5uZVR3aXN0ZXIyID0gZnVuY3Rpb24oc2VlZCkgewogICAgICAgIGlmIChzZWVkID09IHZvaWQgMCkgewogICAgICAgICAgc2VlZCA9ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkuZ2V0VGltZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLk4gPSA2MjQ7CiAgICAgICAgdGhpcy5NID0gMzk3OwogICAgICAgIHRoaXMuTUFUUklYX0EgPSAyNTY3NDgzNjE1OwogICAgICAgIHRoaXMuVVBQRVJfTUFTSyA9IDIxNDc0ODM2NDg7CiAgICAgICAgdGhpcy5MT1dFUl9NQVNLID0gMjE0NzQ4MzY0NzsKICAgICAgICB0aGlzLm10ID0gbmV3IEFycmF5KHRoaXMuTik7CiAgICAgICAgdGhpcy5tdGkgPSB0aGlzLk4gKyAxOwogICAgICAgIGlmIChzZWVkLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CiAgICAgICAgICB0aGlzLmluaXRfYnlfYXJyYXkoc2VlZCwgc2VlZC5sZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmluaXRfc2VlZChzZWVkKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLmluaXRfc2VlZCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB0aGlzLm10WzBdID0gcyA+Pj4gMDsKICAgICAgICBmb3IgKHRoaXMubXRpID0gMTsgdGhpcy5tdGkgPCB0aGlzLk47IHRoaXMubXRpKyspIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFt0aGlzLm10aSAtIDFdIF4gdGhpcy5tdFt0aGlzLm10aSAtIDFdID4+PiAzMDsKICAgICAgICAgIHRoaXMubXRbdGhpcy5tdGldID0gKCgocyAmIDQyOTQ5MDE3NjApID4+PiAxNikgKiAxODEyNDMzMjUzIDw8IDE2KSArIChzICYgNjU1MzUpICogMTgxMjQzMzI1MyArIHRoaXMubXRpOwogICAgICAgICAgdGhpcy5tdFt0aGlzLm10aV0gPj4+PSAwOwogICAgICAgIH0KICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUuaW5pdF9ieV9hcnJheSA9IGZ1bmN0aW9uKGluaXRfa2V5LCBrZXlfbGVuZ3RoKSB7CiAgICAgICAgdmFyIGksIGosIGs7CiAgICAgICAgdGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpOwogICAgICAgIGkgPSAxOwogICAgICAgIGogPSAwOwogICAgICAgIGsgPSB0aGlzLk4gPiBrZXlfbGVuZ3RoID8gdGhpcy5OIDoga2V5X2xlbmd0aDsKICAgICAgICBmb3IgKDsgazsgay0tKSB7CiAgICAgICAgICB2YXIgcyA9IHRoaXMubXRbaSAtIDFdIF4gdGhpcy5tdFtpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFtpXSA9ICh0aGlzLm10W2ldIF4gKCgocyAmIDQyOTQ5MDE3NjApID4+PiAxNikgKiAxNjY0NTI1IDw8IDE2KSArIChzICYgNjU1MzUpICogMTY2NDUyNSkgKyBpbml0X2tleVtqXSArIGo7CiAgICAgICAgICB0aGlzLm10W2ldID4+Pj0gMDsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGorKzsKICAgICAgICAgIGlmIChpID49IHRoaXMuTikgewogICAgICAgICAgICB0aGlzLm10WzBdID0gdGhpcy5tdFt0aGlzLk4gLSAxXTsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaiA+PSBrZXlfbGVuZ3RoKQogICAgICAgICAgICBqID0gMDsKICAgICAgICB9CiAgICAgICAgZm9yIChrID0gdGhpcy5OIC0gMTsgazsgay0tKSB7CiAgICAgICAgICB2YXIgcyA9IHRoaXMubXRbaSAtIDFdIF4gdGhpcy5tdFtpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFtpXSA9ICh0aGlzLm10W2ldIF4gKCgocyAmIDQyOTQ5MDE3NjApID4+PiAxNikgKiAxNTY2MDgzOTQxIDw8IDE2KSArIChzICYgNjU1MzUpICogMTU2NjA4Mzk0MSkgLSBpOwogICAgICAgICAgdGhpcy5tdFtpXSA+Pj49IDA7CiAgICAgICAgICBpKys7CiAgICAgICAgICBpZiAoaSA+PSB0aGlzLk4pIHsKICAgICAgICAgICAgdGhpcy5tdFswXSA9IHRoaXMubXRbdGhpcy5OIC0gMV07CiAgICAgICAgICAgIGkgPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLm10WzBdID0gMjE0NzQ4MzY0ODsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2ludCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB5OwogICAgICAgIHZhciBtYWcwMSA9IG5ldyBBcnJheSgwLCB0aGlzLk1BVFJJWF9BKTsKICAgICAgICBpZiAodGhpcy5tdGkgPj0gdGhpcy5OKSB7CiAgICAgICAgICB2YXIga2s7CiAgICAgICAgICBpZiAodGhpcy5tdGkgPT0gdGhpcy5OICsgMSkKICAgICAgICAgICAgdGhpcy5pbml0X3NlZWQoNTQ4OSk7CiAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCB0aGlzLk4gLSB0aGlzLk07IGtrKyspIHsKICAgICAgICAgICAgeSA9IHRoaXMubXRba2tdICYgdGhpcy5VUFBFUl9NQVNLIHwgdGhpcy5tdFtrayArIDFdICYgdGhpcy5MT1dFUl9NQVNLOwogICAgICAgICAgICB0aGlzLm10W2trXSA9IHRoaXMubXRba2sgKyB0aGlzLk1dIF4geSA+Pj4gMSBeIG1hZzAxW3kgJiAxXTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoOyBrayA8IHRoaXMuTiAtIDE7IGtrKyspIHsKICAgICAgICAgICAgeSA9IHRoaXMubXRba2tdICYgdGhpcy5VUFBFUl9NQVNLIHwgdGhpcy5tdFtrayArIDFdICYgdGhpcy5MT1dFUl9NQVNLOwogICAgICAgICAgICB0aGlzLm10W2trXSA9IHRoaXMubXRba2sgKyAodGhpcy5NIC0gdGhpcy5OKV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgfQogICAgICAgICAgeSA9IHRoaXMubXRbdGhpcy5OIC0gMV0gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10WzBdICYgdGhpcy5MT1dFUl9NQVNLOwogICAgICAgICAgdGhpcy5tdFt0aGlzLk4gLSAxXSA9IHRoaXMubXRbdGhpcy5NIC0gMV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgdGhpcy5tdGkgPSAwOwogICAgICAgIH0KICAgICAgICB5ID0gdGhpcy5tdFt0aGlzLm10aSsrXTsKICAgICAgICB5IF49IHkgPj4+IDExOwogICAgICAgIHkgXj0geSA8PCA3ICYgMjYzNjkyODY0MDsKICAgICAgICB5IF49IHkgPDwgMTUgJiA0MDIyNzMwNzUyOwogICAgICAgIHkgXj0geSA+Pj4gMTg7CiAgICAgICAgcmV0dXJuIHkgPj4+IDA7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbV9pbnQzMSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSA+Pj4gMTsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2luY2wgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yYW5kb21faW50KCkgKiAoMSAvIDQyOTQ5NjcyOTUpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yYW5kb21faW50KCkgKiAoMSAvIDQyOTQ5NjcyOTYpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21fZXhjbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5yYW5kb21faW50KCkgKyAwLjUpICogKDEgLyA0Mjk0OTY3Mjk2KTsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2xvbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYTMgPSB0aGlzLnJhbmRvbV9pbnQoKSA+Pj4gNSwgYiA9IHRoaXMucmFuZG9tX2ludCgpID4+PiA2OwogICAgICAgIHJldHVybiAoYTMgKiA2NzEwODg2NCArIGIpICogKDEgLyA5MDA3MTk5MjU0NzQwOTkyKTsKICAgICAgfTsKICAgICAgbW9kdWxlLmV4cG9ydHMgPSBNZXJzZW5uZVR3aXN0ZXIyOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTWF0aC5qcwogIHZhciBpbXBvcnRfbWVyc2VubmVfdHdpc3RlciwgQ2VzaXVtTWF0aCwgZmFjdG9yaWFscywgcmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBNYXRoX2RlZmF1bHQ7CiAgdmFyIGluaXRfTWF0aCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTWF0aC5qcyIoKSB7CiAgICAgIGltcG9ydF9tZXJzZW5uZV90d2lzdGVyID0gX190b0VTTShyZXF1aXJlX21lcnNlbm5lX3R3aXN0ZXIoKSwgMSk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZhdWx0VmFsdWUoKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgQ2VzaXVtTWF0aCA9IHt9OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04xID0gMC4xOwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04yID0gMC4wMTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMyA9IDFlLTM7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjQgPSAxZS00OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT041ID0gMWUtNTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONiA9IDFlLTY7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjcgPSAxZS03OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT044ID0gMWUtODsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OOSA9IDFlLTk7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEwID0gMWUtMTA7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjExID0gMWUtMTE7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEyID0gMWUtMTI7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEzID0gMWUtMTM7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE0ID0gMWUtMTQ7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE1ID0gMWUtMTU7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE2ID0gMWUtMTY7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE3ID0gMWUtMTc7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE4ID0gMWUtMTg7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE5ID0gMWUtMTk7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIwID0gMWUtMjA7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIxID0gMWUtMjE7CiAgICAgIENlc2l1bU1hdGguR1JBVklUQVRJT05BTFBBUkFNRVRFUiA9IDM5ODYwMDQ0MThlNTsKICAgICAgQ2VzaXVtTWF0aC5TT0xBUl9SQURJVVMgPSA2OTU1ZTU7CiAgICAgIENlc2l1bU1hdGguTFVOQVJfUkFESVVTID0gMTczNzQwMDsKICAgICAgQ2VzaXVtTWF0aC5TSVhUWV9GT1VSX0tJTE9CWVRFUyA9IDY0ICogMTAyNDsKICAgICAgQ2VzaXVtTWF0aC5GT1VSX0dJR0FCWVRFUyA9IDQgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CiAgICAgIENlc2l1bU1hdGguc2lnbiA9IGRlZmF1bHRWYWx1ZV9kZWZhdWx0KE1hdGguc2lnbiwgZnVuY3Rpb24gc2lnbih2YWx1ZSkgewogICAgICAgIHZhbHVlID0gK3ZhbHVlOwogICAgICAgIGlmICh2YWx1ZSA9PT0gMCB8fCB2YWx1ZSAhPT0gdmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlID4gMCA/IDEgOiAtMTsKICAgICAgfSk7CiAgICAgIENlc2l1bU1hdGguc2lnbk5vdFplcm8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAtMSA6IDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgudG9TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSBkZWZhdWx0VmFsdWVfZGVmYXVsdChyYW5nZU1heGltdW0sIDI1NSk7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoCiAgICAgICAgICAoQ2VzaXVtTWF0aC5jbGFtcCh2YWx1ZSwgLTEsIDEpICogMC41ICsgMC41KSAqIHJhbmdlTWF4aW11bQogICAgICAgICk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZnJvbVNOb3JtID0gZnVuY3Rpb24odmFsdWUsIHJhbmdlTWF4aW11bSkgewogICAgICAgIHJhbmdlTWF4aW11bSA9IGRlZmF1bHRWYWx1ZV9kZWZhdWx0KHJhbmdlTWF4aW11bSwgMjU1KTsKICAgICAgICByZXR1cm4gQ2VzaXVtTWF0aC5jbGFtcCh2YWx1ZSwgMCwgcmFuZ2VNYXhpbXVtKSAvIHJhbmdlTWF4aW11bSAqIDIgLSAxOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1pbmltdW0sIHJhbmdlTWF4aW11bSkgewogICAgICAgIHJhbmdlTWF4aW11bSA9IE1hdGgubWF4KHJhbmdlTWF4aW11bSAtIHJhbmdlTWluaW11bSwgMCk7CiAgICAgICAgcmV0dXJuIHJhbmdlTWF4aW11bSA9PT0gMCA/IDAgOiBDZXNpdW1NYXRoLmNsYW1wKCh2YWx1ZSAtIHJhbmdlTWluaW11bSkgLyByYW5nZU1heGltdW0sIDAsIDEpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnNpbmggPSBkZWZhdWx0VmFsdWVfZGVmYXVsdChNYXRoLnNpbmgsIGZ1bmN0aW9uIHNpbmgodmFsdWUpIHsKICAgICAgICByZXR1cm4gKE1hdGguZXhwKHZhbHVlKSAtIE1hdGguZXhwKC12YWx1ZSkpIC8gMjsKICAgICAgfSk7CiAgICAgIENlc2l1bU1hdGguY29zaCA9IGRlZmF1bHRWYWx1ZV9kZWZhdWx0KE1hdGguY29zaCwgZnVuY3Rpb24gY29zaCh2YWx1ZSkgewogICAgICAgIHJldHVybiAoTWF0aC5leHAodmFsdWUpICsgTWF0aC5leHAoLXZhbHVlKSkgLyAyOwogICAgICB9KTsKICAgICAgQ2VzaXVtTWF0aC5sZXJwID0gZnVuY3Rpb24ocCwgcSwgdGltZSkgewogICAgICAgIHJldHVybiAoMSAtIHRpbWUpICogcCArIHRpbWUgKiBxOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLlBJID0gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5PTkVfT1ZFUl9QSSA9IDEgLyBNYXRoLlBJOwogICAgICBDZXNpdW1NYXRoLlBJX09WRVJfVFdPID0gTWF0aC5QSSAvIDI7CiAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9USFJFRSA9IE1hdGguUEkgLyAzOwogICAgICBDZXNpdW1NYXRoLlBJX09WRVJfRk9VUiA9IE1hdGguUEkgLyA0OwogICAgICBDZXNpdW1NYXRoLlBJX09WRVJfU0lYID0gTWF0aC5QSSAvIDY7CiAgICAgIENlc2l1bU1hdGguVEhSRUVfUElfT1ZFUl9UV08gPSAzICogTWF0aC5QSSAvIDI7CiAgICAgIENlc2l1bU1hdGguVFdPX1BJID0gMiAqIE1hdGguUEk7CiAgICAgIENlc2l1bU1hdGguT05FX09WRVJfVFdPX1BJID0gMSAvICgyICogTWF0aC5QSSk7CiAgICAgIENlc2l1bU1hdGguUkFESUFOU19QRVJfREVHUkVFID0gTWF0aC5QSSAvIDE4MDsKICAgICAgQ2VzaXVtTWF0aC5ERUdSRUVTX1BFUl9SQURJQU4gPSAxODAgLyBNYXRoLlBJOwogICAgICBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0FSQ1NFQ09ORCA9IENlc2l1bU1hdGguUkFESUFOU19QRVJfREVHUkVFIC8gMzYwMDsKICAgICAgQ2VzaXVtTWF0aC50b1JhZGlhbnMgPSBmdW5jdGlvbihkZWdyZWVzKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoZGVncmVlcykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkZWdyZWVzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVncmVlcyAqIENlc2l1bU1hdGguUkFESUFOU19QRVJfREVHUkVFOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnRvRGVncmVlcyA9IGZ1bmN0aW9uKHJhZGlhbnMpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyYWRpYW5zKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYWRpYW5zICogQ2VzaXVtTWF0aC5ERUdSRUVTX1BFUl9SQURJQU47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY29udmVydExvbmdpdHVkZVJhbmdlID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdHdvUGkgPSBDZXNpdW1NYXRoLlRXT19QSTsKICAgICAgICBjb25zdCBzaW1wbGlmaWVkID0gYW5nbGUgLSBNYXRoLmZsb29yKGFuZ2xlIC8gdHdvUGkpICogdHdvUGk7CiAgICAgICAgaWYgKHNpbXBsaWZpZWQgPCAtTWF0aC5QSSkgewogICAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWQgKyB0d29QaTsKICAgICAgICB9CiAgICAgICAgaWYgKHNpbXBsaWZpZWQgPj0gTWF0aC5QSSkgewogICAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWQgLSB0d29QaTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWQ7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2xhbXBUb0xhdGl0dWRlUmFuZ2UgPSBmdW5jdGlvbihhbmdsZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQ2VzaXVtTWF0aC5jbGFtcCgKICAgICAgICAgIGFuZ2xlLAogICAgICAgICAgLTEgKiBDZXNpdW1NYXRoLlBJX09WRVJfVFdPLAogICAgICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTwogICAgICAgICk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubmVnYXRpdmVQaVRvUGkgPSBmdW5jdGlvbihhbmdsZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoYW5nbGUgPj0gLUNlc2l1bU1hdGguUEkgJiYgYW5nbGUgPD0gQ2VzaXVtTWF0aC5QSSkgewogICAgICAgICAgcmV0dXJuIGFuZ2xlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQ2VzaXVtTWF0aC56ZXJvVG9Ud29QaShhbmdsZSArIENlc2l1bU1hdGguUEkpIC0gQ2VzaXVtTWF0aC5QSTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC56ZXJvVG9Ud29QaSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChhbmdsZSA+PSAwICYmIGFuZ2xlIDw9IENlc2l1bU1hdGguVFdPX1BJKSB7CiAgICAgICAgICByZXR1cm4gYW5nbGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1vZCA9IENlc2l1bU1hdGgubW9kKGFuZ2xlLCBDZXNpdW1NYXRoLlRXT19QSSk7CiAgICAgICAgaWYgKE1hdGguYWJzKG1vZCkgPCBDZXNpdW1NYXRoLkVQU0lMT04xNCAmJiBNYXRoLmFicyhhbmdsZSkgPiBDZXNpdW1NYXRoLkVQU0lMT04xNCkgewogICAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguVFdPX1BJOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm1vZCA9IGZ1bmN0aW9uKG0sIG4pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChtKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm0gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG4pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKG4gPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJkaXZpc29yIGNhbm5vdCBiZSAwLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoQ2VzaXVtTWF0aC5zaWduKG0pID09PSBDZXNpdW1NYXRoLnNpZ24obikgJiYgTWF0aC5hYnMobSkgPCBNYXRoLmFicyhuKSkgewogICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgfQogICAgICAgIHJldHVybiAobSAlIG4gKyBuKSAlIG47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZXF1YWxzRXBzaWxvbiA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZWxhdGl2ZUVwc2lsb24sIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibGVmdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmlnaHQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJlbGF0aXZlRXBzaWxvbiA9IGRlZmF1bHRWYWx1ZV9kZWZhdWx0KHJlbGF0aXZlRXBzaWxvbiwgMCk7CiAgICAgICAgYWJzb2x1dGVFcHNpbG9uID0gZGVmYXVsdFZhbHVlX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uLCByZWxhdGl2ZUVwc2lsb24pOwogICAgICAgIGNvbnN0IGFic0RpZmYgPSBNYXRoLmFicyhsZWZ0IC0gcmlnaHQpOwogICAgICAgIHJldHVybiBhYnNEaWZmIDw9IGFic29sdXRlRXBzaWxvbiB8fCBhYnNEaWZmIDw9IHJlbGF0aXZlRXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGxlZnQpLCBNYXRoLmFicyhyaWdodCkpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxlc3NUaGFuID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlY29uZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodCA8IC1hYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImZpcnN0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFic29sdXRlRXBzaWxvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQgPCBhYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZ3JlYXRlclRoYW4gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gYWJzb2x1dGVFcHNpbG9uOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmdyZWF0ZXJUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gLWFic29sdXRlRXBzaWxvbjsKICAgICAgfTsKICAgICAgZmFjdG9yaWFscyA9IFsxXTsKICAgICAgQ2VzaXVtTWF0aC5mYWN0b3JpYWwgPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJBIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBpcyByZXF1aXJlZC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBmYWN0b3JpYWxzLmxlbmd0aDsKICAgICAgICBpZiAobiA+PSBsZW5ndGgpIHsKICAgICAgICAgIGxldCBzdW0gPSBmYWN0b3JpYWxzW2xlbmd0aCAtIDFdOwogICAgICAgICAgZm9yIChsZXQgaSA9IGxlbmd0aDsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbmV4dCA9IHN1bSAqIGk7CiAgICAgICAgICAgIGZhY3RvcmlhbHMucHVzaChuZXh0KTsKICAgICAgICAgICAgc3VtID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhY3RvcmlhbHNbbl07CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaW5jcmVtZW50V3JhcCA9IGZ1bmN0aW9uKG4sIG1heGltdW1WYWx1ZSwgbWluaW11bVZhbHVlKSB7CiAgICAgICAgbWluaW11bVZhbHVlID0gZGVmYXVsdFZhbHVlX2RlZmF1bHQobWluaW11bVZhbHVlLCAwKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChuKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm4gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChtYXhpbXVtVmFsdWUgPD0gbWluaW11bVZhbHVlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibWF4aW11bVZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1pbmltdW1WYWx1ZS4iKTsKICAgICAgICB9CiAgICAgICAgKytuOwogICAgICAgIGlmIChuID4gbWF4aW11bVZhbHVlKSB7CiAgICAgICAgICBuID0gbWluaW11bVZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5pc1Bvd2VyT2ZUd28gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCB8fCBuID4gNDI5NDk2NzI5NSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuICE9PSAwICYmIChuICYgbiAtIDEpID09PSAwOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5leHRQb3dlck9mVHdvID0gZnVuY3Rpb24obikgewogICAgICAgIGlmICh0eXBlb2YgbiAhPT0gIm51bWJlciIgfHwgbiA8IDAgfHwgbiA+IDIxNDc0ODM2NDgpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIC0tbjsKICAgICAgICBuIHw9IG4gPj4gMTsKICAgICAgICBuIHw9IG4gPj4gMjsKICAgICAgICBuIHw9IG4gPj4gNDsKICAgICAgICBuIHw9IG4gPj4gODsKICAgICAgICBuIHw9IG4gPj4gMTY7CiAgICAgICAgKytuOwogICAgICAgIHJldHVybiBuOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnByZXZpb3VzUG93ZXJPZlR3byA9IGZ1bmN0aW9uKG4pIHsKICAgICAgICBpZiAodHlwZW9mIG4gIT09ICJudW1iZXIiIHx8IG4gPCAwIHx8IG4gPiA0Mjk0OTY3Mjk1KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAoMl4zMiktMSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgbiB8PSBuID4+IDE7CiAgICAgICAgbiB8PSBuID4+IDI7CiAgICAgICAgbiB8PSBuID4+IDQ7CiAgICAgICAgbiB8PSBuID4+IDg7CiAgICAgICAgbiB8PSBuID4+IDE2OwogICAgICAgIG4gfD0gbiA+PiAzMjsKICAgICAgICBuID0gKG4gPj4+IDApIC0gKG4gPj4+IDEpOwogICAgICAgIHJldHVybiBuOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNsYW1wID0gZnVuY3Rpb24odmFsdWUsIG1pbjMsIG1heDMpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibWluIiwgbWluMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJtYXgiLCBtYXgzKTsKICAgICAgICByZXR1cm4gdmFsdWUgPCBtaW4zID8gbWluMyA6IHZhbHVlID4gbWF4MyA/IG1heDMgOiB2YWx1ZTsKICAgICAgfTsKICAgICAgcmFuZG9tTnVtYmVyR2VuZXJhdG9yID0gbmV3IGltcG9ydF9tZXJzZW5uZV90d2lzdGVyLmRlZmF1bHQoKTsKICAgICAgQ2VzaXVtTWF0aC5zZXRSYW5kb21OdW1iZXJTZWVkID0gZnVuY3Rpb24oc2VlZCkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHNlZWQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2VlZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmFuZG9tTnVtYmVyR2VuZXJhdG9yID0gbmV3IGltcG9ydF9tZXJzZW5uZV90d2lzdGVyLmRlZmF1bHQoc2VlZCk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubmV4dFJhbmRvbU51bWJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByYW5kb21OdW1iZXJHZW5lcmF0b3IucmFuZG9tKCk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgucmFuZG9tQmV0d2VlbiA9IGZ1bmN0aW9uKG1pbjMsIG1heDMpIHsKICAgICAgICByZXR1cm4gQ2VzaXVtTWF0aC5uZXh0UmFuZG9tTnVtYmVyKCkgKiAobWF4MyAtIG1pbjMpICsgbWluMzsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5hY29zQ2xhbXBlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmFjb3MoQ2VzaXVtTWF0aC5jbGFtcCh2YWx1ZSwgLTEsIDEpKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5hc2luQ2xhbXBlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgidmFsdWUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmFzaW4oQ2VzaXVtTWF0aC5jbGFtcCh2YWx1ZSwgLTEsIDEpKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jaG9yZExlbmd0aCA9IGZ1bmN0aW9uKGFuZ2xlLCByYWRpdXMpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmFkaXVzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJhZGl1cyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDIgKiByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSAqIDAuNSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubG9nQmFzZSA9IGZ1bmN0aW9uKG51bWJlciwgYmFzZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG51bWJlcikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGJhc2UpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYmFzZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE1hdGgubG9nKG51bWJlcikgLyBNYXRoLmxvZyhiYXNlKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jYnJ0ID0gZGVmYXVsdFZhbHVlX2RlZmF1bHQoTWF0aC5jYnJ0LCBmdW5jdGlvbiBjYnJ0KG51bWJlcikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IE1hdGgucG93KE1hdGguYWJzKG51bWJlciksIDEgLyAzKTsKICAgICAgICByZXR1cm4gbnVtYmVyIDwgMCA/IC1yZXN1bHQgOiByZXN1bHQ7CiAgICAgIH0pOwogICAgICBDZXNpdW1NYXRoLmxvZzIgPSBkZWZhdWx0VmFsdWVfZGVmYXVsdChNYXRoLmxvZzIsIGZ1bmN0aW9uIGxvZzIobnVtYmVyKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubG9nKG51bWJlcikgKiBNYXRoLkxPRzJFOwogICAgICB9KTsKICAgICAgQ2VzaXVtTWF0aC5mb2cgPSBmdW5jdGlvbihkaXN0YW5jZVRvQ2FtZXJhLCBkZW5zaXR5KSB7CiAgICAgICAgY29uc3Qgc2NhbGFyID0gZGlzdGFuY2VUb0NhbWVyYSAqIGRlbnNpdHk7CiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLmV4cCgtKHNjYWxhciAqIHNjYWxhcikpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ4IiwgeCk7CiAgICAgICAgcmV0dXJuIHggKiAoLTAuMTc4NCAqIE1hdGguYWJzKHgpIC0gMC4wNjYzICogeCAqIHggKyAxLjAzMDEpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4yID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieCIsIHgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieSIsIHkpOwogICAgICAgIGxldCBvcHBvc2l0ZTsKICAgICAgICBsZXQgdCA9IE1hdGguYWJzKHgpOwogICAgICAgIG9wcG9zaXRlID0gTWF0aC5hYnMoeSk7CiAgICAgICAgY29uc3QgYWRqYWNlbnQgPSBNYXRoLm1heCh0LCBvcHBvc2l0ZSk7CiAgICAgICAgb3Bwb3NpdGUgPSBNYXRoLm1pbih0LCBvcHBvc2l0ZSk7CiAgICAgICAgY29uc3Qgb3Bwb3NpdGVPdmVyQWRqYWNlbnQgPSBvcHBvc2l0ZSAvIGFkamFjZW50OwogICAgICAgIGlmIChpc05hTihvcHBvc2l0ZU92ZXJBZGphY2VudCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpOwogICAgICAgIH0KICAgICAgICB0ID0gQ2VzaXVtTWF0aC5mYXN0QXBwcm94aW1hdGVBdGFuKG9wcG9zaXRlT3ZlckFkamFjZW50KTsKICAgICAgICB0ID0gTWF0aC5hYnMoeSkgPiBNYXRoLmFicyh4KSA/IENlc2l1bU1hdGguUElfT1ZFUl9UV08gLSB0IDogdDsKICAgICAgICB0ID0geCA8IDAgPyBDZXNpdW1NYXRoLlBJIC0gdCA6IHQ7CiAgICAgICAgdCA9IHkgPCAwID8gLXQgOiB0OwogICAgICAgIHJldHVybiB0OwogICAgICB9OwogICAgICBNYXRoX2RlZmF1bHQgPSBDZXNpdW1NYXRoOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuMy5qcwogIGZ1bmN0aW9uIENhcnRlc2lhbjMoeCwgeSwgeikgewogICAgdGhpcy54ID0gZGVmYXVsdFZhbHVlX2RlZmF1bHQoeCwgMCk7CiAgICB0aGlzLnkgPSBkZWZhdWx0VmFsdWVfZGVmYXVsdCh5LCAwKTsKICAgIHRoaXMueiA9IGRlZmF1bHRWYWx1ZV9kZWZhdWx0KHosIDApOwogIH0KICB2YXIgZGlzdGFuY2VTY3JhdGNoLCBsZXJwU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDIsIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gsIHNjcmF0Y2hOLCBzY3JhdGNoSywgd2dzODRSYWRpaVNxdWFyZWQsIENhcnRlc2lhbjNfZGVmYXVsdDsKICB2YXIgaW5pdF9DYXJ0ZXNpYW4zID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DYXJ0ZXNpYW4zLmpzIigpIHsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmF1bHRWYWx1ZSgpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBpbml0X01hdGgoKTsKICAgICAgQ2FydGVzaWFuMy5mcm9tU3BoZXJpY2FsID0gZnVuY3Rpb24oc3BoZXJpY2FsLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNwaGVyaWNhbCIsIHNwaGVyaWNhbCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2xvY2sgPSBzcGhlcmljYWwuY2xvY2s7CiAgICAgICAgY29uc3QgY29uZSA9IHNwaGVyaWNhbC5jb25lOwogICAgICAgIGNvbnN0IG1hZ25pdHVkZSA9IGRlZmF1bHRWYWx1ZV9kZWZhdWx0KHNwaGVyaWNhbC5tYWduaXR1ZGUsIDEpOwogICAgICAgIGNvbnN0IHJhZGlhbCA9IG1hZ25pdHVkZSAqIE1hdGguc2luKGNvbmUpOwogICAgICAgIHJlc3VsdC54ID0gcmFkaWFsICogTWF0aC5jb3MoY2xvY2spOwogICAgICAgIHJlc3VsdC55ID0gcmFkaWFsICogTWF0aC5zaW4oY2xvY2spOwogICAgICAgIHJlc3VsdC56ID0gbWFnbml0dWRlICogTWF0aC5jb3MoY29uZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5mcm9tRWxlbWVudHMgPSBmdW5jdGlvbih4LCB5LCB6LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjMoeCwgeSwgeik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuY2xvbmUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydGVzaWFuMTEpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjMoY2FydGVzaWFuMTEueCwgY2FydGVzaWFuMTEueSwgY2FydGVzaWFuMTEueik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0LnogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZnJvbUNhcnRlc2lhbjQgPSBDYXJ0ZXNpYW4zLmNsb25lOwogICAgICBDYXJ0ZXNpYW4zLnBhY2tlZExlbmd0aCA9IDM7CiAgICAgIENhcnRlc2lhbjMucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gZGVmYXVsdFZhbHVlX2RlZmF1bHQoc3RhcnRpbmdJbmRleCwgMCk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLng7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLnk7CiAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleF0gPSB2YWx1ZS56OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy51bnBhY2sgPSBmdW5jdGlvbihhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gZGVmYXVsdFZhbHVlX2RlZmF1bHQoc3RhcnRpbmdJbmRleCwgMCk7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0LnggPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC55ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICByZXN1bHQueiA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMucGFja0FycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGNvbnN0IHJlc3VsdExlbmd0aCA9IGxlbmd0aCAqIDM7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHJlc3VsdExlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoICE9PSByZXN1bHRMZW5ndGgpIHsKICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSByZXN1bHRMZW5ndGg7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIENhcnRlc2lhbjMucGFjayhhcnJheVtpXSwgcmVzdWx0LCBpICogMyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMudW5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIiwgYXJyYXkubGVuZ3RoLCAzKTsKICAgICAgICBpZiAoYXJyYXkubGVuZ3RoICUgMyAhPT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGggLyAzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aCAvIDM7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAvIDM7CiAgICAgICAgICByZXN1bHRbaW5kZXhdID0gQ2FydGVzaWFuMy51bnBhY2soYXJyYXksIGksIHJlc3VsdFtpbmRleF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmZyb21BcnJheSA9IENhcnRlc2lhbjMudW5wYWNrOwogICAgICBDYXJ0ZXNpYW4zLm1heGltdW1Db21wb25lbnQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIHJldHVybiBNYXRoLm1heChjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5taW5pbXVtQ29tcG9uZW50ID0gZnVuY3Rpb24oY2FydGVzaWFuMTEpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICByZXR1cm4gTWF0aC5taW4oY2FydGVzaWFuMTEueCwgY2FydGVzaWFuMTEueSwgY2FydGVzaWFuMTEueik7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubWluaW11bUJ5Q29tcG9uZW50ID0gZnVuY3Rpb24oZmlyc3QsIHNlY29uZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsIGZpcnN0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNlY29uZCIsIHNlY29uZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gTWF0aC5taW4oZmlyc3QueCwgc2Vjb25kLngpOwogICAgICAgIHJlc3VsdC55ID0gTWF0aC5taW4oZmlyc3QueSwgc2Vjb25kLnkpOwogICAgICAgIHJlc3VsdC56ID0gTWF0aC5taW4oZmlyc3Queiwgc2Vjb25kLnopOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubWF4aW11bUJ5Q29tcG9uZW50ID0gZnVuY3Rpb24oZmlyc3QsIHNlY29uZCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsIGZpcnN0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNlY29uZCIsIHNlY29uZCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gTWF0aC5tYXgoZmlyc3QueCwgc2Vjb25kLngpOwogICAgICAgIHJlc3VsdC55ID0gTWF0aC5tYXgoZmlyc3QueSwgc2Vjb25kLnkpOwogICAgICAgIHJlc3VsdC56ID0gTWF0aC5tYXgoZmlyc3Queiwgc2Vjb25kLnopOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuY2xhbXAgPSBmdW5jdGlvbih2YWx1ZSwgbWluMywgbWF4MywgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoIm1pbiIsIG1pbjMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWF4IiwgbWF4Myk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IHggPSBNYXRoX2RlZmF1bHQuY2xhbXAodmFsdWUueCwgbWluMy54LCBtYXgzLngpOwogICAgICAgIGNvbnN0IHkgPSBNYXRoX2RlZmF1bHQuY2xhbXAodmFsdWUueSwgbWluMy55LCBtYXgzLnkpOwogICAgICAgIGNvbnN0IHogPSBNYXRoX2RlZmF1bHQuY2xhbXAodmFsdWUueiwgbWluMy56LCBtYXgzLnopOwogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubWFnbml0dWRlU3F1YXJlZCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmV0dXJuIGNhcnRlc2lhbjExLnggKiBjYXJ0ZXNpYW4xMS54ICsgY2FydGVzaWFuMTEueSAqIGNhcnRlc2lhbjExLnkgKyBjYXJ0ZXNpYW4xMS56ICogY2FydGVzaWFuMTEuejsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tYWduaXR1ZGUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIHJldHVybiBNYXRoLnNxcnQoQ2FydGVzaWFuMy5tYWduaXR1ZGVTcXVhcmVkKGNhcnRlc2lhbjExKSk7CiAgICAgIH07CiAgICAgIGRpc3RhbmNlU2NyYXRjaCA9IG5ldyBDYXJ0ZXNpYW4zKCk7CiAgICAgIENhcnRlc2lhbjMuZGlzdGFuY2UgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2FydGVzaWFuMy5zdWJ0cmFjdChsZWZ0LCByaWdodCwgZGlzdGFuY2VTY3JhdGNoKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMy5tYWduaXR1ZGUoZGlzdGFuY2VTY3JhdGNoKTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5kaXN0YW5jZVNxdWFyZWQgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2FydGVzaWFuMy5zdWJ0cmFjdChsZWZ0LCByaWdodCwgZGlzdGFuY2VTY3JhdGNoKTsKICAgICAgICByZXR1cm4gQ2FydGVzaWFuMy5tYWduaXR1ZGVTcXVhcmVkKGRpc3RhbmNlU2NyYXRjaCk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubm9ybWFsaXplID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICBjb25zdCBtYWduaXR1ZGUgPSBDYXJ0ZXNpYW4zLm1hZ25pdHVkZShjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmVzdWx0LnggPSBjYXJ0ZXNpYW4xMS54IC8gbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC55ID0gY2FydGVzaWFuMTEueSAvIG1hZ25pdHVkZTsKICAgICAgICByZXN1bHQueiA9IGNhcnRlc2lhbjExLnogLyBtYWduaXR1ZGU7CiAgICAgICAgaWYgKGlzTmFOKHJlc3VsdC54KSB8fCBpc05hTihyZXN1bHQueSkgfHwgaXNOYU4ocmVzdWx0LnopKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZG90ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIHJldHVybiBsZWZ0LnggKiByaWdodC54ICsgbGVmdC55ICogcmlnaHQueSArIGxlZnQueiAqIHJpZ2h0Lno7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubXVsdGlwbHlDb21wb25lbnRzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54ICogcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSAqIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogKiByaWdodC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZGl2aWRlQ29tcG9uZW50cyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGxlZnQueCAvIHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0LnkgPSBsZWZ0LnkgLyByaWdodC55OwogICAgICAgIHJlc3VsdC56ID0gbGVmdC56IC8gcmlnaHQuejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmFkZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImxlZnQiLCBsZWZ0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJpZ2h0IiwgcmlnaHQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGxlZnQueCArIHJpZ2h0Lng7CiAgICAgICAgcmVzdWx0LnkgPSBsZWZ0LnkgKyByaWdodC55OwogICAgICAgIHJlc3VsdC56ID0gbGVmdC56ICsgcmlnaHQuejsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLnN1YnRyYWN0ID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54IC0gcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSAtIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogLSByaWdodC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMubXVsdGlwbHlCeVNjYWxhciA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCBzY2FsYXIsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9i