cesium
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
71 lines (69 loc) • 14.8 MB
JavaScript
/**
* @license
* Cesium - https://github.com/CesiumGS/cesium
* Version 1.140.0
*
* 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.
*/
"use strict";
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 __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
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);
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
// Build/InlineWorkers.js
var require_InlineWorkers = __commonJS({
"Build/InlineWorkers.js"() {
"use strict";
globalThis.CESIUM_WORKERS = atob("dmFyIENlc2l1bVdvcmtlcnMgPSAoKCkgPT4gewogIHZhciBfX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7CiAgdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICB2YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgdmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICB2YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgX19yZXF1aXJlID0gLyogQF9fUFVSRV9fICovICgoeCkgPT4gdHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZSA6IHR5cGVvZiBQcm94eSAhPT0gInVuZGVmaW5lZCIgPyBuZXcgUHJveHkoeCwgewogICAgZ2V0OiAoYTMsIGIpID0+ICh0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogYTMpW2JdCiAgfSkgOiB4KShmdW5jdGlvbih4KSB7CiAgICBpZiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyArIHggKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgfSk7CiAgdmFyIF9fZ2xvYiA9IChtYXApID0+IChwYXRoKSA9PiB7CiAgICB2YXIgZm4gPSBtYXBbcGF0aF07CiAgICBpZiAoZm4pIHJldHVybiBmbigpOwogICAgdGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIiArIHBhdGgpOwogIH07CiAgdmFyIF9fZXNtID0gKGZuLCByZXMpID0+IGZ1bmN0aW9uIF9faW5pdCgpIHsKICAgIHJldHVybiBmbiAmJiAocmVzID0gKDAsIGZuW19fZ2V0T3duUHJvcE5hbWVzKGZuKVswXV0pKGZuID0gMCkpLCByZXM7CiAgfTsKICB2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogICAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7CiAgfTsKICB2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHsKICAgIGZvciAodmFyIG5hbWUgaW4gYWxsKQogICAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwogIH07CiAgdmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHsKICAgIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSAib2JqZWN0IiB8fCB0eXBlb2YgZnJvbSA9PT0gImZ1bmN0aW9uIikgewogICAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpCiAgICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdCkKICAgICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICAgIH0KICAgIHJldHVybiB0bzsKICB9OwogIHZhciBfX3RvRVNNID0gKG1vZCwgaXNOb2RlTW9kZSwgdGFyZ2V0KSA9PiAodGFyZ2V0ID0gbW9kICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kKSkgOiB7fSwgX19jb3B5UHJvcHMoCiAgICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNCiAgICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogICAgLy8gY29tcGF0aWJsZSB0cmFuc2Zvcm0gKGkuZS4gIl9fZXNNb2R1bGUiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldAogICAgLy8gImRlZmF1bHQiIHRvIHRoZSBDb21tb25KUyAibW9kdWxlLmV4cG9ydHMiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuCiAgICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgICBtb2QKICApKTsKICB2YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9kZWZpbmVkLmpzCiAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWUgIT09IG51bGw7CiAgfQogIHZhciBkZWZpbmVkX2RlZmF1bHQ7CiAgdmFyIGluaXRfZGVmaW5lZCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvZGVmaW5lZC5qcyIoKSB7CiAgICAgIGRlZmluZWRfZGVmYXVsdCA9IGRlZmluZWQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9EZXZlbG9wZXJFcnJvci5qcwogIGZ1bmN0aW9uIERldmVsb3BlckVycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJEZXZlbG9wZXJFcnJvciI7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgbGV0IHN0YWNrOwogICAgdHJ5IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHN0YWNrID0gZS5zdGFjazsKICAgIH0KICAgIHRoaXMuc3RhY2sgPSBzdGFjazsKICB9CiAgdmFyIERldmVsb3BlckVycm9yX2RlZmF1bHQ7CiAgdmFyIGluaXRfRGV2ZWxvcGVyRXJyb3IgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0RldmVsb3BlckVycm9yLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoT2JqZWN0LmNyZWF0ZSkpIHsKICAgICAgICBEZXZlbG9wZXJFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGV2ZWxvcGVyRXJyb3I7CiAgICAgIH0KICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IHN0ciA9IGAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLnN0YWNrKSkgewogICAgICAgICAgc3RyICs9IGAKJHt0aGlzLnN0YWNrLnRvU3RyaW5nKCl9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfTsKICAgICAgRGV2ZWxvcGVyRXJyb3IudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3IoCiAgICAgICAgICAiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIgogICAgICAgICk7CiAgICAgIH07CiAgICAgIERldmVsb3BlckVycm9yX2RlZmF1bHQgPSBEZXZlbG9wZXJFcnJvcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NoZWNrLmpzCiAgZnVuY3Rpb24gZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpIHsKICAgIHJldHVybiBgJHtuYW1lfSBpcyByZXF1aXJlZCwgYWN0dWFsIHZhbHVlIHdhcyB1bmRlZmluZWRgOwogIH0KICBmdW5jdGlvbiBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQsIG5hbWUpIHsKICAgIHJldHVybiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSB0eXBlb2YgJHtleHBlY3RlZH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7YWN0dWFsfWA7CiAgfQogIHZhciBDaGVjaywgQ2hlY2tfZGVmYXVsdDsKICB2YXIgaW5pdF9DaGVjayA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2hlY2suanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDaGVjayA9IHt9OwogICAgICBDaGVjay50eXBlT2YgPSB7fTsKICAgICAgQ2hlY2suZGVmaW5lZCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0ZXN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5mdW5jID0gZnVuY3Rpb24obmFtZSwgdGVzdCkgewogICAgICAgIGlmICh0eXBlb2YgdGVzdCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJmdW5jdGlvbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLnN0cmluZyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgInN0cmluZyIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlciA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm51bWJlciIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5sZXNzVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGxlc3MgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm9iamVjdCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm9iamVjdCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJvb2wgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAiYm9vbGVhbiIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKHR5cGVvZiB0ZXN0LCAiYm9vbGVhbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJpZ2ludCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJiaWdpbnQiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgImJpZ2ludCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5lcXVhbHMgPSBmdW5jdGlvbihuYW1lMSwgbmFtZTIsIHRlc3QxLCB0ZXN0MikgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZTEsIHRlc3QxKTsKICAgICAgICBDaGVjay50eXBlT2YubnVtYmVyKG5hbWUyLCB0ZXN0Mik7CiAgICAgICAgaWYgKHRlc3QxICE9PSB0ZXN0MikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGAke25hbWUxfSBtdXN0IGJlIGVxdWFsIHRvICR7bmFtZTJ9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHt0ZXN0MX0gYW5kICR7dGVzdDJ9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrX2RlZmF1bHQgPSBDaGVjazsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMKICB2YXIgcmVxdWlyZV9tZXJzZW5uZV90d2lzdGVyID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgdmFyIE1lcnNlbm5lVHdpc3RlcjIgPSBmdW5jdGlvbihzZWVkKSB7CiAgICAgICAgaWYgKHNlZWQgPT0gdm9pZCAwKSB7CiAgICAgICAgICBzZWVkID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuTiA9IDYyNDsKICAgICAgICB0aGlzLk0gPSAzOTc7CiAgICAgICAgdGhpcy5NQVRSSVhfQSA9IDI1Njc0ODM2MTU7CiAgICAgICAgdGhpcy5VUFBFUl9NQVNLID0gMjE0NzQ4MzY0ODsKICAgICAgICB0aGlzLkxPV0VSX01BU0sgPSAyMTQ3NDgzNjQ3OwogICAgICAgIHRoaXMubXQgPSBuZXcgQXJyYXkodGhpcy5OKTsKICAgICAgICB0aGlzLm10aSA9IHRoaXMuTiArIDE7CiAgICAgICAgaWYgKHNlZWQuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgIHRoaXMuaW5pdF9ieV9hcnJheShzZWVkLCBzZWVkLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuaW5pdF9zZWVkKHNlZWQpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUuaW5pdF9zZWVkID0gZnVuY3Rpb24ocykgewogICAgICAgIHRoaXMubXRbMF0gPSBzID4+PiAwOwogICAgICAgIGZvciAodGhpcy5tdGkgPSAxOyB0aGlzLm10aSA8IHRoaXMuTjsgdGhpcy5tdGkrKykgewogICAgICAgICAgdmFyIHMgPSB0aGlzLm10W3RoaXMubXRpIC0gMV0gXiB0aGlzLm10W3RoaXMubXRpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFt0aGlzLm10aV0gPSAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE4MTI0MzMyNTMgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxODEyNDMzMjUzICsgdGhpcy5tdGk7CiAgICAgICAgICB0aGlzLm10W3RoaXMubXRpXSA+Pj49IDA7CiAgICAgICAgfQogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5ID0gZnVuY3Rpb24oaW5pdF9rZXksIGtleV9sZW5ndGgpIHsKICAgICAgICB2YXIgaSwgaiwgazsKICAgICAgICB0aGlzLmluaXRfc2VlZCgxOTY1MDIxOCk7CiAgICAgICAgaSA9IDE7CiAgICAgICAgaiA9IDA7CiAgICAgICAgayA9IHRoaXMuTiA+IGtleV9sZW5ndGggPyB0aGlzLk4gOiBrZXlfbGVuZ3RoOwogICAgICAgIGZvciAoOyBrOyBrLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFtpIC0gMV0gXiB0aGlzLm10W2kgLSAxXSA+Pj4gMzA7CiAgICAgICAgICB0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE2NjQ1MjUgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxNjY0NTI1KSArIGluaXRfa2V5W2pdICsgajsKICAgICAgICAgIHRoaXMubXRbaV0gPj4+PSAwOwogICAgICAgICAgaSsrOwogICAgICAgICAgaisrOwogICAgICAgICAgaWYgKGkgPj0gdGhpcy5OKSB7CiAgICAgICAgICAgIHRoaXMubXRbMF0gPSB0aGlzLm10W3RoaXMuTiAtIDFdOwogICAgICAgICAgICBpID0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChqID49IGtleV9sZW5ndGgpIGogPSAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGsgPSB0aGlzLk4gLSAxOyBrOyBrLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFtpIC0gMV0gXiB0aGlzLm10W2kgLSAxXSA+Pj4gMzA7CiAgICAgICAgICB0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE1NjYwODM5NDEgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxNTY2MDgzOTQxKSAtIGk7CiAgICAgICAgICB0aGlzLm10W2ldID4+Pj0gMDsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGlmIChpID49IHRoaXMuTikgewogICAgICAgICAgICB0aGlzLm10WzBdID0gdGhpcy5tdFt0aGlzLk4gLSAxXTsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMubXRbMF0gPSAyMTQ3NDgzNjQ4OwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21faW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHk7CiAgICAgICAgdmFyIG1hZzAxID0gbmV3IEFycmF5KDAsIHRoaXMuTUFUUklYX0EpOwogICAgICAgIGlmICh0aGlzLm10aSA+PSB0aGlzLk4pIHsKICAgICAgICAgIHZhciBrazsKICAgICAgICAgIGlmICh0aGlzLm10aSA9PSB0aGlzLk4gKyAxKQogICAgICAgICAgICB0aGlzLmluaXRfc2VlZCg1NDg5KTsKICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IHRoaXMuTiAtIHRoaXMuTTsga2srKykgewogICAgICAgICAgICB5ID0gdGhpcy5tdFtra10gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10W2trICsgMV0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICAgIHRoaXMubXRba2tdID0gdGhpcy5tdFtrayArIHRoaXMuTV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgfQogICAgICAgICAgZm9yICg7IGtrIDwgdGhpcy5OIC0gMTsga2srKykgewogICAgICAgICAgICB5ID0gdGhpcy5tdFtra10gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10W2trICsgMV0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICAgIHRoaXMubXRba2tdID0gdGhpcy5tdFtrayArICh0aGlzLk0gLSB0aGlzLk4pXSBeIHkgPj4+IDEgXiBtYWcwMVt5ICYgMV07CiAgICAgICAgICB9CiAgICAgICAgICB5ID0gdGhpcy5tdFt0aGlzLk4gLSAxXSAmIHRoaXMuVVBQRVJfTUFTSyB8IHRoaXMubXRbMF0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICB0aGlzLm10W3RoaXMuTiAtIDFdID0gdGhpcy5tdFt0aGlzLk0gLSAxXSBeIHkgPj4+IDEgXiBtYWcwMVt5ICYgMV07CiAgICAgICAgICB0aGlzLm10aSA9IDA7CiAgICAgICAgfQogICAgICAgIHkgPSB0aGlzLm10W3RoaXMubXRpKytdOwogICAgICAgIHkgXj0geSA+Pj4gMTE7CiAgICAgICAgeSBePSB5IDw8IDcgJiAyNjM2OTI4NjQwOwogICAgICAgIHkgXj0geSA8PCAxNSAmIDQwMjI3MzA3NTI7CiAgICAgICAgeSBePSB5ID4+PiAxODsKICAgICAgICByZXR1cm4geSA+Pj4gMDsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2ludDMxID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmFuZG9tX2ludCgpID4+PiAxOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21faW5jbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSAqICgxIC8gNDI5NDk2NzI5NSk7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSAqICgxIC8gNDI5NDk2NzI5Nik7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbV9leGNsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnJhbmRvbV9pbnQoKSArIDAuNSkgKiAoMSAvIDQyOTQ5NjcyOTYpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21fbG9uZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhMyA9IHRoaXMucmFuZG9tX2ludCgpID4+PiA1LCBiID0gdGhpcy5yYW5kb21faW50KCkgPj4+IDY7CiAgICAgICAgcmV0dXJuIChhMyAqIDY3MTA4ODY0ICsgYikgKiAoMSAvIDkwMDcxOTkyNTQ3NDA5OTIpOwogICAgICB9OwogICAgICBtb2R1bGUuZXhwb3J0cyA9IE1lcnNlbm5lVHdpc3RlcjI7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9NYXRoLmpzCiAgdmFyIGltcG9ydF9tZXJzZW5uZV90d2lzdGVyLCBDZXNpdW1NYXRoLCBmYWN0b3JpYWxzLCByYW5kb21OdW1iZXJHZW5lcmF0b3IsIE1hdGhfZGVmYXVsdDsKICB2YXIgaW5pdF9NYXRoID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9NYXRoLmpzIigpIHsKICAgICAgaW1wb3J0X21lcnNlbm5lX3R3aXN0ZXIgPSBfX3RvRVNNKHJlcXVpcmVfbWVyc2VubmVfdHdpc3RlcigpLCAxKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDZXNpdW1NYXRoID0ge307CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEgPSAwLjE7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIgPSAwLjAxOwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04zID0gMWUtMzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONCA9IDFlLTQ7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjUgPSAxZS01OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT042ID0gMWUtNjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONyA9IDFlLTc7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjggPSAxZS04OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT045ID0gMWUtOTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTAgPSAxZS0xMDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTEgPSAxZS0xMTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTIgPSAxZS0xMjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTMgPSAxZS0xMzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTQgPSAxZS0xNDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTUgPSAxZS0xNTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTYgPSAxZS0xNjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTcgPSAxZS0xNzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTggPSAxZS0xODsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTkgPSAxZS0xOTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMjAgPSAxZS0yMDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMjEgPSAxZS0yMTsKICAgICAgQ2VzaXVtTWF0aC5HUkFWSVRBVElPTkFMUEFSQU1FVEVSID0gMzk4NjAwNDQxOGU1OwogICAgICBDZXNpdW1NYXRoLlNPTEFSX1JBRElVUyA9IDY5NTVlNTsKICAgICAgQ2VzaXVtTWF0aC5MVU5BUl9SQURJVVMgPSAxNzM3NDAwOwogICAgICBDZXNpdW1NYXRoLlNJWFRZX0ZPVVJfS0lMT0JZVEVTID0gNjQgKiAxMDI0OwogICAgICBDZXNpdW1NYXRoLkZPVVJfR0lHQUJZVEVTID0gNCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKICAgICAgQ2VzaXVtTWF0aC5zaWduID0gTWF0aC5zaWduID8/IGZ1bmN0aW9uIHNpZ24odmFsdWUpIHsKICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgIT09IHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZSA+IDAgPyAxIDogLTE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguc2lnbk5vdFplcm8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAtMSA6IDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgudG9TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSByYW5nZU1heGltdW0gPz8gMjU1OwogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKAogICAgICAgICAgKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSAqIDAuNSArIDAuNSkgKiByYW5nZU1heGltdW0KICAgICAgICApOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZyb21TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSByYW5nZU1heGltdW0gPz8gMjU1OwogICAgICAgIHJldHVybiBDZXNpdW1NYXRoLmNsYW1wKHZhbHVlLCAwLCByYW5nZU1heGltdW0pIC8gcmFuZ2VNYXhpbXVtICogMiAtIDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubm9ybWFsaXplID0gZnVuY3Rpb24odmFsdWUsIHJhbmdlTWluaW11bSwgcmFuZ2VNYXhpbXVtKSB7CiAgICAgICAgcmFuZ2VNYXhpbXVtID0gTWF0aC5tYXgocmFuZ2VNYXhpbXVtIC0gcmFuZ2VNaW5pbXVtLCAwKTsKICAgICAgICByZXR1cm4gcmFuZ2VNYXhpbXVtID09PSAwID8gMCA6IENlc2l1bU1hdGguY2xhbXAoKHZhbHVlIC0gcmFuZ2VNaW5pbXVtKSAvIHJhbmdlTWF4aW11bSwgMCwgMSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguc2luaCA9IE1hdGguc2luaCA/PyBmdW5jdGlvbiBzaW5oKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh2YWx1ZSkgLSBNYXRoLmV4cCgtdmFsdWUpKSAvIDI7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY29zaCA9IE1hdGguY29zaCA/PyBmdW5jdGlvbiBjb3NoKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh2YWx1ZSkgKyBNYXRoLmV4cCgtdmFsdWUpKSAvIDI7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVycCA9IGZ1bmN0aW9uKHAsIHEsIHRpbWUpIHsKICAgICAgICByZXR1cm4gKDEgLSB0aW1lKSAqIHAgKyB0aW1lICogcTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5QSSA9IE1hdGguUEk7CiAgICAgIENlc2l1bU1hdGguT05FX09WRVJfUEkgPSAxIC8gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTyA9IE1hdGguUEkgLyAyOwogICAgICBDZXNpdW1NYXRoLlBJX09WRVJfVEhSRUUgPSBNYXRoLlBJIC8gMzsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX0ZPVVIgPSBNYXRoLlBJIC8gNDsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1NJWCA9IE1hdGguUEkgLyA2OwogICAgICBDZXNpdW1NYXRoLlRIUkVFX1BJX09WRVJfVFdPID0gMyAqIE1hdGguUEkgLyAyOwogICAgICBDZXNpdW1NYXRoLlRXT19QSSA9IDIgKiBNYXRoLlBJOwogICAgICBDZXNpdW1NYXRoLk9ORV9PVkVSX1RXT19QSSA9IDEgLyAoMiAqIE1hdGguUEkpOwogICAgICBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRSA9IE1hdGguUEkgLyAxODA7CiAgICAgIENlc2l1bU1hdGguREVHUkVFU19QRVJfUkFESUFOID0gMTgwIC8gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5SQURJQU5TX1BFUl9BUkNTRUNPTkQgPSBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRSAvIDM2MDA7CiAgICAgIENlc2l1bU1hdGgudG9SYWRpYW5zID0gZnVuY3Rpb24oZGVncmVlcykgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRlZ3JlZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlZ3JlZXMgKiBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC50b0RlZ3JlZXMgPSBmdW5jdGlvbihyYWRpYW5zKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmFkaWFucykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYWRpYW5zIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFkaWFucyAqIENlc2l1bU1hdGguREVHUkVFU19QRVJfUkFESUFOOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNvbnZlcnRMb25naXR1ZGVSYW5nZSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHR3b1BpID0gQ2VzaXVtTWF0aC5UV09fUEk7CiAgICAgICAgY29uc3Qgc2ltcGxpZmllZCA9IGFuZ2xlIC0gTWF0aC5mbG9vcihhbmdsZSAvIHR3b1BpKSAqIHR3b1BpOwogICAgICAgIGlmIChzaW1wbGlmaWVkIDwgLU1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBzaW1wbGlmaWVkICsgdHdvUGk7CiAgICAgICAgfQogICAgICAgIGlmIChzaW1wbGlmaWVkID49IE1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBzaW1wbGlmaWVkIC0gdHdvUGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzaW1wbGlmaWVkOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNsYW1wVG9MYXRpdHVkZVJhbmdlID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguY2xhbXAoCiAgICAgICAgICBhbmdsZSwKICAgICAgICAgIC0xICogQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTywKICAgICAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9UV08KICAgICAgICApOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5lZ2F0aXZlUGlUb1BpID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFuZ2xlID49IC1DZXNpdW1NYXRoLlBJICYmIGFuZ2xlIDw9IENlc2l1bU1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBhbmdsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguemVyb1RvVHdvUGkoYW5nbGUgKyBDZXNpdW1NYXRoLlBJKSAtIENlc2l1bU1hdGguUEk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguemVyb1RvVHdvUGkgPSBmdW5jdGlvbihhbmdsZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoYW5nbGUgPj0gMCAmJiBhbmdsZSA8PSBDZXNpdW1NYXRoLlRXT19QSSkgewogICAgICAgICAgcmV0dXJuIGFuZ2xlOwogICAgICAgIH0KICAgICAgICBjb25zdCBtb2QgPSBDZXNpdW1NYXRoLm1vZChhbmdsZSwgQ2VzaXVtTWF0aC5UV09fUEkpOwogICAgICAgIGlmIChNYXRoLmFicyhtb2QpIDwgQ2VzaXVtTWF0aC5FUFNJTE9OMTQgJiYgTWF0aC5hYnMoYW5nbGUpID4gQ2VzaXVtTWF0aC5FUFNJTE9OMTQpIHsKICAgICAgICAgIHJldHVybiBDZXNpdW1NYXRoLlRXT19QSTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vZDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5tb2QgPSBmdW5jdGlvbihtLCBuKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJtIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChuKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm4gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChuID09PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZGl2aXNvciBjYW5ub3QgYmUgMC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKENlc2l1bU1hdGguc2lnbihtKSA9PT0gQ2VzaXVtTWF0aC5zaWduKG4pICYmIE1hdGguYWJzKG0pIDwgTWF0aC5hYnMobikpIHsKICAgICAgICAgIHJldHVybiBtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKG0gJSBuICsgbikgJSBuOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImxlZnQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJpZ2h0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZWxhdGl2ZUVwc2lsb24gPSByZWxhdGl2ZUVwc2lsb24gPz8gMDsKICAgICAgICBhYnNvbHV0ZUVwc2lsb24gPSBhYnNvbHV0ZUVwc2lsb24gPz8gcmVsYXRpdmVFcHNpbG9uOwogICAgICAgIGNvbnN0IGFic0RpZmYgPSBNYXRoLmFicyhsZWZ0IC0gcmlnaHQpOwogICAgICAgIHJldHVybiBhYnNEaWZmIDw9IGFic29sdXRlRXBzaWxvbiB8fCBhYnNEaWZmIDw9IHJlbGF0aXZlRXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGxlZnQpLCBNYXRoLmFicyhyaWdodCkpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxlc3NUaGFuID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlY29uZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodCA8IC1hYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImZpcnN0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFic29sdXRlRXBzaWxvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQgPCBhYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZ3JlYXRlclRoYW4gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gYWJzb2x1dGVFcHNpbG9uOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmdyZWF0ZXJUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gLWFic29sdXRlRXBzaWxvbjsKICAgICAgfTsKICAgICAgZmFjdG9yaWFscyA9IFsxXTsKICAgICAgQ2VzaXVtTWF0aC5mYWN0b3JpYWwgPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJBIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBpcyByZXF1aXJlZC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBmYWN0b3JpYWxzLmxlbmd0aDsKICAgICAgICBpZiAobiA+PSBsZW5ndGgpIHsKICAgICAgICAgIGxldCBzdW0gPSBmYWN0b3JpYWxzW2xlbmd0aCAtIDFdOwogICAgICAgICAgZm9yIChsZXQgaSA9IGxlbmd0aDsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbmV4dCA9IHN1bSAqIGk7CiAgICAgICAgICAgIGZhY3RvcmlhbHMucHVzaChuZXh0KTsKICAgICAgICAgICAgc3VtID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhY3RvcmlhbHNbbl07CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaW5jcmVtZW50V3JhcCA9IGZ1bmN0aW9uKG4sIG1heGltdW1WYWx1ZSwgbWluaW11bVZhbHVlKSB7CiAgICAgICAgbWluaW11bVZhbHVlID0gbWluaW11bVZhbHVlID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJuIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAobWF4aW11bVZhbHVlIDw9IG1pbmltdW1WYWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm1heGltdW1WYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtaW5pbXVtVmFsdWUuIik7CiAgICAgICAgfQogICAgICAgICsrbjsKICAgICAgICBpZiAobiA+IG1heGltdW1WYWx1ZSkgewogICAgICAgICAgbiA9IG1pbmltdW1WYWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaXNQb3dlck9mVHdvID0gZnVuY3Rpb24obikgewogICAgICAgIGlmICh0eXBlb2YgbiAhPT0gIm51bWJlciIgfHwgbiA8IDAgfHwgbiA+IDQyOTQ5NjcyOTUpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbiAhPT0gMCAmJiAobiAmIG4gLSAxKSA9PT0gMDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uKG4pIHsKICAgICAgICBpZiAodHlwZW9mIG4gIT09ICJudW1iZXIiIHx8IG4gPCAwIHx8IG4gPiAyMTQ3NDgzNjQ4KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyXjMxIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICAtLW47CiAgICAgICAgbiB8PSBuID4+IDE7CiAgICAgICAgbiB8PSBuID4+IDI7CiAgICAgICAgbiB8PSBuID4+IDQ7CiAgICAgICAgbiB8PSBuID4+IDg7CiAgICAgICAgbiB8PSBuID4+IDE2OwogICAgICAgICsrbjsKICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5wcmV2aW91c1Bvd2VyT2ZUd28gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCB8fCBuID4gNDI5NDk2NzI5NSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIG4gfD0gbiA+PiAxOwogICAgICAgIG4gfD0gbiA+PiAyOwogICAgICAgIG4gfD0gbiA+PiA0OwogICAgICAgIG4gfD0gbiA+PiA4OwogICAgICAgIG4gfD0gbiA+PiAxNjsKICAgICAgICBuIHw9IG4gPj4gMzI7CiAgICAgICAgbiA9IChuID4+PiAwKSAtIChuID4+PiAxKTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm1pbiIsIG1pbjMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibWF4IiwgbWF4Myk7CiAgICAgICAgcmV0dXJuIHZhbHVlIDwgbWluMyA/IG1pbjMgOiB2YWx1ZSA+IG1heDMgPyBtYXgzIDogdmFsdWU7CiAgICAgIH07CiAgICAgIHJhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBpbXBvcnRfbWVyc2VubmVfdHdpc3Rlci5kZWZhdWx0KCk7CiAgICAgIENlc2l1bU1hdGguc2V0UmFuZG9tTnVtYmVyU2VlZCA9IGZ1bmN0aW9uKHNlZWQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChzZWVkKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlZWQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBpbXBvcnRfbWVyc2VubmVfdHdpc3Rlci5kZWZhdWx0KHNlZWQpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5leHRSYW5kb21OdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmFuZG9tTnVtYmVyR2VuZXJhdG9yLnJhbmRvbSgpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnJhbmRvbUJldHdlZW4gPSBmdW5jdGlvbihtaW4zLCBtYXgzKSB7CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGgubmV4dFJhbmRvbU51bWJlcigpICogKG1heDMgLSBtaW4zKSArIG1pbjM7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguYWNvc0NsYW1wZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5hY29zKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguYXNpbkNsYW1wZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5hc2luKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2hvcmRMZW5ndGggPSBmdW5jdGlvbihhbmdsZSwgcmFkaXVzKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJhZGl1cykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYWRpdXMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAyICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGUgKiAwLjUpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxvZ0Jhc2UgPSBmdW5jdGlvbihudW1iZXIsIGJhc2UpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChudW1iZXIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibnVtYmVyIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChiYXNlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImJhc2UgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmxvZyhudW1iZXIpIC8gTWF0aC5sb2coYmFzZSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2JydCA9IE1hdGguY2JydCA/PyBmdW5jdGlvbiBjYnJ0KG51bWJlcikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IE1hdGgucG93KE1hdGguYWJzKG51bWJlciksIDEgLyAzKTsKICAgICAgICByZXR1cm4gbnVtYmVyIDwgMCA/IC1yZXN1bHQgOiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubG9nMiA9IE1hdGgubG9nMiA/PyBmdW5jdGlvbiBsb2cyKG51bWJlcikgewogICAgICAgIHJldHVybiBNYXRoLmxvZyhudW1iZXIpICogTWF0aC5MT0cyRTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5mb2cgPSBmdW5jdGlvbihkaXN0YW5jZVRvQ2FtZXJhLCBkZW5zaXR5KSB7CiAgICAgICAgY29uc3Qgc2NhbGFyID0gZGlzdGFuY2VUb0NhbWVyYSAqIGRlbnNpdHk7CiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLmV4cCgtKHNjYWxhciAqIHNjYWxhcikpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ4IiwgeCk7CiAgICAgICAgcmV0dXJuIHggKiAoLTAuMTc4NCAqIE1hdGguYWJzKHgpIC0gMC4wNjYzICogeCAqIHggKyAxLjAzMDEpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4yID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieCIsIHgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieSIsIHkpOwogICAgICAgIGxldCBvcHBvc2l0ZTsKICAgICAgICBsZXQgdCA9IE1hdGguYWJzKHgpOwogICAgICAgIG9wcG9zaXRlID0gTWF0aC5hYnMoeSk7CiAgICAgICAgY29uc3QgYWRqYWNlbnQgPSBNYXRoLm1heCh0LCBvcHBvc2l0ZSk7CiAgICAgICAgb3Bwb3NpdGUgPSBNYXRoLm1pbih0LCBvcHBvc2l0ZSk7CiAgICAgICAgY29uc3Qgb3Bwb3NpdGVPdmVyQWRqYWNlbnQgPSBvcHBvc2l0ZSAvIGFkamFjZW50OwogICAgICAgIGlmIChpc05hTihvcHBvc2l0ZU92ZXJBZGphY2VudCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpOwogICAgICAgIH0KICAgICAgICB0ID0gQ2VzaXVtTWF0aC5mYXN0QXBwcm94aW1hdGVBdGFuKG9wcG9zaXRlT3ZlckFkamFjZW50KTsKICAgICAgICB0ID0gTWF0aC5hYnMoeSkgPiBNYXRoLmFicyh4KSA/IENlc2l1bU1hdGguUElfT1ZFUl9UV08gLSB0IDogdDsKICAgICAgICB0ID0geCA8IDAgPyBDZXNpdW1NYXRoLlBJIC0gdCA6IHQ7CiAgICAgICAgdCA9IHkgPCAwID8gLXQgOiB0OwogICAgICAgIHJldHVybiB0OwogICAgICB9OwogICAgICBNYXRoX2RlZmF1bHQgPSBDZXNpdW1NYXRoOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuMy5qcwogIHZhciBDYXJ0ZXNpYW4zLCBkaXN0YW5jZVNjcmF0Y2gsIGxlcnBTY3JhdGNoLCBhbmdsZUJldHdlZW5TY3JhdGNoLCBhbmdsZUJldHdlZW5TY3JhdGNoMiwgbW9zdE9ydGhvZ29uYWxBeGlzU2NyYXRjaCwgc2NyYXRjaE4sIHNjcmF0Y2hLLCBDYXJ0ZXNpYW4zX2RlZmF1bHQ7CiAgdmFyIGluaXRfQ2FydGVzaWFuMyA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuMy5qcyIoKSB7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgaW5pdF9NYXRoKCk7CiAgICAgIENhcnRlc2lhbjMgPSBjbGFzcyBfQ2FydGVzaWFuMyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTAuMF0gVGhlIFggY29tcG9uZW50LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wLjBdIFRoZSBZIGNvbXBvbmVudC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3o9MC4wXSBUaGUgWiBjb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoeCwgeSwgeikgewogICAgICAgICAgdGhpcy54ID0geCA/PyAwOwogICAgICAgICAgdGhpcy55ID0geSA/PyAwOwogICAgICAgICAgdGhpcy56ID0geiA/PyAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyB0aGUgcHJvdmlkZWQgU3BoZXJpY2FsIGludG8gQ2FydGVzaWFuMyBjb29yZGluYXRlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3BoZXJpY2FsfSBzcGhlcmljYWwgVGhlIFNwaGVyaWNhbCB0byBiZSBjb252ZXJ0ZWQgdG8gQ2FydGVzaWFuMy4KICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjN9IFtyZXN1bHRdIFRoZSBvYmplY3Qgb250byB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICAgICAqIEByZXR1cm5zIHtDYXJ0ZXNpYW4zfSBUaGUgbW9kaWZpZWQgcmVzdWx0IHBhcmFtZXRlciBvciBhIG5ldyBDYXJ0ZXNpYW4zIGluc3RhbmNlIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmcm9tU3BoZXJpY2FsKHNwaGVyaWNhbCwgcmVzdWx0KSB7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNwaGVyaWNhbCIsIHNwaGVyaWNhbCk7CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBfQ2FydGVzaWFuMygpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY2xvY2sgPSBzcGhlcmljYWwuY2xvY2s7CiAgICAgICAgICBjb25zdCBjb25lID0gc3BoZXJpY2FsLmNvbmU7CiAgICAgICAgICBjb25zdCBtYWduaXR1ZGUgPSBzcGhlcmljYWwubWFnbml0dWRlID8/IDE7CiAgICAgICAgICBjb25zdCByYWRpYWwgPSBtYWduaXR1ZGUgKiBNYXRoLnNpbihjb25lKTsKICAgICAgICAgIHJlc3VsdC54ID0gcmFkaWFsICogTWF0aC5jb3MoY2xvY2spOwogICAgICAgICAgcmVzdWx0LnkgPSByYWRpYWwgKiBNYXRoLnNpbihjbG9jayk7CiAgICAgICAgICByZXN1bHQueiA9IG1hZ25pdHVkZSAqIE1hdGguY29zKGNvbmUpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIENhcnRlc2lhbjMgaW5zdGFuY2UgZnJvbSB4LCB5IGFuZCB6IGNvb3JkaW5hdGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHggY29vcmRpbmF0ZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeSBjb29yZGluYXRlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6IGNvb3JkaW5hdGUuCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBbcmVzdWx0XSBUaGUgb2JqZWN0IG9udG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7Q2FydGVzaWFuM30gVGhlIG1vZGlmaWVkIHJlc3VsdCBwYXJhbWV0ZXIgb3IgYSBuZXcgQ2FydGVzaWFuMyBpbnN0YW5jZSBpZiBvbmUgd2FzIG5vdCBwcm92aWRlZC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZnJvbUVsZW1lbnRzKHgsIHksIHosIHJlc3VsdCkgewogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gbmV3IF9DYXJ0ZXNpYW4zKHgsIHksIHopOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgICAgcmVzdWx0LnkgPSB5OwogICAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRHVwbGljYXRlcyBhIENhcnRlc2lhbjMgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjN9IGNhcnRlc2lhbiBUaGUgQ2FydGVzaWFuIHRvIGR1cGxpY2F0ZS4KICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjN9IFtyZXN1bHRdIFRoZSBvYmplY3Qgb250byB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICAgICAqIEByZXR1cm5zIHtDYXJ0ZXNpYW4zfSBUaGUgbW9kaWZpZWQgcmVzdWx0IHBhcmFtZXRlciBvciBhIG5ldyBDYXJ0ZXNpYW4zIGluc3RhbmNlIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLiAoUmV0dXJucyB1bmRlZmluZWQgaWYgY2FydGVzaWFuIGlzIHVuZGVmaW5lZCkKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY2xvbmUoY2FydGVzaWFuMTEsIHJlc3VsdCkgewogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydGVzaWFuMTEpKSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgX0NhcnRlc2lhbjMoY2FydGVzaWFuMTEueCwgY2FydGVzaWFuMTEueSwgY2FydGVzaWFuMTEueik7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLng7CiAgICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgICByZXN1bHQueiA9IGNhcnRlc2lhbjExLno7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdG9yZXMgdGhlIHByb3ZpZGVkIGluc3RhbmNlIGludG8gdGhlIHByb3ZpZGVkIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFjay4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcltdfSBhcnJheSBUaGUgYXJyYXkgdG8gcGFjayBpbnRvLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRpbmdJbmRleD0wXSBUaGUgaW5kZXggaW50byB0aGUgYXJyYXkgYXQgd2hpY2ggdG8gc3RhcnQgcGFja2luZyB0aGUgZWxlbWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBhcnJheSB0aGF0IHdhcyBwYWNrZWQgaW50bwogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBwYWNrKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLng7CiAgICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4KytdID0gdmFsdWUueTsKICAgICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuejsKICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFuIGluc3RhbmNlIGZyb20gYSBwYWNrZWQgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge251bWJlcltdfSBhcnJheSBUaGUgcGFja2VkIGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRpbmdJbmRleD0wXSBUaGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgdW5wYWNrZWQuCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBbcmVzdWx0XSBUaGUgb2JqZWN0IGludG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7Q2FydGVzaWFuM30gVGhlIG1vZGlmaWVkIHJlc3VsdCBwYXJhbWV0ZXIgb3IgYSBuZXcgQ2FydGVzaWFuMyBpbnN0YW5jZSBpZiBvbmUgd2FzIG5vdCBwcm92aWRlZC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgdW5wYWNrKGFycmF5LCBzdGFydGluZ0luZGV4LCByZXN1bHQpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXN1bHQgPSBuZXcgX0NhcnRlc2lhbjMoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC54ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICAgIHJlc3VsdC55ID0gYXJyYXlbc3RhcnRpbmdJbmRleCsrXTsKICAgICAgICAgIHJlc3VsdC56ID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGbGF0dGVucyBhbiBhcnJheSBvZiBDYXJ0ZXNpYW4zcyBpbnRvIGFuIGFycmF5IG9mIGNvbXBvbmVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjNbXX0gYXJyYXkgVGhlIGFycmF5IG9mIGNhcnRlc2lhbnMgdG8gcGFjay4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcltdfSBbcmVzdWx0XSBUaGUgYXJyYXkgb250byB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0LiBJZiB0aGlzIGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBhcnJheS5sZW5ndGggKiAzIGNvbXBvbmVudHMsIGVsc2UgYSB7QGxpbmsgRGV2ZWxvcGVyRXJyb3J9IHdpbGwgYmUgdGhyb3duLiBJZiBpdCBpcyBhIHJlZ3VsYXIgYXJyYXksIGl0IHdpbGwgYmUgcmVzaXplZCB0byBoYXZlIChhcnJheS5sZW5ndGggKiAzKSBlbGVtZW50cy4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBwYWNrZWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHBhY2tBcnJheShhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgICAgY29uc3QgcmVzdWx0TGVuZ3RoID0gbGVuZ3RoICogMzsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHJlc3VsdExlbmd0aCk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAgICJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSByZXN1bHRMZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIF9DYXJ0ZXNpYW4zLnBhY2soYXJyYXlbaV0sIHJlc3VsdCwgaSAqIDMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVW5wYWNrcyBhbiBhcnJheSBvZiBjYXJ0ZXNpYW4gY29tcG9uZW50cyBpbnRvIGFuIGFycmF5IG9mIENhcnRlc2lhbjNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJbXX0gYXJyYXkgVGhlIGFycmF5IG9mIGNvbXBvbmVudHMgdG8gdW5wYWNrLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM1tdfSBbcmVzdWx0XSBUaGUgYXJyYXkgb250byB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICAgICAqIEByZXR1cm5zIHtDYXJ0ZXNpYW4zW119IFRoZSB1bnBhY2tlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgdW5wYWNrQXJyYXkoYXJyYXksIHJlc3VsdCkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLCBhcnJheS5sZW5ndGgsIDMpOwogICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCAlIDMgIT09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCAvIDMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aCAvIDM7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaSAvIDM7CiAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBfQ2FydGVzaWFuMy51bnBhY2soYXJyYXksIGksIHJlc3VsdFtpbmRleF0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcHV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBtYXhpbXVtIGNvbXBvbmVudCBmb3IgdGhlIHN1cHBsaWVkIENhcnRlc2lhbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gY2FydGVzaWFuIFRoZSBjYXJ0ZXNpYW4gdG8gdXNlLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgbWF4aW11bSBjb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG1heGltdW1Db21wb25lbnQoY2FydGVzaWFuMTEpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnopOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgdmFsdWUgb2YgdGhlIG1pbmltdW0gY29tcG9uZW50IGZvciB0aGUgc3VwcGxpZWQgQ2FydGVzaWFuLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBjYXJ0ZXNpYW4gVGhlIGNhcnRlc2lhbiB0byB1c2UuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSBtaW5pbXVtIGNvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgbWluaW11bUNvbXBvbmVudChjYXJ0ZXNpYW4xMSkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgICByZXR1cm4gTWF0aC5taW4oY2FydGVzaWFuMTEueCwgY2FydGVzaWFuMTEueSwgY2FydGVzaWFuMTEueik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIHR3byBDYXJ0ZXNpYW5zIGFuZCBjb21wdXRlcyBhIENhcnRlc2lhbiB3aGljaCBjb250YWlucyB0aGUgbWluaW11bSBjb21wb25lbnRzIG9mIHRoZSBzdXBwbGllZCBDYXJ0ZXNpYW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBmaXJzdCBBIGNhcnRlc2lhbiB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gc2Vjb25kIEEgY2FydGVzaWFuIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSByZXN1bHQgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHQuCiAgICAgICAgICogQHJldHVybnMge0NhcnRlc2lhbjN9IEEgY2FydGVzaWFuIHdpdGggdGhlIG1pbmltdW0gY29tcG9uZW50cy4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGZpcnN0LCBzZWNvbmQsIHJlc3VsdCkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsIGZpcnN0KTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAgIHJlc3VsdC54ID0gTWF0aC5taW4oZmlyc3QueCwgc2Vjb25kLngpOwogICAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1pbihmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgICByZXN1bHQueiA9IE1hdGgubWluKGZpcnN0LnosIHNlY29uZC56KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbXBhcmVzIHR3byBDYXJ0ZXNpYW5zIGFuZCBjb21wdXRlcyBhIENhcnRlc2lhbiB3aGljaCBjb250YWlucyB0aGUgbWF4aW11bSBjb21wb25lbnRzIG9mIHRoZSBzdXBwbGllZCBDYXJ0ZXNpYW5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBmaXJzdCBBIGNhcnRlc2lhbiB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gc2Vjb25kIEEgY2FydGVzaWFuIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSByZXN1bHQgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHQuCiAgICAgICAgICogQHJldHVybnMge0NhcnRlc2lhbjN9IEEgY2FydGVzaWFuIHdpdGggdGhlIG1heGltdW0gY29tcG9uZW50cy4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgbWF4aW11bUJ5Q29tcG9uZW50KGZpcnN0LCBzZWNvbmQsIHJlc3VsdCkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsIGZpcnN0KTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAgIHJlc3VsdC54ID0gTWF0aC5tYXgoZmlyc3QueCwgc2Vjb25kLngpOwogICAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1heChmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgICByZXN1bHQueiA9IE1hdGgubWF4KGZpcnN0LnosIHNlY29uZC56KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cmFpbiBhI