babylonjs-addons 8.8.5 → 8.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babylonjs.addons.d.ts +45 -7
- package/babylonjs.addons.js +314 -279
- package/babylonjs.addons.min.js +1 -1
- package/babylonjs.addons.min.js.map +1 -1
- package/babylonjs.addons.module.d.ts +110 -19
- package/package.json +2 -2
- package/138.js +0 -2
- package/138.js.map +0 -1
- package/205.js +0 -2
- package/205.js.map +0 -1
- package/315.js +0 -2
- package/315.js.map +0 -1
- package/372.js +0 -2
- package/372.js.map +0 -1
- package/dev_addons_src_msdfText_webgl_fragment_ts.js +0 -24
- package/dev_addons_src_msdfText_webgl_vertex_ts.js +0 -24
- package/dev_addons_src_msdfText_webgpu_fragment_ts.js +0 -24
- package/dev_addons_src_msdfText_webgpu_vertex_ts.js +0 -24
package/babylonjs.addons.js
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
exports["babylonjs-addons"] = factory(require("babylonjs"));
|
8
8
|
else
|
9
9
|
root["ADDONS"] = factory(root["BABYLON"]);
|
10
|
-
})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (
|
10
|
+
})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (__WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math__) => {
|
11
11
|
return /******/ (() => { // webpackBootstrap
|
12
12
|
/******/ "use strict";
|
13
13
|
/******/ var __webpack_modules__ = ({
|
@@ -567,7 +567,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
567
567
|
/* harmony export */ HtmlMesh: () => (/* binding */ HtmlMesh)
|
568
568
|
/* harmony export */ });
|
569
569
|
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
570
|
-
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math
|
570
|
+
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
|
571
571
|
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__);
|
572
572
|
/* harmony import */ var _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCaptureBehavior */ "../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts");
|
573
573
|
/* harmony import */ var _fitStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fitStrategy */ "../../../dev/addons/src/htmlMesh/fitStrategy.ts");
|
@@ -926,7 +926,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
926
926
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
927
927
|
/* harmony export */ HtmlMeshRenderer: () => (/* binding */ HtmlMeshRenderer)
|
928
928
|
/* harmony export */ });
|
929
|
-
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math
|
929
|
+
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
|
930
930
|
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__);
|
931
931
|
|
932
932
|
|
@@ -1456,7 +1456,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
1456
1456
|
/* harmony export */ requestCapture: () => (/* binding */ requestCapture),
|
1457
1457
|
/* harmony export */ requestRelease: () => (/* binding */ requestRelease)
|
1458
1458
|
/* harmony export */ });
|
1459
|
-
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math
|
1459
|
+
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math");
|
1460
1460
|
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__);
|
1461
1461
|
|
1462
1462
|
var CaptureRequestQueue = [];
|
@@ -1629,7 +1629,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
1629
1629
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1630
1630
|
/* harmony export */ PointerEventsCaptureBehavior: () => (/* binding */ PointerEventsCaptureBehavior)
|
1631
1631
|
/* harmony export */ });
|
1632
|
-
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math
|
1632
|
+
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math");
|
1633
1633
|
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__);
|
1634
1634
|
/* harmony import */ var _pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCapture */ "../../../dev/addons/src/htmlMesh/pointerEventsCapture.ts");
|
1635
1635
|
|
@@ -1845,16 +1845,22 @@ var PointerEventsCaptureBehavior = /** @class */ (function () {
|
|
1845
1845
|
|
1846
1846
|
__webpack_require__.r(__webpack_exports__);
|
1847
1847
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1848
|
-
/* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */
|
1849
|
-
/* harmony export */ FitStrategy: () => (/* reexport safe */
|
1850
|
-
/* harmony export */ FontAsset: () => (/* reexport safe */
|
1851
|
-
/* harmony export */ HtmlMesh: () => (/* reexport safe */
|
1852
|
-
/* harmony export */ HtmlMeshRenderer: () => (/* reexport safe */
|
1853
|
-
/* harmony export */ PointerEventsCaptureBehavior: () => (/* reexport safe */
|
1854
|
-
/* harmony export */
|
1848
|
+
/* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
|
1849
|
+
/* harmony export */ FitStrategy: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.FitStrategy),
|
1850
|
+
/* harmony export */ FontAsset: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.FontAsset),
|
1851
|
+
/* harmony export */ HtmlMesh: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.HtmlMesh),
|
1852
|
+
/* harmony export */ HtmlMeshRenderer: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.HtmlMeshRenderer),
|
1853
|
+
/* harmony export */ PointerEventsCaptureBehavior: () => (/* reexport safe */ _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__.PointerEventsCaptureBehavior),
|
1854
|
+
/* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.SdfTextParagraph),
|
1855
|
+
/* harmony export */ TextRenderer: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.TextRenderer),
|
1856
|
+
/* harmony export */ msdfFragmentShader: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfFragmentShader),
|
1857
|
+
/* harmony export */ msdfFragmentShaderWGSL: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfFragmentShaderWGSL),
|
1858
|
+
/* harmony export */ msdfVertexShader: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShader),
|
1859
|
+
/* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _msdfText_index__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShaderWGSL)
|
1855
1860
|
/* harmony export */ });
|
1856
|
-
/* harmony import */ var
|
1857
|
-
/* harmony import */ var
|
1861
|
+
/* harmony import */ var _htmlMesh_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./htmlMesh/index */ "../../../dev/addons/src/htmlMesh/index.ts");
|
1862
|
+
/* harmony import */ var _msdfText_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./msdfText/index */ "../../../dev/addons/src/msdfText/index.ts");
|
1863
|
+
/* eslint-disable import/no-internal-modules */
|
1858
1864
|
|
1859
1865
|
|
1860
1866
|
|
@@ -1871,7 +1877,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
1871
1877
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1872
1878
|
/* harmony export */ FontAsset: () => (/* binding */ FontAsset)
|
1873
1879
|
/* harmony export */ });
|
1874
|
-
/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Maths/math
|
1880
|
+
/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Maths/math");
|
1875
1881
|
/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__);
|
1876
1882
|
|
1877
1883
|
var CharCode;
|
@@ -1887,8 +1893,9 @@ var FontAsset = /** @class */ (function () {
|
|
1887
1893
|
* Creates a new FontAsset instance.
|
1888
1894
|
* @param definitionData defines the font data in JSON format.
|
1889
1895
|
* @param textureUrl defines the url of the texture to use for the font.
|
1896
|
+
* @param scene defines the hosting scene.
|
1890
1897
|
*/
|
1891
|
-
function FontAsset(definitionData, textureUrl) {
|
1898
|
+
function FontAsset(definitionData, textureUrl, scene) {
|
1892
1899
|
var _this = this;
|
1893
1900
|
this._chars = new Map();
|
1894
1901
|
this._kernings = new Map();
|
@@ -1907,8 +1914,19 @@ var FontAsset = /** @class */ (function () {
|
|
1907
1914
|
this._charsRegex = new RegExp("[".concat(this._font.chars.map(function (c) { return c.char.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }).join(""), "]"), "g");
|
1908
1915
|
this._updateFallbacks();
|
1909
1916
|
this.scale = 1 / this._font.info.size;
|
1910
|
-
this.textures = this._font.pages.map(function (page) {
|
1917
|
+
this.textures = this._font.pages.map(function (page) {
|
1918
|
+
var texture = new babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__.Texture(page, scene, { noMipmap: false, invertY: false });
|
1919
|
+
texture.anisotropicFilteringLevel = 16;
|
1920
|
+
return texture;
|
1921
|
+
});
|
1911
1922
|
}
|
1923
|
+
FontAsset.prototype.dispose = function () {
|
1924
|
+
for (var _i = 0, _a = this.textures; _i < _a.length; _i++) {
|
1925
|
+
var texture = _a[_i];
|
1926
|
+
texture.dispose();
|
1927
|
+
}
|
1928
|
+
this.textures.length = 0;
|
1929
|
+
};
|
1912
1930
|
FontAsset.prototype._updateFallbacks = function () {
|
1913
1931
|
if (!this._chars.has(CharCode.SPACE)) {
|
1914
1932
|
this._chars.set(CharCode.SPACE, {
|
@@ -1973,11 +1991,23 @@ __webpack_require__.r(__webpack_exports__);
|
|
1973
1991
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1974
1992
|
/* harmony export */ DefaultParagraphOptions: () => (/* reexport safe */ _paragraphOptions__WEBPACK_IMPORTED_MODULE_1__.DefaultParagraphOptions),
|
1975
1993
|
/* harmony export */ FontAsset: () => (/* reexport safe */ _fontAsset__WEBPACK_IMPORTED_MODULE_0__.FontAsset),
|
1976
|
-
/* harmony export */
|
1994
|
+
/* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _sdf_index__WEBPACK_IMPORTED_MODULE_3__.SdfTextParagraph),
|
1995
|
+
/* harmony export */ TextRenderer: () => (/* reexport safe */ _textRenderer__WEBPACK_IMPORTED_MODULE_2__.TextRenderer),
|
1996
|
+
/* harmony export */ msdfFragmentShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_4__.msdfFragmentShader),
|
1997
|
+
/* harmony export */ msdfFragmentShaderWGSL: () => (/* reexport safe */ _webgpu_index__WEBPACK_IMPORTED_MODULE_5__.msdfFragmentShaderWGSL),
|
1998
|
+
/* harmony export */ msdfVertexShader: () => (/* reexport safe */ _webgl_index__WEBPACK_IMPORTED_MODULE_4__.msdfVertexShader),
|
1999
|
+
/* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _webgpu_index__WEBPACK_IMPORTED_MODULE_5__.msdfVertexShaderWGSL)
|
1977
2000
|
/* harmony export */ });
|
1978
2001
|
/* harmony import */ var _fontAsset__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fontAsset */ "../../../dev/addons/src/msdfText/fontAsset.ts");
|
1979
2002
|
/* harmony import */ var _paragraphOptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./paragraphOptions */ "../../../dev/addons/src/msdfText/paragraphOptions.ts");
|
1980
2003
|
/* harmony import */ var _textRenderer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textRenderer */ "../../../dev/addons/src/msdfText/textRenderer.ts");
|
2004
|
+
/* harmony import */ var _sdf_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdf/index */ "../../../dev/addons/src/msdfText/sdf/index.ts");
|
2005
|
+
/* harmony import */ var _webgl_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./webgl/index */ "../../../dev/addons/src/msdfText/webgl/index.ts");
|
2006
|
+
/* harmony import */ var _webgpu_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./webgpu/index */ "../../../dev/addons/src/msdfText/webgpu/index.ts");
|
2007
|
+
/* eslint-disable import/no-internal-modules */
|
2008
|
+
|
2009
|
+
|
2010
|
+
|
1981
2011
|
|
1982
2012
|
|
1983
2013
|
|
@@ -1995,10 +2025,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
1995
2025
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1996
2026
|
/* harmony export */ DefaultParagraphOptions: () => (/* binding */ DefaultParagraphOptions)
|
1997
2027
|
/* harmony export */ });
|
1998
|
-
/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
|
1999
|
-
/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__);
|
2000
2028
|
/* eslint-disable jsdoc/require-jsdoc */
|
2001
|
-
|
2002
2029
|
/** @internal */
|
2003
2030
|
var DefaultParagraphOptions = {
|
2004
2031
|
maxWidth: Infinity,
|
@@ -2007,10 +2034,82 @@ var DefaultParagraphOptions = {
|
|
2007
2034
|
tabSize: 4,
|
2008
2035
|
whiteSpace: "pre-line",
|
2009
2036
|
textAlign: "center",
|
2010
|
-
translate:
|
2037
|
+
translate: { x: -0.5, y: -0.5 },
|
2011
2038
|
};
|
2012
2039
|
|
2013
2040
|
|
2041
|
+
/***/ }),
|
2042
|
+
|
2043
|
+
/***/ "../../../dev/addons/src/msdfText/sdf/bmFont.ts":
|
2044
|
+
/*!******************************************************!*\
|
2045
|
+
!*** ../../../dev/addons/src/msdfText/sdf/bmFont.ts ***!
|
2046
|
+
\******************************************************/
|
2047
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2048
|
+
|
2049
|
+
__webpack_require__.r(__webpack_exports__);
|
2050
|
+
|
2051
|
+
|
2052
|
+
|
2053
|
+
/***/ }),
|
2054
|
+
|
2055
|
+
/***/ "../../../dev/addons/src/msdfText/sdf/font.ts":
|
2056
|
+
/*!****************************************************!*\
|
2057
|
+
!*** ../../../dev/addons/src/msdfText/sdf/font.ts ***!
|
2058
|
+
\****************************************************/
|
2059
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2060
|
+
|
2061
|
+
__webpack_require__.r(__webpack_exports__);
|
2062
|
+
|
2063
|
+
|
2064
|
+
|
2065
|
+
/***/ }),
|
2066
|
+
|
2067
|
+
/***/ "../../../dev/addons/src/msdfText/sdf/glyph.ts":
|
2068
|
+
/*!*****************************************************!*\
|
2069
|
+
!*** ../../../dev/addons/src/msdfText/sdf/glyph.ts ***!
|
2070
|
+
\*****************************************************/
|
2071
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2072
|
+
|
2073
|
+
__webpack_require__.r(__webpack_exports__);
|
2074
|
+
|
2075
|
+
|
2076
|
+
|
2077
|
+
/***/ }),
|
2078
|
+
|
2079
|
+
/***/ "../../../dev/addons/src/msdfText/sdf/index.ts":
|
2080
|
+
/*!*****************************************************!*\
|
2081
|
+
!*** ../../../dev/addons/src/msdfText/sdf/index.ts ***!
|
2082
|
+
\*****************************************************/
|
2083
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2084
|
+
|
2085
|
+
__webpack_require__.r(__webpack_exports__);
|
2086
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2087
|
+
/* harmony export */ SdfTextParagraph: () => (/* reexport safe */ _paragraph__WEBPACK_IMPORTED_MODULE_4__.SdfTextParagraph)
|
2088
|
+
/* harmony export */ });
|
2089
|
+
/* harmony import */ var _bmFont__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bmFont */ "../../../dev/addons/src/msdfText/sdf/bmFont.ts");
|
2090
|
+
/* harmony import */ var _font__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./font */ "../../../dev/addons/src/msdfText/sdf/font.ts");
|
2091
|
+
/* harmony import */ var _glyph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glyph */ "../../../dev/addons/src/msdfText/sdf/glyph.ts");
|
2092
|
+
/* harmony import */ var _line__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line */ "../../../dev/addons/src/msdfText/sdf/line.ts");
|
2093
|
+
/* harmony import */ var _paragraph__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./paragraph */ "../../../dev/addons/src/msdfText/sdf/paragraph.ts");
|
2094
|
+
|
2095
|
+
|
2096
|
+
|
2097
|
+
|
2098
|
+
|
2099
|
+
|
2100
|
+
|
2101
|
+
/***/ }),
|
2102
|
+
|
2103
|
+
/***/ "../../../dev/addons/src/msdfText/sdf/line.ts":
|
2104
|
+
/*!****************************************************!*\
|
2105
|
+
!*** ../../../dev/addons/src/msdfText/sdf/line.ts ***!
|
2106
|
+
\****************************************************/
|
2107
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2108
|
+
|
2109
|
+
__webpack_require__.r(__webpack_exports__);
|
2110
|
+
|
2111
|
+
|
2112
|
+
|
2014
2113
|
/***/ }),
|
2015
2114
|
|
2016
2115
|
/***/ "../../../dev/addons/src/msdfText/sdf/paragraph.ts":
|
@@ -2061,7 +2160,6 @@ var SdfTextParagraph = /** @class */ (function () {
|
|
2061
2160
|
var height = this.lineHeight * lines.length;
|
2062
2161
|
if (this.options.textAlign !== "left" || this.options.translate) {
|
2063
2162
|
lines.forEach(function (line) {
|
2064
|
-
var _a;
|
2065
2163
|
var anchor = (function () {
|
2066
2164
|
switch (_this.options.textAlign) {
|
2067
2165
|
case "right":
|
@@ -2073,14 +2171,14 @@ var SdfTextParagraph = /** @class */ (function () {
|
|
2073
2171
|
return 0;
|
2074
2172
|
}
|
2075
2173
|
})();
|
2076
|
-
var
|
2077
|
-
|
2174
|
+
var x = _this.options.translate ? _this.options.translate.x * width : 0;
|
2175
|
+
var y = _this.options.translate ? _this.options.translate.y * height : 0;
|
2176
|
+
for (var _i = 0, _a = line.glyphs; _i < _a.length; _i++) {
|
2177
|
+
var glyph = _a[_i];
|
2078
2178
|
glyph.x += anchor;
|
2079
|
-
|
2080
|
-
|
2081
|
-
|
2082
|
-
}
|
2083
|
-
});
|
2179
|
+
glyph.x += x;
|
2180
|
+
glyph.y += y;
|
2181
|
+
}
|
2084
2182
|
});
|
2085
2183
|
}
|
2086
2184
|
var glyphs = lines.flatMap(function (line) { return line.glyphs; });
|
@@ -2123,7 +2221,7 @@ var SdfTextParagraph = /** @class */ (function () {
|
|
2123
2221
|
var char = this.fontAsset._getChar(charCode);
|
2124
2222
|
var charWidth = char.width;
|
2125
2223
|
var kerning = lastChar ? this.fontAsset._getKerning(lastChar.id, char.id) : 0;
|
2126
|
-
currentCursor += kerning
|
2224
|
+
currentCursor += kerning;
|
2127
2225
|
var newWidth = currentCursor + charWidth;
|
2128
2226
|
var cursorProgress = char.xadvance + this.options.letterSpacing;
|
2129
2227
|
var nextPosition = currentCursor + cursorProgress;
|
@@ -2139,7 +2237,7 @@ var SdfTextParagraph = /** @class */ (function () {
|
|
2139
2237
|
currentGlyphs = [];
|
2140
2238
|
}
|
2141
2239
|
var x = currentCursor;
|
2142
|
-
var y = currentLine * this.lineHeight
|
2240
|
+
var y = currentLine * this.lineHeight;
|
2143
2241
|
currentGlyphs.push({
|
2144
2242
|
char: char,
|
2145
2243
|
line: currentLine,
|
@@ -2158,6 +2256,9 @@ var SdfTextParagraph = /** @class */ (function () {
|
|
2158
2256
|
}
|
2159
2257
|
}
|
2160
2258
|
if (currentGlyphs.length > 0) {
|
2259
|
+
if (lastChar) {
|
2260
|
+
// currentWidth += lastChar.xadvance;
|
2261
|
+
}
|
2161
2262
|
pushCurrentLine();
|
2162
2263
|
}
|
2163
2264
|
return lines;
|
@@ -2180,7 +2281,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
2180
2281
|
/* harmony export */ TextRenderer: () => (/* binding */ TextRenderer)
|
2181
2282
|
/* harmony export */ });
|
2182
2283
|
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
2183
|
-
/* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/ThinMaths/thinMath.matrix.functions */ "babylonjs/Maths/math
|
2284
|
+
/* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/ThinMaths/thinMath.matrix.functions */ "babylonjs/Maths/math");
|
2184
2285
|
/* harmony import */ var babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__);
|
2185
2286
|
/* harmony import */ var _sdf_paragraph__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdf/paragraph */ "../../../dev/addons/src/msdfText/sdf/paragraph.ts");
|
2186
2287
|
|
@@ -2198,6 +2299,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
2198
2299
|
* With metrics: #6RLCWP#35
|
2199
2300
|
* Thickness: #IABMEZ#3
|
2200
2301
|
* Solar system: #9YCDYC#9
|
2302
|
+
* Stroke: #6RLCWP#37
|
2201
2303
|
*/
|
2202
2304
|
var TextRenderer = /** @class */ (function () {
|
2203
2305
|
function TextRenderer(engine, shaderLanguage, font) {
|
@@ -2219,21 +2321,43 @@ var TextRenderer = /** @class */ (function () {
|
|
2219
2321
|
this._finalMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2220
2322
|
this._lineMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2221
2323
|
this._parentWorldMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2222
|
-
this._storedTranslation = { x: 0, y: 0, z: 0 };
|
2223
2324
|
/**
|
2224
2325
|
* Gets or sets the color of the text
|
2225
2326
|
*/
|
2226
2327
|
this.color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
|
2328
|
+
/**
|
2329
|
+
* Gets or sets the color of the stroke around the text
|
2330
|
+
*/
|
2331
|
+
this.strokeColor = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
|
2332
|
+
/**
|
2333
|
+
* Gets or sets the width of the stroke around the text (inset)
|
2334
|
+
*/
|
2335
|
+
this.strokeInsetWidth = 0;
|
2336
|
+
/**
|
2337
|
+
* Gets or sets the width of the stroke around the text (outset)
|
2338
|
+
*/
|
2339
|
+
this.strokeOutsetWidth = 0;
|
2227
2340
|
/**
|
2228
2341
|
* Gets or sets the thickness of the text (0 means as defined in the font)
|
2229
2342
|
* Value must be between -0.5 and 0.5
|
2230
2343
|
*/
|
2231
2344
|
this.thicknessControl = 0;
|
2232
2345
|
this._parent = null;
|
2346
|
+
this._transformMatrix = new babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ThinMatrix();
|
2233
2347
|
/**
|
2234
2348
|
* Gets or sets if the text is billboarded
|
2235
2349
|
*/
|
2236
2350
|
this.isBillboard = false;
|
2351
|
+
/**
|
2352
|
+
* Gets or sets if the text is screen projected
|
2353
|
+
* This will work only if the text is billboarded
|
2354
|
+
*/
|
2355
|
+
this.isBillboardScreenProjected = false;
|
2356
|
+
/**
|
2357
|
+
* Gets or sets if the text renderer should ignore the depth buffer
|
2358
|
+
* Default is false
|
2359
|
+
*/
|
2360
|
+
this.ignoreDepthBuffer = false;
|
2237
2361
|
this._engine = engine;
|
2238
2362
|
this._shaderLanguage = shaderLanguage;
|
2239
2363
|
this._font = font;
|
@@ -2259,6 +2383,21 @@ var TextRenderer = /** @class */ (function () {
|
|
2259
2383
|
enumerable: false,
|
2260
2384
|
configurable: true
|
2261
2385
|
});
|
2386
|
+
Object.defineProperty(TextRenderer.prototype, "transformMatrix", {
|
2387
|
+
/**
|
2388
|
+
* Gets or sets the transform matrix of the text renderer
|
2389
|
+
* It will be applied in that order:
|
2390
|
+
* parent x transform x paragraph world
|
2391
|
+
*/
|
2392
|
+
get: function () {
|
2393
|
+
return this._transformMatrix;
|
2394
|
+
},
|
2395
|
+
set: function (value) {
|
2396
|
+
this._transformMatrix = value;
|
2397
|
+
},
|
2398
|
+
enumerable: false,
|
2399
|
+
configurable: true
|
2400
|
+
});
|
2262
2401
|
Object.defineProperty(TextRenderer.prototype, "characterCount", {
|
2263
2402
|
/**
|
2264
2403
|
* Gets the number of characters in the text renderer
|
@@ -2297,7 +2436,7 @@ var TextRenderer = /** @class */ (function () {
|
|
2297
2436
|
this._drawWrapperBase.effect = this._engine.createEffect({
|
2298
2437
|
vertexSource: vertex,
|
2299
2438
|
fragmentSource: fragment,
|
2300
|
-
}, ["offsets", "world0", "world1", "world2", "world3", "uvs"], ["parentWorld", "view", "projection", "uColor", "
|
2439
|
+
}, ["offsets", "world0", "world1", "world2", "world3", "uvs"], ["parentWorld", "view", "projection", "uColor", "thickness", "uStrokeColor", "uStrokeInsetWidth", "uStrokeOutsetWidth", "mode", "transform"], ["fontAtlas"], defines, undefined, undefined, undefined, undefined, this._shaderLanguage);
|
2301
2440
|
this._drawWrapperBase.effect._refCount++;
|
2302
2441
|
};
|
2303
2442
|
/**
|
@@ -2329,8 +2468,8 @@ var TextRenderer = /** @class */ (function () {
|
|
2329
2468
|
_this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;
|
2330
2469
|
_this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;
|
2331
2470
|
_this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;
|
2332
|
-
var x = g.x;
|
2333
|
-
var y = -g.y;
|
2471
|
+
var x = g.x + g.char.xoffset;
|
2472
|
+
var y = 1.0 - (g.y + g.char.yoffset);
|
2334
2473
|
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.ScalingMatrixToRef)(g.char.width, g.char.height, 1.0, _this._scalingMatrix);
|
2335
2474
|
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.MultiplyMatricesToRef)(_this._offsetMatrix, _this._scalingMatrix, _this._baseMatrix);
|
2336
2475
|
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.TranslationMatrixToRef)(x * fontScale, y * fontScale, 0.0, _this._translationMatrix);
|
@@ -2357,53 +2496,27 @@ var TextRenderer = /** @class */ (function () {
|
|
2357
2496
|
var engine = this._engine;
|
2358
2497
|
engine.setState(false);
|
2359
2498
|
engine.enableEffect(drawWrapper);
|
2360
|
-
if (this.
|
2361
|
-
|
2362
|
-
|
2363
|
-
|
2364
|
-
|
2365
|
-
this._storedTranslation.x = pwm_1[12];
|
2366
|
-
this._storedTranslation.y = pwm_1[13];
|
2367
|
-
this._storedTranslation.z = pwm_1[14];
|
2368
|
-
}
|
2369
|
-
else {
|
2370
|
-
this._storedTranslation.x = 0;
|
2371
|
-
this._storedTranslation.y = 0;
|
2372
|
-
this._storedTranslation.z = 0;
|
2373
|
-
}
|
2374
|
-
// Cancel camera rotation
|
2375
|
-
var baseM = this._baseMatrix.asArray();
|
2376
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToArray)(viewMatrix, baseM);
|
2377
|
-
baseM[12] = 0;
|
2378
|
-
baseM[13] = 0;
|
2379
|
-
baseM[14] = 0;
|
2380
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.InvertMatrixToRef)(this._baseMatrix, this._parentWorldMatrix);
|
2381
|
-
// Restore translation
|
2382
|
-
var pwm = this._parentWorldMatrix.asArray();
|
2383
|
-
pwm[12] = this._storedTranslation.x;
|
2384
|
-
pwm[13] = this._storedTranslation.y;
|
2385
|
-
pwm[14] = this._storedTranslation.z;
|
2499
|
+
if (this.ignoreDepthBuffer) {
|
2500
|
+
engine.setDepthBuffer(false);
|
2501
|
+
}
|
2502
|
+
if (this._parent) {
|
2503
|
+
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToRef)(this._parent.getWorldMatrix(), this._parentWorldMatrix);
|
2386
2504
|
}
|
2387
2505
|
else {
|
2388
|
-
|
2389
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.CopyMatrixToRef)(this._parent.getWorldMatrix(), this._parentWorldMatrix);
|
2390
|
-
}
|
2391
|
-
else {
|
2392
|
-
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrixToRef)(this._parentWorldMatrix);
|
2393
|
-
}
|
2506
|
+
(0,babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.IdentityMatrixToRef)(this._parentWorldMatrix);
|
2394
2507
|
}
|
2508
|
+
effect.setInt("mode", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);
|
2395
2509
|
effect.setMatrix("parentWorld", this._parentWorldMatrix);
|
2396
2510
|
effect.setMatrix("view", viewMatrix);
|
2397
2511
|
effect.setMatrix("projection", projectionMatrix);
|
2512
|
+
effect.setMatrix("transform", this.transformMatrix);
|
2398
2513
|
// Texture
|
2399
|
-
var textureWidth = this._font._font.common.scaleW;
|
2400
|
-
var textureHeight = this._font._font.common.scaleW;
|
2401
|
-
var distanceRange = this._font._font.distanceField.distanceRange;
|
2402
2514
|
effect.setTexture("fontAtlas", this._font.textures[0]);
|
2403
|
-
effect.setFloat2("unitRange", distanceRange / textureWidth, distanceRange / textureHeight);
|
2404
|
-
effect.setFloat2("texelSize", 1.0 / textureWidth, 1.0 / textureHeight);
|
2405
2515
|
effect.setDirectColor4("uColor", this.color);
|
2516
|
+
effect.setDirectColor4("uStrokeColor", this.strokeColor);
|
2406
2517
|
effect.setFloat("thickness", this.thicknessControl * 0.9);
|
2518
|
+
effect.setFloat("uStrokeInsetWidth", this.strokeInsetWidth);
|
2519
|
+
effect.setFloat("uStrokeOutsetWidth", this.strokeOutsetWidth);
|
2407
2520
|
var instanceCount = this._charMatrices.length / 16;
|
2408
2521
|
// Need update?
|
2409
2522
|
if (this._isDirty) {
|
@@ -2427,6 +2540,10 @@ var TextRenderer = /** @class */ (function () {
|
|
2427
2540
|
engine.setAlphaMode(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.ALPHA_COMBINE);
|
2428
2541
|
engine.drawArraysType(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);
|
2429
2542
|
engine.unbindInstanceAttributes();
|
2543
|
+
engine.setAlphaMode(babylonjs_Buffers_buffer__WEBPACK_IMPORTED_MODULE_0__.Constants.ALPHA_DISABLE);
|
2544
|
+
if (this.ignoreDepthBuffer) {
|
2545
|
+
engine.setDepthBuffer(true);
|
2546
|
+
}
|
2430
2547
|
};
|
2431
2548
|
/**
|
2432
2549
|
* Release associated resources
|
@@ -2469,17 +2586,17 @@ var TextRenderer = /** @class */ (function () {
|
|
2469
2586
|
fragment = "";
|
2470
2587
|
if (!engine.isWebGPU) return [3 /*break*/, 3];
|
2471
2588
|
shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
2472
|
-
return [4 /*yield*/,
|
2589
|
+
return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./webgpu/vertex */ "../../../dev/addons/src/msdfText/webgpu/vertex.ts"))];
|
2473
2590
|
case 1:
|
2474
|
-
vertex = (_a.sent()).
|
2475
|
-
return [4 /*yield*/,
|
2591
|
+
vertex = (_a.sent()).msdfVertexShaderWGSL.shader;
|
2592
|
+
return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./webgpu/fragment */ "../../../dev/addons/src/msdfText/webgpu/fragment.ts"))];
|
2476
2593
|
case 2:
|
2477
|
-
fragment = (_a.sent()).
|
2594
|
+
fragment = (_a.sent()).msdfFragmentShaderWGSL.shader;
|
2478
2595
|
return [3 /*break*/, 6];
|
2479
|
-
case 3: return [4 /*yield*/,
|
2596
|
+
case 3: return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./webgl/vertex */ "../../../dev/addons/src/msdfText/webgl/vertex.ts"))];
|
2480
2597
|
case 4:
|
2481
2598
|
vertex = (_a.sent()).msdfVertexShader.shader;
|
2482
|
-
return [4 /*yield*/,
|
2599
|
+
return [4 /*yield*/, Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./webgl/fragment */ "../../../dev/addons/src/msdfText/webgl/fragment.ts"))];
|
2483
2600
|
case 5:
|
2484
2601
|
fragment = (_a.sent()).msdfFragmentShader.shader;
|
2485
2602
|
_a.label = 6;
|
@@ -2498,13 +2615,127 @@ var TextRenderer = /** @class */ (function () {
|
|
2498
2615
|
|
2499
2616
|
/***/ }),
|
2500
2617
|
|
2501
|
-
/***/ "
|
2618
|
+
/***/ "../../../dev/addons/src/msdfText/webgl/fragment.ts":
|
2619
|
+
/*!**********************************************************!*\
|
2620
|
+
!*** ../../../dev/addons/src/msdfText/webgl/fragment.ts ***!
|
2621
|
+
\**********************************************************/
|
2622
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2623
|
+
|
2624
|
+
__webpack_require__.r(__webpack_exports__);
|
2625
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2626
|
+
/* harmony export */ msdfFragmentShader: () => (/* binding */ msdfFragmentShader)
|
2627
|
+
/* harmony export */ });
|
2628
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
2629
|
+
var name = "msdfFragmentShader";
|
2630
|
+
var shader = "\n#extension GL_OES_standard_derivatives : enable\n\nprecision highp float;\n\nuniform sampler2D fontAtlas;\nuniform vec4 uColor;\nuniform vec4 uStrokeColor;\nuniform float uStrokeInsetWidth;\nuniform float uStrokeOutsetWidth;\nuniform float thickness;\n\nvarying vec2 atlasUV;\n\nfloat median(vec3 msdf) {\n return max(min(msdf.r, msdf.g), min(max(msdf.r, msdf.g), msdf.b));\n}\n \nvoid main(void)\n{\n vec3 s = texture2D(fontAtlas, atlasUV).rgb;\n float sigDist = median(s) - 0.5 + thickness;\n\n float alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0);\n\n float sigDistOutset = sigDist + uStrokeOutsetWidth * 0.5;\n float sigDistInset = sigDist - uStrokeInsetWidth * 0.5;\n\n float outset = clamp(sigDistOutset / fwidth(sigDistOutset) + 0.5, 0.0, 1.0);\n float inset = 1.0 - clamp(sigDistInset / fwidth(sigDistInset) + 0.5, 0.0, 1.0);\n\n float border = outset * inset;\n\n vec4 filledFragColor = vec4(uColor.rgb, alpha * uColor.a);\n vec4 strokedFragColor = vec4(uStrokeColor.rgb, border * uStrokeColor.a);\n\n gl_FragColor = mix(filledFragColor, strokedFragColor, border);\n}";
|
2631
|
+
/** @internal */
|
2632
|
+
var msdfFragmentShader = { name: name, shader: shader };
|
2633
|
+
|
2634
|
+
|
2635
|
+
/***/ }),
|
2636
|
+
|
2637
|
+
/***/ "../../../dev/addons/src/msdfText/webgl/index.ts":
|
2638
|
+
/*!*******************************************************!*\
|
2639
|
+
!*** ../../../dev/addons/src/msdfText/webgl/index.ts ***!
|
2640
|
+
\*******************************************************/
|
2641
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2642
|
+
|
2643
|
+
__webpack_require__.r(__webpack_exports__);
|
2644
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2645
|
+
/* harmony export */ msdfFragmentShader: () => (/* reexport safe */ _fragment__WEBPACK_IMPORTED_MODULE_0__.msdfFragmentShader),
|
2646
|
+
/* harmony export */ msdfVertexShader: () => (/* reexport safe */ _vertex__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShader)
|
2647
|
+
/* harmony export */ });
|
2648
|
+
/* harmony import */ var _fragment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fragment */ "../../../dev/addons/src/msdfText/webgl/fragment.ts");
|
2649
|
+
/* harmony import */ var _vertex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vertex */ "../../../dev/addons/src/msdfText/webgl/vertex.ts");
|
2650
|
+
|
2651
|
+
|
2652
|
+
|
2653
|
+
|
2654
|
+
/***/ }),
|
2655
|
+
|
2656
|
+
/***/ "../../../dev/addons/src/msdfText/webgl/vertex.ts":
|
2657
|
+
/*!********************************************************!*\
|
2658
|
+
!*** ../../../dev/addons/src/msdfText/webgl/vertex.ts ***!
|
2659
|
+
\********************************************************/
|
2660
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2661
|
+
|
2662
|
+
__webpack_require__.r(__webpack_exports__);
|
2663
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2664
|
+
/* harmony export */ msdfVertexShader: () => (/* binding */ msdfVertexShader)
|
2665
|
+
/* harmony export */ });
|
2666
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
2667
|
+
var name = "msdfVertexShader";
|
2668
|
+
var shader = "\n#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\n\nattribute vec2 offsets;\nattribute vec4 world0;\nattribute vec4 world1;\nattribute vec4 world2;\nattribute vec4 world3;\nattribute vec4 uvs;\n\nuniform mat4 transform;\nuniform mat4 parentWorld;\nuniform mat4 view;\nuniform mat4 projection;\nuniform vec3 center;\nuniform int mode;\n\nvarying vec2 atlasUV;\n\nvoid main(void) {\n mat4 world = mat4(world0, world1, world2, world3);\n vec4 worldPos = transform * (world * vec4(offsets.xy - vec2(0.5, 0.5), 0., 1.0));\n\n if (mode >= BILLBOARD) {\n vec3 viewPos = (view * parentWorld * vec4(0., 0., 0., 1.0)).xyz; \n if (mode == BILLBOARDSCREENPROJECTED) {\n viewPos.x /= viewPos.z;\n viewPos.y /= viewPos.z;\n viewPos.z = 1.0;\n }\n gl_Position = projection * vec4(viewPos + worldPos.xyz,1.0); \n } else {\n vec3 viewPos = (view * parentWorld * worldPos).xyz; \n gl_Position = projection * vec4(viewPos,1.0); \n }\n atlasUV = vec2(uvs.x + offsets.x * uvs.z, uvs.y + (1.0 - offsets.y) * uvs.w);\n}";
|
2669
|
+
/** @internal */
|
2670
|
+
var msdfVertexShader = { name: name, shader: shader };
|
2671
|
+
|
2672
|
+
|
2673
|
+
/***/ }),
|
2674
|
+
|
2675
|
+
/***/ "../../../dev/addons/src/msdfText/webgpu/fragment.ts":
|
2676
|
+
/*!***********************************************************!*\
|
2677
|
+
!*** ../../../dev/addons/src/msdfText/webgpu/fragment.ts ***!
|
2678
|
+
\***********************************************************/
|
2679
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2680
|
+
|
2681
|
+
__webpack_require__.r(__webpack_exports__);
|
2682
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2683
|
+
/* harmony export */ msdfFragmentShaderWGSL: () => (/* binding */ msdfFragmentShaderWGSL)
|
2684
|
+
/* harmony export */ });
|
2685
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
2686
|
+
var name = "msdfFragmentShaderWGSL";
|
2687
|
+
var shader = "\nvar fontAtlas: texture_2d<f32>;\nvar fontAtlasSampler: sampler;\nuniform uColor: vec4f;\nuniform thickness: f32;\nuniform uStrokeColor: vec4f;\nuniform uStrokeInsetWidth: f32;\nuniform uStrokeOutsetWidth: f32;\n\nvarying atlasUV: vec2f;\n\nfn median(msdf: vec3<f32>) -> f32 {\n let a = min(msdf.r, msdf.g);\n let b = max(msdf.r, msdf.g);\n return max(a, min(b, msdf.b));\n}\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n let s = textureSample(fontAtlas, fontAtlasSampler, input.atlasUV).rgb;\n let sigDist = median(s) - 0.5 + uniforms.thickness;\n\n let afwidth = length(vec2<f32>(dpdx(sigDist), dpdy(sigDist)));\n let alpha = clamp(sigDist / afwidth + 0.5, 0.0, 1.0);\n\n let sigDistOutset = sigDist + uniforms.uStrokeOutsetWidth * 0.5;\n let sigDistInset = sigDist - uniforms.uStrokeInsetWidth * 0.5;\n\n let afwidthOutset = length(vec2<f32>(dpdx(sigDistOutset), dpdy(sigDistOutset)));\n let afwidthInset = length(vec2<f32>(dpdx(sigDistInset), dpdy(sigDistInset)));\n\n let outset = clamp(sigDistOutset / afwidthOutset + 0.5, 0.0, 1.0);\n let inset = 1.0 - clamp(sigDistInset / afwidthInset + 0.5, 0.0, 1.0);\n\n let border = outset * inset;\n\n let filledFragColor = vec4<f32>(uniforms.uColor.rgb, alpha * uniforms.uColor.a);\n let strokedFragColor = vec4<f32>(uniforms.uStrokeColor.rgb, border * uniforms.uStrokeColor.a);\n\n fragmentOutputs.color = mix(filledFragColor, strokedFragColor, border);\n}";
|
2688
|
+
/** @internal */
|
2689
|
+
var msdfFragmentShaderWGSL = { name: name, shader: shader };
|
2690
|
+
|
2691
|
+
|
2692
|
+
/***/ }),
|
2693
|
+
|
2694
|
+
/***/ "../../../dev/addons/src/msdfText/webgpu/index.ts":
|
2695
|
+
/*!********************************************************!*\
|
2696
|
+
!*** ../../../dev/addons/src/msdfText/webgpu/index.ts ***!
|
2697
|
+
\********************************************************/
|
2698
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2699
|
+
|
2700
|
+
__webpack_require__.r(__webpack_exports__);
|
2701
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2702
|
+
/* harmony export */ msdfFragmentShaderWGSL: () => (/* reexport safe */ _fragment__WEBPACK_IMPORTED_MODULE_0__.msdfFragmentShaderWGSL),
|
2703
|
+
/* harmony export */ msdfVertexShaderWGSL: () => (/* reexport safe */ _vertex__WEBPACK_IMPORTED_MODULE_1__.msdfVertexShaderWGSL)
|
2704
|
+
/* harmony export */ });
|
2705
|
+
/* harmony import */ var _fragment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fragment */ "../../../dev/addons/src/msdfText/webgpu/fragment.ts");
|
2706
|
+
/* harmony import */ var _vertex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vertex */ "../../../dev/addons/src/msdfText/webgpu/vertex.ts");
|
2707
|
+
|
2708
|
+
|
2709
|
+
|
2710
|
+
|
2711
|
+
/***/ }),
|
2712
|
+
|
2713
|
+
/***/ "../../../dev/addons/src/msdfText/webgpu/vertex.ts":
|
2714
|
+
/*!*********************************************************!*\
|
2715
|
+
!*** ../../../dev/addons/src/msdfText/webgpu/vertex.ts ***!
|
2716
|
+
\*********************************************************/
|
2717
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
2718
|
+
|
2719
|
+
__webpack_require__.r(__webpack_exports__);
|
2720
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
2721
|
+
/* harmony export */ msdfVertexShaderWGSL: () => (/* binding */ msdfVertexShaderWGSL)
|
2722
|
+
/* harmony export */ });
|
2723
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
2724
|
+
var name = "msdfVertexShaderWGSL";
|
2725
|
+
var shader = "\n#define BILLBOARD 1\n#define BILLBOARDSCREENPROJECTED 2\n\nattribute offsets: vec2f;\nattribute world0: vec4f;\nattribute world1: vec4f;\nattribute world2: vec4f;\nattribute world3: vec4f;\nattribute uvs: vec4f;\n\nuniform transform: mat4x4f;\nuniform parentWorld: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform mode: u32;\n\nvarying atlasUV: vec2f;\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let world = mat4x4<f32>(input.world0, input.world1, input.world2, input.world3);\n let localOffset = vec4<f32>(input.offsets - vec2<f32>(0.5, 0.5), 0.0, 1.0);\n let worldPos = uniforms.transform * world * localOffset;\n\n if (uniforms.mode >= BILLBOARD) { \n var viewPos = (uniforms.view * uniforms.parentWorld * vec4f(0., 0., 0., 1.0)).xyz;\n if (uniforms.mode == BILLBOARDSCREENPROJECTED) {\n viewPos = vec3f(viewPos.x / viewPos.z, viewPos.y / viewPos.z, 1.0);\n } \n vertexOutputs.position = uniforms.projection * vec4<f32>(viewPos + worldPos.xyz, 1.0);\n } else { \n let viewPos = (uniforms.view * uniforms.parentWorld * worldPos).xyz;\n vertexOutputs.position = uniforms.projection * vec4<f32>(viewPos, 1.0);\n }\n\n vertexOutputs.atlasUV = vec2<f32>(\n input.uvs.x + input.offsets.x * input.uvs.z,\n input.uvs.y + (1.0 - input.offsets.y) * input.uvs.w\n );\n}";
|
2726
|
+
/** @internal */
|
2727
|
+
var msdfVertexShaderWGSL = { name: name, shader: shader };
|
2728
|
+
|
2729
|
+
|
2730
|
+
/***/ }),
|
2731
|
+
|
2732
|
+
/***/ "babylonjs/Maths/math":
|
2502
2733
|
/*!****************************************************************************************************!*\
|
2503
2734
|
!*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
|
2504
2735
|
\****************************************************************************************************/
|
2505
2736
|
/***/ ((module) => {
|
2506
2737
|
|
2507
|
-
module.exports =
|
2738
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math__;
|
2508
2739
|
|
2509
2740
|
/***/ })
|
2510
2741
|
|
@@ -2534,9 +2765,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
|
|
2534
2765
|
/******/ return module.exports;
|
2535
2766
|
/******/ }
|
2536
2767
|
/******/
|
2537
|
-
/******/ // expose the modules object (__webpack_modules__)
|
2538
|
-
/******/ __webpack_require__.m = __webpack_modules__;
|
2539
|
-
/******/
|
2540
2768
|
/************************************************************************/
|
2541
2769
|
/******/ /* webpack/runtime/compat get default export */
|
2542
2770
|
/******/ (() => {
|
@@ -2562,91 +2790,11 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
|
|
2562
2790
|
/******/ };
|
2563
2791
|
/******/ })();
|
2564
2792
|
/******/
|
2565
|
-
/******/ /* webpack/runtime/ensure chunk */
|
2566
|
-
/******/ (() => {
|
2567
|
-
/******/ __webpack_require__.f = {};
|
2568
|
-
/******/ // This file contains only the entry chunk.
|
2569
|
-
/******/ // The chunk loading function for additional chunks
|
2570
|
-
/******/ __webpack_require__.e = (chunkId) => {
|
2571
|
-
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
|
2572
|
-
/******/ __webpack_require__.f[key](chunkId, promises);
|
2573
|
-
/******/ return promises;
|
2574
|
-
/******/ }, []));
|
2575
|
-
/******/ };
|
2576
|
-
/******/ })();
|
2577
|
-
/******/
|
2578
|
-
/******/ /* webpack/runtime/get javascript chunk filename */
|
2579
|
-
/******/ (() => {
|
2580
|
-
/******/ // This function allow to reference async chunks
|
2581
|
-
/******/ __webpack_require__.u = (chunkId) => {
|
2582
|
-
/******/ // return url for filenames based on template
|
2583
|
-
/******/ return "" + chunkId + ".js";
|
2584
|
-
/******/ };
|
2585
|
-
/******/ })();
|
2586
|
-
/******/
|
2587
|
-
/******/ /* webpack/runtime/global */
|
2588
|
-
/******/ (() => {
|
2589
|
-
/******/ __webpack_require__.g = (function() {
|
2590
|
-
/******/ if (typeof globalThis === 'object') return globalThis;
|
2591
|
-
/******/ try {
|
2592
|
-
/******/ return this || new Function('return this')();
|
2593
|
-
/******/ } catch (e) {
|
2594
|
-
/******/ if (typeof window === 'object') return window;
|
2595
|
-
/******/ }
|
2596
|
-
/******/ })();
|
2597
|
-
/******/ })();
|
2598
|
-
/******/
|
2599
2793
|
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
2600
2794
|
/******/ (() => {
|
2601
2795
|
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
2602
2796
|
/******/ })();
|
2603
2797
|
/******/
|
2604
|
-
/******/ /* webpack/runtime/load script */
|
2605
|
-
/******/ (() => {
|
2606
|
-
/******/ var inProgress = {};
|
2607
|
-
/******/ var dataWebpackPrefix = "ADDONS:";
|
2608
|
-
/******/ // loadScript function to load a script via script tag
|
2609
|
-
/******/ __webpack_require__.l = (url, done, key, chunkId) => {
|
2610
|
-
/******/ if(inProgress[url]) { inProgress[url].push(done); return; }
|
2611
|
-
/******/ var script, needAttach;
|
2612
|
-
/******/ if(key !== undefined) {
|
2613
|
-
/******/ var scripts = document.getElementsByTagName("script");
|
2614
|
-
/******/ for(var i = 0; i < scripts.length; i++) {
|
2615
|
-
/******/ var s = scripts[i];
|
2616
|
-
/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; }
|
2617
|
-
/******/ }
|
2618
|
-
/******/ }
|
2619
|
-
/******/ if(!script) {
|
2620
|
-
/******/ needAttach = true;
|
2621
|
-
/******/ script = document.createElement('script');
|
2622
|
-
/******/
|
2623
|
-
/******/ script.charset = 'utf-8';
|
2624
|
-
/******/ script.timeout = 120;
|
2625
|
-
/******/ if (__webpack_require__.nc) {
|
2626
|
-
/******/ script.setAttribute("nonce", __webpack_require__.nc);
|
2627
|
-
/******/ }
|
2628
|
-
/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key);
|
2629
|
-
/******/
|
2630
|
-
/******/ script.src = url;
|
2631
|
-
/******/ }
|
2632
|
-
/******/ inProgress[url] = [done];
|
2633
|
-
/******/ var onScriptComplete = (prev, event) => {
|
2634
|
-
/******/ // avoid mem leaks in IE.
|
2635
|
-
/******/ script.onerror = script.onload = null;
|
2636
|
-
/******/ clearTimeout(timeout);
|
2637
|
-
/******/ var doneFns = inProgress[url];
|
2638
|
-
/******/ delete inProgress[url];
|
2639
|
-
/******/ script.parentNode && script.parentNode.removeChild(script);
|
2640
|
-
/******/ doneFns && doneFns.forEach((fn) => (fn(event)));
|
2641
|
-
/******/ if(prev) return prev(event);
|
2642
|
-
/******/ }
|
2643
|
-
/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
|
2644
|
-
/******/ script.onerror = onScriptComplete.bind(null, script.onerror);
|
2645
|
-
/******/ script.onload = onScriptComplete.bind(null, script.onload);
|
2646
|
-
/******/ needAttach && document.head.appendChild(script);
|
2647
|
-
/******/ };
|
2648
|
-
/******/ })();
|
2649
|
-
/******/
|
2650
2798
|
/******/ /* webpack/runtime/make namespace object */
|
2651
2799
|
/******/ (() => {
|
2652
2800
|
/******/ // define __esModule on exports
|
@@ -2658,119 +2806,6 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
|
|
2658
2806
|
/******/ };
|
2659
2807
|
/******/ })();
|
2660
2808
|
/******/
|
2661
|
-
/******/ /* webpack/runtime/publicPath */
|
2662
|
-
/******/ (() => {
|
2663
|
-
/******/ var scriptUrl;
|
2664
|
-
/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
|
2665
|
-
/******/ var document = __webpack_require__.g.document;
|
2666
|
-
/******/ if (!scriptUrl && document) {
|
2667
|
-
/******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')
|
2668
|
-
/******/ scriptUrl = document.currentScript.src;
|
2669
|
-
/******/ if (!scriptUrl) {
|
2670
|
-
/******/ var scripts = document.getElementsByTagName("script");
|
2671
|
-
/******/ if(scripts.length) {
|
2672
|
-
/******/ var i = scripts.length - 1;
|
2673
|
-
/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;
|
2674
|
-
/******/ }
|
2675
|
-
/******/ }
|
2676
|
-
/******/ }
|
2677
|
-
/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
|
2678
|
-
/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
|
2679
|
-
/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
|
2680
|
-
/******/ scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
|
2681
|
-
/******/ __webpack_require__.p = scriptUrl;
|
2682
|
-
/******/ })();
|
2683
|
-
/******/
|
2684
|
-
/******/ /* webpack/runtime/jsonp chunk loading */
|
2685
|
-
/******/ (() => {
|
2686
|
-
/******/ // no baseURI
|
2687
|
-
/******/
|
2688
|
-
/******/ // object to store loaded and loading chunks
|
2689
|
-
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
|
2690
|
-
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
|
2691
|
-
/******/ var installedChunks = {
|
2692
|
-
/******/ "addons": 0
|
2693
|
-
/******/ };
|
2694
|
-
/******/
|
2695
|
-
/******/ __webpack_require__.f.j = (chunkId, promises) => {
|
2696
|
-
/******/ // JSONP chunk loading for javascript
|
2697
|
-
/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
|
2698
|
-
/******/ if(installedChunkData !== 0) { // 0 means "already installed".
|
2699
|
-
/******/
|
2700
|
-
/******/ // a Promise means "currently loading".
|
2701
|
-
/******/ if(installedChunkData) {
|
2702
|
-
/******/ promises.push(installedChunkData[2]);
|
2703
|
-
/******/ } else {
|
2704
|
-
/******/ if(true) { // all chunks have JS
|
2705
|
-
/******/ // setup Promise in chunk cache
|
2706
|
-
/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
|
2707
|
-
/******/ promises.push(installedChunkData[2] = promise);
|
2708
|
-
/******/
|
2709
|
-
/******/ // start chunk loading
|
2710
|
-
/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId);
|
2711
|
-
/******/ // create error before stack unwound to get useful stacktrace later
|
2712
|
-
/******/ var error = new Error();
|
2713
|
-
/******/ var loadingEnded = (event) => {
|
2714
|
-
/******/ if(__webpack_require__.o(installedChunks, chunkId)) {
|
2715
|
-
/******/ installedChunkData = installedChunks[chunkId];
|
2716
|
-
/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
|
2717
|
-
/******/ if(installedChunkData) {
|
2718
|
-
/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
|
2719
|
-
/******/ var realSrc = event && event.target && event.target.src;
|
2720
|
-
/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
|
2721
|
-
/******/ error.name = 'ChunkLoadError';
|
2722
|
-
/******/ error.type = errorType;
|
2723
|
-
/******/ error.request = realSrc;
|
2724
|
-
/******/ installedChunkData[1](error);
|
2725
|
-
/******/ }
|
2726
|
-
/******/ }
|
2727
|
-
/******/ };
|
2728
|
-
/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
|
2729
|
-
/******/ }
|
2730
|
-
/******/ }
|
2731
|
-
/******/ }
|
2732
|
-
/******/ };
|
2733
|
-
/******/
|
2734
|
-
/******/ // no prefetching
|
2735
|
-
/******/
|
2736
|
-
/******/ // no preloaded
|
2737
|
-
/******/
|
2738
|
-
/******/ // no HMR
|
2739
|
-
/******/
|
2740
|
-
/******/ // no HMR manifest
|
2741
|
-
/******/
|
2742
|
-
/******/ // no on chunks loaded
|
2743
|
-
/******/
|
2744
|
-
/******/ // install a JSONP callback for chunk loading
|
2745
|
-
/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
|
2746
|
-
/******/ var [chunkIds, moreModules, runtime] = data;
|
2747
|
-
/******/ // add "moreModules" to the modules object,
|
2748
|
-
/******/ // then flag all "chunkIds" as loaded and fire callback
|
2749
|
-
/******/ var moduleId, chunkId, i = 0;
|
2750
|
-
/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
|
2751
|
-
/******/ for(moduleId in moreModules) {
|
2752
|
-
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
|
2753
|
-
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
|
2754
|
-
/******/ }
|
2755
|
-
/******/ }
|
2756
|
-
/******/ if(runtime) var result = runtime(__webpack_require__);
|
2757
|
-
/******/ }
|
2758
|
-
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
|
2759
|
-
/******/ for(;i < chunkIds.length; i++) {
|
2760
|
-
/******/ chunkId = chunkIds[i];
|
2761
|
-
/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
|
2762
|
-
/******/ installedChunks[chunkId][0]();
|
2763
|
-
/******/ }
|
2764
|
-
/******/ installedChunks[chunkId] = 0;
|
2765
|
-
/******/ }
|
2766
|
-
/******/
|
2767
|
-
/******/ }
|
2768
|
-
/******/
|
2769
|
-
/******/ var chunkLoadingGlobal = (typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this)["webpackChunkADDONS"] = (typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this)["webpackChunkADDONS"] || [];
|
2770
|
-
/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
|
2771
|
-
/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
|
2772
|
-
/******/ })();
|
2773
|
-
/******/
|
2774
2809
|
/************************************************************************/
|
2775
2810
|
var __webpack_exports__ = {};
|
2776
2811
|
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
|
@@ -2796,4 +2831,4 @@ __webpack_exports__ = __webpack_exports__["default"];
|
|
2796
2831
|
/******/ })()
|
2797
2832
|
;
|
2798
2833
|
});
|
2799
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFtQkE7QUFHQTtBQUZBO0FBQ0E7QUFwQkE7QUFDQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQXVCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsT0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBa0JBOzs7O0FBSUE7QUFDQTtBQUFBO0FBdEJBO0FBRUE7QUFxQkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRkE7QUFFQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7QUFLQTtBQUNBO0FBYUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhCQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUF3QkE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZLQTtBQUVBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFrQkE7Ozs7Ozs7O0FBUUE7QUFDQTtBQWlFQTtBQUFBO0FBaEVBO0FBR0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUVBO0FBYUE7O0FBRUE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQW5DQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQWNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQVlBO0FBQ0E7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFBQTtBQUNBOztBQUFBOztBQUVBOztBQUFBO0FBQ0E7O0FBQUE7OztBQUdBO0FBQ0E7QUFFQTs7OztBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7O0FDM1hBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3JGQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9maXRTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvaHRtbE1lc2gudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9wb2ludGVyRXZlbnRzQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L2ZvbnRBc3NldC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3BhcmFncmFwaE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9wYXJhZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3RleHRSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9BRERPTlMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2xvYWQgc2NyaXB0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvcHVibGljUGF0aCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vQURET05TLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1hZGRvbnNcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1hZGRvbnNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkFERE9OU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGhzX21hdGhfdmVjdG9yX18pID0+IHtcbnJldHVybiAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgIHZhciBhciA9IFtdO1xuICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgcmV0dXJuIGFyO1xuICB9O1xuICByZXR1cm4gb3duS2V5cyhvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgdmFyIHIsIHMgPSAwO1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcbiAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcbiAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgcyB8PSAxO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICB9XG4gIHJldHVybiBuZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xuICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fZXNEZWNvcmF0ZSxcbiAgX19ydW5Jbml0aWFsaXplcnMsXG4gIF9fcHJvcEtleSxcbiAgX19zZXRGdW5jdGlvbk5hbWUsXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxuICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcbn07XG4iLCJleHBvcnQgdHlwZSBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50O1xyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkO1xyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lDb250YWluOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQub2Zmc2V0V2lkdGgsIHNjYWxpbmdFbGVtZW50Lm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbih3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lDb3ZlcjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50Lm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudC5vZmZzZXRIZWlnaHRdO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgod2lkdGggLyBjaGlsZFdpZHRoLCBoZWlnaHQgLyBjaGlsZEhlaWdodCk7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7c2NhbGV9KWA7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfSxcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5U3RyZXRjaDogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50Lm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudC5vZmZzZXRIZWlnaHRdO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3dpZHRoIC8gY2hpbGRXaWR0aH0sICR7aGVpZ2h0IC8gY2hpbGRIZWlnaHR9KWA7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfSxcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5Tm9uZTogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoc2l6aW5nRWxlbWVudCkge1xyXG4gICAgICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBGaXRTdHJhdGVneSA9IHtcclxuICAgIENPTlRBSU46IEZpdFN0cmF0ZWd5Q29udGFpbixcclxuICAgIENPVkVSOiBGaXRTdHJhdGVneUNvdmVyLFxyXG4gICAgU1RSRVRDSDogRml0U3RyYXRlZ3lTdHJldGNoLFxyXG4gICAgTk9ORTogRml0U3RyYXRlZ3lOb25lLFxyXG59O1xyXG4iLCJpbXBvcnQgeyBNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL21lc2hcIjtcclxuaW1wb3J0IHsgQ3JlYXRlUGxhbmVWZXJ0ZXhEYXRhIH0gZnJvbSBcImNvcmUvTWVzaGVzL0J1aWxkZXJzL3BsYW5lQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBTdGFuZGFyZE1hdGVyaWFsIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL3N0YW5kYXJkTWF0ZXJpYWxcIjtcclxuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aFwiO1xyXG5pbXBvcnQgeyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcImNvcmUvTWlzYy9sb2dnZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBGaXRTdHJhdGVneVR5cGUgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5pbXBvcnQgeyBGaXRTdHJhdGVneSB9IGZyb20gXCIuL2ZpdFN0cmF0ZWd5XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIEhUTUwgY29udGVudCB0aGF0IHdlIHdhbnQgdG8gcmVuZGVyIGFzIHRob3VnaCBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZS4gIFRoZSBIVE1MIGNvbnRlbnQgaXMgYWN0dWFsbHlcclxuICogcmVuZGVyZWQgYmVsb3cgdGhlIGNhbnZhcywgYnV0IGEgZGVwdGggbWFzayBpcyBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgdGhhdCB3cml0ZXMgdG8gdGhlIGRlcHRoIGJ1ZmZlciBidXQgZG9lcyBub3RcclxuICogd3JpdGUgdG8gdGhlIGNvbG9yIGJ1ZmZlciwgZWZmZWN0aXZlbHkgcHVuY2hpbmcgYSBob2xlIGluIHRoZSBjYW52YXMuICBDU1MgdHJhbnNmb3JtcyBhcmUgdXNlZCB0byBzY2FsZSwgdHJhbnNsYXRlLCBhbmQgcm90YXRlXHJcbiAqIHRoZSBIVE1MIGNvbnRlbnQgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSBjYW1lcmEgYW5kIG1lc2ggb3JpZW50YXRpb24uICBUaGUgY2xhc3Mgc3VwcG9ydHMgaW50ZXJhY3Rpb25zIGluIGVkaXRhYmxlIGFuZCBub24tZWRpdGFibGUgbW9kZS5cclxuICogSW4gbm9uLWVkaXRhYmxlIG1vZGUgKHRoZSBkZWZhdWx0KSwgZXZlbnRzIGFyZSBwYXNzZWQgdG8gdGhlIEhUTUwgY29udGVudCB3aGVuIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhlIG1hc2sgKGFuZCBub3Qgb2NjbHVkZWQgYnkgb3RoZXIgbWVzaGVzXHJcbiAqIGluIHRoZSBzY2VuZSkuXHJcbiAqIEBzZWUgaHR0cHM6Ly9wbGF5Z3JvdW5kLmJhYnlsb25qcy5jb20vI0hWSFlKQyM1XHJcbiAqIEBzZWUgaHR0cHM6Ly9wbGF5Z3JvdW5kLmJhYnlsb25qcy5jb20vI0IxN1RDNyMxMTJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBIdG1sTWVzaCBleHRlbmRzIE1lc2gge1xyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwcyBpZGVudGlmeWluZyBhIGh0bWwgbWVzaCBmcm9tIGEgcmVndWxhciBtZXNoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNIdG1sTWVzaCgpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPdmVycmlkZSB0aGUgc3VwZXIgY2xhc3MncyBfaXNFbmFibGVkIHByb3BlcnR5IHNvIHdlIGNhbiBjb250cm9sIHdoZW4gdGhlIG1lc2hcclxuICAgIC8vIGlzIGVuYWJsZWQuICBJLmUuLCB3ZSBkb24ndCB3YW50IHRvIHJlbmRlciB0aGUgbWVzaCB1bnRpbCB0aGVyZSBpcyBjb250ZW50IHRvIHNob3cuXHJcbiAgICBwcml2YXRlIF9lbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gVGhlIG1lc2ggaXMgcmVhZHkgd2hlbiBjb250ZW50IGhhcyBiZWVuIHNldCBhbmQgdGhlIGNvbnRlbnQgc2l6ZSBoYXMgYmVlbiBzZXRcclxuICAgIC8vIFRoZSBmb3JtZXIgaXMgZG9uZSBieSB0aGUgdXNlciwgdGhlIGxhdHRlciBpcyBkb25lIGJ5IHRoZSByZW5kZXJlci5cclxuICAgIHByaXZhdGUgX3JlYWR5ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9pc0NhbnZhc092ZXJsYXkgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudD86IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfd2lkdGg/OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9oZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBfaW52ZXJzZVNjYWxlTWF0cml4OiBNYXRyaXggfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9jYXB0dXJlT25Qb2ludGVyRW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yOiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfc291cmNlV2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfc291cmNlSGVpZ2h0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgc291cmNlIHdpZHRoIG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHNvdXJjZVdpZHRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgc291cmNlIGhlaWdodCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzb3VyY2VIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZUhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyOiBhbnk7XHJcblxyXG4gICAgcHJpdmF0ZSBfZml0U3RyYXRlZ3k6IEZpdFN0cmF0ZWd5VHlwZSA9IEZpdFN0cmF0ZWd5Lk5PTkU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cnVjdCBhbiBpbnN0YW5jZSBvZiBIdG1sTWVzaFxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtZXNoLiAgV2lsbCBiZSB1c2VkIGFzIHRoZSBpZCBvZiB0aGUgSFRNTCBlbGVtZW50IGFzIHdlbGwuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3Qgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHNjZW5lOiBTY2VuZSwgaWQ6IHN0cmluZywgeyBjYXB0dXJlT25Qb2ludGVyRW50ZXIgPSB0cnVlLCBpc0NhbnZhc092ZXJsYXkgPSBmYWxzZSwgZml0U3RyYXRlZ3kgPSBGaXRTdHJhdGVneS5OT05FIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKGlkLCBzY2VuZSk7XHJcblxyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgQmFpbCBpZiB3ZSBhcmVuJ3QgcnVubmluZyBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5XYXJuKGBDcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBhbiBIdG1sTWVzaCB3aXRoIGlkICR7aWR9IG91dHNpZGUgb2YgYSBicm93c2VyLiAgVGhlIG1lc2ggd2lsbCBub3QgYmUgdmlzaWJsZS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZml0U3RyYXRlZ3kgPSBmaXRTdHJhdGVneTtcclxuICAgICAgICB0aGlzLl9pc0NhbnZhc092ZXJsYXkgPSBpc0NhbnZhc092ZXJsYXk7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTWFzaygpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9jcmVhdGVFbGVtZW50KCk7XHJcblxyXG4gICAgICAgIC8vIFNldCBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoaXMgd2lsbCBzaG93IGFzIHNvb24gYXMgaXQncyByZWFkeVxyXG4gICAgICAgIHRoaXMuc2V0RW5hYmxlZCh0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBiZWhhdmlvciB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yID0gbmV3IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IodGhpcy5jYXB0dXJlUG9pbnRlckV2ZW50cy5iaW5kKHRoaXMpLCB0aGlzLnJlbGVhc2VQb2ludGVyRXZlbnRzLmJpbmQodGhpcyksIHtcclxuICAgICAgICAgICAgY2FwdHVyZU9uUG9pbnRlckVudGVyOiB0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hZGRCZWhhdmlvcih0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgSFRNTCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQgYXMgYSBtZXNoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgdGhlIG1lc2ggaGFzIGJlZW4gbW92ZWQsIHJvdGF0ZWQsIG9yIHNjYWxlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXNcclxuICAgICAqIHByb3BlcnR5IHdhcyByZWFkLiAgVGhpcyBwcm9wZXJ0eSBpcyByZXNldCB0byBmYWxzZSBhZnRlciByZWFkaW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVzVXBkYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlc1VwZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSBjYXB0dXJlIGZvciB0aGUgcG9pbnRlciB3aGVuIGVudGVyaW5nIHRoZSBtZXNoIGFyZWFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBjYXB0dXJlT25Qb2ludGVyRW50ZXIoY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yLmNhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlcyBvZiB0aGUgbWVzaCBhbmQgdGhlIEhUTUwgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudD8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfbWFya0FzVXBkYXRlZCgpIHtcclxuICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgYWRqdXN0aW5nIHRoZSBtZXNoIHNjYWxlIHRvIG1hdGNoIGFuZCBtYWtpbmcgaXQgdmlzaWJsZS5cclxuICAgICAqIElmIHRoZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgaXMgdW5kZWZpbmVkLCB0aGVuIGl0IHdpbGwgbWFrZSB0aGUgbWVzaCBpbnZpc2libGUuICBJbiBlaXRoZXIgY2FzZSBpdCB3aWxsIGNsZWFyIHRoZVxyXG4gICAgICogZWxlbWVudCBjb250ZW50IGZpcnN0LlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGFzIGEgbWVzaFxyXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbWVzaCBpbiBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG1lc2ggaW4gQmFieWxvbiB1bml0c1xyXG4gICAgICovXHJcbiAgICBzZXRDb250ZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIC8vIElmIGNvbnRlbnQgaXMgY2hhbmdlZCwgd2UgYXJlIG5vIGxvbmdlciByZWFkeVxyXG4gICAgICAgIHRoaXMuX3NldEFzUmVhZHkoZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyBBbHNvIGludmFsaWRhdGUgdGhlIHNvdXJjZSB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgdGhpcy5fc291cmNlV2lkdGggPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZUhlaWdodCA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuc2NhbGluZy5zZXRBbGwoMSk7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZml0U3RyYXRlZ3kud3JhcEVsZW1lbnQoZWxlbWVudCkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlV2lkdGggJiYgdGhpcy5zb3VyY2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0QXNSZWFkeSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3ZlcmlkZXMgQkFCWUxPTi5NZXNoLnNldEVuYWJsZWRcclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBDYXB0dXJlIHJlcXVlc3RlZCBlbmFibGVkIHN0YXRlXHJcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgIC8vIElmIGRpc2FibGluZyBvciBlbmFibGluZyBhbmQgd2UgYXJlIHJlYWR5XHJcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8IHRoaXMuX3JlYWR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvU2V0RW5hYmxlZChlbmFibGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb250ZW50IHNpemUgaW4gcGl4ZWxzXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHNvdXJjZVxyXG4gICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHNvdXJjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0Q29udGVudFNpemVQeCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVdpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQgfHwgIXRoaXMuX2VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZml0U3RyYXRlZ3kudXBkYXRlU2l6ZSh0aGlzLl9lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEFzUmVhZHkocmVhZHk6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9yZWFkeSA9IHJlYWR5O1xyXG4gICAgICAgIGlmIChyZWFkeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQodGhpcy5fZW5hYmxlZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kb1NldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIGVuYWJsZWQsIHRoZW4gc3RhcnQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIHRoZVxyXG4gICAgICAgIC8vIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgcG9zaXRpb24uICBvdGhlcndpc2Ugc3RvcCBsaXN0ZW5pbmdcclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiAhdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyID0gdGhpcy5vbkFmdGVyV29ybGRNYXRyaXhVcGRhdGVPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgZW5hYmxlZCwgdGhlbiByZXZlcnQgdGhlIGNvbnRlbnQgZWxlbWVudCBkaXNwbGF5XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGhpZGUgaXRcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBlbmFibGVkID8gXCJcIiA6IFwibm9uZVwiO1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIGNvbnRlbnQgeiBpbmRleFxyXG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnR6SW5kZXgodGhpcy5wb3NpdGlvbi56ICogLTEwMDAwKTtcclxuICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpIHtcclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIHNldENvbnRlbnQgYmVmb3JlLCB0aGUgY29udGVudCBzY2FsZSBpcyBiYWtlZCBpbnRvIHRoZSBtZXNoLiAgSWYgd2UgZG9uJ3QgcmVzZXQgdGhlIHZlcnRpY2VzIHRvXHJcbiAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHNpemUsIHRoZW4gd2Ugd2lsbCBtdWx0aXBseSB0aGUgc2NhbGUgd2hlbiB3ZSBiYWtlIHRoZSBzY2FsZSBiZWxvdy4gIEJ5IGFwcGx5aW5nIHRoZSBpbnZlcnNlLCB3ZSBiYWNrIG91dFxyXG4gICAgICAgIC8vIHRoZSBzY2FsaW5nIHRoYXQgaGFzIGJlZW4gZG9uZSBzbyB3ZSBhcmUgc3RhcnRpbmcgZnJvbSB0aGUgc2FtZSBwb2ludC5cclxuICAgICAgICAvLyBGaXJzdCByZXNldCB0aGUgc2NhbGUgdG8gMVxyXG4gICAgICAgIHRoaXMuc2NhbGluZy5zZXRBbGwoMSk7XHJcbiAgICAgICAgLy8gVGhlbiBiYWNrIG91dCB0aGUgb3JpZ2luYWwgdmVydGljZXMgY2hhbmdlcyB0byBtYXRjaCB0aGUgY29udGVudCBzY2FsZVxyXG4gICAgICAgIGlmICh0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWtlVHJhbnNmb3JtSW50b1ZlcnRpY2VzKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCk7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgbWF0cml4IHNvIGl0IGRvZXNuJ3QgZ2V0IGFwcGxpZWQgYWdhaW4gdW5sZXNzIHdlIHNjYWxlXHJcbiAgICAgICAgICAgIHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgc2NhbGUgdG8gbWF0Y2ggY29udGVudC4gIE5vdGUgd2UgY2FuJ3QganVzdCBzY2FsZSB0aGUgbWVzaCwgYmVjYXVzZSB0aGF0IHdpbGwgc2NhbGUgdGhlIGNvbnRlbnQgYXMgd2VsbFxyXG4gICAgICAgIC8vIFdoYXQgd2UgbmVlZCB0byBkbyBpcyBjb21wdXRlIGEgc2NhbGUgbWF0cml4IGFuZCB0aGVuIGJha2UgdGhhdCBpbnRvIHRoZSBtZXNoIHZlcnRpY2VzLiAgVGhpcyB3aWxsIGxlYXZlIHRoZVxyXG4gICAgICAgIC8vIG1lc2ggc2NhbGUgYXQgMSwgc28gb3VyIGNvbnRlbnQgd2lsbCBzdGF5IGl0J3Mgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCB1bnRpbCB3ZSBzY2FsZSB0aGUgbWVzaC5cclxuICAgICAgICBjb25zdCBzY2FsZVggPSB0aGlzLl93aWR0aCB8fCAxO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlWSA9IHRoaXMuX2hlaWdodCB8fCAxO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlTWF0cml4ID0gTWF0cml4LlNjYWxpbmcoc2NhbGVYLCBzY2FsZVksIDEpO1xyXG4gICAgICAgIHRoaXMuYmFrZVRyYW5zZm9ybUludG9WZXJ0aWNlcyhzY2FsZU1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIEdldCBhbiBpbnZlcnNlIG9mIHRoZSBzY2FsZSBtYXRyaXggdGhhdCB3ZSBjYW4gdXNlIHRvIGJhY2sgb3V0IHRoZSBzY2FsZSBjaGFuZ2VzIHdlIGhhdmUgbWFkZSBzb1xyXG4gICAgICAgIC8vIHdlIGRvbid0IG11bHRpcGx5IHRoZSBzY2FsZS5cclxuICAgICAgICB0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXggPSBuZXcgTWF0cml4KCk7XHJcbiAgICAgICAgc2NhbGVNYXRyaXguaW52ZXJ0VG9SZWYodGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZU1hc2soKSB7XHJcbiAgICAgICAgY29uc3QgdmVydGV4RGF0YSA9IENyZWF0ZVBsYW5lVmVydGV4RGF0YSh7IHdpZHRoOiAxLCBoZWlnaHQ6IDEgfSk7XHJcbiAgICAgICAgdmVydGV4RGF0YS5hcHBseVRvTWVzaCh0aGlzKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0NvbGxpc2lvbnMgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBkZXB0aE1hc2sgPSBuZXcgU3RhbmRhcmRNYXRlcmlhbChgJHt0aGlzLmlkfS1tYXRgLCBzY2VuZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbnZhc092ZXJsYXkpIHtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmJhY2tGYWNlQ3VsbGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkZXB0aE1hc2suZGlzYWJsZUNvbG9yV3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBkZXB0aE1hc2suZGlzYWJsZUxpZ2h0aW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBkZXB0aE1hc2s7XHJcblxyXG4gICAgICAgIC8vIE9wdGltaXphdGlvbiAtIEZyZWV6ZSBtYXRlcmlhbCBzaW5jZSBpdCBuZXZlciBuZWVkcyB0byBjaGFuZ2VcclxuICAgICAgICB0aGlzLm1hdGVyaWFsLmZyZWV6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0RWxlbWVudHpJbmRleCh6SW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuekluZGV4ID0gYCR7ekluZGV4fWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgdXNlZCBieSB0aGUgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgKi9cclxuICAgIGNhcHR1cmVQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbmFibGUgZG9tIGNvbnRlbnQgdG8gY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICAvLyBTdXByZXNzIGV2ZW50cyBvdXRzaWRlIG9mIHRoZSBkb20gY29udGVudFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHRvIHJlbGVhc2UgcG9pbnRlciBldmVudHNcclxuICAgICAqL1xyXG4gICAgcmVsZWFzZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSBwb2ludGVyIGV2ZW50cyBvbiBjYW52YXNcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwiYXV0b1wiO1xyXG5cclxuICAgICAgICAvLyBEaXNhYmxlIHBvaW50ZXIgZXZlbnRzIG9uIGRvbSBjb250ZW50XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVFbGVtZW50KCkge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgQmFpbCBpZiB3ZSBhcmVuJ3QgcnVubmluZyBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuaWQgPSB0aGlzLmlkO1xyXG4gICAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLl9pc0NhbnZhc092ZXJsYXkgPyBcInRyYW5zcGFyZW50XCIgOiBcIiMwMDBcIjtcclxuICAgICAgICBkaXYuc3R5bGUuekluZGV4ID0gXCIxXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IE1hdHJpeCwgUXVhdGVybmlvbiwgVmVjdG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGhcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgSHRtbE1lc2ggfSBmcm9tIFwiLi9odG1sTWVzaFwiO1xyXG5pbXBvcnQgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgdHlwZSB7IFN1Yk1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvc3ViTWVzaFwiO1xyXG5pbXBvcnQgeyBSZW5kZXJpbmdHcm91cCB9IGZyb20gXCJjb3JlL1JlbmRlcmluZy9yZW5kZXJpbmdHcm91cFwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBPYnNlcnZlciB9IGZyb20gXCJjb3JlL01pc2Mvb2JzZXJ2YWJsZVwiO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiY29yZS9NaXNjL2xvZ2dlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0RW5naW5lIH0gZnJvbSBcImNvcmUvRW5naW5lc1wiO1xyXG5cclxuY29uc3QgUG9zaXRpb25VcGRhdGVGYWlsTWVzc2FnZSA9IFwiRmFpbGVkIHRvIHVwZGF0ZSBodG1sIG1lc2ggcmVuZGVyZXIgcG9zaXRpb24gZHVlIHRvIGZhaWx1cmUgdG8gZ2V0IGNhbnZhcyByZWN0LiAgSHRtbE1lc2ggaW5zdGFuY2VzIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseVwiO1xyXG5jb25zdCBCYWJ5bG9uVW5pdHNUb1BpeGVscyA9IDEwMDtcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIHN1Ym1lc2hlcyBhbmQgcmV0dXJucyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoXHJcbiAqIHNob3VsZCBiZSByZW5kZXJlZCBmaXJzdC5cclxuICovXHJcbnR5cGUgUmVuZGVyT3JkZXJGdW5jdGlvbiA9IChzdWJNZXNoQTogU3ViTWVzaCwgc3ViTWVzaEI6IFN1Yk1lc2gpID0+IG51bWJlcjtcclxuXHJcbnR5cGUgUmVuZGVyTGF5ZXJFbGVtZW50cyA9IHtcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBkb21FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIGNhbWVyYUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzLlxyXG4vLyBOb3RlIHRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gZ3JvdXAgMC5cclxuLy8gSWYgbmVpdGhlciBtZXNoIGlzIGFuIEh0bWxNZXNoLCB0aGVuIHRoZSBkZWZhdWx0IHJlbmRlciBvcmRlciBpcyB1c2VkXHJcbi8vIFRoaXMgcHJldmVudHMgSHRtbE1lc2hlcyBmcm9tIGFwcGVhcmluZyBpbiBmcm9udCBvZiBvdGhlciBtZXNoZXMgd2hlbiB0aGV5IGFyZSBiZWhpbmQgdGhlbVxyXG5jb25zdCBSZW5kZXJPcmRlckZ1bmMgPSAoZGVmYXVsdFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uKTogUmVuZGVyT3JkZXJGdW5jdGlvbiA9PiB7XHJcbiAgICByZXR1cm4gKHN1Yk1lc2hBOiBTdWJNZXNoLCBzdWJNZXNoQjogU3ViTWVzaCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1lc2hBID0gc3ViTWVzaEEuZ2V0TWVzaCgpO1xyXG4gICAgICAgIGNvbnN0IG1lc2hCID0gc3ViTWVzaEIuZ2V0TWVzaCgpO1xyXG5cclxuICAgICAgICAvLyBVc2UgcHJvcGVydHkgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHNpbmNlIGl0IGlzIGxlc3MgZXhwZW5zaXZlIGFuZFxyXG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBjYWxsZWQgbWFueSB0aW1lcyBwZXIgZnJhbWVcclxuICAgICAgICBjb25zdCBtZXNoSXNIdG1sTWVzaEEgPSAobWVzaEEgYXMgYW55KVtcImlzSHRtbE1lc2hcIl07XHJcbiAgICAgICAgY29uc3QgbWVzaElzSHRtbE1lc2hCID0gKG1lc2hCIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdO1xyXG4gICAgICAgIGlmIChtZXNoSXNIdG1sTWVzaEEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc2hJc0h0bWxNZXNoQiA/IChtZXNoQS5hYnNvbHV0ZVBvc2l0aW9uLnogPD0gbWVzaEIuYWJzb2x1dGVQb3NpdGlvbi56ID8gMSA6IC0xKSA6IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZXNoSXNIdG1sTWVzaEIgPyAxIDogZGVmYXVsdFJlbmRlck9yZGVyKHN1Yk1lc2hBLCBzdWJNZXNoQik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGlzIHJlcXVpcmVkIHRvIHJlbmRlciBIdG1sTWVzaGVzIGluIHRoZSBzY2VuZS5cclxuICogaWYgdXNpbmcgSHRtbE1lc2hlcywgeW91IG11c3Qgbm90IHNldCByZW5kZXIgb3JkZXIgZm9yIGdyb3VwIDAgdXNpbmdcclxuICogc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIuICBZb3UgbXVzdCBpbnN0ZWFkIHBhc3MgdGhlIGNvbXBhcmUgZnVuY3Rpb25zXHJcbiAqIHRvIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGNvbnN0cnVjdG9yLiAgSWYgeW91IGRvIG5vdCwgdGhlbiB5b3VyIHJlbmRlclxyXG4gKiBvcmRlciB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzIGNyZWF0ZWQgYWZ0ZXIgYW5kXHJcbiAqIHRoZSBIdG1sTWVzaGVzIHdpbGwgbm90IHJlbmRlciBjb3JyZWN0bHkgKHRoZXkgd2lsbCBhcHBlYXIgaW4gZnJvbnQgb2ZcclxuICogbWVzaGVzIHRoYXQgYXJlIGFjdHVhbGx5IGluIGZyb250IG9mIHRoZW0pIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzXHJcbiAqIGNyZWF0ZWQgYmVmb3JlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEh0bWxNZXNoUmVuZGVyZXIge1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pblNjZW5lRWxlbWVudHM/OiBSZW5kZXJMYXllckVsZW1lbnRzIHwgbnVsbDtcclxuICAgIHByaXZhdGUgX292ZXJsYXlFbGVtZW50cz86IFJlbmRlckxheWVyRWxlbWVudHMgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lOiBBYnN0cmFjdEVuZ2luZTtcclxuXHJcbiAgICBwcml2YXRlIF9jYWNoZSA9IHtcclxuICAgICAgICBjYW1lcmFEYXRhOiB7IGZvdjogMCwgcG9zaXRpb246IG5ldyBWZWN0b3IzKCksIHN0eWxlOiBcIlwiIH0sXHJcbiAgICAgICAgaHRtbE1lc2hEYXRhOiBuZXcgV2Vha01hcDxvYmplY3QsIHsgc3R5bGU6IHN0cmluZyB9PigpLFxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgX3dpZHRoID0gMDtcclxuICAgIHByaXZhdGUgX2hlaWdodCA9IDA7XHJcbiAgICBwcml2YXRlIF9oZWlnaHRIYWxmID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9jYW1lcmFXb3JsZE1hdHJpeD86IE1hdHJpeDtcclxuXHJcbiAgICAvLyBDcmVhdGUgc29tZSByZWZzIHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBvYmplY3RzIGV2ZXJ5IGZyYW1lXHJcbiAgICBwcml2YXRlIF90ZW1wID0ge1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIHJvdGF0aW9uVHJhbnNmb3JtOiBuZXcgUXVhdGVybmlvbigpLFxyXG4gICAgICAgIHBvc2l0aW9uVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIG9iamVjdE1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhV29ybGRNYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVJvdGF0aW9uTWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk6IG5ldyBBcnJheSgxNiksXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgRFBSIHNvIHdlIGNhbiByZXNpemUgaWYgRFBSIGNoYW5nZXNcclxuICAgIC8vIE90aGVyd2lzZSB0aGUgRE9NIGNvbnRlbnQgd2lsbCBzY2FsZSwgYnV0IHRoZSBtZXNoIHdvbid0XHJcbiAgICBwcml2YXRlIF9sYXN0RGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgY2FtZXJhIG1hdHJpeCBjaGFuZ2VzIHNvIHdlIG9ubHkgdXBkYXRlIHRoZVxyXG4gICAgLy8gRE9NIGVsZW1lbnQgc3R5bGVzIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICBwcml2YXRlIF9jYW1lcmFNYXRyaXhVcGRhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBLZWVwIHRyYWNrIG9mIHBvc2l0aW9uIGNoYW5nZXMgc28gd2Ugb25seSB1cGRhdGUgdGhlIERPTSBlbGVtZW50XHJcbiAgICAvLyBzdHlsZXMgd2hlbiBuZWNlc3NhcnlcclxuICAgIHByaXZhdGUgX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbiA9IHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgbGVmdDogMCxcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyT2JzZXJ2ZXI6IE9ic2VydmVyPFNjZW5lPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hSZW5kZXJlclxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHByb3BlcnRpZXM6XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBzY2VuZTogU2NlbmUsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZCA9IG51bGwsXHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZCA9IFwiY3NzLWNvbnRhaW5lclwiLFxyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyID0gdHJ1ZSxcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuUGFpbnRlclNvcnRDb21wYXJlLFxyXG4gICAgICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5QYWludGVyU29ydENvbXBhcmUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuZGVmYXVsdFRyYW5zcGFyZW50U29ydENvbXBhcmUsXHJcbiAgICAgICAgfToge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZD86IHN0cmluZztcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyPzogYm9vbGVhbjtcclxuICAgICAgICB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgT25seSBpbml0IGlmIHdlIGFyZSBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVySWQgPSBfY29udGFpbmVySWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdChzY2VuZSwgcGFyZW50Q29udGFpbmVySWQsIGVuYWJsZU92ZXJsYXlSZW5kZXIsIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlciwgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyLCBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIG9mIHRoZSBIdG1sTWVzaFJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXQoXHJcbiAgICAgICAgc2NlbmU6IFNjZW5lLFxyXG4gICAgICAgIHBhcmVudENvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXI6IGJvb2xlYW4sXHJcbiAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uLFxyXG4gICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvbixcclxuICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvblxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBPbmx5IGluaXQgaWYgd2UgYXJlIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBET00gY29udGFpbmVyc1xyXG4gICAgICAgIGxldCBwYXJlbnRDb250YWluZXIgPSBwYXJlbnRDb250YWluZXJJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudENvbnRhaW5lcklkKSA6IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzLCB0aGVuIHJlbW92ZSBpdFxyXG4gICAgICAgIGNvbnN0IGluU2NlbmVDb250YWluZXJJZCA9IGAke3RoaXMuX2NvbnRhaW5lcklkfV9pbl9zY2VuZWA7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gdGhpcy5fY3JlYXRlUmVuZGVyTGF5ZXJFbGVtZW50cyhpblNjZW5lQ29udGFpbmVySWQpO1xyXG5cclxuICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX2luU2NlbmVFbGVtZW50cy5jb250YWluZXIsIHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZU92ZXJsYXlSZW5kZXIpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lcklkID0gYCR7dGhpcy5fY29udGFpbmVySWR9X292ZXJsYXlgO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMgPSB0aGlzLl9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKG92ZXJsYXlDb250YWluZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHpJbmRleCA9ICsoc2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzKCkhLnN0eWxlLnpJbmRleCA/PyBcIjBcIikgKyAxO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IGAke3pJbmRleH1gO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLCBwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VuZ2luZSA9IHNjZW5lLmdldEVuZ2luZSgpO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmICghY2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGNsaWVudCByZWN0IGZvciByZW5kZXJpbmcgY2FudmFzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBzaXplIGFuZCByZXNpemUgYmVoYXZpb3JcclxuICAgICAgICB0aGlzLl9zZXRTaXplKGNsaWVudFJlY3Qud2lkdGgsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZW5naW5lLm9uUmVzaXplT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKGNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFNpemUoY2xpZW50UmVjdC53aWR0aCwgY2xpZW50UmVjdC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBwcm9qZWN0aW9uT2JzOiBPYnNlcnZlcjxDYW1lcmE+O1xyXG4gICAgICAgIGxldCBtYXRyaXhPYnM6IE9ic2VydmVyPENhbWVyYT47XHJcblxyXG4gICAgICAgIGNvbnN0IG9ic2VydmVDYW1lcmEgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IHNjZW5lLmFjdGl2ZUNhbWVyYTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYSkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbk9icyA9IGNhbWVyYS5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FtZXJhTWF0cml4Q2hhbmdlZChjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBtYXRyaXhPYnMgPSBjYW1lcmEub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNhbWVyYU1hdHJpeENoYW5nZWQoY2FtZXJhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG5cclxuICAgICAgICBzY2VuZS5vbkFjdGl2ZUNhbWVyYUNoYW5nZWQuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKHByb2plY3Rpb25PYnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChtYXRyaXhPYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKG1hdHJpeE9icyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzXHJcbiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBmcm9udCBvZiBtZXNoZXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gZnJvbnQgb2YgdGhlbVxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSByZW5kZXIgb3JkZXIgaXNuJ3QgaWRlYWwsIGJ1dCBpdCBpcyB0aGUgb25seSB3YXkgdG8gYWNoZWl2ZSB0aGlzXHJcbiAgICAgICAgLy8gVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgYW4gYXBwIHVzaW5nIHRoZSBIdG1sTWVzaFJlbmRlcmVkIG11c3Qgc2V0IHRoZSBzY2VuZSByZW5kZXIgb3JkZXJcclxuICAgICAgICAvLyB2aWEgdGhlIEh0bWxNZXNoUmVuZGVyZWQgY29uc3RydWN0b3JcclxuICAgICAgICBjb25zdCBvcGFxdWVSZW5kZXJPcmRlciA9IFJlbmRlck9yZGVyRnVuYyhkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIGNvbnN0IGFscGhhVGVzdFJlbmRlck9yZGVyID0gUmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgY29uc3QgdHJhbnNwYXJlbnRSZW5kZXJPcmRlciA9IFJlbmRlck9yZGVyRnVuYyhkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIoMCwgb3BhcXVlUmVuZGVyT3JkZXIsIGFscGhhVGVzdFJlbmRlck9yZGVyLCB0cmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBzY2VuZS5vbkJlZm9yZVJlbmRlck9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKHNjZW5lLCBzY2VuZS5hY3RpdmVDYW1lcmEgYXMgQ2FtZXJhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKGNvbnRhaW5lcklkOiBzdHJpbmcpOiBSZW5kZXJMYXllckVsZW1lbnRzIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZXhpc3RpbmdDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgY29udGFpbmVyLmlkID0gY29udGFpbmVySWQ7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuekluZGV4ID0gXCItMVwiO1xyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGNhbWVyYUVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtU3R5bGUgPSBcInByZXNlcnZlLTNkXCI7XHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS50cmFuc2Zvcm1TdHlsZSA9IFwicHJlc2VydmUtM2RcIjtcclxuXHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcblxyXG4gICAgICAgIGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FtZXJhRWxlbWVudCk7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcixcclxuICAgICAgICAgICAgZG9tRWxlbWVudCxcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0U2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLl9oZWlnaHRIYWxmID0gdGhpcy5faGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pblNjZW5lRWxlbWVudHMgfHwgIXRoaXMuX292ZXJsYXlFbGVtZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50cyA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHMuZG9tRWxlbWVudCwgdGhpcy5fb3ZlcmxheUVsZW1lbnRzLmRvbUVsZW1lbnQsIHRoaXMuX2luU2NlbmVFbGVtZW50cy5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHMuY2FtZXJhRWxlbWVudF07XHJcbiAgICAgICAgZm9yIChjb25zdCBkb20gb2YgZG9tRWxlbWVudHMpIHtcclxuICAgICAgICAgICAgaWYgKGRvbSkge1xyXG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJldHRpZXItaWdub3JlXHJcbiAgICBwcm90ZWN0ZWQgX2dldENhbWVyYUNzc01hdHJpeChtYXRyaXg6IE1hdHJpeCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBtYXRyaXgubTtcclxuICAgICAgICByZXR1cm4gYG1hdHJpeDNkKCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbM10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s1XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s2XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s3XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s4XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzldIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEwXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTJdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbMTNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE0XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNV0gKVxyXG4gICAgICAgIH0pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0IGEgQmFieWxvbiB3b3JsZCBtYXRyaXggdG8gYSBDU1MgbWF0cml4XHJcbiAgICAvLyBUaGlzIGFsc28gaGFuZGxlcyBjb252ZXJzaW9uIGZyb20gQkpTIGxlZnQgaGFuZGVkIGNvb3Jkc1xyXG4gICAgLy8gdG8gQ1NTIHJpZ2h0IGhhbmRlZCBjb29yZHNcclxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxyXG4gICAgcHJvdGVjdGVkIF9nZXRIdG1sQ29udGVudENzc01hdHJpeChtYXRyaXg6IE1hdHJpeCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW06IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWF0cml4Lm07XHJcbiAgICAgICAgLy8gSW4gYSByaWdodCBoYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0sIHRoZSBlbGVtZW50cyAxMSB0byAxNCBoYXZlIHRvIGNoYW5nZSB0aGVpciBkaXJlY3Rpb25cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IC0xIDogMTtcclxuICAgICAgICBjb25zdCBtYXRyaXgzZCA9IGBtYXRyaXgzZCgke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1swXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1syXSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbM10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s0XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzVdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzZdICAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzddIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzhdICogLWRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s5XSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTBdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzExXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMl0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTNdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzE0XSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNV0gKVxyXG4gICAgICAgIH0pYDtcclxuICAgICAgICByZXR1cm4gbWF0cml4M2Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChodG1sTWVzaDogSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKTogTWF0cml4IHtcclxuICAgICAgICAvLyBHZXQgdGhlIGNhbWVyYSB3b3JsZCBtYXRyaXhcclxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbWVyYSB3b3JsZCBtYXRyaXggaXMgdXAgdG8gZGF0ZVxyXG4gICAgICAgIGlmICghdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhV29ybGRNYXRyaXggPSBodG1sTWVzaC5nZXRTY2VuZSgpLmFjdGl2ZUNhbWVyYT8uZ2V0V29ybGRNYXRyaXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0cml4LklkZW50aXR5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvYmplY3RXb3JsZE1hdHJpeCA9IGh0bWxNZXNoLmdldFdvcmxkTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8vIFNjYWxlIHRoZSBvYmplY3QgbWF0cml4IGJ5IHRoZSBiYXNlIHNjYWxlIGZhY3RvciBmb3IgdGhlIG1lc2hcclxuICAgICAgICAvLyB3aGljaCBpcyB0aGUgcmF0aW8gb2YgdGhlIG1lc2ggd2lkdGgvaGVpZ2h0IHRvIHRoZSByZW5kZXJlclxyXG4gICAgICAgIC8vIHdpZHRoL2hlaWdodCBkaXZpZGVkIGJ5IHRoZSBiYWJ5bG9uIHVuaXRzIHRvIHBpeGVscyByYXRpb1xyXG4gICAgICAgIGxldCB3aWR0aFNjYWxlRmFjdG9yID0gMTtcclxuICAgICAgICBsZXQgaGVpZ2h0U2NhbGVGYWN0b3IgPSAxO1xyXG4gICAgICAgIGlmIChodG1sTWVzaC5zb3VyY2VXaWR0aCAmJiBodG1sTWVzaC5zb3VyY2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgd2lkdGhTY2FsZUZhY3RvciA9IGh0bWxNZXNoLndpZHRoISAvIChodG1sTWVzaC5zb3VyY2VXaWR0aCAvIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICAgICAgaGVpZ2h0U2NhbGVGYWN0b3IgPSBodG1sTWVzaC5oZWlnaHQhIC8gKGh0bWxNZXNoLnNvdXJjZUhlaWdodCAvIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFwcGx5IHRoZSBzY2FsZSB0byB0aGUgb2JqZWN0J3Mgd29ybGQgbWF0cml4LiAgTm90ZSB3ZSBhcmVuJ3Qgc2NhbGluZ1xyXG4gICAgICAgIC8vIHRoZSBvYmplY3QsIGp1c3QgZ2V0dGluZyBhIG1hdHJpeCBhcyB0aG91Z2ggaXQgd2VyZSBzY2FsZWQsIHNvIHdlIGNhblxyXG4gICAgICAgIC8vIHNjYWxlIHRoZSBjb250ZW50XHJcbiAgICAgICAgY29uc3Qgc2NhbGVUcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnNjYWxlVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5yb3RhdGlvblRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCBwb3NpdGlvblRyYW5zZm9ybSA9IHRoaXMuX3RlbXAucG9zaXRpb25UcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3Qgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCA9IHRoaXMuX3RlbXAub2JqZWN0TWF0cml4O1xyXG5cclxuICAgICAgICBvYmplY3RXb3JsZE1hdHJpeC5kZWNvbXBvc2Uoc2NhbGVUcmFuc2Zvcm0sIHJvdGF0aW9uVHJhbnNmb3JtLCBwb3NpdGlvblRyYW5zZm9ybSk7XHJcbiAgICAgICAgc2NhbGVUcmFuc2Zvcm0ueCAqPSB3aWR0aFNjYWxlRmFjdG9yO1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtLnkgKj0gaGVpZ2h0U2NhbGVGYWN0b3I7XHJcblxyXG4gICAgICAgIE1hdHJpeC5Db21wb3NlVG9SZWYoc2NhbGVUcmFuc2Zvcm0sIHJvdGF0aW9uVHJhbnNmb3JtLCBwb3NpdGlvblRyYW5zZm9ybSwgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBkaXJlY3Rpb24gb2YgMTIgYW5kIDEzIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYmFzZWQgb24gdGhlIGhhbmRlZG5lc3Mgb2YgdGhlIHN5c3RlbVxyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID8gLTEgOiAxO1xyXG4gICAgICAgIC8vIEFkanVzdCB0cmFuc2xhdGlvbiB2YWx1ZXMgdG8gYmUgZnJvbSBjYW1lcmEgdnMgd29ybGQgb3JpZ2luXHJcbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFyZSBhbHNvIGFkanVzdGluZyB0aGVzZSB2YWx1ZXMgdG8gYmUgcGl4ZWxzIHZzIEJhYnlsb24gdW5pdHNcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGh0bWxNZXNoLmdldEFic29sdXRlUG9zaXRpb24oKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4LnNldFJvd0Zyb21GbG9hdHMoXHJcbiAgICAgICAgICAgIDMsXHJcbiAgICAgICAgICAgICgtdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxMl0gKyBwb3NpdGlvbi54KSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzICogZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAoLXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTNdICsgcG9zaXRpb24ueSkgKiBCYWJ5bG9uVW5pdHNUb1BpeGVscyAqIGRpcmVjdGlvbixcclxuICAgICAgICAgICAgKHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTRdIC0gcG9zaXRpb24ueikgKiBCYWJ5bG9uVW5pdHNUb1BpeGVscyxcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgubVsxNV0gKiAwLjAwMDAxICogQmFieWxvblVuaXRzVG9QaXhlbHNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3Qgb3RoZXIgdmFsdWVzIHRvIGJlIHBpeGVscyB2cyBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoMywgQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDcsIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCgxMSwgQmFieWxvblVuaXRzVG9QaXhlbHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlckh0bWxNZXNoKGh0bWxNZXNoOiBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW06IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIWh0bWxNZXNoLmVsZW1lbnQgfHwgIWh0bWxNZXNoLmVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcclxuICAgICAgICAgICAgLy8gbm90aGluZyB0byByZW5kZXIsIHNvIGJhaWxcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgaHRtbCBtZXNoIGRhdGEgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlXHJcbiAgICAgICAgLy8gY29tcHV0aW5nIHRoZSBiYXNlIHNjYWxlIGZhY3RvclxyXG4gICAgICAgIGxldCBodG1sTWVzaERhdGEgPSB0aGlzLl9jYWNoZS5odG1sTWVzaERhdGEuZ2V0KGh0bWxNZXNoKTtcclxuICAgICAgICBpZiAoIWh0bWxNZXNoRGF0YSkge1xyXG4gICAgICAgICAgICBodG1sTWVzaERhdGEgPSB7IHN0eWxlOiBcIlwiIH07XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmh0bWxNZXNoRGF0YS5zZXQoaHRtbE1lc2gsIGh0bWxNZXNoRGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFFbGVtZW50ID0gaHRtbE1lc2guX2lzQ2FudmFzT3ZlcmxheSA/IHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY2FtZXJhRWxlbWVudCA6IHRoaXMuX2luU2NlbmVFbGVtZW50cz8uY2FtZXJhRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoLmVsZW1lbnQucGFyZW50Tm9kZSAhPT0gY2FtZXJhRWxlbWVudCkge1xyXG4gICAgICAgICAgICBjYW1lcmFFbGVtZW50IS5hcHBlbmRDaGlsZChodG1sTWVzaC5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBodG1sTWVzaCBjb250ZW50IGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIGJhc2Ugc2NhbGUgZmFjdG9yXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoLnJlcXVpcmVzVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUJhc2VTY2FsZUZhY3RvcihodG1sTWVzaCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmb3IgdGhlIGh0bWwgbWVzaFxyXG4gICAgICAgIGNvbnN0IHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXggPSB0aGlzLl9nZXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChodG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pO1xyXG5cclxuICAgICAgICBsZXQgc3R5bGUgPSBgdHJhbnNsYXRlKC01MCUsIC01MCUpICR7dGhpcy5fZ2V0SHRtbENvbnRlbnRDc3NNYXRyaXgoc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pfWA7XHJcbiAgICAgICAgLy8gSW4gYSByaWdodCBoYW5kZWQgc3lzdGVtLCBzY3JlZW5zIGFyZSBvbiB0aGUgd3Jvbmcgc2lkZSBvZiB0aGUgbWVzaCwgc28gd2UgaGF2ZSB0byByb3RhdGUgYnkgTWF0aC5QSSB3aGljaCByZXN1bHRzIGluIHRoZSBtYXRyaXgzZCBzZWVuIGJlbG93XHJcbiAgICAgICAgc3R5bGUgKz0gYCR7dXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyBcIm1hdHJpeDNkKC0xLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAtMSwgMCwgMCwgMCwgMCwgMSlcIiA6IFwiXCJ9YDtcclxuXHJcbiAgICAgICAgaWYgKGh0bWxNZXNoRGF0YS5zdHlsZSAhPT0gc3R5bGUpIHtcclxuICAgICAgICAgICAgaHRtbE1lc2guZWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgaHRtbE1lc2guZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGh0bWxNZXNoLl9tYXJrQXNVcGRhdGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZW5kZXIoc2NlbmU6IFNjZW5lLCBjYW1lcmE6IENhbWVyYSkge1xyXG4gICAgICAgIGxldCBuZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCB1c2VSaWdodEhhbmRlZFN5c3RlbSA9IHNjZW5lLnVzZVJpZ2h0SGFuZGVkU3lzdGVtO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbnRhaW5lciBwb3NpdGlvbiBhbmQgc2l6ZSBpZiBuZWNlc3NhcnlcclxuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJQb3NpdGlvbklmTmVlZGVkKCk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhIGNhbWVyYSBjaGFuZ2VcclxuICAgICAgICBpZiAodGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFNYXRyaXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjYW1lcmEgcG9zaXRpb24gaGFzIGNoYW5nZWQsIHRoZW4gd2UgYWxzbyBuZWVkIHRvIHVwZGF0ZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnggIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24ueCB8fFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueSAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi55IHx8XHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi56ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnpcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi5jb3B5RnJvbShjYW1lcmEucG9zaXRpb24pO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBmb3IgYSBkcHIgY2hhbmdlXHJcbiAgICAgICAgaWYgKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICE9PSB0aGlzLl9sYXN0RGV2aWNlUGl4ZWxSYXRpbykge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0RGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gICAgICAgICAgICBMb2dnZXIuTG9nKFwiSW4gcmVuZGVyIC0gZHByIGNoYW5nZWQ6IFwiLCB0aGlzLl9sYXN0RGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIGFueSBtZXNoZXMgbmVlZCB0byBiZSB1cGRhdGVkXHJcbiAgICAgICAgY29uc3QgbWVzaGVzTmVlZGluZ1VwZGF0ZSA9IHNjZW5lLm1lc2hlcy5maWx0ZXIoKG1lc2gpID0+IChtZXNoIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdICYmIChuZWVkc1VwZGF0ZSB8fCAobWVzaCBhcyBIdG1sTWVzaCkucmVxdWlyZXNVcGRhdGUpKTtcclxuICAgICAgICBuZWVkc1VwZGF0ZSA9IG5lZWRzVXBkYXRlIHx8IG1lc2hlc05lZWRpbmdVcGRhdGUubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgaWYgKCFuZWVkc1VwZGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgYSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgdGhlIGNhbWVyYVxyXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEuZ2V0UHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgICAgIGNvbnN0IGZvdiA9IHByb2plY3Rpb25NYXRyaXgubVs1XSAqIHRoaXMuX2hlaWdodEhhbGY7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLmZvdiAhPT0gZm92KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IFt0aGlzLl9vdmVybGF5RWxlbWVudHM/LmRvbUVsZW1lbnQsIHRoaXMuX2luU2NlbmVFbGVtZW50cz8uZG9tRWxlbWVudF07XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEubW9kZSA9PSBDYW1lcmEuUEVSU1BFQ1RJVkVfQ0FNRVJBKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRQZXJzcGVjdGl2ZSA9IGZvdiArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucGVyc3BlY3RpdmUgPSBmb3YgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUud2Via2l0UGVyc3BlY3RpdmUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5wZXJzcGVjdGl2ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuZm92ID0gZm92O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBDU1MgbWF0cml4IGZvciB0aGUgY2FtZXJhICh3aGljaCB3aWxsIGluY2x1ZGUgYW55IGNhbWVyYSByb3RhdGlvbilcclxuICAgICAgICBpZiAoY2FtZXJhLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjYW1lcmEuY29tcHV0ZVdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFNYXRyaXhXb3JsZCA9IHRoaXMuX3RlbXAuY2FtZXJhV29ybGRNYXRyaXg7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuY29weUZyb20oY2FtZXJhLmdldFdvcmxkTWF0cml4KCkpO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYVJvdGF0aW9uTWF0cml4ID0gdGhpcy5fdGVtcC5jYW1lcmFSb3RhdGlvbk1hdHJpeDtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5nZXRSb3RhdGlvbk1hdHJpeCgpLnRyYW5zcG9zZVRvUmVmKGNhbWVyYVJvdGF0aW9uTWF0cml4KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5ID0gdGhpcy5fdGVtcC5jYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuY29weVRvQXJyYXkoY2FtZXJhTWF0cml4V29ybGRBc0FycmF5KTtcclxuXHJcbiAgICAgICAgLy8gRm9yIGEgZmV3IHZhbHVlcywgd2UgaGF2ZSB0byBhZGp1c3QgdGhlIGRpcmVjdGlvbiBiYXNlZCBvbiB0aGUgaGFuZGVkbmVzcyBvZiB0aGUgc3lzdGVtXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAxIDogLTE7XHJcblxyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVsxXSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bMV07XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzJdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVsyXSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbNF0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzRdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs2XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bNl0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzhdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs4XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbOV0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzldICogZGlyZWN0aW9uO1xyXG5cclxuICAgICAgICBNYXRyaXguRnJvbUFycmF5VG9SZWYoY2FtZXJhTWF0cml4V29ybGRBc0FycmF5LCAwLCBjYW1lcmFNYXRyaXhXb3JsZCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYUNTU01hdHJpeCA9IHRoaXMuX2dldENhbWVyYUNzc01hdHJpeChjYW1lcmFNYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBjYW1lcmFDU1NNYXRyaXg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnN0eWxlICE9PSBzdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNhbWVyYUVsZW1lbnRdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5zdHlsZSA9IHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gX1JlbmRlciBvYmplY3RzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIGZvciAoY29uc3QgbWVzaCBvZiBtZXNoZXNOZWVkaW5nVXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlckh0bWxNZXNoKG1lc2ggYXMgSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVCYXNlU2NhbGVGYWN0b3IoaHRtbE1lc2g6IEh0bWxNZXNoKSB7XHJcbiAgICAgICAgLy8gR2V0IHNjcmVlbiB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgbGV0IHNjcmVlbldpZHRoID0gdGhpcy5fd2lkdGg7XHJcbiAgICAgICAgbGV0IHNjcmVlbkhlaWdodCA9IHRoaXMuX2hlaWdodDtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGFzcGVjdCByYXRpb3NcclxuICAgICAgICBjb25zdCBodG1sTWVzaEFzcGVjdFJhdGlvID0gKGh0bWxNZXNoLndpZHRoIHx8IDEpIC8gKGh0bWxNZXNoLmhlaWdodCB8fCAxKTtcclxuICAgICAgICBjb25zdCBzY3JlZW5Bc3BlY3RSYXRpbyA9IHNjcmVlbldpZHRoIC8gc2NyZWVuSGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBBZGp1c3Qgc2NyZWVuIGRpbWVuc2lvbnMgYmFzZWQgb24gYXNwZWN0IHJhdGlvc1xyXG4gICAgICAgIGlmIChodG1sTWVzaEFzcGVjdFJhdGlvID4gc2NyZWVuQXNwZWN0UmF0aW8pIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIEhUTUwgbWVzaCBpcyB3aWRlciByZWxhdGl2ZSB0byBpdHMgaGVpZ2h0IHRoYW4gdGhlIHNjcmVlbiwgYWRqdXN0IHRoZSBzY3JlZW4gd2lkdGhcclxuICAgICAgICAgICAgc2NyZWVuV2lkdGggPSBzY3JlZW5IZWlnaHQgKiBodG1sTWVzaEFzcGVjdFJhdGlvO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBIVE1MIG1lc2ggaXMgdGFsbGVyIHJlbGF0aXZlIHRvIGl0cyB3aWR0aCB0aGFuIHRoZSBzY3JlZW4sIGFkanVzdCB0aGUgc2NyZWVuIGhlaWdodFxyXG4gICAgICAgICAgICBzY3JlZW5IZWlnaHQgPSBzY3JlZW5XaWR0aCAvIGh0bWxNZXNoQXNwZWN0UmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgY29udGVudCB0byBmaWxsIHNjcmVlbiBzbyB3ZSBnZXQgbWF4IHJlc29sdXRpb24gd2hlbiBpdCBpcyBzaHJ1bmsgdG8gZml0IHRoZSBtZXNoXHJcbiAgICAgICAgaHRtbE1lc2guc2V0Q29udGVudFNpemVQeChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUNvbnRhaW5lclBvc2l0aW9uSWZOZWVkZWQoKSB7XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYW52YXMgaGFzIG1vdmVkIG9uIHRoZSBzY3JlZW5cclxuICAgICAgICBjb25zdCBjYW52YXNSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgLy8gY2FudmFzIHJlY3QgbWF5IGJlIG51bGwgaWYgbGF5b3V0IG5vdCBjb21wbGV0ZVxyXG4gICAgICAgIGlmICghY2FudmFzUmVjdCkge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihQb3NpdGlvblVwZGF0ZUZhaWxNZXNzYWdlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB3aW5kb3cuc2Nyb2xsWTtcclxuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gd2luZG93LnNjcm9sbFg7XHJcbiAgICAgICAgY29uc3QgY2FudmFzRG9jdW1lbnRUb3AgPSBjYW52YXNSZWN0LnRvcCArIHNjcm9sbFRvcDtcclxuICAgICAgICBjb25zdCBjYW52YXNEb2N1bWVudExlZnQgPSBjYW52YXNSZWN0LmxlZnQgKyBzY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLnRvcCAhPT0gY2FudmFzRG9jdW1lbnRUb3AgfHwgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLmxlZnQgIT09IGNhbnZhc0RvY3VtZW50TGVmdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24udG9wID0gY2FudmFzRG9jdW1lbnRUb3A7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi5sZWZ0ID0gY2FudmFzRG9jdW1lbnRMZWZ0O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gW3RoaXMuX2luU2NlbmVFbGVtZW50cz8uY29udGFpbmVyLCB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNvbnRhaW5lcl07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdG9wIGFuZCBsZWZ0IG9mIHRoZSBjc3MgY29udGFpbmVyIHRvIG1hdGNoIHRoZSBjYW52YXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclBhcmVudCA9IGNvbnRhaW5lci5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gY29udGFpbmVyUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RG9jdW1lbnRUb3AgPSBwYXJlbnRSZWN0LnRvcCArIHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERvY3VtZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyA9IHRoaXMuX2dldEFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcoY29udGFpbmVyUGFyZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGJvZHkgbWFyZ2luXHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlNYXJnaW5Ub3AgPSBwYXJzZUludChib2R5U3R5bGUubWFyZ2luVG9wLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5TWFyZ2luTGVmdCA9IHBhcnNlSW50KGJvZHlTdHlsZS5tYXJnaW5MZWZ0LCAxMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke2NhbnZhc0RvY3VtZW50VG9wIC0gcGFyZW50RG9jdW1lbnRUb3AgLSBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLm1hcmdpblRvcCArIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcucGFkZGluZ1RvcCArIGJvZHlNYXJnaW5Ub3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtcclxuICAgICAgICAgICAgICAgICAgICBjYW52YXNEb2N1bWVudExlZnQgLSBwYXJlbnREb2N1bWVudExlZnQgLSBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLm1hcmdpbkxlZnQgKyBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLnBhZGRpbmdMZWZ0ICsgYm9keU1hcmdpbkxlZnRcclxuICAgICAgICAgICAgICAgIH1weGA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9vbkNhbWVyYU1hdHJpeENoYW5nZWQgPSAoY2FtZXJhOiBDYW1lcmEpID0+IHtcclxuICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCA9IGNhbWVyYS5nZXRXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIF9lcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnModmFsdWUpIDwgMWUtMTAgPyAwIDogdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IHRvdGFsIG1hcmdpbnMgYW5kIHBhZGRpbmcgZm9yIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyB0aGUgYm9keSBhbmQgZG9jdW1lbnQgbWFyZ2luc1xyXG4gICAgcHJpdmF0ZSBfZ2V0QW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGxldCBtYXJnaW5Ub3AgPSAwO1xyXG4gICAgICAgIGxldCBtYXJnaW5MZWZ0ID0gMDtcclxuICAgICAgICBsZXQgcGFkZGluZ1RvcCA9IDA7XHJcbiAgICAgICAgbGV0IHBhZGRpbmdMZWZ0ID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuICAgICAgICAgICAgbWFyZ2luVG9wICs9IHBhcnNlSW50KHN0eWxlLm1hcmdpblRvcCwgMTApO1xyXG4gICAgICAgICAgICBtYXJnaW5MZWZ0ICs9IHBhcnNlSW50KHN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuICAgICAgICAgICAgcGFkZGluZ1RvcCArPSBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCk7XHJcbiAgICAgICAgICAgIHBhZGRpbmdMZWZ0ICs9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IG1hcmdpblRvcCwgbWFyZ2luTGVmdCwgcGFkZGluZ1RvcCwgcGFkZGluZ0xlZnQgfTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBIdG1sTWVzaFJlbmRlcmVyIH0gZnJvbSBcIi4vaHRtbE1lc2hSZW5kZXJlclwiO1xyXG5pbXBvcnQgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcbmltcG9ydCB7IEZpdFN0cmF0ZWd5IH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuXHJcbi8vIEV4cG9ydCBwdWJsaWMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zXHJcbmV4cG9ydCB7IEh0bWxNZXNoUmVuZGVyZXIsIEh0bWxNZXNoLCBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yLCBGaXRTdHJhdGVneSB9O1xyXG4iLCJpbXBvcnQgeyBUb29scyB9IGZyb20gXCJjb3JlL01pc2MvdG9vbHNcIjtcclxuXHJcbi8vIEEgY2FwdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBvYmplY3QgaGFzIHRoZSBwb2ludGVyXHJcbi8vIGV2ZW50cyBieSBlbGltaW5hdGluZyByYWNlIGNvbmRpdGlvbnMgdGhhdCBjYW4gY2F1c2UgdGhlIHBvaW50ZXIgZXZlbnRzIHRvIGJlXHJcbi8vIHJlbGVhc2VkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCBhZnRlciB0aGV5IGFyZSBjYXB0dXJlZCBsZWF2aW5nIG5vIG9iamVjdFxyXG4vLyBhcyB0aGUgb3duZXIuICBJdCBkb2VzIHRoaXMgYnkgcXVldWVpbmcgcmVxdWVzdHMgYW5kIG9ubHkgYWxsb3dpbmdcclxuLy8gY2FwdHVyZSB3aGVuIHRoZSBjdXJyZW50IGNhcHR1cmUgb3duZXIgcmVsZWFzZXMgcG9pbnRlciBldmVudHMuXHJcblxyXG50eXBlIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xyXG5cclxudHlwZSBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrcyA9IHtcclxuICAgIGNhcHR1cmU6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2s7XHJcbiAgICByZWxlYXNlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrO1xyXG59O1xyXG5cclxubGV0IENhcHR1cmVSZXF1ZXN0UXVldWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4vLyBLZXkgaXMgcmVxdWVzdCBpZCwgdmFsdWUgaXMgb2JqZWN0IHdpdGggY2FwdHVyZSBhbmQgcmVsZWFzZSBjYWxsYmFja3NcclxuY29uc3QgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3M6IE1hcDxzdHJpbmcsIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2tzPiA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEtlZXAgdHJhY2sgb2YgcmVsZWFzZSByZXF1ZXN0cyB3aXRoIG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdFxyXG4vLyBpbiBjYXNlIHRoZSByZWxlYXNlIHJlcXVlc3QgYXJyaXZlZCBiZWZvcmUgdGhlIGNhcHR1cmUgdG8gYXZvaWRcclxuLy8gdGhlIGNhcHR1cmUgcmVxdWVzdCBuZXZlciBnZXR0aW5nIHJlbGVhc2VkLlxyXG5sZXQgVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxubGV0IEN1cnJlbnRPd25lcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIENhbGxlZCBvbiBmaXJzdCBjYXB0dXJlIG9yIHJlbGVhc2UgcmVxdWVzdFxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgaWQgb2YgdGhlIG9iamVjdCBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgb2JqZWN0IGN1cnJlbnRseSBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICogb3IgbnVsbCBpZiBubyBvYmplY3QgaXMgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCBnZXRDYXB0dXJpbmdJZCA9ICgpID0+IHtcclxuICAgIHJldHVybiBDdXJyZW50T3duZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVxdWVzdCB0aGF0IHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQgY2FwdHVyZSBwb2ludGVyIGV2ZW50cy4gIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRcclxuICogb3duZXIsIHRoZW4gdGhlIHJlcXVlc3QgaXMgZ3JhbnRlZCBpbW1lZGlhdGVseS4gIElmIHRoZXJlIGlzIGEgY3VycmVudCBvd25lciwgdGhlbiB0aGUgcmVxdWVzdFxyXG4gKiBpcyBxdWV1ZWQgdW50aWwgdGhlIGN1cnJlbnQgb3duZXIgcmVsZWFzZXMgcG9pbnRlciBldmVudHMuXHJcbiAqIEBwYXJhbSByZXF1ZXN0SWQgQW4gaWQgdG8gaWRlbnRpZnkgdGhlIHJlcXVlc3QuICBUaGlzIGlkIHdpbGwgYmUgdXNlZCB0byBtYXRjaCB0aGUgY2FwdHVyZVxyXG4gKiByZXF1ZXN0IHdpdGggdGhlIHJlbGVhc2UgcmVxdWVzdC5cclxuICogQHBhcmFtIGNhcHR1cmVDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSByZXF1ZXN0IGlzIGdyYW50ZWQgYW5kIHRoZSBvYmplY3QgaXMgY2FwdHVyaW5nXHJcbiAqIEBwYXJhbSByZWxlYXNlQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RDYXB0dXJlID0gKHJlcXVlc3RJZDogc3RyaW5nLCBjYXB0dXJlQ2FsbGJhY2s6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2ssIHJlbGVhc2VDYWxsYmFjazogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaykgPT4ge1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RDYXB0dXJlIC0gUG9pbnRlciBldmVudHMgY2FwdHVyZSByZXF1ZXN0ZWQgZm9yICR7cmVxdWVzdElkfWApO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcmVsZWFzZSBmb3IgdGhpcyByZXF1ZXN0LCB0aGVuIGlnbm9yZSB0aGUgcmVxdWVzdFxyXG4gICAgaWYgKFJlbW92ZVVubWF0Y2hlZFJlcXVlc3QocmVxdWVzdElkKSkge1xyXG4gICAgICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0Q2FwdHVyZSAtIENhcHR1cmUgcmVxdWVzdCBtYXRjaGVkIHByZXZpb3VzIHJlbGVhc2UgcmVxdWVzdCAke3JlcXVlc3RJZH0uICBDYW5jZWxsaW5nIGNhcHR1cmUgcmVxdWVzdGApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAocmVxdWVzdElkICE9PSBDdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGFkZCBpdCB0byB0aGUgcXVldWVcclxuICAgICAgICBFbnF1ZXVlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdElkLCBjYXB0dXJlQ2FsbGJhY2ssIHJlbGVhc2VDYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFDdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjdXJyZW50IG93bmVyLCBnbyBhaGVhZCBhbmQgZ3JhbnQgdGhlIHJlcXVlc3RcclxuICAgICAgICBUcmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAoKTtcclxuICAgIH1cclxuICAgIC8vIElmIHRoZSByZXF1ZXN0IGlkIGlzIHRoZSBjdXJyZW50IG93bmVyLCBkbyBub3RoaW5nXHJcbn07XHJcblxyXG4vKipcclxuICogUmVsZWFzZSBwb2ludGVyIGV2ZW50cyBmcm9tIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQuICBJZiB0aGUgb2JqZWN0IGlzIHRoZSBjdXJyZW50IG93bmVyXHJcbiAqIHRoZW4gcG9pbnRlciBldmVudHMgYXJlIHJlbGVhc2VkIGltbWVkaWF0ZWx5LiAgSWYgdGhlIG9iamVjdCBpcyBub3QgdGhlIGN1cnJlbnQgb3duZXIsIHRoZW4gdGhlXHJcbiAqIGFzc29jaWF0ZWQgY2FwdHVyZSByZXF1ZXN0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3RcclxuICogaW4gdGhlIHF1ZXVlLCB0aGVuIHRoZSByZWxlYXNlIHJlcXVlc3QgaXMgYWRkZWQgdG8gYSBsaXN0IG9mIHVubWF0Y2hlZCByZWxlYXNlIHJlcXVlc3RzIGFuZCB3aWxsXHJcbiAqIG5lZ2F0ZSB0aGUgbmV4dCBjYXB0dXJlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZC4gIFRoaXMgaXMgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgcG9zc2liaWxpdHkgdGhhdFxyXG4gKiB0aGUgcmVsZWFzZSByZXF1ZXN0IGFycml2ZWQgYmVmb3JlIHRoZSBjYXB0dXJlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSByZXF1ZXN0SWQgVGhlIGlkIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgaWQgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdFxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgcmVxdWVzdFJlbGVhc2UgPSAocmVxdWVzdElkOiBzdHJpbmcgfCBudWxsKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdFJlbGVhc2UgLSBQb2ludGVyIGV2ZW50cyByZWxlYXNlIHJlcXVlc3RlZCBmb3IgJHtyZXF1ZXN0SWR9YCk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHJlcXVlc3RJZCBpcyB0aGUgY3VycmVudCBjYXB0dXJlIGhvbGRlciByZWxlYXNlIGl0XHJcbiAgICBpZiAoIXJlcXVlc3RJZCB8fCByZXF1ZXN0SWQgPT09IEN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIFRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCgpO1xyXG4gICAgfSBlbHNlIGlmIChDYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyBpbiB0aGUgcXVldWUsIGJ1dCBub3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBob2xkZXIsIHJlbW92ZSBpdCBhbmQgaXQncyBjYWxsYmFja3NcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5kZWxldGUocmVxdWVzdElkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RSZWxlYXNlIC0gUmVjZWl2ZWQgcmVsZWFzZSByZXF1ZXN0ICR7cmVxdWVzdElkfSBidXQgbm8gbWF0Y2hpbmcgY2FwdHVyZSByZXF1ZXN0IHdhcyByZWNlaXZlZGApO1xyXG4gICAgICAgIC8vIHJlcXVlc3Qgd2FzIG5vdCBjdXJyZW50IGFuZCBub3QgaW4gcXVldWUsIGxpa2VseSBiZWNhdXNlIHdlIHJlY2VpdmVkIGEgcmVsZWFzZVxyXG4gICAgICAgIC8vIHJlcXVlc3QgYmVmb3JlIHRoZSBjYXB0dXJlLiAgQWRkIGl0IHRvIHRoZSB1bm1hdGNoZWQgbGlzdCB0byBndWFyZCBhZ2FpbnN0IHRoaXMgcG9zc2liaWxpdHlcclxuICAgICAgICBpZiAoIVVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5pbmNsdWRlcyhyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgICAgIFVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5wdXNoKHJlcXVlc3RJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbGVhc2UgcG9pbnRlciBldmVudHMgZnJvbSB0aGUgY3VycmVudCBvd25lclxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgcmVsZWFzZUN1cnJlbnQgPSAoKSA9PiB7XHJcbiAgICByZXF1ZXN0UmVsZWFzZShDdXJyZW50T3duZXIpO1xyXG59O1xyXG5cclxuY29uc3QgRW5xdWV1ZUNhcHR1cmVSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nLCBjYXB0dXJlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrLCByZWxlYXNlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrKSA9PiB7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZW5xdWV1ZUNhcHR1cmVSZXF1ZXN0IC0gRW5xdWV1ZWluZyBjYXB0dXJlIHJlcXVlc3QgZm9yICAke3JlcXVlc3RJZH1gKTtcclxuICAgIGlmICghQ2FwdHVyZVJlcXVlc3RRdWV1ZS5pbmNsdWRlcyhyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgQ2FwdHVyZVJlcXVlc3RRdWV1ZS5wdXNoKHJlcXVlc3RJZCk7XHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3Muc2V0KHJlcXVlc3RJZCwgeyBjYXB0dXJlLCByZWxlYXNlIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gUmVtb3ZlcyB0aGUgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBleGlzdHMuICBSZXR1cm5zIHRydWVcclxuLy8gaWYgdGhlIHJlcXVlc3Qgd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBvdGhlcndpc2UgZmFsc2VcclxuY29uc3QgQ2FuY2VsUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBDYXB0dXJlUmVxdWVzdFF1ZXVlID0gQ2FwdHVyZVJlcXVlc3RRdWV1ZS5maWx0ZXIoKGlkKSA9PiB7XHJcbiAgICAgICAgaWYgKGlkICE9PSByZXF1ZXN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5jYW5jZWxSZXF1ZXN0IC0gQ2FuY2VsaW5nIHBvaW50ZXIgZXZlbnRzIGNhcHR1cmUgcmVxdWVzdCAke3JlcXVlc3RJZH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn07XHJcblxyXG5jb25zdCBSZW1vdmVVbm1hdGNoZWRSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xyXG4gICAgVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzID0gVW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLmZpbHRlcigoaWQpID0+IHtcclxuICAgICAgICBpZiAoaWQgIT09IHJlcXVlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn07XHJcblxyXG5jb25zdCBUcmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBuZXdPd25lcklkID0gTmV4dENhcHR1cmVSZXF1ZXN0KCk7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUudHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwIC0gVHJhbnNmZXJycmluZyBwb2ludGVyIGV2ZW50cyBmcm9tICR7Q3VycmVudE93bmVyfSB0byAke25ld093bmVySWR9YCk7XHJcbiAgICAvLyBSZWxlYXNlIHRoZSBjdXJyZW50IG93bmVyXHJcbiAgICBEb1JlbGVhc2UoKTtcclxuICAgIGlmIChuZXdPd25lcklkKSB7XHJcbiAgICAgICAgRG9DYXB0dXJlKG5ld093bmVySWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgRG9SZWxlYXNlID0gKCkgPT4ge1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmRvUmVsZWFzZSAtIFJlbGVhc2luZyBwb2ludGVyIGV2ZW50cyBmcm9tICR7Q3VycmVudE93bmVyfWApO1xyXG4gICAgaWYgKEN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIGNhbGwgdGhlIHJlbGVhc2UgY2FsbGJhY2tcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5nZXQoQ3VycmVudE93bmVyKT8ucmVsZWFzZSgpO1xyXG4gICAgICAgIC8vIEFuZCByZW1vdmUgdGhlIGNhbGxiYWNrc1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmRlbGV0ZShDdXJyZW50T3duZXIpO1xyXG4gICAgICAgIEN1cnJlbnRPd25lciA9IG51bGw7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBEb0NhcHR1cmUgPSAobmV3T3duZXJJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAobmV3T3duZXJJZCkge1xyXG4gICAgICAgIC8vIGNhbGwgdGhlIGNhcHR1cmUgY2FsbGJhY2tcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5nZXQobmV3T3duZXJJZCk/LmNhcHR1cmUoKTtcclxuICAgIH1cclxuICAgIEN1cnJlbnRPd25lciA9IG5ld093bmVySWQ7XHJcbiAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZG9DYXB0dXJlIC0gUG9pbnRlciBldmVudHMgbm93IGNhcHR1cmVkIGJ5ICR7bmV3T3duZXJJZH1gKTtcclxufTtcclxuXHJcbmNvbnN0IE5leHRDYXB0dXJlUmVxdWVzdCA9ICgpID0+IHtcclxuICAgIHJldHVybiBDYXB0dXJlUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgPyBDYXB0dXJlUmVxdWVzdFF1ZXVlLnNoaWZ0KCkgOiBudWxsO1xyXG59O1xyXG5cclxuLy8gI3JlZ2lvbiBEZWJ1Z2dpbmcgc3VwcG9ydFxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICAgICAgXCJwb2ludGVyLWV2ZW50cy1jYXB0dXJlLWRlYnVnXCI6IGJvb2xlYW4gfCBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBEZWJ1Z0xvZyA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBydW5ubmluZyBpbiBhIHRlc3QgcnVubmVyIChpbiBub2RlLCBzbyB3aW5kb3cgaXMgbm90IGRlZmluZWQpXHJcbiAgICAvLyBvciBpZiB0aGUgZGVidWcgZmxhZyBpcyBzZXQsIHRoZW4gbG9nIHRoZSBtZXNzYWdlXHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCB3aW5kb3dbXCJwb2ludGVyLWV2ZW50cy1jYXB0dXJlLWRlYnVnXCJdKSB7XHJcbiAgICAgICAgVG9vbHMuTG9nKFxyXG4gICAgICAgICAgICBgJHtwZXJmb3JtYW5jZS5ub3coKX0gLSBnYW1lLnNjZW5lLnBvaW50ZXJFdmVudHMgLSAke21lc3NhZ2V9XFxuY3VycmVudE93bmVyOiAke0N1cnJlbnRPd25lcn1cXG5xdWV1ZTogJHtDYXB0dXJlUmVxdWVzdFF1ZXVlfVxcbnVubWF0Y2hlZDogJHtVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHN9YFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn07XHJcbi8vICNlbmRyZWdpb24gRGVidWdnaW5nIHN1cHBvcnRcclxuIiwiaW1wb3J0IHR5cGUgeyBBYnN0cmFjdE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvYWJzdHJhY3RNZXNoXCI7XHJcbmltcG9ydCB0eXBlIHsgQmVoYXZpb3IgfSBmcm9tIFwiY29yZS9CZWhhdmlvcnMvYmVoYXZpb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB7IHJlcXVlc3RDYXB0dXJlLCByZXF1ZXN0UmVsZWFzZSwgcmVsZWFzZUN1cnJlbnQsIGdldENhcHR1cmluZ0lkIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVcIjtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCB2YXJpYWJsZSBmb3IgaG9sZGluZyB0aGUgY3VycmVudCBzY2VuZVxyXG5sZXQgTG9jYWxTY2VuZTogU2NlbmUgfCBudWxsID0gbnVsbDtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCB2YXJpYWJsZSB0byBob2xkIHRoZSBjb3VudCBvZiBiZWhhdmlvciBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4vLyBvbiBlbnRyeS4gIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzdGFydCBvciBzdG9wIG9ic2VydmluZyBwb2ludGVyIG1vdmVtZW50LlxyXG5sZXQgQ2FwdHVyZU9uRW50ZXJDb3VudCA9IDA7XHJcblxyXG4vLyBNYXAgdXNlZCB0byBzdG9yZSBpbnN0YW5jZSBvZiB0aGUgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBmb3IgYSBtZXNoXHJcbi8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGlzIGdldHMgY2hlY2tlZCBvbiBwb2ludGVyIG1vdmUgYW5kIHdlIGRvbid0IHdhbnQgdG9cclxuLy8gdXNlIGdldEJlaGF2aW9yQnlOYW1lKCkgYmVjYXVzZSB0aGF0IGlzIGEgbGluZWFyIHNlYXJjaFxyXG5jb25zdCBNZXNoVG9CZWhhdmlvck1hcCA9IG5ldyBXZWFrTWFwPEFic3RyYWN0TWVzaCwgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcj4oKTtcclxuXHJcbmNvbnN0IFN0YXJ0Q2FwdHVyZU9uRW50ZXIgPSAoc2NlbmU6IFNjZW5lKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlciwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChDYXB0dXJlT25FbnRlckNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgICAgIExvY2FsU2NlbmUgPSBMb2NhbFNjZW5lID8/IHNjZW5lO1xyXG4gICAgICAgIExvZ2dlci5Mb2coXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yOiBTdGFydGluZyBvYnNlcnZhdGlvbiBvZiBwb2ludGVyIG1vdmUgZXZlbnRzLlwiKTtcclxuICAgICAgICBMb2NhbFNjZW5lLm9uRGlzcG9zZU9ic2VydmFibGUuYWRkKERvU3RvcENhcHR1cmVPbkVudGVyKTtcclxuICAgIH1cclxuICAgIENhcHR1cmVPbkVudGVyQ291bnQrKztcclxufTtcclxuXHJcbmNvbnN0IERvU3RvcENhcHR1cmVPbkVudGVyID0gKCkgPT4ge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgT25Qb2ludGVyTW92ZSk7XHJcbiAgICBMb2NhbFNjZW5lID0gbnVsbDtcclxuICAgIExvZ2dlci5Mb2coXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yOiBTdG9wcGluZyBvYnNlcnZhdGlvbiBvZiBwb2ludGVyIG1vdmUgZXZlbnRzLlwiKTtcclxuICAgIENhcHR1cmVPbkVudGVyQ291bnQgPSAwO1xyXG59O1xyXG5cclxuY29uc3QgU3RvcENhcHR1cmVPbkVudGVyID0gKCkgPT4ge1xyXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBhIGJyb3dzZXIsIGRvIG5vdGhpbmdcclxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBvYnNlcnZpbmcgcG9pbnRlciBtb3ZlbWVudCwgZG8gbm90aGluZ1xyXG4gICAgaWYgKCFMb2NhbFNjZW5lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIENhcHR1cmVPbkVudGVyQ291bnQtLTtcclxuICAgIGlmIChDYXB0dXJlT25FbnRlckNvdW50IDw9IDApIHtcclxuICAgICAgICBEb1N0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVudGVyZWQgbWVzaCBzaG91bGQgY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG5jb25zdCBPblBvaW50ZXJNb3ZlID0gKGV2dDogUG9pbnRlckV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xyXG4gICAgaWYgKCFMb2NhbFNjZW5lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhbnZhc1JlY3QgPSBMb2NhbFNjZW5lLmdldEVuZ2luZSgpLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgIGlmICghY2FudmFzUmVjdCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQgWCBhbmQgWSBmcm9tIGVpdGhlciB0aGUgcG9pbnRlciBldmVudCBvciBmcm9tIHRoZVxyXG4gICAgLy8gVG91Y2hFdmVudCB0b3VjaFxyXG4gICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBcInRvdWNoZXNcIiBpbiBldnQgPyBldnQudG91Y2hlc1swXSA6IGV2dDtcclxuXHJcbiAgICAvLyBnZXQgdGhlIHBpY2tlZCBtZXNoLCBpZiBhbnlcclxuICAgIGNvbnN0IHBvaW50ZXJTY3JlZW5YID0gY2xpZW50WCAtIGNhbnZhc1JlY3QubGVmdDtcclxuICAgIGNvbnN0IHBvaW50ZXJTY3JlZW5ZID0gY2xpZW50WSAtIGNhbnZhc1JlY3QudG9wO1xyXG5cclxuICAgIGxldCBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yOiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcGlja1Jlc3VsdCA9IExvY2FsU2NlbmUucGljayhwb2ludGVyU2NyZWVuWCwgcG9pbnRlclNjcmVlblksIChtZXNoKSA9PiB7XHJcbiAgICAgICAgLy8gSWYgdGhlIG1lc2ggaGFzIGFuIGluc3RhbmNlIG9mIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgYXR0YWNoZWQgdG8gaXQsXHJcbiAgICAgICAgLy8gYW5kIGNhcHR1cmUgb24gcG9pbnRlciBlbnRlciBpcyB0cnVlLCB0aGVuIHdlIHdhbnQgdG8gcGljayBpdFxyXG4gICAgICAgIGNvbnN0IHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgPSBNZXNoVG9CZWhhdmlvck1hcC5nZXQobWVzaCk7XHJcbiAgICAgICAgcmV0dXJuIG1lc2guaXNFbmFibGVkKCkgJiYgdHlwZW9mIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgIT09IFwidW5kZWZpbmVkXCIgJiYgcG9pbnRlckNhcHR1cmVCZWhhdmlvci5fY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHBpY2tlZE1lc2g6IEFic3RyYWN0TWVzaCB8IG51bGw7XHJcbiAgICBpZiAocGlja1Jlc3VsdC5oaXQpIHtcclxuICAgICAgICBwaWNrZWRNZXNoID0gcGlja1Jlc3VsdC5waWNrZWRNZXNoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBwaWNrZWRNZXNoID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYXB0dXJpbmdJZEFzSW50ID0gcGFyc2VJbnQoZ2V0Q2FwdHVyaW5nSWQoKSB8fCBcIlwiKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcGlja2VkIG1lc2ggaXMgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2gsIGRvIG5vdGhpbmdcclxuICAgIGlmIChwaWNrZWRNZXNoICYmIHBpY2tlZE1lc2gudW5pcXVlSWQgPT09IGNhcHR1cmluZ0lkQXNJbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBjYXB0dXJpbmcgbWVzaCBhbmQgaXQgaXMgbm90IHRoZSBjdXJyZW50IHBpY2tlZCBtZXNoLCBvciBub1xyXG4gICAgLy8gbWVzaCBpcyBwaWNrZWQsIHJlbGVhc2UgdGhlIGNhcHR1cmluZyBtZXNoXHJcbiAgICBpZiAoY2FwdHVyaW5nSWRBc0ludCAmJiAoIXBpY2tlZE1lc2ggfHwgcGlja2VkTWVzaC51bmlxdWVJZCAhPT0gY2FwdHVyaW5nSWRBc0ludCkpIHtcclxuICAgICAgICByZWxlYXNlQ3VycmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcGlja2VkIG1lc2ggYW5kIGl0IGlzIG5vdCB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCwgY2FwdHVyZVxyXG4gICAgLy8gdGhlIHBvaW50ZXIgZXZlbnRzLiAgTm90ZSB0aGF0IHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoIGhhcyBhbHJlYWR5IGJlZW5cclxuICAgIC8vIHJlbGVhc2VkIGFib3ZlXHJcbiAgICBpZiAocGlja2VkTWVzaCkge1xyXG4gICAgICAgIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgPSBNZXNoVG9CZWhhdmlvck1hcC5nZXQocGlja2VkTWVzaCk7XHJcbiAgICAgICAgcG9pbnRlckNhcHR1cmVCZWhhdmlvciEuY2FwdHVyZVBvaW50ZXJFdmVudHMoKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBCZWhhdmlvciBmb3IgYW55IGNvbnRlbnQgdGhhdCBjYW4gY2FwdHVyZSBwb2ludGVyIGV2ZW50cywgaS5lLiBieXBhc3MgdGhlIEJhYnlsb24gcG9pbnRlciBldmVudCBoYW5kbGluZ1xyXG4gKiBhbmQgcmVjZWl2ZSBwb2ludGVyIGV2ZW50cyBkaXJlY3RseS4gIEl0IHdpbGwgcmVnaXN0ZXIgdGhlIGNhcHR1cmUgdHJpZ2dlcnMgYW5kIG5lZ290aWF0ZSB0aGUgY2FwdHVyZSBhbmRcclxuICogcmVsZWFzZSBvZiBwb2ludGVyIGV2ZW50cy4gIEN1cmVybnRseSB0aGlzIGFwcGxpZXMgb25seSB0byBIdG1sTWVzaFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgaW1wbGVtZW50cyBCZWhhdmlvcjxBYnN0cmFjdE1lc2g+IHtcclxuICAgIC8qKiBnZXRzIG9yIHNldHMgYmVoYXZpb3IncyBuYW1lICovXHJcbiAgICBwdWJsaWMgbmFtZSA9IFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5cclxuICAgIHByaXZhdGUgX2F0dGFjaGVkTWVzaDogQWJzdHJhY3RNZXNoIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBtZXNoIHRoYXQgdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXR0YWNoZWRNZXNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hlZE1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhdHRhY2hlZE1lc2godmFsdWU6IEFic3RyYWN0TWVzaCB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9hdHRhY2hlZE1lc2ggPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9jYXB0dXJlQ2FsbGJhY2s6ICgpID0+IHZvaWQsXHJcbiAgICAgICAgcHJpdmF0ZSBfcmVsZWFzZUNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIHsgY2FwdHVyZU9uUG9pbnRlckVudGVyID0gdHJ1ZSB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaGVkTWVzaCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG5cclxuICAgICAgICAvLyBXYXJuIGlmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihgQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBvdXRzaWRlIG9mIGEgYnJvd3Nlci4gIFRoZSBiZWhhdmlvciB3aWxsIG5vdCB3b3JrLmApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBpZiB0aGUgYmVoYXZpb3Igc2hvdWxkIGNhcHR1cmUgcG9pbnRlciBldmVudHMgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgdGhlIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBjYXB0dXJlT25Qb2ludGVyRW50ZXIoY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9PT0gY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICAgICAgU3RhcnRDYXB0dXJlT25FbnRlcih0aGlzLl9hdHRhY2hlZE1lc2guZ2V0U2NlbmUoKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBTdG9wQ2FwdHVyZU9uRW50ZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBuZWVkcyB0byBiZSBpbml0aWFsaXplZCAoYmVmb3JlIGF0dGFjaGluZyBpdCB0byBhIHRhcmdldClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXQoKSB7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvIGEgdGFyZ2V0XHJcbiAgICAgKiBAcGFyYW0gbWVzaCBkZWZpbmVzIHRoZSB0YXJnZXQgd2hlcmUgdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhdHRhY2gobWVzaDogQWJzdHJhY3RNZXNoKSB7XHJcbiAgICAgICAgLy8gQWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgYmVoYXZpb3Igb24gdGhlIG1lc2guICBXZSBkbyB0aGlzIHNvIHdlIGNhbiBnZXQgYVxyXG4gICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgYmVoYXZpb3IgaW4gdGhlIG9uUG9pbnRlck1vdmUgZnVuY3Rpb24gd2l0aG91dCByZWx5aW5nIG9uXHJcbiAgICAgICAgLy8gZ2V0QmVoYXZpb3JCeU5hbWUoKSwgd2hpY2ggZG9lcyBhIGxpbmVhciBzZWFyY2ggb2YgdGhlIGJlaGF2aW9ycyBhcnJheS5cclxuICAgICAgICB0aGlzLmF0dGFjaGVkTWVzaCA9IG1lc2g7XHJcbiAgICAgICAgTWVzaFRvQmVoYXZpb3JNYXAuc2V0KG1lc2gsIHRoaXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgU3RhcnRDYXB0dXJlT25FbnRlcihtZXNoLmdldFNjZW5lKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBpcyBkZXRhY2hlZCBmcm9tIGl0cyB0YXJnZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRldGFjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBiZWhhdmlvciBmcm9tIHRoZSBtZXNoXHJcbiAgICAgICAgTWVzaFRvQmVoYXZpb3JNYXAuZGVsZXRlKHRoaXMuYXR0YWNoZWRNZXNoKTtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIFN0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dGFjaGVkTWVzaCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIHRoZSBiZWhhdmlvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgICAgICB0aGlzLmRldGFjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbGVhc2UgcG9pbnRlciBldmVudHNcclxuICAgIHB1YmxpYyByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWVzdFJlbGVhc2UodGhpcy5hdHRhY2hlZE1lc2gudW5pcXVlSWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgcHVibGljIGNhcHR1cmVQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0Q2FwdHVyZSh0aGlzLmF0dGFjaGVkTWVzaC51bmlxdWVJZC50b1N0cmluZygpLCB0aGlzLl9jYXB0dXJlQ2FsbGJhY2ssIHRoaXMuX3JlbGVhc2VDYWxsYmFjayk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vaHRtbE1lc2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21zZGZUZXh0XCI7XG4iLCJpbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9zZGYvYm1Gb250XCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmRm9udCB9IGZyb20gXCIuL3NkZi9mb250XCI7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5cclxuZW51bSBDaGFyQ29kZSB7XHJcbiAgICBTUEFDRSA9IDMyLFxyXG4gICAgVE9GVSA9IDB4ZmZmYyxcclxufVxyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGZvbnQgYXNzZXQgZm9yIFNERiAoU2lnbmVkIERpc3RhbmNlIEZpZWxkKSByZW5kZXJpbmcuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRm9udEFzc2V0IHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJzID0gbmV3IE1hcDxudW1iZXIsIEJNRm9udENoYXI+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyc1JlZ2V4OiBSZWdFeHA7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9rZXJuaW5ncyA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBudW1iZXI+PigpO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBfZm9udDogU2RmRm9udDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGZvbnQgc2NhbGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHNjYWxlOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHVzZWQgdGV4dHVyZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHRleHR1cmVzOiBUZXh0dXJlW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbnRBc3NldCBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBkZWZpbml0aW9uRGF0YSBkZWZpbmVzIHRoZSBmb250IGRhdGEgaW4gSlNPTiBmb3JtYXQuXHJcbiAgICAgKiBAcGFyYW0gdGV4dHVyZVVybCBkZWZpbmVzIHRoZSB1cmwgb2YgdGhlIHRleHR1cmUgdG8gdXNlIGZvciB0aGUgZm9udC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRlZmluaXRpb25EYXRhOiBzdHJpbmcsIHRleHR1cmVVcmw6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2ZvbnQgPSBKU09OLnBhcnNlKGRlZmluaXRpb25EYXRhKSBhcyBTZGZGb250O1xyXG4gICAgICAgIC8vIFNvIGZhciB3ZSBvbmx5IGNvbnNpZGVyIG9uZSBwYWdlXHJcbiAgICAgICAgdGhpcy5fZm9udC5wYWdlcyA9IFt0ZXh0dXJlVXJsXTtcclxuXHJcbiAgICAgICAgdGhpcy5fZm9udC5jaGFycy5mb3JFYWNoKChjaGFyKSA9PiB0aGlzLl9jaGFycy5zZXQoY2hhci5pZCwgY2hhcikpO1xyXG4gICAgICAgIHRoaXMuX2ZvbnQua2VybmluZ3MuZm9yRWFjaCgoa2VybmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3VibWFwID0gdGhpcy5fa2VybmluZ3MuZ2V0KGtlcm5pbmcuZmlyc3QpO1xyXG4gICAgICAgICAgICBpZiAoIXN1Ym1hcCkge1xyXG4gICAgICAgICAgICAgICAgc3VibWFwID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fa2VybmluZ3Muc2V0KGtlcm5pbmcuZmlyc3QsIHN1Ym1hcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VibWFwLnNldChrZXJuaW5nLnNlY29uZCwga2VybmluZy5hbW91bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NoYXJzUmVnZXggPSBuZXcgUmVnRXhwKGBbJHt0aGlzLl9mb250LmNoYXJzLm1hcCgoYykgPT4gYy5jaGFyLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCBcIlxcXFwkJlwiKSkuam9pbihcIlwiKX1dYCwgXCJnXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVGYWxsYmFja3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEgLyB0aGlzLl9mb250LmluZm8uc2l6ZTtcclxuICAgICAgICB0aGlzLnRleHR1cmVzID0gdGhpcy5fZm9udC5wYWdlcy5tYXAoKHBhZ2UpID0+IG5ldyBUZXh0dXJlKHBhZ2UsIHVuZGVmaW5lZCwgeyBub01pcG1hcDogdHJ1ZSwgaW52ZXJ0WTogZmFsc2UgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUZhbGxiYWNrcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NoYXJzLmhhcyhDaGFyQ29kZS5TUEFDRSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhcnMuc2V0KENoYXJDb2RlLlNQQUNFLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogQ2hhckNvZGUuU1BBQ0UsXHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgeG9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHlvZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICB4YWR2YW5jZTogdGhpcy5fZm9udC5pbmZvLnNpemUgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICBwYWdlOiAtMSxcclxuICAgICAgICAgICAgICAgIGNobmw6IC0xLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hhcjogXCIgXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGFycy5oYXMoQ2hhckNvZGUuVE9GVSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhcnMuc2V0KENoYXJDb2RlLlRPRlUsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBDaGFyQ29kZS5UT0ZVLFxyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fZm9udC5pbmZvLnNpemUsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2ZvbnQuaW5mby5zaXplLFxyXG4gICAgICAgICAgICAgICAgeG9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgIHlvZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICB4YWR2YW5jZTogdGhpcy5fZm9udC5pbmZvLnNpemUgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICBwYWdlOiAtMSxcclxuICAgICAgICAgICAgICAgIGNobmw6IC0xLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xLFxyXG4gICAgICAgICAgICAgICAgY2hhcjogXCLvv79cIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfZ2V0Q2hhcihjaGFyQ29kZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYXJzLmdldChjaGFyQ29kZSkgfHwgdGhpcy5fY2hhcnMuZ2V0KENoYXJDb2RlLlRPRlUpITtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX2dldEtlcm5pbmcoZmlyc3Q6IG51bWJlciwgc2Vjb25kOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fa2VybmluZ3MuZ2V0KGZpcnN0KT8uZ2V0KHNlY29uZCkgfHwgMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX3Vuc3VwcG9ydGVkQ2hhcnModGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSh0aGlzLl9jaGFyc1JlZ2V4LCBcIlwiKTtcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9mb250QXNzZXRcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vcGFyYWdyYXBoT3B0aW9uc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0UmVuZGVyZXJcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5cclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCJjb3JlL01hdGhzL21hdGgudmVjdG9yXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogbnVtYmVyO1xyXG4gICAgbGluZUhlaWdodDogbnVtYmVyO1xyXG4gICAgbGV0dGVyU3BhY2luZzogbnVtYmVyO1xyXG4gICAgdGFiU2l6ZTogbnVtYmVyO1xyXG4gICAgd2hpdGVTcGFjZTogLyogJ25vcm1hbCcgfCAnbm93cmFwJyB8ICdwcmUnIHwgJ3ByZS13cmFwJyB8ICovIFwicHJlLWxpbmVcIiAvKiB8ICdicmVhay1zcGFjZXMnKi87XHJcbiAgICB0ZXh0QWxpZ246IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJjZW50ZXJcIiAvKiB8ICdqdXN0aWZ5JyovO1xyXG4gICAgdHJhbnNsYXRlOiBWZWN0b3IyIHwgdW5kZWZpbmVkO1xyXG59O1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY29uc3QgRGVmYXVsdFBhcmFncmFwaE9wdGlvbnM6IFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogSW5maW5pdHksXHJcbiAgICBsaW5lSGVpZ2h0OiAxLFxyXG4gICAgbGV0dGVyU3BhY2luZzogMSxcclxuICAgIHRhYlNpemU6IDQsXHJcbiAgICB3aGl0ZVNwYWNlOiBcInByZS1saW5lXCIsXHJcbiAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICB0cmFuc2xhdGU6IG5ldyBWZWN0b3IyKC0wLjUsIC0wLjUpLFxyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBiYWJ5bG9uanMvYXZhaWxhYmxlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGpzZG9jL3JlcXVpcmUtanNkb2MgKi9cclxuaW1wb3J0IHR5cGUgeyBGb250QXNzZXQgfSBmcm9tIFwiLi4vZm9udEFzc2V0XCI7XHJcbmltcG9ydCB7IERlZmF1bHRQYXJhZ3JhcGhPcHRpb25zLCB0eXBlIFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi4vcGFyYWdyYXBoT3B0aW9uc1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9ibUZvbnRcIjtcclxuaW1wb3J0IHR5cGUgeyBTZGZHbHlwaCB9IGZyb20gXCIuL2dseXBoXCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmVGV4dExpbmUgfSBmcm9tIFwiLi9saW5lXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTZGZUZXh0UGFyYWdyYXBoIHtcclxuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBQYXJhZ3JhcGhPcHRpb25zO1xyXG5cclxuICAgIGdldCBsaW5lSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRBc3NldC5fZm9udC5jb21tb24ubGluZUhlaWdodCAqIHRoaXMub3B0aW9ucy5saW5lSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJlYWRvbmx5IHBhcmFncmFwaDtcclxuICAgIHJlYWRvbmx5IGxpbmVzO1xyXG4gICAgcmVhZG9ubHkgd2lkdGg7XHJcbiAgICByZWFkb25seSBoZWlnaHQ7XHJcbiAgICByZWFkb25seSBnbHlwaHM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEFzc2V0OiBGb250QXNzZXQsXHJcbiAgICAgICAgb3B0aW9ucz86IFBhcnRpYWw8UGFyYWdyYXBoT3B0aW9ucz5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgLi4uRGVmYXVsdFBhcmFncmFwaE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBwYXJhZ3JhcGgsIGxpbmVzLCBnbHlwaHMsIHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2NvbXB1dGVNZXRyaWNzKHRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFncmFwaCA9IHBhcmFncmFwaDtcclxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XHJcbiAgICAgICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvbXB1dGVNZXRyaWNzKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuX2NvbGxhcHNlKHRleHQpO1xyXG4gICAgICAgIGNvbnN0IGJyZWFrZWQgPSB0aGlzLl9icmVha0xpbmVzKGNvbGxhcHNlZCk7XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGJyZWFrZWQubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVzOiBTZGZUZXh0TGluZVtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRyaW1tZWQpIHtcclxuICAgICAgICAgICAgbGluZXMucHVzaCguLi50aGlzLl93cmFwKGxpbmUsIGxpbmVzLmxlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCguLi5saW5lcy5tYXAoKGxpbmUpID0+IGxpbmUud2lkdGgpKTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmxpbmVIZWlnaHQgKiBsaW5lcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGV4dEFsaWduICE9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMudHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudGV4dEFsaWduKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoIC0gbGluZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh3aWR0aCAtIGxpbmUud2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLm9wdGlvbnMudHJhbnNsYXRlPy5tdWx0aXBseUJ5RmxvYXRzKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgbGluZS5nbHlwaHMuZm9yRWFjaCgoZ2x5cGgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbHlwaC54ICs9IGFuY2hvcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLnggKz0gdHJhbnNsYXRlLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLnkgKz0gdHJhbnNsYXRlLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ2x5cGhzID0gbGluZXMuZmxhdE1hcCgobGluZSkgPT4gbGluZS5nbHlwaHMpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwYXJhZ3JhcGg6IHRyaW1tZWQuam9pbihcIlxcblwiKSxcclxuICAgICAgICAgICAgbGluZXMsXHJcbiAgICAgICAgICAgIGdseXBocyxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2JyZWFrTGluZXModGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY29sbGFwc2UodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx0L2csIFwiIFwiLnJlcGVhdCh0aGlzLm9wdGlvbnMudGFiU2l6ZSkpLnJlcGxhY2UoLyArL2csIFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF93cmFwKHRleHQ6IHN0cmluZywgbGluZU9mZnNldCA9IDApIHtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxTZGZUZXh0TGluZT4oKTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRMaW5lID0gbGluZU9mZnNldDtcclxuICAgICAgICBsZXQgY3VycmVudEdseXBocyA9IG5ldyBBcnJheTxTZGZHbHlwaD4oKTtcclxuICAgICAgICBsZXQgY3VycmVudEN1cnNvciA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IGxhc3RDaGFyOiBCTUZvbnRDaGFyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBzdGFydCA9IDA7XHJcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0O1xyXG5cclxuICAgICAgICBjb25zdCBwdXNoQ3VycmVudExpbmUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dC5zbGljZShzdGFydCwgZW5kKSxcclxuICAgICAgICAgICAgICAgIGdseXBoczogY3VycmVudEdseXBocyxcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcclxuICAgICAgICAgICAgICAgIGVuZDogZW5kLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gdGhpcy5mb250QXNzZXQuX2dldENoYXIoY2hhckNvZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyV2lkdGggPSBjaGFyLndpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBrZXJuaW5nID0gbGFzdENoYXIgPyB0aGlzLmZvbnRBc3NldC5fZ2V0S2VybmluZyhsYXN0Q2hhci5pZCwgY2hhci5pZCkgOiAwO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudEN1cnNvciArPSBrZXJuaW5nICsgY2hhci54b2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBuZXdXaWR0aCA9IGN1cnJlbnRDdXJzb3IgKyBjaGFyV2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclByb2dyZXNzID0gY2hhci54YWR2YW5jZSArIHRoaXMub3B0aW9ucy5sZXR0ZXJTcGFjaW5nO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0UG9zaXRpb24gPSBjdXJyZW50Q3Vyc29yICsgY3Vyc29yUHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRCcmVhayA9IG5leHRQb3NpdGlvbiA+IHRoaXMub3B0aW9ucy5tYXhXaWR0aCB8fCBuZXdXaWR0aCA+IHRoaXMub3B0aW9ucy5tYXhXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG91bGRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgcHVzaEN1cnJlbnRMaW5lKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUrKztcclxuICAgICAgICAgICAgICAgIGxhc3RDaGFyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDE7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50R2x5cGhzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBjdXJyZW50Q3Vyc29yO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gY3VycmVudExpbmUgKiB0aGlzLmxpbmVIZWlnaHQgKyBjaGFyLnlvZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50R2x5cGhzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgY2hhcixcclxuICAgICAgICAgICAgICAgIGxpbmU6IGN1cnJlbnRMaW5lLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGN1cnJlbnRHbHlwaHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgeDogeCxcclxuICAgICAgICAgICAgICAgIHk6IHksXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFzaG91bGRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgbGFzdENoYXIgPSBjaGFyO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IG5leHRQb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgICAgICAgICAgZW5kKys7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gY3Vyc29yUHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50R2x5cGhzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHVzaEN1cnJlbnRMaW5lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGluZXM7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBWZXJ0ZXhCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0RW5naW5lIH0gZnJvbSBcImNvcmUvRW5naW5lcy9hYnN0cmFjdEVuZ2luZVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiY29yZS9FbmdpbmVzL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IFRoaW5FbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3RoaW5FbmdpbmVcIjtcclxuaW1wb3J0IHsgRHJhd1dyYXBwZXIgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZHJhd1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2hhZGVyTGFuZ3VhZ2UgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvc2hhZGVyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHR5cGUgeyBJRGlzcG9zYWJsZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgeyBTZGZUZXh0UGFyYWdyYXBoIH0gZnJvbSBcIi4vc2RmL3BhcmFncmFwaFwiO1xyXG5pbXBvcnQgdHlwZSB7IEZvbnRBc3NldCB9IGZyb20gXCIuL2ZvbnRBc3NldFwiO1xyXG5pbXBvcnQgdHlwZSB7IFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi9wYXJhZ3JhcGhPcHRpb25zXCI7XHJcbmltcG9ydCB7IFRoaW5NYXRyaXggfSBmcm9tIFwiY29yZS9NYXRocy9UaGluTWF0aHMvdGhpbk1hdGgubWF0cml4XCI7XHJcbmltcG9ydCB7XHJcbiAgICBDb3B5TWF0cml4VG9BcnJheSxcclxuICAgIENvcHlNYXRyaXhUb1JlZixcclxuICAgIElkZW50aXR5TWF0cml4VG9SZWYsXHJcbiAgICBJbnZlcnRNYXRyaXhUb1JlZixcclxuICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZixcclxuICAgIFNjYWxpbmdNYXRyaXhUb1JlZixcclxuICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYsXHJcbn0gZnJvbSBcImNvcmUvTWF0aHMvVGhpbk1hdGhzL3RoaW5NYXRoLm1hdHJpeC5mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHR5cGUgeyBJQ29sb3I0TGlrZSwgSU1hdHJpeExpa2UsIElWZWN0b3IzTGlrZSB9IGZyb20gXCJjb3JlL01hdGhzXCI7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgTm9kZSBjbGFzcyBmcm9tIEJhYnlsb24uanNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5vZGVMaWtlIHtcclxuICAgIGdldFdvcmxkTWF0cml4KCk6IFRoaW5NYXRyaXg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGFzcyB1c2VkIHRvIHJlbmRlciB0ZXh0IHVzaW5nIE1TREYgKE11bHRpLWNoYW5uZWwgU2lnbmVkIERpc3RhbmNlIEZpZWxkKSB0ZWNobmlxdWVcclxuICogVGhhbmtzIGEgbG90IHRvIHRoZSB3b3JrIG9mIEJodXNoYW5fV2FnaCBhbmQgemJfc2ogZm9yIHRoZWlyIGFtYXppbmcgd29yayBvbiBNU0RGIGZvciBCYWJ5bG9uLmpzXHJcbiAqICM2UkxDV1AjMTZcclxuICogU3RhciB3YXJzIHNjcm9sbGVyOiAjNlJMQ1dQIzI5XHJcbiAqIFdpdGggbWV0cmljczogIzZSTENXUCMzNVxyXG4gKiBUaGlja25lc3M6ICNJQUJNRVojM1xyXG4gKiBTb2xhciBzeXN0ZW06ICM5WUNEWUMjOVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRleHRSZW5kZXJlciBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VzZVZBTzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lOiBBYnN0cmFjdEVuZ2luZTtcclxuICAgIHByaXZhdGUgX3NoYWRlckxhbmd1YWdlOiBTaGFkZXJMYW5ndWFnZTtcclxuICAgIHByaXZhdGUgX3ZlcnRleEJ1ZmZlcnM6IHsgW2tleTogc3RyaW5nXTogVmVydGV4QnVmZmVyIH0gPSB7fTtcclxuICAgIHByaXZhdGUgX3Nwcml0ZUJ1ZmZlcjogTnVsbGFibGU8QnVmZmVyPjtcclxuICAgIHByaXZhdGUgX3dvcmxkQnVmZmVyOiBOdWxsYWJsZTxCdWZmZXI+O1xyXG4gICAgcHJpdmF0ZSBfdXZCdWZmZXI6IE51bGxhYmxlPEJ1ZmZlcj47XHJcbiAgICBwcml2YXRlIF9kcmF3V3JhcHBlckJhc2U6IERyYXdXcmFwcGVyO1xyXG4gICAgcHJpdmF0ZSBfdmVydGV4QXJyYXlPYmplY3Q6IFdlYkdMVmVydGV4QXJyYXlPYmplY3Q7XHJcbiAgICBwcml2YXRlIF9mb250OiBGb250QXNzZXQ7XHJcbiAgICBwcml2YXRlIF9jaGFyTWF0cmljZXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgcHJpdmF0ZSBfY2hhclV2cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBwcml2YXRlIF9pc0RpcnR5ID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2Jhc2VMaW5lID0gMDtcclxuXHJcbiAgICAvLyBDYWNoZVxyXG4gICAgcHJpdmF0ZSBfc2NhbGluZ01hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9mb250U2NhbGVNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfb2Zmc2V0TWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2Jhc2VNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfc2NhbGVkTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2xvY2FsTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2ZpbmFsTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2xpbmVNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfcGFyZW50V29ybGRNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfc3RvcmVkVHJhbnNsYXRpb246IElWZWN0b3IzTGlrZSA9IHsgeDogMCwgeTogMCwgejogMCB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBjb2xvciBvZiB0aGUgdGV4dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sb3I6IElDb2xvcjRMaWtlID0geyByOiAxLjAsIGc6IDEuMCwgYjogMS4wLCBhOiAxLjAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB0ZXh0ICgwIG1lYW5zIGFzIGRlZmluZWQgaW4gdGhlIGZvbnQpXHJcbiAgICAgKiBWYWx1ZSBtdXN0IGJlIGJldHdlZW4gLTAuNSBhbmQgMC41XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0aGlja25lc3NDb250cm9sID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9wYXJlbnQ6IE51bGxhYmxlPElOb2RlTGlrZT4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBwYXJlbnQgb2YgdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJlbnQoKTogTnVsbGFibGU8SU5vZGVMaWtlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHBhcmVudCh2YWx1ZTogTnVsbGFibGU8SU5vZGVMaWtlPikge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGlmIHRoZSB0ZXh0IGlzIGJpbGxib2FyZGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0JpbGxib2FyZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHRleHQgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjaGFyYWN0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFyTWF0cmljZXMubGVuZ3RoIC8gMTY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlbmdpbmU6IEFic3RyYWN0RW5naW5lLCBzaGFkZXJMYW5ndWFnZTogU2hhZGVyTGFuZ3VhZ2UgPSBTaGFkZXJMYW5ndWFnZS5HTFNMLCBmb250OiBGb250QXNzZXQpIHtcclxuICAgICAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XHJcbiAgICAgICAgdGhpcy5fc2hhZGVyTGFuZ3VhZ2UgPSBzaGFkZXJMYW5ndWFnZTtcclxuICAgICAgICB0aGlzLl9mb250ID0gZm9udDtcclxuICAgICAgICB0aGlzLl9iYXNlTGluZSA9IGZvbnQuX2ZvbnQuY29tbW9uLmxpbmVIZWlnaHQgKiBmb250LnNjYWxlO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VWQU8gPSBlbmdpbmUuZ2V0Q2FwcygpLnZlcnRleEFycmF5T2JqZWN0ICYmICFlbmdpbmUuZGlzYWJsZVZlcnRleEFycmF5T2JqZWN0cztcclxuXHJcbiAgICAgICAgLy8gTWFpbiB2ZXJ0ZXggYnVmZmVyXHJcbiAgICAgICAgY29uc3Qgc3ByaXRlRGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDEsIDAsIDAsIDEsIDEsIDFdKTtcclxuICAgICAgICB0aGlzLl9zcHJpdGVCdWZmZXIgPSBuZXcgQnVmZmVyKGVuZ2luZSwgc3ByaXRlRGF0YSwgZmFsc2UsIDIpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJvZmZzZXRzXCJdID0gdGhpcy5fc3ByaXRlQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIm9mZnNldHNcIiwgMCwgMik7XHJcblxyXG4gICAgICAgIC8vIEluc3RhbmNlc1xyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZUJ1ZmZlcnMoMTI4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yZXNpemVCdWZmZXJzKGNhcGFjaXR5OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fd29ybGRCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdXZCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5fZW5naW5lLCBuZXcgRmxvYXQzMkFycmF5KGNhcGFjaXR5ICogMTYpLCB0cnVlLCAxNik7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkMFwiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkMFwiLCAwLCA0LCAxNiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkMVwiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkMVwiLCA0LCA0LCAxNiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkMlwiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkMlwiLCA4LCA0LCAxNiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIndvcmxkM1wiXSA9IHRoaXMuX3dvcmxkQnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcIndvcmxkM1wiLCAxMiwgNCwgMTYsIHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl91dkJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5fZW5naW5lLCBuZXcgRmxvYXQzMkFycmF5KGNhcGFjaXR5ICogNCksIHRydWUsIDQpO1xyXG4gICAgICAgIHRoaXMuX3ZlcnRleEJ1ZmZlcnNbXCJ1dnNcIl0gPSB0aGlzLl91dkJ1ZmZlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoXCJ1dnNcIiwgMCwgNCwgNCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2V0U2hhZGVycyh2ZXJ0ZXg6IHN0cmluZywgZnJhZ21lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZT8uZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UgPSBuZXcgRHJhd1dyYXBwZXIodGhpcy5fZW5naW5lKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYXdXcmFwcGVyQmFzZS5kcmF3Q29udGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UuZHJhd0NvbnRleHQudXNlSW5zdGFuY2luZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkZWZpbmVzID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlLmVmZmVjdCA9IHRoaXMuX2VuZ2luZS5jcmVhdGVFZmZlY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZlcnRleFNvdXJjZTogdmVydGV4LFxyXG4gICAgICAgICAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZyYWdtZW50LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbXCJvZmZzZXRzXCIsIFwid29ybGQwXCIsIFwid29ybGQxXCIsIFwid29ybGQyXCIsIFwid29ybGQzXCIsIFwidXZzXCJdLFxyXG4gICAgICAgICAgICBbXCJwYXJlbnRXb3JsZFwiLCBcInZpZXdcIiwgXCJwcm9qZWN0aW9uXCIsIFwidUNvbG9yXCIsIFwidW5pdFJhbmdlXCIsIFwidGV4ZWxTaXplXCIsIFwidGhpY2tuZXNzXCJdLFxyXG4gICAgICAgICAgICBbXCJmb250QXRsYXNcIl0sXHJcbiAgICAgICAgICAgIGRlZmluZXMsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdGhpcy5fc2hhZGVyTGFuZ3VhZ2VcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UuZWZmZWN0Ll9yZWZDb3VudCsrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgcGFyYWdyYXBoIG9mIHRleHQgdG8gdGhlIHJlbmRlcmVyXHJcbiAgICAgKiBAcGFyYW0gdGV4dCBkZWZpbmUgdGhlIHRleHQgdG8gYWRkXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBkZWZpbmUgdGhlIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgcGFyYWdyYXBoIChvcHRpb25hbClcclxuICAgICAqIEBwYXJhbSB3b3JsZE1hdHJpeCBkZWZpbmUgdGhlIHdvcmxkIG1hdHJpeCB0byB1c2UgZm9yIHRoZSBwYXJhZ3JhcGggKG9wdGlvbmFsKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUGFyYWdyYXBoKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8UGFyYWdyYXBoT3B0aW9ucz4sIHdvcmxkTWF0cml4PzogSU1hdHJpeExpa2UpIHtcclxuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBuZXcgU2RmVGV4dFBhcmFncmFwaCh0ZXh0LCB0aGlzLl9mb250LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9udFNjYWxlID0gdGhpcy5fZm9udC5zY2FsZTtcclxuXHJcbiAgICAgICAgY29uc3QgdGV4V2lkdGggPSB0aGlzLl9mb250Ll9mb250LmNvbW1vbi5zY2FsZVc7XHJcbiAgICAgICAgY29uc3QgdGV4SGVpZ2h0ID0gdGhpcy5fZm9udC5fZm9udC5jb21tb24uc2NhbGVIO1xyXG4gICAgICAgIGNvbnN0IGdseXBocyA9IHBhcmFncmFwaC5nbHlwaHMuZmlsdGVyKChnKSA9PiBnLmNoYXIucGFnZSA+PSAwKTtcclxuXHJcbiAgICAgICAgbGV0IHdvcmxkTWF0cml4VG9Vc2UgPSB3b3JsZE1hdHJpeDtcclxuXHJcbiAgICAgICAgaWYgKCF3b3JsZE1hdHJpeFRvVXNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBwYXJhZ3JhcGgubGluZUhlaWdodCAqIGZvbnRTY2FsZTtcclxuICAgICAgICAgICAgY29uc3QgbGluZU9mZnNldCA9IChwYXJhZ3JhcGgubGluZXMubGVuZ3RoICogbGluZUhlaWdodCkgLyAyO1xyXG4gICAgICAgICAgICBUcmFuc2xhdGlvbk1hdHJpeFRvUmVmKDAsIHRoaXMuX2Jhc2VMaW5lIC0gbGluZU9mZnNldCwgMCwgdGhpcy5fbGluZU1hdHJpeCk7XHJcbiAgICAgICAgICAgIHdvcmxkTWF0cml4VG9Vc2UgPSB0aGlzLl9saW5lTWF0cml4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgU2NhbGluZ01hdHJpeFRvUmVmKGZvbnRTY2FsZSwgZm9udFNjYWxlLCAxLjAsIHRoaXMuX2ZvbnRTY2FsZU1hdHJpeCk7XHJcbiAgICAgICAgVHJhbnNsYXRpb25NYXRyaXhUb1JlZigwLjUsIC0wLjUsIDAsIHRoaXMuX29mZnNldE1hdHJpeCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNoYXJzVXZzQmFzZSA9IHRoaXMuX2NoYXJVdnMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IG1hdHJpY2VzQmFzZSA9IHRoaXMuX2NoYXJNYXRyaWNlcy5sZW5ndGg7XHJcbiAgICAgICAgZ2x5cGhzLmZvckVhY2goKGcsIGkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDBdID0gZy5jaGFyLnggLyB0ZXhXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDFdID0gZy5jaGFyLnkgLyB0ZXhIZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAyXSA9IGcuY2hhci53aWR0aCAvIHRleFdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFyVXZzW2NoYXJzVXZzQmFzZSArIGkgKiA0ICsgM10gPSBnLmNoYXIuaGVpZ2h0IC8gdGV4SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeCA9IGcueDtcclxuICAgICAgICAgICAgY29uc3QgeSA9IC1nLnk7XHJcblxyXG4gICAgICAgICAgICBTY2FsaW5nTWF0cml4VG9SZWYoZy5jaGFyLndpZHRoLCBnLmNoYXIuaGVpZ2h0LCAxLjAsIHRoaXMuX3NjYWxpbmdNYXRyaXgpO1xyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fb2Zmc2V0TWF0cml4LCB0aGlzLl9zY2FsaW5nTWF0cml4LCB0aGlzLl9iYXNlTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoeCAqIGZvbnRTY2FsZSwgeSAqIGZvbnRTY2FsZSwgMC4wLCB0aGlzLl90cmFuc2xhdGlvbk1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9iYXNlTWF0cml4LCB0aGlzLl9mb250U2NhbGVNYXRyaXgsIHRoaXMuX3NjYWxlZE1hdHJpeCk7XHJcbiAgICAgICAgICAgIE11bHRpcGx5TWF0cmljZXNUb1JlZih0aGlzLl9zY2FsZWRNYXRyaXgsIHRoaXMuX3RyYW5zbGF0aW9uTWF0cml4LCB0aGlzLl9sb2NhbE1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fbG9jYWxNYXRyaXgsIHdvcmxkTWF0cml4VG9Vc2UsIHRoaXMuX2ZpbmFsTWF0cml4KTtcclxuICAgICAgICAgICAgQ29weU1hdHJpeFRvQXJyYXkodGhpcy5fZmluYWxNYXRyaXgsIHRoaXMuX2NoYXJNYXRyaWNlcywgbWF0cmljZXNCYXNlICsgaSAqIDE2KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2Jhc2VMaW5lIC09IHBhcmFncmFwaC5saW5lSGVpZ2h0ICogZm9udFNjYWxlICogcGFyYWdyYXBoLmxpbmVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlciB0aGUgdGV4dCB1c2luZyB0aGUgcHJvdmlkZWQgdmlldyBhbmQgcHJvamVjdGlvbiBtYXRyaWNlc1xyXG4gICAgICogQHBhcmFtIHZpZXdNYXRyaXggZGVmaW5lIHRoZSB2aWV3IG1hdHJpeCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uTWF0cml4IGRlZmluZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggdG8gdXNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXIodmlld01hdHJpeDogSU1hdHJpeExpa2UsIHByb2plY3Rpb25NYXRyaXg6IElNYXRyaXhMaWtlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJhd1dyYXBwZXIgPSB0aGlzLl9kcmF3V3JhcHBlckJhc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IGRyYXdXcmFwcGVyLmVmZmVjdCE7XHJcblxyXG4gICAgICAgIC8vIENoZWNrXHJcbiAgICAgICAgaWYgKCFlZmZlY3QuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZW5naW5lID0gdGhpcy5fZW5naW5lO1xyXG5cclxuICAgICAgICBlbmdpbmUuc2V0U3RhdGUoZmFsc2UpO1xyXG4gICAgICAgIGVuZ2luZS5lbmFibGVFZmZlY3QoZHJhd1dyYXBwZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0JpbGxib2FyZCkge1xyXG4gICAgICAgICAgICAvLyBXZSB3aWxsIG9ubHkgY29uc2lkZXIgdHJhbnNsYXRpb24gZm9yIHBhcmVudCB0byBzaW1wbGlmeSBjb21wdXRhdGlvblxyXG4gICAgICAgICAgICAvLyBTYXZlIHBhcmVudCB0cmFuc2xhdGlvblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwd20gPSB0aGlzLl9wYXJlbnQuZ2V0V29ybGRNYXRyaXgoKS5hc0FycmF5KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRUcmFuc2xhdGlvbi54ID0gcHdtWzEyXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JlZFRyYW5zbGF0aW9uLnkgPSBwd21bMTNdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmVkVHJhbnNsYXRpb24ueiA9IHB3bVsxNF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRUcmFuc2xhdGlvbi54ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JlZFRyYW5zbGF0aW9uLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcmVkVHJhbnNsYXRpb24ueiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ2FuY2VsIGNhbWVyYSByb3RhdGlvblxyXG4gICAgICAgICAgICBjb25zdCBiYXNlTSA9IHRoaXMuX2Jhc2VNYXRyaXguYXNBcnJheSgpO1xyXG4gICAgICAgICAgICBDb3B5TWF0cml4VG9BcnJheSh2aWV3TWF0cml4LCBiYXNlTSk7XHJcbiAgICAgICAgICAgIGJhc2VNWzEyXSA9IDA7XHJcbiAgICAgICAgICAgIGJhc2VNWzEzXSA9IDA7XHJcbiAgICAgICAgICAgIGJhc2VNWzE0XSA9IDA7XHJcbiAgICAgICAgICAgIEludmVydE1hdHJpeFRvUmVmKHRoaXMuX2Jhc2VNYXRyaXgsIHRoaXMuX3BhcmVudFdvcmxkTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdHJhbnNsYXRpb25cclxuICAgICAgICAgICAgY29uc3QgcHdtID0gdGhpcy5fcGFyZW50V29ybGRNYXRyaXguYXNBcnJheSgpO1xyXG4gICAgICAgICAgICBwd21bMTJdID0gdGhpcy5fc3RvcmVkVHJhbnNsYXRpb24ueDtcclxuICAgICAgICAgICAgcHdtWzEzXSA9IHRoaXMuX3N0b3JlZFRyYW5zbGF0aW9uLnk7XHJcbiAgICAgICAgICAgIHB3bVsxNF0gPSB0aGlzLl9zdG9yZWRUcmFuc2xhdGlvbi56O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIENvcHlNYXRyaXhUb1JlZih0aGlzLl9wYXJlbnQuZ2V0V29ybGRNYXRyaXgoKSwgdGhpcy5fcGFyZW50V29ybGRNYXRyaXgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgSWRlbnRpdHlNYXRyaXhUb1JlZih0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJwYXJlbnRXb3JsZFwiLCB0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInZpZXdcIiwgdmlld01hdHJpeCk7XHJcbiAgICAgICAgZWZmZWN0LnNldE1hdHJpeChcInByb2plY3Rpb25cIiwgcHJvamVjdGlvbk1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIFRleHR1cmVcclxuICAgICAgICBjb25zdCB0ZXh0dXJlV2lkdGggPSB0aGlzLl9mb250Ll9mb250LmNvbW1vbi5zY2FsZVc7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZUhlaWdodCA9IHRoaXMuX2ZvbnQuX2ZvbnQuY29tbW9uLnNjYWxlVztcclxuICAgICAgICBjb25zdCBkaXN0YW5jZVJhbmdlID0gdGhpcy5fZm9udC5fZm9udC5kaXN0YW5jZUZpZWxkLmRpc3RhbmNlUmFuZ2U7XHJcblxyXG4gICAgICAgIGVmZmVjdC5zZXRUZXh0dXJlKFwiZm9udEF0bGFzXCIsIHRoaXMuX2ZvbnQudGV4dHVyZXNbMF0pO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdDIoXCJ1bml0UmFuZ2VcIiwgZGlzdGFuY2VSYW5nZSAvIHRleHR1cmVXaWR0aCwgZGlzdGFuY2VSYW5nZSAvIHRleHR1cmVIZWlnaHQpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdDIoXCJ0ZXhlbFNpemVcIiwgMS4wIC8gdGV4dHVyZVdpZHRoLCAxLjAgLyB0ZXh0dXJlSGVpZ2h0KTtcclxuICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KFwidUNvbG9yXCIsIHRoaXMuY29sb3IpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdChcInRoaWNrbmVzc1wiLCB0aGlzLnRoaWNrbmVzc0NvbnRyb2wgKiAwLjkpO1xyXG5cclxuICAgICAgICBjb25zdCBpbnN0YW5jZUNvdW50ID0gdGhpcy5fY2hhck1hdHJpY2VzLmxlbmd0aCAvIDE2O1xyXG5cclxuICAgICAgICAvLyBOZWVkIHVwZGF0ZT9cclxuICAgICAgICBpZiAodGhpcy5faXNEaXJ0eSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ybGRCdWZmZXIhLmdldEJ1ZmZlcigpIS5jYXBhY2l0eSAvIDQgPCBpbnN0YW5jZUNvdW50ICogMTYpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUJ1ZmZlcnMoaW5zdGFuY2VDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyIS51cGRhdGUodGhpcy5fY2hhck1hdHJpY2VzKTtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIhLnVwZGF0ZSh0aGlzLl9jaGFyVXZzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91c2VWQU8pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmVydGV4QXJyYXlPYmplY3QgPSAoZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlY29yZFZlcnRleEFycmF5T2JqZWN0KHRoaXMuX3ZlcnRleEJ1ZmZlcnMsIG51bGwsIGVmZmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKGVuZ2luZSBhcyBUaGluRW5naW5lKS5iaW5kVmVydGV4QXJyYXlPYmplY3QodGhpcy5fdmVydGV4QXJyYXlPYmplY3QsIG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFZCT3NcclxuICAgICAgICAgICAgZW5naW5lLmJpbmRCdWZmZXJzKHRoaXMuX3ZlcnRleEJ1ZmZlcnMsIG51bGwsIGVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbmdpbmUuc2V0QWxwaGFNb2RlKENvbnN0YW50cy5BTFBIQV9DT01CSU5FKTtcclxuXHJcbiAgICAgICAgZW5naW5lLmRyYXdBcnJheXNUeXBlKENvbnN0YW50cy5NQVRFUklBTF9UcmlhbmdsZVN0cmlwRHJhd01vZGUsIDAsIDQsIGluc3RhbmNlQ291bnQpO1xyXG5cclxuICAgICAgICBlbmdpbmUudW5iaW5kSW5zdGFuY2VBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91dkJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcHJpdGVCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3ByaXRlQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAodGhpcy5fZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlbGVhc2VWZXJ0ZXhBcnJheU9iamVjdCh0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCk7XHJcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZlcnRleEFycmF5T2JqZWN0KSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgaW5zdGFuY2UgYXN5bmNocm9ub3VzbHlcclxuICAgICAqIEBwYXJhbSBmb250IGRlZmluZSB0aGUgZm9udCBhc3NldCB0byB1c2VcclxuICAgICAqIEBwYXJhbSBlbmdpbmUgZGVmaW5lIHRoZSBlbmdpbmUgdG8gdXNlXHJcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBUZXh0UmVuZGVyZXIgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBDcmVhdGVUZXh0UmVuZGVyZXJBc3luYyhmb250OiBGb250QXNzZXQsIGVuZ2luZTogQWJzdHJhY3RFbmdpbmUpIHtcclxuICAgICAgICBpZiAoIWVuZ2luZS5nZXRDYXBzKCkuaW5zdGFuY2VkQXJyYXlzIHx8ICFlbmdpbmUuX2ZlYXR1cmVzLnN1cHBvcnRTcHJpdGVJbnN0YW5jaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluc3RhbmNlZCBhcnJheXMgYXJlIHJlcXVpcmVkIGZvciBNU0RGIHRleHQgcmVuZGVyaW5nLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLkdMU0w7XHJcbiAgICAgICAgbGV0IHZlcnRleDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZnJhZ21lbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKGVuZ2luZS5pc1dlYkdQVSkge1xyXG4gICAgICAgICAgICBzaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLldHU0w7XHJcbiAgICAgICAgICAgIHZlcnRleCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdwdS92ZXJ0ZXhcIikpLm1zZGZWZXJ0ZXhTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgICAgICBmcmFnbWVudCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdwdS9mcmFnbWVudFwiKSkubXNkZkZyYWdtZW50U2hhZGVyLnNoYWRlcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2ZXJ0ZXggPSAoYXdhaXQgaW1wb3J0KFwiLi93ZWJnbC92ZXJ0ZXhcIikpLm1zZGZWZXJ0ZXhTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgICAgICBmcmFnbWVudCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdsL2ZyYWdtZW50XCIpKS5tc2RmRnJhZ21lbnRTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGV4dFJlbmRlcmVyID0gbmV3IFRleHRSZW5kZXJlcihlbmdpbmUsIHNoYWRlckxhbmd1YWdlLCBmb250KTtcclxuICAgICAgICB0ZXh0UmVuZGVyZXIuX3NldFNoYWRlcnModmVydGV4LCBmcmFnbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0UmVuZGVyZXI7XHJcbiAgICB9XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRoc19tYXRoX3ZlY3Rvcl9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIGluUHJvZ3Jlc3MgPSB7fTtcbnZhciBkYXRhV2VicGFja1ByZWZpeCA9IFwiQURET05TOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXG5cdFx0c2NyaXB0LnNyYyA9IHVybDtcblx0fVxuXHRpblByb2dyZXNzW3VybF0gPSBbZG9uZV07XG5cdHZhciBvblNjcmlwdENvbXBsZXRlID0gKHByZXYsIGV2ZW50KSA9PiB7XG5cdFx0Ly8gYXZvaWQgbWVtIGxlYWtzIGluIElFLlxuXHRcdHNjcmlwdC5vbmVycm9yID0gc2NyaXB0Lm9ubG9hZCA9IG51bGw7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdHZhciBkb25lRm5zID0gaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdGRlbGV0ZSBpblByb2dyZXNzW3VybF07XG5cdFx0c2NyaXB0LnBhcmVudE5vZGUgJiYgc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcblx0XHRkb25lRm5zICYmIGRvbmVGbnMuZm9yRWFjaCgoZm4pID0+IChmbihldmVudCkpKTtcblx0XHRpZihwcmV2KSByZXR1cm4gcHJldihldmVudCk7XG5cdH1cblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJylcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYztcblx0aWYgKCFzY3JpcHRVcmwpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGlmKHNjcmlwdHMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgaSA9IHNjcmlwdHMubGVuZ3RoIC0gMTtcblx0XHRcdHdoaWxlIChpID4gLTEgJiYgKCFzY3JpcHRVcmwgfHwgIS9eaHR0cChzPyk6Ly50ZXN0KHNjcmlwdFVybCkpKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC9eYmxvYjovLCBcIlwiKS5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwiYWRkb25zXCI6IDBcbn07XG5cbl9fd2VicGFja19yZXF1aXJlX18uZi5qID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdFx0Ly8gSlNPTlAgY2h1bmsgbG9hZGluZyBmb3IgamF2YXNjcmlwdFxuXHRcdHZhciBpbnN0YWxsZWRDaHVua0RhdGEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSA/IGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA6IHVuZGVmaW5lZDtcblx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEgIT09IDApIHsgLy8gMCBtZWFucyBcImFscmVhZHkgaW5zdGFsbGVkXCIuXG5cblx0XHRcdC8vIGEgUHJvbWlzZSBtZWFucyBcImN1cnJlbnRseSBsb2FkaW5nXCIuXG5cdFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEpIHtcblx0XHRcdFx0cHJvbWlzZXMucHVzaChpbnN0YWxsZWRDaHVua0RhdGFbMl0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG59O1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpW1wid2VicGFja0NodW5rQURET05TXCJdID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKVtcIndlYnBhY2tDaHVua0FERE9OU1wiXSB8fCBbXTtcbmNodW5rTG9hZGluZ0dsb2JhbC5mb3JFYWNoKHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgMCkpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKSk7IiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzXHJcbmltcG9ydCAqIGFzIGFkZG9ucyBmcm9tIFwiYWRkb25zL2luZGV4XCI7XHJcblxyXG5leHBvcnQgeyBhZGRvbnMgfTtcclxuZXhwb3J0IGRlZmF1bHQgYWRkb25zO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
2834
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUlBO0FBQ0E7QUFtQkE7QUFHQTtBQUZBO0FBQ0E7QUFwQkE7QUFDQTtBQXNCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQXVCQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xPQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQWtCQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUF2QkE7QUFFQTtBQXNCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBSXhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUVEQTtBQUtBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBQUE7QUFDQTtBQUNBOzs7QUFBQTtBQXdCQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxS0E7QUFFQTtBQUVBO0FBSUE7QUFHQTtBQUNBO0FBaUJBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBMEdBO0FBQUE7QUF6R0E7QUFHQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUVBO0FBYUE7QUFlQTs7QUFFQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFTQTs7O0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQTlEQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFKQTtBQWFBO0FBTEE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBSkE7QUFvQkE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUF5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFBQTtBQUNBOztBQUFBOztBQUVBOztBQUFBO0FBQ0E7O0FBQUE7OztBQUdBO0FBQ0E7QUFFQTs7OztBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztBQzlZQTtBQUNBO0FBQ0E7QUF1Q0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQXVDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUNBO0FBMENBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7QUEwQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM3Q0E7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9maXRTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvaHRtbE1lc2gudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9wb2ludGVyRXZlbnRzQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L2ZvbnRBc3NldC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3BhcmFncmFwaE9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9ibUZvbnQudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9mb250LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9tc2RmVGV4dC9zZGYvZ2x5cGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9pbmRleC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvc2RmL2xpbmUudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3NkZi9wYXJhZ3JhcGgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3RleHRSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvd2ViZ2wvZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3dlYmdsL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9tc2RmVGV4dC93ZWJnbC92ZXJ0ZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL21zZGZUZXh0L3dlYmdwdS9mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvbXNkZlRleHQvd2ViZ3B1L2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9tc2RmVGV4dC93ZWJncHUvdmVydGV4LnRzIiwid2VicGFjazovL0FERE9OUy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiQkFCWUxPTlwiLFwiY29tbW9uanNcIjpcImJhYnlsb25qc1wiLFwiY29tbW9uanMyXCI6XCJiYWJ5bG9uanNcIixcImFtZFwiOlwiYmFieWxvbmpzXCJ9Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9BRERPTlMvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLWFkZG9uc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLWFkZG9uc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiQURET05TXCJdID0gZmFjdG9yeShyb290W1wiQkFCWUxPTlwiXSk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWF0aHNfbWF0aF9fKSA9PiB7XG5yZXR1cm4gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiZXhwb3J0IHR5cGUgRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudDtcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZDtcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5Q29udGFpbjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50Lm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudC5vZmZzZXRIZWlnaHRdO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4od2lkdGggLyBjaGlsZFdpZHRoLCBoZWlnaHQgLyBjaGlsZEhlaWdodCk7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7c2NhbGV9KWA7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xyXG4gICAgfSxcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5Q292ZXI6IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IHNpemluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuYWxpZ25JdGVtcyA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoc2NhbGluZ0VsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBzaXppbmdFbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBzaXppbmdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkISBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgY29uc3QgW2NoaWxkV2lkdGgsIGNoaWxkSGVpZ2h0XSA9IFtzY2FsaW5nRWxlbWVudC5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQub2Zmc2V0SGVpZ2h0XTtcclxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWF4KHdpZHRoIC8gY2hpbGRXaWR0aCwgaGVpZ2h0IC8gY2hpbGRIZWlnaHQpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgke3NjYWxlfSlgO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneVN0cmV0Y2g6IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IHNpemluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuYWxpZ25JdGVtcyA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoc2NhbGluZ0VsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBzaXppbmdFbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NhbGluZ0VsZW1lbnQgPSBzaXppbmdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkISBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgY29uc3QgW2NoaWxkV2lkdGgsIGNoaWxkSGVpZ2h0XSA9IFtzY2FsaW5nRWxlbWVudC5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQub2Zmc2V0SGVpZ2h0XTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHt3aWR0aCAvIGNoaWxkV2lkdGh9LCAke2hlaWdodCAvIGNoaWxkSGVpZ2h0fSlgO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneU5vbmU6IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHNpemluZ0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgRml0U3RyYXRlZ3kgPSB7XHJcbiAgICBDT05UQUlOOiBGaXRTdHJhdGVneUNvbnRhaW4sXHJcbiAgICBDT1ZFUjogRml0U3RyYXRlZ3lDb3ZlcixcclxuICAgIFNUUkVUQ0g6IEZpdFN0cmF0ZWd5U3RyZXRjaCxcclxuICAgIE5PTkU6IEZpdFN0cmF0ZWd5Tm9uZSxcclxufTtcclxuIiwiaW1wb3J0IHsgTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9tZXNoXCI7XHJcbmltcG9ydCB7IENyZWF0ZVBsYW5lVmVydGV4RGF0YSB9IGZyb20gXCJjb3JlL01lc2hlcy9CdWlsZGVycy9wbGFuZUJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zdGFuZGFyZE1hdGVyaWFsXCI7XHJcbmltcG9ydCB7IE1hdHJpeCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGhcIjtcclxuaW1wb3J0IHsgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgRml0U3RyYXRlZ3lUeXBlIH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuaW1wb3J0IHsgRml0U3RyYXRlZ3kgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBIVE1MIGNvbnRlbnQgdGhhdCB3ZSB3YW50IHRvIHJlbmRlciBhcyB0aG91Z2ggaXQgaXMgcGFydCBvZiB0aGUgc2NlbmUuICBUaGUgSFRNTCBjb250ZW50IGlzIGFjdHVhbGx5XHJcbiAqIHJlbmRlcmVkIGJlbG93IHRoZSBjYW52YXMsIGJ1dCBhIGRlcHRoIG1hc2sgaXMgY3JlYXRlZCBieSB0aGlzIGNsYXNzIHRoYXQgd3JpdGVzIHRvIHRoZSBkZXB0aCBidWZmZXIgYnV0IGRvZXMgbm90XHJcbiAqIHdyaXRlIHRvIHRoZSBjb2xvciBidWZmZXIsIGVmZmVjdGl2ZWx5IHB1bmNoaW5nIGEgaG9sZSBpbiB0aGUgY2FudmFzLiAgQ1NTIHRyYW5zZm9ybXMgYXJlIHVzZWQgdG8gc2NhbGUsIHRyYW5zbGF0ZSwgYW5kIHJvdGF0ZVxyXG4gKiB0aGUgSFRNTCBjb250ZW50IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgY2FtZXJhIGFuZCBtZXNoIG9yaWVudGF0aW9uLiAgVGhlIGNsYXNzIHN1cHBvcnRzIGludGVyYWN0aW9ucyBpbiBlZGl0YWJsZSBhbmQgbm9uLWVkaXRhYmxlIG1vZGUuXHJcbiAqIEluIG5vbi1lZGl0YWJsZSBtb2RlICh0aGUgZGVmYXVsdCksIGV2ZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBIVE1MIGNvbnRlbnQgd2hlbiB0aGUgcG9pbnRlciBpcyBvdmVyIHRoZSBtYXNrIChhbmQgbm90IG9jY2x1ZGVkIGJ5IG90aGVyIG1lc2hlc1xyXG4gKiBpbiB0aGUgc2NlbmUpLlxyXG4gKiBAc2VlIGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNIVkhZSkMjNVxyXG4gKiBAc2VlIGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNCMTdUQzcjMTEyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSHRtbE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuICAgIC8qKlxyXG4gICAgICogSGVscHMgaWRlbnRpZnlpbmcgYSBodG1sIG1lc2ggZnJvbSBhIHJlZ3VsYXIgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzSHRtbE1lc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3ZlcnJpZGUgdGhlIHN1cGVyIGNsYXNzJ3MgX2lzRW5hYmxlZCBwcm9wZXJ0eSBzbyB3ZSBjYW4gY29udHJvbCB3aGVuIHRoZSBtZXNoXHJcbiAgICAvLyBpcyBlbmFibGVkLiAgSS5lLiwgd2UgZG9uJ3Qgd2FudCB0byByZW5kZXIgdGhlIG1lc2ggdW50aWwgdGhlcmUgaXMgY29udGVudCB0byBzaG93LlxyXG4gICAgcHJpdmF0ZSBfZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFRoZSBtZXNoIGlzIHJlYWR5IHdoZW4gY29udGVudCBoYXMgYmVlbiBzZXQgYW5kIHRoZSBjb250ZW50IHNpemUgaGFzIGJlZW4gc2V0XHJcbiAgICAvLyBUaGUgZm9ybWVyIGlzIGRvbmUgYnkgdGhlIHVzZXIsIHRoZSBsYXR0ZXIgaXMgZG9uZSBieSB0aGUgcmVuZGVyZXIuXHJcbiAgICBwcml2YXRlIF9yZWFkeSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfaXNDYW52YXNPdmVybGF5ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX2VsZW1lbnQ/OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3dpZHRoPzogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgX2ludmVyc2VTY2FsZU1hdHJpeDogTWF0cml4IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcjogUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgX3NvdXJjZVdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX3NvdXJjZUhlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSB3aWR0aCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzb3VyY2VXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc291cmNlSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcjogYW55O1xyXG5cclxuICAgIHByaXZhdGUgX2ZpdFN0cmF0ZWd5OiBGaXRTdHJhdGVneVR5cGUgPSBGaXRTdHJhdGVneS5OT05FO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hcclxuICAgICAqIEBwYXJhbSBzY2VuZVxyXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbWVzaC4gIFdpbGwgYmUgdXNlZCBhcyB0aGUgaWQgb2YgdGhlIEhUTUwgZWxlbWVudCBhcyB3ZWxsLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IHdpdGggb3B0aW9uYWwgcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihzY2VuZTogU2NlbmUsIGlkOiBzdHJpbmcsIHsgY2FwdHVyZU9uUG9pbnRlckVudGVyID0gdHJ1ZSwgaXNDYW52YXNPdmVybGF5ID0gZmFsc2UsIGZpdFN0cmF0ZWd5ID0gRml0U3RyYXRlZ3kuTk9ORSB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihpZCwgc2NlbmUpO1xyXG5cclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIEJhaWwgaWYgd2UgYXJlbid0IHJ1bm5pbmcgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihgQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYW4gSHRtbE1lc2ggd2l0aCBpZCAke2lkfSBvdXRzaWRlIG9mIGEgYnJvd3Nlci4gIFRoZSBtZXNoIHdpbGwgbm90IGJlIHZpc2libGUuYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2ZpdFN0cmF0ZWd5ID0gZml0U3RyYXRlZ3k7XHJcbiAgICAgICAgdGhpcy5faXNDYW52YXNPdmVybGF5ID0gaXNDYW52YXNPdmVybGF5O1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZU1hc2soKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fY3JlYXRlRWxlbWVudCgpO1xyXG5cclxuICAgICAgICAvLyBTZXQgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGlzIHdpbGwgc2hvdyBhcyBzb29uIGFzIGl0J3MgcmVhZHlcclxuICAgICAgICB0aGlzLnNldEVuYWJsZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgYmVoYXZpb3IgdG8gY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvciA9IG5ldyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yKHRoaXMuY2FwdHVyZVBvaW50ZXJFdmVudHMuYmluZCh0aGlzKSwgdGhpcy5yZWxlYXNlUG9pbnRlckV2ZW50cy5iaW5kKHRoaXMpLCB7XHJcbiAgICAgICAgICAgIGNhcHR1cmVPblBvaW50ZXJFbnRlcjogdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkQmVoYXZpb3IodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEhUTUwgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkIGFzIGEgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIHRoZSBtZXNoIGhhcyBiZWVuIG1vdmVkLCByb3RhdGVkLCBvciBzY2FsZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzXHJcbiAgICAgKiBwcm9wZXJ0eSB3YXMgcmVhZC4gIFRoaXMgcHJvcGVydHkgaXMgcmVzZXQgdG8gZmFsc2UgYWZ0ZXIgcmVhZGluZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZXF1aXJlc1VwZGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZXNVcGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgY2FwdHVyZSBmb3IgdGhlIHBvaW50ZXIgd2hlbiBlbnRlcmluZyB0aGUgbWVzaCBhcmVhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY2FwdHVyZU9uUG9pbnRlckVudGVyKGNhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvci5jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcG9zZXMgb2YgdGhlIG1lc2ggYW5kIHRoZSBIVE1MIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQ/LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX21hcmtBc1VwZGF0ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IGFkanVzdGluZyB0aGUgbWVzaCBzY2FsZSB0byBtYXRjaCBhbmQgbWFraW5nIGl0IHZpc2libGUuXHJcbiAgICAgKiBJZiB0aGUgdGhlIHNwZWNpZmllZCBjb250ZW50IGlzIHVuZGVmaW5lZCwgdGhlbiBpdCB3aWxsIG1ha2UgdGhlIG1lc2ggaW52aXNpYmxlLiAgSW4gZWl0aGVyIGNhc2UgaXQgd2lsbCBjbGVhciB0aGVcclxuICAgICAqIGVsZW1lbnQgY29udGVudCBmaXJzdC5cclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbmRlciBhcyBhIG1lc2hcclxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG1lc2ggaW4gQmFieWxvbiB1bml0c1xyXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBtZXNoIGluIEJhYnlsb24gdW5pdHNcclxuICAgICAqL1xyXG4gICAgc2V0Q29udGVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICAvLyBJZiBjb250ZW50IGlzIGNoYW5nZWQsIHdlIGFyZSBubyBsb25nZXIgcmVhZHlcclxuICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gQWxzbyBpbnZhbGlkYXRlIHRoZSBzb3VyY2Ugd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIHRoaXMuX3NvdXJjZVdpZHRoID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnNjYWxpbmcuc2V0QWxsKDEpO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2ZpdFN0cmF0ZWd5LndyYXBFbGVtZW50KGVsZW1lbnQpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNjYWxlSWZOZWNlc3NhcnkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZVdpZHRoICYmIHRoaXMuc291cmNlSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldEFzUmVhZHkodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE92ZXJpZGVzIEJBQllMT04uTWVzaC5zZXRFbmFibGVkXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2V0RW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSByZXF1ZXN0ZWQgZW5hYmxlZCBzdGF0ZVxyXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBlbmFibGVkO1xyXG5cclxuICAgICAgICAvLyBJZiBkaXNhYmxpbmcgb3IgZW5hYmxpbmcgYW5kIHdlIGFyZSByZWFkeVxyXG4gICAgICAgIGlmICghZW5hYmxlZCB8fCB0aGlzLl9yZWFkeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQoZW5hYmxlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29udGVudCBzaXplIGluIHBpeGVsc1xyXG4gICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSBzb3VyY2VcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSBzb3VyY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldENvbnRlbnRTaXplUHgod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9zb3VyY2VXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZUhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50IHx8ICF0aGlzLl9lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2ZpdFN0cmF0ZWd5LnVwZGF0ZVNpemUodGhpcy5fZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZVNjYWxlSWZOZWNlc3NhcnkoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0QXNSZWFkeSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXRBc1JlYWR5KHJlYWR5OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fcmVhZHkgPSByZWFkeTtcclxuICAgICAgICBpZiAocmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKHRoaXMuX2VuYWJsZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvU2V0RW5hYmxlZChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZG9TZXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pZiBlbmFibGVkLCB0aGVuIHN0YXJ0IGxpc3RlbmluZyBmb3IgY2hhbmdlcyB0byB0aGVcclxuICAgICAgICAvLyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kIHBvc2l0aW9uLiAgb3RoZXJ3aXNlIHN0b3AgbGlzdGVuaW5nXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgIXRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlciA9IHRoaXMub25BZnRlcldvcmxkTWF0cml4VXBkYXRlT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXI/LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIGVuYWJsZWQsIHRoZW4gcmV2ZXJ0IHRoZSBjb250ZW50IGVsZW1lbnQgZGlzcGxheVxyXG4gICAgICAgIC8vIG90aGVyd2lzZSBoaWRlIGl0XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIjtcclxuICAgICAgICAvLyBDYXB0dXJlIHRoZSBjb250ZW50IHogaW5kZXhcclxuICAgICAgICB0aGlzLl9zZXRFbGVtZW50ekluZGV4KHRoaXMucG9zaXRpb24ueiAqIC0xMDAwMCk7XHJcbiAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZVNjYWxlSWZOZWNlc3NhcnkoKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBzZXRDb250ZW50IGJlZm9yZSwgdGhlIGNvbnRlbnQgc2NhbGUgaXMgYmFrZWQgaW50byB0aGUgbWVzaC4gIElmIHdlIGRvbid0IHJlc2V0IHRoZSB2ZXJ0aWNlcyB0b1xyXG4gICAgICAgIC8vIHRoZSBvcmlnaW5hbCBzaXplLCB0aGVuIHdlIHdpbGwgbXVsdGlwbHkgdGhlIHNjYWxlIHdoZW4gd2UgYmFrZSB0aGUgc2NhbGUgYmVsb3cuICBCeSBhcHBseWluZyB0aGUgaW52ZXJzZSwgd2UgYmFjayBvdXRcclxuICAgICAgICAvLyB0aGUgc2NhbGluZyB0aGF0IGhhcyBiZWVuIGRvbmUgc28gd2UgYXJlIHN0YXJ0aW5nIGZyb20gdGhlIHNhbWUgcG9pbnQuXHJcbiAgICAgICAgLy8gRmlyc3QgcmVzZXQgdGhlIHNjYWxlIHRvIDFcclxuICAgICAgICB0aGlzLnNjYWxpbmcuc2V0QWxsKDEpO1xyXG4gICAgICAgIC8vIFRoZW4gYmFjayBvdXQgdGhlIG9yaWdpbmFsIHZlcnRpY2VzIGNoYW5nZXMgdG8gbWF0Y2ggdGhlIGNvbnRlbnQgc2NhbGVcclxuICAgICAgICBpZiAodGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFrZVRyYW5zZm9ybUludG9WZXJ0aWNlcyh0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpO1xyXG4gICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIG1hdHJpeCBzbyBpdCBkb2Vzbid0IGdldCBhcHBsaWVkIGFnYWluIHVubGVzcyB3ZSBzY2FsZVxyXG4gICAgICAgICAgICB0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXggPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHNjYWxlIHRvIG1hdGNoIGNvbnRlbnQuICBOb3RlIHdlIGNhbid0IGp1c3Qgc2NhbGUgdGhlIG1lc2gsIGJlY2F1c2UgdGhhdCB3aWxsIHNjYWxlIHRoZSBjb250ZW50IGFzIHdlbGxcclxuICAgICAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZG8gaXMgY29tcHV0ZSBhIHNjYWxlIG1hdHJpeCBhbmQgdGhlbiBiYWtlIHRoYXQgaW50byB0aGUgbWVzaCB2ZXJ0aWNlcy4gIFRoaXMgd2lsbCBsZWF2ZSB0aGVcclxuICAgICAgICAvLyBtZXNoIHNjYWxlIGF0IDEsIHNvIG91ciBjb250ZW50IHdpbGwgc3RheSBpdCdzIG9yaWdpbmFsIHdpZHRoIGFuZCBoZWlnaHQgdW50aWwgd2Ugc2NhbGUgdGhlIG1lc2guXHJcbiAgICAgICAgY29uc3Qgc2NhbGVYID0gdGhpcy5fd2lkdGggfHwgMTtcclxuICAgICAgICBjb25zdCBzY2FsZVkgPSB0aGlzLl9oZWlnaHQgfHwgMTtcclxuICAgICAgICBjb25zdCBzY2FsZU1hdHJpeCA9IE1hdHJpeC5TY2FsaW5nKHNjYWxlWCwgc2NhbGVZLCAxKTtcclxuICAgICAgICB0aGlzLmJha2VUcmFuc2Zvcm1JbnRvVmVydGljZXMoc2NhbGVNYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBHZXQgYW4gaW52ZXJzZSBvZiB0aGUgc2NhbGUgbWF0cml4IHRoYXQgd2UgY2FuIHVzZSB0byBiYWNrIG91dCB0aGUgc2NhbGUgY2hhbmdlcyB3ZSBoYXZlIG1hZGUgc29cclxuICAgICAgICAvLyB3ZSBkb24ndCBtdWx0aXBseSB0aGUgc2NhbGUuXHJcbiAgICAgICAgdGhpcy5faW52ZXJzZVNjYWxlTWF0cml4ID0gbmV3IE1hdHJpeCgpO1xyXG4gICAgICAgIHNjYWxlTWF0cml4LmludmVydFRvUmVmKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVNYXNrKCkge1xyXG4gICAgICAgIGNvbnN0IHZlcnRleERhdGEgPSBDcmVhdGVQbGFuZVZlcnRleERhdGEoeyB3aWR0aDogMSwgaGVpZ2h0OiAxIH0pO1xyXG4gICAgICAgIHZlcnRleERhdGEuYXBwbHlUb01lc2godGhpcyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVwdGhNYXNrID0gbmV3IFN0YW5kYXJkTWF0ZXJpYWwoYCR7dGhpcy5pZH0tbWF0YCwgc2NlbmUpO1xyXG4gICAgICAgIGlmICghdGhpcy5faXNDYW52YXNPdmVybGF5KSB7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5iYWNrRmFjZUN1bGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmRpc2FibGVDb2xvcldyaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmRpc2FibGVMaWdodGluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gZGVwdGhNYXNrO1xyXG5cclxuICAgICAgICAvLyBPcHRpbWl6YXRpb24gLSBGcmVlemUgbWF0ZXJpYWwgc2luY2UgaXQgbmV2ZXIgbmVlZHMgdG8gY2hhbmdlXHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbC5mcmVlemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEVsZW1lbnR6SW5kZXgoekluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnpJbmRleCA9IGAke3pJbmRleH1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHVzZWQgYnkgdGhlIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgdG8gY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICovXHJcbiAgICBjYXB0dXJlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIGRvbSBjb250ZW50IHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcclxuXHJcbiAgICAgICAgLy8gU3VwcmVzcyBldmVudHMgb3V0c2lkZSBvZiB0aGUgZG9tIGNvbnRlbnRcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgdXNlZCBieSB0aGUgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB0byByZWxlYXNlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgKi9cclxuICAgIHJlbGVhc2VQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbmFibGUgcG9pbnRlciBldmVudHMgb24gY2FudmFzXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcclxuXHJcbiAgICAgICAgLy8gRGlzYWJsZSBwb2ludGVyIGV2ZW50cyBvbiBkb20gY29udGVudFxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfY3JlYXRlRWxlbWVudCgpIHtcclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIEJhaWwgaWYgd2UgYXJlbid0IHJ1bm5pbmcgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgZGl2LmlkID0gdGhpcy5pZDtcclxuICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5faXNDYW52YXNPdmVybGF5ID8gXCJ0cmFuc3BhcmVudFwiIDogXCIjMDAwXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnpJbmRleCA9IFwiMVwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBkaXYuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS5iYWNrZmFjZVZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG5cclxuICAgICAgICByZXR1cm4gZGl2O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBNYXRyaXgsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IEh0bWxNZXNoIH0gZnJvbSBcIi4vaHRtbE1lc2hcIjtcclxuaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSBcImNvcmUvQ2FtZXJhcy9jYW1lcmFcIjtcclxuaW1wb3J0IHR5cGUgeyBTdWJNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL3N1Yk1lc2hcIjtcclxuaW1wb3J0IHsgUmVuZGVyaW5nR3JvdXAgfSBmcm9tIFwiY29yZS9SZW5kZXJpbmcvcmVuZGVyaW5nR3JvdXBcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgT2JzZXJ2ZXIgfSBmcm9tIFwiY29yZS9NaXNjL29ic2VydmFibGVcIjtcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcImNvcmUvTWlzYy9sb2dnZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdEVuZ2luZSB9IGZyb20gXCJjb3JlL0VuZ2luZXNcIjtcclxuXHJcbmNvbnN0IFBvc2l0aW9uVXBkYXRlRmFpbE1lc3NhZ2UgPSBcIkZhaWxlZCB0byB1cGRhdGUgaHRtbCBtZXNoIHJlbmRlcmVyIHBvc2l0aW9uIGR1ZSB0byBmYWlsdXJlIHRvIGdldCBjYW52YXMgcmVjdC4gIEh0bWxNZXNoIGluc3RhbmNlcyBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHlcIjtcclxuY29uc3QgQmFieWxvblVuaXRzVG9QaXhlbHMgPSAxMDA7XHJcblxyXG4vKipcclxuICogQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byBzdWJtZXNoZXMgYW5kIHJldHVybnMgYSBudW1iZXIgaW5kaWNhdGluZyB3aGljaFxyXG4gKiBzaG91bGQgYmUgcmVuZGVyZWQgZmlyc3QuXHJcbiAqL1xyXG50eXBlIFJlbmRlck9yZGVyRnVuY3Rpb24gPSAoc3ViTWVzaEE6IFN1Yk1lc2gsIHN1Yk1lc2hCOiBTdWJNZXNoKSA9PiBudW1iZXI7XHJcblxyXG50eXBlIFJlbmRlckxheWVyRWxlbWVudHMgPSB7XHJcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgZG9tRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBjYW1lcmFFbGVtZW50OiBIVE1MRWxlbWVudDtcclxufTtcclxuXHJcbi8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGVuc3VyZXMgdGhhdCBIdG1sTWVzaGVzIGFyZSByZW5kZXJlZCBiZWZvcmUgYWxsIG90aGVyIG1lc2hlcy5cclxuLy8gTm90ZSB0aGlzIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIGdyb3VwIDAuXHJcbi8vIElmIG5laXRoZXIgbWVzaCBpcyBhbiBIdG1sTWVzaCwgdGhlbiB0aGUgZGVmYXVsdCByZW5kZXIgb3JkZXIgaXMgdXNlZFxyXG4vLyBUaGlzIHByZXZlbnRzIEh0bWxNZXNoZXMgZnJvbSBhcHBlYXJpbmcgaW4gZnJvbnQgb2Ygb3RoZXIgbWVzaGVzIHdoZW4gdGhleSBhcmUgYmVoaW5kIHRoZW1cclxuY29uc3QgUmVuZGVyT3JkZXJGdW5jID0gKGRlZmF1bHRSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvbik6IFJlbmRlck9yZGVyRnVuY3Rpb24gPT4ge1xyXG4gICAgcmV0dXJuIChzdWJNZXNoQTogU3ViTWVzaCwgc3ViTWVzaEI6IFN1Yk1lc2gpID0+IHtcclxuICAgICAgICBjb25zdCBtZXNoQSA9IHN1Yk1lc2hBLmdldE1lc2goKTtcclxuICAgICAgICBjb25zdCBtZXNoQiA9IHN1Yk1lc2hCLmdldE1lc2goKTtcclxuXHJcbiAgICAgICAgLy8gVXNlIHByb3BlcnR5IGNoZWNrIGluc3RlYWQgb2YgaW5zdGFuY2VvZiBzaW5jZSBpdCBpcyBsZXNzIGV4cGVuc2l2ZSBhbmRcclxuICAgICAgICAvLyB0aGlzIHdpbGwgYmUgY2FsbGVkIG1hbnkgdGltZXMgcGVyIGZyYW1lXHJcbiAgICAgICAgY29uc3QgbWVzaElzSHRtbE1lc2hBID0gKG1lc2hBIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdO1xyXG4gICAgICAgIGNvbnN0IG1lc2hJc0h0bWxNZXNoQiA9IChtZXNoQiBhcyBhbnkpW1wiaXNIdG1sTWVzaFwiXTtcclxuICAgICAgICBpZiAobWVzaElzSHRtbE1lc2hBKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZXNoSXNIdG1sTWVzaEIgPyAobWVzaEEuYWJzb2x1dGVQb3NpdGlvbi56IDw9IG1lc2hCLmFic29sdXRlUG9zaXRpb24ueiA/IDEgOiAtMSkgOiAtMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbWVzaElzSHRtbE1lc2hCID8gMSA6IGRlZmF1bHRSZW5kZXJPcmRlcihzdWJNZXNoQSwgc3ViTWVzaEIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBpcyByZXF1aXJlZCB0byByZW5kZXIgSHRtbE1lc2hlcyBpbiB0aGUgc2NlbmUuXHJcbiAqIGlmIHVzaW5nIEh0bWxNZXNoZXMsIHlvdSBtdXN0IG5vdCBzZXQgcmVuZGVyIG9yZGVyIGZvciBncm91cCAwIHVzaW5nXHJcbiAqIHNjZW5lLnNldFJlbmRlcmluZ09yZGVyLiAgWW91IG11c3QgaW5zdGVhZCBwYXNzIHRoZSBjb21wYXJlIGZ1bmN0aW9uc1xyXG4gKiB0byB0aGUgSHRtbE1lc2hSZW5kZXJlciBjb25zdHJ1Y3Rvci4gIElmIHlvdSBkbyBub3QsIHRoZW4geW91ciByZW5kZXJcclxuICogb3JkZXIgd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiB0aGUgSHRtbE1lc2hSZW5kZXJlciBpcyBjcmVhdGVkIGFmdGVyIGFuZFxyXG4gKiB0aGUgSHRtbE1lc2hlcyB3aWxsIG5vdCByZW5kZXIgY29ycmVjdGx5ICh0aGV5IHdpbGwgYXBwZWFyIGluIGZyb250IG9mXHJcbiAqIG1lc2hlcyB0aGF0IGFyZSBhY3R1YWxseSBpbiBmcm9udCBvZiB0aGVtKSBpZiB0aGUgSHRtbE1lc2hSZW5kZXJlciBpc1xyXG4gKiBjcmVhdGVkIGJlZm9yZS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBIdG1sTWVzaFJlbmRlcmVyIHtcclxuICAgIHByaXZhdGUgX2NvbnRhaW5lcklkPzogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfaW5TY2VuZUVsZW1lbnRzPzogUmVuZGVyTGF5ZXJFbGVtZW50cyB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9vdmVybGF5RWxlbWVudHM/OiBSZW5kZXJMYXllckVsZW1lbnRzIHwgbnVsbDtcclxuICAgIHByaXZhdGUgX2VuZ2luZTogQWJzdHJhY3RFbmdpbmU7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2FjaGUgPSB7XHJcbiAgICAgICAgY2FtZXJhRGF0YTogeyBmb3Y6IDAsIHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLCBzdHlsZTogXCJcIiB9LFxyXG4gICAgICAgIGh0bWxNZXNoRGF0YTogbmV3IFdlYWtNYXA8b2JqZWN0LCB7IHN0eWxlOiBzdHJpbmcgfT4oKSxcclxuICAgIH07XHJcbiAgICBwcml2YXRlIF93aWR0aCA9IDA7XHJcbiAgICBwcml2YXRlIF9oZWlnaHQgPSAwO1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0SGFsZiA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhV29ybGRNYXRyaXg/OiBNYXRyaXg7XHJcblxyXG4gICAgLy8gQ3JlYXRlIHNvbWUgcmVmcyB0byBhdm9pZCBjcmVhdGluZyBuZXcgb2JqZWN0cyBldmVyeSBmcmFtZVxyXG4gICAgcHJpdmF0ZSBfdGVtcCA9IHtcclxuICAgICAgICBzY2FsZVRyYW5zZm9ybTogbmV3IFZlY3RvcjMoKSxcclxuICAgICAgICByb3RhdGlvblRyYW5zZm9ybTogbmV3IFF1YXRlcm5pb24oKSxcclxuICAgICAgICBwb3NpdGlvblRyYW5zZm9ybTogbmV3IFZlY3RvcjMoKSxcclxuICAgICAgICBvYmplY3RNYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVdvcmxkTWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFSb3RhdGlvbk1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhV29ybGRNYXRyaXhBc0FycmF5OiBuZXcgQXJyYXkoMTYpLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBLZWVwIHRyYWNrIG9mIERQUiBzbyB3ZSBjYW4gcmVzaXplIGlmIERQUiBjaGFuZ2VzXHJcbiAgICAvLyBPdGhlcndpc2UgdGhlIERPTSBjb250ZW50IHdpbGwgc2NhbGUsIGJ1dCB0aGUgbWVzaCB3b24ndFxyXG4gICAgcHJpdmF0ZSBfbGFzdERldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuXHJcbiAgICAvLyBLZWVwIHRyYWNrIG9mIGNhbWVyYSBtYXRyaXggY2hhbmdlcyBzbyB3ZSBvbmx5IHVwZGF0ZSB0aGVcclxuICAgIC8vIERPTSBlbGVtZW50IHN0eWxlcyB3aGVuIG5lY2Vzc2FyeVxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhTWF0cml4VXBkYXRlZCA9IHRydWU7XHJcblxyXG4gICAgLy8gS2VlcCB0cmFjayBvZiBwb3NpdGlvbiBjaGFuZ2VzIHNvIHdlIG9ubHkgdXBkYXRlIHRoZSBET00gZWxlbWVudFxyXG4gICAgLy8gc3R5bGVzIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICBwcml2YXRlIF9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24gPSB7XHJcbiAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgIGxlZnQ6IDAsXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgX3JlbmRlck9ic2VydmVyOiBPYnNlcnZlcjxTY2VuZT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRydWN0IGFuIGluc3RhbmNlIG9mIEh0bWxNZXNoUmVuZGVyZXJcclxuICAgICAqIEBwYXJhbSBzY2VuZVxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwcm9wZXJ0aWVzOlxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgc2NlbmU6IFNjZW5lLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVySWQgPSBudWxsLFxyXG4gICAgICAgICAgICBfY29udGFpbmVySWQgPSBcImNzcy1jb250YWluZXJcIixcclxuICAgICAgICAgICAgZW5hYmxlT3ZlcmxheVJlbmRlciA9IHRydWUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlciA9IFJlbmRlcmluZ0dyb3VwLlBhaW50ZXJTb3J0Q29tcGFyZSxcclxuICAgICAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuUGFpbnRlclNvcnRDb21wYXJlLFxyXG4gICAgICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlciA9IFJlbmRlcmluZ0dyb3VwLmRlZmF1bHRUcmFuc3BhcmVudFNvcnRDb21wYXJlLFxyXG4gICAgICAgIH06IHtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVySWQ/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgICAgICAgICBfY29udGFpbmVySWQ/OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlcj86IFJlbmRlck9yZGVyRnVuY3Rpb247XHJcbiAgICAgICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcj86IFJlbmRlck9yZGVyRnVuY3Rpb247XHJcbiAgICAgICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZW5hYmxlT3ZlcmxheVJlbmRlcj86IGJvb2xlYW47XHJcbiAgICAgICAgfSA9IHt9XHJcbiAgICApIHtcclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIE9ubHkgaW5pdCBpZiB3ZSBhcmUgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lcklkID0gX2NvbnRhaW5lcklkO1xyXG4gICAgICAgIHRoaXMuX2luaXQoc2NlbmUsIHBhcmVudENvbnRhaW5lcklkLCBlbmFibGVPdmVybGF5UmVuZGVyLCBkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIsIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlciwgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcG9zZSBvZiB0aGUgSHRtbE1lc2hSZW5kZXJlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVuZGVyT2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlck9ic2VydmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuX292ZXJsYXlFbGVtZW50cyA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX2luU2NlbmVFbGVtZW50cz8uY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuX2luU2NlbmVFbGVtZW50cyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbml0KFxyXG4gICAgICAgIHNjZW5lOiBTY2VuZSxcclxuICAgICAgICBwYXJlbnRDb250YWluZXJJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyOiBib29sZWFuLFxyXG4gICAgICAgIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvbixcclxuICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXI6IFJlbmRlck9yZGVyRnVuY3Rpb24sXHJcbiAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXI6IFJlbmRlck9yZGVyRnVuY3Rpb25cclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgT25seSBpbml0IGlmIHdlIGFyZSBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NIGNvbnRhaW5lcnNcclxuICAgICAgICBsZXQgcGFyZW50Q29udGFpbmVyID0gcGFyZW50Q29udGFpbmVySWQgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnRDb250YWluZXJJZCkgOiBkb2N1bWVudC5ib2R5O1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIGNvbnRhaW5lciBhbHJlYWR5IGV4aXN0cywgdGhlbiByZW1vdmUgaXRcclxuICAgICAgICBjb25zdCBpblNjZW5lQ29udGFpbmVySWQgPSBgJHt0aGlzLl9jb250YWluZXJJZH1faW5fc2NlbmVgO1xyXG4gICAgICAgIHRoaXMuX2luU2NlbmVFbGVtZW50cyA9IHRoaXMuX2NyZWF0ZVJlbmRlckxheWVyRWxlbWVudHMoaW5TY2VuZUNvbnRhaW5lcklkKTtcclxuXHJcbiAgICAgICAgcGFyZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLl9pblNjZW5lRWxlbWVudHMuY29udGFpbmVyLCBwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmIChlbmFibGVPdmVybGF5UmVuZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlDb250YWluZXJJZCA9IGAke3RoaXMuX2NvbnRhaW5lcklkfV9vdmVybGF5YDtcclxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzID0gdGhpcy5fY3JlYXRlUmVuZGVyTGF5ZXJFbGVtZW50cyhvdmVybGF5Q29udGFpbmVySWQpO1xyXG4gICAgICAgICAgICBjb25zdCB6SW5kZXggPSArKHNjZW5lLmdldEVuZ2luZSgpLmdldFJlbmRlcmluZ0NhbnZhcygpIS5zdHlsZS56SW5kZXggPz8gXCIwXCIpICsgMTtcclxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBgJHt6SW5kZXh9YDtcclxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzLmNvbnRhaW5lci5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5fb3ZlcmxheUVsZW1lbnRzLmNvbnRhaW5lciwgcGFyZW50Q29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9lbmdpbmUgPSBzY2VuZS5nZXRFbmdpbmUoKTtcclxuICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgICAgICBpZiAoIWNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBjbGllbnQgcmVjdCBmb3IgcmVuZGVyaW5nIGNhbnZhc1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgc2l6ZSBhbmQgcmVzaXplIGJlaGF2aW9yXHJcbiAgICAgICAgdGhpcy5fc2V0U2l6ZShjbGllbnRSZWN0LndpZHRoLCBjbGllbnRSZWN0LmhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VuZ2luZS5vblJlc2l6ZU9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpZW50UmVjdCA9IHRoaXMuX2VuZ2luZS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGlmIChjbGllbnRSZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRTaXplKGNsaWVudFJlY3Qud2lkdGgsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgcHJvamVjdGlvbk9iczogT2JzZXJ2ZXI8Q2FtZXJhPjtcclxuICAgICAgICBsZXQgbWF0cml4T2JzOiBPYnNlcnZlcjxDYW1lcmE+O1xyXG5cclxuICAgICAgICBjb25zdCBvYnNlcnZlQ2FtZXJhID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYW1lcmEgPSBzY2VuZS5hY3RpdmVDYW1lcmE7XHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEpIHtcclxuICAgICAgICAgICAgICAgIHByb2plY3Rpb25PYnMgPSBjYW1lcmEub25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZE9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNhbWVyYU1hdHJpeENoYW5nZWQoY2FtZXJhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgbWF0cml4T2JzID0gY2FtZXJhLm9uVmlld01hdHJpeENoYW5nZWRPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DYW1lcmFNYXRyaXhDaGFuZ2VkKGNhbWVyYSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG9ic2VydmVDYW1lcmEoKTtcclxuXHJcbiAgICAgICAgc2NlbmUub25BY3RpdmVDYW1lcmFDaGFuZ2VkLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uT2JzKSB7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS5hY3RpdmVDYW1lcmE/Lm9uUHJvamVjdGlvbk1hdHJpeENoYW5nZWRPYnNlcnZhYmxlLnJlbW92ZShwcm9qZWN0aW9uT2JzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWF0cml4T2JzKSB7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS5hY3RpdmVDYW1lcmE/Lm9uVmlld01hdHJpeENoYW5nZWRPYnNlcnZhYmxlLnJlbW92ZShtYXRyaXhPYnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9ic2VydmVDYW1lcmEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBIdG1sTWVzaGVzIGFyZSByZW5kZXJlZCBiZWZvcmUgYWxsIG90aGVyIG1lc2hlc1xyXG4gICAgICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBhcHBlYXIgaW4gZnJvbnQgb2YgbWVzaGVzIHRoYXQgYXJlIGFjdHVhbGx5IGluIGZyb250IG9mIHRoZW1cclxuICAgICAgICAvLyBVcGRhdGluZyB0aGUgcmVuZGVyIG9yZGVyIGlzbid0IGlkZWFsLCBidXQgaXQgaXMgdGhlIG9ubHkgd2F5IHRvIGFjaGVpdmUgdGhpc1xyXG4gICAgICAgIC8vIFRoZSBpbXBsaWNhdGlvbiBpcyB0aGF0IGFuIGFwcCB1c2luZyB0aGUgSHRtbE1lc2hSZW5kZXJlZCBtdXN0IHNldCB0aGUgc2NlbmUgcmVuZGVyIG9yZGVyXHJcbiAgICAgICAgLy8gdmlhIHRoZSBIdG1sTWVzaFJlbmRlcmVkIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgY29uc3Qgb3BhcXVlUmVuZGVyT3JkZXIgPSBSZW5kZXJPcmRlckZ1bmMoZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyKTtcclxuICAgICAgICBjb25zdCBhbHBoYVRlc3RSZW5kZXJPcmRlciA9IFJlbmRlck9yZGVyRnVuYyhkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zcGFyZW50UmVuZGVyT3JkZXIgPSBSZW5kZXJPcmRlckZ1bmMoZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIHNjZW5lLnNldFJlbmRlcmluZ09yZGVyKDAsIG9wYXF1ZVJlbmRlck9yZGVyLCBhbHBoYVRlc3RSZW5kZXJPcmRlciwgdHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlbmRlck9ic2VydmVyID0gc2NlbmUub25CZWZvcmVSZW5kZXJPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcihzY2VuZSwgc2NlbmUuYWN0aXZlQ2FtZXJhIGFzIENhbWVyYSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlUmVuZGVyTGF5ZXJFbGVtZW50cyhjb250YWluZXJJZDogc3RyaW5nKTogUmVuZGVyTGF5ZXJFbGVtZW50cyB7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJJZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nQ29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGNvbnRhaW5lci5pZCA9IGNvbnRhaW5lcklkO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFwiLTFcIjtcclxuXHJcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgZG9tRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBjYW1lcmFFbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybVN0eWxlID0gXCJwcmVzZXJ2ZS0zZFwiO1xyXG4gICAgICAgIGNhbWVyYUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtU3R5bGUgPSBcInByZXNlcnZlLTNkXCI7XHJcblxyXG4gICAgICAgIGNhbWVyYUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG5cclxuICAgICAgICBkb21FbGVtZW50LmFwcGVuZENoaWxkKGNhbWVyYUVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkb21FbGVtZW50KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb250YWluZXIsXHJcbiAgICAgICAgICAgIGRvbUVsZW1lbnQsXHJcbiAgICAgICAgICAgIGNhbWVyYUVsZW1lbnQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldFNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5fd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5faGVpZ2h0LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0SGFsZiA9IHRoaXMuX2hlaWdodCAvIDI7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faW5TY2VuZUVsZW1lbnRzIHx8ICF0aGlzLl9vdmVybGF5RWxlbWVudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudHMgPSBbdGhpcy5faW5TY2VuZUVsZW1lbnRzLmRvbUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cy5kb21FbGVtZW50LCB0aGlzLl9pblNjZW5lRWxlbWVudHMuY2FtZXJhRWxlbWVudCwgdGhpcy5fb3ZlcmxheUVsZW1lbnRzLmNhbWVyYUVsZW1lbnRdO1xyXG4gICAgICAgIGZvciAoY29uc3QgZG9tIG9mIGRvbUVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChkb20pIHtcclxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxyXG4gICAgcHJvdGVjdGVkIF9nZXRDYW1lcmFDc3NNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWF0cml4Lm07XHJcbiAgICAgICAgcmV0dXJuIGBtYXRyaXgzZCgke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1swXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzJdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbN10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s5XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEyXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzEzXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTVdIClcclxuICAgICAgICB9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udmVydCBhIEJhYnlsb24gd29ybGQgbWF0cml4IHRvIGEgQ1NTIG1hdHJpeFxyXG4gICAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgY29udmVyc2lvbiBmcm9tIEJKUyBsZWZ0IGhhbmRlZCBjb29yZHNcclxuICAgIC8vIHRvIENTUyByaWdodCBoYW5kZWQgY29vcmRzXHJcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcclxuICAgIHByb3RlY3RlZCBfZ2V0SHRtbENvbnRlbnRDc3NNYXRyaXgobWF0cml4OiBNYXRyaXgsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG1hdHJpeC5tO1xyXG4gICAgICAgIC8vIEluIGEgcmlnaHQgaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLCB0aGUgZWxlbWVudHMgMTEgdG8gMTQgaGF2ZSB0byBjaGFuZ2UgdGhlaXIgZGlyZWN0aW9uXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAtMSA6IDE7XHJcbiAgICAgICAgY29uc3QgbWF0cml4M2QgPSBgbWF0cml4M2QoJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMl0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s1XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s2XSAgKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s3XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s4XSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOV0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEwXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMV0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTJdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEzXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNF0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTVdIClcclxuICAgICAgICB9KWA7XHJcbiAgICAgICAgcmV0dXJuIG1hdHJpeDNkO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoaHRtbE1lc2g6IEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbik6IE1hdHJpeCB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBjYW1lcmEgd29ybGQgbWF0cml4XHJcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjYW1lcmEgd29ybGQgbWF0cml4IGlzIHVwIHRvIGRhdGVcclxuICAgICAgICBpZiAoIXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4ID0gaHRtbE1lc2guZ2V0U2NlbmUoKS5hY3RpdmVDYW1lcmE/LmdldFdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdHJpeC5JZGVudGl0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgb2JqZWN0V29ybGRNYXRyaXggPSBodG1sTWVzaC5nZXRXb3JsZE1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvLyBTY2FsZSB0aGUgb2JqZWN0IG1hdHJpeCBieSB0aGUgYmFzZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBtZXNoXHJcbiAgICAgICAgLy8gd2hpY2ggaXMgdGhlIHJhdGlvIG9mIHRoZSBtZXNoIHdpZHRoL2hlaWdodCB0byB0aGUgcmVuZGVyZXJcclxuICAgICAgICAvLyB3aWR0aC9oZWlnaHQgZGl2aWRlZCBieSB0aGUgYmFieWxvbiB1bml0cyB0byBwaXhlbHMgcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGhTY2FsZUZhY3RvciA9IDE7XHJcbiAgICAgICAgbGV0IGhlaWdodFNjYWxlRmFjdG9yID0gMTtcclxuICAgICAgICBpZiAoaHRtbE1lc2guc291cmNlV2lkdGggJiYgaHRtbE1lc2guc291cmNlSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHdpZHRoU2NhbGVGYWN0b3IgPSBodG1sTWVzaC53aWR0aCEgLyAoaHRtbE1lc2guc291cmNlV2lkdGggLyBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgICAgIGhlaWdodFNjYWxlRmFjdG9yID0gaHRtbE1lc2guaGVpZ2h0ISAvIChodG1sTWVzaC5zb3VyY2VIZWlnaHQgLyBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBcHBseSB0aGUgc2NhbGUgdG8gdGhlIG9iamVjdCdzIHdvcmxkIG1hdHJpeC4gIE5vdGUgd2UgYXJlbid0IHNjYWxpbmdcclxuICAgICAgICAvLyB0aGUgb2JqZWN0LCBqdXN0IGdldHRpbmcgYSBtYXRyaXggYXMgdGhvdWdoIGl0IHdlcmUgc2NhbGVkLCBzbyB3ZSBjYW5cclxuICAgICAgICAvLyBzY2FsZSB0aGUgY29udGVudFxyXG4gICAgICAgIGNvbnN0IHNjYWxlVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5zY2FsZVRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCByb3RhdGlvblRyYW5zZm9ybSA9IHRoaXMuX3RlbXAucm90YXRpb25UcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25UcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnBvc2l0aW9uVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXggPSB0aGlzLl90ZW1wLm9iamVjdE1hdHJpeDtcclxuXHJcbiAgICAgICAgb2JqZWN0V29ybGRNYXRyaXguZGVjb21wb3NlKHNjYWxlVHJhbnNmb3JtLCByb3RhdGlvblRyYW5zZm9ybSwgcG9zaXRpb25UcmFuc2Zvcm0pO1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtLnggKj0gd2lkdGhTY2FsZUZhY3RvcjtcclxuICAgICAgICBzY2FsZVRyYW5zZm9ybS55ICo9IGhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgICAgICBNYXRyaXguQ29tcG9zZVRvUmVmKHNjYWxlVHJhbnNmb3JtLCByb3RhdGlvblRyYW5zZm9ybSwgcG9zaXRpb25UcmFuc2Zvcm0sIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3QgZGlyZWN0aW9uIG9mIDEyIGFuZCAxMyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGJhc2VkIG9uIHRoZSBoYW5kZWRuZXNzIG9mIHRoZSBzeXN0ZW1cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IC0xIDogMTtcclxuICAgICAgICAvLyBBZGp1c3QgdHJhbnNsYXRpb24gdmFsdWVzIHRvIGJlIGZyb20gY2FtZXJhIHZzIHdvcmxkIG9yaWdpblxyXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgYWxzbyBhZGp1c3RpbmcgdGhlc2UgdmFsdWVzIHRvIGJlIHBpeGVscyB2cyBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBodG1sTWVzaC5nZXRBYnNvbHV0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5zZXRSb3dGcm9tRmxvYXRzKFxyXG4gICAgICAgICAgICAzLFxyXG4gICAgICAgICAgICAoLXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTJdICsgcG9zaXRpb24ueCkgKiBCYWJ5bG9uVW5pdHNUb1BpeGVscyAqIGRpcmVjdGlvbixcclxuICAgICAgICAgICAgKC10aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzEzXSArIHBvc2l0aW9uLnkpICogQmFieWxvblVuaXRzVG9QaXhlbHMgKiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICh0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzE0XSAtIHBvc2l0aW9uLnopICogQmFieWxvblVuaXRzVG9QaXhlbHMsXHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTVdICogMC4wMDAwMSAqIEJhYnlsb25Vbml0c1RvUGl4ZWxzXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IG90aGVyIHZhbHVlcyB0byBiZSBwaXhlbHMgdnMgQmFieWxvbiB1bml0c1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDMsIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCg3LCBCYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoMTEsIEJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZW5kZXJIdG1sTWVzaChodG1sTWVzaDogSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCFodG1sTWVzaC5lbGVtZW50IHx8ICFodG1sTWVzaC5lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XHJcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gcmVuZGVyLCBzbyBiYWlsXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIGh0bWwgbWVzaCBkYXRhIGlzIGluaXRpYWxpemVkIGJlZm9yZVxyXG4gICAgICAgIC8vIGNvbXB1dGluZyB0aGUgYmFzZSBzY2FsZSBmYWN0b3JcclxuICAgICAgICBsZXQgaHRtbE1lc2hEYXRhID0gdGhpcy5fY2FjaGUuaHRtbE1lc2hEYXRhLmdldChodG1sTWVzaCk7XHJcbiAgICAgICAgaWYgKCFodG1sTWVzaERhdGEpIHtcclxuICAgICAgICAgICAgaHRtbE1lc2hEYXRhID0geyBzdHlsZTogXCJcIiB9O1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5odG1sTWVzaERhdGEuc2V0KGh0bWxNZXNoLCBodG1sTWVzaERhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGh0bWxNZXNoLl9pc0NhbnZhc092ZXJsYXkgPyB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNhbWVyYUVsZW1lbnQgOiB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNhbWVyYUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChodG1sTWVzaC5lbGVtZW50LnBhcmVudE5vZGUgIT09IGNhbWVyYUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCEuYXBwZW5kQ2hpbGQoaHRtbE1lc2guZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgaHRtbE1lc2ggY29udGVudCBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBiYXNlIHNjYWxlIGZhY3RvclxyXG4gICAgICAgIGlmIChodG1sTWVzaC5yZXF1aXJlc1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVCYXNlU2NhbGVGYWN0b3IoaHRtbE1lc2gpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZm9yIHRoZSBodG1sIG1lc2hcclxuICAgICAgICBjb25zdCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4ID0gdGhpcy5fZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoaHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKTtcclxuXHJcbiAgICAgICAgbGV0IHN0eWxlID0gYHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSAke3RoaXMuX2dldEh0bWxDb250ZW50Q3NzTWF0cml4KHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKX1gO1xyXG4gICAgICAgIC8vIEluIGEgcmlnaHQgaGFuZGVkIHN5c3RlbSwgc2NyZWVucyBhcmUgb24gdGhlIHdyb25nIHNpZGUgb2YgdGhlIG1lc2gsIHNvIHdlIGhhdmUgdG8gcm90YXRlIGJ5IE1hdGguUEkgd2hpY2ggcmVzdWx0cyBpbiB0aGUgbWF0cml4M2Qgc2VlbiBiZWxvd1xyXG4gICAgICAgIHN0eWxlICs9IGAke3VzZVJpZ2h0SGFuZGVkU3lzdGVtID8gXCJtYXRyaXgzZCgtMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgLTEsIDAsIDAsIDAsIDAsIDEpXCIgOiBcIlwifWA7XHJcblxyXG4gICAgICAgIGlmIChodG1sTWVzaERhdGEuc3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoLmVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sTWVzaC5fbWFya0FzVXBkYXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcmVuZGVyKHNjZW5lOiBTY2VuZSwgY2FtZXJhOiBDYW1lcmEpIHtcclxuICAgICAgICBsZXQgbmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPSBzY2VuZS51c2VSaWdodEhhbmRlZFN5c3RlbTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgcG9zaXRpb24gYW5kIHNpemUgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVyUG9zaXRpb25JZk5lZWRlZCgpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBmb3IgYSBjYW1lcmEgY2hhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY2FtZXJhIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLCB0aGVuIHdlIGFsc28gbmVlZCB0byB1cGRhdGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi54ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnggfHxcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnkgIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24ueSB8fFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueiAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi56XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24uY29weUZyb20oY2FtZXJhLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHByIGNoYW5nZVxyXG4gICAgICAgIGlmICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAhPT0gdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8pIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgTG9nZ2VyLkxvZyhcIkluIHJlbmRlciAtIGRwciBjaGFuZ2VkOiBcIiwgdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8pO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgbWVzaGVzIG5lZWQgdG8gYmUgdXBkYXRlZFxyXG4gICAgICAgIGNvbnN0IG1lc2hlc05lZWRpbmdVcGRhdGUgPSBzY2VuZS5tZXNoZXMuZmlsdGVyKChtZXNoKSA9PiAobWVzaCBhcyBhbnkpW1wiaXNIdG1sTWVzaFwiXSAmJiAobmVlZHNVcGRhdGUgfHwgKG1lc2ggYXMgSHRtbE1lc2gpLnJlcXVpcmVzVXBkYXRlKSk7XHJcbiAgICAgICAgbmVlZHNVcGRhdGUgPSBuZWVkc1VwZGF0ZSB8fCBtZXNoZXNOZWVkaW5nVXBkYXRlLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGlmICghbmVlZHNVcGRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IGEgcHJvamVjdGlvbiBtYXRyaXggZm9yIHRoZSBjYW1lcmFcclxuICAgICAgICBjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLmdldFByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgICBjb25zdCBmb3YgPSBwcm9qZWN0aW9uTWF0cml4Lm1bNV0gKiB0aGlzLl9oZWlnaHRIYWxmO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5mb3YgIT09IGZvdikge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5kb21FbGVtZW50LCB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmRvbUVsZW1lbnRdO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLm1vZGUgPT0gQ2FtZXJhLlBFUlNQRUNUSVZFX0NBTUVSQSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUud2Via2l0UGVyc3BlY3RpdmUgPSBmb3YgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnBlcnNwZWN0aXZlID0gZm92ICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFBlcnNwZWN0aXZlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucGVyc3BlY3RpdmUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLmZvdiA9IGZvdjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgQ1NTIG1hdHJpeCBmb3IgdGhlIGNhbWVyYSAod2hpY2ggd2lsbCBpbmNsdWRlIGFueSBjYW1lcmEgcm90YXRpb24pXHJcbiAgICAgICAgaWYgKGNhbWVyYS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY2FtZXJhLmNvbXB1dGVXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhTWF0cml4V29ybGQgPSB0aGlzLl90ZW1wLmNhbWVyYVdvcmxkTWF0cml4O1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkLmNvcHlGcm9tKGNhbWVyYS5nZXRXb3JsZE1hdHJpeCgpKTtcclxuICAgICAgICBjb25zdCBjYW1lcmFSb3RhdGlvbk1hdHJpeCA9IHRoaXMuX3RlbXAuY2FtZXJhUm90YXRpb25NYXRyaXg7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuZ2V0Um90YXRpb25NYXRyaXgoKS50cmFuc3Bvc2VUb1JlZihjYW1lcmFSb3RhdGlvbk1hdHJpeCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheSA9IHRoaXMuX3RlbXAuY2FtZXJhV29ybGRNYXRyaXhBc0FycmF5O1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkLmNvcHlUb0FycmF5KGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheSk7XHJcblxyXG4gICAgICAgIC8vIEZvciBhIGZldyB2YWx1ZXMsIHdlIGhhdmUgdG8gYWRqdXN0IHRoZSBkaXJlY3Rpb24gYmFzZWQgb24gdGhlIGhhbmRlZG5lc3Mgb2YgdGhlIHN5c3RlbVxyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID8gMSA6IC0xO1xyXG5cclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbMV0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzFdO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVsyXSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bMl0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzRdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs0XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbNl0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzZdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs4XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bOF0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzldID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs5XSAqIGRpcmVjdGlvbjtcclxuXHJcbiAgICAgICAgTWF0cml4LkZyb21BcnJheVRvUmVmKGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheSwgMCwgY2FtZXJhTWF0cml4V29ybGQpO1xyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFDU1NNYXRyaXggPSB0aGlzLl9nZXRDYW1lcmFDc3NNYXRyaXgoY2FtZXJhTWF0cml4V29ybGQpO1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gY2FtZXJhQ1NTTWF0cml4O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5zdHlsZSAhPT0gc3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gW3RoaXMuX2luU2NlbmVFbGVtZW50cz8uY2FtZXJhRWxlbWVudCwgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50XTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuc3R5bGUgPSBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIF9SZW5kZXIgb2JqZWN0cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICBmb3IgKGNvbnN0IG1lc2ggb2YgbWVzaGVzTmVlZGluZ1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJIdG1sTWVzaChtZXNoIGFzIEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlQmFzZVNjYWxlRmFjdG9yKGh0bWxNZXNoOiBIdG1sTWVzaCkge1xyXG4gICAgICAgIC8vIEdldCBzY3JlZW4gd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIGxldCBzY3JlZW5XaWR0aCA9IHRoaXMuX3dpZHRoO1xyXG4gICAgICAgIGxldCBzY3JlZW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBhc3BlY3QgcmF0aW9zXHJcbiAgICAgICAgY29uc3QgaHRtbE1lc2hBc3BlY3RSYXRpbyA9IChodG1sTWVzaC53aWR0aCB8fCAxKSAvIChodG1sTWVzaC5oZWlnaHQgfHwgMSk7XHJcbiAgICAgICAgY29uc3Qgc2NyZWVuQXNwZWN0UmF0aW8gPSBzY3JlZW5XaWR0aCAvIHNjcmVlbkhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IHNjcmVlbiBkaW1lbnNpb25zIGJhc2VkIG9uIGFzcGVjdCByYXRpb3NcclxuICAgICAgICBpZiAoaHRtbE1lc2hBc3BlY3RSYXRpbyA+IHNjcmVlbkFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBIVE1MIG1lc2ggaXMgd2lkZXIgcmVsYXRpdmUgdG8gaXRzIGhlaWdodCB0aGFuIHRoZSBzY3JlZW4sIGFkanVzdCB0aGUgc2NyZWVuIHdpZHRoXHJcbiAgICAgICAgICAgIHNjcmVlbldpZHRoID0gc2NyZWVuSGVpZ2h0ICogaHRtbE1lc2hBc3BlY3RSYXRpbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgSFRNTCBtZXNoIGlzIHRhbGxlciByZWxhdGl2ZSB0byBpdHMgd2lkdGggdGhhbiB0aGUgc2NyZWVuLCBhZGp1c3QgdGhlIHNjcmVlbiBoZWlnaHRcclxuICAgICAgICAgICAgc2NyZWVuSGVpZ2h0ID0gc2NyZWVuV2lkdGggLyBodG1sTWVzaEFzcGVjdFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IGNvbnRlbnQgdG8gZmlsbCBzY3JlZW4gc28gd2UgZ2V0IG1heCByZXNvbHV0aW9uIHdoZW4gaXQgaXMgc2hydW5rIHRvIGZpdCB0aGUgbWVzaFxyXG4gICAgICAgIGh0bWxNZXNoLnNldENvbnRlbnRTaXplUHgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVDb250YWluZXJQb3NpdGlvbklmTmVlZGVkKCkge1xyXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgY2FudmFzIGhhcyBtb3ZlZCBvbiB0aGUgc2NyZWVuXHJcbiAgICAgICAgY29uc3QgY2FudmFzUmVjdCA9IHRoaXMuX2VuZ2luZS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIC8vIGNhbnZhcyByZWN0IG1heSBiZSBudWxsIGlmIGxheW91dCBub3QgY29tcGxldGVcclxuICAgICAgICBpZiAoIWNhbnZhc1JlY3QpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oUG9zaXRpb25VcGRhdGVGYWlsTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gd2luZG93LnNjcm9sbFk7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHdpbmRvdy5zY3JvbGxYO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0RvY3VtZW50VG9wID0gY2FudmFzUmVjdC50b3AgKyBzY3JvbGxUb3A7XHJcbiAgICAgICAgY29uc3QgY2FudmFzRG9jdW1lbnRMZWZ0ID0gY2FudmFzUmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi50b3AgIT09IGNhbnZhc0RvY3VtZW50VG9wIHx8IHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi5sZWZ0ICE9PSBjYW52YXNEb2N1bWVudExlZnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLnRvcCA9IGNhbnZhc0RvY3VtZW50VG9wO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24ubGVmdCA9IGNhbnZhc0RvY3VtZW50TGVmdDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNvbnRhaW5lciwgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jb250YWluZXJdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHRvcCBhbmQgbGVmdCBvZiB0aGUgY3NzIGNvbnRhaW5lciB0byBtYXRjaCB0aGUgY2FudmFzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJQYXJlbnQgPSBjb250YWluZXIub2Zmc2V0UGFyZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UmVjdCA9IGNvbnRhaW5lclBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERvY3VtZW50VG9wID0gcGFyZW50UmVjdC50b3AgKyBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREb2N1bWVudExlZnQgPSBwYXJlbnRSZWN0LmxlZnQgKyBzY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcgPSB0aGlzLl9nZXRBbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nKGNvbnRhaW5lclBhcmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBib2R5IG1hcmdpblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5TWFyZ2luVG9wID0gcGFyc2VJbnQoYm9keVN0eWxlLm1hcmdpblRvcCwgMTApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keU1hcmdpbkxlZnQgPSBwYXJzZUludChib2R5U3R5bGUubWFyZ2luTGVmdCwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHtjYW52YXNEb2N1bWVudFRvcCAtIHBhcmVudERvY3VtZW50VG9wIC0gYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZy5tYXJnaW5Ub3AgKyBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLnBhZGRpbmdUb3AgKyBib2R5TWFyZ2luVG9wfXB4YDtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzRG9jdW1lbnRMZWZ0IC0gcGFyZW50RG9jdW1lbnRMZWZ0IC0gYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZy5tYXJnaW5MZWZ0ICsgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZy5wYWRkaW5nTGVmdCArIGJvZHlNYXJnaW5MZWZ0XHJcbiAgICAgICAgICAgICAgICB9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb25DYW1lcmFNYXRyaXhDaGFuZ2VkID0gKGNhbWVyYTogQ2FtZXJhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY2FtZXJhV29ybGRNYXRyaXggPSBjYW1lcmEuZ2V0V29ybGRNYXRyaXgoKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFNYXRyaXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfZXBzaWxvbih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKSA8IDFlLTEwID8gMCA6IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCB0b3RhbCBtYXJnaW5zIGFuZCBwYWRkaW5nIGZvciBhbiBlbGVtZW50LCBleGNsdWRpbmcgdGhlIGJvZHkgYW5kIGRvY3VtZW50IG1hcmdpbnNcclxuICAgIHByaXZhdGUgX2dldEFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBsZXQgbWFyZ2luVG9wID0gMDtcclxuICAgICAgICBsZXQgbWFyZ2luTGVmdCA9IDA7XHJcbiAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSAwO1xyXG4gICAgICAgIGxldCBwYWRkaW5nTGVmdCA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIG1hcmdpblRvcCArPSBwYXJzZUludChzdHlsZS5tYXJnaW5Ub3AsIDEwKTtcclxuICAgICAgICAgICAgbWFyZ2luTGVmdCArPSBwYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0LCAxMCk7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3AgKz0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCwgMTApO1xyXG4gICAgICAgICAgICBwYWRkaW5nTGVmdCArPSBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCwgMTApO1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBtYXJnaW5Ub3AsIG1hcmdpbkxlZnQsIHBhZGRpbmdUb3AsIHBhZGRpbmdMZWZ0IH07XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSHRtbE1lc2hSZW5kZXJlciB9IGZyb20gXCIuL2h0bWxNZXNoUmVuZGVyZXJcIjtcclxuaW1wb3J0IHsgSHRtbE1lc2ggfSBmcm9tIFwiLi9odG1sTWVzaFwiO1xyXG5pbXBvcnQgeyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5pbXBvcnQgeyBGaXRTdHJhdGVneSB9IGZyb20gXCIuL2ZpdFN0cmF0ZWd5XCI7XHJcblxyXG4vLyBFeHBvcnQgcHVibGljIGNsYXNzZXMgYW5kIGZ1bmN0aW9uc1xyXG5leHBvcnQgeyBIdG1sTWVzaFJlbmRlcmVyLCBIdG1sTWVzaCwgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciwgRml0U3RyYXRlZ3kgfTtcclxuIiwiaW1wb3J0IHsgVG9vbHMgfSBmcm9tIFwiY29yZS9NaXNjL3Rvb2xzXCI7XHJcblxyXG4vLyBBIGNhcHR1cmUgbWFuYWdlbWVudCBzeXN0ZW0gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3Qgb2JqZWN0IGhhcyB0aGUgcG9pbnRlclxyXG4vLyBldmVudHMgYnkgZWxpbWluYXRpbmcgcmFjZSBjb25kaXRpb25zIHRoYXQgY2FuIGNhdXNlIHRoZSBwb2ludGVyIGV2ZW50cyB0byBiZVxyXG4vLyByZWxlYXNlZCBieSBhIGRpZmZlcmVudCBvYmplY3QgYWZ0ZXIgdGhleSBhcmUgY2FwdHVyZWQgbGVhdmluZyBubyBvYmplY3RcclxuLy8gYXMgdGhlIG93bmVyLiAgSXQgZG9lcyB0aGlzIGJ5IHF1ZXVlaW5nIHJlcXVlc3RzIGFuZCBvbmx5IGFsbG93aW5nXHJcbi8vIGNhcHR1cmUgd2hlbiB0aGUgY3VycmVudCBjYXB0dXJlIG93bmVyIHJlbGVhc2VzIHBvaW50ZXIgZXZlbnRzLlxyXG5cclxudHlwZSBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrID0gKCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgQ2FwdHVyZVJlbGVhc2VDYWxsYmFja3MgPSB7XHJcbiAgICBjYXB0dXJlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrO1xyXG4gICAgcmVsZWFzZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaztcclxufTtcclxuXHJcbmxldCBDYXB0dXJlUmVxdWVzdFF1ZXVlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuLy8gS2V5IGlzIHJlcXVlc3QgaWQsIHZhbHVlIGlzIG9iamVjdCB3aXRoIGNhcHR1cmUgYW5kIHJlbGVhc2UgY2FsbGJhY2tzXHJcbmNvbnN0IFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzOiBNYXA8c3RyaW5nLCBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrcz4gPSBuZXcgTWFwKCk7XHJcblxyXG4vLyBLZWVwIHRyYWNrIG9mIHJlbGVhc2UgcmVxdWVzdHMgd2l0aCBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3RcclxuLy8gaW4gY2FzZSB0aGUgcmVsZWFzZSByZXF1ZXN0IGFycml2ZWQgYmVmb3JlIHRoZSBjYXB0dXJlIHRvIGF2b2lkXHJcbi8vIHRoZSBjYXB0dXJlIHJlcXVlc3QgbmV2ZXIgZ2V0dGluZyByZWxlYXNlZC5cclxubGV0IFVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0czogc3RyaW5nW10gPSBbXTtcclxuXHJcbmxldCBDdXJyZW50T3duZXI6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBDYWxsZWQgb24gZmlyc3QgY2FwdHVyZSBvciByZWxlYXNlIHJlcXVlc3RcclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGlkIG9mIHRoZSBvYmplY3QgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIG9iamVjdCBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqIG9yIG51bGwgaWYgbm8gb2JqZWN0IGlzIGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY29uc3QgZ2V0Q2FwdHVyaW5nSWQgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gQ3VycmVudE93bmVyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlcXVlc3QgdGhhdCB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkIGNhcHR1cmUgcG9pbnRlciBldmVudHMuICBJZiB0aGVyZSBpcyBubyBjdXJyZW50XHJcbiAqIG93bmVyLCB0aGVuIHRoZSByZXF1ZXN0IGlzIGdyYW50ZWQgaW1tZWRpYXRlbHkuICBJZiB0aGVyZSBpcyBhIGN1cnJlbnQgb3duZXIsIHRoZW4gdGhlIHJlcXVlc3RcclxuICogaXMgcXVldWVkIHVudGlsIHRoZSBjdXJyZW50IG93bmVyIHJlbGVhc2VzIHBvaW50ZXIgZXZlbnRzLlxyXG4gKiBAcGFyYW0gcmVxdWVzdElkIEFuIGlkIHRvIGlkZW50aWZ5IHRoZSByZXF1ZXN0LiAgVGhpcyBpZCB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGNhcHR1cmVcclxuICogcmVxdWVzdCB3aXRoIHRoZSByZWxlYXNlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSBjYXB0dXJlQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBncmFudGVkIGFuZCB0aGUgb2JqZWN0IGlzIGNhcHR1cmluZ1xyXG4gKiBAcGFyYW0gcmVsZWFzZUNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBubyBsb25nZXIgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjb25zdCByZXF1ZXN0Q2FwdHVyZSA9IChyZXF1ZXN0SWQ6IHN0cmluZywgY2FwdHVyZUNhbGxiYWNrOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrLCByZWxlYXNlQ2FsbGJhY2s6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2spID0+IHtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0Q2FwdHVyZSAtIFBvaW50ZXIgZXZlbnRzIGNhcHR1cmUgcmVxdWVzdGVkIGZvciAke3JlcXVlc3RJZH1gKTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBpcyBhIHJlbGVhc2UgZm9yIHRoaXMgcmVxdWVzdCwgdGhlbiBpZ25vcmUgdGhlIHJlcXVlc3RcclxuICAgIGlmIChSZW1vdmVVbm1hdGNoZWRSZXF1ZXN0KHJlcXVlc3RJZCkpIHtcclxuICAgICAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdENhcHR1cmUgLSBDYXB0dXJlIHJlcXVlc3QgbWF0Y2hlZCBwcmV2aW91cyByZWxlYXNlIHJlcXVlc3QgJHtyZXF1ZXN0SWR9LiAgQ2FuY2VsbGluZyBjYXB0dXJlIHJlcXVlc3RgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RJZCAhPT0gQ3VycmVudE93bmVyKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgbm90IGFscmVhZHkgaW4gdGhlIHF1ZXVlLCBhZGQgaXQgdG8gdGhlIHF1ZXVlXHJcbiAgICAgICAgRW5xdWV1ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RJZCwgY2FwdHVyZUNhbGxiYWNrLCByZWxlYXNlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghQ3VycmVudE93bmVyKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBvd25lciwgZ28gYWhlYWQgYW5kIGdyYW50IHRoZSByZXF1ZXN0XHJcbiAgICAgICAgVHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwKCk7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgcmVxdWVzdCBpZCBpcyB0aGUgY3VycmVudCBvd25lciwgZG8gbm90aGluZ1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbGVhc2UgcG9pbnRlciBldmVudHMgZnJvbSB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLiAgSWYgdGhlIG9iamVjdCBpcyB0aGUgY3VycmVudCBvd25lclxyXG4gKiB0aGVuIHBvaW50ZXIgZXZlbnRzIGFyZSByZWxlYXNlZCBpbW1lZGlhdGVseS4gIElmIHRoZSBvYmplY3QgaXMgbm90IHRoZSBjdXJyZW50IG93bmVyLCB0aGVuIHRoZVxyXG4gKiBhc3NvY2lhdGVkIGNhcHR1cmUgcmVxdWVzdCBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLiAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgY2FwdHVyZSByZXF1ZXN0XHJcbiAqIGluIHRoZSBxdWV1ZSwgdGhlbiB0aGUgcmVsZWFzZSByZXF1ZXN0IGlzIGFkZGVkIHRvIGEgbGlzdCBvZiB1bm1hdGNoZWQgcmVsZWFzZSByZXF1ZXN0cyBhbmQgd2lsbFxyXG4gKiBuZWdhdGUgdGhlIG5leHQgY2FwdHVyZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWQuICBUaGlzIGlzIHRvIGd1YXJkIGFnYWluc3QgdGhlIHBvc3NpYmlsaXR5IHRoYXRcclxuICogdGhlIHJlbGVhc2UgcmVxdWVzdCBhcnJpdmVkIGJlZm9yZSB0aGUgY2FwdHVyZSByZXF1ZXN0LlxyXG4gKiBAcGFyYW0gcmVxdWVzdElkIFRoZSBpZCB3aGljaCBzaG91bGQgbWF0Y2ggdGhlIGlkIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3RcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RSZWxlYXNlID0gKHJlcXVlc3RJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RSZWxlYXNlIC0gUG9pbnRlciBldmVudHMgcmVsZWFzZSByZXF1ZXN0ZWQgZm9yICR7cmVxdWVzdElkfWApO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZXF1ZXN0SWQgaXMgdGhlIGN1cnJlbnQgY2FwdHVyZSBob2xkZXIgcmVsZWFzZSBpdFxyXG4gICAgaWYgKCFyZXF1ZXN0SWQgfHwgcmVxdWVzdElkID09PSBDdXJyZW50T3duZXIpIHtcclxuICAgICAgICBUcmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAoKTtcclxuICAgIH0gZWxzZSBpZiAoQ2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgaW4gdGhlIHF1ZXVlLCBidXQgbm90IHRoZSBjdXJyZW50IGNhcHR1cmUgaG9sZGVyLCByZW1vdmUgaXQgYW5kIGl0J3MgY2FsbGJhY2tzXHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZGVsZXRlKHJlcXVlc3RJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0UmVsZWFzZSAtIFJlY2VpdmVkIHJlbGVhc2UgcmVxdWVzdCAke3JlcXVlc3RJZH0gYnV0IG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdCB3YXMgcmVjZWl2ZWRgKTtcclxuICAgICAgICAvLyByZXF1ZXN0IHdhcyBub3QgY3VycmVudCBhbmQgbm90IGluIHF1ZXVlLCBsaWtlbHkgYmVjYXVzZSB3ZSByZWNlaXZlZCBhIHJlbGVhc2VcclxuICAgICAgICAvLyByZXF1ZXN0IGJlZm9yZSB0aGUgY2FwdHVyZS4gIEFkZCBpdCB0byB0aGUgdW5tYXRjaGVkIGxpc3QgdG8gZ3VhcmQgYWdhaW5zdCB0aGlzIHBvc3NpYmlsaXR5XHJcbiAgICAgICAgaWYgKCFVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMuaW5jbHVkZXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgICAgICBVbm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZWxlYXNlIHBvaW50ZXIgZXZlbnRzIGZyb20gdGhlIGN1cnJlbnQgb3duZXJcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IHJlbGVhc2VDdXJyZW50ID0gKCkgPT4ge1xyXG4gICAgcmVxdWVzdFJlbGVhc2UoQ3VycmVudE93bmVyKTtcclxufTtcclxuXHJcbmNvbnN0IEVucXVldWVDYXB0dXJlUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZywgY2FwdHVyZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaywgcmVsZWFzZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaykgPT4ge1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmVucXVldWVDYXB0dXJlUmVxdWVzdCAtIEVucXVldWVpbmcgY2FwdHVyZSByZXF1ZXN0IGZvciAgJHtyZXF1ZXN0SWR9YCk7XHJcbiAgICBpZiAoIUNhcHR1cmVSZXF1ZXN0UXVldWUuaW5jbHVkZXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgIENhcHR1cmVSZXF1ZXN0UXVldWUucHVzaChyZXF1ZXN0SWQpO1xyXG4gICAgICAgIFBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLnNldChyZXF1ZXN0SWQsIHsgY2FwdHVyZSwgcmVsZWFzZSB9KTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vIFJlbW92ZXMgdGhlIHJlcXVlc3QgZnJvbSB0aGUgcXVldWUgaWYgaXQgZXhpc3RzLiAgUmV0dXJucyB0cnVlXHJcbi8vIGlmIHRoZSByZXF1ZXN0IHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgb3RoZXJ3aXNlIGZhbHNlXHJcbmNvbnN0IENhbmNlbFJlcXVlc3QgPSAocmVxdWVzdElkOiBzdHJpbmcgfCBudWxsKSA9PiB7XHJcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xyXG4gICAgQ2FwdHVyZVJlcXVlc3RRdWV1ZSA9IENhcHR1cmVSZXF1ZXN0UXVldWUuZmlsdGVyKChpZCkgPT4ge1xyXG4gICAgICAgIGlmIChpZCAhPT0gcmVxdWVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBEZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuY2FuY2VsUmVxdWVzdCAtIENhbmNlbGluZyBwb2ludGVyIGV2ZW50cyBjYXB0dXJlIHJlcXVlc3QgJHtyZXF1ZXN0SWR9YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZW1vdmVkO1xyXG59O1xyXG5cclxuY29uc3QgUmVtb3ZlVW5tYXRjaGVkUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZykgPT4ge1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIFVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cyA9IFVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5maWx0ZXIoKGlkKSA9PiB7XHJcbiAgICAgICAgaWYgKGlkICE9PSByZXF1ZXN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZW1vdmVkO1xyXG59O1xyXG5cclxuY29uc3QgVHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwID0gKCkgPT4ge1xyXG4gICAgY29uc3QgbmV3T3duZXJJZCA9IE5leHRDYXB0dXJlUmVxdWVzdCgpO1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCAtIFRyYW5zZmVycnJpbmcgcG9pbnRlciBldmVudHMgZnJvbSAke0N1cnJlbnRPd25lcn0gdG8gJHtuZXdPd25lcklkfWApO1xyXG4gICAgLy8gUmVsZWFzZSB0aGUgY3VycmVudCBvd25lclxyXG4gICAgRG9SZWxlYXNlKCk7XHJcbiAgICBpZiAobmV3T3duZXJJZCkge1xyXG4gICAgICAgIERvQ2FwdHVyZShuZXdPd25lcklkKTtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IERvUmVsZWFzZSA9ICgpID0+IHtcclxuICAgIERlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5kb1JlbGVhc2UgLSBSZWxlYXNpbmcgcG9pbnRlciBldmVudHMgZnJvbSAke0N1cnJlbnRPd25lcn1gKTtcclxuICAgIGlmIChDdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBjYWxsIHRoZSByZWxlYXNlIGNhbGxiYWNrXHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZ2V0KEN1cnJlbnRPd25lcik/LnJlbGVhc2UoKTtcclxuICAgICAgICAvLyBBbmQgcmVtb3ZlIHRoZSBjYWxsYmFja3NcclxuICAgICAgICBQZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5kZWxldGUoQ3VycmVudE93bmVyKTtcclxuICAgICAgICBDdXJyZW50T3duZXIgPSBudWxsO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgRG9DYXB0dXJlID0gKG5ld093bmVySWQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKG5ld093bmVySWQpIHtcclxuICAgICAgICAvLyBjYWxsIHRoZSBjYXB0dXJlIGNhbGxiYWNrXHJcbiAgICAgICAgUGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZ2V0KG5ld093bmVySWQpPy5jYXB0dXJlKCk7XHJcbiAgICB9XHJcbiAgICBDdXJyZW50T3duZXIgPSBuZXdPd25lcklkO1xyXG4gICAgRGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmRvQ2FwdHVyZSAtIFBvaW50ZXIgZXZlbnRzIG5vdyBjYXB0dXJlZCBieSAke25ld093bmVySWR9YCk7XHJcbn07XHJcblxyXG5jb25zdCBOZXh0Q2FwdHVyZVJlcXVlc3QgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gQ2FwdHVyZVJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwID8gQ2FwdHVyZVJlcXVlc3RRdWV1ZS5zaGlmdCgpIDogbnVsbDtcclxufTtcclxuXHJcbi8vICNyZWdpb24gRGVidWdnaW5nIHN1cHBvcnRcclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG4gICAgICAgIFwicG9pbnRlci1ldmVudHMtY2FwdHVyZS1kZWJ1Z1wiOiBib29sZWFuIHwgbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgRGVidWdMb2cgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgcnVubm5pbmcgaW4gYSB0ZXN0IHJ1bm5lciAoaW4gbm9kZSwgc28gd2luZG93IGlzIG5vdCBkZWZpbmVkKVxyXG4gICAgLy8gb3IgaWYgdGhlIGRlYnVnIGZsYWcgaXMgc2V0LCB0aGVuIGxvZyB0aGUgbWVzc2FnZVxyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgd2luZG93W1wicG9pbnRlci1ldmVudHMtY2FwdHVyZS1kZWJ1Z1wiXSkge1xyXG4gICAgICAgIFRvb2xzLkxvZyhcclxuICAgICAgICAgICAgYCR7cGVyZm9ybWFuY2Uubm93KCl9IC0gZ2FtZS5zY2VuZS5wb2ludGVyRXZlbnRzIC0gJHttZXNzYWdlfVxcbmN1cnJlbnRPd25lcjogJHtDdXJyZW50T3duZXJ9XFxucXVldWU6ICR7Q2FwdHVyZVJlcXVlc3RRdWV1ZX1cXG51bm1hdGNoZWQ6ICR7VW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzfWBcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59O1xyXG4vLyAjZW5kcmVnaW9uIERlYnVnZ2luZyBzdXBwb3J0XHJcbiIsImltcG9ydCB0eXBlIHsgQWJzdHJhY3RNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL2Fic3RyYWN0TWVzaFwiO1xyXG5pbXBvcnQgdHlwZSB7IEJlaGF2aW9yIH0gZnJvbSBcImNvcmUvQmVoYXZpb3JzL2JlaGF2aW9yXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiY29yZS9NaXNjL2xvZ2dlclwiO1xyXG5pbXBvcnQgeyByZXF1ZXN0Q2FwdHVyZSwgcmVxdWVzdFJlbGVhc2UsIHJlbGVhc2VDdXJyZW50LCBnZXRDYXB0dXJpbmdJZCB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlXCI7XHJcblxyXG4vLyBNb2R1bGUgbGV2ZWwgdmFyaWFibGUgZm9yIGhvbGRpbmcgdGhlIGN1cnJlbnQgc2NlbmVcclxubGV0IExvY2FsU2NlbmU6IFNjZW5lIHwgbnVsbCA9IG51bGw7XHJcblxyXG4vLyBNb2R1bGUgbGV2ZWwgdmFyaWFibGUgdG8gaG9sZCB0aGUgY291bnQgb2YgYmVoYXZpb3IgaW5zdGFuY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuLy8gb24gZW50cnkuICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gc3RhcnQgb3Igc3RvcCBvYnNlcnZpbmcgcG9pbnRlciBtb3ZlbWVudC5cclxubGV0IENhcHR1cmVPbkVudGVyQ291bnQgPSAwO1xyXG5cclxuLy8gTWFwIHVzZWQgdG8gc3RvcmUgaW5zdGFuY2Ugb2YgdGhlIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgZm9yIGEgbWVzaFxyXG4vLyBXZSBkbyB0aGlzIGJlY2F1c2UgdGhpcyBnZXRzIGNoZWNrZWQgb24gcG9pbnRlciBtb3ZlIGFuZCB3ZSBkb24ndCB3YW50IHRvXHJcbi8vIHVzZSBnZXRCZWhhdmlvckJ5TmFtZSgpIGJlY2F1c2UgdGhhdCBpcyBhIGxpbmVhciBzZWFyY2hcclxuY29uc3QgTWVzaFRvQmVoYXZpb3JNYXAgPSBuZXcgV2Vha01hcDxBYnN0cmFjdE1lc2gsIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3I+KCk7XHJcblxyXG5jb25zdCBTdGFydENhcHR1cmVPbkVudGVyID0gKHNjZW5lOiBTY2VuZSkgPT4ge1xyXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBhIGJyb3dzZXIsIGRvIG5vdGhpbmdcclxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoQ2FwdHVyZU9uRW50ZXJDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBPblBvaW50ZXJNb3ZlKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBPblBvaW50ZXJNb3ZlKTtcclxuICAgICAgICBMb2NhbFNjZW5lID0gTG9jYWxTY2VuZSA/PyBzY2VuZTtcclxuICAgICAgICBMb2dnZXIuTG9nKFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcjogU3RhcnRpbmcgb2JzZXJ2YXRpb24gb2YgcG9pbnRlciBtb3ZlIGV2ZW50cy5cIik7XHJcbiAgICAgICAgTG9jYWxTY2VuZS5vbkRpc3Bvc2VPYnNlcnZhYmxlLmFkZChEb1N0b3BDYXB0dXJlT25FbnRlcik7XHJcbiAgICB9XHJcbiAgICBDYXB0dXJlT25FbnRlckNvdW50Kys7XHJcbn07XHJcblxyXG5jb25zdCBEb1N0b3BDYXB0dXJlT25FbnRlciA9ICgpID0+IHtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBPblBvaW50ZXJNb3ZlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIE9uUG9pbnRlck1vdmUpO1xyXG4gICAgTG9jYWxTY2VuZSA9IG51bGw7XHJcbiAgICBMb2dnZXIuTG9nKFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcjogU3RvcHBpbmcgb2JzZXJ2YXRpb24gb2YgcG9pbnRlciBtb3ZlIGV2ZW50cy5cIik7XHJcbiAgICBDYXB0dXJlT25FbnRlckNvdW50ID0gMDtcclxufTtcclxuXHJcbmNvbnN0IFN0b3BDYXB0dXJlT25FbnRlciA9ICgpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyLCBkbyBub3RoaW5nXHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlIGFyZSBub3Qgb2JzZXJ2aW5nIHBvaW50ZXIgbW92ZW1lbnQsIGRvIG5vdGhpbmdcclxuICAgIGlmICghTG9jYWxTY2VuZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBDYXB0dXJlT25FbnRlckNvdW50LS07XHJcbiAgICBpZiAoQ2FwdHVyZU9uRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgICAgRG9TdG9wQ2FwdHVyZU9uRW50ZXIoKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBlbnRlcmVkIG1lc2ggc2hvdWxkIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuY29uc3QgT25Qb2ludGVyTW92ZSA9IChldnQ6IFBvaW50ZXJFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcclxuICAgIGlmICghTG9jYWxTY2VuZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYW52YXNSZWN0ID0gTG9jYWxTY2VuZS5nZXRFbmdpbmUoKS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAoIWNhbnZhc1JlY3QpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgY2xpZW50IFggYW5kIFkgZnJvbSBlaXRoZXIgdGhlIHBvaW50ZXIgZXZlbnQgb3IgZnJvbSB0aGVcclxuICAgIC8vIFRvdWNoRXZlbnQgdG91Y2hcclxuICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gXCJ0b3VjaGVzXCIgaW4gZXZ0ID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQ7XHJcblxyXG4gICAgLy8gZ2V0IHRoZSBwaWNrZWQgbWVzaCwgaWYgYW55XHJcbiAgICBjb25zdCBwb2ludGVyU2NyZWVuWCA9IGNsaWVudFggLSBjYW52YXNSZWN0LmxlZnQ7XHJcbiAgICBjb25zdCBwb2ludGVyU2NyZWVuWSA9IGNsaWVudFkgLSBjYW52YXNSZWN0LnRvcDtcclxuXHJcbiAgICBsZXQgcG9pbnRlckNhcHR1cmVCZWhhdmlvcjogUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHBpY2tSZXN1bHQgPSBMb2NhbFNjZW5lLnBpY2socG9pbnRlclNjcmVlblgsIHBvaW50ZXJTY3JlZW5ZLCAobWVzaCkgPT4ge1xyXG4gICAgICAgIC8vIElmIHRoZSBtZXNoIGhhcyBhbiBpbnN0YW5jZSBvZiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGF0dGFjaGVkIHRvIGl0LFxyXG4gICAgICAgIC8vIGFuZCBjYXB0dXJlIG9uIHBvaW50ZXIgZW50ZXIgaXMgdHJ1ZSwgdGhlbiB3ZSB3YW50IHRvIHBpY2sgaXRcclxuICAgICAgICBjb25zdCBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yID0gTWVzaFRvQmVoYXZpb3JNYXAuZ2V0KG1lc2gpO1xyXG4gICAgICAgIHJldHVybiBtZXNoLmlzRW5hYmxlZCgpICYmIHR5cGVvZiBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yICE9PSBcInVuZGVmaW5lZFwiICYmIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IuX2NhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBwaWNrZWRNZXNoOiBBYnN0cmFjdE1lc2ggfCBudWxsO1xyXG4gICAgaWYgKHBpY2tSZXN1bHQuaGl0KSB7XHJcbiAgICAgICAgcGlja2VkTWVzaCA9IHBpY2tSZXN1bHQucGlja2VkTWVzaDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGlja2VkTWVzaCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FwdHVyaW5nSWRBc0ludCA9IHBhcnNlSW50KGdldENhcHR1cmluZ0lkKCkgfHwgXCJcIik7XHJcblxyXG4gICAgLy8gaWYgdGhlIHBpY2tlZCBtZXNoIGlzIHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoLCBkbyBub3RoaW5nXHJcbiAgICBpZiAocGlja2VkTWVzaCAmJiBwaWNrZWRNZXNoLnVuaXF1ZUlkID09PSBjYXB0dXJpbmdJZEFzSW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgY2FwdHVyaW5nIG1lc2ggYW5kIGl0IGlzIG5vdCB0aGUgY3VycmVudCBwaWNrZWQgbWVzaCwgb3Igbm9cclxuICAgIC8vIG1lc2ggaXMgcGlja2VkLCByZWxlYXNlIHRoZSBjYXB0dXJpbmcgbWVzaFxyXG4gICAgaWYgKGNhcHR1cmluZ0lkQXNJbnQgJiYgKCFwaWNrZWRNZXNoIHx8IHBpY2tlZE1lc2gudW5pcXVlSWQgIT09IGNhcHR1cmluZ0lkQXNJbnQpKSB7XHJcbiAgICAgICAgcmVsZWFzZUN1cnJlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGVyZSBpcyBhIHBpY2tlZCBtZXNoIGFuZCBpdCBpcyBub3QgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2gsIGNhcHR1cmVcclxuICAgIC8vIHRoZSBwb2ludGVyIGV2ZW50cy4gIE5vdGUgdGhhdCB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCBoYXMgYWxyZWFkeSBiZWVuXHJcbiAgICAvLyByZWxlYXNlZCBhYm92ZVxyXG4gICAgaWYgKHBpY2tlZE1lc2gpIHtcclxuICAgICAgICBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yID0gTWVzaFRvQmVoYXZpb3JNYXAuZ2V0KHBpY2tlZE1lc2gpO1xyXG4gICAgICAgIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IhLmNhcHR1cmVQb2ludGVyRXZlbnRzKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQmVoYXZpb3IgZm9yIGFueSBjb250ZW50IHRoYXQgY2FuIGNhcHR1cmUgcG9pbnRlciBldmVudHMsIGkuZS4gYnlwYXNzIHRoZSBCYWJ5bG9uIHBvaW50ZXIgZXZlbnQgaGFuZGxpbmdcclxuICogYW5kIHJlY2VpdmUgcG9pbnRlciBldmVudHMgZGlyZWN0bHkuICBJdCB3aWxsIHJlZ2lzdGVyIHRoZSBjYXB0dXJlIHRyaWdnZXJzIGFuZCBuZWdvdGlhdGUgdGhlIGNhcHR1cmUgYW5kXHJcbiAqIHJlbGVhc2Ugb2YgcG9pbnRlciBldmVudHMuICBDdXJlcm50bHkgdGhpcyBhcHBsaWVzIG9ubHkgdG8gSHRtbE1lc2hcclxuICovXHJcbmV4cG9ydCBjbGFzcyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGltcGxlbWVudHMgQmVoYXZpb3I8QWJzdHJhY3RNZXNoPiB7XHJcbiAgICAvKiogZ2V0cyBvciBzZXRzIGJlaGF2aW9yJ3MgbmFtZSAqL1xyXG4gICAgcHVibGljIG5hbWUgPSBcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuXHJcbiAgICBwcml2YXRlIF9hdHRhY2hlZE1lc2g6IEFic3RyYWN0TWVzaCB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX2NhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgbWVzaCB0aGF0IHRoZSBiZWhhdmlvciBpcyBhdHRhY2hlZCB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF0dGFjaGVkTWVzaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRNZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYXR0YWNoZWRNZXNoKHZhbHVlOiBBYnN0cmFjdE1lc2ggfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNoZWRNZXNoID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfY2FwdHVyZUNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIHByaXZhdGUgX3JlbGVhc2VDYWxsYmFjazogKCkgPT4gdm9pZCxcclxuICAgICAgICB7IGNhcHR1cmVPblBvaW50ZXJFbnRlciA9IHRydWUgfSA9IHt9XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9hdHRhY2hlZE1lc2ggPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuXHJcbiAgICAgICAgLy8gV2FybiBpZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oYENyZWF0aW5nIGFuIGluc3RhbmNlIG9mIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3Igb3V0c2lkZSBvZiBhIGJyb3dzZXIuICBUaGUgYmVoYXZpb3Igd2lsbCBub3Qgd29yay5gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgaWYgdGhlIGJlaGF2aW9yIHNob3VsZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIHRoZSBtZXNoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY2FwdHVyZU9uUG9pbnRlckVudGVyKGNhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPT09IGNhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICBpZiAodGhpcy5fYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIFN0YXJ0Q2FwdHVyZU9uRW50ZXIodGhpcy5fYXR0YWNoZWRNZXNoLmdldFNjZW5lKCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgU3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYmVoYXZpb3IgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgKGJlZm9yZSBhdHRhY2hpbmcgaXQgdG8gYSB0YXJnZXQpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0KCkge31cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBpcyBhdHRhY2hlZCB0byBhIHRhcmdldFxyXG4gICAgICogQHBhcmFtIG1lc2ggZGVmaW5lcyB0aGUgdGFyZ2V0IHdoZXJlIHRoZSBiZWhhdmlvciBpcyBhdHRhY2hlZCB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXR0YWNoKG1lc2g6IEFic3RyYWN0TWVzaCkge1xyXG4gICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSB0byB0aGlzIGJlaGF2aW9yIG9uIHRoZSBtZXNoLiAgV2UgZG8gdGhpcyBzbyB3ZSBjYW4gZ2V0IGFcclxuICAgICAgICAvLyByZWZlcmVuY2UgdG8gdGhlIGJlaGF2aW9yIGluIHRoZSBvblBvaW50ZXJNb3ZlIGZ1bmN0aW9uIHdpdGhvdXQgcmVseWluZyBvblxyXG4gICAgICAgIC8vIGdldEJlaGF2aW9yQnlOYW1lKCksIHdoaWNoIGRvZXMgYSBsaW5lYXIgc2VhcmNoIG9mIHRoZSBiZWhhdmlvcnMgYXJyYXkuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc2ggPSBtZXNoO1xyXG4gICAgICAgIE1lc2hUb0JlaGF2aW9yTWFwLnNldChtZXNoLCB0aGlzKTtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIFN0YXJ0Q2FwdHVyZU9uRW50ZXIobWVzaC5nZXRTY2VuZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYmVoYXZpb3IgaXMgZGV0YWNoZWQgZnJvbSBpdHMgdGFyZ2V0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZXRhY2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgYmVoYXZpb3IgZnJvbSB0aGUgbWVzaFxyXG4gICAgICAgIE1lc2hUb0JlaGF2aW9yTWFwLmRlbGV0ZSh0aGlzLmF0dGFjaGVkTWVzaCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICBTdG9wQ2FwdHVyZU9uRW50ZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc2ggPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcG9zZSB0aGUgYmVoYXZpb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5kZXRhY2goKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZWxlYXNlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICBwdWJsaWMgcmVsZWFzZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcXVlc3RSZWxlYXNlKHRoaXMuYXR0YWNoZWRNZXNoLnVuaXF1ZUlkLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgIHB1YmxpYyBjYXB0dXJlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWVzdENhcHR1cmUodGhpcy5hdHRhY2hlZE1lc2gudW5pcXVlSWQudG9TdHJpbmcoKSwgdGhpcy5fY2FwdHVyZUNhbGxiYWNrLCB0aGlzLl9yZWxlYXNlQ2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXG5leHBvcnQgKiBmcm9tIFwiLi9odG1sTWVzaC9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbXNkZlRleHQvaW5kZXhcIjtcbiIsImltcG9ydCB0eXBlIHsgSURpc3Bvc2FibGUsIFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHR5cGUgeyBCTUZvbnRDaGFyIH0gZnJvbSBcIi4vc2RmL2JtRm9udFwiO1xyXG5pbXBvcnQgdHlwZSB7IFNkZkZvbnQgfSBmcm9tIFwiLi9zZGYvZm9udFwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuXHJcbmVudW0gQ2hhckNvZGUge1xyXG4gICAgU1BBQ0UgPSAzMixcclxuICAgIFRPRlUgPSAweGZmZmMsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBmb250IGFzc2V0IGZvciBTREYgKFNpZ25lZCBEaXN0YW5jZSBGaWVsZCkgcmVuZGVyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEZvbnRBc3NldCBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJzID0gbmV3IE1hcDxudW1iZXIsIEJNRm9udENoYXI+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyc1JlZ2V4OiBSZWdFeHA7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9rZXJuaW5ncyA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBudW1iZXI+PigpO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBfZm9udDogU2RmRm9udDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGZvbnQgc2NhbGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHNjYWxlOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHVzZWQgdGV4dHVyZXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHRleHR1cmVzOiBUZXh0dXJlW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbnRBc3NldCBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBkZWZpbml0aW9uRGF0YSBkZWZpbmVzIHRoZSBmb250IGRhdGEgaW4gSlNPTiBmb3JtYXQuXHJcbiAgICAgKiBAcGFyYW0gdGV4dHVyZVVybCBkZWZpbmVzIHRoZSB1cmwgb2YgdGhlIHRleHR1cmUgdG8gdXNlIGZvciB0aGUgZm9udC5cclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBob3N0aW5nIHNjZW5lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGVmaW5pdGlvbkRhdGE6IHN0cmluZywgdGV4dHVyZVVybDogc3RyaW5nLCBzY2VuZT86IFNjZW5lKSB7XHJcbiAgICAgICAgdGhpcy5fZm9udCA9IEpTT04ucGFyc2UoZGVmaW5pdGlvbkRhdGEpIGFzIFNkZkZvbnQ7XHJcbiAgICAgICAgLy8gU28gZmFyIHdlIG9ubHkgY29uc2lkZXIgb25lIHBhZ2VcclxuICAgICAgICB0aGlzLl9mb250LnBhZ2VzID0gW3RleHR1cmVVcmxdO1xyXG5cclxuICAgICAgICB0aGlzLl9mb250LmNoYXJzLmZvckVhY2goKGNoYXIpID0+IHRoaXMuX2NoYXJzLnNldChjaGFyLmlkLCBjaGFyKSk7XHJcbiAgICAgICAgdGhpcy5fZm9udC5rZXJuaW5ncy5mb3JFYWNoKChrZXJuaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdWJtYXAgPSB0aGlzLl9rZXJuaW5ncy5nZXQoa2VybmluZy5maXJzdCk7XHJcbiAgICAgICAgICAgIGlmICghc3VibWFwKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJtYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXJuaW5ncy5zZXQoa2VybmluZy5maXJzdCwgc3VibWFwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWJtYXAuc2V0KGtlcm5pbmcuc2Vjb25kLCBrZXJuaW5nLmFtb3VudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fY2hhcnNSZWdleCA9IG5ldyBSZWdFeHAoYFske3RoaXMuX2ZvbnQuY2hhcnMubWFwKChjKSA9PiBjLmNoYXIucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpKS5qb2luKFwiXCIpfV1gLCBcImdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUZhbGxiYWNrcygpO1xyXG5cclxuICAgICAgICB0aGlzLnNjYWxlID0gMSAvIHRoaXMuX2ZvbnQuaW5mby5zaXplO1xyXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSB0aGlzLl9mb250LnBhZ2VzLm1hcCgocGFnZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUocGFnZSwgc2NlbmUsIHsgbm9NaXBtYXA6IGZhbHNlLCBpbnZlcnRZOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgdGV4dHVyZS5hbmlzb3Ryb3BpY0ZpbHRlcmluZ0xldmVsID0gMTY7XHJcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCB0ZXh0dXJlIG9mIHRoaXMudGV4dHVyZXMpIHtcclxuICAgICAgICAgICAgdGV4dHVyZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGV4dHVyZXMubGVuZ3RoID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF91cGRhdGVGYWxsYmFja3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGFycy5oYXMoQ2hhckNvZGUuU1BBQ0UpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJzLnNldChDaGFyQ29kZS5TUEFDRSwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IENoYXJDb2RlLlNQQUNFLFxyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMCxcclxuICAgICAgICAgICAgICAgIHhvZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICB5b2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgeGFkdmFuY2U6IHRoaXMuX2ZvbnQuaW5mby5zaXplICogMC41LFxyXG4gICAgICAgICAgICAgICAgcGFnZTogLTEsXHJcbiAgICAgICAgICAgICAgICBjaG5sOiAtMSxcclxuICAgICAgICAgICAgICAgIGluZGV4OiAtMSxcclxuICAgICAgICAgICAgICAgIGNoYXI6IFwiIFwiLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY2hhcnMuaGFzKENoYXJDb2RlLlRPRlUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJzLnNldChDaGFyQ29kZS5UT0ZVLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogQ2hhckNvZGUuVE9GVSxcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2ZvbnQuaW5mby5zaXplLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9mb250LmluZm8uc2l6ZSxcclxuICAgICAgICAgICAgICAgIHhvZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICB5b2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICAgICAgeGFkdmFuY2U6IHRoaXMuX2ZvbnQuaW5mby5zaXplICogMC41LFxyXG4gICAgICAgICAgICAgICAgcGFnZTogLTEsXHJcbiAgICAgICAgICAgICAgICBjaG5sOiAtMSxcclxuICAgICAgICAgICAgICAgIGluZGV4OiAtMSxcclxuICAgICAgICAgICAgICAgIGNoYXI6IFwi77+/XCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX2dldENoYXIoY2hhckNvZGU6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFycy5nZXQoY2hhckNvZGUpIHx8IHRoaXMuX2NoYXJzLmdldChDaGFyQ29kZS5UT0ZVKSE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHVibGljIF9nZXRLZXJuaW5nKGZpcnN0OiBudW1iZXIsIHNlY29uZDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tlcm5pbmdzLmdldChmaXJzdCk/LmdldChzZWNvbmQpIHx8IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHVibGljIF91bnN1cHBvcnRlZENoYXJzKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UodGhpcy5fY2hhcnNSZWdleCwgXCJcIik7XHJcbiAgICB9XHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuZXhwb3J0ICogZnJvbSBcIi4vZm9udEFzc2V0XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3BhcmFncmFwaE9wdGlvbnNcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dFJlbmRlcmVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3NkZi9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi93ZWJnbC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi93ZWJncHUvaW5kZXhcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5cclxuaW1wb3J0IHR5cGUgeyBJVmVjdG9yMkxpa2UgfSBmcm9tIFwiY29yZS9NYXRoc1wiO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgdHlwZSBQYXJhZ3JhcGhPcHRpb25zID0ge1xyXG4gICAgbWF4V2lkdGg6IG51bWJlcjtcclxuICAgIGxpbmVIZWlnaHQ6IG51bWJlcjtcclxuICAgIGxldHRlclNwYWNpbmc6IG51bWJlcjtcclxuICAgIHRhYlNpemU6IG51bWJlcjtcclxuICAgIHdoaXRlU3BhY2U6IC8qICdub3JtYWwnIHwgJ25vd3JhcCcgfCAncHJlJyB8ICdwcmUtd3JhcCcgfCAqLyBcInByZS1saW5lXCIgLyogfCAnYnJlYWstc3BhY2VzJyovO1xyXG4gICAgdGV4dEFsaWduOiBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiY2VudGVyXCIgLyogfCAnanVzdGlmeScqLztcclxuICAgIHRyYW5zbGF0ZTogSVZlY3RvcjJMaWtlIHwgdW5kZWZpbmVkO1xyXG59O1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY29uc3QgRGVmYXVsdFBhcmFncmFwaE9wdGlvbnM6IFBhcmFncmFwaE9wdGlvbnMgPSB7XHJcbiAgICBtYXhXaWR0aDogSW5maW5pdHksXHJcbiAgICBsaW5lSGVpZ2h0OiAxLFxyXG4gICAgbGV0dGVyU3BhY2luZzogMSxcclxuICAgIHRhYlNpemU6IDQsXHJcbiAgICB3aGl0ZVNwYWNlOiBcInByZS1saW5lXCIsXHJcbiAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICB0cmFuc2xhdGU6IHsgeDogLTAuNSwgeTogLTAuNSB9LFxyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuLyoqXHJcbiAqIEhvbGRzIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUgZm9udCB3YXMgZ2VuZXJhdGVkLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQk1Gb250SW5mbyA9IHtcclxuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgZm9udCAqL1xyXG4gICAgZmFjZTogc3RyaW5nO1xyXG4gICAgLyoqIFRoZSBzaXplIG9mIHRoZSBmb250ICovXHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGZvbnQgaXMgYm9sZCAqL1xyXG4gICAgYm9sZDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBmb250IGlzIGl0YWxpYyAqL1xyXG4gICAgaXRhbGljOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGNoYXJzZXQgb2YgdGhlIGZvbnQgKi9cclxuICAgIGNoYXJzZXQ6IHN0cmluZ1tdO1xyXG4gICAgLyoqIFRoZSBjaGFyc2V0IGlzIHVuaWNvZGUgICovXHJcbiAgICB1bmljb2RlOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGZvbnQgaGVpZ2h0IHN0cmV0Y2ggaW4gcGVyY2VudGFnZS4gMTAwJSBtZWFucyBubyBzdHJldGNoLiAqL1xyXG4gICAgc3RyZXRjaEg6IG51bWJlcjtcclxuICAgIC8qKiBTZXQgdG8gMSBpZiBzbW9vdGhpbmcgd2FzIHR1cm5lZCBvbi4gKi9cclxuICAgIHNtb290aDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBzdXBlcnNhbXBsaW5nIGxldmVsIHVzZWQuIDEgbWVhbnMgbm8gc3VwZXJzYW1wbGluZyB3YXMgdXNlZC4gKi9cclxuICAgIGFhOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIHBhZGRpbmcgZm9yIGVhY2ggY2hhcmFjdGVyICh1cCwgcmlnaHQsIGRvd24sIGxlZnQpLiAqL1xyXG4gICAgcGFkZGluZzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XHJcbiAgICAvKiogVGhlIHNwYWNpbmcgZm9yIGVhY2ggY2hhcmFjdGVyIChob3Jpem9udGFsLCB2ZXJ0aWNhbCkuICovXHJcbiAgICBzcGFjaW5nOiBbbnVtYmVyLCBudW1iZXJdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3V0bGluZSB0aGlja25lc3MgZm9yIHRoZSBjaGFyYWN0ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmsgbWlzc2luZyBpbiBtc2RmLWJtZm9udC14bWxcclxuICAgICAqL1xyXG4gICAgb3V0bGluZT86IG51bWJlcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBIb2xkcyBpbmZvcm1hdGlvbiBjb21tb24gdG8gYWxsIGNoYXJhY3RlcnMuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnRDb21tb24gPSB7XHJcbiAgICAvKiogRGlzdGFuY2UgaW4gcGl4ZWxzIGJldHdlZW4gZWFjaCBsaW5lIG9mIHRleHQgKi9cclxuICAgIGxpbmVIZWlnaHQ6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIHBpeGVscyBmcm9tIHRoZSBhYnNvbHV0ZSB0b3Agb2YgdGhlIGxpbmUgdG8gdGhlIGJhc2Ugb2YgdGhlIGNoYXJhY3RlcnMgKi9cclxuICAgIGJhc2U6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUsIG5vcm1hbGx5IHVzZWQgdG8gc2NhbGUgdGhlIHggcG9zIG9mIHRoZSBjaGFyYWN0ZXIgaW1hZ2UgKi9cclxuICAgIHNjYWxlVzogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUsIG5vcm1hbGx5IHVzZWQgdG8gc2NhbGUgdGhlIHkgcG9zIG9mIHRoZSBjaGFyYWN0ZXIgaW1hZ2UgKi9cclxuICAgIHNjYWxlSDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGZvbnQgKi9cclxuICAgIHBhZ2VzOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDEgaWYgdGhlIG1vbm9jaHJvbWUgY2hhcmFjdGVycyBoYXZlIGJlZW4gcGFja2VkIGludG8gZWFjaCBvZiB0aGUgdGV4dHVyZSBjaGFubmVscy4gSW4gdGhpcyBjYXNlIGFscGhhQ2hubCBkZXNjcmliZXMgd2hhdCBpcyBzdG9yZWQgaW4gZWFjaCBjaGFubmVsLiAqL1xyXG4gICAgcGFja2VkOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDAgaWYgdGhlIGNoYW5uZWwgaG9sZHMgdGhlIGdseXBoIGRhdGEsIDEgaWYgaXQgaG9sZHMgdGhlIG91dGxpbmUsIDIgaWYgaXQgaG9sZHMgdGhlIGdseXBoIGFuZCB0aGUgb3V0bGluZSwgMyBpZiBpdHMgc2V0IHRvIHplcm8sIGFuZCA0IGlmIGl0cyBzZXQgdG8gb25lLiAqL1xyXG4gICAgYWxwaGFDaG5sOiBudW1iZXI7XHJcbiAgICAvKiogU2V0IHRvIDAgaWYgdGhlIGNoYW5uZWwgaG9sZHMgdGhlIGdseXBoIGRhdGEsIDEgaWYgaXQgaG9sZHMgdGhlIG91dGxpbmUsIDIgaWYgaXQgaG9sZHMgdGhlIGdseXBoIGFuZCB0aGUgb3V0bGluZSwgMyBpZiBpdHMgc2V0IHRvIHplcm8sIGFuZCA0IGlmIGl0cyBzZXQgdG8gb25lLiAqL1xyXG4gICAgcmVkQ2hubDogbnVtYmVyO1xyXG4gICAgLyoqIFNldCB0byAwIGlmIHRoZSBjaGFubmVsIGhvbGRzIHRoZSBnbHlwaCBkYXRhLCAxIGlmIGl0IGhvbGRzIHRoZSBvdXRsaW5lLCAyIGlmIGl0IGhvbGRzIHRoZSBnbHlwaCBhbmQgdGhlIG91dGxpbmUsIDMgaWYgaXRzIHNldCB0byB6ZXJvLCBhbmQgNCBpZiBpdHMgc2V0IHRvIG9uZS4gKi9cclxuICAgIGdyZWVuQ2hubDogbnVtYmVyO1xyXG4gICAgLyoqIFNldCB0byAwIGlmIHRoZSBjaGFubmVsIGhvbGRzIHRoZSBnbHlwaCBkYXRhLCAxIGlmIGl0IGhvbGRzIHRoZSBvdXRsaW5lLCAyIGlmIGl0IGhvbGRzIHRoZSBnbHlwaCBhbmQgdGhlIG91dGxpbmUsIDMgaWYgaXRzIHNldCB0byB6ZXJvLCBhbmQgNCBpZiBpdHMgc2V0IHRvIG9uZS4gKi9cclxuICAgIGJsdWVDaG5sOiBudW1iZXI7XHJcbn07XHJcblxyXG4vKiogTmFtZSBvZiBhIHRleHR1cmUgZmlsZS4gVGhlcmUgaXMgb25lIGZvciBlYWNoIHBhZ2UgaW4gdGhlIGZvbnQuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udFBhZ2VzID0ge1xyXG4gICAgW2lkOiBudW1iZXJdOiBzdHJpbmc7XHJcbn0gJiBBcnJheTxzdHJpbmc+O1xyXG5cclxuLyoqXHJcbiAqIERlc2NyaWJlcyBhIHNpbmdsZSBjaGFyYWN0ZXIgaW4gdGhlIGZvbnRcclxuICovXHJcbmV4cG9ydCB0eXBlIEJNRm9udENoYXIgPSB7XHJcbiAgICAvKiogQ2hhcmFjdGVyIGlkIChjaGFyQ29kZSkgKi9cclxuICAgIGlkOiBudW1iZXI7XHJcbiAgICAvKiogTGVmdCBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGltYWdlIGluIHRoZSB0ZXh0dXJlLiAqL1xyXG4gICAgeDogbnVtYmVyO1xyXG4gICAgLyoqIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgaW1hZ2UgaW4gdGhlIHRleHR1cmUgKi9cclxuICAgIHk6IG51bWJlcjtcclxuICAgIC8qKiBXaWR0aCBvZiB0aGUgY2hyYWN0ZXIgaW1hZ2UgaW4gdGhlIHRleHR1cmUgKi9cclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogSGVpZ2h0IG9mIHRoZSBjaHJhY3RlciBpbWFnZSBpbiB0aGUgdGV4dHVyZSAqL1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgICAvKiogSG9yaXpvbnRhbCBvZmZzZXQgdG8gYmUgYXBwbGllZCBvbiBzY3JlZW4gKi9cclxuICAgIHhvZmZzZXQ6IG51bWJlcjtcclxuICAgIC8qKiBWZXJ0aWNhbCBvZmZzZXQgdG8gYmUgYXBwbGllZCBvbiBzY3JlZW4gKi9cclxuICAgIHlvZmZzZXQ6IG51bWJlcjtcclxuICAgIC8qKiBIb3Jpem9udGFsIGFkdmFuY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlciAqL1xyXG4gICAgeGFkdmFuY2U6IG51bWJlcjtcclxuICAgIC8qKiBQYWdlIGluZGV4IHdoZXJlIHRoZSBjaGFyYWN0ZXIgaW1hZ2UgaXMgZm91bmQgKi9cclxuICAgIHBhZ2U6IG51bWJlcjtcclxuICAgIC8qKiBUZXh0dXJlIGNoYW5uZWwgd2hlcmUgdGhlIGNocmFjdGVyIGltYWdlIGlzIGZvdW5kXHJcbiAgICAgKiAtIDEgPSBibHVlXHJcbiAgICAgKiAtIDIgPSBncmVlblxyXG4gICAgICogLSAzID0gcmVkXHJcbiAgICAgKiAtIDggPSBhbHBoYVxyXG4gICAgICogLSAxNSA9IGFsbCBjaGFubmVsc1xyXG4gICAgICovXHJcbiAgICBjaG5sOiBudW1iZXI7XHJcbn0gJiBCTUZvbnRDaGFyRXh0cmE7XHJcblxyXG4vKipcclxuICogYWRkaXRpb25hbCBjb250ZXh0IGZyb20gbXNkZi1ibWZvbnQteG1sXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnRDaGFyRXh0cmEgPSB7XHJcbiAgICAvKiogaW5kZXggb2Ygb3BlbnR5cGUuanMgZ2x5cGggKi9cclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICAvKiogYWN0dWFsIGNoYXJhY3RlciovXHJcbiAgICBjaGFyOiBzdHJpbmc7XHJcbn07XHJcblxyXG4vKipcclxuICogVGhlIGtlcm5pbmcgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBhZGp1c3QgdGhlIGRpc3RhbmNlIGJldHdlZW4gY2VydGFpbiBjaGFyYWN0ZXJzLCBlLmcuIHNvbWUgY2hhcmFjdGVycyBzaG91bGQgYmUgcGxhY2VkIGNsb3NlciB0byBlYWNoIG90aGVyIHRoYW4gb3RoZXJzLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQk1Gb250S2VybmluZyA9IHtcclxuICAgIC8qKiBUaGUgZmlyc3QgY2hhcmFjdGVyIGlkLiAqL1xyXG4gICAgZmlyc3Q6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgc2Vjb25kIGNoYXJhY3RlciBpZC4gKi9cclxuICAgIHNlY29uZDogbnVtYmVyO1xyXG4gICAgLyoqIEhvdyBtdWNoIHRoZSB4IHBvc2l0aW9uIHNob3VsZCBiZSBhZGp1c3RlZCB3aGVuIGRyYXdpbmcgdGhlIHNlY29uZCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBmaXJzdC4gKi9cclxuICAgIGFtb3VudDogbnVtYmVyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbXBhdGlibGUgd2l0aCBbbXNkZi1ibWZvbnQteG1sXShodHRwczovL2dpdGh1Yi5jb20vc29pbXkvbXNkZi1ibWZvbnQteG1sKVxyXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmFuZ2VsY29kZS5jb20vcHJvZHVjdHMvYm1mb250L2RvYy9maWxlX2Zvcm1hdC5odG1sXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCTUZvbnQgPSB7XHJcbiAgICAvKioge0Bpbmhlcml0RG9jIEJNRm9udEluZm99ICovXHJcbiAgICBpbmZvOiBCTUZvbnRJbmZvO1xyXG4gICAgLyoqIHtAaW5oZXJpdERvYyBCTUZvbnRDb21tb259ICovXHJcbiAgICBjb21tb246IEJNRm9udENvbW1vbjtcclxuICAgIC8qKiB7QGluaGVyaXREb2MgQk1Gb250UGFnZXN9ICovXHJcbiAgICBwYWdlczogQk1Gb250UGFnZXM7XHJcbiAgICAvKioge0Bpbmhlcml0RG9jIEJNRm9udENoYXJ9ICovXHJcbiAgICBjaGFyczogQk1Gb250Q2hhcltdO1xyXG4gICAgLyoqIHtAaW5oZXJpdERvYyBCTUZvbnRLZXJuaW5nfSAqL1xyXG4gICAga2VybmluZ3M6IEJNRm9udEtlcm5pbmdbXTtcclxufTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5pbXBvcnQgdHlwZSB7IEJNRm9udCB9IGZyb20gXCIuL2JtRm9udFwiO1xyXG5cclxuZXhwb3J0IHR5cGUgU2RmRm9udERpc3RhbmNlRmllbGQgPSB7XHJcbiAgICBmaWVsZFR5cGU6IFwic2RmXCIgfCBcIm1zZGZcIjtcclxuICAgIGRpc3RhbmNlUmFuZ2U6IG51bWJlcjtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIFNkZkZvbnQgPSBCTUZvbnQgJiB7XHJcbiAgICBkaXN0YW5jZUZpZWxkOiBTZGZGb250RGlzdGFuY2VGaWVsZDtcclxufTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xyXG5pbXBvcnQgdHlwZSB7IEJNRm9udENoYXIgfSBmcm9tIFwiLi9ibUZvbnRcIjtcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IHR5cGUgU2RmR2x5cGggPSB7XHJcbiAgICBjaGFyOiBCTUZvbnRDaGFyO1xyXG4gICAgLyoqIGluZGV4IG9mIHRoZSBsaW5lICovXHJcbiAgICBsaW5lOiBudW1iZXI7XHJcbiAgICAvKiogcG9zaXRpb24gd2l0aGluIHRoZSBsaW5lICovXHJcbiAgICBwb3NpdGlvbjogbnVtYmVyO1xyXG4gICAgeDogbnVtYmVyO1xyXG4gICAgeTogbnVtYmVyO1xyXG59O1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9ibUZvbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZvbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dseXBoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYXJhZ3JhcGhcIjtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGpzZG9jL3JlcXVpcmUtanNkb2MgKi9cclxuaW1wb3J0IHR5cGUgeyBTZGZHbHlwaCB9IGZyb20gXCIuL2dseXBoXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFNkZlRleHRMaW5lID0ge1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gICAgZ2x5cGhzOiBTZGZHbHlwaFtdO1xyXG4gICAgc3RhcnQ6IG51bWJlcjtcclxuICAgIGVuZDogbnVtYmVyO1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxufTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgYmFieWxvbmpzL2F2YWlsYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXHJcbmltcG9ydCB0eXBlIHsgRm9udEFzc2V0IH0gZnJvbSBcIi4uL2ZvbnRBc3NldFwiO1xyXG5pbXBvcnQgeyBEZWZhdWx0UGFyYWdyYXBoT3B0aW9ucywgdHlwZSBQYXJhZ3JhcGhPcHRpb25zIH0gZnJvbSBcIi4uL3BhcmFncmFwaE9wdGlvbnNcIjtcclxuaW1wb3J0IHR5cGUgeyBCTUZvbnRDaGFyIH0gZnJvbSBcIi4vYm1Gb250XCI7XHJcbmltcG9ydCB0eXBlIHsgU2RmR2x5cGggfSBmcm9tIFwiLi9nbHlwaFwiO1xyXG5pbXBvcnQgdHlwZSB7IFNkZlRleHRMaW5lIH0gZnJvbSBcIi4vbGluZVwiO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgU2RmVGV4dFBhcmFncmFwaCB7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogUGFyYWdyYXBoT3B0aW9ucztcclxuXHJcbiAgICBnZXQgbGluZUhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb250QXNzZXQuX2ZvbnQuY29tbW9uLmxpbmVIZWlnaHQgKiB0aGlzLm9wdGlvbnMubGluZUhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICByZWFkb25seSBwYXJhZ3JhcGg7XHJcbiAgICByZWFkb25seSBsaW5lcztcclxuICAgIHJlYWRvbmx5IHdpZHRoO1xyXG4gICAgcmVhZG9ubHkgaGVpZ2h0O1xyXG4gICAgcmVhZG9ubHkgZ2x5cGhzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0ZXh0OiBzdHJpbmcsXHJcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGZvbnRBc3NldDogRm9udEFzc2V0LFxyXG4gICAgICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFBhcmFncmFwaE9wdGlvbnM+XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLkRlZmF1bHRQYXJhZ3JhcGhPcHRpb25zLCAuLi5vcHRpb25zIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHsgcGFyYWdyYXBoLCBsaW5lcywgZ2x5cGhzLCB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLl9jb21wdXRlTWV0cmljcyh0ZXh0KTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJhZ3JhcGggPSBwYXJhZ3JhcGg7XHJcbiAgICAgICAgdGhpcy5saW5lcyA9IGxpbmVzO1xyXG4gICAgICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzO1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jb21wdXRlTWV0cmljcyh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBjb2xsYXBzZWQgPSB0aGlzLl9jb2xsYXBzZSh0ZXh0KTtcclxuICAgICAgICBjb25zdCBicmVha2VkID0gdGhpcy5fYnJlYWtMaW5lcyhjb2xsYXBzZWQpO1xyXG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBicmVha2VkLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xyXG5cclxuICAgICAgICBjb25zdCBsaW5lczogU2RmVGV4dExpbmVbXSA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0cmltbWVkKSB7XHJcbiAgICAgICAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5fd3JhcChsaW5lLCBsaW5lcy5sZW5ndGgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoLi4ubGluZXMubWFwKChsaW5lKSA9PiBsaW5lLndpZHRoKSk7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5saW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRleHRBbGlnbiAhPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnRyYW5zbGF0ZSkge1xyXG4gICAgICAgICAgICBsaW5lcy5mb3JFYWNoKChsaW5lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnRleHRBbGlnbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aWR0aCAtIGxpbmUud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAod2lkdGggLSBsaW5lLndpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSB0aGlzLm9wdGlvbnMudHJhbnNsYXRlID8gdGhpcy5vcHRpb25zLnRyYW5zbGF0ZS54ICogd2lkdGggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMub3B0aW9ucy50cmFuc2xhdGUgPyB0aGlzLm9wdGlvbnMudHJhbnNsYXRlLnkgKiBoZWlnaHQgOiAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBsaW5lLmdseXBocykge1xyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoLnggKz0gYW5jaG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoLnggKz0geDtcclxuICAgICAgICAgICAgICAgICAgICBnbHlwaC55ICs9IHk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ2x5cGhzID0gbGluZXMuZmxhdE1hcCgobGluZSkgPT4gbGluZS5nbHlwaHMpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwYXJhZ3JhcGg6IHRyaW1tZWQuam9pbihcIlxcblwiKSxcclxuICAgICAgICAgICAgbGluZXMsXHJcbiAgICAgICAgICAgIGdseXBocyxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2JyZWFrTGluZXModGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY29sbGFwc2UodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx0L2csIFwiIFwiLnJlcGVhdCh0aGlzLm9wdGlvbnMudGFiU2l6ZSkpLnJlcGxhY2UoLyArL2csIFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF93cmFwKHRleHQ6IHN0cmluZywgbGluZU9mZnNldCA9IDApIHtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxTZGZUZXh0TGluZT4oKTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRMaW5lID0gbGluZU9mZnNldDtcclxuICAgICAgICBsZXQgY3VycmVudEdseXBocyA9IG5ldyBBcnJheTxTZGZHbHlwaD4oKTtcclxuICAgICAgICBsZXQgY3VycmVudEN1cnNvciA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IGxhc3RDaGFyOiBCTUZvbnRDaGFyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBzdGFydCA9IDA7XHJcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0O1xyXG5cclxuICAgICAgICBjb25zdCBwdXNoQ3VycmVudExpbmUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dC5zbGljZShzdGFydCwgZW5kKSxcclxuICAgICAgICAgICAgICAgIGdseXBoczogY3VycmVudEdseXBocyxcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcclxuICAgICAgICAgICAgICAgIGVuZDogZW5kLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gdGhpcy5mb250QXNzZXQuX2dldENoYXIoY2hhckNvZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyV2lkdGggPSBjaGFyLndpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBrZXJuaW5nID0gbGFzdENoYXIgPyB0aGlzLmZvbnRBc3NldC5fZ2V0S2VybmluZyhsYXN0Q2hhci5pZCwgY2hhci5pZCkgOiAwO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudEN1cnNvciArPSBrZXJuaW5nO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdXaWR0aCA9IGN1cnJlbnRDdXJzb3IgKyBjaGFyV2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclByb2dyZXNzID0gY2hhci54YWR2YW5jZSArIHRoaXMub3B0aW9ucy5sZXR0ZXJTcGFjaW5nO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0UG9zaXRpb24gPSBjdXJyZW50Q3Vyc29yICsgY3Vyc29yUHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRCcmVhayA9IG5leHRQb3NpdGlvbiA+IHRoaXMub3B0aW9ucy5tYXhXaWR0aCB8fCBuZXdXaWR0aCA+IHRoaXMub3B0aW9ucy5tYXhXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG91bGRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgcHVzaEN1cnJlbnRMaW5lKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUrKztcclxuICAgICAgICAgICAgICAgIGxhc3RDaGFyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDE7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50R2x5cGhzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBjdXJyZW50Q3Vyc29yO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gY3VycmVudExpbmUgKiB0aGlzLmxpbmVIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50R2x5cGhzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgY2hhcixcclxuICAgICAgICAgICAgICAgIGxpbmU6IGN1cnJlbnRMaW5lLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGN1cnJlbnRHbHlwaHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgeDogeCxcclxuICAgICAgICAgICAgICAgIHk6IHksXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFzaG91bGRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgbGFzdENoYXIgPSBjaGFyO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IG5leHRQb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgICAgICAgICAgZW5kKys7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gY3Vyc29yUHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50R2x5cGhzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGxhc3RDaGFyKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50V2lkdGggKz0gbGFzdENoYXIueGFkdmFuY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHVzaEN1cnJlbnRMaW5lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGluZXM7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHR5cGUgeyBWZXJ0ZXhCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiY29yZS9CdWZmZXJzL2J1ZmZlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0RW5naW5lIH0gZnJvbSBcImNvcmUvRW5naW5lcy9hYnN0cmFjdEVuZ2luZVwiO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiY29yZS9FbmdpbmVzL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IFRoaW5FbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3RoaW5FbmdpbmVcIjtcclxuaW1wb3J0IHsgRHJhd1dyYXBwZXIgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZHJhd1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2hhZGVyTGFuZ3VhZ2UgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvc2hhZGVyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHR5cGUgeyBJRGlzcG9zYWJsZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgeyBTZGZUZXh0UGFyYWdyYXBoIH0gZnJvbSBcIi4vc2RmL3BhcmFncmFwaFwiO1xyXG5pbXBvcnQgdHlwZSB7IEZvbnRBc3NldCB9IGZyb20gXCIuL2ZvbnRBc3NldFwiO1xyXG5pbXBvcnQgdHlwZSB7IFBhcmFncmFwaE9wdGlvbnMgfSBmcm9tIFwiLi9wYXJhZ3JhcGhPcHRpb25zXCI7XHJcbmltcG9ydCB7IFRoaW5NYXRyaXggfSBmcm9tIFwiY29yZS9NYXRocy9UaGluTWF0aHMvdGhpbk1hdGgubWF0cml4XCI7XHJcbmltcG9ydCB7XHJcbiAgICBDb3B5TWF0cml4VG9BcnJheSxcclxuICAgIENvcHlNYXRyaXhUb1JlZixcclxuICAgIElkZW50aXR5TWF0cml4VG9SZWYsXHJcbiAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYsXHJcbiAgICBTY2FsaW5nTWF0cml4VG9SZWYsXHJcbiAgICBUcmFuc2xhdGlvbk1hdHJpeFRvUmVmLFxyXG59IGZyb20gXCJjb3JlL01hdGhzL1RoaW5NYXRocy90aGluTWF0aC5tYXRyaXguZnVuY3Rpb25zXCI7XHJcbmltcG9ydCB0eXBlIHsgSUNvbG9yNExpa2UsIElNYXRyaXhMaWtlIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5saWtlXCI7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgTm9kZSBjbGFzcyBmcm9tIEJhYnlsb24uanNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5vZGVMaWtlIHtcclxuICAgIGdldFdvcmxkTWF0cml4KCk6IElNYXRyaXhMaWtlO1xyXG59XHJcblxyXG4vKipcclxuICogQ2xhc3MgdXNlZCB0byByZW5kZXIgdGV4dCB1c2luZyBNU0RGIChNdWx0aS1jaGFubmVsIFNpZ25lZCBEaXN0YW5jZSBGaWVsZCkgdGVjaG5pcXVlXHJcbiAqIFRoYW5rcyBhIGxvdCB0byB0aGUgd29yayBvZiBCaHVzaGFuX1dhZ2ggYW5kIHpiX3NqIGZvciB0aGVpciBhbWF6aW5nIHdvcmsgb24gTVNERiBmb3IgQmFieWxvbi5qc1xyXG4gKiAjNlJMQ1dQIzE2XHJcbiAqIFN0YXIgd2FycyBzY3JvbGxlcjogIzZSTENXUCMyOVxyXG4gKiBXaXRoIG1ldHJpY3M6ICM2UkxDV1AjMzVcclxuICogVGhpY2tuZXNzOiAjSUFCTUVaIzNcclxuICogU29sYXIgc3lzdGVtOiAjOVlDRFlDIzlcclxuICogU3Ryb2tlOiAjNlJMQ1dQIzM3XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGV4dFJlbmRlcmVyIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdXNlVkFPOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9lbmdpbmU6IEFic3RyYWN0RW5naW5lO1xyXG4gICAgcHJpdmF0ZSBfc2hhZGVyTGFuZ3VhZ2U6IFNoYWRlckxhbmd1YWdlO1xyXG4gICAgcHJpdmF0ZSBfdmVydGV4QnVmZmVyczogeyBba2V5OiBzdHJpbmddOiBWZXJ0ZXhCdWZmZXIgfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBfc3ByaXRlQnVmZmVyOiBOdWxsYWJsZTxCdWZmZXI+O1xyXG4gICAgcHJpdmF0ZSBfd29ybGRCdWZmZXI6IE51bGxhYmxlPEJ1ZmZlcj47XHJcbiAgICBwcml2YXRlIF91dkJ1ZmZlcjogTnVsbGFibGU8QnVmZmVyPjtcclxuICAgIHByaXZhdGUgX2RyYXdXcmFwcGVyQmFzZTogRHJhd1dyYXBwZXI7XHJcbiAgICBwcml2YXRlIF92ZXJ0ZXhBcnJheU9iamVjdDogV2ViR0xWZXJ0ZXhBcnJheU9iamVjdDtcclxuICAgIHByaXZhdGUgX2ZvbnQ6IEZvbnRBc3NldDtcclxuICAgIHByaXZhdGUgX2NoYXJNYXRyaWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBwcml2YXRlIF9jaGFyVXZzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIHByaXZhdGUgX2lzRGlydHkgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfYmFzZUxpbmUgPSAwO1xyXG5cclxuICAgIC8vIENhY2hlXHJcbiAgICBwcml2YXRlIF9zY2FsaW5nTWF0cml4ID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuICAgIHByaXZhdGUgX2ZvbnRTY2FsZU1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9vZmZzZXRNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25NYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfYmFzZU1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9zY2FsZWRNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfbG9jYWxNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfZmluYWxNYXRyaXggPSBuZXcgVGhpbk1hdHJpeCgpO1xyXG4gICAgcHJpdmF0ZSBfbGluZU1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcbiAgICBwcml2YXRlIF9wYXJlbnRXb3JsZE1hdHJpeCA9IG5ldyBUaGluTWF0cml4KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xvcjogSUNvbG9yNExpa2UgPSB7IHI6IDEuMCwgZzogMS4wLCBiOiAxLjAsIGE6IDEuMCB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBjb2xvciBvZiB0aGUgc3Ryb2tlIGFyb3VuZCB0aGUgdGV4dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3Ryb2tlQ29sb3I6IElDb2xvcjRMaWtlID0geyByOiAxLjAsIGc6IDEuMCwgYjogMS4wLCBhOiAxLjAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgd2lkdGggb2YgdGhlIHN0cm9rZSBhcm91bmQgdGhlIHRleHQgKGluc2V0KVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3Ryb2tlSW5zZXRXaWR0aCA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIHdpZHRoIG9mIHRoZSBzdHJva2UgYXJvdW5kIHRoZSB0ZXh0IChvdXRzZXQpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdHJva2VPdXRzZXRXaWR0aCA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgdGV4dCAoMCBtZWFucyBhcyBkZWZpbmVkIGluIHRoZSBmb250KVxyXG4gICAgICogVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIC0wLjUgYW5kIDAuNVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhpY2tuZXNzQ29udHJvbCA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfcGFyZW50OiBOdWxsYWJsZTxJTm9kZUxpa2U+ID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgcGFyZW50IG9mIHRoZSB0ZXh0IHJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgcGFyZW50KCk6IE51bGxhYmxlPElOb2RlTGlrZT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBwYXJlbnQodmFsdWU6IE51bGxhYmxlPElOb2RlTGlrZT4pIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm1NYXRyaXg6IElNYXRyaXhMaWtlID0gbmV3IFRoaW5NYXRyaXgoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGUgdGV4dCByZW5kZXJlclxyXG4gICAgICogSXQgd2lsbCBiZSBhcHBsaWVkIGluIHRoYXQgb3JkZXI6XHJcbiAgICAgKiBwYXJlbnQgeCB0cmFuc2Zvcm0geCBwYXJhZ3JhcGggd29ybGRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB0cmFuc2Zvcm1NYXRyaXgoKTogSU1hdHJpeExpa2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm1NYXRyaXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0cmFuc2Zvcm1NYXRyaXgodmFsdWU6IElNYXRyaXhMaWtlKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtTWF0cml4ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIHRleHQgaXMgYmlsbGJvYXJkZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzQmlsbGJvYXJkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIHRleHQgaXMgc2NyZWVuIHByb2plY3RlZFxyXG4gICAgICogVGhpcyB3aWxsIHdvcmsgb25seSBpZiB0aGUgdGV4dCBpcyBiaWxsYm9hcmRlZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNCaWxsYm9hcmRTY3JlZW5Qcm9qZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSB0ZXh0IHJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2hhcmFjdGVyQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhck1hdHJpY2VzLmxlbmd0aCAvIDE2O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGlmIHRoZSB0ZXh0IHJlbmRlcmVyIHNob3VsZCBpZ25vcmUgdGhlIGRlcHRoIGJ1ZmZlclxyXG4gICAgICogRGVmYXVsdCBpcyBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaWdub3JlRGVwdGhCdWZmZXIgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGVuZ2luZTogQWJzdHJhY3RFbmdpbmUsIHNoYWRlckxhbmd1YWdlOiBTaGFkZXJMYW5ndWFnZSA9IFNoYWRlckxhbmd1YWdlLkdMU0wsIGZvbnQ6IEZvbnRBc3NldCkge1xyXG4gICAgICAgIHRoaXMuX2VuZ2luZSA9IGVuZ2luZTtcclxuICAgICAgICB0aGlzLl9zaGFkZXJMYW5ndWFnZSA9IHNoYWRlckxhbmd1YWdlO1xyXG4gICAgICAgIHRoaXMuX2ZvbnQgPSBmb250O1xyXG4gICAgICAgIHRoaXMuX2Jhc2VMaW5lID0gZm9udC5fZm9udC5jb21tb24ubGluZUhlaWdodCAqIGZvbnQuc2NhbGU7XHJcblxyXG4gICAgICAgIHRoaXMuX3VzZVZBTyA9IGVuZ2luZS5nZXRDYXBzKCkudmVydGV4QXJyYXlPYmplY3QgJiYgIWVuZ2luZS5kaXNhYmxlVmVydGV4QXJyYXlPYmplY3RzO1xyXG5cclxuICAgICAgICAvLyBNYWluIHZlcnRleCBidWZmZXJcclxuICAgICAgICBjb25zdCBzcHJpdGVEYXRhID0gbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgMSwgMCwgMCwgMSwgMSwgMV0pO1xyXG4gICAgICAgIHRoaXMuX3Nwcml0ZUJ1ZmZlciA9IG5ldyBCdWZmZXIoZW5naW5lLCBzcHJpdGVEYXRhLCBmYWxzZSwgMik7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcIm9mZnNldHNcIl0gPSB0aGlzLl9zcHJpdGVCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwib2Zmc2V0c1wiLCAwLCAyKTtcclxuXHJcbiAgICAgICAgLy8gSW5zdGFuY2VzXHJcbiAgICAgICAgdGhpcy5fcmVzaXplQnVmZmVycygxMjgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Jlc2l6ZUJ1ZmZlcnMoY2FwYWNpdHk6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JsZEJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91dkJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3V2QnVmZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyID0gbmV3IEJ1ZmZlcih0aGlzLl9lbmdpbmUsIG5ldyBGbG9hdDMyQXJyYXkoY2FwYWNpdHkgKiAxNiksIHRydWUsIDE2KTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1wid29ybGQwXCJdID0gdGhpcy5fd29ybGRCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwid29ybGQwXCIsIDAsIDQsIDE2LCB0cnVlKTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1wid29ybGQxXCJdID0gdGhpcy5fd29ybGRCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwid29ybGQxXCIsIDQsIDQsIDE2LCB0cnVlKTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1wid29ybGQyXCJdID0gdGhpcy5fd29ybGRCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwid29ybGQyXCIsIDgsIDQsIDE2LCB0cnVlKTtcclxuICAgICAgICB0aGlzLl92ZXJ0ZXhCdWZmZXJzW1wid29ybGQzXCJdID0gdGhpcy5fd29ybGRCdWZmZXIuY3JlYXRlVmVydGV4QnVmZmVyKFwid29ybGQzXCIsIDEyLCA0LCAxNiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3V2QnVmZmVyID0gbmV3IEJ1ZmZlcih0aGlzLl9lbmdpbmUsIG5ldyBGbG9hdDMyQXJyYXkoY2FwYWNpdHkgKiA0KSwgdHJ1ZSwgNCk7XHJcbiAgICAgICAgdGhpcy5fdmVydGV4QnVmZmVyc1tcInV2c1wiXSA9IHRoaXMuX3V2QnVmZmVyLmNyZWF0ZVZlcnRleEJ1ZmZlcihcInV2c1wiLCAwLCA0LCA0LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zZXRTaGFkZXJzKHZlcnRleDogc3RyaW5nLCBmcmFnbWVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhd1dyYXBwZXJCYXNlPy5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZSA9IG5ldyBEcmF3V3JhcHBlcih0aGlzLl9lbmdpbmUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhd1dyYXBwZXJCYXNlLmRyYXdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZS5kcmF3Q29udGV4dC51c2VJbnN0YW5jaW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRlZmluZXMgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmF3V3JhcHBlckJhc2UuZWZmZWN0ID0gdGhpcy5fZW5naW5lLmNyZWF0ZUVmZmVjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmVydGV4U291cmNlOiB2ZXJ0ZXgsXHJcbiAgICAgICAgICAgICAgICBmcmFnbWVudFNvdXJjZTogZnJhZ21lbnQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtcIm9mZnNldHNcIiwgXCJ3b3JsZDBcIiwgXCJ3b3JsZDFcIiwgXCJ3b3JsZDJcIiwgXCJ3b3JsZDNcIiwgXCJ1dnNcIl0sXHJcbiAgICAgICAgICAgIFtcInBhcmVudFdvcmxkXCIsIFwidmlld1wiLCBcInByb2plY3Rpb25cIiwgXCJ1Q29sb3JcIiwgXCJ0aGlja25lc3NcIiwgXCJ1U3Ryb2tlQ29sb3JcIiwgXCJ1U3Ryb2tlSW5zZXRXaWR0aFwiLCBcInVTdHJva2VPdXRzZXRXaWR0aFwiLCBcIm1vZGVcIiwgXCJ0cmFuc2Zvcm1cIl0sXHJcbiAgICAgICAgICAgIFtcImZvbnRBdGxhc1wiXSxcclxuICAgICAgICAgICAgZGVmaW5lcyxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0aGlzLl9zaGFkZXJMYW5ndWFnZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYXdXcmFwcGVyQmFzZS5lZmZlY3QuX3JlZkNvdW50Kys7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBwYXJhZ3JhcGggb2YgdGV4dCB0byB0aGUgcmVuZGVyZXJcclxuICAgICAqIEBwYXJhbSB0ZXh0IGRlZmluZSB0aGUgdGV4dCB0byBhZGRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIGRlZmluZSB0aGUgb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBwYXJhZ3JhcGggKG9wdGlvbmFsKVxyXG4gICAgICogQHBhcmFtIHdvcmxkTWF0cml4IGRlZmluZSB0aGUgd29ybGQgbWF0cml4IHRvIHVzZSBmb3IgdGhlIHBhcmFncmFwaCAob3B0aW9uYWwpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRQYXJhZ3JhcGgodGV4dDogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxQYXJhZ3JhcGhPcHRpb25zPiwgd29ybGRNYXRyaXg/OiBJTWF0cml4TGlrZSkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IG5ldyBTZGZUZXh0UGFyYWdyYXBoKHRleHQsIHRoaXMuX2ZvbnQsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBjb25zdCBmb250U2NhbGUgPSB0aGlzLl9mb250LnNjYWxlO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXhXaWR0aCA9IHRoaXMuX2ZvbnQuX2ZvbnQuY29tbW9uLnNjYWxlVztcclxuICAgICAgICBjb25zdCB0ZXhIZWlnaHQgPSB0aGlzLl9mb250Ll9mb250LmNvbW1vbi5zY2FsZUg7XHJcbiAgICAgICAgY29uc3QgZ2x5cGhzID0gcGFyYWdyYXBoLmdseXBocy5maWx0ZXIoKGcpID0+IGcuY2hhci5wYWdlID49IDApO1xyXG5cclxuICAgICAgICBsZXQgd29ybGRNYXRyaXhUb1VzZSA9IHdvcmxkTWF0cml4O1xyXG5cclxuICAgICAgICBpZiAoIXdvcmxkTWF0cml4VG9Vc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHBhcmFncmFwaC5saW5lSGVpZ2h0ICogZm9udFNjYWxlO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lT2Zmc2V0ID0gKHBhcmFncmFwaC5saW5lcy5sZW5ndGggKiBsaW5lSGVpZ2h0KSAvIDI7XHJcbiAgICAgICAgICAgIFRyYW5zbGF0aW9uTWF0cml4VG9SZWYoMCwgdGhpcy5fYmFzZUxpbmUgLSBsaW5lT2Zmc2V0LCAwLCB0aGlzLl9saW5lTWF0cml4KTtcclxuICAgICAgICAgICAgd29ybGRNYXRyaXhUb1VzZSA9IHRoaXMuX2xpbmVNYXRyaXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBTY2FsaW5nTWF0cml4VG9SZWYoZm9udFNjYWxlLCBmb250U2NhbGUsIDEuMCwgdGhpcy5fZm9udFNjYWxlTWF0cml4KTtcclxuICAgICAgICBUcmFuc2xhdGlvbk1hdHJpeFRvUmVmKDAuNSwgLTAuNSwgMCwgdGhpcy5fb2Zmc2V0TWF0cml4KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2hhcnNVdnNCYXNlID0gdGhpcy5fY2hhclV2cy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgbWF0cmljZXNCYXNlID0gdGhpcy5fY2hhck1hdHJpY2VzLmxlbmd0aDtcclxuICAgICAgICBnbHlwaHMuZm9yRWFjaCgoZywgaSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFyVXZzW2NoYXJzVXZzQmFzZSArIGkgKiA0ICsgMF0gPSBnLmNoYXIueCAvIHRleFdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFyVXZzW2NoYXJzVXZzQmFzZSArIGkgKiA0ICsgMV0gPSBnLmNoYXIueSAvIHRleEhlaWdodDtcclxuICAgICAgICAgICAgdGhpcy5fY2hhclV2c1tjaGFyc1V2c0Jhc2UgKyBpICogNCArIDJdID0gZy5jaGFyLndpZHRoIC8gdGV4V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYXJVdnNbY2hhcnNVdnNCYXNlICsgaSAqIDQgKyAzXSA9IGcuY2hhci5oZWlnaHQgLyB0ZXhIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB4ID0gZy54ICsgZy5jaGFyLnhvZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSAxLjAgLSAoZy55ICsgZy5jaGFyLnlvZmZzZXQpO1xyXG5cclxuICAgICAgICAgICAgU2NhbGluZ01hdHJpeFRvUmVmKGcuY2hhci53aWR0aCwgZy5jaGFyLmhlaWdodCwgMS4wLCB0aGlzLl9zY2FsaW5nTWF0cml4KTtcclxuICAgICAgICAgICAgTXVsdGlwbHlNYXRyaWNlc1RvUmVmKHRoaXMuX29mZnNldE1hdHJpeCwgdGhpcy5fc2NhbGluZ01hdHJpeCwgdGhpcy5fYmFzZU1hdHJpeCk7XHJcblxyXG4gICAgICAgICAgICBUcmFuc2xhdGlvbk1hdHJpeFRvUmVmKHggKiBmb250U2NhbGUsIHkgKiBmb250U2NhbGUsIDAuMCwgdGhpcy5fdHJhbnNsYXRpb25NYXRyaXgpO1xyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fYmFzZU1hdHJpeCwgdGhpcy5fZm9udFNjYWxlTWF0cml4LCB0aGlzLl9zY2FsZWRNYXRyaXgpO1xyXG4gICAgICAgICAgICBNdWx0aXBseU1hdHJpY2VzVG9SZWYodGhpcy5fc2NhbGVkTWF0cml4LCB0aGlzLl90cmFuc2xhdGlvbk1hdHJpeCwgdGhpcy5fbG9jYWxNYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgTXVsdGlwbHlNYXRyaWNlc1RvUmVmKHRoaXMuX2xvY2FsTWF0cml4LCB3b3JsZE1hdHJpeFRvVXNlLCB0aGlzLl9maW5hbE1hdHJpeCk7XHJcbiAgICAgICAgICAgIENvcHlNYXRyaXhUb0FycmF5KHRoaXMuX2ZpbmFsTWF0cml4LCB0aGlzLl9jaGFyTWF0cmljZXMsIG1hdHJpY2VzQmFzZSArIGkgKiAxNik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9iYXNlTGluZSAtPSBwYXJhZ3JhcGgubGluZUhlaWdodCAqIGZvbnRTY2FsZSAqIHBhcmFncmFwaC5saW5lcy5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXIgdGhlIHRleHQgdXNpbmcgdGhlIHByb3ZpZGVkIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cmljZXNcclxuICAgICAqIEBwYXJhbSB2aWV3TWF0cml4IGRlZmluZSB0aGUgdmlldyBtYXRyaXggdG8gdXNlXHJcbiAgICAgKiBAcGFyYW0gcHJvamVjdGlvbk1hdHJpeCBkZWZpbmUgdGhlIHByb2plY3Rpb24gbWF0cml4IHRvIHVzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyKHZpZXdNYXRyaXg6IElNYXRyaXhMaWtlLCBwcm9qZWN0aW9uTWF0cml4OiBJTWF0cml4TGlrZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRyYXdXcmFwcGVyID0gdGhpcy5fZHJhd1dyYXBwZXJCYXNlO1xyXG5cclxuICAgICAgICBjb25zdCBlZmZlY3QgPSBkcmF3V3JhcHBlci5lZmZlY3QhO1xyXG5cclxuICAgICAgICAvLyBDaGVja1xyXG4gICAgICAgIGlmICghZWZmZWN0LmlzUmVhZHkoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVuZ2luZSA9IHRoaXMuX2VuZ2luZTtcclxuXHJcbiAgICAgICAgZW5naW5lLnNldFN0YXRlKGZhbHNlKTtcclxuICAgICAgICBlbmdpbmUuZW5hYmxlRWZmZWN0KGRyYXdXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaWdub3JlRGVwdGhCdWZmZXIpIHtcclxuICAgICAgICAgICAgZW5naW5lLnNldERlcHRoQnVmZmVyKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgQ29weU1hdHJpeFRvUmVmKHRoaXMuX3BhcmVudC5nZXRXb3JsZE1hdHJpeCgpLCB0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgSWRlbnRpdHlNYXRyaXhUb1JlZih0aGlzLl9wYXJlbnRXb3JsZE1hdHJpeCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZmZlY3Quc2V0SW50KFwibW9kZVwiLCB0aGlzLmlzQmlsbGJvYXJkID8gKHRoaXMuaXNCaWxsYm9hcmRTY3JlZW5Qcm9qZWN0ZWQgPyAyIDogMSkgOiAwKTtcclxuICAgICAgICBlZmZlY3Quc2V0TWF0cml4KFwicGFyZW50V29ybGRcIiwgdGhpcy5fcGFyZW50V29ybGRNYXRyaXgpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJ2aWV3XCIsIHZpZXdNYXRyaXgpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJwcm9qZWN0aW9uXCIsIHByb2plY3Rpb25NYXRyaXgpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJ0cmFuc2Zvcm1cIiwgdGhpcy50cmFuc2Zvcm1NYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBUZXh0dXJlXHJcbiAgICAgICAgZWZmZWN0LnNldFRleHR1cmUoXCJmb250QXRsYXNcIiwgdGhpcy5fZm9udC50ZXh0dXJlc1swXSk7XHJcbiAgICAgICAgZWZmZWN0LnNldERpcmVjdENvbG9yNChcInVDb2xvclwiLCB0aGlzLmNvbG9yKTtcclxuICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KFwidVN0cm9rZUNvbG9yXCIsIHRoaXMuc3Ryb2tlQ29sb3IpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdChcInRoaWNrbmVzc1wiLCB0aGlzLnRoaWNrbmVzc0NvbnRyb2wgKiAwLjkpO1xyXG4gICAgICAgIGVmZmVjdC5zZXRGbG9hdChcInVTdHJva2VJbnNldFdpZHRoXCIsIHRoaXMuc3Ryb2tlSW5zZXRXaWR0aCk7XHJcbiAgICAgICAgZWZmZWN0LnNldEZsb2F0KFwidVN0cm9rZU91dHNldFdpZHRoXCIsIHRoaXMuc3Ryb2tlT3V0c2V0V2lkdGgpO1xyXG5cclxuICAgICAgICBjb25zdCBpbnN0YW5jZUNvdW50ID0gdGhpcy5fY2hhck1hdHJpY2VzLmxlbmd0aCAvIDE2O1xyXG5cclxuICAgICAgICAvLyBOZWVkIHVwZGF0ZT9cclxuICAgICAgICBpZiAodGhpcy5faXNEaXJ0eSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ybGRCdWZmZXIhLmdldEJ1ZmZlcigpIS5jYXBhY2l0eSAvIDQgPCBpbnN0YW5jZUNvdW50ICogMTYpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUJ1ZmZlcnMoaW5zdGFuY2VDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkQnVmZmVyIS51cGRhdGUodGhpcy5fY2hhck1hdHJpY2VzKTtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIhLnVwZGF0ZSh0aGlzLl9jaGFyVXZzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl91c2VWQU8pIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmVydGV4QXJyYXlPYmplY3QgPSAoZW5naW5lIGFzIFRoaW5FbmdpbmUpLnJlY29yZFZlcnRleEFycmF5T2JqZWN0KHRoaXMuX3ZlcnRleEJ1ZmZlcnMsIG51bGwsIGVmZmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKGVuZ2luZSBhcyBUaGluRW5naW5lKS5iaW5kVmVydGV4QXJyYXlPYmplY3QodGhpcy5fdmVydGV4QXJyYXlPYmplY3QsIG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFZCT3NcclxuICAgICAgICAgICAgZW5naW5lLmJpbmRCdWZmZXJzKHRoaXMuX3ZlcnRleEJ1ZmZlcnMsIG51bGwsIGVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbmdpbmUuc2V0QWxwaGFNb2RlKENvbnN0YW50cy5BTFBIQV9DT01CSU5FKTtcclxuICAgICAgICBlbmdpbmUuZHJhd0FycmF5c1R5cGUoQ29uc3RhbnRzLk1BVEVSSUFMX1RyaWFuZ2xlU3RyaXBEcmF3TW9kZSwgMCwgNCwgaW5zdGFuY2VDb3VudCk7XHJcbiAgICAgICAgZW5naW5lLnVuYmluZEluc3RhbmNlQXR0cmlidXRlcygpO1xyXG4gICAgICAgIGVuZ2luZS5zZXRBbHBoYU1vZGUoQ29uc3RhbnRzLkFMUEhBX0RJU0FCTEUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pZ25vcmVEZXB0aEJ1ZmZlcikge1xyXG4gICAgICAgICAgICBlbmdpbmUuc2V0RGVwdGhCdWZmZXIodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fd29ybGRCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRCdWZmZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZEJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdXZCdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXZCdWZmZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91dkJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3ByaXRlQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZUJ1ZmZlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZUJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpIHtcclxuICAgICAgICAgICAgKHRoaXMuX2VuZ2luZSBhcyBUaGluRW5naW5lKS5yZWxlYXNlVmVydGV4QXJyYXlPYmplY3QodGhpcy5fdmVydGV4QXJyYXlPYmplY3QpO1xyXG4gICAgICAgICAgICAoPGFueT50aGlzLl92ZXJ0ZXhBcnJheU9iamVjdCkgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVyIGluc3RhbmNlIGFzeW5jaHJvbm91c2x5XHJcbiAgICAgKiBAcGFyYW0gZm9udCBkZWZpbmUgdGhlIGZvbnQgYXNzZXQgdG8gdXNlXHJcbiAgICAgKiBAcGFyYW0gZW5naW5lIGRlZmluZSB0aGUgZW5naW5lIHRvIHVzZVxyXG4gICAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgVGV4dFJlbmRlcmVyIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgQ3JlYXRlVGV4dFJlbmRlcmVyQXN5bmMoZm9udDogRm9udEFzc2V0LCBlbmdpbmU6IEFic3RyYWN0RW5naW5lKSB7XHJcbiAgICAgICAgaWYgKCFlbmdpbmUuZ2V0Q2FwcygpLmluc3RhbmNlZEFycmF5cyB8fCAhZW5naW5lLl9mZWF0dXJlcy5zdXBwb3J0U3ByaXRlSW5zdGFuY2luZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnN0YW5jZWQgYXJyYXlzIGFyZSByZXF1aXJlZCBmb3IgTVNERiB0ZXh0IHJlbmRlcmluZy5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2hhZGVyTGFuZ3VhZ2UgPSBTaGFkZXJMYW5ndWFnZS5HTFNMO1xyXG4gICAgICAgIGxldCB2ZXJ0ZXg6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGZyYWdtZW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGlmIChlbmdpbmUuaXNXZWJHUFUpIHtcclxuICAgICAgICAgICAgc2hhZGVyTGFuZ3VhZ2UgPSBTaGFkZXJMYW5ndWFnZS5XR1NMO1xyXG4gICAgICAgICAgICB2ZXJ0ZXggPSAoYXdhaXQgaW1wb3J0KFwiLi93ZWJncHUvdmVydGV4XCIpKS5tc2RmVmVydGV4U2hhZGVyV0dTTC5zaGFkZXI7XHJcbiAgICAgICAgICAgIGZyYWdtZW50ID0gKGF3YWl0IGltcG9ydChcIi4vd2ViZ3B1L2ZyYWdtZW50XCIpKS5tc2RmRnJhZ21lbnRTaGFkZXJXR1NMLnNoYWRlcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2ZXJ0ZXggPSAoYXdhaXQgaW1wb3J0KFwiLi93ZWJnbC92ZXJ0ZXhcIikpLm1zZGZWZXJ0ZXhTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgICAgICBmcmFnbWVudCA9IChhd2FpdCBpbXBvcnQoXCIuL3dlYmdsL2ZyYWdtZW50XCIpKS5tc2RmRnJhZ21lbnRTaGFkZXIuc2hhZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGV4dFJlbmRlcmVyID0gbmV3IFRleHRSZW5kZXJlcihlbmdpbmUsIHNoYWRlckxhbmd1YWdlLCBmb250KTtcclxuICAgICAgICB0ZXh0UmVuZGVyZXIuX3NldFNoYWRlcnModmVydGV4LCBmcmFnbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0UmVuZGVyZXI7XHJcbiAgICB9XHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmNvbnN0IG5hbWUgPSBcIm1zZGZGcmFnbWVudFNoYWRlclwiO1xyXG5jb25zdCBzaGFkZXIgPSBgXHJcbiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlXHJcblxyXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XHJcblxyXG51bmlmb3JtIHNhbXBsZXIyRCBmb250QXRsYXM7XHJcbnVuaWZvcm0gdmVjNCB1Q29sb3I7XHJcbnVuaWZvcm0gdmVjNCB1U3Ryb2tlQ29sb3I7XHJcbnVuaWZvcm0gZmxvYXQgdVN0cm9rZUluc2V0V2lkdGg7XHJcbnVuaWZvcm0gZmxvYXQgdVN0cm9rZU91dHNldFdpZHRoO1xyXG51bmlmb3JtIGZsb2F0IHRoaWNrbmVzcztcclxuXHJcbnZhcnlpbmcgdmVjMiBhdGxhc1VWO1xyXG5cclxuZmxvYXQgbWVkaWFuKHZlYzMgbXNkZikge1xyXG4gICAgcmV0dXJuIG1heChtaW4obXNkZi5yLCBtc2RmLmcpLCBtaW4obWF4KG1zZGYuciwgbXNkZi5nKSwgbXNkZi5iKSk7XHJcbn1cclxuICBcclxudm9pZCBtYWluKHZvaWQpXHJcbntcclxuICAgIHZlYzMgcyA9IHRleHR1cmUyRChmb250QXRsYXMsIGF0bGFzVVYpLnJnYjtcclxuICAgIGZsb2F0IHNpZ0Rpc3QgPSBtZWRpYW4ocykgLSAwLjUgKyB0aGlja25lc3M7XHJcblxyXG4gICAgZmxvYXQgYWxwaGEgPSBjbGFtcChzaWdEaXN0IC8gZndpZHRoKHNpZ0Rpc3QpICsgMC41LCAwLjAsIDEuMCk7XHJcblxyXG4gICAgZmxvYXQgc2lnRGlzdE91dHNldCA9IHNpZ0Rpc3QgKyB1U3Ryb2tlT3V0c2V0V2lkdGggKiAwLjU7XHJcbiAgICBmbG9hdCBzaWdEaXN0SW5zZXQgPSBzaWdEaXN0IC0gdVN0cm9rZUluc2V0V2lkdGggKiAwLjU7XHJcblxyXG4gICAgZmxvYXQgb3V0c2V0ID0gY2xhbXAoc2lnRGlzdE91dHNldCAvIGZ3aWR0aChzaWdEaXN0T3V0c2V0KSArIDAuNSwgMC4wLCAxLjApO1xyXG4gICAgZmxvYXQgaW5zZXQgPSAxLjAgLSBjbGFtcChzaWdEaXN0SW5zZXQgLyBmd2lkdGgoc2lnRGlzdEluc2V0KSArIDAuNSwgMC4wLCAxLjApO1xyXG5cclxuICAgIGZsb2F0IGJvcmRlciA9IG91dHNldCAqIGluc2V0O1xyXG5cclxuICAgIHZlYzQgZmlsbGVkRnJhZ0NvbG9yID0gdmVjNCh1Q29sb3IucmdiLCBhbHBoYSAqIHVDb2xvci5hKTtcclxuICAgIHZlYzQgc3Ryb2tlZEZyYWdDb2xvciA9IHZlYzQodVN0cm9rZUNvbG9yLnJnYiwgYm9yZGVyICogdVN0cm9rZUNvbG9yLmEpO1xyXG5cclxuICAgIGdsX0ZyYWdDb2xvciA9IG1peChmaWxsZWRGcmFnQ29sb3IsIHN0cm9rZWRGcmFnQ29sb3IsIGJvcmRlcik7XHJcbn1gO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY29uc3QgbXNkZkZyYWdtZW50U2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vZnJhZ21lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZlcnRleFwiO1xuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmNvbnN0IG5hbWUgPSBcIm1zZGZWZXJ0ZXhTaGFkZXJcIjtcclxuY29uc3Qgc2hhZGVyID0gYFxyXG4jZGVmaW5lIEJJTExCT0FSRCAxXHJcbiNkZWZpbmUgQklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEIDJcclxuXHJcbmF0dHJpYnV0ZSB2ZWMyIG9mZnNldHM7XHJcbmF0dHJpYnV0ZSB2ZWM0IHdvcmxkMDtcclxuYXR0cmlidXRlIHZlYzQgd29ybGQxO1xyXG5hdHRyaWJ1dGUgdmVjNCB3b3JsZDI7XHJcbmF0dHJpYnV0ZSB2ZWM0IHdvcmxkMztcclxuYXR0cmlidXRlIHZlYzQgdXZzO1xyXG5cclxudW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTtcclxudW5pZm9ybSBtYXQ0IHBhcmVudFdvcmxkO1xyXG51bmlmb3JtIG1hdDQgdmlldztcclxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb247XHJcbnVuaWZvcm0gdmVjMyBjZW50ZXI7XHJcbnVuaWZvcm0gaW50IG1vZGU7XHJcblxyXG52YXJ5aW5nIHZlYzIgYXRsYXNVVjtcclxuXHJcbnZvaWQgbWFpbih2b2lkKSB7XHJcbiAgICBtYXQ0IHdvcmxkID0gbWF0NCh3b3JsZDAsIHdvcmxkMSwgd29ybGQyLCB3b3JsZDMpO1xyXG4gICAgdmVjNCB3b3JsZFBvcyA9IHRyYW5zZm9ybSAqICh3b3JsZCAqIHZlYzQob2Zmc2V0cy54eSAtIHZlYzIoMC41LCAwLjUpLCAwLiwgMS4wKSk7XHJcblxyXG4gICAgaWYgKG1vZGUgPj0gQklMTEJPQVJEKSB7XHJcbiAgICAgICAgdmVjMyB2aWV3UG9zID0gKHZpZXcgKiBwYXJlbnRXb3JsZCAqIHZlYzQoMC4sIDAuLCAwLiwgMS4wKSkueHl6OyBcclxuICAgICAgICBpZiAobW9kZSA9PSBCSUxMQk9BUkRTQ1JFRU5QUk9KRUNURUQpIHtcclxuICAgICAgICAgICAgdmlld1Bvcy54IC89IHZpZXdQb3MuejtcclxuICAgICAgICAgICAgdmlld1Bvcy55IC89IHZpZXdQb3MuejtcclxuICAgICAgICAgICAgdmlld1Bvcy56ID0gMS4wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2ZWM0KHZpZXdQb3MgKyB3b3JsZFBvcy54eXosMS4wKTsgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZlYzMgdmlld1BvcyA9ICh2aWV3ICogcGFyZW50V29ybGQgKiB3b3JsZFBvcykueHl6OyBcclxuICAgICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2ZWM0KHZpZXdQb3MsMS4wKTsgXHJcbiAgICB9XHJcbiAgICBhdGxhc1VWID0gdmVjMih1dnMueCArIG9mZnNldHMueCAqIHV2cy56LCB1dnMueSArICgxLjAgLSBvZmZzZXRzLnkpICogdXZzLncpO1xyXG59YDtcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNvbnN0IG1zZGZWZXJ0ZXhTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuY29uc3QgbmFtZSA9IFwibXNkZkZyYWdtZW50U2hhZGVyV0dTTFwiO1xyXG5jb25zdCBzaGFkZXIgPSBgXHJcbnZhciBmb250QXRsYXM6IHRleHR1cmVfMmQ8ZjMyPjtcclxudmFyIGZvbnRBdGxhc1NhbXBsZXI6IHNhbXBsZXI7XHJcbnVuaWZvcm0gdUNvbG9yOiB2ZWM0ZjtcclxudW5pZm9ybSB0aGlja25lc3M6IGYzMjtcclxudW5pZm9ybSB1U3Ryb2tlQ29sb3I6IHZlYzRmO1xyXG51bmlmb3JtIHVTdHJva2VJbnNldFdpZHRoOiBmMzI7XHJcbnVuaWZvcm0gdVN0cm9rZU91dHNldFdpZHRoOiBmMzI7XHJcblxyXG52YXJ5aW5nIGF0bGFzVVY6IHZlYzJmO1xyXG5cclxuZm4gbWVkaWFuKG1zZGY6IHZlYzM8ZjMyPikgLT4gZjMyIHtcclxuICAgIGxldCBhID0gbWluKG1zZGYuciwgbXNkZi5nKTtcclxuICAgIGxldCBiID0gbWF4KG1zZGYuciwgbXNkZi5nKTtcclxuICAgIHJldHVybiBtYXgoYSwgbWluKGIsIG1zZGYuYikpO1xyXG59XHJcblxyXG5AZnJhZ21lbnRcclxuZm4gbWFpbihpbnB1dDogRnJhZ21lbnRJbnB1dHMpIC0+IEZyYWdtZW50T3V0cHV0cyB7XHJcbiAgICBsZXQgcyA9IHRleHR1cmVTYW1wbGUoZm9udEF0bGFzLCBmb250QXRsYXNTYW1wbGVyLCBpbnB1dC5hdGxhc1VWKS5yZ2I7XHJcbiAgICBsZXQgc2lnRGlzdCA9IG1lZGlhbihzKSAtIDAuNSArIHVuaWZvcm1zLnRoaWNrbmVzcztcclxuXHJcbiAgICBsZXQgYWZ3aWR0aCA9IGxlbmd0aCh2ZWMyPGYzMj4oZHBkeChzaWdEaXN0KSwgZHBkeShzaWdEaXN0KSkpO1xyXG4gICAgbGV0IGFscGhhID0gY2xhbXAoc2lnRGlzdCAvIGFmd2lkdGggKyAwLjUsIDAuMCwgMS4wKTtcclxuXHJcbiAgICBsZXQgc2lnRGlzdE91dHNldCA9IHNpZ0Rpc3QgKyB1bmlmb3Jtcy51U3Ryb2tlT3V0c2V0V2lkdGggKiAwLjU7XHJcbiAgICBsZXQgc2lnRGlzdEluc2V0ID0gc2lnRGlzdCAtIHVuaWZvcm1zLnVTdHJva2VJbnNldFdpZHRoICogMC41O1xyXG5cclxuICAgIGxldCBhZndpZHRoT3V0c2V0ID0gbGVuZ3RoKHZlYzI8ZjMyPihkcGR4KHNpZ0Rpc3RPdXRzZXQpLCBkcGR5KHNpZ0Rpc3RPdXRzZXQpKSk7XHJcbiAgICBsZXQgYWZ3aWR0aEluc2V0ID0gbGVuZ3RoKHZlYzI8ZjMyPihkcGR4KHNpZ0Rpc3RJbnNldCksIGRwZHkoc2lnRGlzdEluc2V0KSkpO1xyXG5cclxuICAgIGxldCBvdXRzZXQgPSBjbGFtcChzaWdEaXN0T3V0c2V0IC8gYWZ3aWR0aE91dHNldCArIDAuNSwgMC4wLCAxLjApO1xyXG4gICAgbGV0IGluc2V0ID0gMS4wIC0gY2xhbXAoc2lnRGlzdEluc2V0IC8gYWZ3aWR0aEluc2V0ICsgMC41LCAwLjAsIDEuMCk7XHJcblxyXG4gICAgbGV0IGJvcmRlciA9IG91dHNldCAqIGluc2V0O1xyXG5cclxuICAgIGxldCBmaWxsZWRGcmFnQ29sb3IgPSB2ZWM0PGYzMj4odW5pZm9ybXMudUNvbG9yLnJnYiwgYWxwaGEgKiB1bmlmb3Jtcy51Q29sb3IuYSk7XHJcbiAgICBsZXQgc3Ryb2tlZEZyYWdDb2xvciA9IHZlYzQ8ZjMyPih1bmlmb3Jtcy51U3Ryb2tlQ29sb3IucmdiLCBib3JkZXIgKiB1bmlmb3Jtcy51U3Ryb2tlQ29sb3IuYSk7XHJcblxyXG4gICAgZnJhZ21lbnRPdXRwdXRzLmNvbG9yID0gbWl4KGZpbGxlZEZyYWdDb2xvciwgc3Ryb2tlZEZyYWdDb2xvciwgYm9yZGVyKTtcclxufWA7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjb25zdCBtc2RmRnJhZ21lbnRTaGFkZXJXR1NMID0geyBuYW1lLCBzaGFkZXIgfTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vZnJhZ21lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZlcnRleFwiO1xuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmNvbnN0IG5hbWUgPSBcIm1zZGZWZXJ0ZXhTaGFkZXJXR1NMXCI7XHJcbmNvbnN0IHNoYWRlciA9IGBcclxuI2RlZmluZSBCSUxMQk9BUkQgMVxyXG4jZGVmaW5lIEJJTExCT0FSRFNDUkVFTlBST0pFQ1RFRCAyXHJcblxyXG5hdHRyaWJ1dGUgb2Zmc2V0czogdmVjMmY7XHJcbmF0dHJpYnV0ZSB3b3JsZDA6IHZlYzRmO1xyXG5hdHRyaWJ1dGUgd29ybGQxOiB2ZWM0ZjtcclxuYXR0cmlidXRlIHdvcmxkMjogdmVjNGY7XHJcbmF0dHJpYnV0ZSB3b3JsZDM6IHZlYzRmO1xyXG5hdHRyaWJ1dGUgdXZzOiB2ZWM0ZjtcclxuXHJcbnVuaWZvcm0gdHJhbnNmb3JtOiBtYXQ0eDRmO1xyXG51bmlmb3JtIHBhcmVudFdvcmxkOiBtYXQ0eDRmO1xyXG51bmlmb3JtIHZpZXc6IG1hdDR4NGY7XHJcbnVuaWZvcm0gcHJvamVjdGlvbjogbWF0NHg0ZjtcclxudW5pZm9ybSBtb2RlOiB1MzI7XHJcblxyXG52YXJ5aW5nIGF0bGFzVVY6IHZlYzJmO1xyXG5cclxuQHZlcnRleFxyXG5mbiBtYWluKGlucHV0OiBWZXJ0ZXhJbnB1dHMpIC0+IEZyYWdtZW50SW5wdXRzIHtcclxuICAgIGxldCB3b3JsZCA9IG1hdDR4NDxmMzI+KGlucHV0LndvcmxkMCwgaW5wdXQud29ybGQxLCBpbnB1dC53b3JsZDIsIGlucHV0LndvcmxkMyk7XHJcbiAgICBsZXQgbG9jYWxPZmZzZXQgPSB2ZWM0PGYzMj4oaW5wdXQub2Zmc2V0cyAtIHZlYzI8ZjMyPigwLjUsIDAuNSksIDAuMCwgMS4wKTtcclxuICAgIGxldCB3b3JsZFBvcyA9IHVuaWZvcm1zLnRyYW5zZm9ybSAqIHdvcmxkICogbG9jYWxPZmZzZXQ7XHJcblxyXG4gICAgaWYgKHVuaWZvcm1zLm1vZGUgPj0gQklMTEJPQVJEKSB7ICAgICAgICBcclxuICAgICAgICB2YXIgdmlld1BvcyA9ICh1bmlmb3Jtcy52aWV3ICogdW5pZm9ybXMucGFyZW50V29ybGQgKiB2ZWM0ZigwLiwgMC4sIDAuLCAxLjApKS54eXo7XHJcbiAgICAgICAgaWYgKHVuaWZvcm1zLm1vZGUgPT0gQklMTEJPQVJEU0NSRUVOUFJPSkVDVEVEKSB7XHJcbiAgICAgICAgICAgIHZpZXdQb3MgPSB2ZWMzZih2aWV3UG9zLnggLyB2aWV3UG9zLnosIHZpZXdQb3MueSAvIHZpZXdQb3MueiwgMS4wKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICB2ZXJ0ZXhPdXRwdXRzLnBvc2l0aW9uID0gdW5pZm9ybXMucHJvamVjdGlvbiAqIHZlYzQ8ZjMyPih2aWV3UG9zICsgd29ybGRQb3MueHl6LCAxLjApO1xyXG4gICAgfSBlbHNlIHsgICAgICAgIFxyXG4gICAgICAgIGxldCB2aWV3UG9zID0gKHVuaWZvcm1zLnZpZXcgKiB1bmlmb3Jtcy5wYXJlbnRXb3JsZCAqIHdvcmxkUG9zKS54eXo7XHJcbiAgICAgICAgdmVydGV4T3V0cHV0cy5wb3NpdGlvbiA9IHVuaWZvcm1zLnByb2plY3Rpb24gKiB2ZWM0PGYzMj4odmlld1BvcywgMS4wKTtcclxuICAgIH1cclxuXHJcbiAgICB2ZXJ0ZXhPdXRwdXRzLmF0bGFzVVYgPSB2ZWMyPGYzMj4oXHJcbiAgICAgICAgaW5wdXQudXZzLnggKyBpbnB1dC5vZmZzZXRzLnggKiBpbnB1dC51dnMueixcclxuICAgICAgICBpbnB1dC51dnMueSArICgxLjAgLSBpbnB1dC5vZmZzZXRzLnkpICogaW5wdXQudXZzLndcclxuICAgICk7XHJcbn1gO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY29uc3QgbXNkZlZlcnRleFNoYWRlcldHU0wgPSB7IG5hbWUsIHNoYWRlciB9O1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01hdGhzX21hdGhfXzsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzXHJcbmltcG9ydCAqIGFzIGFkZG9ucyBmcm9tIFwiYWRkb25zL2luZGV4XCI7XHJcblxyXG5leHBvcnQgeyBhZGRvbnMgfTtcclxuZXhwb3J0IGRlZmF1bHQgYWRkb25zO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|