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) • 15.4 MB
JavaScript
/**
* @license
* Cesium - https://github.com/CesiumGS/cesium
* Version 1.142.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, mod) => function __require2() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.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 = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __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 || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
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("dmFyIENlc2l1bVdvcmtlcnMgPSAoKCkgPT4gewogIHZhciBfX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7CiAgdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICB2YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgdmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICB2YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ga2V5IGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZSB9KSA6IG9ialtrZXldID0gdmFsdWU7CiAgdmFyIF9fcmVxdWlyZSA9IC8qIEBfX1BVUkVfXyAqLyAoKHgpID0+IHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmUgOiB0eXBlb2YgUHJveHkgIT09ICJ1bmRlZmluZWQiID8gbmV3IFByb3h5KHgsIHsKICAgIGdldDogKGEzLCBiKSA9PiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZSA6IGEzKVtiXQogIH0pIDogeCkoZnVuY3Rpb24oeCkgewogICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicgKyB4ICsgJyIgaXMgbm90IHN1cHBvcnRlZCcpOwogIH0pOwogIHZhciBfX2dsb2IgPSAobWFwKSA9PiAocGF0aCkgPT4gewogICAgdmFyIGZuID0gbWFwW3BhdGhdOwogICAgaWYgKGZuKSByZXR1cm4gZm4oKTsKICAgIHRocm93IG5ldyBFcnJvcigiTW9kdWxlIG5vdCBmb3VuZCBpbiBidW5kbGU6ICIgKyBwYXRoKTsKICB9OwogIHZhciBfX2VzbSA9IChmbiwgcmVzKSA9PiBmdW5jdGlvbiBfX2luaXQoKSB7CiAgICByZXR1cm4gZm4gJiYgKHJlcyA9ICgwLCBmbltfX2dldE93blByb3BOYW1lcyhmbilbMF1dKShmbiA9IDApKSwgcmVzOwogIH07CiAgdmFyIF9fY29tbW9uSlMgPSAoY2IsIG1vZCkgPT4gZnVuY3Rpb24gX19yZXF1aXJlMigpIHsKICAgIHJldHVybiBtb2QgfHwgKDAsIGNiW19fZ2V0T3duUHJvcE5hbWVzKGNiKVswXV0pKChtb2QgPSB7IGV4cG9ydHM6IHt9IH0pLmV4cG9ydHMsIG1vZCksIG1vZC5leHBvcnRzOwogIH07CiAgdmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7CiAgICBmb3IgKHZhciBuYW1lIGluIGFsbCkKICAgICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbFtuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTsKICB9OwogIHZhciBfX2NvcHlQcm9wcyA9ICh0bywgZnJvbSwgZXhjZXB0LCBkZXNjKSA9PiB7CiAgICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGZyb20gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKQogICAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpCiAgICAgICAgICBfX2RlZlByb3AodG8sIGtleSwgeyBnZXQ6ICgpID0+IGZyb21ba2V5XSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhmcm9tLCBrZXkpKSB8fCBkZXNjLmVudW1lcmFibGUgfSk7CiAgICB9CiAgICByZXR1cm4gdG87CiAgfTsKICB2YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKAogICAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTQogICAgLy8gZmlsZSB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZCB0byBhIENvbW1vbkpTIGZpbGUgdXNpbmcgYSBCYWJlbC0KICAgIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuICJfX2VzTW9kdWxlIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXQKICAgIC8vICJkZWZhdWx0IiB0byB0aGUgQ29tbW9uSlMgIm1vZHVsZS5leHBvcnRzIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LgogICAgaXNOb2RlTW9kZSB8fCAhbW9kIHx8ICFtb2QuX19lc01vZHVsZSA/IF9fZGVmUHJvcCh0YXJnZXQsICJkZWZhdWx0IiwgeyB2YWx1ZTogbW9kLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0LAogICAgbW9kCiAgKSk7CiAgdmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpOwogIHZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gInN5bWJvbCIgPyBrZXkgKyAiIiA6IGtleSwgdmFsdWUpOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvZGVmaW5lZC5qcwogIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPT0gdm9pZCAwICYmIHZhbHVlICE9PSBudWxsOwogIH0KICB2YXIgZGVmaW5lZF9kZWZhdWx0OwogIHZhciBpbml0X2RlZmluZWQgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL2RlZmluZWQuanMiKCkgewogICAgICBkZWZpbmVkX2RlZmF1bHQgPSBkZWZpbmVkOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvRGV2ZWxvcGVyRXJyb3IuanMKICBmdW5jdGlvbiBEZXZlbG9wZXJFcnJvcihtZXNzYWdlKSB7CiAgICB0aGlzLm5hbWUgPSAiRGV2ZWxvcGVyRXJyb3IiOwogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIGxldCBzdGFjazsKICAgIHRyeSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzdGFjayA9IGUuc3RhY2s7CiAgICB9CiAgICB0aGlzLnN0YWNrID0gc3RhY2s7CiAgfQogIHZhciBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0OwogIHZhciBpbml0X0RldmVsb3BlckVycm9yID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9EZXZlbG9wZXJFcnJvci5qcyIoKSB7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpZiAoZGVmaW5lZF9kZWZhdWx0KE9iamVjdC5jcmVhdGUpKSB7CiAgICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpOwogICAgICAgIERldmVsb3BlckVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERldmVsb3BlckVycm9yOwogICAgICB9CiAgICAgIERldmVsb3BlckVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGxldCBzdHIgPSBgJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gOwogICAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQodGhpcy5zdGFjaykpIHsKICAgICAgICAgIHN0ciArPSBgCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHI7CiAgICAgIH07CiAgICAgIERldmVsb3BlckVycm9yLnRocm93SW5zdGFudGlhdGlvbkVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yKAogICAgICAgICAgIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIKICAgICAgICApOwogICAgICB9OwogICAgICBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0ID0gRGV2ZWxvcGVyRXJyb3I7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9DaGVjay5qcwogIGZ1bmN0aW9uIGdldFVuZGVmaW5lZEVycm9yTWVzc2FnZShuYW1lKSB7CiAgICByZXR1cm4gYCR7bmFtZX0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYDsKICB9CiAgZnVuY3Rpb24gZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkLCBuYW1lKSB7CiAgICByZXR1cm4gYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgdHlwZW9mICR7ZXhwZWN0ZWR9LCBhY3R1YWwgdHlwZW9mIHdhcyAke2FjdHVhbH1gOwogIH0KICB2YXIgQ2hlY2ssIENoZWNrX2RlZmF1bHQ7CiAgdmFyIGluaXRfQ2hlY2sgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NoZWNrLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgQ2hlY2sgPSB7fTsKICAgICAgQ2hlY2sudHlwZU9mID0ge307CiAgICAgIENoZWNrLmRlZmluZWQgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQodGVzdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KGdldFVuZGVmaW5lZEVycm9yTWVzc2FnZShuYW1lKSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBDaGVjay50eXBlT2YuZnVuYyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKHR5cGVvZiB0ZXN0LCAiZnVuY3Rpb24iLCBuYW1lKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5zdHJpbmcgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAic3RyaW5nIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJzdHJpbmciLCBuYW1lKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJudW1iZXIiLCBuYW1lKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIubGVzc1RoYW4gPSBmdW5jdGlvbihuYW1lLCB0ZXN0LCBsaW1pdCkgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZSwgdGVzdCk7CiAgICAgICAgaWYgKHRlc3QgPj0gbGltaXQpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSBsZXNzIHRoYW4gJHtsaW1pdH0sIGFjdHVhbCB2YWx1ZSB3YXMgJHt0ZXN0fWAKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9OwogICAgICBDaGVjay50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihuYW1lLCB0ZXN0LCBsaW1pdCkgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZSwgdGVzdCk7CiAgICAgICAgaWYgKHRlc3QgPiBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbihuYW1lLCB0ZXN0LCBsaW1pdCkgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZSwgdGVzdCk7CiAgICAgICAgaWYgKHRlc3QgPD0gbGltaXQpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSBncmVhdGVyIHRoYW4gJHtsaW1pdH0sIGFjdHVhbCB2YWx1ZSB3YXMgJHt0ZXN0fWAKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9OwogICAgICBDaGVjay50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihuYW1lLCB0ZXN0LCBsaW1pdCkgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZSwgdGVzdCk7CiAgICAgICAgaWYgKHRlc3QgPCBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5vYmplY3QgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAib2JqZWN0IikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJvYmplY3QiLCBuYW1lKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5ib29sID0gZnVuY3Rpb24obmFtZSwgdGVzdCkgewogICAgICAgIGlmICh0eXBlb2YgdGVzdCAhPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgImJvb2xlYW4iLCBuYW1lKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5iaWdpbnQgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAiYmlnaW50IikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJiaWdpbnQiLCBuYW1lKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIuZXF1YWxzID0gZnVuY3Rpb24obmFtZTEsIG5hbWUyLCB0ZXN0MSwgdGVzdDIpIHsKICAgICAgICBDaGVjay50eXBlT2YubnVtYmVyKG5hbWUxLCB0ZXN0MSk7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lMiwgdGVzdDIpOwogICAgICAgIGlmICh0ZXN0MSAhPT0gdGVzdDIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBgJHtuYW1lMX0gbXVzdCBiZSBlcXVhbCB0byAke25hbWUyfSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7dGVzdDF9IGFuZCAke3Rlc3QyfWAKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9OwogICAgICBDaGVja19kZWZhdWx0ID0gQ2hlY2s7CiAgICB9CiAgfSk7CgogIC8vIG5vZGVfbW9kdWxlcy9tZXJzZW5uZS10d2lzdGVyL3NyYy9tZXJzZW5uZS10d2lzdGVyLmpzCiAgdmFyIHJlcXVpcmVfbWVyc2VubmVfdHdpc3RlciA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9tZXJzZW5uZS10d2lzdGVyL3NyYy9tZXJzZW5uZS10d2lzdGVyLmpzIihleHBvcnRzMiwgbW9kdWxlKSB7CiAgICAgIHZhciBNZXJzZW5uZVR3aXN0ZXIyID0gZnVuY3Rpb24oc2VlZCkgewogICAgICAgIGlmIChzZWVkID09IHZvaWQgMCkgewogICAgICAgICAgc2VlZCA9ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkuZ2V0VGltZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLk4gPSA2MjQ7CiAgICAgICAgdGhpcy5NID0gMzk3OwogICAgICAgIHRoaXMuTUFUUklYX0EgPSAyNTY3NDgzNjE1OwogICAgICAgIHRoaXMuVVBQRVJfTUFTSyA9IDIxNDc0ODM2NDg7CiAgICAgICAgdGhpcy5MT1dFUl9NQVNLID0gMjE0NzQ4MzY0NzsKICAgICAgICB0aGlzLm10ID0gbmV3IEFycmF5KHRoaXMuTik7CiAgICAgICAgdGhpcy5tdGkgPSB0aGlzLk4gKyAxOwogICAgICAgIGlmIChzZWVkLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CiAgICAgICAgICB0aGlzLmluaXRfYnlfYXJyYXkoc2VlZCwgc2VlZC5sZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmluaXRfc2VlZChzZWVkKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLmluaXRfc2VlZCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB0aGlzLm10WzBdID0gcyA+Pj4gMDsKICAgICAgICBmb3IgKHRoaXMubXRpID0gMTsgdGhpcy5tdGkgPCB0aGlzLk47IHRoaXMubXRpKyspIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFt0aGlzLm10aSAtIDFdIF4gdGhpcy5tdFt0aGlzLm10aSAtIDFdID4+PiAzMDsKICAgICAgICAgIHRoaXMubXRbdGhpcy5tdGldID0gKCgocyAmIDQyOTQ5MDE3NjApID4+PiAxNikgKiAxODEyNDMzMjUzIDw8IDE2KSArIChzICYgNjU1MzUpICogMTgxMjQzMzI1MyArIHRoaXMubXRpOwogICAgICAgICAgdGhpcy5tdFt0aGlzLm10aV0gPj4+PSAwOwogICAgICAgIH0KICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUuaW5pdF9ieV9hcnJheSA9IGZ1bmN0aW9uKGluaXRfa2V5LCBrZXlfbGVuZ3RoKSB7CiAgICAgICAgdmFyIGksIGosIGs7CiAgICAgICAgdGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpOwogICAgICAgIGkgPSAxOwogICAgICAgIGogPSAwOwogICAgICAgIGsgPSB0aGlzLk4gPiBrZXlfbGVuZ3RoID8gdGhpcy5OIDoga2V5X2xlbmd0aDsKICAgICAgICBmb3IgKDsgazsgay0tKSB7CiAgICAgICAgICB2YXIgcyA9IHRoaXMubXRbaSAtIDFdIF4gdGhpcy5tdFtpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFtpXSA9ICh0aGlzLm10W2ldIF4gKCgocyAmIDQyOTQ5MDE3NjApID4+PiAxNikgKiAxNjY0NTI1IDw8IDE2KSArIChzICYgNjU1MzUpICogMTY2NDUyNSkgKyBpbml0X2tleVtqXSArIGo7CiAgICAgICAgICB0aGlzLm10W2ldID4+Pj0gMDsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGorKzsKICAgICAgICAgIGlmIChpID49IHRoaXMuTikgewogICAgICAgICAgICB0aGlzLm10WzBdID0gdGhpcy5tdFt0aGlzLk4gLSAxXTsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaiA+PSBrZXlfbGVuZ3RoKSBqID0gMDsKICAgICAgICB9CiAgICAgICAgZm9yIChrID0gdGhpcy5OIC0gMTsgazsgay0tKSB7CiAgICAgICAgICB2YXIgcyA9IHRoaXMubXRbaSAtIDFdIF4gdGhpcy5tdFtpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFtpXSA9ICh0aGlzLm10W2ldIF4gKCgocyAmIDQyOTQ5MDE3NjApID4+PiAxNikgKiAxNTY2MDgzOTQxIDw8IDE2KSArIChzICYgNjU1MzUpICogMTU2NjA4Mzk0MSkgLSBpOwogICAgICAgICAgdGhpcy5tdFtpXSA+Pj49IDA7CiAgICAgICAgICBpKys7CiAgICAgICAgICBpZiAoaSA+PSB0aGlzLk4pIHsKICAgICAgICAgICAgdGhpcy5tdFswXSA9IHRoaXMubXRbdGhpcy5OIC0gMV07CiAgICAgICAgICAgIGkgPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLm10WzBdID0gMjE0NzQ4MzY0ODsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2ludCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB5OwogICAgICAgIHZhciBtYWcwMSA9IG5ldyBBcnJheSgwLCB0aGlzLk1BVFJJWF9BKTsKICAgICAgICBpZiAodGhpcy5tdGkgPj0gdGhpcy5OKSB7CiAgICAgICAgICB2YXIga2s7CiAgICAgICAgICBpZiAodGhpcy5tdGkgPT0gdGhpcy5OICsgMSkKICAgICAgICAgICAgdGhpcy5pbml0X3NlZWQoNTQ4OSk7CiAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCB0aGlzLk4gLSB0aGlzLk07IGtrKyspIHsKICAgICAgICAgICAgeSA9IHRoaXMubXRba2tdICYgdGhpcy5VUFBFUl9NQVNLIHwgdGhpcy5tdFtrayArIDFdICYgdGhpcy5MT1dFUl9NQVNLOwogICAgICAgICAgICB0aGlzLm10W2trXSA9IHRoaXMubXRba2sgKyB0aGlzLk1dIF4geSA+Pj4gMSBeIG1hZzAxW3kgJiAxXTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoOyBrayA8IHRoaXMuTiAtIDE7IGtrKyspIHsKICAgICAgICAgICAgeSA9IHRoaXMubXRba2tdICYgdGhpcy5VUFBFUl9NQVNLIHwgdGhpcy5tdFtrayArIDFdICYgdGhpcy5MT1dFUl9NQVNLOwogICAgICAgICAgICB0aGlzLm10W2trXSA9IHRoaXMubXRba2sgKyAodGhpcy5NIC0gdGhpcy5OKV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgfQogICAgICAgICAgeSA9IHRoaXMubXRbdGhpcy5OIC0gMV0gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10WzBdICYgdGhpcy5MT1dFUl9NQVNLOwogICAgICAgICAgdGhpcy5tdFt0aGlzLk4gLSAxXSA9IHRoaXMubXRbdGhpcy5NIC0gMV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgdGhpcy5tdGkgPSAwOwogICAgICAgIH0KICAgICAgICB5ID0gdGhpcy5tdFt0aGlzLm10aSsrXTsKICAgICAgICB5IF49IHkgPj4+IDExOwogICAgICAgIHkgXj0geSA8PCA3ICYgMjYzNjkyODY0MDsKICAgICAgICB5IF49IHkgPDwgMTUgJiA0MDIyNzMwNzUyOwogICAgICAgIHkgXj0geSA+Pj4gMTg7CiAgICAgICAgcmV0dXJuIHkgPj4+IDA7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbV9pbnQzMSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSA+Pj4gMTsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2luY2wgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yYW5kb21faW50KCkgKiAoMSAvIDQyOTQ5NjcyOTUpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yYW5kb21faW50KCkgKiAoMSAvIDQyOTQ5NjcyOTYpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21fZXhjbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5yYW5kb21faW50KCkgKyAwLjUpICogKDEgLyA0Mjk0OTY3Mjk2KTsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2xvbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYTMgPSB0aGlzLnJhbmRvbV9pbnQoKSA+Pj4gNSwgYiA9IHRoaXMucmFuZG9tX2ludCgpID4+PiA2OwogICAgICAgIHJldHVybiAoYTMgKiA2NzEwODg2NCArIGIpICogKDEgLyA5MDA3MTk5MjU0NzQwOTkyKTsKICAgICAgfTsKICAgICAgbW9kdWxlLmV4cG9ydHMgPSBNZXJzZW5uZVR3aXN0ZXIyOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTWF0aC5qcwogIHZhciBpbXBvcnRfbWVyc2VubmVfdHdpc3RlciwgQ2VzaXVtTWF0aCwgZmFjdG9yaWFscywgcmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBNYXRoX2RlZmF1bHQ7CiAgdmFyIGluaXRfTWF0aCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvTWF0aC5qcyIoKSB7CiAgICAgIGltcG9ydF9tZXJzZW5uZV90d2lzdGVyID0gX190b0VTTShyZXF1aXJlX21lcnNlbm5lX3R3aXN0ZXIoKSwgMSk7CiAgICAgIGluaXRfQ2hlY2soKTsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGluaXRfRGV2ZWxvcGVyRXJyb3IoKTsKICAgICAgQ2VzaXVtTWF0aCA9IHt9OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04xID0gMC4xOwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04yID0gMC4wMTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMyA9IDFlLTM7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjQgPSAxZS00OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT041ID0gMWUtNTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONiA9IDFlLTY7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjcgPSAxZS03OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT044ID0gMWUtODsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OOSA9IDFlLTk7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEwID0gMWUtMTA7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjExID0gMWUtMTE7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEyID0gMWUtMTI7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEzID0gMWUtMTM7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE0ID0gMWUtMTQ7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE1ID0gMWUtMTU7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE2ID0gMWUtMTY7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE3ID0gMWUtMTc7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE4ID0gMWUtMTg7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjE5ID0gMWUtMTk7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIwID0gMWUtMjA7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIxID0gMWUtMjE7CiAgICAgIENlc2l1bU1hdGguR1JBVklUQVRJT05BTFBBUkFNRVRFUiA9IDM5ODYwMDQ0MThlNTsKICAgICAgQ2VzaXVtTWF0aC5TT0xBUl9SQURJVVMgPSA2OTU1ZTU7CiAgICAgIENlc2l1bU1hdGguTFVOQVJfUkFESVVTID0gMTczNzQwMDsKICAgICAgQ2VzaXVtTWF0aC5TSVhUWV9GT1VSX0tJTE9CWVRFUyA9IDY0ICogMTAyNDsKICAgICAgQ2VzaXVtTWF0aC5GT1VSX0dJR0FCWVRFUyA9IDQgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CiAgICAgIENlc2l1bU1hdGguc2lnbiA9IE1hdGguc2lnbiA/PyBmdW5jdGlvbiBzaWduKHZhbHVlKSB7CiAgICAgICAgdmFsdWUgPSArdmFsdWU7CiAgICAgICAgaWYgKHZhbHVlID09PSAwIHx8IHZhbHVlICE9PSB2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUgPiAwID8gMSA6IC0xOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnNpZ25Ob3RaZXJvID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gLTEgOiAxOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnRvU05vcm0gPSBmdW5jdGlvbih2YWx1ZSwgcmFuZ2VNYXhpbXVtKSB7CiAgICAgICAgcmFuZ2VNYXhpbXVtID0gcmFuZ2VNYXhpbXVtID8/IDI1NTsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgKICAgICAgICAgIChDZXNpdW1NYXRoLmNsYW1wKHZhbHVlLCAtMSwgMSkgKiAwLjUgKyAwLjUpICogcmFuZ2VNYXhpbXVtCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5mcm9tU05vcm0gPSBmdW5jdGlvbih2YWx1ZSwgcmFuZ2VNYXhpbXVtKSB7CiAgICAgICAgcmFuZ2VNYXhpbXVtID0gcmFuZ2VNYXhpbXVtID8/IDI1NTsKICAgICAgICByZXR1cm4gQ2VzaXVtTWF0aC5jbGFtcCh2YWx1ZSwgMCwgcmFuZ2VNYXhpbXVtKSAvIHJhbmdlTWF4aW11bSAqIDIgLSAxOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1pbmltdW0sIHJhbmdlTWF4aW11bSkgewogICAgICAgIHJhbmdlTWF4aW11bSA9IE1hdGgubWF4KHJhbmdlTWF4aW11bSAtIHJhbmdlTWluaW11bSwgMCk7CiAgICAgICAgcmV0dXJuIHJhbmdlTWF4aW11bSA9PT0gMCA/IDAgOiBDZXNpdW1NYXRoLmNsYW1wKCh2YWx1ZSAtIHJhbmdlTWluaW11bSkgLyByYW5nZU1heGltdW0sIDAsIDEpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnNpbmggPSBNYXRoLnNpbmggPz8gZnVuY3Rpb24gc2luaCh2YWx1ZSkgewogICAgICAgIHJldHVybiAoTWF0aC5leHAodmFsdWUpIC0gTWF0aC5leHAoLXZhbHVlKSkgLyAyOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNvc2ggPSBNYXRoLmNvc2ggPz8gZnVuY3Rpb24gY29zaCh2YWx1ZSkgewogICAgICAgIHJldHVybiAoTWF0aC5leHAodmFsdWUpICsgTWF0aC5leHAoLXZhbHVlKSkgLyAyOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxlcnAgPSBmdW5jdGlvbihwLCBxLCB0aW1lKSB7CiAgICAgICAgcmV0dXJuICgxIC0gdGltZSkgKiBwICsgdGltZSAqIHE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguUEkgPSBNYXRoLlBJOwogICAgICBDZXNpdW1NYXRoLk9ORV9PVkVSX1BJID0gMSAvIE1hdGguUEk7CiAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9UV08gPSBNYXRoLlBJIC8gMjsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1RIUkVFID0gTWF0aC5QSSAvIDM7CiAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9GT1VSID0gTWF0aC5QSSAvIDQ7CiAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9TSVggPSBNYXRoLlBJIC8gNjsKICAgICAgQ2VzaXVtTWF0aC5USFJFRV9QSV9PVkVSX1RXTyA9IDMgKiBNYXRoLlBJIC8gMjsKICAgICAgQ2VzaXVtTWF0aC5UV09fUEkgPSAyICogTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5PTkVfT1ZFUl9UV09fUEkgPSAxIC8gKDIgKiBNYXRoLlBJKTsKICAgICAgQ2VzaXVtTWF0aC5SQURJQU5TX1BFUl9ERUdSRUUgPSBNYXRoLlBJIC8gMTgwOwogICAgICBDZXNpdW1NYXRoLkRFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7CiAgICAgIENlc2l1bU1hdGguUkFESUFOU19QRVJfQVJDU0VDT05EID0gQ2VzaXVtTWF0aC5SQURJQU5TX1BFUl9ERUdSRUUgLyAzNjAwOwogICAgICBDZXNpdW1NYXRoLnRvUmFkaWFucyA9IGZ1bmN0aW9uKGRlZ3JlZXMpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChkZWdyZWVzKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRlZ3JlZXMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWdyZWVzICogQ2VzaXVtTWF0aC5SQURJQU5TX1BFUl9ERUdSRUU7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgudG9EZWdyZWVzID0gZnVuY3Rpb24ocmFkaWFucykgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJhZGlhbnMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmFkaWFucyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJhZGlhbnMgKiBDZXNpdW1NYXRoLkRFR1JFRVNfUEVSX1JBRElBTjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jb252ZXJ0TG9uZ2l0dWRlUmFuZ2UgPSBmdW5jdGlvbihhbmdsZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCB0d29QaSA9IENlc2l1bU1hdGguVFdPX1BJOwogICAgICAgIGNvbnN0IHNpbXBsaWZpZWQgPSBhbmdsZSAtIE1hdGguZmxvb3IoYW5nbGUgLyB0d29QaSkgKiB0d29QaTsKICAgICAgICBpZiAoc2ltcGxpZmllZCA8IC1NYXRoLlBJKSB7CiAgICAgICAgICByZXR1cm4gc2ltcGxpZmllZCArIHR3b1BpOwogICAgICAgIH0KICAgICAgICBpZiAoc2ltcGxpZmllZCA+PSBNYXRoLlBJKSB7CiAgICAgICAgICByZXR1cm4gc2ltcGxpZmllZCAtIHR3b1BpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2ltcGxpZmllZDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jbGFtcFRvTGF0aXR1ZGVSYW5nZSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDZXNpdW1NYXRoLmNsYW1wKAogICAgICAgICAgYW5nbGUsCiAgICAgICAgICAtMSAqIENlc2l1bU1hdGguUElfT1ZFUl9UV08sCiAgICAgICAgICBDZXNpdW1NYXRoLlBJX09WRVJfVFdPCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5uZWdhdGl2ZVBpVG9QaSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChhbmdsZSA+PSAtQ2VzaXVtTWF0aC5QSSAmJiBhbmdsZSA8PSBDZXNpdW1NYXRoLlBJKSB7CiAgICAgICAgICByZXR1cm4gYW5nbGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDZXNpdW1NYXRoLnplcm9Ub1R3b1BpKGFuZ2xlICsgQ2VzaXVtTWF0aC5QSSkgLSBDZXNpdW1NYXRoLlBJOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnplcm9Ub1R3b1BpID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFuZ2xlID49IDAgJiYgYW5nbGUgPD0gQ2VzaXVtTWF0aC5UV09fUEkpIHsKICAgICAgICAgIHJldHVybiBhbmdsZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbW9kID0gQ2VzaXVtTWF0aC5tb2QoYW5nbGUsIENlc2l1bU1hdGguVFdPX1BJKTsKICAgICAgICBpZiAoTWF0aC5hYnMobW9kKSA8IENlc2l1bU1hdGguRVBTSUxPTjE0ICYmIE1hdGguYWJzKGFuZ2xlKSA+IENlc2l1bU1hdGguRVBTSUxPTjE0KSB7CiAgICAgICAgICByZXR1cm4gQ2VzaXVtTWF0aC5UV09fUEk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtb2Q7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubW9kID0gZnVuY3Rpb24obSwgbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG0pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJuIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAobiA9PT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7CiAgICAgICAgfQogICAgICAgIGlmIChDZXNpdW1NYXRoLnNpZ24obSkgPT09IENlc2l1bU1hdGguc2lnbihuKSAmJiBNYXRoLmFicyhtKSA8IE1hdGguYWJzKG4pKSB7CiAgICAgICAgICByZXR1cm4gbTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChtICUgbiArIG4pICUgbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5lcXVhbHNFcHNpbG9uID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlbGF0aXZlRXBzaWxvbiwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJsZWZ0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyaWdodCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmVsYXRpdmVFcHNpbG9uID0gcmVsYXRpdmVFcHNpbG9uID8/IDA7CiAgICAgICAgYWJzb2x1dGVFcHNpbG9uID0gYWJzb2x1dGVFcHNpbG9uID8/IHJlbGF0aXZlRXBzaWxvbjsKICAgICAgICBjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMobGVmdCAtIHJpZ2h0KTsKICAgICAgICByZXR1cm4gYWJzRGlmZiA8PSBhYnNvbHV0ZUVwc2lsb24gfHwgYWJzRGlmZiA8PSByZWxhdGl2ZUVwc2lsb24gKiBNYXRoLm1heChNYXRoLmFicyhsZWZ0KSwgTWF0aC5hYnMocmlnaHQpKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5sZXNzVGhhbiA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImZpcnN0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFic29sdXRlRXBzaWxvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQgPCAtYWJzb2x1dGVFcHNpbG9uOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxlc3NUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0IDwgYWJzb2x1dGVFcHNpbG9uOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmdyZWF0ZXJUaGFuID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlY29uZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodCA+IGFic29sdXRlRXBzaWxvbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5ncmVhdGVyVGhhbk9yRXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlY29uZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodCA+IC1hYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIGZhY3RvcmlhbHMgPSBbMV07CiAgICAgIENlc2l1bU1hdGguZmFjdG9yaWFsID0gZnVuY3Rpb24obikgewogICAgICAgIGlmICh0eXBlb2YgbiAhPT0gIm51bWJlciIgfHwgbiA8IDApIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICAiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGVuZ3RoID0gZmFjdG9yaWFscy5sZW5ndGg7CiAgICAgICAgaWYgKG4gPj0gbGVuZ3RoKSB7CiAgICAgICAgICBsZXQgc3VtID0gZmFjdG9yaWFsc1tsZW5ndGggLSAxXTsKICAgICAgICAgIGZvciAobGV0IGkgPSBsZW5ndGg7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBzdW0gKiBpOwogICAgICAgICAgICBmYWN0b3JpYWxzLnB1c2gobmV4dCk7CiAgICAgICAgICAgIHN1bSA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWN0b3JpYWxzW25dOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmluY3JlbWVudFdyYXAgPSBmdW5jdGlvbihuLCBtYXhpbXVtVmFsdWUsIG1pbmltdW1WYWx1ZSkgewogICAgICAgIG1pbmltdW1WYWx1ZSA9IG1pbmltdW1WYWx1ZSA/PyAwOwogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KG4pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1heGltdW1WYWx1ZSA8PSBtaW5pbXVtVmFsdWUpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpOwogICAgICAgIH0KICAgICAgICArK247CiAgICAgICAgaWYgKG4gPiBtYXhpbXVtVmFsdWUpIHsKICAgICAgICAgIG4gPSBtaW5pbXVtVmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmlzUG93ZXJPZlR3byA9IGZ1bmN0aW9uKG4pIHsKICAgICAgICBpZiAodHlwZW9mIG4gIT09ICJudW1iZXIiIHx8IG4gPCAwIHx8IG4gPiA0Mjk0OTY3Mjk1KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAoMl4zMiktMSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4gIT09IDAgJiYgKG4gJiBuIC0gMSkgPT09IDA7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubmV4dFBvd2VyT2ZUd28gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCB8fCBuID4gMjE0NzQ4MzY0OCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMl4zMSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgLS1uOwogICAgICAgIG4gfD0gbiA+PiAxOwogICAgICAgIG4gfD0gbiA+PiAyOwogICAgICAgIG4gfD0gbiA+PiA0OwogICAgICAgIG4gfD0gbiA+PiA4OwogICAgICAgIG4gfD0gbiA+PiAxNjsKICAgICAgICArK247CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgucHJldmlvdXNQb3dlck9mVHdvID0gZnVuY3Rpb24obikgewogICAgICAgIGlmICh0eXBlb2YgbiAhPT0gIm51bWJlciIgfHwgbiA8IDAgfHwgbiA+IDQyOTQ5NjcyOTUpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBuIHw9IG4gPj4gMTsKICAgICAgICBuIHw9IG4gPj4gMjsKICAgICAgICBuIHw9IG4gPj4gNDsKICAgICAgICBuIHw9IG4gPj4gODsKICAgICAgICBuIHw9IG4gPj4gMTY7CiAgICAgICAgbiB8PSBuID4+IDMyOwogICAgICAgIG4gPSAobiA+Pj4gMCkgLSAobiA+Pj4gMSk7CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2xhbXAgPSBmdW5jdGlvbih2YWx1ZSwgbWluMywgbWF4MykgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJtaW4iLCBtaW4zKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm1heCIsIG1heDMpOwogICAgICAgIHJldHVybiB2YWx1ZSA8IG1pbjMgPyBtaW4zIDogdmFsdWUgPiBtYXgzID8gbWF4MyA6IHZhbHVlOwogICAgICB9OwogICAgICByYW5kb21OdW1iZXJHZW5lcmF0b3IgPSBuZXcgaW1wb3J0X21lcnNlbm5lX3R3aXN0ZXIuZGVmYXVsdCgpOwogICAgICBDZXNpdW1NYXRoLnNldFJhbmRvbU51bWJlclNlZWQgPSBmdW5jdGlvbihzZWVkKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoc2VlZCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWVkIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByYW5kb21OdW1iZXJHZW5lcmF0b3IgPSBuZXcgaW1wb3J0X21lcnNlbm5lX3R3aXN0ZXIuZGVmYXVsdChzZWVkKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5uZXh0UmFuZG9tTnVtYmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHJhbmRvbU51bWJlckdlbmVyYXRvci5yYW5kb20oKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5yYW5kb21CZXR3ZWVuID0gZnVuY3Rpb24obWluMywgbWF4MykgewogICAgICAgIHJldHVybiBDZXNpdW1NYXRoLm5leHRSYW5kb21OdW1iZXIoKSAqIChtYXgzIC0gbWluMykgKyBtaW4zOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmFjb3NDbGFtcGVkID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE1hdGguYWNvcyhDZXNpdW1NYXRoLmNsYW1wKHZhbHVlLCAtMSwgMSkpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmFzaW5DbGFtcGVkID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE1hdGguYXNpbihDZXNpdW1NYXRoLmNsYW1wKHZhbHVlLCAtMSwgMSkpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNob3JkTGVuZ3RoID0gZnVuY3Rpb24oYW5nbGUsIHJhZGl1cykgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyYWRpdXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMiAqIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlICogMC41KTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5sb2dCYXNlID0gZnVuY3Rpb24obnVtYmVyLCBiYXNlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobnVtYmVyKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm51bWJlciBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYmFzZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJiYXNlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5sb2cobnVtYmVyKSAvIE1hdGgubG9nKGJhc2UpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNicnQgPSBNYXRoLmNicnQgPz8gZnVuY3Rpb24gY2JydChudW1iZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBNYXRoLnBvdyhNYXRoLmFicyhudW1iZXIpLCAxIC8gMyk7CiAgICAgICAgcmV0dXJuIG51bWJlciA8IDAgPyAtcmVzdWx0IDogcmVzdWx0OwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxvZzIgPSBNYXRoLmxvZzIgPz8gZnVuY3Rpb24gbG9nMihudW1iZXIpIHsKICAgICAgICByZXR1cm4gTWF0aC5sb2cobnVtYmVyKSAqIE1hdGguTE9HMkU7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZm9nID0gZnVuY3Rpb24oZGlzdGFuY2VUb0NhbWVyYSwgZGVuc2l0eSkgewogICAgICAgIGNvbnN0IHNjYWxhciA9IGRpc3RhbmNlVG9DYW1lcmEgKiBkZW5zaXR5OwogICAgICAgIHJldHVybiAxIC0gTWF0aC5leHAoLShzY2FsYXIgKiBzY2FsYXIpKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5mYXN0QXBwcm94aW1hdGVBdGFuID0gZnVuY3Rpb24oeCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieCIsIHgpOwogICAgICAgIHJldHVybiB4ICogKC0wLjE3ODQgKiBNYXRoLmFicyh4KSAtIDAuMDY2MyAqIHggKiB4ICsgMS4wMzAxKTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5mYXN0QXBwcm94aW1hdGVBdGFuMiA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIngiLCB4KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoInkiLCB5KTsKICAgICAgICBsZXQgb3Bwb3NpdGU7CiAgICAgICAgbGV0IHQgPSBNYXRoLmFicyh4KTsKICAgICAgICBvcHBvc2l0ZSA9IE1hdGguYWJzKHkpOwogICAgICAgIGNvbnN0IGFkamFjZW50ID0gTWF0aC5tYXgodCwgb3Bwb3NpdGUpOwogICAgICAgIG9wcG9zaXRlID0gTWF0aC5taW4odCwgb3Bwb3NpdGUpOwogICAgICAgIGNvbnN0IG9wcG9zaXRlT3ZlckFkamFjZW50ID0gb3Bwb3NpdGUgLyBhZGphY2VudDsKICAgICAgICBpZiAoaXNOYU4ob3Bwb3NpdGVPdmVyQWRqYWNlbnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZWl0aGVyIHggb3IgeSBtdXN0IGJlIG5vbnplcm8iKTsKICAgICAgICB9CiAgICAgICAgdCA9IENlc2l1bU1hdGguZmFzdEFwcHJveGltYXRlQXRhbihvcHBvc2l0ZU92ZXJBZGphY2VudCk7CiAgICAgICAgdCA9IE1hdGguYWJzKHkpID4gTWF0aC5hYnMoeCkgPyBDZXNpdW1NYXRoLlBJX09WRVJfVFdPIC0gdCA6IHQ7CiAgICAgICAgdCA9IHggPCAwID8gQ2VzaXVtTWF0aC5QSSAtIHQgOiB0OwogICAgICAgIHQgPSB5IDwgMCA/IC10IDogdDsKICAgICAgICByZXR1cm4gdDsKICAgICAgfTsKICAgICAgTWF0aF9kZWZhdWx0ID0gQ2VzaXVtTWF0aDsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRlc2lhbjMuanMKICB2YXIgQ2FydGVzaWFuMywgZGlzdGFuY2VTY3JhdGNoLCBsZXJwU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDIsIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gsIHNjcmF0Y2hOLCBzY3JhdGNoSywgQ2FydGVzaWFuM19kZWZhdWx0OwogIHZhciBpbml0X0NhcnRlc2lhbjMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRlc2lhbjMuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBDYXJ0ZXNpYW4zID0gY2xhc3MgX0NhcnRlc2lhbjMgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wLjBdIFRoZSBYIGNvbXBvbmVudC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MC4wXSBUaGUgWSBjb21wb25lbnQuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt6PTAuMF0gVGhlIFogY29tcG9uZW50LgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHgsIHksIHopIHsKICAgICAgICAgIHRoaXMueCA9IHggPz8gMDsKICAgICAgICAgIHRoaXMueSA9IHkgPz8gMDsKICAgICAgICAgIHRoaXMueiA9IHogPz8gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgdGhlIHByb3ZpZGVkIFNwaGVyaWNhbCBpbnRvIENhcnRlc2lhbjMgY29vcmRpbmF0ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1NwaGVyaWNhbH0gc3BoZXJpY2FsIFRoZSBTcGhlcmljYWwgdG8gYmUgY29udmVydGVkIHRvIENhcnRlc2lhbjMuCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBbcmVzdWx0XSBUaGUgb2JqZWN0IG9udG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7Q2FydGVzaWFuM30gVGhlIG1vZGlmaWVkIHJlc3VsdCBwYXJhbWV0ZXIgb3IgYSBuZXcgQ2FydGVzaWFuMyBpbnN0YW5jZSBpZiBvbmUgd2FzIG5vdCBwcm92aWRlZC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZnJvbVNwaGVyaWNhbChzcGhlcmljYWwsIHJlc3VsdCkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLCBzcGhlcmljYWwpOwogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXN1bHQgPSBuZXcgX0NhcnRlc2lhbjMoKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGNsb2NrID0gc3BoZXJpY2FsLmNsb2NrOwogICAgICAgICAgY29uc3QgY29uZSA9IHNwaGVyaWNhbC5jb25lOwogICAgICAgICAgY29uc3QgbWFnbml0dWRlID0gc3BoZXJpY2FsLm1hZ25pdHVkZSA/PyAxOwogICAgICAgICAgY29uc3QgcmFkaWFsID0gbWFnbml0dWRlICogTWF0aC5zaW4oY29uZSk7CiAgICAgICAgICByZXN1bHQueCA9IHJhZGlhbCAqIE1hdGguY29zKGNsb2NrKTsKICAgICAgICAgIHJlc3VsdC55ID0gcmFkaWFsICogTWF0aC5zaW4oY2xvY2spOwogICAgICAgICAgcmVzdWx0LnogPSBtYWduaXR1ZGUgKiBNYXRoLmNvcyhjb25lKTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBDYXJ0ZXNpYW4zIGluc3RhbmNlIGZyb20geCwgeSBhbmQgeiBjb29yZGluYXRlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFRoZSB4IGNvb3JkaW5hdGUuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBUaGUgeiBjb29yZGluYXRlLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gW3Jlc3VsdF0gVGhlIG9iamVjdCBvbnRvIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHQuCiAgICAgICAgICogQHJldHVybnMge0NhcnRlc2lhbjN9IFRoZSBtb2RpZmllZCByZXN1bHQgcGFyYW1ldGVyIG9yIGEgbmV3IENhcnRlc2lhbjMgaW5zdGFuY2UgaWYgb25lIHdhcyBub3QgcHJvdmlkZWQuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZyb21FbGVtZW50cyh4LCB5LCB6LCByZXN1bHQpIHsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBfQ2FydGVzaWFuMyh4LCB5LCB6KTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICAgIHJlc3VsdC56ID0gejsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIER1cGxpY2F0ZXMgYSBDYXJ0ZXNpYW4zIGluc3RhbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBjYXJ0ZXNpYW4gVGhlIENhcnRlc2lhbiB0byBkdXBsaWNhdGUuCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zfSBbcmVzdWx0XSBUaGUgb2JqZWN0IG9udG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7Q2FydGVzaWFuM30gVGhlIG1vZGlmaWVkIHJlc3VsdCBwYXJhbWV0ZXIgb3IgYSBuZXcgQ2FydGVzaWFuMyBpbnN0YW5jZSBpZiBvbmUgd2FzIG5vdCBwcm92aWRlZC4gKFJldHVybnMgdW5kZWZpbmVkIGlmIGNhcnRlc2lhbiBpcyB1bmRlZmluZWQpCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNsb25lKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGNhcnRlc2lhbjExKSkgewogICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gbmV3IF9DYXJ0ZXNpYW4zKGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnopOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0LnggPSBjYXJ0ZXNpYW4xMS54OwogICAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55OwogICAgICAgICAgcmVzdWx0LnogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3RvcmVzIHRoZSBwcm92aWRlZCBpbnN0YW5jZSBpbnRvIHRoZSBwcm92aWRlZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gdmFsdWUgVGhlIHZhbHVlIHRvIHBhY2suCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJbXX0gYXJyYXkgVGhlIGFycmF5IHRvIHBhY2sgaW50by4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0aW5nSW5kZXg9MF0gVGhlIGluZGV4IGludG8gdGhlIGFycmF5IGF0IHdoaWNoIHRvIHN0YXJ0IHBhY2tpbmcgdGhlIGVsZW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge251bWJlcltdfSBUaGUgYXJyYXkgdGhhdCB3YXMgcGFja2VkIGludG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgcGFjayh2YWx1ZSwgYXJyYXksIHN0YXJ0aW5nSW5kZXgpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS54OwogICAgICAgICAgYXJyYXlbc3RhcnRpbmdJbmRleCsrXSA9IHZhbHVlLnk7CiAgICAgICAgICBhcnJheVtzdGFydGluZ0luZGV4XSA9IHZhbHVlLno7CiAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyBhbiBpbnN0YW5jZSBmcm9tIGEgcGFja2VkIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJbXX0gYXJyYXkgVGhlIHBhY2tlZCBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0aW5nSW5kZXg9MF0gVGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGJlIHVucGFja2VkLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gW3Jlc3VsdF0gVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHQuCiAgICAgICAgICogQHJldHVybnMge0NhcnRlc2lhbjN9IFRoZSBtb2RpZmllZCByZXN1bHQgcGFyYW1ldGVyIG9yIGEgbmV3IENhcnRlc2lhbjMgaW5zdGFuY2UgaWYgb25lIHdhcyBub3QgcHJvdmlkZWQuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHVucGFjayhhcnJheSwgc3RhcnRpbmdJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJlc3VsdCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmV3IF9DYXJ0ZXNpYW4zKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQueCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgICByZXN1bHQueSA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgICByZXN1bHQueiA9IGFycmF5W3N0YXJ0aW5nSW5kZXhdOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRmxhdHRlbnMgYW4gYXJyYXkgb2YgQ2FydGVzaWFuM3MgaW50byBhbiBhcnJheSBvZiBjb21wb25lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDYXJ0ZXNpYW4zW119IGFycmF5IFRoZSBhcnJheSBvZiBjYXJ0ZXNpYW5zIHRvIHBhY2suCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJbXX0gW3Jlc3VsdF0gVGhlIGFycmF5IG9udG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4gSWYgdGhpcyBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgYXJyYXkubGVuZ3RoICogMyBjb21wb25lbnRzLCBlbHNlIGEge0BsaW5rIERldmVsb3BlckVycm9yfSB3aWxsIGJlIHRocm93bi4gSWYgaXQgaXMgYSByZWd1bGFyIGFycmF5LCBpdCB3aWxsIGJlIHJlc2l6ZWQgdG8gaGF2ZSAoYXJyYXkubGVuZ3RoICogMykgZWxlbWVudHMuCiAgICAgICAgICogQHJldHVybnMge251bWJlcltdfSBUaGUgcGFja2VkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBwYWNrQXJyYXkoYXJyYXksIHJlc3VsdCkgewogICAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGNvbnN0IHJlc3VsdExlbmd0aCA9IGxlbmd0aCAqIDM7CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShyZXN1bHRMZW5ndGgpOwogICAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgICAiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDMgZWxlbWVudHMiCiAgICAgICAgICAgICk7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgICByZXN1bHQubGVuZ3RoID0gcmVzdWx0TGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgICBfQ2FydGVzaWFuMy5wYWNrKGFycmF5W2ldLCByZXN1bHQsIGkgKiAzKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVucGFja3MgYW4gYXJyYXkgb2YgY2FydGVzaWFuIGNvbXBvbmVudHMgaW50byBhbiBhcnJheSBvZiBDYXJ0ZXNpYW4zcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IFRoZSBhcnJheSBvZiBjb21wb25lbnRzIHRvIHVucGFjay4KICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjNbXX0gW3Jlc3VsdF0gVGhlIGFycmF5IG9udG8gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7Q2FydGVzaWFuM1tdfSBUaGUgdW5wYWNrZWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHVucGFja0FycmF5KGFycmF5LCByZXN1bHQpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIiwgYXJyYXkubGVuZ3RoLCAzKTsKICAgICAgICAgIGlmIChhcnJheS5sZW5ndGggJSAzICE9PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMuIik7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGggLyAzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGggLyAzOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICAgICAgICBjb25zdCBpbmRleCA9IGkgLyAzOwogICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gX0NhcnRlc2lhbjMudW5wYWNrKGFycmF5LCBpLCByZXN1bHRbaW5kZXhdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIHRoZSB2YWx1ZSBvZiB0aGUgbWF4aW11bSBjb21wb25lbnQgZm9yIHRoZSBzdXBwbGllZCBDYXJ0ZXNpYW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjN9IGNhcnRlc2lhbiBUaGUgY2FydGVzaWFuIHRvIHVzZS4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhlIG1heGltdW0gY29tcG9uZW50LgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBtYXhpbXVtQ29tcG9uZW50KGNhcnRlc2lhbjExKSB7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICAgIHJldHVybiBNYXRoLm1heChjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcHV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBtaW5pbXVtIGNvbXBvbmVudCBmb3IgdGhlIHN1cHBsaWVkIENhcnRlc2lhbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gY2FydGVzaWFuIFRoZSBjYXJ0ZXNpYW4gdG8gdXNlLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgbWluaW11bSBjb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG1pbmltdW1Db21wb25lbnQoY2FydGVzaWFuMTEpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgICAgcmV0dXJuIE1hdGgubWluKGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnopOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0d28gQ2FydGVzaWFucyBhbmQgY29tcHV0ZXMgYSBDYXJ0ZXNpYW4gd2hpY2ggY29udGFpbnMgdGhlIG1pbmltdW0gY29tcG9uZW50cyBvZiB0aGUgc3VwcGxpZWQgQ2FydGVzaWFucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gZmlyc3QgQSBjYXJ0ZXNpYW4gdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjN9IHNlY29uZCBBIGNhcnRlc2lhbiB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gcmVzdWx0IFRoZSBvYmplY3QgaW50byB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICAgICAqIEByZXR1cm5zIHtDYXJ0ZXNpYW4zfSBBIGNhcnRlc2lhbiB3aXRoIHRoZSBtaW5pbXVtIGNvbXBvbmVudHMuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG1pbmltdW1CeUNvbXBvbmVudChmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZmlyc3QiLCBmaXJzdCk7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNlY29uZCIsIHNlY29uZCk7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgICByZXN1bHQueCA9IE1hdGgubWluKGZpcnN0LngsIHNlY29uZC54KTsKICAgICAgICAgIHJlc3VsdC55ID0gTWF0aC5taW4oZmlyc3QueSwgc2Vjb25kLnkpOwogICAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1pbihmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0d28gQ2FydGVzaWFucyBhbmQgY29tcHV0ZXMgYSBDYXJ0ZXNpYW4gd2hpY2ggY29udGFpbnMgdGhlIG1heGltdW0gY29tcG9uZW50cyBvZiB0aGUgc3VwcGxpZWQgQ2FydGVzaWFucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gZmlyc3QgQSBjYXJ0ZXNpYW4gdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0ge0NhcnRlc2lhbjN9IHNlY29uZCBBIGNhcnRlc2lhbiB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Q2FydGVzaWFuM30gcmVzdWx0IFRoZSBvYmplY3QgaW50byB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICAgICAqIEByZXR1cm5zIHtDYXJ0ZXNpYW4zfSBBIGNhcnRlc2lhbiB3aXRoIHRoZSBtYXhpbXVtIGNvbXBvbmVudHMuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG1heGltdW1CeUNvbXBvbmVudChmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiZmlyc3QiLCBmaXJzdCk7CiAgICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInNlY29uZCIsIHNlY29uZCk7CiAgICAgICAgICB