From 90eab9c4f1f00145133c30d900f2fa6368b11ab8 Mon Sep 17 00:00:00 2001 From: Len Dierickx Date: Mon, 13 May 2019 21:34:34 +0200 Subject: [PATCH 1/6] WIP Add gpumap function --- docs.json | 1585 +-- docs/Matrix.html | 386 +- docs/global.html | 4 +- docs/index.html | 4 +- docs/matrix.js.html | 80 +- docs/util_concat.js.html | 4 +- docs/util_dot.js.html | 4 +- docs/util_generate.js.html | 4 +- docs/util_identity.js.html | 4 +- docs/util_round.js.html | 4 +- docs/util_transpose.js.html | 4 +- lib/@astuanax/funmatrix.js | 18300 +++++++++++++++++++++++++++++-- lib/@astuanax/funmatrix.min.js | 4 +- package-lock.json | 675 +- package.json | 3 +- src/matrix.js | 74 +- src/util/gpumap.js | 5 + test/matrix.spec.js | 11 + 18 files changed, 19465 insertions(+), 1690 deletions(-) create mode 100644 src/util/gpumap.js diff --git a/docs.json b/docs.json index 2d00334..ebe7ad3 100644 --- a/docs.json +++ b/docs.json @@ -3,7 +3,7 @@ "comment": "/**\n * @class Matrix\n * @classdesc Matrix applicative providing standard matrix operations\n * @summary The Matrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.\n * @hidecontructor\n * @see of\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 12, + "lineno": 14, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -32,20 +32,21 @@ "comment": "", "meta": { "range": [ - 745, - 793 + 807, + 878 ], "filename": "matrix.js", - "lineno": 23, + "lineno": 25, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000043", + "id": "astnode100000051", "name": "Matrix", "type": "FunctionExpression" }, "vars": { - "this.__value": null + "this.__value": null, + "this.gpu": null } }, "undocumented": true, @@ -59,15 +60,15 @@ "comment": "", "meta": { "range": [ - 773, - 791 + 835, + 853 ], "filename": "matrix.js", - "lineno": 24, + "lineno": 26, "columnno": 2, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000049", + "id": "astnode100000057", "name": "this.__value", "type": "Identifier", "value": "val", @@ -80,19 +81,140 @@ "kind": "member", "scope": "global" }, + { + "comment": "", + "meta": { + "range": [ + 856, + 876 + ], + "filename": "matrix.js", + "lineno": 27, + "columnno": 2, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000063", + "name": "this.gpu", + "type": "NewExpression", + "value": "", + "paramnames": [] + } + }, + "undocumented": true, + "name": "gpu", + "longname": "gpu", + "kind": "member", + "scope": "global" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function of\n * @desc Creates a Matrix object and flattens the Matrix\n * @param val {array|function} An array of arrays\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 30, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "scope": "static", + "kind": "function", + "name": "of", + "description": "Creates a Matrix object and flattens the Matrix", + "params": [ + { + "type": { + "names": [ + "array", + "function" + ] + }, + "description": "An array of arrays", + "name": "val" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const m = Matrix.of([[1,2],[2,3],[4,5]])" + ], + "longname": "Matrix.of" + }, + { + "comment": "", + "meta": { + "range": [ + 1126, + 1296 + ], + "filename": "matrix.js", + "lineno": 42, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000070", + "name": "Matrix.of", + "type": "FunctionExpression", + "paramnames": [ + "val" + ] + }, + "vars": { + "this.__value": "Matrix.of#__value" + } + }, + "undocumented": true, + "name": "of", + "longname": "Matrix.of", + "kind": "function", + "memberof": "Matrix", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 1231, + 1249 + ], + "filename": "matrix.js", + "lineno": 45, + "columnno": 4, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000089", + "name": "this.__value", + "type": "Identifier", + "value": "val", + "paramnames": [] + } + }, + "undocumented": true, + "name": "__value", + "longname": "Matrix.of#__value", + "kind": "member", + "memberof": "Matrix.of", + "scope": "instance" + }, { "comment": "/**\n * @memberOf Matrix\n * @property {string} type\n * @type {string}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.type === 'Matrix'\n */", "meta": { "range": [ - 951, - 983 + 1454, + 1486 ], "filename": "matrix.js", - "lineno": 36, + "lineno": 60, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000055", + "id": "astnode100000101", "name": "Matrix.prototype.type", "type": "Literal", "value": "Matrix", @@ -127,15 +249,15 @@ "comment": "/**\n * @memberOf Matrix\n * @property {number} precision\n * @type {number}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.precision === 4\n */", "meta": { "range": [ - 1144, - 1174 + 1647, + 1677 ], "filename": "matrix.js", - "lineno": 47, + "lineno": 71, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000063", + "id": "astnode100000109", "name": "Matrix.prototype.precision", "type": "Literal", "value": 4, @@ -170,7 +292,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member setPrecision\n * @param precision {number} Set the number of decimals for rounding\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n * m.setPrecision(10)\n * m.precision === 10\n */", "meta": { "filename": "matrix.js", - "lineno": 49, + "lineno": 73, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -199,15 +321,15 @@ "comment": "", "meta": { "range": [ - 1414, - 1499 + 1917, + 2002 ], "filename": "matrix.js", - "lineno": 60, + "lineno": 84, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000071", + "id": "astnode100000117", "name": "Matrix.prototype.setPrecision", "type": "FunctionExpression", "paramnames": [ @@ -229,15 +351,15 @@ "comment": "", "meta": { "range": [ - 1471, - 1497 + 1974, + 2000 ], "filename": "matrix.js", - "lineno": 61, + "lineno": 85, "columnno": 2, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000081", + "id": "astnode100000127", "name": "this.precision", "type": "Identifier", "value": "precision", @@ -255,7 +377,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isSymmetric\n * @returns {boolean}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * true === A.isSymmetric()\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 64, + "lineno": 88, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -282,15 +404,15 @@ "comment": "", "meta": { "range": [ - 1674, - 1810 + 2177, + 2313 ], "filename": "matrix.js", - "lineno": 75, + "lineno": 99, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000087", + "id": "astnode100000133", "name": "Matrix.prototype.isSymmetric", "type": "FunctionExpression", "paramnames": [] @@ -311,15 +433,15 @@ "comment": "", "meta": { "range": [ - 1727, - 1743 + 2230, + 2246 ], "filename": "matrix.js", - "lineno": 76, + "lineno": 100, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000096", + "id": "astnode100000142", "name": "a", "type": "MemberExpression", "value": "this.__value" @@ -337,15 +459,15 @@ "comment": "", "meta": { "range": [ - 1752, - 1786 + 2255, + 2289 ], "filename": "matrix.js", - "lineno": 77, + "lineno": 101, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000102", + "id": "astnode100000148", "name": "b", "type": "MemberExpression", "value": ".__value" @@ -363,7 +485,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isSquare\n * @desc Boolean indicating whether this contains a square Matrix\n * @returns {boolean}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * true === A.isSquare()\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 81, + "lineno": 105, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -391,15 +513,15 @@ "comment": "", "meta": { "range": [ - 2045, - 2136 + 2548, + 2639 ], "filename": "matrix.js", - "lineno": 93, + "lineno": 117, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000117", + "id": "astnode100000163", "name": "Matrix.prototype.isSquare", "type": "FunctionExpression", "paramnames": [] @@ -416,7 +538,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member isOrthogonal\n * @param M {Matrix|array}\n * @returns {boolean}\n * @example\n *\n * const result = [[-0.3092, -0.9510], [-0.9510, 0.3092]]\n * const A = Matrix.fromArray(result)\n * true === A.isOrthogonal()\n */", "meta": { "filename": "matrix.js", - "lineno": 97, + "lineno": 121, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -454,15 +576,15 @@ "comment": "", "meta": { "range": [ - 2393, - 2535 + 2896, + 3038 ], "filename": "matrix.js", - "lineno": 109, + "lineno": 133, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000137", + "id": "astnode100000183", "name": "Matrix.prototype.isOrthogonal", "type": "FunctionExpression", "paramnames": [] @@ -483,15 +605,15 @@ "comment": "", "meta": { "range": [ - 2447, - 2480 + 2950, + 2983 ], "filename": "matrix.js", - "lineno": 110, + "lineno": 134, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000146", + "id": "astnode100000192", "name": "AxAt", "type": "CallExpression", "value": "" @@ -509,15 +631,15 @@ "comment": "", "meta": { "range": [ - 2489, - 2508 + 2992, + 3011 ], "filename": "matrix.js", - "lineno": 111, + "lineno": 135, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000157", + "id": "astnode100000203", "name": "I", "type": "CallExpression", "value": "" @@ -535,7 +657,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getCols\n * @returns {Number}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getCols() === 2\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 115, + "lineno": 139, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -562,15 +684,15 @@ "comment": "", "meta": { "range": [ - 2699, - 2773 + 3202, + 3276 ], "filename": "matrix.js", - "lineno": 126, + "lineno": 150, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000169", + "id": "astnode100000215", "name": "Matrix.prototype.getCols", "type": "FunctionExpression", "paramnames": [] @@ -587,7 +709,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member equals\n * @param M {Matrix|array}\n * @returns {Boolean}\n * @example\n *\n * var a = [[1, 1], [1, 1]]\n * var A = Matrix.of(a)\n * var B = Matrix.of(a)\n * true === A.equals(B)\n */", "meta": { "filename": "matrix.js", - "lineno": 130, + "lineno": 154, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -625,15 +747,15 @@ "comment": "", "meta": { "range": [ - 2999, - 3087 + 3502, + 3590 ], "filename": "matrix.js", - "lineno": 143, + "lineno": 167, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000186", + "id": "astnode100000232", "name": "Matrix.prototype.equals", "type": "FunctionExpression", "paramnames": [ @@ -652,7 +774,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getRows\n * @returns {Number}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getRows() // 2\n */", "meta": { "filename": "matrix.js", - "lineno": 147, + "lineno": 171, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -679,15 +801,15 @@ "comment": "", "meta": { "range": [ - 3247, - 3318 + 3750, + 3821 ], "filename": "matrix.js", - "lineno": 157, + "lineno": 181, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000207", + "id": "astnode100000253", "name": "Matrix.prototype.getRows", "type": "FunctionExpression", "paramnames": [] @@ -704,7 +826,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member getShape\n * @returns {Array}\n * @example\n *\n * const A = Matrix.of([[1, 1], [1, 1]])\n * A.getShape() // [2, 2]\n */", "meta": { "filename": "matrix.js", - "lineno": 161, + "lineno": 185, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -731,15 +853,15 @@ "comment": "", "meta": { "range": [ - 3484, - 3569 + 3987, + 4072 ], "filename": "matrix.js", - "lineno": 171, + "lineno": 195, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000222", + "id": "astnode100000268", "name": "Matrix.prototype.getShape", "type": "FunctionExpression", "paramnames": [] @@ -753,29 +875,28 @@ "scope": "instance" }, { - "comment": "/**\n * @memberOf Matrix\n * @static\n * @function of\n * @desc Creates a Matrix object and flattens the Matrix\n * @param val {array|function} An array of arrays\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1,2],[2,3],[4,5]])\n *\n */", + "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member map\n * @description Maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1, 1], [1, 1]])\n * m.map(x => x.map(y => y+ 1))\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 175, + "lineno": 199, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} }, "memberof": "Matrix", - "scope": "static", - "kind": "function", - "name": "of", - "description": "Creates a Matrix object and flattens the Matrix", + "scope": "instance", + "kind": "member", + "name": "map", + "description": "Maps over the rows of the matrix using a map function", "params": [ { "type": { "names": [ - "array", "function" ] }, - "description": "An array of arrays", - "name": "val" + "description": "An iterator function", + "name": "f" } ], "returns": [ @@ -788,71 +909,117 @@ } ], "examples": [ - "const m = Matrix.of([[1,2],[2,3],[4,5]])" + "const m = Matrix.of([[1, 1], [1, 1]])\nm.map(x => x.map(y => y+ 1))\n// [[2, 2], [2, 2]]" ], - "longname": "Matrix.of" + "longname": "Matrix#map" }, { "comment": "", "meta": { "range": [ - 3817, - 3987 + 4379, + 4459 ], "filename": "matrix.js", - "lineno": 187, + "lineno": 213, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000241", - "name": "Matrix.of", + "id": "astnode100000287", + "name": "Matrix.prototype.map", "type": "FunctionExpression", "paramnames": [ - "val" + "f" ] - }, - "vars": { - "this.__value": "Matrix.of#__value" } }, "undocumented": true, - "name": "of", - "longname": "Matrix.of", + "name": "map", + "longname": "Matrix#map", "kind": "function", "memberof": "Matrix", - "scope": "static" + "scope": "instance" + }, + { + "comment": "/**\n * @memberOf Matrix\n * @static\n * @function map\n * @description Static function that maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @param M {Matrix|array} Matrix or array to map\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n * // [[2, 2], [2, 2]]\n *\n */", + "meta": { + "filename": "matrix.js", + "lineno": 217, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": {} + }, + "memberof": "Matrix", + "scope": "static", + "kind": "function", + "name": "map", + "description": "Static function that maps over the rows of the matrix using a map function", + "params": [ + { + "type": { + "names": [ + "function" + ] + }, + "description": "An iterator function", + "name": "f" + }, + { + "type": { + "names": [ + "Matrix", + "array" + ] + }, + "description": "Matrix or array to map", + "name": "M" + } + ], + "returns": [ + { + "type": { + "names": [ + "Matrix" + ] + } + } + ], + "examples": [ + "const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n// [[2, 2], [2, 2]]" + ], + "longname": "Matrix.map" }, { "comment": "", "meta": { "range": [ - 3922, - 3940 + 4829, + 4897 ], "filename": "matrix.js", - "lineno": 190, - "columnno": 4, + "lineno": 231, + "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000260", - "name": "this.__value", - "type": "Identifier", - "value": "val", + "id": "astnode100000309", + "name": "Matrix.map", + "type": "CallExpression", + "value": "", "paramnames": [] } }, "undocumented": true, - "name": "__value", - "longname": "Matrix.of#__value", + "name": "map", + "longname": "Matrix.map", "kind": "member", - "memberof": "Matrix.of", - "scope": "instance" + "memberof": "Matrix", + "scope": "static" }, { "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member map\n * @description Maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.of([[1, 1], [1, 1]])\n * m.map(x => x.map(y => y+ 1))\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 196, + "lineno": 235, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -891,34 +1058,63 @@ "comment": "", "meta": { "range": [ - 4294, - 4374 + 5204, + 5337 ], "filename": "matrix.js", - "lineno": 210, + "lineno": 249, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000272", - "name": "Matrix.prototype.map", + "id": "astnode100000330", + "name": "Matrix.prototype.gpumap", "type": "FunctionExpression", "paramnames": [ "f" ] + }, + "vars": { + "res": "Matrix#gpumap~res" } }, "undocumented": true, - "name": "map", - "longname": "Matrix#map", + "name": "gpumap", + "longname": "Matrix#gpumap", "kind": "function", "memberof": "Matrix", "scope": "instance" }, + { + "comment": "", + "meta": { + "range": [ + 5253, + 5292 + ], + "filename": "matrix.js", + "lineno": 250, + "columnno": 8, + "path": "/Volumes/BigOne/github/funMatrix/src", + "code": { + "id": "astnode100000340", + "name": "res", + "type": "CallExpression", + "value": "" + } + }, + "undocumented": true, + "name": "res", + "longname": "Matrix#gpumap~res", + "kind": "constant", + "memberof": "Matrix#gpumap", + "scope": "inner", + "params": [] + }, { "comment": "/**\n * @memberOf Matrix\n * @static\n * @function map\n * @description Static function that maps over the rows of the matrix using a map function\n * @param f {function} An iterator function\n * @param M {Matrix|array} Matrix or array to map\n * @returns {Matrix}\n * @example\n *\n * const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])\n * // [[2, 2], [2, 2]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 214, + "lineno": 255, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -967,24 +1163,24 @@ "comment": "", "meta": { "range": [ - 4744, - 4812 + 5707, + 5781 ], "filename": "matrix.js", - "lineno": 228, + "lineno": 269, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000294", - "name": "Matrix.map", + "id": "astnode100000364", + "name": "Matrix.gpumap", "type": "CallExpression", "value": "", "paramnames": [] } }, "undocumented": true, - "name": "map", - "longname": "Matrix.map", + "name": "gpumap", + "longname": "Matrix.gpumap", "kind": "member", "memberof": "Matrix", "scope": "static" @@ -993,7 +1189,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fold\n * @description Reduce the matrix rows using a reduce function\n * @param f {function} A reduce/fold function\n * @returns {Matrix}\n * @example\n *\n * // Flatten Matrix\n * Matrix.of([[1, 1], [1, 1]]).fold((prev, next) => prev.concat(next))\n * // [1, 1, 1, 1]\n */", "meta": { "filename": "matrix.js", - "lineno": 232, + "lineno": 273, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1032,15 +1228,15 @@ "comment": "", "meta": { "range": [ - 5127, - 5213 + 6096, + 6182 ], "filename": "matrix.js", - "lineno": 245, + "lineno": 286, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000315", + "id": "astnode100000385", "name": "Matrix.prototype.fold", "type": "FunctionExpression", "paramnames": [ @@ -1059,7 +1255,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function fold\n * @description Static function to reduce the matrix rows using a reduce function\n * @param f {function} A reduce/fold function\n * @param M {Matrix} The Matrix to reduce\n * @returns {Matrix}\n * @example\n\n * // Sum of all matrix values\n * const reducer = (prev, next) => Number(prev) + next.reduce((acc, x) => acc + x, 0)\n * const A = Matrix.of([[1, 1], [1, 1]]\n * Matrix.fold(reducer, A)\n * // 4\n */", "meta": { "filename": "matrix.js", - "lineno": 249, + "lineno": 290, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1107,15 +1303,15 @@ "comment": "", "meta": { "range": [ - 5668, - 5738 + 6637, + 6707 ], "filename": "matrix.js", - "lineno": 265, + "lineno": 306, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000338", + "id": "astnode100000408", "name": "Matrix.fold", "type": "CallExpression", "value": "", @@ -1133,7 +1329,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member ap\n * @description Applies a Matrix to a function\n * @param M {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const f = x => x.reduce((prev, next) => prev + next)\n * const A = Matrix.of([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n * Matrix.of(f).ap(M)\n * // [[6], [15], [24]\n */", "meta": { "filename": "matrix.js", - "lineno": 269, + "lineno": 310, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1171,15 +1367,15 @@ "comment": "", "meta": { "range": [ - 6058, - 6136 + 7027, + 7105 ], "filename": "matrix.js", - "lineno": 283, + "lineno": 324, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000359", + "id": "astnode100000429", "name": "Matrix.prototype.ap", "type": "FunctionExpression", "paramnames": [ @@ -1198,7 +1394,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function ap\n * @description Applies a Matrix to a function\n * @param f {function}\n * @param M {Matrix|array}\n * @returns {Matrix}\n * @example\n *\n * const f = x => x.reduce((prev, next) => prev + next)\n * Matrix.ap(f, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n * // [[6], [15], [24]\n */", "meta": { "filename": "matrix.js", - "lineno": 287, + "lineno": 328, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1245,15 +1441,15 @@ "comment": "", "meta": { "range": [ - 6456, - 6522 + 7425, + 7491 ], "filename": "matrix.js", - "lineno": 301, + "lineno": 342, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000381", + "id": "astnode100000451", "name": "Matrix.ap", "type": "CallExpression", "value": "", @@ -1271,7 +1467,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member concat\n * @description Concatenates 2 Matrices using a function as operator\n * @param M {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const a = [[0, 1, 1], [2, 3, 4]]\n * const b = [[2, 2, 2], [3, 3, 3]]\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n * const M = A.concat(B)\n * // [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 305, + "lineno": 346, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1309,15 +1505,15 @@ "comment": "", "meta": { "range": [ - 6908, - 6997 + 7877, + 7966 ], "filename": "matrix.js", - "lineno": 322, + "lineno": 363, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000402", + "id": "astnode100000472", "name": "Matrix.prototype.concat", "type": "FunctionExpression", "paramnames": [ @@ -1337,7 +1533,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function concat\n * @description Concatenates 2 Matrices using a function as operator\n * @param A {Matrix}\n * @param B {Matrix}\n * @returns {Matrix}\n * @example\n *\n * const a = [[0, 1, 1], [2, 3, 4]]\n * const b = [[2, 2, 2], [3, 3, 3]]\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n * const M = Matrix.concat(A, B)\n * // [[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 326, + "lineno": 367, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1383,15 +1579,15 @@ "comment": "", "meta": { "range": [ - 7412, - 7498 + 8381, + 8467 ], "filename": "matrix.js", - "lineno": 344, + "lineno": 385, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000427", + "id": "astnode100000497", "name": "Matrix.concat", "type": "CallExpression", "value": "", @@ -1409,7 +1605,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member empty\n * @description Return an empty Matrix from an existing Matrix\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 348, + "lineno": 389, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1434,15 +1630,15 @@ "comment": "", "meta": { "range": [ - 7642, - 7718 + 8611, + 8687 ], "filename": "matrix.js", - "lineno": 355, + "lineno": 396, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000453", + "id": "astnode100000523", "name": "Matrix.prototype.empty", "type": "FunctionExpression", "paramnames": [] @@ -1459,7 +1655,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function empty\n * @description Return an empty Matrix from an existing Matrix\n * @param rows {number}\n * @param cols {number}\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 359, + "lineno": 400, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1502,15 +1698,15 @@ "comment": "", "meta": { "range": [ - 7910, - 8106 + 8879, + 9075 ], "filename": "matrix.js", - "lineno": 368, + "lineno": 409, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000472", + "id": "astnode100000542", "name": "Matrix.empty", "type": "CallExpression", "value": "", @@ -1528,15 +1724,15 @@ "comment": "", "meta": { "range": [ - 7971, - 7995 + 8940, + 8964 ], "filename": "matrix.js", - "lineno": 369, + "lineno": 410, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000487", + "id": "astnode100000557", "name": "m", "type": "CallExpression", "value": "" @@ -1554,7 +1750,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member identity\n * @desc Returns an identity matrix\n * @returns {Matrix}\n * @example\n *\n * const a = [[1, 2, 3], [4, 5, 6]]\n * const A = Matrix.of(a)\n * const Aidentity = A.identity()\n * // [[1, 0, 0], [0, 1, 0]]\n *\n*/", "meta": { "filename": "matrix.js", - "lineno": 375, + "lineno": 416, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1582,15 +1778,15 @@ "comment": "", "meta": { "range": [ - 8390, - 8471 + 9359, + 9440 ], "filename": "matrix.js", - "lineno": 389, + "lineno": 430, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000504", + "id": "astnode100000574", "name": "Matrix.prototype.identity", "type": "FunctionExpression", "paramnames": [] @@ -1607,7 +1803,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function identity\n * @desc Returns an identity matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.identity(3, 2)\n * // [[1, 0, 0], [0, 1, 0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 393, + "lineno": 434, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1635,15 +1831,15 @@ "comment": "", "meta": { "range": [ - 8673, - 8859 + 9642, + 9828 ], "filename": "matrix.js", - "lineno": 405, + "lineno": 446, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000523", + "id": "astnode100000593", "name": "Matrix.identity", "type": "FunctionExpression", "paramnames": [ @@ -1666,15 +1862,15 @@ "comment": "", "meta": { "range": [ - 8723, - 8747 + 9692, + 9716 ], "filename": "matrix.js", - "lineno": 406, + "lineno": 447, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000532", + "id": "astnode100000602", "name": "m", "type": "CallExpression", "value": "" @@ -1692,7 +1888,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member combine\n * @see Matrix.concat\n * @param M\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 410, + "lineno": 451, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1724,15 +1920,15 @@ "comment": "", "meta": { "range": [ - 8976, - 9073 + 9945, + 10042 ], "filename": "matrix.js", - "lineno": 418, + "lineno": 459, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000549", + "id": "astnode100000619", "name": "Matrix.prototype.combine", "type": "FunctionExpression", "paramnames": [ @@ -1751,7 +1947,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function combine\n * @see Matrix.concat\n * @param M\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 422, + "lineno": 463, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1783,15 +1979,15 @@ "comment": "", "meta": { "range": [ - 9190, - 9277 + 10159, + 10246 ], "filename": "matrix.js", - "lineno": 430, + "lineno": 471, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000574", + "id": "astnode100000644", "name": "Matrix.combine", "type": "FunctionExpression", "paramnames": [ @@ -1811,7 +2007,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member dot\n * @description Returns the dot product between 2 matrices\n * @param M\n * @param f\n * @returns {Matrix}\n * @example\n *\n * // Create matrix\n * const m = Matrix.of([[1, 2], [3, 4]])\n *\n * // Generate identity matrix\n * const I = m.identity() // [[1, 0], [0, 1]]\n *\n * if(m.dot(I).equals(m)) {\n * console.log('Dot product with identity matrix returns the same matrix')\n * }\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 434, + "lineno": 475, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1847,15 +2043,15 @@ "comment": "", "meta": { "range": [ - 9713, - 9819 + 10682, + 10788 ], "filename": "matrix.js", - "lineno": 455, + "lineno": 496, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000598", + "id": "astnode100000668", "name": "Matrix.prototype.dot", "type": "FunctionExpression", "paramnames": [ @@ -1874,7 +2070,7 @@ "comment": "/**\n * @memberOf Matrix\n * @static\n * @function dot\n * @description Returns the dot product between 2 matrices\n * @param M\n * @returns {Matrix}\n * @example\n * const a = [[1, 2, 3], [4, 5, 6]]\n * const b = [[7, 8], [9, 10], [11, 12]]\n *\n * const A = Matrix.of(a)\n * const B = Matrix.of(b)\n *\n * Matrix.dot(A, B) // [[58, 64], [139, 154]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 459, + "lineno": 500, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1907,15 +2103,15 @@ "comment": "", "meta": { "range": [ - 10165, - 10237 + 11134, + 11206 ], "filename": "matrix.js", - "lineno": 476, + "lineno": 517, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000627", + "id": "astnode100000697", "name": "Matrix.dot", "type": "FunctionExpression", "paramnames": [ @@ -1935,7 +2131,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fill\n * @desc Fill up an empty matrix with the provided map function\n * @param f\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).fill(x => 42)\n * // [[42,42,42], [42,42,42], [42,42,42]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 480, + "lineno": 521, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -1968,15 +2164,15 @@ "comment": "", "meta": { "range": [ - 10520, - 10605 + 11489, + 11574 ], "filename": "matrix.js", - "lineno": 493, + "lineno": 534, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000650", + "id": "astnode100000720", "name": "Matrix.prototype.fill", "type": "FunctionExpression", "paramnames": [ @@ -1998,7 +2194,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member zeros\n * @desc Fill up an empty matrix with zeros\n * @returns {Matrix}\n *\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).zeros()\n * // [[0,0,0], [0,0,0], [0,0,0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 497, + "lineno": 538, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2026,15 +2222,15 @@ "comment": "", "meta": { "range": [ - 10845, - 10923 + 11814, + 11892 ], "filename": "matrix.js", - "lineno": 510, + "lineno": 551, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000676", + "id": "astnode100000746", "name": "Matrix.prototype.zeros", "type": "FunctionExpression", "paramnames": [] @@ -2054,7 +2250,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function zeros\n * @desc Fill up an empty matrix with zeros\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.zeros(3, 3)\n * // [[0,0,0], [0,0,0], [0,0,0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 514, + "lineno": 555, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2102,15 +2298,15 @@ "comment": "", "meta": { "range": [ - 11234, - 11342 + 12203, + 12311 ], "filename": "matrix.js", - "lineno": 527, + "lineno": 568, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000697", + "id": "astnode100000767", "name": "Matrix.zeros", "type": "FunctionExpression", "paramnames": [ @@ -2134,15 +2330,15 @@ "comment": "", "meta": { "range": [ - 11281, - 11305 + 12250, + 12274 ], "filename": "matrix.js", - "lineno": 528, + "lineno": 569, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000706", + "id": "astnode100000776", "name": "m", "type": "CallExpression", "value": "" @@ -2160,7 +2356,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member ones\n * @desc Fill up an empty matrix with ones\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1,2,3], [3,2,1], [4,5,6]]).ones()\n * // [[1,1,1], [1,1,1], [1,1,1]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 532, + "lineno": 573, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2188,15 +2384,15 @@ "comment": "", "meta": { "range": [ - 11576, - 11653 + 12545, + 12622 ], "filename": "matrix.js", - "lineno": 544, + "lineno": 585, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000725", + "id": "astnode100000795", "name": "Matrix.prototype.ones", "type": "FunctionExpression", "paramnames": [] @@ -2216,7 +2412,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function ones\n * @desc Fill up an empty matrix with ones\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.ones(1, 1)\n * // [[1,1,1], [1,1,1], [1,1,1]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 548, + "lineno": 589, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2264,15 +2460,15 @@ "comment": "", "meta": { "range": [ - 11961, - 12068 + 12930, + 13037 ], "filename": "matrix.js", - "lineno": 561, + "lineno": 602, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000746", + "id": "astnode100000816", "name": "Matrix.ones", "type": "FunctionExpression", "paramnames": [ @@ -2296,15 +2492,15 @@ "comment": "", "meta": { "range": [ - 12007, - 12031 + 12976, + 13000 ], "filename": "matrix.js", - "lineno": 562, + "lineno": 603, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000755", + "id": "astnode100000825", "name": "m", "type": "CallExpression", "value": "" @@ -2322,7 +2518,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member random\n * @desc Fill up an empty matrix with random values\n * @param {function} [f = e => Math.random() * 2 - 1]\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 566, + "lineno": 607, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2359,15 +2555,15 @@ "comment": "", "meta": { "range": [ - 12256, - 12360 + 13225, + 13329 ], "filename": "matrix.js", - "lineno": 574, + "lineno": 615, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000774", + "id": "astnode100000844", "name": "Matrix.prototype.random", "type": "FunctionExpression", "paramnames": [ @@ -2389,7 +2585,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function random\n * @desc Fill up an empty matrix with random numbers\n * @param f {function} Function which returns random values. Default random values are between -1 and 1\n * @param rows {number} Defines the rows of the matrix\n * @param cols {number} Defines the columns of the matrix\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 578, + "lineno": 619, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2443,15 +2639,15 @@ "comment": "", "meta": { "range": [ - 12701, - 12839 + 13670, + 13808 ], "filename": "matrix.js", - "lineno": 587, + "lineno": 628, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000805", + "id": "astnode100000875", "name": "Matrix.random", "type": "FunctionExpression", "paramnames": [ @@ -2476,15 +2672,15 @@ "comment": "", "meta": { "range": [ - 12783, - 12807 + 13752, + 13776 ], "filename": "matrix.js", - "lineno": 588, + "lineno": 629, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000826", + "id": "astnode100000896", "name": "m", "type": "CallExpression", "value": "" @@ -2502,7 +2698,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member toArray\n * @desc Returns the array from the matrix\n * @returns {Array}\n */", "meta": { "filename": "matrix.js", - "lineno": 592, + "lineno": 633, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2527,15 +2723,15 @@ "comment": "", "meta": { "range": [ - 12964, - 13060 + 13933, + 14029 ], "filename": "matrix.js", - "lineno": 599, + "lineno": 640, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000843", + "id": "astnode100000913", "name": "Matrix.prototype.toArray", "type": "FunctionExpression", "paramnames": [] @@ -2555,7 +2751,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member clone\n * @desc Returns a clone of the matrix\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 603, + "lineno": 644, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2580,15 +2776,15 @@ "comment": "", "meta": { "range": [ - 13180, - 13260 + 14149, + 14229 ], "filename": "matrix.js", - "lineno": 610, + "lineno": 651, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000868", + "id": "astnode100000938", "name": "Matrix.prototype.clone", "type": "FunctionExpression", "paramnames": [] @@ -2605,7 +2801,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member fromArray\n * @desc Returns a Matrix from an array\n * @returns {Array}\n */", "meta": { "filename": "matrix.js", - "lineno": 614, + "lineno": 655, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2630,15 +2826,15 @@ "comment": "", "meta": { "range": [ - 13384, - 13479 + 14353, + 14448 ], "filename": "matrix.js", - "lineno": 621, + "lineno": 662, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000885", + "id": "astnode100000955", "name": "Matrix.fromArray", "type": "FunctionExpression", "paramnames": [ @@ -2660,7 +2856,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member transpose\n * @desc Returns a transposed Matrix\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([-1, 2], [3, 4], [-8, 2])\n * const b = A.transpose().toArray()\n * // returns [[-1, 3,-8], [2, 4, 2]]\n */", "meta": { "filename": "matrix.js", - "lineno": 625, + "lineno": 666, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2688,15 +2884,15 @@ "comment": "", "meta": { "range": [ - 13740, - 13838 + 14709, + 14807 ], "filename": "matrix.js", - "lineno": 637, + "lineno": 678, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000911", + "id": "astnode100000981", "name": "Matrix.prototype.transpose", "type": "FunctionExpression", "paramnames": [] @@ -2713,7 +2909,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function transpose\n * @desc Returns a transposed Matrix\n * @param M {Matrix|array} A Matrix or a matrix array\n * @returns {Matrix}\n * @example\n *\n * const a = [-1, 2], [3, 4], [-8, 2]\n * const b = Matrix.transpose(a).toArray()\n * // returns [[-1, 3,-8], [2, 4, 2]]\n */", "meta": { "filename": "matrix.js", - "lineno": 641, + "lineno": 682, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2753,15 +2949,15 @@ "comment": "", "meta": { "range": [ - 14137, - 14206 + 15106, + 15175 ], "filename": "matrix.js", - "lineno": 653, + "lineno": 694, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000932", + "id": "astnode100001002", "name": "Matrix.transpose", "type": "FunctionExpression", "paramnames": [ @@ -2780,7 +2976,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member add\n * @instance\n * @param M {Matrix|number} Add a Matrix or a number\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.add(1) // [[6, 5]]\n * const B = Matrix.of([[5, 5]])\n * B.add(B) // [[10, 10]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 657, + "lineno": 698, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2819,15 +3015,15 @@ "comment": "", "meta": { "range": [ - 14472, - 14818 + 15441, + 15787 ], "filename": "matrix.js", - "lineno": 671, + "lineno": 712, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100000949", + "id": "astnode100001019", "name": "Matrix.prototype.add", "type": "FunctionExpression", "paramnames": [ @@ -2849,7 +3045,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member subtract\n * @instance\n * @param M {Matrix|number} Subtract a Matrix or a number\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.subtract(1) // [[4, 2]]\n * const B = Matrix.of([[5, 5]])\n * B.subtract(B) // [[0, 0]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 682, + "lineno": 723, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2888,15 +3084,15 @@ "comment": "", "meta": { "range": [ - 15102, - 15458 + 16071, + 16427 ], "filename": "matrix.js", - "lineno": 696, + "lineno": 737, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001026", + "id": "astnode100001096", "name": "Matrix.prototype.subtract", "type": "FunctionExpression", "paramnames": [ @@ -2918,7 +3114,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member multiply\n * @instance\n * @desc Mutliply a scalar or a mtraix with a matrix. Throws an error if the multiplication is not possible.\n * @param M {Matrix|number}\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.multiply(2) // [[10, 8]]\n * const B = Matrix.of([[5, 5]])\n * B.multiply(B) // [[25, 25]]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 707, + "lineno": 748, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -2957,15 +3153,15 @@ "comment": "", "meta": { "range": [ - 15824, - 16270 + 16793, + 17239 ], "filename": "matrix.js", - "lineno": 722, + "lineno": 763, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001103", + "id": "astnode100001173", "name": "Matrix.prototype.multiply", "type": "FunctionExpression", "paramnames": [ @@ -2987,7 +3183,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member additiveinverse\n * @instance\n * @desc Function that returns the matrix obtained by changing the sign of every matrix element. The additive inverse of matrix A is written –A.\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5,-5], [-4, 4]])\n * const minusA = A.additiveinverse()\n * // [[-5, 5], [4, -4]]\n */", "meta": { "filename": "matrix.js", - "lineno": 734, + "lineno": 775, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -3015,15 +3211,15 @@ "comment": "", "meta": { "range": [ - 16626, - 16714 + 17595, + 17683 ], "filename": "matrix.js", - "lineno": 746, + "lineno": 787, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001186", + "id": "astnode100001256", "name": "Matrix.prototype.additiveinverse", "type": "FunctionExpression", "paramnames": [] @@ -3040,7 +3236,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member hadamard\n * @instance\n * @see multiply\n * @param M\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[5, 4]])\n * A.hadamard(2) // [[10, 8]]\n * const B = Matrix.of([[5, 5]])\n * B.hadamard(B) // [[25, 25]]\n\n */", "meta": { "filename": "matrix.js", - "lineno": 750, + "lineno": 791, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -3075,15 +3271,15 @@ "comment": "", "meta": { "range": [ - 16970, - 17051 + 17939, + 18020 ], "filename": "matrix.js", - "lineno": 765, + "lineno": 806, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001206", + "id": "astnode100001276", "name": "Matrix.prototype.hadamard", "type": "FunctionExpression", "paramnames": [ @@ -3102,7 +3298,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member lu\n * @desc Calculates LU decomposition of the current Matrix\n * @returns {Matrix[]}\n * @example\n *\n * const result = [[3, -7, -2, 2], [-3, 5, 1, 0], [6, -4, 0, -5], [-9, 5, -5, 12]]\n * const A = Matrix.fromArray(result)\n * const lu = A.lu()\n * // L.__value = [ [ 1, 0, 0, 0 ], [ -1, 1, 0, 0 ], [ 2, -5, 1, 0 ], [ -3, 8, 3, 1 ] ]\n * // U.__value = [ [ 3, -7, -2, 2 ], [ 0, -2, -1, 2 ], [ 0, 0, -1, 1 ], [ 0, 0, 0, -1 ] ]\n * Matrix.dot(lu[0], lu[1]) // returns clone of A\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 769, + "lineno": 810, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -3130,15 +3326,15 @@ "comment": "", "meta": { "range": [ - 17580, - 18217 + 18549, + 19186 ], "filename": "matrix.js", - "lineno": 785, + "lineno": 826, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001226", + "id": "astnode100001296", "name": "Matrix.prototype.lu", "type": "FunctionExpression", "paramnames": [] @@ -3169,15 +3365,15 @@ "comment": "", "meta": { "range": [ - 17624, - 17642 + 18593, + 18611 ], "filename": "matrix.js", - "lineno": 786, + "lineno": 827, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001235", + "id": "astnode100001305", "name": "n", "type": "CallExpression", "value": "" @@ -3195,15 +3391,15 @@ "comment": "", "meta": { "range": [ - 17651, - 17661 + 18620, + 18630 ], "filename": "matrix.js", - "lineno": 787, + "lineno": 828, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001242", + "id": "astnode100001312", "name": "tol", "type": "Literal", "value": 0.000001 @@ -3221,15 +3417,15 @@ "comment": "", "meta": { "range": [ - 17670, - 17686 + 18639, + 18655 ], "filename": "matrix.js", - "lineno": 788, + "lineno": 829, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001246", + "id": "astnode100001316", "name": "A", "type": "CallExpression", "value": "" @@ -3247,15 +3443,15 @@ "comment": "", "meta": { "range": [ - 17695, - 17711 + 18664, + 18680 ], "filename": "matrix.js", - "lineno": 789, + "lineno": 830, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001253", + "id": "astnode100001323", "name": "L", "type": "CallExpression", "value": "" @@ -3273,15 +3469,15 @@ "comment": "", "meta": { "range": [ - 17720, - 17736 + 18689, + 18705 ], "filename": "matrix.js", - "lineno": 790, + "lineno": 831, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001260", + "id": "astnode100001330", "name": "U", "type": "CallExpression", "value": "" @@ -3299,15 +3495,15 @@ "comment": "", "meta": { "range": [ - 17749, - 17754 + 18718, + 18723 ], "filename": "matrix.js", - "lineno": 792, + "lineno": 833, "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001268", + "id": "astnode100001338", "name": "k", "type": "Literal", "value": 0 @@ -3325,15 +3521,15 @@ "comment": "", "meta": { "range": [ - 17868, - 17887 + 18837, + 18856 ], "filename": "matrix.js", - "lineno": 794, + "lineno": 835, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001296", + "id": "astnode100001366", "name": "L.__value[undefined][undefined]", "type": "Literal", "funcscope": "Matrix#lu", @@ -3352,15 +3548,15 @@ "comment": "", "meta": { "range": [ - 17901, - 17910 + 18870, + 18879 ], "filename": "matrix.js", - "lineno": 795, + "lineno": 836, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001307", + "id": "astnode100001377", "name": "i", "type": "BinaryExpression", "value": "" @@ -3378,15 +3574,15 @@ "comment": "", "meta": { "range": [ - 17932, - 17983 + 18901, + 18952 ], "filename": "matrix.js", - "lineno": 796, + "lineno": 837, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001319", + "id": "astnode100001389", "name": "L.__value[undefined][undefined]", "type": "BinaryExpression", "funcscope": "Matrix#lu", @@ -3405,15 +3601,15 @@ "comment": "", "meta": { "range": [ - 17999, - 18008 + 18968, + 18977 ], "filename": "matrix.js", - "lineno": 797, + "lineno": 838, "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001344", + "id": "astnode100001414", "name": "j", "type": "BinaryExpression", "value": "" @@ -3431,15 +3627,15 @@ "comment": "", "meta": { "range": [ - 18032, - 18101 + 19001, + 19070 ], "filename": "matrix.js", - "lineno": 798, + "lineno": 839, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001356", + "id": "astnode100001426", "name": "A.__value[undefined][undefined]", "type": "BinaryExpression", "funcscope": "Matrix#lu", @@ -3458,15 +3654,15 @@ "comment": "", "meta": { "range": [ - 18129, - 18134 + 19098, + 19103 ], "filename": "matrix.js", - "lineno": 801, + "lineno": 842, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001389", + "id": "astnode100001459", "name": "l", "type": "Identifier", "value": "k" @@ -3484,15 +3680,15 @@ "comment": "", "meta": { "range": [ - 18156, - 18189 + 19125, + 19158 ], "filename": "matrix.js", - "lineno": 802, + "lineno": 843, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001399", + "id": "astnode100001469", "name": "U.__value[undefined][undefined]", "type": "MemberExpression", "funcscope": "Matrix#lu", @@ -3511,7 +3707,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member rref\n * @returns {Matrix|array}\n * @example\n *\n * var A = Matrix.of([[-1, 1], [-1, 0], [0, -1], [-1, -2]])\n * A.rref() // [ [ 1, 0 ], [ -0, 1 ], [ 0, 0 ], [ 0, 0 ] ]\n */", "meta": { "filename": "matrix.js", - "lineno": 808, + "lineno": 849, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -3539,15 +3735,15 @@ "comment": "", "meta": { "range": [ - 18438, - 19424 + 19407, + 20393 ], "filename": "matrix.js", - "lineno": 818, + "lineno": 859, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001419", + "id": "astnode100001489", "name": "Matrix.prototype.rref", "type": "FunctionExpression", "paramnames": [] @@ -3575,15 +3771,15 @@ "comment": "", "meta": { "range": [ - 18482, - 18490 + 19451, + 19459 ], "filename": "matrix.js", - "lineno": 819, + "lineno": 860, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001428", + "id": "astnode100001498", "name": "lead", "type": "Literal", "value": 0 @@ -3601,15 +3797,15 @@ "comment": "", "meta": { "range": [ - 18499, - 18526 + 19468, + 19495 ], "filename": "matrix.js", - "lineno": 820, + "lineno": 861, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001432", + "id": "astnode100001502", "name": "resultMatrix", "type": "CallExpression", "value": "" @@ -3627,15 +3823,15 @@ "comment": "", "meta": { "range": [ - 18539, - 18544 + 19508, + 19513 ], "filename": "matrix.js", - "lineno": 822, + "lineno": 863, "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001440", + "id": "astnode100001510", "name": "r", "type": "Literal", "value": 0 @@ -3653,15 +3849,15 @@ "comment": "", "meta": { "range": [ - 18647, - 18652 + 19616, + 19621 ], "filename": "matrix.js", - "lineno": 826, + "lineno": 867, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001463", + "id": "astnode100001533", "name": "i", "type": "Identifier", "value": "r" @@ -3679,15 +3875,15 @@ "comment": "", "meta": { "range": [ - 18755, - 18760 + 19724, + 19729 ], "filename": "matrix.js", - "lineno": 830, + "lineno": 871, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001489", + "id": "astnode100001559", "name": "i", "type": "Identifier", "funcscope": "Matrix#rref", @@ -3706,15 +3902,15 @@ "comment": "", "meta": { "range": [ - 18878, - 18907 + 19847, + 19876 ], "filename": "matrix.js", - "lineno": 838, + "lineno": 879, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001506", + "id": "astnode100001576", "name": "tmp", "type": "MemberExpression", "value": "resultMatrix.__value[undefined]" @@ -3732,15 +3928,15 @@ "comment": "", "meta": { "range": [ - 18912, - 18961 + 19881, + 19930 ], "filename": "matrix.js", - "lineno": 839, + "lineno": 880, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001514", + "id": "astnode100001584", "name": "resultMatrix.__value[undefined]", "type": "MemberExpression", "funcscope": "Matrix#rref", @@ -3759,15 +3955,15 @@ "comment": "", "meta": { "range": [ - 18966, - 18995 + 19935, + 19964 ], "filename": "matrix.js", - "lineno": 840, + "lineno": 881, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001526", + "id": "astnode100001596", "name": "resultMatrix.__value[undefined]", "type": "Identifier", "funcscope": "Matrix#rref", @@ -3786,15 +3982,15 @@ "comment": "", "meta": { "range": [ - 19005, - 19040 + 19974, + 20009 ], "filename": "matrix.js", - "lineno": 842, + "lineno": 883, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001534", + "id": "astnode100001604", "name": "val", "type": "MemberExpression", "value": "resultMatrix.__value[undefined][undefined]" @@ -3812,15 +4008,15 @@ "comment": "", "meta": { "range": [ - 19054, - 19059 + 20023, + 20028 ], "filename": "matrix.js", - "lineno": 843, + "lineno": 884, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001545", + "id": "astnode100001615", "name": "j", "type": "Literal", "value": 0 @@ -3838,15 +4034,15 @@ "comment": "", "meta": { "range": [ - 19094, - 19127 + 20063, + 20096 ], "filename": "matrix.js", - "lineno": 844, + "lineno": 885, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001558", + "id": "astnode100001628", "name": "resultMatrix.__value[undefined][undefined]", "type": "Identifier", "funcscope": "Matrix#rref", @@ -3865,15 +4061,15 @@ "comment": "", "meta": { "range": [ - 19148, - 19153 + 20117, + 20122 ], "filename": "matrix.js", - "lineno": 847, + "lineno": 888, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001569", + "id": "astnode100001639", "name": "i", "type": "Literal", "value": 0 @@ -3891,15 +4087,15 @@ "comment": "", "meta": { "range": [ - 19216, - 19251 + 20185, + 20220 ], "filename": "matrix.js", - "lineno": 849, + "lineno": 890, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001587", + "id": "astnode100001657", "name": "val", "type": "MemberExpression", "funcscope": "Matrix#rref", @@ -3918,15 +4114,15 @@ "comment": "", "meta": { "range": [ - 19267, - 19272 + 20236, + 20241 ], "filename": "matrix.js", - "lineno": 850, + "lineno": 891, "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001598", + "id": "astnode100001668", "name": "j", "type": "Literal", "value": 0 @@ -3944,15 +4140,15 @@ "comment": "", "meta": { "range": [ - 19309, - 19371 + 20278, + 20340 ], "filename": "matrix.js", - "lineno": 851, + "lineno": 892, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001611", + "id": "astnode100001681", "name": "resultMatrix.__value[undefined][undefined]", "type": "BinaryExpression", "funcscope": "Matrix#rref", @@ -3971,7 +4167,7 @@ "comment": "/**\n * @memberOf Matrix\n * @instance\n * @member solve\n * @param b\n * @returns {Array}\n * @example\n *\n * // Solve xA = b\n * // 5x + y = 7\n * // 3x - 4y = 18\n * // Solution for x and y:\n * // x = 2\n * // y = -3\n *\n * const A = Matrix.of([[5, 1], [3, -4]])\n * const solveA = A.solve([7, 18]) // [2, -3]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 859, + "lineno": 900, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -4003,15 +4199,15 @@ "comment": "", "meta": { "range": [ - 19734, - 20256 + 20703, + 21225 ], "filename": "matrix.js", - "lineno": 878, + "lineno": 919, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001634", + "id": "astnode100001704", "name": "Matrix.prototype.solve", "type": "FunctionExpression", "paramnames": [ @@ -4047,15 +4243,15 @@ "comment": "", "meta": { "range": [ - 19782, - 19798 + 20751, + 20767 ], "filename": "matrix.js", - "lineno": 879, + "lineno": 920, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001644", + "id": "astnode100001714", "name": "A", "type": "CallExpression", "value": "" @@ -4073,15 +4269,15 @@ "comment": "", "meta": { "range": [ - 19807, - 19818 + 20776, + 20787 ], "filename": "matrix.js", - "lineno": 880, + "lineno": 921, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001651", + "id": "astnode100001721", "name": "LU", "type": "CallExpression", "value": "" @@ -4099,15 +4295,15 @@ "comment": "", "meta": { "range": [ - 19827, - 19836 + 20796, + 20805 ], "filename": "matrix.js", - "lineno": 881, + "lineno": 922, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001658", + "id": "astnode100001728", "name": "L", "type": "MemberExpression", "value": "LU[0]" @@ -4125,15 +4321,15 @@ "comment": "", "meta": { "range": [ - 19845, - 19854 + 20814, + 20823 ], "filename": "matrix.js", - "lineno": 882, + "lineno": 923, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001664", + "id": "astnode100001734", "name": "U", "type": "MemberExpression", "value": "LU[1]" @@ -4151,15 +4347,15 @@ "comment": "", "meta": { "range": [ - 19863, - 19881 + 20832, + 20850 ], "filename": "matrix.js", - "lineno": 883, + "lineno": 924, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001670", + "id": "astnode100001740", "name": "n", "type": "CallExpression", "value": "" @@ -4177,15 +4373,15 @@ "comment": "", "meta": { "range": [ - 19888, - 19893 + 20857, + 20862 ], "filename": "matrix.js", - "lineno": 884, + "lineno": 925, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001677", + "id": "astnode100001747", "name": "s", "type": "Literal", "value": 0 @@ -4203,15 +4399,15 @@ "comment": "", "meta": { "range": [ - 19902, - 19908 + 20871, + 20877 ], "filename": "matrix.js", - "lineno": 885, + "lineno": 926, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001681", + "id": "astnode100001751", "name": "c", "type": "ArrayExpression", "value": "[]" @@ -4229,15 +4425,15 @@ "comment": "", "meta": { "range": [ - 19917, - 19923 + 20886, + 20892 ], "filename": "matrix.js", - "lineno": 886, + "lineno": 927, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001685", + "id": "astnode100001755", "name": "x", "type": "ArrayExpression", "value": "[]" @@ -4255,15 +4451,15 @@ "comment": "", "meta": { "range": [ - 19936, - 19941 + 20905, + 20910 ], "filename": "matrix.js", - "lineno": 888, + "lineno": 929, "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001690", + "id": "astnode100001760", "name": "k", "type": "Literal", "value": 0 @@ -4281,15 +4477,15 @@ "comment": "", "meta": { "range": [ - 19970, - 19975 + 20939, + 20944 ], "filename": "matrix.js", - "lineno": 889, + "lineno": 930, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001701", + "id": "astnode100001771", "name": "j", "type": "Literal", "value": 0 @@ -4307,15 +4503,15 @@ "comment": "", "meta": { "range": [ - 19997, - 20027 + 20966, + 20996 ], "filename": "matrix.js", - "lineno": 890, + "lineno": 931, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001711", + "id": "astnode100001781", "name": "s", "type": "BinaryExpression", "funcscope": "Matrix#solve", @@ -4334,15 +4530,15 @@ "comment": "", "meta": { "range": [ - 20038, - 20053 + 21007, + 21022 ], "filename": "matrix.js", - "lineno": 892, + "lineno": 933, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001727", + "id": "astnode100001797", "name": "c[undefined]", "type": "BinaryExpression", "funcscope": "Matrix#solve", @@ -4361,15 +4557,15 @@ "comment": "", "meta": { "range": [ - 20058, - 20063 + 21027, + 21032 ], "filename": "matrix.js", - "lineno": 893, + "lineno": 934, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001737", + "id": "astnode100001807", "name": "s", "type": "Literal", "funcscope": "Matrix#solve", @@ -4388,15 +4584,15 @@ "comment": "", "meta": { "range": [ - 20079, - 20088 + 21048, + 21057 ], "filename": "matrix.js", - "lineno": 895, + "lineno": 936, "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001742", + "id": "astnode100001812", "name": "a", "type": "BinaryExpression", "value": "" @@ -4414,15 +4610,15 @@ "comment": "", "meta": { "range": [ - 20113, - 20118 + 21082, + 21087 ], "filename": "matrix.js", - "lineno": 896, + "lineno": 937, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001755", + "id": "astnode100001825", "name": "t", "type": "Literal", "value": 0 @@ -4440,15 +4636,15 @@ "comment": "", "meta": { "range": [ - 20132, - 20141 + 21101, + 21110 ], "filename": "matrix.js", - "lineno": 897, + "lineno": 938, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001760", + "id": "astnode100001830", "name": "b", "type": "BinaryExpression", "value": "" @@ -4466,15 +4662,15 @@ "comment": "", "meta": { "range": [ - 20163, - 20193 + 21132, + 21162 ], "filename": "matrix.js", - "lineno": 898, + "lineno": 939, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001772", + "id": "astnode100001842", "name": "t", "type": "BinaryExpression", "funcscope": "Matrix#solve", @@ -4493,15 +4689,15 @@ "comment": "", "meta": { "range": [ - 20204, - 20239 + 21173, + 21208 ], "filename": "matrix.js", - "lineno": 900, + "lineno": 941, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001788", + "id": "astnode100001858", "name": "x[undefined]", "type": "BinaryExpression", "funcscope": "Matrix#solve", @@ -4520,7 +4716,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member inverse\n * @instance\n * @returns {Matrix}\n * @example\n *\n * const A = Matrix.of([[1, 1], [2, 4]]).inverse()\n * // [ [ 2, -0.5 ], [ -1, 0.5 ] ]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 905, + "lineno": 946, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -4547,15 +4743,15 @@ "comment": "", "meta": { "range": [ - 20443, - 20752 + 21412, + 21721 ], "filename": "matrix.js", - "lineno": 916, + "lineno": 957, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001808", + "id": "astnode100001878", "name": "Matrix.prototype.inverse", "type": "FunctionExpression", "paramnames": [] @@ -4579,15 +4775,15 @@ "comment": "", "meta": { "range": [ - 20492, - 20508 + 21461, + 21477 ], "filename": "matrix.js", - "lineno": 917, + "lineno": 958, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001817", + "id": "astnode100001887", "name": "A", "type": "CallExpression", "value": "" @@ -4605,15 +4801,15 @@ "comment": "", "meta": { "range": [ - 20517, - 20533 + 21486, + 21502 ], "filename": "matrix.js", - "lineno": 918, + "lineno": 959, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001824", + "id": "astnode100001894", "name": "I", "type": "CallExpression", "value": "" @@ -4631,15 +4827,15 @@ "comment": "", "meta": { "range": [ - 20542, - 20566 + 21511, + 21535 ], "filename": "matrix.js", - "lineno": 919, + "lineno": 960, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001831", + "id": "astnode100001901", "name": "Inv", "type": "CallExpression", "value": "" @@ -4657,15 +4853,15 @@ "comment": "", "meta": { "range": [ - 20576, - 20723 + 21545, + 21692 ], "filename": "matrix.js", - "lineno": 921, + "lineno": 962, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001842", + "id": "astnode100001912", "name": "result", "type": "CallExpression", "value": "" @@ -4683,15 +4879,15 @@ "comment": "", "meta": { "range": [ - 20636, - 20655 + 21605, + 21624 ], "filename": "matrix.js", - "lineno": 922, + "lineno": 963, "columnno": 10, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001856", + "id": "astnode100001926", "name": "half", "type": "BinaryExpression", "value": "" @@ -4709,7 +4905,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member rank\n * @instance\n * @returns {Number}\n */", "meta": { "filename": "matrix.js", - "lineno": 929, + "lineno": 970, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -4733,15 +4929,15 @@ "comment": "", "meta": { "range": [ - 20832, - 21013 + 21801, + 21982 ], "filename": "matrix.js", - "lineno": 935, + "lineno": 976, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001886", + "id": "astnode100001956", "name": "Matrix.prototype.rank", "type": "FunctionExpression", "paramnames": [] @@ -4763,15 +4959,15 @@ "comment": "", "meta": { "range": [ - 20878, - 20896 + 21847, + 21865 ], "filename": "matrix.js", - "lineno": 936, + "lineno": 977, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001895", + "id": "astnode100001965", "name": "rref", "type": "CallExpression", "value": "" @@ -4789,15 +4985,15 @@ "comment": "", "meta": { "range": [ - 20903, - 20913 + 21872, + 21882 ], "filename": "matrix.js", - "lineno": 937, + "lineno": 978, "columnno": 6, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001902", + "id": "astnode100001972", "name": "result", "type": "Literal", "value": 0 @@ -4815,15 +5011,15 @@ "comment": "", "meta": { "range": [ - 20925, - 20930 + 21894, + 21899 ], "filename": "matrix.js", - "lineno": 938, + "lineno": 979, "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001907", + "id": "astnode100001977", "name": "i", "type": "Literal", "value": 0 @@ -4841,15 +5037,15 @@ "comment": "", "meta": { "range": [ - 20963, - 20991 + 21932, + 21960 ], "filename": "matrix.js", - "lineno": 939, + "lineno": 980, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001920", + "id": "astnode100001990", "name": "result", "type": "MemberExpression", "funcscope": "Matrix#rank", @@ -4868,7 +5064,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member dimension\n * @instance\n * @see rank\n * @returns {Number}\n */", "meta": { "filename": "matrix.js", - "lineno": 944, + "lineno": 985, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -4895,15 +5091,15 @@ "comment": "", "meta": { "range": [ - 21111, - 21176 + 22080, + 22145 ], "filename": "matrix.js", - "lineno": 951, + "lineno": 992, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001932", + "id": "astnode100002002", "name": "Matrix.prototype.dimension", "type": "FunctionExpression", "paramnames": [] @@ -4920,7 +5116,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member diag\n * @instance\n * @desc Returns an array containing the values on the diagonal\n * @returns {Array}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).diag()\n * // [1, 1, 1]\n *\n * const diag0 = Matrix.zeros(5, 5).diag()\n * // [0, 0, 0, 0, 0]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 955, + "lineno": 996, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -4948,15 +5144,15 @@ "comment": "", "meta": { "range": [ - 21463, - 21588 + 22432, + 22557 ], "filename": "matrix.js", - "lineno": 970, + "lineno": 1011, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001946", + "id": "astnode100002016", "name": "Matrix.prototype.diag", "type": "FunctionExpression", "paramnames": [] @@ -4976,7 +5172,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function diag\n * @desc Returns an array containing the values on the diagonal\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Array}\n * @example\n *\n * const diag1 = Matrix.diag([[2, 1], [1, 5]])\n * // [2, 5]\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 976, + "lineno": 1017, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5016,15 +5212,15 @@ "comment": "", "meta": { "range": [ - 21866, - 21925 + 22835, + 22894 ], "filename": "matrix.js", - "lineno": 988, + "lineno": 1029, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001977", + "id": "astnode100002047", "name": "Matrix.diag", "type": "FunctionExpression", "paramnames": [ @@ -5043,7 +5239,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member diagproduct\n * @instance\n * @desc Returns the product of the values on the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).diagproduct()\n * // 1\n *\n * const diag0 = Matrix.zeros(5, 5).diagproduct()\n * // 0\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 992, + "lineno": 1033, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5071,15 +5267,15 @@ "comment": "", "meta": { "range": [ - 22207, - 22341 + 23176, + 23310 ], "filename": "matrix.js", - "lineno": 1007, + "lineno": 1048, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100001994", + "id": "astnode100002064", "name": "Matrix.prototype.diagproduct", "type": "FunctionExpression", "paramnames": [] @@ -5099,15 +5295,15 @@ "comment": "", "meta": { "range": [ - 22289, - 22302 + 23258, + 23271 ], "filename": "matrix.js", - "lineno": 1009, + "lineno": 1050, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002013", + "id": "astnode100002083", "name": "acc", "type": "MemberExpression", "funcscope": "", @@ -5126,7 +5322,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function diagproduct\n * @desc Returns the product of the values on the diagonal\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.diagproduct([[2, 1], [1, 5]])\n * // 10\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 1014, + "lineno": 1055, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5166,15 +5362,15 @@ "comment": "", "meta": { "range": [ - 22625, - 22698 + 23594, + 23667 ], "filename": "matrix.js", - "lineno": 1026, + "lineno": 1067, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002025", + "id": "astnode100002095", "name": "Matrix.diagproduct", "type": "FunctionExpression", "paramnames": [ @@ -5193,7 +5389,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member sum\n * @instance\n * @desc Returns the sum of the values in the Matrix\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.ones(3, 3).sum()\n * // 9\n *\n * const diag0 = Matrix.zeros(5, 5).sum()\n * // 0\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 1030, + "lineno": 1071, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5221,15 +5417,15 @@ "comment": "", "meta": { "range": [ - 22950, - 23104 + 23919, + 24073 ], "filename": "matrix.js", - "lineno": 1045, + "lineno": 1086, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002042", + "id": "astnode100002112", "name": "Matrix.prototype.sum", "type": "FunctionExpression", "paramnames": [] @@ -5249,15 +5445,15 @@ "comment": "", "meta": { "range": [ - 23019, - 23065 + 23988, + 24034 ], "filename": "matrix.js", - "lineno": 1047, + "lineno": 1088, "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002060", + "id": "astnode100002130", "name": "acc", "type": "CallExpression", "funcscope": "", @@ -5276,7 +5472,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function sum\n * @desc Returns the sum of the values in the Matrix\n * @param M {Matrix|Array} Matrix from which to return the diagonal\n * @returns {Number}\n * @example\n *\n * const diag1 = Matrix.sum([[2, 1], [1, 5]])\n * // 9\n *\n */", "meta": { "filename": "matrix.js", - "lineno": 1052, + "lineno": 1093, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5316,15 +5512,15 @@ "comment": "", "meta": { "range": [ - 23365, - 23422 + 24334, + 24391 ], "filename": "matrix.js", - "lineno": 1064, + "lineno": 1105, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002081", + "id": "astnode100002151", "name": "Matrix.sum", "type": "FunctionExpression", "paramnames": [ @@ -5343,7 +5539,7 @@ "comment": "/**\n * @memberOf Matrix\n * @member kronecker\n * @instance\n * @desc The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.\n * @param M {Matrix} The right side Matrix of the product (this ⊗ M)\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 1068, + "lineno": 1109, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5379,15 +5575,15 @@ "comment": "", "meta": { "range": [ - 23686, - 24188 + 24655, + 25158 ], "filename": "matrix.js", - "lineno": 1076, + "lineno": 1117, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002098", + "id": "astnode100002168", "name": "Matrix.prototype.kronecker", "type": "FunctionExpression", "paramnames": [ @@ -5420,15 +5616,15 @@ "comment": "", "meta": { "range": [ - 23738, - 23756 + 24707, + 24725 ], "filename": "matrix.js", - "lineno": 1077, + "lineno": 1118, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002108", + "id": "astnode100002178", "name": "m", "type": "CallExpression", "value": "" @@ -5446,15 +5642,15 @@ "comment": "", "meta": { "range": [ - 23765, - 23783 + 24734, + 24752 ], "filename": "matrix.js", - "lineno": 1078, + "lineno": 1119, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002115", + "id": "astnode100002185", "name": "n", "type": "CallExpression", "value": "" @@ -5472,15 +5668,15 @@ "comment": "", "meta": { "range": [ - 23792, - 23807 + 24761, + 24776 ], "filename": "matrix.js", - "lineno": 1079, + "lineno": 1120, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002122", + "id": "astnode100002192", "name": "p", "type": "CallExpression", "value": "" @@ -5498,15 +5694,15 @@ "comment": "", "meta": { "range": [ - 23816, - 23831 + 24785, + 24800 ], "filename": "matrix.js", - "lineno": 1080, + "lineno": 1121, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002129", + "id": "astnode100002199", "name": "q", "type": "CallExpression", "value": "" @@ -5524,15 +5720,15 @@ "comment": "", "meta": { "range": [ - 23841, - 23860 + 24810, + 24829 ], "filename": "matrix.js", - "lineno": 1082, + "lineno": 1123, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002136", + "id": "astnode100002206", "name": "left", "type": "MemberExpression", "value": "this.__value" @@ -5550,15 +5746,15 @@ "comment": "", "meta": { "range": [ - 23869, - 23886 + 24838, + 24855 ], "filename": "matrix.js", - "lineno": 1083, + "lineno": 1124, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002142", + "id": "astnode100002212", "name": "right", "type": "MemberExpression", "value": "M.__value" @@ -5576,15 +5772,15 @@ "comment": "", "meta": { "range": [ - 23896, - 23926 + 24865, + 24895 ], "filename": "matrix.js", - "lineno": 1085, + "lineno": 1126, "columnno": 8, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002148", + "id": "astnode100002218", "name": "frame", "type": "CallExpression", "value": "" @@ -5602,15 +5798,15 @@ "comment": "", "meta": { "range": [ - 23939, - 23944 + 24908, + 24913 ], "filename": "matrix.js", - "lineno": 1087, + "lineno": 1128, "columnno": 11, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002160", + "id": "astnode100002230", "name": "i", "type": "Literal", "value": 0 @@ -5628,15 +5824,15 @@ "comment": "", "meta": { "range": [ - 23973, - 23978 + 24942, + 24947 ], "filename": "matrix.js", - "lineno": 1088, + "lineno": 1129, "columnno": 13, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002171", + "id": "astnode100002241", "name": "j", "type": "Literal", "value": 0 @@ -5654,15 +5850,15 @@ "comment": "", "meta": { "range": [ - 24009, - 24014 + 24978, + 24983 ], "filename": "matrix.js", - "lineno": 1089, + "lineno": 1130, "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002182", + "id": "astnode100002252", "name": "k", "type": "Literal", "value": 0 @@ -5680,15 +5876,15 @@ "comment": "", "meta": { "range": [ - 24047, - 24052 + 25016, + 25021 ], "filename": "matrix.js", - "lineno": 1090, + "lineno": 1131, "columnno": 17, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002193", + "id": "astnode100002263", "name": "l", "type": "Literal", "value": 0 @@ -5706,15 +5902,15 @@ "comment": "", "meta": { "range": [ - 24078, - 24132 + 25047, + 25101 ], "filename": "matrix.js", - "lineno": 1091, + "lineno": 1132, "columnno": 10, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002203", + "id": "astnode100002273", "name": "frame[undefined][undefined]", "type": "BinaryExpression", "funcscope": "Matrix#kronecker", @@ -5733,7 +5929,7 @@ "comment": "/**\n * @memberOf Matrix\n * @function kronecker\n * @desc The Kronecker product is an operation on two matrices of arbitrary size resulting in a block matrix.\n * @param A {Matrix} The left side Matrix of the product (A ⊗ B)\n * @param B {Matrix} The right side Matrix of the product (A ⊗ B)\n * @returns {Matrix}\n */", "meta": { "filename": "matrix.js", - "lineno": 1099, + "lineno": 1141, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": {} @@ -5778,15 +5974,15 @@ "comment": "", "meta": { "range": [ - 24503, - 24576 + 25473, + 25546 ], "filename": "matrix.js", - "lineno": 1107, + "lineno": 1149, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002235", + "id": "astnode100002305", "name": "Matrix.kronecker", "type": "FunctionExpression", "paramnames": [ @@ -5806,15 +6002,15 @@ "comment": "", "meta": { "range": [ - 24578, - 24599 + 25548, + 25569 ], "filename": "matrix.js", - "lineno": 1111, + "lineno": 1153, "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src", "code": { - "id": "astnode100002253", + "id": "astnode100002323", "name": "module.exports", "type": "Identifier" } @@ -5838,7 +6034,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002265", + "id": "astnode100002335", "name": "module.exports", "type": "CallExpression" } @@ -5862,7 +6058,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002304", + "id": "astnode100002374", "name": "module.exports", "type": "CallExpression" } @@ -5935,7 +6131,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002331", + "id": "astnode100002401", "name": "module.exports", "type": "CallExpression" } @@ -6000,7 +6196,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002366", + "id": "astnode100002436", "name": "module.exports", "type": "CallExpression" } @@ -6024,7 +6220,7 @@ "columnno": 4, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002390", + "id": "astnode100002460", "name": "acc", "type": "CallExpression", "funcscope": "", @@ -6051,7 +6247,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002419", + "id": "astnode100002489", "name": "module.exports", "type": "CallExpression" } @@ -6117,7 +6313,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002427", + "id": "astnode100002497", "name": "module.exports", "type": "ArrowFunctionExpression", "paramnames": [ @@ -6136,6 +6332,64 @@ "memberof": "module", "scope": "static" }, + { + "comment": "", + "meta": { + "range": [ + 41, + 174 + ], + "filename": "gpumap.js", + "lineno": 3, + "columnno": 0, + "path": "/Volumes/BigOne/github/funMatrix/src/util", + "code": { + "id": "astnode100002524", + "name": "module.exports", + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "matrix" + ] + } + }, + "undocumented": true, + "name": "exports", + "longname": "module.exports", + "kind": "function", + "memberof": "module", + "scope": "static" + }, + { + "comment": "", + "meta": { + "range": [ + 56, + 174 + ], + "filename": "gpumap.js", + "lineno": 3, + "columnno": 15, + "path": "/Volumes/BigOne/github/funMatrix/src/util", + "code": { + "id": "astnode100002525", + "name": "gpumap", + "type": "FunctionDeclaration", + "paramnames": [ + "gpu", + "f", + "matrix" + ] + } + }, + "undocumented": true, + "name": "gpumap", + "longname": "gpumap", + "kind": "function", + "scope": "global", + "params": [] + }, { "comment": "/**\n * @function identity\n * @desc Creates an identiy matrix from an empty array\n * @param m {Array}\n * @param idx {number}\n * @return {Matrix}\n */", "meta": { @@ -6190,7 +6444,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002458", + "id": "astnode100002557", "name": "module.exports", "type": "ArrowFunctionExpression", "paramnames": [ @@ -6262,7 +6516,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002476", + "id": "astnode100002575", "name": "module.exports", "type": "FunctionDeclaration", "paramnames": [ @@ -6290,7 +6544,7 @@ "columnno": 15, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002477", + "id": "astnode100002576", "name": "round", "type": "FunctionDeclaration", "paramnames": [ @@ -6360,7 +6614,7 @@ "columnno": 0, "path": "/Volumes/BigOne/github/funMatrix/src/util", "code": { - "id": "astnode100002508", + "id": "astnode100002607", "name": "module.exports", "type": "CallExpression" } @@ -6383,6 +6637,7 @@ "/Volumes/BigOne/github/funMatrix/src/util/dot.js", "/Volumes/BigOne/github/funMatrix/src/util/empty.js", "/Volumes/BigOne/github/funMatrix/src/util/generate.js", + "/Volumes/BigOne/github/funMatrix/src/util/gpumap.js", "/Volumes/BigOne/github/funMatrix/src/util/identity.js", "/Volumes/BigOne/github/funMatrix/src/util/round.js", "/Volumes/BigOne/github/funMatrix/src/util/transpose.js" diff --git a/docs/Matrix.html b/docs/Matrix.html index c01c8db..d930a87 100644 --- a/docs/Matrix.html +++ b/docs/Matrix.html @@ -24,7 +24,7 @@
@@ -101,7 +101,7 @@

new MatrixSource:
@@ -206,7 +206,7 @@

addSource:
@@ -278,7 +278,7 @@

additi
Source:
@@ -349,7 +349,7 @@

apSource:
@@ -421,7 +421,7 @@

cloneSource:
@@ -481,7 +481,7 @@

combineSource:
@@ -552,7 +552,7 @@

concatSource:
@@ -626,7 +626,7 @@

diagSource:
@@ -699,7 +699,7 @@

diagproduc
Source:
@@ -768,7 +768,7 @@

dimensionSource:
@@ -839,7 +839,7 @@

dotSource:
@@ -916,7 +916,7 @@

emptySource:
@@ -976,7 +976,7 @@

equalsSource:
@@ -1048,7 +1048,7 @@

fillSource:
@@ -1118,7 +1118,7 @@

foldSource:
@@ -1189,7 +1189,7 @@

fromArraySource:
@@ -1249,7 +1249,7 @@

getColsSource:
@@ -1315,7 +1315,7 @@

getRowsSource:
@@ -1381,7 +1381,7 @@

getShapeSource:
@@ -1447,7 +1447,7 @@

hadamardSource:
@@ -1526,7 +1526,7 @@

identitySource:
@@ -1594,7 +1594,7 @@

inverseSource:
@@ -1660,7 +1660,7 @@

isOrthogo
Source:
@@ -1731,7 +1731,7 @@

isSquareSource:
@@ -1797,7 +1797,7 @@

isSymmetri
Source:
@@ -1867,7 +1867,7 @@

kroneckerSource:
@@ -1931,7 +1931,7 @@

luSource:
@@ -2005,7 +2005,78 @@

mapSource:
+ + + + + + + + + + + + + + + +
Example
+ +
const m = Matrix.of([[1, 1], [1, 1]])
+m.map(x => x.map(y => y+ 1))
+// [[2, 2], [2, 2]]
+ + +

+ + + +
+

map

+ + + + +
+ Maps over the rows of the matrix using a map function +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -2076,7 +2147,7 @@

multiplySource:
@@ -2148,7 +2219,7 @@

onesSource:
@@ -2268,7 +2339,7 @@
Properties:
Source:
@@ -2348,7 +2419,7 @@

randomSource:
@@ -2408,7 +2479,7 @@

rankSource:
@@ -2468,7 +2539,7 @@

rrefSource:
@@ -2534,7 +2605,7 @@

setPrecis
Source:
@@ -2601,7 +2672,7 @@

solveSource:
@@ -2674,7 +2745,7 @@

subtractSource:
@@ -2746,7 +2817,7 @@

sumSource:
@@ -2819,7 +2890,7 @@

toArraySource:
@@ -2883,7 +2954,7 @@

transposeSource:
@@ -3004,7 +3075,7 @@
Properties:
Source:
@@ -3084,7 +3155,7 @@

zerosSource:
@@ -3164,7 +3235,7 @@

(static) apSource:
@@ -3354,7 +3425,7 @@

(static) comb
Source:
@@ -3512,7 +3583,7 @@

(static) conca
Source:
@@ -3706,7 +3777,7 @@

(static) diagSource:
@@ -3873,7 +3944,7 @@

(static)
Source:
@@ -4040,7 +4111,7 @@

(static) dotSource:
@@ -4204,7 +4275,7 @@

(static) empty<
Source:
@@ -4386,7 +4457,7 @@

(static) foldSource:
@@ -4579,7 +4650,7 @@

(static) ide
Source:
@@ -4691,7 +4762,7 @@

(static) kr
Source:
@@ -4873,7 +4944,200 @@

(static) mapSource:
+ + + + + + + +

+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
f + + +function + + + + + An iterator function + +
M + + +Matrix +| + +array + + + + + Matrix or array to map + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Matrix + + +
+
+ + + +
+ + + +
+
Example
+ +
const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]])
+// [[2, 2], [2, 2]]
+ +
+ +
+ + +
+ + + +

(static) map(f, M) → {Matrix}

+ + + + + +
+ Static function that maps over the rows of the matrix using a map function +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -5066,7 +5330,7 @@

(static) ofSource:
@@ -5232,7 +5496,7 @@

(static) onesSource:
@@ -5422,7 +5686,7 @@

(static) rando
Source:
@@ -5630,7 +5894,7 @@

(static) sumSource:
@@ -5797,7 +6061,7 @@

(static) tr
Source:
@@ -5965,7 +6229,7 @@

(static) zeros<
Source:
@@ -6124,7 +6388,7 @@

Example

- Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
diff --git a/docs/global.html b/docs/global.html index 0416bd3..5b845cf 100644 --- a/docs/global.html +++ b/docs/global.html @@ -24,7 +24,7 @@
@@ -1235,7 +1235,7 @@
Returns:

- Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
diff --git a/docs/index.html b/docs/index.html index 2793897..f6ebd8e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,7 +24,7 @@
@@ -113,7 +113,7 @@

Methods and properties


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/matrix.js.html b/docs/matrix.js.html index 138820b..5d29242 100644 --- a/docs/matrix.js.html +++ b/docs/matrix.js.html @@ -24,7 +24,7 @@
    @@ -39,7 +39,8 @@

    matrix.js

    -
    import curry from 'fun.js/src/curry'
    +            
    import { GPU } from 'gpu.js'
    +import curry from 'fun.js/src/curry'
     import map from 'fun.js/src/map'
     import fold from 'fun.js/src/fold'
     import equals from 'fun.js/src/equals'
    @@ -49,6 +50,7 @@ 

    matrix.js

    import identity from 'util/identity' import transpose from 'util/transpose' import generate from 'util/generate' +import gpumap from 'util/gpumap' /** * @class Matrix @@ -63,6 +65,28 @@

    matrix.js

    */ let Matrix = function (val) { this.__value = val + this.gpu = new GPU() +} + +/** + * @memberOf Matrix + * @static + * @function of + * @desc Creates a Matrix object and flattens the Matrix + * @param val {array|function} An array of arrays + * @returns {Matrix} + * @example + * + * const m = Matrix.of([[1,2],[2,3],[4,5]]) + * + */ +Matrix.of = function (val) { + if (val instanceof Matrix) return val + if (this instanceof Matrix) { + this.__value = val + return this + } + return new Matrix(val) } /** @@ -215,25 +239,40 @@

    matrix.js

    /** * @memberOf Matrix - * @static - * @function of - * @desc Creates a Matrix object and flattens the Matrix - * @param val {array|function} An array of arrays + * @instance + * @member map + * @description Maps over the rows of the matrix using a map function + * @param f {function} An iterator function * @returns {Matrix} * @example * - * const m = Matrix.of([[1,2],[2,3],[4,5]]) + * const m = Matrix.of([[1, 1], [1, 1]]) + * m.map(x => x.map(y => y+ 1)) + * // [[2, 2], [2, 2]] * */ -Matrix.of = function (val) { - if (val instanceof Matrix) return val - if (this instanceof Matrix) { - this.__value = val - return this - } - return new Matrix(val) +Matrix.prototype.map = function (f) { + return Matrix.of(map(f)(this.__value)) } +/** + * @memberOf Matrix + * @static + * @function map + * @description Static function that maps over the rows of the matrix using a map function + * @param f {function} An iterator function + * @param M {Matrix|array} Matrix or array to map + * @returns {Matrix} + * @example + * + * const m = Matrix.map(x= > x.map(y => y+ 1), [[1, 1], [1, 1]]) + * // [[2, 2], [2, 2]] + * + */ +Matrix.map = curry(function (f, M) { + return Matrix.of(M).map(f) +}) + /** * @memberOf Matrix * @instance @@ -248,8 +287,10 @@

    matrix.js

    * // [[2, 2], [2, 2]] * */ -Matrix.prototype.map = function (f) { - return Matrix.of(map(f)(this.__value)) +Matrix.prototype.gpumap = function (f) { + const res = gpumap(this.gpu, f, this.__value) + console.log(res) + return Matrix.of(res) } /** @@ -266,8 +307,8 @@

    matrix.js

    * // [[2, 2], [2, 2]] * */ -Matrix.map = curry(function (f, M) { - return Matrix.of(M).map(f) +Matrix.gpumap = curry(function (f, M) { + return Matrix.of(M).gpumap(f) }) /** @@ -1134,6 +1175,7 @@

    matrix.js

    } } } + return Matrix.of(frame) } @@ -1162,7 +1204,7 @@

    matrix.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_concat.js.html b/docs/util_concat.js.html index 692611d..9b68a0f 100644 --- a/docs/util_concat.js.html +++ b/docs/util_concat.js.html @@ -24,7 +24,7 @@
    @@ -64,7 +64,7 @@

    util/concat.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_dot.js.html b/docs/util_dot.js.html index dcd31e8..731e139 100644 --- a/docs/util_dot.js.html +++ b/docs/util_dot.js.html @@ -24,7 +24,7 @@
    @@ -68,7 +68,7 @@

    util/dot.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_generate.js.html b/docs/util_generate.js.html index 851dad0..90d892a 100644 --- a/docs/util_generate.js.html +++ b/docs/util_generate.js.html @@ -24,7 +24,7 @@
    @@ -59,7 +59,7 @@

    util/generate.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_identity.js.html b/docs/util_identity.js.html index fd7a879..4119fb2 100644 --- a/docs/util_identity.js.html +++ b/docs/util_identity.js.html @@ -24,7 +24,7 @@
    @@ -61,7 +61,7 @@

    util/identity.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_round.js.html b/docs/util_round.js.html index daab8f4..59e76c3 100644 --- a/docs/util_round.js.html +++ b/docs/util_round.js.html @@ -24,7 +24,7 @@
    @@ -60,7 +60,7 @@

    util/round.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_transpose.js.html b/docs/util_transpose.js.html index 510f805..15b9d4e 100644 --- a/docs/util_transpose.js.html +++ b/docs/util_transpose.js.html @@ -24,7 +24,7 @@
    @@ -62,7 +62,7 @@

    util/transpose.js


    - Generated by JSDoc 3.5.5 on Sun May 12 2019 14:39:34 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Mon May 13 2019 21:33:38 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/lib/@astuanax/funmatrix.js b/lib/@astuanax/funmatrix.js index 5f17b20..a9d3e01 100644 --- a/lib/@astuanax/funmatrix.js +++ b/lib/@astuanax/funmatrix.js @@ -96,6 +96,5401 @@ return /******/ (function(modules) { // webpackBootstrap /************************************************************************/ /******/ ({ +/***/ "./node_modules/acorn/dist/acorn.mjs": +/*!*******************************************!*\ + !*** ./node_modules/acorn/dist/acorn.mjs ***! + \*******************************************/ +/*! exports provided: version, parse, parseExpressionAt, tokenizer, Parser, defaultOptions, Position, SourceLocation, getLineInfo, Node, TokenType, tokTypes, keywordTypes, TokContext, tokContexts, isIdentifierChar, isIdentifierStart, Token, isNewLine, lineBreak, lineBreakG, nonASCIIwhitespace */ +/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parse", function() { return parse; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseExpressionAt", function() { return parseExpressionAt; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tokenizer", function() { return tokenizer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Parser", function() { return Parser; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultOptions", function() { return defaultOptions; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Position", function() { return Position; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SourceLocation", function() { return SourceLocation; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLineInfo", function() { return getLineInfo; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Node", function() { return Node; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TokenType", function() { return TokenType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tokTypes", function() { return types; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keywordTypes", function() { return keywords$1; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TokContext", function() { return TokContext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tokContexts", function() { return types$1; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIdentifierChar", function() { return isIdentifierChar; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIdentifierStart", function() { return isIdentifierStart; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Token", function() { return Token; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNewLine", function() { return isNewLine; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineBreak", function() { return lineBreak; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineBreakG", function() { return lineBreakG; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonASCIIwhitespace", function() { return nonASCIIwhitespace; }); +// Reserved word lists for various dialects of the language + +var reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" +}; + +// And the keywords + +var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; + +var keywords = { + 5: ecma5AndLessKeywords, + 6: ecma5AndLessKeywords + " const class extends export import super" +}; + +var keywordRelationalOperator = /^in(stanceof)?$/; + +// ## Character categories + +// Big ugly regular expressions that match characters in the +// whitespace, identifier, and identifier-start categories. These +// are only applied when a character is found to actually have a +// code point above 128. +// Generated by `bin/generate-identifier-regex.js`. + +var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + +var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + +// These are a run-length and offset encoded representation of the +// >0xffff code points that are a valid part of identifiers. The +// offset starts at 0x10000, and each pair of numbers represents an +// offset to the next range, and then a size of the range. They were +// generated by bin/generate-identifier-regex.js + +// eslint-disable-next-line comma-spacing +var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,477,28,11,0,9,21,190,52,76,44,33,24,27,35,30,0,12,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,26,230,43,117,63,32,0,257,0,11,39,8,0,22,0,12,39,3,3,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,270,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,68,12,0,67,12,65,1,31,6129,15,754,9486,286,82,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,15,7472,3104,541]; + +// eslint-disable-next-line comma-spacing +var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,525,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,4,9,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,280,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239]; + +// This has a complexity linear to the value of the code. The +// assumption is that looking up astral identifier characters is +// rare. +function isInAstralSet(code, set) { + var pos = 0x10000; + for (var i = 0; i < set.length; i += 2) { + pos += set[i]; + if (pos > code) { return false } + pos += set[i + 1]; + if (pos >= code) { return true } + } +} + +// Test whether a given character code starts an identifier. + +function isIdentifierStart(code, astral) { + if (code < 65) { return code === 36 } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) +} + +// Test whether a given character is part of an identifier. + +function isIdentifierChar(code, astral) { + if (code < 48) { return code === 36 } + if (code < 58) { return true } + if (code < 65) { return false } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) +} + +// ## Token types + +// The assignment of fine-grained, information-carrying type objects +// allows the tokenizer to store the information it has about a +// token in a way that is very cheap for the parser to look up. + +// All token type variables start with an underscore, to make them +// easy to recognize. + +// The `beforeExpr` property is used to disambiguate between regular +// expressions and divisions. It is set on all token types that can +// be followed by an expression (thus, a slash after them would be a +// regular expression). +// +// The `startsExpr` property is used to check if the token ends a +// `yield` expression. It is set on all token types that either can +// directly start an expression (like a quotation mark) or can +// continue an expression (like the body of a string). +// +// `isLoop` marks a keyword as starting a loop, which is important +// to know when parsing a label, in order to allow or disallow +// continue jumps to that label. + +var TokenType = function TokenType(label, conf) { + if ( conf === void 0 ) conf = {}; + + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; +}; + +function binop(name, prec) { + return new TokenType(name, {beforeExpr: true, binop: prec}) +} +var beforeExpr = {beforeExpr: true}; +var startsExpr = {startsExpr: true}; + +// Map keyword names to token types. + +var keywords$1 = {}; + +// Succinct definitions of keyword token types +function kw(name, options) { + if ( options === void 0 ) options = {}; + + options.keyword = name; + return keywords$1[name] = new TokenType(name, options) +} + +var types = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + eof: new TokenType("eof"), + + // Punctuation token types. + bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), + bracketR: new TokenType("]"), + braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), + braceR: new TokenType("}"), + parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), + + // Operators. These carry several kinds of properties to help the + // parser use them properly (the presence of these properties is + // what categorizes them as operators). + // + // `binop`, when present, specifies that this operator is a binary + // operator, and will refer to its precedence. + // + // `prefix` and `postfix` mark the operator as a prefix or postfix + // unary operator. + // + // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as + // binary operators with a very low precedence, that should result + // in AssignmentExpression nodes. + + eq: new TokenType("=", {beforeExpr: true, isAssign: true}), + assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), + incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), + prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=/===/!==", 6), + relational: binop("/<=/>=", 7), + bitShift: binop("<>/>>>", 8), + plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", {beforeExpr: true}), + + // Keyword token types. + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", {isLoop: true, beforeExpr: true}), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", {isLoop: true}), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", {isLoop: true}), + _with: kw("with"), + _new: kw("new", {beforeExpr: true, startsExpr: true}), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import"), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", {beforeExpr: true, binop: 7}), + _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), + _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), + _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), + _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) +}; + +// Matches a whole line break (where CRLF is considered a single +// line break). Used to count lines. + +var lineBreak = /\r\n?|\n|\u2028|\u2029/; +var lineBreakG = new RegExp(lineBreak.source, "g"); + +function isNewLine(code, ecma2019String) { + return code === 10 || code === 13 || (!ecma2019String && (code === 0x2028 || code === 0x2029)) +} + +var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + +var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; + +var ref = Object.prototype; +var hasOwnProperty = ref.hasOwnProperty; +var toString = ref.toString; + +// Checks if an object has a property. + +function has(obj, propName) { + return hasOwnProperty.call(obj, propName) +} + +var isArray = Array.isArray || (function (obj) { return ( + toString.call(obj) === "[object Array]" +); }); + +// These are used when `options.locations` is on, for the +// `startLoc` and `endLoc` properties. + +var Position = function Position(line, col) { + this.line = line; + this.column = col; +}; + +Position.prototype.offset = function offset (n) { + return new Position(this.line, this.column + n) +}; + +var SourceLocation = function SourceLocation(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { this.source = p.sourceFile; } +}; + +// The `getLineInfo` function is mostly useful when the +// `locations` option is off (for performance reasons) and you +// want to find the line/column position for a given character +// offset. `input` should be the code string that the offset refers +// into. + +function getLineInfo(input, offset) { + for (var line = 1, cur = 0;;) { + lineBreakG.lastIndex = cur; + var match = lineBreakG.exec(input); + if (match && match.index < offset) { + ++line; + cur = match.index + match[0].length; + } else { + return new Position(line, offset - cur) + } + } +} + +// A second optional argument can be given to further configure +// the parser process. These options are recognized: + +var defaultOptions = { + // `ecmaVersion` indicates the ECMAScript version to parse. Must be + // either 3, 5, 6 (2015), 7 (2016), 8 (2017), 9 (2018), or 10 + // (2019). This influences support for strict mode, the set of + // reserved words, and support for new syntax features. The default + // is 9. + ecmaVersion: 9, + // `sourceType` indicates the mode the code should be parsed in. + // Can be either `"script"` or `"module"`. This influences global + // strict mode and parsing of `import` and `export` declarations. + sourceType: "script", + // `onInsertedSemicolon` can be a callback that will be called + // when a semicolon is automatically inserted. It will be passed + // the position of the comma as an offset, and if `locations` is + // enabled, it is given the location as a `{line, column}` object + // as second argument. + onInsertedSemicolon: null, + // `onTrailingComma` is similar to `onInsertedSemicolon`, but for + // trailing commas. + onTrailingComma: null, + // By default, reserved words are only enforced if ecmaVersion >= 5. + // Set `allowReserved` to a boolean value to explicitly turn this on + // an off. When this option has the value "never", reserved words + // and keywords can also not be used as property names. + allowReserved: null, + // When enabled, a return at the top level is not considered an + // error. + allowReturnOutsideFunction: false, + // When enabled, import/export statements are not constrained to + // appearing at the top of the program. + allowImportExportEverywhere: false, + // When enabled, await identifiers are allowed to appear at the top-level scope, + // but they are still not allowed in non-async functions. + allowAwaitOutsideFunction: false, + // When enabled, hashbang directive in the beginning of file + // is allowed and treated as a line comment. + allowHashBang: false, + // When `locations` is on, `loc` properties holding objects with + // `start` and `end` properties in `{line, column}` form (with + // line being 1-based and column 0-based) will be attached to the + // nodes. + locations: false, + // A function can be passed as `onToken` option, which will + // cause Acorn to call that function with object in the same + // format as tokens returned from `tokenizer().getToken()`. Note + // that you are not allowed to call the parser from the + // callback—that will corrupt its internal state. + onToken: null, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. Note that you are not allowed to call the + // parser from the callback—that will corrupt its internal state. + onComment: null, + // Nodes have their start and end characters offsets recorded in + // `start` and `end` properties (directly on the node, rather than + // the `loc` object, which holds line/column data. To also add a + // [semi-standardized][range] `range` property holding a `[start, + // end]` array with the same numbers, set the `ranges` option to + // `true`. + // + // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + ranges: false, + // It is possible to parse multiple files into a single AST by + // passing the tree produced by parsing the first file as + // `program` option in subsequent parses. This will add the + // toplevel forms of the parsed file to the `Program` (top) node + // of an existing parse tree. + program: null, + // When `locations` is on, you can pass this to record the source + // file in every node's `loc` object. + sourceFile: null, + // This value, if given, is stored in every node, whether + // `locations` is on or off. + directSourceFile: null, + // When enabled, parenthesized expressions are represented by + // (non-standard) ParenthesizedExpression nodes + preserveParens: false +}; + +// Interpret and default an options object + +function getOptions(opts) { + var options = {}; + + for (var opt in defaultOptions) + { options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]; } + + if (options.ecmaVersion >= 2015) + { options.ecmaVersion -= 2009; } + + if (options.allowReserved == null) + { options.allowReserved = options.ecmaVersion < 5; } + + if (isArray(options.onToken)) { + var tokens = options.onToken; + options.onToken = function (token) { return tokens.push(token); }; + } + if (isArray(options.onComment)) + { options.onComment = pushComment(options, options.onComment); } + + return options +} + +function pushComment(options, array) { + return function(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "Block" : "Line", + value: text, + start: start, + end: end + }; + if (options.locations) + { comment.loc = new SourceLocation(this, startLoc, endLoc); } + if (options.ranges) + { comment.range = [start, end]; } + array.push(comment); + } +} + +// Each scope gets a bitset that may contain these flags +var SCOPE_TOP = 1; +var SCOPE_FUNCTION = 2; +var SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION; +var SCOPE_ASYNC = 4; +var SCOPE_GENERATOR = 8; +var SCOPE_ARROW = 16; +var SCOPE_SIMPLE_CATCH = 32; +var SCOPE_SUPER = 64; +var SCOPE_DIRECT_SUPER = 128; + +function functionFlags(async, generator) { + return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0) +} + +// Used in checkLVal and declareName to determine the type of a binding +var BIND_NONE = 0; +var BIND_VAR = 1; +var BIND_LEXICAL = 2; +var BIND_FUNCTION = 3; +var BIND_SIMPLE_CATCH = 4; +var BIND_OUTSIDE = 5; // Special case for function names as bound inside the function + +function keywordRegexp(words) { + return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") +} + +var Parser = function Parser(options, input, startPos) { + this.options = options = getOptions(options); + this.sourceFile = options.sourceFile; + this.keywords = keywordRegexp(keywords[options.ecmaVersion >= 6 ? 6 : 5]); + var reserved = ""; + if (!options.allowReserved) { + for (var v = options.ecmaVersion;; v--) + { if (reserved = reservedWords[v]) { break } } + if (options.sourceType === "module") { reserved += " await"; } + } + this.reservedWords = keywordRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = keywordRegexp(reservedStrict); + this.reservedWordsStrictBind = keywordRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + + // Used to signal to callers of `readWord1` whether the word + // contained any escape sequences. This is needed because words with + // escape sequences must not be interpreted as keywords. + this.containsEsc = false; + + // Set up token state + + // The current position of the tokenizer in the input. + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + + // Properties of the current token: + // Its type + this.type = types.eof; + // For tokens that include more information than their type, the value + this.value = null; + // Its start and end offset + this.start = this.end = this.pos; + // And, if locations are used, the {line, column} object + // corresponding to those offsets + this.startLoc = this.endLoc = this.curPosition(); + + // Position information for the previous token + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + + // The context stack is used to superficially track syntactic + // context to predict whether a regular expression is allowed in a + // given position. + this.context = this.initialContext(); + this.exprAllowed = true; + + // Figure out if it's a module code. + this.inModule = options.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + + // Used to signify the start of a potential arrow function + this.potentialArrowAt = -1; + + // Positions to delayed-check that yield/await does not exist in default parameters. + this.yieldPos = this.awaitPos = 0; + // Labels in scope. + this.labels = []; + + // If enabled, skip leading hashbang line. + if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!") + { this.skipLineComment(2); } + + // Scope tracking for duplicate variable names (see scope.js) + this.scopeStack = []; + this.enterScope(SCOPE_TOP); + + // For RegExp validation + this.regexpState = null; +}; + +var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true } }; + +Parser.prototype.parse = function parse () { + var node = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node) +}; + +prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; +prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 }; +prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 }; +prototypeAccessors.allowSuper.get = function () { return (this.currentThisScope().flags & SCOPE_SUPER) > 0 }; +prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; +prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; + +// Switch to a getter for 7.0.0. +Parser.prototype.inNonArrowFunction = function inNonArrowFunction () { return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0 }; + +Parser.extend = function extend () { + var plugins = [], len = arguments.length; + while ( len-- ) plugins[ len ] = arguments[ len ]; + + var cls = this; + for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } + return cls +}; + +Parser.parse = function parse (input, options) { + return new this(options, input).parse() +}; + +Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) { + var parser = new this(options, input, pos); + parser.nextToken(); + return parser.parseExpression() +}; + +Parser.tokenizer = function tokenizer (input, options) { + return new this(options, input) +}; + +Object.defineProperties( Parser.prototype, prototypeAccessors ); + +var pp = Parser.prototype; + +// ## Parser utilities + +var literal = /^(?:'((?:\\.|[^'])*?)'|"((?:\\.|[^"])*?)")/; +pp.strictDirective = function(start) { + var this$1 = this; + + for (;;) { + // Try to find string literal. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this$1.input)[0].length; + var match = literal.exec(this$1.input.slice(start)); + if (!match) { return false } + if ((match[1] || match[2]) === "use strict") { return true } + start += match[0].length; + + // Skip semicolon, if any. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this$1.input)[0].length; + if (this$1.input[start] === ';') + { start++; } + } +}; + +// Predicate that tests whether the next token is of the given +// type, and if yes, consumes it as a side effect. + +pp.eat = function(type) { + if (this.type === type) { + this.next(); + return true + } else { + return false + } +}; + +// Tests whether parsed token is a contextual keyword. + +pp.isContextual = function(name) { + return this.type === types.name && this.value === name && !this.containsEsc +}; + +// Consumes contextual keyword if possible. + +pp.eatContextual = function(name) { + if (!this.isContextual(name)) { return false } + this.next(); + return true +}; + +// Asserts that following token is given contextual keyword. + +pp.expectContextual = function(name) { + if (!this.eatContextual(name)) { this.unexpected(); } +}; + +// Test whether a semicolon can be inserted at the current position. + +pp.canInsertSemicolon = function() { + return this.type === types.eof || + this.type === types.braceR || + lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) +}; + +pp.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) + { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); } + return true + } +}; + +// Consume a semicolon, or, failing that, see if we are allowed to +// pretend that there is a semicolon at this position. + +pp.semicolon = function() { + if (!this.eat(types.semi) && !this.insertSemicolon()) { this.unexpected(); } +}; + +pp.afterTrailingComma = function(tokType, notNext) { + if (this.type === tokType) { + if (this.options.onTrailingComma) + { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); } + if (!notNext) + { this.next(); } + return true + } +}; + +// Expect a token of a given type. If found, consume it, otherwise, +// raise an unexpected token error. + +pp.expect = function(type) { + this.eat(type) || this.unexpected(); +}; + +// Raise an unexpected token error. + +pp.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); +}; + +function DestructuringErrors() { + this.shorthandAssign = + this.trailingComma = + this.parenthesizedAssign = + this.parenthesizedBind = + this.doubleProto = + -1; +} + +pp.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { return } + if (refDestructuringErrors.trailingComma > -1) + { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } +}; + +pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + if (!refDestructuringErrors) { return false } + var shorthandAssign = refDestructuringErrors.shorthandAssign; + var doubleProto = refDestructuringErrors.doubleProto; + if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 } + if (shorthandAssign >= 0) + { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); } + if (doubleProto >= 0) + { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); } +}; + +pp.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) + { this.raise(this.yieldPos, "Yield expression cannot be a default value"); } + if (this.awaitPos) + { this.raise(this.awaitPos, "Await expression cannot be a default value"); } +}; + +pp.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") + { return this.isSimpleAssignTarget(expr.expression) } + return expr.type === "Identifier" || expr.type === "MemberExpression" +}; + +var pp$1 = Parser.prototype; + +// ### Statement parsing + +// Parse a program. Initializes the parser, reads any number of +// statements, and wraps them in a Program node. Optionally takes a +// `program` argument. If present, the statements will be appended +// to its body instead of creating a new node. + +pp$1.parseTopLevel = function(node) { + var this$1 = this; + + var exports = {}; + if (!node.body) { node.body = []; } + while (this.type !== types.eof) { + var stmt = this$1.parseStatement(null, true, exports); + node.body.push(stmt); + } + this.adaptDirectivePrologue(node.body); + this.next(); + if (this.options.ecmaVersion >= 6) { + node.sourceType = this.options.sourceType; + } + return this.finishNode(node, "Program") +}; + +var loopLabel = {kind: "loop"}; +var switchLabel = {kind: "switch"}; + +pp$1.isLet = function(context) { + if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + // For ambiguous cases, determine if a LexicalDeclaration (or only a + // Statement) is allowed here. If context is not empty then only a Statement + // is allowed. However, `let [` is an explicit negative lookahead for + // ExpressionStatement, so special-case it first. + if (nextCh === 91) { return true } // '[' + if (context) { return false } + + if (nextCh === 123) { return true } // '{' + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(this.input.charCodeAt(pos), true)) { ++pos; } + var ident = this.input.slice(next, pos); + if (!keywordRelationalOperator.test(ident)) { return true } + } + return false +}; + +// check 'async [no LineTerminator here] function' +// - 'async /*foo*/ function' is OK. +// - 'async /*\n*/ function' is invalid. +pp$1.isAsyncFunction = function() { + if (this.options.ecmaVersion < 8 || !this.isContextual("async")) + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length; + return !lineBreak.test(this.input.slice(this.pos, next)) && + this.input.slice(next, next + 8) === "function" && + (next + 8 === this.input.length || !isIdentifierChar(this.input.charAt(next + 8))) +}; + +// Parse a single statement. +// +// If expecting a statement and finding a slash operator, parse a +// regular expression literal. This is to handle cases like +// `if (foo) /blah/.exec(foo)`, where looking at the previous token +// does not help. + +pp$1.parseStatement = function(context, topLevel, exports) { + var starttype = this.type, node = this.startNode(), kind; + + if (this.isLet(context)) { + starttype = types._var; + kind = "let"; + } + + // Most types of statements are recognized by the keyword they + // start with. Many are trivial to parse, some require a bit of + // complexity. + + switch (starttype) { + case types._break: case types._continue: return this.parseBreakContinueStatement(node, starttype.keyword) + case types._debugger: return this.parseDebuggerStatement(node) + case types._do: return this.parseDoStatement(node) + case types._for: return this.parseForStatement(node) + case types._function: + // Function as sole body of either an if statement or a labeled statement + // works, but not when it is part of a labeled statement that is the sole + // body of an if statement. + if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); } + return this.parseFunctionStatement(node, false, !context) + case types._class: + if (context) { this.unexpected(); } + return this.parseClass(node, true) + case types._if: return this.parseIfStatement(node) + case types._return: return this.parseReturnStatement(node) + case types._switch: return this.parseSwitchStatement(node) + case types._throw: return this.parseThrowStatement(node) + case types._try: return this.parseTryStatement(node) + case types._const: case types._var: + kind = kind || this.value; + if (context && kind !== "var") { this.unexpected(); } + return this.parseVarStatement(node, kind) + case types._while: return this.parseWhileStatement(node) + case types._with: return this.parseWithStatement(node) + case types.braceL: return this.parseBlock(true, node) + case types.semi: return this.parseEmptyStatement(node) + case types._export: + case types._import: + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) + { this.raise(this.start, "'import' and 'export' may only appear at the top level"); } + if (!this.inModule) + { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); } + } + return starttype === types._import ? this.parseImport(node) : this.parseExport(node, exports) + + // If the statement does not start with a statement keyword or a + // brace, it's an ExpressionStatement or LabeledStatement. We + // simply start parsing an expression, and afterwards, if the + // next token is a colon and the expression was a simple + // Identifier node, we switch to interpreting it as a label. + default: + if (this.isAsyncFunction()) { + if (context) { this.unexpected(); } + this.next(); + return this.parseFunctionStatement(node, true, !context) + } + + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) + { return this.parseLabeledStatement(node, maybeName, expr, context) } + else { return this.parseExpressionStatement(node, expr) } + } +}; + +pp$1.parseBreakContinueStatement = function(node, keyword) { + var this$1 = this; + + var isBreak = keyword === "break"; + this.next(); + if (this.eat(types.semi) || this.insertSemicolon()) { node.label = null; } + else if (this.type !== types.name) { this.unexpected(); } + else { + node.label = this.parseIdent(); + this.semicolon(); + } + + // Verify that there is an actual destination to break or + // continue to. + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this$1.labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { break } + if (node.label && isBreak) { break } + } + } + if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") +}; + +pp$1.parseDebuggerStatement = function(node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") +}; + +pp$1.parseDoStatement = function(node) { + this.next(); + this.labels.push(loopLabel); + node.body = this.parseStatement("do"); + this.labels.pop(); + this.expect(types._while); + node.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) + { this.eat(types.semi); } + else + { this.semicolon(); } + return this.finishNode(node, "DoWhileStatement") +}; + +// Disambiguating between a `for` and a `for`/`in` or `for`/`of` +// loop is non-trivial. Basically, we have to parse the init `var` +// statement or expression, disallowing the `in` operator (see +// the second parameter to `parseExpression`), and then check +// whether the next token is `in` or `of`. When there is no init +// part (semicolon immediately after the opening parenthesis), it +// is a regular `for` loop. + +pp$1.parseForStatement = function(node) { + this.next(); + var awaitAt = (this.options.ecmaVersion >= 9 && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) && this.eatContextual("await")) ? this.lastTokStart : -1; + this.labels.push(loopLabel); + this.enterScope(0); + this.expect(types.parenL); + if (this.type === types.semi) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, null) + } + var isLet = this.isLet(); + if (this.type === types._var || this.type === types._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1 && + !(kind !== "var" && init$1.declarations[0].init)) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + return this.parseForIn(node, init$1) + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init$1) + } + var refDestructuringErrors = new DestructuringErrors; + var init = this.parseExpression(true, refDestructuringErrors); + if (this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + this.toAssignable(init, false, refDestructuringErrors); + this.checkLVal(init); + return this.parseForIn(node, init) + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init) +}; + +pp$1.parseFunctionStatement = function(node, isAsync, declarationPosition) { + this.next(); + return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) +}; + +pp$1.parseIfStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + // allow function declarations in branches, but only in non-strict mode + node.consequent = this.parseStatement("if"); + node.alternate = this.eat(types._else) ? this.parseStatement("if") : null; + return this.finishNode(node, "IfStatement") +}; + +pp$1.parseReturnStatement = function(node) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) + { this.raise(this.start, "'return' outside of function"); } + this.next(); + + // In `return` (and `break`/`continue`), the keywords with + // optional arguments, we eagerly look for a semicolon or the + // possibility to insert one. + + if (this.eat(types.semi) || this.insertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") +}; + +pp$1.parseSwitchStatement = function(node) { + var this$1 = this; + + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.expect(types.braceL); + this.labels.push(switchLabel); + this.enterScope(0); + + // Statements under must be grouped (by label) in SwitchCase + // nodes. `cur` is used to keep the node that we are currently + // adding statements to. + + var cur; + for (var sawDefault = false; this.type !== types.braceR;) { + if (this$1.type === types._case || this$1.type === types._default) { + var isCase = this$1.type === types._case; + if (cur) { this$1.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this$1.startNode()); + cur.consequent = []; + this$1.next(); + if (isCase) { + cur.test = this$1.parseExpression(); + } else { + if (sawDefault) { this$1.raiseRecoverable(this$1.lastTokStart, "Multiple default clauses"); } + sawDefault = true; + cur.test = null; + } + this$1.expect(types.colon); + } else { + if (!cur) { this$1.unexpected(); } + cur.consequent.push(this$1.parseStatement(null)); + } + } + this.exitScope(); + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.next(); // Closing brace + this.labels.pop(); + return this.finishNode(node, "SwitchStatement") +}; + +pp$1.parseThrowStatement = function(node) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) + { this.raise(this.lastTokEnd, "Illegal newline after throw"); } + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") +}; + +// Reused empty array added for node fields that are always empty. + +var empty = []; + +pp$1.parseTryStatement = function(node) { + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.type === types._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(types.parenL)) { + clause.param = this.parseBindingAtom(); + var simple = clause.param.type === "Identifier"; + this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); + this.checkLVal(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); + this.expect(types.parenR); + } else { + if (this.options.ecmaVersion < 10) { this.unexpected(); } + clause.param = null; + this.enterScope(0); + } + clause.body = this.parseBlock(false); + this.exitScope(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(types._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) + { this.raise(node.start, "Missing catch or finally clause"); } + return this.finishNode(node, "TryStatement") +}; + +pp$1.parseVarStatement = function(node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") +}; + +pp$1.parseWhileStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node.body = this.parseStatement("while"); + this.labels.pop(); + return this.finishNode(node, "WhileStatement") +}; + +pp$1.parseWithStatement = function(node) { + if (this.strict) { this.raise(this.start, "'with' in strict mode"); } + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement("with"); + return this.finishNode(node, "WithStatement") +}; + +pp$1.parseEmptyStatement = function(node) { + this.next(); + return this.finishNode(node, "EmptyStatement") +}; + +pp$1.parseLabeledStatement = function(node, maybeName, expr, context) { + var this$1 = this; + + for (var i$1 = 0, list = this$1.labels; i$1 < list.length; i$1 += 1) + { + var label = list[i$1]; + + if (label.name === maybeName) + { this$1.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } } + var kind = this.type.isLoop ? "loop" : this.type === types._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this$1.labels[i]; + if (label$1.statementStart === node.start) { + // Update information about previous labels on this node + label$1.statementStart = this$1.start; + label$1.kind = kind; + } else { break } + } + this.labels.push({name: maybeName, kind: kind, statementStart: this.start}); + node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); + this.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") +}; + +pp$1.parseExpressionStatement = function(node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") +}; + +// Parse a semicolon-enclosed block of statements, handling `"use +// strict"` declarations when `allowStrict` is true (used for +// function bodies). + +pp$1.parseBlock = function(createNewLexicalScope, node) { + var this$1 = this; + if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true; + if ( node === void 0 ) node = this.startNode(); + + node.body = []; + this.expect(types.braceL); + if (createNewLexicalScope) { this.enterScope(0); } + while (!this.eat(types.braceR)) { + var stmt = this$1.parseStatement(null); + node.body.push(stmt); + } + if (createNewLexicalScope) { this.exitScope(); } + return this.finishNode(node, "BlockStatement") +}; + +// Parse a regular `for` loop. The disambiguation code in +// `parseStatement` will already have parsed the init statement or +// expression. + +pp$1.parseFor = function(node, init) { + node.init = init; + this.expect(types.semi); + node.test = this.type === types.semi ? null : this.parseExpression(); + this.expect(types.semi); + node.update = this.type === types.parenR ? null : this.parseExpression(); + this.expect(types.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, "ForStatement") +}; + +// Parse a `for`/`in` and `for`/`of` loop, which are almost +// same from parser's perspective. + +pp$1.parseForIn = function(node, init) { + var type = this.type === types._in ? "ForInStatement" : "ForOfStatement"; + this.next(); + if (type === "ForInStatement") { + if (init.type === "AssignmentPattern" || + (init.type === "VariableDeclaration" && init.declarations[0].init != null && + (this.strict || init.declarations[0].id.type !== "Identifier"))) + { this.raise(init.start, "Invalid assignment in for-in loop head"); } + } + node.left = init; + node.right = type === "ForInStatement" ? this.parseExpression() : this.parseMaybeAssign(); + this.expect(types.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, type) +}; + +// Parse a list of variable declarations. + +pp$1.parseVar = function(node, isFor, kind) { + var this$1 = this; + + node.declarations = []; + node.kind = kind; + for (;;) { + var decl = this$1.startNode(); + this$1.parseVarId(decl, kind); + if (this$1.eat(types.eq)) { + decl.init = this$1.parseMaybeAssign(isFor); + } else if (kind === "const" && !(this$1.type === types._in || (this$1.options.ecmaVersion >= 6 && this$1.isContextual("of")))) { + this$1.unexpected(); + } else if (decl.id.type !== "Identifier" && !(isFor && (this$1.type === types._in || this$1.isContextual("of")))) { + this$1.raise(this$1.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node.declarations.push(this$1.finishNode(decl, "VariableDeclarator")); + if (!this$1.eat(types.comma)) { break } + } + return node +}; + +pp$1.parseVarId = function(decl, kind) { + if ((kind === "const" || kind === "let") && this.isContextual("let")) { + this.raiseRecoverable(this.start, "let is disallowed as a lexically bound name"); + } + decl.id = this.parseBindingAtom(); + this.checkLVal(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); +}; + +var FUNC_STATEMENT = 1; +var FUNC_HANGING_STATEMENT = 2; +var FUNC_NULLABLE_ID = 4; + +// Parse a function declaration or literal (depending on the +// `isStatement` parameter). + +pp$1.parseFunction = function(node, statement, allowExpressionBody, isAsync) { + this.initFunction(node); + if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { + if (this.type === types.star && (statement & FUNC_HANGING_STATEMENT)) + { this.unexpected(); } + node.generator = this.eat(types.star); + } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + if (statement & FUNC_STATEMENT) { + node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types.name ? null : this.parseIdent(); + if (node.id && !(statement & FUNC_HANGING_STATEMENT)) + // If it is a regular function declaration in sloppy mode, then it is + // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding + // mode depends on properties of the current scope (see + // treatFunctionsAsVar). + { this.checkLVal(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); } + } + + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.enterScope(functionFlags(node.async, node.generator)); + + if (!(statement & FUNC_STATEMENT)) + { node.id = this.type === types.name ? this.parseIdent() : null; } + + this.parseFunctionParams(node); + this.parseFunctionBody(node, allowExpressionBody); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression") +}; + +pp$1.parseFunctionParams = function(node) { + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); +}; + +// Parse a class declaration or literal (depending on the +// `isStatement` parameter). + +pp$1.parseClass = function(node, isStatement) { + var this$1 = this; + + this.next(); + + // ecma-262 14.6 Class Definitions + // A class definition is always strict mode code. + var oldStrict = this.strict; + this.strict = true; + + this.parseClassId(node, isStatement); + this.parseClassSuper(node); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + var element = this$1.parseClassElement(node.superClass !== null); + if (element) { + classBody.body.push(element); + if (element.type === "MethodDefinition" && element.kind === "constructor") { + if (hadConstructor) { this$1.raise(element.start, "Duplicate constructor in the same class"); } + hadConstructor = true; + } + } + } + node.body = this.finishNode(classBody, "ClassBody"); + this.strict = oldStrict; + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") +}; + +pp$1.parseClassElement = function(constructorAllowsSuper) { + var this$1 = this; + + if (this.eat(types.semi)) { return null } + + var method = this.startNode(); + var tryContextual = function (k, noLineBreak) { + if ( noLineBreak === void 0 ) noLineBreak = false; + + var start = this$1.start, startLoc = this$1.startLoc; + if (!this$1.eatContextual(k)) { return false } + if (this$1.type !== types.parenL && (!noLineBreak || !this$1.canInsertSemicolon())) { return true } + if (method.key) { this$1.unexpected(); } + method.computed = false; + method.key = this$1.startNodeAt(start, startLoc); + method.key.name = k; + this$1.finishNode(method.key, "Identifier"); + return false + }; + + method.kind = "method"; + method.static = tryContextual("static"); + var isGenerator = this.eat(types.star); + var isAsync = false; + if (!isGenerator) { + if (this.options.ecmaVersion >= 8 && tryContextual("async", true)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); + } else if (tryContextual("get")) { + method.kind = "get"; + } else if (tryContextual("set")) { + method.kind = "set"; + } + } + if (!method.key) { this.parsePropertyName(method); } + var key = method.key; + var allowsDirectSuper = false; + if (!method.computed && !method.static && (key.type === "Identifier" && key.name === "constructor" || + key.type === "Literal" && key.value === "constructor")) { + if (method.kind !== "method") { this.raise(key.start, "Constructor can't have get/set modifier"); } + if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); } + if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); } + method.kind = "constructor"; + allowsDirectSuper = constructorAllowsSuper; + } else if (method.static && key.type === "Identifier" && key.name === "prototype") { + this.raise(key.start, "Classes may not have a static property named prototype"); + } + this.parseClassMethod(method, isGenerator, isAsync, allowsDirectSuper); + if (method.kind === "get" && method.value.params.length !== 0) + { this.raiseRecoverable(method.value.start, "getter should have no params"); } + if (method.kind === "set" && method.value.params.length !== 1) + { this.raiseRecoverable(method.value.start, "setter should have exactly one param"); } + if (method.kind === "set" && method.value.params[0].type === "RestElement") + { this.raiseRecoverable(method.value.params[0].start, "Setter cannot use rest params"); } + return method +}; + +pp$1.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { + method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); + return this.finishNode(method, "MethodDefinition") +}; + +pp$1.parseClassId = function(node, isStatement) { + if (this.type === types.name) { + node.id = this.parseIdent(); + if (isStatement === true) + { this.checkLVal(node.id, BIND_LEXICAL, false); } + } else { + if (isStatement === true) + { this.unexpected(); } + node.id = null; + } +}; + +pp$1.parseClassSuper = function(node) { + node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null; +}; + +// Parses module export declaration. + +pp$1.parseExport = function(node, exports) { + var this$1 = this; + + this.next(); + // export * from '...' + if (this.eat(types.star)) { + this.expectContextual("from"); + if (this.type !== types.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + this.semicolon(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(types._default)) { // export default ... + this.checkExport(exports, "default", this.lastTokStart); + var isAsync; + if (this.type === types._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync, true); + } else if (this.type === types._class) { + var cNode = this.startNode(); + node.declaration = this.parseClass(cNode, "nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + // export var|const|let|function|class ... + if (this.shouldParseExportStatement()) { + node.declaration = this.parseStatement(null); + if (node.declaration.type === "VariableDeclaration") + { this.checkVariableExport(exports, node.declaration.declarations); } + else + { this.checkExport(exports, node.declaration.id.name, node.declaration.id.start); } + node.specifiers = []; + node.source = null; + } else { // export { x, y as z } [from '...'] + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(exports); + if (this.eatContextual("from")) { + if (this.type !== types.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + } else { + // check for keywords used as local names + for (var i = 0, list = node.specifiers; i < list.length; i += 1) { + var spec = list[i]; + + this$1.checkUnreserved(spec.local); + } + + node.source = null; + } + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") +}; + +pp$1.checkExport = function(exports, name, pos) { + if (!exports) { return } + if (has(exports, name)) + { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); } + exports[name] = true; +}; + +pp$1.checkPatternExport = function(exports, pat) { + var this$1 = this; + + var type = pat.type; + if (type === "Identifier") + { this.checkExport(exports, pat.name, pat.start); } + else if (type === "ObjectPattern") + { for (var i = 0, list = pat.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this$1.checkPatternExport(exports, prop); + } } + else if (type === "ArrayPattern") + { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + + if (elt) { this$1.checkPatternExport(exports, elt); } + } } + else if (type === "Property") + { this.checkPatternExport(exports, pat.value); } + else if (type === "AssignmentPattern") + { this.checkPatternExport(exports, pat.left); } + else if (type === "RestElement") + { this.checkPatternExport(exports, pat.argument); } + else if (type === "ParenthesizedExpression") + { this.checkPatternExport(exports, pat.expression); } +}; + +pp$1.checkVariableExport = function(exports, decls) { + var this$1 = this; + + if (!exports) { return } + for (var i = 0, list = decls; i < list.length; i += 1) + { + var decl = list[i]; + + this$1.checkPatternExport(exports, decl.id); + } +}; + +pp$1.shouldParseExportStatement = function() { + return this.type.keyword === "var" || + this.type.keyword === "const" || + this.type.keyword === "class" || + this.type.keyword === "function" || + this.isLet() || + this.isAsyncFunction() +}; + +// Parses a comma-separated list of module exports. + +pp$1.parseExportSpecifiers = function(exports) { + var this$1 = this; + + var nodes = [], first = true; + // export { x, y as z } [from '...'] + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this$1.expect(types.comma); + if (this$1.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node = this$1.startNode(); + node.local = this$1.parseIdent(true); + node.exported = this$1.eatContextual("as") ? this$1.parseIdent(true) : node.local; + this$1.checkExport(exports, node.exported.name, node.exported.start); + nodes.push(this$1.finishNode(node, "ExportSpecifier")); + } + return nodes +}; + +// Parses import declaration. + +pp$1.parseImport = function(node) { + this.next(); + // import '...' + if (this.type === types.string) { + node.specifiers = empty; + node.source = this.parseExprAtom(); + } else { + node.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") +}; + +// Parses a comma-separated list of module imports. + +pp$1.parseImportSpecifiers = function() { + var this$1 = this; + + var nodes = [], first = true; + if (this.type === types.name) { + // import defaultObj, { x, y as z } from '...' + var node = this.startNode(); + node.local = this.parseIdent(); + this.checkLVal(node.local, BIND_LEXICAL); + nodes.push(this.finishNode(node, "ImportDefaultSpecifier")); + if (!this.eat(types.comma)) { return nodes } + } + if (this.type === types.star) { + var node$1 = this.startNode(); + this.next(); + this.expectContextual("as"); + node$1.local = this.parseIdent(); + this.checkLVal(node$1.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")); + return nodes + } + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this$1.expect(types.comma); + if (this$1.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node$2 = this$1.startNode(); + node$2.imported = this$1.parseIdent(true); + if (this$1.eatContextual("as")) { + node$2.local = this$1.parseIdent(); + } else { + this$1.checkUnreserved(node$2.imported); + node$2.local = node$2.imported; + } + this$1.checkLVal(node$2.local, BIND_LEXICAL); + nodes.push(this$1.finishNode(node$2, "ImportSpecifier")); + } + return nodes +}; + +// Set `ExpressionStatement#directive` property for directive prologues. +pp$1.adaptDirectivePrologue = function(statements) { + for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { + statements[i].directive = statements[i].expression.raw.slice(1, -1); + } +}; +pp$1.isDirectiveCandidate = function(statement) { + return ( + statement.type === "ExpressionStatement" && + statement.expression.type === "Literal" && + typeof statement.expression.value === "string" && + // Reject parenthesized strings. + (this.input[statement.start] === "\"" || this.input[statement.start] === "'") + ) +}; + +var pp$2 = Parser.prototype; + +// Convert existing expression atom to assignable pattern +// if possible. + +pp$2.toAssignable = function(node, isBinding, refDestructuringErrors) { + var this$1 = this; + + if (this.options.ecmaVersion >= 6 && node) { + switch (node.type) { + case "Identifier": + if (this.inAsync && node.name === "await") + { this.raise(node.start, "Can not use 'await' as identifier inside an async function"); } + break + + case "ObjectPattern": + case "ArrayPattern": + case "RestElement": + break + + case "ObjectExpression": + node.type = "ObjectPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + this$1.toAssignable(prop, isBinding); + // Early error: + // AssignmentRestProperty[Yield, Await] : + // `...` DestructuringAssignmentTarget[Yield, Await] + // + // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|. + if ( + prop.type === "RestElement" && + (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern") + ) { + this$1.raise(prop.argument.start, "Unexpected token"); + } + } + break + + case "Property": + // AssignmentProperty has type === "Property" + if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); } + this.toAssignable(node.value, isBinding); + break + + case "ArrayExpression": + node.type = "ArrayPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + this.toAssignableList(node.elements, isBinding); + break + + case "SpreadElement": + node.type = "RestElement"; + this.toAssignable(node.argument, isBinding); + if (node.argument.type === "AssignmentPattern") + { this.raise(node.argument.start, "Rest elements cannot have a default value"); } + break + + case "AssignmentExpression": + if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); } + node.type = "AssignmentPattern"; + delete node.operator; + this.toAssignable(node.left, isBinding); + // falls through to AssignmentPattern + + case "AssignmentPattern": + break + + case "ParenthesizedExpression": + this.toAssignable(node.expression, isBinding, refDestructuringErrors); + break + + case "MemberExpression": + if (!isBinding) { break } + + default: + this.raise(node.start, "Assigning to rvalue"); + } + } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + return node +}; + +// Convert list of expression atoms to binding list. + +pp$2.toAssignableList = function(exprList, isBinding) { + var this$1 = this; + + var end = exprList.length; + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { this$1.toAssignable(elt, isBinding); } + } + if (end) { + var last = exprList[end - 1]; + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") + { this.unexpected(last.argument.start); } + } + return exprList +}; + +// Parses spread element. + +pp$2.parseSpread = function(refDestructuringErrors) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node, "SpreadElement") +}; + +pp$2.parseRestBinding = function() { + var node = this.startNode(); + this.next(); + + // RestElement inside of a function parameter must be an identifier + if (this.options.ecmaVersion === 6 && this.type !== types.name) + { this.unexpected(); } + + node.argument = this.parseBindingAtom(); + + return this.finishNode(node, "RestElement") +}; + +// Parses lvalue (assignable) atom. + +pp$2.parseBindingAtom = function() { + if (this.options.ecmaVersion >= 6) { + switch (this.type) { + case types.bracketL: + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(types.bracketR, true, true); + return this.finishNode(node, "ArrayPattern") + + case types.braceL: + return this.parseObj(true) + } + } + return this.parseIdent() +}; + +pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma) { + var this$1 = this; + + var elts = [], first = true; + while (!this.eat(close)) { + if (first) { first = false; } + else { this$1.expect(types.comma); } + if (allowEmpty && this$1.type === types.comma) { + elts.push(null); + } else if (allowTrailingComma && this$1.afterTrailingComma(close)) { + break + } else if (this$1.type === types.ellipsis) { + var rest = this$1.parseRestBinding(); + this$1.parseBindingListItem(rest); + elts.push(rest); + if (this$1.type === types.comma) { this$1.raise(this$1.start, "Comma is not permitted after the rest element"); } + this$1.expect(close); + break + } else { + var elem = this$1.parseMaybeDefault(this$1.start, this$1.startLoc); + this$1.parseBindingListItem(elem); + elts.push(elem); + } + } + return elts +}; + +pp$2.parseBindingListItem = function(param) { + return param +}; + +// Parses assignment pattern around given atom if possible. + +pp$2.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types.eq)) { return left } + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern") +}; + +// Verify that a node is an lval — something that can be assigned +// to. +// bindingType can be either: +// 'var' indicating that the lval creates a 'var' binding +// 'let' indicating that the lval creates a lexical ('let' or 'const') binding +// 'none' indicating that the binding should be checked for illegal identifiers, but not for duplicate references + +pp$2.checkLVal = function(expr, bindingType, checkClashes) { + var this$1 = this; + if ( bindingType === void 0 ) bindingType = BIND_NONE; + + switch (expr.type) { + case "Identifier": + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) + { this.raiseRecoverable(expr.start, (bindingType ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); } + if (checkClashes) { + if (has(checkClashes, expr.name)) + { this.raiseRecoverable(expr.start, "Argument name clash"); } + checkClashes[expr.name] = true; + } + if (bindingType !== BIND_NONE && bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); } + break + + case "MemberExpression": + if (bindingType) { this.raiseRecoverable(expr.start, "Binding member expression"); } + break + + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this$1.checkLVal(prop, bindingType, checkClashes); + } + break + + case "Property": + // AssignmentProperty has type === "Property" + this.checkLVal(expr.value, bindingType, checkClashes); + break + + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + + if (elem) { this$1.checkLVal(elem, bindingType, checkClashes); } + } + break + + case "AssignmentPattern": + this.checkLVal(expr.left, bindingType, checkClashes); + break + + case "RestElement": + this.checkLVal(expr.argument, bindingType, checkClashes); + break + + case "ParenthesizedExpression": + this.checkLVal(expr.expression, bindingType, checkClashes); + break + + default: + this.raise(expr.start, (bindingType ? "Binding" : "Assigning to") + " rvalue"); + } +}; + +// A recursive descent parser operates by defining functions for all +// syntactic elements, and recursively calling those, each function +// advancing the input stream and returning an AST node. Precedence +// of constructs (for example, the fact that `!x[1]` means `!(x[1])` +// instead of `(!x)[1]` is handled by the fact that the parser +// function that parses unary prefix operators is called first, and +// in turn calls the function that parses `[]` subscripts — that +// way, it'll receive the node for `x[1]` already parsed, and wraps +// *that* in the unary operator node. +// +// Acorn uses an [operator precedence parser][opp] to handle binary +// operator precedence, because it is much more compact than using +// the technique outlined above, which uses different, nesting +// functions to specify precedence, for all of the ten binary +// precedence levels that JavaScript defines. +// +// [opp]: http://en.wikipedia.org/wiki/Operator-precedence_parser + +var pp$3 = Parser.prototype; + +// Check if property name clashes with already added. +// Object/class getters and setters are not allowed to clash — +// either with each other or with an init property — and in +// strict mode, init properties are also not allowed to be repeated. + +pp$3.checkPropClash = function(prop, propHash, refDestructuringErrors) { + if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") + { return } + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) + { return } + var key = prop.key; + var name; + switch (key.type) { + case "Identifier": name = key.name; break + case "Literal": name = String(key.value); break + default: return + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name === "__proto__" && kind === "init") { + if (propHash.proto) { + if (refDestructuringErrors && refDestructuringErrors.doubleProto < 0) { refDestructuringErrors.doubleProto = key.start; } + // Backwards-compat kludge. Can be removed in version 6.0 + else { this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); } + } + propHash.proto = true; + } + return + } + name = "$" + name; + var other = propHash[name]; + if (other) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other.init || other.get || other.set; + } else { + redefinition = other.init || other[kind]; + } + if (redefinition) + { this.raiseRecoverable(key.start, "Redefinition of property"); } + } else { + other = propHash[name] = { + init: false, + get: false, + set: false + }; + } + other[kind] = true; +}; + +// ### Expression parsing + +// These nest, from the most general expression type at the top to +// 'atomic', nondivisible expression types at the bottom. Most of +// the functions will simply let the function(s) below them parse, +// and, *if* the syntactic construct they handle is present, wrap +// the AST node that the inner parser gave them in another node. + +// Parse a full expression. The optional arguments are used to +// forbid the `in` operator (in for loops initalization expressions) +// and provide reference for storing '=' operator inside shorthand +// property assignment in contexts where both object expression +// and object pattern might appear (so it's possible to raise +// delayed syntax error at correct position). + +pp$3.parseExpression = function(noIn, refDestructuringErrors) { + var this$1 = this; + + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(noIn, refDestructuringErrors); + if (this.type === types.comma) { + var node = this.startNodeAt(startPos, startLoc); + node.expressions = [expr]; + while (this.eat(types.comma)) { node.expressions.push(this$1.parseMaybeAssign(noIn, refDestructuringErrors)); } + return this.finishNode(node, "SequenceExpression") + } + return expr +}; + +// Parse an assignment expression. This includes applications of +// operators like `+=`. + +pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { + if (this.isContextual("yield")) { + if (this.inGenerator) { return this.parseYield(noIn) } + // The tokenizer will assume an expression is allowed after + // `yield`, but this isn't that kind of yield + else { this.exprAllowed = false; } + } + + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldShorthandAssign = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + oldShorthandAssign = refDestructuringErrors.shorthandAssign; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.shorthandAssign = -1; + } else { + refDestructuringErrors = new DestructuringErrors; + ownDestructuringErrors = true; + } + + var startPos = this.start, startLoc = this.startLoc; + if (this.type === types.parenL || this.type === types.name) + { this.potentialArrowAt = this.start; } + var left = this.parseMaybeConditional(noIn, refDestructuringErrors); + if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); } + if (this.type.isAssign) { + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.value; + node.left = this.type === types.eq ? this.toAssignable(left, false, refDestructuringErrors) : left; + if (!ownDestructuringErrors) { DestructuringErrors.call(refDestructuringErrors); } + refDestructuringErrors.shorthandAssign = -1; // reset because shorthand default was used correctly + this.checkLVal(left); + this.next(); + node.right = this.parseMaybeAssign(noIn); + return this.finishNode(node, "AssignmentExpression") + } else { + if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); } + } + if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; } + if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; } + if (oldShorthandAssign > -1) { refDestructuringErrors.shorthandAssign = oldShorthandAssign; } + return left +}; + +// Parse a ternary conditional (`?:`) operator. + +pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(noIn, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + if (this.eat(types.question)) { + var node = this.startNodeAt(startPos, startLoc); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + this.expect(types.colon); + node.alternate = this.parseMaybeAssign(noIn); + return this.finishNode(node, "ConditionalExpression") + } + return expr +}; + +// Start the precedence parser. + +pp$3.parseExprOps = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn) +}; + +// Parse binary operators with the operator precedence parsing +// algorithm. `left` is the left-hand side of the operator. +// `minPrec` provides context that allows the function to stop and +// defer further parser to one of its callers when it encounters an +// operator that has a lower precedence than the set it is parsing. + +pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) { + var prec = this.type.binop; + if (prec != null && (!noIn || this.type !== types._in)) { + if (prec > minPrec) { + var logical = this.type === types.logicalOR || this.type === types.logicalAND; + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn); + var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical); + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn) + } + } + return left +}; + +pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) { + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.operator = op; + node.right = right; + return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") +}; + +// Parse unary operators, both prefix and postfix. + +pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) { + var this$1 = this; + + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.isContextual("await") && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))) { + expr = this.parseAwait(); + sawUnary = true; + } else if (this.type.prefix) { + var node = this.startNode(), update = this.type === types.incDec; + node.operator = this.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(null, true); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { this.checkLVal(node.argument); } + else if (this.strict && node.operator === "delete" && + node.argument.type === "Identifier") + { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } + else { sawUnary = true; } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else { + expr = this.parseExprSubscripts(refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$1 = this$1.startNodeAt(startPos, startLoc); + node$1.operator = this$1.value; + node$1.prefix = false; + node$1.argument = expr; + this$1.checkLVal(expr); + this$1.next(); + expr = this$1.finishNode(node$1, "UpdateExpression"); + } + } + + if (!sawUnary && this.eat(types.starstar)) + { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false) } + else + { return expr } +}; + +// Parse call, dot, and `[]`-subscript expressions. + +pp$3.parseExprSubscripts = function(refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors); + var skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")"; + if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) { return expr } + var result = this.parseSubscripts(expr, startPos, startLoc); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; } + if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; } + } + return result +}; + +pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) { + var this$1 = this; + + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" && + this.lastTokEnd === base.end && !this.canInsertSemicolon() && this.input.slice(base.start, base.end) === "async"; + for (var computed = (void 0);;) { + if ((computed = this$1.eat(types.bracketL)) || this$1.eat(types.dot)) { + var node = this$1.startNodeAt(startPos, startLoc); + node.object = base; + node.property = computed ? this$1.parseExpression() : this$1.parseIdent(true); + node.computed = !!computed; + if (computed) { this$1.expect(types.bracketR); } + base = this$1.finishNode(node, "MemberExpression"); + } else if (!noCalls && this$1.eat(types.parenL)) { + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this$1.yieldPos, oldAwaitPos = this$1.awaitPos; + this$1.yieldPos = 0; + this$1.awaitPos = 0; + var exprList = this$1.parseExprList(types.parenR, this$1.options.ecmaVersion >= 8, false, refDestructuringErrors); + if (maybeAsyncArrow && !this$1.canInsertSemicolon() && this$1.eat(types.arrow)) { + this$1.checkPatternErrors(refDestructuringErrors, false); + this$1.checkYieldAwaitInDefaultParams(); + this$1.yieldPos = oldYieldPos; + this$1.awaitPos = oldAwaitPos; + return this$1.parseArrowExpression(this$1.startNodeAt(startPos, startLoc), exprList, true) + } + this$1.checkExpressionErrors(refDestructuringErrors, true); + this$1.yieldPos = oldYieldPos || this$1.yieldPos; + this$1.awaitPos = oldAwaitPos || this$1.awaitPos; + var node$1 = this$1.startNodeAt(startPos, startLoc); + node$1.callee = base; + node$1.arguments = exprList; + base = this$1.finishNode(node$1, "CallExpression"); + } else if (this$1.type === types.backQuote) { + var node$2 = this$1.startNodeAt(startPos, startLoc); + node$2.tag = base; + node$2.quasi = this$1.parseTemplate({isTagged: true}); + base = this$1.finishNode(node$2, "TaggedTemplateExpression"); + } else { + return base + } + } +}; + +// Parse an atomic expression — either a single token that is an +// expression, an expression started by a keyword like `function` or +// `new`, or an expression wrapped in punctuation like `()`, `[]`, +// or `{}`. + +pp$3.parseExprAtom = function(refDestructuringErrors) { + // If a division operator appears in an expression position, the + // tokenizer got confused, and we force it to read a regexp instead. + if (this.type === types.slash) { this.readRegexp(); } + + var node, canBeArrow = this.potentialArrowAt === this.start; + switch (this.type) { + case types._super: + if (!this.allowSuper) + { this.raise(this.start, "'super' keyword outside a method"); } + node = this.startNode(); + this.next(); + if (this.type === types.parenL && !this.allowDirectSuper) + { this.raise(node.start, "super() call outside constructor of a subclass"); } + // The `super` keyword can appear at below: + // SuperProperty: + // super [ Expression ] + // super . IdentifierName + // SuperCall: + // super Arguments + if (this.type !== types.dot && this.type !== types.bracketL && this.type !== types.parenL) + { this.unexpected(); } + return this.finishNode(node, "Super") + + case types._this: + node = this.startNode(); + this.next(); + return this.finishNode(node, "ThisExpression") + + case types.name: + var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; + var id = this.parseIdent(this.type !== types.name); + if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types._function)) + { return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true) } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types.arrow)) + { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false) } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types.name && !containsEsc) { + id = this.parseIdent(); + if (this.canInsertSemicolon() || !this.eat(types.arrow)) + { this.unexpected(); } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true) + } + } + return id + + case types.regexp: + var value = this.value; + node = this.parseLiteral(value.value); + node.regex = {pattern: value.pattern, flags: value.flags}; + return node + + case types.num: case types.string: + return this.parseLiteral(this.value) + + case types._null: case types._true: case types._false: + node = this.startNode(); + node.value = this.type === types._null ? null : this.type === types._true; + node.raw = this.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case types.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) + { refDestructuringErrors.parenthesizedAssign = start; } + if (refDestructuringErrors.parenthesizedBind < 0) + { refDestructuringErrors.parenthesizedBind = start; } + } + return expr + + case types.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(types.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node, "ArrayExpression") + + case types.braceL: + return this.parseObj(false, refDestructuringErrors) + + case types._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, 0) + + case types._class: + return this.parseClass(this.startNode(), false) + + case types._new: + return this.parseNew() + + case types.backQuote: + return this.parseTemplate() + + default: + this.unexpected(); + } +}; + +pp$3.parseLiteral = function(value) { + var node = this.startNode(); + node.value = value; + node.raw = this.input.slice(this.start, this.end); + this.next(); + return this.finishNode(node, "Literal") +}; + +pp$3.parseParenExpression = function() { + this.expect(types.parenL); + var val = this.parseExpression(); + this.expect(types.parenR); + return val +}; + +pp$3.parseParenAndDistinguishExpression = function(canBeArrow) { + var this$1 = this; + + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; + this.yieldPos = 0; + this.awaitPos = 0; + while (this.type !== types.parenR) { + first ? first = false : this$1.expect(types.comma); + if (allowTrailingComma && this$1.afterTrailingComma(types.parenR, true)) { + lastIsComma = true; + break + } else if (this$1.type === types.ellipsis) { + spreadStart = this$1.start; + exprList.push(this$1.parseParenItem(this$1.parseRestBinding())); + if (this$1.type === types.comma) { this$1.raise(this$1.start, "Comma is not permitted after the rest element"); } + break + } else { + exprList.push(this$1.parseMaybeAssign(false, refDestructuringErrors, this$1.parseParenItem)); + } + } + var innerEndPos = this.start, innerEndLoc = this.startLoc; + this.expect(types.parenR); + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList) + } + + if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); } + if (spreadStart) { this.unexpected(spreadStart); } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression") + } else { + return val + } +}; + +pp$3.parseParenItem = function(item) { + return item +}; + +pp$3.parseParenArrowList = function(startPos, startLoc, exprList) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList) +}; + +// New's precedence is slightly tricky. It must allow its argument to +// be a `[]` or dot subscript expression, but not a call — at least, +// not without wrapping it in parentheses. Thus, it uses the noCalls +// argument to parseSubscripts to prevent it from consuming the +// argument list. + +var empty$1 = []; + +pp$3.parseNew = function() { + var node = this.startNode(); + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(types.dot)) { + node.meta = meta; + var containsEsc = this.containsEsc; + node.property = this.parseIdent(true); + if (node.property.name !== "target" || containsEsc) + { this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target"); } + if (!this.inNonArrowFunction()) + { this.raiseRecoverable(node.start, "new.target can only be used in functions"); } + return this.finishNode(node, "MetaProperty") + } + var startPos = this.start, startLoc = this.startLoc; + node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); + if (this.eat(types.parenL)) { node.arguments = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false); } + else { node.arguments = empty$1; } + return this.finishNode(node, "NewExpression") +}; + +// Parse template expression. + +pp$3.parseTemplateElement = function(ref) { + var isTagged = ref.isTagged; + + var elem = this.startNode(); + if (this.type === types.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types.backQuote; + return this.finishNode(elem, "TemplateElement") +}; + +pp$3.parseTemplate = function(ref) { + var this$1 = this; + if ( ref === void 0 ) ref = {}; + var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false; + + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement({isTagged: isTagged}); + node.quasis = [curElt]; + while (!curElt.tail) { + if (this$1.type === types.eof) { this$1.raise(this$1.pos, "Unterminated template literal"); } + this$1.expect(types.dollarBraceL); + node.expressions.push(this$1.parseExpression()); + this$1.expect(types.braceR); + node.quasis.push(curElt = this$1.parseTemplateElement({isTagged: isTagged})); + } + this.next(); + return this.finishNode(node, "TemplateLiteral") +}; + +pp$3.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && + (this.type === types.name || this.type === types.num || this.type === types.string || this.type === types.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types.star)) && + !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) +}; + +// Parse an object literal or binding pattern. + +pp$3.parseObj = function(isPattern, refDestructuringErrors) { + var this$1 = this; + + var node = this.startNode(), first = true, propHash = {}; + node.properties = []; + this.next(); + while (!this.eat(types.braceR)) { + if (!first) { + this$1.expect(types.comma); + if (this$1.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var prop = this$1.parseProperty(isPattern, refDestructuringErrors); + if (!isPattern) { this$1.checkPropClash(prop, propHash, refDestructuringErrors); } + node.properties.push(prop); + } + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") +}; + +pp$3.parseProperty = function(isPattern, refDestructuringErrors) { + var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; + if (this.options.ecmaVersion >= 9 && this.eat(types.ellipsis)) { + if (isPattern) { + prop.argument = this.parseIdent(false); + if (this.type === types.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + return this.finishNode(prop, "RestElement") + } + // To disallow parenthesized identifier via `this.toAssignable()`. + if (this.type === types.parenL && refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0) { + refDestructuringErrors.parenthesizedAssign = this.start; + } + if (refDestructuringErrors.parenthesizedBind < 0) { + refDestructuringErrors.parenthesizedBind = this.start; + } + } + // Parse argument. + prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); + // To disallow trailing comma via `this.toAssignable()`. + if (this.type === types.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + // Finish + return this.finishNode(prop, "SpreadElement") + } + if (this.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this.start; + startLoc = this.startLoc; + } + if (!isPattern) + { isGenerator = this.eat(types.star); } + } + var containsEsc = this.containsEsc; + this.parsePropertyName(prop); + if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); + this.parsePropertyName(prop, refDestructuringErrors); + } else { + isAsync = false; + } + this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); + return this.finishNode(prop, "Property") +}; + +pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { + if ((isGenerator || isAsync) && this.type === types.colon) + { this.unexpected(); } + + if (this.eat(types.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types.parenL) { + if (isPattern) { this.unexpected(); } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (!isPattern && !containsEsc && + this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && + (prop.key.name === "get" || prop.key.name === "set") && + (this.type !== types.comma && this.type !== types.braceR)) { + if (isGenerator || isAsync) { this.unexpected(); } + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") + { this.raiseRecoverable(start, "getter should have no params"); } + else + { this.raiseRecoverable(start, "setter should have exactly one param"); } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") + { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); } + } + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + this.checkUnreserved(prop.key); + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else if (this.type === types.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) + { refDestructuringErrors.shorthandAssign = this.start; } + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else { + prop.value = prop.key; + } + prop.shorthand = true; + } else { this.unexpected(); } +}; + +pp$3.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types.bracketR); + return prop.key + } else { + prop.computed = false; + } + } + return prop.key = this.type === types.num || this.type === types.string ? this.parseExprAtom() : this.parseIdent(true) +}; + +// Initialize empty function node. + +pp$3.initFunction = function(node) { + node.id = null; + if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; } + if (this.options.ecmaVersion >= 8) { node.async = false; } +}; + +// Parse object or class method. + +pp$3.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { + var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos; + + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); + + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node, false); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.finishNode(node, "FunctionExpression") +}; + +// Parse arrow function expression with given parameters. + +pp$3.parseArrowExpression = function(node, params, isAsync) { + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos; + + this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); + this.initFunction(node); + if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + + node.params = this.toAssignableList(params, true); + this.parseFunctionBody(node, true); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.finishNode(node, "ArrowFunctionExpression") +}; + +// Parse function body and check parameters. + +pp$3.parseFunctionBody = function(node, isArrowFunction) { + var isExpression = isArrowFunction && this.type !== types.braceL; + var oldStrict = this.strict, useStrict = false; + + if (isExpression) { + node.body = this.parseMaybeAssign(); + node.expression = true; + this.checkParams(node, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + // If this is a strict mode function, verify that argument names + // are not repeated, and it does not try to bind the words `eval` + // or `arguments`. + if (useStrict && nonSimple) + { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); } + } + // Start a new scope with regard to labels and the `inFunction` + // flag (restore them to their old value afterwards). + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { this.strict = true; } + + // Add the params to varDeclaredNames to ensure that an error is thrown + // if a let/const declaration in the function clashes with one of the params. + this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && this.isSimpleParamList(node.params)); + node.body = this.parseBlock(false); + node.expression = false; + this.adaptDirectivePrologue(node.body.body); + this.labels = oldLabels; + } + this.exitScope(); + + // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval' + if (this.strict && node.id) { this.checkLVal(node.id, BIND_OUTSIDE); } + this.strict = oldStrict; +}; + +pp$3.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) + { + var param = list[i]; + + if (param.type !== "Identifier") { return false + } } + return true +}; + +// Checks function params for various disallowed patterns such as using "eval" +// or "arguments" and duplicate parameters. + +pp$3.checkParams = function(node, allowDuplicates) { + var this$1 = this; + + var nameHash = {}; + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + this$1.checkLVal(param, BIND_VAR, allowDuplicates ? null : nameHash); + } +}; + +// Parses a comma-separated list of expressions, and returns them as +// an array. `close` is the token type that ends the list, and +// `allowEmpty` can be turned on to allow subsequent commas with +// nothing in between them to be parsed as `null` (which is needed +// for array literals). + +pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var this$1 = this; + + var elts = [], first = true; + while (!this.eat(close)) { + if (!first) { + this$1.expect(types.comma); + if (allowTrailingComma && this$1.afterTrailingComma(close)) { break } + } else { first = false; } + + var elt = (void 0); + if (allowEmpty && this$1.type === types.comma) + { elt = null; } + else if (this$1.type === types.ellipsis) { + elt = this$1.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this$1.type === types.comma && refDestructuringErrors.trailingComma < 0) + { refDestructuringErrors.trailingComma = this$1.start; } + } else { + elt = this$1.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts +}; + +pp$3.checkUnreserved = function(ref) { + var start = ref.start; + var end = ref.end; + var name = ref.name; + + if (this.inGenerator && name === "yield") + { this.raiseRecoverable(start, "Can not use 'yield' as identifier inside a generator"); } + if (this.inAsync && name === "await") + { this.raiseRecoverable(start, "Can not use 'await' as identifier inside an async function"); } + if (this.keywords.test(name)) + { this.raise(start, ("Unexpected keyword '" + name + "'")); } + if (this.options.ecmaVersion < 6 && + this.input.slice(start, end).indexOf("\\") !== -1) { return } + var re = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re.test(name)) { + if (!this.inAsync && name === "await") + { this.raiseRecoverable(start, "Can not use keyword 'await' outside an async function"); } + this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved")); + } +}; + +// Parse the next token as an identifier. If `liberal` is true (used +// when parsing properties), it will also convert keywords into +// identifiers. + +pp$3.parseIdent = function(liberal, isBinding) { + var node = this.startNode(); + if (liberal && this.options.allowReserved === "never") { liberal = false; } + if (this.type === types.name) { + node.name = this.value; + } else if (this.type.keyword) { + node.name = this.type.keyword; + + // To fix https://github.com/acornjs/acorn/issues/575 + // `class` and `function` keywords push new context into this.context. + // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name. + // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword + if ((node.name === "class" || node.name === "function") && + (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { + this.context.pop(); + } + } else { + this.unexpected(); + } + this.next(); + this.finishNode(node, "Identifier"); + if (!liberal) { this.checkUnreserved(node); } + return node +}; + +// Parses yield expression inside generator. + +pp$3.parseYield = function(noIn) { + if (!this.yieldPos) { this.yieldPos = this.start; } + + var node = this.startNode(); + this.next(); + if (this.type === types.semi || this.canInsertSemicolon() || (this.type !== types.star && !this.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(types.star); + node.argument = this.parseMaybeAssign(noIn); + } + return this.finishNode(node, "YieldExpression") +}; + +pp$3.parseAwait = function() { + if (!this.awaitPos) { this.awaitPos = this.start; } + + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(null, true); + return this.finishNode(node, "AwaitExpression") +}; + +var pp$4 = Parser.prototype; + +// This function is used to raise exceptions on parse errors. It +// takes an offset integer (into the current `input`) to indicate +// the location of the error, attaches the position to the end +// of the error message, and then raises a `SyntaxError` with that +// message. + +pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; err.loc = loc; err.raisedAt = this.pos; + throw err +}; + +pp$4.raiseRecoverable = pp$4.raise; + +pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart) + } +}; + +var pp$5 = Parser.prototype; + +var Scope = function Scope(flags) { + this.flags = flags; + // A list of var-declared names in the current lexical scope + this.var = []; + // A list of lexically-declared names in the current lexical scope + this.lexical = []; + // A list of lexically-declared FunctionDeclaration names in the current lexical scope + this.functions = []; +}; + +// The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names. + +pp$5.enterScope = function(flags) { + this.scopeStack.push(new Scope(flags)); +}; + +pp$5.exitScope = function() { + this.scopeStack.pop(); +}; + +// The spec says: +// > At the top level of a function, or script, function declarations are +// > treated like var declarations rather than like lexical declarations. +pp$5.treatFunctionsAsVarInScope = function(scope) { + return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP); +}; + +pp$5.declareName = function(name, bindingType, pos) { + var this$1 = this; + + var redeclared = false; + if (bindingType === BIND_LEXICAL) { + var scope = this.currentScope(); + redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1; + scope.lexical.push(name); + } else if (bindingType === BIND_SIMPLE_CATCH) { + var scope$1 = this.currentScope(); + scope$1.lexical.push(name); + } else if (bindingType === BIND_FUNCTION) { + var scope$2 = this.currentScope(); + if (this.treatFunctionsAsVar) + { redeclared = scope$2.lexical.indexOf(name) > -1; } + else + { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; } + scope$2.functions.push(name); + } else { + for (var i = this.scopeStack.length - 1; i >= 0; --i) { + var scope$3 = this$1.scopeStack[i]; + if (scope$3.lexical.indexOf(name) > -1 && !(scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name || + !this$1.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) { + redeclared = true; + break + } + scope$3.var.push(name); + if (scope$3.flags & SCOPE_VAR) { break } + } + } + if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); } +}; + +pp$5.currentScope = function() { + return this.scopeStack[this.scopeStack.length - 1] +}; + +pp$5.currentVarScope = function() { + var this$1 = this; + + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this$1.scopeStack[i]; + if (scope.flags & SCOPE_VAR) { return scope } + } +}; + +// Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`. +pp$5.currentThisScope = function() { + var this$1 = this; + + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this$1.scopeStack[i]; + if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } + } +}; + +var Node = function Node(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser.options.locations) + { this.loc = new SourceLocation(parser, loc); } + if (parser.options.directSourceFile) + { this.sourceFile = parser.options.directSourceFile; } + if (parser.options.ranges) + { this.range = [pos, 0]; } +}; + +// Start an AST node, attaching a start offset. + +var pp$6 = Parser.prototype; + +pp$6.startNode = function() { + return new Node(this, this.start, this.startLoc) +}; + +pp$6.startNodeAt = function(pos, loc) { + return new Node(this, pos, loc) +}; + +// Finish an AST node, adding `type` and `end` properties. + +function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + if (this.options.locations) + { node.loc.end = loc; } + if (this.options.ranges) + { node.range[1] = pos; } + return node +} + +pp$6.finishNode = function(node, type) { + return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) +}; + +// Finish node at given position + +pp$6.finishNodeAt = function(node, type, pos, loc) { + return finishNodeAt.call(this, node, type, pos, loc) +}; + +// The algorithm used to determine whether a regexp can appear at a +// given point in the program is loosely based on sweet.js' approach. +// See https://github.com/mozilla/sweet.js/wiki/design + +var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; +}; + +var types$1 = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) +}; + +var pp$7 = Parser.prototype; + +pp$7.initialContext = function() { + return [types$1.b_stat] +}; + +pp$7.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types$1.f_expr || parent === types$1.f_stat) + { return true } + if (prevType === types.colon && (parent === types$1.b_stat || parent === types$1.b_expr)) + { return !parent.isExpr } + + // The check for `tt.name && exprAllowed` detects whether we are + // after a `yield` or `of` construct. See the `updateContext` for + // `tt.name`. + if (prevType === types._return || prevType === types.name && this.exprAllowed) + { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) } + if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType === types.arrow) + { return true } + if (prevType === types.braceL) + { return parent === types$1.b_stat } + if (prevType === types._var || prevType === types._const || prevType === types.name) + { return false } + return !this.exprAllowed +}; + +pp$7.inGeneratorContext = function() { + var this$1 = this; + + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this$1.context[i]; + if (context.token === "function") + { return context.generator } + } + return false +}; + +pp$7.updateContext = function(prevType) { + var update, type = this.type; + if (type.keyword && prevType === types.dot) + { this.exprAllowed = false; } + else if (update = type.updateContext) + { update.call(this, prevType); } + else + { this.exprAllowed = type.beforeExpr; } +}; + +// Token-specific context update code + +types.parenR.updateContext = types.braceR.updateContext = function() { + if (this.context.length === 1) { + this.exprAllowed = true; + return + } + var out = this.context.pop(); + if (out === types$1.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; +}; + +types.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types$1.b_stat : types$1.b_expr); + this.exprAllowed = true; +}; + +types.dollarBraceL.updateContext = function() { + this.context.push(types$1.b_tmpl); + this.exprAllowed = true; +}; + +types.parenL.updateContext = function(prevType) { + var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while; + this.context.push(statementParens ? types$1.p_stat : types$1.p_expr); + this.exprAllowed = true; +}; + +types.incDec.updateContext = function() { + // tokExprAllowed stays unchanged +}; + +types._function.updateContext = types._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else && + !(prevType === types._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && + !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat)) + { this.context.push(types$1.f_expr); } + else + { this.context.push(types$1.f_stat); } + this.exprAllowed = false; +}; + +types.backQuote.updateContext = function() { + if (this.curContext() === types$1.q_tmpl) + { this.context.pop(); } + else + { this.context.push(types$1.q_tmpl); } + this.exprAllowed = false; +}; + +types.star.updateContext = function(prevType) { + if (prevType === types._function) { + var index = this.context.length - 1; + if (this.context[index] === types$1.f_expr) + { this.context[index] = types$1.f_expr_gen; } + else + { this.context[index] = types$1.f_gen; } + } + this.exprAllowed = true; +}; + +types.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6 && prevType !== types.dot) { + if (this.value === "of" && !this.exprAllowed || + this.value === "yield" && this.inGeneratorContext()) + { allowed = true; } + } + this.exprAllowed = allowed; +}; + +var data = { + "$LONE": [ + "ASCII", + "ASCII_Hex_Digit", + "AHex", + "Alphabetic", + "Alpha", + "Any", + "Assigned", + "Bidi_Control", + "Bidi_C", + "Bidi_Mirrored", + "Bidi_M", + "Case_Ignorable", + "CI", + "Cased", + "Changes_When_Casefolded", + "CWCF", + "Changes_When_Casemapped", + "CWCM", + "Changes_When_Lowercased", + "CWL", + "Changes_When_NFKC_Casefolded", + "CWKCF", + "Changes_When_Titlecased", + "CWT", + "Changes_When_Uppercased", + "CWU", + "Dash", + "Default_Ignorable_Code_Point", + "DI", + "Deprecated", + "Dep", + "Diacritic", + "Dia", + "Emoji", + "Emoji_Component", + "Emoji_Modifier", + "Emoji_Modifier_Base", + "Emoji_Presentation", + "Extender", + "Ext", + "Grapheme_Base", + "Gr_Base", + "Grapheme_Extend", + "Gr_Ext", + "Hex_Digit", + "Hex", + "IDS_Binary_Operator", + "IDSB", + "IDS_Trinary_Operator", + "IDST", + "ID_Continue", + "IDC", + "ID_Start", + "IDS", + "Ideographic", + "Ideo", + "Join_Control", + "Join_C", + "Logical_Order_Exception", + "LOE", + "Lowercase", + "Lower", + "Math", + "Noncharacter_Code_Point", + "NChar", + "Pattern_Syntax", + "Pat_Syn", + "Pattern_White_Space", + "Pat_WS", + "Quotation_Mark", + "QMark", + "Radical", + "Regional_Indicator", + "RI", + "Sentence_Terminal", + "STerm", + "Soft_Dotted", + "SD", + "Terminal_Punctuation", + "Term", + "Unified_Ideograph", + "UIdeo", + "Uppercase", + "Upper", + "Variation_Selector", + "VS", + "White_Space", + "space", + "XID_Continue", + "XIDC", + "XID_Start", + "XIDS" + ], + "General_Category": [ + "Cased_Letter", + "LC", + "Close_Punctuation", + "Pe", + "Connector_Punctuation", + "Pc", + "Control", + "Cc", + "cntrl", + "Currency_Symbol", + "Sc", + "Dash_Punctuation", + "Pd", + "Decimal_Number", + "Nd", + "digit", + "Enclosing_Mark", + "Me", + "Final_Punctuation", + "Pf", + "Format", + "Cf", + "Initial_Punctuation", + "Pi", + "Letter", + "L", + "Letter_Number", + "Nl", + "Line_Separator", + "Zl", + "Lowercase_Letter", + "Ll", + "Mark", + "M", + "Combining_Mark", + "Math_Symbol", + "Sm", + "Modifier_Letter", + "Lm", + "Modifier_Symbol", + "Sk", + "Nonspacing_Mark", + "Mn", + "Number", + "N", + "Open_Punctuation", + "Ps", + "Other", + "C", + "Other_Letter", + "Lo", + "Other_Number", + "No", + "Other_Punctuation", + "Po", + "Other_Symbol", + "So", + "Paragraph_Separator", + "Zp", + "Private_Use", + "Co", + "Punctuation", + "P", + "punct", + "Separator", + "Z", + "Space_Separator", + "Zs", + "Spacing_Mark", + "Mc", + "Surrogate", + "Cs", + "Symbol", + "S", + "Titlecase_Letter", + "Lt", + "Unassigned", + "Cn", + "Uppercase_Letter", + "Lu" + ], + "Script": [ + "Adlam", + "Adlm", + "Ahom", + "Anatolian_Hieroglyphs", + "Hluw", + "Arabic", + "Arab", + "Armenian", + "Armn", + "Avestan", + "Avst", + "Balinese", + "Bali", + "Bamum", + "Bamu", + "Bassa_Vah", + "Bass", + "Batak", + "Batk", + "Bengali", + "Beng", + "Bhaiksuki", + "Bhks", + "Bopomofo", + "Bopo", + "Brahmi", + "Brah", + "Braille", + "Brai", + "Buginese", + "Bugi", + "Buhid", + "Buhd", + "Canadian_Aboriginal", + "Cans", + "Carian", + "Cari", + "Caucasian_Albanian", + "Aghb", + "Chakma", + "Cakm", + "Cham", + "Cherokee", + "Cher", + "Common", + "Zyyy", + "Coptic", + "Copt", + "Qaac", + "Cuneiform", + "Xsux", + "Cypriot", + "Cprt", + "Cyrillic", + "Cyrl", + "Deseret", + "Dsrt", + "Devanagari", + "Deva", + "Duployan", + "Dupl", + "Egyptian_Hieroglyphs", + "Egyp", + "Elbasan", + "Elba", + "Ethiopic", + "Ethi", + "Georgian", + "Geor", + "Glagolitic", + "Glag", + "Gothic", + "Goth", + "Grantha", + "Gran", + "Greek", + "Grek", + "Gujarati", + "Gujr", + "Gurmukhi", + "Guru", + "Han", + "Hani", + "Hangul", + "Hang", + "Hanunoo", + "Hano", + "Hatran", + "Hatr", + "Hebrew", + "Hebr", + "Hiragana", + "Hira", + "Imperial_Aramaic", + "Armi", + "Inherited", + "Zinh", + "Qaai", + "Inscriptional_Pahlavi", + "Phli", + "Inscriptional_Parthian", + "Prti", + "Javanese", + "Java", + "Kaithi", + "Kthi", + "Kannada", + "Knda", + "Katakana", + "Kana", + "Kayah_Li", + "Kali", + "Kharoshthi", + "Khar", + "Khmer", + "Khmr", + "Khojki", + "Khoj", + "Khudawadi", + "Sind", + "Lao", + "Laoo", + "Latin", + "Latn", + "Lepcha", + "Lepc", + "Limbu", + "Limb", + "Linear_A", + "Lina", + "Linear_B", + "Linb", + "Lisu", + "Lycian", + "Lyci", + "Lydian", + "Lydi", + "Mahajani", + "Mahj", + "Malayalam", + "Mlym", + "Mandaic", + "Mand", + "Manichaean", + "Mani", + "Marchen", + "Marc", + "Masaram_Gondi", + "Gonm", + "Meetei_Mayek", + "Mtei", + "Mende_Kikakui", + "Mend", + "Meroitic_Cursive", + "Merc", + "Meroitic_Hieroglyphs", + "Mero", + "Miao", + "Plrd", + "Modi", + "Mongolian", + "Mong", + "Mro", + "Mroo", + "Multani", + "Mult", + "Myanmar", + "Mymr", + "Nabataean", + "Nbat", + "New_Tai_Lue", + "Talu", + "Newa", + "Nko", + "Nkoo", + "Nushu", + "Nshu", + "Ogham", + "Ogam", + "Ol_Chiki", + "Olck", + "Old_Hungarian", + "Hung", + "Old_Italic", + "Ital", + "Old_North_Arabian", + "Narb", + "Old_Permic", + "Perm", + "Old_Persian", + "Xpeo", + "Old_South_Arabian", + "Sarb", + "Old_Turkic", + "Orkh", + "Oriya", + "Orya", + "Osage", + "Osge", + "Osmanya", + "Osma", + "Pahawh_Hmong", + "Hmng", + "Palmyrene", + "Palm", + "Pau_Cin_Hau", + "Pauc", + "Phags_Pa", + "Phag", + "Phoenician", + "Phnx", + "Psalter_Pahlavi", + "Phlp", + "Rejang", + "Rjng", + "Runic", + "Runr", + "Samaritan", + "Samr", + "Saurashtra", + "Saur", + "Sharada", + "Shrd", + "Shavian", + "Shaw", + "Siddham", + "Sidd", + "SignWriting", + "Sgnw", + "Sinhala", + "Sinh", + "Sora_Sompeng", + "Sora", + "Soyombo", + "Soyo", + "Sundanese", + "Sund", + "Syloti_Nagri", + "Sylo", + "Syriac", + "Syrc", + "Tagalog", + "Tglg", + "Tagbanwa", + "Tagb", + "Tai_Le", + "Tale", + "Tai_Tham", + "Lana", + "Tai_Viet", + "Tavt", + "Takri", + "Takr", + "Tamil", + "Taml", + "Tangut", + "Tang", + "Telugu", + "Telu", + "Thaana", + "Thaa", + "Thai", + "Tibetan", + "Tibt", + "Tifinagh", + "Tfng", + "Tirhuta", + "Tirh", + "Ugaritic", + "Ugar", + "Vai", + "Vaii", + "Warang_Citi", + "Wara", + "Yi", + "Yiii", + "Zanabazar_Square", + "Zanb" + ] +}; +Array.prototype.push.apply(data.$LONE, data.General_Category); +data.gc = data.General_Category; +data.sc = data.Script_Extensions = data.scx = data.Script; + +var pp$9 = Parser.prototype; + +var RegExpValidationState = function RegExpValidationState(parser) { + this.parser = parser; + this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : ""); + this.source = ""; + this.flags = ""; + this.start = 0; + this.switchU = false; + this.switchN = false; + this.pos = 0; + this.lastIntValue = 0; + this.lastStringValue = ""; + this.lastAssertionIsQuantifiable = false; + this.numCapturingParens = 0; + this.maxBackReference = 0; + this.groupNames = []; + this.backReferenceNames = []; +}; + +RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { + var unicode = flags.indexOf("u") !== -1; + this.start = start | 0; + this.source = pattern + ""; + this.flags = flags; + this.switchU = unicode && this.parser.options.ecmaVersion >= 6; + this.switchN = unicode && this.parser.options.ecmaVersion >= 9; +}; + +RegExpValidationState.prototype.raise = function raise (message) { + this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message)); +}; + +// If u flag is given, this returns the code point at the index (it combines a surrogate pair). +// Otherwise, this returns the code unit of the index (can be a part of a surrogate pair). +RegExpValidationState.prototype.at = function at (i) { + var s = this.source; + var l = s.length; + if (i >= l) { + return -1 + } + var c = s.charCodeAt(i); + if (!this.switchU || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) { + return c + } + return (c << 10) + s.charCodeAt(i + 1) - 0x35FDC00 +}; + +RegExpValidationState.prototype.nextIndex = function nextIndex (i) { + var s = this.source; + var l = s.length; + if (i >= l) { + return l + } + var c = s.charCodeAt(i); + if (!this.switchU || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) { + return i + 1 + } + return i + 2 +}; + +RegExpValidationState.prototype.current = function current () { + return this.at(this.pos) +}; + +RegExpValidationState.prototype.lookahead = function lookahead () { + return this.at(this.nextIndex(this.pos)) +}; + +RegExpValidationState.prototype.advance = function advance () { + this.pos = this.nextIndex(this.pos); +}; + +RegExpValidationState.prototype.eat = function eat (ch) { + if (this.current() === ch) { + this.advance(); + return true + } + return false +}; + +function codePointToString$1(ch) { + if (ch <= 0xFFFF) { return String.fromCharCode(ch) } + ch -= 0x10000; + return String.fromCharCode((ch >> 10) + 0xD800, (ch & 0x03FF) + 0xDC00) +} + +/** + * Validate the flags part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ +pp$9.validateRegExpFlags = function(state) { + var this$1 = this; + + var validFlags = state.validFlags; + var flags = state.flags; + + for (var i = 0; i < flags.length; i++) { + var flag = flags.charAt(i); + if (validFlags.indexOf(flag) === -1) { + this$1.raise(state.start, "Invalid regular expression flag"); + } + if (flags.indexOf(flag, i + 1) > -1) { + this$1.raise(state.start, "Duplicate regular expression flag"); + } + } +}; + +/** + * Validate the pattern part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ +pp$9.validateRegExpPattern = function(state) { + this.regexp_pattern(state); + + // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of + // parsing contains a |GroupName|, reparse with the goal symbol + // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError* + // exception if _P_ did not conform to the grammar, if any elements of _P_ + // were not matched by the parse, or if any Early Error conditions exist. + if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + state.switchN = true; + this.regexp_pattern(state); + } +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern +pp$9.regexp_pattern = function(state) { + state.pos = 0; + state.lastIntValue = 0; + state.lastStringValue = ""; + state.lastAssertionIsQuantifiable = false; + state.numCapturingParens = 0; + state.maxBackReference = 0; + state.groupNames.length = 0; + state.backReferenceNames.length = 0; + + this.regexp_disjunction(state); + + if (state.pos !== state.source.length) { + // Make the same messages as V8. + if (state.eat(0x29 /* ) */)) { + state.raise("Unmatched ')'"); + } + if (state.eat(0x5D /* [ */) || state.eat(0x7D /* } */)) { + state.raise("Lone quantifier brackets"); + } + } + if (state.maxBackReference > state.numCapturingParens) { + state.raise("Invalid escape"); + } + for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { + var name = list[i]; + + if (state.groupNames.indexOf(name) === -1) { + state.raise("Invalid named capture referenced"); + } + } +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction +pp$9.regexp_disjunction = function(state) { + var this$1 = this; + + this.regexp_alternative(state); + while (state.eat(0x7C /* | */)) { + this$1.regexp_alternative(state); + } + + // Make the same message as V8. + if (this.regexp_eatQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + if (state.eat(0x7B /* { */)) { + state.raise("Lone quantifier brackets"); + } +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative +pp$9.regexp_alternative = function(state) { + while (state.pos < state.source.length && this.regexp_eatTerm(state)) + { } +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term +pp$9.regexp_eatTerm = function(state) { + if (this.regexp_eatAssertion(state)) { + // Handle `QuantifiableAssertion Quantifier` alternative. + // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion + // is a QuantifiableAssertion. + if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) { + // Make the same message as V8. + if (state.switchU) { + state.raise("Invalid quantifier"); + } + } + return true + } + + if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) { + this.regexp_eatQuantifier(state); + return true + } + + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion +pp$9.regexp_eatAssertion = function(state) { + var start = state.pos; + state.lastAssertionIsQuantifiable = false; + + // ^, $ + if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) { + return true + } + + // \b \B + if (state.eat(0x5C /* \ */)) { + if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) { + return true + } + state.pos = start; + } + + // Lookahead / Lookbehind + if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) { + var lookbehind = false; + if (this.options.ecmaVersion >= 9) { + lookbehind = state.eat(0x3C /* < */); + } + if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) { + this.regexp_disjunction(state); + if (!state.eat(0x29 /* ) */)) { + state.raise("Unterminated group"); + } + state.lastAssertionIsQuantifiable = !lookbehind; + return true + } + } + + state.pos = start; + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier +pp$9.regexp_eatQuantifier = function(state, noError) { + if ( noError === void 0 ) noError = false; + + if (this.regexp_eatQuantifierPrefix(state, noError)) { + state.eat(0x3F /* ? */); + return true + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix +pp$9.regexp_eatQuantifierPrefix = function(state, noError) { + return ( + state.eat(0x2A /* * */) || + state.eat(0x2B /* + */) || + state.eat(0x3F /* ? */) || + this.regexp_eatBracedQuantifier(state, noError) + ) +}; +pp$9.regexp_eatBracedQuantifier = function(state, noError) { + var start = state.pos; + if (state.eat(0x7B /* { */)) { + var min = 0, max = -1; + if (this.regexp_eatDecimalDigits(state)) { + min = state.lastIntValue; + if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) { + max = state.lastIntValue; + } + if (state.eat(0x7D /* } */)) { + // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term + if (max !== -1 && max < min && !noError) { + state.raise("numbers out of order in {} quantifier"); + } + return true + } + } + if (state.switchU && !noError) { + state.raise("Incomplete quantifier"); + } + state.pos = start; + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-Atom +pp$9.regexp_eatAtom = function(state) { + return ( + this.regexp_eatPatternCharacters(state) || + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) + ) +}; +pp$9.regexp_eatReverseSolidusAtomEscape = function(state) { + var start = state.pos; + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatAtomEscape(state)) { + return true + } + state.pos = start; + } + return false +}; +pp$9.regexp_eatUncapturingGroup = function(state) { + var start = state.pos; + if (state.eat(0x28 /* ( */)) { + if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) { + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + return true + } + state.raise("Unterminated group"); + } + state.pos = start; + } + return false +}; +pp$9.regexp_eatCapturingGroup = function(state) { + if (state.eat(0x28 /* ( */)) { + if (this.options.ecmaVersion >= 9) { + this.regexp_groupSpecifier(state); + } else if (state.current() === 0x3F /* ? */) { + state.raise("Invalid group"); + } + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + state.numCapturingParens += 1; + return true + } + state.raise("Unterminated group"); + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom +pp$9.regexp_eatExtendedAtom = function(state) { + return ( + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) || + this.regexp_eatInvalidBracedQuantifier(state) || + this.regexp_eatExtendedPatternCharacter(state) + ) +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier +pp$9.regexp_eatInvalidBracedQuantifier = function(state) { + if (this.regexp_eatBracedQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter +pp$9.regexp_eatSyntaxCharacter = function(state) { + var ch = state.current(); + if (isSyntaxCharacter(ch)) { + state.lastIntValue = ch; + state.advance(); + return true + } + return false +}; +function isSyntaxCharacter(ch) { + return ( + ch === 0x24 /* $ */ || + ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ || + ch === 0x2E /* . */ || + ch === 0x3F /* ? */ || + ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ || + ch >= 0x7B /* { */ && ch <= 0x7D /* } */ + ) +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter +// But eat eager. +pp$9.regexp_eatPatternCharacters = function(state) { + var start = state.pos; + var ch = 0; + while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) { + state.advance(); + } + return state.pos !== start +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter +pp$9.regexp_eatExtendedPatternCharacter = function(state) { + var ch = state.current(); + if ( + ch !== -1 && + ch !== 0x24 /* $ */ && + !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) && + ch !== 0x2E /* . */ && + ch !== 0x3F /* ? */ && + ch !== 0x5B /* [ */ && + ch !== 0x5E /* ^ */ && + ch !== 0x7C /* | */ + ) { + state.advance(); + return true + } + return false +}; + +// GroupSpecifier[U] :: +// [empty] +// `?` GroupName[?U] +pp$9.regexp_groupSpecifier = function(state) { + if (state.eat(0x3F /* ? */)) { + if (this.regexp_eatGroupName(state)) { + if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + state.raise("Duplicate capture group name"); + } + state.groupNames.push(state.lastStringValue); + return + } + state.raise("Invalid group"); + } +}; + +// GroupName[U] :: +// `<` RegExpIdentifierName[?U] `>` +// Note: this updates `state.lastStringValue` property with the eaten name. +pp$9.regexp_eatGroupName = function(state) { + state.lastStringValue = ""; + if (state.eat(0x3C /* < */)) { + if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) { + return true + } + state.raise("Invalid capture group name"); + } + return false +}; + +// RegExpIdentifierName[U] :: +// RegExpIdentifierStart[?U] +// RegExpIdentifierName[?U] RegExpIdentifierPart[?U] +// Note: this updates `state.lastStringValue` property with the eaten name. +pp$9.regexp_eatRegExpIdentifierName = function(state) { + state.lastStringValue = ""; + if (this.regexp_eatRegExpIdentifierStart(state)) { + state.lastStringValue += codePointToString$1(state.lastIntValue); + while (this.regexp_eatRegExpIdentifierPart(state)) { + state.lastStringValue += codePointToString$1(state.lastIntValue); + } + return true + } + return false +}; + +// RegExpIdentifierStart[U] :: +// UnicodeIDStart +// `$` +// `_` +// `\` RegExpUnicodeEscapeSequence[?U] +pp$9.regexp_eatRegExpIdentifierStart = function(state) { + var start = state.pos; + var ch = state.current(); + state.advance(); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierStart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false +}; +function isRegExpIdentifierStart(ch) { + return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ +} + +// RegExpIdentifierPart[U] :: +// UnicodeIDContinue +// `$` +// `_` +// `\` RegExpUnicodeEscapeSequence[?U] +// +// +pp$9.regexp_eatRegExpIdentifierPart = function(state) { + var start = state.pos; + var ch = state.current(); + state.advance(); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierPart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false +}; +function isRegExpIdentifierPart(ch) { + return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* */ || ch === 0x200D /* */ +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape +pp$9.regexp_eatAtomEscape = function(state) { + if ( + this.regexp_eatBackReference(state) || + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) || + (state.switchN && this.regexp_eatKGroupName(state)) + ) { + return true + } + if (state.switchU) { + // Make the same message as V8. + if (state.current() === 0x63 /* c */) { + state.raise("Invalid unicode escape"); + } + state.raise("Invalid escape"); + } + return false +}; +pp$9.regexp_eatBackReference = function(state) { + var start = state.pos; + if (this.regexp_eatDecimalEscape(state)) { + var n = state.lastIntValue; + if (state.switchU) { + // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape + if (n > state.maxBackReference) { + state.maxBackReference = n; + } + return true + } + if (n <= state.numCapturingParens) { + return true + } + state.pos = start; + } + return false +}; +pp$9.regexp_eatKGroupName = function(state) { + if (state.eat(0x6B /* k */)) { + if (this.regexp_eatGroupName(state)) { + state.backReferenceNames.push(state.lastStringValue); + return true + } + state.raise("Invalid named reference"); + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape +pp$9.regexp_eatCharacterEscape = function(state) { + return ( + this.regexp_eatControlEscape(state) || + this.regexp_eatCControlLetter(state) || + this.regexp_eatZero(state) || + this.regexp_eatHexEscapeSequence(state) || + this.regexp_eatRegExpUnicodeEscapeSequence(state) || + (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) || + this.regexp_eatIdentityEscape(state) + ) +}; +pp$9.regexp_eatCControlLetter = function(state) { + var start = state.pos; + if (state.eat(0x63 /* c */)) { + if (this.regexp_eatControlLetter(state)) { + return true + } + state.pos = start; + } + return false +}; +pp$9.regexp_eatZero = function(state) { + if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) { + state.lastIntValue = 0; + state.advance(); + return true + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape +pp$9.regexp_eatControlEscape = function(state) { + var ch = state.current(); + if (ch === 0x74 /* t */) { + state.lastIntValue = 0x09; /* \t */ + state.advance(); + return true + } + if (ch === 0x6E /* n */) { + state.lastIntValue = 0x0A; /* \n */ + state.advance(); + return true + } + if (ch === 0x76 /* v */) { + state.lastIntValue = 0x0B; /* \v */ + state.advance(); + return true + } + if (ch === 0x66 /* f */) { + state.lastIntValue = 0x0C; /* \f */ + state.advance(); + return true + } + if (ch === 0x72 /* r */) { + state.lastIntValue = 0x0D; /* \r */ + state.advance(); + return true + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter +pp$9.regexp_eatControlLetter = function(state) { + var ch = state.current(); + if (isControlLetter(ch)) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false +}; +function isControlLetter(ch) { + return ( + (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) || + (ch >= 0x61 /* a */ && ch <= 0x7A /* z */) + ) +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence +pp$9.regexp_eatRegExpUnicodeEscapeSequence = function(state) { + var start = state.pos; + + if (state.eat(0x75 /* u */)) { + if (this.regexp_eatFixedHexDigits(state, 4)) { + var lead = state.lastIntValue; + if (state.switchU && lead >= 0xD800 && lead <= 0xDBFF) { + var leadSurrogateEnd = state.pos; + if (state.eat(0x5C /* \ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) { + var trail = state.lastIntValue; + if (trail >= 0xDC00 && trail <= 0xDFFF) { + state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + return true + } + } + state.pos = leadSurrogateEnd; + state.lastIntValue = lead; + } + return true + } + if ( + state.switchU && + state.eat(0x7B /* { */) && + this.regexp_eatHexDigits(state) && + state.eat(0x7D /* } */) && + isValidUnicode(state.lastIntValue) + ) { + return true + } + if (state.switchU) { + state.raise("Invalid unicode escape"); + } + state.pos = start; + } + + return false +}; +function isValidUnicode(ch) { + return ch >= 0 && ch <= 0x10FFFF +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape +pp$9.regexp_eatIdentityEscape = function(state) { + if (state.switchU) { + if (this.regexp_eatSyntaxCharacter(state)) { + return true + } + if (state.eat(0x2F /* / */)) { + state.lastIntValue = 0x2F; /* / */ + return true + } + return false + } + + var ch = state.current(); + if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape +pp$9.regexp_eatDecimalEscape = function(state) { + state.lastIntValue = 0; + var ch = state.current(); + if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) { + do { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) + return true + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape +pp$9.regexp_eatCharacterClassEscape = function(state) { + var ch = state.current(); + + if (isCharacterClassEscape(ch)) { + state.lastIntValue = -1; + state.advance(); + return true + } + + if ( + state.switchU && + this.options.ecmaVersion >= 9 && + (ch === 0x50 /* P */ || ch === 0x70 /* p */) + ) { + state.lastIntValue = -1; + state.advance(); + if ( + state.eat(0x7B /* { */) && + this.regexp_eatUnicodePropertyValueExpression(state) && + state.eat(0x7D /* } */) + ) { + return true + } + state.raise("Invalid property name"); + } + + return false +}; +function isCharacterClassEscape(ch) { + return ( + ch === 0x64 /* d */ || + ch === 0x44 /* D */ || + ch === 0x73 /* s */ || + ch === 0x53 /* S */ || + ch === 0x77 /* w */ || + ch === 0x57 /* W */ + ) +} + +// UnicodePropertyValueExpression :: +// UnicodePropertyName `=` UnicodePropertyValue +// LoneUnicodePropertyNameOrValue +pp$9.regexp_eatUnicodePropertyValueExpression = function(state) { + var start = state.pos; + + // UnicodePropertyName `=` UnicodePropertyValue + if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) { + var name = state.lastStringValue; + if (this.regexp_eatUnicodePropertyValue(state)) { + var value = state.lastStringValue; + this.regexp_validateUnicodePropertyNameAndValue(state, name, value); + return true + } + } + state.pos = start; + + // LoneUnicodePropertyNameOrValue + if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) { + var nameOrValue = state.lastStringValue; + this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue); + return true + } + return false +}; +pp$9.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) { + if (!data.hasOwnProperty(name) || data[name].indexOf(value) === -1) { + state.raise("Invalid property name"); + } +}; +pp$9.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) { + if (data.$LONE.indexOf(nameOrValue) === -1) { + state.raise("Invalid property name"); + } +}; + +// UnicodePropertyName :: +// UnicodePropertyNameCharacters +pp$9.regexp_eatUnicodePropertyName = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyNameCharacter(ch = state.current())) { + state.lastStringValue += codePointToString$1(ch); + state.advance(); + } + return state.lastStringValue !== "" +}; +function isUnicodePropertyNameCharacter(ch) { + return isControlLetter(ch) || ch === 0x5F /* _ */ +} + +// UnicodePropertyValue :: +// UnicodePropertyValueCharacters +pp$9.regexp_eatUnicodePropertyValue = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyValueCharacter(ch = state.current())) { + state.lastStringValue += codePointToString$1(ch); + state.advance(); + } + return state.lastStringValue !== "" +}; +function isUnicodePropertyValueCharacter(ch) { + return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch) +} + +// LoneUnicodePropertyNameOrValue :: +// UnicodePropertyValueCharacters +pp$9.regexp_eatLoneUnicodePropertyNameOrValue = function(state) { + return this.regexp_eatUnicodePropertyValue(state) +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass +pp$9.regexp_eatCharacterClass = function(state) { + if (state.eat(0x5B /* [ */)) { + state.eat(0x5E /* ^ */); + this.regexp_classRanges(state); + if (state.eat(0x5D /* [ */)) { + return true + } + // Unreachable since it threw "unterminated regular expression" error before. + state.raise("Unterminated character class"); + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges +// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges +// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash +pp$9.regexp_classRanges = function(state) { + var this$1 = this; + + while (this.regexp_eatClassAtom(state)) { + var left = state.lastIntValue; + if (state.eat(0x2D /* - */) && this$1.regexp_eatClassAtom(state)) { + var right = state.lastIntValue; + if (state.switchU && (left === -1 || right === -1)) { + state.raise("Invalid character class"); + } + if (left !== -1 && right !== -1 && left > right) { + state.raise("Range out of order in character class"); + } + } + } +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom +// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash +pp$9.regexp_eatClassAtom = function(state) { + var start = state.pos; + + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatClassEscape(state)) { + return true + } + if (state.switchU) { + // Make the same message as V8. + var ch$1 = state.current(); + if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) { + state.raise("Invalid class escape"); + } + state.raise("Invalid escape"); + } + state.pos = start; + } + + var ch = state.current(); + if (ch !== 0x5D /* [ */) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape +pp$9.regexp_eatClassEscape = function(state) { + var start = state.pos; + + if (state.eat(0x62 /* b */)) { + state.lastIntValue = 0x08; /* */ + return true + } + + if (state.switchU && state.eat(0x2D /* - */)) { + state.lastIntValue = 0x2D; /* - */ + return true + } + + if (!state.switchU && state.eat(0x63 /* c */)) { + if (this.regexp_eatClassControlLetter(state)) { + return true + } + state.pos = start; + } + + return ( + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) + ) +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter +pp$9.regexp_eatClassControlLetter = function(state) { + var ch = state.current(); + if (isDecimalDigit(ch) || ch === 0x5F /* _ */) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence +pp$9.regexp_eatHexEscapeSequence = function(state) { + var start = state.pos; + if (state.eat(0x78 /* x */)) { + if (this.regexp_eatFixedHexDigits(state, 2)) { + return true + } + if (state.switchU) { + state.raise("Invalid escape"); + } + state.pos = start; + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits +pp$9.regexp_eatDecimalDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isDecimalDigit(ch = state.current())) { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } + return state.pos !== start +}; +function isDecimalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */ +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits +pp$9.regexp_eatHexDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isHexDigit(ch = state.current())) { + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return state.pos !== start +}; +function isHexDigit(ch) { + return ( + (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) || + (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) || + (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) + ) +} +function hexToInt(ch) { + if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) { + return 10 + (ch - 0x41 /* A */) + } + if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) { + return 10 + (ch - 0x61 /* a */) + } + return ch - 0x30 /* 0 */ +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence +// Allows only 0-377(octal) i.e. 0-255(decimal). +pp$9.regexp_eatLegacyOctalEscapeSequence = function(state) { + if (this.regexp_eatOctalDigit(state)) { + var n1 = state.lastIntValue; + if (this.regexp_eatOctalDigit(state)) { + var n2 = state.lastIntValue; + if (n1 <= 3 && this.regexp_eatOctalDigit(state)) { + state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue; + } else { + state.lastIntValue = n1 * 8 + n2; + } + } else { + state.lastIntValue = n1; + } + return true + } + return false +}; + +// https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit +pp$9.regexp_eatOctalDigit = function(state) { + var ch = state.current(); + if (isOctalDigit(ch)) { + state.lastIntValue = ch - 0x30; /* 0 */ + state.advance(); + return true + } + state.lastIntValue = 0; + return false +}; +function isOctalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */ +} + +// https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits +// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit +// And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence +pp$9.regexp_eatFixedHexDigits = function(state, length) { + var start = state.pos; + state.lastIntValue = 0; + for (var i = 0; i < length; ++i) { + var ch = state.current(); + if (!isHexDigit(ch)) { + state.pos = start; + return false + } + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return true +}; + +// Object type used to represent tokens. Note that normally, tokens +// simply exist as properties on the parser object. This is only +// used for the onToken callback and the external tokenizer. + +var Token = function Token(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) + { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); } + if (p.options.ranges) + { this.range = [p.start, p.end]; } +}; + +// ## Tokenizer + +var pp$8 = Parser.prototype; + +// Move to the next token + +pp$8.next = function() { + if (this.options.onToken) + { this.options.onToken(new Token(this)); } + + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); +}; + +pp$8.getToken = function() { + this.next(); + return new Token(this) +}; + +// If we're in an ES6 environment, make parsers iterable +if (typeof Symbol !== "undefined") + { pp$8[Symbol.iterator] = function() { + var this$1 = this; + + return { + next: function () { + var token = this$1.getToken(); + return { + done: token.type === types.eof, + value: token + } + } + } + }; } + +// Toggle strict mode. Re-reads the next number or string to please +// pedantic tests (`"use strict"; 010;` should fail). + +pp$8.curContext = function() { + return this.context[this.context.length - 1] +}; + +// Read a single token, updating the parser object's token-related +// properties. + +pp$8.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { this.skipSpace(); } + + this.start = this.pos; + if (this.options.locations) { this.startLoc = this.curPosition(); } + if (this.pos >= this.input.length) { return this.finishToken(types.eof) } + + if (curContext.override) { return curContext.override(this) } + else { this.readToken(this.fullCharCodeAtPos()); } +}; + +pp$8.readToken = function(code) { + // Identifier or keyword. '\uXXXX' sequences are allowed in + // identifiers, so '\' also dispatches to that. + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */) + { return this.readWord() } + + return this.getTokenFromCode(code) +}; + +pp$8.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 0xd7ff || code >= 0xe000) { return code } + var next = this.input.charCodeAt(this.pos + 1); + return (code << 10) + next - 0x35fdc00 +}; + +pp$8.skipBlockComment = function() { + var this$1 = this; + + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); } + this.pos = end + 2; + if (this.options.locations) { + lineBreakG.lastIndex = start; + var match; + while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) { + ++this$1.curLine; + this$1.lineStart = match.index + match[0].length; + } + } + if (this.options.onComment) + { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, + startLoc, this.curPosition()); } +}; + +pp$8.skipLineComment = function(startSkip) { + var this$1 = this; + + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this$1.input.charCodeAt(++this$1.pos); + } + if (this.options.onComment) + { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, + startLoc, this.curPosition()); } +}; + +// Called at the start of the parse and after every token. Skips +// whitespace and comments, and. + +pp$8.skipSpace = function() { + var this$1 = this; + + loop: while (this.pos < this.input.length) { + var ch = this$1.input.charCodeAt(this$1.pos); + switch (ch) { + case 32: case 160: // ' ' + ++this$1.pos; + break + case 13: + if (this$1.input.charCodeAt(this$1.pos + 1) === 10) { + ++this$1.pos; + } + case 10: case 8232: case 8233: + ++this$1.pos; + if (this$1.options.locations) { + ++this$1.curLine; + this$1.lineStart = this$1.pos; + } + break + case 47: // '/' + switch (this$1.input.charCodeAt(this$1.pos + 1)) { + case 42: // '*' + this$1.skipBlockComment(); + break + case 47: + this$1.skipLineComment(2); + break + default: + break loop + } + break + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this$1.pos; + } else { + break loop + } + } + } +}; + +// Called at the end of every token. Sets `end`, `val`, and +// maintains `context` and `exprAllowed`, and skips the space after +// the token, so that the next one's `start` will point at the +// right position. + +pp$8.finishToken = function(type, val) { + this.end = this.pos; + if (this.options.locations) { this.endLoc = this.curPosition(); } + var prevType = this.type; + this.type = type; + this.value = val; + + this.updateContext(prevType); +}; + +// ### Token reading + +// This is the function that is called to fetch the next token. It +// is somewhat obscure, because it works in character codes rather +// than characters, and because operator parsing has been inlined +// into it. +// +// All in the name of speed. +// +pp$8.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { return this.readNumber(true) } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.' + this.pos += 3; + return this.finishToken(types.ellipsis) + } else { + ++this.pos; + return this.finishToken(types.dot) + } +}; + +pp$8.readToken_slash = function() { // '/' + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { ++this.pos; return this.readRegexp() } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.slash, 1) +}; + +pp$8.readToken_mult_modulo_exp = function(code) { // '%*' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types.star : types.modulo; + + // exponentiation operator ** and **= + if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { + ++size; + tokentype = types.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + + if (next === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(tokentype, size) +}; + +pp$8.readToken_pipe_amp = function(code) { // '|&' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { return this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2) } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1) +}; + +pp$8.readToken_caret = function() { // '^' + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.bitwiseXOR, 1) +}; + +pp$8.readToken_plus_min = function(code) { // '+-' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && + (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + // A `-->` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) +}; + +pp$8.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `` line comment - this.skipLineComment(3); - this.skipSpace(); - return this.nextToken() - } - return this.finishOp(types.incDec, 2) - } - if (next === 61) { return this.finishOp(types.assign, 2) } - return this.finishOp(types.plusMin, 1) -}; - -pp$8.readToken_lt_gt = function(code) { // '<>' - var next = this.input.charCodeAt(this.pos + 1); - var size = 1; - if (next === code) { - size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; - if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } - return this.finishOp(types.bitShift, size) - } - if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && - this.input.charCodeAt(this.pos + 3) === 45) { - // ` + + + + + + + + + + + + + +
    + +

    GpuMatrix

    + + + + + + + +
    + +
    + +

    + GpuMatrix +

    + +
    GpuMatrix applicative providing standard matrix operations
    + + +
    + +
    +
    + + +
    + + +

    Constructor

    + + +

    new GpuMatrix()

    + + +

    The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.

    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + + + + + +
    See:
    +
    +
      +
    • of
    • +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    Example
    + +
    const gpu = new GPU()
    +const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
    + +
    + +
    + +
    + + + + + + + + + + + + +

    Members

    + + + +
    +

    gpuFold

    + + + + +
    + Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + +
    Example
    + +
    const m = GpuMatrix.of([[1, 1], [1, 1]])
    +m.map(x => x.map(y => y+ 1))
    +// [[2, 2], [2, 2]]
    + + +
    + + + +
    +

    gpuMap

    + + + + +
    + Maps over the rows of the GpuMatrix using a map function using the GPU +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + +
    Example
    + +
    function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
    +const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS)
    +m.gpuMap(gpuMapper)
    +// [Float32Array(2,2), Float32Array(2,2)]
    + + +
    + + + + + +

    Methods

    + + + +
    + + + +

    (static) gpuMap(f, M) → {GpuMatrix}

    + + + + + +
    + Static function that maps over the rows of the GpuMatrix using a map function using the GPU +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    f + + +function + + + + + An GPU.js enabled iterator function + +
    M + + +GpuMatrix +| + +array + + + + + GpuMatrix or array to map + +
    + + + + + + + + + + + + + + +
    +
    Returns:
    + + + +
    +
    + Type: +
    +
    + +GpuMatrix + + +
    +
    + + + +
    + + + +
    +
    Example
    + +
    function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
    +const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])
    +// [Float32Array(2,2), Float32Array(2,2)]
    + +
    + +
    + + +
    + + + +

    (static) of(val, GPUJS) → {GpuMatrix}

    + + + + + +
    + Creates a GpuMatrix object and flattens the GpuMatrix +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    val + + +array +| + +function + + + + + An array of arrays + +
    GPUJS + + +Object + + + + + + +
    + + + + + + + + + + + + + + +
    +
    Returns:
    + + + +
    +
    + Type: +
    +
    + +GpuMatrix + + +
    +
    + + + +
    + + + +
    +
    Example
    + +
    const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
    + +
    + +
    + + +
    + + + +

    gpuProduct(f, output, M) → {GpuMatrix}

    + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    f + + + + +
    output + + + + +
    M + + + + +
    + + + + + + + + + + + + + + +
    +
    Returns:
    + + + +
    +
    + Type: +
    +
    + +GpuMatrix + + +
    +
    + + + +
    + + + +
    + + + + + + +
    + +
    + + + + +
    + +
    + +
    + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme. +
    + + + + + \ No newline at end of file diff --git a/docs/Matrix.html b/docs/Matrix.html index 87c9d9c..f6d008b 100644 --- a/docs/Matrix.html +++ b/docs/Matrix.html @@ -24,7 +24,7 @@
    @@ -101,7 +101,7 @@

    new MatrixSource:
    @@ -210,7 +210,7 @@

    additi
    Source:
    @@ -281,7 +281,7 @@

    apSource:
    @@ -353,7 +353,7 @@

    cloneSource:
    @@ -413,7 +413,7 @@

    combineSource:
    @@ -484,7 +484,7 @@

    concatSource:
    @@ -558,7 +558,7 @@

    diagSource:
    @@ -631,7 +631,7 @@

    diagproduc
    Source:
    @@ -700,7 +700,7 @@

    dimensionSource:
    @@ -771,7 +771,7 @@

    dotSource:
    @@ -848,7 +848,7 @@

    emptySource:
    @@ -908,7 +908,7 @@

    equalsSource:
    @@ -980,7 +980,7 @@

    fillSource:
    @@ -1050,7 +1050,7 @@

    foldSource:
    @@ -1121,7 +1121,7 @@

    fromArraySource:
    @@ -1181,7 +1181,7 @@

    getColsSource:
    @@ -1247,7 +1247,7 @@

    getRowsSource:
    @@ -1313,7 +1313,7 @@

    getShapeSource:
    @@ -1336,130 +1336,6 @@
    Example
    A.getShape() // [2, 2]

    -
    - - - -
    -

    gpu :Object

    - - - - - - - - -
    Properties:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    gpu - - -Object - - - -
    - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - -
    @@ -1507,7 +1383,7 @@

    gpuFoldSource:
    @@ -1578,7 +1454,7 @@

    gpuMapSource:
    @@ -1646,7 +1522,7 @@

    hadamardSource:
    @@ -1725,7 +1601,7 @@

    identitySource:
    @@ -1793,7 +1669,7 @@

    inverseSource:
    @@ -1859,7 +1735,7 @@

    isOrthogo
    Source:
    @@ -1930,7 +1806,7 @@

    isSquareSource:
    @@ -1996,7 +1872,7 @@

    isSymmetri
    Source:
    @@ -2066,7 +1942,7 @@

    kroneckerSource:
    @@ -2130,7 +2006,7 @@

    luSource:
    @@ -2204,7 +2080,7 @@

    mapSource:
    @@ -2275,7 +2151,7 @@

    multiplySource:
    @@ -2347,7 +2223,7 @@

    onesSource:
    @@ -2467,7 +2343,7 @@
    Properties:
    Source:
    @@ -2547,7 +2423,7 @@

    randomSource:
    @@ -2607,7 +2483,7 @@

    rankSource:
    @@ -2667,7 +2543,7 @@

    rrefSource:
    @@ -2733,7 +2609,7 @@

    setPrecis
    Source:
    @@ -2800,7 +2676,7 @@

    solveSource:
    @@ -2873,7 +2749,7 @@

    subtractSource:
    @@ -2945,7 +2821,7 @@

    sumSource:
    @@ -3018,7 +2894,7 @@

    toArraySource:
    @@ -3082,7 +2958,7 @@

    transposeSource:
    @@ -3203,7 +3079,7 @@
    Properties:
    Source:
    @@ -3283,7 +3159,7 @@

    zerosSource:
    @@ -3363,7 +3239,7 @@

    (static) apSource:
    @@ -3553,7 +3429,7 @@

    (static) comb
    Source:
    @@ -3711,7 +3587,7 @@

    (static) conca
    Source:
    @@ -3905,7 +3781,7 @@

    (static) diagSource:
    @@ -4072,7 +3948,7 @@

    (static)
    Source:
    @@ -4239,7 +4115,7 @@

    (static) dotSource:
    @@ -4403,7 +4279,7 @@

    (static) empty<
    Source:
    @@ -4585,7 +4461,7 @@

    (static) foldSource:
    @@ -4778,7 +4654,7 @@

    (static) gpuMa
    Source:
    @@ -4972,7 +4848,7 @@

    (static) ide
    Source:
    @@ -5084,7 +4960,7 @@

    (static) kr
    Source:
    @@ -5266,7 +5142,7 @@

    (static) mapSource:
    @@ -5459,7 +5335,7 @@

    (static) ofSource:
    @@ -5625,7 +5501,7 @@

    (static) onesSource:
    @@ -5815,7 +5691,7 @@

    (static) rando
    Source:
    @@ -6023,7 +5899,7 @@

    (static) sumSource:
    @@ -6190,7 +6066,7 @@

    (static) tr
    Source:
    @@ -6358,7 +6234,7 @@

    (static) zeros<
    Source:
    @@ -6544,7 +6420,7 @@

    addSource:
    @@ -6665,6 +6541,195 @@
    Example

+ +
+ + + +

gpuProduct(f, output, M) → {Matrix}

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
f + + + + +
output + + + + +
M + + + + +
+ + + + + + + + + + + + + + +
+
Returns:
+ + + +
+
+ Type: +
+
+ +Matrix + + +
+
+ + + +
+ + + +
+ @@ -6682,7 +6747,7 @@
Example

- Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
diff --git a/docs/global.html b/docs/global.html index 2664164..0e0a30f 100644 --- a/docs/global.html +++ b/docs/global.html @@ -24,7 +24,7 @@
@@ -1235,7 +1235,7 @@
Returns:

- Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
diff --git a/docs/gpumatrix.js.html b/docs/gpumatrix.js.html new file mode 100644 index 0000000..93b0ebb --- /dev/null +++ b/docs/gpumatrix.js.html @@ -0,0 +1,185 @@ + + + + + + gpumatrix.js - Documentation + + + + + + + + + + + + + + + + + +
+ +

gpumatrix.js

+ + + + + + + +
+
+
import Matrix from './Matrix'
+import curry from 'fun.js/src/curry'
+import gpumap from 'util/gpumap'
+import gpufold from 'util/gpufold'
+import gpuproduct from 'util/gpuproduct'
+
+/**
+ * @class GpuMatrix
+ * @classdesc GpuMatrix applicative providing standard matrix operations
+ * @summary The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden.
+ * @hidecontructor
+ * @see of
+ * @example
+ *
+ * const gpu = new GPU()
+ * const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
+ *
+ */
+class GpuMatrix extends Matrix {
+  constructor (val, GPUJS) {
+    super()
+    if (GPUJS) {
+      this.gpujs = GPUJS || null
+    }
+  }
+}
+
+/**
+ * @memberOf GpuMatrix
+ * @static
+ * @function GpuMatrix.of
+ * @desc Creates a GpuMatrix object and flattens the GpuMatrix
+ * @param val {array|function} An array of arrays
+ * @param GPUJS {Object}
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * const m =  GpuMatrix.of([[1,2],[2,3],[4,5]], gpu)
+ *
+ */
+GpuMatrix.of = function (val, GPUJS = null) {
+  if (val instanceof GpuMatrix) return val
+  if (this instanceof GpuMatrix) {
+    this.__value = val
+    this.gpujs = GPUJS
+    return this
+  }
+  return new GpuMatrix(val, GPUJS)
+}
+
+//* ***********************/
+// GPU Functions
+//* ***********************/
+
+/**
+ * @memberOf GpuMatrix
+ * @instance
+ * @member gpuMap
+ * @description Maps over the rows of the GpuMatrix using a map function using the GPU
+ * @param f {function} An GPU.js enabled iterator function
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+ * const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS)
+ * m.gpuMap(gpuMapper)
+ * // [Float32Array(2,2), Float32Array(2,2)]
+ *
+ *
+ */
+GpuMatrix.prototype.gpuMap = function (f) {
+  return GpuMatrix.of(gpumap(this.gpujs, f, this.__value))
+}
+
+/**
+ * @memberOf GpuMatrix
+ * @static
+ * @function gpuMap
+ * @description Static function that maps over the rows of the GpuMatrix using a map function using the GPU
+ * @param f {function} An GPU.js enabled iterator function
+ * @param M {GpuMatrix|array} GpuMatrix or array to map
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * function gpuMapper (a) { return a[this.thread.y][this.thread.x] }
+ * const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]])
+ * // [Float32Array(2,2), Float32Array(2,2)]
+ *
+ */
+GpuMatrix.gpuMap = curry(function (gpu, f, M) {
+  return GpuMatrix.of(M, gpu).gpuMap(f)
+})
+
+/**
+ * @memberOf GpuMatrix
+ * @instance
+ * @member gpuFold
+ * @description Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU
+ * @param f {function} An iterator function
+ * @returns {GpuMatrix}
+ * @example
+ *
+ * const m = GpuMatrix.of([[1, 1], [1, 1]])
+ * m.map(x => x.map(y => y+ 1))
+ * // [[2, 2], [2, 2]]
+ *
+ */
+GpuMatrix.prototype.gpuFold = function (f, output) {
+  return GpuMatrix.of(gpufold(this.gpujs, f, output, this.__value))
+}
+
+/**
+ * @memberOf GpuMatrix
+ * @function GpuMatrix#gpuProduct
+ * @param f
+ * @param output
+ * @param M
+ * @returns {GpuMatrix}
+ */
+GpuMatrix.prototype.gpuProduct = function (f, output, M) {
+  // (gpu, f, output, a, b, constants = {}
+  return GpuMatrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value))
+}
+
+export default GpuMatrix
+
+
+
+ + + + +
+ +
+ +
+ Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme. +
+ + + + + diff --git a/docs/index.html b/docs/index.html index 1329c3f..b0a555f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,7 +24,7 @@
@@ -113,7 +113,7 @@

Methods and properties


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/matrix.js.html b/docs/matrix.js.html index 4000266..8c3023c 100644 --- a/docs/matrix.js.html +++ b/docs/matrix.js.html @@ -24,7 +24,7 @@
    @@ -51,6 +51,7 @@

    matrix.js

    import generate from 'util/generate' import gpumap from 'util/gpumap' import gpufold from 'util/gpufold' +import gpuproduct from 'util/gpuproduct' /** * @class Matrix @@ -66,7 +67,7 @@

    matrix.js

    let Matrix = function (val, GPUJS) { this.__value = val if (GPUJS) { - this.gpujs = GPUJS ? new GPUJS() : null + this.gpujs = GPUJS || null } } @@ -82,14 +83,14 @@

    matrix.js

    * const m = Matrix.of([[1,2],[2,3],[4,5]]) * */ -Matrix.of = function (val, GPUJS = null) { +Matrix.of = function (val) { if (val instanceof Matrix) return val if (this instanceof Matrix) { this.__value = val this.gpujs = GPUJS return this } - return new Matrix(val, GPUJS) + return new Matrix(val) } /** @@ -103,13 +104,6 @@

    matrix.js

    */ Matrix.prototype.type = 'Matrix' -/** - * @memberOf Matrix - * @property {Object} gpu - * @type {Object} - */ -Matrix.prototype.gpu = {} - /** * @memberOf Matrix * @property {number} precision @@ -1224,8 +1218,17 @@

    matrix.js

    return Matrix.of(gpufold(this.gpujs, f, output, this.__value)) } +/** + * @memberOf Matrix + * @function Matrix#gpuProduct + * @param f + * @param output + * @param M + * @returns {Matrix} + */ Matrix.prototype.gpuProduct = function (f, output, M) { - return Matrix.of(gpufold(this.gpujs, f, output, [this.__value, M])) + // (gpu, f, output, a, b, constants = {} + return Matrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value)) } export default Matrix @@ -1241,7 +1244,7 @@

    matrix.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_concat.js.html b/docs/util_concat.js.html index 34d61e6..9e7484c 100644 --- a/docs/util_concat.js.html +++ b/docs/util_concat.js.html @@ -24,7 +24,7 @@
    @@ -63,7 +63,7 @@

    util/concat.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_dot.js.html b/docs/util_dot.js.html index 8b5424f..66bcab8 100644 --- a/docs/util_dot.js.html +++ b/docs/util_dot.js.html @@ -24,7 +24,7 @@
    @@ -66,7 +66,7 @@

    util/dot.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_generate.js.html b/docs/util_generate.js.html index 07769f6..0683837 100644 --- a/docs/util_generate.js.html +++ b/docs/util_generate.js.html @@ -24,7 +24,7 @@
    @@ -65,7 +65,7 @@

    util/generate.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_identity.js.html b/docs/util_identity.js.html index 3ea9dad..0a65a40 100644 --- a/docs/util_identity.js.html +++ b/docs/util_identity.js.html @@ -24,7 +24,7 @@
    @@ -61,7 +61,7 @@

    util/identity.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_round.js.html b/docs/util_round.js.html index 6725c78..0acfb18 100644 --- a/docs/util_round.js.html +++ b/docs/util_round.js.html @@ -24,7 +24,7 @@
    @@ -60,7 +60,7 @@

    util/round.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/docs/util_transpose.js.html b/docs/util_transpose.js.html index 0ca17b3..4d95c8e 100644 --- a/docs/util_transpose.js.html +++ b/docs/util_transpose.js.html @@ -24,7 +24,7 @@
    @@ -61,7 +61,7 @@

    util/transpose.js


    - Generated by JSDoc 3.5.5 on Sun May 19 2019 14:49:03 GMT+0200 (Central European Summer Time) using the Minami theme. + Generated by JSDoc 3.5.5 on Tue May 21 2019 22:35:00 GMT+0200 (Central European Summer Time) using the Minami theme.
    diff --git a/lib/@astuanax/funmatrix.js b/lib/@astuanax/funmatrix.js index b1d12c4..b50560b 100644 --- a/lib/@astuanax/funmatrix.js +++ b/lib/@astuanax/funmatrix.js @@ -91,7 +91,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/matrix.js"); +/******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ @@ -3950,12 +3950,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * const m = Matrix.of([[1,2],[2,3],[4,5]]) * */ -var Matrix = function Matrix(val, GPUJS) { - this.__value = val; - - if (GPUJS) { - this.gpujs = GPUJS ? new GPUJS() : null; - } +var Matrix = function Matrix(val) { + this.__value = val; // if (GPUJS) { + // this.gpujs = GPUJS || null + // } }; /** * @memberOf Matrix @@ -3972,16 +3970,14 @@ var Matrix = function Matrix(val, GPUJS) { Matrix.of = function (val) { - var GPUJS = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; if (val instanceof Matrix) return val; if (this instanceof Matrix) { this.__value = val; - this.gpujs = GPUJS; return this; } - return new Matrix(val, GPUJS); + return new Matrix(val); }; /** * @memberOf Matrix @@ -3995,13 +3991,6 @@ Matrix.of = function (val) { Matrix.prototype.type = 'Matrix'; -/** - * @memberOf Matrix - * @property {Object} gpu - * @type {Object} - */ - -Matrix.prototype.gpu = {}; /** * @memberOf Matrix * @property {number} precision @@ -5239,9 +5228,19 @@ Matrix.gpuMap = (0, _curry.default)(function (gpu, f, M) { Matrix.prototype.gpuFold = function (f, output) { return Matrix.of((0, _gpufold.default)(this.gpujs, f, output, this.__value)); }; +/** + * @memberOf Matrix + * @function Matrix#gpuProduct + * @param f + * @param output + * @param M + * @returns {Matrix} + */ + Matrix.prototype.gpuProduct = function (f, output, M) { - return Matrix.of((0, _gpuproduct.default)(this.gpujs, f, output, this.__value, M)); + // (gpu, f, output, a, b, constants = {} + return Matrix.of((0, _gpuproduct.default)(this.gpujs, f, output, this.__value, M.__value)); }; var _default = Matrix; @@ -5459,12 +5458,13 @@ module.exports = exports["default"]; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = gpudot; +exports.default = gpuproduct; -function gpudot(gpu, f, output, a, b) { +function gpuproduct(gpu, f, output, a, b) { var constants = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; return gpu.createKernel(f, { constants: Object.assign({}, { + m: b.length, n: a[0].length }, constants) }).setOutput(output)(a, b); @@ -5571,8 +5571,20 @@ var _default = (0, _fun.curry)(function (prev, next) { exports.default = _default; module.exports = exports["default"]; +/***/ }), + +/***/ 0: +/*!*****************************!*\ + !*** multi ./src/matrix.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! /Volumes/BigOne/github/funMatrix/src/matrix.js */"./src/matrix.js"); + + /***/ }) /******/ }); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9fcHJpdmF0ZS9jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkanVzdFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWxsUGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWx3YXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FueS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55UGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS90by5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9GLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9ib29sZWFuL1QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vYm90aC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9kaWZmRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc0Z1dHVyZURhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0RheS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0hvdXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9NaW51dGVzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvU2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmluZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maXJzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmxhdE1hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9rZXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9sYXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9saWZ0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL0p1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL25vdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVsbC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2FkZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2RpdmlkZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvaXNOYW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9tdWx0aXBseS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2tleXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21lcmdlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb3IuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3NldC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2Zvcm1hdFN0cmluZy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvemlwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy96aXBXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2RvdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dlbmVyYXRlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVmb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVtYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dwdXByb2R1Y3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9yb3VuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIl0sIm5hbWVzIjpbIk1hdHJpeCIsInZhbCIsIkdQVUpTIiwiX192YWx1ZSIsImdwdWpzIiwib2YiLCJwcm90b3R5cGUiLCJ0eXBlIiwiZ3B1IiwicHJlY2lzaW9uIiwic2V0UHJlY2lzaW9uIiwiaXNTeW1tZXRyaWMiLCJhIiwiYiIsInRyYW5zcG9zZSIsImlzU3F1YXJlIiwiZ2V0Q29scyIsImdldFJvd3MiLCJpc09ydGhvZ29uYWwiLCJBeEF0IiwiZG90IiwiSSIsImlkZW50aXR5IiwibGVuZ3RoIiwiZXF1YWxzIiwiTSIsImdldFNoYXBlIiwibWFwIiwiZiIsImZvbGQiLCJhcCIsImNvbmNhdCIsIkEiLCJCIiwiZW1wdHkiLCJyb3dzIiwiY29scyIsIm0iLCJjb21iaW5lIiwiZmlsbCIsIngiLCJ6ZXJvcyIsIm9uZXMiLCJyYW5kb20iLCJlIiwiTWF0aCIsInRvQXJyYXkiLCJyb3ciLCJjb2wiLCJjbG9uZSIsImZyb21BcnJheSIsImFyciIsImFkZCIsIkVycm9yIiwiaWR4IiwiamR4Iiwic3VidHJhY3QiLCJtdWx0aXBseSIsImNvbnNvbGUiLCJsb2ciLCJhZGRpdGl2ZWludmVyc2UiLCJoYWRhbWFyZCIsImx1IiwibiIsInRvbCIsIkwiLCJVIiwiayIsImFicyIsImkiLCJqIiwibCIsInJyZWYiLCJsZWFkIiwicmVzdWx0TWF0cml4IiwiciIsInRtcCIsInNvbHZlIiwiTFUiLCJzIiwiYyIsInQiLCJpbnZlcnNlIiwiSW52IiwicmVzdWx0IiwicmVkdWNlIiwiaGFsZiIsInB1c2giLCJzbGljZSIsInJhbmsiLCJkaW1lbnNpb24iLCJkaWFnIiwiYWNjIiwiZGlhZ3Byb2R1Y3QiLCJzdW0iLCJwcmV2IiwibmV4dCIsImtyb25lY2tlciIsInAiLCJxIiwibGVmdCIsInJpZ2h0IiwiZnJhbWUiLCJncHVNYXAiLCJncHVGb2xkIiwib3V0cHV0IiwiZ3B1UHJvZHVjdCIsImRlY2ltYWxzIiwiaXRlbSIsInVuZGVmaW5lZCIsInZhbHVlIiwiX2NvbHMiLCJ5IiwieiIsIkFycmF5IiwiZ3B1Zm9sZCIsIm1hdHJpeCIsImNvbnN0YW50cyIsImNyZWF0ZUtlcm5lbCIsIk9iamVjdCIsImFzc2lnbiIsInNldE91dHB1dCIsImdwdW1hcCIsImdwdWRvdCIsInJvdW5kIiwiTnVtYmVyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDYkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLE1BQU07QUFDakI7QUFDQTtBQUMyQjs7QUFFWixxSEFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDbkJGO0FB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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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VyxvQkFBb0I7QUFDL0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxpQ0FBaUM7QUFDNUMsV0FBVyxxQ0FBcUM7QUFDaEQsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVywyQkFBMkI7QUFDdEMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxvQkFBb0I7QUFDYztBQUNHO0FBQ0o7QUFDUTtBQUNkO0FBQ1E7QUFDRjtBQUNOO0FBQ0E7QUFDUTtBQUNWO0FBQ1E7QUFDRjtBQUNFO0FBQ0o7QUFDUTtBQUNSO0FBQ1k7QUFDTjtBQUNGO0FBQ0o7QUFDRTtBQUNRO0FBQ0c7QUFDRjtBQUNUO0FBQ0U7QUFDQTtBQUNGO0FBQ0U7QUFDTTtBQUNSO0FBQ0k7QUFDTjtBQUN1QjtBQUNsQjtBQUNJO0FBQ0M7QUFDRjtBQUNaO0FBQ1c7QUFDSTtBQUNOO0FBQ0M7QUFDZTtBQUNsQjtBQUNNO0FBQ0o7QUFDSTtBQUNBO0FBQ047QUFDTTtBQUNNO0FBQ0E7QUFDUjtBQUNQO0FBQ1c7QUFDWDtBQUNBO0FBQ0Y7QUFDQTtBQUNXO0FBQ0E7QUFDTTtBQUNqQjtBQUNlO0FBQ047QUFDWDtBQUNXO0FBQ0E7QUFDQTtBQUNGO0FBQ0g7QUFDSztBQUNFO0FBQ007QUFDQTtBQUNYO0FBQ0o7QUFDUTtBQUNHO0FBQ2I7QUFDUTs7Ozs7Ozs7Ozs7OztBQ3ZSOUM7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFMkI7QUFDRjs7QUFFVixxSEFBSztBQUNwQixTQUFTLHFEQUFJO0FBQ2IsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDWEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUMyQjtBQUNFO0FBQ0E7O0FBRWQ7QUFDZixTQUFTLHVEQUFNLE9BQU8sdURBQU0sSUFBSSxzREFBSztBQUNyQzs7Ozs7Ozs7Ozs7OztBQ1hBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNzQjtBQUN0QixtQkFBbUIsbURBQUU7O0FBRU47QUFDZjtBQUNBOzs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsRUFBRTtBQUN2QyxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFlBQVk7QUFDWjtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBLHVDQUF1Qyx5QkFBeUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDbEJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDMkI7QUFDVztBQUNOO0FBQ1A7O0FBRVYscUhBQUs7QUFDcEIsVUFBVSxxREFBSTtBQUNkO0FBQ0EsYUFBYSx5REFBTztBQUNwQjtBQUNBLGFBQWEsNERBQVU7QUFDdkI7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUN0QkY7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDc0M7O0FBRXZCLDhIQUFNO0FBQ3JCO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDVEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkI7QUFDVztBQUNiO0FBQ0o7QUFDRTs7QUFFUixxSEFBSztBQUNwQixpQkFBaUIsK0RBQU0sQ0FBQyxzREFBSztBQUM3QixTQUFTLHNEQUFLO0FBQ2QsV0FBVyxxREFBSSxDQUFDLDJDQUFFLEVBQUUsb0RBQUc7QUFDdkIsR0FBRztBQUNILENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2xCRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsWUFBWTtBQUNaO0FBQzJCO0FBQ087QUFDRTtBQUNOO0FBQ007QUFDSTtBQUNmO0FBQ2E7O0FBRXZCLHFIQUFLO0FBQ3BCLFVBQVUscURBQUk7QUFDZDtBQUNBLGFBQWEsc0RBQUs7QUFDbEI7QUFDQSxPQUFPO0FBQ1A7QUFDQSxhQUFhLDJEQUFTO0FBQ3RCO0FBQ0EsYUFBYSwyREFBUztBQUN0QjtBQUNBLGFBQWEsd0RBQU07QUFDbkI7QUFDQSxhQUFhLDBEQUFRO0FBQ3JCO0FBQ0EsYUFBYSw0REFBVTtBQUN2QixVQUFVLDZEQUFXO0FBQ3JCLFVBQVUsMERBQVE7QUFDbEI7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUN2Q0Y7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNEI7O0FBRWIscUhBQUs7QUFDcEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDOUJGO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDc0I7O0FBRVAsa0hBQUUsT0FBTzs7Ozs7Ozs7Ozs7OztBQ0x4QjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFlBQVk7QUFDWjtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2JGO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsRUFBRTtBQUN2QyxXQUFXLFNBQVM7QUFDcEIsV0FBVyxJQUFJO0FBQ2YsWUFBWTtBQUNaO0FBQzRCO0FBQ0E7O0FBRWIscUhBQUs7QUFDcEIsWUFBWSxzREFBSztBQUNqQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDbkJGO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsWUFBWTtBQUNaO0FBQzJCOztBQUVaLHFIQUFLO0FBQ3BCO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDYkY7QUFBQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZSxtRUFBSTs7Ozs7Ozs7Ozs7OztBQ2xCbkI7QUFBQTtBQUFBO0FBQXlCO0FBQ007O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxnREFBTztBQUNwQjs7QUFFQTtBQUNBLGFBQWEsNkNBQUk7QUFDakI7O0FBRWUsb0VBQUs7Ozs7Ozs7Ozs7Ozs7QUNwRHBCO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZSxzRUFBTzs7Ozs7Ozs7Ozs7OztBQ2R0QjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQzJCOztBQUVaLHFIQUFLO0FBQ3BCO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDUEY7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNzQjs7QUFFUCxrSEFBRSxRQUFROzs7Ozs7Ozs7Ozs7O0FDTHpCO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQzRCOztBQUViLHFIQUFLO0FBQ3BCO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDZkY7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDNEI7O0FBRWIscUhBQUs7QUFDcEI7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNmRjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ3NCOztBQUVQLGtIQUFFLFVBQVU7Ozs7Ozs7Ozs7Ozs7QUNMM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDMkI7QUFDSDs7QUFFVDtBQUNmLFNBQVMsb0RBQUcsQ0FBQyxtREFBUTtBQUNyQjs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2RGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFlBQVk7QUFDWjtBQUM0QjtBQUNMO0FBQ0c7O0FBRVgscUhBQUs7QUFDcEIsU0FBUyxxREFBSSxDQUFDLDRDQUFHO0FBQ2pCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2ZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDNEI7QUFDRTtBQUNOO0FBQ007O0FBRWYscUhBQUs7QUFDcEI7QUFDQTtBQUNBLFFBQVEsb0RBQUcsQ0FBQyx1REFBTTtBQUNsQjs7QUFFQTtBQUNBLFFBQVEsb0RBQUcsQ0FBQyx1REFBTSxjQUFjLHVEQUFNO0FBQ3RDOztBQUVBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDckJGO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNEI7QUFDSDs7QUFFVixxSEFBSztBQUNwQjtBQUNBLFlBQVkscURBQUk7QUFDaEIsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDZkY7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM0QjtBQUNIOztBQUVWLHFIQUFLO0FBQ3BCLFlBQVkscURBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNqQkY7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE9BQU8sS0FBSyxPQUFPO0FBQzVCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQzRCOztBQUViLHFIQUFLO0FBQ3BCO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDZEY7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE9BQU8sS0FBSyxPQUFPO0FBQzVCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQzRCOztBQUViLHFIQUFLO0FBQ3BCO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDZEY7QUFBQTtBQUFBOztBQUVBO0FBQ3NCOztBQUVQLGtIQUFFLFVBQVU7Ozs7Ozs7Ozs7Ozs7QUNMM0I7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxZQUFZO0FBQ1o7QUFDNEI7O0FBRWIscUhBQUs7QUFDcEI7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNiRjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFlBQVk7QUFDWjtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDakJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxFQUFFO0FBQ3ZDLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQzRCO0FBQ0E7QUFDSDs7QUFFVixxSEFBSztBQUNwQixZQUFZLHFEQUFJO0FBQ2hCO0FBQ0E7QUFDQSxZQUFZLHNEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDdkJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUM0QjtBQUNRO0FBQ0Q7QUFDRjtBQUNDOztBQUVsQyxjQUFjLHNEQUFLO0FBQ25CLCtCQUErQjs7QUFFL0IsTUFBTSwwREFBUztBQUNmLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLDBEQUFRLGNBQWMsMERBQVE7QUFDdEM7QUFDQSxLQUFLLFVBQVUseURBQU87QUFDdEIsb0JBQW9CLDREQUFLO0FBQ3pCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRWMsb0VBQUs7Ozs7Ozs7Ozs7Ozs7QUNuQ3BCO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDNEI7O0FBRWIscUhBQUs7QUFDcEI7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2hCRjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQzRCOztBQUViLHFIQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUM7QUFDRjtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7Ozs7Ozs7Ozs7O0FDM0JKO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNuQkY7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ1BGO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTtBQUN1QztBQUNkOztBQUVWLDhIQUFNO0FBQ3JCLFlBQVkscURBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3BCRjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMkI7O0FBRVoscUhBQUs7QUFDcEI7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNSRjtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ3NCOztBQUVQLGtIQUFFLE9BQU87Ozs7Ozs7Ozs7Ozs7QUNMeEI7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVlLHdCQUF3QjtBQUN2QztBQUNBOzs7Ozs7Ozs7Ozs7O0FDUEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNpQztBQUNUO0FBQ0Y7O0FBRVAsNkJBQTZCO0FBQzVDLGFBQWEseURBQU87O0FBRXBCO0FBQ0EsdUJBQXVCLE1BQU07QUFDN0IsV0FBVyxvREFBRyxDQUFDLG1EQUFFO0FBQ2pCLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7OztBQ2RBO0FBQUE7QUFBQTs7QUFFQTtBQUNzQjs7QUFFUCxrSEFBRSxVQUFVOzs7Ozs7Ozs7Ozs7O0FDTDNCO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFlBQVk7QUFDWjtBQUM0Qjs7QUFFYixxSEFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3BCRjtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDNkI7O0FBRWQ7QUFDZiwwQkFBMEIsdURBQU07QUFDaEM7Ozs7Ozs7Ozs7Ozs7QUNQQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ3NDOztBQUV2Qiw4SEFBTTtBQUNyQjtBQUNBLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ1BGO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDc0I7O0FBRVAsa0hBQUUsYUFBYTs7Ozs7Ozs7Ozs7OztBQ0w5QjtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUMyQjtBQUNJOztBQUVoQixxSEFBSztBQUNwQixTQUFTLHdEQUFPLDJCQUEyQixnQkFBZ0I7QUFDM0QsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDWEY7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQzJCOztBQUVaLHFIQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEJGOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUE7Ozs7Ozs7Ozs7O0FBV0EsSUFBSUEsTUFBTSxHQUFHLFNBQVRBLE1BQVMsQ0FBVUMsR0FBVixFQUFlQyxLQUFmLEVBQXNCO0FBQ2pDLE9BQUtDLE9BQUwsR0FBZUYsR0FBZjs7QUFDQSxNQUFJQyxLQUFKLEVBQVc7QUFDVCxTQUFLRSxLQUFMLEdBQWFGLEtBQUssR0FBRyxJQUFJQSxLQUFKLEVBQUgsR0FBaUIsSUFBbkM7QUFDRDtBQUNGLENBTEQ7QUFPQTs7Ozs7Ozs7Ozs7Ozs7QUFZQUYsTUFBTSxDQUFDSyxFQUFQLEdBQVksVUFBVUosR0FBVixFQUE2QjtBQUFBLE1BQWRDLEtBQWMsdUVBQU4sSUFBTTtBQUN2QyxNQUFJRCxHQUFHLFlBQVlELE1BQW5CLEVBQTJCLE9BQU9DLEdBQVA7O0FBQzNCLE1BQUksZ0JBQWdCRCxNQUFwQixFQUE0QjtBQUMxQixTQUFLRyxPQUFMLEdBQWVGLEdBQWY7QUFDQSxTQUFLRyxLQUFMLEdBQWFGLEtBQWI7QUFDQSxXQUFPLElBQVA7QUFDRDs7QUFDRCxTQUFPLElBQUlGLE1BQUosQ0FBV0MsR0FBWCxFQUFnQkMsS0FBaEIsQ0FBUDtBQUNELENBUkQ7QUFVQTs7Ozs7Ozs7Ozs7QUFTQUYsTUFBTSxDQUFDTSxTQUFQLENBQWlCQyxJQUFqQixHQUF3QixRQUF4QjtBQUVBOzs7Ozs7QUFLQVAsTUFBTSxDQUFDTSxTQUFQLENBQWlCRSxHQUFqQixHQUF1QixFQUF2QjtBQUVBOzs7Ozs7Ozs7O0FBU0FSLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQkcsU0FBakIsR0FBNkIsQ0FBN0I7QUFFQTs7Ozs7Ozs7Ozs7O0FBV0FULE1BQU0sQ0FBQ00sU0FBUCxDQUFpQkksWUFBakIsR0FBZ0MsVUFBVUQsU0FBVixFQUFxQjtBQUNuRCxPQUFLQSxTQUFMLEdBQWlCQSxTQUFqQjtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7OztBQVdBVCxNQUFNLENBQUNNLFNBQVAsQ0FBaUJLLFdBQWpCLEdBQStCLFlBQVk7QUFDekMsTUFBTUMsQ0FBQyxHQUFHLEtBQUtULE9BQWY7O0FBQ0EsTUFBTVUsQ0FBQyxHQUFHYixNQUFNLENBQUNjLFNBQVAsQ0FBaUIsSUFBakIsRUFBdUJYLE9BQWpDOztBQUNBLFNBQU8scUJBQU9TLENBQVAsRUFBVUMsQ0FBVixDQUFQO0FBQ0QsQ0FKRDtBQU1BOzs7Ozs7Ozs7Ozs7OztBQVlBYixNQUFNLENBQUNNLFNBQVAsQ0FBaUJTLFFBQWpCLEdBQTRCLFlBQVk7QUFDdEMsU0FBTyxxQkFBTyxLQUFLQyxPQUFMLEVBQVAsRUFBdUIsS0FBS0MsT0FBTCxFQUF2QixDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7OztBQVlBakIsTUFBTSxDQUFDTSxTQUFQLENBQWlCWSxZQUFqQixHQUFnQyxZQUFZO0FBQzFDLE1BQU1DLElBQUksR0FBRyxLQUFLQyxHQUFMLENBQVMsS0FBS04sU0FBTCxFQUFULENBQWI7QUFDQSxNQUFNTyxDQUFDLEdBQUcsS0FBS0MsUUFBTCxFQUFWO0FBQ0EsU0FBTyxxQkFBT0gsSUFBUCxFQUFhRSxDQUFiLENBQVA7QUFDRCxDQUpEO0FBTUE7Ozs7Ozs7Ozs7Ozs7QUFXQXJCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQlUsT0FBakIsR0FBMkIsWUFBWTtBQUNyQyxTQUFPLEtBQUtiLE9BQUwsQ0FBYSxDQUFiLEVBQWdCb0IsTUFBdkI7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7OztBQWFBdkIsTUFBTSxDQUFDTSxTQUFQLENBQWlCa0IsTUFBakIsR0FBMEIsVUFBVUMsQ0FBVixFQUFhO0FBQ3JDLFNBQU8scUJBQU8sS0FBS3RCLE9BQVosRUFBcUJzQixDQUFDLENBQUN0QixPQUFGLElBQWFzQixDQUFsQyxDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7QUFVQXpCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQlcsT0FBakIsR0FBMkIsWUFBWTtBQUNyQyxTQUFPLEtBQUtkLE9BQUwsQ0FBYW9CLE1BQXBCO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7QUFVQXZCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQm9CLFFBQWpCLEdBQTRCLFlBQVk7QUFDdEMsU0FBTyxDQUFDLEtBQUtULE9BQUwsRUFBRCxFQUFpQixLQUFLRCxPQUFMLEVBQWpCLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQWhCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQnFCLEdBQWpCLEdBQXVCLFVBQVVDLENBQVYsRUFBYTtBQUNsQyxTQUFPNUIsTUFBTSxDQUFDSyxFQUFQLENBQVUsa0JBQUl1QixDQUFKLEVBQU8sS0FBS3pCLE9BQVosQ0FBVixDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7O0FBY0FILE1BQU0sQ0FBQzJCLEdBQVAsR0FBYSxvQkFBTSxVQUFVQyxDQUFWLEVBQWFILENBQWIsRUFBZ0I7QUFDakMsU0FBT3pCLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVb0IsQ0FBVixFQUFhRSxHQUFiLENBQWlCQyxDQUFqQixDQUFQO0FBQ0QsQ0FGWSxDQUFiO0FBSUE7Ozs7Ozs7Ozs7Ozs7O0FBYUE1QixNQUFNLENBQUNNLFNBQVAsQ0FBaUJ1QixJQUFqQixHQUF3QixVQUFVRCxDQUFWLEVBQWE7QUFDbkMsU0FBTzVCLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLG1CQUFLdUIsQ0FBTCxFQUFRLEVBQVIsRUFBWSxLQUFLekIsT0FBakIsQ0FBVixDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkFILE1BQU0sQ0FBQzZCLElBQVAsR0FBYyxvQkFBTSxVQUFVRCxDQUFWLEVBQWFILENBQWIsRUFBZ0I7QUFDbEMsU0FBT3pCLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVb0IsQ0FBVixFQUFhSSxJQUFiLENBQWtCRCxDQUFsQixDQUFQO0FBQ0QsQ0FGYSxDQUFkO0FBSUE7Ozs7Ozs7Ozs7Ozs7OztBQWNBNUIsTUFBTSxDQUFDTSxTQUFQLENBQWlCd0IsRUFBakIsR0FBc0IsVUFBVUwsQ0FBVixFQUFhO0FBQ2pDLFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVW9CLENBQVYsRUFBYUUsR0FBYixDQUFpQixLQUFLeEIsT0FBdEIsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7OztBQWNBSCxNQUFNLENBQUM4QixFQUFQLEdBQVksb0JBQU0sVUFBVUYsQ0FBVixFQUFhSCxDQUFiLEVBQWdCO0FBQ2hDLFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVXVCLENBQVYsRUFBYUUsRUFBYixDQUFnQkwsQ0FBaEIsQ0FBUDtBQUNELENBRlcsQ0FBWjtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkF6QixNQUFNLENBQUNNLFNBQVAsQ0FBaUJ5QixNQUFqQixHQUEwQixVQUFVTixDQUFWLEVBQXlCO0FBQUEsTUFBWkcsQ0FBWTtBQUNqRCxTQUFPNUIsTUFBTSxDQUFDSyxFQUFQLENBQVUsSUFBVixFQUFnQnNCLEdBQWhCLENBQW9CQyxDQUFDLENBQUNILENBQUQsQ0FBckIsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkF6QixNQUFNLENBQUMrQixNQUFQLEdBQWdCLG9CQUFNLFVBQVVDLENBQVYsRUFBYUMsQ0FBYixFQUE0QjtBQUFBLE1BQVpMLENBQVk7QUFDaEQsU0FBTzVCLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVMkIsQ0FBVixFQUFhTCxHQUFiLENBQWlCQyxDQUFDLENBQUNLLENBQUQsQ0FBbEIsQ0FBUDtBQUNELENBRmUsQ0FBaEI7QUFJQTs7Ozs7Ozs7QUFPQWpDLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQjRCLEtBQWpCLEdBQXlCLFlBQVk7QUFDbkMsU0FBT2xDLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLElBQVYsRUFBZ0JzQixHQUFoQixnQkFBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7QUFTQTNCLE1BQU0sQ0FBQ2tDLEtBQVAsR0FBZSxvQkFBTSxZQUE4QjtBQUFBLE1BQXBCQyxJQUFvQix1RUFBYixDQUFhO0FBQUEsTUFBVkMsSUFBVSx1RUFBSCxDQUFHO0FBQ2pELE1BQU1DLENBQUMsR0FBRyx1QkFBU0YsSUFBVCxFQUFlQyxJQUFmLENBQVYsQ0FEaUQsQ0FDbEI7O0FBQy9CLFNBQU9wQyxNQUFNLENBQUNLLEVBQVAsQ0FBVWdDLENBQVYsRUFBYVYsR0FBYixnQkFBUDtBQUNELENBSGMsQ0FBZixDLENBS0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQWNBM0IsTUFBTSxDQUFDTSxTQUFQLENBQWlCZ0IsUUFBakIsR0FBNEIsWUFBWTtBQUN0QyxTQUFPdEIsTUFBTSxDQUFDSyxFQUFQLG9CQUFvQnlCLEVBQXBCLENBQXVCLElBQXZCLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7O0FBWUE5QixNQUFNLENBQUNzQixRQUFQLEdBQWtCLFVBQVVhLElBQVYsRUFBZ0JDLElBQWhCLEVBQXNCO0FBQ3RDLE1BQU1DLENBQUMsR0FBRyx1QkFBU0YsSUFBVCxFQUFlQyxJQUFmLENBQVYsQ0FEc0MsQ0FDUDs7QUFDL0IsU0FBT3BDLE1BQU0sQ0FBQ0ssRUFBUCxvQkFBb0J5QixFQUFwQixDQUF1Qk8sQ0FBdkIsQ0FBUDtBQUNELENBSEQ7QUFLQTs7Ozs7Ozs7OztBQVFBckMsTUFBTSxDQUFDTSxTQUFQLENBQWlCZ0MsT0FBakIsR0FBMkIsVUFBVWIsQ0FBVixFQUFhO0FBQ3RDLFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVSxJQUFWLEVBQWdCMEIsTUFBaEIsQ0FBdUIvQixNQUFNLENBQUNLLEVBQVAsQ0FBVW9CLENBQVYsQ0FBdkIsa0JBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7QUFRQXpCLE1BQU0sQ0FBQ3NDLE9BQVAsR0FBaUIsVUFBVU4sQ0FBVixFQUFhQyxDQUFiLEVBQWdCO0FBQy9CLFNBQU9qQyxNQUFNLENBQUNLLEVBQVAsQ0FBVTJCLENBQVYsRUFBYUQsTUFBYixDQUFvQi9CLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVNEIsQ0FBVixDQUFwQixrQkFBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkFqQyxNQUFNLENBQUNNLFNBQVAsQ0FBaUJjLEdBQWpCLEdBQXVCLFVBQVVLLENBQVYsRUFBYTtBQUNsQyxTQUFPekIsTUFBTSxDQUFDSyxFQUFQLENBQVUsSUFBVixFQUFnQjBCLE1BQWhCLENBQXVCL0IsTUFBTSxDQUFDSyxFQUFQLENBQVVvQixDQUFWLENBQXZCLEVBQXFDLGtCQUFJLEtBQUtoQixTQUFULENBQXJDLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkFULE1BQU0sQ0FBQ29CLEdBQVAsR0FBYSxVQUFVWSxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDM0IsU0FBT2pDLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVMkIsQ0FBVixFQUFhWixHQUFiLENBQWlCcEIsTUFBTSxDQUFDSyxFQUFQLENBQVU0QixDQUFWLENBQWpCLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7OztBQWFBakMsTUFBTSxDQUFDTSxTQUFQLENBQWlCaUMsSUFBakIsR0FBd0IsVUFBVVgsQ0FBVixFQUFhO0FBQ25DLFNBQU81QixNQUFNLENBQUNLLEVBQVAsQ0FBVSxJQUFWLEVBQWdCc0IsR0FBaEIsQ0FBb0Isa0JBQUksVUFBQWEsQ0FBQztBQUFBLFdBQUlaLENBQUMsQ0FBQ1ksQ0FBRCxDQUFMO0FBQUEsR0FBTCxDQUFwQixDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7QUFhQXhDLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQm1DLEtBQWpCLEdBQXlCLFlBQVk7QUFDbkMsU0FBT3pDLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLElBQVYsRUFBZ0JrQyxJQUFoQixDQUFxQixVQUFBQyxDQUFDO0FBQUEsV0FBSSxDQUFKO0FBQUEsR0FBdEIsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7O0FBYUF4QyxNQUFNLENBQUN5QyxLQUFQLEdBQWUsVUFBVU4sSUFBVixFQUFnQkMsSUFBaEIsRUFBc0I7QUFDbkMsTUFBTUMsQ0FBQyxHQUFHLHVCQUFTRixJQUFULEVBQWVDLElBQWYsQ0FBVjtBQUNBLFNBQU9wQyxNQUFNLENBQUNLLEVBQVAsQ0FBVWdDLENBQVYsRUFBYUUsSUFBYixDQUFrQixVQUFBQyxDQUFDO0FBQUEsV0FBSSxDQUFKO0FBQUEsR0FBbkIsQ0FBUDtBQUNELENBSEQ7QUFLQTs7Ozs7Ozs7Ozs7Ozs7QUFZQXhDLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQm9DLElBQWpCLEdBQXdCLFlBQVk7QUFDbEMsU0FBTzFDLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLElBQVYsRUFBZ0JrQyxJQUFoQixDQUFxQixVQUFBQyxDQUFDO0FBQUEsV0FBSSxDQUFKO0FBQUEsR0FBdEIsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7O0FBYUF4QyxNQUFNLENBQUMwQyxJQUFQLEdBQWMsVUFBVVAsSUFBVixFQUFnQkMsSUFBaEIsRUFBc0I7QUFDbEMsTUFBTUMsQ0FBQyxHQUFHLHVCQUFTRixJQUFULEVBQWVDLElBQWYsQ0FBVjtBQUNBLFNBQU9wQyxNQUFNLENBQUNLLEVBQVAsQ0FBVWdDLENBQVYsRUFBYUUsSUFBYixDQUFrQixVQUFBQyxDQUFDO0FBQUEsV0FBSSxDQUFKO0FBQUEsR0FBbkIsQ0FBUDtBQUNELENBSEQ7QUFLQTs7Ozs7Ozs7OztBQVFBeEMsTUFBTSxDQUFDTSxTQUFQLENBQWlCcUMsTUFBakIsR0FBMEIsWUFBMEM7QUFBQSxNQUFoQ2YsQ0FBZ0MsdUVBQTVCLFVBQUFnQixDQUFDO0FBQUEsV0FBSUMsSUFBSSxDQUFDRixNQUFMLEtBQWdCLENBQWhCLEdBQW9CLENBQXhCO0FBQUEsR0FBMkI7QUFDbEUsU0FBTzNDLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLElBQVYsRUFBZ0JrQyxJQUFoQixDQUFxQlgsQ0FBckIsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7QUFTQTVCLE1BQU0sQ0FBQzJDLE1BQVAsR0FBZ0IsWUFBd0Q7QUFBQSxNQUE5Q2YsQ0FBOEMsdUVBQTFDLFVBQUFnQixDQUFDO0FBQUEsV0FBS0MsSUFBSSxDQUFDRixNQUFMLEtBQWdCLENBQWhCLEdBQW9CLENBQXpCO0FBQUEsR0FBeUM7QUFBQSxNQUFaUixJQUFZO0FBQUEsTUFBTkMsSUFBTTtBQUN0RSxNQUFNQyxDQUFDLEdBQUcsdUJBQVNGLElBQVQsRUFBZUMsSUFBZixDQUFWO0FBQ0EsU0FBT3BDLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVZ0MsQ0FBVixFQUFhRSxJQUFiLENBQWtCWCxDQUFsQixDQUFQO0FBQ0QsQ0FIRDtBQUtBOzs7Ozs7Ozs7QUFPQTVCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQndDLE9BQWpCLEdBQTJCLFlBQVk7QUFDckMsU0FBTyxLQUFLM0MsT0FBTCxDQUFhd0IsR0FBYixDQUFpQixVQUFBb0IsR0FBRztBQUFBLFdBQUlBLEdBQUcsQ0FBQ3BCLEdBQUosQ0FBUSxVQUFBcUIsR0FBRztBQUFBLGFBQUlBLEdBQUo7QUFBQSxLQUFYLENBQUo7QUFBQSxHQUFwQixDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7QUFPQWhELE1BQU0sQ0FBQ00sU0FBUCxDQUFpQjJDLEtBQWpCLEdBQXlCLFlBQVk7QUFDbkMsU0FBT2pELE1BQU0sQ0FBQ2tELFNBQVAsQ0FBaUIsS0FBSy9DLE9BQXRCLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7OztBQU9BSCxNQUFNLENBQUNrRCxTQUFQLEdBQW1CLFVBQVVDLEdBQVYsRUFBZTtBQUNoQyxTQUFPbkQsTUFBTSxDQUFDSyxFQUFQLENBQVUsa0JBQUksVUFBQTBDLEdBQUc7QUFBQSxXQUFJLGtCQUFJLFVBQUFDLEdBQUc7QUFBQSxhQUFJQSxHQUFKO0FBQUEsS0FBUCxFQUFnQkQsR0FBaEIsQ0FBSjtBQUFBLEdBQVAsRUFBaUNJLEdBQWpDLENBQVYsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7QUFZQW5ELE1BQU0sQ0FBQ00sU0FBUCxDQUFpQlEsU0FBakIsR0FBNkIsWUFBWTtBQUN2QyxTQUFPZCxNQUFNLENBQUNLLEVBQVAsQ0FBVSx1Q0FBZ0IsRUFBaEIsRUFBb0IsS0FBS0YsT0FBekIsQ0FBVixDQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7OztBQVlBSCxNQUFNLENBQUNjLFNBQVAsR0FBbUIsVUFBVVcsQ0FBVixFQUFhO0FBQzlCLFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVW9CLENBQVYsRUFBYVgsU0FBYixFQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7O0FBY0FkLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQjhDLEdBQWpCLEdBQXVCLFVBQVUzQixDQUFWLEVBQWE7QUFDbEMsTUFBSUEsQ0FBQyxZQUFZekIsTUFBakIsRUFBeUI7QUFDdkIsUUFBSSxLQUFLZ0IsT0FBTCxPQUFtQlMsQ0FBQyxDQUFDVCxPQUFGLEVBQW5CLElBQWtDLEtBQUtDLE9BQUwsT0FBbUJRLENBQUMsQ0FBQ1IsT0FBRixFQUF6RCxFQUFzRTtBQUNwRSxZQUFNLElBQUlvQyxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUNELFdBQU8sS0FBSzFCLEdBQUwsQ0FBUyxVQUFDb0IsR0FBRCxFQUFNTyxHQUFOO0FBQUEsYUFBYyxrQkFBSSxVQUFDckQsR0FBRCxFQUFNc0QsR0FBTjtBQUFBLGVBQWN0RCxHQUFHLEdBQUd3QixDQUFDLENBQUN0QixPQUFGLENBQVVtRCxHQUFWLEVBQWVDLEdBQWYsQ0FBcEI7QUFBQSxPQUFKLEVBQTZDUixHQUE3QyxDQUFkO0FBQUEsS0FBVCxDQUFQO0FBQ0QsR0FMRCxNQUtPO0FBQ0wsV0FBTyxLQUFLcEIsR0FBTCxDQUFTLGtCQUFJLFVBQUFhLENBQUM7QUFBQSxhQUFJQSxDQUFDLEdBQUdmLENBQVI7QUFBQSxLQUFMLENBQVQsQ0FBUDtBQUNEO0FBQ0YsQ0FURDtBQVdBOzs7Ozs7Ozs7Ozs7Ozs7O0FBY0F6QixNQUFNLENBQUNNLFNBQVAsQ0FBaUJrRCxRQUFqQixHQUE0QixVQUFVL0IsQ0FBVixFQUFhO0FBQ3ZDLE1BQUlBLENBQUMsWUFBWXpCLE1BQWpCLEVBQXlCO0FBQ3ZCLFFBQUksS0FBS2dCLE9BQUwsT0FBbUJTLENBQUMsQ0FBQ1QsT0FBRixFQUFuQixJQUFrQyxLQUFLQyxPQUFMLE9BQW1CUSxDQUFDLENBQUNSLE9BQUYsRUFBekQsRUFBc0U7QUFDcEUsWUFBTSxJQUFJb0MsS0FBSixDQUFVLHdDQUFWLENBQU47QUFDRDs7QUFDRCxXQUFPLEtBQUsxQixHQUFMLENBQVMsVUFBQ29CLEdBQUQsRUFBTU8sR0FBTjtBQUFBLGFBQWMsa0JBQUksVUFBQ3JELEdBQUQsRUFBTXNELEdBQU47QUFBQSxlQUFjdEQsR0FBRyxHQUFHd0IsQ0FBQyxDQUFDdEIsT0FBRixDQUFVbUQsR0FBVixFQUFlQyxHQUFmLENBQXBCO0FBQUEsT0FBSixFQUE2Q1IsR0FBN0MsQ0FBZDtBQUFBLEtBQVQsQ0FBUDtBQUNELEdBTEQsTUFLTztBQUNMLFdBQU8sS0FBS3BCLEdBQUwsQ0FBUyxrQkFBSSxVQUFBYSxDQUFDO0FBQUEsYUFBSUEsQ0FBQyxHQUFHZixDQUFSO0FBQUEsS0FBTCxDQUFULENBQVA7QUFDRDtBQUNGLENBVEQ7QUFXQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQXpCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQm1ELFFBQWpCLEdBQTRCLFVBQVVoQyxDQUFWLEVBQWE7QUFDdkMsTUFBSUEsQ0FBQyxZQUFZekIsTUFBakIsRUFBeUI7QUFDdkIsUUFBSSxLQUFLZ0IsT0FBTCxPQUFtQlMsQ0FBQyxDQUFDVCxPQUFGLEVBQW5CLElBQWtDLEtBQUtDLE9BQUwsT0FBbUJRLENBQUMsQ0FBQ1IsT0FBRixFQUF6RCxFQUFzRTtBQUNwRXlDLGFBQU8sQ0FBQ0MsR0FBUixDQUFZLHVEQUFaO0FBQ0EsWUFBTSxJQUFJTixLQUFKLENBQVUsdURBQVYsQ0FBTjtBQUNEOztBQUNELFdBQU8sS0FBSzFCLEdBQUwsQ0FBUyxVQUFDb0IsR0FBRCxFQUFNTyxHQUFOO0FBQUEsYUFBYyxrQkFBSSxVQUFDTixHQUFELEVBQU1PLEdBQU47QUFBQSxlQUFjUCxHQUFHLEdBQUd2QixDQUFDLENBQUN0QixPQUFGLENBQVVtRCxHQUFWLEVBQWVDLEdBQWYsQ0FBcEI7QUFBQSxPQUFKLEVBQTZDUixHQUE3QyxDQUFkO0FBQUEsS0FBVCxDQUFQO0FBQ0QsR0FORCxNQU1PO0FBQ0wsV0FBTyxLQUFLcEIsR0FBTCxDQUFTLGtCQUFJLFVBQUFhLENBQUM7QUFBQSxhQUFJQSxDQUFDLEdBQUdmLENBQVI7QUFBQSxLQUFMLENBQVQsQ0FBUDtBQUNEO0FBQ0YsQ0FWRDtBQVlBOzs7Ozs7Ozs7Ozs7OztBQVlBekIsTUFBTSxDQUFDTSxTQUFQLENBQWlCc0QsZUFBakIsR0FBbUMsWUFBWTtBQUM3QyxTQUFPNUQsTUFBTSxDQUFDSyxFQUFQLENBQVUsSUFBVixFQUFnQm9ELFFBQWhCLENBQXlCLENBQUMsQ0FBMUIsQ0FBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQXpELE1BQU0sQ0FBQ00sU0FBUCxDQUFpQnVELFFBQWpCLEdBQTRCLFVBQVVwQyxDQUFWLEVBQWE7QUFDdkMsU0FBT3pCLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLElBQVYsRUFBZ0JvRCxRQUFoQixDQUF5QmhDLENBQXpCLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQXpCLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQndELEVBQWpCLEdBQXNCLFlBQVk7QUFDaEMsTUFBTUMsQ0FBQyxHQUFHLEtBQUs5QyxPQUFMLEVBQVY7QUFDQSxNQUFNK0MsR0FBRyxHQUFHLElBQVo7QUFDQSxNQUFNaEMsQ0FBQyxHQUFHLEtBQUtpQixLQUFMLEVBQVY7QUFDQSxNQUFNZ0IsQ0FBQyxHQUFHLEtBQUt4QixLQUFMLEVBQVY7QUFDQSxNQUFNeUIsQ0FBQyxHQUFHLEtBQUt6QixLQUFMLEVBQVY7O0FBRUEsT0FBSyxJQUFJMEIsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0osQ0FBcEIsRUFBdUIsRUFBRUksQ0FBekIsRUFBNEI7QUFDMUIsUUFBSXRCLElBQUksQ0FBQ3VCLEdBQUwsQ0FBU3BDLENBQUMsQ0FBQzdCLE9BQUYsQ0FBVWdFLENBQVYsRUFBYUEsQ0FBYixDQUFULElBQTRCSCxHQUFoQyxFQUFxQyxNQUFNWCxLQUFLLENBQUMsdUNBQUQsQ0FBWDtBQUNyQ1ksS0FBQyxDQUFDOUQsT0FBRixDQUFVZ0UsQ0FBVixFQUFhQSxDQUFiLElBQWtCLENBQWxCOztBQUNBLFNBQUssSUFBSUUsQ0FBQyxHQUFHRixDQUFDLEdBQUcsQ0FBakIsRUFBb0JFLENBQUMsR0FBR04sQ0FBeEIsRUFBMkIsRUFBRU0sQ0FBN0IsRUFBZ0M7QUFDOUJKLE9BQUMsQ0FBQzlELE9BQUYsQ0FBVWtFLENBQVYsRUFBYUYsQ0FBYixJQUFrQm5DLENBQUMsQ0FBQzdCLE9BQUYsQ0FBVWtFLENBQVYsRUFBYUYsQ0FBYixJQUFrQm5DLENBQUMsQ0FBQzdCLE9BQUYsQ0FBVWdFLENBQVYsRUFBYUEsQ0FBYixDQUFwQzs7QUFDQSxXQUFLLElBQUlHLENBQUMsR0FBR0gsQ0FBQyxHQUFHLENBQWpCLEVBQW9CRyxDQUFDLEdBQUdQLENBQXhCLEVBQTJCLEVBQUVPLENBQTdCLEVBQWdDO0FBQzlCdEMsU0FBQyxDQUFDN0IsT0FBRixDQUFVa0UsQ0FBVixFQUFhQyxDQUFiLElBQWtCdEMsQ0FBQyxDQUFDN0IsT0FBRixDQUFVa0UsQ0FBVixFQUFhQyxDQUFiLElBQWtCTCxDQUFDLENBQUM5RCxPQUFGLENBQVVrRSxDQUFWLEVBQWFGLENBQWIsSUFBa0JuQyxDQUFDLENBQUM3QixPQUFGLENBQVVnRSxDQUFWLEVBQWFHLENBQWIsQ0FBdEQ7QUFDRDtBQUNGOztBQUNELFNBQUssSUFBSUMsQ0FBQyxHQUFHSixDQUFiLEVBQWdCSSxDQUFDLEdBQUdSLENBQXBCLEVBQXVCLEVBQUVRLENBQXpCLEVBQTRCO0FBQzFCTCxPQUFDLENBQUMvRCxPQUFGLENBQVVnRSxDQUFWLEVBQWFJLENBQWIsSUFBa0J2QyxDQUFDLENBQUM3QixPQUFGLENBQVVnRSxDQUFWLEVBQWFJLENBQWIsQ0FBbEI7QUFDRDtBQUNGOztBQUNELFNBQU8sQ0FBQ04sQ0FBRCxFQUFJQyxDQUFKLENBQVA7QUFDRCxDQXJCRDtBQXVCQTs7Ozs7Ozs7Ozs7O0FBVUFsRSxNQUFNLENBQUNNLFNBQVAsQ0FBaUJrRSxJQUFqQixHQUF3QixZQUFZO0FBQ2xDLE1BQUlDLElBQUksR0FBRyxDQUFYO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLEtBQUt6QixLQUFMLEVBQXJCOztBQUVBLE9BQUssSUFBSTBCLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBSzFELE9BQUwsRUFBcEIsRUFBb0MsRUFBRTBELENBQXRDLEVBQXlDO0FBQ3ZDLFFBQUksS0FBSzNELE9BQUwsTUFBa0J5RCxJQUF0QixFQUE0QjtBQUMxQixhQUFPQyxZQUFQO0FBQ0Q7O0FBQ0QsUUFBSUwsQ0FBQyxHQUFHTSxDQUFSOztBQUNBLFdBQU9ELFlBQVksQ0FBQ3ZFLE9BQWIsQ0FBcUJrRSxDQUFyQixFQUF3QkksSUFBeEIsTUFBa0MsQ0FBekMsRUFBNEM7QUFDMUMsUUFBRUosQ0FBRjs7QUFDQSxVQUFJLEtBQUtwRCxPQUFMLE9BQW1Cb0QsQ0FBdkIsRUFBMEI7QUFDeEJBLFNBQUMsR0FBR00sQ0FBSjtBQUNBLFVBQUVGLElBQUY7O0FBQ0EsWUFBSSxLQUFLekQsT0FBTCxPQUFtQnlELElBQXZCLEVBQTZCO0FBQzNCLGlCQUFPQyxZQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFFBQUlFLEdBQUcsR0FBR0YsWUFBWSxDQUFDdkUsT0FBYixDQUFxQmtFLENBQXJCLENBQVY7QUFDQUssZ0JBQVksQ0FBQ3ZFLE9BQWIsQ0FBcUJrRSxDQUFyQixJQUEwQkssWUFBWSxDQUFDdkUsT0FBYixDQUFxQndFLENBQXJCLENBQTFCO0FBQ0FELGdCQUFZLENBQUN2RSxPQUFiLENBQXFCd0UsQ0FBckIsSUFBMEJDLEdBQTFCO0FBRUEsUUFBSTNFLEdBQUcsR0FBR3lFLFlBQVksQ0FBQ3ZFLE9BQWIsQ0FBcUJ3RSxDQUFyQixFQUF3QkYsSUFBeEIsQ0FBVjs7QUFDQSxTQUFLLElBQUlILENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsS0FBS3RELE9BQUwsRUFBcEIsRUFBb0MsRUFBRXNELENBQXRDLEVBQXlDO0FBQ3ZDSSxrQkFBWSxDQUFDdkUsT0FBYixDQUFxQndFLENBQXJCLEVBQXdCTCxDQUF4QixLQUE4QnJFLEdBQTlCO0FBQ0Q7O0FBRUQsU0FBSyxJQUFJb0UsRUFBQyxHQUFHLENBQWIsRUFBZ0JBLEVBQUMsR0FBRyxLQUFLcEQsT0FBTCxFQUFwQixFQUFvQyxFQUFFb0QsRUFBdEMsRUFBeUM7QUFDdkMsVUFBSUEsRUFBQyxLQUFLTSxDQUFWLEVBQWE7QUFDYjFFLFNBQUcsR0FBR3lFLFlBQVksQ0FBQ3ZFLE9BQWIsQ0FBcUJrRSxFQUFyQixFQUF3QkksSUFBeEIsQ0FBTjs7QUFDQSxXQUFLLElBQUlILEVBQUMsR0FBRyxDQUFiLEVBQWdCQSxFQUFDLEdBQUcsS0FBS3RELE9BQUwsRUFBcEIsRUFBb0MsRUFBRXNELEVBQXRDLEVBQXlDO0FBQ3ZDSSxvQkFBWSxDQUFDdkUsT0FBYixDQUFxQmtFLEVBQXJCLEVBQXdCQyxFQUF4QixLQUE4QnJFLEdBQUcsR0FBR3lFLFlBQVksQ0FBQ3ZFLE9BQWIsQ0FBcUJ3RSxDQUFyQixFQUF3QkwsRUFBeEIsQ0FBcEM7QUFDRDtBQUNGOztBQUNERyxRQUFJO0FBQ0w7O0FBQ0QsU0FBT0MsWUFBUDtBQUNELENBdkNEO0FBeUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkExRSxNQUFNLENBQUNNLFNBQVAsQ0FBaUJ1RSxLQUFqQixHQUF5QixVQUFVaEUsQ0FBVixFQUFhO0FBQ3BDLE1BQU1tQixDQUFDLEdBQUcsS0FBS2lCLEtBQUwsRUFBVjtBQUNBLE1BQU02QixFQUFFLEdBQUc5QyxDQUFDLENBQUM4QixFQUFGLEVBQVg7QUFDQSxNQUFNRyxDQUFDLEdBQUdhLEVBQUUsQ0FBQyxDQUFELENBQVo7QUFDQSxNQUFNWixDQUFDLEdBQUdZLEVBQUUsQ0FBQyxDQUFELENBQVo7QUFDQSxNQUFNZixDQUFDLEdBQUcsS0FBSzlDLE9BQUwsRUFBVjtBQUNBLE1BQUk4RCxDQUFDLEdBQUcsQ0FBUjtBQUNBLE1BQU1DLENBQUMsR0FBRyxFQUFWO0FBQ0EsTUFBTXhDLENBQUMsR0FBRyxFQUFWOztBQUVBLE9BQUssSUFBSTJCLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdKLENBQXBCLEVBQXVCLEVBQUVJLENBQXpCLEVBQTRCO0FBQzFCLFNBQUssSUFBSUcsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0gsQ0FBcEIsRUFBdUIsRUFBRUcsQ0FBekIsRUFBNEI7QUFDMUJTLE9BQUMsR0FBR0EsQ0FBQyxHQUFHZCxDQUFDLENBQUM5RCxPQUFGLENBQVVnRSxDQUFWLEVBQWFHLENBQWIsSUFBa0JVLENBQUMsQ0FBQ1YsQ0FBRCxDQUEzQjtBQUNEOztBQUNEVSxLQUFDLENBQUNiLENBQUQsQ0FBRCxHQUFPdEQsQ0FBQyxDQUFDc0QsQ0FBRCxDQUFELEdBQU9ZLENBQWQ7QUFDQUEsS0FBQyxHQUFHLENBQUo7QUFDRDs7QUFDRCxPQUFLLElBQUluRSxDQUFDLEdBQUdtRCxDQUFDLEdBQUcsQ0FBakIsRUFBb0JuRCxDQUFDLEdBQUcsQ0FBQyxDQUF6QixFQUE0QixFQUFFQSxDQUE5QixFQUFpQztBQUMvQixRQUFJcUUsQ0FBQyxHQUFHLENBQVI7O0FBQ0EsU0FBSyxJQUFJcEUsRUFBQyxHQUFHRCxDQUFDLEdBQUcsQ0FBakIsRUFBb0JDLEVBQUMsR0FBR2tELENBQXhCLEVBQTJCLEVBQUVsRCxFQUE3QixFQUFnQztBQUM5Qm9FLE9BQUMsR0FBR0EsQ0FBQyxHQUFHZixDQUFDLENBQUMvRCxPQUFGLENBQVVTLENBQVYsRUFBYUMsRUFBYixJQUFrQjJCLENBQUMsQ0FBQzNCLEVBQUQsQ0FBM0I7QUFDRDs7QUFDRDJCLEtBQUMsQ0FBQzVCLENBQUQsQ0FBRCxHQUFPLENBQUNvRSxDQUFDLENBQUNwRSxDQUFELENBQUQsR0FBT3FFLENBQVIsSUFBYWYsQ0FBQyxDQUFDL0QsT0FBRixDQUFVUyxDQUFWLEVBQWFBLENBQWIsQ0FBcEI7QUFDRDs7QUFDRCxTQUFPNEIsQ0FBUDtBQUNELENBekJEO0FBMkJBOzs7Ozs7Ozs7Ozs7O0FBV0F4QyxNQUFNLENBQUNNLFNBQVAsQ0FBaUI0RSxPQUFqQixHQUEyQixZQUFZO0FBQ3JDLE1BQU1sRCxDQUFDLEdBQUcsS0FBS2lCLEtBQUwsRUFBVjtBQUNBLE1BQU01QixDQUFDLEdBQUdXLENBQUMsQ0FBQ1YsUUFBRixFQUFWO0FBQ0EsTUFBTTZELEdBQUcsR0FBR25ELENBQUMsQ0FBQ0QsTUFBRixDQUFTVixDQUFULEVBQVltRCxJQUFaLEVBQVo7O0FBRUEsTUFBTVksTUFBTSxHQUFHRCxHQUFHLENBQUNoRixPQUFKLENBQVlrRixNQUFaLENBQW1CLFVBQUNELE1BQUQsRUFBUzVDLENBQVQsRUFBWWMsR0FBWixFQUFvQjtBQUNwRCxRQUFNZ0MsSUFBSSxHQUFHOUMsQ0FBQyxDQUFDakIsTUFBRixHQUFXLENBQXhCO0FBQ0E2RCxVQUFNLENBQUNHLElBQVAsQ0FBWS9DLENBQUMsQ0FBQ2dELEtBQUYsQ0FBUUYsSUFBUixFQUFjOUMsQ0FBQyxDQUFDakIsTUFBaEIsQ0FBWjtBQUNBLFdBQU82RCxNQUFQO0FBQ0QsR0FKYyxFQUlaLEVBSlksQ0FBZjs7QUFLQSxTQUFPcEYsTUFBTSxDQUFDSyxFQUFQLENBQVUrRSxNQUFWLENBQVA7QUFDRCxDQVhEO0FBYUE7Ozs7Ozs7O0FBTUFwRixNQUFNLENBQUNNLFNBQVAsQ0FBaUJtRixJQUFqQixHQUF3QixZQUFZO0FBQ2xDLE1BQU1qQixJQUFJLEdBQUcsS0FBS0EsSUFBTCxFQUFiO0FBQ0EsTUFBSVksTUFBTSxHQUFHLENBQWI7O0FBQ0EsT0FBSyxJQUFJZixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRyxJQUFJLENBQUN4RCxPQUFMLEVBQXBCLEVBQW9DLEVBQUVxRCxDQUF0QyxFQUF5QztBQUN2Q2UsVUFBTSxJQUFJWixJQUFJLENBQUNyRSxPQUFMLENBQWFrRSxDQUFiLEVBQWdCQSxDQUFoQixDQUFWO0FBQ0Q7O0FBQ0QsU0FBT2UsTUFBUDtBQUNELENBUEQ7QUFTQTs7Ozs7Ozs7O0FBT0FwRixNQUFNLENBQUNNLFNBQVAsQ0FBaUJvRixTQUFqQixHQUE2QixZQUFZO0FBQ3ZDLFNBQU8sS0FBS0QsSUFBTCxFQUFQO0FBQ0QsQ0FGRDtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWVBekYsTUFBTSxDQUFDTSxTQUFQLENBQWlCcUYsSUFBakIsR0FBd0IsWUFBWTtBQUNsQyxTQUFPLG1CQUFLLFVBQUNDLEdBQUQsRUFBTXBELENBQU4sRUFBU2MsR0FBVCxFQUFpQjtBQUMzQixXQUFPc0MsR0FBRyxDQUFDN0QsTUFBSixDQUFXUyxDQUFDLENBQUNjLEdBQUQsQ0FBWixDQUFQO0FBQ0QsR0FGTSxFQUVKLEVBRkksRUFFQSxLQUFLbkQsT0FGTCxDQUFQO0FBR0QsQ0FKRDtBQU1BOzs7Ozs7Ozs7Ozs7OztBQVlBSCxNQUFNLENBQUMyRixJQUFQLEdBQWMsVUFBVWxFLENBQVYsRUFBYTtBQUN6QixTQUFPekIsTUFBTSxDQUFDSyxFQUFQLENBQVVvQixDQUFWLEVBQWFrRSxJQUFiLEVBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEzRixNQUFNLENBQUNNLFNBQVAsQ0FBaUJ1RixXQUFqQixHQUErQixZQUFZO0FBQ3pDLFNBQU8sbUJBQUssVUFBQ0QsR0FBRCxFQUFNcEQsQ0FBTixFQUFTYyxHQUFULEVBQWlCO0FBQzNCc0MsT0FBRyxJQUFJcEQsQ0FBQyxDQUFDYyxHQUFELENBQVI7QUFDQSxXQUFPc0MsR0FBUDtBQUNELEdBSE0sRUFHSixDQUhJLEVBR0QsS0FBS3pGLE9BSEosQ0FBUDtBQUlELENBTEQ7QUFPQTs7Ozs7Ozs7Ozs7Ozs7QUFZQUgsTUFBTSxDQUFDNkYsV0FBUCxHQUFxQixVQUFVcEUsQ0FBVixFQUFhO0FBQ2hDLFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVW9CLENBQVYsRUFBYW9FLFdBQWIsRUFBUDtBQUNELENBRkQ7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQTdGLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQndGLEdBQWpCLEdBQXVCLFlBQVk7QUFDakMsU0FBTyxtQkFBSyxVQUFDRixHQUFELEVBQU1wRCxDQUFOLEVBQVk7QUFDdEJvRCxPQUFHLElBQUksbUJBQUssVUFBQ0csSUFBRCxFQUFPQyxJQUFQO0FBQUEsYUFBZ0JELElBQUksR0FBR0MsSUFBdkI7QUFBQSxLQUFMLEVBQWtDLENBQWxDLEVBQXFDeEQsQ0FBckMsQ0FBUDtBQUNBLFdBQU9vRCxHQUFQO0FBQ0QsR0FITSxFQUdKLENBSEksRUFHRCxLQUFLekYsT0FISixDQUFQO0FBSUQsQ0FMRDtBQU9BOzs7Ozs7Ozs7Ozs7OztBQVlBSCxNQUFNLENBQUM4RixHQUFQLEdBQWEsVUFBVXJFLENBQVYsRUFBYTtBQUN4QixTQUFPekIsTUFBTSxDQUFDSyxFQUFQLENBQVVvQixDQUFWLEVBQWFxRSxHQUFiLEVBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7QUFRQTlGLE1BQU0sQ0FBQ00sU0FBUCxDQUFpQjJGLFNBQWpCLEdBQTZCLFVBQVV4RSxDQUFWLEVBQWE7QUFDeEMsTUFBTVksQ0FBQyxHQUFHLEtBQUtwQixPQUFMLEVBQVY7QUFDQSxNQUFNOEMsQ0FBQyxHQUFHLEtBQUsvQyxPQUFMLEVBQVY7QUFDQSxNQUFNa0YsQ0FBQyxHQUFHekUsQ0FBQyxDQUFDUixPQUFGLEVBQVY7QUFDQSxNQUFNa0YsQ0FBQyxHQUFHMUUsQ0FBQyxDQUFDVCxPQUFGLEVBQVY7QUFFQSxNQUFNb0YsSUFBSSxHQUFHLEtBQUtqRyxPQUFsQjtBQUNBLE1BQU1rRyxLQUFLLEdBQUc1RSxDQUFDLENBQUN0QixPQUFoQjtBQUVBLE1BQU1tRyxLQUFLLEdBQUcsdUJBQVNqRSxDQUFDLEdBQUc2RCxDQUFiLEVBQWdCbkMsQ0FBQyxHQUFHb0MsQ0FBcEIsQ0FBZDs7QUFFQSxPQUFLLElBQUk5QixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHaEMsQ0FBcEIsRUFBdUJnQyxDQUFDLEVBQXhCLEVBQTRCO0FBQzFCLFNBQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR1AsQ0FBcEIsRUFBdUJPLENBQUMsRUFBeEIsRUFBNEI7QUFDMUIsV0FBSyxJQUFJSCxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHK0IsQ0FBcEIsRUFBdUIvQixDQUFDLEVBQXhCLEVBQTRCO0FBQzFCLGFBQUssSUFBSUksQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBRzRCLENBQXBCLEVBQXVCNUIsQ0FBQyxFQUF4QixFQUE0QjtBQUMxQitCLGVBQUssQ0FBQ0osQ0FBQyxHQUFHN0IsQ0FBSixHQUFRRixDQUFULENBQUwsQ0FBaUJnQyxDQUFDLEdBQUc3QixDQUFKLEdBQVFDLENBQXpCLElBQThCNkIsSUFBSSxDQUFDL0IsQ0FBRCxDQUFKLENBQVFDLENBQVIsSUFBYStCLEtBQUssQ0FBQ2xDLENBQUQsQ0FBTCxDQUFTSSxDQUFULENBQTNDO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7O0FBRUQsU0FBT3ZFLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVaUcsS0FBVixDQUFQO0FBQ0QsQ0F0QkQ7QUF3QkE7Ozs7Ozs7Ozs7QUFRQXRHLE1BQU0sQ0FBQ2lHLFNBQVAsR0FBbUIsVUFBVWpFLENBQVYsRUFBYUMsQ0FBYixFQUFnQjtBQUNqQyxTQUFPakMsTUFBTSxDQUFDSyxFQUFQLENBQVUyQixDQUFWLEVBQWFpRSxTQUFiLENBQXVCaEUsQ0FBdkIsQ0FBUDtBQUNELENBRkQsQyxDQUlBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBakMsTUFBTSxDQUFDTSxTQUFQLENBQWlCaUcsTUFBakIsR0FBMEIsVUFBVTNFLENBQVYsRUFBYTtBQUNyQyxTQUFPNUIsTUFBTSxDQUFDSyxFQUFQLENBQVUscUJBQU8sS0FBS0QsS0FBWixFQUFtQndCLENBQW5CLEVBQXNCLEtBQUt6QixPQUEzQixDQUFWLENBQVA7QUFDRCxDQUZEO0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUFILE1BQU0sQ0FBQ3VHLE1BQVAsR0FBZ0Isb0JBQU0sVUFBVS9GLEdBQVYsRUFBZW9CLENBQWYsRUFBa0JILENBQWxCLEVBQXFCO0FBQ3pDLFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVW9CLENBQVYsRUFBYWpCLEdBQWIsRUFBa0IrRixNQUFsQixDQUF5QjNFLENBQXpCLENBQVA7QUFDRCxDQUZlLENBQWhCO0FBSUE7Ozs7Ozs7Ozs7Ozs7OztBQWNBNUIsTUFBTSxDQUFDTSxTQUFQLENBQWlCa0csT0FBakIsR0FBMkIsVUFBVTVFLENBQVYsRUFBYTZFLE1BQWIsRUFBcUI7QUFDOUMsU0FBT3pHLE1BQU0sQ0FBQ0ssRUFBUCxDQUFVLHNCQUFRLEtBQUtELEtBQWIsRUFBb0J3QixDQUFwQixFQUF1QjZFLE1BQXZCLEVBQStCLEtBQUt0RyxPQUFwQyxDQUFWLENBQVA7QUFDRCxDQUZEOztBQUlBSCxNQUFNLENBQUNNLFNBQVAsQ0FBaUJvRyxVQUFqQixHQUE4QixVQUFVOUUsQ0FBVixFQUFhNkUsTUFBYixFQUFxQmhGLENBQXJCLEVBQXdCO0FBQ3BELFNBQU96QixNQUFNLENBQUNLLEVBQVAsQ0FBVSx5QkFBVyxLQUFLRCxLQUFoQixFQUF1QndCLENBQXZCLEVBQTBCNkUsTUFBMUIsRUFBa0MsS0FBS3RHLE9BQXZDLEVBQWdEc0IsQ0FBaEQsQ0FBVixDQUFQO0FBQ0QsQ0FGRDs7ZUFJZXpCLE07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RxQ2Y7O0FBRUE7Ozs7Ozs7ZUFPZSxnQkFBTSxVQUFVeUIsQ0FBVixFQUFhWSxDQUFiLEVBQWdCaUIsR0FBaEIsRUFBcUI7QUFDeEMsU0FBTyxpQkFBT2pCLENBQVAsRUFBVVosQ0FBQyxDQUFDdEIsT0FBRixDQUFVbUQsR0FBVixDQUFWLENBQVA7QUFDRCxDQUZjLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUZjs7QUFDQTs7OztBQUVBOzs7Ozs7ZUFNZSxnQkFBTSxVQUFDcUQsUUFBRCxFQUFXMUUsQ0FBWCxFQUFjckIsQ0FBZDtBQUFBLFNBQW9CLGNBQUksVUFBQ2dHLElBQUQsRUFBT3ZDLENBQVAsRUFBYTtBQUN4RCxXQUFPLGVBQUssVUFBQ3VCLEdBQUQsRUFBTXBELENBQU4sRUFBUzhCLENBQVQsRUFBZTtBQUN6QnNCLFNBQUcsSUFBSSxvQkFBTXBELENBQUMsR0FBR1AsQ0FBQyxDQUFDOUIsT0FBRixDQUFVbUUsQ0FBVixFQUFhRCxDQUFiLENBQVYsRUFBMkJzQyxRQUEzQixDQUFQO0FBQ0EsYUFBT2YsR0FBUDtBQUNELEtBSE0sRUFHSixDQUhJLEVBR0RoRixDQUhDLENBQVA7QUFJRCxHQUx3QyxFQUt0Q3FCLENBQUMsQ0FBQzlCLE9BQUYsQ0FBVSxDQUFWLENBTHNDLENBQXBCO0FBQUEsQ0FBTixDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVGY7O2VBQ2UsZ0JBQU0sVUFBQWtDLENBQUM7QUFBQSxTQUFJLEVBQUo7QUFBQSxDQUFQLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNEZjs7QUFFQTs7Ozs7OztlQU9lLGtCQUFDRixJQUFELEVBQXVDO0FBQUEsTUFBaENDLElBQWdDLHVFQUF6QnlFLFNBQXlCO0FBQUEsTUFBZEMsS0FBYyx1RUFBTixDQUFNOztBQUNwRCxNQUFNQyxLQUFLLEdBQUczRSxJQUFJLElBQUlELElBQXRCOztBQUNBLE1BQU02RSxDQUFDLEdBQUcsY0FBSSxVQUFBQyxDQUFDO0FBQUEsV0FBSUgsS0FBSjtBQUFBLEdBQUwsRUFBZ0IsSUFBSUksS0FBSixDQUFVSCxLQUFWLENBQWhCLENBQVY7QUFDQSxTQUFPLGNBQUksVUFBQUUsQ0FBQztBQUFBLFdBQUlELENBQUo7QUFBQSxHQUFMLEVBQVksSUFBSUUsS0FBSixDQUFVL0UsSUFBVixDQUFaLENBQVA7QUFDRCxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYmMsU0FBU2dGLE9BQVQsQ0FBa0IzRyxHQUFsQixFQUF1Qm9CLENBQXZCLEVBQTBCNkUsTUFBMUIsRUFBa0NXLE1BQWxDLEVBQTBEO0FBQUEsTUFBaEJDLFNBQWdCLHVFQUFKLEVBQUk7QUFDdkUsU0FBTzdHLEdBQUcsQ0FDUDhHLFlBREksQ0FDUzFGLENBRFQsRUFDWTtBQUFFeUYsYUFBUyxFQUFFRSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCO0FBQUVuRixPQUFDLEVBQUUrRSxNQUFNLENBQUM3RixNQUFaO0FBQW9Cd0MsT0FBQyxFQUFFcUQsTUFBTSxDQUFDLENBQUQsQ0FBTixDQUFVN0Y7QUFBakMsS0FBbEIsRUFBNkQ4RixTQUE3RDtBQUFiLEdBRFosRUFFSkksU0FGSSxDQUVNaEIsTUFGTixFQUVjVyxNQUZkLENBQVA7QUFHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSkQ7QUFFZSxTQUFTTSxNQUFULENBQWlCbEgsR0FBakIsRUFBc0JvQixDQUF0QixFQUF5QndGLE1BQXpCLEVBQWlDO0FBQzlDLFNBQU81RyxHQUFHLENBQUM4RyxZQUFKLENBQWlCMUYsQ0FBakIsRUFBb0I2RixTQUFwQixDQUE4QixDQUFDTCxNQUFNLENBQUM3RixNQUFSLEVBQWdCNkYsTUFBTSxDQUFDLENBQUQsQ0FBTixDQUFVN0YsTUFBMUIsQ0FBOUIsRUFBaUU2RixNQUFqRSxDQUFQO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0pjLFNBQVNPLE1BQVQsQ0FBaUJuSCxHQUFqQixFQUFzQm9CLENBQXRCLEVBQXlCNkUsTUFBekIsRUFBaUM3RixDQUFqQyxFQUFvQ0MsQ0FBcEMsRUFBdUQ7QUFBQSxNQUFoQndHLFNBQWdCLHVFQUFKLEVBQUk7QUFDcEUsU0FBTzdHLEdBQUcsQ0FDUDhHLFlBREksQ0FDUzFGLENBRFQsRUFDWTtBQUFFeUYsYUFBUyxFQUFFRSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCO0FBQUV6RCxPQUFDLEVBQUVuRCxDQUFDLENBQUMsQ0FBRCxDQUFELENBQUtXO0FBQVYsS0FBbEIsRUFBc0M4RixTQUF0QztBQUFiLEdBRFosRUFFSkksU0FGSSxDQUVNaEIsTUFGTixFQUVjN0YsQ0FGZCxFQUVpQkMsQ0FGakIsQ0FBUDtBQUdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKRDs7QUFFQTs7Ozs7OztlQU9lLGtCQUFDd0IsQ0FBRCxFQUFJaUIsR0FBSjtBQUFBLFNBQVksY0FBSSxVQUFDbkIsSUFBRCxFQUFPb0IsR0FBUDtBQUFBLFdBQWUsQ0FBQ0QsR0FBRyxLQUFLQyxHQUFULElBQWdCLENBQS9CO0FBQUEsR0FBSixFQUFzQ2xCLENBQXRDLENBQVo7QUFBQSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVGY7Ozs7OztBQU1lLFNBQVN1RixLQUFULENBQWdCZCxLQUFoQixFQUF1QkgsUUFBdkIsRUFBaUM7QUFDOUMsU0FBT2tCLE1BQU0sQ0FBQ2hGLElBQUksQ0FBQytFLEtBQUwsQ0FBV2QsS0FBSyxHQUFHLEdBQVIsR0FBY0gsUUFBekIsSUFBcUMsSUFBckMsR0FBNENBLFFBQTdDLENBQWI7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUkQ7O0FBRUE7Ozs7Ozs7ZUFPZSxnQkFBTSxVQUFDWixJQUFELEVBQU9DLElBQVA7QUFBQSxTQUFnQixjQUFJLFVBQUNZLElBQUQsRUFBT3ZDLENBQVA7QUFBQSxXQUFhLENBQUMwQixJQUFJLENBQUMxQixDQUFELENBQUosSUFBVyxFQUFaLEVBQWdCdEMsTUFBaEIsQ0FBdUJpRSxJQUFJLENBQUMzQixDQUFELENBQTNCLENBQWI7QUFBQSxHQUFKLEVBQWtEMkIsSUFBbEQsQ0FBaEI7QUFBQSxDQUFOLEMiLCJmaWxlIjoiQGFzdHVhbmF4L2Z1bm1hdHJpeC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJAYXN0dWFuYXgvZnVubWF0cml4XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbWF0cml4LmpzXCIpO1xuIiwiLyoqXG4gKiBSZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiB3aXRoIGFyaXR5IDFcbiAqIEBmdW5jdGlvbiBjdXJyeTFcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5MSAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGN1cnJpZWQgKGEpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgPyB0aGlzXG4gICAgICA6IGZuKGEpXG4gIH1cbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFkZEluZGV4XG4gKiBAc3VtbWFyeSBBZGRzIGEgc3BlY2lmaWVkIGluZGV4IHRvIGl0ZXJhdGUgYSBjb2xsZWN0aW9uXG4gKiBAZGVzY3JpcHRpb24gVGhlIGFkZEluZGV4IGZ1bmN0aW9uIGlzIG5vdG5lY2Vzc2FyeSBmb3IgdGhlIG1hcCBmdW5jdGlvbnMgaW4gdGhlIGZ1bi5qcyBsaWJyYXJ5IGFzIHRoZXkgYmVoYXZlIHRoZSBzYSxlIGFzIHRoZSBuYXRpdmUgamF2YXNjcmlwdCBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGYgSXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGcgRnVuY3Rpb24gdG8gd2hpY2ggdG8gYWRkIHRoZSBpbmRleFxuICogQHBhcmFtIHtBcnJheX0gYSBUaGUgYXJyYXkgb24gd2hpY2ggdG8gd29ya1xuICogQHNpbmNlIDEuMC4yXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGRJbmRleCAoZiwgZywgYSkge1xuICBsZXQgaSA9IDBcbiAgcmV0dXJuIGYoXG4gICAgZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBnKHYsIGkrKylcbiAgICB9LFxuICAgIGFcbiAgKVxufSlcbiIsIi8qKlxuICogTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gYWRqdXN0XG4gKiBAZGVzY3JpcHRpb24gTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYSkgLT4gbnVtIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdG8gbW9kaWZ5IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBpIC0gVGhlIGluZGV4IGF0IHdoaWNoIHRvIG1vZGlmeSB0aGUgYXJyYXksIGFjY2VwdHMgcG9zdGl0aXZlIGFuZCBuZWdhdGl2ZSBpbmRleGVzXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBbYV0gLSBBcnJheSB3aXRoIGRhdGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGp1c3QgKGZuLCBpLCBhKSB7XG4gIGNvbnN0IHIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKVxuICBjb25zdCBpZHggPSBpIDwgMCA/IHIubGVuZ3RoICsgaSA6IGlcbiAgaWYgKCFhW2lkeF0pIHJldHVybiByXG4gIHJbaWR4XSA9IGZuKHJbaWR4XSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGFkanVzdFdpdGhcbiAqIEBkZXNjcmlwdGlvbiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBhKSAtPiAoKGEgLT4gW2FdKSAtPiBbYV0gLT4gbnVtKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRvIG1vZGlmeSB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIC0gVGhlIHByZWRpY2F0ZSB0aGF0IHJldHVybnMgdGhlIGluZGV4ZXMgaWYgZm91bmRcbiAqIEBwYXJhbSB7SXRlcmFibGV9IFthXVxuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGp1c3RXaXRoIChmbiwgcHJlZCwgYSkge1xuICBjb25zdCBfZm4gPSB4ID0+IHtcbiAgICBpZiAocHJlZCh4KSkge1xuICAgICAgcmV0dXJuIGZuKHgpXG4gICAgfVxuICAgIHJldHVybiB4XG4gIH1cbiAgcmV0dXJuIG1hcChfZm4sIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGFsbFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWxsIChjYiwgYSkge1xuICBsZXQgcmVzID0gdHJ1ZVxuICBmb3IgKGxldCBpIGluIGEpIHtcbiAgICBpZiAoIWNiKGFbaV0pKSB7XG4gICAgICByZXMgPSBmYWxzZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBwYXNzXG4gKlxuICogQGZ1bmN0aW9uIGFsbFBhc3NcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3NcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLiAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBwcmVkaWNhdGVzIEFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY29tYmluZWQgcHJlZGljYXRlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWxsUGFzcyAoY2JzLCBhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFjYnNbaV0oYSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZSBwcm92aWRlZFxuICpcbiAqIEBmdW5jdGlvbiBhbHdheXNcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZSBwcm92aWRlZFxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsd2F5cyAoeCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4geCB9XG59KVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKlxuICogQGZ1bmN0aW9uIGFuZFxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKHgsIHkpIC0+IGJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCAtIEEgcHJlZGljYXRlXG4gKiBAcGFyYW0geyp9IHkgLSBBIHByZWRpY2F0ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbmQgKHgsIHkpIHtcbiAgcmV0dXJuIHggJiYgeVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uIG9mIHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGFueVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoVE9ETylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueSAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IGZhbHNlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmIChjYihhW2ldKSkge1xuICAgICAgcmVzID0gdHJ1ZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIG9uZSBwYXNzZXNcbiAqXG4gKiBAZnVuY3Rpb24gYW55UGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uKSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBwcmVkaWNhdGVzIEFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY29tYmluZWQgcHJlZGljYXRlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW55UGFzcyAoY2JzLCBhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNic1tpXShhKSkgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKlxuICogQGZ1bmN0aW9uIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJldHVybnMgYSBjb21iaW5lZCByZXN1bHQgYXJyYXlcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAcGFyYW0geyhGdW5jdGlvbltdfEZ1bmN0aW9ufEFwcGxpY2F0aXZlKX0gZm5zIC0gQW4gYXJyYXkgb2YgZnVuY3Rpb25zIG9yIGEgZnVuY3Rpb24gb3IgYW4gYXBwbGljYXRpdmVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHMgLSBBbiBhcnJheSBvZiB2YWx1ZXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG1hcCBmcm9tICcuL2FycmF5L21hcCdcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwIChmbnMsIHZhbHMpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm5zLmFwKSkge1xuICAgIHJldHVybiBmbnMuYXAodmFscylcbiAgfVxuICBpZiAoaXNGdW5jdGlvbihmbnMpKSB7XG4gICAgcmV0dXJuIHggPT4gZm5zKHgpKHZhbHMoeCkpXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgZikgPT4gYWNjLmNvbmNhdChtYXAoY3VycnkxKGYpLCB2YWxzKSksIFtdLCBmbnMpXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBhcGVydHVyZVxuICogQHBhcmFtIG5cbiAqIEBwYXJhbSBhcnJcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcGVydHVyZSAobiwgYSkge1xuICBpZiAoYS5sZW5ndGggPCBuKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgY29uc3QgcmVzID0gQXJyYXkoYS5sZW5ndGggLSBuICsgMSlcbiAgcmV0dXJuIG1hcCgoaXRlbSwgaWR4KSA9PiBhLnNsaWNlKGlkeCwgaWR4ICsgbiksIHJlcylcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcHBlbmRcbiAqIEBkZXNjcmlwdGlvbiBBcHBlbmQgYW4gZWxtZW50IHRvIGEgbGlzdFxuICogQHBhcmFtIHsqfSBlbCAtIEVsZW1lbnQgdG8gYWRkIHRvIGEgbGlzdFxuICogQHBhcmFtIHthcnJheX0gbGlzdCAtIExpc3QgdG8gd2hpY2ggdG8gYWRkIHRoZSBlbGVtZW50XG4gKiBAcmV0dXJuIHthcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbCA9IFswLCAxXVxuICogYXBwZW5kKCdhJywgbCkgLy8gcmV1dG5yIFswLCAxLCAnYSddXG4gKlxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcHBlbmQgKGVsLCBsaXN0KSB7XG4gIHJldHVybiBjb25jYXQobGlzdCwgWyBlbCBdKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFwcGx5XG4gKiBAZGVzY3JpcHRpb24gVGhlIGFwcGx5KCkgbWV0aG9kIGNhbGxzIGEgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHByb3ZpZGVkIGFzIGFuIGFycmF5LCBhbmQgdGhlIGZ1bmN0aW9uIGFzIGNvbnRleHQuXG4gKiBAcGFyYW0gZm5cbiAqIEBwYXJhbSBhcmdzXG4gKiBAcmV0dXJuIHsqfVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYSA9IGFwcGx5KGZ1bmN0aW9uICgpIHtcbiAqICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5tYXAoeCA9PiB4ICogMilcbiAqICAgfSlcbiAqIGEoWzEsIDIsIDNdKVxuICogLy8gWzIsIDQsIDZdXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcHBseSAoZm4sIGFyZ3MpIHtcbiAgcmV0dXJuIGZuLmFwcGx5KGZuLCBhcmdzKVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBhcnJheUNvbmNhdFxuICogQHBhcmFtIGExXG4gKiBAcGFyYW0gYTJcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0KGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGVxdWFsc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gZm9yIGRlZXAgY29tcGFyaXNvbiBvZiBhcnJheXNcbiAqIEBwYXJhbSB7YX0geCAtIE9iamVjdCB0byBjb21wYXJlIG9mIHR5cGUgYVxuICogQHBhcmFtIHthfSB5IC0gT2JqZWN0IHggdG8gY29tcGFyZSB3aXRoIG9iamVjdCB4XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHNBcnJheSAoeCwgeSkge1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vdChlcXVhbHMoeFtpXSwgeVtpXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFycmF5RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcnJheUZpbHRlciAoZm4sIGEpIHtcbiAgdmFyIHIgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZm4oYVtpXSkpIHIucHVzaChhW2ldKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgbWFwcGluZyBvdmVyIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgY2FsbGluZyBhbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtjYkZ1bmN0aW9ufSBjYiAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgaXRlbVxuICogQHBhcmFtIHsqfSBpbml0IC0gSW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gYSAtIEFycmF5IHdpdGggaXRlbXMgdG8gbW9kaWZ5IGJ5IHRoZSBjYiBmdW5jdGlvblxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYWxpYXMgcmVkdWNlXG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gZm9sZChhZGQsIDAsIFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSAzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2JGdW5jdGlvblxuICogQHBhcmFtIHsqfSByIC0gQWNjdW11bGF0b3Igd2hpY2ggYWNjdW11bGF0ZXMgdGhlIGNhbGxiYWNrJ3MgcmV0dXJuIHZhbHVlc1xuICogQHBhcmFtIHsqfSBpdGVtIC0gdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIHRoZSBpbmRleSBvZiB0aGUgaXRlbSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBUaGUgaW5pdGlhbCBhcnJheVxuICogQHJldHVybiB7Kn1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBsZXQgciA9IGluaXRcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2IociwgYVtpXSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IE9iamVjdCB0byB2ZXJpZml5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzQXJyYXkoWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IHRydWVcbiAqL1xuXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdBcnJheScpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgYW4gYXJyYXkgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiAgY29uc3QgcmVzdWx0ID0gbWFwKGlkZW50aXR5LCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFswLDIsM11cbiAqICBjb25zdCBhZGQyID0gYWRkKDIpXG4gKiAgY29uc3QgcmVzdWx0ID0gbWFwKGFkZDIsIFswLDIsM10pXG4gKiAgLy8gcmVzdWx0ID0gWzIsNCw1XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGNvbnN0IHIgPSBuZXcgQXJyYXkobClcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByW2ldID0gY2IoYVtpXSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRvQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gYW4gYXJyYXlcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSB4IC0gT2JqZWN0IHRvIGNvbnZlcnQgdG8gYW4gYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvQXJyYXkoXCJzdHJpbmdcIilcbiAqIC8vIHJlc3VsdCA9IFsncycsJ3QnLCdyJywnaScsJ24nLCdnJ11cbiAqXG4gKiBmdW5jdGlvbiAoKSB7XG4gKiAgY29uc3QgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKVxuICogIGNvbnNvbGUubG9nKHR5cGVvZiBhcmdzKSAvLyBBcnJheVxuICogfVxuICpcbiAqKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvQXJyYXkgKHgpIHtcbiAgcmV0dXJuIHgubGVuZ3RoID09PSAxID8gW3hbMF1dIDogQXJyYXkuYXBwbHkobnVsbCwgeClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB1bmlvbkFycmF5XG4gKiBAZGVzY3JpcHRpb24gTWVyZ2VzIDIgYXJyYXlzXG4gKiBAcGFyYW0ge0FycmF5fSBhTCAtIEFycmF5IHRvIG1lcmdlXG4gKiBAcGFyYW0ge0FycmF5fSBhUiAtIEFycmF5IHRvIG1lcmdlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSB1bmlvbkFycmF5KFswLDEsMl0sIFszLDQsNV0pXG4gKiAvLyByZXN1bHQgPSBbMC4xLjIuMy40LjVdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHVuaW9uQXJyYXkgKGFMLCBhUikge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFMLmNvbmNhdChhUikpKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGJpbmFyeVxuICogQHBhcmFtIGNiXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKj0sICo9KTogKn1cbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gYmluYXJ5IChjYikge1xuICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gY2IoYSwgYilcbiAgfSlcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuLyoqXG4gKiBAZnVuY3Rpb24gYmluZFxuICogQGRlc2NyaXB0aW9uIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHRcbiAqIEBwYXJhbSB7ZnVuY3Rpb24gfWZuXG4gKiBAcGFyYW0geyp9IGNvbnRleHRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBiaW5kIChmbiwgY29udGV4dCkge1xuICByZXR1cm4gZm4uYmluZChjb250ZXh0KVxufSlcbiIsIi8qKlxuICogQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICpcbiAqIEBmdW5jdGlvbiBGXG4gKiBAZGVzY3JpcHRpb24gQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBhbHdheXMgZnJvbSAnLi4vYWx3YXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBhbHdheXMoZmFsc2UpXG4iLCIvKipcbiAqIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqXG4gKiBAZnVuY3Rpb24gVFxuICogQGRlc2NyaXB0aW9uIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgYWx3YXlzIGZyb20gJy4uL2Fsd2F5cydcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzKHRydWUpXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGJvdGggcHJlZGljYXRlcyByZXR1cm4gdHJ1ZVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4xIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjIgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbGlmdCBmcm9tICcuLi9saWZ0J1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJvdGggKGZuMSwgZm4yKSB7XG4gIHJldHVybiBpcygnRnVuY3Rpb24nKShmbjEpXG4gICAgPyBmdW5jdGlvbiBfYm90aCAoKSB7IHJldHVybiBmbjEuYXBwbHkodGhpcywgYXJndW1lbnRzKSAmJiBmbjIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgOiBsaWZ0KGFuZCkoZm4xLCBmbjIpXG59KVxuIiwiLyoqXG4gKiBDdXJyaWVkIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGEgYm9vbGVhblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBDdXJyaWVkIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGEgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBJdGVtIHRvIHZlcmlmeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0Jvb2xlYW4nKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY2FsbFxuICogQHBhcmFtIGZuXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuLy8gaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjYWxsIChmbikge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb21wbGVtZW50XG4gKiBAZGVzY3JpcHRpb24gTGlmdHMgYSBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIGNvbXBsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgbm90XG4gKiBAc2VlIGxpZnRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBsZW1lbnQoaXNFbXB0eSlcbiAqIGlzTm90RW1wdHkoW10pIC8vIGZhbHNlXG4gKiBpc05vdEVtcHR5KHsnYScgOiAxfSkgLy8gdHJ1ZVxuICpcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YoZmFsc2UpKSAvLyB0cnVlXG4gKiBjb21wbGVtZW50KE1heWJlLm9mKHRydWUpKSAvLyBmYWxzZVxuICovXG5pbXBvcnQgbGlmdCBmcm9tICcuL2xpZnQnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuXG5jb25zdCBjb21wbGVtZW50ID0gbGlmdChub3QpXG5leHBvcnQgZGVmYXVsdCBjb21wbGVtZW50XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb21wb3NlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKTogKn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcG9zZSAoKSB7XG4gIGxldCBmbnMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jb21wb3NlICgpIHtcbiAgICBsZXQgaW5pdCA9IGZuc1tmbnMubGVuZ3RoIC0gMV1cbiAgICBsZXQgcmVzdWx0ID0gW2luaXQuYXBwbHkoaW5pdCwgYXJndW1lbnRzKV1cbiAgICBsZXQgaSA9IGZucy5sZW5ndGggLSAyXG5cbiAgICBmb3IgKGk7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBjb25zdCBmbiA9IGZuc1tpXVxuXG4gICAgICByZXN1bHQgPSBbZm4uYXBwbHkoZm4sIHJlc3VsdCldXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRbMF1cbiAgfVxufTtcbiIsIi8qKlxuICogQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqIEBzaW5jZSB2MS4wLjRcbiAqIEBwYXJhbSB7YX0gYSAtIExlZnQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHBhcmFtIHthfSBiIC0gcmlnaHQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHJldHVybiB7YX0gQ29uY2F0ZW5hdGVkIGl0ZW1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlDb25jYXQgZnJvbSAnLi9hcnJheS9jb25jYXQnXG5pbXBvcnQgc3RyaW5nQ29uY2F0IGZyb20gJy4vc3RyaW5nL2NvbmNhdCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ1N0cmluZyc6IHN0cmluZ0NvbmNhdCxcbiAgICAnQXJyYXknOiBhcnJheUNvbmNhdFxuICB9XG4gIHJldHVybiB0eXBlTWFwW3R5cGUoYSldKGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29uZFxuICogQHBhcmFtIGNvbmRzXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmQgKGNvbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29uZHNbaV1bMF0odmFsdWUpKSByZXR1cm4gY29uZHNbaV1bMV0odmFsdWUpXG4gICAgfVxuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuLyoqXG4gKiBAZnVuY3Rpb24gY3VycnlcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycnkgKGZ1bikge1xuICBjb25zdCBhcmdzbGVuID0gZnVuLmxlbmd0aFxuXG4gIGlmIChhcmdzbGVuID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1blxuICB9XG4gIHJldHVybiBjcmVhdGVSZWN1cnNlcihbXSlcblxuICBmdW5jdGlvbiByZWN1cnNlIChhY2MsIGFyZ3MpIHtcbiAgICBjb25zdCBfYWNjID0gYWNjLmNvbmNhdChhcmdzKVxuICAgIHJldHVybiBfYWNjLmxlbmd0aCA8IGFyZ3NsZW5cbiAgICAgID8gY3JlYXRlUmVjdXJzZXIoX2FjYylcbiAgICAgIDogZnVuLmFwcGx5KHRoaXMsIF9hY2MpXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSZWN1cnNlciAoYWNjKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWN1cnNlKGFjYywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIGRpZmZEYXRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIgZGF0ZXMgaW4gbWlsbGlzZWNvbmRcbiAqIEBwYXJhbSB7RGF0ZX0gc3RhcnQgLSBTdGFydCBkYXRlXG4gKiBAcGFyYW0ge0RhdGV9IGVuZCAtIEVuZCBkYXRlXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFJFdHVybiB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkaWZmRGF0ZSAoc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKG5ldyBEYXRlKHN0YXJ0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShlbmQpLmdldFRpbWUoKSlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnRGF0ZScpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDA5LzAzLzIwMTcuXG4gKi9cbmltcG9ydCBkaWZmRGF0ZSBmcm9tICcuL2RpZmZEYXRlJ1xuXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4ge1xuICByZXR1cm4gZGlmZkRhdGUobmV3IERhdGUoKSkoZCkgPCAwXG59XG4iLCIvKipcbiAqXG4gKi9cbmltcG9ydCBpc0RhdGUgZnJvbSAnLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZCAoeCkge1xuICAvLyBub2luc3BlY3Rpb24gSlNDaGVja0Z1bmN0aW9uU2lnbmF0dXJlc1xuICByZXR1cm4gaXNEYXRlKHgpICYmIGlzRmluaXRlKHgudmFsdWVPZigpKVxufTtcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyA4NjQwMDAwMCAvLyAyNCo2MCo2MCoxMDAwID0gODY0MDAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDM2MDAwMDAgLy8gNjAqNjAqMTAwMCA9IDM2MDAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDYwMDAwIC8vIDYwKjEwMDAgPSA2MDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gMTAwMFxyXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBkZWZhdWx0VG9cbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGVmYXVsdFRvIChkLCB2KSB7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB2ID09IG51bGwgfHwgdiAhPT0gdiA/IGQgOiB2XG59KVxuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGVtcHR5IGVxdWl2YWxlbnQgb2YgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW1wdHkgKHgpIHtcbiAgcmV0dXJuIG5ldyB4LmNvbnN0cnVjdG9yKClcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVxdWFsc1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBlcXVhbGl0eSBvZiAyIGl0ZW1zXG4gKiBAcGFyYW0geyp9IHggLSBMZWZ0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcGFyYW0geyp9IHkgLSBSaWdodCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbmFuID0gTnVtYmVyLk5hTlxuICogZXF1YWwobmFuLCBuYW4pIC8vIHJldHVybnMgdHJ1ZVxuICpcbiAqIGNvbnN0IGFycjEgPSBbMCwgMSwgMiwgM11cbiAqIGNvbnN0IGFycjIgPSBbbnVsbCwgMSwgMiwgM11cbiAqIGVxdWFscyhhcnIxLCBhcnIyKSAvLyByZXR1cm5zIGZhbHNlXG4gKlxuICogZXF1YWxzKG5ldyBPYmplY3QoeydhJzogMCwgJ2InOiAxfSksIHsnYSc6IDAsICdiJzogMX0pIC8vIHRydWVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi9pZGVudGljYWwnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuaW1wb3J0IG9yIGZyb20gJy4vb3InXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2FycmF5L2lzJ1xuaW1wb3J0IGlzQm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4vaXMnXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9udW1iZXIvaXMnXG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9zdHJpbmcvaXMnXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vZGF0ZS9pcydcbmltcG9ydCBlcXVhbHNBcnJheSBmcm9tICcuL2FycmF5L2VxdWFscydcbmltcG9ydCBlcXVhbHNPYmplY3QgZnJvbSAnLi9vYmplY3QvZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHMgKHgsIHkpIHtcbiAgaWYgKGlkZW50aWNhbCh4LCB5KSkgcmV0dXJuIHRydWVcblxuICBpZiAodHlwZSh4KSAhPT0gdHlwZSh5KSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKG9yKG5vdChleGlzdHMoeCkpLCBub3QoZXhpc3RzKHkpKSkpIHJldHVybiBmYWxzZVxuXG4gIGlmICh4LmNvbnN0cnVjdG9yICE9PSB5LmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2VcblxuICBpZiAoaXNTdHJpbmcoeCkgfHwgaXNCb29sZWFuKHgpIHx8IGlzTnVtYmVyKHgpIHx8IGlzRGF0ZSh4KSkge1xuICAgIHJldHVybiBpZGVudGljYWwoeC52YWx1ZU9mKCksIHkudmFsdWVPZigpKVxuICB9XG4gIGlmIChpc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc0FycmF5KHgsIHkpXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzT2JqZWN0KHgsIHkpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZXhpc3RzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4aXN0cyAoeCkge1xuICByZXR1cm4gISh4ID09IG51bGwpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZmlsdGVyXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVjbnRpb24gdGhhdCBmaWx0ZXJzIE9iamVjdHMsIEFycmF5cyBhbmQgTWFwc1xuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGaWx0ZXIgZnJvbSAnLi9hcnJheS9maWx0ZXInXG5pbXBvcnQgb2JqZWN0RmlsdGVyIGZyb20gJy4vb2JqZWN0L2ZpbHRlcidcbmltcG9ydCBtYXBGaWx0ZXIgZnJvbSAnLi9tYXAvZmlsdGVyJ1xuLy8gVE9ET1xuLy8gaW1wb3J0IHNldEZpbHRlciBmcm9tICcuLi9zZXQvZmlsdGVyJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmaWx0ZXIgKGZuLCBhKSB7XG4gIHN3aXRjaCAodHlwZShhKSkge1xuICAgIC8vIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKSB7XG4gICAgLy8gY2FzZSAnRnVuY3Rpb24nOlxuICAgIC8vICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgIC8vICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdEZpbHRlcihmbiwgYSlcbiAgICAvLyBjYXNlICdTdHJpbmcnOlxuICAgIC8vICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEZpbHRlcihmbiwgYSlcbiAgICAvLyBjYXNlICdTZXQnOlxuICAgIC8vICAgcmV0dXJuIHNldEZpbHRlcihmbiwgYSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKGZuLCBhKVxuICB9XG59KVxuIiwiLyoqXG4gKiBGaW5kIHRoZSBpbmRleCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBmaW5kSW5kZXhcbiAqIEBkZXNjcmlwdGlvbiBGaW5kIHRoZSBpbmRleCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBib29sZWFuKSAtPiBbYV0gLT4gbnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBQcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IEFuIGFycmF5IGxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmaW5kSW5kZXggKGZuLCBhKSB7XG4gIGxldCBpID0gMFxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgd2hpbGUgKGkgPCBsKSB7XG4gICAgaWYgKGZuKGFbaV0pKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gLTFcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaXJzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGFyciA9IFsxLCAyLCA0XVxuICogZmlyc3QoWzEsIDIsIDRdKSAvLyByZXR1cm5zIDFcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGZpcnN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVswXSA6IHVuZGVmaW5lZFxufSlcbiIsImltcG9ydCBmb2xkIGZyb20gJy4vZm9sZCdcbmltcG9ydCBlbXB0eSBmcm9tICcuL2VtcHR5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzIGZyb20gJy4vaXMnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG4vKipcbiAqIEBmdW5jdGlvbiBmbGF0TWFwXG4gKiBAcGFyYW0gZm5cbiAqIEBwYXJhbSBhXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZsYXRNYXAgKGZuLCBhKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGEpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gZm4oYSh4KSkoeClcbiAgICB9XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oYS5mbGF0TWFwKSkge1xuICAgIHJldHVybiBhLmZsYXRNYXAoZm4pXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4gY29uY2F0KGFjYywgZm4oeCkpLCBlbXB0eShhKSwgYSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICpcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGxpa2Ugb2JqZWN0IGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpdGVtXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICgoYSwgYiwgYywgYSkg4oaSIGEpIOKGkiBhIOKGkiBbYl0g4oaSIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIHJlY2VpdmVzIDQgdmFsdWVzOiB0aGUgYWNjdW11bGF0b3IsIHRoZSBpdGVtLCB0aGUgaW5kZXgsIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7Kn0gYSBpcyB0aGUgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHsqfSBbYl0gdGhlIGFycmF5IGxpa2UgaXRlbSB0byBpdGVyYXRlIG92ZXJcbiAqIEByZXR1cm4geyp9IGEgaXMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlXG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5Rm9sZCBmcm9tICcuL2FycmF5L2ZvbGQnXG5pbXBvcnQgb2JqZWN0Rm9sZCBmcm9tICcuL29iamVjdC9mb2xkJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgYSkge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgICdPYmplY3QnOiBvYmplY3RGb2xkLFxuICAgICdBcnJheSc6IGFycmF5Rm9sZFxuICB9XG4gIC8vIGlmIChhLm5leHQpIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhKVxuICAvLyB9XG4gIC8vIGlmICh0eXBlKFN5bWJvbCkgIT09ICd1bmRlZmluZWQnICYmIGFbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAvLyAgIHJldHVybiBpdGVyYWJsZUZvbGQoY2IsIGluaXQsIGFbU3ltYm9sLml0ZXJhdG9yXSgpKVxuICAvLyB9XG4gIHJldHVybiB0eXBlTWFwW3R5cGUoYSldKGNiLCBpbml0LCBhKVxufSlcblxuLy8gZnVuY3Rpb24gaXRlcmFibGVGb2xkIChjYiwgYWNjLCBnZW4pIHtcbi8vICAgbGV0IHN0ZXAgPSBnZW4ubmV4dCgpXG4vLyAgIHdoaWxlICghc3RlcC5kb25lKSB7XG4vLyAgICAgYWNjID0gY2IoYWNjLCBzdGVwLnZhbHVlKVxuLy8gICAgIHN0ZXAgPSBnZW4ubmV4dCgpXG4vLyAgIH1cbi8vICAgcmV0dXJuIGFjY1xuLy8gfVxuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBpZGVudGljYWxcbiAqIEBkZXNjcmlwdGlvbiBjaGVja3MgZm9yIGlkZW50aW50aWNhbCBpdGVtc1xuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBpc05hbiBmcm9tICcuL251bWJlci9pc05hbidcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaWRlbnRpY2FsICh4LCB5KSB7XG4gIGlmICh4ID09PSAwICYmIHkgPT09IDApIHtcbiAgICByZXR1cm4gMSAvIHggPT09IDEgLyB5XG4gIH1cbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiAhIShpc05hbih4KSAmJiBpc05hbih5KSlcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaWRlbnRpdHkgKHgpIHtcbiAgcmV0dXJuIHhcbn07XG4iLCIvLyBleHBvcnQgeyBkZWZhdWx0IGFzIF9fIH0gZnJvbSAnLi9fXyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwZXJ0dXJlIH0gZnJvbSAnLi9hcGVydHVyZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlTcGVjIH0gZnJvbSAnLi9hcHBseVNwZWMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5VG8gfSBmcm9tICcuL2FwcGx5VG8nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFzY2VuZCB9IGZyb20gJy4vYXNjZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvYyB9IGZyb20gJy4vYXNzb2MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFzc29jUGF0aCB9IGZyb20gJy4vYXNzb2NQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjbGFtcCB9IGZyb20gJy4vY2xhbXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lIH0gZnJvbSAnLi9jbG9uZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcGFyYXRvciB9IGZyb20gJy4vY29tcGFyYXRvcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZUsgfSBmcm9tICcuL2NvbXBvc2VLJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlUCB9IGZyb20gJy4vY29tcG9zZVAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VXaXRoIH0gZnJvbSAnLi9jb21wb3NlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29uc3RydWN0IH0gZnJvbSAnLi9jb25zdHJ1Y3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdE4gfSBmcm9tICcuL2NvbnN0cnVjdE4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnRhaW5zIH0gZnJvbSAnLi9jb250YWlucydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29udmVyZ2UgfSBmcm9tICcuL2NvbnZlcmdlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb3VudEJ5IH0gZnJvbSAnLi9jb3VudEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWMgfSBmcm9tICcuL2RlYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGVzY2VuZCB9IGZyb20gJy4vZGVzY2VuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZmVyZW5jZSB9IGZyb20gJy4vZGlmZmVyZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZmVyZW5jZVdpdGggfSBmcm9tICcuL2RpZmZlcmVuY2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXNzb2MgfSBmcm9tICcuL2Rpc3NvYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlzc29jUGF0aCB9IGZyb20gJy4vZGlzc29jUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcCB9IGZyb20gJy4vZHJvcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3QgfSBmcm9tICcuL2Ryb3BMYXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wTGFzdFdoaWxlIH0gZnJvbSAnLi9kcm9wTGFzdFdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0cyB9IGZyb20gJy4vZHJvcFJlcGVhdHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzV2l0aCB9IGZyb20gJy4vZHJvcFJlcGVhdHNXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wV2hpbGUgfSBmcm9tICcuL2Ryb3BXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZWl0aGVyIH0gZnJvbSAnLi9laXRoZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVuZHNXaXRoIH0gZnJvbSAnLi9lbmRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZXFCeSB9IGZyb20gJy4vZXFCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZXFQcm9wcyB9IGZyb20gJy4vZXFQcm9wcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZXZvbHZlIH0gZnJvbSAnLi9ldm9sdmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmQgfSBmcm9tICcuL2ZpbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRMYXN0IH0gZnJvbSAnLi9maW5kTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZExhc3RJbmRleCB9IGZyb20gJy4vZmluZExhc3RJbmRleCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmxhdHRlbiB9IGZyb20gJy4vZmxhdHRlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmxpcCB9IGZyb20gJy4vZmxpcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZm9yRWFjaCB9IGZyb20gJy4vZm9yRWFjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZm9yRWFjaE9iakluZGV4ZWQgfSBmcm9tICcuL2ZvckVhY2hPYmpJbmRleGVkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmcm9tUGFpcnMgfSBmcm9tICcuL2Zyb21QYWlycydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3JvdXBCeSB9IGZyb20gJy4vZ3JvdXBCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3JvdXBXaXRoIH0gZnJvbSAnLi9ncm91cFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGd0IH0gZnJvbSAnLi9ndCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3RlIH0gZnJvbSAnLi9ndGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGhhc1BhdGggfSBmcm9tICcuL2hhc1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGhlYWQgfSBmcm9tICcuL2hlYWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGlmRWxzZSB9IGZyb20gJy4vaWZFbHNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmMgfSBmcm9tICcuL2luYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5jbHVkZXMgfSBmcm9tICcuL2luY2x1ZGVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmRleEJ5IH0gZnJvbSAnLi9pbmRleEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmRleE9mIH0gZnJvbSAnLi9pbmRleE9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbml0IH0gZnJvbSAnLi9pbml0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbm5lckpvaW4gfSBmcm9tICcuL2lubmVySm9pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5zZXJ0IH0gZnJvbSAnLi9pbnNlcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluc2VydEFsbCB9IGZyb20gJy4vaW5zZXJ0QWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRlcnNlY3Rpb24gfSBmcm9tICcuL2ludGVyc2VjdGlvbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJzcGVyc2UgfSBmcm9tICcuL2ludGVyc3BlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRvIH0gZnJvbSAnLi9pbnRvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZlcnQgfSBmcm9tICcuL2ludmVydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52ZXJ0T2JqIH0gZnJvbSAnLi9pbnZlcnRPYmonXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludm9rZXIgfSBmcm9tICcuL2ludm9rZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGpvaW4gfSBmcm9tICcuL2pvaW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGp1eHQgfSBmcm9tICcuL2p1eHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxhc3RJbmRleE9mIH0gZnJvbSAnLi9sYXN0SW5kZXhPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuZ3RoIH0gZnJvbSAnLi9sZW5ndGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnMgfSBmcm9tICcuL2xlbnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNJbmRleCB9IGZyb20gJy4vbGVuc0luZGV4J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUGF0aCB9IGZyb20gJy4vbGVuc1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNQcm9wIH0gZnJvbSAnLi9sZW5zUHJvcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdE4gfSBmcm9tICcuL2xpZnROJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsdCB9IGZyb20gJy4vbHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGx0ZSB9IGZyb20gJy4vbHRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bSB9IGZyb20gJy4vbWFwQWNjdW0nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hcEFjY3VtUmlnaHQgfSBmcm9tICcuL21hcEFjY3VtUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hcE9iakluZGV4ZWQgfSBmcm9tICcuL21hcE9iakluZGV4ZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hdGNoIH0gZnJvbSAnLi9tYXRjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWF0aE1vZCB9IGZyb20gJy4vbWF0aE1vZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4QnkgfSBmcm9tICcuL21heEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZWFuIH0gZnJvbSAnLi9tZWFuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZWRpYW4gfSBmcm9tICcuL21lZGlhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVtb2l6ZVdpdGggfSBmcm9tICcuL21lbW9pemVXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZUFsbCB9IGZyb20gJy4vbWVyZ2VBbGwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcExlZnQgfSBmcm9tICcuL21lcmdlRGVlcExlZnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFJpZ2h0IH0gZnJvbSAnLi9tZXJnZURlZXBSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwV2l0aCB9IGZyb20gJy4vbWVyZ2VEZWVwV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwV2l0aEtleSB9IGZyb20gJy4vbWVyZ2VEZWVwV2l0aEtleSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VMZWZ0IH0gZnJvbSAnLi9tZXJnZUxlZnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlUmlnaHQgfSBmcm9tICcuL21lcmdlUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlV2l0aCB9IGZyb20gJy4vbWVyZ2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVdpdGhLZXkgfSBmcm9tICcuL21lcmdlV2l0aEtleSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWluIH0gZnJvbSAnLi9taW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1pbkJ5IH0gZnJvbSAnLi9taW5CeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbW9kdWxvIH0gZnJvbSAnLi9tb2R1bG8nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1vdmUgfSBmcm9tICcuL21vdmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG5BcnkgfSBmcm9tICcuL25BcnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG5lZ2F0ZSB9IGZyb20gJy4vbmVnYXRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBub25lIH0gZnJvbSAnLi9ub25lJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBudGggfSBmcm9tICcuL250aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoQXJnIH0gZnJvbSAnLi9udGhBcmcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG8gfSBmcm9tICcuL28nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9iak9mIH0gZnJvbSAnLi9vYmpPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb2YgfSBmcm9tICcuL29mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvbmNlIH0gZnJvbSAnLi9vbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvdGhlcndpc2UgfSBmcm9tICcuL290aGVyd2lzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb3ZlciB9IGZyb20gJy4vb3Zlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFpciB9IGZyb20gJy4vcGFpcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGlhbCB9IGZyb20gJy4vcGFydGlhbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGlhbFJpZ2h0IH0gZnJvbSAnLi9wYXJ0aWFsUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpdGlvbiB9IGZyb20gJy4vcGFydGl0aW9uJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoRXEgfSBmcm9tICcuL3BhdGhFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aE9yIH0gZnJvbSAnLi9wYXRoT3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhTYXRpc2ZpZXMgfSBmcm9tICcuL3BhdGhTYXRpc2ZpZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpY2tBbGwgfSBmcm9tICcuL3BpY2tBbGwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpY2tCeSB9IGZyb20gJy4vcGlja0J5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlIH0gZnJvbSAnLi9waXBlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlSyB9IGZyb20gJy4vcGlwZUsnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVQIH0gZnJvbSAnLi9waXBlUCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZVdpdGggfSBmcm9tICcuL3BpcGVXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwbHVjayB9IGZyb20gJy4vcGx1Y2snXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByZXBlbmQgfSBmcm9tICcuL3ByZXBlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb2R1Y3QgfSBmcm9tICcuL3Byb2R1Y3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb2plY3QgfSBmcm9tICcuL3Byb2plY3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BFcSB9IGZyb20gJy4vcHJvcEVxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wSXMgfSBmcm9tICcuL3Byb3BJcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcE9yIH0gZnJvbSAnLi9wcm9wT3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BzIH0gZnJvbSAnLi9wcm9wcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcFNhdGlzZmllcyB9IGZyb20gJy4vcHJvcFNhdGlzZmllcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmFuZ2UgfSBmcm9tICcuL3JhbmdlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2UgfSBmcm9tICcuL3JlZHVjZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlQnkgfSBmcm9tICcuL3JlZHVjZUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VkIH0gZnJvbSAnLi9yZWR1Y2VkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VSaWdodCB9IGZyb20gJy4vcmVkdWNlUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZVdoaWxlIH0gZnJvbSAnLi9yZWR1Y2VXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVqZWN0IH0gZnJvbSAnLi9yZWplY3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlbW92ZSB9IGZyb20gJy4vcmVtb3ZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXBlYXQgfSBmcm9tICcuL3JlcGVhdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwbGFjZSB9IGZyb20gJy4vcmVwbGFjZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmV2ZXJzZSB9IGZyb20gJy4vcmV2ZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2NhbiB9IGZyb20gJy4vc2Nhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2VxdWVuY2UgfSBmcm9tICcuL3NlcXVlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXQgfSBmcm9tICcuL3NldCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2xpY2UgfSBmcm9tICcuL3NsaWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0IH0gZnJvbSAnLi9zb3J0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0QnkgfSBmcm9tICcuL3NvcnRCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydFdpdGggfSBmcm9tICcuL3NvcnRXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdCB9IGZyb20gJy4vc3BsaXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0QXQgfSBmcm9tICcuL3NwbGl0QXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0RXZlcnkgfSBmcm9tICcuL3NwbGl0RXZlcnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0V2hlbiB9IGZyb20gJy4vc3BsaXRXaGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzdGFydHNXaXRoIH0gZnJvbSAnLi9zdGFydHNXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzdWJ0cmFjdCB9IGZyb20gJy4vc3VidHJhY3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN5bW1ldHJpY0RpZmZlcmVuY2UgfSBmcm9tICcuL3N5bW1ldHJpY0RpZmZlcmVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoIH0gZnJvbSAnLi9zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFpbCB9IGZyb20gJy4vdGFpbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZSB9IGZyb20gJy4vdGFrZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3QgfSBmcm9tICcuL3Rha2VMYXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlTGFzdFdoaWxlIH0gZnJvbSAnLi90YWtlTGFzdFdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlV2hpbGUgfSBmcm9tICcuL3Rha2VXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFwIH0gZnJvbSAnLi90YXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRlc3QgfSBmcm9tICcuL3Rlc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRoZW4gfSBmcm9tICcuL3RoZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRodW5raWZ5IH0gZnJvbSAnLi90aHVua2lmeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGltZXMgfSBmcm9tICcuL3RpbWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0xvd2VyIH0gZnJvbSAnLi90b0xvd2VyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1BhaXJzIH0gZnJvbSAnLi90b1BhaXJzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1BhaXJzSW4gfSBmcm9tICcuL3RvUGFpcnNJbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TdHJpbmcgfSBmcm9tICcuL3RvU3RyaW5nJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1VwcGVyIH0gZnJvbSAnLi90b1VwcGVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmFuc2R1Y2UgfSBmcm9tICcuL3RyYW5zZHVjZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhbnNwb3NlIH0gZnJvbSAnLi90cmFuc3Bvc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYXZlcnNlIH0gZnJvbSAnLi90cmF2ZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJpbSB9IGZyb20gJy4vdHJpbSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJ5Q2F0Y2ggfSBmcm9tICcuL3RyeUNhdGNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmFwcGx5IH0gZnJvbSAnLi91bmFwcGx5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmFyeSB9IGZyb20gJy4vdW5hcnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuY3VycnlOIH0gZnJvbSAnLi91bmN1cnJ5Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5mb2xkIH0gZnJvbSAnLi91bmZvbGQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaW9uV2l0aCB9IGZyb20gJy4vdW5pb25XaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlxIH0gZnJvbSAnLi91bmlxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlxQnkgfSBmcm9tICcuL3VuaXFCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcVdpdGggfSBmcm9tICcuL3VuaXFXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmxlc3MgfSBmcm9tICcuL3VubGVzcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5uZXN0IH0gZnJvbSAnLi91bm5lc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVudGlsIH0gZnJvbSAnLi91bnRpbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdXBkYXRlIH0gZnJvbSAnLi91cGRhdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVzZVdpdGggfSBmcm9tICcuL3VzZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHZhbHVlc0luIH0gZnJvbSAnLi92YWx1ZXNJbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdmlldyB9IGZyb20gJy4vdmlldydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlbiB9IGZyb20gJy4vd2hlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmUgfSBmcm9tICcuL3doZXJlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVyZUVxIH0gZnJvbSAnLi93aGVyZUVxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aXRob3V0IH0gZnJvbSAnLi93aXRob3V0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB4cHJvZCB9IGZyb20gJy4veHByb2QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHppcE9iaiB9IGZyb20gJy4vemlwT2JqJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGQgfSBmcm9tICcuL251bWJlci9hZGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkZEluZGV4IH0gZnJvbSAnLi9hZGRJbmRleCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRqdXN0IH0gZnJvbSAnLi9hZGp1c3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkanVzdFdpdGggfSBmcm9tICcuL2FkanVzdFdpdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsbCB9IGZyb20gJy4vYWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGxQYXNzIH0gZnJvbSAnLi9hbGxQYXNzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbHdheXMgfSBmcm9tICcuL2Fsd2F5cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW5kIH0gZnJvbSAnLi9hbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFueSB9IGZyb20gJy4vYW55J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnlQYXNzIH0gZnJvbSAnLi9hbnlQYXNzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcCB9IGZyb20gJy4vYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGVuZCB9IGZyb20gJy4vYXBwZW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseSB9IGZyb20gJy4vYXBwbHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJpbmFyeSB9IGZyb20gJy4vYmluYXJ5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5kIH0gZnJvbSAnLi9iaW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBib3RoIH0gZnJvbSAnLi9ib29sZWFuL2JvdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNhbGwgfSBmcm9tICcuL2NhbGwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBsZW1lbnQgfSBmcm9tICcuL2NvbXBsZW1lbnQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2UgfSBmcm9tICcuL2NvbXBvc2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbmNhdCB9IGZyb20gJy4vY29uY2F0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25kIH0gZnJvbSAnLi9jb25kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjdXJyeSB9IGZyb20gJy4vY3VycnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRlZmF1bHRUbyB9IGZyb20gJy4vZGVmYXVsdFRvJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmRGF0ZSB9IGZyb20gJy4vZGF0ZS9kaWZmRGF0ZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGl2aWRlIH0gZnJvbSAnLi9udW1iZXIvZGl2aWRlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlbXB0eSB9IGZyb20gJy4vZW1wdHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGVxdWFscyB9IGZyb20gJy4vZXF1YWxzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBleGlzdHMgfSBmcm9tICcuL2V4aXN0cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRiB9IGZyb20gJy4vYm9vbGVhbi9GJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaWx0ZXIgfSBmcm9tICcuL2ZpbHRlcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZEluZGV4IH0gZnJvbSAnLi9maW5kSW5kZXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpcnN0IH0gZnJvbSAnLi9maXJzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmxhdE1hcCB9IGZyb20gJy4vZmxhdE1hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZm9sZCB9IGZyb20gJy4vZm9sZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZm9ybWF0U3RyaW5nIH0gZnJvbSAnLi9zdHJpbmcvZm9ybWF0U3RyaW5nJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXMgfSBmcm9tICcuL29iamVjdC9oYXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhc0luIH0gZnJvbSAnLi9vYmplY3QvaGFzSW4nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlkZW50aWNhbCB9IGZyb20gJy4vaWRlbnRpY2FsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGl0eSB9IGZyb20gJy4vaWRlbnRpdHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzIH0gZnJvbSAnLi9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNBcnJheSB9IGZyb20gJy4vYXJyYXkvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQm9vbGVhbiB9IGZyb20gJy4vYm9vbGVhbi9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNEYXRlIH0gZnJvbSAnLi9kYXRlL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0VtcHR5IH0gZnJvbSAnLi9pc0VtcHR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Z1dHVyZURhdGUgfSBmcm9tICcuL2RhdGUvaXNGdXR1cmVEYXRlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc01hcCB9IGZyb20gJy4vbWFwL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc05hbiB9IGZyb20gJy4vbnVtYmVyL2lzTmFuJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc051bGwgfSBmcm9tICcuL251bGwvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTnVtYmVyIH0gZnJvbSAnLi9udW1iZXIvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzT2JqZWN0IH0gZnJvbSAnLi9vYmplY3QvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzU2V0IH0gZnJvbSAnLi9zZXQvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzU3RyaW5nIH0gZnJvbSAnLi9zdHJpbmcvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi91bmRlZmluZWQvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVmFsaWREYXRlIH0gZnJvbSAnLi9kYXRlL2lzVmFsaWQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEp1c3QgfSBmcm9tICcuL21vbmFkcy9KdXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBrZXlzIH0gZnJvbSAnLi9rZXlzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBrZXlzSW4gfSBmcm9tICcuL29iamVjdC9rZXlzSW4nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGxhc3QgfSBmcm9tICcuL2xhc3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGxpZnQgfSBmcm9tICcuL2xpZnQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1hcCB9IGZyb20gJy4vbWFwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXggfSBmcm9tICcuL21heCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWF5YmUgfSBmcm9tICcuL21vbmFkcy9NYXliZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2UgfSBmcm9tICcuL29iamVjdC9tZXJnZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbXVsdGlwbHkgfSBmcm9tICcuL251bWJlci9tdWx0aXBseSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbm90IH0gZnJvbSAnLi9ub3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE5vdGhpbmcgfSBmcm9tICcuL21vbmFkcy9Ob3RoaW5nJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvbWl0IH0gZnJvbSAnLi9vYmplY3Qvb21pdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb3IgfSBmcm9tICcuL29yJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoIH0gZnJvbSAnLi9vYmplY3QvcGF0aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGljayB9IGZyb20gJy4vb2JqZWN0L3BpY2snXG5leHBvcnQgeyBkZWZhdWx0IGFzIHByb3AgfSBmcm9tICcuL29iamVjdC9wcm9wJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdW0gfSBmcm9tICcuL251bWJlci9zdW0nXG5leHBvcnQgeyBkZWZhdWx0IGFzIFQgfSBmcm9tICcuL2Jvb2xlYW4vVCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9EYXkgfSBmcm9tICcuL2RhdGUvdG9EYXknXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvSG91ciB9IGZyb20gJy4vZGF0ZS90b0hvdXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvTWludXRlcyB9IGZyb20gJy4vZGF0ZS90b01pbnV0ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvU2Vjb25kcyB9IGZyb20gJy4vZGF0ZS90b1NlY29uZHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRydXRoeSB9IGZyb20gJy4vdHJ1dGh5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0eXBlIH0gZnJvbSAnLi90eXBlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbiB9IGZyb20gJy4vYXJyYXkvdW5pb24nXG5leHBvcnQgeyBkZWZhdWx0IGFzIHZhbHVlcyB9IGZyb20gJy4vb2JqZWN0L3ZhbHVlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgemlwIH0gZnJvbSAnLi96aXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcFdpdGggfSBmcm9tICcuL3ppcFdpdGgnXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIFZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudFxuICpcbiAqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaXMgKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdHlwZSh2YWwpID09PSBDdG9yXG59KVxuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGVtcHR5IGVxdWl2YWxlbnQgb2YgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKi9cbmltcG9ydCBlbXB0eSBmcm9tICcuL2VtcHR5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzRW1wdHkgKHgpIHtcbiAgcmV0dXJuIGV4aXN0cyh4KSAmJiBlcXVhbHMoeCwgZW1wdHkoeCkpXG59O1xuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJdGVyIChpdGVyKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSlcbn1cbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIEl0ZXJhdG9yIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjNcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhdG9yfSBhXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYWxsYmFjaywgaXRlcmF0b3IpIHtcbiAgbGV0IHIgPSBbXVxuICBmb3IgKGxldCBuZXh0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7IG5leHRWYWx1ZS5kb25lICE9PSB0cnVlOyBuZXh0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCkpIHtcbiAgICByLnB1c2goY2FsbGJhY2soaXRlcmF0b3IudmFsdWUoKSkpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBpdGVyYXRvclxuICpcbiAqIEBmdW5jdGlvbiBrZXlzXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IG9yIGl0ZXJhdG9yXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIG9iaiAtPiBbKl1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBPYmogZnJvbSB6aGljaCB0byB0YWtlIHRoZSBrZXlzXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG9iamVjdEtleXMgZnJvbSAnLi9vYmplY3Qva2V5cydcbmltcG9ydCBtYXBLZXlzIGZyb20gJy4vbWFwL2tleXMnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAob2JqKSB7XG4gIHN3aXRjaCAodHlwZShvYmopKSB7XG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBtYXBLZXlzKG9iailcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9iamVjdEtleXMob2JqKVxuICB9XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbGFzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVthLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkXG59KVxuIiwiLyoqXG4gKiBcImxpZnRzXCIgYSBmdW5jdGlvbiBvZiBhcml0eSA+IDEgc28gdGhhdCBpdCBtYXkgXCJtYXAgb3ZlclwiIGEgbGlzdCwgRnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBmb2xkIGZyb20gJy4vZm9sZCdcbmltcG9ydCBhcCBmcm9tICcuL2FwJ1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbGlmdCAoZm4pIHtcbiAgY29uc3QgbGlmdGVkID0gY3VycnkxKGN1cnJ5KGZuKSlcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIF9saWZ0ICgpIHtcbiAgICByZXR1cm4gZm9sZChhcCwgbWFwKGxpZnRlZCwgYXJndW1lbnRzWzBdKSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbiAgfSlcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBpdGVyYWJsZSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIG1hcHMgb3ZlciBhbiBpdGVyYWJsZS5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IGIgLT4gYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5pbXBvcnQgb2JqZWN0TWFwIGZyb20gJy4vb2JqZWN0L21hcCdcbmltcG9ydCBtYXBNYXAgZnJvbSAnLi9tYXAvbWFwJ1xuaW1wb3J0IHN0cmluZ01hcCBmcm9tICcuL3N0cmluZy9tYXAnXG5pbXBvcnQgaXRlcmF0b3JNYXAgZnJvbSAnLi9pdGVyYXRvci9tYXAnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgaXNJdGVyYXRvciBmcm9tICcuL2l0ZXJhdG9yL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIHN3aXRjaCAodHlwZShhKSkge1xuICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiBjdXJyeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjYi5jYWxsKHRoaXMsIGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSlcbiAgICAgIH0pXG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBvYmplY3RNYXAoY2IsIGEpXG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdNYXAoY2IsIGEpXG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBtYXBNYXAoY2IsIGEpXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGFycmF5TWFwKGNiLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gaXNJdGVyYXRvcihhKVxuICAgICAgICA/IGl0ZXJhdG9yTWFwKGNiLCBhKVxuICAgICAgICA6IGFycmF5TWFwKGNiLCBhKVxuICB9XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwRmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXBGaWx0ZXIgKGZuLCBtKSB7XG4gIGxldCByID0gbmV3IE1hcCgpXG5cbiAgbGV0IGl0ID0gbS5lbnRyaWVzKClcbiAgbGV0IHJlc3VsdCA9IGl0Lm5leHQoKVxuXG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBrID0gcmVzdWx0LnZhbHVlWzBdXG4gICAgY29uc3QgdiA9IHJlc3VsdC52YWx1ZVsxXVxuICAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgICByZXN1bHQgPSBpdC5uZXh0KClcbiAgfVxuXG4gIC8vIExpbWl0ZWQgYnJvd3NlciBzdXBwb3J0XG4gIC8vIG0uZm9yRWFjaCgodiwgaykgPT4ge1xuICAvLyAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgLy8gfSlcblxuICAvLyBiYWJlbCB0cmFuc3BpbGUgaXNzdWVzXG4gIC8vIGZvciAoY29uc3QgW2ssIHZdIG9mIG0uZW50cmllcygpKSB7XG4gIC8vXG4gIC8vIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ01hcCcpXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIG93biBrZXlzIG9mIGFuIE1hcCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICByZXR1cm4gYS5rZXlzKClcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIE1hcCBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtNYXB9IGFcbiAqIEByZXR1cm4ge01hcH1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBlbXB0eSBmcm9tICcuLi9lbXB0eSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBjb25zdCByID0gZW1wdHkoYSlcbiAgYS5mb3JFYWNoKCh2LCBrLCBtYXApID0+IHtcbiAgICByLnNldChrLCBjYih2LCBrLCBtYXApKVxuICB9KVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VzdCBvZiB0aGUgMiBhcmd1bWVudHMgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gbWF4XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXggKGEsIGIpIHtcbiAgcmV0dXJuIGIgPiBhID8gYiA6IGFcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBKdXN0XG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJucyB7SnVzdH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgSnVzdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fdmFsdWUgPSB2YWxcbiAgcmV0dXJuIHRoaXNcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuSnVzdC5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgSnVzdFxuIiwiaW1wb3J0IEp1c3QgZnJvbSAnLi9KdXN0J1xuaW1wb3J0IE5vdGhpbmcgZnJvbSAnLi9Ob3RoaW5nJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBNYXliZVxuICogQHBhcmFtIHZhbFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBNYXliZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fX3ZhbHVlID0gdmFsXG59XG5cbk1heWJlLm9mID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgTWF5YmUpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXliZSkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXliZSh2YWwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gdGhpcy5pc05vdGhpbmcoKSA/IG4gOiB0aGlzLl9fdmFsdWVcbn1cblxuTWF5YmUucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIGlmICh0aGlzLmlzTm90aGluZygpKSB7XG4gICAgcmV0dXJuIE1heWJlLm9mKG51bGwpXG4gIH1cbiAgcmV0dXJuIE1heWJlLm9mKGYodGhpcy5fX3ZhbHVlKSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKG0pIHtcbiAgcmV0dXJuIG0ubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLl9fdmFsdWUgPT0gbnVsbClcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICF0aGlzLmlzTm90aGluZygpXG59XG5cbk1heWJlLnByb3RvdHlwZS5Ob3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KHRoaXMuX3ZhbHVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXliZVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gTm90aGluZ1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xufVxuXG5Ob3RoaW5nLnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuTm90aGluZy5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBOb3RoaW5nXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBub3RcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG5vdCAoeCkge1xuICByZXR1cm4gIXhcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnbnVsbCcpXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgMiBhcmd1bWVudHNcbiAqXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgc3VtIG9mIHRoZSAyIGFyZ3VtZW50c1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICByZXR1cm4gK2EgKyArYlxufSlcbiIsIi8qKlxuICpcbiAqXG4gKiBAZnVuY3Rpb24gZGl2aWRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGl2aXNpb24gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGl2aWRlIChhLCBiKSB7XG4gIHJldHVybiArYSAvICtiXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdOdW1iZXInKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNOYU5cbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgbnVtYmVyIGlzIE5BTlxuXG4gKi9cbmltcG9ydCBpc051bWJlciBmcm9tICcuL2lzJ1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTmFuICh4KSB7XG4gIHJldHVybiBhbmQoaXNOdW1iZXIoeCksIGlzTmFOKHgpKVxufTtcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgMiBhcmd1bWVudHNcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtdWx0aXBseSAoYSwgYikge1xuICByZXR1cm4gK2EgKiArYlxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIGluIGFuIGFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGFkZCBmcm9tICcuL2FkZCdcbmltcG9ydCBmb2xkIGZyb20gJy4uL2ZvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHN1bSAoYSkge1xuICByZXR1cm4gZm9sZChhZGQsIDAsIGEpXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4uL2V4aXN0cydcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KCh4LCB5KSA9PiB7XG4gIGZvciAobGV0IGtleVggaW4geCkge1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VuZmlsdGVyZWRGb3JJbkxvb3BcbiAgICBpZiAobm90KGVxdWFscyh4W2tleVhdLCB5W2tleVhdKSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQga2V5WSBpbiB5KSB7XG4gICAgaWYgKG5vdChleGlzdHMoeFtrZXlZXSkpICYmIGV4aXN0cyh5W2tleVldKSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG9iamVjdEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gb2JqZWN0RmlsdGVyIChmbiwgbykge1xuICBsZXQgciA9IHt9XG4gIGNvbnN0IGsgPSBrZXlzKG8pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmbihvW2tbaV1dKSkgcltrW2ldXSA9IG9ba1tpXV1cbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBvKSB7XG4gIGNvbnN0IGsgPSBrZXlzKG8pXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGxldCByID0gT2JqZWN0KGluaXQpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIG9ba1tpXV0sIGtbaV0sIG8pXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzIChwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHksIGV2ZW4gaWYgaXQgaXMgaW5oZXJpdGVkXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIHtTdHJpbmd9IC0+IHtPYmplY3R9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBoYXNJbiAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBwcm9wIGluIG9ialxufSlcbiIsIi8qKlxuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ09iamVjdCcpXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIG93biBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoT2JqZWN0KGEpKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhbGwgdGhlIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIGNvbnN0IHIgPSBbXVxuICBmb3IgKGNvbnN0IGsgaW4gYSkge1xuICAgIHIucHVzaChrKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gb2JqZWN0IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHJldHVybiB7T2JqZWN0fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IGsgPSBrZXlzKGEpXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJba1tpXV0gPSBjYihhW2tbaV1dLCBrW2ldLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgaWRlbnRpY2FsIGZyb20gJy4uL2lkZW50aWNhbCdcbmltcG9ydCBpc09iamVjdCBmcm9tICcuLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuLi9hcnJheS9pcydcbmltcG9ydCB1bmlvbiBmcm9tICcuLi9hcnJheS91bmlvbidcblxuY29uc3QgbWVyZ2UgPSBjdXJyeSgob2JqTCwgb2JqUikgPT4ge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcblxuICBpZiAoaWRlbnRpY2FsKG9iakwsIG9ialIpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iakwpXG4gIH1cbiAgZm9yIChsZXQga2V5IGluIG9ialIpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpSLCBrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBvbGRWYWx1ZSA9IG9ialJba2V5XVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gb2JqTFtrZXldXG5cbiAgICBpZiAoaXNPYmplY3Qob2xkVmFsdWUpICYmIGlzT2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB1bmlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gb2xkVmFsdWUgLy8gVE9ETzogdGhpcyBpcyBhIHJlZmVyZW5jZSwgc2hvdWxkIGJlIGNsb25lXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoKG9iaiwgbmFtZXMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHt9XG5cbiAgT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIHJldHVybiBuYW1lcy5pbmRleE9mKGtleSkgPT09IC0xXG4gIH0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHBhdGhcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwYXRoIChwYXRoLCBvYmopIHtcbiAgbGV0IHZhbCA9IG9ialxuICBsZXQgaWR4ID0gMFxuICBsZXQgcFxuICB3aGlsZSAoaWR4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBwID0gcGF0aFtpZHhdXG4gICAgdmFsID0gTnVtYmVyLmlzSW50ZWdlcihwKVxuICAgICAgPyBwIDwgMCA/IHZhbFt2YWwubGVuZ3RoICsgcF0gOiB2YWxbcF1cbiAgICAgIDogdmFsW3BdXG4gICAgaWR4ICs9IDFcbiAgfVxuICByZXR1cm4gdmFsXG59KVxuLy8gbGV0IHIgPSBvYmpcbi8vIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuLy8gICBpZiAociA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4vLyAgIHIgPSByW3BhdGhbaV1dXG4vLyB9XG4vLyByZXR1cm4gclxuLy8gfSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHBpY2tcbiAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIGEgbmV3IGJqZWN0IHdpdGggb25seSB0aGUgcHJvcHMgdGhhdCBhcmUgcHJvdmlkZWRcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIC0gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgcHJvcGVydGllc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBpY2sgKHByb3BzLCBvYmopIHtcbiAgY29uc3QgciA9IHt9XG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IHByb3BzLmxlbmd0aCkge1xuICAgIGlmIChwcm9wc1tpXSBpbiBvYmopIHtcbiAgICAgIHJbcHJvcHNbaV1dID0gb2JqW3Byb3BzW2ldXVxuICAgIH1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHByb3BcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwcm9wIChwLCBvYmopIHtcbiAgcmV0dXJuIG9ialtwXVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHZhbHVlc1xuICogQGRlc2NyaXB0aW9uIFJFdHVybnMgYSBsaXN0IG9mIHZhbHVlcyB0YWtlbiBmcm9tIGFuIG9iamVjdHMgb3duIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSAtIG9iaiBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgdmFsdWVzXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqXG4gKiovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4uL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIHZhbHVlcyAob2JqKSB7XG4gIGNvbnN0IGsgPSBrZXlzKG9iailcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBbXVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKGkgPCBsKSB7XG4gICAgcltpXSA9IG9ialtrW2ldXVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb3JcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgb25lIG9yIHRoZSBvdGhlciBpcyB0cnVlXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvciAoeCwgeSkge1xuICByZXR1cm4geCB8fCB5XG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTZXQnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIHN0cmluZ0NvbmNhdFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikgeyAvLyB1c2UgZnVuY3Rpb24oKSwgYXJyb3cgZnVuY3Rpb24gZG9lc24ndCBiaW5kIGFyZ3VtZW50c1xuICByZXR1cm4gU3RyaW5nKGEpICsgU3RyaW5nKGIpXG59XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXG4gKi9cbmltcG9ydCB0b0FycmF5IGZyb20gJy4uL2FycmF5L3RvJ1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFN0cmluZyAoc3RyKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIGxldCBhcmdzID0gdG9BcnJheShhcmd1bWVudHMpXG5cbiAgYXJncy5zaGlmdCgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgveyhcXGQrKX0vZywgKG1hdGNoLCBpZHgpID0+IHtcbiAgICByZXR1cm4gbm90KGlzKCdVbmRlZmluZWQnLCBhcmdzW2lkeF0pKSA/IGFyZ3NbaWR4XSA6IG1hdGNoXG4gIH0pXG59XG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTdHJpbmcnKVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBzdHJpbmcgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGxldCByID0gJydcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByICs9IGNiKGEuY2hhckF0KGkpLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHJ1dGh5XG4gKi9cbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRydXRoeSAoeCkge1xuICByZXR1cm4gKHggIT09IGZhbHNlKSAmJiBleGlzdHMoeClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0eXBlXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiB0eXBlICh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkuc2xpY2UoOCwgLTEpXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMy8wMi8yMDE5XG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ3VuZGVmaW5lZCcpXG4iLCIvKipcblxuICogemlwXG4gKlxuICogQGZ1bmN0aW9uIHppcFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCB6aXBXaXRoIGZyb20gJy4vemlwV2l0aCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gemlwIChhLCBiKSB7XG4gIHJldHVybiB6aXBXaXRoKGZ1bmN0aW9uIF96aXBXaXRoICh4LCB5KSB7IHJldHVybiBbeCwgeV0gfSwgYSwgYilcbn0pXG4iLCIvKipcblxuICogemlwV2l0aFxuICpcbiAqICBAZnVuY3Rpb24gemlwV2l0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gemlwV2l0aCAoY2IsIGEsIGIpIHtcbiAgY29uc3QgYXJyID0gW11cbiAgY29uc3QgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICBsZXQgaSA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyLnB1c2goY2IoYVtpXSwgYltpXSkpXG4gIH1cbiAgcmV0dXJuIGFyclxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnZnVuLmpzL3NyYy9lcXVhbHMnXG5pbXBvcnQgY29uY2F0IGZyb20gJ3V0aWwvY29uY2F0J1xuaW1wb3J0IGVtcHR5IGZyb20gJ3V0aWwvZW1wdHknXG5pbXBvcnQgZG90IGZyb20gJ3V0aWwvZG90J1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJ3V0aWwvaWRlbnRpdHknXG5pbXBvcnQgdHJhbnNwb3NlIGZyb20gJ3V0aWwvdHJhbnNwb3NlJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ3V0aWwvZ2VuZXJhdGUnXG5pbXBvcnQgZ3B1bWFwIGZyb20gJ3V0aWwvZ3B1bWFwJ1xuaW1wb3J0IGdwdWZvbGQgZnJvbSAndXRpbC9ncHVmb2xkJ1xuaW1wb3J0IGdwdXByb2R1Y3QgZnJvbSAndXRpbC9ncHVwcm9kdWN0J1xuXG4vKipcbiAqIEBjbGFzcyBNYXRyaXhcbiAqIEBjbGFzc2Rlc2MgTWF0cml4IGFwcGxpY2F0aXZlIHByb3ZpZGluZyBzdGFuZGFyZCBtYXRyaXggb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVGhlIE1hdHJpeCBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBuZXcga2V5d29yZC4gSW5zdGVhZCB1c2UgdGhlIE1hdHJpeC5vZiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IE1hdHJpeC4gVW5mb3J0dW5hdGx5IGpzZG9jcyBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGhpZGRlbi5cbiAqIEBoaWRlY29udHJ1Y3RvclxuICogQHNlZSBvZlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICpcbiAqL1xubGV0IE1hdHJpeCA9IGZ1bmN0aW9uICh2YWwsIEdQVUpTKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxuICBpZiAoR1BVSlMpIHtcbiAgICB0aGlzLmdwdWpzID0gR1BVSlMgPyBuZXcgR1BVSlMoKSA6IG51bGxcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBvZlxuICogQGRlc2MgQ3JlYXRlcyBhIE1hdHJpeCBvYmplY3QgYW5kIGZsYXR0ZW5zIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSB2YWwge2FycmF5fGZ1bmN0aW9ufSBBbiBhcnJheSBvZiBhcnJheXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5NYXRyaXgub2YgPSBmdW5jdGlvbiAodmFsLCBHUFVKUyA9IG51bGwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hdHJpeCkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHRoaXMuZ3B1anMgPSBHUFVKU1xuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXRyaXgodmFsLCBHUFVKUylcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0udHlwZSA9PT0gJ01hdHJpeCdcbiAqL1xuTWF0cml4LnByb3RvdHlwZS50eXBlID0gJ01hdHJpeCdcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge09iamVjdH0gZ3B1XG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmdwdSA9IHt9XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByZWNpc2lvblxuICogQHR5cGUge251bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0ucHJlY2lzaW9uID09PSA0XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucHJlY2lzaW9uID0gNFxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzZXRQcmVjaXNpb25cbiAqIEBwYXJhbSBwcmVjaXNpb24ge251bWJlcn0gU2V0IHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZm9yIHJvdW5kaW5nXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnNldFByZWNpc2lvbigxMClcbiAqIG0ucHJlY2lzaW9uID09PSAxMFxuICovXG5NYXRyaXgucHJvdG90eXBlLnNldFByZWNpc2lvbiA9IGZ1bmN0aW9uIChwcmVjaXNpb24pIHtcbiAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb25cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTeW1tZXRyaWNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3ltbWV0cmljKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTeW1tZXRyaWMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGEgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UodGhpcykuX192YWx1ZVxuICByZXR1cm4gZXF1YWxzKGEsIGIpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3F1YXJlXG4gKiBAZGVzYyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbnRhaW5zIGEgc3F1YXJlIE1hdHJpeFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTcXVhcmUoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1NxdWFyZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLmdldENvbHMoKSwgdGhpcy5nZXRSb3dzKCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzT3J0aG9nb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWy0wLjMwOTIsIC0wLjk1MTBdLCBbLTAuOTUxMCwgMC4zMDkyXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXguZnJvbUFycmF5KHJlc3VsdClcbiAqIHRydWUgID09PSBBLmlzT3J0aG9nb25hbCgpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNPcnRob2dvbmFsID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBeEF0ID0gdGhpcy5kb3QodGhpcy50cmFuc3Bvc2UoKSlcbiAgY29uc3QgSSA9IHRoaXMuaWRlbnRpdHkoKVxuICByZXR1cm4gZXF1YWxzKEF4QXQsIEkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldENvbHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Q29scygpICA9PT0gMlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRDb2xzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlWzBdLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBlcXVhbHNcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBbWzEsIDFdLCBbMSwgMV1dXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihhKVxuICogdmFyIEIgPSBNYXRyaXgub2YoYSlcbiAqIHRydWUgID09PSBBLmVxdWFscyhCKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5fX3ZhbHVlLCBNLl9fdmFsdWUgfHwgTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Um93c1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRSb3dzKCkgIC8vIDJcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRSb3dzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRTaGFwZVxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFNoYXBlKCkgIC8vIFsyLCAyXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFNoYXBlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW3RoaXMuZ2V0Um93cygpLCB0aGlzLmdldENvbHMoKV1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAoZikodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRoYXQgbWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgubWFwKHg9ID4geC5tYXAoeSA9PiB5KyAxKSwgW1sxLCAxXSwgWzEsIDFdXSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5tYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZm9sZFxuICogQGRlc2NyaXB0aW9uIFJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gRmxhdHRlbiBNYXRyaXhcbiAqIE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKS5mb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2LmNvbmNhdChuZXh0KSlcbiAqIC8vIFsxLCAxLCAxLCAxXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQoZiwgW10pKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdG8gcmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgTWF0cml4IHRvIHJlZHVjZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG5cbiAqIC8vIFN1bSBvZiBhbGwgbWF0cml4IHZhbHVlc1xuICogY29uc3QgcmVkdWNlciA9IChwcmV2LCBuZXh0KSA9PiBOdW1iZXIocHJldikgKyBuZXh0LnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LCAwKVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dXG4gKiBNYXRyaXguZm9sZChyZWR1Y2VyLCBBKVxuICogLy8gNFxuICovXG5NYXRyaXguZm9sZCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZm9sZChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIE1hdHJpeC5vZihmKS5hcChNKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufVxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIE1hdHJpeC5hcChmLCBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZikuYXAoTSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBBLmNvbmNhdChCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoTSwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChmKE0pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gQSB7TWF0cml4fVxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IE1hdHJpeC5jb25jYXQoQSwgQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5jb25jYXQgPSBjdXJyeShmdW5jdGlvbiAoQSwgQiwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLm1hcChmKEIpKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChlbXB0eSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5lbXB0eSA9IGN1cnJ5KGZ1bmN0aW9uIChyb3dzID0gMCwgY29scyA9IDApIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YobSkubWFwKGVtcHR5KVxufSlcblxuLy8gIyMjIyAjIyMjICMjIyMgLy9cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQWlkZW50aXR5ID0gQS5pZGVudGl0eSgpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuKi9cbk1hdHJpeC5wcm90b3R5cGUuaWRlbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKHRoaXMpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5pZGVudGl0eSgzLCAyKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiAqL1xuTWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKG0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29tYmluZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguY29tYmluZSA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuY29uY2F0KE1hdHJpeC5vZihCKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQ3JlYXRlIG1hdHJpeFxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDJdLCBbMywgNF1dKVxuICpcbiAqIC8vIEdlbmVyYXRlIGlkZW50aXR5IG1hdHJpeFxuICogY29uc3QgSSAgPSBtLmlkZW50aXR5KCkgLy8gW1sxLCAwXSwgWzAsIDFdXVxuICpcbiAqIGlmKG0uZG90KEkpLmVxdWFscyhtKSkge1xuICogICAgY29uc29sZS5sb2coJ0RvdCBwcm9kdWN0IHdpdGggaWRlbnRpdHkgbWF0cml4IHJldHVybnMgdGhlIHNhbWUgbWF0cml4JylcbiAqIH1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBkb3QodGhpcy5wcmVjaXNpb24pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBiID0gW1s3LCA4XSwgWzksIDEwXSwgWzExLCAxMl1dXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICpcbiAqIE1hdHJpeC5kb3QoQSwgQikgLy8gW1s1OCwgNjRdLCBbMTM5LCAxNTRdXVxuICpcbiAqL1xuTWF0cml4LmRvdCA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuZG90KE1hdHJpeC5vZihCKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZmlsbFxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB0aGUgcHJvdmlkZWQgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLmZpbGwoeCA9PiA0MilcbiAqIC8vIFtbNDIsNDIsNDJdLCBbNDIsNDIsNDJdLCBbNDIsNDIsNDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAobWFwKHggPT4gZih4KSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLnplcm9zKClcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS56ZXJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lnplcm9zKDMsIDMpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC56ZXJvcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5vbmVzKClcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5vbmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9uZXMoMSwgMSlcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4Lm9uZXMgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDFdXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDEpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVyc1xuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHJhbmRvbSB2YWx1ZXMuIERlZmF1bHQgcmFuZG9tIHZhbHVlcyBhcmUgYmV0d2VlbiAtMSBhbmQgMVxuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSksIHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0b0FycmF5XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBhcnJheSBmcm9tIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLm1hcChyb3cgPT4gcm93Lm1hcChjb2wgPT4gY29sKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY2xvbmVcbiAqIEBkZXNjIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4LmZyb21BcnJheSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZyb21BcnJheVxuICogQGRlc2MgUmV0dXJucyBhIE1hdHJpeCBmcm9tIGFuIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKHJvdyA9PiBtYXAoY29sID0+IGNvbCkocm93KSkoYXJyKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdKVxuICogY29uc3QgYiA9IEEudHJhbnNwb3NlKCkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQodHJhbnNwb3NlLCBbXSwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IEEgTWF0cml4IG9yIGEgbWF0cml4IGFycmF5XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdXG4gKiBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZShhKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkudHJhbnNwb3NlKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBBZGQgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLmFkZCgxKSAvLyBbWzYsIDVdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuYWRkKEIpIC8vIFtbMTAsIDEwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBhZGQnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgKyBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICsgTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1YnRyYWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBTdWJ0cmFjdCBhIE1hdHJpeCBvciBhIG51bWJlclxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuc3VidHJhY3QoMSkgLy8gW1s0LCAyXV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLnN1YnRyYWN0KEIpIC8vIFtbMCwgMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBzdWJ0cmFjdCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgodmFsLCBqZHgpID0+IHZhbCAtIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggLSBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgbXVsdGlwbHlcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgTXV0bGlwbHkgYSBzY2FsYXIgb3IgYSBtdHJhaXggd2l0aCBhIG1hdHJpeC4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtdWx0aXBsaWNhdGlvbiBpcyBub3QgcG9zc2libGUuXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLm11bHRpcGx5KDIpIC8vIFtbMTAsIDhdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIubXVsdGlwbHkoQikgLy8gW1syNSwgMjVdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2Ugc3RhdGljIG1ldGhvZCBcXCdkb3RcXCcgdG8gZG8gbWF0cml4IG11bHRpcGxpY2F0aW9uJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgY3JlYXRlIGhhZGFtYXJkIHByb2R1Y3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKGNvbCwgamR4KSA9PiBjb2wgKiBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICogTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGFkZGl0aXZlaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1hdHJpeCBvYnRhaW5lZCBieSBjaGFuZ2luZyB0aGUgc2lnbiBvZiBldmVyeSBtYXRyaXggZWxlbWVudC4gVGhlIGFkZGl0aXZlIGludmVyc2Ugb2YgbWF0cml4IEEgaXMgd3JpdHRlbiDigJNBLlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsLTVdLCBbLTQsIDRdXSlcbiAqIGNvbnN0IG1pbnVzQSA9IEEuYWRkaXRpdmVpbnZlcnNlKClcbiAqIC8vIFtbLTUsIDVdLCBbNCwgLTRdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZGl0aXZlaW52ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseSgtMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGhhZGFtYXJkXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgbXVsdGlwbHlcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5oYWRhbWFyZCgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmhhZGFtYXJkKEIpIC8vIFtbMjUsIDI1XV1cblxuICovXG5NYXRyaXgucHJvdG90eXBlLmhhZGFtYXJkID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseShNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBsdVxuICogQGRlc2MgQ2FsY3VsYXRlcyBMVSBkZWNvbXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeFtdfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWzMsIC03LCAtMiwgMl0sIFstMywgNSwgMSwgMF0sIFs2LCAtNCwgMCwgLTVdLCBbLTksIDUsIC01LCAxMl1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiBjb25zdCBsdSA9IEEubHUoKVxuICogLy8gTC5fX3ZhbHVlID0gWyBbIDEsIDAsIDAsIDAgXSwgWyAtMSwgMSwgMCwgMCBdLCBbIDIsIC01LCAxLCAwIF0sIFsgLTMsIDgsIDMsIDEgXSBdXG4gKiAvLyBVLl9fdmFsdWUgPSAgWyBbIDMsIC03LCAtMiwgMiBdLCBbIDAsIC0yLCAtMSwgMiBdLCBbIDAsIDAsIC0xLCAxIF0sIFsgMCwgMCwgMCwgLTEgXSBdXG4gKiBNYXRyaXguZG90KGx1WzBdLCBsdVsxXSkgLy8gcmV0dXJucyBjbG9uZSBvZiBBXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmx1ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgdG9sID0gMWUtNlxuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEwgPSB0aGlzLnplcm9zKClcbiAgY29uc3QgVSA9IHRoaXMuemVyb3MoKVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgaWYgKE1hdGguYWJzKEEuX192YWx1ZVtrXVtrXSkgPCB0b2wpIHRocm93IEVycm9yKCdDYW5ub3QgcHJvY2VlZCB3aXRob3V0IGEgcm93IGV4Y2hhbmdlJylcbiAgICBMLl9fdmFsdWVba11ba10gPSAxXG4gICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbjsgKytpKSB7XG4gICAgICBMLl9fdmFsdWVbaV1ba10gPSBBLl9fdmFsdWVbaV1ba10gLyBBLl9fdmFsdWVba11ba11cbiAgICAgIGZvciAobGV0IGogPSBrICsgMTsgaiA8IG47ICsraikge1xuICAgICAgICBBLl9fdmFsdWVbaV1bal0gPSBBLl9fdmFsdWVbaV1bal0gLSBMLl9fdmFsdWVbaV1ba10gKiBBLl9fdmFsdWVba11bal1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgbCA9IGs7IGwgPCBuOyArK2wpIHtcbiAgICAgIFUuX192YWx1ZVtrXVtsXSA9IEEuX192YWx1ZVtrXVtsXVxuICAgIH1cbiAgfVxuICByZXR1cm4gW0wsIFVdXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJyZWZcbiAqIEByZXR1cm5zIHtNYXRyaXh8YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBBID0gTWF0cml4Lm9mKFtbLTEsIDFdLCBbLTEsIDBdLCBbMCwgLTFdLCBbLTEsIC0yXV0pXG4gKiBBLnJyZWYoKSAvLyAgWyBbIDEsIDAgXSwgWyAtMCwgMSBdLCBbIDAsIDAgXSwgWyAwLCAwIF0gXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJyZWYgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBsZWFkID0gMFxuICBjb25zdCByZXN1bHRNYXRyaXggPSB0aGlzLmNsb25lKClcblxuICBmb3IgKGxldCByID0gMDsgciA8IHRoaXMuZ2V0Um93cygpOyArK3IpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgPD0gbGVhZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgIH1cbiAgICBsZXQgaSA9IHJcbiAgICB3aGlsZSAocmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bbGVhZF0gPT09IDApIHtcbiAgICAgICsraVxuICAgICAgaWYgKHRoaXMuZ2V0Um93cygpID09PSBpKSB7XG4gICAgICAgIGkgPSByXG4gICAgICAgICsrbGVhZFxuICAgICAgICBpZiAodGhpcy5nZXRDb2xzKCkgPT09IGxlYWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0TWF0cml4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG1wID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1cbiAgICByZXN1bHRNYXRyaXguX192YWx1ZVtpXSA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl0gPSB0bXBcblxuICAgIGxldCB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtsZWFkXVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5nZXRDb2xzKCk7ICsraikge1xuICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal0gLz0gdmFsXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdldFJvd3MoKTsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gcikgY29udGludWVcbiAgICAgIHZhbCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bal0gLT0gdmFsICogcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal1cbiAgICAgIH1cbiAgICB9XG4gICAgbGVhZCsrXG4gIH1cbiAgcmV0dXJuIHJlc3VsdE1hdHJpeFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzb2x2ZVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU29sdmUgeEEgPSBiXG4gKiAvLyA1eCArIHkgID0gN1xuICogLy8gM3ggLSA0eSA9IDE4XG4gKiAvLyBTb2x1dGlvbiBmb3IgeCBhbmQgeTpcbiAqIC8vIHggPSAyXG4gKiAvLyB5ID0gLTNcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgMV0sIFszLCAtNF1dKVxuICogY29uc3Qgc29sdmVBID0gQS5zb2x2ZShbNywgMThdKSAvLyBbMiwgLTNdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24gKGIpIHtcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMVSA9IEEubHUoKVxuICBjb25zdCBMID0gTFVbMF1cbiAgY29uc3QgVSA9IExVWzFdXG4gIGNvbnN0IG4gPSB0aGlzLmdldFJvd3MoKVxuICBsZXQgcyA9IDBcbiAgY29uc3QgYyA9IFtdXG4gIGNvbnN0IHggPSBbXVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrOyArK2opIHtcbiAgICAgIHMgPSBzICsgTC5fX3ZhbHVlW2tdW2pdICogY1tqXVxuICAgIH1cbiAgICBjW2tdID0gYltrXSAtIHNcbiAgICBzID0gMFxuICB9XG4gIGZvciAobGV0IGEgPSBuIC0gMTsgYSA+IC0xOyAtLWEpIHtcbiAgICBsZXQgdCA9IDBcbiAgICBmb3IgKGxldCBiID0gYSArIDE7IGIgPCBuOyArK2IpIHtcbiAgICAgIHQgPSB0ICsgVS5fX3ZhbHVlW2FdW2JdICogeFtiXVxuICAgIH1cbiAgICB4W2FdID0gKGNbYV0gLSB0KSAvIFUuX192YWx1ZVthXVthXVxuICB9XG4gIHJldHVybiB4XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBpbnZlcnNlXG4gKiBAaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzIsIDRdXSkuaW52ZXJzZSgpXG4gKiAvLyBbIFsgMiwgLTAuNSBdLCBbIC0xLCAwLjUgXSBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgSSA9IEEuaWRlbnRpdHkoKVxuICBjb25zdCBJbnYgPSBBLmNvbmNhdChJKS5ycmVmKClcblxuICBjb25zdCByZXN1bHQgPSBJbnYuX192YWx1ZS5yZWR1Y2UoKHJlc3VsdCwgeCwgaWR4KSA9PiB7XG4gICAgY29uc3QgaGFsZiA9IHgubGVuZ3RoIC8gMlxuICAgIHJlc3VsdC5wdXNoKHguc2xpY2UoaGFsZiwgeC5sZW5ndGgpKVxuICAgIHJldHVybiByZXN1bHRcbiAgfSwgW10pXG4gIHJldHVybiBNYXRyaXgub2YocmVzdWx0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgcmFua1xuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmsgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJyZWYgPSB0aGlzLnJyZWYoKVxuICBsZXQgcmVzdWx0ID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJyZWYuZ2V0Q29scygpOyArK2kpIHtcbiAgICByZXN1bHQgKz0gcnJlZi5fX3ZhbHVlW2ldW2ldXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGltZW5zaW9uXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgcmFua1xuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJhbmsoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ1xuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFnKClcbiAqIC8vIFsxLCAxLCAxXVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWcoKVxuICogLy8gWzAsIDAsIDAsIDAsIDBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpYWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIHJldHVybiBhY2MuY29uY2F0KHhbaWR4XSlcbiAgfSkoW10pKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ1xuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWcoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIFsyLCA1XVxuICpcbiAqL1xuTWF0cml4LmRpYWcgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWcoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ3Byb2R1Y3RcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFncHJvZHVjdCgpXG4gKiAvLyAxXG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMFxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFncHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaWR4KSA9PiB7XG4gICAgYWNjICo9IHhbaWR4XVxuICAgIHJldHVybiBhY2NcbiAgfSkoMSkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBkaWFncHJvZHVjdFxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguZGlhZ3Byb2R1Y3QoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDEwXG4gKlxuICovXG5NYXRyaXguZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWdwcm9kdWN0KClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1bVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLnN1bSgpXG4gKiAvLyA5XG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuc3VtKClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc3VtID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiB7XG4gICAgYWNjICs9IGZvbGQoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KSgwKSh4KVxuICAgIHJldHVybiBhY2NcbiAgfSkoMCkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBzdW1cbiAqIEBkZXNjIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LnN1bShbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gOVxuICpcbiAqL1xuTWF0cml4LnN1bSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuc3VtKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGtyb25lY2tlclxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKHRoaXMg4oqXIE0pXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmtyb25lY2tlciA9IGZ1bmN0aW9uIChNKSB7XG4gIGNvbnN0IG0gPSB0aGlzLmdldFJvd3MoKVxuICBjb25zdCBuID0gdGhpcy5nZXRDb2xzKClcbiAgY29uc3QgcCA9IE0uZ2V0Um93cygpXG4gIGNvbnN0IHEgPSBNLmdldENvbHMoKVxuXG4gIGNvbnN0IGxlZnQgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgcmlnaHQgPSBNLl9fdmFsdWVcblxuICBjb25zdCBmcmFtZSA9IGdlbmVyYXRlKG0gKiBwLCBuICogcSlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHA7IGsrKykge1xuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IHE7IGwrKykge1xuICAgICAgICAgIGZyYW1lW3AgKiBpICsga11bcSAqIGogKyBsXSA9IGxlZnRbaV1bal0gKiByaWdodFtrXVtsXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE1hdHJpeC5vZihmcmFtZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24ga3JvbmVja2VyXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gQSB7TWF0cml4fSBUaGUgbGVmdCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEBwYXJhbSBCIHtNYXRyaXh9IFRoZSByaWdodCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmtyb25lY2tlcihCKVxufVxuXG4vLyogKioqKioqKioqKioqKioqKioqKioqKiovXG4vLyBHUFUgRnVuY3Rpb25zXG4vLyogKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdwdU1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gR1BVLmpzIGVuYWJsZWQgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGdwdU1hcHBlciAoYSkgeyByZXR1cm4gYVt0aGlzLnRocmVhZC55XVt0aGlzLnRocmVhZC54XSB9XG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMiwgMl0sIFsyLCAyXV0sIEdQVUpTKVxuICogbS5ncHVNYXAoZ3B1TWFwcGVyKVxuICogLy8gW0Zsb2F0MzJBcnJheSgyLDIpLCBGbG9hdDMyQXJyYXkoMiwyKV1cbiAqXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdwdU1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1bWFwKHRoaXMuZ3B1anMsIGYsIHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGdwdU1hcFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0aGF0IG1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gR1BVLmpzIGVuYWJsZWQgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGdwdU1hcHBlciAoYSkgeyByZXR1cm4gYVt0aGlzLnRocmVhZC55XVt0aGlzLnRocmVhZC54XSB9XG4gKiBjb25zdCBtID0gTWF0cml4LmdwdU1hcChHUFVKUywgZ3B1TWFwcGVyLCBbWzIsIDJdLCBbMiwgMl1dKVxuICogLy8gW0Zsb2F0MzJBcnJheSgyLDIpLCBGbG9hdDMyQXJyYXkoMiwyKV1cbiAqXG4gKi9cbk1hdHJpeC5ncHVNYXAgPSBjdXJyeShmdW5jdGlvbiAoZ3B1LCBmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSwgZ3B1KS5ncHVNYXAoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdwdUZvbGRcbiAqIEBkZXNjcmlwdGlvbiBGb2xkcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgR1BVUy5qcyBlbnFibGVkIHJlZHVjZSBmdW5jdGlvbiwgdXNpbmcgdGhlIEdQVVxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogbS5tYXAoeCA9PiB4Lm1hcCh5ID0+IHkrIDEpKVxuICogLy8gW1syLCAyXSwgWzIsIDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVGb2xkID0gZnVuY3Rpb24gKGYsIG91dHB1dCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGdwdWZvbGQodGhpcy5ncHVqcywgZiwgb3V0cHV0LCB0aGlzLl9fdmFsdWUpKVxufVxuXG5NYXRyaXgucHJvdG90eXBlLmdwdVByb2R1Y3QgPSBmdW5jdGlvbiAoZiwgb3V0cHV0LCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1cHJvZHVjdCh0aGlzLmdwdWpzLCBmLCBvdXRwdXQsIHRoaXMuX192YWx1ZSwgTSkpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdHJpeFxuIiwiaW1wb3J0IHsgY29uY2F0LCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiAoTSwgbSwgaWR4KSB7XG4gIHJldHVybiBjb25jYXQobSwgTS5fX3ZhbHVlW2lkeF0pXG59KVxuIiwiaW1wb3J0IHsgZm9sZCwgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmltcG9ydCByb3VuZCBmcm9tICcuL3JvdW5kJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcGFyYW0gYSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChkZWNpbWFscywgQiwgYSkgPT4gbWFwKChpdGVtLCBpKSA9PiB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGopID0+IHtcbiAgICBhY2MgKz0gcm91bmQoeCAqIEIuX192YWx1ZVtqXVtpXSwgZGVjaW1hbHMpXG4gICAgcmV0dXJuIGFjY1xuICB9LCAwKShhKVxufSkoQi5fX3ZhbHVlWzBdKSlcbiIsImltcG9ydCB7IGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuZXhwb3J0IGRlZmF1bHQgY3VycnkobSA9PiBbXSlcbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVcbiAqIEBkZXNjIEdlbmVyYXRvciBmdW5jdGlvbiBmb3IgYSBtYXRyaXggYXJyYXksIHZhbHVlcyBhcmUgc2V0IHRvIHVuZGVmaW5lZFxuICogQHBhcmFtIHJvd3Mge251bWJlcn1cbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7YW55W11bXX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKHJvd3MsIGNvbHMgPSB1bmRlZmluZWQsIHZhbHVlID0gMCkgPT4ge1xuICBjb25zdCBfY29scyA9IGNvbHMgfHwgcm93c1xuICBjb25zdCB5ID0gbWFwKHogPT4gdmFsdWUpKG5ldyBBcnJheShfY29scykpXG4gIHJldHVybiBtYXAoeiA9PiB5KShuZXcgQXJyYXkocm93cykpXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncHVmb2xkIChncHUsIGYsIG91dHB1dCwgbWF0cml4LCBjb25zdGFudHMgPSB7fSkge1xuICByZXR1cm4gZ3B1XG4gICAgLmNyZWF0ZUtlcm5lbChmLCB7IGNvbnN0YW50czogT2JqZWN0LmFzc2lnbih7fSwgeyBtOiBtYXRyaXgubGVuZ3RoLCBuOiBtYXRyaXhbMF0ubGVuZ3RoIH0sIGNvbnN0YW50cykgfSlcbiAgICAuc2V0T3V0cHV0KG91dHB1dCkobWF0cml4KVxufVxuIiwiLy8gaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdW1hcCAoZ3B1LCBmLCBtYXRyaXgpIHtcbiAgcmV0dXJuIGdwdS5jcmVhdGVLZXJuZWwoZikuc2V0T3V0cHV0KFttYXRyaXgubGVuZ3RoLCBtYXRyaXhbMF0ubGVuZ3RoXSkobWF0cml4KVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3B1ZG90IChncHUsIGYsIG91dHB1dCwgYSwgYiwgY29uc3RhbnRzID0ge30pIHtcbiAgcmV0dXJuIGdwdVxuICAgIC5jcmVhdGVLZXJuZWwoZiwgeyBjb25zdGFudHM6IE9iamVjdC5hc3NpZ24oe30sIHsgbjogYVswXS5sZW5ndGggfSwgY29uc3RhbnRzKSB9KVxuICAgIC5zZXRPdXRwdXQob3V0cHV0KShhLCBiKVxufVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgQ3JlYXRlcyBhbiBpZGVudGl5IG1hdHJpeCBmcm9tIGFuIGVtcHR5IGFycmF5XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChtLCBpZHgpID0+IG1hcCgocm93cywgamR4KSA9PiAoaWR4ID09PSBqZHgpICogMSkobSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgeyBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFRyYW5zcG9zZXMgYSBhcnJheSBvZiBhcnJheXMgdXNpbmcgdGhlIE1hdHJpeC5tYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHByZXYsIG5leHQpID0+IG1hcCgoaXRlbSwgaSkgPT4gKHByZXZbaV0gfHwgW10pLmNvbmNhdChuZXh0W2ldKSkobmV4dCkpXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9fcHJpdmF0ZS9jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkanVzdFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWxsUGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWx3YXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FueS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55UGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS90by5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9GLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9ib29sZWFuL1QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vYm90aC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9kaWZmRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc0Z1dHVyZURhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0RheS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0hvdXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9NaW51dGVzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvU2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmluZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maXJzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmxhdE1hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9rZXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9sYXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9saWZ0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL0p1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL25vdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVsbC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2FkZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2RpdmlkZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvaXNOYW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9tdWx0aXBseS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2tleXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21lcmdlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb3IuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3NldC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2Zvcm1hdFN0cmluZy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvemlwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy96aXBXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2RvdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dlbmVyYXRlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVmb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVtYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dwdXByb2R1Y3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9yb3VuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIl0sIm5hbWVzIjpbIk1hdHJpeCIsInZhbCIsIl9fdmFsdWUiLCJvZiIsInByb3RvdHlwZSIsInR5cGUiLCJwcmVjaXNpb24iLCJzZXRQcmVjaXNpb24iLCJpc1N5bW1ldHJpYyIsImEiLCJiIiwidHJhbnNwb3NlIiwiaXNTcXVhcmUiLCJnZXRDb2xzIiwiZ2V0Um93cyIsImlzT3J0aG9nb25hbCIsIkF4QXQiLCJkb3QiLCJJIiwiaWRlbnRpdHkiLCJsZW5ndGgiLCJlcXVhbHMiLCJNIiwiZ2V0U2hhcGUiLCJtYXAiLCJmIiwiZm9sZCIsImFwIiwiY29uY2F0IiwiQSIsIkIiLCJlbXB0eSIsInJvd3MiLCJjb2xzIiwibSIsImNvbWJpbmUiLCJmaWxsIiwieCIsInplcm9zIiwib25lcyIsInJhbmRvbSIsImUiLCJNYXRoIiwidG9BcnJheSIsInJvdyIsImNvbCIsImNsb25lIiwiZnJvbUFycmF5IiwiYXJyIiwiYWRkIiwiRXJyb3IiLCJpZHgiLCJqZHgiLCJzdWJ0cmFjdCIsIm11bHRpcGx5IiwiY29uc29sZSIsImxvZyIsImFkZGl0aXZlaW52ZXJzZSIsImhhZGFtYXJkIiwibHUiLCJuIiwidG9sIiwiTCIsIlUiLCJrIiwiYWJzIiwiaSIsImoiLCJsIiwicnJlZiIsImxlYWQiLCJyZXN1bHRNYXRyaXgiLCJyIiwidG1wIiwic29sdmUiLCJMVSIsInMiLCJjIiwidCIsImludmVyc2UiLCJJbnYiLCJyZXN1bHQiLCJyZWR1Y2UiLCJoYWxmIiwicHVzaCIsInNsaWNlIiwicmFuayIsImRpbWVuc2lvbiIsImRpYWciLCJhY2MiLCJkaWFncHJvZHVjdCIsInN1bSIsInByZXYiLCJuZXh0Iiwia3JvbmVja2VyIiwicCIsInEiLCJsZWZ0IiwicmlnaHQiLCJmcmFtZSIsImdwdU1hcCIsImdwdWpzIiwiZ3B1IiwiZ3B1Rm9sZCIsIm91dHB1dCIsImdwdVByb2R1Y3QiLCJkZWNpbWFscyIsIml0ZW0iLCJ1bmRlZmluZWQiLCJ2YWx1ZSIsIl9jb2xzIiwieSIsInoiLCJBcnJheSIsImdwdWZvbGQiLCJtYXRyaXgiLCJjb25zdGFudHMiLCJjcmVhdGVLZXJuZWwiLCJPYmplY3QiLCJhc3NpZ24iLCJzZXRPdXRwdXQiLCJncHVtYXAiLCJncHVwcm9kdWN0Iiwicm91bmQiLCJOdW1iZXIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQzJCOztBQUVaLHFIQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNuQkY7QUFBQTtB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBQVcsZ0JBQWdCO0FBQ3FCO0FBQ2hELFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsNEJBQTRCO0FBQ3ZDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsNkJBQTZCO0FBQ3hDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsK0JBQStCO0FBQzFDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsZ0JBQWdCO0FBQzNCLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsMEJBQTBCO0FBQ3JDLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsZ0JBQWdCO0FBQzNCLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsNEJBQTRCO0FBQ3ZDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsOEJBQThCO0FBQ3pDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsMEJBQTBCO0FBQ3JDLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsZUFBZTtBQUMxQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLGdCQUFnQjtBQUMzQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLDBCQUEwQjtBQUNyQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGlDQUFpQztBQUM1QyxXQUFXLHFDQUFxQztBQUNoRCxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9C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VCxJQUFnQixDQUEvQjtBQUFBLEdBQUosRUFBc0NsQixDQUF0QyxDQUFaO0FBQUEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1RmOzs7Ozs7QUFNZSxTQUFTeUYsS0FBVCxDQUFnQmQsS0FBaEIsRUFBdUJILFFBQXZCLEVBQWlDO0FBQzlDLFNBQU9rQixNQUFNLENBQUNsRixJQUFJLENBQUNpRixLQUFMLENBQVdkLEtBQUssR0FBRyxHQUFSLEdBQWNILFFBQXpCLElBQXFDLElBQXJDLEdBQTRDQSxRQUE3QyxDQUFiO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JEOztBQUVBOzs7Ozs7O2VBT2UsZ0JBQU0sVUFBQ2QsSUFBRCxFQUFPQyxJQUFQO0FBQUEsU0FBZ0IsY0FBSSxVQUFDYyxJQUFELEVBQU96QyxDQUFQO0FBQUEsV0FBYSxDQUFDMEIsSUFBSSxDQUFDMUIsQ0FBRCxDQUFKLElBQVcsRUFBWixFQUFnQnRDLE1BQWhCLENBQXVCaUUsSUFBSSxDQUFDM0IsQ0FBRCxDQUEzQixDQUFiO0FBQUEsR0FBSixFQUFrRDJCLElBQWxELENBQWhCO0FBQUEsQ0FBTixDIiwiZmlsZSI6IkBhc3R1YW5heC9mdW5tYXRyaXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIkBhc3R1YW5heC9mdW5tYXRyaXhcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJAYXN0dWFuYXgvZnVubWF0cml4XCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gd2l0aCBhcml0eSAxXG4gKiBAZnVuY3Rpb24gY3VycnkxXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIHYxLjAuMlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeTEgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkIChhKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgID8gdGhpc1xuICAgICAgOiBmbihhKVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhZGRJbmRleFxuICogQHN1bW1hcnkgQWRkcyBhIHNwZWNpZmllZCBpbmRleCB0byBpdGVyYXRlIGEgY29sbGVjdGlvblxuICogQGRlc2NyaXB0aW9uIFRoZSBhZGRJbmRleCBmdW5jdGlvbiBpcyBub3RuZWNlc3NhcnkgZm9yIHRoZSBtYXAgZnVuY3Rpb25zIGluIHRoZSBmdW4uanMgbGlicmFyeSBhcyB0aGV5IGJlaGF2ZSB0aGUgc2EsZSBhcyB0aGUgbmF0aXZlIGphdmFzY3JpcHQgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIEZ1bmN0aW9uIHRvIHdoaWNoIHRvIGFkZCB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7QXJyYXl9IGEgVGhlIGFycmF5IG9uIHdoaWNoIHRvIHdvcmtcbiAqIEBzaW5jZSAxLjAuMlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkSW5kZXggKGYsIGcsIGEpIHtcbiAgbGV0IGkgPSAwXG4gIHJldHVybiBmKFxuICAgIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gZyh2LCBpKyspXG4gICAgfSxcbiAgICBhXG4gIClcbn0pXG4iLCIvKipcbiAqIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGFkanVzdFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+IG51bSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRvIG1vZGlmeSB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gKiBAcGFyYW0ge051bWJlcn0gaSAtIFRoZSBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkgdGhlIGFycmF5LCBhY2NlcHRzIHBvc3RpdGl2ZSBhbmQgbmVnYXRpdmUgaW5kZXhlc1xuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdIC0gQXJyYXkgd2l0aCBkYXRhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0IChmbiwgaSwgYSkge1xuICBjb25zdCByID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSlcbiAgY29uc3QgaWR4ID0gaSA8IDAgPyByLmxlbmd0aCArIGkgOiBpXG4gIGlmICghYVtpZHhdKSByZXR1cm4gclxuICByW2lkeF0gPSBmbihyW2lkeF0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RXaXRoXG4gKiBAZGVzY3JpcHRpb24gTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYSkgLT4gKChhIC0+IFthXSkgLT4gW2FdIC0+IG51bSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIFRoZSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRoZSBpbmRleGVzIGlmIGZvdW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBbYV1cbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0V2l0aCAoZm4sIHByZWQsIGEpIHtcbiAgY29uc3QgX2ZuID0geCA9PiB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJldHVybiBmbih4KVxuICAgIH1cbiAgICByZXR1cm4geFxuICB9XG4gIHJldHVybiBtYXAoX2ZuLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbGxcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbCAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IHRydWVcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKCFjYihhW2ldKSkge1xuICAgICAgcmVzID0gZmFsc2VcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICpcbiAqIEBmdW5jdGlvbiBhbGxQYXNzXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBwYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbFBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghY2JzW2ldKGEpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gYWx3YXlzXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbHdheXMgKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHggfVxufSlcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICpcbiAqIEBmdW5jdGlvbiBhbmRcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICh4LCB5KSAtPiBib29sZWFuXG4gKiBAcGFyYW0geyp9IHggLSBBIHByZWRpY2F0ZVxuICogQHBhcmFtIHsqfSB5IC0gQSBwcmVkaWNhdGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW5kICh4LCB5KSB7XG4gIHJldHVybiB4ICYmIHlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbnlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb24gb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKFRPRE8pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbnkgKGNiLCBhKSB7XG4gIGxldCByZXMgPSBmYWxzZVxuICBmb3IgKGxldCBpIGluIGEpIHtcbiAgICBpZiAoY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IHRydWVcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBvbmUgcGFzc2VzXG4gKlxuICogQGZ1bmN0aW9uIGFueVBhc3NcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLikgLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueVBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjYnNbaV0oYSkpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmV0dXJucyBhIGNvbWJpbmVkIHJlc3VsdCBhcnJheVxuICpcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHBhcmFtIHsoRnVuY3Rpb25bXXxGdW5jdGlvbnxBcHBsaWNhdGl2ZSl9IGZucyAtIEFuIGFycmF5IG9mIGZ1bmN0aW9ucyBvciBhIGZ1bmN0aW9uIG9yIGFuIGFwcGxpY2F0aXZlXG4gKiBAcGFyYW0ge0FycmF5fSB2YWxzIC0gQW4gYXJyYXkgb2YgdmFsdWVzXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBmb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBtYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcCAoZm5zLCB2YWxzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZucy5hcCkpIHtcbiAgICByZXR1cm4gZm5zLmFwKHZhbHMpXG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oZm5zKSkge1xuICAgIHJldHVybiB4ID0+IGZucyh4KSh2YWxzKHgpKVxuICB9XG4gIHJldHVybiBmb2xkKChhY2MsIGYpID0+IGFjYy5jb25jYXQobWFwKGN1cnJ5MShmKSwgdmFscykpLCBbXSwgZm5zKVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gYXBlcnR1cmVcbiAqIEBwYXJhbSBuXG4gKiBAcGFyYW0gYXJyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBlcnR1cmUgKG4sIGEpIHtcbiAgaWYgKGEubGVuZ3RoIDwgbikge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IHJlcyA9IEFycmF5KGEubGVuZ3RoIC0gbiArIDEpXG4gIHJldHVybiBtYXAoKGl0ZW0sIGlkeCkgPT4gYS5zbGljZShpZHgsIGlkeCArIG4pLCByZXMpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwZW5kXG4gKiBAZGVzY3JpcHRpb24gQXBwZW5kIGFuIGVsbWVudCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7Kn0gZWwgLSBFbGVtZW50IHRvIGFkZCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgLSBMaXN0IHRvIHdoaWNoIHRvIGFkZCB0aGUgZWxlbWVudFxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGwgPSBbMCwgMV1cbiAqIGFwcGVuZCgnYScsIGwpIC8vIHJldXRuciBbMCwgMSwgJ2EnXVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwZW5kIChlbCwgbGlzdCkge1xuICByZXR1cm4gY29uY2F0KGxpc3QsIFsgZWwgXSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQGRlc2NyaXB0aW9uIFRoZSBhcHBseSgpIG1ldGhvZCBjYWxscyBhIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBhbiBhcnJheSwgYW5kIHRoZSBmdW5jdGlvbiBhcyBjb250ZXh0LlxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBhcHBseShmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykubWFwKHggPT4geCAqIDIpXG4gKiAgIH0pXG4gKiBhKFsxLCAyLCAzXSlcbiAqIC8vIFsyLCA0LCA2XVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwbHkgKGZuLCBhcmdzKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgYXJncylcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gYXJyYXlDb25jYXRcbiAqIEBwYXJhbSBhMVxuICogQHBhcmFtIGEyXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdChhLCBiKVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBlcXVhbHNBcnJheVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIGZvciBkZWVwIGNvbXBhcmlzb24gb2YgYXJyYXlzXG4gKiBAcGFyYW0ge2F9IHggLSBPYmplY3QgdG8gY29tcGFyZSBvZiB0eXBlIGFcbiAqIEBwYXJhbSB7YX0geSAtIE9iamVjdCB4IHRvIGNvbXBhcmUgd2l0aCBvYmplY3QgeFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4uL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZXF1YWxzQXJyYXkgKHgsIHkpIHtcbiAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub3QoZXF1YWxzKHhbaV0sIHlbaV0pKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcnJheUZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXJyYXlGaWx0ZXIgKGZuLCBhKSB7XG4gIHZhciByID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKGFbaV0pKSByLnB1c2goYVtpXSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcHJvdmlkZWQgYXJyYXkgYW5kIGNhbGxpbmcgYW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Y2JGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGl0ZW1cbiAqIEBwYXJhbSB7Kn0gaW5pdCAtIEluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBBcnJheSB3aXRoIGl0ZW1zIHRvIG1vZGlmeSBieSB0aGUgY2IgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFsaWFzIHJlZHVjZVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvbGQoYWRkLCAwLCBbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gM1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNiRnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gciAtIEFjY3VtdWxhdG9yIHdoaWNoIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSB0aGUgaW5kZXkgb2YgdGhlIGl0ZW0gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gVGhlIGluaXRpYWwgYXJyYXlcbiAqIEByZXR1cm4geyp9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSBpbml0XG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNBcnJheVxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBPYmplY3QgdG8gdmVyaWZpeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBpc0FycmF5KFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSB0cnVlXG4gKi9cblxuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQXJyYXknKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIGFuIGFycmF5IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChpZGVudGl0eSwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMCwyLDNdXG4gKiAgY29uc3QgYWRkMiA9IGFkZCgyKVxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChhZGQyLCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFsyLDQsNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBjb25zdCByID0gbmV3IEFycmF5KGwpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltpXSA9IGNiKGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0b0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIGlucHV0IHRvIGFuIGFycmF5XG4gKiBAcGFyYW0ge0FycmF5TGlrZX0geCAtIE9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSB0b0FycmF5KFwic3RyaW5nXCIpXG4gKiAvLyByZXN1bHQgPSBbJ3MnLCd0JywncicsJ2knLCduJywnZyddXG4gKlxuICogZnVuY3Rpb24gKCkge1xuICogIGNvbnN0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcbiAqICBjb25zb2xlLmxvZyh0eXBlb2YgYXJncykgLy8gQXJyYXlcbiAqIH1cbiAqXG4gKiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0FycmF5ICh4KSB7XG4gIHJldHVybiB4Lmxlbmd0aCA9PT0gMSA/IFt4WzBdXSA6IEFycmF5LmFwcGx5KG51bGwsIHgpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdW5pb25BcnJheVxuICogQGRlc2NyaXB0aW9uIE1lcmdlcyAyIGFycmF5c1xuICogQHBhcmFtIHtBcnJheX0gYUwgLSBBcnJheSB0byBtZXJnZVxuICogQHBhcmFtIHtBcnJheX0gYVIgLSBBcnJheSB0byBtZXJnZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdW5pb25BcnJheShbMCwxLDJdLCBbMyw0LDVdKVxuICogLy8gcmVzdWx0ID0gWzAuMS4yLjMuNC41XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB1bmlvbkFycmF5IChhTCwgYVIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhTC5jb25jYXQoYVIpKSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBiaW5hcnlcbiAqIEBwYXJhbSBjYlxuICogQHJldHVybnMge2Z1bmN0aW9uKCo9LCAqPSk6ICp9XG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGJpbmFyeSAoY2IpIHtcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGNiKGEsIGIpXG4gIH0pXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbi8qKlxuICogQGZ1bmN0aW9uIGJpbmRcbiAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0XG4gKiBAcGFyYW0ge2Z1bmN0aW9uIH1mblxuICogQHBhcmFtIHsqfSBjb250ZXh0XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYmluZCAoZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY29udGV4dClcbn0pXG4iLCIvKipcbiAqIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqXG4gKiBAZnVuY3Rpb24gRlxuICogQGRlc2NyaXB0aW9uIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgYWx3YXlzIGZyb20gJy4uL2Fsd2F5cydcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzKGZhbHNlKVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIFRcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyh0cnVlKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiBib3RoIHByZWRpY2F0ZXMgcmV0dXJuIHRydWVcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMSBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4yIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGxpZnQgZnJvbSAnLi4vbGlmdCdcbmltcG9ydCBhbmQgZnJvbSAnLi4vYW5kJ1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBib3RoIChmbjEsIGZuMikge1xuICByZXR1cm4gaXMoJ0Z1bmN0aW9uJykoZm4xKVxuICAgID8gZnVuY3Rpb24gX2JvdGggKCkgeyByZXR1cm4gZm4xLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgJiYgZm4yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxuICAgIDogbGlmdChhbmQpKGZuMSwgZm4yKVxufSlcbiIsIi8qKlxuICogQ3VycmllZCBmdW5jdGlvbiB0aGF0IHZlcmlmaWVzIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcyBhIGJvb2xlYW5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGlzXG4gKiBAZGVzY3JpcHRpb24gQ3VycmllZCBmdW5jdGlvbiB0aGF0IHZlcmlmaWVzIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcyBhIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gSXRlbSB0byB2ZXJpZnlcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdCb29sZWFuJylcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNhbGxcbiAqIEBwYXJhbSBmblxuICogQHJldHVybnMgeyp9XG4gKi9cbi8vIGltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY2FsbCAoZm4pIHtcbiAgcmV0dXJuIGZuLmFwcGx5KGZuLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29tcGxlbWVudFxuICogQGRlc2NyaXB0aW9uIExpZnRzIGEgcHJlZGljYXRlIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZSBjb21wbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIG5vdFxuICogQHNlZSBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wbGVtZW50KGlzRW1wdHkpXG4gKiBpc05vdEVtcHR5KFtdKSAvLyBmYWxzZVxuICogaXNOb3RFbXB0eSh7J2EnIDogMX0pIC8vIHRydWVcbiAqXG4gKiBjb21wbGVtZW50KE1heWJlLm9mKGZhbHNlKSkgLy8gdHJ1ZVxuICogY29tcGxlbWVudChNYXliZS5vZih0cnVlKSkgLy8gZmFsc2VcbiAqL1xuaW1wb3J0IGxpZnQgZnJvbSAnLi9saWZ0J1xuaW1wb3J0IG5vdCBmcm9tICcuL25vdCdcblxuY29uc3QgY29tcGxlbWVudCA9IGxpZnQobm90KVxuZXhwb3J0IGRlZmF1bHQgY29tcGxlbWVudFxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29tcG9zZVxuICogQHJldHVybnMge2Z1bmN0aW9uKCk6ICp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXBvc2UgKCkge1xuICBsZXQgZm5zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuXG4gIHJldHVybiBmdW5jdGlvbiBfY29tcG9zZSAoKSB7XG4gICAgbGV0IGluaXQgPSBmbnNbZm5zLmxlbmd0aCAtIDFdXG4gICAgbGV0IHJlc3VsdCA9IFtpbml0LmFwcGx5KGluaXQsIGFyZ3VtZW50cyldXG4gICAgbGV0IGkgPSBmbnMubGVuZ3RoIC0gMlxuXG4gICAgZm9yIChpOyBpID49IDA7IC0taSkge1xuICAgICAgY29uc3QgZm4gPSBmbnNbaV1cblxuICAgICAgcmVzdWx0ID0gW2ZuLmFwcGx5KGZuLCByZXN1bHQpXVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0WzBdXG4gIH1cbn07XG4iLCIvKipcbiAqIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKiBAc2luY2UgdjEuMC40XG4gKiBAcGFyYW0ge2F9IGEgLSBMZWZ0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEBwYXJhbSB7YX0gYiAtIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEByZXR1cm4ge2F9IENvbmNhdGVuYXRlZCBpdGVtXG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5Q29uY2F0IGZyb20gJy4vYXJyYXkvY29uY2F0J1xuaW1wb3J0IHN0cmluZ0NvbmNhdCBmcm9tICcuL3N0cmluZy9jb25jYXQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgICdTdHJpbmcnOiBzdHJpbmdDb25jYXQsXG4gICAgJ0FycmF5JzogYXJyYXlDb25jYXRcbiAgfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShhLCBiKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbmRcbiAqIEBwYXJhbSBjb25kc1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25kIChjb25kcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvbmRzW2ldWzBdKHZhbHVlKSkgcmV0dXJuIGNvbmRzW2ldWzFdKHZhbHVlKVxuICAgIH1cbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogQGZ1bmN0aW9uIGN1cnJ5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5IChmdW4pIHtcbiAgY29uc3QgYXJnc2xlbiA9IGZ1bi5sZW5ndGhcblxuICBpZiAoYXJnc2xlbiA9PT0gMCkge1xuICAgIHJldHVybiBmdW5cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVjdXJzZXIoW10pXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoYWNjLCBhcmdzKSB7XG4gICAgY29uc3QgX2FjYyA9IGFjYy5jb25jYXQoYXJncylcbiAgICByZXR1cm4gX2FjYy5sZW5ndGggPCBhcmdzbGVuXG4gICAgICA/IGNyZWF0ZVJlY3Vyc2VyKF9hY2MpXG4gICAgICA6IGZ1bi5hcHBseSh0aGlzLCBfYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVjdXJzZXIgKGFjYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVjdXJzZShhY2MsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBkaWZmRGF0ZVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIGRhdGVzIGluIG1pbGxpc2Vjb25kXG4gKiBAcGFyYW0ge0RhdGV9IHN0YXJ0IC0gU3RhcnQgZGF0ZVxuICogQHBhcmFtIHtEYXRlfSBlbmQgLSBFbmQgZGF0ZVxuICogQHJldHVybiB7bnVtYmVyfSBSRXR1cm4gdGhlIGRpZmZlcmVuY2UgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGlmZkRhdGUgKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChuZXcgRGF0ZShzdGFydCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoZW5kKS5nZXRUaW1lKCkpXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG4vKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0RhdGUnKVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwOS8wMy8yMDE3LlxuICovXG5pbXBvcnQgZGlmZkRhdGUgZnJvbSAnLi9kaWZmRGF0ZSdcblxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IHtcbiAgcmV0dXJuIGRpZmZEYXRlKG5ldyBEYXRlKCkpKGQpIDwgMFxufVxuIiwiLyoqXG4gKlxuICovXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQgKHgpIHtcbiAgLy8gbm9pbnNwZWN0aW9uIEpTQ2hlY2tGdW5jdGlvblNpZ25hdHVyZXNcbiAgcmV0dXJuIGlzRGF0ZSh4KSAmJiBpc0Zpbml0ZSh4LnZhbHVlT2YoKSlcbn07XG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gODY0MDAwMDAgLy8gMjQqNjAqNjAqMTAwMCA9IDg2NDAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAzNjAwMDAwIC8vIDYwKjYwKjEwMDAgPSAzNjAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyA2MDAwMCAvLyA2MCoxMDAwID0gNjAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDEwMDBcclxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZGVmYXVsdFRvXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHthfSBkZWZhdWx0IFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtifSB2YWwgYHZhbGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGBkZWZhdWx0YCB1bmxlc3MgYHZhbGAgaXMgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYC5cbiAqIEByZXR1cm4geyp9IFRoZSBzZWNvbmQgdmFsdWUgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRlZmF1bHRUbyAoZCwgdikge1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdlxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtcHR5ICh4KSB7XG4gIHJldHVybiBuZXcgeC5jb25zdHJ1Y3RvcigpXG59O1xuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlcXVhbHNcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgZXF1YWxpdHkgb2YgMiBpdGVtc1xuICogQHBhcmFtIHsqfSB4IC0gTGVmdCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHBhcmFtIHsqfSB5IC0gUmlnaHQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG5hbiA9IE51bWJlci5OYU5cbiAqIGVxdWFsKG5hbiwgbmFuKSAvLyByZXR1cm5zIHRydWVcbiAqXG4gKiBjb25zdCBhcnIxID0gWzAsIDEsIDIsIDNdXG4gKiBjb25zdCBhcnIyID0gW251bGwsIDEsIDIsIDNdXG4gKiBlcXVhbHMoYXJyMSwgYXJyMikgLy8gcmV0dXJucyBmYWxzZVxuICpcbiAqIGVxdWFscyhuZXcgT2JqZWN0KHsnYSc6IDAsICdiJzogMX0pLCB7J2EnOiAwLCAnYic6IDF9KSAvLyB0cnVlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgaWRlbnRpY2FsIGZyb20gJy4vaWRlbnRpY2FsJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuaW1wb3J0IG5vdCBmcm9tICcuL25vdCdcbmltcG9ydCBvciBmcm9tICcuL29yJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vb2JqZWN0L2lzJ1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9hcnJheS9pcydcbmltcG9ydCBpc0Jvb2xlYW4gZnJvbSAnLi9ib29sZWFuL2lzJ1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vbnVtYmVyL2lzJ1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vc3RyaW5nL2lzJ1xuaW1wb3J0IGlzRGF0ZSBmcm9tICcuL2RhdGUvaXMnXG5pbXBvcnQgZXF1YWxzQXJyYXkgZnJvbSAnLi9hcnJheS9lcXVhbHMnXG5pbXBvcnQgZXF1YWxzT2JqZWN0IGZyb20gJy4vb2JqZWN0L2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZXF1YWxzICh4LCB5KSB7XG4gIGlmIChpZGVudGljYWwoeCwgeSkpIHJldHVybiB0cnVlXG5cbiAgaWYgKHR5cGUoeCkgIT09IHR5cGUoeSkpIHJldHVybiBmYWxzZVxuXG4gIGlmIChvcihub3QoZXhpc3RzKHgpKSwgbm90KGV4aXN0cyh5KSkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0geS5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKGlzU3RyaW5nKHgpIHx8IGlzQm9vbGVhbih4KSB8fCBpc051bWJlcih4KSB8fCBpc0RhdGUoeCkpIHtcbiAgICByZXR1cm4gaWRlbnRpY2FsKHgudmFsdWVPZigpLCB5LnZhbHVlT2YoKSlcbiAgfVxuICBpZiAoaXNBcnJheSh4KSkge1xuICAgIHJldHVybiBlcXVhbHNBcnJheSh4LCB5KVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc09iamVjdCh4LCB5KVxuICB9XG4gIHJldHVybiBmYWxzZVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGV4aXN0c1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleGlzdHMgKHgpIHtcbiAgcmV0dXJuICEoeCA9PSBudWxsKVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpbHRlclxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1Y250aW9uIHRoYXQgZmlsdGVycyBPYmplY3RzLCBBcnJheXMgYW5kIE1hcHNcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5RmlsdGVyIGZyb20gJy4vYXJyYXkvZmlsdGVyJ1xuaW1wb3J0IG9iamVjdEZpbHRlciBmcm9tICcuL29iamVjdC9maWx0ZXInXG5pbXBvcnQgbWFwRmlsdGVyIGZyb20gJy4vbWFwL2ZpbHRlcidcbi8vIFRPRE9cbi8vIGltcG9ydCBzZXRGaWx0ZXIgZnJvbSAnLi4vc2V0L2ZpbHRlcidcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmlsdGVyIChmbiwgYSkge1xuICBzd2l0Y2ggKHR5cGUoYSkpIHtcbiAgICAvLyBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSkge1xuICAgIC8vIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAvLyAgIHJldHVybiBjdXJyeShmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIHJldHVybiBjYi5jYWxsKHRoaXMsIGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSlcbiAgICAvLyAgIH0pXG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBvYmplY3RGaWx0ZXIoZm4sIGEpXG4gICAgLy8gY2FzZSAnU3RyaW5nJzpcbiAgICAvLyAgIHJldHVybiBzdHJpbmdNYXAoY2IsIGEpXG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBtYXBGaWx0ZXIoZm4sIGEpXG4gICAgLy8gY2FzZSAnU2V0JzpcbiAgICAvLyAgIHJldHVybiBzZXRGaWx0ZXIoZm4sIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihmbiwgYSlcbiAgfVxufSlcbiIsIi8qKlxuICogRmluZCB0aGUgaW5kZXggbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZmluZEluZGV4XG4gKiBAZGVzY3JpcHRpb24gRmluZCB0aGUgaW5kZXggbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYm9vbGVhbikgLT4gW2FdIC0+IG51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gUHJlZGljYXRlIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBBbiBhcnJheSBsaWtlIG9iamVjdFxuICogQHJldHVybiB7bnVtYmVyfVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmluZEluZGV4IChmbiwgYSkge1xuICBsZXQgaSA9IDBcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIGlmIChmbihhW2ldKSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIC0xXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZmlyc3RcbiAqIEBwYXJhbSBbYV1cbiAqIEByZXR1cm4gYSB8IHVuZGVmaW5lZFxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhcnIgPSBbMSwgMiwgNF1cbiAqIGZpcnN0KFsxLCAyLCA0XSkgLy8gcmV0dXJucyAxXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBmaXJzdCAoYSkge1xuICByZXR1cm4gYSAmJiBhLmxlbmd0aCA/IGFbMF0gOiB1bmRlZmluZWRcbn0pXG4iLCJpbXBvcnQgZm9sZCBmcm9tICcuL2ZvbGQnXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBpcyBmcm9tICcuL2lzJ1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuLyoqXG4gKiBAZnVuY3Rpb24gZmxhdE1hcFxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmbGF0TWFwIChmbiwgYSkge1xuICBpZiAoaXNGdW5jdGlvbihhKSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIGZuKGEoeCkpKHgpXG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGEuZmxhdE1hcCkpIHtcbiAgICByZXR1cm4gYS5mbGF0TWFwKGZuKVxuICB9XG4gIHJldHVybiBmb2xkKChhY2MsIHgpID0+IGNvbmNhdChhY2MsIGZuKHgpKSwgZW1wdHkoYSksIGEpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHZhbHVlIHN1cHBsaWVkIHRvIHRoZSBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlkZW50aXR5ICh4KSB7XG4gIHJldHVybiB4XG59O1xuIiwiLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBfXyB9IGZyb20gJy4vX18nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcGVydHVyZSB9IGZyb20gJy4vYXBlcnR1cmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5U3BlYyB9IGZyb20gJy4vYXBwbHlTcGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVRvIH0gZnJvbSAnLi9hcHBseVRvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc2NlbmQgfSBmcm9tICcuL2FzY2VuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2MgfSBmcm9tICcuL2Fzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvY1BhdGggfSBmcm9tICcuL2Fzc29jUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xhbXAgfSBmcm9tICcuL2NsYW1wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBhcmF0b3IgfSBmcm9tICcuL2NvbXBhcmF0b3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VLIH0gZnJvbSAnLi9jb21wb3NlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVAgfSBmcm9tICcuL2NvbXBvc2VQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlV2l0aCB9IGZyb20gJy4vY29tcG9zZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdCB9IGZyb20gJy4vY29uc3RydWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3ROIH0gZnJvbSAnLi9jb25zdHJ1Y3ROJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb250YWlucyB9IGZyb20gJy4vY29udGFpbnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnZlcmdlIH0gZnJvbSAnLi9jb252ZXJnZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY291bnRCeSB9IGZyb20gJy4vY291bnRCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjIH0gZnJvbSAnLi9kZWMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlc2NlbmQgfSBmcm9tICcuL2Rlc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2UgfSBmcm9tICcuL2RpZmZlcmVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2VXaXRoIH0gZnJvbSAnLi9kaWZmZXJlbmNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlzc29jIH0gZnJvbSAnLi9kaXNzb2MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvY1BhdGggfSBmcm9tICcuL2Rpc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3AgfSBmcm9tICcuL2Ryb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0IH0gZnJvbSAnLi9kcm9wTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3RXaGlsZSB9IGZyb20gJy4vZHJvcExhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHMgfSBmcm9tICcuL2Ryb3BSZXBlYXRzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0c1dpdGggfSBmcm9tICcuL2Ryb3BSZXBlYXRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFdoaWxlIH0gZnJvbSAnLi9kcm9wV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVpdGhlciB9IGZyb20gJy4vZWl0aGVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlbmRzV2l0aCB9IGZyb20gJy4vZW5kc1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxQnkgfSBmcm9tICcuL2VxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxUHJvcHMgfSBmcm9tICcuL2VxUHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGV2b2x2ZSB9IGZyb20gJy4vZXZvbHZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kIH0gZnJvbSAnLi9maW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdCB9IGZyb20gJy4vZmluZExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRMYXN0SW5kZXggfSBmcm9tICcuL2ZpbmRMYXN0SW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsYXR0ZW4gfSBmcm9tICcuL2ZsYXR0ZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsaXAgfSBmcm9tICcuL2ZsaXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2ggfSBmcm9tICcuL2ZvckVhY2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2hPYmpJbmRleGVkIH0gZnJvbSAnLi9mb3JFYWNoT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZnJvbVBhaXJzIH0gZnJvbSAnLi9mcm9tUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwQnkgfSBmcm9tICcuL2dyb3VwQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwV2l0aCB9IGZyb20gJy4vZ3JvdXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndCB9IGZyb20gJy4vZ3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGd0ZSB9IGZyb20gJy4vZ3RlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNQYXRoIH0gZnJvbSAnLi9oYXNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoZWFkIH0gZnJvbSAnLi9oZWFkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpZkVsc2UgfSBmcm9tICcuL2lmRWxzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5jIH0gZnJvbSAnLi9pbmMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluY2x1ZGVzIH0gZnJvbSAnLi9pbmNsdWRlcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhCeSB9IGZyb20gJy4vaW5kZXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhPZiB9IGZyb20gJy4vaW5kZXhPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5pdCB9IGZyb20gJy4vaW5pdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5uZXJKb2luIH0gZnJvbSAnLi9pbm5lckpvaW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluc2VydCB9IGZyb20gJy4vaW5zZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnRBbGwgfSBmcm9tICcuL2luc2VydEFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9pbnRlcnNlY3Rpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc3BlcnNlIH0gZnJvbSAnLi9pbnRlcnNwZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50byB9IGZyb20gJy4vaW50bydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52ZXJ0IH0gZnJvbSAnLi9pbnZlcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydE9iaiB9IGZyb20gJy4vaW52ZXJ0T2JqJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZva2VyIH0gZnJvbSAnLi9pbnZva2VyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqb2luIH0gZnJvbSAnLi9qb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqdXh0IH0gZnJvbSAnLi9qdXh0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0SW5kZXhPZiB9IGZyb20gJy4vbGFzdEluZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbmd0aCB9IGZyb20gJy4vbGVuZ3RoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zIH0gZnJvbSAnLi9sZW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zSW5kZXggfSBmcm9tICcuL2xlbnNJbmRleCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1BhdGggfSBmcm9tICcuL2xlbnNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUHJvcCB9IGZyb20gJy4vbGVuc1Byb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxpZnROIH0gZnJvbSAnLi9saWZ0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHQgfSBmcm9tICcuL2x0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsdGUgfSBmcm9tICcuL2x0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW0gfSBmcm9tICcuL21hcEFjY3VtJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bVJpZ2h0IH0gZnJvbSAnLi9tYXBBY2N1bVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBPYmpJbmRleGVkIH0gZnJvbSAnLi9tYXBPYmpJbmRleGVkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRjaCB9IGZyb20gJy4vbWF0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hdGhNb2QgfSBmcm9tICcuL21hdGhNb2QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1heEJ5IH0gZnJvbSAnLi9tYXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVhbiB9IGZyb20gJy4vbWVhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVkaWFuIH0gZnJvbSAnLi9tZWRpYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lbW9pemVXaXRoIH0gZnJvbSAnLi9tZW1vaXplV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VBbGwgfSBmcm9tICcuL21lcmdlQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBMZWZ0IH0gZnJvbSAnLi9tZXJnZURlZXBMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBSaWdodCB9IGZyb20gJy4vbWVyZ2VEZWVwUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGggfSBmcm9tICcuL21lcmdlRGVlcFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGhLZXkgfSBmcm9tICcuL21lcmdlRGVlcFdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlTGVmdCB9IGZyb20gJy4vbWVyZ2VMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVJpZ2h0IH0gZnJvbSAnLi9tZXJnZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVdpdGggfSBmcm9tICcuL21lcmdlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZVdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1pbiB9IGZyb20gJy4vbWluJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW5CeSB9IGZyb20gJy4vbWluQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1vZHVsbyB9IGZyb20gJy4vbW9kdWxvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb3ZlIH0gZnJvbSAnLi9tb3ZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuQXJ5IH0gZnJvbSAnLi9uQXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuZWdhdGUgfSBmcm9tICcuL25lZ2F0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbm9uZSB9IGZyb20gJy4vbm9uZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoIH0gZnJvbSAnLi9udGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aEFyZyB9IGZyb20gJy4vbnRoQXJnJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvIH0gZnJvbSAnLi9vJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvYmpPZiB9IGZyb20gJy4vb2JqT2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9mIH0gZnJvbSAnLi9vZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb25jZSB9IGZyb20gJy4vb25jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb3RoZXJ3aXNlIH0gZnJvbSAnLi9vdGhlcndpc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG92ZXIgfSBmcm9tICcuL292ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhaXIgfSBmcm9tICcuL3BhaXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWwgfSBmcm9tICcuL3BhcnRpYWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWxSaWdodCB9IGZyb20gJy4vcGFydGlhbFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aXRpb24gfSBmcm9tICcuL3BhcnRpdGlvbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aEVxIH0gZnJvbSAnLi9wYXRoRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhPciB9IGZyb20gJy4vcGF0aE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoU2F0aXNmaWVzIH0gZnJvbSAnLi9wYXRoU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQWxsIH0gZnJvbSAnLi9waWNrQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQnkgfSBmcm9tICcuL3BpY2tCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZSB9IGZyb20gJy4vcGlwZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZUsgfSBmcm9tICcuL3BpcGVLJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlUCB9IGZyb20gJy4vcGlwZVAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVXaXRoIH0gZnJvbSAnLi9waXBlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGx1Y2sgfSBmcm9tICcuL3BsdWNrJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVwZW5kIH0gZnJvbSAnLi9wcmVwZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9qZWN0IH0gZnJvbSAnLi9wcm9qZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wRXEgfSBmcm9tICcuL3Byb3BFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcElzIH0gZnJvbSAnLi9wcm9wSXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BPciB9IGZyb20gJy4vcHJvcE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wcyB9IGZyb20gJy4vcHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BTYXRpc2ZpZXMgfSBmcm9tICcuL3Byb3BTYXRpc2ZpZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJhbmdlIH0gZnJvbSAnLi9yYW5nZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZUJ5IH0gZnJvbSAnLi9yZWR1Y2VCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlZCB9IGZyb20gJy4vcmVkdWNlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlUmlnaHQgfSBmcm9tICcuL3JlZHVjZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VXaGlsZSB9IGZyb20gJy4vcmVkdWNlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlamVjdCB9IGZyb20gJy4vcmVqZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmUgfSBmcm9tICcuL3JlbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwZWF0IH0gZnJvbSAnLi9yZXBlYXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGxhY2UgfSBmcm9tICcuL3JlcGxhY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNjYW4gfSBmcm9tICcuL3NjYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2V0IH0gZnJvbSAnLi9zZXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNsaWNlIH0gZnJvbSAnLi9zbGljZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydCB9IGZyb20gJy4vc29ydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydEJ5IH0gZnJvbSAnLi9zb3J0QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRXaXRoIH0gZnJvbSAnLi9zb3J0V2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXQgfSBmcm9tICcuL3NwbGl0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEF0IH0gZnJvbSAnLi9zcGxpdEF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEV2ZXJ5IH0gZnJvbSAnLi9zcGxpdEV2ZXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdFdoZW4gfSBmcm9tICcuL3NwbGl0V2hlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3RhcnRzV2l0aCB9IGZyb20gJy4vc3RhcnRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3VidHJhY3QgfSBmcm9tICcuL3N1YnRyYWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlIH0gZnJvbSAnLi9zeW1tZXRyaWNEaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhaWwgfSBmcm9tICcuL3RhaWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2UgfSBmcm9tICcuL3Rha2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0IH0gZnJvbSAnLi90YWtlTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3RXaGlsZSB9IGZyb20gJy4vdGFrZUxhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZVdoaWxlIH0gZnJvbSAnLi90YWtlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhcCB9IGZyb20gJy4vdGFwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZXN0IH0gZnJvbSAnLi90ZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aGVuIH0gZnJvbSAnLi90aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aHVua2lmeSB9IGZyb20gJy4vdGh1bmtpZnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRpbWVzIH0gZnJvbSAnLi90aW1lcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Mb3dlciB9IGZyb20gJy4vdG9Mb3dlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlycyB9IGZyb20gJy4vdG9QYWlycydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlyc0luIH0gZnJvbSAnLi90b1BhaXJzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvU3RyaW5nIH0gZnJvbSAnLi90b1N0cmluZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9VcHBlciB9IGZyb20gJy4vdG9VcHBlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhbnNkdWNlIH0gZnJvbSAnLi90cmFuc2R1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmF2ZXJzZSB9IGZyb20gJy4vdHJhdmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyaW0gfSBmcm9tICcuL3RyaW0nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyeUNhdGNoIH0gZnJvbSAnLi90cnlDYXRjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcHBseSB9IGZyb20gJy4vdW5hcHBseSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcnkgfSBmcm9tICcuL3VuYXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmN1cnJ5TiB9IGZyb20gJy4vdW5jdXJyeU4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuZm9sZCB9IGZyb20gJy4vdW5mb2xkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbldpdGggfSBmcm9tICcuL3VuaW9uV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gJy4vdW5pcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcUJ5IH0gZnJvbSAnLi91bmlxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFXaXRoIH0gZnJvbSAnLi91bmlxV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5sZXNzIH0gZnJvbSAnLi91bmxlc3MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubmVzdCB9IGZyb20gJy4vdW5uZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bnRpbCB9IGZyb20gJy4vdW50aWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VXaXRoIH0gZnJvbSAnLi91c2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXNJbiB9IGZyb20gJy4vdmFsdWVzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHZpZXcgfSBmcm9tICcuL3ZpZXcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZW4gfSBmcm9tICcuL3doZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlIH0gZnJvbSAnLi93aGVyZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmVFcSB9IGZyb20gJy4vd2hlcmVFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aG91dCB9IGZyb20gJy4vd2l0aG91dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgeHByb2QgfSBmcm9tICcuL3hwcm9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBPYmogfSBmcm9tICcuL3ppcE9iaidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkIH0gZnJvbSAnLi9udW1iZXIvYWRkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRJbmRleCB9IGZyb20gJy4vYWRkSW5kZXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkanVzdCB9IGZyb20gJy4vYWRqdXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3RXaXRoIH0gZnJvbSAnLi9hZGp1c3RXaXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGwgfSBmcm9tICcuL2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsUGFzcyB9IGZyb20gJy4vYWxsUGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWx3YXlzIH0gZnJvbSAnLi9hbHdheXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuZCB9IGZyb20gJy4vYW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnkgfSBmcm9tICcuL2FueSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55UGFzcyB9IGZyb20gJy4vYW55UGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXAgfSBmcm9tICcuL2FwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmQgfSBmcm9tICcuL2FwcGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHkgfSBmcm9tICcuL2FwcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5hcnkgfSBmcm9tICcuL2JpbmFyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluZCB9IGZyb20gJy4vYmluZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm90aCB9IGZyb20gJy4vYm9vbGVhbi9ib3RoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjYWxsIH0gZnJvbSAnLi9jYWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wbGVtZW50IH0gZnJvbSAnLi9jb21wbGVtZW50J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlIH0gZnJvbSAnLi9jb21wb3NlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uZCB9IGZyb20gJy4vY29uZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3VycnkgfSBmcm9tICcuL2N1cnJ5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWZhdWx0VG8gfSBmcm9tICcuL2RlZmF1bHRUbydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZkRhdGUgfSBmcm9tICcuL2RhdGUvZGlmZkRhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpdmlkZSB9IGZyb20gJy4vbnVtYmVyL2RpdmlkZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW1wdHkgfSBmcm9tICcuL2VtcHR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcXVhbHMgfSBmcm9tICcuL2VxdWFscydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXhpc3RzIH0gZnJvbSAnLi9leGlzdHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEYgfSBmcm9tICcuL2Jvb2xlYW4vRidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlsdGVyIH0gZnJvbSAnLi9maWx0ZXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRJbmRleCB9IGZyb20gJy4vZmluZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXJzdCB9IGZyb20gJy4vZmlyc3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZsYXRNYXAgfSBmcm9tICcuL2ZsYXRNYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvbGQgfSBmcm9tICcuL2ZvbGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvcm1hdFN0cmluZyB9IGZyb20gJy4vc3RyaW5nL2Zvcm1hdFN0cmluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzIH0gZnJvbSAnLi9vYmplY3QvaGFzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNJbiB9IGZyb20gJy4vb2JqZWN0L2hhc0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGljYWwgfSBmcm9tICcuL2lkZW50aWNhbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpdHkgfSBmcm9tICcuL2lkZW50aXR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpcyB9IGZyb20gJy4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJyYXkgfSBmcm9tICcuL2FycmF5L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jvb2xlYW4gfSBmcm9tICcuL2Jvb2xlYW4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRGF0ZSB9IGZyb20gJy4vZGF0ZS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNGdXR1cmVEYXRlIH0gZnJvbSAnLi9kYXRlL2lzRnV0dXJlRGF0ZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNNYXAgfSBmcm9tICcuL21hcC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOYW4gfSBmcm9tICcuL251bWJlci9pc05hbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdWxsIH0gZnJvbSAnLi9udWxsL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc051bWJlciB9IGZyb20gJy4vbnVtYmVyL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1NldCB9IGZyb20gJy4vc2V0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1N0cmluZyB9IGZyb20gJy4vc3RyaW5nL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc1ZhbGlkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKdXN0IH0gZnJvbSAnLi9tb25hZHMvSnVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5cyB9IGZyb20gJy4va2V5cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5c0luIH0gZnJvbSAnLi9vYmplY3Qva2V5c0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0IH0gZnJvbSAnLi9sYXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0IH0gZnJvbSAnLi9saWZ0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXAgfSBmcm9tICcuL21hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4IH0gZnJvbSAnLi9tYXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE1heWJlIH0gZnJvbSAnLi9tb25hZHMvTWF5YmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlIH0gZnJvbSAnLi9vYmplY3QvbWVyZ2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG11bHRpcGx5IH0gZnJvbSAnLi9udW1iZXIvbXVsdGlwbHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vdCB9IGZyb20gJy4vbm90J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOb3RoaW5nIH0gZnJvbSAnLi9tb25hZHMvTm90aGluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb21pdCB9IGZyb20gJy4vb2JqZWN0L29taXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yIH0gZnJvbSAnLi9vcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aCB9IGZyb20gJy4vb2JqZWN0L3BhdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tICcuL29iamVjdC9waWNrJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wIH0gZnJvbSAnLi9vYmplY3QvcHJvcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3VtIH0gZnJvbSAnLi9udW1iZXIvc3VtJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUIH0gZnJvbSAnLi9ib29sZWFuL1QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvRGF5IH0gZnJvbSAnLi9kYXRlL3RvRGF5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0hvdXIgfSBmcm9tICcuL2RhdGUvdG9Ib3VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b01pbnV0ZXMgfSBmcm9tICcuL2RhdGUvdG9NaW51dGVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlY29uZHMgfSBmcm9tICcuL2RhdGUvdG9TZWNvbmRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnV0aHkgfSBmcm9tICcuL3RydXRoeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHlwZSB9IGZyb20gJy4vdHlwZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tICcuL2FycmF5L3VuaW9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXMgfSBmcm9tICcuL29iamVjdC92YWx1ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcCB9IGZyb20gJy4vemlwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBXaXRoIH0gZnJvbSAnLi96aXBXaXRoJ1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBWZXJpZmllcyB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRcbiAqXG4gKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlzIChDdG9yLCB2YWwpIHtcbiAgcmV0dXJuIHR5cGUodmFsKSA9PT0gQ3RvclxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VtcHR5ICh4KSB7XG4gIHJldHVybiBleGlzdHMoeCkgJiYgZXF1YWxzKHgsIGVtcHR5KHgpKVxufTtcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzSXRlciAoaXRlcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihpdGVyW1N5bWJvbC5pdGVyYXRvcl0pXG59XG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqXG4gKiBAZnVuY3Rpb24ga2V5c1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBpdGVyYXRvclxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBvYmogLT4gWypdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gT2JqIGZyb20gemhpY2ggdG8gdGFrZSB0aGUga2V5c1xuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBvYmplY3RLZXlzIGZyb20gJy4vb2JqZWN0L2tleXMnXG5pbXBvcnQgbWFwS2V5cyBmcm9tICcuL21hcC9rZXlzJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKG9iaikge1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwS2V5cyhvYmopXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RLZXlzKG9iailcbiAgfVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGxhc3RcbiAqIEBwYXJhbSBbYV1cbiAqIEByZXR1cm4gYSB8IHVuZGVmaW5lZFxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gbGFzdCAoYSkge1xuICByZXR1cm4gYSAmJiBhLmxlbmd0aCA/IGFbYS5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZFxufSlcbiIsIi8qKlxuICogXCJsaWZ0c1wiIGEgZnVuY3Rpb24gb2YgYXJpdHkgPiAxIHNvIHRoYXQgaXQgbWF5IFwibWFwIG92ZXJcIiBhIGxpc3QsIEZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGxpZnRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKCouLi4gLT4gKikgLT4gKFsqXS4uLiAtPiBbKl0pXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgZm9sZCBmcm9tICcuL2ZvbGQnXG5pbXBvcnQgYXAgZnJvbSAnLi9hcCdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGxpZnQgKGZuKSB7XG4gIGNvbnN0IGxpZnRlZCA9IGN1cnJ5MShjdXJyeShmbikpXG4gIHJldHVybiBjdXJyeShmdW5jdGlvbiBfbGlmdCAoKSB7XG4gICAgcmV0dXJuIGZvbGQoYXAsIG1hcChsaWZ0ZWQsIGFyZ3VtZW50c1swXSksIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG4gIH0pXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gaXRlcmFibGUgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCBtYXBzIG92ZXIgYW4gaXRlcmFibGUuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBiIC0+IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vYXJyYXkvbWFwJ1xuaW1wb3J0IG9iamVjdE1hcCBmcm9tICcuL29iamVjdC9tYXAnXG5pbXBvcnQgbWFwTWFwIGZyb20gJy4vbWFwL21hcCdcbmltcG9ydCBzdHJpbmdNYXAgZnJvbSAnLi9zdHJpbmcvbWFwJ1xuaW1wb3J0IGl0ZXJhdG9yTWFwIGZyb20gJy4vaXRlcmF0b3IvbWFwJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuaW1wb3J0IGlzSXRlcmF0b3IgZnJvbSAnLi9pdGVyYXRvci9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBzd2l0Y2ggKHR5cGUoYSkpIHtcbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0TWFwKGNiLCBhKVxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwTWFwKGNiLCBhKVxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiBhcnJheU1hcChjYiwgYSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGlzSXRlcmF0b3IoYSlcbiAgICAgICAgPyBpdGVyYXRvck1hcChjYiwgYSlcbiAgICAgICAgOiBhcnJheU1hcChjYiwgYSlcbiAgfVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwRmlsdGVyIChmbiwgbSkge1xuICBsZXQgciA9IG5ldyBNYXAoKVxuXG4gIGxldCBpdCA9IG0uZW50cmllcygpXG4gIGxldCByZXN1bHQgPSBpdC5uZXh0KClcblxuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgayA9IHJlc3VsdC52YWx1ZVswXVxuICAgIGNvbnN0IHYgPSByZXN1bHQudmFsdWVbMV1cbiAgICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gICAgcmVzdWx0ID0gaXQubmV4dCgpXG4gIH1cblxuICAvLyBMaW1pdGVkIGJyb3dzZXIgc3VwcG9ydFxuICAvLyBtLmZvckVhY2goKHYsIGspID0+IHtcbiAgLy8gICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gIC8vIH0pXG5cbiAgLy8gYmFiZWwgdHJhbnNwaWxlIGlzc3Vlc1xuICAvLyBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtLmVudHJpZXMoKSkge1xuICAvL1xuICAvLyB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdNYXAnKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBNYXAgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIGEua2V5cygpXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBNYXAgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7TWFwfSBhXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIGEuZm9yRWFjaCgodiwgaywgbWFwKSA9PiB7XG4gICAgci5zZXQoaywgY2IodiwgaywgbWFwKSlcbiAgfSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIGxhcmdlc3Qgb2YgdGhlIDIgYXJndW1lbnRzIHByb3ZpZGVkXG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4geyp9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWF4IChhLCBiKSB7XG4gIHJldHVybiBiID4gYSA/IGIgOiBhXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gSnVzdFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMge0p1c3R9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IEp1c3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX3ZhbHVlID0gdmFsXG4gIHJldHVybiB0aGlzXG59XG5cbkp1c3QucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cbkp1c3QucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IEp1c3RcbiIsImltcG9ydCBKdXN0IGZyb20gJy4vSnVzdCdcbmltcG9ydCBOb3RoaW5nIGZyb20gJy4vTm90aGluZydcblxuLyoqXG4gKiBAZnVuY3Rpb24gTWF5YmVcbiAqIEBwYXJhbSB2YWxcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTWF5YmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxufVxuXG5NYXliZS5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1heWJlKSByZXR1cm4gdmFsXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgTWF5YmUpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF5YmUodmFsKVxufVxuXG5NYXliZS5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIHRoaXMuaXNOb3RoaW5nKCkgPyBuIDogdGhpcy5fX3ZhbHVlXG59XG5cbk1heWJlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZikge1xuICBpZiAodGhpcy5pc05vdGhpbmcoKSkge1xuICAgIHJldHVybiBNYXliZS5vZihudWxsKVxuICB9XG4gIHJldHVybiBNYXliZS5vZihmKHRoaXMuX192YWx1ZSkpXG59XG5cbk1heWJlLnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChtKSB7XG4gIHJldHVybiBtLm1hcCh0aGlzLl9fdmFsdWUpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodGhpcy5fX3ZhbHVlID09IG51bGwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhdGhpcy5pc05vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nKClcbn1cblxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgSnVzdCh0aGlzLl92YWx1ZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF5YmVcbiIsIi8qKlxuICogQGZ1bmN0aW9uIE5vdGhpbmdcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbn1cblxuTm90aGluZy5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cbk5vdGhpbmcucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aGluZ1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbm90XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBub3QgKHgpIHtcbiAgcmV0dXJuICF4XG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMy8wMi8yMDE5XG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ251bGwnKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uIGFkZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgcmV0dXJuICthICsgK2Jcbn0pXG4iLCIvKipcbiAqXG4gKlxuICogQGZ1bmN0aW9uIGRpdmlkZVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRpdmlzaW9uIG9mIHRoZSAyIGFyZ3VtZW50c1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpdmlkZSAoYSwgYikge1xuICByZXR1cm4gK2EgLyArYlxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTnVtYmVyJylcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzTmFOXG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIG51bWJlciBpcyBOQU5cblxuICovXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9pcydcbmltcG9ydCBhbmQgZnJvbSAnLi4vYW5kJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc05hbiAoeCkge1xuICByZXR1cm4gYW5kKGlzTnVtYmVyKHgpLCBpc05hTih4KSlcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbXVsdGlwbHkgKGEsIGIpIHtcbiAgcmV0dXJuICthICogK2Jcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgbnVtYmVycyBpbiBhbiBhcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbTnVtYmVyXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBhZGQgZnJvbSAnLi9hZGQnXG5pbXBvcnQgZm9sZCBmcm9tICcuLi9mb2xkJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBzdW0gKGEpIHtcbiAgcmV0dXJuIGZvbGQoYWRkLCAwLCBhKVxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuLi9leGlzdHMnXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoeCwgeSkgPT4ge1xuICBmb3IgKGxldCBrZXlYIGluIHgpIHtcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbmZpbHRlcmVkRm9ySW5Mb29wXG4gICAgaWYgKG5vdChlcXVhbHMoeFtrZXlYXSwgeVtrZXlYXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGtleVkgaW4geSkge1xuICAgIGlmIChub3QoZXhpc3RzKHhba2V5WV0pKSAmJiBleGlzdHMoeVtrZXlZXSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvYmplY3RGaWx0ZXJcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9iamVjdEZpbHRlciAoZm4sIG8pIHtcbiAgbGV0IHIgPSB7fVxuICBjb25zdCBrID0ga2V5cyhvKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZm4ob1trW2ldXSkpIHJba1tpXV0gPSBvW2tbaV1dXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcge1N0cmluZ30gLT4ge09iamVjdH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGhhcyAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5LCBldmVuIGlmIGl0IGlzIGluaGVyaXRlZFxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzSW4gKHByb3AsIG9iaikge1xuICByZXR1cm4gcHJvcCBpbiBvYmpcbn0pXG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdPYmplY3QnKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBvYmplY3QgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKE9iamVjdChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYWxsIHRoZSBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICBjb25zdCByID0gW11cbiAgZm9yIChjb25zdCBrIGluIGEpIHtcbiAgICByLnB1c2goaylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIG9iamVjdCBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBlbXB0eSBmcm9tICcuLi9lbXB0eSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBjb25zdCBrID0ga2V5cyhhKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gZW1wdHkoYSlcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByW2tbaV1dID0gY2IoYVtrW2ldXSwga1tpXSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuLi9pZGVudGljYWwnXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi4vb2JqZWN0L2lzJ1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi4vYXJyYXkvaXMnXG5pbXBvcnQgdW5pb24gZnJvbSAnLi4vYXJyYXkvdW5pb24nXG5cbmNvbnN0IG1lcmdlID0gY3VycnkoKG9iakwsIG9ialIpID0+IHtcbiAgbGV0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9iakwpXG5cbiAgaWYgKGlkZW50aWNhbChvYmpMLCBvYmpSKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuICB9XG4gIGZvciAobGV0IGtleSBpbiBvYmpSKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqUiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgb2xkVmFsdWUgPSBvYmpSW2tleV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IG9iakxba2V5XVxuXG4gICAgaWYgKGlzT2JqZWN0KG9sZFZhbHVlKSAmJiBpc09iamVjdChuZXdWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShuZXdWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdW5pb24obmV3VmFsdWUsIG9sZFZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9sZFZhbHVlIC8vIFRPRE86IHRoaXMgaXMgYSByZWZlcmVuY2UsIHNob3VsZCBiZSBjbG9uZVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59KVxuXG5leHBvcnQgZGVmYXVsdCBtZXJnZVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChvYmosIG5hbWVzKSA9PiB7XG4gIGxldCByZXN1bHQgPSB7fVxuXG4gIE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKChrZXkpID0+IHtcbiAgICByZXR1cm4gbmFtZXMuaW5kZXhPZihrZXkpID09PSAtMVxuICB9KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICByZXN1bHRba2V5XSA9IG9ialtrZXldXG4gIH0pXG4gIHJldHVybiByZXN1bHRcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBwYXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGF0aCAocGF0aCwgb2JqKSB7XG4gIGxldCB2YWwgPSBvYmpcbiAgbGV0IGlkeCA9IDBcbiAgbGV0IHBcbiAgd2hpbGUgKGlkeCA8IHBhdGgubGVuZ3RoKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcCA9IHBhdGhbaWR4XVxuICAgIHZhbCA9IE51bWJlci5pc0ludGVnZXIocClcbiAgICAgID8gcCA8IDAgPyB2YWxbdmFsLmxlbmd0aCArIHBdIDogdmFsW3BdXG4gICAgICA6IHZhbFtwXVxuICAgIGlkeCArPSAxXG4gIH1cbiAgcmV0dXJuIHZhbFxufSlcbi8vIGxldCByID0gb2JqXG4vLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbi8vICAgaWYgKHIgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuLy8gICByID0gcltwYXRoW2ldXVxuLy8gfVxuLy8gcmV0dXJuIHJcbi8vIH0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBwaWNrXG4gKiBAZGVzY3JpcHRpb24gcmV0dXJucyBhIG5ldyBiamVjdCB3aXRoIG9ubHkgdGhlIHByb3BzIHRoYXQgYXJlIHByb3ZpZGVkXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyAtIEFycmF5IG9mIHByb3BlcnR5IG5hbWVzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwaWNrIChwcm9wcywgb2JqKSB7XG4gIGNvbnN0IHIgPSB7fVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKGkgPCBwcm9wcy5sZW5ndGgpIHtcbiAgICBpZiAocHJvcHNbaV0gaW4gb2JqKSB7XG4gICAgICByW3Byb3BzW2ldXSA9IG9ialtwcm9wc1tpXV1cbiAgICB9XG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBwcm9wXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcHJvcCAocCwgb2JqKSB7XG4gIHJldHVybiBvYmpbcF1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiB2YWx1ZXNcbiAqIEBkZXNjcmlwdGlvbiBSRXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgdGFrZW4gZnJvbSBhbiBvYmplY3RzIG93biBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gLSBvYmogVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHZhbHVlc1xuICogQHJldHVybiB7YXJyYXl9XG4gKlxuICoqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiB2YWx1ZXMgKG9iaikge1xuICBjb25zdCBrID0ga2V5cyhvYmopXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gW11cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIHJbaV0gPSBvYmpba1tpXV1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG9yXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIG9uZSBvciB0aGUgb3RoZXIgaXMgdHJ1ZVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gb3IgKHgsIHkpIHtcbiAgcmV0dXJuIHggfHwgeVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU2V0JylcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBzdHJpbmdDb25jYXRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgcmV0dXJuIFN0cmluZyhhKSArIFN0cmluZyhiKVxufVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxuICovXG5pbXBvcnQgdG9BcnJheSBmcm9tICcuLi9hcnJheS90bydcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcgKHN0cikgeyAvLyB1c2UgZnVuY3Rpb24oKSwgYXJyb3cgZnVuY3Rpb24gZG9lc24ndCBiaW5kIGFyZ3VtZW50c1xuICBsZXQgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKVxuXG4gIGFyZ3Muc2hpZnQoKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL3soXFxkKyl9L2csIChtYXRjaCwgaWR4KSA9PiB7XG4gICAgcmV0dXJuIG5vdChpcygnVW5kZWZpbmVkJywgYXJnc1tpZHhdKSkgPyBhcmdzW2lkeF0gOiBtYXRjaFxuICB9KVxufVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU3RyaW5nJylcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgc3RyaW5nIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBsZXQgciA9ICcnXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciArPSBjYihhLmNoYXJBdChpKSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRydXRoeVxuICovXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cnV0aHkgKHgpIHtcbiAgcmV0dXJuICh4ICE9PSBmYWxzZSkgJiYgZXhpc3RzKHgpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCd1bmRlZmluZWQnKVxuIiwiLyoqXG5cbiAqIHppcFxuICpcbiAqIEBmdW5jdGlvbiB6aXBcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgemlwV2l0aCBmcm9tICcuL3ppcFdpdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcCAoYSwgYikge1xuICByZXR1cm4gemlwV2l0aChmdW5jdGlvbiBfemlwV2l0aCAoeCwgeSkgeyByZXR1cm4gW3gsIHldIH0sIGEsIGIpXG59KVxuIiwiLyoqXG5cbiAqIHppcFdpdGhcbiAqXG4gKiAgQGZ1bmN0aW9uIHppcFdpdGhcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcFdpdGggKGNiLCBhLCBiKSB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgbGV0IGkgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGFyci5wdXNoKGNiKGFbaV0sIGJbaV0pKVxuICB9XG4gIHJldHVybiBhcnJcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnZnVuLmpzL3NyYy9tYXAnXG5pbXBvcnQgZm9sZCBmcm9tICdmdW4uanMvc3JjL2ZvbGQnXG5pbXBvcnQgZXF1YWxzIGZyb20gJ2Z1bi5qcy9zcmMvZXF1YWxzJ1xuaW1wb3J0IGNvbmNhdCBmcm9tICd1dGlsL2NvbmNhdCdcbmltcG9ydCBlbXB0eSBmcm9tICd1dGlsL2VtcHR5J1xuaW1wb3J0IGRvdCBmcm9tICd1dGlsL2RvdCdcbmltcG9ydCBpZGVudGl0eSBmcm9tICd1dGlsL2lkZW50aXR5J1xuaW1wb3J0IHRyYW5zcG9zZSBmcm9tICd1dGlsL3RyYW5zcG9zZSdcbmltcG9ydCBnZW5lcmF0ZSBmcm9tICd1dGlsL2dlbmVyYXRlJ1xuaW1wb3J0IGdwdW1hcCBmcm9tICd1dGlsL2dwdW1hcCdcbmltcG9ydCBncHVmb2xkIGZyb20gJ3V0aWwvZ3B1Zm9sZCdcbmltcG9ydCBncHVwcm9kdWN0IGZyb20gJ3V0aWwvZ3B1cHJvZHVjdCdcblxuLyoqXG4gKiBAY2xhc3MgTWF0cml4XG4gKiBAY2xhc3NkZXNjIE1hdHJpeCBhcHBsaWNhdGl2ZSBwcm92aWRpbmcgc3RhbmRhcmQgbWF0cml4IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoZSBNYXRyaXggY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgbmV3IGtleXdvcmQuIEluc3RlYWQgdXNlIHRoZSBNYXRyaXgub2Ygc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBNYXRyaXguIFVuZm9ydHVuYXRseSBqc2RvY3MgZG9lcyBub3QgYWxsb3cgZm9yIHRoZSBjb25zdHJ1Y3RvciB0byBiZSBoaWRkZW4uXG4gKiBAaGlkZWNvbnRydWN0b3JcbiAqIEBzZWUgb2ZcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbmxldCBNYXRyaXggPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxuICAvLyBpZiAoR1BVSlMpIHtcbiAgLy8gICB0aGlzLmdwdWpzID0gR1BVSlMgfHwgbnVsbFxuICAvLyB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG9mXG4gKiBAZGVzYyBDcmVhdGVzIGEgTWF0cml4IG9iamVjdCBhbmQgZmxhdHRlbnMgdGhlIE1hdHJpeFxuICogQHBhcmFtIHZhbCB7YXJyYXl8ZnVuY3Rpb259IEFuIGFycmF5IG9mIGFycmF5c1xuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbk1hdHJpeC5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hdHJpeCkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXRyaXgodmFsKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS50eXBlID09PSAnTWF0cml4J1xuICovXG5NYXRyaXgucHJvdG90eXBlLnR5cGUgPSAnTWF0cml4J1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcmVjaXNpb25cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnByZWNpc2lvbiA9PT0gNFxuICovXG5NYXRyaXgucHJvdG90eXBlLnByZWNpc2lvbiA9IDRcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc2V0UHJlY2lzaW9uXG4gKiBAcGFyYW0gcHJlY2lzaW9uIHtudW1iZXJ9IFNldCB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGZvciByb3VuZGluZ1xuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5zZXRQcmVjaXNpb24oMTApXG4gKiBtLnByZWNpc2lvbiA9PT0gMTBcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zZXRQcmVjaXNpb24gPSBmdW5jdGlvbiAocHJlY2lzaW9uKSB7XG4gIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3ltbWV0cmljXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1N5bW1ldHJpYygpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3ltbWV0cmljID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBhID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IGIgPSBNYXRyaXgudHJhbnNwb3NlKHRoaXMpLl9fdmFsdWVcbiAgcmV0dXJuIGVxdWFscyhhLCBiKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1NxdWFyZVxuICogQGRlc2MgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjb250YWlucyBhIHNxdWFyZSBNYXRyaXhcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3F1YXJlKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTcXVhcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5nZXRDb2xzKCksIHRoaXMuZ2V0Um93cygpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc09ydGhvZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1stMC4zMDkyLCAtMC45NTEwXSwgWy0wLjk1MTAsIDAuMzA5Ml1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiB0cnVlICA9PT0gQS5pc09ydGhvZ29uYWwoKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzT3J0aG9nb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgQXhBdCA9IHRoaXMuZG90KHRoaXMudHJhbnNwb3NlKCkpXG4gIGNvbnN0IEkgPSB0aGlzLmlkZW50aXR5KClcbiAgcmV0dXJuIGVxdWFscyhBeEF0LCBJKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRDb2xzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldENvbHMoKSAgPT09IDJcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Q29scyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZVswXS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZXF1YWxzXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gW1sxLCAxXSwgWzEsIDFdXVxuICogdmFyIEEgPSBNYXRyaXgub2YoYSlcbiAqIHZhciBCID0gTWF0cml4Lm9mKGEpXG4gKiB0cnVlICA9PT0gQS5lcXVhbHMoQilcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlIHx8IE0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFJvd3NcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Um93cygpICAvLyAyXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0U2hhcGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRTaGFwZSgpICAvLyBbMiwgMl1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRTaGFwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFt0aGlzLmdldFJvd3MoKSwgdGhpcy5nZXRDb2xzKCldXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBtLm1hcCh4ID0+IHgubWFwKHkgPT4geSsgMSkpXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKGYpKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0aGF0IG1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm1hcCh4PSA+IHgubWFwKHkgPT4geSsgMSksIFtbMSwgMV0sIFsxLCAxXV0pXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgubWFwID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZWR1Y2UgdGhlIG1hdHJpeCByb3dzIHVzaW5nIGEgcmVkdWNlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEEgcmVkdWNlL2ZvbGQgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEZsYXR0ZW4gTWF0cml4XG4gKiBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSkuZm9sZCgocHJldiwgbmV4dCkgPT4gcHJldi5jb25jYXQobmV4dCkpXG4gKiAvLyBbMSwgMSwgMSwgMV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKGYsIFtdKSh0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRvIHJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIE1hdHJpeCB0byByZWR1Y2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuXG4gKiAvLyBTdW0gb2YgYWxsIG1hdHJpeCB2YWx1ZXNcbiAqIGNvbnN0IHJlZHVjZXIgPSAocHJldiwgbmV4dCkgPT4gTnVtYmVyKHByZXYpICsgbmV4dC5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgeCwgMClcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXVxuICogTWF0cml4LmZvbGQocmVkdWNlciwgQSlcbiAqIC8vIDRcbiAqL1xuTWF0cml4LmZvbGQgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmZvbGQoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIE1hdHJpeCB0byBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZiA9IHggPT4geC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiBNYXRyaXgub2YoZikuYXAoTSlcbiAqIC8vIFtbNl0sIFsxNV0sIFsyNF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn1cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBNYXRyaXguYXAoZiwgW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbNywgOCwgOV1dKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXguYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKGYpLmFwKE0pXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMCwgMSwgMV0sIFsyLCAzLCA0XV1cbiAqIGNvbnN0IGIgPSBbWzIsIDIsIDJdLCBbMywgMywgM11dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKiBjb25zdCBNID0gQS5jb25jYXQoQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKE0sIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZihNKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgTWF0cmljZXMgdXNpbmcgYSBmdW5jdGlvbiBhcyBvcGVyYXRvclxuICogQHBhcmFtIEEge01hdHJpeH1cbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBNYXRyaXguY29uY2F0KEEsIEIpXG4gKiAvLyBbWzAsIDEsIDEsIDIsIDIsIDJdLCBbMiwgMywgNCwgMywgMywgM11dXG4gKlxuICovXG5NYXRyaXguY29uY2F0ID0gY3VycnkoZnVuY3Rpb24gKEEsIEIsIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5tYXAoZihCKSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZW1wdHkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHBhcmFtIHJvd3Mge251bWJlcn1cbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguZW1wdHkgPSBjdXJyeShmdW5jdGlvbiAocm93cyA9IDAsIGNvbHMgPSAwKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLm1hcChlbXB0eSlcbn0pXG5cbi8vICMjIyMgIyMjIyAjIyMjIC8vXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMSwgMiwgM10sIFs0LCA1LCA2XV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEFpZGVudGl0eSA9IEEuaWRlbnRpdHkoKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiovXG5NYXRyaXgucHJvdG90eXBlLmlkZW50aXR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcCh0aGlzKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgUmV0dXJucyBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXguaWRlbnRpdHkoMywgMilcbiAqIC8vIFtbMSwgMCwgMF0sIFswLCAxLCAwXV1cbiAqXG4gKi9cbk1hdHJpeC5pZGVudGl0eSA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcChtKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNvbWJpbmUgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmNvbmNhdChNYXRyaXgub2YoTSksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29tYmluZVxuICogQHNlZSBNYXRyaXguY29uY2F0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LmNvbWJpbmUgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmNvbmNhdChNYXRyaXgub2YoQiksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIENyZWF0ZSBtYXRyaXhcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAyXSwgWzMsIDRdXSlcbiAqXG4gKiAvLyBHZW5lcmF0ZSBpZGVudGl0eSBtYXRyaXhcbiAqIGNvbnN0IEkgID0gbS5pZGVudGl0eSgpIC8vIFtbMSwgMF0sIFswLCAxXV1cbiAqXG4gKiBpZihtLmRvdChJKS5lcXVhbHMobSkpIHtcbiAqICAgIGNvbnNvbGUubG9nKCdEb3QgcHJvZHVjdCB3aXRoIGlkZW50aXR5IG1hdHJpeCByZXR1cm5zIHRoZSBzYW1lIG1hdHJpeCcpXG4gKiB9XG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRvdCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgZG90KHRoaXMucHJlY2lzaW9uKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgYiA9IFtbNywgOF0sIFs5LCAxMF0sIFsxMSwgMTJdXVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqXG4gKiBNYXRyaXguZG90KEEsIEIpIC8vIFtbNTgsIDY0XSwgWzEzOSwgMTU0XV1cbiAqXG4gKi9cbk1hdHJpeC5kb3QgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmRvdChNYXRyaXgub2YoQikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZpbGxcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggdGhlIHByb3ZpZGVkIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5maWxsKHggPT4gNDIpXG4gKiAvLyBbWzQyLDQyLDQyXSwgWzQyLDQyLDQyXSwgWzQyLDQyLDQyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKG1hcCh4ID0+IGYoeCkpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB6ZXJvc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB6ZXJvc1xuICogQHJldHVybnMge01hdHJpeH1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS56ZXJvcygpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuemVyb3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbCh4ID0+IDApXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC56ZXJvcygzLCAzKVxuICogLy8gW1swLDAsMF0sIFswLDAsMF0sIFswLDAsMF1dXG4gKlxuICovXG5NYXRyaXguemVyb3MgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkub25lcygpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUub25lcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vbmVzKDEsIDEpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5vbmVzID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbCh4ID0+IDEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gdmFsdWVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxXVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiByYW5kb21cbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggcmFuZG9tIG51bWJlcnNcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gRnVuY3Rpb24gd2hpY2ggcmV0dXJucyByYW5kb20gdmFsdWVzLiBEZWZhdWx0IHJhbmRvbSB2YWx1ZXMgYXJlIGJldHdlZW4gLTEgYW5kIDFcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucmFuZG9tID0gZnVuY3Rpb24gKGYgPSBlID0+IChNYXRoLnJhbmRvbSgpICogMiAtIDEpLCByb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoZilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdG9BcnJheVxuICogQGRlc2MgUmV0dXJucyB0aGUgYXJyYXkgZnJvbSB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5tYXAocm93ID0+IHJvdy5tYXAoY29sID0+IGNvbCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNsb25lXG4gKiBAZGVzYyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5mcm9tQXJyYXkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmcm9tQXJyYXlcbiAqIEBkZXNjIFJldHVybnMgYSBNYXRyaXggZnJvbSBhbiBhcnJheVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5NYXRyaXguZnJvbUFycmF5ID0gZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gTWF0cml4Lm9mKG1hcChyb3cgPT4gbWFwKGNvbCA9PiBjb2wpKHJvdykpKGFycikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFstMSwgMl0sIFszLCA0XSwgWy04LCAyXSlcbiAqIGNvbnN0IGIgPSBBLnRyYW5zcG9zZSgpLnRvQXJyYXkoKVxuICogLy8gcmV0dXJucyBbWy0xLCAzLC04XSwgWzIsIDQsIDJdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnRyYW5zcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKHRyYW5zcG9zZSwgW10sIHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBBIE1hdHJpeCBvciBhIG1hdHJpeCBhcnJheVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFstMSwgMl0sIFszLCA0XSwgWy04LCAyXVxuICogY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UoYSkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC50cmFuc3Bvc2UgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnRyYW5zcG9zZSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGFkZFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gQWRkIGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5hZGQoMSkgLy8gW1s2LCA1XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmFkZChCKSAvLyBbWzEwLCAxMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgYWRkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsICsgTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCArIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdWJ0cmFjdFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gU3VidHJhY3QgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLnN1YnRyYWN0KDEpIC8vIFtbNCwgMl1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5zdWJ0cmFjdChCKSAvLyBbWzAsIDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3Qgc3VidHJhY3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgLSBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4IC0gTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIG11bHRpcGx5XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIE11dGxpcGx5IGEgc2NhbGFyIG9yIGEgbXRyYWl4IHdpdGggYSBtYXRyaXguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbXVsdGlwbGljYXRpb24gaXMgbm90IHBvc3NpYmxlLlxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5tdWx0aXBseSgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLm11bHRpcGx5KEIpIC8vIFtbMjUsIDI1XV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNlIHN0YXRpYyBtZXRob2QgXFwnZG90XFwnIHRvIGRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGNyZWF0ZSBoYWRhbWFyZCBwcm9kdWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKChjb2wsIGpkeCkgPT4gY29sICogTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAqIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBhZGRpdGl2ZWludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXRyaXggb2J0YWluZWQgYnkgY2hhbmdpbmcgdGhlIHNpZ24gb2YgZXZlcnkgbWF0cml4IGVsZW1lbnQuIFRoZSBhZGRpdGl2ZSBpbnZlcnNlIG9mIG1hdHJpeCBBIGlzIHdyaXR0ZW4g4oCTQS5cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LC01XSwgWy00LCA0XV0pXG4gKiBjb25zdCBtaW51c0EgPSBBLmFkZGl0aXZlaW52ZXJzZSgpXG4gKiAvLyBbWy01LCA1XSwgWzQsIC00XV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGRpdGl2ZWludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoLTEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBoYWRhbWFyZFxuICogQGluc3RhbmNlXG4gKiBAc2VlIG11bHRpcGx5XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuaGFkYW1hcmQoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5oYWRhbWFyZChCKSAvLyBbWzI1LCAyNV1dXG5cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5oYWRhbWFyZCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbHVcbiAqIEBkZXNjIENhbGN1bGF0ZXMgTFUgZGVjb21wb3NpdGlvbiBvZiB0aGUgY3VycmVudCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXhbXX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1szLCAtNywgLTIsIDJdLCBbLTMsIDUsIDEsIDBdLCBbNiwgLTQsIDAsIC01XSwgWy05LCA1LCAtNSwgMTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogY29uc3QgbHUgPSBBLmx1KClcbiAqIC8vIEwuX192YWx1ZSA9IFsgWyAxLCAwLCAwLCAwIF0sIFsgLTEsIDEsIDAsIDAgXSwgWyAyLCAtNSwgMSwgMCBdLCBbIC0zLCA4LCAzLCAxIF0gXVxuICogLy8gVS5fX3ZhbHVlID0gIFsgWyAzLCAtNywgLTIsIDIgXSwgWyAwLCAtMiwgLTEsIDIgXSwgWyAwLCAwLCAtMSwgMSBdLCBbIDAsIDAsIDAsIC0xIF0gXVxuICogTWF0cml4LmRvdChsdVswXSwgbHVbMV0pIC8vIHJldHVybnMgY2xvbmUgb2YgQVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5sdSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IHRvbCA9IDFlLTZcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMID0gdGhpcy56ZXJvcygpXG4gIGNvbnN0IFUgPSB0aGlzLnplcm9zKClcblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGlmIChNYXRoLmFicyhBLl9fdmFsdWVba11ba10pIDwgdG9sKSB0aHJvdyBFcnJvcignQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvdyBleGNoYW5nZScpXG4gICAgTC5fX3ZhbHVlW2tdW2tdID0gMVxuICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgTC5fX3ZhbHVlW2ldW2tdID0gQS5fX3ZhbHVlW2ldW2tdIC8gQS5fX3ZhbHVlW2tdW2tdXG4gICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyArK2opIHtcbiAgICAgICAgQS5fX3ZhbHVlW2ldW2pdID0gQS5fX3ZhbHVlW2ldW2pdIC0gTC5fX3ZhbHVlW2ldW2tdICogQS5fX3ZhbHVlW2tdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGwgPSBrOyBsIDwgbjsgKytsKSB7XG4gICAgICBVLl9fdmFsdWVba11bbF0gPSBBLl9fdmFsdWVba11bbF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtMLCBVXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBycmVmXG4gKiBAcmV0dXJucyB7TWF0cml4fGFycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihbWy0xLCAxXSwgWy0xLCAwXSwgWzAsIC0xXSwgWy0xLCAtMl1dKVxuICogQS5ycmVmKCkgLy8gIFsgWyAxLCAwIF0sIFsgLTAsIDEgXSwgWyAwLCAwIF0sIFsgMCwgMCBdIF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ycmVmID0gZnVuY3Rpb24gKCkge1xuICBsZXQgbGVhZCA9IDBcbiAgY29uc3QgcmVzdWx0TWF0cml4ID0gdGhpcy5jbG9uZSgpXG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmdldFJvd3MoKTsgKytyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpIDw9IGxlYWQpIHtcbiAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICB9XG4gICAgbGV0IGkgPSByXG4gICAgd2hpbGUgKHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdID09PSAwKSB7XG4gICAgICArK2lcbiAgICAgIGlmICh0aGlzLmdldFJvd3MoKSA9PT0gaSkge1xuICAgICAgICBpID0gclxuICAgICAgICArK2xlYWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29scygpID09PSBsZWFkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRtcCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV0gPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdID0gdG1wXG5cbiAgICBsZXQgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bbGVhZF1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdIC89IHZhbFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nZXRSb3dzKCk7ICsraSkge1xuICAgICAgaWYgKGkgPT09IHIpIGNvbnRpbnVlXG4gICAgICB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2pdIC09IHZhbCAqIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGxlYWQrK1xuICB9XG4gIHJldHVybiByZXN1bHRNYXRyaXhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc29sdmVcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNvbHZlIHhBID0gYlxuICogLy8gNXggKyB5ICA9IDdcbiAqIC8vIDN4IC0gNHkgPSAxOFxuICogLy8gU29sdXRpb24gZm9yIHggYW5kIHk6XG4gKiAvLyB4ID0gMlxuICogLy8geSA9IC0zXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDFdLCBbMywgLTRdXSlcbiAqIGNvbnN0IHNvbHZlQSA9IEEuc29sdmUoWzcsIDE4XSkgLy8gWzIsIC0zXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uIChiKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTFUgPSBBLmx1KClcbiAgY29uc3QgTCA9IExVWzBdXG4gIGNvbnN0IFUgPSBMVVsxXVxuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgbGV0IHMgPSAwXG4gIGNvbnN0IGMgPSBbXVxuICBjb25zdCB4ID0gW11cblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgazsgKytqKSB7XG4gICAgICBzID0gcyArIEwuX192YWx1ZVtrXVtqXSAqIGNbal1cbiAgICB9XG4gICAgY1trXSA9IGJba10gLSBzXG4gICAgcyA9IDBcbiAgfVxuICBmb3IgKGxldCBhID0gbiAtIDE7IGEgPiAtMTsgLS1hKSB7XG4gICAgbGV0IHQgPSAwXG4gICAgZm9yIChsZXQgYiA9IGEgKyAxOyBiIDwgbjsgKytiKSB7XG4gICAgICB0ID0gdCArIFUuX192YWx1ZVthXVtiXSAqIHhbYl1cbiAgICB9XG4gICAgeFthXSA9IChjW2FdIC0gdCkgLyBVLl9fdmFsdWVbYV1bYV1cbiAgfVxuICByZXR1cm4geFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsyLCA0XV0pLmludmVyc2UoKVxuICogLy8gWyBbIDIsIC0wLjUgXSwgWyAtMSwgMC41IF0gXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEkgPSBBLmlkZW50aXR5KClcbiAgY29uc3QgSW52ID0gQS5jb25jYXQoSSkucnJlZigpXG5cbiAgY29uc3QgcmVzdWx0ID0gSW52Ll9fdmFsdWUucmVkdWNlKChyZXN1bHQsIHgsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhbGYgPSB4Lmxlbmd0aCAvIDJcbiAgICByZXN1bHQucHVzaCh4LnNsaWNlKGhhbGYsIHgubGVuZ3RoKSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtdKVxuICByZXR1cm4gTWF0cml4Lm9mKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHJhbmtcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5rID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBycmVmID0gdGhpcy5ycmVmKClcbiAgbGV0IHJlc3VsdCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBycmVmLmdldENvbHMoKTsgKytpKSB7XG4gICAgcmVzdWx0ICs9IHJyZWYuX192YWx1ZVtpXVtpXVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpbWVuc2lvblxuICogQGluc3RhbmNlXG4gKiBAc2VlIHJhbmtcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yYW5rKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZygpXG4gKiAvLyBbMSwgMSwgMV1cbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFnKClcbiAqIC8vIFswLCAwLCAwLCAwLCAwXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdCh4W2lkeF0pXG4gIH0pKFtdKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFnKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyBbMiwgNV1cbiAqXG4gKi9cbk1hdHJpeC5kaWFnID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFnKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdwcm9kdWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIGFjYyAqPSB4W2lkeF1cbiAgICByZXR1cm4gYWNjXG4gIH0pKDEpKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ3Byb2R1Y3RcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWdwcm9kdWN0KFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyAxMFxuICpcbiAqL1xuTWF0cml4LmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFncHJvZHVjdCgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdW1cbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5zdW0oKVxuICogLy8gOVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLnN1bSgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1bSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4ge1xuICAgIGFjYyArPSBmb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCkoMCkoeClcbiAgICByZXR1cm4gYWNjXG4gIH0pKDApKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gc3VtXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5zdW0oW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDlcbiAqXG4gKi9cbk1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnN1bSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBrcm9uZWNrZXJcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0ICh0aGlzIOKKlyBNKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoTSkge1xuICBjb25zdCBtID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Q29scygpXG4gIGNvbnN0IHAgPSBNLmdldFJvd3MoKVxuICBjb25zdCBxID0gTS5nZXRDb2xzKClcblxuICBjb25zdCBsZWZ0ID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IHJpZ2h0ID0gTS5fX3ZhbHVlXG5cbiAgY29uc3QgZnJhbWUgPSBnZW5lcmF0ZShtICogcCwgbiAqIHEpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBwOyBrKyspIHtcbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBxOyBsKyspIHtcbiAgICAgICAgICBmcmFtZVtwICogaSArIGtdW3EgKiBqICsgbF0gPSBsZWZ0W2ldW2pdICogcmlnaHRba11bbF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBNYXRyaXgub2YoZnJhbWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGtyb25lY2tlclxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIEEge01hdHJpeH0gVGhlIGxlZnQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcGFyYW0gQiB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgua3JvbmVja2VyID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5rcm9uZWNrZXIoQilcbn1cblxuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuLy8gR1BVIEZ1bmN0aW9uc1xuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzIsIDJdLCBbMiwgMl1dLCBHUFVKUylcbiAqIG0uZ3B1TWFwKGdwdU1hcHBlcilcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVNYXAgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGdwdW1hcCh0aGlzLmdwdWpzLCBmLCB0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdGhhdCBtYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5ncHVNYXAoR1BVSlMsIGdwdU1hcHBlciwgW1syLCAyXSwgWzIsIDJdXSlcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICovXG5NYXRyaXguZ3B1TWFwID0gY3VycnkoZnVuY3Rpb24gKGdwdSwgZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0sIGdwdSkuZ3B1TWFwKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVGb2xkXG4gKiBAZGVzY3JpcHRpb24gRm9sZHMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIEdQVVMuanMgZW5xYmxlZCByZWR1Y2UgZnVuY3Rpb24sIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ3B1Rm9sZCA9IGZ1bmN0aW9uIChmLCBvdXRwdXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihncHVmb2xkKHRoaXMuZ3B1anMsIGYsIG91dHB1dCwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gTWF0cml4I2dwdVByb2R1Y3RcbiAqIEBwYXJhbSBmXG4gKiBAcGFyYW0gb3V0cHV0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVQcm9kdWN0ID0gZnVuY3Rpb24gKGYsIG91dHB1dCwgTSkge1xuICAvLyAoZ3B1LCBmLCBvdXRwdXQsIGEsIGIsIGNvbnN0YW50cyA9IHt9XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1cHJvZHVjdCh0aGlzLmdwdWpzLCBmLCBvdXRwdXQsIHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF0cml4XG4iLCJpbXBvcnQgeyBjb25jYXQsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIChNLCBtLCBpZHgpIHtcbiAgcmV0dXJuIGNvbmNhdChtLCBNLl9fdmFsdWVbaWR4XSlcbn0pXG4iLCJpbXBvcnQgeyBmb2xkLCBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuaW1wb3J0IHJvdW5kIGZyb20gJy4vcm91bmQnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGRvdFxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEBwYXJhbSBhIHtBcnJheX1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKGRlY2ltYWxzLCBCLCBhKSA9PiBtYXAoKGl0ZW0sIGkpID0+IHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaikgPT4ge1xuICAgIGFjYyArPSByb3VuZCh4ICogQi5fX3ZhbHVlW2pdW2ldLCBkZWNpbWFscylcbiAgICByZXR1cm4gYWNjXG4gIH0sIDApKGEpXG59KShCLl9fdmFsdWVbMF0pKVxuIiwiaW1wb3J0IHsgY3VycnkgfSBmcm9tICdmdW4uanMnXG5leHBvcnQgZGVmYXVsdCBjdXJyeShtID0+IFtdKVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZVxuICogQGRlc2MgR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBhIG1hdHJpeCBhcnJheSwgdmFsdWVzIGFyZSBzZXQgdG8gdW5kZWZpbmVkXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHthbnlbXVtdfVxuICovXG5leHBvcnQgZGVmYXVsdCAocm93cywgY29scyA9IHVuZGVmaW5lZCwgdmFsdWUgPSAwKSA9PiB7XG4gIGNvbnN0IF9jb2xzID0gY29scyB8fCByb3dzXG4gIGNvbnN0IHkgPSBtYXAoeiA9PiB2YWx1ZSkobmV3IEFycmF5KF9jb2xzKSlcbiAgcmV0dXJuIG1hcCh6ID0+IHkpKG5ldyBBcnJheShyb3dzKSlcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdWZvbGQgKGdwdSwgZiwgb3V0cHV0LCBtYXRyaXgsIGNvbnN0YW50cyA9IHt9KSB7XG4gIHJldHVybiBncHVcbiAgICAuY3JlYXRlS2VybmVsKGYsIHsgY29uc3RhbnRzOiBPYmplY3QuYXNzaWduKHt9LCB7IG06IG1hdHJpeC5sZW5ndGgsIG46IG1hdHJpeFswXS5sZW5ndGggfSwgY29uc3RhbnRzKSB9KVxuICAgIC5zZXRPdXRwdXQob3V0cHV0KShtYXRyaXgpXG59XG4iLCIvLyBpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3B1bWFwIChncHUsIGYsIG1hdHJpeCkge1xuICByZXR1cm4gZ3B1LmNyZWF0ZUtlcm5lbChmKS5zZXRPdXRwdXQoW21hdHJpeC5sZW5ndGgsIG1hdHJpeFswXS5sZW5ndGhdKShtYXRyaXgpXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncHVwcm9kdWN0IChncHUsIGYsIG91dHB1dCwgYSwgYiwgY29uc3RhbnRzID0ge30pIHtcbiAgcmV0dXJuIGdwdVxuICAgIC5jcmVhdGVLZXJuZWwoZiwgeyBjb25zdGFudHM6IE9iamVjdC5hc3NpZ24oe30sIHsgbTogYi5sZW5ndGgsIG46IGFbMF0ubGVuZ3RoIH0sIGNvbnN0YW50cykgfSlcbiAgICAuc2V0T3V0cHV0KG91dHB1dCkoYSwgYilcbn1cbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIENyZWF0ZXMgYW4gaWRlbnRpeSBtYXRyaXggZnJvbSBhbiBlbXB0eSBhcnJheVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybiB7TWF0cml4fVxuICovXG5leHBvcnQgZGVmYXVsdCAobSwgaWR4KSA9PiBtYXAoKHJvd3MsIGpkeCkgPT4gKGlkeCA9PT0gamR4KSAqIDEpKG0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiByb3VuZFxuICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9XG4gKiBAcGFyYW0gZGVjaW1hbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdW5kICh2YWx1ZSwgZGVjaW1hbHMpIHtcbiAgcmV0dXJuIE51bWJlcihNYXRoLnJvdW5kKHZhbHVlICsgJ2UnICsgZGVjaW1hbHMpICsgJ2UtJyArIGRlY2ltYWxzKVxufVxuIiwiaW1wb3J0IHsgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBUcmFuc3Bvc2VzIGEgYXJyYXkgb2YgYXJyYXlzIHVzaW5nIHRoZSBNYXRyaXgubWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChwcmV2LCBuZXh0KSA9PiBtYXAoKGl0ZW0sIGkpID0+IChwcmV2W2ldIHx8IFtdKS5jb25jYXQobmV4dFtpXSkpKG5leHQpKVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/lib/@astuanax/funmatrix.min.js b/lib/@astuanax/funmatrix.min.js index 97b34be..e55e604 100644 --- a/lib/@astuanax/funmatrix.min.js +++ b/lib/@astuanax/funmatrix.min.js @@ -1,2 +1,2 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("@astuanax/funmatrix",[],n):"object"==typeof exports?exports["@astuanax/funmatrix"]=n():t["@astuanax/funmatrix"]=n()}("undefined"!=typeof self?self:this,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,e),u.l=!0,u.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var u in t)e.d(r,u,function(n){return t[n]}.bind(null,u));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=24)}([function(t,n,e){"use strict";function r(t){const n=t.length;return 0===n?t:e([]);function e(r){return function(){return function(r,u){const o=r.concat(u);return o.length{e.set(r,t(n,r,u))}),e}),a=Object(r.default)(function(t,n){let e=-1;const r=n.length;let u="";for(;++en.slice(r,r+t),e)}),c=Object(r.default)(function(t,n){return+t+ +n}),i=Object(r.default)(function(t,n,e){let r=0;return t(function(t){return n(t,r++)},e)}),f=Object(r.default)(function(t,n,e){const r=Array.prototype.slice.call(e),u=n<0?r.length+n:n;return e[u]?(r[u]=t(r[u]),r):r}),a=Object(r.default)(function(t,n,e){return Object(u.default)(e=>n(e)?t(e):e,Array.prototype.slice.call(e))}),l=Object(r.default)(function(t,n){let e=!0;for(let r in n)if(!t(n[r])){e=!1;break}return e}),s=Object(r.default)(function(t,n){for(let e=0;et(e)(n(e)):Object(j.a)((t,e)=>t.concat(Object(y.a)(Object(v.a)(e),n)),[],t)}),m=Object(r.default)(function(t,n){return Array.prototype.concat(t,n)});function w(t,n){return String(t)+String(n)}var M=e(2),x=Object(r.default)(function(t,n){return{String:w,Array:m}[Object(M.a)(t)](t,n)}),P=Object(r.default)(function(t,n){return x(n,[t])}),A=Object(r.default)(function(t,n){return t.apply(t,n)}),S=Object(v.a)(function(t){return Object(r.default)(function(n,e){return t(n,e)})}),C=Object(r.default)(function(t,n){return t.bind(n)}),k=e(9),N=Object(r.default)(function(t){const n=Object(v.a)(Object(r.default)(t));return Object(r.default)(function(){return Object(k.default)(g,Object(u.default)(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),R=Object(r.default)(function(t,n){return Object(O.a)("Function")(t)?function(){return t.apply(this,arguments)&&n.apply(this,arguments)}:N(p.a)(t,n)}),D=Object(r.default)(function(t){return t.apply(t,[].slice.call(arguments,1))}),F=e(4);var E=N(F.a);function z(){let t=Array.prototype.slice.call(arguments);return function(){let n=t[t.length-1],e=[n.apply(n,arguments)],r=t.length-2;for(;r>=0;--r){const n=t[r];e=[n.apply(n,e)]}return e[0]}}function T(t){return function(n){for(var e=0;ex(n,t(e)),Object(K.a)(n),n)});function tt(t){let n=1===(e=arguments).length?[e[0]]:Array.apply(null,e);var e;return n.shift(),t.replace(/{(\d+)}/g,(t,e)=>Object(F.a)(Object(O.a)("Undefined",n[e]))?n[e]:t)}var nt=Object(r.default)(function(t,n){return Object.prototype.hasOwnProperty.call(n,t)}),et=Object(r.default)(function(t,n){return t in n}),rt=e(10);function ut(t){return t}var ot=e(15),ct=e(21),it=e(16);function ft(t){return Object(B.a)(t)&&Object(U.default)(t,Object(K.a)(t))}var at=t=>J(new Date)(t)<0,lt=Object(O.a)("Map"),st=e(18),dt=Object(O.a)("null"),pt=e(13),bt=e(11),ht=Object(O.a)("Set"),vt=e(22),Ot=Object(O.a)("undefined");function jt(t){return Object(it.a)(t)&&isFinite(t.valueOf())}let yt=function(t){return this._value=t,this};yt.prototype.isJust=function(){return!0},yt.prototype.isNothing=function(){return!1};var _t=yt,gt=Object(r.default)(function(t){return t.keys()}),mt=Object(r.default)(function(t){switch(Object(M.a)(t)){case"Map":return gt(t);default:return Object(V.a)(t)}}),wt=Object(r.default)(function(t){const n=[];for(const e in t)n.push(e);return n}),Mt=Object(v.a)(function(t){return t&&t.length?t[t.length-1]:void 0}),xt=Object(r.default)(function(t,n){return n>t?n:t});let Pt=function(){};Pt.prototype.isJust=function(){return!1},Pt.prototype.isNothing=function(){return!0};var At=Pt;let St=function(t){this.__value=t};St.of=function(t){return t instanceof St?t:this instanceof St?(this.__value=t,this):new St(t)},St.prototype.getOrElse=function(t){return this.isNothing()?t:this.__value},St.prototype.map=function(t){return this.isNothing()?St.of(null):St.of(t(this.__value))},St.prototype.ap=function(t){return t.map(this.__value)},St.prototype.isNothing=function(){return null==this.__value},St.prototype.isJust=function(){return!this.isNothing()},St.prototype.Nothing=function(){return new At},St.prototype.Just=function(){return new _t(this._value)};var Ct=St,kt=Object(r.default)(function(t,n){return Array.from(new Set(t.concat(n)))});const Nt=Object(r.default)((t,n)=>{let e=Object.assign({},t);if(Object(rt.a)(t,n))return Object.assign({},t);for(let r in n){if(!Object.prototype.hasOwnProperty.call(n,r))continue;const u=n[r],o=t[r];Object(bt.a)(u)&&Object(bt.a)(o)?e[r]=Nt(u,o):Object(ot.a)(o)?e[r]=kt(o,u):e[r]=u}return e});var Rt=Nt,Dt=Object(r.default)(function(t,n){return+t*+n}),Ft=Object(r.default)((t,n)=>{let e={};return Object.keys(t).filter(t=>-1===n.indexOf(t)).forEach(n=>{e[n]=t[n]}),e}),Et=e(20),zt=Object(r.default)(function(t,n){let e,r=n,u=0;for(;ut/864e5,Ut=t=>t/36e5,Bt=t=>t/6e4,Wt=t=>t/1e3;function Ht(t){return!1!==t&&Object(B.a)(t)}var Vt=Object(v.a)(function(t){const n=Object(V.a)(t),e=n.length,r=[];let u=0;for(;u{for(let e in t)if(Object(i.a)(O(t[e],n[e])))return!1;for(let e in n)if(Object(i.a)(Object(u.a)(t[e]))&&Object(u.a)(n[e]))return!1;return!0}),O=n.default=Object(r.default)(function(t,n){return!!Object(o.a)(t,n)||Object(c.a)(t)===Object(c.a)(n)&&(!Object(f.a)(Object(i.a)(Object(u.a)(t)),Object(i.a)(Object(u.a)(n)))&&(t.constructor===n.constructor&&(Object(p.a)(t)||Object(s.a)(t)||Object(d.a)(t)||Object(b.a)(t)?Object(o.a)(t.valueOf(),n.valueOf()):Object(l.a)(t)?h(t,n):!!Object(a.a)(t)&&v(t,n))))})},function(t,n,e){"use strict";e.d(n,"a",function(){return o});var r=e(13),u=e(14);function o(t){return Object(u.a)(Object(r.a)(t),isNaN(t))}},function(t,n,e){"use strict";var r=e(0);n.a=Object(r.default)(function(t,n){let e=-1;const r=n.length,u=new Array(r);for(;++e1&&void 0!==arguments[1]?arguments[1]:null;return t instanceof O?t:this instanceof O?(this.__value=t,this.gpujs=n,this):new O(t,n)},O.prototype.type="Matrix",O.prototype.gpu={},O.prototype.precision=4,O.prototype.setPrecision=function(t){this.precision=t},O.prototype.isSymmetric=function(){var t=this.__value,n=O.transpose(this).__value;return(0,c.default)(t,n)},O.prototype.isSquare=function(){return(0,c.default)(this.getCols(),this.getRows())},O.prototype.isOrthogonal=function(){var t=this.dot(this.transpose()),n=this.identity();return(0,c.default)(t,n)},O.prototype.getCols=function(){return this.__value[0].length},O.prototype.equals=function(t){return(0,c.default)(this.__value,t.__value||t)},O.prototype.getRows=function(){return this.__value.length},O.prototype.getShape=function(){return[this.getRows(),this.getCols()]},O.prototype.map=function(t){return O.of((0,u.default)(t)(this.__value))},O.map=(0,r.default)(function(t,n){return O.of(n).map(t)}),O.prototype.fold=function(t){return O.of((0,o.default)(t,[])(this.__value))},O.fold=(0,r.default)(function(t,n){return O.of(n).fold(t)}),O.prototype.ap=function(t){return O.of(t).map(this.__value)},O.ap=(0,r.default)(function(t,n){return O.of(t).ap(n)}),O.prototype.concat=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.default;return O.of(this).map(n(t))},O.concat=(0,r.default)(function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.default;return O.of(t).map(e(n))}),O.prototype.empty=function(){return O.of(this).map(f.default)},O.empty=(0,r.default)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=(0,d.default)(t,n);return O.of(e).map(f.default)}),O.prototype.identity=function(){return O.of(l.default).ap(this)},O.identity=function(t,n){var e=(0,d.default)(t,n);return O.of(l.default).ap(e)},O.prototype.combine=function(t){return O.of(this).concat(O.of(t),i.default)},O.combine=function(t,n){return O.of(t).concat(O.of(n),i.default)},O.prototype.dot=function(t){return O.of(this).concat(O.of(t),(0,a.default)(this.precision))},O.dot=function(t,n){return O.of(t).dot(O.of(n))},O.prototype.fill=function(t){return O.of(this).map((0,u.default)(function(n){return t(n)}))},O.prototype.zeros=function(){return O.of(this).fill(function(t){return 0})},O.zeros=function(t,n){var e=(0,d.default)(t,n);return O.of(e).fill(function(t){return 0})},O.prototype.ones=function(){return O.of(this).fill(function(t){return 1})},O.ones=function(t,n){var e=(0,d.default)(t,n);return O.of(e).fill(function(t){return 1})},O.prototype.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1};return O.of(this).fill(t)},O.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1},n=arguments[1],e=arguments[2],r=(0,d.default)(n,e);return O.of(r).fill(t)},O.prototype.toArray=function(){return this.__value.map(function(t){return t.map(function(t){return t})})},O.prototype.clone=function(){return O.fromArray(this.__value)},O.fromArray=function(t){return O.of((0,u.default)(function(t){return(0,u.default)(function(t){return t})(t)})(t))},O.prototype.transpose=function(){return O.of((0,o.default)(s.default,[],this.__value))},O.transpose=function(t){return O.of(t).transpose()},O.prototype.add=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot add");return this.map(function(n,e){return(0,u.default)(function(n,r){return n+t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n+t}))},O.prototype.subtract=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot subtract");return this.map(function(n,e){return(0,u.default)(function(n,r){return n-t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n-t}))},O.prototype.multiply=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw console.log("Use static method 'dot' to do matrix multiplication"),new Error("Matrices do not match, cannot create hadamard product");return this.map(function(n,e){return(0,u.default)(function(n,r){return n*t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n*t}))},O.prototype.additiveinverse=function(){return O.of(this).multiply(-1)},O.prototype.hadamard=function(t){return O.of(this).multiply(t)},O.prototype.lu=function(){for(var t=this.getRows(),n=this.clone(),e=this.zeros(),r=this.zeros(),u=0;u-1;--l){for(var s=0,d=l+1;d1&&void 0!==arguments[1]?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=n||t,o=(0,r.map)(function(t){return e})(new Array(u));return(0,r.map)(function(t){return o})(new Array(t))},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e){return t.createKernel(n).setOutput([e.length,e[0].length])(e)},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e,r){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};return t.createKernel(n,{constants:Object.assign({},{m:r.length,n:r[0].length},u)}).setOutput(e)(r)},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e,r,u){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};return t.createKernel(n,{constants:Object.assign({},{n:r[0].length},o)}).setOutput(e)(r,u)},t.exports=n.default}])}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL19wcml2YXRlL2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbm90LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvYWRkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWRqdXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3RXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbGwuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbFBhc3MuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbnlQYXNzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXBwbHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbGlmdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ib3RoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jYWxsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wbGVtZW50LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvZGlmZkRhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9kaXZpZGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vRi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmlyc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZsYXRNYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9mb3JtYXRTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L3RvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL2lzRnV0dXJlRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udWxsL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zZXQvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc1ZhbGlkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tb25hZHMvSnVzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2xhc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL211bHRpcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ULmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvRGF5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvSG91ci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b01pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9TZWNvbmRzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pc05hbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9kb3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3JvdW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9nZW5lcmF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZ3B1bWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVmb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVwcm9kdWN0LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJ0aGlzIiwiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImN1cnJ5IiwiZnVuIiwiYXJnc2xlbiIsImxlbmd0aCIsImNyZWF0ZVJlY3Vyc2VyIiwiYWNjIiwiYXJncyIsIl9hY2MiLCJjb25jYXQiLCJhcHBseSIsInJlY3Vyc2UiLCJBcnJheSIsInNsaWNlIiwiYXJndW1lbnRzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jdXJyeV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fIiwiX3R5cGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyIsIkN0b3IiLCJ2YWwiLCJfcHJpdmF0ZV9jdXJyeTFfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyIsIngiLCJ0b1N0cmluZyIsImN1cnJ5MSIsImZuIiwiYSIsImV4aXN0cyIsImVtcHR5IiwiY29uc3RydWN0b3IiLCJrZXlzIiwib2JqZWN0X21hcCIsImNiIiwiayIsIm1hcF9tYXAiLCJmb3JFYWNoIiwidiIsIm1hcCIsInNldCIsInN0cmluZ19tYXAiLCJjaGFyQXQiLCJpdGVyYXRvcl9tYXAiLCJjYWxsYmFjayIsIml0ZXJhdG9yIiwibmV4dFZhbHVlIiwibmV4dCIsImRvbmUiLCJwdXNoIiwiaXNGdW5jdGlvbiIsImlzIiwidHlwZSIsImFycmF5X21hcCIsIm9iamVjdF9mb2xkIiwiaW5pdCIsImFycmF5X2ZvbGQiLCJfbnVtYmVyX2lzTmFuX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18iLCJ5IiwiX2lzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18iLCJzcmNfYXBlcnR1cmUiLCJyZXMiLCJzcmNfbWFwIiwiaXRlbSIsImlkeCIsImFkZCIsImIiLCJhZGRJbmRleCIsImYiLCJnIiwiYWRqdXN0Iiwic3JjX2FkanVzdFdpdGgiLCJwcmVkIiwic3JjX2FsbCIsImFsbFBhc3MiLCJjYnMiLCJhbHdheXMiLCJhbnkiLCJhbnlQYXNzIiwic3JjX2FwIiwiZm5zIiwidmFscyIsImFwIiwiZm9sZCIsImFycmF5X2NvbmNhdCIsImNvbmNhdF9jb25jYXQiLCJTdHJpbmciLCJzcmNfY29uY2F0Iiwic3JjX2FwcGVuZCIsImVsIiwibGlzdCIsInNyY19iaW5hcnkiLCJjb250ZXh0Iiwic3JjX2xpZnQiLCJsaWZ0ZWQiLCJzcmNfZm9sZCIsImJvb2xlYW5fYm90aCIsImZuMSIsImZuMiIsImFuZCIsInNyY19jb21wbGVtZW50Iiwibm90IiwiY29tcG9zZSIsInJlc3VsdCIsImNvbmQiLCJjb25kcyIsImRlZmF1bHRUbyIsImRpZmZEYXRlIiwic3RhcnQiLCJlbmQiLCJEYXRlIiwiZ2V0VGltZSIsImRpdmlkZSIsIkYiLCJhcnJheV9maWx0ZXIiLCJvYmplY3RfZmlsdGVyIiwibWFwX2ZpbHRlciIsIk1hcCIsIml0IiwiZW50cmllcyIsInNyY19maWx0ZXIiLCJmaW5kSW5kZXgiLCJmaXJzdCIsInVuZGVmaW5lZCIsImZsYXRNYXBfaXNGdW5jdGlvbiIsInNyY19mbGF0TWFwIiwiZmxhdE1hcCIsImZvcm1hdFN0cmluZyIsInN0ciIsInNoaWZ0IiwicmVwbGFjZSIsIm1hdGNoIiwiaGFzIiwicHJvcCIsIm9iaiIsImhhc0luIiwiaWRlbnRpdHkiLCJpc0VtcHR5IiwiZXF1YWxzIiwiaXNGdXR1cmVEYXRlIiwibWFwX2lzIiwibnVsbF9pcyIsInNldF9pcyIsInVuZGVmaW5lZF9pcyIsImlzVmFsaWQiLCJkYXRlX2lzIiwiaXNGaW5pdGUiLCJ2YWx1ZU9mIiwiSnVzdCIsIl92YWx1ZSIsImlzSnVzdCIsImlzTm90aGluZyIsIm1vbmFkc19KdXN0IiwibWFwX2tleXMiLCJzcmNfa2V5cyIsImtleXNJbiIsImxhc3QiLCJtYXgiLCJOb3RoaW5nIiwibW9uYWRzX05vdGhpbmciLCJNYXliZSIsIl9fdmFsdWUiLCJvZiIsImdldE9yRWxzZSIsIm1vbmFkc19NYXliZSIsInVuaW9uIiwiYUwiLCJhUiIsImZyb20iLCJTZXQiLCJtZXJnZSIsIm9iakwiLCJvYmpSIiwiYXNzaWduIiwiaWRlbnRpY2FsIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIm9iamVjdF9pcyIsImFycmF5X2lzIiwib2JqZWN0X21lcmdlIiwibXVsdGlwbHkiLCJvbWl0IiwibmFtZXMiLCJmaWx0ZXIiLCJpbmRleE9mIiwicGF0aCIsIk51bWJlciIsImlzSW50ZWdlciIsInBpY2siLCJwcm9wcyIsIm51bWJlcl9zdW0iLCJUIiwidG9EYXkiLCJ0b0hvdXIiLCJ0b01pbnV0ZXMiLCJ0b1NlY29uZHMiLCJ0cnV0aHkiLCJvYmplY3RfdmFsdWVzIiwiemlwV2l0aCIsImFyciIsImxlbiIsIk1hdGgiLCJtaW4iLCJzcmNfemlwIiwiYm9vbGVhbl9pcyIsImlzTmFuIiwibnVtYmVyX2lzIiwic3RyaW5nX2lzIiwib3IiLCJhcnJheV9lcXVhbHMiLCJzcmNfZXF1YWxzIiwib2JqZWN0X2VxdWFscyIsImtleVgiLCJrZXlZIiwiX2FuZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fIiwiaXNOYU4iLCJfY3VycnkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX21hcCIsIl9mb2xkIiwiX2VxdWFscyIsIl9jb25jYXQiLCJfZW1wdHkiLCJfZG90IiwiX2lkZW50aXR5IiwiX3RyYW5zcG9zZSIsIl9nZW5lcmF0ZSIsIl9ncHVtYXAiLCJfZ3B1Zm9sZCIsIl9ncHVwcm9kdWN0IiwiTWF0cml4IiwiR1BVSlMiLCJncHVqcyIsImdwdSIsInByZWNpc2lvbiIsInNldFByZWNpc2lvbiIsImlzU3ltbWV0cmljIiwidHJhbnNwb3NlIiwiZGVmYXVsdCIsImlzU3F1YXJlIiwiZ2V0Q29scyIsImdldFJvd3MiLCJpc09ydGhvZ29uYWwiLCJBeEF0IiwiZG90IiwiSSIsIk0iLCJnZXRTaGFwZSIsIkEiLCJCIiwicm93cyIsImNvbHMiLCJjb21iaW5lIiwiZmlsbCIsInplcm9zIiwib25lcyIsInJhbmRvbSIsImUiLCJ0b0FycmF5Iiwicm93IiwiY29sIiwiY2xvbmUiLCJmcm9tQXJyYXkiLCJFcnJvciIsImpkeCIsInN1YnRyYWN0IiwiY29uc29sZSIsImxvZyIsImFkZGl0aXZlaW52ZXJzZSIsImhhZGFtYXJkIiwibHUiLCJMIiwiVSIsImFicyIsImoiLCJycmVmIiwibGVhZCIsInJlc3VsdE1hdHJpeCIsInRtcCIsInNvbHZlIiwiTFUiLCJpbnZlcnNlIiwicmVkdWNlIiwiaGFsZiIsInJhbmsiLCJkaW1lbnNpb24iLCJkaWFnIiwiZGlhZ3Byb2R1Y3QiLCJzdW0iLCJwcmV2Iiwia3JvbmVja2VyIiwicSIsImxlZnQiLCJyaWdodCIsImZyYW1lIiwiZ3B1TWFwIiwiZ3B1Rm9sZCIsIm91dHB1dCIsImdwdVByb2R1Y3QiLCJfZnVuIiwiX3JvdW5kIiwiZGVjaW1hbHMiLCJyb3VuZCIsIl9jb2xzIiwieiIsIm1hdHJpeCIsImNyZWF0ZUtlcm5lbCIsInNldE91dHB1dCIsImNvbnN0YW50cyJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBQUEsRUFBQUMsR0FDQSxpQkFBQUMsU0FBQSxpQkFBQUMsT0FDQUEsT0FBQUQsUUFBQUQsSUFDQSxtQkFBQUcsZUFBQUMsSUFDQUQsT0FBQSx5QkFBQUgsR0FDQSxpQkFBQUMsUUFDQUEsUUFBQSx1QkFBQUQsSUFFQUQsRUFBQSx1QkFBQUMsSUFSQSxDQVNDLG9CQUFBSyxVQUFBQyxLQUFBLFdBQ0QsbUJDVEEsSUFBQUMsRUFBQSxHQUdBLFNBQUFDLEVBQUFDLEdBR0EsR0FBQUYsRUFBQUUsR0FDQSxPQUFBRixFQUFB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b1QsRUFBTyxHQUFHMVMsUUFBVTZTLEtBQzFGRCxVQUFVVixFQUZOaEUsQ0FFY3dFLGlIQ0hSLFNBQWlCeEUsRUFBS3JLLEVBQUdxTyxFQUFRN1EsRUFBR3NDLEdBQW1CLElBQWhCa1AsRUFBZ0JuUyxVQUFBVixPQUFBLFFBQUFvSCxJQUFBMUcsVUFBQSxHQUFBQSxVQUFBLEdBQUosR0FDaEUsT0FBT3dOLEVBQ0p5RSxhQUFhOU8sRUFBRyxDQUFFZ1AsVUFBV3RVLE9BQU8rTCxPQUFPLEdBQUksQ0FBRWhMLEVBQUcrQixFQUFFLEdBQUdyQixRQUFVNlMsS0FDbkVELFVBQVVWLEVBRk5oRSxDQUVjN00sRUFBR3NDIiwiZmlsZSI6IkBhc3R1YW5heC9mdW5tYXRyaXgubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJAYXN0dWFuYXgvZnVubWF0cml4XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMjQpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogQGZ1bmN0aW9uIGN1cnJ5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5IChmdW4pIHtcbiAgY29uc3QgYXJnc2xlbiA9IGZ1bi5sZW5ndGhcblxuICBpZiAoYXJnc2xlbiA9PT0gMCkge1xuICAgIHJldHVybiBmdW5cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVjdXJzZXIoW10pXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoYWNjLCBhcmdzKSB7XG4gICAgY29uc3QgX2FjYyA9IGFjYy5jb25jYXQoYXJncylcbiAgICByZXR1cm4gX2FjYy5sZW5ndGggPCBhcmdzbGVuXG4gICAgICA/IGNyZWF0ZVJlY3Vyc2VyKF9hY2MpXG4gICAgICA6IGZ1bi5hcHBseSh0aGlzLCBfYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVjdXJzZXIgKGFjYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVjdXJzZShhY2MsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIFZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudFxuICpcbiAqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaXMgKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdHlwZSh2YWwpID09PSBDdG9yXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gd2l0aCBhcml0eSAxXG4gKiBAZnVuY3Rpb24gY3VycnkxXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIHYxLjAuMlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeTEgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkIChhKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgID8gdGhpc1xuICAgICAgOiBmbihhKVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBub3RcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG5vdCAoeCkge1xuICByZXR1cm4gIXhcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBleGlzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhpc3RzICh4KSB7XG4gIHJldHVybiAhKHggPT0gbnVsbClcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbXB0eSAoeCkge1xuICByZXR1cm4gbmV3IHguY29uc3RydWN0b3IoKVxufTtcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QoYSkpXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gb2JqZWN0IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHJldHVybiB7T2JqZWN0fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IGsgPSBrZXlzKGEpXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJba1tpXV0gPSBjYihhW2tbaV1dLCBrW2ldLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBNYXAgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7TWFwfSBhXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIGEuZm9yRWFjaCgodiwgaywgbWFwKSA9PiB7XG4gICAgci5zZXQoaywgY2IodiwgaywgbWFwKSlcbiAgfSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIHN0cmluZyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSAnJ1xuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgKz0gY2IoYS5jaGFyQXQoaSksIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJdGVyIChpdGVyKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSlcbn1cbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIGl0ZXJhYmxlIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggbWFwcyBvdmVyIGFuIGl0ZXJhYmxlLlxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gYiAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL2FycmF5L21hcCdcbmltcG9ydCBvYmplY3RNYXAgZnJvbSAnLi9vYmplY3QvbWFwJ1xuaW1wb3J0IG1hcE1hcCBmcm9tICcuL21hcC9tYXAnXG5pbXBvcnQgc3RyaW5nTWFwIGZyb20gJy4vc3RyaW5nL21hcCdcbmltcG9ydCBpdGVyYXRvck1hcCBmcm9tICcuL2l0ZXJhdG9yL21hcCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3IvaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdE1hcChjYiwgYSlcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcE1hcChjYiwgYSlcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlNYXAoY2IsIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0l0ZXJhdG9yKGEpXG4gICAgICAgID8gaXRlcmF0b3JNYXAoY2IsIGEpXG4gICAgICAgIDogYXJyYXlNYXAoY2IsIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gYXBlcnR1cmVcbiAqIEBwYXJhbSBuXG4gKiBAcGFyYW0gYXJyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBlcnR1cmUgKG4sIGEpIHtcbiAgaWYgKGEubGVuZ3RoIDwgbikge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IHJlcyA9IEFycmF5KGEubGVuZ3RoIC0gbiArIDEpXG4gIHJldHVybiBtYXAoKGl0ZW0sIGlkeCkgPT4gYS5zbGljZShpZHgsIGlkeCArIG4pLCByZXMpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uIGFkZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgcmV0dXJuICthICsgK2Jcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhZGRJbmRleFxuICogQHN1bW1hcnkgQWRkcyBhIHNwZWNpZmllZCBpbmRleCB0byBpdGVyYXRlIGEgY29sbGVjdGlvblxuICogQGRlc2NyaXB0aW9uIFRoZSBhZGRJbmRleCBmdW5jdGlvbiBpcyBub3RuZWNlc3NhcnkgZm9yIHRoZSBtYXAgZnVuY3Rpb25zIGluIHRoZSBmdW4uanMgbGlicmFyeSBhcyB0aGV5IGJlaGF2ZSB0aGUgc2EsZSBhcyB0aGUgbmF0aXZlIGphdmFzY3JpcHQgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIEZ1bmN0aW9uIHRvIHdoaWNoIHRvIGFkZCB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7QXJyYXl9IGEgVGhlIGFycmF5IG9uIHdoaWNoIHRvIHdvcmtcbiAqIEBzaW5jZSAxLjAuMlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkSW5kZXggKGYsIGcsIGEpIHtcbiAgbGV0IGkgPSAwXG4gIHJldHVybiBmKFxuICAgIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gZyh2LCBpKyspXG4gICAgfSxcbiAgICBhXG4gIClcbn0pXG4iLCIvKipcbiAqIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGFkanVzdFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+IG51bSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRvIG1vZGlmeSB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gKiBAcGFyYW0ge051bWJlcn0gaSAtIFRoZSBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkgdGhlIGFycmF5LCBhY2NlcHRzIHBvc3RpdGl2ZSBhbmQgbmVnYXRpdmUgaW5kZXhlc1xuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdIC0gQXJyYXkgd2l0aCBkYXRhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0IChmbiwgaSwgYSkge1xuICBjb25zdCByID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSlcbiAgY29uc3QgaWR4ID0gaSA8IDAgPyByLmxlbmd0aCArIGkgOiBpXG4gIGlmICghYVtpZHhdKSByZXR1cm4gclxuICByW2lkeF0gPSBmbihyW2lkeF0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RXaXRoXG4gKiBAZGVzY3JpcHRpb24gTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYSkgLT4gKChhIC0+IFthXSkgLT4gW2FdIC0+IG51bSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIFRoZSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRoZSBpbmRleGVzIGlmIGZvdW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBbYV1cbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0V2l0aCAoZm4sIHByZWQsIGEpIHtcbiAgY29uc3QgX2ZuID0geCA9PiB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJldHVybiBmbih4KVxuICAgIH1cbiAgICByZXR1cm4geFxuICB9XG4gIHJldHVybiBtYXAoX2ZuLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbGxcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbCAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IHRydWVcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKCFjYihhW2ldKSkge1xuICAgICAgcmVzID0gZmFsc2VcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICpcbiAqIEBmdW5jdGlvbiBhbGxQYXNzXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBwYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbFBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghY2JzW2ldKGEpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gYWx3YXlzXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbHdheXMgKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHggfVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uIG9mIHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGFueVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoVE9ETylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueSAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IGZhbHNlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmIChjYihhW2ldKSkge1xuICAgICAgcmVzID0gdHJ1ZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIG9uZSBwYXNzZXNcbiAqXG4gKiBAZnVuY3Rpb24gYW55UGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uKSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBwcmVkaWNhdGVzIEFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY29tYmluZWQgcHJlZGljYXRlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW55UGFzcyAoY2JzLCBhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNic1tpXShhKSkgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKlxuICogQGZ1bmN0aW9uIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJldHVybnMgYSBjb21iaW5lZCByZXN1bHQgYXJyYXlcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAcGFyYW0geyhGdW5jdGlvbltdfEZ1bmN0aW9ufEFwcGxpY2F0aXZlKX0gZm5zIC0gQW4gYXJyYXkgb2YgZnVuY3Rpb25zIG9yIGEgZnVuY3Rpb24gb3IgYW4gYXBwbGljYXRpdmVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHMgLSBBbiBhcnJheSBvZiB2YWx1ZXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG1hcCBmcm9tICcuL2FycmF5L21hcCdcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwIChmbnMsIHZhbHMpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm5zLmFwKSkge1xuICAgIHJldHVybiBmbnMuYXAodmFscylcbiAgfVxuICBpZiAoaXNGdW5jdGlvbihmbnMpKSB7XG4gICAgcmV0dXJuIHggPT4gZm5zKHgpKHZhbHMoeCkpXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgZikgPT4gYWNjLmNvbmNhdChtYXAoY3VycnkxKGYpLCB2YWxzKSksIFtdLCBmbnMpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGFycmF5Q29uY2F0XG4gKiBAcGFyYW0gYTFcbiAqIEBwYXJhbSBhMlxuICogQHJldHVybnMge1RbXX1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoYSwgYilcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gc3RyaW5nQ29uY2F0XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIHJldHVybiBTdHJpbmcoYSkgKyBTdHJpbmcoYilcbn1cbiIsIi8qKlxuICogQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqIEBzaW5jZSB2MS4wLjRcbiAqIEBwYXJhbSB7YX0gYSAtIExlZnQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHBhcmFtIHthfSBiIC0gcmlnaHQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHJldHVybiB7YX0gQ29uY2F0ZW5hdGVkIGl0ZW1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlDb25jYXQgZnJvbSAnLi9hcnJheS9jb25jYXQnXG5pbXBvcnQgc3RyaW5nQ29uY2F0IGZyb20gJy4vc3RyaW5nL2NvbmNhdCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ1N0cmluZyc6IHN0cmluZ0NvbmNhdCxcbiAgICAnQXJyYXknOiBhcnJheUNvbmNhdFxuICB9XG4gIHJldHVybiB0eXBlTWFwW3R5cGUoYSldKGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwZW5kXG4gKiBAZGVzY3JpcHRpb24gQXBwZW5kIGFuIGVsbWVudCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7Kn0gZWwgLSBFbGVtZW50IHRvIGFkZCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgLSBMaXN0IHRvIHdoaWNoIHRvIGFkZCB0aGUgZWxlbWVudFxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGwgPSBbMCwgMV1cbiAqIGFwcGVuZCgnYScsIGwpIC8vIHJldXRuciBbMCwgMSwgJ2EnXVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwZW5kIChlbCwgbGlzdCkge1xuICByZXR1cm4gY29uY2F0KGxpc3QsIFsgZWwgXSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQGRlc2NyaXB0aW9uIFRoZSBhcHBseSgpIG1ldGhvZCBjYWxscyBhIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBhbiBhcnJheSwgYW5kIHRoZSBmdW5jdGlvbiBhcyBjb250ZXh0LlxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBhcHBseShmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykubWFwKHggPT4geCAqIDIpXG4gKiAgIH0pXG4gKiBhKFsxLCAyLCAzXSlcbiAqIC8vIFsyLCA0LCA2XVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwbHkgKGZuLCBhcmdzKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgYXJncylcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBiaW5hcnlcbiAqIEBwYXJhbSBjYlxuICogQHJldHVybnMge2Z1bmN0aW9uKCo9LCAqPSk6ICp9XG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGJpbmFyeSAoY2IpIHtcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGNiKGEsIGIpXG4gIH0pXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbi8qKlxuICogQGZ1bmN0aW9uIGJpbmRcbiAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0XG4gKiBAcGFyYW0ge2Z1bmN0aW9uIH1mblxuICogQHBhcmFtIHsqfSBjb250ZXh0XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYmluZCAoZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY29udGV4dClcbn0pXG4iLCIvKipcbiAqIFwibGlmdHNcIiBhIGZ1bmN0aW9uIG9mIGFyaXR5ID4gMSBzbyB0aGF0IGl0IG1heSBcIm1hcCBvdmVyXCIgYSBsaXN0LCBGdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+IChbKl0uLi4gLT4gWypdKVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGFwIGZyb20gJy4vYXAnXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBsaWZ0IChmbikge1xuICBjb25zdCBsaWZ0ZWQgPSBjdXJyeTEoY3VycnkoZm4pKVxuICByZXR1cm4gY3VycnkoZnVuY3Rpb24gX2xpZnQgKCkge1xuICAgIHJldHVybiBmb2xkKGFwLCBtYXAobGlmdGVkLCBhcmd1bWVudHNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICB9KVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYm90aCBwcmVkaWNhdGVzIHJldHVybiB0cnVlXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjEgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMiBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBsaWZ0IGZyb20gJy4uL2xpZnQnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYm90aCAoZm4xLCBmbjIpIHtcbiAgcmV0dXJuIGlzKCdGdW5jdGlvbicpKGZuMSlcbiAgICA/IGZ1bmN0aW9uIF9ib3RoICgpIHsgcmV0dXJuIGZuMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmIGZuMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICA6IGxpZnQoYW5kKShmbjEsIGZuMilcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gZm5cbiAqIEByZXR1cm5zIHsqfVxuICovXG4vLyBpbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNhbGwgKGZuKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBsZW1lbnRcbiAqIEBkZXNjcmlwdGlvbiBMaWZ0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgY29tcGxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBub3RcbiAqIEBzZWUgbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBpc05vdEVtcHR5ID0gY29tcGxlbWVudChpc0VtcHR5KVxuICogaXNOb3RFbXB0eShbXSkgLy8gZmFsc2VcbiAqIGlzTm90RW1wdHkoeydhJyA6IDF9KSAvLyB0cnVlXG4gKlxuICogY29tcGxlbWVudChNYXliZS5vZihmYWxzZSkpIC8vIHRydWVcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YodHJ1ZSkpIC8vIGZhbHNlXG4gKi9cbmltcG9ydCBsaWZ0IGZyb20gJy4vbGlmdCdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5cbmNvbnN0IGNvbXBsZW1lbnQgPSBsaWZ0KG5vdClcbmV4cG9ydCBkZWZhdWx0IGNvbXBsZW1lbnRcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBvc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigpOiAqfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlICgpIHtcbiAgbGV0IGZucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcblxuICByZXR1cm4gZnVuY3Rpb24gX2NvbXBvc2UgKCkge1xuICAgIGxldCBpbml0ID0gZm5zW2Zucy5sZW5ndGggLSAxXVxuICAgIGxldCByZXN1bHQgPSBbaW5pdC5hcHBseShpbml0LCBhcmd1bWVudHMpXVxuICAgIGxldCBpID0gZm5zLmxlbmd0aCAtIDJcblxuICAgIGZvciAoaTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IGZuID0gZm5zW2ldXG5cbiAgICAgIHJlc3VsdCA9IFtmbi5hcHBseShmbiwgcmVzdWx0KV1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXVxuICB9XG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29uZFxuICogQHBhcmFtIGNvbmRzXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmQgKGNvbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29uZHNbaV1bMF0odmFsdWUpKSByZXR1cm4gY29uZHNbaV1bMV0odmFsdWUpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBkZWZhdWx0VG9cbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGVmYXVsdFRvIChkLCB2KSB7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB2ID09IG51bGwgfHwgdiAhPT0gdiA/IGQgOiB2XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZGlmZkRhdGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBkYXRlcyBpbiBtaWxsaXNlY29uZFxuICogQHBhcmFtIHtEYXRlfSBzdGFydCAtIFN0YXJ0IGRhdGVcbiAqIEBwYXJhbSB7RGF0ZX0gZW5kIC0gRW5kIGRhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gUkV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kc1xuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpZmZEYXRlIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiAobmV3IERhdGUoc3RhcnQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGVuZCkuZ2V0VGltZSgpKVxufSlcbiIsIi8qKlxuICpcbiAqXG4gKiBAZnVuY3Rpb24gZGl2aWRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGl2aXNpb24gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGl2aWRlIChhLCBiKSB7XG4gIHJldHVybiArYSAvICtiXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIEZcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyhmYWxzZSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFycmF5RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcnJheUZpbHRlciAoZm4sIGEpIHtcbiAgdmFyIHIgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZm4oYVtpXSkpIHIucHVzaChhW2ldKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb2JqZWN0RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvYmplY3RGaWx0ZXIgKGZuLCBvKSB7XG4gIGxldCByID0ge31cbiAgY29uc3QgayA9IGtleXMobylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKG9ba1tpXV0pKSByW2tbaV1dID0gb1trW2ldXVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwRmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXBGaWx0ZXIgKGZuLCBtKSB7XG4gIGxldCByID0gbmV3IE1hcCgpXG5cbiAgbGV0IGl0ID0gbS5lbnRyaWVzKClcbiAgbGV0IHJlc3VsdCA9IGl0Lm5leHQoKVxuXG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBrID0gcmVzdWx0LnZhbHVlWzBdXG4gICAgY29uc3QgdiA9IHJlc3VsdC52YWx1ZVsxXVxuICAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgICByZXN1bHQgPSBpdC5uZXh0KClcbiAgfVxuXG4gIC8vIExpbWl0ZWQgYnJvd3NlciBzdXBwb3J0XG4gIC8vIG0uZm9yRWFjaCgodiwgaykgPT4ge1xuICAvLyAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgLy8gfSlcblxuICAvLyBiYWJlbCB0cmFuc3BpbGUgaXNzdWVzXG4gIC8vIGZvciAoY29uc3QgW2ssIHZdIG9mIG0uZW50cmllcygpKSB7XG4gIC8vXG4gIC8vIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaWx0ZXJcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdWNudGlvbiB0aGF0IGZpbHRlcnMgT2JqZWN0cywgQXJyYXlzIGFuZCBNYXBzXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL2FycmF5L2ZpbHRlcidcbmltcG9ydCBvYmplY3RGaWx0ZXIgZnJvbSAnLi9vYmplY3QvZmlsdGVyJ1xuaW1wb3J0IG1hcEZpbHRlciBmcm9tICcuL21hcC9maWx0ZXInXG4vLyBUT0RPXG4vLyBpbXBvcnQgc2V0RmlsdGVyIGZyb20gJy4uL3NldC9maWx0ZXInXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbHRlciAoZm4sIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgLy8gc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpIHtcbiAgICAvLyBjYXNlICdGdW5jdGlvbic6XG4gICAgLy8gICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgLy8gICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0RmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1N0cmluZyc6XG4gICAgLy8gICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwRmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1NldCc6XG4gICAgLy8gICByZXR1cm4gc2V0RmlsdGVyKGZuLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIoZm4sIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRJbmRleFxuICogQGRlc2NyaXB0aW9uIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGJvb2xlYW4pIC0+IFthXSAtPiBudW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gQW4gYXJyYXkgbGlrZSBvYmplY3RcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbmRJbmRleCAoZm4sIGEpIHtcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICBpZiAoZm4oYVtpXSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiAtMVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpcnN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYXJyID0gWzEsIDIsIDRdXG4gKiBmaXJzdChbMSwgMiwgNF0pIC8vIHJldHVybnMgMVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gZmlyc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhWzBdIDogdW5kZWZpbmVkXG59KVxuIiwiaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0J1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbi8qKlxuICogQGZ1bmN0aW9uIGZsYXRNYXBcbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmxhdE1hcCAoZm4sIGEpIHtcbiAgaWYgKGlzRnVuY3Rpb24oYSkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmbihhKHgpKSh4KVxuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihhLmZsYXRNYXApKSB7XG4gICAgcmV0dXJuIGEuZmxhdE1hcChmbilcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiBjb25jYXQoYWNjLCBmbih4KSksIGVtcHR5KGEpLCBhKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IHRvQXJyYXkgZnJvbSAnLi4vYXJyYXkvdG8nXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3RyaW5nIChzdHIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgbGV0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcblxuICBhcmdzLnNoaWZ0KClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFxcZCspfS9nLCAobWF0Y2gsIGlkeCkgPT4ge1xuICAgIHJldHVybiBub3QoaXMoJ1VuZGVmaW5lZCcsIGFyZ3NbaWR4XSkpID8gYXJnc1tpZHhdIDogbWF0Y2hcbiAgfSlcbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRvQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gYW4gYXJyYXlcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSB4IC0gT2JqZWN0IHRvIGNvbnZlcnQgdG8gYW4gYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvQXJyYXkoXCJzdHJpbmdcIilcbiAqIC8vIHJlc3VsdCA9IFsncycsJ3QnLCdyJywnaScsJ24nLCdnJ11cbiAqXG4gKiBmdW5jdGlvbiAoKSB7XG4gKiAgY29uc3QgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKVxuICogIGNvbnNvbGUubG9nKHR5cGVvZiBhcmdzKSAvLyBBcnJheVxuICogfVxuICpcbiAqKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvQXJyYXkgKHgpIHtcbiAgcmV0dXJuIHgubGVuZ3RoID09PSAxID8gW3hbMF1dIDogQXJyYXkuYXBwbHkobnVsbCwgeClcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzIChwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHksIGV2ZW4gaWYgaXQgaXMgaW5oZXJpdGVkXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIHtTdHJpbmd9IC0+IHtPYmplY3R9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBoYXNJbiAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBwcm9wIGluIG9ialxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSB2YWx1ZSBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZGVudGl0eSAoeCkge1xuICByZXR1cm4geFxufTtcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VtcHR5ICh4KSB7XG4gIHJldHVybiBleGlzdHMoeCkgJiYgZXF1YWxzKHgsIGVtcHR5KHgpKVxufTtcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDkvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IGRpZmZEYXRlIGZyb20gJy4vZGlmZkRhdGUnXG5cbmV4cG9ydCBkZWZhdWx0IChkKSA9PiB7XG4gIHJldHVybiBkaWZmRGF0ZShuZXcgRGF0ZSgpKShkKSA8IDBcbn1cbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTWFwJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdudWxsJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU2V0JylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCd1bmRlZmluZWQnKVxuIiwiLyoqXG4gKlxuICovXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQgKHgpIHtcbiAgLy8gbm9pbnNwZWN0aW9uIEpTQ2hlY2tGdW5jdGlvblNpZ25hdHVyZXNcbiAgcmV0dXJuIGlzRGF0ZSh4KSAmJiBpc0Zpbml0ZSh4LnZhbHVlT2YoKSlcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBKdXN0XG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJucyB7SnVzdH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgSnVzdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fdmFsdWUgPSB2YWxcbiAgcmV0dXJuIHRoaXNcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuSnVzdC5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgSnVzdFxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBNYXAgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIGEua2V5cygpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqXG4gKiBAZnVuY3Rpb24ga2V5c1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBpdGVyYXRvclxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBvYmogLT4gWypdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gT2JqIGZyb20gemhpY2ggdG8gdGFrZSB0aGUga2V5c1xuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBvYmplY3RLZXlzIGZyb20gJy4vb2JqZWN0L2tleXMnXG5pbXBvcnQgbWFwS2V5cyBmcm9tICcuL21hcC9rZXlzJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKG9iaikge1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwS2V5cyhvYmopXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RLZXlzKG9iailcbiAgfVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhbGwgdGhlIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIGNvbnN0IHIgPSBbXVxuICBmb3IgKGNvbnN0IGsgaW4gYSkge1xuICAgIHIucHVzaChrKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbGFzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVthLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXN0IG9mIHRoZSAyIGFyZ3VtZW50cyBwcm92aWRlZFxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1heCAoYSwgYikge1xuICByZXR1cm4gYiA+IGEgPyBiIDogYVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIE5vdGhpbmdcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbn1cblxuTm90aGluZy5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cbk5vdGhpbmcucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aGluZ1xuIiwiaW1wb3J0IEp1c3QgZnJvbSAnLi9KdXN0J1xuaW1wb3J0IE5vdGhpbmcgZnJvbSAnLi9Ob3RoaW5nJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBNYXliZVxuICogQHBhcmFtIHZhbFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBNYXliZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fX3ZhbHVlID0gdmFsXG59XG5cbk1heWJlLm9mID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgTWF5YmUpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXliZSkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXliZSh2YWwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gdGhpcy5pc05vdGhpbmcoKSA/IG4gOiB0aGlzLl9fdmFsdWVcbn1cblxuTWF5YmUucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIGlmICh0aGlzLmlzTm90aGluZygpKSB7XG4gICAgcmV0dXJuIE1heWJlLm9mKG51bGwpXG4gIH1cbiAgcmV0dXJuIE1heWJlLm9mKGYodGhpcy5fX3ZhbHVlKSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKG0pIHtcbiAgcmV0dXJuIG0ubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLl9fdmFsdWUgPT0gbnVsbClcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICF0aGlzLmlzTm90aGluZygpXG59XG5cbk1heWJlLnByb3RvdHlwZS5Ob3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KHRoaXMuX3ZhbHVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXliZVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdW5pb25BcnJheVxuICogQGRlc2NyaXB0aW9uIE1lcmdlcyAyIGFycmF5c1xuICogQHBhcmFtIHtBcnJheX0gYUwgLSBBcnJheSB0byBtZXJnZVxuICogQHBhcmFtIHtBcnJheX0gYVIgLSBBcnJheSB0byBtZXJnZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdW5pb25BcnJheShbMCwxLDJdLCBbMyw0LDVdKVxuICogLy8gcmVzdWx0ID0gWzAuMS4yLjMuNC41XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB1bmlvbkFycmF5IChhTCwgYVIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhTC5jb25jYXQoYVIpKSlcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi4vaWRlbnRpY2FsJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4uL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4uL2FycmF5L2lzJ1xuaW1wb3J0IHVuaW9uIGZyb20gJy4uL2FycmF5L3VuaW9uJ1xuXG5jb25zdCBtZXJnZSA9IGN1cnJ5KChvYmpMLCBvYmpSKSA9PiB7XG4gIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuXG4gIGlmIChpZGVudGljYWwob2JqTCwgb2JqUikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqUikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9ialIsIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IG9sZFZhbHVlID0gb2JqUltrZXldXG4gICAgY29uc3QgbmV3VmFsdWUgPSBvYmpMW2tleV1cblxuICAgIGlmIChpc09iamVjdChvbGRWYWx1ZSkgJiYgaXNPYmplY3QobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHVuaW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBvbGRWYWx1ZSAvLyBUT0RPOiB0aGlzIGlzIGEgcmVmZXJlbmNlLCBzaG91bGQgYmUgY2xvbmVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgMiBhcmd1bWVudHNcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtdWx0aXBseSAoYSwgYikge1xuICByZXR1cm4gK2EgKiArYlxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgob2JqLCBuYW1lcykgPT4ge1xuICBsZXQgcmVzdWx0ID0ge31cblxuICBPYmplY3Qua2V5cyhvYmopLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgfSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGF0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBhdGggKHBhdGgsIG9iaikge1xuICBsZXQgdmFsID0gb2JqXG4gIGxldCBpZHggPSAwXG4gIGxldCBwXG4gIHdoaWxlIChpZHggPCBwYXRoLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHAgPSBwYXRoW2lkeF1cbiAgICB2YWwgPSBOdW1iZXIuaXNJbnRlZ2VyKHApXG4gICAgICA/IHAgPCAwID8gdmFsW3ZhbC5sZW5ndGggKyBwXSA6IHZhbFtwXVxuICAgICAgOiB2YWxbcF1cbiAgICBpZHggKz0gMVxuICB9XG4gIHJldHVybiB2YWxcbn0pXG4vLyBsZXQgciA9IG9ialxuLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4vLyAgIGlmIChyID09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbi8vICAgciA9IHJbcGF0aFtpXV1cbi8vIH1cbi8vIHJldHVybiByXG4vLyB9KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGlja1xuICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBuZXcgYmplY3Qgd2l0aCBvbmx5IHRoZSBwcm9wcyB0aGF0IGFyZSBwcm92aWRlZFxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgLSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGljayAocHJvcHMsIG9iaikge1xuICBjb25zdCByID0ge31cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgcHJvcHMubGVuZ3RoKSB7XG4gICAgaWYgKHByb3BzW2ldIGluIG9iaikge1xuICAgICAgcltwcm9wc1tpXV0gPSBvYmpbcHJvcHNbaV1dXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcHJvcFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHByb3AgKHAsIG9iaikge1xuICByZXR1cm4gb2JqW3BdXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgaW4gYW4gYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgYWRkIGZyb20gJy4vYWRkJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi4vZm9sZCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gc3VtIChhKSB7XG4gIHJldHVybiBmb2xkKGFkZCwgMCwgYSlcbn0pXG4iLCIvKipcbiAqIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqXG4gKiBAZnVuY3Rpb24gVFxuICogQGRlc2NyaXB0aW9uIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgYWx3YXlzIGZyb20gJy4uL2Fsd2F5cydcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzKHRydWUpXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gODY0MDAwMDAgLy8gMjQqNjAqNjAqMTAwMCA9IDg2NDAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAzNjAwMDAwIC8vIDYwKjYwKjEwMDAgPSAzNjAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyA2MDAwMCAvLyA2MCoxMDAwID0gNjAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDEwMDBcclxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHJ1dGh5XG4gKi9cbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRydXRoeSAoeCkge1xuICByZXR1cm4gKHggIT09IGZhbHNlKSAmJiBleGlzdHMoeClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB2YWx1ZXNcbiAqIEBkZXNjcmlwdGlvbiBSRXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgdGFrZW4gZnJvbSBhbiBvYmplY3RzIG93biBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gLSBvYmogVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHZhbHVlc1xuICogQHJldHVybiB7YXJyYXl9XG4gKlxuICoqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiB2YWx1ZXMgKG9iaikge1xuICBjb25zdCBrID0ga2V5cyhvYmopXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gW11cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIHJbaV0gPSBvYmpba1tpXV1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuXG4gKiB6aXBXaXRoXG4gKlxuICogIEBmdW5jdGlvbiB6aXBXaXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXBXaXRoIChjYiwgYSwgYikge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIGxldCBpID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChjYihhW2ldLCBiW2ldKSlcbiAgfVxuICByZXR1cm4gYXJyXG59KVxuIiwiLyoqXG5cbiAqIHppcFxuICpcbiAqIEBmdW5jdGlvbiB6aXBcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgemlwV2l0aCBmcm9tICcuL3ppcFdpdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcCAoYSwgYikge1xuICByZXR1cm4gemlwV2l0aChmdW5jdGlvbiBfemlwV2l0aCAoeCwgeSkgeyByZXR1cm4gW3gsIHldIH0sIGEsIGIpXG59KVxuIiwiLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBfXyB9IGZyb20gJy4vX18nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcGVydHVyZSB9IGZyb20gJy4vYXBlcnR1cmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5U3BlYyB9IGZyb20gJy4vYXBwbHlTcGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVRvIH0gZnJvbSAnLi9hcHBseVRvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc2NlbmQgfSBmcm9tICcuL2FzY2VuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2MgfSBmcm9tICcuL2Fzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvY1BhdGggfSBmcm9tICcuL2Fzc29jUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xhbXAgfSBmcm9tICcuL2NsYW1wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBhcmF0b3IgfSBmcm9tICcuL2NvbXBhcmF0b3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VLIH0gZnJvbSAnLi9jb21wb3NlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVAgfSBmcm9tICcuL2NvbXBvc2VQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlV2l0aCB9IGZyb20gJy4vY29tcG9zZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdCB9IGZyb20gJy4vY29uc3RydWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3ROIH0gZnJvbSAnLi9jb25zdHJ1Y3ROJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb250YWlucyB9IGZyb20gJy4vY29udGFpbnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnZlcmdlIH0gZnJvbSAnLi9jb252ZXJnZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY291bnRCeSB9IGZyb20gJy4vY291bnRCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjIH0gZnJvbSAnLi9kZWMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlc2NlbmQgfSBmcm9tICcuL2Rlc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2UgfSBmcm9tICcuL2RpZmZlcmVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2VXaXRoIH0gZnJvbSAnLi9kaWZmZXJlbmNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlzc29jIH0gZnJvbSAnLi9kaXNzb2MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvY1BhdGggfSBmcm9tICcuL2Rpc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3AgfSBmcm9tICcuL2Ryb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0IH0gZnJvbSAnLi9kcm9wTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3RXaGlsZSB9IGZyb20gJy4vZHJvcExhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHMgfSBmcm9tICcuL2Ryb3BSZXBlYXRzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0c1dpdGggfSBmcm9tICcuL2Ryb3BSZXBlYXRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFdoaWxlIH0gZnJvbSAnLi9kcm9wV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVpdGhlciB9IGZyb20gJy4vZWl0aGVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlbmRzV2l0aCB9IGZyb20gJy4vZW5kc1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxQnkgfSBmcm9tICcuL2VxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxUHJvcHMgfSBmcm9tICcuL2VxUHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGV2b2x2ZSB9IGZyb20gJy4vZXZvbHZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kIH0gZnJvbSAnLi9maW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdCB9IGZyb20gJy4vZmluZExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRMYXN0SW5kZXggfSBmcm9tICcuL2ZpbmRMYXN0SW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsYXR0ZW4gfSBmcm9tICcuL2ZsYXR0ZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsaXAgfSBmcm9tICcuL2ZsaXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2ggfSBmcm9tICcuL2ZvckVhY2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2hPYmpJbmRleGVkIH0gZnJvbSAnLi9mb3JFYWNoT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZnJvbVBhaXJzIH0gZnJvbSAnLi9mcm9tUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwQnkgfSBmcm9tICcuL2dyb3VwQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwV2l0aCB9IGZyb20gJy4vZ3JvdXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndCB9IGZyb20gJy4vZ3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGd0ZSB9IGZyb20gJy4vZ3RlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNQYXRoIH0gZnJvbSAnLi9oYXNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoZWFkIH0gZnJvbSAnLi9oZWFkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpZkVsc2UgfSBmcm9tICcuL2lmRWxzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5jIH0gZnJvbSAnLi9pbmMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluY2x1ZGVzIH0gZnJvbSAnLi9pbmNsdWRlcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhCeSB9IGZyb20gJy4vaW5kZXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhPZiB9IGZyb20gJy4vaW5kZXhPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5pdCB9IGZyb20gJy4vaW5pdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5uZXJKb2luIH0gZnJvbSAnLi9pbm5lckpvaW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluc2VydCB9IGZyb20gJy4vaW5zZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnRBbGwgfSBmcm9tICcuL2luc2VydEFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9pbnRlcnNlY3Rpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc3BlcnNlIH0gZnJvbSAnLi9pbnRlcnNwZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50byB9IGZyb20gJy4vaW50bydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52ZXJ0IH0gZnJvbSAnLi9pbnZlcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydE9iaiB9IGZyb20gJy4vaW52ZXJ0T2JqJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZva2VyIH0gZnJvbSAnLi9pbnZva2VyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqb2luIH0gZnJvbSAnLi9qb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqdXh0IH0gZnJvbSAnLi9qdXh0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0SW5kZXhPZiB9IGZyb20gJy4vbGFzdEluZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbmd0aCB9IGZyb20gJy4vbGVuZ3RoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zIH0gZnJvbSAnLi9sZW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zSW5kZXggfSBmcm9tICcuL2xlbnNJbmRleCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1BhdGggfSBmcm9tICcuL2xlbnNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUHJvcCB9IGZyb20gJy4vbGVuc1Byb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxpZnROIH0gZnJvbSAnLi9saWZ0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHQgfSBmcm9tICcuL2x0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsdGUgfSBmcm9tICcuL2x0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW0gfSBmcm9tICcuL21hcEFjY3VtJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bVJpZ2h0IH0gZnJvbSAnLi9tYXBBY2N1bVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBPYmpJbmRleGVkIH0gZnJvbSAnLi9tYXBPYmpJbmRleGVkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRjaCB9IGZyb20gJy4vbWF0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hdGhNb2QgfSBmcm9tICcuL21hdGhNb2QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1heEJ5IH0gZnJvbSAnLi9tYXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVhbiB9IGZyb20gJy4vbWVhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVkaWFuIH0gZnJvbSAnLi9tZWRpYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lbW9pemVXaXRoIH0gZnJvbSAnLi9tZW1vaXplV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VBbGwgfSBmcm9tICcuL21lcmdlQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBMZWZ0IH0gZnJvbSAnLi9tZXJnZURlZXBMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBSaWdodCB9IGZyb20gJy4vbWVyZ2VEZWVwUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGggfSBmcm9tICcuL21lcmdlRGVlcFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGhLZXkgfSBmcm9tICcuL21lcmdlRGVlcFdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlTGVmdCB9IGZyb20gJy4vbWVyZ2VMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVJpZ2h0IH0gZnJvbSAnLi9tZXJnZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVdpdGggfSBmcm9tICcuL21lcmdlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZVdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1pbiB9IGZyb20gJy4vbWluJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW5CeSB9IGZyb20gJy4vbWluQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1vZHVsbyB9IGZyb20gJy4vbW9kdWxvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb3ZlIH0gZnJvbSAnLi9tb3ZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuQXJ5IH0gZnJvbSAnLi9uQXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuZWdhdGUgfSBmcm9tICcuL25lZ2F0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbm9uZSB9IGZyb20gJy4vbm9uZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoIH0gZnJvbSAnLi9udGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aEFyZyB9IGZyb20gJy4vbnRoQXJnJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvIH0gZnJvbSAnLi9vJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvYmpPZiB9IGZyb20gJy4vb2JqT2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9mIH0gZnJvbSAnLi9vZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb25jZSB9IGZyb20gJy4vb25jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb3RoZXJ3aXNlIH0gZnJvbSAnLi9vdGhlcndpc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG92ZXIgfSBmcm9tICcuL292ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhaXIgfSBmcm9tICcuL3BhaXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWwgfSBmcm9tICcuL3BhcnRpYWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWxSaWdodCB9IGZyb20gJy4vcGFydGlhbFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aXRpb24gfSBmcm9tICcuL3BhcnRpdGlvbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aEVxIH0gZnJvbSAnLi9wYXRoRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhPciB9IGZyb20gJy4vcGF0aE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoU2F0aXNmaWVzIH0gZnJvbSAnLi9wYXRoU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQWxsIH0gZnJvbSAnLi9waWNrQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQnkgfSBmcm9tICcuL3BpY2tCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZSB9IGZyb20gJy4vcGlwZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZUsgfSBmcm9tICcuL3BpcGVLJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlUCB9IGZyb20gJy4vcGlwZVAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVXaXRoIH0gZnJvbSAnLi9waXBlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGx1Y2sgfSBmcm9tICcuL3BsdWNrJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVwZW5kIH0gZnJvbSAnLi9wcmVwZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9qZWN0IH0gZnJvbSAnLi9wcm9qZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wRXEgfSBmcm9tICcuL3Byb3BFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcElzIH0gZnJvbSAnLi9wcm9wSXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BPciB9IGZyb20gJy4vcHJvcE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wcyB9IGZyb20gJy4vcHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BTYXRpc2ZpZXMgfSBmcm9tICcuL3Byb3BTYXRpc2ZpZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJhbmdlIH0gZnJvbSAnLi9yYW5nZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZUJ5IH0gZnJvbSAnLi9yZWR1Y2VCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlZCB9IGZyb20gJy4vcmVkdWNlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlUmlnaHQgfSBmcm9tICcuL3JlZHVjZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VXaGlsZSB9IGZyb20gJy4vcmVkdWNlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlamVjdCB9IGZyb20gJy4vcmVqZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmUgfSBmcm9tICcuL3JlbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwZWF0IH0gZnJvbSAnLi9yZXBlYXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGxhY2UgfSBmcm9tICcuL3JlcGxhY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNjYW4gfSBmcm9tICcuL3NjYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2V0IH0gZnJvbSAnLi9zZXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNsaWNlIH0gZnJvbSAnLi9zbGljZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydCB9IGZyb20gJy4vc29ydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydEJ5IH0gZnJvbSAnLi9zb3J0QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRXaXRoIH0gZnJvbSAnLi9zb3J0V2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXQgfSBmcm9tICcuL3NwbGl0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEF0IH0gZnJvbSAnLi9zcGxpdEF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEV2ZXJ5IH0gZnJvbSAnLi9zcGxpdEV2ZXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdFdoZW4gfSBmcm9tICcuL3NwbGl0V2hlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3RhcnRzV2l0aCB9IGZyb20gJy4vc3RhcnRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3VidHJhY3QgfSBmcm9tICcuL3N1YnRyYWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlIH0gZnJvbSAnLi9zeW1tZXRyaWNEaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhaWwgfSBmcm9tICcuL3RhaWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2UgfSBmcm9tICcuL3Rha2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0IH0gZnJvbSAnLi90YWtlTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3RXaGlsZSB9IGZyb20gJy4vdGFrZUxhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZVdoaWxlIH0gZnJvbSAnLi90YWtlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhcCB9IGZyb20gJy4vdGFwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZXN0IH0gZnJvbSAnLi90ZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aGVuIH0gZnJvbSAnLi90aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aHVua2lmeSB9IGZyb20gJy4vdGh1bmtpZnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRpbWVzIH0gZnJvbSAnLi90aW1lcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Mb3dlciB9IGZyb20gJy4vdG9Mb3dlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlycyB9IGZyb20gJy4vdG9QYWlycydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlyc0luIH0gZnJvbSAnLi90b1BhaXJzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvU3RyaW5nIH0gZnJvbSAnLi90b1N0cmluZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9VcHBlciB9IGZyb20gJy4vdG9VcHBlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhbnNkdWNlIH0gZnJvbSAnLi90cmFuc2R1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmF2ZXJzZSB9IGZyb20gJy4vdHJhdmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyaW0gfSBmcm9tICcuL3RyaW0nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyeUNhdGNoIH0gZnJvbSAnLi90cnlDYXRjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcHBseSB9IGZyb20gJy4vdW5hcHBseSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcnkgfSBmcm9tICcuL3VuYXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmN1cnJ5TiB9IGZyb20gJy4vdW5jdXJyeU4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuZm9sZCB9IGZyb20gJy4vdW5mb2xkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbldpdGggfSBmcm9tICcuL3VuaW9uV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gJy4vdW5pcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcUJ5IH0gZnJvbSAnLi91bmlxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFXaXRoIH0gZnJvbSAnLi91bmlxV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5sZXNzIH0gZnJvbSAnLi91bmxlc3MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubmVzdCB9IGZyb20gJy4vdW5uZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bnRpbCB9IGZyb20gJy4vdW50aWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VXaXRoIH0gZnJvbSAnLi91c2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXNJbiB9IGZyb20gJy4vdmFsdWVzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHZpZXcgfSBmcm9tICcuL3ZpZXcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZW4gfSBmcm9tICcuL3doZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlIH0gZnJvbSAnLi93aGVyZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmVFcSB9IGZyb20gJy4vd2hlcmVFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aG91dCB9IGZyb20gJy4vd2l0aG91dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgeHByb2QgfSBmcm9tICcuL3hwcm9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBPYmogfSBmcm9tICcuL3ppcE9iaidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkIH0gZnJvbSAnLi9udW1iZXIvYWRkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRJbmRleCB9IGZyb20gJy4vYWRkSW5kZXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkanVzdCB9IGZyb20gJy4vYWRqdXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3RXaXRoIH0gZnJvbSAnLi9hZGp1c3RXaXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGwgfSBmcm9tICcuL2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsUGFzcyB9IGZyb20gJy4vYWxsUGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWx3YXlzIH0gZnJvbSAnLi9hbHdheXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuZCB9IGZyb20gJy4vYW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnkgfSBmcm9tICcuL2FueSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55UGFzcyB9IGZyb20gJy4vYW55UGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXAgfSBmcm9tICcuL2FwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmQgfSBmcm9tICcuL2FwcGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHkgfSBmcm9tICcuL2FwcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5hcnkgfSBmcm9tICcuL2JpbmFyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluZCB9IGZyb20gJy4vYmluZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm90aCB9IGZyb20gJy4vYm9vbGVhbi9ib3RoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjYWxsIH0gZnJvbSAnLi9jYWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wbGVtZW50IH0gZnJvbSAnLi9jb21wbGVtZW50J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlIH0gZnJvbSAnLi9jb21wb3NlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uZCB9IGZyb20gJy4vY29uZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3VycnkgfSBmcm9tICcuL2N1cnJ5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWZhdWx0VG8gfSBmcm9tICcuL2RlZmF1bHRUbydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZkRhdGUgfSBmcm9tICcuL2RhdGUvZGlmZkRhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpdmlkZSB9IGZyb20gJy4vbnVtYmVyL2RpdmlkZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW1wdHkgfSBmcm9tICcuL2VtcHR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcXVhbHMgfSBmcm9tICcuL2VxdWFscydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXhpc3RzIH0gZnJvbSAnLi9leGlzdHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEYgfSBmcm9tICcuL2Jvb2xlYW4vRidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlsdGVyIH0gZnJvbSAnLi9maWx0ZXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRJbmRleCB9IGZyb20gJy4vZmluZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXJzdCB9IGZyb20gJy4vZmlyc3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZsYXRNYXAgfSBmcm9tICcuL2ZsYXRNYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvbGQgfSBmcm9tICcuL2ZvbGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvcm1hdFN0cmluZyB9IGZyb20gJy4vc3RyaW5nL2Zvcm1hdFN0cmluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzIH0gZnJvbSAnLi9vYmplY3QvaGFzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNJbiB9IGZyb20gJy4vb2JqZWN0L2hhc0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGljYWwgfSBmcm9tICcuL2lkZW50aWNhbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpdHkgfSBmcm9tICcuL2lkZW50aXR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpcyB9IGZyb20gJy4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJyYXkgfSBmcm9tICcuL2FycmF5L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jvb2xlYW4gfSBmcm9tICcuL2Jvb2xlYW4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRGF0ZSB9IGZyb20gJy4vZGF0ZS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNGdXR1cmVEYXRlIH0gZnJvbSAnLi9kYXRlL2lzRnV0dXJlRGF0ZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNNYXAgfSBmcm9tICcuL21hcC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOYW4gfSBmcm9tICcuL251bWJlci9pc05hbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdWxsIH0gZnJvbSAnLi9udWxsL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc051bWJlciB9IGZyb20gJy4vbnVtYmVyL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1NldCB9IGZyb20gJy4vc2V0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1N0cmluZyB9IGZyb20gJy4vc3RyaW5nL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc1ZhbGlkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKdXN0IH0gZnJvbSAnLi9tb25hZHMvSnVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5cyB9IGZyb20gJy4va2V5cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5c0luIH0gZnJvbSAnLi9vYmplY3Qva2V5c0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0IH0gZnJvbSAnLi9sYXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0IH0gZnJvbSAnLi9saWZ0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXAgfSBmcm9tICcuL21hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4IH0gZnJvbSAnLi9tYXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE1heWJlIH0gZnJvbSAnLi9tb25hZHMvTWF5YmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlIH0gZnJvbSAnLi9vYmplY3QvbWVyZ2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG11bHRpcGx5IH0gZnJvbSAnLi9udW1iZXIvbXVsdGlwbHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vdCB9IGZyb20gJy4vbm90J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOb3RoaW5nIH0gZnJvbSAnLi9tb25hZHMvTm90aGluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb21pdCB9IGZyb20gJy4vb2JqZWN0L29taXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yIH0gZnJvbSAnLi9vcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aCB9IGZyb20gJy4vb2JqZWN0L3BhdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tICcuL29iamVjdC9waWNrJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wIH0gZnJvbSAnLi9vYmplY3QvcHJvcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3VtIH0gZnJvbSAnLi9udW1iZXIvc3VtJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUIH0gZnJvbSAnLi9ib29sZWFuL1QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvRGF5IH0gZnJvbSAnLi9kYXRlL3RvRGF5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0hvdXIgfSBmcm9tICcuL2RhdGUvdG9Ib3VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b01pbnV0ZXMgfSBmcm9tICcuL2RhdGUvdG9NaW51dGVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlY29uZHMgfSBmcm9tICcuL2RhdGUvdG9TZWNvbmRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnV0aHkgfSBmcm9tICcuL3RydXRoeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHlwZSB9IGZyb20gJy4vdHlwZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tICcuL2FycmF5L3VuaW9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXMgfSBmcm9tICcuL29iamVjdC92YWx1ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcCB9IGZyb20gJy4vemlwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBXaXRoIH0gZnJvbSAnLi96aXBXaXRoJ1xuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdOdW1iZXInKVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKlxuICogQGZ1bmN0aW9uIGFuZFxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKHgsIHkpIC0+IGJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCAtIEEgcHJlZGljYXRlXG4gKiBAcGFyYW0geyp9IHkgLSBBIHByZWRpY2F0ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbmQgKHgsIHkpIHtcbiAgcmV0dXJuIHggJiYgeVxufSlcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IE9iamVjdCB0byB2ZXJpZml5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzQXJyYXkoWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IHRydWVcbiAqL1xuXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdBcnJheScpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnRGF0ZScpXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZXF1YWxzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiBmb3IgZGVlcCBjb21wYXJpc29uIG9mIGFycmF5c1xuICogQHBhcmFtIHthfSB4IC0gT2JqZWN0IHRvIGNvbXBhcmUgb2YgdHlwZSBhXG4gKiBAcGFyYW0ge2F9IHkgLSBPYmplY3QgeCB0byBjb21wYXJlIHdpdGggb2JqZWN0IHhcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFsc0FycmF5ICh4LCB5KSB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm90KGVxdWFscyh4W2ldLCB5W2ldKSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4uL2V4aXN0cydcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KCh4LCB5KSA9PiB7XG4gIGZvciAobGV0IGtleVggaW4geCkge1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VuZmlsdGVyZWRGb3JJbkxvb3BcbiAgICBpZiAobm90KGVxdWFscyh4W2tleVhdLCB5W2tleVhdKSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQga2V5WSBpbiB5KSB7XG4gICAgaWYgKG5vdChleGlzdHMoeFtrZXlZXSkpICYmIGV4aXN0cyh5W2tleVldKSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZXF1YWxzXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGVxdWFsaXR5IG9mIDIgaXRlbXNcbiAqIEBwYXJhbSB7Kn0geCAtIExlZnQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEBwYXJhbSB7Kn0geSAtIFJpZ2h0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBuYW4gPSBOdW1iZXIuTmFOXG4gKiBlcXVhbChuYW4sIG5hbikgLy8gcmV0dXJucyB0cnVlXG4gKlxuICogY29uc3QgYXJyMSA9IFswLCAxLCAyLCAzXVxuICogY29uc3QgYXJyMiA9IFtudWxsLCAxLCAyLCAzXVxuICogZXF1YWxzKGFycjEsIGFycjIpIC8vIHJldHVybnMgZmFsc2VcbiAqXG4gKiBlcXVhbHMobmV3IE9iamVjdCh7J2EnOiAwLCAnYic6IDF9KSwgeydhJzogMCwgJ2InOiAxfSkgLy8gdHJ1ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuL2lkZW50aWNhbCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5pbXBvcnQgb3IgZnJvbSAnLi9vcidcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vYXJyYXkvaXMnXG5pbXBvcnQgaXNCb29sZWFuIGZyb20gJy4vYm9vbGVhbi9pcydcbmltcG9ydCBpc051bWJlciBmcm9tICcuL251bWJlci9pcydcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL3N0cmluZy9pcydcbmltcG9ydCBpc0RhdGUgZnJvbSAnLi9kYXRlL2lzJ1xuaW1wb3J0IGVxdWFsc0FycmF5IGZyb20gJy4vYXJyYXkvZXF1YWxzJ1xuaW1wb3J0IGVxdWFsc09iamVjdCBmcm9tICcuL29iamVjdC9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFscyAoeCwgeSkge1xuICBpZiAoaWRlbnRpY2FsKHgsIHkpKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICh0eXBlKHgpICE9PSB0eXBlKHkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAob3Iobm90KGV4aXN0cyh4KSksIG5vdChleGlzdHMoeSkpKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHguY29uc3RydWN0b3IgIT09IHkuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZVxuXG4gIGlmIChpc1N0cmluZyh4KSB8fCBpc0Jvb2xlYW4oeCkgfHwgaXNOdW1iZXIoeCkgfHwgaXNEYXRlKHgpKSB7XG4gICAgcmV0dXJuIGlkZW50aWNhbCh4LnZhbHVlT2YoKSwgeS52YWx1ZU9mKCkpXG4gIH1cbiAgaWYgKGlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzQXJyYXkoeCwgeSlcbiAgfSBlbHNlIGlmIChpc09iamVjdCh4KSkge1xuICAgIHJldHVybiBlcXVhbHNPYmplY3QoeCwgeSlcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc05hTlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBudW1iZXIgaXMgTkFOXG5cbiAqL1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOYW4gKHgpIHtcbiAgcmV0dXJuIGFuZChpc051bWJlcih4KSwgaXNOYU4oeCkpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIGFuIGFycmF5IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChpZGVudGl0eSwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMCwyLDNdXG4gKiAgY29uc3QgYWRkMiA9IGFkZCgyKVxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChhZGQyLCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFsyLDQsNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBjb25zdCByID0gbmV3IEFycmF5KGwpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltpXSA9IGNiKGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBvbmUgb3IgdGhlIG90aGVyIGlzIHRydWVcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9yICh4LCB5KSB7XG4gIHJldHVybiB4IHx8IHlcbn0pXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTdHJpbmcnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgbWFwcGluZyBvdmVyIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgY2FsbGluZyBhbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtjYkZ1bmN0aW9ufSBjYiAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgaXRlbVxuICogQHBhcmFtIHsqfSBpbml0IC0gSW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gYSAtIEFycmF5IHdpdGggaXRlbXMgdG8gbW9kaWZ5IGJ5IHRoZSBjYiBmdW5jdGlvblxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYWxpYXMgcmVkdWNlXG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gZm9sZChhZGQsIDAsIFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSAzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2JGdW5jdGlvblxuICogQHBhcmFtIHsqfSByIC0gQWNjdW11bGF0b3Igd2hpY2ggYWNjdW11bGF0ZXMgdGhlIGNhbGxiYWNrJ3MgcmV0dXJuIHZhbHVlc1xuICogQHBhcmFtIHsqfSBpdGVtIC0gdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIHRoZSBpbmRleSBvZiB0aGUgaXRlbSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBUaGUgaW5pdGlhbCBhcnJheVxuICogQHJldHVybiB7Kn1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBsZXQgciA9IGluaXRcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2IociwgYVtpXSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnZnVuLmpzL3NyYy9lcXVhbHMnXG5pbXBvcnQgY29uY2F0IGZyb20gJ3V0aWwvY29uY2F0J1xuaW1wb3J0IGVtcHR5IGZyb20gJ3V0aWwvZW1wdHknXG5pbXBvcnQgZG90IGZyb20gJ3V0aWwvZG90J1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJ3V0aWwvaWRlbnRpdHknXG5pbXBvcnQgdHJhbnNwb3NlIGZyb20gJ3V0aWwvdHJhbnNwb3NlJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ3V0aWwvZ2VuZXJhdGUnXG5pbXBvcnQgZ3B1bWFwIGZyb20gJ3V0aWwvZ3B1bWFwJ1xuaW1wb3J0IGdwdWZvbGQgZnJvbSAndXRpbC9ncHVmb2xkJ1xuaW1wb3J0IGdwdXByb2R1Y3QgZnJvbSAndXRpbC9ncHVwcm9kdWN0J1xuXG4vKipcbiAqIEBjbGFzcyBNYXRyaXhcbiAqIEBjbGFzc2Rlc2MgTWF0cml4IGFwcGxpY2F0aXZlIHByb3ZpZGluZyBzdGFuZGFyZCBtYXRyaXggb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVGhlIE1hdHJpeCBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBuZXcga2V5d29yZC4gSW5zdGVhZCB1c2UgdGhlIE1hdHJpeC5vZiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IE1hdHJpeC4gVW5mb3J0dW5hdGx5IGpzZG9jcyBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGhpZGRlbi5cbiAqIEBoaWRlY29udHJ1Y3RvclxuICogQHNlZSBvZlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICpcbiAqL1xubGV0IE1hdHJpeCA9IGZ1bmN0aW9uICh2YWwsIEdQVUpTKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxuICBpZiAoR1BVSlMpIHtcbiAgICB0aGlzLmdwdWpzID0gR1BVSlMgPyBuZXcgR1BVSlMoKSA6IG51bGxcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBvZlxuICogQGRlc2MgQ3JlYXRlcyBhIE1hdHJpeCBvYmplY3QgYW5kIGZsYXR0ZW5zIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSB2YWwge2FycmF5fGZ1bmN0aW9ufSBBbiBhcnJheSBvZiBhcnJheXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5NYXRyaXgub2YgPSBmdW5jdGlvbiAodmFsLCBHUFVKUyA9IG51bGwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hdHJpeCkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHRoaXMuZ3B1anMgPSBHUFVKU1xuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXRyaXgodmFsLCBHUFVKUylcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0udHlwZSA9PT0gJ01hdHJpeCdcbiAqL1xuTWF0cml4LnByb3RvdHlwZS50eXBlID0gJ01hdHJpeCdcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge09iamVjdH0gZ3B1XG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmdwdSA9IHt9XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByZWNpc2lvblxuICogQHR5cGUge251bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0ucHJlY2lzaW9uID09PSA0XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucHJlY2lzaW9uID0gNFxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzZXRQcmVjaXNpb25cbiAqIEBwYXJhbSBwcmVjaXNpb24ge251bWJlcn0gU2V0IHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZm9yIHJvdW5kaW5nXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnNldFByZWNpc2lvbigxMClcbiAqIG0ucHJlY2lzaW9uID09PSAxMFxuICovXG5NYXRyaXgucHJvdG90eXBlLnNldFByZWNpc2lvbiA9IGZ1bmN0aW9uIChwcmVjaXNpb24pIHtcbiAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb25cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTeW1tZXRyaWNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3ltbWV0cmljKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTeW1tZXRyaWMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGEgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UodGhpcykuX192YWx1ZVxuICByZXR1cm4gZXF1YWxzKGEsIGIpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3F1YXJlXG4gKiBAZGVzYyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbnRhaW5zIGEgc3F1YXJlIE1hdHJpeFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTcXVhcmUoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1NxdWFyZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLmdldENvbHMoKSwgdGhpcy5nZXRSb3dzKCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzT3J0aG9nb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWy0wLjMwOTIsIC0wLjk1MTBdLCBbLTAuOTUxMCwgMC4zMDkyXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXguZnJvbUFycmF5KHJlc3VsdClcbiAqIHRydWUgID09PSBBLmlzT3J0aG9nb25hbCgpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNPcnRob2dvbmFsID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBeEF0ID0gdGhpcy5kb3QodGhpcy50cmFuc3Bvc2UoKSlcbiAgY29uc3QgSSA9IHRoaXMuaWRlbnRpdHkoKVxuICByZXR1cm4gZXF1YWxzKEF4QXQsIEkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldENvbHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Q29scygpICA9PT0gMlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRDb2xzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlWzBdLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBlcXVhbHNcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBbWzEsIDFdLCBbMSwgMV1dXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihhKVxuICogdmFyIEIgPSBNYXRyaXgub2YoYSlcbiAqIHRydWUgID09PSBBLmVxdWFscyhCKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5fX3ZhbHVlLCBNLl9fdmFsdWUgfHwgTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Um93c1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRSb3dzKCkgIC8vIDJcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRSb3dzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRTaGFwZVxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFNoYXBlKCkgIC8vIFsyLCAyXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFNoYXBlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW3RoaXMuZ2V0Um93cygpLCB0aGlzLmdldENvbHMoKV1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAoZikodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRoYXQgbWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgubWFwKHg9ID4geC5tYXAoeSA9PiB5KyAxKSwgW1sxLCAxXSwgWzEsIDFdXSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5tYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZm9sZFxuICogQGRlc2NyaXB0aW9uIFJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gRmxhdHRlbiBNYXRyaXhcbiAqIE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKS5mb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2LmNvbmNhdChuZXh0KSlcbiAqIC8vIFsxLCAxLCAxLCAxXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQoZiwgW10pKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdG8gcmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgTWF0cml4IHRvIHJlZHVjZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG5cbiAqIC8vIFN1bSBvZiBhbGwgbWF0cml4IHZhbHVlc1xuICogY29uc3QgcmVkdWNlciA9IChwcmV2LCBuZXh0KSA9PiBOdW1iZXIocHJldikgKyBuZXh0LnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LCAwKVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dXG4gKiBNYXRyaXguZm9sZChyZWR1Y2VyLCBBKVxuICogLy8gNFxuICovXG5NYXRyaXguZm9sZCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZm9sZChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIE1hdHJpeC5vZihmKS5hcChNKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufVxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIE1hdHJpeC5hcChmLCBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZikuYXAoTSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBBLmNvbmNhdChCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoTSwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChmKE0pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gQSB7TWF0cml4fVxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IE1hdHJpeC5jb25jYXQoQSwgQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5jb25jYXQgPSBjdXJyeShmdW5jdGlvbiAoQSwgQiwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLm1hcChmKEIpKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChlbXB0eSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5lbXB0eSA9IGN1cnJ5KGZ1bmN0aW9uIChyb3dzID0gMCwgY29scyA9IDApIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YobSkubWFwKGVtcHR5KVxufSlcblxuLy8gIyMjIyAjIyMjICMjIyMgLy9cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQWlkZW50aXR5ID0gQS5pZGVudGl0eSgpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuKi9cbk1hdHJpeC5wcm90b3R5cGUuaWRlbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKHRoaXMpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5pZGVudGl0eSgzLCAyKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiAqL1xuTWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKG0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29tYmluZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguY29tYmluZSA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuY29uY2F0KE1hdHJpeC5vZihCKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQ3JlYXRlIG1hdHJpeFxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDJdLCBbMywgNF1dKVxuICpcbiAqIC8vIEdlbmVyYXRlIGlkZW50aXR5IG1hdHJpeFxuICogY29uc3QgSSAgPSBtLmlkZW50aXR5KCkgLy8gW1sxLCAwXSwgWzAsIDFdXVxuICpcbiAqIGlmKG0uZG90KEkpLmVxdWFscyhtKSkge1xuICogICAgY29uc29sZS5sb2coJ0RvdCBwcm9kdWN0IHdpdGggaWRlbnRpdHkgbWF0cml4IHJldHVybnMgdGhlIHNhbWUgbWF0cml4JylcbiAqIH1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBkb3QodGhpcy5wcmVjaXNpb24pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBiID0gW1s3LCA4XSwgWzksIDEwXSwgWzExLCAxMl1dXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICpcbiAqIE1hdHJpeC5kb3QoQSwgQikgLy8gW1s1OCwgNjRdLCBbMTM5LCAxNTRdXVxuICpcbiAqL1xuTWF0cml4LmRvdCA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuZG90KE1hdHJpeC5vZihCKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZmlsbFxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB0aGUgcHJvdmlkZWQgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLmZpbGwoeCA9PiA0MilcbiAqIC8vIFtbNDIsNDIsNDJdLCBbNDIsNDIsNDJdLCBbNDIsNDIsNDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAobWFwKHggPT4gZih4KSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLnplcm9zKClcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS56ZXJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lnplcm9zKDMsIDMpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC56ZXJvcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5vbmVzKClcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5vbmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9uZXMoMSwgMSlcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4Lm9uZXMgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDFdXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDEpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVyc1xuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHJhbmRvbSB2YWx1ZXMuIERlZmF1bHQgcmFuZG9tIHZhbHVlcyBhcmUgYmV0d2VlbiAtMSBhbmQgMVxuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSksIHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0b0FycmF5XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBhcnJheSBmcm9tIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLm1hcChyb3cgPT4gcm93Lm1hcChjb2wgPT4gY29sKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY2xvbmVcbiAqIEBkZXNjIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4LmZyb21BcnJheSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZyb21BcnJheVxuICogQGRlc2MgUmV0dXJucyBhIE1hdHJpeCBmcm9tIGFuIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKHJvdyA9PiBtYXAoY29sID0+IGNvbCkocm93KSkoYXJyKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdKVxuICogY29uc3QgYiA9IEEudHJhbnNwb3NlKCkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQodHJhbnNwb3NlLCBbXSwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IEEgTWF0cml4IG9yIGEgbWF0cml4IGFycmF5XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdXG4gKiBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZShhKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkudHJhbnNwb3NlKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBBZGQgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLmFkZCgxKSAvLyBbWzYsIDVdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuYWRkKEIpIC8vIFtbMTAsIDEwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBhZGQnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgKyBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICsgTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1YnRyYWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBTdWJ0cmFjdCBhIE1hdHJpeCBvciBhIG51bWJlclxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuc3VidHJhY3QoMSkgLy8gW1s0LCAyXV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLnN1YnRyYWN0KEIpIC8vIFtbMCwgMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBzdWJ0cmFjdCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgodmFsLCBqZHgpID0+IHZhbCAtIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggLSBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgbXVsdGlwbHlcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgTXV0bGlwbHkgYSBzY2FsYXIgb3IgYSBtdHJhaXggd2l0aCBhIG1hdHJpeC4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtdWx0aXBsaWNhdGlvbiBpcyBub3QgcG9zc2libGUuXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLm11bHRpcGx5KDIpIC8vIFtbMTAsIDhdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIubXVsdGlwbHkoQikgLy8gW1syNSwgMjVdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2Ugc3RhdGljIG1ldGhvZCBcXCdkb3RcXCcgdG8gZG8gbWF0cml4IG11bHRpcGxpY2F0aW9uJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgY3JlYXRlIGhhZGFtYXJkIHByb2R1Y3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKGNvbCwgamR4KSA9PiBjb2wgKiBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICogTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGFkZGl0aXZlaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1hdHJpeCBvYnRhaW5lZCBieSBjaGFuZ2luZyB0aGUgc2lnbiBvZiBldmVyeSBtYXRyaXggZWxlbWVudC4gVGhlIGFkZGl0aXZlIGludmVyc2Ugb2YgbWF0cml4IEEgaXMgd3JpdHRlbiDigJNBLlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsLTVdLCBbLTQsIDRdXSlcbiAqIGNvbnN0IG1pbnVzQSA9IEEuYWRkaXRpdmVpbnZlcnNlKClcbiAqIC8vIFtbLTUsIDVdLCBbNCwgLTRdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZGl0aXZlaW52ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseSgtMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGhhZGFtYXJkXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgbXVsdGlwbHlcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5oYWRhbWFyZCgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmhhZGFtYXJkKEIpIC8vIFtbMjUsIDI1XV1cblxuICovXG5NYXRyaXgucHJvdG90eXBlLmhhZGFtYXJkID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseShNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBsdVxuICogQGRlc2MgQ2FsY3VsYXRlcyBMVSBkZWNvbXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeFtdfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWzMsIC03LCAtMiwgMl0sIFstMywgNSwgMSwgMF0sIFs2LCAtNCwgMCwgLTVdLCBbLTksIDUsIC01LCAxMl1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiBjb25zdCBsdSA9IEEubHUoKVxuICogLy8gTC5fX3ZhbHVlID0gWyBbIDEsIDAsIDAsIDAgXSwgWyAtMSwgMSwgMCwgMCBdLCBbIDIsIC01LCAxLCAwIF0sIFsgLTMsIDgsIDMsIDEgXSBdXG4gKiAvLyBVLl9fdmFsdWUgPSAgWyBbIDMsIC03LCAtMiwgMiBdLCBbIDAsIC0yLCAtMSwgMiBdLCBbIDAsIDAsIC0xLCAxIF0sIFsgMCwgMCwgMCwgLTEgXSBdXG4gKiBNYXRyaXguZG90KGx1WzBdLCBsdVsxXSkgLy8gcmV0dXJucyBjbG9uZSBvZiBBXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmx1ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgdG9sID0gMWUtNlxuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEwgPSB0aGlzLnplcm9zKClcbiAgY29uc3QgVSA9IHRoaXMuemVyb3MoKVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgaWYgKE1hdGguYWJzKEEuX192YWx1ZVtrXVtrXSkgPCB0b2wpIHRocm93IEVycm9yKCdDYW5ub3QgcHJvY2VlZCB3aXRob3V0IGEgcm93IGV4Y2hhbmdlJylcbiAgICBMLl9fdmFsdWVba11ba10gPSAxXG4gICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbjsgKytpKSB7XG4gICAgICBMLl9fdmFsdWVbaV1ba10gPSBBLl9fdmFsdWVbaV1ba10gLyBBLl9fdmFsdWVba11ba11cbiAgICAgIGZvciAobGV0IGogPSBrICsgMTsgaiA8IG47ICsraikge1xuICAgICAgICBBLl9fdmFsdWVbaV1bal0gPSBBLl9fdmFsdWVbaV1bal0gLSBMLl9fdmFsdWVbaV1ba10gKiBBLl9fdmFsdWVba11bal1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgbCA9IGs7IGwgPCBuOyArK2wpIHtcbiAgICAgIFUuX192YWx1ZVtrXVtsXSA9IEEuX192YWx1ZVtrXVtsXVxuICAgIH1cbiAgfVxuICByZXR1cm4gW0wsIFVdXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJyZWZcbiAqIEByZXR1cm5zIHtNYXRyaXh8YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBBID0gTWF0cml4Lm9mKFtbLTEsIDFdLCBbLTEsIDBdLCBbMCwgLTFdLCBbLTEsIC0yXV0pXG4gKiBBLnJyZWYoKSAvLyAgWyBbIDEsIDAgXSwgWyAtMCwgMSBdLCBbIDAsIDAgXSwgWyAwLCAwIF0gXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJyZWYgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBsZWFkID0gMFxuICBjb25zdCByZXN1bHRNYXRyaXggPSB0aGlzLmNsb25lKClcblxuICBmb3IgKGxldCByID0gMDsgciA8IHRoaXMuZ2V0Um93cygpOyArK3IpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgPD0gbGVhZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgIH1cbiAgICBsZXQgaSA9IHJcbiAgICB3aGlsZSAocmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bbGVhZF0gPT09IDApIHtcbiAgICAgICsraVxuICAgICAgaWYgKHRoaXMuZ2V0Um93cygpID09PSBpKSB7XG4gICAgICAgIGkgPSByXG4gICAgICAgICsrbGVhZFxuICAgICAgICBpZiAodGhpcy5nZXRDb2xzKCkgPT09IGxlYWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0TWF0cml4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG1wID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1cbiAgICByZXN1bHRNYXRyaXguX192YWx1ZVtpXSA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl0gPSB0bXBcblxuICAgIGxldCB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtsZWFkXVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5nZXRDb2xzKCk7ICsraikge1xuICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal0gLz0gdmFsXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdldFJvd3MoKTsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gcikgY29udGludWVcbiAgICAgIHZhbCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bal0gLT0gdmFsICogcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal1cbiAgICAgIH1cbiAgICB9XG4gICAgbGVhZCsrXG4gIH1cbiAgcmV0dXJuIHJlc3VsdE1hdHJpeFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzb2x2ZVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU29sdmUgeEEgPSBiXG4gKiAvLyA1eCArIHkgID0gN1xuICogLy8gM3ggLSA0eSA9IDE4XG4gKiAvLyBTb2x1dGlvbiBmb3IgeCBhbmQgeTpcbiAqIC8vIHggPSAyXG4gKiAvLyB5ID0gLTNcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgMV0sIFszLCAtNF1dKVxuICogY29uc3Qgc29sdmVBID0gQS5zb2x2ZShbNywgMThdKSAvLyBbMiwgLTNdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24gKGIpIHtcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMVSA9IEEubHUoKVxuICBjb25zdCBMID0gTFVbMF1cbiAgY29uc3QgVSA9IExVWzFdXG4gIGNvbnN0IG4gPSB0aGlzLmdldFJvd3MoKVxuICBsZXQgcyA9IDBcbiAgY29uc3QgYyA9IFtdXG4gIGNvbnN0IHggPSBbXVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrOyArK2opIHtcbiAgICAgIHMgPSBzICsgTC5fX3ZhbHVlW2tdW2pdICogY1tqXVxuICAgIH1cbiAgICBjW2tdID0gYltrXSAtIHNcbiAgICBzID0gMFxuICB9XG4gIGZvciAobGV0IGEgPSBuIC0gMTsgYSA+IC0xOyAtLWEpIHtcbiAgICBsZXQgdCA9IDBcbiAgICBmb3IgKGxldCBiID0gYSArIDE7IGIgPCBuOyArK2IpIHtcbiAgICAgIHQgPSB0ICsgVS5fX3ZhbHVlW2FdW2JdICogeFtiXVxuICAgIH1cbiAgICB4W2FdID0gKGNbYV0gLSB0KSAvIFUuX192YWx1ZVthXVthXVxuICB9XG4gIHJldHVybiB4XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBpbnZlcnNlXG4gKiBAaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzIsIDRdXSkuaW52ZXJzZSgpXG4gKiAvLyBbIFsgMiwgLTAuNSBdLCBbIC0xLCAwLjUgXSBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgSSA9IEEuaWRlbnRpdHkoKVxuICBjb25zdCBJbnYgPSBBLmNvbmNhdChJKS5ycmVmKClcblxuICBjb25zdCByZXN1bHQgPSBJbnYuX192YWx1ZS5yZWR1Y2UoKHJlc3VsdCwgeCwgaWR4KSA9PiB7XG4gICAgY29uc3QgaGFsZiA9IHgubGVuZ3RoIC8gMlxuICAgIHJlc3VsdC5wdXNoKHguc2xpY2UoaGFsZiwgeC5sZW5ndGgpKVxuICAgIHJldHVybiByZXN1bHRcbiAgfSwgW10pXG4gIHJldHVybiBNYXRyaXgub2YocmVzdWx0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgcmFua1xuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmsgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJyZWYgPSB0aGlzLnJyZWYoKVxuICBsZXQgcmVzdWx0ID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJyZWYuZ2V0Q29scygpOyArK2kpIHtcbiAgICByZXN1bHQgKz0gcnJlZi5fX3ZhbHVlW2ldW2ldXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGltZW5zaW9uXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgcmFua1xuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJhbmsoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ1xuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFnKClcbiAqIC8vIFsxLCAxLCAxXVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWcoKVxuICogLy8gWzAsIDAsIDAsIDAsIDBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpYWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIHJldHVybiBhY2MuY29uY2F0KHhbaWR4XSlcbiAgfSkoW10pKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ1xuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWcoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIFsyLCA1XVxuICpcbiAqL1xuTWF0cml4LmRpYWcgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWcoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ3Byb2R1Y3RcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFncHJvZHVjdCgpXG4gKiAvLyAxXG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMFxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFncHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaWR4KSA9PiB7XG4gICAgYWNjICo9IHhbaWR4XVxuICAgIHJldHVybiBhY2NcbiAgfSkoMSkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBkaWFncHJvZHVjdFxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguZGlhZ3Byb2R1Y3QoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDEwXG4gKlxuICovXG5NYXRyaXguZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWdwcm9kdWN0KClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1bVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLnN1bSgpXG4gKiAvLyA5XG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuc3VtKClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc3VtID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiB7XG4gICAgYWNjICs9IGZvbGQoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KSgwKSh4KVxuICAgIHJldHVybiBhY2NcbiAgfSkoMCkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBzdW1cbiAqIEBkZXNjIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LnN1bShbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gOVxuICpcbiAqL1xuTWF0cml4LnN1bSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuc3VtKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGtyb25lY2tlclxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKHRoaXMg4oqXIE0pXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmtyb25lY2tlciA9IGZ1bmN0aW9uIChNKSB7XG4gIGNvbnN0IG0gPSB0aGlzLmdldFJvd3MoKVxuICBjb25zdCBuID0gdGhpcy5nZXRDb2xzKClcbiAgY29uc3QgcCA9IE0uZ2V0Um93cygpXG4gIGNvbnN0IHEgPSBNLmdldENvbHMoKVxuXG4gIGNvbnN0IGxlZnQgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgcmlnaHQgPSBNLl9fdmFsdWVcblxuICBjb25zdCBmcmFtZSA9IGdlbmVyYXRlKG0gKiBwLCBuICogcSlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHA7IGsrKykge1xuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IHE7IGwrKykge1xuICAgICAgICAgIGZyYW1lW3AgKiBpICsga11bcSAqIGogKyBsXSA9IGxlZnRbaV1bal0gKiByaWdodFtrXVtsXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE1hdHJpeC5vZihmcmFtZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24ga3JvbmVja2VyXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gQSB7TWF0cml4fSBUaGUgbGVmdCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEBwYXJhbSBCIHtNYXRyaXh9IFRoZSByaWdodCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmtyb25lY2tlcihCKVxufVxuXG4vLyogKioqKioqKioqKioqKioqKioqKioqKiovXG4vLyBHUFUgRnVuY3Rpb25zXG4vLyogKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdwdU1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gR1BVLmpzIGVuYWJsZWQgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGdwdU1hcHBlciAoYSkgeyByZXR1cm4gYVt0aGlzLnRocmVhZC55XVt0aGlzLnRocmVhZC54XSB9XG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMiwgMl0sIFsyLCAyXV0sIEdQVUpTKVxuICogbS5ncHVNYXAoZ3B1TWFwcGVyKVxuICogLy8gW0Zsb2F0MzJBcnJheSgyLDIpLCBGbG9hdDMyQXJyYXkoMiwyKV1cbiAqXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdwdU1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1bWFwKHRoaXMuZ3B1anMsIGYsIHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGdwdU1hcFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0aGF0IG1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gR1BVLmpzIGVuYWJsZWQgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGdwdU1hcHBlciAoYSkgeyByZXR1cm4gYVt0aGlzLnRocmVhZC55XVt0aGlzLnRocmVhZC54XSB9XG4gKiBjb25zdCBtID0gTWF0cml4LmdwdU1hcChHUFVKUywgZ3B1TWFwcGVyLCBbWzIsIDJdLCBbMiwgMl1dKVxuICogLy8gW0Zsb2F0MzJBcnJheSgyLDIpLCBGbG9hdDMyQXJyYXkoMiwyKV1cbiAqXG4gKi9cbk1hdHJpeC5ncHVNYXAgPSBjdXJyeShmdW5jdGlvbiAoZ3B1LCBmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSwgZ3B1KS5ncHVNYXAoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdwdUZvbGRcbiAqIEBkZXNjcmlwdGlvbiBGb2xkcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgR1BVUy5qcyBlbnFibGVkIHJlZHVjZSBmdW5jdGlvbiwgdXNpbmcgdGhlIEdQVVxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogbS5tYXAoeCA9PiB4Lm1hcCh5ID0+IHkrIDEpKVxuICogLy8gW1syLCAyXSwgWzIsIDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVGb2xkID0gZnVuY3Rpb24gKGYsIG91dHB1dCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGdwdWZvbGQodGhpcy5ncHVqcywgZiwgb3V0cHV0LCB0aGlzLl9fdmFsdWUpKVxufVxuXG5NYXRyaXgucHJvdG90eXBlLmdwdVByb2R1Y3QgPSBmdW5jdGlvbiAoZiwgb3V0cHV0LCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1cHJvZHVjdCh0aGlzLmdwdWpzLCBmLCBvdXRwdXQsIHRoaXMuX192YWx1ZSwgTSkpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdHJpeFxuIiwiaW1wb3J0IHsgY29uY2F0LCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiAoTSwgbSwgaWR4KSB7XG4gIHJldHVybiBjb25jYXQobSwgTS5fX3ZhbHVlW2lkeF0pXG59KVxuIiwiaW1wb3J0IHsgY3VycnkgfSBmcm9tICdmdW4uanMnXG5leHBvcnQgZGVmYXVsdCBjdXJyeShtID0+IFtdKVxuIiwiaW1wb3J0IHsgZm9sZCwgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmltcG9ydCByb3VuZCBmcm9tICcuL3JvdW5kJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcGFyYW0gYSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChkZWNpbWFscywgQiwgYSkgPT4gbWFwKChpdGVtLCBpKSA9PiB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGopID0+IHtcbiAgICBhY2MgKz0gcm91bmQoeCAqIEIuX192YWx1ZVtqXVtpXSwgZGVjaW1hbHMpXG4gICAgcmV0dXJuIGFjY1xuICB9LCAwKShhKVxufSkoQi5fX3ZhbHVlWzBdKSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBDcmVhdGVzIGFuIGlkZW50aXkgbWF0cml4IGZyb20gYW4gZW1wdHkgYXJyYXlcbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG0sIGlkeCkgPT4gbWFwKChyb3dzLCBqZHgpID0+IChpZHggPT09IGpkeCkgKiAxKShtKVxuIiwiaW1wb3J0IHsgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBUcmFuc3Bvc2VzIGEgYXJyYXkgb2YgYXJyYXlzIHVzaW5nIHRoZSBNYXRyaXgubWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChwcmV2LCBuZXh0KSA9PiBtYXAoKGl0ZW0sIGkpID0+IChwcmV2W2ldIHx8IFtdKS5jb25jYXQobmV4dFtpXSkpKG5leHQpKVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZVxuICogQGRlc2MgR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBhIG1hdHJpeCBhcnJheSwgdmFsdWVzIGFyZSBzZXQgdG8gdW5kZWZpbmVkXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHthbnlbXVtdfVxuICovXG5leHBvcnQgZGVmYXVsdCAocm93cywgY29scyA9IHVuZGVmaW5lZCwgdmFsdWUgPSAwKSA9PiB7XG4gIGNvbnN0IF9jb2xzID0gY29scyB8fCByb3dzXG4gIGNvbnN0IHkgPSBtYXAoeiA9PiB2YWx1ZSkobmV3IEFycmF5KF9jb2xzKSlcbiAgcmV0dXJuIG1hcCh6ID0+IHkpKG5ldyBBcnJheShyb3dzKSlcbn1cbiIsIi8vIGltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncHVtYXAgKGdwdSwgZiwgbWF0cml4KSB7XG4gIHJldHVybiBncHUuY3JlYXRlS2VybmVsKGYpLnNldE91dHB1dChbbWF0cml4Lmxlbmd0aCwgbWF0cml4WzBdLmxlbmd0aF0pKG1hdHJpeClcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdWZvbGQgKGdwdSwgZiwgb3V0cHV0LCBtYXRyaXgsIGNvbnN0YW50cyA9IHt9KSB7XG4gIHJldHVybiBncHVcbiAgICAuY3JlYXRlS2VybmVsKGYsIHsgY29uc3RhbnRzOiBPYmplY3QuYXNzaWduKHt9LCB7IG06IG1hdHJpeC5sZW5ndGgsIG46IG1hdHJpeFswXS5sZW5ndGggfSwgY29uc3RhbnRzKSB9KVxuICAgIC5zZXRPdXRwdXQob3V0cHV0KShtYXRyaXgpXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncHVkb3QgKGdwdSwgZiwgb3V0cHV0LCBhLCBiLCBjb25zdGFudHMgPSB7fSkge1xuICByZXR1cm4gZ3B1XG4gICAgLmNyZWF0ZUtlcm5lbChmLCB7IGNvbnN0YW50czogT2JqZWN0LmFzc2lnbih7fSwgeyBuOiBhWzBdLmxlbmd0aCB9LCBjb25zdGFudHMpIH0pXG4gICAgLnNldE91dHB1dChvdXRwdXQpKGEsIGIpXG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("@astuanax/funmatrix",[],n):"object"==typeof exports?exports["@astuanax/funmatrix"]=n():t["@astuanax/funmatrix"]=n()}("undefined"!=typeof self?self:this,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,e),u.l=!0,u.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var u in t)e.d(r,u,function(n){return t[n]}.bind(null,u));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=24)}([function(t,n,e){"use strict";function r(t){const n=t.length;return 0===n?t:e([]);function e(r){return function(){return function(r,u){const o=r.concat(u);return o.length{e.set(r,t(n,r,u))}),e}),a=Object(r.default)(function(t,n){let e=-1;const r=n.length;let u="";for(;++en.slice(r,r+t),e)}),c=Object(r.default)(function(t,n){return+t+ +n}),i=Object(r.default)(function(t,n,e){let r=0;return t(function(t){return n(t,r++)},e)}),f=Object(r.default)(function(t,n,e){const r=Array.prototype.slice.call(e),u=n<0?r.length+n:n;return e[u]?(r[u]=t(r[u]),r):r}),a=Object(r.default)(function(t,n,e){return Object(u.default)(e=>n(e)?t(e):e,Array.prototype.slice.call(e))}),l=Object(r.default)(function(t,n){let e=!0;for(let r in n)if(!t(n[r])){e=!1;break}return e}),s=Object(r.default)(function(t,n){for(let e=0;et(e)(n(e)):Object(j.a)((t,e)=>t.concat(Object(y.a)(Object(v.a)(e),n)),[],t)}),m=Object(r.default)(function(t,n){return Array.prototype.concat(t,n)});function w(t,n){return String(t)+String(n)}var M=e(2),x=Object(r.default)(function(t,n){return{String:w,Array:m}[Object(M.a)(t)](t,n)}),P=Object(r.default)(function(t,n){return x(n,[t])}),A=Object(r.default)(function(t,n){return t.apply(t,n)}),S=Object(v.a)(function(t){return Object(r.default)(function(n,e){return t(n,e)})}),C=Object(r.default)(function(t,n){return t.bind(n)}),k=e(9),N=Object(r.default)(function(t){const n=Object(v.a)(Object(r.default)(t));return Object(r.default)(function(){return Object(k.default)(g,Object(u.default)(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),R=Object(r.default)(function(t,n){return Object(O.a)("Function")(t)?function(){return t.apply(this,arguments)&&n.apply(this,arguments)}:N(p.a)(t,n)}),D=Object(r.default)(function(t){return t.apply(t,[].slice.call(arguments,1))}),F=e(4);var E=N(F.a);function z(){let t=Array.prototype.slice.call(arguments);return function(){let n=t[t.length-1],e=[n.apply(n,arguments)],r=t.length-2;for(;r>=0;--r){const n=t[r];e=[n.apply(n,e)]}return e[0]}}function T(t){return function(n){for(var e=0;ex(n,t(e)),Object(K.a)(n),n)});function tt(t){let n=1===(e=arguments).length?[e[0]]:Array.apply(null,e);var e;return n.shift(),t.replace(/{(\d+)}/g,(t,e)=>Object(F.a)(Object(O.a)("Undefined",n[e]))?n[e]:t)}var nt=Object(r.default)(function(t,n){return Object.prototype.hasOwnProperty.call(n,t)}),et=Object(r.default)(function(t,n){return t in n}),rt=e(10);function ut(t){return t}var ot=e(15),ct=e(21),it=e(16);function ft(t){return Object(B.a)(t)&&Object(U.default)(t,Object(K.a)(t))}var at=t=>J(new Date)(t)<0,lt=Object(O.a)("Map"),st=e(18),dt=Object(O.a)("null"),pt=e(13),bt=e(11),ht=Object(O.a)("Set"),vt=e(22),Ot=Object(O.a)("undefined");function jt(t){return Object(it.a)(t)&&isFinite(t.valueOf())}let yt=function(t){return this._value=t,this};yt.prototype.isJust=function(){return!0},yt.prototype.isNothing=function(){return!1};var _t=yt,gt=Object(r.default)(function(t){return t.keys()}),mt=Object(r.default)(function(t){switch(Object(M.a)(t)){case"Map":return gt(t);default:return Object(V.a)(t)}}),wt=Object(r.default)(function(t){const n=[];for(const e in t)n.push(e);return n}),Mt=Object(v.a)(function(t){return t&&t.length?t[t.length-1]:void 0}),xt=Object(r.default)(function(t,n){return n>t?n:t});let Pt=function(){};Pt.prototype.isJust=function(){return!1},Pt.prototype.isNothing=function(){return!0};var At=Pt;let St=function(t){this.__value=t};St.of=function(t){return t instanceof St?t:this instanceof St?(this.__value=t,this):new St(t)},St.prototype.getOrElse=function(t){return this.isNothing()?t:this.__value},St.prototype.map=function(t){return this.isNothing()?St.of(null):St.of(t(this.__value))},St.prototype.ap=function(t){return t.map(this.__value)},St.prototype.isNothing=function(){return null==this.__value},St.prototype.isJust=function(){return!this.isNothing()},St.prototype.Nothing=function(){return new At},St.prototype.Just=function(){return new _t(this._value)};var Ct=St,kt=Object(r.default)(function(t,n){return Array.from(new Set(t.concat(n)))});const Nt=Object(r.default)((t,n)=>{let e=Object.assign({},t);if(Object(rt.a)(t,n))return Object.assign({},t);for(let r in n){if(!Object.prototype.hasOwnProperty.call(n,r))continue;const u=n[r],o=t[r];Object(bt.a)(u)&&Object(bt.a)(o)?e[r]=Nt(u,o):Object(ot.a)(o)?e[r]=kt(o,u):e[r]=u}return e});var Rt=Nt,Dt=Object(r.default)(function(t,n){return+t*+n}),Ft=Object(r.default)((t,n)=>{let e={};return Object.keys(t).filter(t=>-1===n.indexOf(t)).forEach(n=>{e[n]=t[n]}),e}),Et=e(20),zt=Object(r.default)(function(t,n){let e,r=n,u=0;for(;ut/864e5,Ut=t=>t/36e5,Bt=t=>t/6e4,Wt=t=>t/1e3;function Ht(t){return!1!==t&&Object(B.a)(t)}var Vt=Object(v.a)(function(t){const n=Object(V.a)(t),e=n.length,r=[];let u=0;for(;u{for(let e in t)if(Object(i.a)(O(t[e],n[e])))return!1;for(let e in n)if(Object(i.a)(Object(u.a)(t[e]))&&Object(u.a)(n[e]))return!1;return!0}),O=n.default=Object(r.default)(function(t,n){return!!Object(o.a)(t,n)||Object(c.a)(t)===Object(c.a)(n)&&(!Object(f.a)(Object(i.a)(Object(u.a)(t)),Object(i.a)(Object(u.a)(n)))&&(t.constructor===n.constructor&&(Object(p.a)(t)||Object(s.a)(t)||Object(d.a)(t)||Object(b.a)(t)?Object(o.a)(t.valueOf(),n.valueOf()):Object(l.a)(t)?h(t,n):!!Object(a.a)(t)&&v(t,n))))})},function(t,n,e){"use strict";e.d(n,"a",function(){return o});var r=e(13),u=e(14);function o(t){return Object(u.a)(Object(r.a)(t),isNaN(t))}},function(t,n,e){"use strict";var r=e(0);n.a=Object(r.default)(function(t,n){let e=-1;const r=n.length,u=new Array(r);for(;++e1&&void 0!==arguments[1]?arguments[1]:i.default;return O.of(this).map(n(t))},O.concat=(0,r.default)(function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.default;return O.of(t).map(e(n))}),O.prototype.empty=function(){return O.of(this).map(f.default)},O.empty=(0,r.default)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=(0,d.default)(t,n);return O.of(e).map(f.default)}),O.prototype.identity=function(){return O.of(l.default).ap(this)},O.identity=function(t,n){var e=(0,d.default)(t,n);return O.of(l.default).ap(e)},O.prototype.combine=function(t){return O.of(this).concat(O.of(t),i.default)},O.combine=function(t,n){return O.of(t).concat(O.of(n),i.default)},O.prototype.dot=function(t){return O.of(this).concat(O.of(t),(0,a.default)(this.precision))},O.dot=function(t,n){return O.of(t).dot(O.of(n))},O.prototype.fill=function(t){return O.of(this).map((0,u.default)(function(n){return t(n)}))},O.prototype.zeros=function(){return O.of(this).fill(function(t){return 0})},O.zeros=function(t,n){var e=(0,d.default)(t,n);return O.of(e).fill(function(t){return 0})},O.prototype.ones=function(){return O.of(this).fill(function(t){return 1})},O.ones=function(t,n){var e=(0,d.default)(t,n);return O.of(e).fill(function(t){return 1})},O.prototype.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1};return O.of(this).fill(t)},O.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1},n=arguments[1],e=arguments[2],r=(0,d.default)(n,e);return O.of(r).fill(t)},O.prototype.toArray=function(){return this.__value.map(function(t){return t.map(function(t){return t})})},O.prototype.clone=function(){return O.fromArray(this.__value)},O.fromArray=function(t){return O.of((0,u.default)(function(t){return(0,u.default)(function(t){return t})(t)})(t))},O.prototype.transpose=function(){return O.of((0,o.default)(s.default,[],this.__value))},O.transpose=function(t){return O.of(t).transpose()},O.prototype.add=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot add");return this.map(function(n,e){return(0,u.default)(function(n,r){return n+t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n+t}))},O.prototype.subtract=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot subtract");return this.map(function(n,e){return(0,u.default)(function(n,r){return n-t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n-t}))},O.prototype.multiply=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw console.log("Use static method 'dot' to do matrix multiplication"),new Error("Matrices do not match, cannot create hadamard product");return this.map(function(n,e){return(0,u.default)(function(n,r){return n*t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n*t}))},O.prototype.additiveinverse=function(){return O.of(this).multiply(-1)},O.prototype.hadamard=function(t){return O.of(this).multiply(t)},O.prototype.lu=function(){for(var t=this.getRows(),n=this.clone(),e=this.zeros(),r=this.zeros(),u=0;u-1;--l){for(var s=0,d=l+1;d1&&void 0!==arguments[1]?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=n||t,o=(0,r.map)(function(t){return e})(new Array(u));return(0,r.map)(function(t){return o})(new Array(t))},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e){return t.createKernel(n).setOutput([e.length,e[0].length])(e)},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e,r){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};return t.createKernel(n,{constants:Object.assign({},{m:r.length,n:r[0].length},u)}).setOutput(e)(r)},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e,r,u){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};return t.createKernel(n,{constants:Object.assign({},{m:u.length,n:r[0].length},o)}).setOutput(e)(r,u)},t.exports=n.default}])}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL19wcml2YXRlL2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbm90LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvYWRkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWRqdXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3RXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbGwuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbFBhc3MuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbnlQYXNzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXBwbHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbGlmdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ib3RoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jYWxsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wbGVtZW50LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvZGlmZkRhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9kaXZpZGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vRi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmlyc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZsYXRNYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9mb3JtYXRTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L3RvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL2lzRnV0dXJlRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udWxsL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zZXQvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc1ZhbGlkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tb25hZHMvSnVzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2xhc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL211bHRpcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ULmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvRGF5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvSG91ci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b01pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9TZWNvbmRzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pc05hbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9kb3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3JvdW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9nZW5lcmF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZ3B1bWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVmb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVwcm9kdWN0LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJ0aGlzIiwiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImN1cnJ5IiwiZnVuIiwiYXJnc2xlbiIsImxlbmd0aCIsImNyZWF0ZVJlY3Vyc2VyIiwiYWNjIiwiYXJncyIsIl9hY2MiLCJjb25jYXQiLCJhcHBseSIsInJlY3Vyc2UiLCJBcnJheSIsInNsaWNlIiwiYXJndW1lbnRzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jdXJyeV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fIiwiX3R5cGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyIsIkN0b3IiLCJ2YWwiLCJfcHJpdmF0ZV9jdXJyeTFfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyIsIngiLCJ0b1N0cmluZyIsImN1cnJ5MSIsImZuIiwiYSIsImV4aXN0cyIsImVtcHR5IiwiY29uc3RydWN0b3IiLCJrZXlzIiwib2JqZWN0X21hcCIsImNiIiwiayIsIm1hcF9tYXAiLCJmb3JFYWNoIiwidiIsIm1hcCIsInNldCIsInN0cmluZ19tYXAiLCJjaGFyQXQiLCJpdGVyYXRvcl9tYXAiLCJjYWxsYmFjayIsIml0ZXJhdG9yIiwibmV4dFZhbHVlIiwibmV4dCIsImRvbmUiLCJwdXNoIiwiaXNGdW5jdGlvbiIsImlzIiwidHlwZSIsImFycmF5X21hcCIsIm9iamVjdF9mb2xkIiwiaW5pdCIsImFycmF5X2ZvbGQiLCJfbnVtYmVyX2lzTmFuX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18iLCJ5IiwiX2lzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18iLCJzcmNfYXBlcnR1cmUiLCJyZXMiLCJzcmNfbWFwIiwiaXRlbSIsImlkeCIsImFkZCIsImIiLCJhZGRJbmRleCIsImYiLCJnIiwiYWRqdXN0Iiwic3JjX2FkanVzdFdpdGgiLCJwcmVkIiwic3JjX2FsbCIsImFsbFBhc3MiLCJjYnMiLCJhbHdheXMiLCJhbnkiLCJhbnlQYXNzIiwic3JjX2FwIiwiZm5zIiwidmFscyIsImFwIiwiZm9sZCIsImFycmF5X2NvbmNhdCIsImNvbmNhdF9jb25jYXQiLCJTdHJpbmciLCJzcmNfY29uY2F0Iiwic3JjX2FwcGVuZCIsImVsIiwibGlzdCIsInNyY19iaW5hcnkiLCJjb250ZXh0Iiwic3JjX2xpZnQiLCJsaWZ0ZWQiLCJzcmNfZm9sZCIsImJvb2xlYW5fYm90aCIsImZuMSIsImZuMiIsImFuZCIsInNyY19jb21wbGVtZW50Iiwibm90IiwiY29tcG9zZSIsInJlc3VsdCIsImNvbmQiLCJjb25kcyIsImRlZmF1bHRUbyIsImRpZmZEYXRlIiwic3RhcnQiLCJlbmQiLCJEYXRlIiwiZ2V0VGltZSIsImRpdmlkZSIsIkYiLCJhcnJheV9maWx0ZXIiLCJvYmplY3RfZmlsdGVyIiwibWFwX2ZpbHRlciIsIk1hcCIsIml0IiwiZW50cmllcyIsInNyY19maWx0ZXIiLCJmaW5kSW5kZXgiLCJmaXJzdCIsInVuZGVmaW5lZCIsImZsYXRNYXBfaXNGdW5jdGlvbiIsInNyY19mbGF0TWFwIiwiZmxhdE1hcCIsImZvcm1hdFN0cmluZyIsInN0ciIsInNoaWZ0IiwicmVwbGFjZSIsIm1hdGNoIiwiaGFzIiwicHJvcCIsIm9iaiIsImhhc0luIiwiaWRlbnRpdHkiLCJpc0VtcHR5IiwiZXF1YWxzIiwiaXNGdXR1cmVEYXRlIiwibWFwX2lzIiwibnVsbF9pcyIsInNldF9pcyIsInVuZGVmaW5lZF9pcyIsImlzVmFsaWQiLCJkYXRlX2lzIiwiaXNGaW5pdGUiLCJ2YWx1ZU9mIiwiSnVzdCIsIl92YWx1ZSIsImlzSnVzdCIsImlzTm90aGluZyIsIm1vbmFkc19KdXN0IiwibWFwX2tleXMiLCJzcmNfa2V5cyIsImtleXNJbiIsImxhc3QiLCJtYXgiLCJOb3RoaW5nIiwibW9uYWRzX05vdGhpbmciLCJNYXliZSIsIl9fdmFsdWUiLCJvZiIsImdldE9yRWxzZSIsIm1vbmFkc19NYXliZSIsInVuaW9uIiwiYUwiLCJhUiIsImZyb20iLCJTZXQiLCJtZXJnZSIsIm9iakwiLCJvYmpSIiwiYXNzaWduIiwiaWRlbnRpY2FsIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIm9iamVjdF9pcyIsImFycmF5X2lzIiwib2JqZWN0X21lcmdlIiwibXVsdGlwbHkiLCJvbWl0IiwibmFtZXMiLCJmaWx0ZXIiLCJpbmRleE9mIiwicGF0aCIsIk51bWJlciIsImlzSW50ZWdlciIsInBpY2siLCJwcm9wcyIsIm51bWJlcl9zdW0iLCJUIiwidG9EYXkiLCJ0b0hvdXIiLCJ0b01pbnV0ZXMiLCJ0b1NlY29uZHMiLCJ0cnV0aHkiLCJvYmplY3RfdmFsdWVzIiwiemlwV2l0aCIsImFyciIsImxlbiIsIk1hdGgiLCJtaW4iLCJzcmNfemlwIiwiYm9vbGVhbl9pcyIsImlzTmFuIiwibnVtYmVyX2lzIiwic3RyaW5nX2lzIiwib3IiLCJhcnJheV9lcXVhbHMiLCJzcmNfZXF1YWxzIiwib2JqZWN0X2VxdWFscyIsImtleVgiLCJrZXlZIiwiX2FuZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fIiwiaXNOYU4iLCJfY3VycnkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX21hcCIsIl9mb2xkIiwiX2VxdWFscyIsIl9jb25jYXQiLCJfZW1wdHkiLCJfZG90IiwiX2lkZW50aXR5IiwiX3RyYW5zcG9zZSIsIl9nZW5lcmF0ZSIsIl9ncHVtYXAiLCJfZ3B1Zm9sZCIsIl9ncHVwcm9kdWN0IiwiTWF0cml4IiwiR1BVSlMiLCJncHVqcyIsInByZWNpc2lvbiIsInNldFByZWNpc2lvbiIsImlzU3ltbWV0cmljIiwidHJhbnNwb3NlIiwiZGVmYXVsdCIsImlzU3F1YXJlIiwiZ2V0Q29scyIsImdldFJvd3MiLCJpc09ydGhvZ29uYWwiLCJBeEF0IiwiZG90IiwiSSIsIk0iLCJnZXRTaGFwZSIsIkEiLCJCIiwicm93cyIsImNvbHMiLCJjb21iaW5lIiwiZmlsbCIsInplcm9zIiwib25lcyIsInJhbmRvbSIsImUiLCJ0b0FycmF5Iiwicm93IiwiY29sIiwiY2xvbmUiLCJmcm9tQXJyYXkiLCJFcnJvciIsImpkeCIsInN1YnRyYWN0IiwiY29uc29sZSIsImxvZyIsImFkZGl0aXZlaW52ZXJzZSIsImhhZGFtYXJkIiwibHUiLCJMIiwiVSIsImFicyIsImoiLCJycmVmIiwibGVhZCIsInJlc3VsdE1hdHJpeCIsInRtcCIsInNvbHZlIiwiTFUiLCJpbnZlcnNlIiwicmVkdWNlIiwiaGFsZiIsInJhbmsiLCJkaW1lbnNpb24iLCJkaWFnIiwiZGlhZ3Byb2R1Y3QiLCJzdW0iLCJwcmV2Iiwia3JvbmVja2VyIiwicSIsImxlZnQiLCJyaWdodCIsImZyYW1lIiwiZ3B1TWFwIiwiZ3B1IiwiZ3B1Rm9sZCIsIm91dHB1dCIsImdwdVByb2R1Y3QiLCJfZnVuIiwiX3JvdW5kIiwiZGVjaW1hbHMiLCJyb3VuZCIsIl9jb2xzIiwieiIsIm1hdHJpeCIsImNyZWF0ZUtlcm5lbCIsInNldE91dHB1dCIsImNvbnN0YW50cyJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBQUEsRUFBQUMsR0FDQSxpQkFBQUMsU0FBQSxpQkFBQUMsT0FDQUEsT0FBQUQsUUFBQUQsSUFDQSxtQkFBQUcsZUFBQUMsSUFDQUQsT0FBQSx5QkFBQUgsR0FDQSxpQkFBQUMsUUFDQUEsUUFBQSx1QkFBQUQsSUFFQUQsRUFBQSx1QkFBQUMsSUFSQSxDQVNDLG9CQUFBSyxVQUFBQyxLQUFBLFdBQ0QsbUJDVEEsSUFBQUMsRUFBQSxHQUdBLFNBQUFDLEVBQUFDLEdBR0EsR0FBQUYsRUFBQUUsR0FDQSxPQUFBRixFQUFB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LEdBQUosR0FDcEUsT0FBT3NSLEVBQ0pXLGFBQWE5TyxFQUFHLENBQUVnUCxVQUFXdFUsT0FBTytMLE9BQU8sR0FBSSxDQUFFck0sRUFBRzBGLEVBQUUzRCxPQUFRVixFQUFHK0IsRUFBRSxHQUFHckIsUUFBVTZTLEtBQ2hGRCxVQUFVVixFQUZORixDQUVjM1EsRUFBR3NDIiwiZmlsZSI6IkBhc3R1YW5heC9mdW5tYXRyaXgubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJAYXN0dWFuYXgvZnVubWF0cml4XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMjQpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogQGZ1bmN0aW9uIGN1cnJ5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5IChmdW4pIHtcbiAgY29uc3QgYXJnc2xlbiA9IGZ1bi5sZW5ndGhcblxuICBpZiAoYXJnc2xlbiA9PT0gMCkge1xuICAgIHJldHVybiBmdW5cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVjdXJzZXIoW10pXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoYWNjLCBhcmdzKSB7XG4gICAgY29uc3QgX2FjYyA9IGFjYy5jb25jYXQoYXJncylcbiAgICByZXR1cm4gX2FjYy5sZW5ndGggPCBhcmdzbGVuXG4gICAgICA/IGNyZWF0ZVJlY3Vyc2VyKF9hY2MpXG4gICAgICA6IGZ1bi5hcHBseSh0aGlzLCBfYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVjdXJzZXIgKGFjYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVjdXJzZShhY2MsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIFZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudFxuICpcbiAqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaXMgKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdHlwZSh2YWwpID09PSBDdG9yXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gd2l0aCBhcml0eSAxXG4gKiBAZnVuY3Rpb24gY3VycnkxXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIHYxLjAuMlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeTEgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkIChhKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgID8gdGhpc1xuICAgICAgOiBmbihhKVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBub3RcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG5vdCAoeCkge1xuICByZXR1cm4gIXhcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBleGlzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhpc3RzICh4KSB7XG4gIHJldHVybiAhKHggPT0gbnVsbClcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbXB0eSAoeCkge1xuICByZXR1cm4gbmV3IHguY29uc3RydWN0b3IoKVxufTtcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QoYSkpXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gb2JqZWN0IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHJldHVybiB7T2JqZWN0fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IGsgPSBrZXlzKGEpXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJba1tpXV0gPSBjYihhW2tbaV1dLCBrW2ldLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBNYXAgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7TWFwfSBhXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIGEuZm9yRWFjaCgodiwgaywgbWFwKSA9PiB7XG4gICAgci5zZXQoaywgY2IodiwgaywgbWFwKSlcbiAgfSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIHN0cmluZyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSAnJ1xuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgKz0gY2IoYS5jaGFyQXQoaSksIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJdGVyIChpdGVyKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSlcbn1cbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIGl0ZXJhYmxlIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggbWFwcyBvdmVyIGFuIGl0ZXJhYmxlLlxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gYiAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL2FycmF5L21hcCdcbmltcG9ydCBvYmplY3RNYXAgZnJvbSAnLi9vYmplY3QvbWFwJ1xuaW1wb3J0IG1hcE1hcCBmcm9tICcuL21hcC9tYXAnXG5pbXBvcnQgc3RyaW5nTWFwIGZyb20gJy4vc3RyaW5nL21hcCdcbmltcG9ydCBpdGVyYXRvck1hcCBmcm9tICcuL2l0ZXJhdG9yL21hcCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3IvaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdE1hcChjYiwgYSlcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcE1hcChjYiwgYSlcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlNYXAoY2IsIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0l0ZXJhdG9yKGEpXG4gICAgICAgID8gaXRlcmF0b3JNYXAoY2IsIGEpXG4gICAgICAgIDogYXJyYXlNYXAoY2IsIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gYXBlcnR1cmVcbiAqIEBwYXJhbSBuXG4gKiBAcGFyYW0gYXJyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBlcnR1cmUgKG4sIGEpIHtcbiAgaWYgKGEubGVuZ3RoIDwgbikge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IHJlcyA9IEFycmF5KGEubGVuZ3RoIC0gbiArIDEpXG4gIHJldHVybiBtYXAoKGl0ZW0sIGlkeCkgPT4gYS5zbGljZShpZHgsIGlkeCArIG4pLCByZXMpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uIGFkZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgcmV0dXJuICthICsgK2Jcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhZGRJbmRleFxuICogQHN1bW1hcnkgQWRkcyBhIHNwZWNpZmllZCBpbmRleCB0byBpdGVyYXRlIGEgY29sbGVjdGlvblxuICogQGRlc2NyaXB0aW9uIFRoZSBhZGRJbmRleCBmdW5jdGlvbiBpcyBub3RuZWNlc3NhcnkgZm9yIHRoZSBtYXAgZnVuY3Rpb25zIGluIHRoZSBmdW4uanMgbGlicmFyeSBhcyB0aGV5IGJlaGF2ZSB0aGUgc2EsZSBhcyB0aGUgbmF0aXZlIGphdmFzY3JpcHQgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIEZ1bmN0aW9uIHRvIHdoaWNoIHRvIGFkZCB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7QXJyYXl9IGEgVGhlIGFycmF5IG9uIHdoaWNoIHRvIHdvcmtcbiAqIEBzaW5jZSAxLjAuMlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkSW5kZXggKGYsIGcsIGEpIHtcbiAgbGV0IGkgPSAwXG4gIHJldHVybiBmKFxuICAgIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gZyh2LCBpKyspXG4gICAgfSxcbiAgICBhXG4gIClcbn0pXG4iLCIvKipcbiAqIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGFkanVzdFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+IG51bSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRvIG1vZGlmeSB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gKiBAcGFyYW0ge051bWJlcn0gaSAtIFRoZSBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkgdGhlIGFycmF5LCBhY2NlcHRzIHBvc3RpdGl2ZSBhbmQgbmVnYXRpdmUgaW5kZXhlc1xuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdIC0gQXJyYXkgd2l0aCBkYXRhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0IChmbiwgaSwgYSkge1xuICBjb25zdCByID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSlcbiAgY29uc3QgaWR4ID0gaSA8IDAgPyByLmxlbmd0aCArIGkgOiBpXG4gIGlmICghYVtpZHhdKSByZXR1cm4gclxuICByW2lkeF0gPSBmbihyW2lkeF0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RXaXRoXG4gKiBAZGVzY3JpcHRpb24gTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYSkgLT4gKChhIC0+IFthXSkgLT4gW2FdIC0+IG51bSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIFRoZSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRoZSBpbmRleGVzIGlmIGZvdW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBbYV1cbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0V2l0aCAoZm4sIHByZWQsIGEpIHtcbiAgY29uc3QgX2ZuID0geCA9PiB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJldHVybiBmbih4KVxuICAgIH1cbiAgICByZXR1cm4geFxuICB9XG4gIHJldHVybiBtYXAoX2ZuLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbGxcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbCAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IHRydWVcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKCFjYihhW2ldKSkge1xuICAgICAgcmVzID0gZmFsc2VcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICpcbiAqIEBmdW5jdGlvbiBhbGxQYXNzXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBwYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbFBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghY2JzW2ldKGEpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gYWx3YXlzXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbHdheXMgKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHggfVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uIG9mIHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGFueVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoVE9ETylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueSAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IGZhbHNlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmIChjYihhW2ldKSkge1xuICAgICAgcmVzID0gdHJ1ZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIG9uZSBwYXNzZXNcbiAqXG4gKiBAZnVuY3Rpb24gYW55UGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uKSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBwcmVkaWNhdGVzIEFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY29tYmluZWQgcHJlZGljYXRlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW55UGFzcyAoY2JzLCBhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNic1tpXShhKSkgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKlxuICogQGZ1bmN0aW9uIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJldHVybnMgYSBjb21iaW5lZCByZXN1bHQgYXJyYXlcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAcGFyYW0geyhGdW5jdGlvbltdfEZ1bmN0aW9ufEFwcGxpY2F0aXZlKX0gZm5zIC0gQW4gYXJyYXkgb2YgZnVuY3Rpb25zIG9yIGEgZnVuY3Rpb24gb3IgYW4gYXBwbGljYXRpdmVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHMgLSBBbiBhcnJheSBvZiB2YWx1ZXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG1hcCBmcm9tICcuL2FycmF5L21hcCdcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwIChmbnMsIHZhbHMpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm5zLmFwKSkge1xuICAgIHJldHVybiBmbnMuYXAodmFscylcbiAgfVxuICBpZiAoaXNGdW5jdGlvbihmbnMpKSB7XG4gICAgcmV0dXJuIHggPT4gZm5zKHgpKHZhbHMoeCkpXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgZikgPT4gYWNjLmNvbmNhdChtYXAoY3VycnkxKGYpLCB2YWxzKSksIFtdLCBmbnMpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGFycmF5Q29uY2F0XG4gKiBAcGFyYW0gYTFcbiAqIEBwYXJhbSBhMlxuICogQHJldHVybnMge1RbXX1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoYSwgYilcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gc3RyaW5nQ29uY2F0XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIHJldHVybiBTdHJpbmcoYSkgKyBTdHJpbmcoYilcbn1cbiIsIi8qKlxuICogQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqIEBzaW5jZSB2MS4wLjRcbiAqIEBwYXJhbSB7YX0gYSAtIExlZnQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHBhcmFtIHthfSBiIC0gcmlnaHQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHJldHVybiB7YX0gQ29uY2F0ZW5hdGVkIGl0ZW1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlDb25jYXQgZnJvbSAnLi9hcnJheS9jb25jYXQnXG5pbXBvcnQgc3RyaW5nQ29uY2F0IGZyb20gJy4vc3RyaW5nL2NvbmNhdCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ1N0cmluZyc6IHN0cmluZ0NvbmNhdCxcbiAgICAnQXJyYXknOiBhcnJheUNvbmNhdFxuICB9XG4gIHJldHVybiB0eXBlTWFwW3R5cGUoYSldKGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwZW5kXG4gKiBAZGVzY3JpcHRpb24gQXBwZW5kIGFuIGVsbWVudCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7Kn0gZWwgLSBFbGVtZW50IHRvIGFkZCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgLSBMaXN0IHRvIHdoaWNoIHRvIGFkZCB0aGUgZWxlbWVudFxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGwgPSBbMCwgMV1cbiAqIGFwcGVuZCgnYScsIGwpIC8vIHJldXRuciBbMCwgMSwgJ2EnXVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwZW5kIChlbCwgbGlzdCkge1xuICByZXR1cm4gY29uY2F0KGxpc3QsIFsgZWwgXSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQGRlc2NyaXB0aW9uIFRoZSBhcHBseSgpIG1ldGhvZCBjYWxscyBhIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBhbiBhcnJheSwgYW5kIHRoZSBmdW5jdGlvbiBhcyBjb250ZXh0LlxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBhcHBseShmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykubWFwKHggPT4geCAqIDIpXG4gKiAgIH0pXG4gKiBhKFsxLCAyLCAzXSlcbiAqIC8vIFsyLCA0LCA2XVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwbHkgKGZuLCBhcmdzKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgYXJncylcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBiaW5hcnlcbiAqIEBwYXJhbSBjYlxuICogQHJldHVybnMge2Z1bmN0aW9uKCo9LCAqPSk6ICp9XG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGJpbmFyeSAoY2IpIHtcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGNiKGEsIGIpXG4gIH0pXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbi8qKlxuICogQGZ1bmN0aW9uIGJpbmRcbiAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0XG4gKiBAcGFyYW0ge2Z1bmN0aW9uIH1mblxuICogQHBhcmFtIHsqfSBjb250ZXh0XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYmluZCAoZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY29udGV4dClcbn0pXG4iLCIvKipcbiAqIFwibGlmdHNcIiBhIGZ1bmN0aW9uIG9mIGFyaXR5ID4gMSBzbyB0aGF0IGl0IG1heSBcIm1hcCBvdmVyXCIgYSBsaXN0LCBGdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+IChbKl0uLi4gLT4gWypdKVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGFwIGZyb20gJy4vYXAnXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBsaWZ0IChmbikge1xuICBjb25zdCBsaWZ0ZWQgPSBjdXJyeTEoY3VycnkoZm4pKVxuICByZXR1cm4gY3VycnkoZnVuY3Rpb24gX2xpZnQgKCkge1xuICAgIHJldHVybiBmb2xkKGFwLCBtYXAobGlmdGVkLCBhcmd1bWVudHNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICB9KVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYm90aCBwcmVkaWNhdGVzIHJldHVybiB0cnVlXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjEgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMiBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBsaWZ0IGZyb20gJy4uL2xpZnQnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYm90aCAoZm4xLCBmbjIpIHtcbiAgcmV0dXJuIGlzKCdGdW5jdGlvbicpKGZuMSlcbiAgICA/IGZ1bmN0aW9uIF9ib3RoICgpIHsgcmV0dXJuIGZuMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmIGZuMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICA6IGxpZnQoYW5kKShmbjEsIGZuMilcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gZm5cbiAqIEByZXR1cm5zIHsqfVxuICovXG4vLyBpbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNhbGwgKGZuKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBsZW1lbnRcbiAqIEBkZXNjcmlwdGlvbiBMaWZ0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgY29tcGxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBub3RcbiAqIEBzZWUgbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBpc05vdEVtcHR5ID0gY29tcGxlbWVudChpc0VtcHR5KVxuICogaXNOb3RFbXB0eShbXSkgLy8gZmFsc2VcbiAqIGlzTm90RW1wdHkoeydhJyA6IDF9KSAvLyB0cnVlXG4gKlxuICogY29tcGxlbWVudChNYXliZS5vZihmYWxzZSkpIC8vIHRydWVcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YodHJ1ZSkpIC8vIGZhbHNlXG4gKi9cbmltcG9ydCBsaWZ0IGZyb20gJy4vbGlmdCdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5cbmNvbnN0IGNvbXBsZW1lbnQgPSBsaWZ0KG5vdClcbmV4cG9ydCBkZWZhdWx0IGNvbXBsZW1lbnRcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBvc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigpOiAqfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlICgpIHtcbiAgbGV0IGZucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcblxuICByZXR1cm4gZnVuY3Rpb24gX2NvbXBvc2UgKCkge1xuICAgIGxldCBpbml0ID0gZm5zW2Zucy5sZW5ndGggLSAxXVxuICAgIGxldCByZXN1bHQgPSBbaW5pdC5hcHBseShpbml0LCBhcmd1bWVudHMpXVxuICAgIGxldCBpID0gZm5zLmxlbmd0aCAtIDJcblxuICAgIGZvciAoaTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IGZuID0gZm5zW2ldXG5cbiAgICAgIHJlc3VsdCA9IFtmbi5hcHBseShmbiwgcmVzdWx0KV1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXVxuICB9XG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29uZFxuICogQHBhcmFtIGNvbmRzXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmQgKGNvbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29uZHNbaV1bMF0odmFsdWUpKSByZXR1cm4gY29uZHNbaV1bMV0odmFsdWUpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBkZWZhdWx0VG9cbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGVmYXVsdFRvIChkLCB2KSB7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB2ID09IG51bGwgfHwgdiAhPT0gdiA/IGQgOiB2XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZGlmZkRhdGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBkYXRlcyBpbiBtaWxsaXNlY29uZFxuICogQHBhcmFtIHtEYXRlfSBzdGFydCAtIFN0YXJ0IGRhdGVcbiAqIEBwYXJhbSB7RGF0ZX0gZW5kIC0gRW5kIGRhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gUkV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kc1xuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpZmZEYXRlIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiAobmV3IERhdGUoc3RhcnQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGVuZCkuZ2V0VGltZSgpKVxufSlcbiIsIi8qKlxuICpcbiAqXG4gKiBAZnVuY3Rpb24gZGl2aWRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGl2aXNpb24gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGl2aWRlIChhLCBiKSB7XG4gIHJldHVybiArYSAvICtiXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIEZcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyhmYWxzZSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFycmF5RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcnJheUZpbHRlciAoZm4sIGEpIHtcbiAgdmFyIHIgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZm4oYVtpXSkpIHIucHVzaChhW2ldKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb2JqZWN0RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvYmplY3RGaWx0ZXIgKGZuLCBvKSB7XG4gIGxldCByID0ge31cbiAgY29uc3QgayA9IGtleXMobylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKG9ba1tpXV0pKSByW2tbaV1dID0gb1trW2ldXVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwRmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXBGaWx0ZXIgKGZuLCBtKSB7XG4gIGxldCByID0gbmV3IE1hcCgpXG5cbiAgbGV0IGl0ID0gbS5lbnRyaWVzKClcbiAgbGV0IHJlc3VsdCA9IGl0Lm5leHQoKVxuXG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBrID0gcmVzdWx0LnZhbHVlWzBdXG4gICAgY29uc3QgdiA9IHJlc3VsdC52YWx1ZVsxXVxuICAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgICByZXN1bHQgPSBpdC5uZXh0KClcbiAgfVxuXG4gIC8vIExpbWl0ZWQgYnJvd3NlciBzdXBwb3J0XG4gIC8vIG0uZm9yRWFjaCgodiwgaykgPT4ge1xuICAvLyAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgLy8gfSlcblxuICAvLyBiYWJlbCB0cmFuc3BpbGUgaXNzdWVzXG4gIC8vIGZvciAoY29uc3QgW2ssIHZdIG9mIG0uZW50cmllcygpKSB7XG4gIC8vXG4gIC8vIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaWx0ZXJcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdWNudGlvbiB0aGF0IGZpbHRlcnMgT2JqZWN0cywgQXJyYXlzIGFuZCBNYXBzXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL2FycmF5L2ZpbHRlcidcbmltcG9ydCBvYmplY3RGaWx0ZXIgZnJvbSAnLi9vYmplY3QvZmlsdGVyJ1xuaW1wb3J0IG1hcEZpbHRlciBmcm9tICcuL21hcC9maWx0ZXInXG4vLyBUT0RPXG4vLyBpbXBvcnQgc2V0RmlsdGVyIGZyb20gJy4uL3NldC9maWx0ZXInXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbHRlciAoZm4sIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgLy8gc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpIHtcbiAgICAvLyBjYXNlICdGdW5jdGlvbic6XG4gICAgLy8gICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgLy8gICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0RmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1N0cmluZyc6XG4gICAgLy8gICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwRmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1NldCc6XG4gICAgLy8gICByZXR1cm4gc2V0RmlsdGVyKGZuLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIoZm4sIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRJbmRleFxuICogQGRlc2NyaXB0aW9uIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGJvb2xlYW4pIC0+IFthXSAtPiBudW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gQW4gYXJyYXkgbGlrZSBvYmplY3RcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbmRJbmRleCAoZm4sIGEpIHtcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICBpZiAoZm4oYVtpXSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiAtMVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpcnN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYXJyID0gWzEsIDIsIDRdXG4gKiBmaXJzdChbMSwgMiwgNF0pIC8vIHJldHVybnMgMVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gZmlyc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhWzBdIDogdW5kZWZpbmVkXG59KVxuIiwiaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0J1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbi8qKlxuICogQGZ1bmN0aW9uIGZsYXRNYXBcbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmxhdE1hcCAoZm4sIGEpIHtcbiAgaWYgKGlzRnVuY3Rpb24oYSkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmbihhKHgpKSh4KVxuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihhLmZsYXRNYXApKSB7XG4gICAgcmV0dXJuIGEuZmxhdE1hcChmbilcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiBjb25jYXQoYWNjLCBmbih4KSksIGVtcHR5KGEpLCBhKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IHRvQXJyYXkgZnJvbSAnLi4vYXJyYXkvdG8nXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3RyaW5nIChzdHIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgbGV0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcblxuICBhcmdzLnNoaWZ0KClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFxcZCspfS9nLCAobWF0Y2gsIGlkeCkgPT4ge1xuICAgIHJldHVybiBub3QoaXMoJ1VuZGVmaW5lZCcsIGFyZ3NbaWR4XSkpID8gYXJnc1tpZHhdIDogbWF0Y2hcbiAgfSlcbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRvQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gYW4gYXJyYXlcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSB4IC0gT2JqZWN0IHRvIGNvbnZlcnQgdG8gYW4gYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvQXJyYXkoXCJzdHJpbmdcIilcbiAqIC8vIHJlc3VsdCA9IFsncycsJ3QnLCdyJywnaScsJ24nLCdnJ11cbiAqXG4gKiBmdW5jdGlvbiAoKSB7XG4gKiAgY29uc3QgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKVxuICogIGNvbnNvbGUubG9nKHR5cGVvZiBhcmdzKSAvLyBBcnJheVxuICogfVxuICpcbiAqKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvQXJyYXkgKHgpIHtcbiAgcmV0dXJuIHgubGVuZ3RoID09PSAxID8gW3hbMF1dIDogQXJyYXkuYXBwbHkobnVsbCwgeClcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzIChwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHksIGV2ZW4gaWYgaXQgaXMgaW5oZXJpdGVkXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIHtTdHJpbmd9IC0+IHtPYmplY3R9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBoYXNJbiAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBwcm9wIGluIG9ialxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSB2YWx1ZSBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZGVudGl0eSAoeCkge1xuICByZXR1cm4geFxufTtcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VtcHR5ICh4KSB7XG4gIHJldHVybiBleGlzdHMoeCkgJiYgZXF1YWxzKHgsIGVtcHR5KHgpKVxufTtcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDkvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IGRpZmZEYXRlIGZyb20gJy4vZGlmZkRhdGUnXG5cbmV4cG9ydCBkZWZhdWx0IChkKSA9PiB7XG4gIHJldHVybiBkaWZmRGF0ZShuZXcgRGF0ZSgpKShkKSA8IDBcbn1cbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTWFwJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdudWxsJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU2V0JylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCd1bmRlZmluZWQnKVxuIiwiLyoqXG4gKlxuICovXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQgKHgpIHtcbiAgLy8gbm9pbnNwZWN0aW9uIEpTQ2hlY2tGdW5jdGlvblNpZ25hdHVyZXNcbiAgcmV0dXJuIGlzRGF0ZSh4KSAmJiBpc0Zpbml0ZSh4LnZhbHVlT2YoKSlcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBKdXN0XG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJucyB7SnVzdH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgSnVzdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fdmFsdWUgPSB2YWxcbiAgcmV0dXJuIHRoaXNcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuSnVzdC5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgSnVzdFxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBNYXAgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIGEua2V5cygpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqXG4gKiBAZnVuY3Rpb24ga2V5c1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBpdGVyYXRvclxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBvYmogLT4gWypdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gT2JqIGZyb20gemhpY2ggdG8gdGFrZSB0aGUga2V5c1xuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBvYmplY3RLZXlzIGZyb20gJy4vb2JqZWN0L2tleXMnXG5pbXBvcnQgbWFwS2V5cyBmcm9tICcuL21hcC9rZXlzJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKG9iaikge1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwS2V5cyhvYmopXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RLZXlzKG9iailcbiAgfVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhbGwgdGhlIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIGNvbnN0IHIgPSBbXVxuICBmb3IgKGNvbnN0IGsgaW4gYSkge1xuICAgIHIucHVzaChrKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbGFzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVthLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXN0IG9mIHRoZSAyIGFyZ3VtZW50cyBwcm92aWRlZFxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1heCAoYSwgYikge1xuICByZXR1cm4gYiA+IGEgPyBiIDogYVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIE5vdGhpbmdcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbn1cblxuTm90aGluZy5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cbk5vdGhpbmcucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aGluZ1xuIiwiaW1wb3J0IEp1c3QgZnJvbSAnLi9KdXN0J1xuaW1wb3J0IE5vdGhpbmcgZnJvbSAnLi9Ob3RoaW5nJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBNYXliZVxuICogQHBhcmFtIHZhbFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBNYXliZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fX3ZhbHVlID0gdmFsXG59XG5cbk1heWJlLm9mID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgTWF5YmUpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXliZSkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXliZSh2YWwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gdGhpcy5pc05vdGhpbmcoKSA/IG4gOiB0aGlzLl9fdmFsdWVcbn1cblxuTWF5YmUucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIGlmICh0aGlzLmlzTm90aGluZygpKSB7XG4gICAgcmV0dXJuIE1heWJlLm9mKG51bGwpXG4gIH1cbiAgcmV0dXJuIE1heWJlLm9mKGYodGhpcy5fX3ZhbHVlKSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKG0pIHtcbiAgcmV0dXJuIG0ubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLl9fdmFsdWUgPT0gbnVsbClcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICF0aGlzLmlzTm90aGluZygpXG59XG5cbk1heWJlLnByb3RvdHlwZS5Ob3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KHRoaXMuX3ZhbHVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXliZVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdW5pb25BcnJheVxuICogQGRlc2NyaXB0aW9uIE1lcmdlcyAyIGFycmF5c1xuICogQHBhcmFtIHtBcnJheX0gYUwgLSBBcnJheSB0byBtZXJnZVxuICogQHBhcmFtIHtBcnJheX0gYVIgLSBBcnJheSB0byBtZXJnZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdW5pb25BcnJheShbMCwxLDJdLCBbMyw0LDVdKVxuICogLy8gcmVzdWx0ID0gWzAuMS4yLjMuNC41XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB1bmlvbkFycmF5IChhTCwgYVIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhTC5jb25jYXQoYVIpKSlcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi4vaWRlbnRpY2FsJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4uL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4uL2FycmF5L2lzJ1xuaW1wb3J0IHVuaW9uIGZyb20gJy4uL2FycmF5L3VuaW9uJ1xuXG5jb25zdCBtZXJnZSA9IGN1cnJ5KChvYmpMLCBvYmpSKSA9PiB7XG4gIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuXG4gIGlmIChpZGVudGljYWwob2JqTCwgb2JqUikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqUikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9ialIsIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IG9sZFZhbHVlID0gb2JqUltrZXldXG4gICAgY29uc3QgbmV3VmFsdWUgPSBvYmpMW2tleV1cblxuICAgIGlmIChpc09iamVjdChvbGRWYWx1ZSkgJiYgaXNPYmplY3QobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHVuaW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBvbGRWYWx1ZSAvLyBUT0RPOiB0aGlzIGlzIGEgcmVmZXJlbmNlLCBzaG91bGQgYmUgY2xvbmVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgMiBhcmd1bWVudHNcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtdWx0aXBseSAoYSwgYikge1xuICByZXR1cm4gK2EgKiArYlxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgob2JqLCBuYW1lcykgPT4ge1xuICBsZXQgcmVzdWx0ID0ge31cblxuICBPYmplY3Qua2V5cyhvYmopLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgfSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGF0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBhdGggKHBhdGgsIG9iaikge1xuICBsZXQgdmFsID0gb2JqXG4gIGxldCBpZHggPSAwXG4gIGxldCBwXG4gIHdoaWxlIChpZHggPCBwYXRoLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHAgPSBwYXRoW2lkeF1cbiAgICB2YWwgPSBOdW1iZXIuaXNJbnRlZ2VyKHApXG4gICAgICA/IHAgPCAwID8gdmFsW3ZhbC5sZW5ndGggKyBwXSA6IHZhbFtwXVxuICAgICAgOiB2YWxbcF1cbiAgICBpZHggKz0gMVxuICB9XG4gIHJldHVybiB2YWxcbn0pXG4vLyBsZXQgciA9IG9ialxuLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4vLyAgIGlmIChyID09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbi8vICAgciA9IHJbcGF0aFtpXV1cbi8vIH1cbi8vIHJldHVybiByXG4vLyB9KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGlja1xuICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBuZXcgYmplY3Qgd2l0aCBvbmx5IHRoZSBwcm9wcyB0aGF0IGFyZSBwcm92aWRlZFxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgLSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGljayAocHJvcHMsIG9iaikge1xuICBjb25zdCByID0ge31cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgcHJvcHMubGVuZ3RoKSB7XG4gICAgaWYgKHByb3BzW2ldIGluIG9iaikge1xuICAgICAgcltwcm9wc1tpXV0gPSBvYmpbcHJvcHNbaV1dXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcHJvcFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHByb3AgKHAsIG9iaikge1xuICByZXR1cm4gb2JqW3BdXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgaW4gYW4gYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgYWRkIGZyb20gJy4vYWRkJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi4vZm9sZCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gc3VtIChhKSB7XG4gIHJldHVybiBmb2xkKGFkZCwgMCwgYSlcbn0pXG4iLCIvKipcbiAqIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqXG4gKiBAZnVuY3Rpb24gVFxuICogQGRlc2NyaXB0aW9uIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgYWx3YXlzIGZyb20gJy4uL2Fsd2F5cydcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzKHRydWUpXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gODY0MDAwMDAgLy8gMjQqNjAqNjAqMTAwMCA9IDg2NDAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAzNjAwMDAwIC8vIDYwKjYwKjEwMDAgPSAzNjAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyA2MDAwMCAvLyA2MCoxMDAwID0gNjAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDEwMDBcclxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHJ1dGh5XG4gKi9cbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRydXRoeSAoeCkge1xuICByZXR1cm4gKHggIT09IGZhbHNlKSAmJiBleGlzdHMoeClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB2YWx1ZXNcbiAqIEBkZXNjcmlwdGlvbiBSRXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgdGFrZW4gZnJvbSBhbiBvYmplY3RzIG93biBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gLSBvYmogVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHZhbHVlc1xuICogQHJldHVybiB7YXJyYXl9XG4gKlxuICoqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiB2YWx1ZXMgKG9iaikge1xuICBjb25zdCBrID0ga2V5cyhvYmopXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gW11cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIHJbaV0gPSBvYmpba1tpXV1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuXG4gKiB6aXBXaXRoXG4gKlxuICogIEBmdW5jdGlvbiB6aXBXaXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXBXaXRoIChjYiwgYSwgYikge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIGxldCBpID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChjYihhW2ldLCBiW2ldKSlcbiAgfVxuICByZXR1cm4gYXJyXG59KVxuIiwiLyoqXG5cbiAqIHppcFxuICpcbiAqIEBmdW5jdGlvbiB6aXBcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgemlwV2l0aCBmcm9tICcuL3ppcFdpdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcCAoYSwgYikge1xuICByZXR1cm4gemlwV2l0aChmdW5jdGlvbiBfemlwV2l0aCAoeCwgeSkgeyByZXR1cm4gW3gsIHldIH0sIGEsIGIpXG59KVxuIiwiLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBfXyB9IGZyb20gJy4vX18nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcGVydHVyZSB9IGZyb20gJy4vYXBlcnR1cmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5U3BlYyB9IGZyb20gJy4vYXBwbHlTcGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVRvIH0gZnJvbSAnLi9hcHBseVRvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc2NlbmQgfSBmcm9tICcuL2FzY2VuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2MgfSBmcm9tICcuL2Fzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvY1BhdGggfSBmcm9tICcuL2Fzc29jUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xhbXAgfSBmcm9tICcuL2NsYW1wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBhcmF0b3IgfSBmcm9tICcuL2NvbXBhcmF0b3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VLIH0gZnJvbSAnLi9jb21wb3NlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVAgfSBmcm9tICcuL2NvbXBvc2VQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlV2l0aCB9IGZyb20gJy4vY29tcG9zZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdCB9IGZyb20gJy4vY29uc3RydWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3ROIH0gZnJvbSAnLi9jb25zdHJ1Y3ROJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb250YWlucyB9IGZyb20gJy4vY29udGFpbnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnZlcmdlIH0gZnJvbSAnLi9jb252ZXJnZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY291bnRCeSB9IGZyb20gJy4vY291bnRCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjIH0gZnJvbSAnLi9kZWMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlc2NlbmQgfSBmcm9tICcuL2Rlc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2UgfSBmcm9tICcuL2RpZmZlcmVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2VXaXRoIH0gZnJvbSAnLi9kaWZmZXJlbmNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlzc29jIH0gZnJvbSAnLi9kaXNzb2MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvY1BhdGggfSBmcm9tICcuL2Rpc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3AgfSBmcm9tICcuL2Ryb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0IH0gZnJvbSAnLi9kcm9wTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3RXaGlsZSB9IGZyb20gJy4vZHJvcExhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHMgfSBmcm9tICcuL2Ryb3BSZXBlYXRzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0c1dpdGggfSBmcm9tICcuL2Ryb3BSZXBlYXRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFdoaWxlIH0gZnJvbSAnLi9kcm9wV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVpdGhlciB9IGZyb20gJy4vZWl0aGVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlbmRzV2l0aCB9IGZyb20gJy4vZW5kc1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxQnkgfSBmcm9tICcuL2VxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxUHJvcHMgfSBmcm9tICcuL2VxUHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGV2b2x2ZSB9IGZyb20gJy4vZXZvbHZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kIH0gZnJvbSAnLi9maW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdCB9IGZyb20gJy4vZmluZExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRMYXN0SW5kZXggfSBmcm9tICcuL2ZpbmRMYXN0SW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsYXR0ZW4gfSBmcm9tICcuL2ZsYXR0ZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsaXAgfSBmcm9tICcuL2ZsaXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2ggfSBmcm9tICcuL2ZvckVhY2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2hPYmpJbmRleGVkIH0gZnJvbSAnLi9mb3JFYWNoT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZnJvbVBhaXJzIH0gZnJvbSAnLi9mcm9tUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwQnkgfSBmcm9tICcuL2dyb3VwQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwV2l0aCB9IGZyb20gJy4vZ3JvdXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndCB9IGZyb20gJy4vZ3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGd0ZSB9IGZyb20gJy4vZ3RlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNQYXRoIH0gZnJvbSAnLi9oYXNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoZWFkIH0gZnJvbSAnLi9oZWFkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpZkVsc2UgfSBmcm9tICcuL2lmRWxzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5jIH0gZnJvbSAnLi9pbmMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluY2x1ZGVzIH0gZnJvbSAnLi9pbmNsdWRlcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhCeSB9IGZyb20gJy4vaW5kZXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhPZiB9IGZyb20gJy4vaW5kZXhPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5pdCB9IGZyb20gJy4vaW5pdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5uZXJKb2luIH0gZnJvbSAnLi9pbm5lckpvaW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluc2VydCB9IGZyb20gJy4vaW5zZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnRBbGwgfSBmcm9tICcuL2luc2VydEFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9pbnRlcnNlY3Rpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc3BlcnNlIH0gZnJvbSAnLi9pbnRlcnNwZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50byB9IGZyb20gJy4vaW50bydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52ZXJ0IH0gZnJvbSAnLi9pbnZlcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydE9iaiB9IGZyb20gJy4vaW52ZXJ0T2JqJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZva2VyIH0gZnJvbSAnLi9pbnZva2VyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqb2luIH0gZnJvbSAnLi9qb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqdXh0IH0gZnJvbSAnLi9qdXh0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0SW5kZXhPZiB9IGZyb20gJy4vbGFzdEluZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbmd0aCB9IGZyb20gJy4vbGVuZ3RoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zIH0gZnJvbSAnLi9sZW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zSW5kZXggfSBmcm9tICcuL2xlbnNJbmRleCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1BhdGggfSBmcm9tICcuL2xlbnNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUHJvcCB9IGZyb20gJy4vbGVuc1Byb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxpZnROIH0gZnJvbSAnLi9saWZ0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHQgfSBmcm9tICcuL2x0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsdGUgfSBmcm9tICcuL2x0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW0gfSBmcm9tICcuL21hcEFjY3VtJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bVJpZ2h0IH0gZnJvbSAnLi9tYXBBY2N1bVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBPYmpJbmRleGVkIH0gZnJvbSAnLi9tYXBPYmpJbmRleGVkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRjaCB9IGZyb20gJy4vbWF0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hdGhNb2QgfSBmcm9tICcuL21hdGhNb2QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1heEJ5IH0gZnJvbSAnLi9tYXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVhbiB9IGZyb20gJy4vbWVhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVkaWFuIH0gZnJvbSAnLi9tZWRpYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lbW9pemVXaXRoIH0gZnJvbSAnLi9tZW1vaXplV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VBbGwgfSBmcm9tICcuL21lcmdlQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBMZWZ0IH0gZnJvbSAnLi9tZXJnZURlZXBMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBSaWdodCB9IGZyb20gJy4vbWVyZ2VEZWVwUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGggfSBmcm9tICcuL21lcmdlRGVlcFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGhLZXkgfSBmcm9tICcuL21lcmdlRGVlcFdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlTGVmdCB9IGZyb20gJy4vbWVyZ2VMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVJpZ2h0IH0gZnJvbSAnLi9tZXJnZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVdpdGggfSBmcm9tICcuL21lcmdlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZVdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1pbiB9IGZyb20gJy4vbWluJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW5CeSB9IGZyb20gJy4vbWluQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1vZHVsbyB9IGZyb20gJy4vbW9kdWxvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb3ZlIH0gZnJvbSAnLi9tb3ZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuQXJ5IH0gZnJvbSAnLi9uQXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuZWdhdGUgfSBmcm9tICcuL25lZ2F0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbm9uZSB9IGZyb20gJy4vbm9uZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoIH0gZnJvbSAnLi9udGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aEFyZyB9IGZyb20gJy4vbnRoQXJnJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvIH0gZnJvbSAnLi9vJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvYmpPZiB9IGZyb20gJy4vb2JqT2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9mIH0gZnJvbSAnLi9vZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb25jZSB9IGZyb20gJy4vb25jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb3RoZXJ3aXNlIH0gZnJvbSAnLi9vdGhlcndpc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG92ZXIgfSBmcm9tICcuL292ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhaXIgfSBmcm9tICcuL3BhaXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWwgfSBmcm9tICcuL3BhcnRpYWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWxSaWdodCB9IGZyb20gJy4vcGFydGlhbFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aXRpb24gfSBmcm9tICcuL3BhcnRpdGlvbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aEVxIH0gZnJvbSAnLi9wYXRoRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhPciB9IGZyb20gJy4vcGF0aE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoU2F0aXNmaWVzIH0gZnJvbSAnLi9wYXRoU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQWxsIH0gZnJvbSAnLi9waWNrQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQnkgfSBmcm9tICcuL3BpY2tCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZSB9IGZyb20gJy4vcGlwZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZUsgfSBmcm9tICcuL3BpcGVLJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlUCB9IGZyb20gJy4vcGlwZVAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVXaXRoIH0gZnJvbSAnLi9waXBlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGx1Y2sgfSBmcm9tICcuL3BsdWNrJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVwZW5kIH0gZnJvbSAnLi9wcmVwZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9qZWN0IH0gZnJvbSAnLi9wcm9qZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wRXEgfSBmcm9tICcuL3Byb3BFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcElzIH0gZnJvbSAnLi9wcm9wSXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BPciB9IGZyb20gJy4vcHJvcE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wcyB9IGZyb20gJy4vcHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BTYXRpc2ZpZXMgfSBmcm9tICcuL3Byb3BTYXRpc2ZpZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJhbmdlIH0gZnJvbSAnLi9yYW5nZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZUJ5IH0gZnJvbSAnLi9yZWR1Y2VCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlZCB9IGZyb20gJy4vcmVkdWNlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlUmlnaHQgfSBmcm9tICcuL3JlZHVjZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VXaGlsZSB9IGZyb20gJy4vcmVkdWNlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlamVjdCB9IGZyb20gJy4vcmVqZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmUgfSBmcm9tICcuL3JlbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwZWF0IH0gZnJvbSAnLi9yZXBlYXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGxhY2UgfSBmcm9tICcuL3JlcGxhY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNjYW4gfSBmcm9tICcuL3NjYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2V0IH0gZnJvbSAnLi9zZXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNsaWNlIH0gZnJvbSAnLi9zbGljZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydCB9IGZyb20gJy4vc29ydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydEJ5IH0gZnJvbSAnLi9zb3J0QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRXaXRoIH0gZnJvbSAnLi9zb3J0V2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXQgfSBmcm9tICcuL3NwbGl0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEF0IH0gZnJvbSAnLi9zcGxpdEF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEV2ZXJ5IH0gZnJvbSAnLi9zcGxpdEV2ZXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdFdoZW4gfSBmcm9tICcuL3NwbGl0V2hlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3RhcnRzV2l0aCB9IGZyb20gJy4vc3RhcnRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3VidHJhY3QgfSBmcm9tICcuL3N1YnRyYWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlIH0gZnJvbSAnLi9zeW1tZXRyaWNEaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhaWwgfSBmcm9tICcuL3RhaWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2UgfSBmcm9tICcuL3Rha2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0IH0gZnJvbSAnLi90YWtlTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3RXaGlsZSB9IGZyb20gJy4vdGFrZUxhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZVdoaWxlIH0gZnJvbSAnLi90YWtlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhcCB9IGZyb20gJy4vdGFwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZXN0IH0gZnJvbSAnLi90ZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aGVuIH0gZnJvbSAnLi90aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aHVua2lmeSB9IGZyb20gJy4vdGh1bmtpZnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRpbWVzIH0gZnJvbSAnLi90aW1lcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Mb3dlciB9IGZyb20gJy4vdG9Mb3dlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlycyB9IGZyb20gJy4vdG9QYWlycydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlyc0luIH0gZnJvbSAnLi90b1BhaXJzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvU3RyaW5nIH0gZnJvbSAnLi90b1N0cmluZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9VcHBlciB9IGZyb20gJy4vdG9VcHBlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhbnNkdWNlIH0gZnJvbSAnLi90cmFuc2R1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmF2ZXJzZSB9IGZyb20gJy4vdHJhdmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyaW0gfSBmcm9tICcuL3RyaW0nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyeUNhdGNoIH0gZnJvbSAnLi90cnlDYXRjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcHBseSB9IGZyb20gJy4vdW5hcHBseSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcnkgfSBmcm9tICcuL3VuYXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmN1cnJ5TiB9IGZyb20gJy4vdW5jdXJyeU4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuZm9sZCB9IGZyb20gJy4vdW5mb2xkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbldpdGggfSBmcm9tICcuL3VuaW9uV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gJy4vdW5pcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcUJ5IH0gZnJvbSAnLi91bmlxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFXaXRoIH0gZnJvbSAnLi91bmlxV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5sZXNzIH0gZnJvbSAnLi91bmxlc3MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubmVzdCB9IGZyb20gJy4vdW5uZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bnRpbCB9IGZyb20gJy4vdW50aWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VXaXRoIH0gZnJvbSAnLi91c2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXNJbiB9IGZyb20gJy4vdmFsdWVzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHZpZXcgfSBmcm9tICcuL3ZpZXcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZW4gfSBmcm9tICcuL3doZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlIH0gZnJvbSAnLi93aGVyZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmVFcSB9IGZyb20gJy4vd2hlcmVFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aG91dCB9IGZyb20gJy4vd2l0aG91dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgeHByb2QgfSBmcm9tICcuL3hwcm9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBPYmogfSBmcm9tICcuL3ppcE9iaidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkIH0gZnJvbSAnLi9udW1iZXIvYWRkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRJbmRleCB9IGZyb20gJy4vYWRkSW5kZXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkanVzdCB9IGZyb20gJy4vYWRqdXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3RXaXRoIH0gZnJvbSAnLi9hZGp1c3RXaXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGwgfSBmcm9tICcuL2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsUGFzcyB9IGZyb20gJy4vYWxsUGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWx3YXlzIH0gZnJvbSAnLi9hbHdheXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuZCB9IGZyb20gJy4vYW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnkgfSBmcm9tICcuL2FueSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55UGFzcyB9IGZyb20gJy4vYW55UGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXAgfSBmcm9tICcuL2FwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmQgfSBmcm9tICcuL2FwcGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHkgfSBmcm9tICcuL2FwcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5hcnkgfSBmcm9tICcuL2JpbmFyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluZCB9IGZyb20gJy4vYmluZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm90aCB9IGZyb20gJy4vYm9vbGVhbi9ib3RoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjYWxsIH0gZnJvbSAnLi9jYWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wbGVtZW50IH0gZnJvbSAnLi9jb21wbGVtZW50J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlIH0gZnJvbSAnLi9jb21wb3NlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uZCB9IGZyb20gJy4vY29uZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3VycnkgfSBmcm9tICcuL2N1cnJ5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWZhdWx0VG8gfSBmcm9tICcuL2RlZmF1bHRUbydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZkRhdGUgfSBmcm9tICcuL2RhdGUvZGlmZkRhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpdmlkZSB9IGZyb20gJy4vbnVtYmVyL2RpdmlkZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW1wdHkgfSBmcm9tICcuL2VtcHR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcXVhbHMgfSBmcm9tICcuL2VxdWFscydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXhpc3RzIH0gZnJvbSAnLi9leGlzdHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEYgfSBmcm9tICcuL2Jvb2xlYW4vRidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlsdGVyIH0gZnJvbSAnLi9maWx0ZXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRJbmRleCB9IGZyb20gJy4vZmluZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXJzdCB9IGZyb20gJy4vZmlyc3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZsYXRNYXAgfSBmcm9tICcuL2ZsYXRNYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvbGQgfSBmcm9tICcuL2ZvbGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvcm1hdFN0cmluZyB9IGZyb20gJy4vc3RyaW5nL2Zvcm1hdFN0cmluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzIH0gZnJvbSAnLi9vYmplY3QvaGFzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNJbiB9IGZyb20gJy4vb2JqZWN0L2hhc0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGljYWwgfSBmcm9tICcuL2lkZW50aWNhbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpdHkgfSBmcm9tICcuL2lkZW50aXR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpcyB9IGZyb20gJy4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJyYXkgfSBmcm9tICcuL2FycmF5L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jvb2xlYW4gfSBmcm9tICcuL2Jvb2xlYW4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRGF0ZSB9IGZyb20gJy4vZGF0ZS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNGdXR1cmVEYXRlIH0gZnJvbSAnLi9kYXRlL2lzRnV0dXJlRGF0ZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNNYXAgfSBmcm9tICcuL21hcC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOYW4gfSBmcm9tICcuL251bWJlci9pc05hbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdWxsIH0gZnJvbSAnLi9udWxsL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc051bWJlciB9IGZyb20gJy4vbnVtYmVyL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1NldCB9IGZyb20gJy4vc2V0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1N0cmluZyB9IGZyb20gJy4vc3RyaW5nL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc1ZhbGlkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKdXN0IH0gZnJvbSAnLi9tb25hZHMvSnVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5cyB9IGZyb20gJy4va2V5cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5c0luIH0gZnJvbSAnLi9vYmplY3Qva2V5c0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0IH0gZnJvbSAnLi9sYXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0IH0gZnJvbSAnLi9saWZ0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXAgfSBmcm9tICcuL21hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4IH0gZnJvbSAnLi9tYXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE1heWJlIH0gZnJvbSAnLi9tb25hZHMvTWF5YmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlIH0gZnJvbSAnLi9vYmplY3QvbWVyZ2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG11bHRpcGx5IH0gZnJvbSAnLi9udW1iZXIvbXVsdGlwbHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vdCB9IGZyb20gJy4vbm90J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOb3RoaW5nIH0gZnJvbSAnLi9tb25hZHMvTm90aGluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb21pdCB9IGZyb20gJy4vb2JqZWN0L29taXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yIH0gZnJvbSAnLi9vcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aCB9IGZyb20gJy4vb2JqZWN0L3BhdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tICcuL29iamVjdC9waWNrJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wIH0gZnJvbSAnLi9vYmplY3QvcHJvcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3VtIH0gZnJvbSAnLi9udW1iZXIvc3VtJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUIH0gZnJvbSAnLi9ib29sZWFuL1QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvRGF5IH0gZnJvbSAnLi9kYXRlL3RvRGF5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0hvdXIgfSBmcm9tICcuL2RhdGUvdG9Ib3VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b01pbnV0ZXMgfSBmcm9tICcuL2RhdGUvdG9NaW51dGVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlY29uZHMgfSBmcm9tICcuL2RhdGUvdG9TZWNvbmRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnV0aHkgfSBmcm9tICcuL3RydXRoeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHlwZSB9IGZyb20gJy4vdHlwZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tICcuL2FycmF5L3VuaW9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXMgfSBmcm9tICcuL29iamVjdC92YWx1ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcCB9IGZyb20gJy4vemlwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBXaXRoIH0gZnJvbSAnLi96aXBXaXRoJ1xuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdOdW1iZXInKVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKlxuICogQGZ1bmN0aW9uIGFuZFxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKHgsIHkpIC0+IGJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCAtIEEgcHJlZGljYXRlXG4gKiBAcGFyYW0geyp9IHkgLSBBIHByZWRpY2F0ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbmQgKHgsIHkpIHtcbiAgcmV0dXJuIHggJiYgeVxufSlcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IE9iamVjdCB0byB2ZXJpZml5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzQXJyYXkoWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IHRydWVcbiAqL1xuXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdBcnJheScpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnRGF0ZScpXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZXF1YWxzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiBmb3IgZGVlcCBjb21wYXJpc29uIG9mIGFycmF5c1xuICogQHBhcmFtIHthfSB4IC0gT2JqZWN0IHRvIGNvbXBhcmUgb2YgdHlwZSBhXG4gKiBAcGFyYW0ge2F9IHkgLSBPYmplY3QgeCB0byBjb21wYXJlIHdpdGggb2JqZWN0IHhcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFsc0FycmF5ICh4LCB5KSB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm90KGVxdWFscyh4W2ldLCB5W2ldKSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4uL2V4aXN0cydcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KCh4LCB5KSA9PiB7XG4gIGZvciAobGV0IGtleVggaW4geCkge1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VuZmlsdGVyZWRGb3JJbkxvb3BcbiAgICBpZiAobm90KGVxdWFscyh4W2tleVhdLCB5W2tleVhdKSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQga2V5WSBpbiB5KSB7XG4gICAgaWYgKG5vdChleGlzdHMoeFtrZXlZXSkpICYmIGV4aXN0cyh5W2tleVldKSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZXF1YWxzXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGVxdWFsaXR5IG9mIDIgaXRlbXNcbiAqIEBwYXJhbSB7Kn0geCAtIExlZnQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEBwYXJhbSB7Kn0geSAtIFJpZ2h0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBuYW4gPSBOdW1iZXIuTmFOXG4gKiBlcXVhbChuYW4sIG5hbikgLy8gcmV0dXJucyB0cnVlXG4gKlxuICogY29uc3QgYXJyMSA9IFswLCAxLCAyLCAzXVxuICogY29uc3QgYXJyMiA9IFtudWxsLCAxLCAyLCAzXVxuICogZXF1YWxzKGFycjEsIGFycjIpIC8vIHJldHVybnMgZmFsc2VcbiAqXG4gKiBlcXVhbHMobmV3IE9iamVjdCh7J2EnOiAwLCAnYic6IDF9KSwgeydhJzogMCwgJ2InOiAxfSkgLy8gdHJ1ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuL2lkZW50aWNhbCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5pbXBvcnQgb3IgZnJvbSAnLi9vcidcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vYXJyYXkvaXMnXG5pbXBvcnQgaXNCb29sZWFuIGZyb20gJy4vYm9vbGVhbi9pcydcbmltcG9ydCBpc051bWJlciBmcm9tICcuL251bWJlci9pcydcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL3N0cmluZy9pcydcbmltcG9ydCBpc0RhdGUgZnJvbSAnLi9kYXRlL2lzJ1xuaW1wb3J0IGVxdWFsc0FycmF5IGZyb20gJy4vYXJyYXkvZXF1YWxzJ1xuaW1wb3J0IGVxdWFsc09iamVjdCBmcm9tICcuL29iamVjdC9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFscyAoeCwgeSkge1xuICBpZiAoaWRlbnRpY2FsKHgsIHkpKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICh0eXBlKHgpICE9PSB0eXBlKHkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAob3Iobm90KGV4aXN0cyh4KSksIG5vdChleGlzdHMoeSkpKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHguY29uc3RydWN0b3IgIT09IHkuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZVxuXG4gIGlmIChpc1N0cmluZyh4KSB8fCBpc0Jvb2xlYW4oeCkgfHwgaXNOdW1iZXIoeCkgfHwgaXNEYXRlKHgpKSB7XG4gICAgcmV0dXJuIGlkZW50aWNhbCh4LnZhbHVlT2YoKSwgeS52YWx1ZU9mKCkpXG4gIH1cbiAgaWYgKGlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzQXJyYXkoeCwgeSlcbiAgfSBlbHNlIGlmIChpc09iamVjdCh4KSkge1xuICAgIHJldHVybiBlcXVhbHNPYmplY3QoeCwgeSlcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc05hTlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBudW1iZXIgaXMgTkFOXG5cbiAqL1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOYW4gKHgpIHtcbiAgcmV0dXJuIGFuZChpc051bWJlcih4KSwgaXNOYU4oeCkpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIGFuIGFycmF5IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChpZGVudGl0eSwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMCwyLDNdXG4gKiAgY29uc3QgYWRkMiA9IGFkZCgyKVxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChhZGQyLCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFsyLDQsNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBjb25zdCByID0gbmV3IEFycmF5KGwpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltpXSA9IGNiKGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBvbmUgb3IgdGhlIG90aGVyIGlzIHRydWVcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9yICh4LCB5KSB7XG4gIHJldHVybiB4IHx8IHlcbn0pXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTdHJpbmcnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgbWFwcGluZyBvdmVyIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgY2FsbGluZyBhbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtjYkZ1bmN0aW9ufSBjYiAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgaXRlbVxuICogQHBhcmFtIHsqfSBpbml0IC0gSW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gYSAtIEFycmF5IHdpdGggaXRlbXMgdG8gbW9kaWZ5IGJ5IHRoZSBjYiBmdW5jdGlvblxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYWxpYXMgcmVkdWNlXG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gZm9sZChhZGQsIDAsIFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSAzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2JGdW5jdGlvblxuICogQHBhcmFtIHsqfSByIC0gQWNjdW11bGF0b3Igd2hpY2ggYWNjdW11bGF0ZXMgdGhlIGNhbGxiYWNrJ3MgcmV0dXJuIHZhbHVlc1xuICogQHBhcmFtIHsqfSBpdGVtIC0gdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIHRoZSBpbmRleSBvZiB0aGUgaXRlbSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBUaGUgaW5pdGlhbCBhcnJheVxuICogQHJldHVybiB7Kn1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBsZXQgciA9IGluaXRcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2IociwgYVtpXSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnZnVuLmpzL3NyYy9lcXVhbHMnXG5pbXBvcnQgY29uY2F0IGZyb20gJ3V0aWwvY29uY2F0J1xuaW1wb3J0IGVtcHR5IGZyb20gJ3V0aWwvZW1wdHknXG5pbXBvcnQgZG90IGZyb20gJ3V0aWwvZG90J1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJ3V0aWwvaWRlbnRpdHknXG5pbXBvcnQgdHJhbnNwb3NlIGZyb20gJ3V0aWwvdHJhbnNwb3NlJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ3V0aWwvZ2VuZXJhdGUnXG5pbXBvcnQgZ3B1bWFwIGZyb20gJ3V0aWwvZ3B1bWFwJ1xuaW1wb3J0IGdwdWZvbGQgZnJvbSAndXRpbC9ncHVmb2xkJ1xuaW1wb3J0IGdwdXByb2R1Y3QgZnJvbSAndXRpbC9ncHVwcm9kdWN0J1xuXG4vKipcbiAqIEBjbGFzcyBNYXRyaXhcbiAqIEBjbGFzc2Rlc2MgTWF0cml4IGFwcGxpY2F0aXZlIHByb3ZpZGluZyBzdGFuZGFyZCBtYXRyaXggb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVGhlIE1hdHJpeCBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBuZXcga2V5d29yZC4gSW5zdGVhZCB1c2UgdGhlIE1hdHJpeC5vZiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IE1hdHJpeC4gVW5mb3J0dW5hdGx5IGpzZG9jcyBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGhpZGRlbi5cbiAqIEBoaWRlY29udHJ1Y3RvclxuICogQHNlZSBvZlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICpcbiAqL1xubGV0IE1hdHJpeCA9IGZ1bmN0aW9uICh2YWwsIEdQVUpTKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxuICBpZiAoR1BVSlMpIHtcbiAgICB0aGlzLmdwdWpzID0gR1BVSlMgfHwgbnVsbFxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG9mXG4gKiBAZGVzYyBDcmVhdGVzIGEgTWF0cml4IG9iamVjdCBhbmQgZmxhdHRlbnMgdGhlIE1hdHJpeFxuICogQHBhcmFtIHZhbCB7YXJyYXl8ZnVuY3Rpb259IEFuIGFycmF5IG9mIGFycmF5c1xuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbk1hdHJpeC5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hdHJpeCkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXRyaXgodmFsKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS50eXBlID09PSAnTWF0cml4J1xuICovXG5NYXRyaXgucHJvdG90eXBlLnR5cGUgPSAnTWF0cml4J1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcmVjaXNpb25cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnByZWNpc2lvbiA9PT0gNFxuICovXG5NYXRyaXgucHJvdG90eXBlLnByZWNpc2lvbiA9IDRcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc2V0UHJlY2lzaW9uXG4gKiBAcGFyYW0gcHJlY2lzaW9uIHtudW1iZXJ9IFNldCB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGZvciByb3VuZGluZ1xuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5zZXRQcmVjaXNpb24oMTApXG4gKiBtLnByZWNpc2lvbiA9PT0gMTBcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zZXRQcmVjaXNpb24gPSBmdW5jdGlvbiAocHJlY2lzaW9uKSB7XG4gIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3ltbWV0cmljXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1N5bW1ldHJpYygpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3ltbWV0cmljID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBhID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IGIgPSBNYXRyaXgudHJhbnNwb3NlKHRoaXMpLl9fdmFsdWVcbiAgcmV0dXJuIGVxdWFscyhhLCBiKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1NxdWFyZVxuICogQGRlc2MgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjb250YWlucyBhIHNxdWFyZSBNYXRyaXhcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3F1YXJlKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTcXVhcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5nZXRDb2xzKCksIHRoaXMuZ2V0Um93cygpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc09ydGhvZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1stMC4zMDkyLCAtMC45NTEwXSwgWy0wLjk1MTAsIDAuMzA5Ml1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiB0cnVlICA9PT0gQS5pc09ydGhvZ29uYWwoKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzT3J0aG9nb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgQXhBdCA9IHRoaXMuZG90KHRoaXMudHJhbnNwb3NlKCkpXG4gIGNvbnN0IEkgPSB0aGlzLmlkZW50aXR5KClcbiAgcmV0dXJuIGVxdWFscyhBeEF0LCBJKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRDb2xzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldENvbHMoKSAgPT09IDJcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Q29scyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZVswXS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZXF1YWxzXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gW1sxLCAxXSwgWzEsIDFdXVxuICogdmFyIEEgPSBNYXRyaXgub2YoYSlcbiAqIHZhciBCID0gTWF0cml4Lm9mKGEpXG4gKiB0cnVlICA9PT0gQS5lcXVhbHMoQilcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlIHx8IE0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFJvd3NcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Um93cygpICAvLyAyXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0U2hhcGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRTaGFwZSgpICAvLyBbMiwgMl1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRTaGFwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFt0aGlzLmdldFJvd3MoKSwgdGhpcy5nZXRDb2xzKCldXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBtLm1hcCh4ID0+IHgubWFwKHkgPT4geSsgMSkpXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKGYpKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0aGF0IG1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm1hcCh4PSA+IHgubWFwKHkgPT4geSsgMSksIFtbMSwgMV0sIFsxLCAxXV0pXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgubWFwID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZWR1Y2UgdGhlIG1hdHJpeCByb3dzIHVzaW5nIGEgcmVkdWNlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEEgcmVkdWNlL2ZvbGQgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEZsYXR0ZW4gTWF0cml4XG4gKiBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSkuZm9sZCgocHJldiwgbmV4dCkgPT4gcHJldi5jb25jYXQobmV4dCkpXG4gKiAvLyBbMSwgMSwgMSwgMV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKGYsIFtdKSh0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRvIHJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIE1hdHJpeCB0byByZWR1Y2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuXG4gKiAvLyBTdW0gb2YgYWxsIG1hdHJpeCB2YWx1ZXNcbiAqIGNvbnN0IHJlZHVjZXIgPSAocHJldiwgbmV4dCkgPT4gTnVtYmVyKHByZXYpICsgbmV4dC5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgeCwgMClcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXVxuICogTWF0cml4LmZvbGQocmVkdWNlciwgQSlcbiAqIC8vIDRcbiAqL1xuTWF0cml4LmZvbGQgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmZvbGQoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIE1hdHJpeCB0byBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZiA9IHggPT4geC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiBNYXRyaXgub2YoZikuYXAoTSlcbiAqIC8vIFtbNl0sIFsxNV0sIFsyNF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn1cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBNYXRyaXguYXAoZiwgW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbNywgOCwgOV1dKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXguYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKGYpLmFwKE0pXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMCwgMSwgMV0sIFsyLCAzLCA0XV1cbiAqIGNvbnN0IGIgPSBbWzIsIDIsIDJdLCBbMywgMywgM11dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKiBjb25zdCBNID0gQS5jb25jYXQoQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKE0sIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZihNKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgTWF0cmljZXMgdXNpbmcgYSBmdW5jdGlvbiBhcyBvcGVyYXRvclxuICogQHBhcmFtIEEge01hdHJpeH1cbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBNYXRyaXguY29uY2F0KEEsIEIpXG4gKiAvLyBbWzAsIDEsIDEsIDIsIDIsIDJdLCBbMiwgMywgNCwgMywgMywgM11dXG4gKlxuICovXG5NYXRyaXguY29uY2F0ID0gY3VycnkoZnVuY3Rpb24gKEEsIEIsIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5tYXAoZihCKSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZW1wdHkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHBhcmFtIHJvd3Mge251bWJlcn1cbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguZW1wdHkgPSBjdXJyeShmdW5jdGlvbiAocm93cyA9IDAsIGNvbHMgPSAwKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLm1hcChlbXB0eSlcbn0pXG5cbi8vICMjIyMgIyMjIyAjIyMjIC8vXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMSwgMiwgM10sIFs0LCA1LCA2XV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEFpZGVudGl0eSA9IEEuaWRlbnRpdHkoKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiovXG5NYXRyaXgucHJvdG90eXBlLmlkZW50aXR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcCh0aGlzKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgUmV0dXJucyBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXguaWRlbnRpdHkoMywgMilcbiAqIC8vIFtbMSwgMCwgMF0sIFswLCAxLCAwXV1cbiAqXG4gKi9cbk1hdHJpeC5pZGVudGl0eSA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcChtKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNvbWJpbmUgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmNvbmNhdChNYXRyaXgub2YoTSksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29tYmluZVxuICogQHNlZSBNYXRyaXguY29uY2F0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LmNvbWJpbmUgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmNvbmNhdChNYXRyaXgub2YoQiksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIENyZWF0ZSBtYXRyaXhcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAyXSwgWzMsIDRdXSlcbiAqXG4gKiAvLyBHZW5lcmF0ZSBpZGVudGl0eSBtYXRyaXhcbiAqIGNvbnN0IEkgID0gbS5pZGVudGl0eSgpIC8vIFtbMSwgMF0sIFswLCAxXV1cbiAqXG4gKiBpZihtLmRvdChJKS5lcXVhbHMobSkpIHtcbiAqICAgIGNvbnNvbGUubG9nKCdEb3QgcHJvZHVjdCB3aXRoIGlkZW50aXR5IG1hdHJpeCByZXR1cm5zIHRoZSBzYW1lIG1hdHJpeCcpXG4gKiB9XG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRvdCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgZG90KHRoaXMucHJlY2lzaW9uKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgYiA9IFtbNywgOF0sIFs5LCAxMF0sIFsxMSwgMTJdXVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqXG4gKiBNYXRyaXguZG90KEEsIEIpIC8vIFtbNTgsIDY0XSwgWzEzOSwgMTU0XV1cbiAqXG4gKi9cbk1hdHJpeC5kb3QgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmRvdChNYXRyaXgub2YoQikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZpbGxcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggdGhlIHByb3ZpZGVkIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5maWxsKHggPT4gNDIpXG4gKiAvLyBbWzQyLDQyLDQyXSwgWzQyLDQyLDQyXSwgWzQyLDQyLDQyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKG1hcCh4ID0+IGYoeCkpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB6ZXJvc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB6ZXJvc1xuICogQHJldHVybnMge01hdHJpeH1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS56ZXJvcygpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuemVyb3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbCh4ID0+IDApXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC56ZXJvcygzLCAzKVxuICogLy8gW1swLDAsMF0sIFswLDAsMF0sIFswLDAsMF1dXG4gKlxuICovXG5NYXRyaXguemVyb3MgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkub25lcygpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUub25lcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vbmVzKDEsIDEpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5vbmVzID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbCh4ID0+IDEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gdmFsdWVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxXVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiByYW5kb21cbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggcmFuZG9tIG51bWJlcnNcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gRnVuY3Rpb24gd2hpY2ggcmV0dXJucyByYW5kb20gdmFsdWVzLiBEZWZhdWx0IHJhbmRvbSB2YWx1ZXMgYXJlIGJldHdlZW4gLTEgYW5kIDFcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucmFuZG9tID0gZnVuY3Rpb24gKGYgPSBlID0+IChNYXRoLnJhbmRvbSgpICogMiAtIDEpLCByb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoZilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdG9BcnJheVxuICogQGRlc2MgUmV0dXJucyB0aGUgYXJyYXkgZnJvbSB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5tYXAocm93ID0+IHJvdy5tYXAoY29sID0+IGNvbCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNsb25lXG4gKiBAZGVzYyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5mcm9tQXJyYXkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmcm9tQXJyYXlcbiAqIEBkZXNjIFJldHVybnMgYSBNYXRyaXggZnJvbSBhbiBhcnJheVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5NYXRyaXguZnJvbUFycmF5ID0gZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gTWF0cml4Lm9mKG1hcChyb3cgPT4gbWFwKGNvbCA9PiBjb2wpKHJvdykpKGFycikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFstMSwgMl0sIFszLCA0XSwgWy04LCAyXSlcbiAqIGNvbnN0IGIgPSBBLnRyYW5zcG9zZSgpLnRvQXJyYXkoKVxuICogLy8gcmV0dXJucyBbWy0xLCAzLC04XSwgWzIsIDQsIDJdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnRyYW5zcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKHRyYW5zcG9zZSwgW10sIHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBBIE1hdHJpeCBvciBhIG1hdHJpeCBhcnJheVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFstMSwgMl0sIFszLCA0XSwgWy04LCAyXVxuICogY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UoYSkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC50cmFuc3Bvc2UgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnRyYW5zcG9zZSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGFkZFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gQWRkIGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5hZGQoMSkgLy8gW1s2LCA1XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmFkZChCKSAvLyBbWzEwLCAxMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgYWRkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsICsgTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCArIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdWJ0cmFjdFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gU3VidHJhY3QgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLnN1YnRyYWN0KDEpIC8vIFtbNCwgMl1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5zdWJ0cmFjdChCKSAvLyBbWzAsIDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3Qgc3VidHJhY3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgLSBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4IC0gTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIG11bHRpcGx5XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIE11dGxpcGx5IGEgc2NhbGFyIG9yIGEgbXRyYWl4IHdpdGggYSBtYXRyaXguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbXVsdGlwbGljYXRpb24gaXMgbm90IHBvc3NpYmxlLlxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5tdWx0aXBseSgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLm11bHRpcGx5KEIpIC8vIFtbMjUsIDI1XV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNlIHN0YXRpYyBtZXRob2QgXFwnZG90XFwnIHRvIGRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGNyZWF0ZSBoYWRhbWFyZCBwcm9kdWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKChjb2wsIGpkeCkgPT4gY29sICogTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAqIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBhZGRpdGl2ZWludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXRyaXggb2J0YWluZWQgYnkgY2hhbmdpbmcgdGhlIHNpZ24gb2YgZXZlcnkgbWF0cml4IGVsZW1lbnQuIFRoZSBhZGRpdGl2ZSBpbnZlcnNlIG9mIG1hdHJpeCBBIGlzIHdyaXR0ZW4g4oCTQS5cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LC01XSwgWy00LCA0XV0pXG4gKiBjb25zdCBtaW51c0EgPSBBLmFkZGl0aXZlaW52ZXJzZSgpXG4gKiAvLyBbWy01LCA1XSwgWzQsIC00XV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGRpdGl2ZWludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoLTEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBoYWRhbWFyZFxuICogQGluc3RhbmNlXG4gKiBAc2VlIG11bHRpcGx5XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuaGFkYW1hcmQoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5oYWRhbWFyZChCKSAvLyBbWzI1LCAyNV1dXG5cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5oYWRhbWFyZCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbHVcbiAqIEBkZXNjIENhbGN1bGF0ZXMgTFUgZGVjb21wb3NpdGlvbiBvZiB0aGUgY3VycmVudCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXhbXX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1szLCAtNywgLTIsIDJdLCBbLTMsIDUsIDEsIDBdLCBbNiwgLTQsIDAsIC01XSwgWy05LCA1LCAtNSwgMTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogY29uc3QgbHUgPSBBLmx1KClcbiAqIC8vIEwuX192YWx1ZSA9IFsgWyAxLCAwLCAwLCAwIF0sIFsgLTEsIDEsIDAsIDAgXSwgWyAyLCAtNSwgMSwgMCBdLCBbIC0zLCA4LCAzLCAxIF0gXVxuICogLy8gVS5fX3ZhbHVlID0gIFsgWyAzLCAtNywgLTIsIDIgXSwgWyAwLCAtMiwgLTEsIDIgXSwgWyAwLCAwLCAtMSwgMSBdLCBbIDAsIDAsIDAsIC0xIF0gXVxuICogTWF0cml4LmRvdChsdVswXSwgbHVbMV0pIC8vIHJldHVybnMgY2xvbmUgb2YgQVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5sdSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IHRvbCA9IDFlLTZcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMID0gdGhpcy56ZXJvcygpXG4gIGNvbnN0IFUgPSB0aGlzLnplcm9zKClcblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGlmIChNYXRoLmFicyhBLl9fdmFsdWVba11ba10pIDwgdG9sKSB0aHJvdyBFcnJvcignQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvdyBleGNoYW5nZScpXG4gICAgTC5fX3ZhbHVlW2tdW2tdID0gMVxuICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgTC5fX3ZhbHVlW2ldW2tdID0gQS5fX3ZhbHVlW2ldW2tdIC8gQS5fX3ZhbHVlW2tdW2tdXG4gICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyArK2opIHtcbiAgICAgICAgQS5fX3ZhbHVlW2ldW2pdID0gQS5fX3ZhbHVlW2ldW2pdIC0gTC5fX3ZhbHVlW2ldW2tdICogQS5fX3ZhbHVlW2tdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGwgPSBrOyBsIDwgbjsgKytsKSB7XG4gICAgICBVLl9fdmFsdWVba11bbF0gPSBBLl9fdmFsdWVba11bbF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtMLCBVXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBycmVmXG4gKiBAcmV0dXJucyB7TWF0cml4fGFycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihbWy0xLCAxXSwgWy0xLCAwXSwgWzAsIC0xXSwgWy0xLCAtMl1dKVxuICogQS5ycmVmKCkgLy8gIFsgWyAxLCAwIF0sIFsgLTAsIDEgXSwgWyAwLCAwIF0sIFsgMCwgMCBdIF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ycmVmID0gZnVuY3Rpb24gKCkge1xuICBsZXQgbGVhZCA9IDBcbiAgY29uc3QgcmVzdWx0TWF0cml4ID0gdGhpcy5jbG9uZSgpXG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmdldFJvd3MoKTsgKytyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpIDw9IGxlYWQpIHtcbiAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICB9XG4gICAgbGV0IGkgPSByXG4gICAgd2hpbGUgKHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdID09PSAwKSB7XG4gICAgICArK2lcbiAgICAgIGlmICh0aGlzLmdldFJvd3MoKSA9PT0gaSkge1xuICAgICAgICBpID0gclxuICAgICAgICArK2xlYWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29scygpID09PSBsZWFkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRtcCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV0gPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdID0gdG1wXG5cbiAgICBsZXQgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bbGVhZF1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdIC89IHZhbFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nZXRSb3dzKCk7ICsraSkge1xuICAgICAgaWYgKGkgPT09IHIpIGNvbnRpbnVlXG4gICAgICB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2pdIC09IHZhbCAqIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGxlYWQrK1xuICB9XG4gIHJldHVybiByZXN1bHRNYXRyaXhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc29sdmVcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNvbHZlIHhBID0gYlxuICogLy8gNXggKyB5ICA9IDdcbiAqIC8vIDN4IC0gNHkgPSAxOFxuICogLy8gU29sdXRpb24gZm9yIHggYW5kIHk6XG4gKiAvLyB4ID0gMlxuICogLy8geSA9IC0zXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDFdLCBbMywgLTRdXSlcbiAqIGNvbnN0IHNvbHZlQSA9IEEuc29sdmUoWzcsIDE4XSkgLy8gWzIsIC0zXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uIChiKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTFUgPSBBLmx1KClcbiAgY29uc3QgTCA9IExVWzBdXG4gIGNvbnN0IFUgPSBMVVsxXVxuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgbGV0IHMgPSAwXG4gIGNvbnN0IGMgPSBbXVxuICBjb25zdCB4ID0gW11cblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgazsgKytqKSB7XG4gICAgICBzID0gcyArIEwuX192YWx1ZVtrXVtqXSAqIGNbal1cbiAgICB9XG4gICAgY1trXSA9IGJba10gLSBzXG4gICAgcyA9IDBcbiAgfVxuICBmb3IgKGxldCBhID0gbiAtIDE7IGEgPiAtMTsgLS1hKSB7XG4gICAgbGV0IHQgPSAwXG4gICAgZm9yIChsZXQgYiA9IGEgKyAxOyBiIDwgbjsgKytiKSB7XG4gICAgICB0ID0gdCArIFUuX192YWx1ZVthXVtiXSAqIHhbYl1cbiAgICB9XG4gICAgeFthXSA9IChjW2FdIC0gdCkgLyBVLl9fdmFsdWVbYV1bYV1cbiAgfVxuICByZXR1cm4geFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsyLCA0XV0pLmludmVyc2UoKVxuICogLy8gWyBbIDIsIC0wLjUgXSwgWyAtMSwgMC41IF0gXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEkgPSBBLmlkZW50aXR5KClcbiAgY29uc3QgSW52ID0gQS5jb25jYXQoSSkucnJlZigpXG5cbiAgY29uc3QgcmVzdWx0ID0gSW52Ll9fdmFsdWUucmVkdWNlKChyZXN1bHQsIHgsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhbGYgPSB4Lmxlbmd0aCAvIDJcbiAgICByZXN1bHQucHVzaCh4LnNsaWNlKGhhbGYsIHgubGVuZ3RoKSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtdKVxuICByZXR1cm4gTWF0cml4Lm9mKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHJhbmtcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5rID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBycmVmID0gdGhpcy5ycmVmKClcbiAgbGV0IHJlc3VsdCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBycmVmLmdldENvbHMoKTsgKytpKSB7XG4gICAgcmVzdWx0ICs9IHJyZWYuX192YWx1ZVtpXVtpXVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpbWVuc2lvblxuICogQGluc3RhbmNlXG4gKiBAc2VlIHJhbmtcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yYW5rKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZygpXG4gKiAvLyBbMSwgMSwgMV1cbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFnKClcbiAqIC8vIFswLCAwLCAwLCAwLCAwXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdCh4W2lkeF0pXG4gIH0pKFtdKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFnKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyBbMiwgNV1cbiAqXG4gKi9cbk1hdHJpeC5kaWFnID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFnKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdwcm9kdWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIGFjYyAqPSB4W2lkeF1cbiAgICByZXR1cm4gYWNjXG4gIH0pKDEpKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ3Byb2R1Y3RcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWdwcm9kdWN0KFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyAxMFxuICpcbiAqL1xuTWF0cml4LmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFncHJvZHVjdCgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdW1cbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5zdW0oKVxuICogLy8gOVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLnN1bSgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1bSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4ge1xuICAgIGFjYyArPSBmb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCkoMCkoeClcbiAgICByZXR1cm4gYWNjXG4gIH0pKDApKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gc3VtXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5zdW0oW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDlcbiAqXG4gKi9cbk1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnN1bSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBrcm9uZWNrZXJcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0ICh0aGlzIOKKlyBNKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoTSkge1xuICBjb25zdCBtID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Q29scygpXG4gIGNvbnN0IHAgPSBNLmdldFJvd3MoKVxuICBjb25zdCBxID0gTS5nZXRDb2xzKClcblxuICBjb25zdCBsZWZ0ID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IHJpZ2h0ID0gTS5fX3ZhbHVlXG5cbiAgY29uc3QgZnJhbWUgPSBnZW5lcmF0ZShtICogcCwgbiAqIHEpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBwOyBrKyspIHtcbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBxOyBsKyspIHtcbiAgICAgICAgICBmcmFtZVtwICogaSArIGtdW3EgKiBqICsgbF0gPSBsZWZ0W2ldW2pdICogcmlnaHRba11bbF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBNYXRyaXgub2YoZnJhbWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGtyb25lY2tlclxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIEEge01hdHJpeH0gVGhlIGxlZnQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcGFyYW0gQiB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgua3JvbmVja2VyID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5rcm9uZWNrZXIoQilcbn1cblxuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuLy8gR1BVIEZ1bmN0aW9uc1xuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzIsIDJdLCBbMiwgMl1dLCBHUFVKUylcbiAqIG0uZ3B1TWFwKGdwdU1hcHBlcilcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVNYXAgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGdwdW1hcCh0aGlzLmdwdWpzLCBmLCB0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdGhhdCBtYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5ncHVNYXAoR1BVSlMsIGdwdU1hcHBlciwgW1syLCAyXSwgWzIsIDJdXSlcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICovXG5NYXRyaXguZ3B1TWFwID0gY3VycnkoZnVuY3Rpb24gKGdwdSwgZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0sIGdwdSkuZ3B1TWFwKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVGb2xkXG4gKiBAZGVzY3JpcHRpb24gRm9sZHMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIEdQVVMuanMgZW5xYmxlZCByZWR1Y2UgZnVuY3Rpb24sIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ3B1Rm9sZCA9IGZ1bmN0aW9uIChmLCBvdXRwdXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihncHVmb2xkKHRoaXMuZ3B1anMsIGYsIG91dHB1dCwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gTWF0cml4I2dwdVByb2R1Y3RcbiAqIEBwYXJhbSBmXG4gKiBAcGFyYW0gb3V0cHV0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVQcm9kdWN0ID0gZnVuY3Rpb24gKGYsIG91dHB1dCwgTSkge1xuICAvLyAoZ3B1LCBmLCBvdXRwdXQsIGEsIGIsIGNvbnN0YW50cyA9IHt9XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1cHJvZHVjdCh0aGlzLmdwdWpzLCBmLCBvdXRwdXQsIHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF0cml4XG4iLCJpbXBvcnQgeyBjb25jYXQsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIChNLCBtLCBpZHgpIHtcbiAgcmV0dXJuIGNvbmNhdChtLCBNLl9fdmFsdWVbaWR4XSlcbn0pXG4iLCJpbXBvcnQgeyBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KG0gPT4gW10pXG4iLCJpbXBvcnQgeyBmb2xkLCBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuaW1wb3J0IHJvdW5kIGZyb20gJy4vcm91bmQnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGRvdFxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEBwYXJhbSBhIHtBcnJheX1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKGRlY2ltYWxzLCBCLCBhKSA9PiBtYXAoKGl0ZW0sIGkpID0+IHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaikgPT4ge1xuICAgIGFjYyArPSByb3VuZCh4ICogQi5fX3ZhbHVlW2pdW2ldLCBkZWNpbWFscylcbiAgICByZXR1cm4gYWNjXG4gIH0sIDApKGEpXG59KShCLl9fdmFsdWVbMF0pKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcm91bmRcbiAqIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfVxuICogQHBhcmFtIGRlY2ltYWxzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByb3VuZCAodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscylcbn1cbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIENyZWF0ZXMgYW4gaWRlbnRpeSBtYXRyaXggZnJvbSBhbiBlbXB0eSBhcnJheVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybiB7TWF0cml4fVxuICovXG5leHBvcnQgZGVmYXVsdCAobSwgaWR4KSA9PiBtYXAoKHJvd3MsIGpkeCkgPT4gKGlkeCA9PT0gamR4KSAqIDEpKG0pXG4iLCJpbXBvcnQgeyBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFRyYW5zcG9zZXMgYSBhcnJheSBvZiBhcnJheXMgdXNpbmcgdGhlIE1hdHJpeC5tYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHByZXYsIG5leHQpID0+IG1hcCgoaXRlbSwgaSkgPT4gKHByZXZbaV0gfHwgW10pLmNvbmNhdChuZXh0W2ldKSkobmV4dCkpXG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlXG4gKiBAZGVzYyBHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGEgbWF0cml4IGFycmF5LCB2YWx1ZXMgYXJlIHNldCB0byB1bmRlZmluZWRcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge2FueVtdW119XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChyb3dzLCBjb2xzID0gdW5kZWZpbmVkLCB2YWx1ZSA9IDApID0+IHtcbiAgY29uc3QgX2NvbHMgPSBjb2xzIHx8IHJvd3NcbiAgY29uc3QgeSA9IG1hcCh6ID0+IHZhbHVlKShuZXcgQXJyYXkoX2NvbHMpKVxuICByZXR1cm4gbWFwKHogPT4geSkobmV3IEFycmF5KHJvd3MpKVxufVxuIiwiLy8gaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdW1hcCAoZ3B1LCBmLCBtYXRyaXgpIHtcbiAgcmV0dXJuIGdwdS5jcmVhdGVLZXJuZWwoZikuc2V0T3V0cHV0KFttYXRyaXgubGVuZ3RoLCBtYXRyaXhbMF0ubGVuZ3RoXSkobWF0cml4KVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3B1Zm9sZCAoZ3B1LCBmLCBvdXRwdXQsIG1hdHJpeCwgY29uc3RhbnRzID0ge30pIHtcbiAgcmV0dXJuIGdwdVxuICAgIC5jcmVhdGVLZXJuZWwoZiwgeyBjb25zdGFudHM6IE9iamVjdC5hc3NpZ24oe30sIHsgbTogbWF0cml4Lmxlbmd0aCwgbjogbWF0cml4WzBdLmxlbmd0aCB9LCBjb25zdGFudHMpIH0pXG4gICAgLnNldE91dHB1dChvdXRwdXQpKG1hdHJpeClcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdXByb2R1Y3QgKGdwdSwgZiwgb3V0cHV0LCBhLCBiLCBjb25zdGFudHMgPSB7fSkge1xuICByZXR1cm4gZ3B1XG4gICAgLmNyZWF0ZUtlcm5lbChmLCB7IGNvbnN0YW50czogT2JqZWN0LmFzc2lnbih7fSwgeyBtOiBiLmxlbmd0aCwgbjogYVswXS5sZW5ndGggfSwgY29uc3RhbnRzKSB9KVxuICAgIC5zZXRPdXRwdXQob3V0cHV0KShhLCBiKVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/package.json b/package.json index c58b8f5..6f4410f 100755 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "./node_modules/.bin/eslint ./src --fix && npm run compile && npm run test && npm run jsdocs-json && npm run jsdocs && npm run size", "dev": "webpack --progress --colors --watch --env dev", "compile": "webpack --env dev && webpack --env build", - "test": "mocha --require babel-register --colors ./test/*.spec.js", + "test": "mocha --max_old_space_size=4096 --require babel-register --colors ./test/*.spec.js", "test:watch": "mocha --require babel-register --colors -w ./test/*.spec.js", "test:cover": "cross-env NODE_ENV=test nyc mocha --require babel-register --colors test/*.spec.js", "repl": "node -i -e \"$(< ./lib/@astuanax/funmatrix.js)\"", diff --git a/src/gpumatrix.js b/src/gpumatrix.js new file mode 100644 index 0000000..3cf3d81 --- /dev/null +++ b/src/gpumatrix.js @@ -0,0 +1,125 @@ +import Matrix from './Matrix' +import curry from 'fun.js/src/curry' +import gpumap from 'util/gpumap' +import gpufold from 'util/gpufold' +import gpuproduct from 'util/gpuproduct' + +/** + * @class GpuMatrix + * @classdesc GpuMatrix applicative providing standard matrix operations + * @summary The GpuMatrix class should not be instantiated with the new keyword. Instead use the Matrix.of syntax to create a new Matrix. Unfortunatly jsdocs does not allow for the constructor to be hidden. + * @hidecontructor + * @see of + * @example + * + * const gpu = new GPU() + * const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu) + * + */ +class GpuMatrix extends Matrix { + constructor (val, GPUJS) { + super() + if (GPUJS) { + this.gpujs = GPUJS || null + } + } +} + +/** + * @memberOf GpuMatrix + * @static + * @function GpuMatrix.of + * @desc Creates a GpuMatrix object and flattens the GpuMatrix + * @param val {array|function} An array of arrays + * @param GPUJS {Object} + * @returns {GpuMatrix} + * @example + * + * const m = GpuMatrix.of([[1,2],[2,3],[4,5]], gpu) + * + */ +GpuMatrix.of = function (val, GPUJS = null) { + if (val instanceof GpuMatrix) return val + if (this instanceof GpuMatrix) { + this.__value = val + this.gpujs = GPUJS + return this + } + return new GpuMatrix(val, GPUJS) +} + +//* ***********************/ +// GPU Functions +//* ***********************/ + +/** + * @memberOf GpuMatrix + * @instance + * @member gpuMap + * @description Maps over the rows of the GpuMatrix using a map function using the GPU + * @param f {function} An GPU.js enabled iterator function + * @returns {GpuMatrix} + * @example + * + * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } + * const m = GpuMatrix.of([[2, 2], [2, 2]], GPUJS) + * m.gpuMap(gpuMapper) + * // [Float32Array(2,2), Float32Array(2,2)] + * + * + */ +GpuMatrix.prototype.gpuMap = function (f) { + return GpuMatrix.of(gpumap(this.gpujs, f, this.__value)) +} + +/** + * @memberOf GpuMatrix + * @static + * @function gpuMap + * @description Static function that maps over the rows of the GpuMatrix using a map function using the GPU + * @param f {function} An GPU.js enabled iterator function + * @param M {GpuMatrix|array} GpuMatrix or array to map + * @returns {GpuMatrix} + * @example + * + * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } + * const m = GpuMatrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]]) + * // [Float32Array(2,2), Float32Array(2,2)] + * + */ +GpuMatrix.gpuMap = curry(function (gpu, f, M) { + return GpuMatrix.of(M, gpu).gpuMap(f) +}) + +/** + * @memberOf GpuMatrix + * @instance + * @member gpuFold + * @description Folds the rows of the GpuMatrix using a GPUS.js enqbled reduce function, using the GPU + * @param f {function} An iterator function + * @returns {GpuMatrix} + * @example + * + * const m = GpuMatrix.of([[1, 1], [1, 1]]) + * m.map(x => x.map(y => y+ 1)) + * // [[2, 2], [2, 2]] + * + */ +GpuMatrix.prototype.gpuFold = function (f, output) { + return GpuMatrix.of(gpufold(this.gpujs, f, output, this.__value)) +} + +/** + * @memberOf GpuMatrix + * @function GpuMatrix#gpuProduct + * @param f + * @param output + * @param M + * @returns {GpuMatrix} + */ +GpuMatrix.prototype.gpuProduct = function (f, output, M) { + // (gpu, f, output, a, b, constants = {} + return GpuMatrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value)) +} + +export default GpuMatrix diff --git a/src/matrix.js b/src/matrix.js index a0c8130..f17dbea 100644 --- a/src/matrix.js +++ b/src/matrix.js @@ -26,7 +26,7 @@ import gpuproduct from 'util/gpuproduct' let Matrix = function (val, GPUJS) { this.__value = val if (GPUJS) { - this.gpujs = GPUJS ? new GPUJS() : null + this.gpujs = GPUJS || null } } @@ -42,14 +42,14 @@ let Matrix = function (val, GPUJS) { * const m = Matrix.of([[1,2],[2,3],[4,5]]) * */ -Matrix.of = function (val, GPUJS = null) { +Matrix.of = function (val) { if (val instanceof Matrix) return val if (this instanceof Matrix) { this.__value = val this.gpujs = GPUJS return this } - return new Matrix(val, GPUJS) + return new Matrix(val) } /** @@ -63,13 +63,6 @@ Matrix.of = function (val, GPUJS = null) { */ Matrix.prototype.type = 'Matrix' -/** - * @memberOf Matrix - * @property {Object} gpu - * @type {Object} - */ -Matrix.prototype.gpu = {} - /** * @memberOf Matrix * @property {number} precision @@ -1184,8 +1177,17 @@ Matrix.prototype.gpuFold = function (f, output) { return Matrix.of(gpufold(this.gpujs, f, output, this.__value)) } +/** + * @memberOf Matrix + * @function Matrix#gpuProduct + * @param f + * @param output + * @param M + * @returns {Matrix} + */ Matrix.prototype.gpuProduct = function (f, output, M) { - return Matrix.of(gpuproduct(this.gpujs, f, output, this.__value, M)) + // (gpu, f, output, a, b, constants = {} + return Matrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value)) } export default Matrix diff --git a/src/util/gpuproduct.js b/src/util/gpuproduct.js index e5b0a15..3750e96 100644 --- a/src/util/gpuproduct.js +++ b/src/util/gpuproduct.js @@ -1,5 +1,5 @@ -export default function gpudot (gpu, f, output, a, b, constants = {}) { +export default function gpuproduct (gpu, f, output, a, b, constants = {}) { return gpu - .createKernel(f, { constants: Object.assign({}, { n: a[0].length }, constants) }) + .createKernel(f, { constants: Object.assign({}, { m: b.length, n: a[0].length }, constants) }) .setOutput(output)(a, b) } diff --git a/test/matrix.spec.js b/test/matrix.spec.js index d1f44cf..5c4aa90 100644 --- a/test/matrix.spec.js +++ b/test/matrix.spec.js @@ -1,55 +1,55 @@ import chai from 'chai' import Matrix from '../lib/@astuanax/funmatrix' -import { GPU } from 'gpu.js' import generate from '../src/util/generate' import gpudot from '../src/util/gpudot' +import { GPU } from 'gpu.js' +const gpu = new GPU() describe('Matrix map on gpu', function () { - it('generates square matrix array', function () { - const dim = 2 - const m = generate(dim) - chai.expect(m).to.deep.equal([[0, 0], [0, 0]]) - }) - + it('generates square matrix array', function () { + const dim = 2 + const m = generate(dim) + chai.expect(m).to.deep.equal([[0, 0], [0, 0]]) + }) + it('maps arrays on gpu', function () { - const A = Matrix.of([[0]], GPU) + const A = Matrix.of([[0]], gpu) function mapF (a) { return a[this.thread.y][this.thread.x] } chai.expect(A.gpuMap(mapF).__value).to.deep.equal([new Float32Array([0])]) }) - + it('maps large arrays on gpu', function () { - const dim = 1000 - const m = generate(dim).map(row => row.map(x=>0)) - const A = Matrix.of(m, GPU) + const dim = 100 + const m = generate(dim).map(row => row.map(x => 0)) + const A = Matrix.of(m, gpu) function mapF (a) { return a[this.thread.y][this.thread.x] } - const expected = m.map(row => new Float32Array(row.map(x=>0))) + const expected = m.map(row => new Float32Array(row.map(x => 0))) chai.expect(A.gpuMap(mapF).__value).to.deep.equal(expected) }) - + it('folds large arrays on gpu', function () { - const sum = function(a) { - let sum = 0; - for (let i = 0; i < this.constants.m; i++) { - for (let j = 0; j < this.constants.n; j++) { - sum += a[i][j]; - } - } - return sum; + const sum = function (a) { + let sum = 0 + for (let i = 0; i < this.constants.m; i++) { + for (let j = 0; j < this.constants.n; j++) { + sum += a[i][j] + } } - const A = Matrix.of([[2, 0], [0, 2], [1, 1]], GPU) - const test = A.gpuFold(sum, [1]) - const expected = new Float32Array([6]) - chai.expect(test.__value).to.deep.equal(expected) - }) - - it('dot product on gpu', function () { - const A = Matrix.of([[2, 0], [0, 2]], GPU) - const B = Matrix.of([[1, 0], [0, 1]], GPU) - - const test = A.gpuProduct(gpudot, [2, 2], B) - const expected = [new Float32Array([2, 0]), new Float32Array([2, 0])] - - chai.expect(test.__value).to.deep.equal(expected) - }) - + return sum + } + const A = Matrix.of([[2, 0], [0, 2], [1, 1]], gpu) + const test = A.gpuFold(sum, [1]) + const expected = new Float32Array([6]) + chai.expect(test.__value).to.deep.equal(expected) + }) + + it('dot product on gpu', function () { + const A = Matrix.of([[2, 0], [0, 2]], gpu) + const B = Matrix.of([[1, 0], [0, 1]], gpu) + + const test = A.gpuProduct(gpudot, [2, 2], B) + const expected = [new Float32Array([2, 0]), new Float32Array([0, 2])] + + chai.expect(test.__value).to.deep.equal(expected) + }) }) diff --git a/webpack.config.js b/webpack.config.js index c9364af..b4d567b 100755 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,25 +1,25 @@ -/* global __dirname, require, module*/ +/* global __dirname, require, module */ -const webpack = require('webpack'); -const path = require('path'); -const env = require('yargs').argv.env; // use --env with webpack 2 -const pkg = require('./package.json'); +const webpack = require('webpack') +const path = require('path') +const env = require('yargs').argv.env // use --env with webpack 2 +const pkg = require('./package.json') -let libraryName = pkg.name; +let libraryName = pkg.name -let outputFile, mode; +let outputFile, mode if (env === 'build') { - mode = 'production'; - outputFile = libraryName + '.min.js'; + mode = 'production' + outputFile = libraryName + '.min.js' } else { - mode = 'development'; - outputFile = libraryName + '.js'; + mode = 'development' + outputFile = libraryName + '.js' } const config = { mode: mode, - entry: __dirname + '/src/matrix.js', + entry: [__dirname + '/src/matrix.js'], devtool: 'inline-source-map', output: { path: __dirname + '/lib', @@ -47,6 +47,6 @@ const config = { modules: [path.resolve('./node_modules'), path.resolve('./src')], extensions: ['.json', '.js'] } -}; +} -module.exports = config; +module.exports = config From 04b65cecbef35185d01657ef5fba5579b4572ec4 Mon Sep 17 00:00:00 2001 From: Len Dierickx Date: Wed, 29 May 2019 20:36:14 +0200 Subject: [PATCH 6/6] WIP GPUMatrix --- lib/@astuanax/funmatrix.js | 174 +------------ lib/@astuanax/funmatrix.min.js | 4 +- src/matrix.js | 98 +------ test/gpumatrix.spec.js | 55 ++++ test/matrix.spec.js | 464 +++++++++++++++++++++++++++++---- 5 files changed, 486 insertions(+), 309 deletions(-) create mode 100644 test/gpumatrix.spec.js diff --git a/lib/@astuanax/funmatrix.js b/lib/@astuanax/funmatrix.js index b50560b..e8e4259 100644 --- a/lib/@astuanax/funmatrix.js +++ b/lib/@astuanax/funmatrix.js @@ -3931,14 +3931,12 @@ var _transpose = _interopRequireDefault(__webpack_require__(/*! util/transpose * var _generate = _interopRequireDefault(__webpack_require__(/*! util/generate */ "./src/util/generate.js")); -var _gpumap = _interopRequireDefault(__webpack_require__(/*! util/gpumap */ "./src/util/gpumap.js")); - -var _gpufold = _interopRequireDefault(__webpack_require__(/*! util/gpufold */ "./src/util/gpufold.js")); - -var _gpuproduct = _interopRequireDefault(__webpack_require__(/*! util/gpuproduct */ "./src/util/gpuproduct.js")); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// import gpumap from 'util/gpumap' +// import gpufold from 'util/gpufold' +// import gpuproduct from 'util/gpuproduct' + /** * @class Matrix * @classdesc Matrix applicative providing standard matrix operations @@ -3951,9 +3949,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * */ var Matrix = function Matrix(val) { - this.__value = val; // if (GPUJS) { - // this.gpujs = GPUJS || null - // } + this.__value = val; }; /** * @memberOf Matrix @@ -5165,82 +5161,6 @@ Matrix.prototype.kronecker = function (M) { Matrix.kronecker = function (A, B) { return Matrix.of(A).kronecker(B); -}; //* ***********************/ -// GPU Functions -//* ***********************/ - -/** - * @memberOf Matrix - * @instance - * @member gpuMap - * @description Maps over the rows of the matrix using a map function using the GPU - * @param f {function} An GPU.js enabled iterator function - * @returns {Matrix} - * @example - * - * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } - * const m = Matrix.of([[2, 2], [2, 2]], GPUJS) - * m.gpuMap(gpuMapper) - * // [Float32Array(2,2), Float32Array(2,2)] - * - * - */ - - -Matrix.prototype.gpuMap = function (f) { - return Matrix.of((0, _gpumap.default)(this.gpujs, f, this.__value)); -}; -/** - * @memberOf Matrix - * @static - * @function gpuMap - * @description Static function that maps over the rows of the matrix using a map function using the GPU - * @param f {function} An GPU.js enabled iterator function - * @param M {Matrix|array} Matrix or array to map - * @returns {Matrix} - * @example - * - * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } - * const m = Matrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]]) - * // [Float32Array(2,2), Float32Array(2,2)] - * - */ - - -Matrix.gpuMap = (0, _curry.default)(function (gpu, f, M) { - return Matrix.of(M, gpu).gpuMap(f); -}); -/** - * @memberOf Matrix - * @instance - * @member gpuFold - * @description Folds the rows of the matrix using a GPUS.js enqbled reduce function, using the GPU - * @param f {function} An iterator function - * @returns {Matrix} - * @example - * - * const m = Matrix.of([[1, 1], [1, 1]]) - * m.map(x => x.map(y => y+ 1)) - * // [[2, 2], [2, 2]] - * - */ - -Matrix.prototype.gpuFold = function (f, output) { - return Matrix.of((0, _gpufold.default)(this.gpujs, f, output, this.__value)); -}; -/** - * @memberOf Matrix - * @function Matrix#gpuProduct - * @param f - * @param output - * @param M - * @returns {Matrix} - */ - - -Matrix.prototype.gpuProduct = function (f, output, M) { - // (gpu, f, output, a, b, constants = {} - return Matrix.of((0, _gpuproduct.default)(this.gpujs, f, output, this.__value, M.__value)); }; var _default = Matrix; @@ -5392,88 +5312,6 @@ module.exports = exports["default"]; /***/ }), -/***/ "./src/util/gpufold.js": -/*!*****************************!*\ - !*** ./src/util/gpufold.js ***! - \*****************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = gpufold; - -function gpufold(gpu, f, output, matrix) { - var constants = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - return gpu.createKernel(f, { - constants: Object.assign({}, { - m: matrix.length, - n: matrix[0].length - }, constants) - }).setOutput(output)(matrix); -} - -module.exports = exports["default"]; - -/***/ }), - -/***/ "./src/util/gpumap.js": -/*!****************************!*\ - !*** ./src/util/gpumap.js ***! - \****************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = gpumap; - -// import curry from 'fun.js/src/curry' -function gpumap(gpu, f, matrix) { - return gpu.createKernel(f).setOutput([matrix.length, matrix[0].length])(matrix); -} - -module.exports = exports["default"]; - -/***/ }), - -/***/ "./src/util/gpuproduct.js": -/*!********************************!*\ - !*** ./src/util/gpuproduct.js ***! - \********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = gpuproduct; - -function gpuproduct(gpu, f, output, a, b) { - var constants = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - return gpu.createKernel(f, { - constants: Object.assign({}, { - m: b.length, - n: a[0].length - }, constants) - }).setOutput(output)(a, b); -} - -module.exports = exports["default"]; - -/***/ }), - /***/ "./src/util/identity.js": /*!******************************!*\ !*** ./src/util/identity.js ***! @@ -5587,4 +5425,4 @@ module.exports = __webpack_require__(/*! /Volumes/BigOne/github/funMatrix/src/ma /******/ }); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9fcHJpdmF0ZS9jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkanVzdFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWxsUGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWx3YXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FueS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55UGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS90by5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9GLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9ib29sZWFuL1QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vYm90aC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9kaWZmRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc0Z1dHVyZURhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0RheS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0hvdXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9NaW51dGVzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvU2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmluZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maXJzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmxhdE1hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9rZXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9sYXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9saWZ0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL0p1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL25vdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVsbC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2FkZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2RpdmlkZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvaXNOYW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9tdWx0aXBseS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2tleXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21lcmdlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb3IuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3NldC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2Zvcm1hdFN0cmluZy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvemlwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy96aXBXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2RvdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dlbmVyYXRlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVmb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVtYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dwdXByb2R1Y3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9yb3VuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIl0sIm5hbWVzIjpbIk1hdHJpeCIsInZhbCIsIl9fdmFsdWUiLCJvZiIsInByb3RvdHlwZSIsInR5cGUiLCJwcmVjaXNpb24iLCJzZXRQcmVjaXNpb24iLCJpc1N5bW1ldHJpYyIsImEiLCJiIiwidHJhbnNwb3NlIiwiaXNTcXVhcmUiLCJnZXRDb2xzIiwiZ2V0Um93cyIsImlzT3J0aG9nb25hbCIsIkF4QXQiLCJkb3QiLCJJIiwiaWRlbnRpdHkiLCJsZW5ndGgiLCJlcXVhbHMiLCJNIiwiZ2V0U2hhcGUiLCJtYXAiLCJmIiwiZm9sZCIsImFwIiwiY29uY2F0IiwiQSIsIkIiLCJlbXB0eSIsInJvd3MiLCJjb2xzIiwibSIsImNvbWJpbmUiLCJmaWxsIiwieCIsInplcm9zIiwib25lcyIsInJhbmRvbSIsImUiLCJNYXRoIiwidG9BcnJheSIsInJvdyIsImNvbCIsImNsb25lIiwiZnJvbUFycmF5IiwiYXJyIiwiYWRkIiwiRXJyb3IiLCJpZHgiLCJqZHgiLCJzdWJ0cmFjdCIsIm11bHRpcGx5IiwiY29uc29sZSIsImxvZyIsImFkZGl0aXZlaW52ZXJzZSIsImhhZGFtYXJkIiwibHUiLCJuIiwidG9sIiwiTCIsIlUiLCJrIiwiYWJzIiwiaSIsImoiLCJsIiwicnJlZiIsImxlYWQiLCJyZXN1bHRNYXRyaXgiLCJyIiwidG1wIiwic29sdmUiLCJMVSIsInMiLCJjIiwidCIsImludmVyc2UiLCJJbnYiLCJyZXN1bHQiLCJyZWR1Y2UiLCJoYWxmIiwicHVzaCIsInNsaWNlIiwicmFuayIsImRpbWVuc2lvbiIsImRpYWciLCJhY2MiLCJkaWFncHJvZHVjdCIsInN1bSIsInByZXYiLCJuZXh0Iiwia3JvbmVja2VyIiwicCIsInEiLCJsZWZ0IiwicmlnaHQiLCJmcmFtZSIsImdwdU1hcCIsImdwdWpzIiwiZ3B1IiwiZ3B1Rm9sZCIsIm91dHB1dCIsImdwdVByb2R1Y3QiLCJkZWNpbWFscyIsIml0ZW0iLCJ1bmRlZmluZWQiLCJ2YWx1ZSIsIl9jb2xzIiwieSIsInoiLCJBcnJheSIsImdwdWZvbGQiLCJtYXRyaXgiLCJjb25zdGFudHMiLCJjcmVhdGVLZXJuZWwiLCJPYmplY3QiLCJhc3NpZ24iLCJzZXRPdXRwdXQiLCJncHVtYXAiLCJncHVwcm9kdWN0Iiwicm91bmQiLCJOdW1iZXIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQzJCOztBQUVaLHFIQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNuQkY7QUFBQTtB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBQVcsZ0JBQWdCO0FBQ3FCO0FBQ2hELFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsNEJBQTRCO0FBQ3ZDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsNkJBQTZCO0FBQ3hDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsK0JBQStCO0FBQzFDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsZ0JBQWdCO0FBQzNCLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsMEJBQTBCO0FBQ3JDLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsZ0JBQWdCO0FBQzNCLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcscUJBQXFCO0FBQ2hDLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsc0JBQXNCO0FBQ2pDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsNEJBQTRCO0FBQ3ZDLFdBQVcsMkJBQTJCO0FBQ3RDLFdBQVcsOEJBQThCO0FBQ3pDLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsMEJBQTBCO0FBQ3JDLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsbUJBQW1CO0FBQzlCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsb0JBQW9CO0FBQy9CLFdBQVcsZUFBZTtBQUMxQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLGdCQUFnQjtBQUMzQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLDBCQUEwQjtBQUNyQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGlDQUFpQztBQUM1QyxXQUFXLHFDQUFxQztBQUNoRCxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLDJCQUEyQjtBQUN0QyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9CQUFvQjtBQUMvQixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG9C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VCxJQUFnQixDQUEvQjtBQUFBLEdBQUosRUFBc0NsQixDQUF0QyxDQUFaO0FBQUEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1RmOzs7Ozs7QUFNZSxTQUFTeUYsS0FBVCxDQUFnQmQsS0FBaEIsRUFBdUJILFFBQXZCLEVBQWlDO0FBQzlDLFNBQU9rQixNQUFNLENBQUNsRixJQUFJLENBQUNpRixLQUFMLENBQVdkLEtBQUssR0FBRyxHQUFSLEdBQWNILFFBQXpCLElBQXFDLElBQXJDLEdBQTRDQSxRQUE3QyxDQUFiO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JEOztBQUVBOzs7Ozs7O2VBT2UsZ0JBQU0sVUFBQ2QsSUFBRCxFQUFPQyxJQUFQO0FBQUEsU0FBZ0IsY0FBSSxVQUFDYyxJQUFELEVBQU96QyxDQUFQO0FBQUEsV0FBYSxDQUFDMEIsSUFBSSxDQUFDMUIsQ0FBRCxDQUFKLElBQVcsRUFBWixFQUFnQnRDLE1BQWhCLENBQXVCaUUsSUFBSSxDQUFDM0IsQ0FBRCxDQUEzQixDQUFiO0FBQUEsR0FBSixFQUFrRDJCLElBQWxELENBQWhCO0FBQUEsQ0FBTixDIiwiZmlsZSI6IkBhc3R1YW5heC9mdW5tYXRyaXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIkBhc3R1YW5heC9mdW5tYXRyaXhcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJAYXN0dWFuYXgvZnVubWF0cml4XCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsIi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gd2l0aCBhcml0eSAxXG4gKiBAZnVuY3Rpb24gY3VycnkxXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIHYxLjAuMlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeTEgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkIChhKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgID8gdGhpc1xuICAgICAgOiBmbihhKVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhZGRJbmRleFxuICogQHN1bW1hcnkgQWRkcyBhIHNwZWNpZmllZCBpbmRleCB0byBpdGVyYXRlIGEgY29sbGVjdGlvblxuICogQGRlc2NyaXB0aW9uIFRoZSBhZGRJbmRleCBmdW5jdGlvbiBpcyBub3RuZWNlc3NhcnkgZm9yIHRoZSBtYXAgZnVuY3Rpb25zIGluIHRoZSBmdW4uanMgbGlicmFyeSBhcyB0aGV5IGJlaGF2ZSB0aGUgc2EsZSBhcyB0aGUgbmF0aXZlIGphdmFzY3JpcHQgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIEZ1bmN0aW9uIHRvIHdoaWNoIHRvIGFkZCB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7QXJyYXl9IGEgVGhlIGFycmF5IG9uIHdoaWNoIHRvIHdvcmtcbiAqIEBzaW5jZSAxLjAuMlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkSW5kZXggKGYsIGcsIGEpIHtcbiAgbGV0IGkgPSAwXG4gIHJldHVybiBmKFxuICAgIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gZyh2LCBpKyspXG4gICAgfSxcbiAgICBhXG4gIClcbn0pXG4iLCIvKipcbiAqIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGFkanVzdFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+IG51bSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRvIG1vZGlmeSB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gKiBAcGFyYW0ge051bWJlcn0gaSAtIFRoZSBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkgdGhlIGFycmF5LCBhY2NlcHRzIHBvc3RpdGl2ZSBhbmQgbmVnYXRpdmUgaW5kZXhlc1xuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdIC0gQXJyYXkgd2l0aCBkYXRhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0IChmbiwgaSwgYSkge1xuICBjb25zdCByID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSlcbiAgY29uc3QgaWR4ID0gaSA8IDAgPyByLmxlbmd0aCArIGkgOiBpXG4gIGlmICghYVtpZHhdKSByZXR1cm4gclxuICByW2lkeF0gPSBmbihyW2lkeF0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RXaXRoXG4gKiBAZGVzY3JpcHRpb24gTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYSkgLT4gKChhIC0+IFthXSkgLT4gW2FdIC0+IG51bSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIFRoZSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRoZSBpbmRleGVzIGlmIGZvdW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBbYV1cbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0V2l0aCAoZm4sIHByZWQsIGEpIHtcbiAgY29uc3QgX2ZuID0geCA9PiB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJldHVybiBmbih4KVxuICAgIH1cbiAgICByZXR1cm4geFxuICB9XG4gIHJldHVybiBtYXAoX2ZuLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbGxcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbCAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IHRydWVcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKCFjYihhW2ldKSkge1xuICAgICAgcmVzID0gZmFsc2VcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICpcbiAqIEBmdW5jdGlvbiBhbGxQYXNzXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBwYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbFBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghY2JzW2ldKGEpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gYWx3YXlzXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbHdheXMgKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHggfVxufSlcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICpcbiAqIEBmdW5jdGlvbiBhbmRcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICh4LCB5KSAtPiBib29sZWFuXG4gKiBAcGFyYW0geyp9IHggLSBBIHByZWRpY2F0ZVxuICogQHBhcmFtIHsqfSB5IC0gQSBwcmVkaWNhdGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW5kICh4LCB5KSB7XG4gIHJldHVybiB4ICYmIHlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbnlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb24gb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKFRPRE8pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbnkgKGNiLCBhKSB7XG4gIGxldCByZXMgPSBmYWxzZVxuICBmb3IgKGxldCBpIGluIGEpIHtcbiAgICBpZiAoY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IHRydWVcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBvbmUgcGFzc2VzXG4gKlxuICogQGZ1bmN0aW9uIGFueVBhc3NcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLikgLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueVBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjYnNbaV0oYSkpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmV0dXJucyBhIGNvbWJpbmVkIHJlc3VsdCBhcnJheVxuICpcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHBhcmFtIHsoRnVuY3Rpb25bXXxGdW5jdGlvbnxBcHBsaWNhdGl2ZSl9IGZucyAtIEFuIGFycmF5IG9mIGZ1bmN0aW9ucyBvciBhIGZ1bmN0aW9uIG9yIGFuIGFwcGxpY2F0aXZlXG4gKiBAcGFyYW0ge0FycmF5fSB2YWxzIC0gQW4gYXJyYXkgb2YgdmFsdWVzXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBmb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBtYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcCAoZm5zLCB2YWxzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZucy5hcCkpIHtcbiAgICByZXR1cm4gZm5zLmFwKHZhbHMpXG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oZm5zKSkge1xuICAgIHJldHVybiB4ID0+IGZucyh4KSh2YWxzKHgpKVxuICB9XG4gIHJldHVybiBmb2xkKChhY2MsIGYpID0+IGFjYy5jb25jYXQobWFwKGN1cnJ5MShmKSwgdmFscykpLCBbXSwgZm5zKVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gYXBlcnR1cmVcbiAqIEBwYXJhbSBuXG4gKiBAcGFyYW0gYXJyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBlcnR1cmUgKG4sIGEpIHtcbiAgaWYgKGEubGVuZ3RoIDwgbikge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IHJlcyA9IEFycmF5KGEubGVuZ3RoIC0gbiArIDEpXG4gIHJldHVybiBtYXAoKGl0ZW0sIGlkeCkgPT4gYS5zbGljZShpZHgsIGlkeCArIG4pLCByZXMpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwZW5kXG4gKiBAZGVzY3JpcHRpb24gQXBwZW5kIGFuIGVsbWVudCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7Kn0gZWwgLSBFbGVtZW50IHRvIGFkZCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgLSBMaXN0IHRvIHdoaWNoIHRvIGFkZCB0aGUgZWxlbWVudFxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGwgPSBbMCwgMV1cbiAqIGFwcGVuZCgnYScsIGwpIC8vIHJldXRuciBbMCwgMSwgJ2EnXVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwZW5kIChlbCwgbGlzdCkge1xuICByZXR1cm4gY29uY2F0KGxpc3QsIFsgZWwgXSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQGRlc2NyaXB0aW9uIFRoZSBhcHBseSgpIG1ldGhvZCBjYWxscyBhIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBhbiBhcnJheSwgYW5kIHRoZSBmdW5jdGlvbiBhcyBjb250ZXh0LlxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBhcHBseShmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykubWFwKHggPT4geCAqIDIpXG4gKiAgIH0pXG4gKiBhKFsxLCAyLCAzXSlcbiAqIC8vIFsyLCA0LCA2XVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwbHkgKGZuLCBhcmdzKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgYXJncylcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gYXJyYXlDb25jYXRcbiAqIEBwYXJhbSBhMVxuICogQHBhcmFtIGEyXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdChhLCBiKVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBlcXVhbHNBcnJheVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIGZvciBkZWVwIGNvbXBhcmlzb24gb2YgYXJyYXlzXG4gKiBAcGFyYW0ge2F9IHggLSBPYmplY3QgdG8gY29tcGFyZSBvZiB0eXBlIGFcbiAqIEBwYXJhbSB7YX0geSAtIE9iamVjdCB4IHRvIGNvbXBhcmUgd2l0aCBvYmplY3QgeFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4uL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZXF1YWxzQXJyYXkgKHgsIHkpIHtcbiAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub3QoZXF1YWxzKHhbaV0sIHlbaV0pKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcnJheUZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXJyYXlGaWx0ZXIgKGZuLCBhKSB7XG4gIHZhciByID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKGFbaV0pKSByLnB1c2goYVtpXSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcHJvdmlkZWQgYXJyYXkgYW5kIGNhbGxpbmcgYW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Y2JGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGl0ZW1cbiAqIEBwYXJhbSB7Kn0gaW5pdCAtIEluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBBcnJheSB3aXRoIGl0ZW1zIHRvIG1vZGlmeSBieSB0aGUgY2IgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFsaWFzIHJlZHVjZVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvbGQoYWRkLCAwLCBbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gM1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNiRnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gciAtIEFjY3VtdWxhdG9yIHdoaWNoIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSB0aGUgaW5kZXkgb2YgdGhlIGl0ZW0gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gVGhlIGluaXRpYWwgYXJyYXlcbiAqIEByZXR1cm4geyp9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSBpbml0XG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNBcnJheVxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBPYmplY3QgdG8gdmVyaWZpeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBpc0FycmF5KFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSB0cnVlXG4gKi9cblxuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQXJyYXknKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIGFuIGFycmF5IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChpZGVudGl0eSwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMCwyLDNdXG4gKiAgY29uc3QgYWRkMiA9IGFkZCgyKVxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChhZGQyLCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFsyLDQsNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBjb25zdCByID0gbmV3IEFycmF5KGwpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltpXSA9IGNiKGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0b0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIGlucHV0IHRvIGFuIGFycmF5XG4gKiBAcGFyYW0ge0FycmF5TGlrZX0geCAtIE9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSB0b0FycmF5KFwic3RyaW5nXCIpXG4gKiAvLyByZXN1bHQgPSBbJ3MnLCd0JywncicsJ2knLCduJywnZyddXG4gKlxuICogZnVuY3Rpb24gKCkge1xuICogIGNvbnN0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcbiAqICBjb25zb2xlLmxvZyh0eXBlb2YgYXJncykgLy8gQXJyYXlcbiAqIH1cbiAqXG4gKiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0FycmF5ICh4KSB7XG4gIHJldHVybiB4Lmxlbmd0aCA9PT0gMSA/IFt4WzBdXSA6IEFycmF5LmFwcGx5KG51bGwsIHgpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdW5pb25BcnJheVxuICogQGRlc2NyaXB0aW9uIE1lcmdlcyAyIGFycmF5c1xuICogQHBhcmFtIHtBcnJheX0gYUwgLSBBcnJheSB0byBtZXJnZVxuICogQHBhcmFtIHtBcnJheX0gYVIgLSBBcnJheSB0byBtZXJnZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdW5pb25BcnJheShbMCwxLDJdLCBbMyw0LDVdKVxuICogLy8gcmVzdWx0ID0gWzAuMS4yLjMuNC41XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB1bmlvbkFycmF5IChhTCwgYVIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhTC5jb25jYXQoYVIpKSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBiaW5hcnlcbiAqIEBwYXJhbSBjYlxuICogQHJldHVybnMge2Z1bmN0aW9uKCo9LCAqPSk6ICp9XG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGJpbmFyeSAoY2IpIHtcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGNiKGEsIGIpXG4gIH0pXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbi8qKlxuICogQGZ1bmN0aW9uIGJpbmRcbiAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0XG4gKiBAcGFyYW0ge2Z1bmN0aW9uIH1mblxuICogQHBhcmFtIHsqfSBjb250ZXh0XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYmluZCAoZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY29udGV4dClcbn0pXG4iLCIvKipcbiAqIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqXG4gKiBAZnVuY3Rpb24gRlxuICogQGRlc2NyaXB0aW9uIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgYWx3YXlzIGZyb20gJy4uL2Fsd2F5cydcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzKGZhbHNlKVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIFRcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyh0cnVlKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiBib3RoIHByZWRpY2F0ZXMgcmV0dXJuIHRydWVcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMSBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4yIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGxpZnQgZnJvbSAnLi4vbGlmdCdcbmltcG9ydCBhbmQgZnJvbSAnLi4vYW5kJ1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBib3RoIChmbjEsIGZuMikge1xuICByZXR1cm4gaXMoJ0Z1bmN0aW9uJykoZm4xKVxuICAgID8gZnVuY3Rpb24gX2JvdGggKCkgeyByZXR1cm4gZm4xLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgJiYgZm4yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxuICAgIDogbGlmdChhbmQpKGZuMSwgZm4yKVxufSlcbiIsIi8qKlxuICogQ3VycmllZCBmdW5jdGlvbiB0aGF0IHZlcmlmaWVzIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcyBhIGJvb2xlYW5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGlzXG4gKiBAZGVzY3JpcHRpb24gQ3VycmllZCBmdW5jdGlvbiB0aGF0IHZlcmlmaWVzIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcyBhIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gSXRlbSB0byB2ZXJpZnlcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdCb29sZWFuJylcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNhbGxcbiAqIEBwYXJhbSBmblxuICogQHJldHVybnMgeyp9XG4gKi9cbi8vIGltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY2FsbCAoZm4pIHtcbiAgcmV0dXJuIGZuLmFwcGx5KGZuLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29tcGxlbWVudFxuICogQGRlc2NyaXB0aW9uIExpZnRzIGEgcHJlZGljYXRlIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoZSBjb21wbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIG5vdFxuICogQHNlZSBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wbGVtZW50KGlzRW1wdHkpXG4gKiBpc05vdEVtcHR5KFtdKSAvLyBmYWxzZVxuICogaXNOb3RFbXB0eSh7J2EnIDogMX0pIC8vIHRydWVcbiAqXG4gKiBjb21wbGVtZW50KE1heWJlLm9mKGZhbHNlKSkgLy8gdHJ1ZVxuICogY29tcGxlbWVudChNYXliZS5vZih0cnVlKSkgLy8gZmFsc2VcbiAqL1xuaW1wb3J0IGxpZnQgZnJvbSAnLi9saWZ0J1xuaW1wb3J0IG5vdCBmcm9tICcuL25vdCdcblxuY29uc3QgY29tcGxlbWVudCA9IGxpZnQobm90KVxuZXhwb3J0IGRlZmF1bHQgY29tcGxlbWVudFxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29tcG9zZVxuICogQHJldHVybnMge2Z1bmN0aW9uKCk6ICp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXBvc2UgKCkge1xuICBsZXQgZm5zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuXG4gIHJldHVybiBmdW5jdGlvbiBfY29tcG9zZSAoKSB7XG4gICAgbGV0IGluaXQgPSBmbnNbZm5zLmxlbmd0aCAtIDFdXG4gICAgbGV0IHJlc3VsdCA9IFtpbml0LmFwcGx5KGluaXQsIGFyZ3VtZW50cyldXG4gICAgbGV0IGkgPSBmbnMubGVuZ3RoIC0gMlxuXG4gICAgZm9yIChpOyBpID49IDA7IC0taSkge1xuICAgICAgY29uc3QgZm4gPSBmbnNbaV1cblxuICAgICAgcmVzdWx0ID0gW2ZuLmFwcGx5KGZuLCByZXN1bHQpXVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0WzBdXG4gIH1cbn07XG4iLCIvKipcbiAqIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKiBAc2luY2UgdjEuMC40XG4gKiBAcGFyYW0ge2F9IGEgLSBMZWZ0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEBwYXJhbSB7YX0gYiAtIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEByZXR1cm4ge2F9IENvbmNhdGVuYXRlZCBpdGVtXG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5Q29uY2F0IGZyb20gJy4vYXJyYXkvY29uY2F0J1xuaW1wb3J0IHN0cmluZ0NvbmNhdCBmcm9tICcuL3N0cmluZy9jb25jYXQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgICdTdHJpbmcnOiBzdHJpbmdDb25jYXQsXG4gICAgJ0FycmF5JzogYXJyYXlDb25jYXRcbiAgfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShhLCBiKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbmRcbiAqIEBwYXJhbSBjb25kc1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25kIChjb25kcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvbmRzW2ldWzBdKHZhbHVlKSkgcmV0dXJuIGNvbmRzW2ldWzFdKHZhbHVlKVxuICAgIH1cbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogQGZ1bmN0aW9uIGN1cnJ5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5IChmdW4pIHtcbiAgY29uc3QgYXJnc2xlbiA9IGZ1bi5sZW5ndGhcblxuICBpZiAoYXJnc2xlbiA9PT0gMCkge1xuICAgIHJldHVybiBmdW5cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVjdXJzZXIoW10pXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoYWNjLCBhcmdzKSB7XG4gICAgY29uc3QgX2FjYyA9IGFjYy5jb25jYXQoYXJncylcbiAgICByZXR1cm4gX2FjYy5sZW5ndGggPCBhcmdzbGVuXG4gICAgICA/IGNyZWF0ZVJlY3Vyc2VyKF9hY2MpXG4gICAgICA6IGZ1bi5hcHBseSh0aGlzLCBfYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVjdXJzZXIgKGFjYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVjdXJzZShhY2MsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBkaWZmRGF0ZVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIGRhdGVzIGluIG1pbGxpc2Vjb25kXG4gKiBAcGFyYW0ge0RhdGV9IHN0YXJ0IC0gU3RhcnQgZGF0ZVxuICogQHBhcmFtIHtEYXRlfSBlbmQgLSBFbmQgZGF0ZVxuICogQHJldHVybiB7bnVtYmVyfSBSRXR1cm4gdGhlIGRpZmZlcmVuY2UgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGlmZkRhdGUgKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChuZXcgRGF0ZShzdGFydCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoZW5kKS5nZXRUaW1lKCkpXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG4vKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0RhdGUnKVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwOS8wMy8yMDE3LlxuICovXG5pbXBvcnQgZGlmZkRhdGUgZnJvbSAnLi9kaWZmRGF0ZSdcblxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IHtcbiAgcmV0dXJuIGRpZmZEYXRlKG5ldyBEYXRlKCkpKGQpIDwgMFxufVxuIiwiLyoqXG4gKlxuICovXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQgKHgpIHtcbiAgLy8gbm9pbnNwZWN0aW9uIEpTQ2hlY2tGdW5jdGlvblNpZ25hdHVyZXNcbiAgcmV0dXJuIGlzRGF0ZSh4KSAmJiBpc0Zpbml0ZSh4LnZhbHVlT2YoKSlcbn07XG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gODY0MDAwMDAgLy8gMjQqNjAqNjAqMTAwMCA9IDg2NDAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAzNjAwMDAwIC8vIDYwKjYwKjEwMDAgPSAzNjAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyA2MDAwMCAvLyA2MCoxMDAwID0gNjAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDEwMDBcclxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZGVmYXVsdFRvXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHthfSBkZWZhdWx0IFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtifSB2YWwgYHZhbGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGBkZWZhdWx0YCB1bmxlc3MgYHZhbGAgaXMgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYC5cbiAqIEByZXR1cm4geyp9IFRoZSBzZWNvbmQgdmFsdWUgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRlZmF1bHRUbyAoZCwgdikge1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdlxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtcHR5ICh4KSB7XG4gIHJldHVybiBuZXcgeC5jb25zdHJ1Y3RvcigpXG59O1xuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlcXVhbHNcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgZXF1YWxpdHkgb2YgMiBpdGVtc1xuICogQHBhcmFtIHsqfSB4IC0gTGVmdCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHBhcmFtIHsqfSB5IC0gUmlnaHQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG5hbiA9IE51bWJlci5OYU5cbiAqIGVxdWFsKG5hbiwgbmFuKSAvLyByZXR1cm5zIHRydWVcbiAqXG4gKiBjb25zdCBhcnIxID0gWzAsIDEsIDIsIDNdXG4gKiBjb25zdCBhcnIyID0gW251bGwsIDEsIDIsIDNdXG4gKiBlcXVhbHMoYXJyMSwgYXJyMikgLy8gcmV0dXJucyBmYWxzZVxuICpcbiAqIGVxdWFscyhuZXcgT2JqZWN0KHsnYSc6IDAsICdiJzogMX0pLCB7J2EnOiAwLCAnYic6IDF9KSAvLyB0cnVlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgaWRlbnRpY2FsIGZyb20gJy4vaWRlbnRpY2FsJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuaW1wb3J0IG5vdCBmcm9tICcuL25vdCdcbmltcG9ydCBvciBmcm9tICcuL29yJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vb2JqZWN0L2lzJ1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9hcnJheS9pcydcbmltcG9ydCBpc0Jvb2xlYW4gZnJvbSAnLi9ib29sZWFuL2lzJ1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vbnVtYmVyL2lzJ1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vc3RyaW5nL2lzJ1xuaW1wb3J0IGlzRGF0ZSBmcm9tICcuL2RhdGUvaXMnXG5pbXBvcnQgZXF1YWxzQXJyYXkgZnJvbSAnLi9hcnJheS9lcXVhbHMnXG5pbXBvcnQgZXF1YWxzT2JqZWN0IGZyb20gJy4vb2JqZWN0L2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZXF1YWxzICh4LCB5KSB7XG4gIGlmIChpZGVudGljYWwoeCwgeSkpIHJldHVybiB0cnVlXG5cbiAgaWYgKHR5cGUoeCkgIT09IHR5cGUoeSkpIHJldHVybiBmYWxzZVxuXG4gIGlmIChvcihub3QoZXhpc3RzKHgpKSwgbm90KGV4aXN0cyh5KSkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0geS5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKGlzU3RyaW5nKHgpIHx8IGlzQm9vbGVhbih4KSB8fCBpc051bWJlcih4KSB8fCBpc0RhdGUoeCkpIHtcbiAgICByZXR1cm4gaWRlbnRpY2FsKHgudmFsdWVPZigpLCB5LnZhbHVlT2YoKSlcbiAgfVxuICBpZiAoaXNBcnJheSh4KSkge1xuICAgIHJldHVybiBlcXVhbHNBcnJheSh4LCB5KVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc09iamVjdCh4LCB5KVxuICB9XG4gIHJldHVybiBmYWxzZVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGV4aXN0c1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleGlzdHMgKHgpIHtcbiAgcmV0dXJuICEoeCA9PSBudWxsKVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpbHRlclxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1Y250aW9uIHRoYXQgZmlsdGVycyBPYmplY3RzLCBBcnJheXMgYW5kIE1hcHNcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5RmlsdGVyIGZyb20gJy4vYXJyYXkvZmlsdGVyJ1xuaW1wb3J0IG9iamVjdEZpbHRlciBmcm9tICcuL29iamVjdC9maWx0ZXInXG5pbXBvcnQgbWFwRmlsdGVyIGZyb20gJy4vbWFwL2ZpbHRlcidcbi8vIFRPRE9cbi8vIGltcG9ydCBzZXRGaWx0ZXIgZnJvbSAnLi4vc2V0L2ZpbHRlcidcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmlsdGVyIChmbiwgYSkge1xuICBzd2l0Y2ggKHR5cGUoYSkpIHtcbiAgICAvLyBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSkge1xuICAgIC8vIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAvLyAgIHJldHVybiBjdXJyeShmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIHJldHVybiBjYi5jYWxsKHRoaXMsIGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSlcbiAgICAvLyAgIH0pXG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBvYmplY3RGaWx0ZXIoZm4sIGEpXG4gICAgLy8gY2FzZSAnU3RyaW5nJzpcbiAgICAvLyAgIHJldHVybiBzdHJpbmdNYXAoY2IsIGEpXG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBtYXBGaWx0ZXIoZm4sIGEpXG4gICAgLy8gY2FzZSAnU2V0JzpcbiAgICAvLyAgIHJldHVybiBzZXRGaWx0ZXIoZm4sIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihmbiwgYSlcbiAgfVxufSlcbiIsIi8qKlxuICogRmluZCB0aGUgaW5kZXggbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZmluZEluZGV4XG4gKiBAZGVzY3JpcHRpb24gRmluZCB0aGUgaW5kZXggbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYm9vbGVhbikgLT4gW2FdIC0+IG51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gUHJlZGljYXRlIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBBbiBhcnJheSBsaWtlIG9iamVjdFxuICogQHJldHVybiB7bnVtYmVyfVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmluZEluZGV4IChmbiwgYSkge1xuICBsZXQgaSA9IDBcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIGlmIChmbihhW2ldKSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIC0xXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZmlyc3RcbiAqIEBwYXJhbSBbYV1cbiAqIEByZXR1cm4gYSB8IHVuZGVmaW5lZFxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhcnIgPSBbMSwgMiwgNF1cbiAqIGZpcnN0KFsxLCAyLCA0XSkgLy8gcmV0dXJucyAxXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBmaXJzdCAoYSkge1xuICByZXR1cm4gYSAmJiBhLmxlbmd0aCA/IGFbMF0gOiB1bmRlZmluZWRcbn0pXG4iLCJpbXBvcnQgZm9sZCBmcm9tICcuL2ZvbGQnXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBpcyBmcm9tICcuL2lzJ1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuLyoqXG4gKiBAZnVuY3Rpb24gZmxhdE1hcFxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmbGF0TWFwIChmbiwgYSkge1xuICBpZiAoaXNGdW5jdGlvbihhKSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIGZuKGEoeCkpKHgpXG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGEuZmxhdE1hcCkpIHtcbiAgICByZXR1cm4gYS5mbGF0TWFwKGZuKVxuICB9XG4gIHJldHVybiBmb2xkKChhY2MsIHgpID0+IGNvbmNhdChhY2MsIGZuKHgpKSwgZW1wdHkoYSksIGEpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHZhbHVlIHN1cHBsaWVkIHRvIHRoZSBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlkZW50aXR5ICh4KSB7XG4gIHJldHVybiB4XG59O1xuIiwiLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBfXyB9IGZyb20gJy4vX18nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcGVydHVyZSB9IGZyb20gJy4vYXBlcnR1cmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5U3BlYyB9IGZyb20gJy4vYXBwbHlTcGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVRvIH0gZnJvbSAnLi9hcHBseVRvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc2NlbmQgfSBmcm9tICcuL2FzY2VuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2MgfSBmcm9tICcuL2Fzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvY1BhdGggfSBmcm9tICcuL2Fzc29jUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xhbXAgfSBmcm9tICcuL2NsYW1wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBhcmF0b3IgfSBmcm9tICcuL2NvbXBhcmF0b3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VLIH0gZnJvbSAnLi9jb21wb3NlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVAgfSBmcm9tICcuL2NvbXBvc2VQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlV2l0aCB9IGZyb20gJy4vY29tcG9zZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdCB9IGZyb20gJy4vY29uc3RydWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3ROIH0gZnJvbSAnLi9jb25zdHJ1Y3ROJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb250YWlucyB9IGZyb20gJy4vY29udGFpbnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnZlcmdlIH0gZnJvbSAnLi9jb252ZXJnZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY291bnRCeSB9IGZyb20gJy4vY291bnRCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjIH0gZnJvbSAnLi9kZWMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlc2NlbmQgfSBmcm9tICcuL2Rlc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2UgfSBmcm9tICcuL2RpZmZlcmVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2VXaXRoIH0gZnJvbSAnLi9kaWZmZXJlbmNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlzc29jIH0gZnJvbSAnLi9kaXNzb2MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvY1BhdGggfSBmcm9tICcuL2Rpc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3AgfSBmcm9tICcuL2Ryb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0IH0gZnJvbSAnLi9kcm9wTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3RXaGlsZSB9IGZyb20gJy4vZHJvcExhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHMgfSBmcm9tICcuL2Ryb3BSZXBlYXRzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0c1dpdGggfSBmcm9tICcuL2Ryb3BSZXBlYXRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFdoaWxlIH0gZnJvbSAnLi9kcm9wV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVpdGhlciB9IGZyb20gJy4vZWl0aGVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlbmRzV2l0aCB9IGZyb20gJy4vZW5kc1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxQnkgfSBmcm9tICcuL2VxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxUHJvcHMgfSBmcm9tICcuL2VxUHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGV2b2x2ZSB9IGZyb20gJy4vZXZvbHZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kIH0gZnJvbSAnLi9maW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdCB9IGZyb20gJy4vZmluZExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRMYXN0SW5kZXggfSBmcm9tICcuL2ZpbmRMYXN0SW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsYXR0ZW4gfSBmcm9tICcuL2ZsYXR0ZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsaXAgfSBmcm9tICcuL2ZsaXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2ggfSBmcm9tICcuL2ZvckVhY2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2hPYmpJbmRleGVkIH0gZnJvbSAnLi9mb3JFYWNoT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZnJvbVBhaXJzIH0gZnJvbSAnLi9mcm9tUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwQnkgfSBmcm9tICcuL2dyb3VwQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwV2l0aCB9IGZyb20gJy4vZ3JvdXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndCB9IGZyb20gJy4vZ3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGd0ZSB9IGZyb20gJy4vZ3RlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNQYXRoIH0gZnJvbSAnLi9oYXNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoZWFkIH0gZnJvbSAnLi9oZWFkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpZkVsc2UgfSBmcm9tICcuL2lmRWxzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5jIH0gZnJvbSAnLi9pbmMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluY2x1ZGVzIH0gZnJvbSAnLi9pbmNsdWRlcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhCeSB9IGZyb20gJy4vaW5kZXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhPZiB9IGZyb20gJy4vaW5kZXhPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5pdCB9IGZyb20gJy4vaW5pdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5uZXJKb2luIH0gZnJvbSAnLi9pbm5lckpvaW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluc2VydCB9IGZyb20gJy4vaW5zZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnRBbGwgfSBmcm9tICcuL2luc2VydEFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9pbnRlcnNlY3Rpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc3BlcnNlIH0gZnJvbSAnLi9pbnRlcnNwZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50byB9IGZyb20gJy4vaW50bydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52ZXJ0IH0gZnJvbSAnLi9pbnZlcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydE9iaiB9IGZyb20gJy4vaW52ZXJ0T2JqJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZva2VyIH0gZnJvbSAnLi9pbnZva2VyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqb2luIH0gZnJvbSAnLi9qb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqdXh0IH0gZnJvbSAnLi9qdXh0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0SW5kZXhPZiB9IGZyb20gJy4vbGFzdEluZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbmd0aCB9IGZyb20gJy4vbGVuZ3RoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zIH0gZnJvbSAnLi9sZW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zSW5kZXggfSBmcm9tICcuL2xlbnNJbmRleCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1BhdGggfSBmcm9tICcuL2xlbnNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUHJvcCB9IGZyb20gJy4vbGVuc1Byb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxpZnROIH0gZnJvbSAnLi9saWZ0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHQgfSBmcm9tICcuL2x0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsdGUgfSBmcm9tICcuL2x0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW0gfSBmcm9tICcuL21hcEFjY3VtJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bVJpZ2h0IH0gZnJvbSAnLi9tYXBBY2N1bVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBPYmpJbmRleGVkIH0gZnJvbSAnLi9tYXBPYmpJbmRleGVkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRjaCB9IGZyb20gJy4vbWF0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hdGhNb2QgfSBmcm9tICcuL21hdGhNb2QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1heEJ5IH0gZnJvbSAnLi9tYXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVhbiB9IGZyb20gJy4vbWVhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVkaWFuIH0gZnJvbSAnLi9tZWRpYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lbW9pemVXaXRoIH0gZnJvbSAnLi9tZW1vaXplV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VBbGwgfSBmcm9tICcuL21lcmdlQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBMZWZ0IH0gZnJvbSAnLi9tZXJnZURlZXBMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBSaWdodCB9IGZyb20gJy4vbWVyZ2VEZWVwUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGggfSBmcm9tICcuL21lcmdlRGVlcFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGhLZXkgfSBmcm9tICcuL21lcmdlRGVlcFdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlTGVmdCB9IGZyb20gJy4vbWVyZ2VMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVJpZ2h0IH0gZnJvbSAnLi9tZXJnZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVdpdGggfSBmcm9tICcuL21lcmdlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZVdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1pbiB9IGZyb20gJy4vbWluJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW5CeSB9IGZyb20gJy4vbWluQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1vZHVsbyB9IGZyb20gJy4vbW9kdWxvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb3ZlIH0gZnJvbSAnLi9tb3ZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuQXJ5IH0gZnJvbSAnLi9uQXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuZWdhdGUgfSBmcm9tICcuL25lZ2F0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbm9uZSB9IGZyb20gJy4vbm9uZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoIH0gZnJvbSAnLi9udGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aEFyZyB9IGZyb20gJy4vbnRoQXJnJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvIH0gZnJvbSAnLi9vJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvYmpPZiB9IGZyb20gJy4vb2JqT2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9mIH0gZnJvbSAnLi9vZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb25jZSB9IGZyb20gJy4vb25jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb3RoZXJ3aXNlIH0gZnJvbSAnLi9vdGhlcndpc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG92ZXIgfSBmcm9tICcuL292ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhaXIgfSBmcm9tICcuL3BhaXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWwgfSBmcm9tICcuL3BhcnRpYWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWxSaWdodCB9IGZyb20gJy4vcGFydGlhbFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aXRpb24gfSBmcm9tICcuL3BhcnRpdGlvbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aEVxIH0gZnJvbSAnLi9wYXRoRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhPciB9IGZyb20gJy4vcGF0aE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoU2F0aXNmaWVzIH0gZnJvbSAnLi9wYXRoU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQWxsIH0gZnJvbSAnLi9waWNrQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQnkgfSBmcm9tICcuL3BpY2tCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZSB9IGZyb20gJy4vcGlwZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZUsgfSBmcm9tICcuL3BpcGVLJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlUCB9IGZyb20gJy4vcGlwZVAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVXaXRoIH0gZnJvbSAnLi9waXBlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGx1Y2sgfSBmcm9tICcuL3BsdWNrJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVwZW5kIH0gZnJvbSAnLi9wcmVwZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9qZWN0IH0gZnJvbSAnLi9wcm9qZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wRXEgfSBmcm9tICcuL3Byb3BFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcElzIH0gZnJvbSAnLi9wcm9wSXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BPciB9IGZyb20gJy4vcHJvcE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wcyB9IGZyb20gJy4vcHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BTYXRpc2ZpZXMgfSBmcm9tICcuL3Byb3BTYXRpc2ZpZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJhbmdlIH0gZnJvbSAnLi9yYW5nZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZUJ5IH0gZnJvbSAnLi9yZWR1Y2VCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlZCB9IGZyb20gJy4vcmVkdWNlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlUmlnaHQgfSBmcm9tICcuL3JlZHVjZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VXaGlsZSB9IGZyb20gJy4vcmVkdWNlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlamVjdCB9IGZyb20gJy4vcmVqZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmUgfSBmcm9tICcuL3JlbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwZWF0IH0gZnJvbSAnLi9yZXBlYXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGxhY2UgfSBmcm9tICcuL3JlcGxhY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNjYW4gfSBmcm9tICcuL3NjYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2V0IH0gZnJvbSAnLi9zZXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNsaWNlIH0gZnJvbSAnLi9zbGljZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydCB9IGZyb20gJy4vc29ydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydEJ5IH0gZnJvbSAnLi9zb3J0QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRXaXRoIH0gZnJvbSAnLi9zb3J0V2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXQgfSBmcm9tICcuL3NwbGl0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEF0IH0gZnJvbSAnLi9zcGxpdEF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEV2ZXJ5IH0gZnJvbSAnLi9zcGxpdEV2ZXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdFdoZW4gfSBmcm9tICcuL3NwbGl0V2hlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3RhcnRzV2l0aCB9IGZyb20gJy4vc3RhcnRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3VidHJhY3QgfSBmcm9tICcuL3N1YnRyYWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlIH0gZnJvbSAnLi9zeW1tZXRyaWNEaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhaWwgfSBmcm9tICcuL3RhaWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2UgfSBmcm9tICcuL3Rha2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0IH0gZnJvbSAnLi90YWtlTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3RXaGlsZSB9IGZyb20gJy4vdGFrZUxhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZVdoaWxlIH0gZnJvbSAnLi90YWtlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhcCB9IGZyb20gJy4vdGFwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZXN0IH0gZnJvbSAnLi90ZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aGVuIH0gZnJvbSAnLi90aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aHVua2lmeSB9IGZyb20gJy4vdGh1bmtpZnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRpbWVzIH0gZnJvbSAnLi90aW1lcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Mb3dlciB9IGZyb20gJy4vdG9Mb3dlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlycyB9IGZyb20gJy4vdG9QYWlycydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlyc0luIH0gZnJvbSAnLi90b1BhaXJzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvU3RyaW5nIH0gZnJvbSAnLi90b1N0cmluZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9VcHBlciB9IGZyb20gJy4vdG9VcHBlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhbnNkdWNlIH0gZnJvbSAnLi90cmFuc2R1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmF2ZXJzZSB9IGZyb20gJy4vdHJhdmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyaW0gfSBmcm9tICcuL3RyaW0nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyeUNhdGNoIH0gZnJvbSAnLi90cnlDYXRjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcHBseSB9IGZyb20gJy4vdW5hcHBseSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcnkgfSBmcm9tICcuL3VuYXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmN1cnJ5TiB9IGZyb20gJy4vdW5jdXJyeU4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuZm9sZCB9IGZyb20gJy4vdW5mb2xkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbldpdGggfSBmcm9tICcuL3VuaW9uV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gJy4vdW5pcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcUJ5IH0gZnJvbSAnLi91bmlxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFXaXRoIH0gZnJvbSAnLi91bmlxV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5sZXNzIH0gZnJvbSAnLi91bmxlc3MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubmVzdCB9IGZyb20gJy4vdW5uZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bnRpbCB9IGZyb20gJy4vdW50aWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VXaXRoIH0gZnJvbSAnLi91c2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXNJbiB9IGZyb20gJy4vdmFsdWVzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHZpZXcgfSBmcm9tICcuL3ZpZXcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZW4gfSBmcm9tICcuL3doZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlIH0gZnJvbSAnLi93aGVyZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmVFcSB9IGZyb20gJy4vd2hlcmVFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aG91dCB9IGZyb20gJy4vd2l0aG91dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgeHByb2QgfSBmcm9tICcuL3hwcm9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBPYmogfSBmcm9tICcuL3ppcE9iaidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkIH0gZnJvbSAnLi9udW1iZXIvYWRkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRJbmRleCB9IGZyb20gJy4vYWRkSW5kZXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkanVzdCB9IGZyb20gJy4vYWRqdXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3RXaXRoIH0gZnJvbSAnLi9hZGp1c3RXaXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGwgfSBmcm9tICcuL2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsUGFzcyB9IGZyb20gJy4vYWxsUGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWx3YXlzIH0gZnJvbSAnLi9hbHdheXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuZCB9IGZyb20gJy4vYW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnkgfSBmcm9tICcuL2FueSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55UGFzcyB9IGZyb20gJy4vYW55UGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXAgfSBmcm9tICcuL2FwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmQgfSBmcm9tICcuL2FwcGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHkgfSBmcm9tICcuL2FwcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5hcnkgfSBmcm9tICcuL2JpbmFyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluZCB9IGZyb20gJy4vYmluZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm90aCB9IGZyb20gJy4vYm9vbGVhbi9ib3RoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjYWxsIH0gZnJvbSAnLi9jYWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wbGVtZW50IH0gZnJvbSAnLi9jb21wbGVtZW50J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlIH0gZnJvbSAnLi9jb21wb3NlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uZCB9IGZyb20gJy4vY29uZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3VycnkgfSBmcm9tICcuL2N1cnJ5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWZhdWx0VG8gfSBmcm9tICcuL2RlZmF1bHRUbydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZkRhdGUgfSBmcm9tICcuL2RhdGUvZGlmZkRhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpdmlkZSB9IGZyb20gJy4vbnVtYmVyL2RpdmlkZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW1wdHkgfSBmcm9tICcuL2VtcHR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcXVhbHMgfSBmcm9tICcuL2VxdWFscydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXhpc3RzIH0gZnJvbSAnLi9leGlzdHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEYgfSBmcm9tICcuL2Jvb2xlYW4vRidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlsdGVyIH0gZnJvbSAnLi9maWx0ZXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRJbmRleCB9IGZyb20gJy4vZmluZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXJzdCB9IGZyb20gJy4vZmlyc3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZsYXRNYXAgfSBmcm9tICcuL2ZsYXRNYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvbGQgfSBmcm9tICcuL2ZvbGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvcm1hdFN0cmluZyB9IGZyb20gJy4vc3RyaW5nL2Zvcm1hdFN0cmluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzIH0gZnJvbSAnLi9vYmplY3QvaGFzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNJbiB9IGZyb20gJy4vb2JqZWN0L2hhc0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGljYWwgfSBmcm9tICcuL2lkZW50aWNhbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpdHkgfSBmcm9tICcuL2lkZW50aXR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpcyB9IGZyb20gJy4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJyYXkgfSBmcm9tICcuL2FycmF5L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jvb2xlYW4gfSBmcm9tICcuL2Jvb2xlYW4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRGF0ZSB9IGZyb20gJy4vZGF0ZS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNGdXR1cmVEYXRlIH0gZnJvbSAnLi9kYXRlL2lzRnV0dXJlRGF0ZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNNYXAgfSBmcm9tICcuL21hcC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOYW4gfSBmcm9tICcuL251bWJlci9pc05hbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdWxsIH0gZnJvbSAnLi9udWxsL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc051bWJlciB9IGZyb20gJy4vbnVtYmVyL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1NldCB9IGZyb20gJy4vc2V0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1N0cmluZyB9IGZyb20gJy4vc3RyaW5nL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc1ZhbGlkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKdXN0IH0gZnJvbSAnLi9tb25hZHMvSnVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5cyB9IGZyb20gJy4va2V5cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5c0luIH0gZnJvbSAnLi9vYmplY3Qva2V5c0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0IH0gZnJvbSAnLi9sYXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0IH0gZnJvbSAnLi9saWZ0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXAgfSBmcm9tICcuL21hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4IH0gZnJvbSAnLi9tYXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE1heWJlIH0gZnJvbSAnLi9tb25hZHMvTWF5YmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlIH0gZnJvbSAnLi9vYmplY3QvbWVyZ2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG11bHRpcGx5IH0gZnJvbSAnLi9udW1iZXIvbXVsdGlwbHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vdCB9IGZyb20gJy4vbm90J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOb3RoaW5nIH0gZnJvbSAnLi9tb25hZHMvTm90aGluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb21pdCB9IGZyb20gJy4vb2JqZWN0L29taXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yIH0gZnJvbSAnLi9vcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aCB9IGZyb20gJy4vb2JqZWN0L3BhdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tICcuL29iamVjdC9waWNrJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wIH0gZnJvbSAnLi9vYmplY3QvcHJvcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3VtIH0gZnJvbSAnLi9udW1iZXIvc3VtJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUIH0gZnJvbSAnLi9ib29sZWFuL1QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvRGF5IH0gZnJvbSAnLi9kYXRlL3RvRGF5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0hvdXIgfSBmcm9tICcuL2RhdGUvdG9Ib3VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b01pbnV0ZXMgfSBmcm9tICcuL2RhdGUvdG9NaW51dGVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlY29uZHMgfSBmcm9tICcuL2RhdGUvdG9TZWNvbmRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnV0aHkgfSBmcm9tICcuL3RydXRoeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHlwZSB9IGZyb20gJy4vdHlwZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tICcuL2FycmF5L3VuaW9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXMgfSBmcm9tICcuL29iamVjdC92YWx1ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcCB9IGZyb20gJy4vemlwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBXaXRoIH0gZnJvbSAnLi96aXBXaXRoJ1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBWZXJpZmllcyB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRcbiAqXG4gKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlzIChDdG9yLCB2YWwpIHtcbiAgcmV0dXJuIHR5cGUodmFsKSA9PT0gQ3RvclxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VtcHR5ICh4KSB7XG4gIHJldHVybiBleGlzdHMoeCkgJiYgZXF1YWxzKHgsIGVtcHR5KHgpKVxufTtcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzSXRlciAoaXRlcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihpdGVyW1N5bWJvbC5pdGVyYXRvcl0pXG59XG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqXG4gKiBAZnVuY3Rpb24ga2V5c1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBpdGVyYXRvclxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBvYmogLT4gWypdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gT2JqIGZyb20gemhpY2ggdG8gdGFrZSB0aGUga2V5c1xuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBvYmplY3RLZXlzIGZyb20gJy4vb2JqZWN0L2tleXMnXG5pbXBvcnQgbWFwS2V5cyBmcm9tICcuL21hcC9rZXlzJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKG9iaikge1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwS2V5cyhvYmopXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RLZXlzKG9iailcbiAgfVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGxhc3RcbiAqIEBwYXJhbSBbYV1cbiAqIEByZXR1cm4gYSB8IHVuZGVmaW5lZFxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gbGFzdCAoYSkge1xuICByZXR1cm4gYSAmJiBhLmxlbmd0aCA/IGFbYS5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZFxufSlcbiIsIi8qKlxuICogXCJsaWZ0c1wiIGEgZnVuY3Rpb24gb2YgYXJpdHkgPiAxIHNvIHRoYXQgaXQgbWF5IFwibWFwIG92ZXJcIiBhIGxpc3QsIEZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGxpZnRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKCouLi4gLT4gKikgLT4gKFsqXS4uLiAtPiBbKl0pXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgZm9sZCBmcm9tICcuL2ZvbGQnXG5pbXBvcnQgYXAgZnJvbSAnLi9hcCdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGxpZnQgKGZuKSB7XG4gIGNvbnN0IGxpZnRlZCA9IGN1cnJ5MShjdXJyeShmbikpXG4gIHJldHVybiBjdXJyeShmdW5jdGlvbiBfbGlmdCAoKSB7XG4gICAgcmV0dXJuIGZvbGQoYXAsIG1hcChsaWZ0ZWQsIGFyZ3VtZW50c1swXSksIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG4gIH0pXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gaXRlcmFibGUgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCBtYXBzIG92ZXIgYW4gaXRlcmFibGUuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBiIC0+IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vYXJyYXkvbWFwJ1xuaW1wb3J0IG9iamVjdE1hcCBmcm9tICcuL29iamVjdC9tYXAnXG5pbXBvcnQgbWFwTWFwIGZyb20gJy4vbWFwL21hcCdcbmltcG9ydCBzdHJpbmdNYXAgZnJvbSAnLi9zdHJpbmcvbWFwJ1xuaW1wb3J0IGl0ZXJhdG9yTWFwIGZyb20gJy4vaXRlcmF0b3IvbWFwJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuaW1wb3J0IGlzSXRlcmF0b3IgZnJvbSAnLi9pdGVyYXRvci9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBzd2l0Y2ggKHR5cGUoYSkpIHtcbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0TWFwKGNiLCBhKVxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwTWFwKGNiLCBhKVxuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiBhcnJheU1hcChjYiwgYSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGlzSXRlcmF0b3IoYSlcbiAgICAgICAgPyBpdGVyYXRvck1hcChjYiwgYSlcbiAgICAgICAgOiBhcnJheU1hcChjYiwgYSlcbiAgfVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwRmlsdGVyIChmbiwgbSkge1xuICBsZXQgciA9IG5ldyBNYXAoKVxuXG4gIGxldCBpdCA9IG0uZW50cmllcygpXG4gIGxldCByZXN1bHQgPSBpdC5uZXh0KClcblxuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgayA9IHJlc3VsdC52YWx1ZVswXVxuICAgIGNvbnN0IHYgPSByZXN1bHQudmFsdWVbMV1cbiAgICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gICAgcmVzdWx0ID0gaXQubmV4dCgpXG4gIH1cblxuICAvLyBMaW1pdGVkIGJyb3dzZXIgc3VwcG9ydFxuICAvLyBtLmZvckVhY2goKHYsIGspID0+IHtcbiAgLy8gICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gIC8vIH0pXG5cbiAgLy8gYmFiZWwgdHJhbnNwaWxlIGlzc3Vlc1xuICAvLyBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtLmVudHJpZXMoKSkge1xuICAvL1xuICAvLyB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdNYXAnKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBNYXAgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIGEua2V5cygpXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBNYXAgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7TWFwfSBhXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIGEuZm9yRWFjaCgodiwgaywgbWFwKSA9PiB7XG4gICAgci5zZXQoaywgY2IodiwgaywgbWFwKSlcbiAgfSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIGxhcmdlc3Qgb2YgdGhlIDIgYXJndW1lbnRzIHByb3ZpZGVkXG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4geyp9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWF4IChhLCBiKSB7XG4gIHJldHVybiBiID4gYSA/IGIgOiBhXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gSnVzdFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMge0p1c3R9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IEp1c3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX3ZhbHVlID0gdmFsXG4gIHJldHVybiB0aGlzXG59XG5cbkp1c3QucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cbkp1c3QucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IEp1c3RcbiIsImltcG9ydCBKdXN0IGZyb20gJy4vSnVzdCdcbmltcG9ydCBOb3RoaW5nIGZyb20gJy4vTm90aGluZydcblxuLyoqXG4gKiBAZnVuY3Rpb24gTWF5YmVcbiAqIEBwYXJhbSB2YWxcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTWF5YmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxufVxuXG5NYXliZS5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1heWJlKSByZXR1cm4gdmFsXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgTWF5YmUpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF5YmUodmFsKVxufVxuXG5NYXliZS5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIHRoaXMuaXNOb3RoaW5nKCkgPyBuIDogdGhpcy5fX3ZhbHVlXG59XG5cbk1heWJlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZikge1xuICBpZiAodGhpcy5pc05vdGhpbmcoKSkge1xuICAgIHJldHVybiBNYXliZS5vZihudWxsKVxuICB9XG4gIHJldHVybiBNYXliZS5vZihmKHRoaXMuX192YWx1ZSkpXG59XG5cbk1heWJlLnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChtKSB7XG4gIHJldHVybiBtLm1hcCh0aGlzLl9fdmFsdWUpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodGhpcy5fX3ZhbHVlID09IG51bGwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhdGhpcy5pc05vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nKClcbn1cblxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgSnVzdCh0aGlzLl92YWx1ZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF5YmVcbiIsIi8qKlxuICogQGZ1bmN0aW9uIE5vdGhpbmdcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbn1cblxuTm90aGluZy5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cbk5vdGhpbmcucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aGluZ1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbm90XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBub3QgKHgpIHtcbiAgcmV0dXJuICF4XG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMy8wMi8yMDE5XG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ251bGwnKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uIGFkZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgcmV0dXJuICthICsgK2Jcbn0pXG4iLCIvKipcbiAqXG4gKlxuICogQGZ1bmN0aW9uIGRpdmlkZVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRpdmlzaW9uIG9mIHRoZSAyIGFyZ3VtZW50c1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpdmlkZSAoYSwgYikge1xuICByZXR1cm4gK2EgLyArYlxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTnVtYmVyJylcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzTmFOXG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIG51bWJlciBpcyBOQU5cblxuICovXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9pcydcbmltcG9ydCBhbmQgZnJvbSAnLi4vYW5kJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc05hbiAoeCkge1xuICByZXR1cm4gYW5kKGlzTnVtYmVyKHgpLCBpc05hTih4KSlcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbXVsdGlwbHkgKGEsIGIpIHtcbiAgcmV0dXJuICthICogK2Jcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgbnVtYmVycyBpbiBhbiBhcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbTnVtYmVyXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBhZGQgZnJvbSAnLi9hZGQnXG5pbXBvcnQgZm9sZCBmcm9tICcuLi9mb2xkJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBzdW0gKGEpIHtcbiAgcmV0dXJuIGZvbGQoYWRkLCAwLCBhKVxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuLi9leGlzdHMnXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoeCwgeSkgPT4ge1xuICBmb3IgKGxldCBrZXlYIGluIHgpIHtcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbmZpbHRlcmVkRm9ySW5Mb29wXG4gICAgaWYgKG5vdChlcXVhbHMoeFtrZXlYXSwgeVtrZXlYXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGtleVkgaW4geSkge1xuICAgIGlmIChub3QoZXhpc3RzKHhba2V5WV0pKSAmJiBleGlzdHMoeVtrZXlZXSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvYmplY3RGaWx0ZXJcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9iamVjdEZpbHRlciAoZm4sIG8pIHtcbiAgbGV0IHIgPSB7fVxuICBjb25zdCBrID0ga2V5cyhvKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZm4ob1trW2ldXSkpIHJba1tpXV0gPSBvW2tbaV1dXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcge1N0cmluZ30gLT4ge09iamVjdH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGhhcyAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5LCBldmVuIGlmIGl0IGlzIGluaGVyaXRlZFxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzSW4gKHByb3AsIG9iaikge1xuICByZXR1cm4gcHJvcCBpbiBvYmpcbn0pXG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdPYmplY3QnKVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBvYmplY3QgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKE9iamVjdChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYWxsIHRoZSBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICBjb25zdCByID0gW11cbiAgZm9yIChjb25zdCBrIGluIGEpIHtcbiAgICByLnB1c2goaylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIG9iamVjdCBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBlbXB0eSBmcm9tICcuLi9lbXB0eSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBjb25zdCBrID0ga2V5cyhhKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gZW1wdHkoYSlcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByW2tbaV1dID0gY2IoYVtrW2ldXSwga1tpXSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuLi9pZGVudGljYWwnXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi4vb2JqZWN0L2lzJ1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi4vYXJyYXkvaXMnXG5pbXBvcnQgdW5pb24gZnJvbSAnLi4vYXJyYXkvdW5pb24nXG5cbmNvbnN0IG1lcmdlID0gY3VycnkoKG9iakwsIG9ialIpID0+IHtcbiAgbGV0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9iakwpXG5cbiAgaWYgKGlkZW50aWNhbChvYmpMLCBvYmpSKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuICB9XG4gIGZvciAobGV0IGtleSBpbiBvYmpSKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqUiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgb2xkVmFsdWUgPSBvYmpSW2tleV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IG9iakxba2V5XVxuXG4gICAgaWYgKGlzT2JqZWN0KG9sZFZhbHVlKSAmJiBpc09iamVjdChuZXdWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShuZXdWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdW5pb24obmV3VmFsdWUsIG9sZFZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9sZFZhbHVlIC8vIFRPRE86IHRoaXMgaXMgYSByZWZlcmVuY2UsIHNob3VsZCBiZSBjbG9uZVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59KVxuXG5leHBvcnQgZGVmYXVsdCBtZXJnZVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChvYmosIG5hbWVzKSA9PiB7XG4gIGxldCByZXN1bHQgPSB7fVxuXG4gIE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKChrZXkpID0+IHtcbiAgICByZXR1cm4gbmFtZXMuaW5kZXhPZihrZXkpID09PSAtMVxuICB9KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICByZXN1bHRba2V5XSA9IG9ialtrZXldXG4gIH0pXG4gIHJldHVybiByZXN1bHRcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBwYXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGF0aCAocGF0aCwgb2JqKSB7XG4gIGxldCB2YWwgPSBvYmpcbiAgbGV0IGlkeCA9IDBcbiAgbGV0IHBcbiAgd2hpbGUgKGlkeCA8IHBhdGgubGVuZ3RoKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcCA9IHBhdGhbaWR4XVxuICAgIHZhbCA9IE51bWJlci5pc0ludGVnZXIocClcbiAgICAgID8gcCA8IDAgPyB2YWxbdmFsLmxlbmd0aCArIHBdIDogdmFsW3BdXG4gICAgICA6IHZhbFtwXVxuICAgIGlkeCArPSAxXG4gIH1cbiAgcmV0dXJuIHZhbFxufSlcbi8vIGxldCByID0gb2JqXG4vLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbi8vICAgaWYgKHIgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuLy8gICByID0gcltwYXRoW2ldXVxuLy8gfVxuLy8gcmV0dXJuIHJcbi8vIH0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBwaWNrXG4gKiBAZGVzY3JpcHRpb24gcmV0dXJucyBhIG5ldyBiamVjdCB3aXRoIG9ubHkgdGhlIHByb3BzIHRoYXQgYXJlIHByb3ZpZGVkXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyAtIEFycmF5IG9mIHByb3BlcnR5IG5hbWVzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwaWNrIChwcm9wcywgb2JqKSB7XG4gIGNvbnN0IHIgPSB7fVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKGkgPCBwcm9wcy5sZW5ndGgpIHtcbiAgICBpZiAocHJvcHNbaV0gaW4gb2JqKSB7XG4gICAgICByW3Byb3BzW2ldXSA9IG9ialtwcm9wc1tpXV1cbiAgICB9XG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBwcm9wXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcHJvcCAocCwgb2JqKSB7XG4gIHJldHVybiBvYmpbcF1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiB2YWx1ZXNcbiAqIEBkZXNjcmlwdGlvbiBSRXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgdGFrZW4gZnJvbSBhbiBvYmplY3RzIG93biBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gLSBvYmogVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHZhbHVlc1xuICogQHJldHVybiB7YXJyYXl9XG4gKlxuICoqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiB2YWx1ZXMgKG9iaikge1xuICBjb25zdCBrID0ga2V5cyhvYmopXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gW11cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIHJbaV0gPSBvYmpba1tpXV1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG9yXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIG9uZSBvciB0aGUgb3RoZXIgaXMgdHJ1ZVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gb3IgKHgsIHkpIHtcbiAgcmV0dXJuIHggfHwgeVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU2V0JylcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBzdHJpbmdDb25jYXRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgcmV0dXJuIFN0cmluZyhhKSArIFN0cmluZyhiKVxufVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxuICovXG5pbXBvcnQgdG9BcnJheSBmcm9tICcuLi9hcnJheS90bydcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcgKHN0cikgeyAvLyB1c2UgZnVuY3Rpb24oKSwgYXJyb3cgZnVuY3Rpb24gZG9lc24ndCBiaW5kIGFyZ3VtZW50c1xuICBsZXQgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKVxuXG4gIGFyZ3Muc2hpZnQoKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL3soXFxkKyl9L2csIChtYXRjaCwgaWR4KSA9PiB7XG4gICAgcmV0dXJuIG5vdChpcygnVW5kZWZpbmVkJywgYXJnc1tpZHhdKSkgPyBhcmdzW2lkeF0gOiBtYXRjaFxuICB9KVxufVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU3RyaW5nJylcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgc3RyaW5nIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBsZXQgciA9ICcnXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciArPSBjYihhLmNoYXJBdChpKSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRydXRoeVxuICovXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cnV0aHkgKHgpIHtcbiAgcmV0dXJuICh4ICE9PSBmYWxzZSkgJiYgZXhpc3RzKHgpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCd1bmRlZmluZWQnKVxuIiwiLyoqXG5cbiAqIHppcFxuICpcbiAqIEBmdW5jdGlvbiB6aXBcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgemlwV2l0aCBmcm9tICcuL3ppcFdpdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcCAoYSwgYikge1xuICByZXR1cm4gemlwV2l0aChmdW5jdGlvbiBfemlwV2l0aCAoeCwgeSkgeyByZXR1cm4gW3gsIHldIH0sIGEsIGIpXG59KVxuIiwiLyoqXG5cbiAqIHppcFdpdGhcbiAqXG4gKiAgQGZ1bmN0aW9uIHppcFdpdGhcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcFdpdGggKGNiLCBhLCBiKSB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgbGV0IGkgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGFyci5wdXNoKGNiKGFbaV0sIGJbaV0pKVxuICB9XG4gIHJldHVybiBhcnJcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnZnVuLmpzL3NyYy9tYXAnXG5pbXBvcnQgZm9sZCBmcm9tICdmdW4uanMvc3JjL2ZvbGQnXG5pbXBvcnQgZXF1YWxzIGZyb20gJ2Z1bi5qcy9zcmMvZXF1YWxzJ1xuaW1wb3J0IGNvbmNhdCBmcm9tICd1dGlsL2NvbmNhdCdcbmltcG9ydCBlbXB0eSBmcm9tICd1dGlsL2VtcHR5J1xuaW1wb3J0IGRvdCBmcm9tICd1dGlsL2RvdCdcbmltcG9ydCBpZGVudGl0eSBmcm9tICd1dGlsL2lkZW50aXR5J1xuaW1wb3J0IHRyYW5zcG9zZSBmcm9tICd1dGlsL3RyYW5zcG9zZSdcbmltcG9ydCBnZW5lcmF0ZSBmcm9tICd1dGlsL2dlbmVyYXRlJ1xuaW1wb3J0IGdwdW1hcCBmcm9tICd1dGlsL2dwdW1hcCdcbmltcG9ydCBncHVmb2xkIGZyb20gJ3V0aWwvZ3B1Zm9sZCdcbmltcG9ydCBncHVwcm9kdWN0IGZyb20gJ3V0aWwvZ3B1cHJvZHVjdCdcblxuLyoqXG4gKiBAY2xhc3MgTWF0cml4XG4gKiBAY2xhc3NkZXNjIE1hdHJpeCBhcHBsaWNhdGl2ZSBwcm92aWRpbmcgc3RhbmRhcmQgbWF0cml4IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoZSBNYXRyaXggY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgbmV3IGtleXdvcmQuIEluc3RlYWQgdXNlIHRoZSBNYXRyaXgub2Ygc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBNYXRyaXguIFVuZm9ydHVuYXRseSBqc2RvY3MgZG9lcyBub3QgYWxsb3cgZm9yIHRoZSBjb25zdHJ1Y3RvciB0byBiZSBoaWRkZW4uXG4gKiBAaGlkZWNvbnRydWN0b3JcbiAqIEBzZWUgb2ZcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbmxldCBNYXRyaXggPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxuICAvLyBpZiAoR1BVSlMpIHtcbiAgLy8gICB0aGlzLmdwdWpzID0gR1BVSlMgfHwgbnVsbFxuICAvLyB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG9mXG4gKiBAZGVzYyBDcmVhdGVzIGEgTWF0cml4IG9iamVjdCBhbmQgZmxhdHRlbnMgdGhlIE1hdHJpeFxuICogQHBhcmFtIHZhbCB7YXJyYXl8ZnVuY3Rpb259IEFuIGFycmF5IG9mIGFycmF5c1xuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbk1hdHJpeC5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hdHJpeCkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXRyaXgodmFsKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS50eXBlID09PSAnTWF0cml4J1xuICovXG5NYXRyaXgucHJvdG90eXBlLnR5cGUgPSAnTWF0cml4J1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcmVjaXNpb25cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnByZWNpc2lvbiA9PT0gNFxuICovXG5NYXRyaXgucHJvdG90eXBlLnByZWNpc2lvbiA9IDRcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc2V0UHJlY2lzaW9uXG4gKiBAcGFyYW0gcHJlY2lzaW9uIHtudW1iZXJ9IFNldCB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGZvciByb3VuZGluZ1xuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5zZXRQcmVjaXNpb24oMTApXG4gKiBtLnByZWNpc2lvbiA9PT0gMTBcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zZXRQcmVjaXNpb24gPSBmdW5jdGlvbiAocHJlY2lzaW9uKSB7XG4gIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3ltbWV0cmljXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1N5bW1ldHJpYygpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3ltbWV0cmljID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBhID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IGIgPSBNYXRyaXgudHJhbnNwb3NlKHRoaXMpLl9fdmFsdWVcbiAgcmV0dXJuIGVxdWFscyhhLCBiKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1NxdWFyZVxuICogQGRlc2MgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjb250YWlucyBhIHNxdWFyZSBNYXRyaXhcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3F1YXJlKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTcXVhcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5nZXRDb2xzKCksIHRoaXMuZ2V0Um93cygpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc09ydGhvZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1stMC4zMDkyLCAtMC45NTEwXSwgWy0wLjk1MTAsIDAuMzA5Ml1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiB0cnVlICA9PT0gQS5pc09ydGhvZ29uYWwoKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzT3J0aG9nb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgQXhBdCA9IHRoaXMuZG90KHRoaXMudHJhbnNwb3NlKCkpXG4gIGNvbnN0IEkgPSB0aGlzLmlkZW50aXR5KClcbiAgcmV0dXJuIGVxdWFscyhBeEF0LCBJKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRDb2xzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldENvbHMoKSAgPT09IDJcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Q29scyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZVswXS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZXF1YWxzXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gW1sxLCAxXSwgWzEsIDFdXVxuICogdmFyIEEgPSBNYXRyaXgub2YoYSlcbiAqIHZhciBCID0gTWF0cml4Lm9mKGEpXG4gKiB0cnVlICA9PT0gQS5lcXVhbHMoQilcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlIHx8IE0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFJvd3NcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Um93cygpICAvLyAyXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0U2hhcGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRTaGFwZSgpICAvLyBbMiwgMl1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRTaGFwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFt0aGlzLmdldFJvd3MoKSwgdGhpcy5nZXRDb2xzKCldXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBtLm1hcCh4ID0+IHgubWFwKHkgPT4geSsgMSkpXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKGYpKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0aGF0IG1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm1hcCh4PSA+IHgubWFwKHkgPT4geSsgMSksIFtbMSwgMV0sIFsxLCAxXV0pXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgubWFwID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZWR1Y2UgdGhlIG1hdHJpeCByb3dzIHVzaW5nIGEgcmVkdWNlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEEgcmVkdWNlL2ZvbGQgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEZsYXR0ZW4gTWF0cml4XG4gKiBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSkuZm9sZCgocHJldiwgbmV4dCkgPT4gcHJldi5jb25jYXQobmV4dCkpXG4gKiAvLyBbMSwgMSwgMSwgMV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKGYsIFtdKSh0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRvIHJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIE1hdHJpeCB0byByZWR1Y2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuXG4gKiAvLyBTdW0gb2YgYWxsIG1hdHJpeCB2YWx1ZXNcbiAqIGNvbnN0IHJlZHVjZXIgPSAocHJldiwgbmV4dCkgPT4gTnVtYmVyKHByZXYpICsgbmV4dC5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgeCwgMClcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXVxuICogTWF0cml4LmZvbGQocmVkdWNlciwgQSlcbiAqIC8vIDRcbiAqL1xuTWF0cml4LmZvbGQgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmZvbGQoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIE1hdHJpeCB0byBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZiA9IHggPT4geC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiBNYXRyaXgub2YoZikuYXAoTSlcbiAqIC8vIFtbNl0sIFsxNV0sIFsyNF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn1cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBNYXRyaXguYXAoZiwgW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbNywgOCwgOV1dKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXguYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKGYpLmFwKE0pXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMCwgMSwgMV0sIFsyLCAzLCA0XV1cbiAqIGNvbnN0IGIgPSBbWzIsIDIsIDJdLCBbMywgMywgM11dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKiBjb25zdCBNID0gQS5jb25jYXQoQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKE0sIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZihNKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgTWF0cmljZXMgdXNpbmcgYSBmdW5jdGlvbiBhcyBvcGVyYXRvclxuICogQHBhcmFtIEEge01hdHJpeH1cbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBNYXRyaXguY29uY2F0KEEsIEIpXG4gKiAvLyBbWzAsIDEsIDEsIDIsIDIsIDJdLCBbMiwgMywgNCwgMywgMywgM11dXG4gKlxuICovXG5NYXRyaXguY29uY2F0ID0gY3VycnkoZnVuY3Rpb24gKEEsIEIsIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5tYXAoZihCKSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZW1wdHkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHBhcmFtIHJvd3Mge251bWJlcn1cbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguZW1wdHkgPSBjdXJyeShmdW5jdGlvbiAocm93cyA9IDAsIGNvbHMgPSAwKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLm1hcChlbXB0eSlcbn0pXG5cbi8vICMjIyMgIyMjIyAjIyMjIC8vXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMSwgMiwgM10sIFs0LCA1LCA2XV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEFpZGVudGl0eSA9IEEuaWRlbnRpdHkoKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiovXG5NYXRyaXgucHJvdG90eXBlLmlkZW50aXR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcCh0aGlzKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgUmV0dXJucyBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXguaWRlbnRpdHkoMywgMilcbiAqIC8vIFtbMSwgMCwgMF0sIFswLCAxLCAwXV1cbiAqXG4gKi9cbk1hdHJpeC5pZGVudGl0eSA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcChtKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNvbWJpbmUgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmNvbmNhdChNYXRyaXgub2YoTSksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29tYmluZVxuICogQHNlZSBNYXRyaXguY29uY2F0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LmNvbWJpbmUgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmNvbmNhdChNYXRyaXgub2YoQiksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIENyZWF0ZSBtYXRyaXhcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAyXSwgWzMsIDRdXSlcbiAqXG4gKiAvLyBHZW5lcmF0ZSBpZGVudGl0eSBtYXRyaXhcbiAqIGNvbnN0IEkgID0gbS5pZGVudGl0eSgpIC8vIFtbMSwgMF0sIFswLCAxXV1cbiAqXG4gKiBpZihtLmRvdChJKS5lcXVhbHMobSkpIHtcbiAqICAgIGNvbnNvbGUubG9nKCdEb3QgcHJvZHVjdCB3aXRoIGlkZW50aXR5IG1hdHJpeCByZXR1cm5zIHRoZSBzYW1lIG1hdHJpeCcpXG4gKiB9XG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRvdCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgZG90KHRoaXMucHJlY2lzaW9uKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgYiA9IFtbNywgOF0sIFs5LCAxMF0sIFsxMSwgMTJdXVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqXG4gKiBNYXRyaXguZG90KEEsIEIpIC8vIFtbNTgsIDY0XSwgWzEzOSwgMTU0XV1cbiAqXG4gKi9cbk1hdHJpeC5kb3QgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmRvdChNYXRyaXgub2YoQikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZpbGxcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggdGhlIHByb3ZpZGVkIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5maWxsKHggPT4gNDIpXG4gKiAvLyBbWzQyLDQyLDQyXSwgWzQyLDQyLDQyXSwgWzQyLDQyLDQyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKG1hcCh4ID0+IGYoeCkpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB6ZXJvc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB6ZXJvc1xuICogQHJldHVybnMge01hdHJpeH1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS56ZXJvcygpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuemVyb3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbCh4ID0+IDApXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC56ZXJvcygzLCAzKVxuICogLy8gW1swLDAsMF0sIFswLDAsMF0sIFswLDAsMF1dXG4gKlxuICovXG5NYXRyaXguemVyb3MgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkub25lcygpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUub25lcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vbmVzKDEsIDEpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5vbmVzID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbCh4ID0+IDEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gdmFsdWVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxXVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiByYW5kb21cbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggcmFuZG9tIG51bWJlcnNcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gRnVuY3Rpb24gd2hpY2ggcmV0dXJucyByYW5kb20gdmFsdWVzLiBEZWZhdWx0IHJhbmRvbSB2YWx1ZXMgYXJlIGJldHdlZW4gLTEgYW5kIDFcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucmFuZG9tID0gZnVuY3Rpb24gKGYgPSBlID0+IChNYXRoLnJhbmRvbSgpICogMiAtIDEpLCByb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoZilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdG9BcnJheVxuICogQGRlc2MgUmV0dXJucyB0aGUgYXJyYXkgZnJvbSB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5tYXAocm93ID0+IHJvdy5tYXAoY29sID0+IGNvbCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNsb25lXG4gKiBAZGVzYyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5mcm9tQXJyYXkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmcm9tQXJyYXlcbiAqIEBkZXNjIFJldHVybnMgYSBNYXRyaXggZnJvbSBhbiBhcnJheVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5NYXRyaXguZnJvbUFycmF5ID0gZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gTWF0cml4Lm9mKG1hcChyb3cgPT4gbWFwKGNvbCA9PiBjb2wpKHJvdykpKGFycikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFstMSwgMl0sIFszLCA0XSwgWy04LCAyXSlcbiAqIGNvbnN0IGIgPSBBLnRyYW5zcG9zZSgpLnRvQXJyYXkoKVxuICogLy8gcmV0dXJucyBbWy0xLCAzLC04XSwgWzIsIDQsIDJdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnRyYW5zcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKHRyYW5zcG9zZSwgW10sIHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBBIE1hdHJpeCBvciBhIG1hdHJpeCBhcnJheVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFstMSwgMl0sIFszLCA0XSwgWy04LCAyXVxuICogY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UoYSkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC50cmFuc3Bvc2UgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnRyYW5zcG9zZSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGFkZFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gQWRkIGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5hZGQoMSkgLy8gW1s2LCA1XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmFkZChCKSAvLyBbWzEwLCAxMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgYWRkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsICsgTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCArIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdWJ0cmFjdFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gU3VidHJhY3QgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLnN1YnRyYWN0KDEpIC8vIFtbNCwgMl1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5zdWJ0cmFjdChCKSAvLyBbWzAsIDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3Qgc3VidHJhY3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgLSBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4IC0gTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIG11bHRpcGx5XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIE11dGxpcGx5IGEgc2NhbGFyIG9yIGEgbXRyYWl4IHdpdGggYSBtYXRyaXguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbXVsdGlwbGljYXRpb24gaXMgbm90IHBvc3NpYmxlLlxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5tdWx0aXBseSgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLm11bHRpcGx5KEIpIC8vIFtbMjUsIDI1XV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNlIHN0YXRpYyBtZXRob2QgXFwnZG90XFwnIHRvIGRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGNyZWF0ZSBoYWRhbWFyZCBwcm9kdWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKChjb2wsIGpkeCkgPT4gY29sICogTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAqIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBhZGRpdGl2ZWludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXRyaXggb2J0YWluZWQgYnkgY2hhbmdpbmcgdGhlIHNpZ24gb2YgZXZlcnkgbWF0cml4IGVsZW1lbnQuIFRoZSBhZGRpdGl2ZSBpbnZlcnNlIG9mIG1hdHJpeCBBIGlzIHdyaXR0ZW4g4oCTQS5cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LC01XSwgWy00LCA0XV0pXG4gKiBjb25zdCBtaW51c0EgPSBBLmFkZGl0aXZlaW52ZXJzZSgpXG4gKiAvLyBbWy01LCA1XSwgWzQsIC00XV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGRpdGl2ZWludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoLTEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBoYWRhbWFyZFxuICogQGluc3RhbmNlXG4gKiBAc2VlIG11bHRpcGx5XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuaGFkYW1hcmQoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5oYWRhbWFyZChCKSAvLyBbWzI1LCAyNV1dXG5cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5oYWRhbWFyZCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbHVcbiAqIEBkZXNjIENhbGN1bGF0ZXMgTFUgZGVjb21wb3NpdGlvbiBvZiB0aGUgY3VycmVudCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXhbXX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1szLCAtNywgLTIsIDJdLCBbLTMsIDUsIDEsIDBdLCBbNiwgLTQsIDAsIC01XSwgWy05LCA1LCAtNSwgMTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogY29uc3QgbHUgPSBBLmx1KClcbiAqIC8vIEwuX192YWx1ZSA9IFsgWyAxLCAwLCAwLCAwIF0sIFsgLTEsIDEsIDAsIDAgXSwgWyAyLCAtNSwgMSwgMCBdLCBbIC0zLCA4LCAzLCAxIF0gXVxuICogLy8gVS5fX3ZhbHVlID0gIFsgWyAzLCAtNywgLTIsIDIgXSwgWyAwLCAtMiwgLTEsIDIgXSwgWyAwLCAwLCAtMSwgMSBdLCBbIDAsIDAsIDAsIC0xIF0gXVxuICogTWF0cml4LmRvdChsdVswXSwgbHVbMV0pIC8vIHJldHVybnMgY2xvbmUgb2YgQVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5sdSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IHRvbCA9IDFlLTZcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMID0gdGhpcy56ZXJvcygpXG4gIGNvbnN0IFUgPSB0aGlzLnplcm9zKClcblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGlmIChNYXRoLmFicyhBLl9fdmFsdWVba11ba10pIDwgdG9sKSB0aHJvdyBFcnJvcignQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvdyBleGNoYW5nZScpXG4gICAgTC5fX3ZhbHVlW2tdW2tdID0gMVxuICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgTC5fX3ZhbHVlW2ldW2tdID0gQS5fX3ZhbHVlW2ldW2tdIC8gQS5fX3ZhbHVlW2tdW2tdXG4gICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyArK2opIHtcbiAgICAgICAgQS5fX3ZhbHVlW2ldW2pdID0gQS5fX3ZhbHVlW2ldW2pdIC0gTC5fX3ZhbHVlW2ldW2tdICogQS5fX3ZhbHVlW2tdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGwgPSBrOyBsIDwgbjsgKytsKSB7XG4gICAgICBVLl9fdmFsdWVba11bbF0gPSBBLl9fdmFsdWVba11bbF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtMLCBVXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBycmVmXG4gKiBAcmV0dXJucyB7TWF0cml4fGFycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihbWy0xLCAxXSwgWy0xLCAwXSwgWzAsIC0xXSwgWy0xLCAtMl1dKVxuICogQS5ycmVmKCkgLy8gIFsgWyAxLCAwIF0sIFsgLTAsIDEgXSwgWyAwLCAwIF0sIFsgMCwgMCBdIF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ycmVmID0gZnVuY3Rpb24gKCkge1xuICBsZXQgbGVhZCA9IDBcbiAgY29uc3QgcmVzdWx0TWF0cml4ID0gdGhpcy5jbG9uZSgpXG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmdldFJvd3MoKTsgKytyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpIDw9IGxlYWQpIHtcbiAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICB9XG4gICAgbGV0IGkgPSByXG4gICAgd2hpbGUgKHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdID09PSAwKSB7XG4gICAgICArK2lcbiAgICAgIGlmICh0aGlzLmdldFJvd3MoKSA9PT0gaSkge1xuICAgICAgICBpID0gclxuICAgICAgICArK2xlYWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29scygpID09PSBsZWFkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRtcCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV0gPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdID0gdG1wXG5cbiAgICBsZXQgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bbGVhZF1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdIC89IHZhbFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nZXRSb3dzKCk7ICsraSkge1xuICAgICAgaWYgKGkgPT09IHIpIGNvbnRpbnVlXG4gICAgICB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2pdIC09IHZhbCAqIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGxlYWQrK1xuICB9XG4gIHJldHVybiByZXN1bHRNYXRyaXhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc29sdmVcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNvbHZlIHhBID0gYlxuICogLy8gNXggKyB5ICA9IDdcbiAqIC8vIDN4IC0gNHkgPSAxOFxuICogLy8gU29sdXRpb24gZm9yIHggYW5kIHk6XG4gKiAvLyB4ID0gMlxuICogLy8geSA9IC0zXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDFdLCBbMywgLTRdXSlcbiAqIGNvbnN0IHNvbHZlQSA9IEEuc29sdmUoWzcsIDE4XSkgLy8gWzIsIC0zXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uIChiKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTFUgPSBBLmx1KClcbiAgY29uc3QgTCA9IExVWzBdXG4gIGNvbnN0IFUgPSBMVVsxXVxuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgbGV0IHMgPSAwXG4gIGNvbnN0IGMgPSBbXVxuICBjb25zdCB4ID0gW11cblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgazsgKytqKSB7XG4gICAgICBzID0gcyArIEwuX192YWx1ZVtrXVtqXSAqIGNbal1cbiAgICB9XG4gICAgY1trXSA9IGJba10gLSBzXG4gICAgcyA9IDBcbiAgfVxuICBmb3IgKGxldCBhID0gbiAtIDE7IGEgPiAtMTsgLS1hKSB7XG4gICAgbGV0IHQgPSAwXG4gICAgZm9yIChsZXQgYiA9IGEgKyAxOyBiIDwgbjsgKytiKSB7XG4gICAgICB0ID0gdCArIFUuX192YWx1ZVthXVtiXSAqIHhbYl1cbiAgICB9XG4gICAgeFthXSA9IChjW2FdIC0gdCkgLyBVLl9fdmFsdWVbYV1bYV1cbiAgfVxuICByZXR1cm4geFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsyLCA0XV0pLmludmVyc2UoKVxuICogLy8gWyBbIDIsIC0wLjUgXSwgWyAtMSwgMC41IF0gXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEkgPSBBLmlkZW50aXR5KClcbiAgY29uc3QgSW52ID0gQS5jb25jYXQoSSkucnJlZigpXG5cbiAgY29uc3QgcmVzdWx0ID0gSW52Ll9fdmFsdWUucmVkdWNlKChyZXN1bHQsIHgsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhbGYgPSB4Lmxlbmd0aCAvIDJcbiAgICByZXN1bHQucHVzaCh4LnNsaWNlKGhhbGYsIHgubGVuZ3RoKSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtdKVxuICByZXR1cm4gTWF0cml4Lm9mKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHJhbmtcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5rID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBycmVmID0gdGhpcy5ycmVmKClcbiAgbGV0IHJlc3VsdCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBycmVmLmdldENvbHMoKTsgKytpKSB7XG4gICAgcmVzdWx0ICs9IHJyZWYuX192YWx1ZVtpXVtpXVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpbWVuc2lvblxuICogQGluc3RhbmNlXG4gKiBAc2VlIHJhbmtcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yYW5rKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZygpXG4gKiAvLyBbMSwgMSwgMV1cbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFnKClcbiAqIC8vIFswLCAwLCAwLCAwLCAwXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdCh4W2lkeF0pXG4gIH0pKFtdKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFnKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyBbMiwgNV1cbiAqXG4gKi9cbk1hdHJpeC5kaWFnID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFnKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdwcm9kdWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIGFjYyAqPSB4W2lkeF1cbiAgICByZXR1cm4gYWNjXG4gIH0pKDEpKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ3Byb2R1Y3RcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWdwcm9kdWN0KFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyAxMFxuICpcbiAqL1xuTWF0cml4LmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFncHJvZHVjdCgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdW1cbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5zdW0oKVxuICogLy8gOVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLnN1bSgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1bSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4ge1xuICAgIGFjYyArPSBmb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCkoMCkoeClcbiAgICByZXR1cm4gYWNjXG4gIH0pKDApKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gc3VtXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5zdW0oW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDlcbiAqXG4gKi9cbk1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnN1bSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBrcm9uZWNrZXJcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0ICh0aGlzIOKKlyBNKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoTSkge1xuICBjb25zdCBtID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Q29scygpXG4gIGNvbnN0IHAgPSBNLmdldFJvd3MoKVxuICBjb25zdCBxID0gTS5nZXRDb2xzKClcblxuICBjb25zdCBsZWZ0ID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IHJpZ2h0ID0gTS5fX3ZhbHVlXG5cbiAgY29uc3QgZnJhbWUgPSBnZW5lcmF0ZShtICogcCwgbiAqIHEpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBwOyBrKyspIHtcbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBxOyBsKyspIHtcbiAgICAgICAgICBmcmFtZVtwICogaSArIGtdW3EgKiBqICsgbF0gPSBsZWZ0W2ldW2pdICogcmlnaHRba11bbF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBNYXRyaXgub2YoZnJhbWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGtyb25lY2tlclxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIEEge01hdHJpeH0gVGhlIGxlZnQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcGFyYW0gQiB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgua3JvbmVja2VyID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5rcm9uZWNrZXIoQilcbn1cblxuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuLy8gR1BVIEZ1bmN0aW9uc1xuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzIsIDJdLCBbMiwgMl1dLCBHUFVKUylcbiAqIG0uZ3B1TWFwKGdwdU1hcHBlcilcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVNYXAgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGdwdW1hcCh0aGlzLmdwdWpzLCBmLCB0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdGhhdCBtYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5ncHVNYXAoR1BVSlMsIGdwdU1hcHBlciwgW1syLCAyXSwgWzIsIDJdXSlcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICovXG5NYXRyaXguZ3B1TWFwID0gY3VycnkoZnVuY3Rpb24gKGdwdSwgZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0sIGdwdSkuZ3B1TWFwKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVGb2xkXG4gKiBAZGVzY3JpcHRpb24gRm9sZHMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIEdQVVMuanMgZW5xYmxlZCByZWR1Y2UgZnVuY3Rpb24sIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ3B1Rm9sZCA9IGZ1bmN0aW9uIChmLCBvdXRwdXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihncHVmb2xkKHRoaXMuZ3B1anMsIGYsIG91dHB1dCwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gTWF0cml4I2dwdVByb2R1Y3RcbiAqIEBwYXJhbSBmXG4gKiBAcGFyYW0gb3V0cHV0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVQcm9kdWN0ID0gZnVuY3Rpb24gKGYsIG91dHB1dCwgTSkge1xuICAvLyAoZ3B1LCBmLCBvdXRwdXQsIGEsIGIsIGNvbnN0YW50cyA9IHt9XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1cHJvZHVjdCh0aGlzLmdwdWpzLCBmLCBvdXRwdXQsIHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF0cml4XG4iLCJpbXBvcnQgeyBjb25jYXQsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIChNLCBtLCBpZHgpIHtcbiAgcmV0dXJuIGNvbmNhdChtLCBNLl9fdmFsdWVbaWR4XSlcbn0pXG4iLCJpbXBvcnQgeyBmb2xkLCBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuaW1wb3J0IHJvdW5kIGZyb20gJy4vcm91bmQnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGRvdFxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEBwYXJhbSBhIHtBcnJheX1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKGRlY2ltYWxzLCBCLCBhKSA9PiBtYXAoKGl0ZW0sIGkpID0+IHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaikgPT4ge1xuICAgIGFjYyArPSByb3VuZCh4ICogQi5fX3ZhbHVlW2pdW2ldLCBkZWNpbWFscylcbiAgICByZXR1cm4gYWNjXG4gIH0sIDApKGEpXG59KShCLl9fdmFsdWVbMF0pKVxuIiwiaW1wb3J0IHsgY3VycnkgfSBmcm9tICdmdW4uanMnXG5leHBvcnQgZGVmYXVsdCBjdXJyeShtID0+IFtdKVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZVxuICogQGRlc2MgR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBhIG1hdHJpeCBhcnJheSwgdmFsdWVzIGFyZSBzZXQgdG8gdW5kZWZpbmVkXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHthbnlbXVtdfVxuICovXG5leHBvcnQgZGVmYXVsdCAocm93cywgY29scyA9IHVuZGVmaW5lZCwgdmFsdWUgPSAwKSA9PiB7XG4gIGNvbnN0IF9jb2xzID0gY29scyB8fCByb3dzXG4gIGNvbnN0IHkgPSBtYXAoeiA9PiB2YWx1ZSkobmV3IEFycmF5KF9jb2xzKSlcbiAgcmV0dXJuIG1hcCh6ID0+IHkpKG5ldyBBcnJheShyb3dzKSlcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdWZvbGQgKGdwdSwgZiwgb3V0cHV0LCBtYXRyaXgsIGNvbnN0YW50cyA9IHt9KSB7XG4gIHJldHVybiBncHVcbiAgICAuY3JlYXRlS2VybmVsKGYsIHsgY29uc3RhbnRzOiBPYmplY3QuYXNzaWduKHt9LCB7IG06IG1hdHJpeC5sZW5ndGgsIG46IG1hdHJpeFswXS5sZW5ndGggfSwgY29uc3RhbnRzKSB9KVxuICAgIC5zZXRPdXRwdXQob3V0cHV0KShtYXRyaXgpXG59XG4iLCIvLyBpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3B1bWFwIChncHUsIGYsIG1hdHJpeCkge1xuICByZXR1cm4gZ3B1LmNyZWF0ZUtlcm5lbChmKS5zZXRPdXRwdXQoW21hdHJpeC5sZW5ndGgsIG1hdHJpeFswXS5sZW5ndGhdKShtYXRyaXgpXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncHVwcm9kdWN0IChncHUsIGYsIG91dHB1dCwgYSwgYiwgY29uc3RhbnRzID0ge30pIHtcbiAgcmV0dXJuIGdwdVxuICAgIC5jcmVhdGVLZXJuZWwoZiwgeyBjb25zdGFudHM6IE9iamVjdC5hc3NpZ24oe30sIHsgbTogYi5sZW5ndGgsIG46IGFbMF0ubGVuZ3RoIH0sIGNvbnN0YW50cykgfSlcbiAgICAuc2V0T3V0cHV0KG91dHB1dCkoYSwgYilcbn1cbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIENyZWF0ZXMgYW4gaWRlbnRpeSBtYXRyaXggZnJvbSBhbiBlbXB0eSBhcnJheVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybiB7TWF0cml4fVxuICovXG5leHBvcnQgZGVmYXVsdCAobSwgaWR4KSA9PiBtYXAoKHJvd3MsIGpkeCkgPT4gKGlkeCA9PT0gamR4KSAqIDEpKG0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiByb3VuZFxuICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9XG4gKiBAcGFyYW0gZGVjaW1hbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdW5kICh2YWx1ZSwgZGVjaW1hbHMpIHtcbiAgcmV0dXJuIE51bWJlcihNYXRoLnJvdW5kKHZhbHVlICsgJ2UnICsgZGVjaW1hbHMpICsgJ2UtJyArIGRlY2ltYWxzKVxufVxuIiwiaW1wb3J0IHsgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBUcmFuc3Bvc2VzIGEgYXJyYXkgb2YgYXJyYXlzIHVzaW5nIHRoZSBNYXRyaXgubWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChwcmV2LCBuZXh0KSA9PiBtYXAoKGl0ZW0sIGkpID0+IChwcmV2W2ldIHx8IFtdKS5jb25jYXQobmV4dFtpXSkpKG5leHQpKVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9fcHJpdmF0ZS9jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FkanVzdFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWxsUGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWx3YXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FueS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55UGFzcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS90by5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9GLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9ib29sZWFuL1QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vYm90aC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY2FsbC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcGxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9kaWZmRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc0Z1dHVyZURhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0RheS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b0hvdXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9NaW51dGVzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvU2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lbXB0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmluZEluZGV4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maXJzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmxhdE1hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9rZXlzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9sYXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9saWZ0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21hcC9tYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL0p1c3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL25vdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVsbC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2FkZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2RpdmlkZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvaXNOYW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9tdWx0aXBseS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2VxdWFscy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2ZvbGQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L2tleXNJbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21lcmdlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb3IuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3NldC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2Zvcm1hdFN0cmluZy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvemlwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy96aXBXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2RvdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2dlbmVyYXRlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvcm91bmQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3RyYW5zcG9zZS5qcyJdLCJuYW1lcyI6WyJNYXRyaXgiLCJ2YWwiLCJfX3ZhbHVlIiwib2YiLCJwcm90b3R5cGUiLCJ0eXBlIiwicHJlY2lzaW9uIiwic2V0UHJlY2lzaW9uIiwiaXNTeW1tZXRyaWMiLCJhIiwiYiIsInRyYW5zcG9zZSIsImlzU3F1YXJlIiwiZ2V0Q29scyIsImdldFJvd3MiLCJpc09ydGhvZ29uYWwiLCJBeEF0IiwiZG90IiwiSSIsImlkZW50aXR5IiwibGVuZ3RoIiwiZXF1YWxzIiwiTSIsImdldFNoYXBlIiwibWFwIiwiZiIsImZvbGQiLCJhcCIsImNvbmNhdCIsIkEiLCJCIiwiZW1wdHkiLCJyb3dzIiwiY29scyIsIm0iLCJjb21iaW5lIiwiZmlsbCIsIngiLCJ6ZXJvcyIsIm9uZXMiLCJyYW5kb20iLCJlIiwiTWF0aCIsInRvQXJyYXkiLCJyb3ciLCJjb2wiLCJjbG9uZSIsImZyb21BcnJheSIsImFyciIsImFkZCIsIkVycm9yIiwiaWR4IiwiamR4Iiwic3VidHJhY3QiLCJtdWx0aXBseSIsImNvbnNvbGUiLCJsb2ciLCJhZGRpdGl2ZWludmVyc2UiLCJoYWRhbWFyZCIsImx1IiwibiIsInRvbCIsIkwiLCJVIiwiayIsImFicyIsImkiLCJqIiwibCIsInJyZWYiLCJsZWFkIiwicmVzdWx0TWF0cml4IiwiciIsInRtcCIsInNvbHZlIiwiTFUiLCJzIiwiYyIsInQiLCJpbnZlcnNlIiwiSW52IiwicmVzdWx0IiwicmVkdWNlIiwiaGFsZiIsInB1c2giLCJzbGljZSIsInJhbmsiLCJkaW1lbnNpb24iLCJkaWFnIiwiYWNjIiwiZGlhZ3Byb2R1Y3QiLCJzdW0iLCJwcmV2IiwibmV4dCIsImtyb25lY2tlciIsInAiLCJxIiwibGVmdCIsInJpZ2h0IiwiZnJhbWUiLCJkZWNpbWFscyIsIml0ZW0iLCJ1bmRlZmluZWQiLCJ2YWx1ZSIsIl9jb2xzIiwieSIsInoiLCJBcnJheSIsInJvdW5kIiwiTnVtYmVyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUFXLGdCQUFnQjtBQUNxQjtBQUNoRCxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLG9CQUFvQjtBQUMvQixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLG1CQUFtQjtBQUM5QixXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHNCQUFzQjtBQUNqQyxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLHVCQUF1QjtBQUNs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V0FBVywyQkFBMkI7QUFDdEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVywyQkFBMkI7QUFDdEMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx5QkFBeUI7QUFDcEMsV0FBVyx5QkFBeUI7QUFDcEMsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxvQkFBb0I7QUFDL0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxxQkFBcUI7QUFDaEMsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyx3QkFBd0I7QUFDbkMsV0FBVyxzQkFBc0I7QUFDakMsV0FBVyxpQ0FBaUM7QUFDNUMsV0FBVyxxQ0FBcUM7QUFDaEQsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxzQkFBc0I7QUFDakMsV0FBVywyQkFBMkI7QUFDdEMsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0Is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QUFBLEdBQUosRUFBa0QyQixJQUFsRCxDQUFoQjtBQUFBLENBQU4sQyIsImZpbGUiOiJAYXN0dWFuYXgvZnVubWF0cml4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJAYXN0dWFuYXgvZnVubWF0cml4XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCIvKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGZ1bmN0aW9uIHdpdGggYXJpdHkgMVxuICogQGZ1bmN0aW9uIGN1cnJ5MVxuICogQHByaXZhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycnkxIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gY3VycmllZCAoYSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAwXG4gICAgICA/IHRoaXNcbiAgICAgIDogZm4oYSlcbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYWRkSW5kZXhcbiAqIEBzdW1tYXJ5IEFkZHMgYSBzcGVjaWZpZWQgaW5kZXggdG8gaXRlcmF0ZSBhIGNvbGxlY3Rpb25cbiAqIEBkZXNjcmlwdGlvbiBUaGUgYWRkSW5kZXggZnVuY3Rpb24gaXMgbm90bmVjZXNzYXJ5IGZvciB0aGUgbWFwIGZ1bmN0aW9ucyBpbiB0aGUgZnVuLmpzIGxpYnJhcnkgYXMgdGhleSBiZWhhdmUgdGhlIHNhLGUgYXMgdGhlIG5hdGl2ZSBqYXZhc2NyaXB0IGZ1bmN0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBJdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBGdW5jdGlvbiB0byB3aGljaCB0byBhZGQgdGhlIGluZGV4XG4gKiBAcGFyYW0ge0FycmF5fSBhIFRoZSBhcnJheSBvbiB3aGljaCB0byB3b3JrXG4gKiBAc2luY2UgMS4wLjJcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkZEluZGV4IChmLCBnLCBhKSB7XG4gIGxldCBpID0gMFxuICByZXR1cm4gZihcbiAgICBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIGcodiwgaSsrKVxuICAgIH0sXG4gICAgYVxuICApXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RcbiAqIEBkZXNjcmlwdGlvbiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBhKSAtPiBudW0gLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBUaGUgaW5kZXggYXQgd2hpY2ggdG8gbW9kaWZ5IHRoZSBhcnJheSwgYWNjZXB0cyBwb3N0aXRpdmUgYW5kIG5lZ2F0aXZlIGluZGV4ZXNcbiAqIEBwYXJhbSB7SXRlcmFibGV9IFthXSAtIEFycmF5IHdpdGggZGF0YVxuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdCAoZm4sIGksIGEpIHtcbiAgY29uc3QgciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpXG4gIGNvbnN0IGlkeCA9IGkgPCAwID8gci5sZW5ndGggKyBpIDogaVxuICBpZiAoIWFbaWR4XSkgcmV0dXJuIHJcbiAgcltpZHhdID0gZm4ocltpZHhdKVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gYWRqdXN0V2l0aFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+ICgoYSAtPiBbYV0pIC0+IFthXSAtPiBudW0pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdG8gbW9kaWZ5IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBUaGUgcHJlZGljYXRlIHRoYXQgcmV0dXJucyB0aGUgaW5kZXhlcyBpZiBmb3VuZFxuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdFdpdGggKGZuLCBwcmVkLCBhKSB7XG4gIGNvbnN0IF9mbiA9IHggPT4ge1xuICAgIGlmIChwcmVkKHgpKSB7XG4gICAgICByZXR1cm4gZm4oeClcbiAgICB9XG4gICAgcmV0dXJuIHhcbiAgfVxuICByZXR1cm4gbWFwKF9mbiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gYWxsXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGwgKGNiLCBhKSB7XG4gIGxldCByZXMgPSB0cnVlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmICghY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3NcbiAqXG4gKiBAZnVuY3Rpb24gYWxsUGFzc1xuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGxQYXNzIChjYnMsIGEpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWNic1tpXShhKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKlxuICogQGZ1bmN0aW9uIGFsd2F5c1xuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWx3YXlzICh4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB4IH1cbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqXG4gKiBAZnVuY3Rpb24gYW5kXG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoeCwgeSkgLT4gYm9vbGVhblxuICogQHBhcmFtIHsqfSB4IC0gQSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7Kn0geSAtIEEgcHJlZGljYXRlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFuZCAoeCwgeSkge1xuICByZXR1cm4geCAmJiB5XG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb24gb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gYW55XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uIG9mIHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChUT0RPKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW55IChjYiwgYSkge1xuICBsZXQgcmVzID0gZmFsc2VcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKGNiKGFbaV0pKSB7XG4gICAgICByZXMgPSB0cnVlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgb25lIHBhc3Nlc1xuICpcbiAqIEBmdW5jdGlvbiBhbnlQYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4pIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbnlQYXNzIChjYnMsIGEpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY2JzW2ldKGEpKSByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJldHVybnMgYSBjb21iaW5lZCByZXN1bHQgYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb24gYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmV0dXJucyBhIGNvbWJpbmVkIHJlc3VsdCBhcnJheVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBwYXJhbSB7KEZ1bmN0aW9uW118RnVuY3Rpb258QXBwbGljYXRpdmUpfSBmbnMgLSBBbiBhcnJheSBvZiBmdW5jdGlvbnMgb3IgYSBmdW5jdGlvbiBvciBhbiBhcHBsaWNhdGl2ZVxuICogQHBhcmFtIHtBcnJheX0gdmFscyAtIEFuIGFycmF5IG9mIHZhbHVlc1xuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGlzIGZyb20gJy4vaXMnXG5pbXBvcnQgZm9sZCBmcm9tICcuL2FycmF5L2ZvbGQnXG5pbXBvcnQgbWFwIGZyb20gJy4vYXJyYXkvbWFwJ1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXAgKGZucywgdmFscykge1xuICBpZiAoaXNGdW5jdGlvbihmbnMuYXApKSB7XG4gICAgcmV0dXJuIGZucy5hcCh2YWxzKVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGZucykpIHtcbiAgICByZXR1cm4geCA9PiBmbnMoeCkodmFscyh4KSlcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCBmKSA9PiBhY2MuY29uY2F0KG1hcChjdXJyeTEoZiksIHZhbHMpKSwgW10sIGZucylcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGFwZXJ0dXJlXG4gKiBAcGFyYW0gblxuICogQHBhcmFtIGFyclxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwZXJ0dXJlIChuLCBhKSB7XG4gIGlmIChhLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBjb25zdCByZXMgPSBBcnJheShhLmxlbmd0aCAtIG4gKyAxKVxuICByZXR1cm4gbWFwKChpdGVtLCBpZHgpID0+IGEuc2xpY2UoaWR4LCBpZHggKyBuKSwgcmVzKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFwcGVuZFxuICogQGRlc2NyaXB0aW9uIEFwcGVuZCBhbiBlbG1lbnQgdG8gYSBsaXN0XG4gKiBAcGFyYW0geyp9IGVsIC0gRWxlbWVudCB0byBhZGQgdG8gYSBsaXN0XG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0IC0gTGlzdCB0byB3aGljaCB0byBhZGQgdGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBsID0gWzAsIDFdXG4gKiBhcHBlbmQoJ2EnLCBsKSAvLyByZXV0bnIgWzAsIDEsICdhJ11cbiAqXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGVuZCAoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIGNvbmNhdChsaXN0LCBbIGVsIF0pXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwbHlcbiAqIEBkZXNjcmlwdGlvbiBUaGUgYXBwbHkoKSBtZXRob2QgY2FsbHMgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJvdmlkZWQgYXMgYW4gYXJyYXksIGFuZCB0aGUgZnVuY3Rpb24gYXMgY29udGV4dC5cbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gYXBwbHkoZnVuY3Rpb24gKCkge1xuICogICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpLm1hcCh4ID0+IHggKiAyKVxuICogICB9KVxuICogYShbMSwgMiwgM10pXG4gKiAvLyBbMiwgNCwgNl1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGx5IChmbiwgYXJncykge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIGFyZ3MpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGFycmF5Q29uY2F0XG4gKiBAcGFyYW0gYTFcbiAqIEBwYXJhbSBhMlxuICogQHJldHVybnMge1RbXX1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoYSwgYilcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZXF1YWxzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiBmb3IgZGVlcCBjb21wYXJpc29uIG9mIGFycmF5c1xuICogQHBhcmFtIHthfSB4IC0gT2JqZWN0IHRvIGNvbXBhcmUgb2YgdHlwZSBhXG4gKiBAcGFyYW0ge2F9IHkgLSBPYmplY3QgeCB0byBjb21wYXJlIHdpdGggb2JqZWN0IHhcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFsc0FycmF5ICh4LCB5KSB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm90KGVxdWFscyh4W2ldLCB5W2ldKSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXJyYXlGaWx0ZXJcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFycmF5RmlsdGVyIChmbiwgYSkge1xuICB2YXIgciA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmbihhW2ldKSkgci5wdXNoKGFbaV0pXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBtYXBwaW5nIG92ZXIgdGhlIHByb3ZpZGVkIGFycmF5IGFuZCBjYWxsaW5nIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge2NiRnVuY3Rpb259IGNiIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSBpdGVtXG4gKiBAcGFyYW0geyp9IGluaXQgLSBJbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gQXJyYXkgd2l0aCBpdGVtcyB0byBtb2RpZnkgYnkgdGhlIGNiIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhbGlhcyByZWR1Y2VcbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBmb2xkKGFkZCwgMCwgWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IDNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBjYkZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHIgLSBBY2N1bXVsYXRvciB3aGljaCBhY2N1bXVsYXRlcyB0aGUgY2FsbGJhY2sncyByZXR1cm4gdmFsdWVzXG4gKiBAcGFyYW0geyp9IGl0ZW0gLSB0aGUgY3VycmVudCBlbGVtZW50IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gdGhlIGluZGV5IG9mIHRoZSBpdGVtIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtBcnJheX0gYSAtIFRoZSBpbml0aWFsIGFycmF5XG4gKiBAcmV0dXJuIHsqfVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGxldCByID0gaW5pdFxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBhW2ldLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhbiBhcnJheSwgYXV0b2N1cnJpZWQgZnVuY3Rpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGlzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhbiBhcnJheSwgYXV0b2N1cnJpZWQgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gT2JqZWN0IHRvIHZlcmlmaXlcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gaXNBcnJheShbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gdHJ1ZVxuICovXG5cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0FycmF5JylcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciBhbiBhcnJheSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoaWRlbnRpdHksIFswLDIsM10pXG4gKiAgLy8gcmVzdWx0ID0gWzAsMiwzXVxuICogIGNvbnN0IGFkZDIgPSBhZGQoMilcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoYWRkMiwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMiw0LDVdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgY29uc3QgciA9IG5ldyBBcnJheShsKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJbaV0gPSBjYihhW2ldLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdG9BcnJheVxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHRoZSBpbnB1dCB0byBhbiBhcnJheVxuICogQHBhcmFtIHtBcnJheUxpa2V9IHggLSBPYmplY3QgdG8gY29udmVydCB0byBhbiBhcnJheVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdG9BcnJheShcInN0cmluZ1wiKVxuICogLy8gcmVzdWx0ID0gWydzJywndCcsJ3InLCdpJywnbicsJ2cnXVxuICpcbiAqIGZ1bmN0aW9uICgpIHtcbiAqICBjb25zdCBhcmdzID0gdG9BcnJheShhcmd1bWVudHMpXG4gKiAgY29uc29sZS5sb2codHlwZW9mIGFyZ3MpIC8vIEFycmF5XG4gKiB9XG4gKlxuICoqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9BcnJheSAoeCkge1xuICByZXR1cm4geC5sZW5ndGggPT09IDEgPyBbeFswXV0gOiBBcnJheS5hcHBseShudWxsLCB4KVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHVuaW9uQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgMiBhcnJheXNcbiAqIEBwYXJhbSB7QXJyYXl9IGFMIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEBwYXJhbSB7QXJyYXl9IGFSIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHVuaW9uQXJyYXkoWzAsMSwyXSwgWzMsNCw1XSlcbiAqIC8vIHJlc3VsdCA9IFswLjEuMi4zLjQuNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gdW5pb25BcnJheSAoYUwsIGFSKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYUwuY29uY2F0KGFSKSkpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYmluYXJ5XG4gKiBAcGFyYW0gY2JcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSwgKj0pOiAqfVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBiaW5hcnkgKGNiKSB7XG4gIHJldHVybiBjdXJyeShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBjYihhLCBiKVxuICB9KVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG4vKipcbiAqIEBmdW5jdGlvbiBiaW5kXG4gKiBAZGVzY3JpcHRpb24gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dFxuICogQHBhcmFtIHtmdW5jdGlvbiB9Zm5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJpbmQgKGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBmbi5iaW5kKGNvbnRleHQpXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIEZcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyhmYWxzZSlcbiIsIi8qKlxuICogQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICpcbiAqIEBmdW5jdGlvbiBUXG4gKiBAZGVzY3JpcHRpb24gQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBhbHdheXMgZnJvbSAnLi4vYWx3YXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBhbHdheXModHJ1ZSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYm90aCBwcmVkaWNhdGVzIHJldHVybiB0cnVlXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjEgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMiBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBsaWZ0IGZyb20gJy4uL2xpZnQnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYm90aCAoZm4xLCBmbjIpIHtcbiAgcmV0dXJuIGlzKCdGdW5jdGlvbicpKGZuMSlcbiAgICA/IGZ1bmN0aW9uIF9ib3RoICgpIHsgcmV0dXJuIGZuMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmIGZuMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICA6IGxpZnQoYW5kKShmbjEsIGZuMilcbn0pXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gZm5cbiAqIEByZXR1cm5zIHsqfVxuICovXG4vLyBpbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNhbGwgKGZuKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBsZW1lbnRcbiAqIEBkZXNjcmlwdGlvbiBMaWZ0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgY29tcGxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBub3RcbiAqIEBzZWUgbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBpc05vdEVtcHR5ID0gY29tcGxlbWVudChpc0VtcHR5KVxuICogaXNOb3RFbXB0eShbXSkgLy8gZmFsc2VcbiAqIGlzTm90RW1wdHkoeydhJyA6IDF9KSAvLyB0cnVlXG4gKlxuICogY29tcGxlbWVudChNYXliZS5vZihmYWxzZSkpIC8vIHRydWVcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YodHJ1ZSkpIC8vIGZhbHNlXG4gKi9cbmltcG9ydCBsaWZ0IGZyb20gJy4vbGlmdCdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5cbmNvbnN0IGNvbXBsZW1lbnQgPSBsaWZ0KG5vdClcbmV4cG9ydCBkZWZhdWx0IGNvbXBsZW1lbnRcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBvc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigpOiAqfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlICgpIHtcbiAgbGV0IGZucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcblxuICByZXR1cm4gZnVuY3Rpb24gX2NvbXBvc2UgKCkge1xuICAgIGxldCBpbml0ID0gZm5zW2Zucy5sZW5ndGggLSAxXVxuICAgIGxldCByZXN1bHQgPSBbaW5pdC5hcHBseShpbml0LCBhcmd1bWVudHMpXVxuICAgIGxldCBpID0gZm5zLmxlbmd0aCAtIDJcblxuICAgIGZvciAoaTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IGZuID0gZm5zW2ldXG5cbiAgICAgIHJlc3VsdCA9IFtmbi5hcHBseShmbiwgcmVzdWx0KV1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXVxuICB9XG59O1xuIiwiLyoqXG4gKiBDb25jYXRlbmF0ZXMgMiBpdGVtcyB0b2dldGhlclxuICpcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBpdGVtcyB0b2dldGhlclxuICogQHNpbmNlIHYxLjAuNFxuICogQHBhcmFtIHthfSBhIC0gTGVmdCBzaWRlIG9mIHRoZSBjb25jYXRlbmF0aW9uXG4gKiBAcGFyYW0ge2F9IGIgLSByaWdodCBzaWRlIG9mIHRoZSBjb25jYXRlbmF0aW9uXG4gKiBAcmV0dXJuIHthfSBDb25jYXRlbmF0ZWQgaXRlbVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUNvbmNhdCBmcm9tICcuL2FycmF5L2NvbmNhdCdcbmltcG9ydCBzdHJpbmdDb25jYXQgZnJvbSAnLi9zdHJpbmcvY29uY2F0J1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnU3RyaW5nJzogc3RyaW5nQ29uY2F0LFxuICAgICdBcnJheSc6IGFycmF5Q29uY2F0XG4gIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZShhKV0oYSwgYilcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb25kXG4gKiBAcGFyYW0gY29uZHNcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uZCAoY29uZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjb25kc1tpXVswXSh2YWx1ZSkpIHJldHVybiBjb25kc1tpXVsxXSh2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4vKipcbiAqIEBmdW5jdGlvbiBjdXJyeVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeSAoZnVuKSB7XG4gIGNvbnN0IGFyZ3NsZW4gPSBmdW4ubGVuZ3RoXG5cbiAgaWYgKGFyZ3NsZW4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlY3Vyc2VyKFtdKVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UgKGFjYywgYXJncykge1xuICAgIGNvbnN0IF9hY2MgPSBhY2MuY29uY2F0KGFyZ3MpXG4gICAgcmV0dXJuIF9hY2MubGVuZ3RoIDwgYXJnc2xlblxuICAgICAgPyBjcmVhdGVSZWN1cnNlcihfYWNjKVxuICAgICAgOiBmdW4uYXBwbHkodGhpcywgX2FjYylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlY3Vyc2VyIChhY2MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlY3Vyc2UoYWNjLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZGlmZkRhdGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBkYXRlcyBpbiBtaWxsaXNlY29uZFxuICogQHBhcmFtIHtEYXRlfSBzdGFydCAtIFN0YXJ0IGRhdGVcbiAqIEBwYXJhbSB7RGF0ZX0gZW5kIC0gRW5kIGRhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gUkV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kc1xuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpZmZEYXRlIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiAobmV3IERhdGUoc3RhcnQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGVuZCkuZ2V0VGltZSgpKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdEYXRlJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDkvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IGRpZmZEYXRlIGZyb20gJy4vZGlmZkRhdGUnXG5cbmV4cG9ydCBkZWZhdWx0IChkKSA9PiB7XG4gIHJldHVybiBkaWZmRGF0ZShuZXcgRGF0ZSgpKShkKSA8IDBcbn1cbiIsIi8qKlxuICpcbiAqL1xuaW1wb3J0IGlzRGF0ZSBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1ZhbGlkICh4KSB7XG4gIC8vIG5vaW5zcGVjdGlvbiBKU0NoZWNrRnVuY3Rpb25TaWduYXR1cmVzXG4gIHJldHVybiBpc0RhdGUoeCkgJiYgaXNGaW5pdGUoeC52YWx1ZU9mKCkpXG59O1xuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDg2NDAwMDAwIC8vIDI0KjYwKjYwKjEwMDAgPSA4NjQwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gMzYwMDAwMCAvLyA2MCo2MCoxMDAwID0gMzYwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gNjAwMDAgLy8gNjAqMTAwMCA9IDYwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAxMDAwXHJcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGRlZmF1bHRUb1xuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7YX0gZGVmYXVsdCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7Yn0gdmFsIGB2YWxgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBgZGVmYXVsdGAgdW5sZXNzIGB2YWxgIGlzIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKiBAcmV0dXJuIHsqfSBUaGUgc2Vjb25kIHZhbHVlIGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkZWZhdWx0VG8gKGQsIHYpIHtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIHYgPT0gbnVsbCB8fCB2ICE9PSB2ID8gZCA6IHZcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbXB0eSAoeCkge1xuICByZXR1cm4gbmV3IHguY29uc3RydWN0b3IoKVxufTtcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZXF1YWxzXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGVxdWFsaXR5IG9mIDIgaXRlbXNcbiAqIEBwYXJhbSB7Kn0geCAtIExlZnQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEBwYXJhbSB7Kn0geSAtIFJpZ2h0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBuYW4gPSBOdW1iZXIuTmFOXG4gKiBlcXVhbChuYW4sIG5hbikgLy8gcmV0dXJucyB0cnVlXG4gKlxuICogY29uc3QgYXJyMSA9IFswLCAxLCAyLCAzXVxuICogY29uc3QgYXJyMiA9IFtudWxsLCAxLCAyLCAzXVxuICogZXF1YWxzKGFycjEsIGFycjIpIC8vIHJldHVybnMgZmFsc2VcbiAqXG4gKiBlcXVhbHMobmV3IE9iamVjdCh7J2EnOiAwLCAnYic6IDF9KSwgeydhJzogMCwgJ2InOiAxfSkgLy8gdHJ1ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuL2lkZW50aWNhbCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5pbXBvcnQgb3IgZnJvbSAnLi9vcidcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vYXJyYXkvaXMnXG5pbXBvcnQgaXNCb29sZWFuIGZyb20gJy4vYm9vbGVhbi9pcydcbmltcG9ydCBpc051bWJlciBmcm9tICcuL251bWJlci9pcydcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL3N0cmluZy9pcydcbmltcG9ydCBpc0RhdGUgZnJvbSAnLi9kYXRlL2lzJ1xuaW1wb3J0IGVxdWFsc0FycmF5IGZyb20gJy4vYXJyYXkvZXF1YWxzJ1xuaW1wb3J0IGVxdWFsc09iamVjdCBmcm9tICcuL29iamVjdC9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFscyAoeCwgeSkge1xuICBpZiAoaWRlbnRpY2FsKHgsIHkpKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICh0eXBlKHgpICE9PSB0eXBlKHkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAob3Iobm90KGV4aXN0cyh4KSksIG5vdChleGlzdHMoeSkpKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHguY29uc3RydWN0b3IgIT09IHkuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZVxuXG4gIGlmIChpc1N0cmluZyh4KSB8fCBpc0Jvb2xlYW4oeCkgfHwgaXNOdW1iZXIoeCkgfHwgaXNEYXRlKHgpKSB7XG4gICAgcmV0dXJuIGlkZW50aWNhbCh4LnZhbHVlT2YoKSwgeS52YWx1ZU9mKCkpXG4gIH1cbiAgaWYgKGlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzQXJyYXkoeCwgeSlcbiAgfSBlbHNlIGlmIChpc09iamVjdCh4KSkge1xuICAgIHJldHVybiBlcXVhbHNPYmplY3QoeCwgeSlcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBleGlzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhpc3RzICh4KSB7XG4gIHJldHVybiAhKHggPT0gbnVsbClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaWx0ZXJcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdWNudGlvbiB0aGF0IGZpbHRlcnMgT2JqZWN0cywgQXJyYXlzIGFuZCBNYXBzXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL2FycmF5L2ZpbHRlcidcbmltcG9ydCBvYmplY3RGaWx0ZXIgZnJvbSAnLi9vYmplY3QvZmlsdGVyJ1xuaW1wb3J0IG1hcEZpbHRlciBmcm9tICcuL21hcC9maWx0ZXInXG4vLyBUT0RPXG4vLyBpbXBvcnQgc2V0RmlsdGVyIGZyb20gJy4uL3NldC9maWx0ZXInXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbHRlciAoZm4sIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgLy8gc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpIHtcbiAgICAvLyBjYXNlICdGdW5jdGlvbic6XG4gICAgLy8gICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgLy8gICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0RmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1N0cmluZyc6XG4gICAgLy8gICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwRmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1NldCc6XG4gICAgLy8gICByZXR1cm4gc2V0RmlsdGVyKGZuLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIoZm4sIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRJbmRleFxuICogQGRlc2NyaXB0aW9uIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGJvb2xlYW4pIC0+IFthXSAtPiBudW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gQW4gYXJyYXkgbGlrZSBvYmplY3RcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbmRJbmRleCAoZm4sIGEpIHtcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICBpZiAoZm4oYVtpXSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiAtMVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpcnN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYXJyID0gWzEsIDIsIDRdXG4gKiBmaXJzdChbMSwgMiwgNF0pIC8vIHJldHVybnMgMVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gZmlyc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhWzBdIDogdW5kZWZpbmVkXG59KVxuIiwiaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0J1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbi8qKlxuICogQGZ1bmN0aW9uIGZsYXRNYXBcbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmxhdE1hcCAoZm4sIGEpIHtcbiAgaWYgKGlzRnVuY3Rpb24oYSkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmbihhKHgpKSh4KVxuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihhLmZsYXRNYXApKSB7XG4gICAgcmV0dXJuIGEuZmxhdE1hcChmbilcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiBjb25jYXQoYWNjLCBmbih4KSksIGVtcHR5KGEpLCBhKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGxpa2Ugb2JqZWN0IGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpdGVtXG4gKlxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKChhLCBiLCBjLCBhKSDihpIgYSkg4oaSIGEg4oaSIFtiXSDihpIgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgcmVjZWl2ZXMgNCB2YWx1ZXM6IHRoZSBhY2N1bXVsYXRvciwgdGhlIGl0ZW0sIHRoZSBpbmRleCwgYW5kIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHsqfSBhIGlzIHRoZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0geyp9IFtiXSB0aGUgYXJyYXkgbGlrZSBpdGVtIHRvIGl0ZXJhdGUgb3ZlclxuICogQHJldHVybiB7Kn0gYSBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWVcbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBvYmplY3RGb2xkIGZyb20gJy4vb2JqZWN0L2ZvbGQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBhKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ09iamVjdCc6IG9iamVjdEZvbGQsXG4gICAgJ0FycmF5JzogYXJyYXlGb2xkXG4gIH1cbiAgLy8gaWYgKGEubmV4dCkge1xuICAvLyAgIHJldHVybiBpdGVyYWJsZUZvbGQoY2IsIGluaXQsIGEpXG4gIC8vIH1cbiAgLy8gaWYgKHR5cGUoU3ltYm9sKSAhPT0gJ3VuZGVmaW5lZCcgJiYgYVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYVtTeW1ib2wuaXRlcmF0b3JdKCkpXG4gIC8vIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZShhKV0oY2IsIGluaXQsIGEpXG59KVxuXG4vLyBmdW5jdGlvbiBpdGVyYWJsZUZvbGQgKGNiLCBhY2MsIGdlbikge1xuLy8gICBsZXQgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgd2hpbGUgKCFzdGVwLmRvbmUpIHtcbi8vICAgICBhY2MgPSBjYihhY2MsIHN0ZXAudmFsdWUpXG4vLyAgICAgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgfVxuLy8gICByZXR1cm4gYWNjXG4vLyB9XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aWNhbFxuICogQGRlc2NyaXB0aW9uIGNoZWNrcyBmb3IgaWRlbnRpbnRpY2FsIGl0ZW1zXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzTmFuIGZyb20gJy4vbnVtYmVyL2lzTmFuJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBpZGVudGljYWwgKHgsIHkpIHtcbiAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgIHJldHVybiAxIC8geCA9PT0gMSAvIHlcbiAgfVxuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuICEhKGlzTmFuKHgpICYmIGlzTmFuKHkpKVxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSB2YWx1ZSBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZGVudGl0eSAoeCkge1xuICByZXR1cm4geFxufTtcbiIsIi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgX18gfSBmcm9tICcuL19fJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBlcnR1cmUgfSBmcm9tICcuL2FwZXJ0dXJlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVNwZWMgfSBmcm9tICcuL2FwcGx5U3BlYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlUbyB9IGZyb20gJy4vYXBwbHlUbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNjZW5kIH0gZnJvbSAnLi9hc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFzc29jIH0gZnJvbSAnLi9hc3NvYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2NQYXRoIH0gZnJvbSAnLi9hc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNsYW1wIH0gZnJvbSAnLi9jbGFtcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmUgfSBmcm9tICcuL2Nsb25lJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wYXJhdG9yIH0gZnJvbSAnLi9jb21wYXJhdG9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlSyB9IGZyb20gJy4vY29tcG9zZUsnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VQIH0gZnJvbSAnLi9jb21wb3NlUCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVdpdGggfSBmcm9tICcuL2NvbXBvc2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3QgfSBmcm9tICcuL2NvbnN0cnVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29uc3RydWN0TiB9IGZyb20gJy4vY29uc3RydWN0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29udGFpbnMgfSBmcm9tICcuL2NvbnRhaW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb252ZXJnZSB9IGZyb20gJy4vY29udmVyZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvdW50QnkgfSBmcm9tICcuL2NvdW50QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlYyB9IGZyb20gJy4vZGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkZXNjZW5kIH0gZnJvbSAnLi9kZXNjZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlIH0gZnJvbSAnLi9kaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vZGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvYyB9IGZyb20gJy4vZGlzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXNzb2NQYXRoIH0gZnJvbSAnLi9kaXNzb2NQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wIH0gZnJvbSAnLi9kcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wTGFzdCB9IGZyb20gJy4vZHJvcExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0V2hpbGUgfSBmcm9tICcuL2Ryb3BMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzIH0gZnJvbSAnLi9kcm9wUmVwZWF0cydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHNXaXRoIH0gZnJvbSAnLi9kcm9wUmVwZWF0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BXaGlsZSB9IGZyb20gJy4vZHJvcFdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlaXRoZXIgfSBmcm9tICcuL2VpdGhlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZW5kc1dpdGggfSBmcm9tICcuL2VuZHNXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcUJ5IH0gZnJvbSAnLi9lcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcVByb3BzIH0gZnJvbSAnLi9lcVByb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBldm9sdmUgfSBmcm9tICcuL2V2b2x2ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZCB9IGZyb20gJy4vZmluZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZExhc3QgfSBmcm9tICcuL2ZpbmRMYXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdEluZGV4IH0gZnJvbSAnLi9maW5kTGFzdEluZGV4J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0dGVuIH0gZnJvbSAnLi9mbGF0dGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGlwIH0gZnJvbSAnLi9mbGlwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoIH0gZnJvbSAnLi9mb3JFYWNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoT2JqSW5kZXhlZCB9IGZyb20gJy4vZm9yRWFjaE9iakluZGV4ZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZyb21QYWlycyB9IGZyb20gJy4vZnJvbVBhaXJzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cEJ5IH0gZnJvbSAnLi9ncm91cEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cFdpdGggfSBmcm9tICcuL2dyb3VwV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3QgfSBmcm9tICcuL2d0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndGUgfSBmcm9tICcuL2d0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzUGF0aCB9IGZyb20gJy4vaGFzUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGVhZCB9IGZyb20gJy4vaGVhZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaWZFbHNlIH0gZnJvbSAnLi9pZkVsc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluYyB9IGZyb20gJy4vaW5jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmNsdWRlcyB9IGZyb20gJy4vaW5jbHVkZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4QnkgfSBmcm9tICcuL2luZGV4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4T2YgfSBmcm9tICcuL2luZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluaXQgfSBmcm9tICcuL2luaXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGlubmVySm9pbiB9IGZyb20gJy4vaW5uZXJKb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnQgfSBmcm9tICcuL2luc2VydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5zZXJ0QWxsIH0gZnJvbSAnLi9pbnNlcnRBbGwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc2VjdGlvbiB9IGZyb20gJy4vaW50ZXJzZWN0aW9uJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRlcnNwZXJzZSB9IGZyb20gJy4vaW50ZXJzcGVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludG8gfSBmcm9tICcuL2ludG8nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydCB9IGZyb20gJy4vaW52ZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZlcnRPYmogfSBmcm9tICcuL2ludmVydE9iaidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52b2tlciB9IGZyb20gJy4vaW52b2tlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgam9pbiB9IGZyb20gJy4vam9pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMganV4dCB9IGZyb20gJy4vanV4dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdEluZGV4T2YgfSBmcm9tICcuL2xhc3RJbmRleE9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5ndGggfSBmcm9tICcuL2xlbmd0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVucyB9IGZyb20gJy4vbGVucydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc0luZGV4IH0gZnJvbSAnLi9sZW5zSW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNQYXRoIH0gZnJvbSAnLi9sZW5zUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1Byb3AgfSBmcm9tICcuL2xlbnNQcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0TiB9IGZyb20gJy4vbGlmdE4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGx0IH0gZnJvbSAnLi9sdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHRlIH0gZnJvbSAnLi9sdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hcEFjY3VtIH0gZnJvbSAnLi9tYXBBY2N1bSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW1SaWdodCB9IGZyb20gJy4vbWFwQWNjdW1SaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwT2JqSW5kZXhlZCB9IGZyb20gJy4vbWFwT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWF0Y2ggfSBmcm9tICcuL21hdGNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRoTW9kIH0gZnJvbSAnLi9tYXRoTW9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXhCeSB9IGZyb20gJy4vbWF4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lYW4gfSBmcm9tICcuL21lYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lZGlhbiB9IGZyb20gJy4vbWVkaWFuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZW1vaXplV2l0aCB9IGZyb20gJy4vbWVtb2l6ZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlQWxsIH0gZnJvbSAnLi9tZXJnZUFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwTGVmdCB9IGZyb20gJy4vbWVyZ2VEZWVwTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICcuL21lcmdlRGVlcFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoIH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZUxlZnQgfSBmcm9tICcuL21lcmdlTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VSaWdodCB9IGZyb20gJy4vbWVyZ2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoIH0gZnJvbSAnLi9tZXJnZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlV2l0aEtleSB9IGZyb20gJy4vbWVyZ2VXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW4gfSBmcm9tICcuL21pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWluQnkgfSBmcm9tICcuL21pbkJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb2R1bG8gfSBmcm9tICcuL21vZHVsbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbW92ZSB9IGZyb20gJy4vbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbkFyeSB9IGZyb20gJy4vbkFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbmVnYXRlIH0gZnJvbSAnLi9uZWdhdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG5vbmUgfSBmcm9tICcuL25vbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aCB9IGZyb20gJy4vbnRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBudGhBcmcgfSBmcm9tICcuL250aEFyZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbyB9IGZyb20gJy4vbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb2JqT2YgfSBmcm9tICcuL29iak9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvZiB9IGZyb20gJy4vb2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9uY2UgfSBmcm9tICcuL29uY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG90aGVyd2lzZSB9IGZyb20gJy4vb3RoZXJ3aXNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvdmVyIH0gZnJvbSAnLi9vdmVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYWlyIH0gZnJvbSAnLi9wYWlyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsIH0gZnJvbSAnLi9wYXJ0aWFsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsUmlnaHQgfSBmcm9tICcuL3BhcnRpYWxSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGl0aW9uIH0gZnJvbSAnLi9wYXJ0aXRpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhFcSB9IGZyb20gJy4vcGF0aEVxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoT3IgfSBmcm9tICcuL3BhdGhPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aFNhdGlzZmllcyB9IGZyb20gJy4vcGF0aFNhdGlzZmllcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0FsbCB9IGZyb20gJy4vcGlja0FsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0J5IH0gZnJvbSAnLi9waWNrQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGUgfSBmcm9tICcuL3BpcGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVLIH0gZnJvbSAnLi9waXBlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZVAgfSBmcm9tICcuL3BpcGVQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlV2l0aCB9IGZyb20gJy4vcGlwZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBsdWNrIH0gZnJvbSAnLi9wbHVjaydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZCB9IGZyb20gJy4vcHJlcGVuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvZHVjdCB9IGZyb20gJy4vcHJvZHVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvamVjdCB9IGZyb20gJy4vcHJvamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcEVxIH0gZnJvbSAnLi9wcm9wRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BJcyB9IGZyb20gJy4vcHJvcElzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wT3IgfSBmcm9tICcuL3Byb3BPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcHMgfSBmcm9tICcuL3Byb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wU2F0aXNmaWVzIH0gZnJvbSAnLi9wcm9wU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZSB9IGZyb20gJy4vcmVkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VCeSB9IGZyb20gJy4vcmVkdWNlQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZWQgfSBmcm9tICcuL3JlZHVjZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZVJpZ2h0IH0gZnJvbSAnLi9yZWR1Y2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlV2hpbGUgfSBmcm9tICcuL3JlZHVjZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWplY3QgfSBmcm9tICcuL3JlamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVtb3ZlIH0gZnJvbSAnLi9yZW1vdmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGVhdCB9IGZyb20gJy4vcmVwZWF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXBsYWNlIH0gZnJvbSAnLi9yZXBsYWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzY2FuIH0gZnJvbSAnLi9zY2FuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXF1ZW5jZSB9IGZyb20gJy4vc2VxdWVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNldCB9IGZyb20gJy4vc2V0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzbGljZSB9IGZyb20gJy4vc2xpY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnQgfSBmcm9tICcuL3NvcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRCeSB9IGZyb20gJy4vc29ydEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0V2l0aCB9IGZyb20gJy4vc29ydFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0IH0gZnJvbSAnLi9zcGxpdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRBdCB9IGZyb20gJy4vc3BsaXRBdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRFdmVyeSB9IGZyb20gJy4vc3BsaXRFdmVyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRXaGVuIH0gZnJvbSAnLi9zcGxpdFdoZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN0YXJ0c1dpdGggfSBmcm9tICcuL3N0YXJ0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN1YnRyYWN0IH0gZnJvbSAnLi9zdWJ0cmFjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZSB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZVdpdGggfSBmcm9tICcuL3N5bW1ldHJpY0RpZmZlcmVuY2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWlsIH0gZnJvbSAnLi90YWlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlIH0gZnJvbSAnLi90YWtlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlTGFzdCB9IGZyb20gJy4vdGFrZUxhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0V2hpbGUgfSBmcm9tICcuL3Rha2VMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VXaGlsZSB9IGZyb20gJy4vdGFrZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YXAgfSBmcm9tICcuL3RhcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGVzdCB9IGZyb20gJy4vdGVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGhlbiB9IGZyb20gJy4vdGhlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGh1bmtpZnkgfSBmcm9tICcuL3RodW5raWZ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aW1lcyB9IGZyb20gJy4vdGltZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvTG93ZXIgfSBmcm9tICcuL3RvTG93ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnMgfSBmcm9tICcuL3RvUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnNJbiB9IGZyb20gJy4vdG9QYWlyc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1N0cmluZyB9IGZyb20gJy4vdG9TdHJpbmcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvVXBwZXIgfSBmcm9tICcuL3RvVXBwZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zZHVjZSB9IGZyb20gJy4vdHJhbnNkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmFuc3Bvc2UgfSBmcm9tICcuL3RyYW5zcG9zZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tICcuL3RyYXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmltIH0gZnJvbSAnLi90cmltJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnlDYXRjaCB9IGZyb20gJy4vdHJ5Q2F0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXBwbHkgfSBmcm9tICcuL3VuYXBwbHknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXJ5IH0gZnJvbSAnLi91bmFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jdXJyeU4gfSBmcm9tICcuL3VuY3VycnlOJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmZvbGQgfSBmcm9tICcuL3VuZm9sZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb25XaXRoIH0gZnJvbSAnLi91bmlvbldpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXEgfSBmcm9tICcuL3VuaXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFCeSB9IGZyb20gJy4vdW5pcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlxV2l0aCB9IGZyb20gJy4vdW5pcVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubGVzcyB9IGZyb20gJy4vdW5sZXNzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bm5lc3QgfSBmcm9tICcuL3VubmVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW50aWwgfSBmcm9tICcuL3VudGlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1cGRhdGUgfSBmcm9tICcuL3VwZGF0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlV2l0aCB9IGZyb20gJy4vdXNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzSW4gfSBmcm9tICcuL3ZhbHVlc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2aWV3IH0gZnJvbSAnLi92aWV3J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVuIH0gZnJvbSAnLi93aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVyZSB9IGZyb20gJy4vd2hlcmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlRXEgfSBmcm9tICcuL3doZXJlRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhvdXQgfSBmcm9tICcuL3dpdGhvdXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHhwcm9kIH0gZnJvbSAnLi94cHJvZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgemlwT2JqIH0gZnJvbSAnLi96aXBPYmonXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkZCB9IGZyb20gJy4vbnVtYmVyL2FkZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkSW5kZXggfSBmcm9tICcuL2FkZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3QgfSBmcm9tICcuL2FkanVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRqdXN0V2l0aCB9IGZyb20gJy4vYWRqdXN0V2l0aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsIH0gZnJvbSAnLi9hbGwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsbFBhc3MgfSBmcm9tICcuL2FsbFBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsd2F5cyB9IGZyb20gJy4vYWx3YXlzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbmQgfSBmcm9tICcuL2FuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55IH0gZnJvbSAnLi9hbnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFueVBhc3MgfSBmcm9tICcuL2FueVBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwIH0gZnJvbSAnLi9hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwZW5kIH0gZnJvbSAnLi9hcHBlbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5IH0gZnJvbSAnLi9hcHBseSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluYXJ5IH0gZnJvbSAnLi9iaW5hcnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJpbmQgfSBmcm9tICcuL2JpbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJvdGggfSBmcm9tICcuL2Jvb2xlYW4vYm90aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2FsbCB9IGZyb20gJy4vY2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcGxlbWVudCB9IGZyb20gJy4vY29tcGxlbWVudCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZSB9IGZyb20gJy4vY29tcG9zZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbmQgfSBmcm9tICcuL2NvbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGN1cnJ5IH0gZnJvbSAnLi9jdXJyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVmYXVsdFRvIH0gZnJvbSAnLi9kZWZhdWx0VG8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZEYXRlIH0gZnJvbSAnLi9kYXRlL2RpZmZEYXRlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXZpZGUgfSBmcm9tICcuL251bWJlci9kaXZpZGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGVtcHR5IH0gZnJvbSAnLi9lbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXF1YWxzIH0gZnJvbSAnLi9lcXVhbHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV4aXN0cyB9IGZyb20gJy4vZXhpc3RzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGIH0gZnJvbSAnLi9ib29sZWFuL0YnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kSW5kZXggfSBmcm9tICcuL2ZpbmRJbmRleCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlyc3QgfSBmcm9tICcuL2ZpcnN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0TWFwIH0gZnJvbSAnLi9mbGF0TWFwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb2xkIH0gZnJvbSAnLi9mb2xkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JtYXRTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9mb3JtYXRTdHJpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhcyB9IGZyb20gJy4vb2JqZWN0L2hhcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzSW4gfSBmcm9tICcuL29iamVjdC9oYXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpY2FsIH0gZnJvbSAnLi9pZGVudGljYWwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlkZW50aXR5IH0gZnJvbSAnLi9pZGVudGl0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXMgfSBmcm9tICcuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0FycmF5IH0gZnJvbSAnLi9hcnJheS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNCb29sZWFuIH0gZnJvbSAnLi9ib29sZWFuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0RhdGUgfSBmcm9tICcuL2RhdGUvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRnV0dXJlRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc0Z1dHVyZURhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTWFwIH0gZnJvbSAnLi9tYXAvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTmFuIH0gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTnVsbCB9IGZyb20gJy4vbnVsbC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdW1iZXIgfSBmcm9tICcuL251bWJlci9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNPYmplY3QgfSBmcm9tICcuL29iamVjdC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTZXQgfSBmcm9tICcuL3NldC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNVbmRlZmluZWQgfSBmcm9tICcuL3VuZGVmaW5lZC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNWYWxpZERhdGUgfSBmcm9tICcuL2RhdGUvaXNWYWxpZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSnVzdCB9IGZyb20gJy4vbW9uYWRzL0p1c3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXMgfSBmcm9tICcuL2tleXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXNJbiB9IGZyb20gJy4vb2JqZWN0L2tleXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdCB9IGZyb20gJy4vbGFzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdCB9IGZyb20gJy4vbGlmdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwIH0gZnJvbSAnLi9tYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1heCB9IGZyb20gJy4vbWF4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXliZSB9IGZyb20gJy4vbW9uYWRzL01heWJlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZSB9IGZyb20gJy4vb2JqZWN0L21lcmdlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtdWx0aXBseSB9IGZyb20gJy4vbnVtYmVyL211bHRpcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBub3QgfSBmcm9tICcuL25vdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTm90aGluZyB9IGZyb20gJy4vbW9uYWRzL05vdGhpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9taXQgfSBmcm9tICcuL29iamVjdC9vbWl0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvciB9IGZyb20gJy4vb3InXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhdGggfSBmcm9tICcuL29iamVjdC9wYXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrIH0gZnJvbSAnLi9vYmplY3QvcGljaydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcCB9IGZyb20gJy4vb2JqZWN0L3Byb3AnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHN1bSB9IGZyb20gJy4vbnVtYmVyL3N1bSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVCB9IGZyb20gJy4vYm9vbGVhbi9UJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0RheSB9IGZyb20gJy4vZGF0ZS90b0RheSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Ib3VyIH0gZnJvbSAnLi9kYXRlL3RvSG91cidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9NaW51dGVzIH0gZnJvbSAnLi9kYXRlL3RvTWludXRlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TZWNvbmRzIH0gZnJvbSAnLi9kYXRlL3RvU2Vjb25kcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJ1dGh5IH0gZnJvbSAnLi90cnV0aHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIHR5cGUgfSBmcm9tICcuL3R5cGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuaW9uIH0gZnJvbSAnLi9hcnJheS91bmlvbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzIH0gZnJvbSAnLi9vYmplY3QvdmFsdWVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXAgfSBmcm9tICcuL3ppcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgemlwV2l0aCB9IGZyb20gJy4vemlwV2l0aCdcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzXG4gKiBAZGVzY3JpcHRpb24gVmVyaWZpZXMgdGhlIHR5cGUgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50XG4gKlxuICovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBpcyAoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB0eXBlKHZhbCkgPT09IEN0b3Jcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGVxdWFscyBmcm9tICcuL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNFbXB0eSAoeCkge1xuICByZXR1cm4gZXhpc3RzKHgpICYmIGVxdWFscyh4LCBlbXB0eSh4KSlcbn07XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0l0ZXIgKGl0ZXIpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcltTeW1ib2wuaXRlcmF0b3JdKVxufVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gSXRlcmF0b3IgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuM1xuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmF0b3J9IGFcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNhbGxiYWNrLCBpdGVyYXRvcikge1xuICBsZXQgciA9IFtdXG4gIGZvciAobGV0IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsgbmV4dFZhbHVlLmRvbmUgIT09IHRydWU7IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKSkge1xuICAgIHIucHVzaChjYWxsYmFjayhpdGVyYXRvci52YWx1ZSgpKSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IG9yIGl0ZXJhdG9yXG4gKlxuICogQGZ1bmN0aW9uIGtleXNcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgb2JqIC0+IFsqXVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIE9iaiBmcm9tIHpoaWNoIHRvIHRha2UgdGhlIGtleXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgb2JqZWN0S2V5cyBmcm9tICcuL29iamVjdC9rZXlzJ1xuaW1wb3J0IG1hcEtleXMgZnJvbSAnLi9tYXAva2V5cydcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChvYmopIHtcbiAgc3dpdGNoICh0eXBlKG9iaikpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEtleXMob2JqKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0S2V5cyhvYmopXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBsYXN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGxhc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhW2EubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWRcbn0pXG4iLCIvKipcbiAqIFwibGlmdHNcIiBhIGZ1bmN0aW9uIG9mIGFyaXR5ID4gMSBzbyB0aGF0IGl0IG1heSBcIm1hcCBvdmVyXCIgYSBsaXN0LCBGdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+IChbKl0uLi4gLT4gWypdKVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGFwIGZyb20gJy4vYXAnXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBsaWZ0IChmbikge1xuICBjb25zdCBsaWZ0ZWQgPSBjdXJyeTEoY3VycnkoZm4pKVxuICByZXR1cm4gY3VycnkoZnVuY3Rpb24gX2xpZnQgKCkge1xuICAgIHJldHVybiBmb2xkKGFwLCBtYXAobGlmdGVkLCBhcmd1bWVudHNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICB9KVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIGl0ZXJhYmxlIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggbWFwcyBvdmVyIGFuIGl0ZXJhYmxlLlxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gYiAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL2FycmF5L21hcCdcbmltcG9ydCBvYmplY3RNYXAgZnJvbSAnLi9vYmplY3QvbWFwJ1xuaW1wb3J0IG1hcE1hcCBmcm9tICcuL21hcC9tYXAnXG5pbXBvcnQgc3RyaW5nTWFwIGZyb20gJy4vc3RyaW5nL21hcCdcbmltcG9ydCBpdGVyYXRvck1hcCBmcm9tICcuL2l0ZXJhdG9yL21hcCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3IvaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdE1hcChjYiwgYSlcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcE1hcChjYiwgYSlcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlNYXAoY2IsIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0l0ZXJhdG9yKGEpXG4gICAgICAgID8gaXRlcmF0b3JNYXAoY2IsIGEpXG4gICAgICAgIDogYXJyYXlNYXAoY2IsIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBtYXBGaWx0ZXJcbiAqIEBwcml2YXRlXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcEZpbHRlciAoZm4sIG0pIHtcbiAgbGV0IHIgPSBuZXcgTWFwKClcblxuICBsZXQgaXQgPSBtLmVudHJpZXMoKVxuICBsZXQgcmVzdWx0ID0gaXQubmV4dCgpXG5cbiAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IGsgPSByZXN1bHQudmFsdWVbMF1cbiAgICBjb25zdCB2ID0gcmVzdWx0LnZhbHVlWzFdXG4gICAgaWYgKGZuKGssIHYpKSByLnNldChrLCB2KVxuICAgIHJlc3VsdCA9IGl0Lm5leHQoKVxuICB9XG5cbiAgLy8gTGltaXRlZCBicm93c2VyIHN1cHBvcnRcbiAgLy8gbS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gIC8vICAgaWYgKGZuKGssIHYpKSByLnNldChrLCB2KVxuICAvLyB9KVxuXG4gIC8vIGJhYmVsIHRyYW5zcGlsZSBpc3N1ZXNcbiAgLy8gZm9yIChjb25zdCBbaywgdl0gb2YgbS5lbnRyaWVzKCkpIHtcbiAgLy9cbiAgLy8gfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTWFwJylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gTWFwIGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBhLmtleXMoKVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgTWFwIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge01hcH0gYVxuICogQHJldHVybiB7TWFwfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICBhLmZvckVhY2goKHYsIGssIG1hcCkgPT4ge1xuICAgIHIuc2V0KGssIGNiKHYsIGssIG1hcCkpXG4gIH0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXN0IG9mIHRoZSAyIGFyZ3VtZW50cyBwcm92aWRlZFxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1heCAoYSwgYikge1xuICByZXR1cm4gYiA+IGEgPyBiIDogYVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIEp1c3RcbiAqIEBwYXJhbSB2YWxcbiAqIEByZXR1cm5zIHtKdXN0fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBKdXN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl92YWx1ZSA9IHZhbFxuICByZXR1cm4gdGhpc1xufVxuXG5KdXN0LnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlXG59XG5KdXN0LnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBKdXN0XG4iLCJpbXBvcnQgSnVzdCBmcm9tICcuL0p1c3QnXG5pbXBvcnQgTm90aGluZyBmcm9tICcuL05vdGhpbmcnXG5cbi8qKlxuICogQGZ1bmN0aW9uIE1heWJlXG4gKiBAcGFyYW0gdmFsXG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IE1heWJlID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl9fdmFsdWUgPSB2YWxcbn1cblxuTWF5YmUub2YgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBNYXliZSkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1heWJlKSB7XG4gICAgdGhpcy5fX3ZhbHVlID0gdmFsXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuICByZXR1cm4gbmV3IE1heWJlKHZhbClcbn1cblxuTWF5YmUucHJvdG90eXBlLmdldE9yRWxzZSA9IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiB0aGlzLmlzTm90aGluZygpID8gbiA6IHRoaXMuX192YWx1ZVxufVxuXG5NYXliZS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgaWYgKHRoaXMuaXNOb3RoaW5nKCkpIHtcbiAgICByZXR1cm4gTWF5YmUub2YobnVsbClcbiAgfVxuICByZXR1cm4gTWF5YmUub2YoZih0aGlzLl9fdmFsdWUpKVxufVxuXG5NYXliZS5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbiAobSkge1xuICByZXR1cm4gbS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG5NYXliZS5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMuX192YWx1ZSA9PSBudWxsKVxufVxuXG5NYXliZS5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIXRoaXMuaXNOb3RoaW5nKClcbn1cblxuTWF5YmUucHJvdG90eXBlLk5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgTm90aGluZygpXG59XG5cbk1heWJlLnByb3RvdHlwZS5KdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IEp1c3QodGhpcy5fdmFsdWUpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1heWJlXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBOb3RoaW5nXG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IE5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG59XG5cbk5vdGhpbmcucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5Ob3RoaW5nLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vdGhpbmdcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG5vdFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbm90ICh4KSB7XG4gIHJldHVybiAheFxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdudWxsJylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSAyIGFyZ3VtZW50c1xuICpcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gIHJldHVybiArYSArICtiXG59KVxuIiwiLyoqXG4gKlxuICpcbiAqIEBmdW5jdGlvbiBkaXZpZGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaXZpc2lvbiBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkaXZpZGUgKGEsIGIpIHtcbiAgcmV0dXJuICthIC8gK2Jcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ051bWJlcicpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc05hTlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBudW1iZXIgaXMgTkFOXG5cbiAqL1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOYW4gKHgpIHtcbiAgcmV0dXJuIGFuZChpc051bWJlcih4KSwgaXNOYU4oeCkpXG59O1xuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSAyIGFyZ3VtZW50c1xuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG11bHRpcGx5IChhLCBiKSB7XG4gIHJldHVybiArYSAqICtiXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgaW4gYW4gYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgYWRkIGZyb20gJy4vYWRkJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi4vZm9sZCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gc3VtIChhKSB7XG4gIHJldHVybiBmb2xkKGFkZCwgMCwgYSlcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi4vZXhpc3RzJ1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4uL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHgsIHkpID0+IHtcbiAgZm9yIChsZXQga2V5WCBpbiB4KSB7XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5maWx0ZXJlZEZvckluTG9vcFxuICAgIGlmIChub3QoZXF1YWxzKHhba2V5WF0sIHlba2V5WF0pKSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGxldCBrZXlZIGluIHkpIHtcbiAgICBpZiAobm90KGV4aXN0cyh4W2tleVldKSkgJiYgZXhpc3RzKHlba2V5WV0pKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb2JqZWN0RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvYmplY3RGaWx0ZXIgKGZuLCBvKSB7XG4gIGxldCByID0ge31cbiAgY29uc3QgayA9IGtleXMobylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKG9ba1tpXV0pKSByW2tbaV1dID0gb1trW2ldXVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIG8pIHtcbiAgY29uc3QgayA9IGtleXMobylcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgbGV0IHIgPSBPYmplY3QoaW5pdClcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2Iociwgb1trW2ldXSwga1tpXSwgbylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIHtTdHJpbmd9IC0+IHtPYmplY3R9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBoYXMgKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcClcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eSwgZXZlbiBpZiBpdCBpcyBpbmhlcml0ZWRcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcge1N0cmluZ30gLT4ge09iamVjdH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGhhc0luIChwcm9wLCBvYmopIHtcbiAgcmV0dXJuIHByb3AgaW4gb2JqXG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QoYSkpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGFsbCB0aGUga2V5cyBvZiBhbiBvYmplY3QgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgY29uc3QgciA9IFtdXG4gIGZvciAoY29uc3QgayBpbiBhKSB7XG4gICAgci5wdXNoKGspXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBvYmplY3QgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7T2JqZWN0fSBhXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgayA9IGtleXMoYSlcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltrW2ldXSA9IGNiKGFba1tpXV0sIGtbaV0sIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi4vaWRlbnRpY2FsJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4uL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4uL2FycmF5L2lzJ1xuaW1wb3J0IHVuaW9uIGZyb20gJy4uL2FycmF5L3VuaW9uJ1xuXG5jb25zdCBtZXJnZSA9IGN1cnJ5KChvYmpMLCBvYmpSKSA9PiB7XG4gIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuXG4gIGlmIChpZGVudGljYWwob2JqTCwgb2JqUikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqUikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9ialIsIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IG9sZFZhbHVlID0gb2JqUltrZXldXG4gICAgY29uc3QgbmV3VmFsdWUgPSBvYmpMW2tleV1cblxuICAgIGlmIChpc09iamVjdChvbGRWYWx1ZSkgJiYgaXNPYmplY3QobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHVuaW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBvbGRWYWx1ZSAvLyBUT0RPOiB0aGlzIGlzIGEgcmVmZXJlbmNlLCBzaG91bGQgYmUgY2xvbmVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgob2JqLCBuYW1lcykgPT4ge1xuICBsZXQgcmVzdWx0ID0ge31cblxuICBPYmplY3Qua2V5cyhvYmopLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgfSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGF0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBhdGggKHBhdGgsIG9iaikge1xuICBsZXQgdmFsID0gb2JqXG4gIGxldCBpZHggPSAwXG4gIGxldCBwXG4gIHdoaWxlIChpZHggPCBwYXRoLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHAgPSBwYXRoW2lkeF1cbiAgICB2YWwgPSBOdW1iZXIuaXNJbnRlZ2VyKHApXG4gICAgICA/IHAgPCAwID8gdmFsW3ZhbC5sZW5ndGggKyBwXSA6IHZhbFtwXVxuICAgICAgOiB2YWxbcF1cbiAgICBpZHggKz0gMVxuICB9XG4gIHJldHVybiB2YWxcbn0pXG4vLyBsZXQgciA9IG9ialxuLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4vLyAgIGlmIChyID09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbi8vICAgciA9IHJbcGF0aFtpXV1cbi8vIH1cbi8vIHJldHVybiByXG4vLyB9KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGlja1xuICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBuZXcgYmplY3Qgd2l0aCBvbmx5IHRoZSBwcm9wcyB0aGF0IGFyZSBwcm92aWRlZFxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgLSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGljayAocHJvcHMsIG9iaikge1xuICBjb25zdCByID0ge31cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgcHJvcHMubGVuZ3RoKSB7XG4gICAgaWYgKHByb3BzW2ldIGluIG9iaikge1xuICAgICAgcltwcm9wc1tpXV0gPSBvYmpbcHJvcHNbaV1dXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcHJvcFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHByb3AgKHAsIG9iaikge1xuICByZXR1cm4gb2JqW3BdXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdmFsdWVzXG4gKiBAZGVzY3JpcHRpb24gUkV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIHRha2VuIGZyb20gYW4gb2JqZWN0cyBvd24gcHJvcGVydGllc1xuICogQHBhcmFtIHtvYmplY3R9IC0gb2JqIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSB2YWx1ZXNcbiAqIEByZXR1cm4ge2FycmF5fVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdmFsdWVzIChvYmopIHtcbiAgY29uc3QgayA9IGtleXMob2JqKVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgY29uc3QgciA9IFtdXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICByW2ldID0gb2JqW2tbaV1dXG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBvbmUgb3IgdGhlIG90aGVyIGlzIHRydWVcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9yICh4LCB5KSB7XG4gIHJldHVybiB4IHx8IHlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ1NldCcpXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gc3RyaW5nQ29uY2F0XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIHJldHVybiBTdHJpbmcoYSkgKyBTdHJpbmcoYilcbn1cbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IHRvQXJyYXkgZnJvbSAnLi4vYXJyYXkvdG8nXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3RyaW5nIChzdHIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgbGV0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcblxuICBhcmdzLnNoaWZ0KClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFxcZCspfS9nLCAobWF0Y2gsIGlkeCkgPT4ge1xuICAgIHJldHVybiBub3QoaXMoJ1VuZGVmaW5lZCcsIGFyZ3NbaWR4XSkpID8gYXJnc1tpZHhdIDogbWF0Y2hcbiAgfSlcbn1cbiIsIi8qKlxuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ1N0cmluZycpXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIHN0cmluZyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSAnJ1xuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgKz0gY2IoYS5jaGFyQXQoaSksIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0cnV0aHlcbiAqL1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJ1dGh5ICh4KSB7XG4gIHJldHVybiAoeCAhPT0gZmFsc2UpICYmIGV4aXN0cyh4KVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIHR5cGUgKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KS5zbGljZSg4LCAtMSlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygndW5kZWZpbmVkJylcbiIsIi8qKlxuXG4gKiB6aXBcbiAqXG4gKiBAZnVuY3Rpb24gemlwXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IHppcFdpdGggZnJvbSAnLi96aXBXaXRoJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXAgKGEsIGIpIHtcbiAgcmV0dXJuIHppcFdpdGgoZnVuY3Rpb24gX3ppcFdpdGggKHgsIHkpIHsgcmV0dXJuIFt4LCB5XSB9LCBhLCBiKVxufSlcbiIsIi8qKlxuXG4gKiB6aXBXaXRoXG4gKlxuICogIEBmdW5jdGlvbiB6aXBXaXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXBXaXRoIChjYiwgYSwgYikge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIGxldCBpID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChjYihhW2ldLCBiW2ldKSlcbiAgfVxuICByZXR1cm4gYXJyXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5pbXBvcnQgbWFwIGZyb20gJ2Z1bi5qcy9zcmMvbWFwJ1xuaW1wb3J0IGZvbGQgZnJvbSAnZnVuLmpzL3NyYy9mb2xkJ1xuaW1wb3J0IGVxdWFscyBmcm9tICdmdW4uanMvc3JjL2VxdWFscydcbmltcG9ydCBjb25jYXQgZnJvbSAndXRpbC9jb25jYXQnXG5pbXBvcnQgZW1wdHkgZnJvbSAndXRpbC9lbXB0eSdcbmltcG9ydCBkb3QgZnJvbSAndXRpbC9kb3QnXG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAndXRpbC9pZGVudGl0eSdcbmltcG9ydCB0cmFuc3Bvc2UgZnJvbSAndXRpbC90cmFuc3Bvc2UnXG5pbXBvcnQgZ2VuZXJhdGUgZnJvbSAndXRpbC9nZW5lcmF0ZSdcbi8vIGltcG9ydCBncHVtYXAgZnJvbSAndXRpbC9ncHVtYXAnXG4vLyBpbXBvcnQgZ3B1Zm9sZCBmcm9tICd1dGlsL2dwdWZvbGQnXG4vLyBpbXBvcnQgZ3B1cHJvZHVjdCBmcm9tICd1dGlsL2dwdXByb2R1Y3QnXG5cbi8qKlxuICogQGNsYXNzIE1hdHJpeFxuICogQGNsYXNzZGVzYyBNYXRyaXggYXBwbGljYXRpdmUgcHJvdmlkaW5nIHN0YW5kYXJkIG1hdHJpeCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTWF0cml4IGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIG5ldyBrZXl3b3JkLiBJbnN0ZWFkIHVzZSB0aGUgTWF0cml4Lm9mIHN5bnRheCB0byBjcmVhdGUgYSBuZXcgTWF0cml4LiBVbmZvcnR1bmF0bHkganNkb2NzIGRvZXMgbm90IGFsbG93IGZvciB0aGUgY29uc3RydWN0b3IgdG8gYmUgaGlkZGVuLlxuICogQGhpZGVjb250cnVjdG9yXG4gKiBAc2VlIG9mXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5sZXQgTWF0cml4ID0gZnVuY3Rpb24gKHZhbCkge1xuICB0aGlzLl9fdmFsdWUgPSB2YWxcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gb2ZcbiAqIEBkZXNjIENyZWF0ZXMgYSBNYXRyaXggb2JqZWN0IGFuZCBmbGF0dGVucyB0aGUgTWF0cml4XG4gKiBAcGFyYW0gdmFsIHthcnJheXxmdW5jdGlvbn0gQW4gYXJyYXkgb2YgYXJyYXlzXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICpcbiAqL1xuTWF0cml4Lm9mID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgTWF0cml4KSByZXR1cm4gdmFsXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgdGhpcy5fX3ZhbHVlID0gdmFsXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuICByZXR1cm4gbmV3IE1hdHJpeCh2YWwpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnR5cGUgPT09ICdNYXRyaXgnXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHlwZSA9ICdNYXRyaXgnXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByZWNpc2lvblxuICogQHR5cGUge251bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0ucHJlY2lzaW9uID09PSA0XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucHJlY2lzaW9uID0gNFxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzZXRQcmVjaXNpb25cbiAqIEBwYXJhbSBwcmVjaXNpb24ge251bWJlcn0gU2V0IHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgZm9yIHJvdW5kaW5nXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnNldFByZWNpc2lvbigxMClcbiAqIG0ucHJlY2lzaW9uID09PSAxMFxuICovXG5NYXRyaXgucHJvdG90eXBlLnNldFByZWNpc2lvbiA9IGZ1bmN0aW9uIChwcmVjaXNpb24pIHtcbiAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb25cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTeW1tZXRyaWNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3ltbWV0cmljKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTeW1tZXRyaWMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGEgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UodGhpcykuX192YWx1ZVxuICByZXR1cm4gZXF1YWxzKGEsIGIpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3F1YXJlXG4gKiBAZGVzYyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNvbnRhaW5zIGEgc3F1YXJlIE1hdHJpeFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTcXVhcmUoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1NxdWFyZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLmdldENvbHMoKSwgdGhpcy5nZXRSb3dzKCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzT3J0aG9nb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWy0wLjMwOTIsIC0wLjk1MTBdLCBbLTAuOTUxMCwgMC4zMDkyXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXguZnJvbUFycmF5KHJlc3VsdClcbiAqIHRydWUgID09PSBBLmlzT3J0aG9nb25hbCgpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNPcnRob2dvbmFsID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBeEF0ID0gdGhpcy5kb3QodGhpcy50cmFuc3Bvc2UoKSlcbiAgY29uc3QgSSA9IHRoaXMuaWRlbnRpdHkoKVxuICByZXR1cm4gZXF1YWxzKEF4QXQsIEkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldENvbHNcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Q29scygpICA9PT0gMlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRDb2xzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlWzBdLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBlcXVhbHNcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBbWzEsIDFdLCBbMSwgMV1dXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihhKVxuICogdmFyIEIgPSBNYXRyaXgub2YoYSlcbiAqIHRydWUgID09PSBBLmVxdWFscyhCKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5fX3ZhbHVlLCBNLl9fdmFsdWUgfHwgTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Um93c1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRSb3dzKCkgIC8vIDJcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRSb3dzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRTaGFwZVxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFNoYXBlKCkgIC8vIFsyLCAyXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFNoYXBlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW3RoaXMuZ2V0Um93cygpLCB0aGlzLmdldENvbHMoKV1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAoZikodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRoYXQgbWFwcyBvdmVyIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggdXNpbmcgYSBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IE1hdHJpeCBvciBhcnJheSB0byBtYXBcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgubWFwKHg9ID4geC5tYXAoeSA9PiB5KyAxKSwgW1sxLCAxXSwgWzEsIDFdXSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5tYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZm9sZFxuICogQGRlc2NyaXB0aW9uIFJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gRmxhdHRlbiBNYXRyaXhcbiAqIE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKS5mb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2LmNvbmNhdChuZXh0KSlcbiAqIC8vIFsxLCAxLCAxLCAxXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQoZiwgW10pKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdG8gcmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgTWF0cml4IHRvIHJlZHVjZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG5cbiAqIC8vIFN1bSBvZiBhbGwgbWF0cml4IHZhbHVlc1xuICogY29uc3QgcmVkdWNlciA9IChwcmV2LCBuZXh0KSA9PiBOdW1iZXIocHJldikgKyBuZXh0LnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LCAwKVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dXG4gKiBNYXRyaXguZm9sZChyZWR1Y2VyLCBBKVxuICogLy8gNFxuICovXG5NYXRyaXguZm9sZCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZm9sZChmKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIE1hdHJpeC5vZihmKS5hcChNKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufVxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIE1hdHJpeC5hcChmLCBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZikuYXAoTSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBBLmNvbmNhdChCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAoTSwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChmKE0pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gQSB7TWF0cml4fVxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IE1hdHJpeC5jb25jYXQoQSwgQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5jb25jYXQgPSBjdXJyeShmdW5jdGlvbiAoQSwgQiwgZiA9IGNvbmNhdCkge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLm1hcChmKEIpKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChlbXB0eSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYW4gZW1wdHkgTWF0cml4IGZyb20gYW4gZXhpc3RpbmcgTWF0cml4XG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5lbXB0eSA9IGN1cnJ5KGZ1bmN0aW9uIChyb3dzID0gMCwgY29scyA9IDApIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YobSkubWFwKGVtcHR5KVxufSlcblxuLy8gIyMjIyAjIyMjICMjIyMgLy9cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQWlkZW50aXR5ID0gQS5pZGVudGl0eSgpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuKi9cbk1hdHJpeC5wcm90b3R5cGUuaWRlbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKHRoaXMpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5pZGVudGl0eSgzLCAyKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiAqL1xuTWF0cml4LmlkZW50aXR5ID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpIC8vIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHJvd3MpKS5tYXAoeCA9PiBBcnJheS5hcHBseShudWxsLCBBcnJheShjb2xzKSkpXG4gIHJldHVybiBNYXRyaXgub2YoaWRlbnRpdHkpLmFwKG0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29tYmluZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguY29tYmluZSA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuY29uY2F0KE1hdHJpeC5vZihCKSwgY29uY2F0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQ3JlYXRlIG1hdHJpeFxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDJdLCBbMywgNF1dKVxuICpcbiAqIC8vIEdlbmVyYXRlIGlkZW50aXR5IG1hdHJpeFxuICogY29uc3QgSSAgPSBtLmlkZW50aXR5KCkgLy8gW1sxLCAwXSwgWzAsIDFdXVxuICpcbiAqIGlmKG0uZG90KEkpLmVxdWFscyhtKSkge1xuICogICAgY29uc29sZS5sb2coJ0RvdCBwcm9kdWN0IHdpdGggaWRlbnRpdHkgbWF0cml4IHJldHVybnMgdGhlIHNhbWUgbWF0cml4JylcbiAqIH1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBkb3QodGhpcy5wcmVjaXNpb24pKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIDIgbWF0cmljZXNcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBiID0gW1s3LCA4XSwgWzksIDEwXSwgWzExLCAxMl1dXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICpcbiAqIE1hdHJpeC5kb3QoQSwgQikgLy8gW1s1OCwgNjRdLCBbMTM5LCAxNTRdXVxuICpcbiAqL1xuTWF0cml4LmRvdCA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkuZG90KE1hdHJpeC5vZihCKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZmlsbFxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB0aGUgcHJvdmlkZWQgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLmZpbGwoeCA9PiA0MilcbiAqIC8vIFtbNDIsNDIsNDJdLCBbNDIsNDIsNDJdLCBbNDIsNDIsNDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAobWFwKHggPT4gZih4KSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLnplcm9zKClcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS56ZXJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lnplcm9zKDMsIDMpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC56ZXJvcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5vbmVzKClcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5vbmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBvbmVzXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIG9uZXNcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9uZXMoMSwgMSlcbiAqIC8vIFtbMSwxLDFdLCBbMSwxLDFdLCBbMSwxLDFdXVxuICpcbiAqL1xuTWF0cml4Lm9uZXMgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDFdXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiBNYXRoLnJhbmRvbSgpICogMiAtIDEpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVyc1xuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHJhbmRvbSB2YWx1ZXMuIERlZmF1bHQgcmFuZG9tIHZhbHVlcyBhcmUgYmV0d2VlbiAtMSBhbmQgMVxuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSksIHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0b0FycmF5XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBhcnJheSBmcm9tIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fX3ZhbHVlLm1hcChyb3cgPT4gcm93Lm1hcChjb2wgPT4gY29sKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY2xvbmVcbiAqIEBkZXNjIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4LmZyb21BcnJheSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZyb21BcnJheVxuICogQGRlc2MgUmV0dXJucyBhIE1hdHJpeCBmcm9tIGFuIGFycmF5XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKHJvdyA9PiBtYXAoY29sID0+IGNvbCkocm93KSkoYXJyKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdKVxuICogY29uc3QgYiA9IEEudHJhbnNwb3NlKCkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGZvbGQodHJhbnNwb3NlLCBbXSwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBSZXR1cm5zIGEgdHJhbnNwb3NlZCBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9IEEgTWF0cml4IG9yIGEgbWF0cml4IGFycmF5XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gWy0xLCAyXSwgWzMsIDRdLCBbLTgsIDJdXG4gKiBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZShhKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkudHJhbnNwb3NlKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBBZGQgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLmFkZCgxKSAvLyBbWzYsIDVdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuYWRkKEIpIC8vIFtbMTAsIDEwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBhZGQnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgKyBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICsgTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1YnRyYWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfSBTdWJ0cmFjdCBhIE1hdHJpeCBvciBhIG51bWJlclxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuc3VidHJhY3QoMSkgLy8gW1s0LCAyXV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLnN1YnRyYWN0KEIpIC8vIFtbMCwgMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBzdWJ0cmFjdCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgodmFsLCBqZHgpID0+IHZhbCAtIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggLSBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgbXVsdGlwbHlcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgTXV0bGlwbHkgYSBzY2FsYXIgb3IgYSBtdHJhaXggd2l0aCBhIG1hdHJpeC4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtdWx0aXBsaWNhdGlvbiBpcyBub3QgcG9zc2libGUuXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLm11bHRpcGx5KDIpIC8vIFtbMTAsIDhdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIubXVsdGlwbHkoQikgLy8gW1syNSwgMjVdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2Ugc3RhdGljIG1ldGhvZCBcXCdkb3RcXCcgdG8gZG8gbWF0cml4IG11bHRpcGxpY2F0aW9uJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgY3JlYXRlIGhhZGFtYXJkIHByb2R1Y3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKGNvbCwgamR4KSA9PiBjb2wgKiBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4ICogTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGFkZGl0aXZlaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1hdHJpeCBvYnRhaW5lZCBieSBjaGFuZ2luZyB0aGUgc2lnbiBvZiBldmVyeSBtYXRyaXggZWxlbWVudC4gVGhlIGFkZGl0aXZlIGludmVyc2Ugb2YgbWF0cml4IEEgaXMgd3JpdHRlbiDigJNBLlxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsLTVdLCBbLTQsIDRdXSlcbiAqIGNvbnN0IG1pbnVzQSA9IEEuYWRkaXRpdmVpbnZlcnNlKClcbiAqIC8vIFtbLTUsIDVdLCBbNCwgLTRdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZGl0aXZlaW52ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseSgtMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGhhZGFtYXJkXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgbXVsdGlwbHlcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5oYWRhbWFyZCgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmhhZGFtYXJkKEIpIC8vIFtbMjUsIDI1XV1cblxuICovXG5NYXRyaXgucHJvdG90eXBlLmhhZGFtYXJkID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tdWx0aXBseShNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBsdVxuICogQGRlc2MgQ2FsY3VsYXRlcyBMVSBkZWNvbXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeFtdfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBbWzMsIC03LCAtMiwgMl0sIFstMywgNSwgMSwgMF0sIFs2LCAtNCwgMCwgLTVdLCBbLTksIDUsIC01LCAxMl1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiBjb25zdCBsdSA9IEEubHUoKVxuICogLy8gTC5fX3ZhbHVlID0gWyBbIDEsIDAsIDAsIDAgXSwgWyAtMSwgMSwgMCwgMCBdLCBbIDIsIC01LCAxLCAwIF0sIFsgLTMsIDgsIDMsIDEgXSBdXG4gKiAvLyBVLl9fdmFsdWUgPSAgWyBbIDMsIC03LCAtMiwgMiBdLCBbIDAsIC0yLCAtMSwgMiBdLCBbIDAsIDAsIC0xLCAxIF0sIFsgMCwgMCwgMCwgLTEgXSBdXG4gKiBNYXRyaXguZG90KGx1WzBdLCBsdVsxXSkgLy8gcmV0dXJucyBjbG9uZSBvZiBBXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmx1ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgdG9sID0gMWUtNlxuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEwgPSB0aGlzLnplcm9zKClcbiAgY29uc3QgVSA9IHRoaXMuemVyb3MoKVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgaWYgKE1hdGguYWJzKEEuX192YWx1ZVtrXVtrXSkgPCB0b2wpIHRocm93IEVycm9yKCdDYW5ub3QgcHJvY2VlZCB3aXRob3V0IGEgcm93IGV4Y2hhbmdlJylcbiAgICBMLl9fdmFsdWVba11ba10gPSAxXG4gICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbjsgKytpKSB7XG4gICAgICBMLl9fdmFsdWVbaV1ba10gPSBBLl9fdmFsdWVbaV1ba10gLyBBLl9fdmFsdWVba11ba11cbiAgICAgIGZvciAobGV0IGogPSBrICsgMTsgaiA8IG47ICsraikge1xuICAgICAgICBBLl9fdmFsdWVbaV1bal0gPSBBLl9fdmFsdWVbaV1bal0gLSBMLl9fdmFsdWVbaV1ba10gKiBBLl9fdmFsdWVba11bal1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgbCA9IGs7IGwgPCBuOyArK2wpIHtcbiAgICAgIFUuX192YWx1ZVtrXVtsXSA9IEEuX192YWx1ZVtrXVtsXVxuICAgIH1cbiAgfVxuICByZXR1cm4gW0wsIFVdXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJyZWZcbiAqIEByZXR1cm5zIHtNYXRyaXh8YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBBID0gTWF0cml4Lm9mKFtbLTEsIDFdLCBbLTEsIDBdLCBbMCwgLTFdLCBbLTEsIC0yXV0pXG4gKiBBLnJyZWYoKSAvLyAgWyBbIDEsIDAgXSwgWyAtMCwgMSBdLCBbIDAsIDAgXSwgWyAwLCAwIF0gXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJyZWYgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBsZWFkID0gMFxuICBjb25zdCByZXN1bHRNYXRyaXggPSB0aGlzLmNsb25lKClcblxuICBmb3IgKGxldCByID0gMDsgciA8IHRoaXMuZ2V0Um93cygpOyArK3IpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgPD0gbGVhZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgIH1cbiAgICBsZXQgaSA9IHJcbiAgICB3aGlsZSAocmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bbGVhZF0gPT09IDApIHtcbiAgICAgICsraVxuICAgICAgaWYgKHRoaXMuZ2V0Um93cygpID09PSBpKSB7XG4gICAgICAgIGkgPSByXG4gICAgICAgICsrbGVhZFxuICAgICAgICBpZiAodGhpcy5nZXRDb2xzKCkgPT09IGxlYWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0TWF0cml4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG1wID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1cbiAgICByZXN1bHRNYXRyaXguX192YWx1ZVtpXSA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl0gPSB0bXBcblxuICAgIGxldCB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtsZWFkXVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5nZXRDb2xzKCk7ICsraikge1xuICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal0gLz0gdmFsXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdldFJvd3MoKTsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gcikgY29udGludWVcbiAgICAgIHZhbCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bal0gLT0gdmFsICogcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bal1cbiAgICAgIH1cbiAgICB9XG4gICAgbGVhZCsrXG4gIH1cbiAgcmV0dXJuIHJlc3VsdE1hdHJpeFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBzb2x2ZVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gU29sdmUgeEEgPSBiXG4gKiAvLyA1eCArIHkgID0gN1xuICogLy8gM3ggLSA0eSA9IDE4XG4gKiAvLyBTb2x1dGlvbiBmb3IgeCBhbmQgeTpcbiAqIC8vIHggPSAyXG4gKiAvLyB5ID0gLTNcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgMV0sIFszLCAtNF1dKVxuICogY29uc3Qgc29sdmVBID0gQS5zb2x2ZShbNywgMThdKSAvLyBbMiwgLTNdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24gKGIpIHtcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMVSA9IEEubHUoKVxuICBjb25zdCBMID0gTFVbMF1cbiAgY29uc3QgVSA9IExVWzFdXG4gIGNvbnN0IG4gPSB0aGlzLmdldFJvd3MoKVxuICBsZXQgcyA9IDBcbiAgY29uc3QgYyA9IFtdXG4gIGNvbnN0IHggPSBbXVxuXG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKytrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBrOyArK2opIHtcbiAgICAgIHMgPSBzICsgTC5fX3ZhbHVlW2tdW2pdICogY1tqXVxuICAgIH1cbiAgICBjW2tdID0gYltrXSAtIHNcbiAgICBzID0gMFxuICB9XG4gIGZvciAobGV0IGEgPSBuIC0gMTsgYSA+IC0xOyAtLWEpIHtcbiAgICBsZXQgdCA9IDBcbiAgICBmb3IgKGxldCBiID0gYSArIDE7IGIgPCBuOyArK2IpIHtcbiAgICAgIHQgPSB0ICsgVS5fX3ZhbHVlW2FdW2JdICogeFtiXVxuICAgIH1cbiAgICB4W2FdID0gKGNbYV0gLSB0KSAvIFUuX192YWx1ZVthXVthXVxuICB9XG4gIHJldHVybiB4XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBpbnZlcnNlXG4gKiBAaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzIsIDRdXSkuaW52ZXJzZSgpXG4gKiAvLyBbIFsgMiwgLTAuNSBdLCBbIC0xLCAwLjUgXSBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgSSA9IEEuaWRlbnRpdHkoKVxuICBjb25zdCBJbnYgPSBBLmNvbmNhdChJKS5ycmVmKClcblxuICBjb25zdCByZXN1bHQgPSBJbnYuX192YWx1ZS5yZWR1Y2UoKHJlc3VsdCwgeCwgaWR4KSA9PiB7XG4gICAgY29uc3QgaGFsZiA9IHgubGVuZ3RoIC8gMlxuICAgIHJlc3VsdC5wdXNoKHguc2xpY2UoaGFsZiwgeC5sZW5ndGgpKVxuICAgIHJldHVybiByZXN1bHRcbiAgfSwgW10pXG4gIHJldHVybiBNYXRyaXgub2YocmVzdWx0KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgcmFua1xuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5NYXRyaXgucHJvdG90eXBlLnJhbmsgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJyZWYgPSB0aGlzLnJyZWYoKVxuICBsZXQgcmVzdWx0ID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJyZWYuZ2V0Q29scygpOyArK2kpIHtcbiAgICByZXN1bHQgKz0gcnJlZi5fX3ZhbHVlW2ldW2ldXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGltZW5zaW9uXG4gKiBAaW5zdGFuY2VcbiAqIEBzZWUgcmFua1xuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJhbmsoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ1xuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFnKClcbiAqIC8vIFsxLCAxLCAxXVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWcoKVxuICogLy8gWzAsIDAsIDAsIDAsIDBdXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpYWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIHJldHVybiBhY2MuY29uY2F0KHhbaWR4XSlcbiAgfSkoW10pKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ1xuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWcoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIFsyLCA1XVxuICpcbiAqL1xuTWF0cml4LmRpYWcgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWcoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgZGlhZ3Byb2R1Y3RcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5kaWFncHJvZHVjdCgpXG4gKiAvLyAxXG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMFxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFncHJvZHVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaWR4KSA9PiB7XG4gICAgYWNjICo9IHhbaWR4XVxuICAgIHJldHVybiBhY2NcbiAgfSkoMSkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBkaWFncHJvZHVjdFxuICogQGRlc2MgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguZGlhZ3Byb2R1Y3QoW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDEwXG4gKlxuICovXG5NYXRyaXguZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmRpYWdwcm9kdWN0KClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHN1bVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLnN1bSgpXG4gKiAvLyA5XG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuc3VtKClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc3VtID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiB7XG4gICAgYWNjICs9IGZvbGQoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KSgwKSh4KVxuICAgIHJldHVybiBhY2NcbiAgfSkoMCkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBzdW1cbiAqIEBkZXNjIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LnN1bShbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gOVxuICpcbiAqL1xuTWF0cml4LnN1bSA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuc3VtKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGtyb25lY2tlclxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gTSB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKHRoaXMg4oqXIE0pXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmtyb25lY2tlciA9IGZ1bmN0aW9uIChNKSB7XG4gIGNvbnN0IG0gPSB0aGlzLmdldFJvd3MoKVxuICBjb25zdCBuID0gdGhpcy5nZXRDb2xzKClcbiAgY29uc3QgcCA9IE0uZ2V0Um93cygpXG4gIGNvbnN0IHEgPSBNLmdldENvbHMoKVxuXG4gIGNvbnN0IGxlZnQgPSB0aGlzLl9fdmFsdWVcbiAgY29uc3QgcmlnaHQgPSBNLl9fdmFsdWVcblxuICBjb25zdCBmcmFtZSA9IGdlbmVyYXRlKG0gKiBwLCBuICogcSlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG07IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IHA7IGsrKykge1xuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IHE7IGwrKykge1xuICAgICAgICAgIGZyYW1lW3AgKiBpICsga11bcSAqIGogKyBsXSA9IGxlZnRbaV1bal0gKiByaWdodFtrXVtsXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE1hdHJpeC5vZihmcmFtZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24ga3JvbmVja2VyXG4gKiBAZGVzYyBUaGUgS3JvbmVja2VyIHByb2R1Y3QgaXMgYW4gb3BlcmF0aW9uIG9uIHR3byBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZSByZXN1bHRpbmcgaW4gYSBibG9jayBtYXRyaXguXG4gKiBAcGFyYW0gQSB7TWF0cml4fSBUaGUgbGVmdCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEBwYXJhbSBCIHtNYXRyaXh9IFRoZSByaWdodCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAoQSDiipcgQilcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmtyb25lY2tlcihCKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXhcbiIsImltcG9ydCB7IGNvbmNhdCwgY3VycnkgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQHBhcmFtIE0ge01hdHJpeH1cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gKE0sIG0sIGlkeCkge1xuICByZXR1cm4gY29uY2F0KG0sIE0uX192YWx1ZVtpZHhdKVxufSlcbiIsImltcG9ydCB7IGZvbGQsIG1hcCwgY3VycnkgfSBmcm9tICdmdW4uanMnXG5pbXBvcnQgcm91bmQgZnJvbSAnLi9yb3VuZCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAcGFyYW0gQiB7TWF0cml4fVxuICogQHBhcmFtIGEge0FycmF5fVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoZGVjaW1hbHMsIEIsIGEpID0+IG1hcCgoaXRlbSwgaSkgPT4ge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBqKSA9PiB7XG4gICAgYWNjICs9IHJvdW5kKHggKiBCLl9fdmFsdWVbal1baV0sIGRlY2ltYWxzKVxuICAgIHJldHVybiBhY2NcbiAgfSwgMCkoYSlcbn0pKEIuX192YWx1ZVswXSkpXG4iLCJpbXBvcnQgeyBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KG0gPT4gW10pXG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlXG4gKiBAZGVzYyBHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGEgbWF0cml4IGFycmF5LCB2YWx1ZXMgYXJlIHNldCB0byB1bmRlZmluZWRcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge2FueVtdW119XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChyb3dzLCBjb2xzID0gdW5kZWZpbmVkLCB2YWx1ZSA9IDApID0+IHtcbiAgY29uc3QgX2NvbHMgPSBjb2xzIHx8IHJvd3NcbiAgY29uc3QgeSA9IG1hcCh6ID0+IHZhbHVlKShuZXcgQXJyYXkoX2NvbHMpKVxuICByZXR1cm4gbWFwKHogPT4geSkobmV3IEFycmF5KHJvd3MpKVxufVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgQ3JlYXRlcyBhbiBpZGVudGl5IG1hdHJpeCBmcm9tIGFuIGVtcHR5IGFycmF5XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChtLCBpZHgpID0+IG1hcCgocm93cywgamR4KSA9PiAoaWR4ID09PSBqZHgpICogMSkobSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgeyBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFRyYW5zcG9zZXMgYSBhcnJheSBvZiBhcnJheXMgdXNpbmcgdGhlIE1hdHJpeC5tYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHByZXYsIG5leHQpID0+IG1hcCgoaXRlbSwgaSkgPT4gKHByZXZbaV0gfHwgW10pLmNvbmNhdChuZXh0W2ldKSkobmV4dCkpXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/lib/@astuanax/funmatrix.min.js b/lib/@astuanax/funmatrix.min.js index e55e604..90607b2 100644 --- a/lib/@astuanax/funmatrix.min.js +++ b/lib/@astuanax/funmatrix.min.js @@ -1,2 +1,2 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("@astuanax/funmatrix",[],n):"object"==typeof exports?exports["@astuanax/funmatrix"]=n():t["@astuanax/funmatrix"]=n()}("undefined"!=typeof self?self:this,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,e),u.l=!0,u.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var u in t)e.d(r,u,function(n){return t[n]}.bind(null,u));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=24)}([function(t,n,e){"use strict";function r(t){const n=t.length;return 0===n?t:e([]);function e(r){return function(){return function(r,u){const o=r.concat(u);return o.length{e.set(r,t(n,r,u))}),e}),a=Object(r.default)(function(t,n){let e=-1;const r=n.length;let u="";for(;++en.slice(r,r+t),e)}),c=Object(r.default)(function(t,n){return+t+ +n}),i=Object(r.default)(function(t,n,e){let r=0;return t(function(t){return n(t,r++)},e)}),f=Object(r.default)(function(t,n,e){const r=Array.prototype.slice.call(e),u=n<0?r.length+n:n;return e[u]?(r[u]=t(r[u]),r):r}),a=Object(r.default)(function(t,n,e){return Object(u.default)(e=>n(e)?t(e):e,Array.prototype.slice.call(e))}),l=Object(r.default)(function(t,n){let e=!0;for(let r in n)if(!t(n[r])){e=!1;break}return e}),s=Object(r.default)(function(t,n){for(let e=0;et(e)(n(e)):Object(j.a)((t,e)=>t.concat(Object(y.a)(Object(v.a)(e),n)),[],t)}),m=Object(r.default)(function(t,n){return Array.prototype.concat(t,n)});function w(t,n){return String(t)+String(n)}var M=e(2),x=Object(r.default)(function(t,n){return{String:w,Array:m}[Object(M.a)(t)](t,n)}),P=Object(r.default)(function(t,n){return x(n,[t])}),A=Object(r.default)(function(t,n){return t.apply(t,n)}),S=Object(v.a)(function(t){return Object(r.default)(function(n,e){return t(n,e)})}),C=Object(r.default)(function(t,n){return t.bind(n)}),k=e(9),N=Object(r.default)(function(t){const n=Object(v.a)(Object(r.default)(t));return Object(r.default)(function(){return Object(k.default)(g,Object(u.default)(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),R=Object(r.default)(function(t,n){return Object(O.a)("Function")(t)?function(){return t.apply(this,arguments)&&n.apply(this,arguments)}:N(p.a)(t,n)}),D=Object(r.default)(function(t){return t.apply(t,[].slice.call(arguments,1))}),F=e(4);var E=N(F.a);function z(){let t=Array.prototype.slice.call(arguments);return function(){let n=t[t.length-1],e=[n.apply(n,arguments)],r=t.length-2;for(;r>=0;--r){const n=t[r];e=[n.apply(n,e)]}return e[0]}}function T(t){return function(n){for(var e=0;ex(n,t(e)),Object(K.a)(n),n)});function tt(t){let n=1===(e=arguments).length?[e[0]]:Array.apply(null,e);var e;return n.shift(),t.replace(/{(\d+)}/g,(t,e)=>Object(F.a)(Object(O.a)("Undefined",n[e]))?n[e]:t)}var nt=Object(r.default)(function(t,n){return Object.prototype.hasOwnProperty.call(n,t)}),et=Object(r.default)(function(t,n){return t in n}),rt=e(10);function ut(t){return t}var ot=e(15),ct=e(21),it=e(16);function ft(t){return Object(B.a)(t)&&Object(U.default)(t,Object(K.a)(t))}var at=t=>J(new Date)(t)<0,lt=Object(O.a)("Map"),st=e(18),dt=Object(O.a)("null"),pt=e(13),bt=e(11),ht=Object(O.a)("Set"),vt=e(22),Ot=Object(O.a)("undefined");function jt(t){return Object(it.a)(t)&&isFinite(t.valueOf())}let yt=function(t){return this._value=t,this};yt.prototype.isJust=function(){return!0},yt.prototype.isNothing=function(){return!1};var _t=yt,gt=Object(r.default)(function(t){return t.keys()}),mt=Object(r.default)(function(t){switch(Object(M.a)(t)){case"Map":return gt(t);default:return Object(V.a)(t)}}),wt=Object(r.default)(function(t){const n=[];for(const e in t)n.push(e);return n}),Mt=Object(v.a)(function(t){return t&&t.length?t[t.length-1]:void 0}),xt=Object(r.default)(function(t,n){return n>t?n:t});let Pt=function(){};Pt.prototype.isJust=function(){return!1},Pt.prototype.isNothing=function(){return!0};var At=Pt;let St=function(t){this.__value=t};St.of=function(t){return t instanceof St?t:this instanceof St?(this.__value=t,this):new St(t)},St.prototype.getOrElse=function(t){return this.isNothing()?t:this.__value},St.prototype.map=function(t){return this.isNothing()?St.of(null):St.of(t(this.__value))},St.prototype.ap=function(t){return t.map(this.__value)},St.prototype.isNothing=function(){return null==this.__value},St.prototype.isJust=function(){return!this.isNothing()},St.prototype.Nothing=function(){return new At},St.prototype.Just=function(){return new _t(this._value)};var Ct=St,kt=Object(r.default)(function(t,n){return Array.from(new Set(t.concat(n)))});const Nt=Object(r.default)((t,n)=>{let e=Object.assign({},t);if(Object(rt.a)(t,n))return Object.assign({},t);for(let r in n){if(!Object.prototype.hasOwnProperty.call(n,r))continue;const u=n[r],o=t[r];Object(bt.a)(u)&&Object(bt.a)(o)?e[r]=Nt(u,o):Object(ot.a)(o)?e[r]=kt(o,u):e[r]=u}return e});var Rt=Nt,Dt=Object(r.default)(function(t,n){return+t*+n}),Ft=Object(r.default)((t,n)=>{let e={};return Object.keys(t).filter(t=>-1===n.indexOf(t)).forEach(n=>{e[n]=t[n]}),e}),Et=e(20),zt=Object(r.default)(function(t,n){let e,r=n,u=0;for(;ut/864e5,Ut=t=>t/36e5,Bt=t=>t/6e4,Wt=t=>t/1e3;function Ht(t){return!1!==t&&Object(B.a)(t)}var Vt=Object(v.a)(function(t){const n=Object(V.a)(t),e=n.length,r=[];let u=0;for(;u{for(let e in t)if(Object(i.a)(O(t[e],n[e])))return!1;for(let e in n)if(Object(i.a)(Object(u.a)(t[e]))&&Object(u.a)(n[e]))return!1;return!0}),O=n.default=Object(r.default)(function(t,n){return!!Object(o.a)(t,n)||Object(c.a)(t)===Object(c.a)(n)&&(!Object(f.a)(Object(i.a)(Object(u.a)(t)),Object(i.a)(Object(u.a)(n)))&&(t.constructor===n.constructor&&(Object(p.a)(t)||Object(s.a)(t)||Object(d.a)(t)||Object(b.a)(t)?Object(o.a)(t.valueOf(),n.valueOf()):Object(l.a)(t)?h(t,n):!!Object(a.a)(t)&&v(t,n))))})},function(t,n,e){"use strict";e.d(n,"a",function(){return o});var r=e(13),u=e(14);function o(t){return Object(u.a)(Object(r.a)(t),isNaN(t))}},function(t,n,e){"use strict";var r=e(0);n.a=Object(r.default)(function(t,n){let e=-1;const r=n.length,u=new Array(r);for(;++e1&&void 0!==arguments[1]?arguments[1]:i.default;return O.of(this).map(n(t))},O.concat=(0,r.default)(function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.default;return O.of(t).map(e(n))}),O.prototype.empty=function(){return O.of(this).map(f.default)},O.empty=(0,r.default)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=(0,d.default)(t,n);return O.of(e).map(f.default)}),O.prototype.identity=function(){return O.of(l.default).ap(this)},O.identity=function(t,n){var e=(0,d.default)(t,n);return O.of(l.default).ap(e)},O.prototype.combine=function(t){return O.of(this).concat(O.of(t),i.default)},O.combine=function(t,n){return O.of(t).concat(O.of(n),i.default)},O.prototype.dot=function(t){return O.of(this).concat(O.of(t),(0,a.default)(this.precision))},O.dot=function(t,n){return O.of(t).dot(O.of(n))},O.prototype.fill=function(t){return O.of(this).map((0,u.default)(function(n){return t(n)}))},O.prototype.zeros=function(){return O.of(this).fill(function(t){return 0})},O.zeros=function(t,n){var e=(0,d.default)(t,n);return O.of(e).fill(function(t){return 0})},O.prototype.ones=function(){return O.of(this).fill(function(t){return 1})},O.ones=function(t,n){var e=(0,d.default)(t,n);return O.of(e).fill(function(t){return 1})},O.prototype.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1};return O.of(this).fill(t)},O.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1},n=arguments[1],e=arguments[2],r=(0,d.default)(n,e);return O.of(r).fill(t)},O.prototype.toArray=function(){return this.__value.map(function(t){return t.map(function(t){return t})})},O.prototype.clone=function(){return O.fromArray(this.__value)},O.fromArray=function(t){return O.of((0,u.default)(function(t){return(0,u.default)(function(t){return t})(t)})(t))},O.prototype.transpose=function(){return O.of((0,o.default)(s.default,[],this.__value))},O.transpose=function(t){return O.of(t).transpose()},O.prototype.add=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot add");return this.map(function(n,e){return(0,u.default)(function(n,r){return n+t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n+t}))},O.prototype.subtract=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot subtract");return this.map(function(n,e){return(0,u.default)(function(n,r){return n-t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n-t}))},O.prototype.multiply=function(t){if(t instanceof O){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw console.log("Use static method 'dot' to do matrix multiplication"),new Error("Matrices do not match, cannot create hadamard product");return this.map(function(n,e){return(0,u.default)(function(n,r){return n*t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n*t}))},O.prototype.additiveinverse=function(){return O.of(this).multiply(-1)},O.prototype.hadamard=function(t){return O.of(this).multiply(t)},O.prototype.lu=function(){for(var t=this.getRows(),n=this.clone(),e=this.zeros(),r=this.zeros(),u=0;u-1;--l){for(var s=0,d=l+1;d1&&void 0!==arguments[1]?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=n||t,o=(0,r.map)(function(t){return e})(new Array(u));return(0,r.map)(function(t){return o})(new Array(t))},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e){return t.createKernel(n).setOutput([e.length,e[0].length])(e)},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e,r){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};return t.createKernel(n,{constants:Object.assign({},{m:r.length,n:r[0].length},u)}).setOutput(e)(r)},t.exports=n.default},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(t,n,e,r,u){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};return t.createKernel(n,{constants:Object.assign({},{m:u.length,n:r[0].length},o)}).setOutput(e)(r,u)},t.exports=n.default}])}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL19wcml2YXRlL2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbm90LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvYWRkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWRqdXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3RXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbGwuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbFBhc3MuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbnlQYXNzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXBwbHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbGlmdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ib3RoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jYWxsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wbGVtZW50LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvZGlmZkRhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9kaXZpZGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vRi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmlyc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZsYXRNYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9mb3JtYXRTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L3RvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL2lzRnV0dXJlRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udWxsL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zZXQvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc1ZhbGlkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tb25hZHMvSnVzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2xhc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL211bHRpcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ULmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvRGF5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvSG91ci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b01pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9TZWNvbmRzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pc05hbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9kb3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3JvdW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9nZW5lcmF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvZ3B1bWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVmb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9ncHVwcm9kdWN0LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJ0aGlzIiwiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImN1cnJ5IiwiZnVuIiwiYXJnc2xlbiIsImxlbmd0aCIsImNyZWF0ZVJlY3Vyc2VyIiwiYWNjIiwiYXJncyIsIl9hY2MiLCJjb25jYXQiLCJhcHBseSIsInJlY3Vyc2UiLCJBcnJheSIsInNsaWNlIiwiYXJndW1lbnRzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jdXJyeV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fIiwiX3R5cGVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyIsIkN0b3IiLCJ2YWwiLCJfcHJpdmF0ZV9jdXJyeTFfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyIsIngiLCJ0b1N0cmluZyIsImN1cnJ5MSIsImZuIiwiYSIsImV4aXN0cyIsImVtcHR5IiwiY29uc3RydWN0b3IiLCJrZXlzIiwib2JqZWN0X21hcCIsImNiIiwiayIsIm1hcF9tYXAiLCJmb3JFYWNoIiwidiIsIm1hcCIsInNldCIsInN0cmluZ19tYXAiLCJjaGFyQXQiLCJpdGVyYXRvcl9tYXAiLCJjYWxsYmFjayIsIml0ZXJhdG9yIiwibmV4dFZhbHVlIiwibmV4dCIsImRvbmUiLCJwdXNoIiwiaXNGdW5jdGlvbiIsImlzIiwidHlwZSIsImFycmF5X21hcCIsIm9iamVjdF9mb2xkIiwiaW5pdCIsImFycmF5X2ZvbGQiLCJfbnVtYmVyX2lzTmFuX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18iLCJ5IiwiX2lzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18iLCJzcmNfYXBlcnR1cmUiLCJyZXMiLCJzcmNfbWFwIiwiaXRlbSIsImlkeCIsImFkZCIsImIiLCJhZGRJbmRleCIsImYiLCJnIiwiYWRqdXN0Iiwic3JjX2FkanVzdFdpdGgiLCJwcmVkIiwic3JjX2FsbCIsImFsbFBhc3MiLCJjYnMiLCJhbHdheXMiLCJhbnkiLCJhbnlQYXNzIiwic3JjX2FwIiwiZm5zIiwidmFscyIsImFwIiwiZm9sZCIsImFycmF5X2NvbmNhdCIsImNvbmNhdF9jb25jYXQiLCJTdHJpbmciLCJzcmNfY29uY2F0Iiwic3JjX2FwcGVuZCIsImVsIiwibGlzdCIsInNyY19iaW5hcnkiLCJjb250ZXh0Iiwic3JjX2xpZnQiLCJsaWZ0ZWQiLCJzcmNfZm9sZCIsImJvb2xlYW5fYm90aCIsImZuMSIsImZuMiIsImFuZCIsInNyY19jb21wbGVtZW50Iiwibm90IiwiY29tcG9zZSIsInJlc3VsdCIsImNvbmQiLCJjb25kcyIsImRlZmF1bHRUbyIsImRpZmZEYXRlIiwic3RhcnQiLCJlbmQiLCJEYXRlIiwiZ2V0VGltZSIsImRpdmlkZSIsIkYiLCJhcnJheV9maWx0ZXIiLCJvYmplY3RfZmlsdGVyIiwibWFwX2ZpbHRlciIsIk1hcCIsIml0IiwiZW50cmllcyIsInNyY19maWx0ZXIiLCJmaW5kSW5kZXgiLCJmaXJzdCIsInVuZGVmaW5lZCIsImZsYXRNYXBfaXNGdW5jdGlvbiIsInNyY19mbGF0TWFwIiwiZmxhdE1hcCIsImZvcm1hdFN0cmluZyIsInN0ciIsInNoaWZ0IiwicmVwbGFjZSIsIm1hdGNoIiwiaGFzIiwicHJvcCIsIm9iaiIsImhhc0luIiwiaWRlbnRpdHkiLCJpc0VtcHR5IiwiZXF1YWxzIiwiaXNGdXR1cmVEYXRlIiwibWFwX2lzIiwibnVsbF9pcyIsInNldF9pcyIsInVuZGVmaW5lZF9pcyIsImlzVmFsaWQiLCJkYXRlX2lzIiwiaXNGaW5pdGUiLCJ2YWx1ZU9mIiwiSnVzdCIsIl92YWx1ZSIsImlzSnVzdCIsImlzTm90aGluZyIsIm1vbmFkc19KdXN0IiwibWFwX2tleXMiLCJzcmNfa2V5cyIsImtleXNJbiIsImxhc3QiLCJtYXgiLCJOb3RoaW5nIiwibW9uYWRzX05vdGhpbmciLCJNYXliZSIsIl9fdmFsdWUiLCJvZiIsImdldE9yRWxzZSIsIm1vbmFkc19NYXliZSIsInVuaW9uIiwiYUwiLCJhUiIsImZyb20iLCJTZXQiLCJtZXJnZSIsIm9iakwiLCJvYmpSIiwiYXNzaWduIiwiaWRlbnRpY2FsIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIm9iamVjdF9pcyIsImFycmF5X2lzIiwib2JqZWN0X21lcmdlIiwibXVsdGlwbHkiLCJvbWl0IiwibmFtZXMiLCJmaWx0ZXIiLCJpbmRleE9mIiwicGF0aCIsIk51bWJlciIsImlzSW50ZWdlciIsInBpY2siLCJwcm9wcyIsIm51bWJlcl9zdW0iLCJUIiwidG9EYXkiLCJ0b0hvdXIiLCJ0b01pbnV0ZXMiLCJ0b1NlY29uZHMiLCJ0cnV0aHkiLCJvYmplY3RfdmFsdWVzIiwiemlwV2l0aCIsImFyciIsImxlbiIsIk1hdGgiLCJtaW4iLCJzcmNfemlwIiwiYm9vbGVhbl9pcyIsImlzTmFuIiwibnVtYmVyX2lzIiwic3RyaW5nX2lzIiwib3IiLCJhcnJheV9lcXVhbHMiLCJzcmNfZXF1YWxzIiwib2JqZWN0X2VxdWFscyIsImtleVgiLCJrZXlZIiwiX2FuZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fIiwiaXNOYU4iLCJfY3VycnkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX21hcCIsIl9mb2xkIiwiX2VxdWFscyIsIl9jb25jYXQiLCJfZW1wdHkiLCJfZG90IiwiX2lkZW50aXR5IiwiX3RyYW5zcG9zZSIsIl9nZW5lcmF0ZSIsIl9ncHVtYXAiLCJfZ3B1Zm9sZCIsIl9ncHVwcm9kdWN0IiwiTWF0cml4IiwiR1BVSlMiLCJncHVqcyIsInByZWNpc2lvbiIsInNldFByZWNpc2lvbiIsImlzU3ltbWV0cmljIiwidHJhbnNwb3NlIiwiZGVmYXVsdCIsImlzU3F1YXJlIiwiZ2V0Q29scyIsImdldFJvd3MiLCJpc09ydGhvZ29uYWwiLCJBeEF0IiwiZG90IiwiSSIsIk0iLCJnZXRTaGFwZSIsIkEiLCJCIiwicm93cyIsImNvbHMiLCJjb21iaW5lIiwiZmlsbCIsInplcm9zIiwib25lcyIsInJhbmRvbSIsImUiLCJ0b0FycmF5Iiwicm93IiwiY29sIiwiY2xvbmUiLCJmcm9tQXJyYXkiLCJFcnJvciIsImpkeCIsInN1YnRyYWN0IiwiY29uc29sZSIsImxvZyIsImFkZGl0aXZlaW52ZXJzZSIsImhhZGFtYXJkIiwibHUiLCJMIiwiVSIsImFicyIsImoiLCJycmVmIiwibGVhZCIsInJlc3VsdE1hdHJpeCIsInRtcCIsInNvbHZlIiwiTFUiLCJpbnZlcnNlIiwicmVkdWNlIiwiaGFsZiIsInJhbmsiLCJkaW1lbnNpb24iLCJkaWFnIiwiZGlhZ3Byb2R1Y3QiLCJzdW0iLCJwcmV2Iiwia3JvbmVja2VyIiwicSIsImxlZnQiLCJyaWdodCIsImZyYW1lIiwiZ3B1TWFwIiwiZ3B1IiwiZ3B1Rm9sZCIsIm91dHB1dCIsImdwdVByb2R1Y3QiLCJfZnVuIiwiX3JvdW5kIiwiZGVjaW1hbHMiLCJyb3VuZCIsIl9jb2xzIiwieiIsIm1hdHJpeCIsImNyZWF0ZUtlcm5lbCIsInNldE91dHB1dCIsImNvbnN0YW50cyJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBQUEsRUFBQUMsR0FDQSxpQkFBQUMsU0FBQSxpQkFBQUMsT0FDQUEsT0FBQUQsUUFBQUQsSUFDQSxtQkFBQUcsZUFBQUMsSUFDQUQsT0FBQSx5QkFBQUgsR0FDQSxpQkFBQUMsUUFDQUEsUUFBQSx1QkFBQUQsSUFFQUQsRUFBQSx1QkFBQUMsSUFSQSxDQVNDLG9CQUFBSyxVQUFBQyxLQUFBLFdBQ0QsbUJDVEEsSUFBQUMsRUFBQSxHQUdBLFNBQUFDLEVBQUFDLEdBR0EsR0FBQUYsRUFBQUUsR0FDQSxPQUFBRixFQUFB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LEdBQUosR0FDcEUsT0FBT3NSLEVBQ0pXLGFBQWE5TyxFQUFHLENBQUVnUCxVQUFXdFUsT0FBTytMLE9BQU8sR0FBSSxDQUFFck0sRUFBRzBGLEVBQUUzRCxPQUFRVixFQUFHK0IsRUFBRSxHQUFHckIsUUFBVTZTLEtBQ2hGRCxVQUFVVixFQUZORixDQUVjM1EsRUFBR3NDIiwiZmlsZSI6IkBhc3R1YW5heC9mdW5tYXRyaXgubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJAYXN0dWFuYXgvZnVubWF0cml4XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMjQpO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogQGZ1bmN0aW9uIGN1cnJ5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1cnJ5IChmdW4pIHtcbiAgY29uc3QgYXJnc2xlbiA9IGZ1bi5sZW5ndGhcblxuICBpZiAoYXJnc2xlbiA9PT0gMCkge1xuICAgIHJldHVybiBmdW5cbiAgfVxuICByZXR1cm4gY3JlYXRlUmVjdXJzZXIoW10pXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoYWNjLCBhcmdzKSB7XG4gICAgY29uc3QgX2FjYyA9IGFjYy5jb25jYXQoYXJncylcbiAgICByZXR1cm4gX2FjYy5sZW5ndGggPCBhcmdzbGVuXG4gICAgICA/IGNyZWF0ZVJlY3Vyc2VyKF9hY2MpXG4gICAgICA6IGZ1bi5hcHBseSh0aGlzLCBfYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVjdXJzZXIgKGFjYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVjdXJzZShhY2MsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIFZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwcm92aWRlZCBhcmd1bWVudFxuICpcbiAqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaXMgKEN0b3IsIHZhbCkge1xuICByZXR1cm4gdHlwZSh2YWwpID09PSBDdG9yXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdHlwZSAoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpLnNsaWNlKDgsIC0xKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZnVuY3Rpb24gd2l0aCBhcml0eSAxXG4gKiBAZnVuY3Rpb24gY3VycnkxXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIHYxLjAuMlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeTEgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkIChhKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgID8gdGhpc1xuICAgICAgOiBmbihhKVxuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBub3RcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG5vdCAoeCkge1xuICByZXR1cm4gIXhcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBleGlzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhpc3RzICh4KSB7XG4gIHJldHVybiAhKHggPT0gbnVsbClcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbXB0eSAoeCkge1xuICByZXR1cm4gbmV3IHguY29uc3RydWN0b3IoKVxufTtcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QoYSkpXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gb2JqZWN0IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHJldHVybiB7T2JqZWN0fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IGsgPSBrZXlzKGEpXG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGsubGVuZ3RoXG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJba1tpXV0gPSBjYihhW2tbaV1dLCBrW2ldLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBNYXAgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7TWFwfSBhXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi4vZW1wdHknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgY29uc3QgciA9IGVtcHR5KGEpXG4gIGEuZm9yRWFjaCgodiwgaywgbWFwKSA9PiB7XG4gICAgci5zZXQoaywgY2IodiwgaywgbWFwKSlcbiAgfSlcbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhIHN0cmluZyBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSAnJ1xuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgKz0gY2IoYS5jaGFyQXQoaSksIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBJdGVyYXRvciBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4zXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYXRvcn0gYVxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2FsbGJhY2ssIGl0ZXJhdG9yKSB7XG4gIGxldCByID0gW11cbiAgZm9yIChsZXQgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOyBuZXh0VmFsdWUuZG9uZSAhPT0gdHJ1ZTsgbmV4dFZhbHVlID0gaXRlcmF0b3IubmV4dCgpKSB7XG4gICAgci5wdXNoKGNhbGxiYWNrKGl0ZXJhdG9yLnZhbHVlKCkpKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5jb25zdCBpc0Z1bmN0aW9uID0gaXMoJ0Z1bmN0aW9uJylcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJdGVyIChpdGVyKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSlcbn1cbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIGl0ZXJhYmxlIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gd2hpY2ggbWFwcyBvdmVyIGFuIGl0ZXJhYmxlLlxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gYiAtPiBiXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL2FycmF5L21hcCdcbmltcG9ydCBvYmplY3RNYXAgZnJvbSAnLi9vYmplY3QvbWFwJ1xuaW1wb3J0IG1hcE1hcCBmcm9tICcuL21hcC9tYXAnXG5pbXBvcnQgc3RyaW5nTWFwIGZyb20gJy4vc3RyaW5nL21hcCdcbmltcG9ydCBpdGVyYXRvck1hcCBmcm9tICcuL2l0ZXJhdG9yL21hcCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBpc0l0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3IvaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdE1hcChjYiwgYSlcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcE1hcChjYiwgYSlcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlNYXAoY2IsIGEpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0l0ZXJhdG9yKGEpXG4gICAgICAgID8gaXRlcmF0b3JNYXAoY2IsIGEpXG4gICAgICAgIDogYXJyYXlNYXAoY2IsIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgbykge1xuICBjb25zdCBrID0ga2V5cyhvKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBsZXQgciA9IE9iamVjdChpbml0KVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHIgPSBjYihyLCBvW2tbaV1dLCBrW2ldLCBvKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBsaWtlIG9iamVjdCBhbmQgY2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKGEsIGIsIGMsIGEpIOKGkiBhKSDihpIgYSDihpIgW2JdIOKGkiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiByZWNlaXZlcyA0IHZhbHVlczogdGhlIGFjY3VtdWxhdG9yLCB0aGUgaXRlbSwgdGhlIGluZGV4LCBhbmQgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGEgaXMgdGhlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gW2JdIHRoZSBhcnJheSBsaWtlIGl0ZW0gdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcmV0dXJuIHsqfSBhIGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICoqL1xuXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG9iamVjdEZvbGQgZnJvbSAnLi9vYmplY3QvZm9sZCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAnT2JqZWN0Jzogb2JqZWN0Rm9sZCxcbiAgICAnQXJyYXknOiBhcnJheUZvbGRcbiAgfVxuICAvLyBpZiAoYS5uZXh0KSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYSlcbiAgLy8gfVxuICAvLyBpZiAodHlwZShTeW1ib2wpICE9PSAndW5kZWZpbmVkJyAmJiBhW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgLy8gICByZXR1cm4gaXRlcmFibGVGb2xkKGNiLCBpbml0LCBhW1N5bWJvbC5pdGVyYXRvcl0oKSlcbiAgLy8gfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShjYiwgaW5pdCwgYSlcbn0pXG5cbi8vIGZ1bmN0aW9uIGl0ZXJhYmxlRm9sZCAoY2IsIGFjYywgZ2VuKSB7XG4vLyAgIGxldCBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB3aGlsZSAoIXN0ZXAuZG9uZSkge1xuLy8gICAgIGFjYyA9IGNiKGFjYywgc3RlcC52YWx1ZSlcbi8vICAgICBzdGVwID0gZ2VuLm5leHQoKVxuLy8gICB9XG4vLyAgIHJldHVybiBhY2Ncbi8vIH1cbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpY2FsXG4gKiBAZGVzY3JpcHRpb24gY2hlY2tzIGZvciBpZGVudGludGljYWwgaXRlbXNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXNOYW4gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlkZW50aWNhbCAoeCwgeSkge1xuICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyB4ID09PSAxIC8geVxuICB9XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gISEoaXNOYW4oeCkgJiYgaXNOYW4oeSkpXG59KVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnT2JqZWN0JylcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuLyoqXG4gKiBAZnVuY3Rpb24gYXBlcnR1cmVcbiAqIEBwYXJhbSBuXG4gKiBAcGFyYW0gYXJyXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBlcnR1cmUgKG4sIGEpIHtcbiAgaWYgKGEubGVuZ3RoIDwgbikge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IHJlcyA9IEFycmF5KGEubGVuZ3RoIC0gbiArIDEpXG4gIHJldHVybiBtYXAoKGl0ZW0sIGlkeCkgPT4gYS5zbGljZShpZHgsIGlkeCArIG4pLCByZXMpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uIGFkZFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgMiBhcmd1bWVudHNcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgcmV0dXJuICthICsgK2Jcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhZGRJbmRleFxuICogQHN1bW1hcnkgQWRkcyBhIHNwZWNpZmllZCBpbmRleCB0byBpdGVyYXRlIGEgY29sbGVjdGlvblxuICogQGRlc2NyaXB0aW9uIFRoZSBhZGRJbmRleCBmdW5jdGlvbiBpcyBub3RuZWNlc3NhcnkgZm9yIHRoZSBtYXAgZnVuY3Rpb25zIGluIHRoZSBmdW4uanMgbGlicmFyeSBhcyB0aGV5IGJlaGF2ZSB0aGUgc2EsZSBhcyB0aGUgbmF0aXZlIGphdmFzY3JpcHQgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnIEZ1bmN0aW9uIHRvIHdoaWNoIHRvIGFkZCB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7QXJyYXl9IGEgVGhlIGFycmF5IG9uIHdoaWNoIHRvIHdvcmtcbiAqIEBzaW5jZSAxLjAuMlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkSW5kZXggKGYsIGcsIGEpIHtcbiAgbGV0IGkgPSAwXG4gIHJldHVybiBmKFxuICAgIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gZyh2LCBpKyspXG4gICAgfSxcbiAgICBhXG4gIClcbn0pXG4iLCIvKipcbiAqIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGFkanVzdFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+IG51bSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRvIG1vZGlmeSB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gKiBAcGFyYW0ge051bWJlcn0gaSAtIFRoZSBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkgdGhlIGFycmF5LCBhY2NlcHRzIHBvc3RpdGl2ZSBhbmQgbmVnYXRpdmUgaW5kZXhlc1xuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdIC0gQXJyYXkgd2l0aCBkYXRhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0IChmbiwgaSwgYSkge1xuICBjb25zdCByID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSlcbiAgY29uc3QgaWR4ID0gaSA8IDAgPyByLmxlbmd0aCArIGkgOiBpXG4gIGlmICghYVtpZHhdKSByZXR1cm4gclxuICByW2lkeF0gPSBmbihyW2lkeF0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RXaXRoXG4gKiBAZGVzY3JpcHRpb24gTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gYSkgLT4gKChhIC0+IFthXSkgLT4gW2FdIC0+IG51bSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIFRoZSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRoZSBpbmRleGVzIGlmIGZvdW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBbYV1cbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRqdXN0V2l0aCAoZm4sIHByZWQsIGEpIHtcbiAgY29uc3QgX2ZuID0geCA9PiB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJldHVybiBmbih4KVxuICAgIH1cbiAgICByZXR1cm4geFxuICB9XG4gIHJldHVybiBtYXAoX2ZuLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbGxcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbCAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IHRydWVcbiAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgaWYgKCFjYihhW2ldKSkge1xuICAgICAgcmVzID0gZmFsc2VcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICpcbiAqIEBmdW5jdGlvbiBhbGxQYXNzXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBwYXNzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFsbFBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghY2JzW2ldKGEpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gYWx3YXlzXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggdGhlIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbHdheXMgKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHggfVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uIG9mIHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGFueVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoVE9ETylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueSAoY2IsIGEpIHtcbiAgbGV0IHJlcyA9IGZhbHNlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmIChjYihhW2ldKSkge1xuICAgICAgcmVzID0gdHJ1ZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufSlcbiIsIi8qKlxuICogQXBwbGllcyBhIGxpc3Qgb2YgcHJlZGljYXRlcyB0byB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIG9uZSBwYXNzZXNcbiAqXG4gKiBAZnVuY3Rpb24gYW55UGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uKSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0FycmF5fSBwcmVkaWNhdGVzIEFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY29tYmluZWQgcHJlZGljYXRlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW55UGFzcyAoY2JzLCBhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNic1tpXShhKSkgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKlxuICogQGZ1bmN0aW9uIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJldHVybnMgYSBjb21iaW5lZCByZXN1bHQgYXJyYXlcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAcGFyYW0geyhGdW5jdGlvbltdfEZ1bmN0aW9ufEFwcGxpY2F0aXZlKX0gZm5zIC0gQW4gYXJyYXkgb2YgZnVuY3Rpb25zIG9yIGEgZnVuY3Rpb24gb3IgYW4gYXBwbGljYXRpdmVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHMgLSBBbiBhcnJheSBvZiB2YWx1ZXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfSBbYV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBpcyBmcm9tICcuL2lzJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9hcnJheS9mb2xkJ1xuaW1wb3J0IG1hcCBmcm9tICcuL2FycmF5L21hcCdcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwIChmbnMsIHZhbHMpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm5zLmFwKSkge1xuICAgIHJldHVybiBmbnMuYXAodmFscylcbiAgfVxuICBpZiAoaXNGdW5jdGlvbihmbnMpKSB7XG4gICAgcmV0dXJuIHggPT4gZm5zKHgpKHZhbHMoeCkpXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgZikgPT4gYWNjLmNvbmNhdChtYXAoY3VycnkxKGYpLCB2YWxzKSksIFtdLCBmbnMpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGFycmF5Q29uY2F0XG4gKiBAcGFyYW0gYTFcbiAqIEBwYXJhbSBhMlxuICogQHJldHVybnMge1RbXX1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoYSwgYilcbn0pXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gc3RyaW5nQ29uY2F0XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIHJldHVybiBTdHJpbmcoYSkgKyBTdHJpbmcoYilcbn1cbiIsIi8qKlxuICogQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgaXRlbXMgdG9nZXRoZXJcbiAqIEBzaW5jZSB2MS4wLjRcbiAqIEBwYXJhbSB7YX0gYSAtIExlZnQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHBhcmFtIHthfSBiIC0gcmlnaHQgc2lkZSBvZiB0aGUgY29uY2F0ZW5hdGlvblxuICogQHJldHVybiB7YX0gQ29uY2F0ZW5hdGVkIGl0ZW1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlDb25jYXQgZnJvbSAnLi9hcnJheS9jb25jYXQnXG5pbXBvcnQgc3RyaW5nQ29uY2F0IGZyb20gJy4vc3RyaW5nL2NvbmNhdCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ1N0cmluZyc6IHN0cmluZ0NvbmNhdCxcbiAgICAnQXJyYXknOiBhcnJheUNvbmNhdFxuICB9XG4gIHJldHVybiB0eXBlTWFwW3R5cGUoYSldKGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwZW5kXG4gKiBAZGVzY3JpcHRpb24gQXBwZW5kIGFuIGVsbWVudCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7Kn0gZWwgLSBFbGVtZW50IHRvIGFkZCB0byBhIGxpc3RcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgLSBMaXN0IHRvIHdoaWNoIHRvIGFkZCB0aGUgZWxlbWVudFxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGwgPSBbMCwgMV1cbiAqIGFwcGVuZCgnYScsIGwpIC8vIHJldXRuciBbMCwgMSwgJ2EnXVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwZW5kIChlbCwgbGlzdCkge1xuICByZXR1cm4gY29uY2F0KGxpc3QsIFsgZWwgXSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQGRlc2NyaXB0aW9uIFRoZSBhcHBseSgpIG1ldGhvZCBjYWxscyBhIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBwcm92aWRlZCBhcyBhbiBhcnJheSwgYW5kIHRoZSBmdW5jdGlvbiBhcyBjb250ZXh0LlxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gYXJnc1xuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGEgPSBhcHBseShmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykubWFwKHggPT4geCAqIDIpXG4gKiAgIH0pXG4gKiBhKFsxLCAyLCAzXSlcbiAqIC8vIFsyLCA0LCA2XVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXBwbHkgKGZuLCBhcmdzKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgYXJncylcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBiaW5hcnlcbiAqIEBwYXJhbSBjYlxuICogQHJldHVybnMge2Z1bmN0aW9uKCo9LCAqPSk6ICp9XG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGJpbmFyeSAoY2IpIHtcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGNiKGEsIGIpXG4gIH0pXG59KVxuIiwiaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbi8qKlxuICogQGZ1bmN0aW9uIGJpbmRcbiAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0XG4gKiBAcGFyYW0ge2Z1bmN0aW9uIH1mblxuICogQHBhcmFtIHsqfSBjb250ZXh0XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYmluZCAoZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY29udGV4dClcbn0pXG4iLCIvKipcbiAqIFwibGlmdHNcIiBhIGZ1bmN0aW9uIG9mIGFyaXR5ID4gMSBzbyB0aGF0IGl0IG1heSBcIm1hcCBvdmVyXCIgYSBsaXN0LCBGdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBsaWZ0XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+IChbKl0uLi4gLT4gWypdKVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGFwIGZyb20gJy4vYXAnXG5pbXBvcnQgbWFwIGZyb20gJy4vbWFwJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBsaWZ0IChmbikge1xuICBjb25zdCBsaWZ0ZWQgPSBjdXJyeTEoY3VycnkoZm4pKVxuICByZXR1cm4gY3VycnkoZnVuY3Rpb24gX2xpZnQgKCkge1xuICAgIHJldHVybiBmb2xkKGFwLCBtYXAobGlmdGVkLCBhcmd1bWVudHNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICB9KVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYm90aCBwcmVkaWNhdGVzIHJldHVybiB0cnVlXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjEgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuMiBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBsaWZ0IGZyb20gJy4uL2xpZnQnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYm90aCAoZm4xLCBmbjIpIHtcbiAgcmV0dXJuIGlzKCdGdW5jdGlvbicpKGZuMSlcbiAgICA/IGZ1bmN0aW9uIF9ib3RoICgpIHsgcmV0dXJuIGZuMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmIGZuMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH1cbiAgICA6IGxpZnQoYW5kKShmbjEsIGZuMilcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gZm5cbiAqIEByZXR1cm5zIHsqfVxuICovXG4vLyBpbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNhbGwgKGZuKSB7XG4gIHJldHVybiBmbi5hcHBseShmbiwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBsZW1lbnRcbiAqIEBkZXNjcmlwdGlvbiBMaWZ0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgY29tcGxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBub3RcbiAqIEBzZWUgbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBpc05vdEVtcHR5ID0gY29tcGxlbWVudChpc0VtcHR5KVxuICogaXNOb3RFbXB0eShbXSkgLy8gZmFsc2VcbiAqIGlzTm90RW1wdHkoeydhJyA6IDF9KSAvLyB0cnVlXG4gKlxuICogY29tcGxlbWVudChNYXliZS5vZihmYWxzZSkpIC8vIHRydWVcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YodHJ1ZSkpIC8vIGZhbHNlXG4gKi9cbmltcG9ydCBsaWZ0IGZyb20gJy4vbGlmdCdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5cbmNvbnN0IGNvbXBsZW1lbnQgPSBsaWZ0KG5vdClcbmV4cG9ydCBkZWZhdWx0IGNvbXBsZW1lbnRcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbXBvc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigpOiAqfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlICgpIHtcbiAgbGV0IGZucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcblxuICByZXR1cm4gZnVuY3Rpb24gX2NvbXBvc2UgKCkge1xuICAgIGxldCBpbml0ID0gZm5zW2Zucy5sZW5ndGggLSAxXVxuICAgIGxldCByZXN1bHQgPSBbaW5pdC5hcHBseShpbml0LCBhcmd1bWVudHMpXVxuICAgIGxldCBpID0gZm5zLmxlbmd0aCAtIDJcblxuICAgIGZvciAoaTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IGZuID0gZm5zW2ldXG5cbiAgICAgIHJlc3VsdCA9IFtmbi5hcHBseShmbiwgcmVzdWx0KV1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXVxuICB9XG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY29uZFxuICogQHBhcmFtIGNvbmRzXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmQgKGNvbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29uZHNbaV1bMF0odmFsdWUpKSByZXR1cm4gY29uZHNbaV1bMV0odmFsdWUpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBkZWZhdWx0VG9cbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBiIC0+IGEgfCBiXG4gKiBAcGFyYW0ge2F9IGRlZmF1bHQgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge2J9IHZhbCBgdmFsYCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgYGRlZmF1bHRgIHVubGVzcyBgdmFsYCBpcyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLlxuICogQHJldHVybiB7Kn0gVGhlIHNlY29uZCB2YWx1ZSBpZiBpdCBpcyBub3QgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGVmYXVsdFRvIChkLCB2KSB7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB2ID09IG51bGwgfHwgdiAhPT0gdiA/IGQgOiB2XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZGlmZkRhdGVcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBkYXRlcyBpbiBtaWxsaXNlY29uZFxuICogQHBhcmFtIHtEYXRlfSBzdGFydCAtIFN0YXJ0IGRhdGVcbiAqIEBwYXJhbSB7RGF0ZX0gZW5kIC0gRW5kIGRhdGVcbiAqIEByZXR1cm4ge251bWJlcn0gUkV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kc1xuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpZmZEYXRlIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiAobmV3IERhdGUoc3RhcnQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGVuZCkuZ2V0VGltZSgpKVxufSlcbiIsIi8qKlxuICpcbiAqXG4gKiBAZnVuY3Rpb24gZGl2aWRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGl2aXNpb24gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZGl2aWRlIChhLCBiKSB7XG4gIHJldHVybiArYSAvICtiXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIEZcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyhmYWxzZSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFycmF5RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcnJheUZpbHRlciAoZm4sIGEpIHtcbiAgdmFyIHIgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZm4oYVtpXSkpIHIucHVzaChhW2ldKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb2JqZWN0RmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvYmplY3RGaWx0ZXIgKGZuLCBvKSB7XG4gIGxldCByID0ge31cbiAgY29uc3QgayA9IGtleXMobylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKG9ba1tpXV0pKSByW2tbaV1dID0gb1trW2ldXVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwRmlsdGVyXG4gKiBAcHJpdmF0ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXBGaWx0ZXIgKGZuLCBtKSB7XG4gIGxldCByID0gbmV3IE1hcCgpXG5cbiAgbGV0IGl0ID0gbS5lbnRyaWVzKClcbiAgbGV0IHJlc3VsdCA9IGl0Lm5leHQoKVxuXG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBrID0gcmVzdWx0LnZhbHVlWzBdXG4gICAgY29uc3QgdiA9IHJlc3VsdC52YWx1ZVsxXVxuICAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgICByZXN1bHQgPSBpdC5uZXh0KClcbiAgfVxuXG4gIC8vIExpbWl0ZWQgYnJvd3NlciBzdXBwb3J0XG4gIC8vIG0uZm9yRWFjaCgodiwgaykgPT4ge1xuICAvLyAgIGlmIChmbihrLCB2KSkgci5zZXQoaywgdilcbiAgLy8gfSlcblxuICAvLyBiYWJlbCB0cmFuc3BpbGUgaXNzdWVzXG4gIC8vIGZvciAoY29uc3QgW2ssIHZdIG9mIG0uZW50cmllcygpKSB7XG4gIC8vXG4gIC8vIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaWx0ZXJcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdWNudGlvbiB0aGF0IGZpbHRlcnMgT2JqZWN0cywgQXJyYXlzIGFuZCBNYXBzXG4gKlxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL2FycmF5L2ZpbHRlcidcbmltcG9ydCBvYmplY3RGaWx0ZXIgZnJvbSAnLi9vYmplY3QvZmlsdGVyJ1xuaW1wb3J0IG1hcEZpbHRlciBmcm9tICcuL21hcC9maWx0ZXInXG4vLyBUT0RPXG4vLyBpbXBvcnQgc2V0RmlsdGVyIGZyb20gJy4uL3NldC9maWx0ZXInXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbHRlciAoZm4sIGEpIHtcbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgLy8gc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpIHtcbiAgICAvLyBjYXNlICdGdW5jdGlvbic6XG4gICAgLy8gICByZXR1cm4gY3VycnkoZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICByZXR1cm4gY2IuY2FsbCh0aGlzLCBhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpXG4gICAgLy8gICB9KVxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0RmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1N0cmluZyc6XG4gICAgLy8gICByZXR1cm4gc3RyaW5nTWFwKGNiLCBhKVxuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwRmlsdGVyKGZuLCBhKVxuICAgIC8vIGNhc2UgJ1NldCc6XG4gICAgLy8gICByZXR1cm4gc2V0RmlsdGVyKGZuLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIoZm4sIGEpXG4gIH1cbn0pXG4iLCIvKipcbiAqIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRJbmRleFxuICogQGRlc2NyaXB0aW9uIEZpbmQgdGhlIGluZGV4IG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGJvb2xlYW4pIC0+IFthXSAtPiBudW1iZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gQW4gYXJyYXkgbGlrZSBvYmplY3RcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZpbmRJbmRleCAoZm4sIGEpIHtcbiAgbGV0IGkgPSAwXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICBpZiAoZm4oYVtpXSkpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiAtMVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGZpcnN0XG4gKiBAcGFyYW0gW2FdXG4gKiBAcmV0dXJuIGEgfCB1bmRlZmluZWRcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYXJyID0gWzEsIDIsIDRdXG4gKiBmaXJzdChbMSwgMiwgNF0pIC8vIHJldHVybnMgMVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gZmlyc3QgKGEpIHtcbiAgcmV0dXJuIGEgJiYgYS5sZW5ndGggPyBhWzBdIDogdW5kZWZpbmVkXG59KVxuIiwiaW1wb3J0IGZvbGQgZnJvbSAnLi9mb2xkJ1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0J1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcblxuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbi8qKlxuICogQGZ1bmN0aW9uIGZsYXRNYXBcbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZmxhdE1hcCAoZm4sIGEpIHtcbiAgaWYgKGlzRnVuY3Rpb24oYSkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBmbihhKHgpKSh4KVxuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihhLmZsYXRNYXApKSB7XG4gICAgcmV0dXJuIGEuZmxhdE1hcChmbilcbiAgfVxuICByZXR1cm4gZm9sZCgoYWNjLCB4KSA9PiBjb25jYXQoYWNjLCBmbih4KSksIGVtcHR5KGEpLCBhKVxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IHRvQXJyYXkgZnJvbSAnLi4vYXJyYXkvdG8nXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3RyaW5nIChzdHIpIHsgLy8gdXNlIGZ1bmN0aW9uKCksIGFycm93IGZ1bmN0aW9uIGRvZXNuJ3QgYmluZCBhcmd1bWVudHNcbiAgbGV0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcblxuICBhcmdzLnNoaWZ0KClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFxcZCspfS9nLCAobWF0Y2gsIGlkeCkgPT4ge1xuICAgIHJldHVybiBub3QoaXMoJ1VuZGVmaW5lZCcsIGFyZ3NbaWR4XSkpID8gYXJnc1tpZHhdIDogbWF0Y2hcbiAgfSlcbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRvQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gYW4gYXJyYXlcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSB4IC0gT2JqZWN0IHRvIGNvbnZlcnQgdG8gYW4gYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvQXJyYXkoXCJzdHJpbmdcIilcbiAqIC8vIHJlc3VsdCA9IFsncycsJ3QnLCdyJywnaScsJ24nLCdnJ11cbiAqXG4gKiBmdW5jdGlvbiAoKSB7XG4gKiAgY29uc3QgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzKVxuICogIGNvbnNvbGUubG9nKHR5cGVvZiBhcmdzKSAvLyBBcnJheVxuICogfVxuICpcbiAqKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvQXJyYXkgKHgpIHtcbiAgcmV0dXJuIHgubGVuZ3RoID09PSAxID8gW3hbMF1dIDogQXJyYXkuYXBwbHkobnVsbCwgeClcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzIChwcm9wLCBvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHksIGV2ZW4gaWYgaXQgaXMgaW5oZXJpdGVkXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIHtTdHJpbmd9IC0+IHtPYmplY3R9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBoYXNJbiAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBwcm9wIGluIG9ialxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSB2YWx1ZSBzdXBwbGllZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZGVudGl0eSAoeCkge1xuICByZXR1cm4geFxufTtcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZW1wdHlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBlbXB0eSBlcXVpdmFsZW50IG9mIHRoZSBmaXJzdCBhcmd1bWVudFxuICovXG5pbXBvcnQgZW1wdHkgZnJvbSAnLi9lbXB0eSdcbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5pbXBvcnQgZXF1YWxzIGZyb20gJy4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VtcHR5ICh4KSB7XG4gIHJldHVybiBleGlzdHMoeCkgJiYgZXF1YWxzKHgsIGVtcHR5KHgpKVxufTtcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDkvMDMvMjAxNy5cbiAqL1xuaW1wb3J0IGRpZmZEYXRlIGZyb20gJy4vZGlmZkRhdGUnXG5cbmV4cG9ydCBkZWZhdWx0IChkKSA9PiB7XG4gIHJldHVybiBkaWZmRGF0ZShuZXcgRGF0ZSgpKShkKSA8IDBcbn1cbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTWFwJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdudWxsJylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU2V0JylcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDMvMDIvMjAxOVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCd1bmRlZmluZWQnKVxuIiwiLyoqXG4gKlxuICovXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQgKHgpIHtcbiAgLy8gbm9pbnNwZWN0aW9uIEpTQ2hlY2tGdW5jdGlvblNpZ25hdHVyZXNcbiAgcmV0dXJuIGlzRGF0ZSh4KSAmJiBpc0Zpbml0ZSh4LnZhbHVlT2YoKSlcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBKdXN0XG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJucyB7SnVzdH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgSnVzdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fdmFsdWUgPSB2YWxcbiAgcmV0dXJuIHRoaXNcbn1cblxuSnVzdC5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuSnVzdC5wcm90b3R5cGUuaXNOb3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgSnVzdFxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBvd24ga2V5cyBvZiBhbiBNYXAgYXMgYW4gQXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgYSAtPiBbYl1cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICogQHJldHVybiB7QXJyYXl9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGtleXMgKGEpIHtcbiAgcmV0dXJuIGEua2V5cygpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqXG4gKiBAZnVuY3Rpb24ga2V5c1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBpdGVyYXRvclxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBvYmogLT4gWypdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gT2JqIGZyb20gemhpY2ggdG8gdGFrZSB0aGUga2V5c1xuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBvYmplY3RLZXlzIGZyb20gJy4vb2JqZWN0L2tleXMnXG5pbXBvcnQgbWFwS2V5cyBmcm9tICcuL21hcC9rZXlzJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKG9iaikge1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gbWFwS2V5cyhvYmopXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RLZXlzKG9iailcbiAgfVxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhbGwgdGhlIGtleXMgb2YgYW4gb2JqZWN0IGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIGNvbnN0IHIgPSBbXVxuICBmb3IgKGNvbnN0IGsgaW4gYSkge1xuICAgIHIucHVzaChrKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbGFzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVthLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXN0IG9mIHRoZSAyIGFyZ3VtZW50cyBwcm92aWRlZFxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1heCAoYSwgYikge1xuICByZXR1cm4gYiA+IGEgPyBiIDogYVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIE5vdGhpbmdcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbn1cblxuTm90aGluZy5wcm90b3R5cGUuaXNKdXN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cbk5vdGhpbmcucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aGluZ1xuIiwiaW1wb3J0IEp1c3QgZnJvbSAnLi9KdXN0J1xuaW1wb3J0IE5vdGhpbmcgZnJvbSAnLi9Ob3RoaW5nJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBNYXliZVxuICogQHBhcmFtIHZhbFxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmxldCBNYXliZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgdGhpcy5fX3ZhbHVlID0gdmFsXG59XG5cbk1heWJlLm9mID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgTWF5YmUpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXliZSkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXliZSh2YWwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5nZXRPckVsc2UgPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gdGhpcy5pc05vdGhpbmcoKSA/IG4gOiB0aGlzLl9fdmFsdWVcbn1cblxuTWF5YmUucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIGlmICh0aGlzLmlzTm90aGluZygpKSB7XG4gICAgcmV0dXJuIE1heWJlLm9mKG51bGwpXG4gIH1cbiAgcmV0dXJuIE1heWJlLm9mKGYodGhpcy5fX3ZhbHVlKSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmFwID0gZnVuY3Rpb24gKG0pIHtcbiAgcmV0dXJuIG0ubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLl9fdmFsdWUgPT0gbnVsbClcbn1cblxuTWF5YmUucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICF0aGlzLmlzTm90aGluZygpXG59XG5cbk1heWJlLnByb3RvdHlwZS5Ob3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBKdXN0KHRoaXMuX3ZhbHVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXliZVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdW5pb25BcnJheVxuICogQGRlc2NyaXB0aW9uIE1lcmdlcyAyIGFycmF5c1xuICogQHBhcmFtIHtBcnJheX0gYUwgLSBBcnJheSB0byBtZXJnZVxuICogQHBhcmFtIHtBcnJheX0gYVIgLSBBcnJheSB0byBtZXJnZVxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gdW5pb25BcnJheShbMCwxLDJdLCBbMyw0LDVdKVxuICogLy8gcmVzdWx0ID0gWzAuMS4yLjMuNC41XVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB1bmlvbkFycmF5IChhTCwgYVIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhTC5jb25jYXQoYVIpKSlcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi4vaWRlbnRpY2FsJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4uL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4uL2FycmF5L2lzJ1xuaW1wb3J0IHVuaW9uIGZyb20gJy4uL2FycmF5L3VuaW9uJ1xuXG5jb25zdCBtZXJnZSA9IGN1cnJ5KChvYmpMLCBvYmpSKSA9PiB7XG4gIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvYmpMKVxuXG4gIGlmIChpZGVudGljYWwob2JqTCwgb2JqUikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqUikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9ialIsIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IG9sZFZhbHVlID0gb2JqUltrZXldXG4gICAgY29uc3QgbmV3VmFsdWUgPSBvYmpMW2tleV1cblxuICAgIGlmIChpc09iamVjdChvbGRWYWx1ZSkgJiYgaXNPYmplY3QobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHVuaW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBvbGRWYWx1ZSAvLyBUT0RPOiB0aGlzIGlzIGEgcmVmZXJlbmNlLCBzaG91bGQgYmUgY2xvbmVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufSlcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgMiBhcmd1bWVudHNcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtdWx0aXBseSAoYSwgYikge1xuICByZXR1cm4gK2EgKiArYlxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgob2JqLCBuYW1lcykgPT4ge1xuICBsZXQgcmVzdWx0ID0ge31cblxuICBPYmplY3Qua2V5cyhvYmopLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgfSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGF0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBhdGggKHBhdGgsIG9iaikge1xuICBsZXQgdmFsID0gb2JqXG4gIGxldCBpZHggPSAwXG4gIGxldCBwXG4gIHdoaWxlIChpZHggPCBwYXRoLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHAgPSBwYXRoW2lkeF1cbiAgICB2YWwgPSBOdW1iZXIuaXNJbnRlZ2VyKHApXG4gICAgICA/IHAgPCAwID8gdmFsW3ZhbC5sZW5ndGggKyBwXSA6IHZhbFtwXVxuICAgICAgOiB2YWxbcF1cbiAgICBpZHggKz0gMVxuICB9XG4gIHJldHVybiB2YWxcbn0pXG4vLyBsZXQgciA9IG9ialxuLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4vLyAgIGlmIChyID09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbi8vICAgciA9IHJbcGF0aFtpXV1cbi8vIH1cbi8vIHJldHVybiByXG4vLyB9KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcGlja1xuICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBuZXcgYmplY3Qgd2l0aCBvbmx5IHRoZSBwcm9wcyB0aGF0IGFyZSBwcm92aWRlZFxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgLSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gcGljayAocHJvcHMsIG9iaikge1xuICBjb25zdCByID0ge31cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgcHJvcHMubGVuZ3RoKSB7XG4gICAgaWYgKHByb3BzW2ldIGluIG9iaikge1xuICAgICAgcltwcm9wc1tpXV0gPSBvYmpbcHJvcHNbaV1dXG4gICAgfVxuICAgIGkgKz0gMVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcHJvcFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHByb3AgKHAsIG9iaikge1xuICByZXR1cm4gb2JqW3BdXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgaW4gYW4gYXJyYXlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgYWRkIGZyb20gJy4vYWRkJ1xuaW1wb3J0IGZvbGQgZnJvbSAnLi4vZm9sZCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gc3VtIChhKSB7XG4gIHJldHVybiBmb2xkKGFkZCwgMCwgYSlcbn0pXG4iLCIvKipcbiAqIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqXG4gKiBAZnVuY3Rpb24gVFxuICogQGRlc2NyaXB0aW9uIEFsd2F5cyByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCBhIEZhbHNlIGJvb2xlYW5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgYWx3YXlzIGZyb20gJy4uL2Fsd2F5cydcblxuZXhwb3J0IGRlZmF1bHQgYWx3YXlzKHRydWUpXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gODY0MDAwMDAgLy8gMjQqNjAqNjAqMTAwMCA9IDg2NDAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAzNjAwMDAwIC8vIDYwKjYwKjEwMDAgPSAzNjAwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyA2MDAwMCAvLyA2MCoxMDAwID0gNjAwMDBcclxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDEwMDBcclxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdHJ1dGh5XG4gKi9cbmltcG9ydCBleGlzdHMgZnJvbSAnLi9leGlzdHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRydXRoeSAoeCkge1xuICByZXR1cm4gKHggIT09IGZhbHNlKSAmJiBleGlzdHMoeClcbn07XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB2YWx1ZXNcbiAqIEBkZXNjcmlwdGlvbiBSRXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgdGFrZW4gZnJvbSBhbiBvYmplY3RzIG93biBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gLSBvYmogVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIHZhbHVlc1xuICogQHJldHVybiB7YXJyYXl9XG4gKlxuICoqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiB2YWx1ZXMgKG9iaikge1xuICBjb25zdCBrID0ga2V5cyhvYmopXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gW11cbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbCkge1xuICAgIHJbaV0gPSBvYmpba1tpXV1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuXG4gKiB6aXBXaXRoXG4gKlxuICogIEBmdW5jdGlvbiB6aXBXaXRoXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXBXaXRoIChjYiwgYSwgYikge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIGxldCBpID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChjYihhW2ldLCBiW2ldKSlcbiAgfVxuICByZXR1cm4gYXJyXG59KVxuIiwiLyoqXG5cbiAqIHppcFxuICpcbiAqIEBmdW5jdGlvbiB6aXBcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgemlwV2l0aCBmcm9tICcuL3ppcFdpdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHppcCAoYSwgYikge1xuICByZXR1cm4gemlwV2l0aChmdW5jdGlvbiBfemlwV2l0aCAoeCwgeSkgeyByZXR1cm4gW3gsIHldIH0sIGEsIGIpXG59KVxuIiwiLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBfXyB9IGZyb20gJy4vX18nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcGVydHVyZSB9IGZyb20gJy4vYXBlcnR1cmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5U3BlYyB9IGZyb20gJy4vYXBwbHlTcGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVRvIH0gZnJvbSAnLi9hcHBseVRvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc2NlbmQgfSBmcm9tICcuL2FzY2VuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2MgfSBmcm9tICcuL2Fzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhc3NvY1BhdGggfSBmcm9tICcuL2Fzc29jUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xhbXAgfSBmcm9tICcuL2NsYW1wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBhcmF0b3IgfSBmcm9tICcuL2NvbXBhcmF0b3InXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VLIH0gZnJvbSAnLi9jb21wb3NlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVAgfSBmcm9tICcuL2NvbXBvc2VQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlV2l0aCB9IGZyb20gJy4vY29tcG9zZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnN0cnVjdCB9IGZyb20gJy4vY29uc3RydWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3ROIH0gZnJvbSAnLi9jb25zdHJ1Y3ROJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb250YWlucyB9IGZyb20gJy4vY29udGFpbnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbnZlcmdlIH0gZnJvbSAnLi9jb252ZXJnZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY291bnRCeSB9IGZyb20gJy4vY291bnRCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjIH0gZnJvbSAnLi9kZWMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlc2NlbmQgfSBmcm9tICcuL2Rlc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2UgfSBmcm9tICcuL2RpZmZlcmVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZlcmVuY2VXaXRoIH0gZnJvbSAnLi9kaWZmZXJlbmNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZGlzc29jIH0gZnJvbSAnLi9kaXNzb2MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvY1BhdGggfSBmcm9tICcuL2Rpc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3AgfSBmcm9tICcuL2Ryb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0IH0gZnJvbSAnLi9kcm9wTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcExhc3RXaGlsZSB9IGZyb20gJy4vZHJvcExhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHMgfSBmcm9tICcuL2Ryb3BSZXBlYXRzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wUmVwZWF0c1dpdGggfSBmcm9tICcuL2Ryb3BSZXBlYXRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFdoaWxlIH0gZnJvbSAnLi9kcm9wV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVpdGhlciB9IGZyb20gJy4vZWl0aGVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlbmRzV2l0aCB9IGZyb20gJy4vZW5kc1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxQnkgfSBmcm9tICcuL2VxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGVxUHJvcHMgfSBmcm9tICcuL2VxUHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGV2b2x2ZSB9IGZyb20gJy4vZXZvbHZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kIH0gZnJvbSAnLi9maW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdCB9IGZyb20gJy4vZmluZExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRMYXN0SW5kZXggfSBmcm9tICcuL2ZpbmRMYXN0SW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsYXR0ZW4gfSBmcm9tICcuL2ZsYXR0ZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZsaXAgfSBmcm9tICcuL2ZsaXAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2ggfSBmcm9tICcuL2ZvckVhY2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZvckVhY2hPYmpJbmRleGVkIH0gZnJvbSAnLi9mb3JFYWNoT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZnJvbVBhaXJzIH0gZnJvbSAnLi9mcm9tUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwQnkgfSBmcm9tICcuL2dyb3VwQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwV2l0aCB9IGZyb20gJy4vZ3JvdXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndCB9IGZyb20gJy4vZ3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGd0ZSB9IGZyb20gJy4vZ3RlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNQYXRoIH0gZnJvbSAnLi9oYXNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBoZWFkIH0gZnJvbSAnLi9oZWFkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpZkVsc2UgfSBmcm9tICcuL2lmRWxzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5jIH0gZnJvbSAnLi9pbmMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluY2x1ZGVzIH0gZnJvbSAnLi9pbmNsdWRlcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhCeSB9IGZyb20gJy4vaW5kZXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5kZXhPZiB9IGZyb20gJy4vaW5kZXhPZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5pdCB9IGZyb20gJy4vaW5pdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5uZXJKb2luIH0gZnJvbSAnLi9pbm5lckpvaW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluc2VydCB9IGZyb20gJy4vaW5zZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnRBbGwgfSBmcm9tICcuL2luc2VydEFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9pbnRlcnNlY3Rpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc3BlcnNlIH0gZnJvbSAnLi9pbnRlcnNwZXJzZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW50byB9IGZyb20gJy4vaW50bydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52ZXJ0IH0gZnJvbSAnLi9pbnZlcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydE9iaiB9IGZyb20gJy4vaW52ZXJ0T2JqJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZva2VyIH0gZnJvbSAnLi9pbnZva2VyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqb2luIH0gZnJvbSAnLi9qb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBqdXh0IH0gZnJvbSAnLi9qdXh0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0SW5kZXhPZiB9IGZyb20gJy4vbGFzdEluZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbmd0aCB9IGZyb20gJy4vbGVuZ3RoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zIH0gZnJvbSAnLi9sZW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zSW5kZXggfSBmcm9tICcuL2xlbnNJbmRleCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1BhdGggfSBmcm9tICcuL2xlbnNQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5zUHJvcCB9IGZyb20gJy4vbGVuc1Byb3AnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxpZnROIH0gZnJvbSAnLi9saWZ0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHQgfSBmcm9tICcuL2x0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsdGUgfSBmcm9tICcuL2x0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW0gfSBmcm9tICcuL21hcEFjY3VtJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBBY2N1bVJpZ2h0IH0gZnJvbSAnLi9tYXBBY2N1bVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXBPYmpJbmRleGVkIH0gZnJvbSAnLi9tYXBPYmpJbmRleGVkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRjaCB9IGZyb20gJy4vbWF0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hdGhNb2QgfSBmcm9tICcuL21hdGhNb2QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1heEJ5IH0gZnJvbSAnLi9tYXhCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVhbiB9IGZyb20gJy4vbWVhbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVkaWFuIH0gZnJvbSAnLi9tZWRpYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lbW9pemVXaXRoIH0gZnJvbSAnLi9tZW1vaXplV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VBbGwgfSBmcm9tICcuL21lcmdlQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBMZWZ0IH0gZnJvbSAnLi9tZXJnZURlZXBMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBSaWdodCB9IGZyb20gJy4vbWVyZ2VEZWVwUmlnaHQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGggfSBmcm9tICcuL21lcmdlRGVlcFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlRGVlcFdpdGhLZXkgfSBmcm9tICcuL21lcmdlRGVlcFdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlTGVmdCB9IGZyb20gJy4vbWVyZ2VMZWZ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVJpZ2h0IH0gZnJvbSAnLi9tZXJnZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZVdpdGggfSBmcm9tICcuL21lcmdlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZVdpdGhLZXknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1pbiB9IGZyb20gJy4vbWluJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW5CeSB9IGZyb20gJy4vbWluQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1vZHVsbyB9IGZyb20gJy4vbW9kdWxvJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb3ZlIH0gZnJvbSAnLi9tb3ZlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuQXJ5IH0gZnJvbSAnLi9uQXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBuZWdhdGUgfSBmcm9tICcuL25lZ2F0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbm9uZSB9IGZyb20gJy4vbm9uZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbnRoIH0gZnJvbSAnLi9udGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aEFyZyB9IGZyb20gJy4vbnRoQXJnJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvIH0gZnJvbSAnLi9vJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvYmpPZiB9IGZyb20gJy4vb2JqT2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9mIH0gZnJvbSAnLi9vZidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb25jZSB9IGZyb20gJy4vb25jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb3RoZXJ3aXNlIH0gZnJvbSAnLi9vdGhlcndpc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG92ZXIgfSBmcm9tICcuL292ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhaXIgfSBmcm9tICcuL3BhaXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWwgfSBmcm9tICcuL3BhcnRpYWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnRpYWxSaWdodCB9IGZyb20gJy4vcGFydGlhbFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aXRpb24gfSBmcm9tICcuL3BhcnRpdGlvbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aEVxIH0gZnJvbSAnLi9wYXRoRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhPciB9IGZyb20gJy4vcGF0aE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoU2F0aXNmaWVzIH0gZnJvbSAnLi9wYXRoU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQWxsIH0gZnJvbSAnLi9waWNrQWxsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrQnkgfSBmcm9tICcuL3BpY2tCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZSB9IGZyb20gJy4vcGlwZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZUsgfSBmcm9tICcuL3BpcGVLJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlUCB9IGZyb20gJy4vcGlwZVAnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVXaXRoIH0gZnJvbSAnLi9waXBlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGx1Y2sgfSBmcm9tICcuL3BsdWNrJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVwZW5kIH0gZnJvbSAnLi9wcmVwZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9qZWN0IH0gZnJvbSAnLi9wcm9qZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wRXEgfSBmcm9tICcuL3Byb3BFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcElzIH0gZnJvbSAnLi9wcm9wSXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BPciB9IGZyb20gJy4vcHJvcE9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wcyB9IGZyb20gJy4vcHJvcHMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BTYXRpc2ZpZXMgfSBmcm9tICcuL3Byb3BTYXRpc2ZpZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJhbmdlIH0gZnJvbSAnLi9yYW5nZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZUJ5IH0gZnJvbSAnLi9yZWR1Y2VCeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlZCB9IGZyb20gJy4vcmVkdWNlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlUmlnaHQgfSBmcm9tICcuL3JlZHVjZVJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VXaGlsZSB9IGZyb20gJy4vcmVkdWNlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlamVjdCB9IGZyb20gJy4vcmVqZWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmUgfSBmcm9tICcuL3JlbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVwZWF0IH0gZnJvbSAnLi9yZXBlYXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGxhY2UgfSBmcm9tICcuL3JlcGxhY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJldmVyc2UgfSBmcm9tICcuL3JldmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNjYW4gfSBmcm9tICcuL3NjYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc2V0IH0gZnJvbSAnLi9zZXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNsaWNlIH0gZnJvbSAnLi9zbGljZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydCB9IGZyb20gJy4vc29ydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydEJ5IH0gZnJvbSAnLi9zb3J0QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRXaXRoIH0gZnJvbSAnLi9zb3J0V2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXQgfSBmcm9tICcuL3NwbGl0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEF0IH0gZnJvbSAnLi9zcGxpdEF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdEV2ZXJ5IH0gZnJvbSAnLi9zcGxpdEV2ZXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzcGxpdFdoZW4gfSBmcm9tICcuL3NwbGl0V2hlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3RhcnRzV2l0aCB9IGZyb20gJy4vc3RhcnRzV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3VidHJhY3QgfSBmcm9tICcuL3N1YnRyYWN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlIH0gZnJvbSAnLi9zeW1tZXRyaWNEaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhaWwgfSBmcm9tICcuL3RhaWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2UgfSBmcm9tICcuL3Rha2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0IH0gZnJvbSAnLi90YWtlTGFzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZUxhc3RXaGlsZSB9IGZyb20gJy4vdGFrZUxhc3RXaGlsZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGFrZVdoaWxlIH0gZnJvbSAnLi90YWtlV2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRhcCB9IGZyb20gJy4vdGFwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZXN0IH0gZnJvbSAnLi90ZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aGVuIH0gZnJvbSAnLi90aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aHVua2lmeSB9IGZyb20gJy4vdGh1bmtpZnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRpbWVzIH0gZnJvbSAnLi90aW1lcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Mb3dlciB9IGZyb20gJy4vdG9Mb3dlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlycyB9IGZyb20gJy4vdG9QYWlycydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9QYWlyc0luIH0gZnJvbSAnLi90b1BhaXJzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvU3RyaW5nIH0gZnJvbSAnLi90b1N0cmluZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdG9VcHBlciB9IGZyb20gJy4vdG9VcHBlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhbnNkdWNlIH0gZnJvbSAnLi90cmFuc2R1Y2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zcG9zZSB9IGZyb20gJy4vdHJhbnNwb3NlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmF2ZXJzZSB9IGZyb20gJy4vdHJhdmVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyaW0gfSBmcm9tICcuL3RyaW0nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyeUNhdGNoIH0gZnJvbSAnLi90cnlDYXRjaCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcHBseSB9IGZyb20gJy4vdW5hcHBseSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5hcnkgfSBmcm9tICcuL3VuYXJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmN1cnJ5TiB9IGZyb20gJy4vdW5jdXJyeU4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuZm9sZCB9IGZyb20gJy4vdW5mb2xkJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlvbldpdGggfSBmcm9tICcuL3VuaW9uV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gJy4vdW5pcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcUJ5IH0gZnJvbSAnLi91bmlxQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFXaXRoIH0gZnJvbSAnLi91bmlxV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5sZXNzIH0gZnJvbSAnLi91bmxlc3MnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubmVzdCB9IGZyb20gJy4vdW5uZXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bnRpbCB9IGZyb20gJy4vdW50aWwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VXaXRoIH0gZnJvbSAnLi91c2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXNJbiB9IGZyb20gJy4vdmFsdWVzSW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHZpZXcgfSBmcm9tICcuL3ZpZXcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZW4gfSBmcm9tICcuL3doZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlIH0gZnJvbSAnLi93aGVyZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2hlcmVFcSB9IGZyb20gJy4vd2hlcmVFcSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aG91dCB9IGZyb20gJy4vd2l0aG91dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgeHByb2QgfSBmcm9tICcuL3hwcm9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBPYmogfSBmcm9tICcuL3ppcE9iaidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkIH0gZnJvbSAnLi9udW1iZXIvYWRkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRJbmRleCB9IGZyb20gJy4vYWRkSW5kZXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkanVzdCB9IGZyb20gJy4vYWRqdXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3RXaXRoIH0gZnJvbSAnLi9hZGp1c3RXaXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbGwgfSBmcm9tICcuL2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsUGFzcyB9IGZyb20gJy4vYWxsUGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWx3YXlzIH0gZnJvbSAnLi9hbHdheXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuZCB9IGZyb20gJy4vYW5kJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbnkgfSBmcm9tICcuL2FueSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55UGFzcyB9IGZyb20gJy4vYW55UGFzcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXAgfSBmcm9tICcuL2FwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmQgfSBmcm9tICcuL2FwcGVuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHkgfSBmcm9tICcuL2FwcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5hcnkgfSBmcm9tICcuL2JpbmFyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluZCB9IGZyb20gJy4vYmluZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm90aCB9IGZyb20gJy4vYm9vbGVhbi9ib3RoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjYWxsIH0gZnJvbSAnLi9jYWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wbGVtZW50IH0gZnJvbSAnLi9jb21wbGVtZW50J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlIH0gZnJvbSAnLi9jb21wb3NlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25jYXQgfSBmcm9tICcuL2NvbmNhdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uZCB9IGZyb20gJy4vY29uZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3VycnkgfSBmcm9tICcuL2N1cnJ5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWZhdWx0VG8gfSBmcm9tICcuL2RlZmF1bHRUbydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZkRhdGUgfSBmcm9tICcuL2RhdGUvZGlmZkRhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpdmlkZSB9IGZyb20gJy4vbnVtYmVyL2RpdmlkZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW1wdHkgfSBmcm9tICcuL2VtcHR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlcXVhbHMgfSBmcm9tICcuL2VxdWFscydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXhpc3RzIH0gZnJvbSAnLi9leGlzdHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEYgfSBmcm9tICcuL2Jvb2xlYW4vRidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlsdGVyIH0gZnJvbSAnLi9maWx0ZXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbmRJbmRleCB9IGZyb20gJy4vZmluZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXJzdCB9IGZyb20gJy4vZmlyc3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZsYXRNYXAgfSBmcm9tICcuL2ZsYXRNYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvbGQgfSBmcm9tICcuL2ZvbGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvcm1hdFN0cmluZyB9IGZyb20gJy4vc3RyaW5nL2Zvcm1hdFN0cmluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzIH0gZnJvbSAnLi9vYmplY3QvaGFzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXNJbiB9IGZyb20gJy4vb2JqZWN0L2hhc0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGljYWwgfSBmcm9tICcuL2lkZW50aWNhbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpdHkgfSBmcm9tICcuL2lkZW50aXR5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpcyB9IGZyb20gJy4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJyYXkgfSBmcm9tICcuL2FycmF5L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jvb2xlYW4gfSBmcm9tICcuL2Jvb2xlYW4vaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRGF0ZSB9IGZyb20gJy4vZGF0ZS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNGdXR1cmVEYXRlIH0gZnJvbSAnLi9kYXRlL2lzRnV0dXJlRGF0ZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNNYXAgfSBmcm9tICcuL21hcC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOYW4gfSBmcm9tICcuL251bWJlci9pc05hbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdWxsIH0gZnJvbSAnLi9udWxsL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc051bWJlciB9IGZyb20gJy4vbnVtYmVyL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1NldCB9IGZyb20gJy4vc2V0L2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1N0cmluZyB9IGZyb20gJy4vc3RyaW5nL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc1ZhbGlkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKdXN0IH0gZnJvbSAnLi9tb25hZHMvSnVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5cyB9IGZyb20gJy4va2V5cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMga2V5c0luIH0gZnJvbSAnLi9vYmplY3Qva2V5c0luJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXN0IH0gZnJvbSAnLi9sYXN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0IH0gZnJvbSAnLi9saWZ0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXAgfSBmcm9tICcuL21hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4IH0gZnJvbSAnLi9tYXgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE1heWJlIH0gZnJvbSAnLi9tb25hZHMvTWF5YmUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlIH0gZnJvbSAnLi9vYmplY3QvbWVyZ2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG11bHRpcGx5IH0gZnJvbSAnLi9udW1iZXIvbXVsdGlwbHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vdCB9IGZyb20gJy4vbm90J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOb3RoaW5nIH0gZnJvbSAnLi9tb25hZHMvTm90aGluZydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb21pdCB9IGZyb20gJy4vb2JqZWN0L29taXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yIH0gZnJvbSAnLi9vcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aCB9IGZyb20gJy4vb2JqZWN0L3BhdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tICcuL29iamVjdC9waWNrJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wIH0gZnJvbSAnLi9vYmplY3QvcHJvcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3VtIH0gZnJvbSAnLi9udW1iZXIvc3VtJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUIH0gZnJvbSAnLi9ib29sZWFuL1QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvRGF5IH0gZnJvbSAnLi9kYXRlL3RvRGF5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0hvdXIgfSBmcm9tICcuL2RhdGUvdG9Ib3VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b01pbnV0ZXMgfSBmcm9tICcuL2RhdGUvdG9NaW51dGVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlY29uZHMgfSBmcm9tICcuL2RhdGUvdG9TZWNvbmRzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnV0aHkgfSBmcm9tICcuL3RydXRoeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHlwZSB9IGZyb20gJy4vdHlwZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tICcuL2FycmF5L3VuaW9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXMgfSBmcm9tICcuL29iamVjdC92YWx1ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHppcCB9IGZyb20gJy4vemlwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXBXaXRoIH0gZnJvbSAnLi96aXBXaXRoJ1xuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdOdW1iZXInKVxuIiwiLyoqXG4gKiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKlxuICogQGZ1bmN0aW9uIGFuZFxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKHgsIHkpIC0+IGJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCAtIEEgcHJlZGljYXRlXG4gKiBAcGFyYW0geyp9IHkgLSBBIHByZWRpY2F0ZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbmQgKHgsIHkpIHtcbiAgcmV0dXJuIHggJiYgeVxufSlcbiIsIi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXksIGF1dG9jdXJyaWVkIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IE9iamVjdCB0byB2ZXJpZml5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzQXJyYXkoWzEsMSwxXSlcbiAqIC8vIHJlc3VsdCA9IHRydWVcbiAqL1xuXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdBcnJheScpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnRGF0ZScpXG4iLCIvKipcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gZXF1YWxzQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiBmb3IgZGVlcCBjb21wYXJpc29uIG9mIGFycmF5c1xuICogQHBhcmFtIHthfSB4IC0gT2JqZWN0IHRvIGNvbXBhcmUgb2YgdHlwZSBhXG4gKiBAcGFyYW0ge2F9IHkgLSBPYmplY3QgeCB0byBjb21wYXJlIHdpdGggb2JqZWN0IHhcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFsc0FycmF5ICh4LCB5KSB7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm90KGVxdWFscyh4W2ldLCB5W2ldKSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4uL2V4aXN0cydcbmltcG9ydCBub3QgZnJvbSAnLi4vbm90J1xuaW1wb3J0IGVxdWFscyBmcm9tICcuLi9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KCh4LCB5KSA9PiB7XG4gIGZvciAobGV0IGtleVggaW4geCkge1xuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VuZmlsdGVyZWRGb3JJbkxvb3BcbiAgICBpZiAobm90KGVxdWFscyh4W2tleVhdLCB5W2tleVhdKSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQga2V5WSBpbiB5KSB7XG4gICAgaWYgKG5vdChleGlzdHMoeFtrZXlZXSkpICYmIGV4aXN0cyh5W2tleVldKSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuXG4gKiBAZnVuY3Rpb24gZXF1YWxzXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGVxdWFsaXR5IG9mIDIgaXRlbXNcbiAqIEBwYXJhbSB7Kn0geCAtIExlZnQgc2lkZSBvZiB0aGUgZXF1YWxpdHkgY2hlY2tcbiAqIEBwYXJhbSB7Kn0geSAtIFJpZ2h0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBuYW4gPSBOdW1iZXIuTmFOXG4gKiBlcXVhbChuYW4sIG5hbikgLy8gcmV0dXJucyB0cnVlXG4gKlxuICogY29uc3QgYXJyMSA9IFswLCAxLCAyLCAzXVxuICogY29uc3QgYXJyMiA9IFtudWxsLCAxLCAyLCAzXVxuICogZXF1YWxzKGFycjEsIGFycjIpIC8vIHJldHVybnMgZmFsc2VcbiAqXG4gKiBlcXVhbHMobmV3IE9iamVjdCh7J2EnOiAwLCAnYic6IDF9KSwgeydhJzogMCwgJ2InOiAxfSkgLy8gdHJ1ZVxuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGlkZW50aWNhbCBmcm9tICcuL2lkZW50aWNhbCdcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcbmltcG9ydCBub3QgZnJvbSAnLi9ub3QnXG5pbXBvcnQgb3IgZnJvbSAnLi9vcidcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL29iamVjdC9pcydcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vYXJyYXkvaXMnXG5pbXBvcnQgaXNCb29sZWFuIGZyb20gJy4vYm9vbGVhbi9pcydcbmltcG9ydCBpc051bWJlciBmcm9tICcuL251bWJlci9pcydcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL3N0cmluZy9pcydcbmltcG9ydCBpc0RhdGUgZnJvbSAnLi9kYXRlL2lzJ1xuaW1wb3J0IGVxdWFsc0FycmF5IGZyb20gJy4vYXJyYXkvZXF1YWxzJ1xuaW1wb3J0IGVxdWFsc09iamVjdCBmcm9tICcuL29iamVjdC9lcXVhbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGVxdWFscyAoeCwgeSkge1xuICBpZiAoaWRlbnRpY2FsKHgsIHkpKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICh0eXBlKHgpICE9PSB0eXBlKHkpKSByZXR1cm4gZmFsc2VcblxuICBpZiAob3Iobm90KGV4aXN0cyh4KSksIG5vdChleGlzdHMoeSkpKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKHguY29uc3RydWN0b3IgIT09IHkuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZVxuXG4gIGlmIChpc1N0cmluZyh4KSB8fCBpc0Jvb2xlYW4oeCkgfHwgaXNOdW1iZXIoeCkgfHwgaXNEYXRlKHgpKSB7XG4gICAgcmV0dXJuIGlkZW50aWNhbCh4LnZhbHVlT2YoKSwgeS52YWx1ZU9mKCkpXG4gIH1cbiAgaWYgKGlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzQXJyYXkoeCwgeSlcbiAgfSBlbHNlIGlmIChpc09iamVjdCh4KSkge1xuICAgIHJldHVybiBlcXVhbHNPYmplY3QoeCwgeSlcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc05hTlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBudW1iZXIgaXMgTkFOXG5cbiAqL1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMnXG5pbXBvcnQgYW5kIGZyb20gJy4uL2FuZCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOYW4gKHgpIHtcbiAgcmV0dXJuIGFuZChpc051bWJlcih4KSwgaXNOYU4oeCkpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbWFwXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBvdmVyIGFuIGFycmF5IGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBhXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChpZGVudGl0eSwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMCwyLDNdXG4gKiAgY29uc3QgYWRkMiA9IGFkZCgyKVxuICogIGNvbnN0IHJlc3VsdCA9IG1hcChhZGQyLCBbMCwyLDNdKVxuICogIC8vIHJlc3VsdCA9IFsyLDQsNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBjb25zdCByID0gbmV3IEFycmF5KGwpXG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgcltpXSA9IGNiKGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBvclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBvbmUgb3IgdGhlIG90aGVyIGlzIHRydWVcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG9yICh4LCB5KSB7XG4gIHJldHVybiB4IHx8IHlcbn0pXG4iLCIvKipcbiAqIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBpc1xuICogQGRlc2NyaXB0aW9uIEN1cnJpZWQgZnVuY3Rpb24gdGhhdCB2ZXJpZmllcyBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IEl0ZW0gdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICoqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQm9vbGVhbicpXG4iLCIvKipcblxuICovXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGlzKCdTdHJpbmcnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgbWFwcGluZyBvdmVyIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgY2FsbGluZyBhbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtjYkZ1bmN0aW9ufSBjYiAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgaXRlbVxuICogQHBhcmFtIHsqfSBpbml0IC0gSW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gYSAtIEFycmF5IHdpdGggaXRlbXMgdG8gbW9kaWZ5IGJ5IHRoZSBjYiBmdW5jdGlvblxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYWxpYXMgcmVkdWNlXG4gKiBAc2luY2UgMS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gZm9sZChhZGQsIDAsIFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSAzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgY2JGdW5jdGlvblxuICogQHBhcmFtIHsqfSByIC0gQWNjdW11bGF0b3Igd2hpY2ggYWNjdW11bGF0ZXMgdGhlIGNhbGxiYWNrJ3MgcmV0dXJuIHZhbHVlc1xuICogQHBhcmFtIHsqfSBpdGVtIC0gdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIHRoZSBpbmRleSBvZiB0aGUgaXRlbSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBUaGUgaW5pdGlhbCBhcnJheVxuICogQHJldHVybiB7Kn1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmb2xkIChjYiwgaW5pdCwgYSkge1xuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBhLmxlbmd0aFxuICBsZXQgciA9IGluaXRcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2IociwgYVtpXSwgaSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICdmdW4uanMvc3JjL2N1cnJ5J1xuaW1wb3J0IG1hcCBmcm9tICdmdW4uanMvc3JjL21hcCdcbmltcG9ydCBmb2xkIGZyb20gJ2Z1bi5qcy9zcmMvZm9sZCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnZnVuLmpzL3NyYy9lcXVhbHMnXG5pbXBvcnQgY29uY2F0IGZyb20gJ3V0aWwvY29uY2F0J1xuaW1wb3J0IGVtcHR5IGZyb20gJ3V0aWwvZW1wdHknXG5pbXBvcnQgZG90IGZyb20gJ3V0aWwvZG90J1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJ3V0aWwvaWRlbnRpdHknXG5pbXBvcnQgdHJhbnNwb3NlIGZyb20gJ3V0aWwvdHJhbnNwb3NlJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ3V0aWwvZ2VuZXJhdGUnXG5pbXBvcnQgZ3B1bWFwIGZyb20gJ3V0aWwvZ3B1bWFwJ1xuaW1wb3J0IGdwdWZvbGQgZnJvbSAndXRpbC9ncHVmb2xkJ1xuaW1wb3J0IGdwdXByb2R1Y3QgZnJvbSAndXRpbC9ncHVwcm9kdWN0J1xuXG4vKipcbiAqIEBjbGFzcyBNYXRyaXhcbiAqIEBjbGFzc2Rlc2MgTWF0cml4IGFwcGxpY2F0aXZlIHByb3ZpZGluZyBzdGFuZGFyZCBtYXRyaXggb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVGhlIE1hdHJpeCBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBuZXcga2V5d29yZC4gSW5zdGVhZCB1c2UgdGhlIE1hdHJpeC5vZiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IE1hdHJpeC4gVW5mb3J0dW5hdGx5IGpzZG9jcyBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGhpZGRlbi5cbiAqIEBoaWRlY29udHJ1Y3RvclxuICogQHNlZSBvZlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICpcbiAqL1xubGV0IE1hdHJpeCA9IGZ1bmN0aW9uICh2YWwsIEdQVUpTKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxuICBpZiAoR1BVSlMpIHtcbiAgICB0aGlzLmdwdWpzID0gR1BVSlMgfHwgbnVsbFxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG9mXG4gKiBAZGVzYyBDcmVhdGVzIGEgTWF0cml4IG9iamVjdCBhbmQgZmxhdHRlbnMgdGhlIE1hdHJpeFxuICogQHBhcmFtIHZhbCB7YXJyYXl8ZnVuY3Rpb259IEFuIGFycmF5IG9mIGFycmF5c1xuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbk1hdHJpeC5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hdHJpeCkgcmV0dXJuIHZhbFxuICBpZiAodGhpcyBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIHRoaXMuX192YWx1ZSA9IHZhbFxuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgcmV0dXJuIG5ldyBNYXRyaXgodmFsKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS50eXBlID09PSAnTWF0cml4J1xuICovXG5NYXRyaXgucHJvdG90eXBlLnR5cGUgPSAnTWF0cml4J1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcmVjaXNpb25cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKiBtLnByZWNpc2lvbiA9PT0gNFxuICovXG5NYXRyaXgucHJvdG90eXBlLnByZWNpc2lvbiA9IDRcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc2V0UHJlY2lzaW9uXG4gKiBAcGFyYW0gcHJlY2lzaW9uIHtudW1iZXJ9IFNldCB0aGUgbnVtYmVyIG9mIGRlY2ltYWxzIGZvciByb3VuZGluZ1xuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5zZXRQcmVjaXNpb24oMTApXG4gKiBtLnByZWNpc2lvbiA9PT0gMTBcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zZXRQcmVjaXNpb24gPSBmdW5jdGlvbiAocHJlY2lzaW9uKSB7XG4gIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlzU3ltbWV0cmljXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1N5bW1ldHJpYygpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3ltbWV0cmljID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBhID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IGIgPSBNYXRyaXgudHJhbnNwb3NlKHRoaXMpLl9fdmFsdWVcbiAgcmV0dXJuIGVxdWFscyhhLCBiKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1NxdWFyZVxuICogQGRlc2MgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjb250YWlucyBhIHNxdWFyZSBNYXRyaXhcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiB0cnVlID09PSBBLmlzU3F1YXJlKClcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaXNTcXVhcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBlcXVhbHModGhpcy5nZXRDb2xzKCksIHRoaXMuZ2V0Um93cygpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc09ydGhvZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1stMC4zMDkyLCAtMC45NTEwXSwgWy0wLjk1MTAsIDAuMzA5Ml1dXG4gKiBjb25zdCBBID0gTWF0cml4LmZyb21BcnJheShyZXN1bHQpXG4gKiB0cnVlICA9PT0gQS5pc09ydGhvZ29uYWwoKVxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzT3J0aG9nb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgQXhBdCA9IHRoaXMuZG90KHRoaXMudHJhbnNwb3NlKCkpXG4gIGNvbnN0IEkgPSB0aGlzLmlkZW50aXR5KClcbiAgcmV0dXJuIGVxdWFscyhBeEF0LCBJKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRDb2xzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldENvbHMoKSAgPT09IDJcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Q29scyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZVswXS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZXF1YWxzXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gW1sxLCAxXSwgWzEsIDFdXVxuICogdmFyIEEgPSBNYXRyaXgub2YoYSlcbiAqIHZhciBCID0gTWF0cml4Lm9mKGEpXG4gKiB0cnVlICA9PT0gQS5lcXVhbHMoQilcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlIHx8IE0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFJvd3NcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0Um93cygpICAvLyAyXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0U2hhcGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRTaGFwZSgpICAvLyBbMiwgMl1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5nZXRTaGFwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFt0aGlzLmdldFJvd3MoKSwgdGhpcy5nZXRDb2xzKCldXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBtLm1hcCh4ID0+IHgubWFwKHkgPT4geSsgMSkpXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YobWFwKGYpKHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0aGF0IG1hcHMgb3ZlciB0aGUgcm93cyBvZiB0aGUgbWF0cml4IHVzaW5nIGEgbWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gTWF0cml4Lm1hcCh4PSA+IHgubWFwKHkgPT4geSsgMSksIFtbMSwgMV0sIFsxLCAxXV0pXG4gKiAvLyBbWzIsIDJdLCBbMiwgMl1dXG4gKlxuICovXG5NYXRyaXgubWFwID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5tYXAoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZWR1Y2UgdGhlIG1hdHJpeCByb3dzIHVzaW5nIGEgcmVkdWNlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEEgcmVkdWNlL2ZvbGQgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEZsYXR0ZW4gTWF0cml4XG4gKiBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSkuZm9sZCgocHJldiwgbmV4dCkgPT4gcHJldi5jb25jYXQobmV4dCkpXG4gKiAvLyBbMSwgMSwgMSwgMV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKGYsIFtdKSh0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIGZ1bmN0aW9uIHRvIHJlZHVjZSB0aGUgbWF0cml4IHJvd3MgdXNpbmcgYSByZWR1Y2UgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQSByZWR1Y2UvZm9sZCBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIE1hdHJpeCB0byByZWR1Y2VcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuXG4gKiAvLyBTdW0gb2YgYWxsIG1hdHJpeCB2YWx1ZXNcbiAqIGNvbnN0IHJlZHVjZXIgPSAocHJldiwgbmV4dCkgPT4gTnVtYmVyKHByZXYpICsgbmV4dC5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgeCwgMClcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXVxuICogTWF0cml4LmZvbGQocmVkdWNlciwgQSlcbiAqIC8vIDRcbiAqL1xuTWF0cml4LmZvbGQgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLmZvbGQoZilcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIE1hdHJpeCB0byBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZiA9IHggPT4geC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0pXG4gKiBNYXRyaXgub2YoZikuYXAoTSlcbiAqIC8vIFtbNl0sIFsxNV0sIFsyNF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkubWFwKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gYXBcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgTWF0cml4IHRvIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn1cbiAqIEBwYXJhbSBNIHtNYXRyaXh8YXJyYXl9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBmID0geCA9PiB4LnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpXG4gKiBNYXRyaXguYXAoZiwgW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbNywgOCwgOV1dKVxuICogLy8gW1s2XSwgWzE1XSwgWzI0XVxuICovXG5NYXRyaXguYXAgPSBjdXJyeShmdW5jdGlvbiAoZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKGYpLmFwKE0pXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb25jYXRcbiAqIEBkZXNjcmlwdGlvbiBDb25jYXRlbmF0ZXMgMiBNYXRyaWNlcyB1c2luZyBhIGZ1bmN0aW9uIGFzIG9wZXJhdG9yXG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMCwgMSwgMV0sIFsyLCAzLCA0XV1cbiAqIGNvbnN0IGIgPSBbWzIsIDIsIDJdLCBbMywgMywgM11dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKiBjb25zdCBNID0gQS5jb25jYXQoQilcbiAqIC8vIFtbMCwgMSwgMSwgMiwgMiwgMl0sIFsyLCAzLCA0LCAzLCAzLCAzXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKE0sIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZihNKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgTWF0cmljZXMgdXNpbmcgYSBmdW5jdGlvbiBhcyBvcGVyYXRvclxuICogQHBhcmFtIEEge01hdHJpeH1cbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBhID0gW1swLCAxLCAxXSwgWzIsIDMsIDRdXVxuICogY29uc3QgYiA9IFtbMiwgMiwgMl0sIFszLCAzLCAzXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqIGNvbnN0IE0gPSBNYXRyaXguY29uY2F0KEEsIEIpXG4gKiAvLyBbWzAsIDEsIDEsIDIsIDIsIDJdLCBbMiwgMywgNCwgMywgMywgM11dXG4gKlxuICovXG5NYXRyaXguY29uY2F0ID0gY3VycnkoZnVuY3Rpb24gKEEsIEIsIGYgPSBjb25jYXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5tYXAoZihCKSlcbn0pXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5tYXAoZW1wdHkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGFuIGVtcHR5IE1hdHJpeCBmcm9tIGFuIGV4aXN0aW5nIE1hdHJpeFxuICogQHBhcmFtIHJvd3Mge251bWJlcn1cbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXguZW1wdHkgPSBjdXJyeShmdW5jdGlvbiAocm93cyA9IDAsIGNvbHMgPSAwKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLm1hcChlbXB0eSlcbn0pXG5cbi8vICMjIyMgIyMjIyAjIyMjIC8vXG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGlkZW50aXR5XG4gKiBAZGVzYyBSZXR1cm5zIGFuIGlkZW50aXR5IG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMSwgMiwgM10sIFs0LCA1LCA2XV1cbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEFpZGVudGl0eSA9IEEuaWRlbnRpdHkoKVxuICogLy8gW1sxLCAwLCAwXSwgWzAsIDEsIDBdXVxuICpcbiovXG5NYXRyaXgucHJvdG90eXBlLmlkZW50aXR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcCh0aGlzKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBpZGVudGl0eVxuICogQGRlc2MgUmV0dXJucyBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXguaWRlbnRpdHkoMywgMilcbiAqIC8vIFtbMSwgMCwgMF0sIFswLCAxLCAwXV1cbiAqXG4gKi9cbk1hdHJpeC5pZGVudGl0eSA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKSAvLyBBcnJheS5hcHBseShudWxsLCBBcnJheShyb3dzKSkubWFwKHggPT4gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkoY29scykpKVxuICByZXR1cm4gTWF0cml4Lm9mKGlkZW50aXR5KS5hcChtKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjb21iaW5lXG4gKiBAc2VlIE1hdHJpeC5jb25jYXRcbiAqIEBwYXJhbSBNXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucHJvdG90eXBlLmNvbWJpbmUgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmNvbmNhdChNYXRyaXgub2YoTSksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gY29tYmluZVxuICogQHNlZSBNYXRyaXguY29uY2F0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LmNvbWJpbmUgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmNvbmNhdChNYXRyaXgub2YoQiksIGNvbmNhdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIENyZWF0ZSBtYXRyaXhcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAyXSwgWzMsIDRdXSlcbiAqXG4gKiAvLyBHZW5lcmF0ZSBpZGVudGl0eSBtYXRyaXhcbiAqIGNvbnN0IEkgID0gbS5pZGVudGl0eSgpIC8vIFtbMSwgMF0sIFswLCAxXV1cbiAqXG4gKiBpZihtLmRvdChJKS5lcXVhbHMobSkpIHtcbiAqICAgIGNvbnNvbGUubG9nKCdEb3QgcHJvZHVjdCB3aXRoIGlkZW50aXR5IG1hdHJpeCByZXR1cm5zIHRoZSBzYW1lIG1hdHJpeCcpXG4gKiB9XG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRvdCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuY29uY2F0KE1hdHJpeC5vZihNKSwgZG90KHRoaXMucHJlY2lzaW9uKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZG90XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAyIG1hdHJpY2VzXG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXVxuICogY29uc3QgYiA9IFtbNywgOF0sIFs5LCAxMF0sIFsxMSwgMTJdXVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoYSlcbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoYilcbiAqXG4gKiBNYXRyaXguZG90KEEsIEIpIC8vIFtbNTgsIDY0XSwgWzEzOSwgMTU0XV1cbiAqXG4gKi9cbk1hdHJpeC5kb3QgPSBmdW5jdGlvbiAoQSwgQikge1xuICByZXR1cm4gTWF0cml4Lm9mKEEpLmRvdChNYXRyaXgub2YoQikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGZpbGxcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggdGhlIHByb3ZpZGVkIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGZcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS5maWxsKHggPT4gNDIpXG4gKiAvLyBbWzQyLDQyLDQyXSwgWzQyLDQyLDQyXSwgWzQyLDQyLDQyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKG1hcCh4ID0+IGYoeCkpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB6ZXJvc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB6ZXJvc1xuICogQHJldHVybnMge01hdHJpeH1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLDIsM10sIFszLDIsMV0sIFs0LDUsNl1dKS56ZXJvcygpXG4gKiAvLyBbWzAsMCwwXSwgWzAsMCwwXSwgWzAsMCwwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuemVyb3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbCh4ID0+IDApXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHplcm9zXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHplcm9zXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC56ZXJvcygzLCAzKVxuICogLy8gW1swLDAsMF0sIFswLDAsMF0sIFswLDAsMF1dXG4gKlxuICovXG5NYXRyaXguemVyb3MgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKHggPT4gMClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkub25lcygpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUub25lcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5maWxsKHggPT4gMSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gb25lc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCBvbmVzXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vbmVzKDEsIDEpXG4gKiAvLyBbWzEsMSwxXSwgWzEsMSwxXSwgWzEsMSwxXV1cbiAqXG4gKi9cbk1hdHJpeC5vbmVzID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbCh4ID0+IDEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHJhbmRvbVxuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCByYW5kb20gdmFsdWVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxXVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5kb20gPSBmdW5jdGlvbiAoZiA9IGUgPT4gTWF0aC5yYW5kb20oKSAqIDIgLSAxKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbChmKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiByYW5kb21cbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggcmFuZG9tIG51bWJlcnNcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gRnVuY3Rpb24gd2hpY2ggcmV0dXJucyByYW5kb20gdmFsdWVzLiBEZWZhdWx0IHJhbmRvbSB2YWx1ZXMgYXJlIGJldHdlZW4gLTEgYW5kIDFcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9IERlZmluZXMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeFxuICogQHBhcmFtIGNvbHMge251bWJlcn0gRGVmaW5lcyB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgucmFuZG9tID0gZnVuY3Rpb24gKGYgPSBlID0+IChNYXRoLnJhbmRvbSgpICogMiAtIDEpLCByb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoZilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgdG9BcnJheVxuICogQGRlc2MgUmV0dXJucyB0aGUgYXJyYXkgZnJvbSB0aGUgbWF0cml4XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX192YWx1ZS5tYXAocm93ID0+IHJvdy5tYXAoY29sID0+IGNvbCkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGNsb25lXG4gKiBAZGVzYyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5mcm9tQXJyYXkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmcm9tQXJyYXlcbiAqIEBkZXNjIFJldHVybnMgYSBNYXRyaXggZnJvbSBhbiBhcnJheVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5NYXRyaXguZnJvbUFycmF5ID0gZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gTWF0cml4Lm9mKG1hcChyb3cgPT4gbWFwKGNvbCA9PiBjb2wpKHJvdykpKGFycikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFstMSwgMl0sIFszLCA0XSwgWy04LCAyXSlcbiAqIGNvbnN0IGIgPSBBLnRyYW5zcG9zZSgpLnRvQXJyYXkoKVxuICogLy8gcmV0dXJucyBbWy0xLCAzLC04XSwgWzIsIDQsIDJdXVxuICovXG5NYXRyaXgucHJvdG90eXBlLnRyYW5zcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmb2xkKHRyYW5zcG9zZSwgW10sIHRoaXMuX192YWx1ZSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHRyYW5zcG9zZVxuICogQGRlc2MgUmV0dXJucyBhIHRyYW5zcG9zZWQgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBBIE1hdHJpeCBvciBhIG1hdHJpeCBhcnJheVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFstMSwgMl0sIFszLCA0XSwgWy04LCAyXVxuICogY29uc3QgYiA9IE1hdHJpeC50cmFuc3Bvc2UoYSkudG9BcnJheSgpXG4gKiAvLyByZXR1cm5zIFtbLTEsIDMsLThdLCBbMiwgNCwgMl1dXG4gKi9cbk1hdHJpeC50cmFuc3Bvc2UgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnRyYW5zcG9zZSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGFkZFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gQWRkIGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5hZGQoMSkgLy8gW1s2LCA1XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLmFkZChCKSAvLyBbWzEwLCAxMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3QgYWRkJylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsICsgTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCArIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdWJ0cmFjdFxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0gTSB7TWF0cml4fG51bWJlcn0gU3VidHJhY3QgYSBNYXRyaXggb3IgYSBudW1iZXJcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLnN1YnRyYWN0KDEpIC8vIFtbNCwgMl1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5zdWJ0cmFjdChCKSAvLyBbWzAsIDBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIGlmIChNIGluc3RhbmNlb2YgTWF0cml4KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpICE9PSBNLmdldENvbHMoKSB8fCB0aGlzLmdldFJvd3MoKSAhPT0gTS5nZXRSb3dzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0cmljZXMgZG8gbm90IG1hdGNoLCBjYW5ub3Qgc3VidHJhY3QnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXAoKHJvdywgaWR4KSA9PiBtYXAoKHZhbCwgamR4KSA9PiB2YWwgLSBNLl9fdmFsdWVbaWR4XVtqZHhdKShyb3cpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm1hcChtYXAoeCA9PiB4IC0gTSkpXG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIG11bHRpcGx5XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIE11dGxpcGx5IGEgc2NhbGFyIG9yIGEgbXRyYWl4IHdpdGggYSBtYXRyaXguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbXVsdGlwbGljYXRpb24gaXMgbm90IHBvc3NpYmxlLlxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5tdWx0aXBseSgyKSAvLyBbWzEwLCA4XV1cbiAqIGNvbnN0IEIgPSBNYXRyaXgub2YoW1s1LCA1XV0pXG4gKiBCLm11bHRpcGx5KEIpIC8vIFtbMjUsIDI1XV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNlIHN0YXRpYyBtZXRob2QgXFwnZG90XFwnIHRvIGRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGNyZWF0ZSBoYWRhbWFyZCBwcm9kdWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKChjb2wsIGpkeCkgPT4gY29sICogTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAqIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBhZGRpdGl2ZWludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXRyaXggb2J0YWluZWQgYnkgY2hhbmdpbmcgdGhlIHNpZ24gb2YgZXZlcnkgbWF0cml4IGVsZW1lbnQuIFRoZSBhZGRpdGl2ZSBpbnZlcnNlIG9mIG1hdHJpeCBBIGlzIHdyaXR0ZW4g4oCTQS5cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LC01XSwgWy00LCA0XV0pXG4gKiBjb25zdCBtaW51c0EgPSBBLmFkZGl0aXZlaW52ZXJzZSgpXG4gKiAvLyBbWy01LCA1XSwgWzQsIC00XV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGRpdGl2ZWludmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoLTEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBoYWRhbWFyZFxuICogQGluc3RhbmNlXG4gKiBAc2VlIG11bHRpcGx5XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuaGFkYW1hcmQoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5oYWRhbWFyZChCKSAvLyBbWzI1LCAyNV1dXG5cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5oYWRhbWFyZCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubXVsdGlwbHkoTSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgbHVcbiAqIEBkZXNjIENhbGN1bGF0ZXMgTFUgZGVjb21wb3NpdGlvbiBvZiB0aGUgY3VycmVudCBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXhbXX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgcmVzdWx0ID0gW1szLCAtNywgLTIsIDJdLCBbLTMsIDUsIDEsIDBdLCBbNiwgLTQsIDAsIC01XSwgWy05LCA1LCAtNSwgMTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogY29uc3QgbHUgPSBBLmx1KClcbiAqIC8vIEwuX192YWx1ZSA9IFsgWyAxLCAwLCAwLCAwIF0sIFsgLTEsIDEsIDAsIDAgXSwgWyAyLCAtNSwgMSwgMCBdLCBbIC0zLCA4LCAzLCAxIF0gXVxuICogLy8gVS5fX3ZhbHVlID0gIFsgWyAzLCAtNywgLTIsIDIgXSwgWyAwLCAtMiwgLTEsIDIgXSwgWyAwLCAwLCAtMSwgMSBdLCBbIDAsIDAsIDAsIC0xIF0gXVxuICogTWF0cml4LmRvdChsdVswXSwgbHVbMV0pIC8vIHJldHVybnMgY2xvbmUgb2YgQVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5sdSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IHRvbCA9IDFlLTZcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBMID0gdGhpcy56ZXJvcygpXG4gIGNvbnN0IFUgPSB0aGlzLnplcm9zKClcblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGlmIChNYXRoLmFicyhBLl9fdmFsdWVba11ba10pIDwgdG9sKSB0aHJvdyBFcnJvcignQ2Fubm90IHByb2NlZWQgd2l0aG91dCBhIHJvdyBleGNoYW5nZScpXG4gICAgTC5fX3ZhbHVlW2tdW2tdID0gMVxuICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgTC5fX3ZhbHVlW2ldW2tdID0gQS5fX3ZhbHVlW2ldW2tdIC8gQS5fX3ZhbHVlW2tdW2tdXG4gICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyArK2opIHtcbiAgICAgICAgQS5fX3ZhbHVlW2ldW2pdID0gQS5fX3ZhbHVlW2ldW2pdIC0gTC5fX3ZhbHVlW2ldW2tdICogQS5fX3ZhbHVlW2tdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGwgPSBrOyBsIDwgbjsgKytsKSB7XG4gICAgICBVLl9fdmFsdWVba11bbF0gPSBBLl9fdmFsdWVba11bbF1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtMLCBVXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBycmVmXG4gKiBAcmV0dXJucyB7TWF0cml4fGFycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgQSA9IE1hdHJpeC5vZihbWy0xLCAxXSwgWy0xLCAwXSwgWzAsIC0xXSwgWy0xLCAtMl1dKVxuICogQS5ycmVmKCkgLy8gIFsgWyAxLCAwIF0sIFsgLTAsIDEgXSwgWyAwLCAwIF0sIFsgMCwgMCBdIF1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ycmVmID0gZnVuY3Rpb24gKCkge1xuICBsZXQgbGVhZCA9IDBcbiAgY29uc3QgcmVzdWx0TWF0cml4ID0gdGhpcy5jbG9uZSgpXG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLmdldFJvd3MoKTsgKytyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29scygpIDw9IGxlYWQpIHtcbiAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICB9XG4gICAgbGV0IGkgPSByXG4gICAgd2hpbGUgKHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2xlYWRdID09PSAwKSB7XG4gICAgICArK2lcbiAgICAgIGlmICh0aGlzLmdldFJvd3MoKSA9PT0gaSkge1xuICAgICAgICBpID0gclxuICAgICAgICArK2xlYWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29scygpID09PSBsZWFkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdE1hdHJpeFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRtcCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldXG4gICAgcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV0gPSByZXN1bHRNYXRyaXguX192YWx1ZVtyXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdID0gdG1wXG5cbiAgICBsZXQgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1bbGVhZF1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZ2V0Q29scygpOyArK2opIHtcbiAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdIC89IHZhbFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5nZXRSb3dzKCk7ICsraSkge1xuICAgICAgaWYgKGkgPT09IHIpIGNvbnRpbnVlXG4gICAgICB2YWwgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldW2pdIC09IHZhbCAqIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2pdXG4gICAgICB9XG4gICAgfVxuICAgIGxlYWQrK1xuICB9XG4gIHJldHVybiByZXN1bHRNYXRyaXhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgc29sdmVcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIFNvbHZlIHhBID0gYlxuICogLy8gNXggKyB5ICA9IDdcbiAqIC8vIDN4IC0gNHkgPSAxOFxuICogLy8gU29sdXRpb24gZm9yIHggYW5kIHk6XG4gKiAvLyB4ID0gMlxuICogLy8geSA9IC0zXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDFdLCBbMywgLTRdXSlcbiAqIGNvbnN0IHNvbHZlQSA9IEEuc29sdmUoWzcsIDE4XSkgLy8gWzIsIC0zXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uIChiKSB7XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTFUgPSBBLmx1KClcbiAgY29uc3QgTCA9IExVWzBdXG4gIGNvbnN0IFUgPSBMVVsxXVxuICBjb25zdCBuID0gdGhpcy5nZXRSb3dzKClcbiAgbGV0IHMgPSAwXG4gIGNvbnN0IGMgPSBbXVxuICBjb25zdCB4ID0gW11cblxuICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgazsgKytqKSB7XG4gICAgICBzID0gcyArIEwuX192YWx1ZVtrXVtqXSAqIGNbal1cbiAgICB9XG4gICAgY1trXSA9IGJba10gLSBzXG4gICAgcyA9IDBcbiAgfVxuICBmb3IgKGxldCBhID0gbiAtIDE7IGEgPiAtMTsgLS1hKSB7XG4gICAgbGV0IHQgPSAwXG4gICAgZm9yIChsZXQgYiA9IGEgKyAxOyBiIDwgbjsgKytiKSB7XG4gICAgICB0ID0gdCArIFUuX192YWx1ZVthXVtiXSAqIHhbYl1cbiAgICB9XG4gICAgeFthXSA9IChjW2FdIC0gdCkgLyBVLl9fdmFsdWVbYV1bYV1cbiAgfVxuICByZXR1cm4geFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaW52ZXJzZVxuICogQGluc3RhbmNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsyLCA0XV0pLmludmVyc2UoKVxuICogLy8gWyBbIDIsIC0wLjUgXSwgWyAtMSwgMC41IF0gXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IEkgPSBBLmlkZW50aXR5KClcbiAgY29uc3QgSW52ID0gQS5jb25jYXQoSSkucnJlZigpXG5cbiAgY29uc3QgcmVzdWx0ID0gSW52Ll9fdmFsdWUucmVkdWNlKChyZXN1bHQsIHgsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhbGYgPSB4Lmxlbmd0aCAvIDJcbiAgICByZXN1bHQucHVzaCh4LnNsaWNlKGhhbGYsIHgubGVuZ3RoKSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtdKVxuICByZXR1cm4gTWF0cml4Lm9mKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIHJhbmtcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5yYW5rID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBycmVmID0gdGhpcy5ycmVmKClcbiAgbGV0IHJlc3VsdCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBycmVmLmdldENvbHMoKTsgKytpKSB7XG4gICAgcmVzdWx0ICs9IHJyZWYuX192YWx1ZVtpXVtpXVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpbWVuc2lvblxuICogQGluc3RhbmNlXG4gKiBAc2VlIHJhbmtcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yYW5rKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZygpXG4gKiAvLyBbMSwgMSwgMV1cbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFnKClcbiAqIC8vIFswLCAwLCAwLCAwLCAwXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kaWFnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdCh4W2lkeF0pXG4gIH0pKFtdKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFnKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyBbMiwgNV1cbiAqXG4gKi9cbk1hdHJpeC5kaWFnID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFnKClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGRpYWdwcm9kdWN0XG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuZGlhZ3Byb2R1Y3QoKVxuICogLy8gMVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDBcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZ3Byb2R1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGlkeCkgPT4ge1xuICAgIGFjYyAqPSB4W2lkeF1cbiAgICByZXR1cm4gYWNjXG4gIH0pKDEpKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gZGlhZ3Byb2R1Y3RcbiAqIEBkZXNjIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4LmRpYWdwcm9kdWN0KFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyAxMFxuICpcbiAqL1xuTWF0cml4LmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5kaWFncHJvZHVjdCgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBzdW1cbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXgub25lcygzLCAzKS5zdW0oKVxuICogLy8gOVxuICpcbiAqIGNvbnN0IGRpYWcwID0gTWF0cml4Lnplcm9zKDUsIDUpLnN1bSgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnN1bSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4ge1xuICAgIGFjYyArPSBmb2xkKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCkoMCkoeClcbiAgICByZXR1cm4gYWNjXG4gIH0pKDApKHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gc3VtXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgTWF0cml4XG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5zdW0oW1syLCAxXSwgWzEsIDVdXSlcbiAqIC8vIDlcbiAqXG4gKi9cbk1hdHJpeC5zdW0gPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLnN1bSgpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBrcm9uZWNrZXJcbiAqIEBpbnN0YW5jZVxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIE0ge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0ICh0aGlzIOKKlyBNKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXIgPSBmdW5jdGlvbiAoTSkge1xuICBjb25zdCBtID0gdGhpcy5nZXRSb3dzKClcbiAgY29uc3QgbiA9IHRoaXMuZ2V0Q29scygpXG4gIGNvbnN0IHAgPSBNLmdldFJvd3MoKVxuICBjb25zdCBxID0gTS5nZXRDb2xzKClcblxuICBjb25zdCBsZWZ0ID0gdGhpcy5fX3ZhbHVlXG4gIGNvbnN0IHJpZ2h0ID0gTS5fX3ZhbHVlXG5cbiAgY29uc3QgZnJhbWUgPSBnZW5lcmF0ZShtICogcCwgbiAqIHEpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBwOyBrKyspIHtcbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBxOyBsKyspIHtcbiAgICAgICAgICBmcmFtZVtwICogaSArIGtdW3EgKiBqICsgbF0gPSBsZWZ0W2ldW2pdICogcmlnaHRba11bbF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBNYXRyaXgub2YoZnJhbWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGtyb25lY2tlclxuICogQGRlc2MgVGhlIEtyb25lY2tlciBwcm9kdWN0IGlzIGFuIG9wZXJhdGlvbiBvbiB0d28gbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUgcmVzdWx0aW5nIGluIGEgYmxvY2sgbWF0cml4LlxuICogQHBhcmFtIEEge01hdHJpeH0gVGhlIGxlZnQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcGFyYW0gQiB7TWF0cml4fSBUaGUgcmlnaHQgc2lkZSBNYXRyaXggb2YgdGhlIHByb2R1Y3QgKEEg4oqXIEIpXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICovXG5NYXRyaXgua3JvbmVja2VyID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5rcm9uZWNrZXIoQilcbn1cblxuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuLy8gR1BVIEZ1bmN0aW9uc1xuLy8qICoqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzIsIDJdLCBbMiwgMl1dLCBHUFVKUylcbiAqIG0uZ3B1TWFwKGdwdU1hcHBlcilcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVNYXAgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKGdwdW1hcCh0aGlzLmdwdWpzLCBmLCB0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBncHVNYXBcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdGhhdCBtYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvbiB1c2luZyB0aGUgR1BVXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEFuIEdQVS5qcyBlbmFibGVkIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fSBNYXRyaXggb3IgYXJyYXkgdG8gbWFwXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncHVNYXBwZXIgKGEpIHsgcmV0dXJuIGFbdGhpcy50aHJlYWQueV1bdGhpcy50aHJlYWQueF0gfVxuICogY29uc3QgbSA9IE1hdHJpeC5ncHVNYXAoR1BVSlMsIGdwdU1hcHBlciwgW1syLCAyXSwgWzIsIDJdXSlcbiAqIC8vIFtGbG9hdDMyQXJyYXkoMiwyKSwgRmxvYXQzMkFycmF5KDIsMildXG4gKlxuICovXG5NYXRyaXguZ3B1TWFwID0gY3VycnkoZnVuY3Rpb24gKGdwdSwgZiwgTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0sIGdwdSkuZ3B1TWFwKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBncHVGb2xkXG4gKiBAZGVzY3JpcHRpb24gRm9sZHMgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIEdQVVMuanMgZW5xYmxlZCByZWR1Y2UgZnVuY3Rpb24sIHVzaW5nIHRoZSBHUFVcbiAqIEBwYXJhbSBmIHtmdW5jdGlvbn0gQW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIG0ubWFwKHggPT4geC5tYXAoeSA9PiB5KyAxKSlcbiAqIC8vIFtbMiwgMl0sIFsyLCAyXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ3B1Rm9sZCA9IGZ1bmN0aW9uIChmLCBvdXRwdXQpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihncHVmb2xkKHRoaXMuZ3B1anMsIGYsIG91dHB1dCwgdGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gTWF0cml4I2dwdVByb2R1Y3RcbiAqIEBwYXJhbSBmXG4gKiBAcGFyYW0gb3V0cHV0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5ncHVQcm9kdWN0ID0gZnVuY3Rpb24gKGYsIG91dHB1dCwgTSkge1xuICAvLyAoZ3B1LCBmLCBvdXRwdXQsIGEsIGIsIGNvbnN0YW50cyA9IHt9XG4gIHJldHVybiBNYXRyaXgub2YoZ3B1cHJvZHVjdCh0aGlzLmdwdWpzLCBmLCBvdXRwdXQsIHRoaXMuX192YWx1ZSwgTS5fX3ZhbHVlKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF0cml4XG4iLCJpbXBvcnQgeyBjb25jYXQsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjb25jYXRcbiAqIEBwYXJhbSBNIHtNYXRyaXh9XG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIChNLCBtLCBpZHgpIHtcbiAgcmV0dXJuIGNvbmNhdChtLCBNLl9fdmFsdWVbaWR4XSlcbn0pXG4iLCJpbXBvcnQgeyBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KG0gPT4gW10pXG4iLCJpbXBvcnQgeyBmb2xkLCBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuaW1wb3J0IHJvdW5kIGZyb20gJy4vcm91bmQnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGRvdFxuICogQHBhcmFtIEIge01hdHJpeH1cbiAqIEBwYXJhbSBhIHtBcnJheX1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKGRlY2ltYWxzLCBCLCBhKSA9PiBtYXAoKGl0ZW0sIGkpID0+IHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaikgPT4ge1xuICAgIGFjYyArPSByb3VuZCh4ICogQi5fX3ZhbHVlW2pdW2ldLCBkZWNpbWFscylcbiAgICByZXR1cm4gYWNjXG4gIH0sIDApKGEpXG59KShCLl9fdmFsdWVbMF0pKVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gcm91bmRcbiAqIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfVxuICogQHBhcmFtIGRlY2ltYWxzIHtudW1iZXJ9XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByb3VuZCAodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscylcbn1cbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIENyZWF0ZXMgYW4gaWRlbnRpeSBtYXRyaXggZnJvbSBhbiBlbXB0eSBhcnJheVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybiB7TWF0cml4fVxuICovXG5leHBvcnQgZGVmYXVsdCAobSwgaWR4KSA9PiBtYXAoKHJvd3MsIGpkeCkgPT4gKGlkeCA9PT0gamR4KSAqIDEpKG0pXG4iLCJpbXBvcnQgeyBtYXAsIGN1cnJ5IH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFRyYW5zcG9zZXMgYSBhcnJheSBvZiBhcnJheXMgdXNpbmcgdGhlIE1hdHJpeC5tYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY3VycnkoKHByZXYsIG5leHQpID0+IG1hcCgoaXRlbSwgaSkgPT4gKHByZXZbaV0gfHwgW10pLmNvbmNhdChuZXh0W2ldKSkobmV4dCkpXG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlXG4gKiBAZGVzYyBHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGEgbWF0cml4IGFycmF5LCB2YWx1ZXMgYXJlIHNldCB0byB1bmRlZmluZWRcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge2FueVtdW119XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChyb3dzLCBjb2xzID0gdW5kZWZpbmVkLCB2YWx1ZSA9IDApID0+IHtcbiAgY29uc3QgX2NvbHMgPSBjb2xzIHx8IHJvd3NcbiAgY29uc3QgeSA9IG1hcCh6ID0+IHZhbHVlKShuZXcgQXJyYXkoX2NvbHMpKVxuICByZXR1cm4gbWFwKHogPT4geSkobmV3IEFycmF5KHJvd3MpKVxufVxuIiwiLy8gaW1wb3J0IGN1cnJ5IGZyb20gJ2Z1bi5qcy9zcmMvY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdW1hcCAoZ3B1LCBmLCBtYXRyaXgpIHtcbiAgcmV0dXJuIGdwdS5jcmVhdGVLZXJuZWwoZikuc2V0T3V0cHV0KFttYXRyaXgubGVuZ3RoLCBtYXRyaXhbMF0ubGVuZ3RoXSkobWF0cml4KVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3B1Zm9sZCAoZ3B1LCBmLCBvdXRwdXQsIG1hdHJpeCwgY29uc3RhbnRzID0ge30pIHtcbiAgcmV0dXJuIGdwdVxuICAgIC5jcmVhdGVLZXJuZWwoZiwgeyBjb25zdGFudHM6IE9iamVjdC5hc3NpZ24oe30sIHsgbTogbWF0cml4Lmxlbmd0aCwgbjogbWF0cml4WzBdLmxlbmd0aCB9LCBjb25zdGFudHMpIH0pXG4gICAgLnNldE91dHB1dChvdXRwdXQpKG1hdHJpeClcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdwdXByb2R1Y3QgKGdwdSwgZiwgb3V0cHV0LCBhLCBiLCBjb25zdGFudHMgPSB7fSkge1xuICByZXR1cm4gZ3B1XG4gICAgLmNyZWF0ZUtlcm5lbChmLCB7IGNvbnN0YW50czogT2JqZWN0LmFzc2lnbih7fSwgeyBtOiBiLmxlbmd0aCwgbjogYVswXS5sZW5ndGggfSwgY29uc3RhbnRzKSB9KVxuICAgIC5zZXRPdXRwdXQob3V0cHV0KShhLCBiKVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("@astuanax/funmatrix",[],n):"object"==typeof exports?exports["@astuanax/funmatrix"]=n():t["@astuanax/funmatrix"]=n()}("undefined"!=typeof self?self:this,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,e),u.l=!0,u.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var u in t)e.d(r,u,function(n){return t[n]}.bind(null,u));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=24)}([function(t,n,e){"use strict";function r(t){const n=t.length;return 0===n?t:e([]);function e(r){return function(){return function(r,u){const o=r.concat(u);return o.length{e.set(r,t(n,r,u))}),e}),a=Object(r.default)(function(t,n){let e=-1;const r=n.length;let u="";for(;++en.slice(r,r+t),e)}),c=Object(r.default)(function(t,n){return+t+ +n}),i=Object(r.default)(function(t,n,e){let r=0;return t(function(t){return n(t,r++)},e)}),f=Object(r.default)(function(t,n,e){const r=Array.prototype.slice.call(e),u=n<0?r.length+n:n;return e[u]?(r[u]=t(r[u]),r):r}),a=Object(r.default)(function(t,n,e){return Object(u.default)(e=>n(e)?t(e):e,Array.prototype.slice.call(e))}),l=Object(r.default)(function(t,n){let e=!0;for(let r in n)if(!t(n[r])){e=!1;break}return e}),s=Object(r.default)(function(t,n){for(let e=0;et(e)(n(e)):Object(j.a)((t,e)=>t.concat(Object(y.a)(Object(v.a)(e),n)),[],t)}),m=Object(r.default)(function(t,n){return Array.prototype.concat(t,n)});function w(t,n){return String(t)+String(n)}var x=e(2),M=Object(r.default)(function(t,n){return{String:w,Array:m}[Object(x.a)(t)](t,n)}),A=Object(r.default)(function(t,n){return M(n,[t])}),S=Object(r.default)(function(t,n){return t.apply(t,n)}),P=Object(v.a)(function(t){return Object(r.default)(function(n,e){return t(n,e)})}),C=Object(r.default)(function(t,n){return t.bind(n)}),k=e(9),N=Object(r.default)(function(t){const n=Object(v.a)(Object(r.default)(t));return Object(r.default)(function(){return Object(k.default)(g,Object(u.default)(n,arguments[0]),Array.prototype.slice.call(arguments,1))})}),R=Object(r.default)(function(t,n){return Object(O.a)("Function")(t)?function(){return t.apply(this,arguments)&&n.apply(this,arguments)}:N(p.a)(t,n)}),D=Object(r.default)(function(t){return t.apply(t,[].slice.call(arguments,1))}),E=e(4);var F=N(E.a);function z(){let t=Array.prototype.slice.call(arguments);return function(){let n=t[t.length-1],e=[n.apply(n,arguments)],r=t.length-2;for(;r>=0;--r){const n=t[r];e=[n.apply(n,e)]}return e[0]}}function T(t){return function(n){for(var e=0;eM(n,t(e)),Object(U.a)(n),n)});function tt(t){let n=1===(e=arguments).length?[e[0]]:Array.apply(null,e);var e;return n.shift(),t.replace(/{(\d+)}/g,(t,e)=>Object(E.a)(Object(O.a)("Undefined",n[e]))?n[e]:t)}var nt=Object(r.default)(function(t,n){return Object.prototype.hasOwnProperty.call(n,t)}),et=Object(r.default)(function(t,n){return t in n}),rt=e(10);function ut(t){return t}var ot=e(15),ct=e(21),it=e(16);function ft(t){return Object(W.a)(t)&&Object(B.default)(t,Object(U.a)(t))}var at=t=>J(new Date)(t)<0,lt=Object(O.a)("Map"),st=e(18),dt=Object(O.a)("null"),pt=e(13),bt=e(11),ht=Object(O.a)("Set"),vt=e(22),Ot=Object(O.a)("undefined");function jt(t){return Object(it.a)(t)&&isFinite(t.valueOf())}let yt=function(t){return this._value=t,this};yt.prototype.isJust=function(){return!0},yt.prototype.isNothing=function(){return!1};var _t=yt,gt=Object(r.default)(function(t){return t.keys()}),mt=Object(r.default)(function(t){switch(Object(x.a)(t)){case"Map":return gt(t);default:return Object(G.a)(t)}}),wt=Object(r.default)(function(t){const n=[];for(const e in t)n.push(e);return n}),xt=Object(v.a)(function(t){return t&&t.length?t[t.length-1]:void 0}),Mt=Object(r.default)(function(t,n){return n>t?n:t});let At=function(){};At.prototype.isJust=function(){return!1},At.prototype.isNothing=function(){return!0};var St=At;let Pt=function(t){this.__value=t};Pt.of=function(t){return t instanceof Pt?t:this instanceof Pt?(this.__value=t,this):new Pt(t)},Pt.prototype.getOrElse=function(t){return this.isNothing()?t:this.__value},Pt.prototype.map=function(t){return this.isNothing()?Pt.of(null):Pt.of(t(this.__value))},Pt.prototype.ap=function(t){return t.map(this.__value)},Pt.prototype.isNothing=function(){return null==this.__value},Pt.prototype.isJust=function(){return!this.isNothing()},Pt.prototype.Nothing=function(){return new St},Pt.prototype.Just=function(){return new _t(this._value)};var Ct=Pt,kt=Object(r.default)(function(t,n){return Array.from(new Set(t.concat(n)))});const Nt=Object(r.default)((t,n)=>{let e=Object.assign({},t);if(Object(rt.a)(t,n))return Object.assign({},t);for(let r in n){if(!Object.prototype.hasOwnProperty.call(n,r))continue;const u=n[r],o=t[r];Object(bt.a)(u)&&Object(bt.a)(o)?e[r]=Nt(u,o):Object(ot.a)(o)?e[r]=kt(o,u):e[r]=u}return e});var Rt=Nt,Dt=Object(r.default)(function(t,n){return+t*+n}),Et=Object(r.default)((t,n)=>{let e={};return Object.keys(t).filter(t=>-1===n.indexOf(t)).forEach(n=>{e[n]=t[n]}),e}),Ft=e(20),zt=Object(r.default)(function(t,n){let e,r=n,u=0;for(;ut/864e5,Bt=t=>t/36e5,Wt=t=>t/6e4,Ht=t=>t/1e3;function Vt(t){return!1!==t&&Object(W.a)(t)}var Gt=Object(v.a)(function(t){const n=Object(G.a)(t),e=n.length,r=[];let u=0;for(;u{for(let e in t)if(Object(i.a)(O(t[e],n[e])))return!1;for(let e in n)if(Object(i.a)(Object(u.a)(t[e]))&&Object(u.a)(n[e]))return!1;return!0}),O=n.default=Object(r.default)(function(t,n){return!!Object(o.a)(t,n)||Object(c.a)(t)===Object(c.a)(n)&&(!Object(f.a)(Object(i.a)(Object(u.a)(t)),Object(i.a)(Object(u.a)(n)))&&(t.constructor===n.constructor&&(Object(p.a)(t)||Object(s.a)(t)||Object(d.a)(t)||Object(b.a)(t)?Object(o.a)(t.valueOf(),n.valueOf()):Object(l.a)(t)?h(t,n):!!Object(a.a)(t)&&v(t,n))))})},function(t,n,e){"use strict";e.d(n,"a",function(){return o});var r=e(13),u=e(14);function o(t){return Object(u.a)(Object(r.a)(t),isNaN(t))}},function(t,n,e){"use strict";var r=e(0);n.a=Object(r.default)(function(t,n){let e=-1;const r=n.length,u=new Array(r);for(;++e1&&void 0!==arguments[1]?arguments[1]:i.default;return b.of(this).map(n(t))},b.concat=(0,r.default)(function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:i.default;return b.of(t).map(e(n))}),b.prototype.empty=function(){return b.of(this).map(f.default)},b.empty=(0,r.default)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=(0,d.default)(t,n);return b.of(e).map(f.default)}),b.prototype.identity=function(){return b.of(l.default).ap(this)},b.identity=function(t,n){var e=(0,d.default)(t,n);return b.of(l.default).ap(e)},b.prototype.combine=function(t){return b.of(this).concat(b.of(t),i.default)},b.combine=function(t,n){return b.of(t).concat(b.of(n),i.default)},b.prototype.dot=function(t){return b.of(this).concat(b.of(t),(0,a.default)(this.precision))},b.dot=function(t,n){return b.of(t).dot(b.of(n))},b.prototype.fill=function(t){return b.of(this).map((0,u.default)(function(n){return t(n)}))},b.prototype.zeros=function(){return b.of(this).fill(function(t){return 0})},b.zeros=function(t,n){var e=(0,d.default)(t,n);return b.of(e).fill(function(t){return 0})},b.prototype.ones=function(){return b.of(this).fill(function(t){return 1})},b.ones=function(t,n){var e=(0,d.default)(t,n);return b.of(e).fill(function(t){return 1})},b.prototype.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1};return b.of(this).fill(t)},b.random=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(t){return 2*Math.random()-1},n=arguments[1],e=arguments[2],r=(0,d.default)(n,e);return b.of(r).fill(t)},b.prototype.toArray=function(){return this.__value.map(function(t){return t.map(function(t){return t})})},b.prototype.clone=function(){return b.fromArray(this.__value)},b.fromArray=function(t){return b.of((0,u.default)(function(t){return(0,u.default)(function(t){return t})(t)})(t))},b.prototype.transpose=function(){return b.of((0,o.default)(s.default,[],this.__value))},b.transpose=function(t){return b.of(t).transpose()},b.prototype.add=function(t){if(t instanceof b){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot add");return this.map(function(n,e){return(0,u.default)(function(n,r){return n+t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n+t}))},b.prototype.subtract=function(t){if(t instanceof b){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw new Error("Matrices do not match, cannot subtract");return this.map(function(n,e){return(0,u.default)(function(n,r){return n-t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n-t}))},b.prototype.multiply=function(t){if(t instanceof b){if(this.getCols()!==t.getCols()||this.getRows()!==t.getRows())throw console.log("Use static method 'dot' to do matrix multiplication"),new Error("Matrices do not match, cannot create hadamard product");return this.map(function(n,e){return(0,u.default)(function(n,r){return n*t.__value[e][r]})(n)})}return this.map((0,u.default)(function(n){return n*t}))},b.prototype.additiveinverse=function(){return b.of(this).multiply(-1)},b.prototype.hadamard=function(t){return b.of(this).multiply(t)},b.prototype.lu=function(){for(var t=this.getRows(),n=this.clone(),e=this.zeros(),r=this.zeros(),u=0;u-1;--l){for(var s=0,d=l+1;d1&&void 0!==arguments[1]?arguments[1]:void 0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=n||t,o=(0,r.map)(function(t){return e})(new Array(u));return(0,r.map)(function(t){return o})(new Array(t))},t.exports=n.default}])}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jdXJyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3R5cGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL19wcml2YXRlL2N1cnJ5MS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbm90LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9leGlzdHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL21hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaXRlcmF0b3IvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pdGVyYXRvci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZm9sZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaWRlbnRpY2FsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwZXJ0dXJlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udW1iZXIvYWRkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYWRqdXN0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hZGp1c3RXaXRoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbGwuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FsbFBhc3MuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW55LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hbnlQYXNzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zdHJpbmcvY29uY2F0LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXBwbHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2JpbmFyeS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYmluZC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbGlmdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ib3RoLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jYWxsLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wbGVtZW50LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9jb25kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvZGlmZkRhdGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9kaXZpZGUuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2Jvb2xlYW4vRi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tYXAvZmlsdGVyLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZmlyc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2ZsYXRNYXAuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3N0cmluZy9mb3JtYXRTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2FycmF5L3RvLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9pc0VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL2lzRnV0dXJlRGF0ZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9udWxsL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9zZXQvaXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3VuZGVmaW5lZC9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pc1ZhbGlkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9tb25hZHMvSnVzdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbWFwL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2tleXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2xhc3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbW9uYWRzL05vdGhpbmcuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL21vbmFkcy9NYXliZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvdW5pb24uanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL211bHRpcGx5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3Qvb21pdC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvb2JqZWN0L3BhdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC9waWNrLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvcHJvcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvbnVtYmVyL3N1bS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9ULmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvRGF5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9kYXRlL3RvSG91ci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS90b01pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL2RhdGUvdG9TZWNvbmRzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy90cnV0aHkuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL29iamVjdC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcFdpdGguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL3ppcC5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvZGF0ZS9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vYmplY3QvZXF1YWxzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL25vZGVfbW9kdWxlcy9mdW4uanMvc3JjL251bWJlci9pc05hbi5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYXJyYXkvbWFwLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9vci5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvYm9vbGVhbi9pcy5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vbm9kZV9tb2R1bGVzL2Z1bi5qcy9zcmMvc3RyaW5nL2lzLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9ub2RlX21vZHVsZXMvZnVuLmpzL3NyYy9hcnJheS9mb2xkLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvbWF0cml4LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL2VtcHR5LmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9kb3QuanMiLCJ3ZWJwYWNrOi8vQGFzdHVhbmF4L2Z1bm1hdHJpeC8uL3NyYy91dGlsL3JvdW5kLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9AYXN0dWFuYXgvZnVubWF0cml4Ly4vc3JjL3V0aWwvdHJhbnNwb3NlLmpzIiwid2VicGFjazovL0Bhc3R1YW5heC9mdW5tYXRyaXgvLi9zcmMvdXRpbC9nZW5lcmF0ZS5qcyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwidGhpcyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJjdXJyeSIsImZ1biIsImFyZ3NsZW4iLCJsZW5ndGgiLCJjcmVhdGVSZWN1cnNlciIsImFjYyIsImFyZ3MiLCJfYWNjIiwiY29uY2F0IiwiYXBwbHkiLCJyZWN1cnNlIiwiQXJyYXkiLCJzbGljZSIsImFyZ3VtZW50cyIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY3VycnlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyIsIl90eXBlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18iLCJDdG9yIiwidmFsIiwiX3ByaXZhdGVfY3VycnkxX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18iLCJ4IiwidG9TdHJpbmciLCJjdXJyeTEiLCJmbiIsImEiLCJleGlzdHMiLCJlbXB0eSIsImNvbnN0cnVjdG9yIiwia2V5cyIsIm9iamVjdF9tYXAiLCJjYiIsImsiLCJtYXBfbWFwIiwiZm9yRWFjaCIsInYiLCJtYXAiLCJzZXQiLCJzdHJpbmdfbWFwIiwiY2hhckF0IiwiaXRlcmF0b3JfbWFwIiwiY2FsbGJhY2siLCJpdGVyYXRvciIsIm5leHRWYWx1ZSIsIm5leHQiLCJkb25lIiwicHVzaCIsImlzRnVuY3Rpb24iLCJpcyIsInR5cGUiLCJhcnJheV9tYXAiLCJvYmplY3RfZm9sZCIsImluaXQiLCJhcnJheV9mb2xkIiwiX251bWJlcl9pc05hbl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fIiwieSIsIl9pc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fIiwic3JjX2FwZXJ0dXJlIiwicmVzIiwic3JjX21hcCIsIml0ZW0iLCJpZHgiLCJhZGQiLCJiIiwiYWRkSW5kZXgiLCJmIiwiZyIsImFkanVzdCIsInNyY19hZGp1c3RXaXRoIiwicHJlZCIsInNyY19hbGwiLCJhbGxQYXNzIiwiY2JzIiwiYWx3YXlzIiwiYW55IiwiYW55UGFzcyIsInNyY19hcCIsImZucyIsInZhbHMiLCJhcCIsImZvbGQiLCJhcnJheV9jb25jYXQiLCJjb25jYXRfY29uY2F0IiwiU3RyaW5nIiwic3JjX2NvbmNhdCIsInNyY19hcHBlbmQiLCJlbCIsImxpc3QiLCJzcmNfYmluYXJ5IiwiY29udGV4dCIsInNyY19saWZ0IiwibGlmdGVkIiwic3JjX2ZvbGQiLCJib29sZWFuX2JvdGgiLCJmbjEiLCJmbjIiLCJhbmQiLCJzcmNfY29tcGxlbWVudCIsIm5vdCIsImNvbXBvc2UiLCJyZXN1bHQiLCJjb25kIiwiY29uZHMiLCJkZWZhdWx0VG8iLCJkaWZmRGF0ZSIsInN0YXJ0IiwiZW5kIiwiRGF0ZSIsImdldFRpbWUiLCJkaXZpZGUiLCJGIiwiYXJyYXlfZmlsdGVyIiwib2JqZWN0X2ZpbHRlciIsIm1hcF9maWx0ZXIiLCJNYXAiLCJpdCIsImVudHJpZXMiLCJzcmNfZmlsdGVyIiwiZmluZEluZGV4IiwiZmlyc3QiLCJ1bmRlZmluZWQiLCJmbGF0TWFwX2lzRnVuY3Rpb24iLCJzcmNfZmxhdE1hcCIsImZsYXRNYXAiLCJmb3JtYXRTdHJpbmciLCJzdHIiLCJzaGlmdCIsInJlcGxhY2UiLCJtYXRjaCIsImhhcyIsInByb3AiLCJvYmoiLCJoYXNJbiIsImlkZW50aXR5IiwiaXNFbXB0eSIsImVxdWFscyIsImlzRnV0dXJlRGF0ZSIsIm1hcF9pcyIsIm51bGxfaXMiLCJzZXRfaXMiLCJ1bmRlZmluZWRfaXMiLCJpc1ZhbGlkIiwiZGF0ZV9pcyIsImlzRmluaXRlIiwidmFsdWVPZiIsIkp1c3QiLCJfdmFsdWUiLCJpc0p1c3QiLCJpc05vdGhpbmciLCJtb25hZHNfSnVzdCIsIm1hcF9rZXlzIiwic3JjX2tleXMiLCJrZXlzSW4iLCJsYXN0IiwibWF4IiwiTm90aGluZyIsIm1vbmFkc19Ob3RoaW5nIiwiTWF5YmUiLCJfX3ZhbHVlIiwib2YiLCJnZXRPckVsc2UiLCJtb25hZHNfTWF5YmUiLCJ1bmlvbiIsImFMIiwiYVIiLCJmcm9tIiwiU2V0IiwibWVyZ2UiLCJvYmpMIiwib2JqUiIsImFzc2lnbiIsImlkZW50aWNhbCIsIm9sZFZhbHVlIiwibmV3VmFsdWUiLCJvYmplY3RfaXMiLCJhcnJheV9pcyIsIm9iamVjdF9tZXJnZSIsIm11bHRpcGx5Iiwib21pdCIsIm5hbWVzIiwiZmlsdGVyIiwiaW5kZXhPZiIsInBhdGgiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwaWNrIiwicHJvcHMiLCJudW1iZXJfc3VtIiwiVCIsInRvRGF5IiwidG9Ib3VyIiwidG9NaW51dGVzIiwidG9TZWNvbmRzIiwidHJ1dGh5Iiwib2JqZWN0X3ZhbHVlcyIsInppcFdpdGgiLCJhcnIiLCJsZW4iLCJNYXRoIiwibWluIiwic3JjX3ppcCIsImJvb2xlYW5faXMiLCJpc05hbiIsIm51bWJlcl9pcyIsInN0cmluZ19pcyIsIm9yIiwiYXJyYXlfZXF1YWxzIiwic3JjX2VxdWFscyIsIm9iamVjdF9lcXVhbHMiLCJrZXlYIiwia2V5WSIsIl9hbmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyIsImlzTmFOIiwiX2N1cnJ5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXAiLCJfZm9sZCIsIl9lcXVhbHMiLCJfY29uY2F0IiwiX2VtcHR5IiwiX2RvdCIsIl9pZGVudGl0eSIsIl90cmFuc3Bvc2UiLCJfZ2VuZXJhdGUiLCJNYXRyaXgiLCJwcmVjaXNpb24iLCJzZXRQcmVjaXNpb24iLCJpc1N5bW1ldHJpYyIsInRyYW5zcG9zZSIsImRlZmF1bHQiLCJpc1NxdWFyZSIsImdldENvbHMiLCJnZXRSb3dzIiwiaXNPcnRob2dvbmFsIiwiQXhBdCIsImRvdCIsIkkiLCJNIiwiZ2V0U2hhcGUiLCJBIiwiQiIsInJvd3MiLCJjb2xzIiwiY29tYmluZSIsImZpbGwiLCJ6ZXJvcyIsIm9uZXMiLCJyYW5kb20iLCJlIiwidG9BcnJheSIsInJvdyIsImNvbCIsImNsb25lIiwiZnJvbUFycmF5IiwiRXJyb3IiLCJqZHgiLCJzdWJ0cmFjdCIsImNvbnNvbGUiLCJsb2ciLCJhZGRpdGl2ZWludmVyc2UiLCJoYWRhbWFyZCIsImx1IiwiTCIsIlUiLCJhYnMiLCJqIiwicnJlZiIsImxlYWQiLCJyZXN1bHRNYXRyaXgiLCJ0bXAiLCJzb2x2ZSIsIkxVIiwiaW52ZXJzZSIsInJlZHVjZSIsImhhbGYiLCJyYW5rIiwiZGltZW5zaW9uIiwiZGlhZyIsImRpYWdwcm9kdWN0Iiwic3VtIiwicHJldiIsImtyb25lY2tlciIsInEiLCJsZWZ0IiwicmlnaHQiLCJmcmFtZSIsIl9mdW4iLCJfcm91bmQiLCJkZWNpbWFscyIsInJvdW5kIiwiX2NvbHMiLCJ6Il0sIm1hcHBpbmdzIjoiQ0FBQSxTQUFBQSxFQUFBQyxHQUNBLGlCQUFBQyxTQUFBLGlCQUFBQyxPQUNBQSxPQUFBRCxRQUFBRCxJQUNBLG1CQUFBRyxlQUFBQyxJQUNBRCxPQUFBLHlCQUFBSCxHQUNBLGlCQUFBQyxRQUNBQSxRQUFBLHVCQUFBRCxJQUVBRCxFQUFBLHVCQUFBQyxJQVJBLENBU0Msb0JBQUFLLFVBQUFDLEtBQUEsV0FDRCxtQkNUQSxJQUFBQyxFQUFBLEdBR0EsU0FBQUMsRUFBQUMsR0FHQSxHQUFBRixFQUFBRSxHQUNBLE9BQUFGLEVBQUFFLEdBQUFSLFFBR0EsSUFBQUMsRUFBQUssRUFBQUUsR0FBQSxDQUNBQyxFQUFBRCxFQUNBRSxHQUFBLEVBQ0FWLFFBQUEsSUFVQSxPQU5BVyxFQUFBSCxHQUFBSSxLQUFBWCxFQUFBRCxRQUFBQyxJQUFBRCxRQUFBTyxHQUdBTixFQUFBUyxHQUFBLEVBR0FULEVBQUFELFFBMERBLE9BckRBTyxFQUFBTSxFQUFBRixFQUdBSixFQUFBTyxFQUFBUixFQUdBQyxFQUFBUSxFQUFBLFNBQUFmLEVBQUFnQixFQUFBQyxHQUNBVixFQUFBVyxFQUFBbEIsRUFBQWdCLElBQ0FHLE9BQUFDLGVBQUFwQixFQUFBZ0IsRUFBQSxDQUEwQ0ssWUFBQSxFQUFBQyxJQUFB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LEtBQUksU0FBQ3dCLEVBQU0zRixHQUFQLE9BQWN1VCxFQUFLdlQsSUFBTSxJQUFJd0MsT0FBT21DLEVBQUszRSxLQUE3QyxDQUFrRDJFLHFJQ1R2RixJQUFBa1AsRUFBQS9ULEVBQUEsY0FTZSxTQUFDa1IsR0FBc0MsSUFBaENDLEVBQWdDcE8sVUFBQVYsT0FBQSxRQUFBb0gsSUFBQTFHLFVBQUEsR0FBQUEsVUFBQSxRQUF6QjBHLEVBQVd0SSxFQUFjNEIsVUFBQVYsT0FBQSxRQUFBb0gsSUFBQTFHLFVBQUEsR0FBQUEsVUFBQSxHQUFOLEVBQ3hDb1IsRUFBUWhELEdBQVFELEVBQ2hCMUwsR0FBSSxFQUFBdU8sRUFBQTFQLEtBQUksU0FBQStQLEdBQUMsT0FBSWpULEdBQVQsQ0FBZ0IsSUFBSTBCLE1BQU1zUixJQUNwQyxPQUFPLEVBQUFKLEVBQUExUCxLQUFJLFNBQUErUCxHQUFDLE9BQUk1TyxHQUFULENBQVksSUFBSTNDLE1BQU1xTyIsImZpbGUiOiJAYXN0dWFuYXgvZnVubWF0cml4Lm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiQGFzdHVhbmF4L2Z1bm1hdHJpeFwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJAYXN0dWFuYXgvZnVubWF0cml4XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkBhc3R1YW5heC9mdW5tYXRyaXhcIl0gPSBmYWN0b3J5KCk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI0KTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4vKipcbiAqIEBmdW5jdGlvbiBjdXJyeVxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyeSAoZnVuKSB7XG4gIGNvbnN0IGFyZ3NsZW4gPSBmdW4ubGVuZ3RoXG5cbiAgaWYgKGFyZ3NsZW4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlY3Vyc2VyKFtdKVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UgKGFjYywgYXJncykge1xuICAgIGNvbnN0IF9hY2MgPSBhY2MuY29uY2F0KGFyZ3MpXG4gICAgcmV0dXJuIF9hY2MubGVuZ3RoIDwgYXJnc2xlblxuICAgICAgPyBjcmVhdGVSZWN1cnNlcihfYWNjKVxuICAgICAgOiBmdW4uYXBwbHkodGhpcywgX2FjYylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlY3Vyc2VyIChhY2MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlY3Vyc2UoYWNjLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBWZXJpZmllcyB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRcbiAqXG4gKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGlzIChDdG9yLCB2YWwpIHtcbiAgcmV0dXJuIHR5cGUodmFsKSA9PT0gQ3RvclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIHR5cGUgKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KS5zbGljZSg4LCAtMSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGZ1bmN0aW9uIHdpdGggYXJpdHkgMVxuICogQGZ1bmN0aW9uIGN1cnJ5MVxuICogQHByaXZhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycnkxIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gY3VycmllZCAoYSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAwXG4gICAgICA/IHRoaXNcbiAgICAgIDogZm4oYSlcbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gbm90XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBub3QgKHgpIHtcbiAgcmV0dXJuICF4XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZXhpc3RzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4aXN0cyAoeCkge1xuICByZXR1cm4gISh4ID09IG51bGwpXG59O1xuIiwiLyoqXG5cbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGVtcHR5IGVxdWl2YWxlbnQgb2YgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW1wdHkgKHgpIHtcbiAgcmV0dXJuIG5ldyB4LmNvbnN0cnVjdG9yKClcbn07XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIG93biBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoT2JqZWN0KGEpKVxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGFuIG9iamVjdCBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChjdXJyZW50VmFsdWUsIGlkeCwgW2FdKSAtPiB7Yn0gLT4gW2JdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBlbXB0eSBmcm9tICcuLi9lbXB0eSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChjYiwgYSkge1xuICBjb25zdCBrID0ga2V5cyhhKVxuICBsZXQgaSA9IC0xXG4gIGNvbnN0IGwgPSBrLmxlbmd0aFxuICBjb25zdCByID0gZW1wdHkoYSlcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByW2tbaV1dID0gY2IoYVtrW2ldXSwga1tpXSwgYSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTWFwcyBvdmVyIGEgTWFwIGFuZCBhcHBsaWVzIGEgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IHtifSAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge01hcH0gYVxuICogQHJldHVybiB7TWFwfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGVtcHR5IGZyb20gJy4uL2VtcHR5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGNvbnN0IHIgPSBlbXB0eShhKVxuICBhLmZvckVhY2goKHYsIGssIG1hcCkgPT4ge1xuICAgIHIuc2V0KGssIGNiKHYsIGssIG1hcCkpXG4gIH0pXG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYSBzdHJpbmcgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIGxldCBpID0gLTFcbiAgY29uc3QgbCA9IGEubGVuZ3RoXG4gIGxldCByID0gJydcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByICs9IGNiKGEuY2hhckF0KGkpLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBNYXBzIG92ZXIgYW4gSXRlcmF0b3IgYW5kIGFwcGxpZXMgYSBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuM1xuICogQHNpZyAoY3VycmVudFZhbHVlLCBpZHgsIFthXSkgLT4ge2J9IC0+IFtiXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmF0b3J9IGFcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNhbGxiYWNrLCBpdGVyYXRvcikge1xuICBsZXQgciA9IFtdXG4gIGZvciAobGV0IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsgbmV4dFZhbHVlLmRvbmUgIT09IHRydWU7IG5leHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKSkge1xuICAgIHIucHVzaChjYWxsYmFjayhpdGVyYXRvci52YWx1ZSgpKSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMDEvMDQvMjAxNy5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuY29uc3QgaXNGdW5jdGlvbiA9IGlzKCdGdW5jdGlvbicpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzSXRlciAoaXRlcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihpdGVyW1N5bWJvbC5pdGVyYXRvcl0pXG59XG4iLCIvKipcbiAqIE1hcHMgb3ZlciBhbiBpdGVyYWJsZSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHdoaWNoIG1hcHMgb3ZlciBhbiBpdGVyYWJsZS5cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKGN1cnJlbnRWYWx1ZSwgaWR4LCBbYV0pIC0+IGIgLT4gYlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2JcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGFcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5pbXBvcnQgb2JqZWN0TWFwIGZyb20gJy4vb2JqZWN0L21hcCdcbmltcG9ydCBtYXBNYXAgZnJvbSAnLi9tYXAvbWFwJ1xuaW1wb3J0IHN0cmluZ01hcCBmcm9tICcuL3N0cmluZy9tYXAnXG5pbXBvcnQgaXRlcmF0b3JNYXAgZnJvbSAnLi9pdGVyYXRvci9tYXAnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgaXNJdGVyYXRvciBmcm9tICcuL2l0ZXJhdG9yL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXAgKGNiLCBhKSB7XG4gIHN3aXRjaCAodHlwZShhKSkge1xuICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiBjdXJyeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjYi5jYWxsKHRoaXMsIGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSlcbiAgICAgIH0pXG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiBvYmplY3RNYXAoY2IsIGEpXG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdNYXAoY2IsIGEpXG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBtYXBNYXAoY2IsIGEpXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGFycmF5TWFwKGNiLCBhKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gaXNJdGVyYXRvcihhKVxuICAgICAgICA/IGl0ZXJhdG9yTWFwKGNiLCBhKVxuICAgICAgICA6IGFycmF5TWFwKGNiLCBhKVxuICB9XG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIG8pIHtcbiAgY29uc3QgayA9IGtleXMobylcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgbGV0IHIgPSBPYmplY3QoaW5pdClcbiAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICByID0gY2Iociwgb1trW2ldXSwga1tpXSwgbylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGxpa2Ugb2JqZWN0IGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpdGVtXG4gKlxuICogQGZ1bmN0aW9uIGZvbGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgbGlrZSBvYmplY3QgYW5kIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGl0ZW1cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKChhLCBiLCBjLCBhKSDihpIgYSkg4oaSIGEg4oaSIFtiXSDihpIgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgcmVjZWl2ZXMgNCB2YWx1ZXM6IHRoZSBhY2N1bXVsYXRvciwgdGhlIGl0ZW0sIHRoZSBpbmRleCwgYW5kIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHsqfSBhIGlzIHRoZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0geyp9IFtiXSB0aGUgYXJyYXkgbGlrZSBpdGVtIHRvIGl0ZXJhdGUgb3ZlclxuICogQHJldHVybiB7Kn0gYSBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWVcbiAqKi9cblxuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBvYmplY3RGb2xkIGZyb20gJy4vb2JqZWN0L2ZvbGQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZvbGQgKGNiLCBpbml0LCBhKSB7XG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgJ09iamVjdCc6IG9iamVjdEZvbGQsXG4gICAgJ0FycmF5JzogYXJyYXlGb2xkXG4gIH1cbiAgLy8gaWYgKGEubmV4dCkge1xuICAvLyAgIHJldHVybiBpdGVyYWJsZUZvbGQoY2IsIGluaXQsIGEpXG4gIC8vIH1cbiAgLy8gaWYgKHR5cGUoU3ltYm9sKSAhPT0gJ3VuZGVmaW5lZCcgJiYgYVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gIC8vICAgcmV0dXJuIGl0ZXJhYmxlRm9sZChjYiwgaW5pdCwgYVtTeW1ib2wuaXRlcmF0b3JdKCkpXG4gIC8vIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZShhKV0oY2IsIGluaXQsIGEpXG59KVxuXG4vLyBmdW5jdGlvbiBpdGVyYWJsZUZvbGQgKGNiLCBhY2MsIGdlbikge1xuLy8gICBsZXQgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgd2hpbGUgKCFzdGVwLmRvbmUpIHtcbi8vICAgICBhY2MgPSBjYihhY2MsIHN0ZXAudmFsdWUpXG4vLyAgICAgc3RlcCA9IGdlbi5uZXh0KClcbi8vICAgfVxuLy8gICByZXR1cm4gYWNjXG4vLyB9XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aWNhbFxuICogQGRlc2NyaXB0aW9uIGNoZWNrcyBmb3IgaWRlbnRpbnRpY2FsIGl0ZW1zXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzTmFuIGZyb20gJy4vbnVtYmVyL2lzTmFuJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBpZGVudGljYWwgKHgsIHkpIHtcbiAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgIHJldHVybiAxIC8geCA9PT0gMSAvIHlcbiAgfVxuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuICEhKGlzTmFuKHgpICYmIGlzTmFuKHkpKVxufSlcbiIsIi8qKlxuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ09iamVjdCcpXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGFwZXJ0dXJlXG4gKiBAcGFyYW0gblxuICogQHBhcmFtIGFyclxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwZXJ0dXJlIChuLCBhKSB7XG4gIGlmIChhLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBjb25zdCByZXMgPSBBcnJheShhLmxlbmd0aCAtIG4gKyAxKVxuICByZXR1cm4gbWFwKChpdGVtLCBpZHgpID0+IGEuc2xpY2UoaWR4LCBpZHggKyBuKSwgcmVzKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSAyIGFyZ3VtZW50c1xuICpcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIDIgYXJndW1lbnRzXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gIHJldHVybiArYSArICtiXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYWRkSW5kZXhcbiAqIEBzdW1tYXJ5IEFkZHMgYSBzcGVjaWZpZWQgaW5kZXggdG8gaXRlcmF0ZSBhIGNvbGxlY3Rpb25cbiAqIEBkZXNjcmlwdGlvbiBUaGUgYWRkSW5kZXggZnVuY3Rpb24gaXMgbm90bmVjZXNzYXJ5IGZvciB0aGUgbWFwIGZ1bmN0aW9ucyBpbiB0aGUgZnVuLmpzIGxpYnJhcnkgYXMgdGhleSBiZWhhdmUgdGhlIHNhLGUgYXMgdGhlIG5hdGl2ZSBqYXZhc2NyaXB0IGZ1bmN0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBJdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBGdW5jdGlvbiB0byB3aGljaCB0byBhZGQgdGhlIGluZGV4XG4gKiBAcGFyYW0ge0FycmF5fSBhIFRoZSBhcnJheSBvbiB3aGljaCB0byB3b3JrXG4gKiBAc2luY2UgMS4wLjJcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkZEluZGV4IChmLCBnLCBhKSB7XG4gIGxldCBpID0gMFxuICByZXR1cm4gZihcbiAgICBmdW5jdGlvbiAodikge1xuICAgICAgcmV0dXJuIGcodiwgaSsrKVxuICAgIH0sXG4gICAgYVxuICApXG59KVxuIiwiLyoqXG4gKiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBhZGp1c3RcbiAqIEBkZXNjcmlwdGlvbiBNb2RpZmllcyBhbiBpdGVtIGluIGFuIGFycmF5IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBhKSAtPiBudW0gLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0byBtb2RpZnkgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICogQHBhcmFtIHtOdW1iZXJ9IGkgLSBUaGUgaW5kZXggYXQgd2hpY2ggdG8gbW9kaWZ5IHRoZSBhcnJheSwgYWNjZXB0cyBwb3N0aXRpdmUgYW5kIG5lZ2F0aXZlIGluZGV4ZXNcbiAqIEBwYXJhbSB7SXRlcmFibGV9IFthXSAtIEFycmF5IHdpdGggZGF0YVxuICogQHJldHVybiB7SXRlcmFibGV9IFthXVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdCAoZm4sIGksIGEpIHtcbiAgY29uc3QgciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpXG4gIGNvbnN0IGlkeCA9IGkgPCAwID8gci5sZW5ndGggKyBpIDogaVxuICBpZiAoIWFbaWR4XSkgcmV0dXJuIHJcbiAgcltpZHhdID0gZm4ocltpZHhdKVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogTW9kaWZpZXMgYW4gaXRlbSBpbiBhbiBhcnJheSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gYWRqdXN0V2l0aFxuICogQGRlc2NyaXB0aW9uIE1vZGlmaWVzIGFuIGl0ZW0gaW4gYW4gYXJyYXkgdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IGEpIC0+ICgoYSAtPiBbYV0pIC0+IFthXSAtPiBudW0pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdG8gbW9kaWZ5IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBUaGUgcHJlZGljYXRlIHRoYXQgcmV0dXJucyB0aGUgaW5kZXhlcyBpZiBmb3VuZFxuICogQHBhcmFtIHtJdGVyYWJsZX0gW2FdXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFkanVzdFdpdGggKGZuLCBwcmVkLCBhKSB7XG4gIGNvbnN0IF9mbiA9IHggPT4ge1xuICAgIGlmIChwcmVkKHgpKSB7XG4gICAgICByZXR1cm4gZm4oeClcbiAgICB9XG4gICAgcmV0dXJuIHhcbiAgfVxuICByZXR1cm4gbWFwKF9mbiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkpXG59KVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gYWxsXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGwgKGNiLCBhKSB7XG4gIGxldCByZXMgPSB0cnVlXG4gIGZvciAobGV0IGkgaW4gYSkge1xuICAgIGlmICghY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IGZhbHNlXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIHRvIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIHBhc3NcbiAqXG4gKiBAZnVuY3Rpb24gYWxsUGFzc1xuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzc1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbGxQYXNzIChjYnMsIGEpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWNic1tpXShhKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKlxuICogQGZ1bmN0aW9uIGFsd2F5c1xuICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlIHByb3ZpZGVkXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYWx3YXlzICh4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB4IH1cbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbiBvZiB0aGUgaXRlbXMgaW4gdGhlIGVudW1lcmFibGUgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBhbnlcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb24gb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgKFRPRE8pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhbnkgKGNiLCBhKSB7XG4gIGxldCByZXMgPSBmYWxzZVxuICBmb3IgKGxldCBpIGluIGEpIHtcbiAgICBpZiAoY2IoYVtpXSkpIHtcbiAgICAgIHJlcyA9IHRydWVcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn0pXG4iLCIvKipcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgdG8gdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiBvbmUgcGFzc2VzXG4gKlxuICogQGZ1bmN0aW9uIGFueVBhc3NcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgWygqLi4uIC0+IEJvb2xlYW4pXSAtPiAoKi4uLikgLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcHJlZGljYXRlcyBBbiBhcnJheSBvZiBwcmVkaWNhdGVzIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGNvbWJpbmVkIHByZWRpY2F0ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFueVBhc3MgKGNicywgYSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjYnNbaV0oYSkpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmV0dXJucyBhIGNvbWJpbmVkIHJlc3VsdCBhcnJheVxuICpcbiAqIEBmdW5jdGlvbiBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzIGFuZCByZXR1cm5zIGEgY29tYmluZWQgcmVzdWx0IGFycmF5XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIEBzaWcgW2EgLT4gYl0gLT4gW2FdIC0+IFtiXVxuICogQHBhcmFtIHsoRnVuY3Rpb25bXXxGdW5jdGlvbnxBcHBsaWNhdGl2ZSl9IGZucyAtIEFuIGFycmF5IG9mIGZ1bmN0aW9ucyBvciBhIGZ1bmN0aW9uIG9yIGFuIGFwcGxpY2F0aXZlXG4gKiBAcGFyYW0ge0FycmF5fSB2YWxzIC0gQW4gYXJyYXkgb2YgdmFsdWVzXG4gKiBAcmV0dXJuIHtJdGVyYWJsZX0gW2FdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjdXJyeTEgZnJvbSAnLi9fcHJpdmF0ZS9jdXJyeTEnXG5pbXBvcnQgaXMgZnJvbSAnLi9pcydcbmltcG9ydCBmb2xkIGZyb20gJy4vYXJyYXkvZm9sZCdcbmltcG9ydCBtYXAgZnJvbSAnLi9hcnJheS9tYXAnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBhcCAoZm5zLCB2YWxzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZucy5hcCkpIHtcbiAgICByZXR1cm4gZm5zLmFwKHZhbHMpXG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oZm5zKSkge1xuICAgIHJldHVybiB4ID0+IGZucyh4KSh2YWxzKHgpKVxuICB9XG4gIHJldHVybiBmb2xkKChhY2MsIGYpID0+IGFjYy5jb25jYXQobWFwKGN1cnJ5MShmKSwgdmFscykpLCBbXSwgZm5zKVxufSlcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBhcnJheUNvbmNhdFxuICogQHBhcmFtIGExXG4gKiBAcGFyYW0gYTJcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0KGEsIGIpXG59KVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIHN0cmluZ0NvbmNhdFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikgeyAvLyB1c2UgZnVuY3Rpb24oKSwgYXJyb3cgZnVuY3Rpb24gZG9lc24ndCBiaW5kIGFyZ3VtZW50c1xuICByZXR1cm4gU3RyaW5nKGEpICsgU3RyaW5nKGIpXG59XG4iLCIvKipcbiAqIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKlxuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIGl0ZW1zIHRvZ2V0aGVyXG4gKiBAc2luY2UgdjEuMC40XG4gKiBAcGFyYW0ge2F9IGEgLSBMZWZ0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEBwYXJhbSB7YX0gYiAtIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbmNhdGVuYXRpb25cbiAqIEByZXR1cm4ge2F9IENvbmNhdGVuYXRlZCBpdGVtXG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGFycmF5Q29uY2F0IGZyb20gJy4vYXJyYXkvY29uY2F0J1xuaW1wb3J0IHN0cmluZ0NvbmNhdCBmcm9tICcuL3N0cmluZy9jb25jYXQnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgICdTdHJpbmcnOiBzdHJpbmdDb25jYXQsXG4gICAgJ0FycmF5JzogYXJyYXlDb25jYXRcbiAgfVxuICByZXR1cm4gdHlwZU1hcFt0eXBlKGEpXShhLCBiKVxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGFwcGVuZFxuICogQGRlc2NyaXB0aW9uIEFwcGVuZCBhbiBlbG1lbnQgdG8gYSBsaXN0XG4gKiBAcGFyYW0geyp9IGVsIC0gRWxlbWVudCB0byBhZGQgdG8gYSBsaXN0XG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0IC0gTGlzdCB0byB3aGljaCB0byBhZGQgdGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBsID0gWzAsIDFdXG4gKiBhcHBlbmQoJ2EnLCBsKSAvLyByZXV0bnIgWzAsIDEsICdhJ11cbiAqXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcbmltcG9ydCBjb25jYXQgZnJvbSAnLi9jb25jYXQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGVuZCAoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIGNvbmNhdChsaXN0LCBbIGVsIF0pXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYXBwbHlcbiAqIEBkZXNjcmlwdGlvbiBUaGUgYXBwbHkoKSBtZXRob2QgY2FsbHMgYSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgcHJvdmlkZWQgYXMgYW4gYXJyYXksIGFuZCB0aGUgZnVuY3Rpb24gYXMgY29udGV4dC5cbiAqIEBwYXJhbSBmblxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhID0gYXBwbHkoZnVuY3Rpb24gKCkge1xuICogICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpLm1hcCh4ID0+IHggKiAyKVxuICogICB9KVxuICogYShbMSwgMiwgM10pXG4gKiAvLyBbMiwgNCwgNl1cbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGFwcGx5IChmbiwgYXJncykge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIGFyZ3MpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gYmluYXJ5XG4gKiBAcGFyYW0gY2JcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSwgKj0pOiAqfVxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5MShmdW5jdGlvbiBiaW5hcnkgKGNiKSB7XG4gIHJldHVybiBjdXJyeShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBjYihhLCBiKVxuICB9KVxufSlcbiIsImltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG4vKipcbiAqIEBmdW5jdGlvbiBiaW5kXG4gKiBAZGVzY3JpcHRpb24gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dFxuICogQHBhcmFtIHtmdW5jdGlvbiB9Zm5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJpbmQgKGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBmbi5iaW5kKGNvbnRleHQpXG59KVxuIiwiLyoqXG4gKiBcImxpZnRzXCIgYSBmdW5jdGlvbiBvZiBhcml0eSA+IDEgc28gdGhhdCBpdCBtYXkgXCJtYXAgb3ZlclwiIGEgbGlzdCwgRnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gbGlmdFxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBmb2xkIGZyb20gJy4vZm9sZCdcbmltcG9ydCBhcCBmcm9tICcuL2FwJ1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcCdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbGlmdCAoZm4pIHtcbiAgY29uc3QgbGlmdGVkID0gY3VycnkxKGN1cnJ5KGZuKSlcbiAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uIF9saWZ0ICgpIHtcbiAgICByZXR1cm4gZm9sZChhcCwgbWFwKGxpZnRlZCwgYXJndW1lbnRzWzBdKSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbiAgfSlcbn0pXG4iLCIvKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGJvdGggcHJlZGljYXRlcyByZXR1cm4gdHJ1ZVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4xIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbjIgQSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbGlmdCBmcm9tICcuLi9saWZ0J1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGJvdGggKGZuMSwgZm4yKSB7XG4gIHJldHVybiBpcygnRnVuY3Rpb24nKShmbjEpXG4gICAgPyBmdW5jdGlvbiBfYm90aCAoKSB7IHJldHVybiBmbjEuYXBwbHkodGhpcywgYXJndW1lbnRzKSAmJiBmbjIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9XG4gICAgOiBsaWZ0KGFuZCkoZm4xLCBmbjIpXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gY2FsbFxuICogQHBhcmFtIGZuXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuLy8gaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBjYWxsIChmbikge1xuICByZXR1cm4gZm4uYXBwbHkoZm4sIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb21wbGVtZW50XG4gKiBAZGVzY3JpcHRpb24gTGlmdHMgYSBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIGNvbXBsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgbm90XG4gKiBAc2VlIGxpZnRcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBsZW1lbnQoaXNFbXB0eSlcbiAqIGlzTm90RW1wdHkoW10pIC8vIGZhbHNlXG4gKiBpc05vdEVtcHR5KHsnYScgOiAxfSkgLy8gdHJ1ZVxuICpcbiAqIGNvbXBsZW1lbnQoTWF5YmUub2YoZmFsc2UpKSAvLyB0cnVlXG4gKiBjb21wbGVtZW50KE1heWJlLm9mKHRydWUpKSAvLyBmYWxzZVxuICovXG5pbXBvcnQgbGlmdCBmcm9tICcuL2xpZnQnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuXG5jb25zdCBjb21wbGVtZW50ID0gbGlmdChub3QpXG5leHBvcnQgZGVmYXVsdCBjb21wbGVtZW50XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBjb21wb3NlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKTogKn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcG9zZSAoKSB7XG4gIGxldCBmbnMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9jb21wb3NlICgpIHtcbiAgICBsZXQgaW5pdCA9IGZuc1tmbnMubGVuZ3RoIC0gMV1cbiAgICBsZXQgcmVzdWx0ID0gW2luaXQuYXBwbHkoaW5pdCwgYXJndW1lbnRzKV1cbiAgICBsZXQgaSA9IGZucy5sZW5ndGggLSAyXG5cbiAgICBmb3IgKGk7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBjb25zdCBmbiA9IGZuc1tpXVxuXG4gICAgICByZXN1bHQgPSBbZm4uYXBwbHkoZm4sIHJlc3VsdCldXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRbMF1cbiAgfVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGNvbmRcbiAqIEBwYXJhbSBjb25kc1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25kIChjb25kcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvbmRzW2ldWzBdKHZhbHVlKSkgcmV0dXJuIGNvbmRzW2ldWzFdKHZhbHVlKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIGluIHRoZSBlbnVtZXJhYmxlIG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZGVmYXVsdFRvXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBpbiB0aGUgZW51bWVyYWJsZSBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHthfSBkZWZhdWx0IFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtifSB2YWwgYHZhbGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGBkZWZhdWx0YCB1bmxlc3MgYHZhbGAgaXMgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYC5cbiAqIEByZXR1cm4geyp9IFRoZSBzZWNvbmQgdmFsdWUgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRlZmF1bHRUbyAoZCwgdikge1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdlxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGRpZmZEYXRlXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIgZGF0ZXMgaW4gbWlsbGlzZWNvbmRcbiAqIEBwYXJhbSB7RGF0ZX0gc3RhcnQgLSBTdGFydCBkYXRlXG4gKiBAcGFyYW0ge0RhdGV9IGVuZCAtIEVuZCBkYXRlXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFJFdHVybiB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHNcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBkaWZmRGF0ZSAoc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKG5ldyBEYXRlKHN0YXJ0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShlbmQpLmdldFRpbWUoKSlcbn0pXG4iLCIvKipcbiAqXG4gKlxuICogQGZ1bmN0aW9uIGRpdmlkZVxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRpdmlzaW9uIG9mIHRoZSAyIGFyZ3VtZW50c1xuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBiXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGRpdmlkZSAoYSwgYikge1xuICByZXR1cm4gK2EgLyArYlxufSlcbiIsIi8qKlxuICogQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICpcbiAqIEBmdW5jdGlvbiBGXG4gKiBAZGVzY3JpcHRpb24gQWx3YXlzIHJldHVybnMgYSBmdW5jdGlvbiB3aXRoIGEgRmFsc2UgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqKi9cbmltcG9ydCBhbHdheXMgZnJvbSAnLi4vYWx3YXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBhbHdheXMoZmFsc2UpXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBhcnJheUZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYXJyYXlGaWx0ZXIgKGZuLCBhKSB7XG4gIHZhciByID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZuKGFbaV0pKSByLnB1c2goYVtpXSlcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG9iamVjdEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cydcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gb2JqZWN0RmlsdGVyIChmbiwgbykge1xuICBsZXQgciA9IHt9XG4gIGNvbnN0IGsgPSBrZXlzKG8pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmbihvW2tbaV1dKSkgcltrW2ldXSA9IG9ba1tpXV1cbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcEZpbHRlclxuICogQHByaXZhdGVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwRmlsdGVyIChmbiwgbSkge1xuICBsZXQgciA9IG5ldyBNYXAoKVxuXG4gIGxldCBpdCA9IG0uZW50cmllcygpXG4gIGxldCByZXN1bHQgPSBpdC5uZXh0KClcblxuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgayA9IHJlc3VsdC52YWx1ZVswXVxuICAgIGNvbnN0IHYgPSByZXN1bHQudmFsdWVbMV1cbiAgICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gICAgcmVzdWx0ID0gaXQubmV4dCgpXG4gIH1cblxuICAvLyBMaW1pdGVkIGJyb3dzZXIgc3VwcG9ydFxuICAvLyBtLmZvckVhY2goKHYsIGspID0+IHtcbiAgLy8gICBpZiAoZm4oaywgdikpIHIuc2V0KGssIHYpXG4gIC8vIH0pXG5cbiAgLy8gYmFiZWwgdHJhbnNwaWxlIGlzc3Vlc1xuICAvLyBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtLmVudHJpZXMoKSkge1xuICAvL1xuICAvLyB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gZmlsdGVyXG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVjbnRpb24gdGhhdCBmaWx0ZXJzIE9iamVjdHMsIEFycmF5cyBhbmQgTWFwc1xuICpcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgYXJyYXlGaWx0ZXIgZnJvbSAnLi9hcnJheS9maWx0ZXInXG5pbXBvcnQgb2JqZWN0RmlsdGVyIGZyb20gJy4vb2JqZWN0L2ZpbHRlcidcbmltcG9ydCBtYXBGaWx0ZXIgZnJvbSAnLi9tYXAvZmlsdGVyJ1xuLy8gVE9ET1xuLy8gaW1wb3J0IHNldEZpbHRlciBmcm9tICcuLi9zZXQvZmlsdGVyJ1xuaW1wb3J0IHR5cGUgZnJvbSAnLi90eXBlJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmaWx0ZXIgKGZuLCBhKSB7XG4gIHN3aXRjaCAodHlwZShhKSkge1xuICAgIC8vIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKSB7XG4gICAgLy8gY2FzZSAnRnVuY3Rpb24nOlxuICAgIC8vICAgcmV0dXJuIGN1cnJ5KGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgcmV0dXJuIGNiLmNhbGwodGhpcywgYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKVxuICAgIC8vICAgfSlcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdEZpbHRlcihmbiwgYSlcbiAgICAvLyBjYXNlICdTdHJpbmcnOlxuICAgIC8vICAgcmV0dXJuIHN0cmluZ01hcChjYiwgYSlcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEZpbHRlcihmbiwgYSlcbiAgICAvLyBjYXNlICdTZXQnOlxuICAgIC8vICAgcmV0dXJuIHNldEZpbHRlcihmbiwgYSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKGZuLCBhKVxuICB9XG59KVxuIiwiLyoqXG4gKiBGaW5kIHRoZSBpbmRleCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICpcbiAqIEBmdW5jdGlvbiBmaW5kSW5kZXhcbiAqIEBkZXNjcmlwdGlvbiBGaW5kIHRoZSBpbmRleCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyAoYSAtPiBib29sZWFuKSAtPiBbYV0gLT4gbnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBQcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IEFuIGFycmF5IGxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiovXG5cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBmaW5kSW5kZXggKGZuLCBhKSB7XG4gIGxldCBpID0gMFxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgd2hpbGUgKGkgPCBsKSB7XG4gICAgaWYgKGZuKGFbaV0pKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gLTFcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBmaXJzdFxuICogQHBhcmFtIFthXVxuICogQHJldHVybiBhIHwgdW5kZWZpbmVkXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGFyciA9IFsxLCAyLCA0XVxuICogZmlyc3QoWzEsIDIsIDRdKSAvLyByZXR1cm5zIDFcbiAqL1xuaW1wb3J0IGN1cnJ5MSBmcm9tICcuL19wcml2YXRlL2N1cnJ5MSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkxKGZ1bmN0aW9uIGZpcnN0IChhKSB7XG4gIHJldHVybiBhICYmIGEubGVuZ3RoID8gYVswXSA6IHVuZGVmaW5lZFxufSlcbiIsImltcG9ydCBmb2xkIGZyb20gJy4vZm9sZCdcbmltcG9ydCBlbXB0eSBmcm9tICcuL2VtcHR5J1xuaW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCdcbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGlzIGZyb20gJy4vaXMnXG5cbmNvbnN0IGlzRnVuY3Rpb24gPSBpcygnRnVuY3Rpb24nKVxuXG4vKipcbiAqIEBmdW5jdGlvbiBmbGF0TWFwXG4gKiBAcGFyYW0gZm5cbiAqIEBwYXJhbSBhXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGZsYXRNYXAgKGZuLCBhKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGEpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gZm4oYSh4KSkoeClcbiAgICB9XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24oYS5mbGF0TWFwKSkge1xuICAgIHJldHVybiBhLmZsYXRNYXAoZm4pXG4gIH1cbiAgcmV0dXJuIGZvbGQoKGFjYywgeCkgPT4gY29uY2F0KGFjYywgZm4oeCkpLCBlbXB0eShhKSwgYSlcbn0pXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXG4gKi9cbmltcG9ydCB0b0FycmF5IGZyb20gJy4uL2FycmF5L3RvJ1xuaW1wb3J0IG5vdCBmcm9tICcuLi9ub3QnXG5pbXBvcnQgaXMgZnJvbSAnLi4vaXMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFN0cmluZyAoc3RyKSB7IC8vIHVzZSBmdW5jdGlvbigpLCBhcnJvdyBmdW5jdGlvbiBkb2Vzbid0IGJpbmQgYXJndW1lbnRzXG4gIGxldCBhcmdzID0gdG9BcnJheShhcmd1bWVudHMpXG5cbiAgYXJncy5zaGlmdCgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgveyhcXGQrKX0vZywgKG1hdGNoLCBpZHgpID0+IHtcbiAgICByZXR1cm4gbm90KGlzKCdVbmRlZmluZWQnLCBhcmdzW2lkeF0pKSA/IGFyZ3NbaWR4XSA6IG1hdGNoXG4gIH0pXG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiB0b0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIGlucHV0IHRvIGFuIGFycmF5XG4gKiBAcGFyYW0ge0FycmF5TGlrZX0geCAtIE9iamVjdCB0byBjb252ZXJ0IHRvIGFuIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSB0b0FycmF5KFwic3RyaW5nXCIpXG4gKiAvLyByZXN1bHQgPSBbJ3MnLCd0JywncicsJ2knLCduJywnZyddXG4gKlxuICogZnVuY3Rpb24gKCkge1xuICogIGNvbnN0IGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cylcbiAqICBjb25zb2xlLmxvZyh0eXBlb2YgYXJncykgLy8gQXJyYXlcbiAqIH1cbiAqXG4gKiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0FycmF5ICh4KSB7XG4gIHJldHVybiB4Lmxlbmd0aCA9PT0gMSA/IFt4WzBdXSA6IEFycmF5LmFwcGx5KG51bGwsIHgpXG59O1xuIiwiLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHlcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcge1N0cmluZ30gLT4ge09iamVjdH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIGhhcyAocHJvcCwgb2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5LCBldmVuIGlmIGl0IGlzIGluaGVyaXRlZFxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyB7U3RyaW5nfSAtPiB7T2JqZWN0fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gaGFzSW4gKHByb3AsIG9iaikge1xuICByZXR1cm4gcHJvcCBpbiBvYmpcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaWRlbnRpdHkgKHgpIHtcbiAgcmV0dXJuIHhcbn07XG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVtcHR5XG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgZW1wdHkgZXF1aXZhbGVudCBvZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqL1xuaW1wb3J0IGVtcHR5IGZyb20gJy4vZW1wdHknXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuaW1wb3J0IGVxdWFscyBmcm9tICcuL2VxdWFscydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNFbXB0eSAoeCkge1xuICByZXR1cm4gZXhpc3RzKHgpICYmIGVxdWFscyh4LCBlbXB0eSh4KSlcbn07XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDA5LzAzLzIwMTcuXG4gKi9cbmltcG9ydCBkaWZmRGF0ZSBmcm9tICcuL2RpZmZEYXRlJ1xuXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4ge1xuICByZXR1cm4gZGlmZkRhdGUobmV3IERhdGUoKSkoZCkgPCAwXG59XG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ01hcCcpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnbnVsbCcpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ1NldCcpXG4iLCIvKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAzLzAyLzIwMTlcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygndW5kZWZpbmVkJylcbiIsIi8qKlxuICpcbiAqL1xuaW1wb3J0IGlzRGF0ZSBmcm9tICcuL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1ZhbGlkICh4KSB7XG4gIC8vIG5vaW5zcGVjdGlvbiBKU0NoZWNrRnVuY3Rpb25TaWduYXR1cmVzXG4gIHJldHVybiBpc0RhdGUoeCkgJiYgaXNGaW5pdGUoeC52YWx1ZU9mKCkpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gSnVzdFxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnMge0p1c3R9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IEp1c3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX3ZhbHVlID0gdmFsXG4gIHJldHVybiB0aGlzXG59XG5cbkp1c3QucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWVcbn1cbkp1c3QucHJvdG90eXBlLmlzTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IEp1c3RcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duIGtleXMgb2YgYW4gTWFwIGFzIGFuIEFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIGEgLT4gW2JdXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEByZXR1cm4ge0FycmF5fVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBrZXlzIChhKSB7XG4gIHJldHVybiBhLmtleXMoKVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IG9yIGl0ZXJhdG9yXG4gKlxuICogQGZ1bmN0aW9uIGtleXNcbiAqIEBkZXNjcmlwdGlvbiBBdXRvY3VycmllZCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBwcm92aWRlZCBvYmplY3Qgb3IgaXRlcmF0b3JcbiAqIEBzaW5jZSB2MS4wLjJcbiAqIEBzaWcgb2JqIC0+IFsqXVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIE9iaiBmcm9tIHpoaWNoIHRvIHRha2UgdGhlIGtleXNcbiAqIEByZXR1cm4ge0l0ZXJhYmxlfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4vY3VycnknXG5pbXBvcnQgb2JqZWN0S2V5cyBmcm9tICcuL29iamVjdC9rZXlzJ1xuaW1wb3J0IG1hcEtleXMgZnJvbSAnLi9tYXAva2V5cydcbmltcG9ydCB0eXBlIGZyb20gJy4vdHlwZSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbWFwIChvYmopIHtcbiAgc3dpdGNoICh0eXBlKG9iaikpIHtcbiAgICBjYXNlICdNYXAnOlxuICAgICAgcmV0dXJuIG1hcEtleXMob2JqKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0S2V5cyhvYmopXG4gIH1cbn0pXG4iLCIvKipcbiAqIFJldHVybnMgYWxsIHRoZSBrZXlzIG9mIGFuIG9iamVjdCBhcyBhbiBBcnJheVxuICpcbiAqIEBmdW5jdGlvblxuICogQHNpbmNlIHYxLjAuMlxuICogQHNpZyBhIC0+IFtiXVxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24ga2V5cyAoYSkge1xuICBjb25zdCByID0gW11cbiAgZm9yIChjb25zdCBrIGluIGEpIHtcbiAgICByLnB1c2goaylcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIGxhc3RcbiAqIEBwYXJhbSBbYV1cbiAqIEByZXR1cm4gYSB8IHVuZGVmaW5lZFxuICovXG5pbXBvcnQgY3VycnkxIGZyb20gJy4vX3ByaXZhdGUvY3VycnkxJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gbGFzdCAoYSkge1xuICByZXR1cm4gYSAmJiBhLmxlbmd0aCA/IGFbYS5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZFxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VzdCBvZiB0aGUgMiBhcmd1bWVudHMgcHJvdmlkZWRcbiAqXG4gKiBAZnVuY3Rpb24gbWF4XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBtYXggKGEsIGIpIHtcbiAgcmV0dXJuIGIgPiBhID8gYiA6IGFcbn0pXG4iLCIvKipcbiAqIEBmdW5jdGlvbiBOb3RoaW5nXG4gKiBAY29uc3RydWN0b3JcbiAqL1xubGV0IE5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG59XG5cbk5vdGhpbmcucHJvdG90eXBlLmlzSnVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5Ob3RoaW5nLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vdGhpbmdcbiIsImltcG9ydCBKdXN0IGZyb20gJy4vSnVzdCdcbmltcG9ydCBOb3RoaW5nIGZyb20gJy4vTm90aGluZydcblxuLyoqXG4gKiBAZnVuY3Rpb24gTWF5YmVcbiAqIEBwYXJhbSB2YWxcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5sZXQgTWF5YmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxufVxuXG5NYXliZS5vZiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIE1heWJlKSByZXR1cm4gdmFsXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgTWF5YmUpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF5YmUodmFsKVxufVxuXG5NYXliZS5wcm90b3R5cGUuZ2V0T3JFbHNlID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIHRoaXMuaXNOb3RoaW5nKCkgPyBuIDogdGhpcy5fX3ZhbHVlXG59XG5cbk1heWJlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZikge1xuICBpZiAodGhpcy5pc05vdGhpbmcoKSkge1xuICAgIHJldHVybiBNYXliZS5vZihudWxsKVxuICB9XG4gIHJldHVybiBNYXliZS5vZihmKHRoaXMuX192YWx1ZSkpXG59XG5cbk1heWJlLnByb3RvdHlwZS5hcCA9IGZ1bmN0aW9uIChtKSB7XG4gIHJldHVybiBtLm1hcCh0aGlzLl9fdmFsdWUpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc05vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodGhpcy5fX3ZhbHVlID09IG51bGwpXG59XG5cbk1heWJlLnByb3RvdHlwZS5pc0p1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhdGhpcy5pc05vdGhpbmcoKVxufVxuXG5NYXliZS5wcm90b3R5cGUuTm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBOb3RoaW5nKClcbn1cblxuTWF5YmUucHJvdG90eXBlLkp1c3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgSnVzdCh0aGlzLl92YWx1ZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF5YmVcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHVuaW9uQXJyYXlcbiAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgMiBhcnJheXNcbiAqIEBwYXJhbSB7QXJyYXl9IGFMIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEBwYXJhbSB7QXJyYXl9IGFSIC0gQXJyYXkgdG8gbWVyZ2VcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHVuaW9uQXJyYXkoWzAsMSwyXSwgWzMsNCw1XSlcbiAqIC8vIHJlc3VsdCA9IFswLjEuMi4zLjQuNV1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gdW5pb25BcnJheSAoYUwsIGFSKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYUwuY29uY2F0KGFSKSkpXG59KVxuIiwiLyoqXG5cbiAqIGVxdWFsc1xuICogY2hlY2tzIGZvciBlcXVhbGl0eVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgaWRlbnRpY2FsIGZyb20gJy4uL2lkZW50aWNhbCdcbmltcG9ydCBpc09iamVjdCBmcm9tICcuLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuLi9hcnJheS9pcydcbmltcG9ydCB1bmlvbiBmcm9tICcuLi9hcnJheS91bmlvbidcblxuY29uc3QgbWVyZ2UgPSBjdXJyeSgob2JqTCwgb2JqUikgPT4ge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqTClcblxuICBpZiAoaWRlbnRpY2FsKG9iakwsIG9ialIpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iakwpXG4gIH1cbiAgZm9yIChsZXQga2V5IGluIG9ialIpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpSLCBrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBvbGRWYWx1ZSA9IG9ialJba2V5XVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gb2JqTFtrZXldXG5cbiAgICBpZiAoaXNPYmplY3Qob2xkVmFsdWUpICYmIGlzT2JqZWN0KG5ld1ZhbHVlKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB1bmlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gb2xkVmFsdWUgLy8gVE9ETzogdGhpcyBpcyBhIHJlZmVyZW5jZSwgc2hvdWxkIGJlIGNsb25lXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlXG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIDIgYXJndW1lbnRzXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gbXVsdGlwbHkgKGEsIGIpIHtcbiAgcmV0dXJuICthICogK2Jcbn0pXG4iLCIvKipcblxuICogZXF1YWxzXG4gKiBjaGVja3MgZm9yIGVxdWFsaXR5XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoKG9iaiwgbmFtZXMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHt9XG5cbiAgT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIHJldHVybiBuYW1lcy5pbmRleE9mKGtleSkgPT09IC0xXG4gIH0pLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHBhdGhcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwYXRoIChwYXRoLCBvYmopIHtcbiAgbGV0IHZhbCA9IG9ialxuICBsZXQgaWR4ID0gMFxuICBsZXQgcFxuICB3aGlsZSAoaWR4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBwID0gcGF0aFtpZHhdXG4gICAgdmFsID0gTnVtYmVyLmlzSW50ZWdlcihwKVxuICAgICAgPyBwIDwgMCA/IHZhbFt2YWwubGVuZ3RoICsgcF0gOiB2YWxbcF1cbiAgICAgIDogdmFsW3BdXG4gICAgaWR4ICs9IDFcbiAgfVxuICByZXR1cm4gdmFsXG59KVxuLy8gbGV0IHIgPSBvYmpcbi8vIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuLy8gICBpZiAociA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4vLyAgIHIgPSByW3BhdGhbaV1dXG4vLyB9XG4vLyByZXR1cm4gclxuLy8gfSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHBpY2tcbiAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIGEgbmV3IGJqZWN0IHdpdGggb25seSB0aGUgcHJvcHMgdGhhdCBhcmUgcHJvdmlkZWRcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIC0gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgcHJvcGVydGllc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHBpY2sgKHByb3BzLCBvYmopIHtcbiAgY29uc3QgciA9IHt9XG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IHByb3BzLmxlbmd0aCkge1xuICAgIGlmIChwcm9wc1tpXSBpbiBvYmopIHtcbiAgICAgIHJbcHJvcHNbaV1dID0gb2JqW3Byb3BzW2ldXVxuICAgIH1cbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gclxufSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHByb3BcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBwcm9wIChwLCBvYmopIHtcbiAgcmV0dXJuIG9ialtwXVxufSlcbiIsIi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIGluIGFuIGFycmF5XG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHJldHVybiB7TnVtYmVyfVxuICoqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGFkZCBmcm9tICcuL2FkZCdcbmltcG9ydCBmb2xkIGZyb20gJy4uL2ZvbGQnXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIHN1bSAoYSkge1xuICByZXR1cm4gZm9sZChhZGQsIDAsIGEpXG59KVxuIiwiLyoqXG4gKiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKlxuICogQGZ1bmN0aW9uIFRcbiAqIEBkZXNjcmlwdGlvbiBBbHdheXMgcmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBGYWxzZSBib29sZWFuXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICoqL1xuaW1wb3J0IGFsd2F5cyBmcm9tICcuLi9hbHdheXMnXG5cbmV4cG9ydCBkZWZhdWx0IGFsd2F5cyh0cnVlKVxuIiwiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDI2LzAzLzIwMTcuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAoZCkgPT4gZCAvIDg2NDAwMDAwIC8vIDI0KjYwKjYwKjEwMDAgPSA4NjQwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gMzYwMDAwMCAvLyA2MCo2MCoxMDAwID0gMzYwMDAwMFxyXG4iLCIvKipcclxuICogQ3JlYXRlZCBieSBkaWVyaWNreC5sZW4gb24gMjYvMDMvMjAxNy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChkKSA9PiBkIC8gNjAwMDAgLy8gNjAqMTAwMCA9IDYwMDAwXHJcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAyNi8wMy8yMDE3LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgKGQpID0+IGQgLyAxMDAwXHJcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHRydXRoeVxuICovXG5pbXBvcnQgZXhpc3RzIGZyb20gJy4vZXhpc3RzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cnV0aHkgKHgpIHtcbiAgcmV0dXJuICh4ICE9PSBmYWxzZSkgJiYgZXhpc3RzKHgpXG59O1xuIiwiLyoqXG4gKiBAZnVuY3Rpb24gdmFsdWVzXG4gKiBAZGVzY3JpcHRpb24gUkV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIHRha2VuIGZyb20gYW4gb2JqZWN0cyBvd24gcHJvcGVydGllc1xuICogQHBhcmFtIHtvYmplY3R9IC0gb2JqIFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byB0YWtlIHRoZSB2YWx1ZXNcbiAqIEByZXR1cm4ge2FycmF5fVxuICpcbiAqKi9cbmltcG9ydCBjdXJyeTEgZnJvbSAnLi4vX3ByaXZhdGUvY3VycnkxJ1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeTEoZnVuY3Rpb24gdmFsdWVzIChvYmopIHtcbiAgY29uc3QgayA9IGtleXMob2JqKVxuICBjb25zdCBsID0gay5sZW5ndGhcbiAgY29uc3QgciA9IFtdXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IGwpIHtcbiAgICByW2ldID0gb2JqW2tbaV1dXG4gICAgaSArPSAxXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCIvKipcblxuICogemlwV2l0aFxuICpcbiAqICBAZnVuY3Rpb24gemlwV2l0aFxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gemlwV2l0aCAoY2IsIGEsIGIpIHtcbiAgY29uc3QgYXJyID0gW11cbiAgY29uc3QgbGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICBsZXQgaSA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyLnB1c2goY2IoYVtpXSwgYltpXSkpXG4gIH1cbiAgcmV0dXJuIGFyclxufSlcbiIsIi8qKlxuXG4gKiB6aXBcbiAqXG4gKiBAZnVuY3Rpb24gemlwXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IHppcFdpdGggZnJvbSAnLi96aXBXaXRoJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiB6aXAgKGEsIGIpIHtcbiAgcmV0dXJuIHppcFdpdGgoZnVuY3Rpb24gX3ppcFdpdGggKHgsIHkpIHsgcmV0dXJuIFt4LCB5XSB9LCBhLCBiKVxufSlcbiIsIi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgX18gfSBmcm9tICcuL19fJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBlcnR1cmUgfSBmcm9tICcuL2FwZXJ0dXJlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBseVNwZWMgfSBmcm9tICcuL2FwcGx5U3BlYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlUbyB9IGZyb20gJy4vYXBwbHlUbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNjZW5kIH0gZnJvbSAnLi9hc2NlbmQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGFzc29jIH0gZnJvbSAnLi9hc3NvYydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgYXNzb2NQYXRoIH0gZnJvbSAnLi9hc3NvY1BhdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNsYW1wIH0gZnJvbSAnLi9jbGFtcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmUgfSBmcm9tICcuL2Nsb25lJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wYXJhdG9yIH0gZnJvbSAnLi9jb21wYXJhdG9yJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb21wb3NlSyB9IGZyb20gJy4vY29tcG9zZUsnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvbXBvc2VQIH0gZnJvbSAnLi9jb21wb3NlUCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZVdpdGggfSBmcm9tICcuL2NvbXBvc2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb25zdHJ1Y3QgfSBmcm9tICcuL2NvbnN0cnVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29uc3RydWN0TiB9IGZyb20gJy4vY29uc3RydWN0Tidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgY29udGFpbnMgfSBmcm9tICcuL2NvbnRhaW5zJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBjb252ZXJnZSB9IGZyb20gJy4vY29udmVyZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGNvdW50QnkgfSBmcm9tICcuL2NvdW50QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRlYyB9IGZyb20gJy4vZGVjJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkZXNjZW5kIH0gZnJvbSAnLi9kZXNjZW5kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlIH0gZnJvbSAnLi9kaWZmZXJlbmNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaWZmZXJlbmNlV2l0aCB9IGZyb20gJy4vZGlmZmVyZW5jZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRpc3NvYyB9IGZyb20gJy4vZGlzc29jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXNzb2NQYXRoIH0gZnJvbSAnLi9kaXNzb2NQYXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wIH0gZnJvbSAnLi9kcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBkcm9wTGFzdCB9IGZyb20gJy4vZHJvcExhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BMYXN0V2hpbGUgfSBmcm9tICcuL2Ryb3BMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BSZXBlYXRzIH0gZnJvbSAnLi9kcm9wUmVwZWF0cydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZHJvcFJlcGVhdHNXaXRoIH0gZnJvbSAnLi9kcm9wUmVwZWF0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGRyb3BXaGlsZSB9IGZyb20gJy4vZHJvcFdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlaXRoZXIgfSBmcm9tICcuL2VpdGhlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZW5kc1dpdGggfSBmcm9tICcuL2VuZHNXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcUJ5IH0gZnJvbSAnLi9lcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBlcVByb3BzIH0gZnJvbSAnLi9lcVByb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBldm9sdmUgfSBmcm9tICcuL2V2b2x2ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZCB9IGZyb20gJy4vZmluZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZmluZExhc3QgfSBmcm9tICcuL2ZpbmRMYXN0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kTGFzdEluZGV4IH0gZnJvbSAnLi9maW5kTGFzdEluZGV4J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0dGVuIH0gZnJvbSAnLi9mbGF0dGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGlwIH0gZnJvbSAnLi9mbGlwJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoIH0gZnJvbSAnLi9mb3JFYWNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JFYWNoT2JqSW5kZXhlZCB9IGZyb20gJy4vZm9yRWFjaE9iakluZGV4ZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGZyb21QYWlycyB9IGZyb20gJy4vZnJvbVBhaXJzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cEJ5IH0gZnJvbSAnLi9ncm91cEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cFdpdGggfSBmcm9tICcuL2dyb3VwV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgZ3QgfSBmcm9tICcuL2d0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBndGUgfSBmcm9tICcuL2d0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzUGF0aCB9IGZyb20gJy4vaGFzUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaGVhZCB9IGZyb20gJy4vaGVhZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaWZFbHNlIH0gZnJvbSAnLi9pZkVsc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluYyB9IGZyb20gJy4vaW5jJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmNsdWRlcyB9IGZyb20gJy4vaW5jbHVkZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4QnkgfSBmcm9tICcuL2luZGV4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluZGV4T2YgfSBmcm9tICcuL2luZGV4T2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGluaXQgfSBmcm9tICcuL2luaXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGlubmVySm9pbiB9IGZyb20gJy4vaW5uZXJKb2luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnNlcnQgfSBmcm9tICcuL2luc2VydCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW5zZXJ0QWxsIH0gZnJvbSAnLi9pbnNlcnRBbGwnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludGVyc2VjdGlvbiB9IGZyb20gJy4vaW50ZXJzZWN0aW9uJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnRlcnNwZXJzZSB9IGZyb20gJy4vaW50ZXJzcGVyc2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludG8gfSBmcm9tICcuL2ludG8nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGludmVydCB9IGZyb20gJy4vaW52ZXJ0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBpbnZlcnRPYmogfSBmcm9tICcuL2ludmVydE9iaidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgaW52b2tlciB9IGZyb20gJy4vaW52b2tlcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgam9pbiB9IGZyb20gJy4vam9pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMganV4dCB9IGZyb20gJy4vanV4dCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdEluZGV4T2YgfSBmcm9tICcuL2xhc3RJbmRleE9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsZW5ndGggfSBmcm9tICcuL2xlbmd0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVucyB9IGZyb20gJy4vbGVucydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc0luZGV4IH0gZnJvbSAnLi9sZW5zSW5kZXgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGxlbnNQYXRoIH0gZnJvbSAnLi9sZW5zUGF0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbGVuc1Byb3AgfSBmcm9tICcuL2xlbnNQcm9wJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWZ0TiB9IGZyb20gJy4vbGlmdE4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIGx0IH0gZnJvbSAnLi9sdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbHRlIH0gZnJvbSAnLi9sdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1hcEFjY3VtIH0gZnJvbSAnLi9tYXBBY2N1bSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwQWNjdW1SaWdodCB9IGZyb20gJy4vbWFwQWNjdW1SaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwT2JqSW5kZXhlZCB9IGZyb20gJy4vbWFwT2JqSW5kZXhlZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWF0Y2ggfSBmcm9tICcuL21hdGNoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXRoTW9kIH0gZnJvbSAnLi9tYXRoTW9kJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtYXhCeSB9IGZyb20gJy4vbWF4QnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lYW4gfSBmcm9tICcuL21lYW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lZGlhbiB9IGZyb20gJy4vbWVkaWFuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZW1vaXplV2l0aCB9IGZyb20gJy4vbWVtb2l6ZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlQWxsIH0gZnJvbSAnLi9tZXJnZUFsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwTGVmdCB9IGZyb20gJy4vbWVyZ2VEZWVwTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICcuL21lcmdlRGVlcFJpZ2h0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoIH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZURlZXBXaXRoS2V5IH0gZnJvbSAnLi9tZXJnZURlZXBXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZUxlZnQgfSBmcm9tICcuL21lcmdlTGVmdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VSaWdodCB9IGZyb20gJy4vbWVyZ2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWVyZ2VXaXRoIH0gZnJvbSAnLi9tZXJnZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG1lcmdlV2l0aEtleSB9IGZyb20gJy4vbWVyZ2VXaXRoS2V5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtaW4gfSBmcm9tICcuL21pbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbWluQnkgfSBmcm9tICcuL21pbkJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBtb2R1bG8gfSBmcm9tICcuL21vZHVsbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbW92ZSB9IGZyb20gJy4vbW92ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbkFyeSB9IGZyb20gJy4vbkFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbmVnYXRlIH0gZnJvbSAnLi9uZWdhdGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG5vbmUgfSBmcm9tICcuL25vbmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG50aCB9IGZyb20gJy4vbnRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBudGhBcmcgfSBmcm9tICcuL250aEFyZydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgbyB9IGZyb20gJy4vbydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgb2JqT2YgfSBmcm9tICcuL29iak9mJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvZiB9IGZyb20gJy4vb2YnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG9uY2UgfSBmcm9tICcuL29uY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIG90aGVyd2lzZSB9IGZyb20gJy4vb3RoZXJ3aXNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBvdmVyIH0gZnJvbSAnLi9vdmVyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYWlyIH0gZnJvbSAnLi9wYWlyJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsIH0gZnJvbSAnLi9wYXJ0aWFsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJ0aWFsUmlnaHQgfSBmcm9tICcuL3BhcnRpYWxSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGFydGl0aW9uIH0gZnJvbSAnLi9wYXJ0aXRpb24nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhFcSB9IGZyb20gJy4vcGF0aEVxJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXRoT3IgfSBmcm9tICcuL3BhdGhPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aFNhdGlzZmllcyB9IGZyb20gJy4vcGF0aFNhdGlzZmllcydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0FsbCB9IGZyb20gJy4vcGlja0FsbCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlja0J5IH0gZnJvbSAnLi9waWNrQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGUgfSBmcm9tICcuL3BpcGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBpcGVLIH0gZnJvbSAnLi9waXBlSydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcGlwZVAgfSBmcm9tICcuL3BpcGVQJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwaXBlV2l0aCB9IGZyb20gJy4vcGlwZVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHBsdWNrIH0gZnJvbSAnLi9wbHVjaydcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZCB9IGZyb20gJy4vcHJlcGVuZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvZHVjdCB9IGZyb20gJy4vcHJvZHVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvamVjdCB9IGZyb20gJy4vcHJvamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcEVxIH0gZnJvbSAnLi9wcm9wRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHByb3BJcyB9IGZyb20gJy4vcHJvcElzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wT3IgfSBmcm9tICcuL3Byb3BPcidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcHMgfSBmcm9tICcuL3Byb3BzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBwcm9wU2F0aXNmaWVzIH0gZnJvbSAnLi9wcm9wU2F0aXNmaWVzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByYW5nZSB9IGZyb20gJy4vcmFuZ2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZSB9IGZyb20gJy4vcmVkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2VCeSB9IGZyb20gJy4vcmVkdWNlQnknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZWQgfSBmcm9tICcuL3JlZHVjZWQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZVJpZ2h0IH0gZnJvbSAnLi9yZWR1Y2VSaWdodCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVkdWNlV2hpbGUgfSBmcm9tICcuL3JlZHVjZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZWplY3QgfSBmcm9tICcuL3JlamVjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgcmVtb3ZlIH0gZnJvbSAnLi9yZW1vdmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHJlcGVhdCB9IGZyb20gJy4vcmVwZWF0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXBsYWNlIH0gZnJvbSAnLi9yZXBsYWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyByZXZlcnNlIH0gZnJvbSAnLi9yZXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzY2FuIH0gZnJvbSAnLi9zY2FuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXF1ZW5jZSB9IGZyb20gJy4vc2VxdWVuY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNldCB9IGZyb20gJy4vc2V0J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzbGljZSB9IGZyb20gJy4vc2xpY2UnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnQgfSBmcm9tICcuL3NvcnQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNvcnRCeSB9IGZyb20gJy4vc29ydEJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyBzb3J0V2l0aCB9IGZyb20gJy4vc29ydFdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHNwbGl0IH0gZnJvbSAnLi9zcGxpdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRBdCB9IGZyb20gJy4vc3BsaXRBdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRFdmVyeSB9IGZyb20gJy4vc3BsaXRFdmVyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3BsaXRXaGVuIH0gZnJvbSAnLi9zcGxpdFdoZW4nXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN0YXJ0c1dpdGggfSBmcm9tICcuL3N0YXJ0c1dpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHN1YnRyYWN0IH0gZnJvbSAnLi9zdWJ0cmFjdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZSB9IGZyb20gJy4vc3ltbWV0cmljRGlmZmVyZW5jZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgc3ltbWV0cmljRGlmZmVyZW5jZVdpdGggfSBmcm9tICcuL3N5bW1ldHJpY0RpZmZlcmVuY2VXaXRoJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWlsIH0gZnJvbSAnLi90YWlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlIH0gZnJvbSAnLi90YWtlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YWtlTGFzdCB9IGZyb20gJy4vdGFrZUxhc3QnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VMYXN0V2hpbGUgfSBmcm9tICcuL3Rha2VMYXN0V2hpbGUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRha2VXaGlsZSB9IGZyb20gJy4vdGFrZVdoaWxlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0YXAgfSBmcm9tICcuL3RhcCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGVzdCB9IGZyb20gJy4vdGVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGhlbiB9IGZyb20gJy4vdGhlbidcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdGh1bmtpZnkgfSBmcm9tICcuL3RodW5raWZ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0aW1lcyB9IGZyb20gJy4vdGltZXMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvTG93ZXIgfSBmcm9tICcuL3RvTG93ZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnMgfSBmcm9tICcuL3RvUGFpcnMnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvUGFpcnNJbiB9IGZyb20gJy4vdG9QYWlyc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1N0cmluZyB9IGZyb20gJy4vdG9TdHJpbmcnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRvVXBwZXIgfSBmcm9tICcuL3RvVXBwZXInXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHRyYW5zZHVjZSB9IGZyb20gJy4vdHJhbnNkdWNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmFuc3Bvc2UgfSBmcm9tICcuL3RyYW5zcG9zZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tICcuL3RyYXZlcnNlJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cmltIH0gZnJvbSAnLi90cmltJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB0cnlDYXRjaCB9IGZyb20gJy4vdHJ5Q2F0Y2gnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXBwbHkgfSBmcm9tICcuL3VuYXBwbHknXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuYXJ5IH0gZnJvbSAnLi91bmFyeSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jdXJyeU4gfSBmcm9tICcuL3VuY3VycnlOJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmZvbGQgfSBmcm9tICcuL3VuZm9sZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb25XaXRoIH0gZnJvbSAnLi91bmlvbldpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXEgfSBmcm9tICcuL3VuaXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVuaXFCeSB9IGZyb20gJy4vdW5pcUJ5J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bmlxV2l0aCB9IGZyb20gJy4vdW5pcVdpdGgnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHVubGVzcyB9IGZyb20gJy4vdW5sZXNzJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1bm5lc3QgfSBmcm9tICcuL3VubmVzdCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdW50aWwgfSBmcm9tICcuL3VudGlsJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB1cGRhdGUgfSBmcm9tICcuL3VwZGF0ZSdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlV2l0aCB9IGZyb20gJy4vdXNlV2l0aCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzSW4gfSBmcm9tICcuL3ZhbHVlc0luJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB2aWV3IH0gZnJvbSAnLi92aWV3J1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVuIH0gZnJvbSAnLi93aGVuJ1xuLy8gZXhwb3J0IHsgZGVmYXVsdCBhcyB3aGVyZSB9IGZyb20gJy4vd2hlcmUnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdoZXJlRXEgfSBmcm9tICcuL3doZXJlRXEnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhvdXQgfSBmcm9tICcuL3dpdGhvdXQnXG4vLyBleHBvcnQgeyBkZWZhdWx0IGFzIHhwcm9kIH0gZnJvbSAnLi94cHJvZCdcbi8vIGV4cG9ydCB7IGRlZmF1bHQgYXMgemlwT2JqIH0gZnJvbSAnLi96aXBPYmonXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFkZCB9IGZyb20gJy4vbnVtYmVyL2FkZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRkSW5kZXggfSBmcm9tICcuL2FkZEluZGV4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGp1c3QgfSBmcm9tICcuL2FkanVzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWRqdXN0V2l0aCB9IGZyb20gJy4vYWRqdXN0V2l0aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYWxsIH0gZnJvbSAnLi9hbGwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsbFBhc3MgfSBmcm9tICcuL2FsbFBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFsd2F5cyB9IGZyb20gJy4vYWx3YXlzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhbmQgfSBmcm9tICcuL2FuZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW55IH0gZnJvbSAnLi9hbnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFueVBhc3MgfSBmcm9tICcuL2FueVBhc3MnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwIH0gZnJvbSAnLi9hcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwZW5kIH0gZnJvbSAnLi9hcHBlbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFwcGx5IH0gZnJvbSAnLi9hcHBseSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYmluYXJ5IH0gZnJvbSAnLi9iaW5hcnknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJpbmQgfSBmcm9tICcuL2JpbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJvdGggfSBmcm9tICcuL2Jvb2xlYW4vYm90aCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2FsbCB9IGZyb20gJy4vY2FsbCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcGxlbWVudCB9IGZyb20gJy4vY29tcGxlbWVudCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29tcG9zZSB9IGZyb20gJy4vY29tcG9zZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29uY2F0IH0gZnJvbSAnLi9jb25jYXQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbmQgfSBmcm9tICcuL2NvbmQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGN1cnJ5IH0gZnJvbSAnLi9jdXJyeSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVmYXVsdFRvIH0gZnJvbSAnLi9kZWZhdWx0VG8nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRpZmZEYXRlIH0gZnJvbSAnLi9kYXRlL2RpZmZEYXRlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkaXZpZGUgfSBmcm9tICcuL251bWJlci9kaXZpZGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGVtcHR5IH0gZnJvbSAnLi9lbXB0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXF1YWxzIH0gZnJvbSAnLi9lcXVhbHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGV4aXN0cyB9IGZyb20gJy4vZXhpc3RzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGIH0gZnJvbSAnLi9ib29sZWFuL0YnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kSW5kZXggfSBmcm9tICcuL2ZpbmRJbmRleCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmlyc3QgfSBmcm9tICcuL2ZpcnN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0TWFwIH0gZnJvbSAnLi9mbGF0TWFwJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb2xkIH0gZnJvbSAnLi9mb2xkJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JtYXRTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9mb3JtYXRTdHJpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhcyB9IGZyb20gJy4vb2JqZWN0L2hhcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGFzSW4gfSBmcm9tICcuL29iamVjdC9oYXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaWRlbnRpY2FsIH0gZnJvbSAnLi9pZGVudGljYWwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlkZW50aXR5IH0gZnJvbSAnLi9pZGVudGl0eSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXMgfSBmcm9tICcuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0FycmF5IH0gZnJvbSAnLi9hcnJheS9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNCb29sZWFuIH0gZnJvbSAnLi9ib29sZWFuL2lzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0RhdGUgfSBmcm9tICcuL2RhdGUvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRnV0dXJlRGF0ZSB9IGZyb20gJy4vZGF0ZS9pc0Z1dHVyZURhdGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTWFwIH0gZnJvbSAnLi9tYXAvaXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTmFuIH0gZnJvbSAnLi9udW1iZXIvaXNOYW4nXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTnVsbCB9IGZyb20gJy4vbnVsbC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdW1iZXIgfSBmcm9tICcuL251bWJlci9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNPYmplY3QgfSBmcm9tICcuL29iamVjdC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTZXQgfSBmcm9tICcuL3NldC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTdHJpbmcgfSBmcm9tICcuL3N0cmluZy9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNVbmRlZmluZWQgfSBmcm9tICcuL3VuZGVmaW5lZC9pcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNWYWxpZERhdGUgfSBmcm9tICcuL2RhdGUvaXNWYWxpZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSnVzdCB9IGZyb20gJy4vbW9uYWRzL0p1c3QnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXMgfSBmcm9tICcuL2tleXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGtleXNJbiB9IGZyb20gJy4vb2JqZWN0L2tleXNJbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGFzdCB9IGZyb20gJy4vbGFzdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlmdCB9IGZyb20gJy4vbGlmdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwIH0gZnJvbSAnLi9tYXAnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG1heCB9IGZyb20gJy4vbWF4J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXliZSB9IGZyb20gJy4vbW9uYWRzL01heWJlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZXJnZSB9IGZyb20gJy4vb2JqZWN0L21lcmdlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtdWx0aXBseSB9IGZyb20gJy4vbnVtYmVyL211bHRpcGx5J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBub3QgfSBmcm9tICcuL25vdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTm90aGluZyB9IGZyb20gJy4vbW9uYWRzL05vdGhpbmcnXG5leHBvcnQgeyBkZWZhdWx0IGFzIG9taXQgfSBmcm9tICcuL29iamVjdC9vbWl0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvciB9IGZyb20gJy4vb3InXG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhdGggfSBmcm9tICcuL29iamVjdC9wYXRoJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwaWNrIH0gZnJvbSAnLi9vYmplY3QvcGljaydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJvcCB9IGZyb20gJy4vb2JqZWN0L3Byb3AnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHN1bSB9IGZyb20gJy4vbnVtYmVyL3N1bSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVCB9IGZyb20gJy4vYm9vbGVhbi9UJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0RheSB9IGZyb20gJy4vZGF0ZS90b0RheSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9Ib3VyIH0gZnJvbSAnLi9kYXRlL3RvSG91cidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9NaW51dGVzIH0gZnJvbSAnLi9kYXRlL3RvTWludXRlcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TZWNvbmRzIH0gZnJvbSAnLi9kYXRlL3RvU2Vjb25kcydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJ1dGh5IH0gZnJvbSAnLi90cnV0aHknXG5leHBvcnQgeyBkZWZhdWx0IGFzIHR5cGUgfSBmcm9tICcuL3R5cGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVuaW9uIH0gZnJvbSAnLi9hcnJheS91bmlvbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsdWVzIH0gZnJvbSAnLi9vYmplY3QvdmFsdWVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB6aXAgfSBmcm9tICcuL3ppcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgemlwV2l0aCB9IGZyb20gJy4vemlwV2l0aCdcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnTnVtYmVyJylcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGJvdGggcHJlZGljYXRlcyBhcmUgdHJ1ZVxuICpcbiAqIEBmdW5jdGlvbiBhbmRcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYm90aCBwcmVkaWNhdGVzIGFyZSB0cnVlXG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAc2lnICh4LCB5KSAtPiBib29sZWFuXG4gKiBAcGFyYW0geyp9IHggLSBBIHByZWRpY2F0ZVxuICogQHBhcmFtIHsqfSB5IC0gQSBwcmVkaWNhdGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gYW5kICh4LCB5KSB7XG4gIHJldHVybiB4ICYmIHlcbn0pXG4iLCIvKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNBcnJheVxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGFuIGFycmF5LCBhdXRvY3VycmllZCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBPYmplY3QgdG8gdmVyaWZpeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBpc0FycmF5KFsxLDEsMV0pXG4gKiAvLyByZXN1bHQgPSB0cnVlXG4gKi9cblxuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnQXJyYXknKVxuIiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGRpZXJpY2t4LmxlbiBvbiAwMS8wNC8yMDE3LlxuICovXG4vKipcbiAqIENyZWF0ZWQgYnkgZGllcmlja3gubGVuIG9uIDAxLzA0LzIwMTcuXG4gKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0RhdGUnKVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGVxdWFsc0FycmF5XG4gKiBAZGVzY3JpcHRpb24gQXV0b2N1cnJpZWQgZnVuY3Rpb24gZm9yIGRlZXAgY29tcGFyaXNvbiBvZiBhcnJheXNcbiAqIEBwYXJhbSB7YX0geCAtIE9iamVjdCB0byBjb21wYXJlIG9mIHR5cGUgYVxuICogQHBhcmFtIHthfSB5IC0gT2JqZWN0IHggdG8gY29tcGFyZSB3aXRoIG9iamVjdCB4XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHNBcnJheSAoeCwgeSkge1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vdChlcXVhbHMoeFtpXSwgeVtpXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiIsIi8qKlxuXG4gKiBlcXVhbHNcbiAqIGNoZWNrcyBmb3IgZXF1YWxpdHlcbiAqL1xuaW1wb3J0IGN1cnJ5IGZyb20gJy4uL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuLi9leGlzdHMnXG5pbXBvcnQgbm90IGZyb20gJy4uL25vdCdcbmltcG9ydCBlcXVhbHMgZnJvbSAnLi4vZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeSgoeCwgeSkgPT4ge1xuICBmb3IgKGxldCBrZXlYIGluIHgpIHtcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbmZpbHRlcmVkRm9ySW5Mb29wXG4gICAgaWYgKG5vdChlcXVhbHMoeFtrZXlYXSwgeVtrZXlYXSkpKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAobGV0IGtleVkgaW4geSkge1xuICAgIGlmIChub3QoZXhpc3RzKHhba2V5WV0pKSAmJiBleGlzdHMoeVtrZXlZXSkpIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn0pXG4iLCIvKipcblxuICogQGZ1bmN0aW9uIGVxdWFsc1xuICogQGRlc2NyaXB0aW9uIEF1dG9jdXJyaWVkIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBlcXVhbGl0eSBvZiAyIGl0ZW1zXG4gKiBAcGFyYW0geyp9IHggLSBMZWZ0IHNpZGUgb2YgdGhlIGVxdWFsaXR5IGNoZWNrXG4gKiBAcGFyYW0geyp9IHkgLSBSaWdodCBzaWRlIG9mIHRoZSBlcXVhbGl0eSBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbmFuID0gTnVtYmVyLk5hTlxuICogZXF1YWwobmFuLCBuYW4pIC8vIHJldHVybnMgdHJ1ZVxuICpcbiAqIGNvbnN0IGFycjEgPSBbMCwgMSwgMiwgM11cbiAqIGNvbnN0IGFycjIgPSBbbnVsbCwgMSwgMiwgM11cbiAqIGVxdWFscyhhcnIxLCBhcnIyKSAvLyByZXR1cm5zIGZhbHNlXG4gKlxuICogZXF1YWxzKG5ldyBPYmplY3QoeydhJzogMCwgJ2InOiAxfSksIHsnYSc6IDAsICdiJzogMX0pIC8vIHRydWVcbiAqXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuaW1wb3J0IGV4aXN0cyBmcm9tICcuL2V4aXN0cydcbmltcG9ydCBpZGVudGljYWwgZnJvbSAnLi9pZGVudGljYWwnXG5pbXBvcnQgdHlwZSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgbm90IGZyb20gJy4vbm90J1xuaW1wb3J0IG9yIGZyb20gJy4vb3InXG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9vYmplY3QvaXMnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2FycmF5L2lzJ1xuaW1wb3J0IGlzQm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4vaXMnXG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9udW1iZXIvaXMnXG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9zdHJpbmcvaXMnXG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vZGF0ZS9pcydcbmltcG9ydCBlcXVhbHNBcnJheSBmcm9tICcuL2FycmF5L2VxdWFscydcbmltcG9ydCBlcXVhbHNPYmplY3QgZnJvbSAnLi9vYmplY3QvZXF1YWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBlcXVhbHMgKHgsIHkpIHtcbiAgaWYgKGlkZW50aWNhbCh4LCB5KSkgcmV0dXJuIHRydWVcblxuICBpZiAodHlwZSh4KSAhPT0gdHlwZSh5KSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKG9yKG5vdChleGlzdHMoeCkpLCBub3QoZXhpc3RzKHkpKSkpIHJldHVybiBmYWxzZVxuXG4gIGlmICh4LmNvbnN0cnVjdG9yICE9PSB5LmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2VcblxuICBpZiAoaXNTdHJpbmcoeCkgfHwgaXNCb29sZWFuKHgpIHx8IGlzTnVtYmVyKHgpIHx8IGlzRGF0ZSh4KSkge1xuICAgIHJldHVybiBpZGVudGljYWwoeC52YWx1ZU9mKCksIHkudmFsdWVPZigpKVxuICB9XG4gIGlmIChpc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIGVxdWFsc0FycmF5KHgsIHkpXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoeCkpIHtcbiAgICByZXR1cm4gZXF1YWxzT2JqZWN0KHgsIHkpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNOYU5cbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgbnVtYmVyIGlzIE5BTlxuXG4gKi9cbmltcG9ydCBpc051bWJlciBmcm9tICcuL2lzJ1xuaW1wb3J0IGFuZCBmcm9tICcuLi9hbmQnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTmFuICh4KSB7XG4gIHJldHVybiBhbmQoaXNOdW1iZXIoeCksIGlzTmFOKHgpKVxufTtcbiIsIi8qKlxuICogQGZ1bmN0aW9uIG1hcFxuICogQGRlc2NyaXB0aW9uIE1hcHMgb3ZlciBhbiBhcnJheSBhbmQgYXBwbGllcyBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICogQHBhcmFtIHtJdGVyYWJsZX0gYVxuICogQHJldHVybiB7SXRlcmFibGV9XG4gKiBAc2luY2UgdjEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoaWRlbnRpdHksIFswLDIsM10pXG4gKiAgLy8gcmVzdWx0ID0gWzAsMiwzXVxuICogIGNvbnN0IGFkZDIgPSBhZGQoMilcbiAqICBjb25zdCByZXN1bHQgPSBtYXAoYWRkMiwgWzAsMiwzXSlcbiAqICAvLyByZXN1bHQgPSBbMiw0LDVdXG4gKiovXG5pbXBvcnQgY3VycnkgZnJvbSAnLi4vY3VycnknXG5cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KGZ1bmN0aW9uIG1hcCAoY2IsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgY29uc3QgciA9IG5ldyBBcnJheShsKVxuICB3aGlsZSAoKytpIDwgbCkge1xuICAgIHJbaV0gPSBjYihhW2ldLCBpLCBhKVxuICB9XG4gIHJldHVybiByXG59KVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gb3JcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgb25lIG9yIHRoZSBvdGhlciBpcyB0cnVlXG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuL2N1cnJ5J1xuXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiBvciAoeCwgeSkge1xuICByZXR1cm4geCB8fCB5XG59KVxuIiwiLyoqXG4gKiBDdXJyaWVkIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGEgYm9vbGVhblxuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gaXNcbiAqIEBkZXNjcmlwdGlvbiBDdXJyaWVkIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgb2YgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGEgYm9vbGVhblxuICogQHNpbmNlIHYxLjAuMlxuICogQHBhcmFtIHsqfSBJdGVtIHRvIHZlcmlmeVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqKi9cbmltcG9ydCBpcyBmcm9tICcuLi9pcydcblxuZXhwb3J0IGRlZmF1bHQgaXMoJ0Jvb2xlYW4nKVxuIiwiLyoqXG5cbiAqL1xuaW1wb3J0IGlzIGZyb20gJy4uL2lzJ1xuXG5leHBvcnQgZGVmYXVsdCBpcygnU3RyaW5nJylcbiIsIi8qKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNpbmdsZSBpdGVtIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcHJvdmlkZWQgYXJyYXkgYW5kIGNhbGxpbmcgYW4gaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Y2JGdW5jdGlvbn0gY2IgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGl0ZW1cbiAqIEBwYXJhbSB7Kn0gaW5pdCAtIEluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IGEgLSBBcnJheSB3aXRoIGl0ZW1zIHRvIG1vZGlmeSBieSB0aGUgY2IgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFsaWFzIHJlZHVjZVxuICogQHNpbmNlIDEuMC4yXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvbGQoYWRkLCAwLCBbMSwxLDFdKVxuICogLy8gcmVzdWx0ID0gM1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNiRnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gciAtIEFjY3VtdWxhdG9yIHdoaWNoIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSB0aGUgaW5kZXkgb2YgdGhlIGl0ZW0gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge0FycmF5fSBhIC0gVGhlIGluaXRpYWwgYXJyYXlcbiAqIEByZXR1cm4geyp9XG4gKi9cbmltcG9ydCBjdXJyeSBmcm9tICcuLi9jdXJyeSdcblxuZXhwb3J0IGRlZmF1bHQgY3VycnkoZnVuY3Rpb24gZm9sZCAoY2IsIGluaXQsIGEpIHtcbiAgbGV0IGkgPSAtMVxuICBjb25zdCBsID0gYS5sZW5ndGhcbiAgbGV0IHIgPSBpbml0XG4gIHdoaWxlICgrK2kgPCBsKSB7XG4gICAgciA9IGNiKHIsIGFbaV0sIGksIGEpXG4gIH1cbiAgcmV0dXJuIHJcbn0pXG4iLCJpbXBvcnQgY3VycnkgZnJvbSAnZnVuLmpzL3NyYy9jdXJyeSdcbmltcG9ydCBtYXAgZnJvbSAnZnVuLmpzL3NyYy9tYXAnXG5pbXBvcnQgZm9sZCBmcm9tICdmdW4uanMvc3JjL2ZvbGQnXG5pbXBvcnQgZXF1YWxzIGZyb20gJ2Z1bi5qcy9zcmMvZXF1YWxzJ1xuaW1wb3J0IGNvbmNhdCBmcm9tICd1dGlsL2NvbmNhdCdcbmltcG9ydCBlbXB0eSBmcm9tICd1dGlsL2VtcHR5J1xuaW1wb3J0IGRvdCBmcm9tICd1dGlsL2RvdCdcbmltcG9ydCBpZGVudGl0eSBmcm9tICd1dGlsL2lkZW50aXR5J1xuaW1wb3J0IHRyYW5zcG9zZSBmcm9tICd1dGlsL3RyYW5zcG9zZSdcbmltcG9ydCBnZW5lcmF0ZSBmcm9tICd1dGlsL2dlbmVyYXRlJ1xuLy8gaW1wb3J0IGdwdW1hcCBmcm9tICd1dGlsL2dwdW1hcCdcbi8vIGltcG9ydCBncHVmb2xkIGZyb20gJ3V0aWwvZ3B1Zm9sZCdcbi8vIGltcG9ydCBncHVwcm9kdWN0IGZyb20gJ3V0aWwvZ3B1cHJvZHVjdCdcblxuLyoqXG4gKiBAY2xhc3MgTWF0cml4XG4gKiBAY2xhc3NkZXNjIE1hdHJpeCBhcHBsaWNhdGl2ZSBwcm92aWRpbmcgc3RhbmRhcmQgbWF0cml4IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoZSBNYXRyaXggY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgbmV3IGtleXdvcmQuIEluc3RlYWQgdXNlIHRoZSBNYXRyaXgub2Ygc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBNYXRyaXguIFVuZm9ydHVuYXRseSBqc2RvY3MgZG9lcyBub3QgYWxsb3cgZm9yIHRoZSBjb25zdHJ1Y3RvciB0byBiZSBoaWRkZW4uXG4gKiBAaGlkZWNvbnRydWN0b3JcbiAqIEBzZWUgb2ZcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqXG4gKi9cbmxldCBNYXRyaXggPSBmdW5jdGlvbiAodmFsKSB7XG4gIHRoaXMuX192YWx1ZSA9IHZhbFxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBvZlxuICogQGRlc2MgQ3JlYXRlcyBhIE1hdHJpeCBvYmplY3QgYW5kIGZsYXR0ZW5zIHRoZSBNYXRyaXhcbiAqIEBwYXJhbSB2YWwge2FycmF5fGZ1bmN0aW9ufSBBbiBhcnJheSBvZiBhcnJheXNcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IG0gPSAgTWF0cml4Lm9mKFtbMSwyXSxbMiwzXSxbNCw1XV0pXG4gKlxuICovXG5NYXRyaXgub2YgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBNYXRyaXgpIHJldHVybiB2YWxcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICB0aGlzLl9fdmFsdWUgPSB2YWxcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHJldHVybiBuZXcgTWF0cml4KHZhbClcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0udHlwZSA9PT0gJ01hdHJpeCdcbiAqL1xuTWF0cml4LnByb3RvdHlwZS50eXBlID0gJ01hdHJpeCdcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJlY2lzaW9uXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBtID0gIE1hdHJpeC5vZihbWzEsMl0sWzIsM10sWzQsNV1dKVxuICogbS5wcmVjaXNpb24gPT09IDRcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5wcmVjaXNpb24gPSA0XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHNldFByZWNpc2lvblxuICogQHBhcmFtIHByZWNpc2lvbiB7bnVtYmVyfSBTZXQgdGhlIG51bWJlciBvZiBkZWNpbWFscyBmb3Igcm91bmRpbmdcbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9ICBNYXRyaXgub2YoW1sxLDJdLFsyLDNdLFs0LDVdXSlcbiAqIG0uc2V0UHJlY2lzaW9uKDEwKVxuICogbS5wcmVjaXNpb24gPT09IDEwXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc2V0UHJlY2lzaW9uID0gZnVuY3Rpb24gKHByZWNpc2lvbikge1xuICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvblxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpc1N5bW1ldHJpY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIHRydWUgPT09IEEuaXNTeW1tZXRyaWMoKVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc1N5bW1ldHJpYyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYSA9IHRoaXMuX192YWx1ZVxuICBjb25zdCBiID0gTWF0cml4LnRyYW5zcG9zZSh0aGlzKS5fX3ZhbHVlXG4gIHJldHVybiBlcXVhbHMoYSwgYilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNTcXVhcmVcbiAqIEBkZXNjIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY29udGFpbnMgYSBzcXVhcmUgTWF0cml4XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogdHJ1ZSA9PT0gQS5pc1NxdWFyZSgpXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmlzU3F1YXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZXF1YWxzKHRoaXMuZ2V0Q29scygpLCB0aGlzLmdldFJvd3MoKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgaXNPcnRob2dvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IFtbLTAuMzA5MiwgLTAuOTUxMF0sIFstMC45NTEwLCAwLjMwOTJdXVxuICogY29uc3QgQSA9IE1hdHJpeC5mcm9tQXJyYXkocmVzdWx0KVxuICogdHJ1ZSAgPT09IEEuaXNPcnRob2dvbmFsKClcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5pc09ydGhvZ29uYWwgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEF4QXQgPSB0aGlzLmRvdCh0aGlzLnRyYW5zcG9zZSgpKVxuICBjb25zdCBJID0gdGhpcy5pZGVudGl0eSgpXG4gIHJldHVybiBlcXVhbHMoQXhBdCwgSSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZ2V0Q29sc1xuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogQS5nZXRDb2xzKCkgID09PSAyXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldENvbHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWVbMF0ubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGVxdWFsc1xuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX1cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYSA9IFtbMSwgMV0sIFsxLCAxXV1cbiAqIHZhciBBID0gTWF0cml4Lm9mKGEpXG4gKiB2YXIgQiA9IE1hdHJpeC5vZihhKVxuICogdHJ1ZSAgPT09IEEuZXF1YWxzKEIpXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIGVxdWFscyh0aGlzLl9fdmFsdWUsIE0uX192YWx1ZSB8fCBNKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBnZXRSb3dzXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pXG4gKiBBLmdldFJvd3MoKSAgLy8gMlxuICovXG5NYXRyaXgucHJvdG90eXBlLmdldFJvd3MgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGdldFNoYXBlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAxXSwgWzEsIDFdXSlcbiAqIEEuZ2V0U2hhcGUoKSAgLy8gWzIsIDJdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZ2V0U2hhcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbdGhpcy5nZXRSb3dzKCksIHRoaXMuZ2V0Q29scygpXVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBtYXBcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMSwgMV1dKVxuICogbS5tYXAoeCA9PiB4Lm1hcCh5ID0+IHkrIDEpKVxuICogLy8gW1syLCAyXSwgWzIsIDJdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKG1hcChmKSh0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBtYXBcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgZnVuY3Rpb24gdGhhdCBtYXBzIG92ZXIgdGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCB1c2luZyBhIG1hcCBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBbiBpdGVyYXRvciBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX0gTWF0cml4IG9yIGFycmF5IHRvIG1hcFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgbSA9IE1hdHJpeC5tYXAoeD0gPiB4Lm1hcCh5ID0+IHkrIDEpLCBbWzEsIDFdLCBbMSwgMV1dKVxuICogLy8gW1syLCAyXSwgWzIsIDJdXVxuICpcbiAqL1xuTWF0cml4Lm1hcCA9IGN1cnJ5KGZ1bmN0aW9uIChmLCBNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkubWFwKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmb2xkXG4gKiBAZGVzY3JpcHRpb24gUmVkdWNlIHRoZSBtYXRyaXggcm93cyB1c2luZyBhIHJlZHVjZSBmdW5jdGlvblxuICogQHBhcmFtIGYge2Z1bmN0aW9ufSBBIHJlZHVjZS9mb2xkIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBGbGF0dGVuIE1hdHJpeFxuICogTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV0pLmZvbGQoKHByZXYsIG5leHQpID0+IHByZXYuY29uY2F0KG5leHQpKVxuICogLy8gWzEsIDEsIDEsIDFdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZm9sZChmLCBbXSkodGhpcy5fX3ZhbHVlKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gZm9sZFxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyBmdW5jdGlvbiB0byByZWR1Y2UgdGhlIG1hdHJpeCByb3dzIHVzaW5nIGEgcmVkdWNlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEEgcmVkdWNlL2ZvbGQgZnVuY3Rpb25cbiAqIEBwYXJhbSBNIHtNYXRyaXh9IFRoZSBNYXRyaXggdG8gcmVkdWNlXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcblxuICogLy8gU3VtIG9mIGFsbCBtYXRyaXggdmFsdWVzXG4gKiBjb25zdCByZWR1Y2VyID0gKHByZXYsIG5leHQpID0+IE51bWJlcihwcmV2KSArIG5leHQucmVkdWNlKChhY2MsIHgpID0+IGFjYyArIHgsIDApXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwgMV0sIFsxLCAxXV1cbiAqIE1hdHJpeC5mb2xkKHJlZHVjZXIsIEEpXG4gKiAvLyA0XG4gKi9cbk1hdHJpeC5mb2xkID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5mb2xkKGYpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBhcFxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBNYXRyaXggdG8gYSBmdW5jdGlvblxuICogQHBhcmFtIE0ge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGYgPSB4ID0+IHgucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dClcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbNywgOCwgOV1dKVxuICogTWF0cml4Lm9mKGYpLmFwKE0pXG4gKiAvLyBbWzZdLCBbMTVdLCBbMjRdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYXAgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKE0pLm1hcCh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGFwXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIE1hdHJpeCB0byBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259XG4gKiBAcGFyYW0gTSB7TWF0cml4fGFycmF5fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZiA9IHggPT4geC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0KVxuICogTWF0cml4LmFwKGYsIFtbMSwgMiwgM10sIFs0LCA1LCA2XSwgWzcsIDgsIDldXSlcbiAqIC8vIFtbNl0sIFsxNV0sIFsyNF1cbiAqL1xuTWF0cml4LmFwID0gY3VycnkoZnVuY3Rpb24gKGYsIE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihmKS5hcChNKVxufSlcblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY29uY2F0XG4gKiBAZGVzY3JpcHRpb24gQ29uY2F0ZW5hdGVzIDIgTWF0cmljZXMgdXNpbmcgYSBmdW5jdGlvbiBhcyBvcGVyYXRvclxuICogQHBhcmFtIE0ge01hdHJpeH1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzAsIDEsIDFdLCBbMiwgMywgNF1dXG4gKiBjb25zdCBiID0gW1syLCAyLCAyXSwgWzMsIDMsIDNdXVxuICogY29uc3QgQSA9IE1hdHJpeC5vZihhKVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihiKVxuICogY29uc3QgTSA9IEEuY29uY2F0KEIpXG4gKiAvLyBbWzAsIDEsIDEsIDIsIDIsIDJdLCBbMiwgMywgNCwgMywgMywgM11dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIChNLCBmID0gY29uY2F0KSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKGYoTSkpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGNvbmNhdFxuICogQGRlc2NyaXB0aW9uIENvbmNhdGVuYXRlcyAyIE1hdHJpY2VzIHVzaW5nIGEgZnVuY3Rpb24gYXMgb3BlcmF0b3JcbiAqIEBwYXJhbSBBIHtNYXRyaXh9XG4gKiBAcGFyYW0gQiB7TWF0cml4fVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgYSA9IFtbMCwgMSwgMV0sIFsyLCAzLCA0XV1cbiAqIGNvbnN0IGIgPSBbWzIsIDIsIDJdLCBbMywgMywgM11dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKiBjb25zdCBNID0gTWF0cml4LmNvbmNhdChBLCBCKVxuICogLy8gW1swLCAxLCAxLCAyLCAyLCAyXSwgWzIsIDMsIDQsIDMsIDMsIDNdXVxuICpcbiAqL1xuTWF0cml4LmNvbmNhdCA9IGN1cnJ5KGZ1bmN0aW9uIChBLCBCLCBmID0gY29uY2F0KSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkubWFwKGYoQikpXG59KVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybiBhbiBlbXB0eSBNYXRyaXggZnJvbSBhbiBleGlzdGluZyBNYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykubWFwKGVtcHR5KVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBzdGF0aWNcbiAqIEBmdW5jdGlvbiBlbXB0eVxuICogQGRlc2NyaXB0aW9uIFJldHVybiBhbiBlbXB0eSBNYXRyaXggZnJvbSBhbiBleGlzdGluZyBNYXRyaXhcbiAqIEBwYXJhbSByb3dzIHtudW1iZXJ9XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LmVtcHR5ID0gY3VycnkoZnVuY3Rpb24gKHJvd3MgPSAwLCBjb2xzID0gMCkge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scykgLy8gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkocm93cykpLm1hcCh4ID0+IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KGNvbHMpKSlcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5tYXAoZW1wdHkpXG59KVxuXG4vLyAjIyMjICMjIyMgIyMjIyAvL1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBpZGVudGl0eVxuICogQGRlc2MgUmV0dXJucyBhbiBpZGVudGl0eSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBBaWRlbnRpdHkgPSBBLmlkZW50aXR5KClcbiAqIC8vIFtbMSwgMCwgMF0sIFswLCAxLCAwXV1cbiAqXG4qL1xuTWF0cml4LnByb3RvdHlwZS5pZGVudGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihpZGVudGl0eSkuYXAodGhpcylcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gaWRlbnRpdHlcbiAqIEBkZXNjIFJldHVybnMgYW4gaWRlbnRpdHkgbWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4LmlkZW50aXR5KDMsIDIpXG4gKiAvLyBbWzEsIDAsIDBdLCBbMCwgMSwgMF1dXG4gKlxuICovXG5NYXRyaXguaWRlbnRpdHkgPSBmdW5jdGlvbiAocm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scykgLy8gQXJyYXkuYXBwbHkobnVsbCwgQXJyYXkocm93cykpLm1hcCh4ID0+IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KGNvbHMpKSlcbiAgcmV0dXJuIE1hdHJpeC5vZihpZGVudGl0eSkuYXAobSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgY29tYmluZVxuICogQHNlZSBNYXRyaXguY29uY2F0XG4gKiBAcGFyYW0gTVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS5jb21iaW5lID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZih0aGlzKS5jb25jYXQoTWF0cml4Lm9mKE0pLCBjb25jYXQpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGNvbWJpbmVcbiAqIEBzZWUgTWF0cml4LmNvbmNhdFxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5jb21iaW5lID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5jb25jYXQoTWF0cml4Lm9mKEIpLCBjb25jYXQpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGRvdFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IGJldHdlZW4gMiBtYXRyaWNlc1xuICogQHBhcmFtIE1cbiAqIEBwYXJhbSBmXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBDcmVhdGUgbWF0cml4XG4gKiBjb25zdCBtID0gTWF0cml4Lm9mKFtbMSwgMl0sIFszLCA0XV0pXG4gKlxuICogLy8gR2VuZXJhdGUgaWRlbnRpdHkgbWF0cml4XG4gKiBjb25zdCBJICA9IG0uaWRlbnRpdHkoKSAvLyBbWzEsIDBdLCBbMCwgMV1dXG4gKlxuICogaWYobS5kb3QoSSkuZXF1YWxzKG0pKSB7XG4gKiAgICBjb25zb2xlLmxvZygnRG90IHByb2R1Y3Qgd2l0aCBpZGVudGl0eSBtYXRyaXggcmV0dXJucyB0aGUgc2FtZSBtYXRyaXgnKVxuICogfVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5kb3QgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmNvbmNhdChNYXRyaXgub2YoTSksIGRvdCh0aGlzLnByZWNpc2lvbikpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIGRvdFxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IGJldHdlZW4gMiBtYXRyaWNlc1xuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICogY29uc3QgYSA9IFtbMSwgMiwgM10sIFs0LCA1LCA2XV1cbiAqIGNvbnN0IGIgPSBbWzcsIDhdLCBbOSwgMTBdLCBbMTEsIDEyXV1cbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKGEpXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKGIpXG4gKlxuICogTWF0cml4LmRvdChBLCBCKSAvLyBbWzU4LCA2NF0sIFsxMzksIDE1NF1dXG4gKlxuICovXG5NYXRyaXguZG90ID0gZnVuY3Rpb24gKEEsIEIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihBKS5kb3QoTWF0cml4Lm9mKEIpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBmaWxsXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHRoZSBwcm92aWRlZCBtYXAgZnVuY3Rpb25cbiAqIEBwYXJhbSBmXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkuZmlsbCh4ID0+IDQyKVxuICogLy8gW1s0Miw0Miw0Ml0sIFs0Miw0Miw0Ml0sIFs0Miw0Miw0Ml1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm1hcChtYXAoeCA9PiBmKHgpKSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgemVyb3NcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggemVyb3NcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbMSwyLDNdLCBbMywyLDFdLCBbNCw1LDZdXSkuemVyb3MoKVxuICogLy8gW1swLDAsMF0sIFswLDAsMF0sIFswLDAsMF1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLnplcm9zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoeCA9PiAwKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiB6ZXJvc1xuICogQGRlc2MgRmlsbCB1cCBhbiBlbXB0eSBtYXRyaXggd2l0aCB6ZXJvc1xuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXguemVyb3MoMywgMylcbiAqIC8vIFtbMCwwLDBdLCBbMCwwLDBdLCBbMCwwLDBdXVxuICpcbiAqL1xuTWF0cml4Lnplcm9zID0gZnVuY3Rpb24gKHJvd3MsIGNvbHMpIHtcbiAgY29uc3QgbSA9IGdlbmVyYXRlKHJvd3MsIGNvbHMpXG4gIHJldHVybiBNYXRyaXgub2YobSkuZmlsbCh4ID0+IDApXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIG9uZXNcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggb25lc1xuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsMiwzXSwgWzMsMiwxXSwgWzQsNSw2XV0pLm9uZXMoKVxuICogLy8gW1sxLDEsMV0sIFsxLDEsMV0sIFsxLDEsMV1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm9uZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YodGhpcykuZmlsbCh4ID0+IDEpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIG9uZXNcbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggb25lc1xuICogQHBhcmFtIHJvd3Mge251bWJlcn0gRGVmaW5lcyB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiBAcGFyYW0gY29scyB7bnVtYmVyfSBEZWZpbmVzIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub25lcygxLCAxKVxuICogLy8gW1sxLDEsMV0sIFsxLDEsMV0sIFsxLDEsMV1dXG4gKlxuICovXG5NYXRyaXgub25lcyA9IGZ1bmN0aW9uIChyb3dzLCBjb2xzKSB7XG4gIGNvbnN0IG0gPSBnZW5lcmF0ZShyb3dzLCBjb2xzKVxuICByZXR1cm4gTWF0cml4Lm9mKG0pLmZpbGwoeCA9PiAxKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciByYW5kb21cbiAqIEBkZXNjIEZpbGwgdXAgYW4gZW1wdHkgbWF0cml4IHdpdGggcmFuZG9tIHZhbHVlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gW2YgPSBlID0+IE1hdGgucmFuZG9tKCkgKiAyIC0gMV1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucmFuZG9tID0gZnVuY3Rpb24gKGYgPSBlID0+IE1hdGgucmFuZG9tKCkgKiAyIC0gMSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLmZpbGwoZilcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAZnVuY3Rpb24gcmFuZG9tXG4gKiBAZGVzYyBGaWxsIHVwIGFuIGVtcHR5IG1hdHJpeCB3aXRoIHJhbmRvbSBudW1iZXJzXG4gKiBAcGFyYW0gZiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHdoaWNoIHJldHVybnMgcmFuZG9tIHZhbHVlcy4gRGVmYXVsdCByYW5kb20gdmFsdWVzIGFyZSBiZXR3ZWVuIC0xIGFuZCAxXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfSBEZWZpbmVzIHRoZSByb3dzIG9mIHRoZSBtYXRyaXhcbiAqIEBwYXJhbSBjb2xzIHtudW1iZXJ9IERlZmluZXMgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4LnJhbmRvbSA9IGZ1bmN0aW9uIChmID0gZSA9PiAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKSwgcm93cywgY29scykge1xuICBjb25zdCBtID0gZ2VuZXJhdGUocm93cywgY29scylcbiAgcmV0dXJuIE1hdHJpeC5vZihtKS5maWxsKGYpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHRvQXJyYXlcbiAqIEBkZXNjIFJldHVybnMgdGhlIGFycmF5IGZyb20gdGhlIG1hdHJpeFxuICogQHJldHVybnMge0FycmF5fVxuICovXG5NYXRyaXgucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9fdmFsdWUubWFwKHJvdyA9PiByb3cubWFwKGNvbCA9PiBjb2wpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciBjbG9uZVxuICogQGRlc2MgUmV0dXJucyBhIGNsb25lIG9mIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXguZnJvbUFycmF5KHRoaXMuX192YWx1ZSlcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgZnJvbUFycmF5XG4gKiBAZGVzYyBSZXR1cm5zIGEgTWF0cml4IGZyb20gYW4gYXJyYXlcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuTWF0cml4LmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihtYXAocm93ID0+IG1hcChjb2wgPT4gY29sKShyb3cpKShhcnIpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlciB0cmFuc3Bvc2VcbiAqIEBkZXNjIFJldHVybnMgYSB0cmFuc3Bvc2VkIE1hdHJpeFxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbLTEsIDJdLCBbMywgNF0sIFstOCwgMl0pXG4gKiBjb25zdCBiID0gQS50cmFuc3Bvc2UoKS50b0FycmF5KClcbiAqIC8vIHJldHVybnMgW1stMSwgMywtOF0sIFsyLCA0LCAyXV1cbiAqL1xuTWF0cml4LnByb3RvdHlwZS50cmFuc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRyaXgub2YoZm9sZCh0cmFuc3Bvc2UsIFtdLCB0aGlzLl9fdmFsdWUpKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiB0cmFuc3Bvc2VcbiAqIEBkZXNjIFJldHVybnMgYSB0cmFuc3Bvc2VkIE1hdHJpeFxuICogQHBhcmFtIE0ge01hdHJpeHxhcnJheX0gQSBNYXRyaXggb3IgYSBtYXRyaXggYXJyYXlcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGEgPSBbLTEsIDJdLCBbMywgNF0sIFstOCwgMl1cbiAqIGNvbnN0IGIgPSBNYXRyaXgudHJhbnNwb3NlKGEpLnRvQXJyYXkoKVxuICogLy8gcmV0dXJucyBbWy0xLCAzLC04XSwgWzIsIDQsIDJdXVxuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS50cmFuc3Bvc2UoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBhZGRcbiAqIEBpbnN0YW5jZVxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9IEFkZCBhIE1hdHJpeCBvciBhIG51bWJlclxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEuYWRkKDEpIC8vIFtbNiwgNV1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5hZGQoQikgLy8gW1sxMCwgMTBdXVxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IGFkZCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgodmFsLCBqZHgpID0+IHZhbCArIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggKyBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgc3VidHJhY3RcbiAqIEBpbnN0YW5jZVxuICogQHBhcmFtIE0ge01hdHJpeHxudW1iZXJ9IFN1YnRyYWN0IGEgTWF0cml4IG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwgNF1dKVxuICogQS5zdWJ0cmFjdCgxKSAvLyBbWzQsIDJdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuc3VidHJhY3QoQikgLy8gW1swLCAwXV1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiAoTSkge1xuICBpZiAoTSBpbnN0YW5jZW9mIE1hdHJpeCkge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSAhPT0gTS5nZXRDb2xzKCkgfHwgdGhpcy5nZXRSb3dzKCkgIT09IE0uZ2V0Um93cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHJpY2VzIGRvIG5vdCBtYXRjaCwgY2Fubm90IHN1YnRyYWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwKChyb3csIGlkeCkgPT4gbWFwKCh2YWwsIGpkeCkgPT4gdmFsIC0gTS5fX3ZhbHVlW2lkeF1bamR4XSkocm93KSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAobWFwKHggPT4geCAtIE0pKVxuICB9XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBtdWx0aXBseVxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBNdXRsaXBseSBhIHNjYWxhciBvciBhIG10cmFpeCB3aXRoIGEgbWF0cml4LiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG11bHRpcGxpY2F0aW9uIGlzIG5vdCBwb3NzaWJsZS5cbiAqIEBwYXJhbSBNIHtNYXRyaXh8bnVtYmVyfVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzUsIDRdXSlcbiAqIEEubXVsdGlwbHkoMikgLy8gW1sxMCwgOF1dXG4gKiBjb25zdCBCID0gTWF0cml4Lm9mKFtbNSwgNV1dKVxuICogQi5tdWx0aXBseShCKSAvLyBbWzI1LCAyNV1dXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKE0pIHtcbiAgaWYgKE0gaW5zdGFuY2VvZiBNYXRyaXgpIHtcbiAgICBpZiAodGhpcy5nZXRDb2xzKCkgIT09IE0uZ2V0Q29scygpIHx8IHRoaXMuZ2V0Um93cygpICE9PSBNLmdldFJvd3MoKSkge1xuICAgICAgY29uc29sZS5sb2coJ1VzZSBzdGF0aWMgbWV0aG9kIFxcJ2RvdFxcJyB0byBkbyBtYXRyaXggbXVsdGlwbGljYXRpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaWNlcyBkbyBub3QgbWF0Y2gsIGNhbm5vdCBjcmVhdGUgaGFkYW1hcmQgcHJvZHVjdCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcCgocm93LCBpZHgpID0+IG1hcCgoY29sLCBqZHgpID0+IGNvbCAqIE0uX192YWx1ZVtpZHhdW2pkeF0pKHJvdykpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKG1hcCh4ID0+IHggKiBNKSlcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgYWRkaXRpdmVpbnZlcnNlXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWF0cml4IG9idGFpbmVkIGJ5IGNoYW5naW5nIHRoZSBzaWduIG9mIGV2ZXJ5IG1hdHJpeCBlbGVtZW50LiBUaGUgYWRkaXRpdmUgaW52ZXJzZSBvZiBtYXRyaXggQSBpcyB3cml0dGVuIOKAk0EuXG4gKiBAcmV0dXJucyB7TWF0cml4fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBBID0gTWF0cml4Lm9mKFtbNSwtNV0sIFstNCwgNF1dKVxuICogY29uc3QgbWludXNBID0gQS5hZGRpdGl2ZWludmVyc2UoKVxuICogLy8gW1stNSwgNV0sIFs0LCAtNF1dXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuYWRkaXRpdmVpbnZlcnNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm11bHRpcGx5KC0xKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgaGFkYW1hcmRcbiAqIEBpbnN0YW5jZVxuICogQHNlZSBtdWx0aXBseVxuICogQHBhcmFtIE1cbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCA0XV0pXG4gKiBBLmhhZGFtYXJkKDIpIC8vIFtbMTAsIDhdXVxuICogY29uc3QgQiA9IE1hdHJpeC5vZihbWzUsIDVdXSlcbiAqIEIuaGFkYW1hcmQoQikgLy8gW1syNSwgMjVdXVxuXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaGFkYW1hcmQgPSBmdW5jdGlvbiAoTSkge1xuICByZXR1cm4gTWF0cml4Lm9mKHRoaXMpLm11bHRpcGx5KE0pXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIGx1XG4gKiBAZGVzYyBDYWxjdWxhdGVzIExVIGRlY29tcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgTWF0cml4XG4gKiBAcmV0dXJucyB7TWF0cml4W119XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IHJlc3VsdCA9IFtbMywgLTcsIC0yLCAyXSwgWy0zLCA1LCAxLCAwXSwgWzYsIC00LCAwLCAtNV0sIFstOSwgNSwgLTUsIDEyXV1cbiAqIGNvbnN0IEEgPSBNYXRyaXguZnJvbUFycmF5KHJlc3VsdClcbiAqIGNvbnN0IGx1ID0gQS5sdSgpXG4gKiAvLyBMLl9fdmFsdWUgPSBbIFsgMSwgMCwgMCwgMCBdLCBbIC0xLCAxLCAwLCAwIF0sIFsgMiwgLTUsIDEsIDAgXSwgWyAtMywgOCwgMywgMSBdIF1cbiAqIC8vIFUuX192YWx1ZSA9ICBbIFsgMywgLTcsIC0yLCAyIF0sIFsgMCwgLTIsIC0xLCAyIF0sIFsgMCwgMCwgLTEsIDEgXSwgWyAwLCAwLCAwLCAtMSBdIF1cbiAqIE1hdHJpeC5kb3QobHVbMF0sIGx1WzFdKSAvLyByZXR1cm5zIGNsb25lIG9mIEFcbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUubHUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IG4gPSB0aGlzLmdldFJvd3MoKVxuICBjb25zdCB0b2wgPSAxZS02XG4gIGNvbnN0IEEgPSB0aGlzLmNsb25lKClcbiAgY29uc3QgTCA9IHRoaXMuemVyb3MoKVxuICBjb25zdCBVID0gdGhpcy56ZXJvcygpXG5cbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHtcbiAgICBpZiAoTWF0aC5hYnMoQS5fX3ZhbHVlW2tdW2tdKSA8IHRvbCkgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBwcm9jZWVkIHdpdGhvdXQgYSByb3cgZXhjaGFuZ2UnKVxuICAgIEwuX192YWx1ZVtrXVtrXSA9IDFcbiAgICBmb3IgKGxldCBpID0gayArIDE7IGkgPCBuOyArK2kpIHtcbiAgICAgIEwuX192YWx1ZVtpXVtrXSA9IEEuX192YWx1ZVtpXVtrXSAvIEEuX192YWx1ZVtrXVtrXVxuICAgICAgZm9yIChsZXQgaiA9IGsgKyAxOyBqIDwgbjsgKytqKSB7XG4gICAgICAgIEEuX192YWx1ZVtpXVtqXSA9IEEuX192YWx1ZVtpXVtqXSAtIEwuX192YWx1ZVtpXVtrXSAqIEEuX192YWx1ZVtrXVtqXVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBsID0gazsgbCA8IG47ICsrbCkge1xuICAgICAgVS5fX3ZhbHVlW2tdW2xdID0gQS5fX3ZhbHVlW2tdW2xdXG4gICAgfVxuICB9XG4gIHJldHVybiBbTCwgVV1cbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXIgcnJlZlxuICogQHJldHVybnMge01hdHJpeHxhcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIEEgPSBNYXRyaXgub2YoW1stMSwgMV0sIFstMSwgMF0sIFswLCAtMV0sIFstMSwgLTJdXSlcbiAqIEEucnJlZigpIC8vICBbIFsgMSwgMCBdLCBbIC0wLCAxIF0sIFsgMCwgMCBdLCBbIDAsIDAgXSBdXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IGxlYWQgPSAwXG4gIGNvbnN0IHJlc3VsdE1hdHJpeCA9IHRoaXMuY2xvbmUoKVxuXG4gIGZvciAobGV0IHIgPSAwOyByIDwgdGhpcy5nZXRSb3dzKCk7ICsrcikge1xuICAgIGlmICh0aGlzLmdldENvbHMoKSA8PSBsZWFkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0TWF0cml4XG4gICAgfVxuICAgIGxldCBpID0gclxuICAgIHdoaWxlIChyZXN1bHRNYXRyaXguX192YWx1ZVtpXVtsZWFkXSA9PT0gMCkge1xuICAgICAgKytpXG4gICAgICBpZiAodGhpcy5nZXRSb3dzKCkgPT09IGkpIHtcbiAgICAgICAgaSA9IHJcbiAgICAgICAgKytsZWFkXG4gICAgICAgIGlmICh0aGlzLmdldENvbHMoKSA9PT0gbGVhZCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRNYXRyaXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0bXAgPSByZXN1bHRNYXRyaXguX192YWx1ZVtpXVxuICAgIHJlc3VsdE1hdHJpeC5fX3ZhbHVlW2ldID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbcl1cbiAgICByZXN1bHRNYXRyaXguX192YWx1ZVtyXSA9IHRtcFxuXG4gICAgbGV0IHZhbCA9IHJlc3VsdE1hdHJpeC5fX3ZhbHVlW3JdW2xlYWRdXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmdldENvbHMoKTsgKytqKSB7XG4gICAgICByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtqXSAvPSB2YWxcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ2V0Um93cygpOyArK2kpIHtcbiAgICAgIGlmIChpID09PSByKSBjb250aW51ZVxuICAgICAgdmFsID0gcmVzdWx0TWF0cml4Ll9fdmFsdWVbaV1bbGVhZF1cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5nZXRDb2xzKCk7ICsraikge1xuICAgICAgICByZXN1bHRNYXRyaXguX192YWx1ZVtpXVtqXSAtPSB2YWwgKiByZXN1bHRNYXRyaXguX192YWx1ZVtyXVtqXVxuICAgICAgfVxuICAgIH1cbiAgICBsZWFkKytcbiAgfVxuICByZXR1cm4gcmVzdWx0TWF0cml4XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGluc3RhbmNlXG4gKiBAbWVtYmVyIHNvbHZlXG4gKiBAcGFyYW0gYlxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBTb2x2ZSB4QSA9IGJcbiAqIC8vIDV4ICsgeSAgPSA3XG4gKiAvLyAzeCAtIDR5ID0gMThcbiAqIC8vIFNvbHV0aW9uIGZvciB4IGFuZCB5OlxuICogLy8geCA9IDJcbiAqIC8vIHkgPSAtM1xuICpcbiAqIGNvbnN0IEEgPSBNYXRyaXgub2YoW1s1LCAxXSwgWzMsIC00XV0pXG4gKiBjb25zdCBzb2x2ZUEgPSBBLnNvbHZlKFs3LCAxOF0pIC8vIFsyLCAtM11cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuc29sdmUgPSBmdW5jdGlvbiAoYikge1xuICBjb25zdCBBID0gdGhpcy5jbG9uZSgpXG4gIGNvbnN0IExVID0gQS5sdSgpXG4gIGNvbnN0IEwgPSBMVVswXVxuICBjb25zdCBVID0gTFVbMV1cbiAgY29uc3QgbiA9IHRoaXMuZ2V0Um93cygpXG4gIGxldCBzID0gMFxuICBjb25zdCBjID0gW11cbiAgY29uc3QgeCA9IFtdXG5cbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGs7ICsraikge1xuICAgICAgcyA9IHMgKyBMLl9fdmFsdWVba11bal0gKiBjW2pdXG4gICAgfVxuICAgIGNba10gPSBiW2tdIC0gc1xuICAgIHMgPSAwXG4gIH1cbiAgZm9yIChsZXQgYSA9IG4gLSAxOyBhID4gLTE7IC0tYSkge1xuICAgIGxldCB0ID0gMFxuICAgIGZvciAobGV0IGIgPSBhICsgMTsgYiA8IG47ICsrYikge1xuICAgICAgdCA9IHQgKyBVLl9fdmFsdWVbYV1bYl0gKiB4W2JdXG4gICAgfVxuICAgIHhbYV0gPSAoY1thXSAtIHQpIC8gVS5fX3ZhbHVlW2FdW2FdXG4gIH1cbiAgcmV0dXJuIHhcbn1cblxuLyoqXG4gKiBAbWVtYmVyT2YgTWF0cml4XG4gKiBAbWVtYmVyIGludmVyc2VcbiAqIEBpbnN0YW5jZVxuICogQHJldHVybnMge01hdHJpeH1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgQSA9IE1hdHJpeC5vZihbWzEsIDFdLCBbMiwgNF1dKS5pbnZlcnNlKClcbiAqIC8vIFsgWyAyLCAtMC41IF0sIFsgLTEsIDAuNSBdIF1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuaW52ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgQSA9IHRoaXMuY2xvbmUoKVxuICBjb25zdCBJID0gQS5pZGVudGl0eSgpXG4gIGNvbnN0IEludiA9IEEuY29uY2F0KEkpLnJyZWYoKVxuXG4gIGNvbnN0IHJlc3VsdCA9IEludi5fX3ZhbHVlLnJlZHVjZSgocmVzdWx0LCB4LCBpZHgpID0+IHtcbiAgICBjb25zdCBoYWxmID0geC5sZW5ndGggLyAyXG4gICAgcmVzdWx0LnB1c2goeC5zbGljZShoYWxmLCB4Lmxlbmd0aCkpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LCBbXSlcbiAgcmV0dXJuIE1hdHJpeC5vZihyZXN1bHQpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciByYW5rXG4gKiBAaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUucmFuayA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcnJlZiA9IHRoaXMucnJlZigpXG4gIGxldCByZXN1bHQgPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcnJlZi5nZXRDb2xzKCk7ICsraSkge1xuICAgIHJlc3VsdCArPSBycmVmLl9fdmFsdWVbaV1baV1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBkaW1lbnNpb25cbiAqIEBpbnN0YW5jZVxuICogQHNlZSByYW5rXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpbWVuc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmFuaygpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBkaWFnXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9uIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLmRpYWcoKVxuICogLy8gWzEsIDEsIDFdXG4gKlxuICogY29uc3QgZGlhZzAgPSBNYXRyaXguemVyb3MoNSwgNSkuZGlhZygpXG4gKiAvLyBbMCwgMCwgMCwgMCwgMF1cbiAqXG4gKi9cbk1hdHJpeC5wcm90b3R5cGUuZGlhZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZvbGQoKGFjYywgeCwgaWR4KSA9PiB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoeFtpZHhdKVxuICB9KShbXSkodGhpcy5fX3ZhbHVlKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBkaWFnXG4gKiBAZGVzYyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvbiB0aGUgZGlhZ29uYWxcbiAqIEBwYXJhbSBNIHtNYXRyaXh8QXJyYXl9IE1hdHJpeCBmcm9tIHdoaWNoIHRvIHJldHVybiB0aGUgZGlhZ29uYWxcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguZGlhZyhbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gWzIsIDVdXG4gKlxuICovXG5NYXRyaXguZGlhZyA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZGlhZygpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQG1lbWJlciBkaWFncHJvZHVjdFxuICogQGluc3RhbmNlXG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5vbmVzKDMsIDMpLmRpYWdwcm9kdWN0KClcbiAqIC8vIDFcbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5kaWFncHJvZHVjdCgpXG4gKiAvLyAwXG4gKlxuICovXG5NYXRyaXgucHJvdG90eXBlLmRpYWdwcm9kdWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZm9sZCgoYWNjLCB4LCBpZHgpID0+IHtcbiAgICBhY2MgKj0geFtpZHhdXG4gICAgcmV0dXJuIGFjY1xuICB9KSgxKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIGRpYWdwcm9kdWN0XG4gKiBAZGVzYyBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB2YWx1ZXMgb24gdGhlIGRpYWdvbmFsXG4gKiBAcGFyYW0gTSB7TWF0cml4fEFycmF5fSBNYXRyaXggZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIGRpYWdvbmFsXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkaWFnMSA9IE1hdHJpeC5kaWFncHJvZHVjdChbWzIsIDFdLCBbMSwgNV1dKVxuICogLy8gMTBcbiAqXG4gKi9cbk1hdHJpeC5kaWFncHJvZHVjdCA9IGZ1bmN0aW9uIChNKSB7XG4gIHJldHVybiBNYXRyaXgub2YoTSkuZGlhZ3Byb2R1Y3QoKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIgc3VtXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIHRoZSBNYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRpYWcxID0gTWF0cml4Lm9uZXMoMywgMykuc3VtKClcbiAqIC8vIDlcbiAqXG4gKiBjb25zdCBkaWFnMCA9IE1hdHJpeC56ZXJvcyg1LCA1KS5zdW0oKVxuICogLy8gMFxuICpcbiAqL1xuTWF0cml4LnByb3RvdHlwZS5zdW0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgpID0+IHtcbiAgICBhY2MgKz0gZm9sZCgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQpKDApKHgpXG4gICAgcmV0dXJuIGFjY1xuICB9KSgwKSh0aGlzLl9fdmFsdWUpXG59XG5cbi8qKlxuICogQG1lbWJlck9mIE1hdHJpeFxuICogQGZ1bmN0aW9uIHN1bVxuICogQGRlc2MgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIE1hdHJpeFxuICogQHBhcmFtIE0ge01hdHJpeHxBcnJheX0gTWF0cml4IGZyb20gd2hpY2ggdG8gcmV0dXJuIHRoZSBkaWFnb25hbFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogY29uc3QgZGlhZzEgPSBNYXRyaXguc3VtKFtbMiwgMV0sIFsxLCA1XV0pXG4gKiAvLyA5XG4gKlxuICovXG5NYXRyaXguc3VtID0gZnVuY3Rpb24gKE0pIHtcbiAgcmV0dXJuIE1hdHJpeC5vZihNKS5zdW0oKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBtZW1iZXIga3JvbmVja2VyXG4gKiBAaW5zdGFuY2VcbiAqIEBkZXNjIFRoZSBLcm9uZWNrZXIgcHJvZHVjdCBpcyBhbiBvcGVyYXRpb24gb24gdHdvIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBzaXplIHJlc3VsdGluZyBpbiBhIGJsb2NrIG1hdHJpeC5cbiAqIEBwYXJhbSBNIHtNYXRyaXh9IFRoZSByaWdodCBzaWRlIE1hdHJpeCBvZiB0aGUgcHJvZHVjdCAodGhpcyDiipcgTSlcbiAqIEByZXR1cm5zIHtNYXRyaXh9XG4gKi9cbk1hdHJpeC5wcm90b3R5cGUua3JvbmVja2VyID0gZnVuY3Rpb24gKE0pIHtcbiAgY29uc3QgbSA9IHRoaXMuZ2V0Um93cygpXG4gIGNvbnN0IG4gPSB0aGlzLmdldENvbHMoKVxuICBjb25zdCBwID0gTS5nZXRSb3dzKClcbiAgY29uc3QgcSA9IE0uZ2V0Q29scygpXG5cbiAgY29uc3QgbGVmdCA9IHRoaXMuX192YWx1ZVxuICBjb25zdCByaWdodCA9IE0uX192YWx1ZVxuXG4gIGNvbnN0IGZyYW1lID0gZ2VuZXJhdGUobSAqIHAsIG4gKiBxKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcDsgaysrKSB7XG4gICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcTsgbCsrKSB7XG4gICAgICAgICAgZnJhbWVbcCAqIGkgKyBrXVtxICogaiArIGxdID0gbGVmdFtpXVtqXSAqIHJpZ2h0W2tdW2xdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0cml4Lm9mKGZyYW1lKVxufVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNYXRyaXhcbiAqIEBmdW5jdGlvbiBrcm9uZWNrZXJcbiAqIEBkZXNjIFRoZSBLcm9uZWNrZXIgcHJvZHVjdCBpcyBhbiBvcGVyYXRpb24gb24gdHdvIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBzaXplIHJlc3VsdGluZyBpbiBhIGJsb2NrIG1hdHJpeC5cbiAqIEBwYXJhbSBBIHtNYXRyaXh9IFRoZSBsZWZ0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHBhcmFtIEIge01hdHJpeH0gVGhlIHJpZ2h0IHNpZGUgTWF0cml4IG9mIHRoZSBwcm9kdWN0IChBIOKKlyBCKVxuICogQHJldHVybnMge01hdHJpeH1cbiAqL1xuTWF0cml4Lmtyb25lY2tlciA9IGZ1bmN0aW9uIChBLCBCKSB7XG4gIHJldHVybiBNYXRyaXgub2YoQSkua3JvbmVja2VyKEIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdHJpeFxuIiwiaW1wb3J0IHsgY29uY2F0LCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gY29uY2F0XG4gKiBAcGFyYW0gTSB7TWF0cml4fVxuICogQHBhcmFtIG0ge0FycmF5fVxuICogQHBhcmFtIGlkeCB7bnVtYmVyfVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBjdXJyeShmdW5jdGlvbiAoTSwgbSwgaWR4KSB7XG4gIHJldHVybiBjb25jYXQobSwgTS5fX3ZhbHVlW2lkeF0pXG59KVxuIiwiaW1wb3J0IHsgY3VycnkgfSBmcm9tICdmdW4uanMnXG5leHBvcnQgZGVmYXVsdCBjdXJyeShtID0+IFtdKVxuIiwiaW1wb3J0IHsgZm9sZCwgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcbmltcG9ydCByb3VuZCBmcm9tICcuL3JvdW5kJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBkb3RcbiAqIEBwYXJhbSBCIHtNYXRyaXh9XG4gKiBAcGFyYW0gYSB7QXJyYXl9XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChkZWNpbWFscywgQiwgYSkgPT4gbWFwKChpdGVtLCBpKSA9PiB7XG4gIHJldHVybiBmb2xkKChhY2MsIHgsIGopID0+IHtcbiAgICBhY2MgKz0gcm91bmQoeCAqIEIuX192YWx1ZVtqXVtpXSwgZGVjaW1hbHMpXG4gICAgcmV0dXJuIGFjY1xuICB9LCAwKShhKVxufSkoQi5fX3ZhbHVlWzBdKSlcbiIsIi8qKlxuICogQGZ1bmN0aW9uIHJvdW5kXG4gKiBAcGFyYW0gdmFsdWUge251bWJlcn1cbiAqIEBwYXJhbSBkZWNpbWFscyB7bnVtYmVyfVxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91bmQgKHZhbHVlLCBkZWNpbWFscykge1xuICByZXR1cm4gTnVtYmVyKE1hdGgucm91bmQodmFsdWUgKyAnZScgKyBkZWNpbWFscykgKyAnZS0nICsgZGVjaW1hbHMpXG59XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICdmdW4uanMnXG5cbi8qKlxuICogQGZ1bmN0aW9uIGlkZW50aXR5XG4gKiBAZGVzYyBDcmVhdGVzIGFuIGlkZW50aXkgbWF0cml4IGZyb20gYW4gZW1wdHkgYXJyYXlcbiAqIEBwYXJhbSBtIHtBcnJheX1cbiAqIEBwYXJhbSBpZHgge251bWJlcn1cbiAqIEByZXR1cm4ge01hdHJpeH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG0sIGlkeCkgPT4gbWFwKChyb3dzLCBqZHgpID0+IChpZHggPT09IGpkeCkgKiAxKShtKVxuIiwiaW1wb3J0IHsgbWFwLCBjdXJyeSB9IGZyb20gJ2Z1bi5qcydcblxuLyoqXG4gKiBAZnVuY3Rpb24gdHJhbnNwb3NlXG4gKiBAZGVzYyBUcmFuc3Bvc2VzIGEgYXJyYXkgb2YgYXJyYXlzIHVzaW5nIHRoZSBNYXRyaXgubWFwIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSB7QXJyYXl9XG4gKiBAcGFyYW0gaWR4IHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGN1cnJ5KChwcmV2LCBuZXh0KSA9PiBtYXAoKGl0ZW0sIGkpID0+IChwcmV2W2ldIHx8IFtdKS5jb25jYXQobmV4dFtpXSkpKG5leHQpKVxuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnZnVuLmpzJ1xuXG4vKipcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZVxuICogQGRlc2MgR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBhIG1hdHJpeCBhcnJheSwgdmFsdWVzIGFyZSBzZXQgdG8gdW5kZWZpbmVkXG4gKiBAcGFyYW0gcm93cyB7bnVtYmVyfVxuICogQHBhcmFtIGNvbHMge251bWJlcn1cbiAqIEByZXR1cm5zIHthbnlbXVtdfVxuICovXG5leHBvcnQgZGVmYXVsdCAocm93cywgY29scyA9IHVuZGVmaW5lZCwgdmFsdWUgPSAwKSA9PiB7XG4gIGNvbnN0IF9jb2xzID0gY29scyB8fCByb3dzXG4gIGNvbnN0IHkgPSBtYXAoeiA9PiB2YWx1ZSkobmV3IEFycmF5KF9jb2xzKSlcbiAgcmV0dXJuIG1hcCh6ID0+IHkpKG5ldyBBcnJheShyb3dzKSlcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/src/matrix.js b/src/matrix.js index f17dbea..e61269e 100644 --- a/src/matrix.js +++ b/src/matrix.js @@ -2,15 +2,15 @@ import curry from 'fun.js/src/curry' import map from 'fun.js/src/map' import fold from 'fun.js/src/fold' import equals from 'fun.js/src/equals' -import concat from 'util/concat' -import empty from 'util/empty' -import dot from 'util/dot' -import identity from 'util/identity' -import transpose from 'util/transpose' -import generate from 'util/generate' -import gpumap from 'util/gpumap' -import gpufold from 'util/gpufold' -import gpuproduct from 'util/gpuproduct' +import concat from './util/concat' +import empty from './util/empty' +import dot from './util/dot' +import identity from './util/identity' +import transpose from './util/transpose' +import generate from './util/generate' +// import gpumap from 'util/gpumap' +// import gpufold from 'util/gpufold' +// import gpuproduct from 'util/gpuproduct' /** * @class Matrix @@ -23,11 +23,8 @@ import gpuproduct from 'util/gpuproduct' * const m = Matrix.of([[1,2],[2,3],[4,5]]) * */ -let Matrix = function (val, GPUJS) { +let Matrix = function (val) { this.__value = val - if (GPUJS) { - this.gpujs = GPUJS || null - } } /** @@ -46,7 +43,6 @@ Matrix.of = function (val) { if (val instanceof Matrix) return val if (this instanceof Matrix) { this.__value = val - this.gpujs = GPUJS return this } return new Matrix(val) @@ -1116,78 +1112,4 @@ Matrix.kronecker = function (A, B) { return Matrix.of(A).kronecker(B) } -//* ***********************/ -// GPU Functions -//* ***********************/ - -/** - * @memberOf Matrix - * @instance - * @member gpuMap - * @description Maps over the rows of the matrix using a map function using the GPU - * @param f {function} An GPU.js enabled iterator function - * @returns {Matrix} - * @example - * - * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } - * const m = Matrix.of([[2, 2], [2, 2]], GPUJS) - * m.gpuMap(gpuMapper) - * // [Float32Array(2,2), Float32Array(2,2)] - * - * - */ -Matrix.prototype.gpuMap = function (f) { - return Matrix.of(gpumap(this.gpujs, f, this.__value)) -} - -/** - * @memberOf Matrix - * @static - * @function gpuMap - * @description Static function that maps over the rows of the matrix using a map function using the GPU - * @param f {function} An GPU.js enabled iterator function - * @param M {Matrix|array} Matrix or array to map - * @returns {Matrix} - * @example - * - * function gpuMapper (a) { return a[this.thread.y][this.thread.x] } - * const m = Matrix.gpuMap(GPUJS, gpuMapper, [[2, 2], [2, 2]]) - * // [Float32Array(2,2), Float32Array(2,2)] - * - */ -Matrix.gpuMap = curry(function (gpu, f, M) { - return Matrix.of(M, gpu).gpuMap(f) -}) - -/** - * @memberOf Matrix - * @instance - * @member gpuFold - * @description Folds the rows of the matrix using a GPUS.js enqbled reduce function, using the GPU - * @param f {function} An iterator function - * @returns {Matrix} - * @example - * - * const m = Matrix.of([[1, 1], [1, 1]]) - * m.map(x => x.map(y => y+ 1)) - * // [[2, 2], [2, 2]] - * - */ -Matrix.prototype.gpuFold = function (f, output) { - return Matrix.of(gpufold(this.gpujs, f, output, this.__value)) -} - -/** - * @memberOf Matrix - * @function Matrix#gpuProduct - * @param f - * @param output - * @param M - * @returns {Matrix} - */ -Matrix.prototype.gpuProduct = function (f, output, M) { - // (gpu, f, output, a, b, constants = {} - return Matrix.of(gpuproduct(this.gpujs, f, output, this.__value, M.__value)) -} - export default Matrix diff --git a/test/gpumatrix.spec.js b/test/gpumatrix.spec.js new file mode 100644 index 0000000..09478ba --- /dev/null +++ b/test/gpumatrix.spec.js @@ -0,0 +1,55 @@ +// import chai from 'chai' +// import Matrix from '../lib/@astuanax/funmatrix' +// import generate from '../src/util/generate' +// import gpudot from '../src/util/gpudot' +// import { GPU } from 'gpu.js' +// const gpu = new GPU() +// +// describe('Matrix map on gpu', function () { +// it('generates square matrix array', function () { +// const dim = 2 +// const m = generate(dim) +// chai.expect(m).to.deep.equal([[0, 0], [0, 0]]) +// }) +// +// it('maps arrays on gpu', function () { +// const A = Matrix.of([[0]], gpu) +// function mapF (a) { return a[this.thread.y][this.thread.x] } +// chai.expect(A.gpuMap(mapF).__value).to.deep.equal([new Float32Array([0])]) +// }) +// +// it('maps large arrays on gpu', function () { +// const dim = 100 +// const m = generate(dim).map(row => row.map(x => 0)) +// const A = Matrix.of(m, gpu) +// function mapF (a) { return a[this.thread.y][this.thread.x] } +// const expected = m.map(row => new Float32Array(row.map(x => 0))) +// chai.expect(A.gpuMap(mapF).__value).to.deep.equal(expected) +// }) +// +// it('folds large arrays on gpu', function () { +// const sum = function (a) { +// let sum = 0 +// for (let i = 0; i < this.constants.m; i++) { +// for (let j = 0; j < this.constants.n; j++) { +// sum += a[i][j] +// } +// } +// return sum +// } +// const A = Matrix.of([[2, 0], [0, 2], [1, 1]], gpu) +// const test = A.gpuFold(sum, [1]) +// const expected = new Float32Array([6]) +// chai.expect(test.__value).to.deep.equal(expected) +// }) +// +// it('dot product on gpu', function () { +// const A = Matrix.of([[2, 0], [0, 2]], gpu) +// const B = Matrix.of([[1, 0], [0, 1]], gpu) +// +// const test = A.gpuProduct(gpudot, [2, 2], B) +// const expected = [new Float32Array([2, 0]), new Float32Array([0, 2])] +// +// chai.expect(test.__value).to.deep.equal(expected) +// }) +// }) diff --git a/test/matrix.spec.js b/test/matrix.spec.js index 5c4aa90..3f64ebe 100644 --- a/test/matrix.spec.js +++ b/test/matrix.spec.js @@ -1,55 +1,417 @@ import chai from 'chai' import Matrix from '../lib/@astuanax/funmatrix' -import generate from '../src/util/generate' -import gpudot from '../src/util/gpudot' -import { GPU } from 'gpu.js' -const gpu = new GPU() - -describe('Matrix map on gpu', function () { - it('generates square matrix array', function () { - const dim = 2 - const m = generate(dim) - chai.expect(m).to.deep.equal([[0, 0], [0, 0]]) - }) - - it('maps arrays on gpu', function () { - const A = Matrix.of([[0]], gpu) - function mapF (a) { return a[this.thread.y][this.thread.x] } - chai.expect(A.gpuMap(mapF).__value).to.deep.equal([new Float32Array([0])]) - }) - - it('maps large arrays on gpu', function () { - const dim = 100 - const m = generate(dim).map(row => row.map(x => 0)) - const A = Matrix.of(m, gpu) - function mapF (a) { return a[this.thread.y][this.thread.x] } - const expected = m.map(row => new Float32Array(row.map(x => 0))) - chai.expect(A.gpuMap(mapF).__value).to.deep.equal(expected) - }) - - it('folds large arrays on gpu', function () { - const sum = function (a) { - let sum = 0 - for (let i = 0; i < this.constants.m; i++) { - for (let j = 0; j < this.constants.n; j++) { - sum += a[i][j] - } - } - return sum - } - const A = Matrix.of([[2, 0], [0, 2], [1, 1]], gpu) - const test = A.gpuFold(sum, [1]) - const expected = new Float32Array([6]) - chai.expect(test.__value).to.deep.equal(expected) - }) - - it('dot product on gpu', function () { - const A = Matrix.of([[2, 0], [0, 2]], gpu) - const B = Matrix.of([[1, 0], [0, 1]], gpu) - - const test = A.gpuProduct(gpudot, [2, 2], B) - const expected = [new Float32Array([2, 0]), new Float32Array([0, 2])] - - chai.expect(test.__value).to.deep.equal(expected) + +describe('create a Matrix', function () { + it('it returns type Matrix', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const A = Matrix.of(a) + chai.expect(A.type).to.equal('Matrix') + }) + + it('it returns an array of arrays', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const A = Matrix.of(a) + chai.expect(A.__value).to.deep.equal([[0, 1, 1], [2, 3, 4]]) + }) + + it('create matrix', () => { + const m = [[1, 2, 3], [2, 3, 4], [3, 4, 5]] + const M = Matrix.of(m) + chai.expect(M.__value).to.deep.equal([[1, 2, 3], [2, 3, 4], [3, 4, 5]]) + }) + + it('create init matrix', () => { + const m = [[], [], []] + const M = Matrix.empty(3, 3) + chai.expect(M).to.deep.equal(Matrix.of(m)) + }) +}) + +describe('maps over a Matrix', function () { + it('it returns the same matrixs', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const identity = x => x.map(y => y) + const A = Matrix.of(a).map(identity) + chai.expect(A.__value).to.deep.equal([[0, 1, 1], [2, 3, 4]]) + }) + + it('it returns add 1', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const addScalar1 = x => x.map(y => y + 1) + const A = Matrix.of(a).map(addScalar1) + chai.expect(A.__value).to.deep.equal([[1, 2, 2], [3, 4, 5]]) + }) +}) + +describe('Matrix is immutable', function () { + it('map is immutable', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const identity = x => x.map(y => y) + const A = Matrix.of(a) + const B = A.map(identity) + chai.expect(A).to.not.equal(B) + }) + + it('ap is immutable', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const identity = x => x.map(y => y) + const A = Matrix.of(identity) + const B = A.ap(a) + chai.expect(A.ap(a)).to.not.equal(B) + }) +}) + +describe('applies a Matrix to a function', function () { + it('it returns identity', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const identity = x => x.map(y => y) + const A = Matrix.of(identity).ap(a) + chai.expect(A.__value).to.deep.equal([[0, 1, 1], [2, 3, 4]]) + }) + + it('it returns add 1', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const addScalar1 = x => x.map(y => y + 1) + const A = Matrix.of(addScalar1).ap(a) + chai.expect(A.__value).to.deep.equal([[1, 2, 2], [3, 4, 5]]) + }) + + it('should return N', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const b = [[2, 2, 2], [3, 3, 3]] + + const A = Matrix.of(a) + const B = Matrix.of(b) + + const M = Matrix.concat(A, B) + + chai.expect(M.__value).to.deep.equal([[0, 1, 1, 2, 2, 2], [2, 3, 4, 3, 3, 3]]) + }) +}) + +describe('Empty matrices', function () { + it('should return empty array(s)', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const A = Matrix.of(a).empty() + const O = Matrix.empty() + const B = Matrix.empty(0, 3) + + chai.expect(A.__value).to.deep.equal([[], []]) + chai.expect(O.__value).to.deep.equal([]) + // chai.expect(B.__value).to.deep.equal([]) + }) +}) + +describe('Semigroup concat', function () { + it('should return N', function () { + const a = [[0, 1, 1], [2, 3, 4]] + const b = [[2, 2, 2], [3, 3, 3]] + const c = [[5, 5, 5], [4, 4, 4]] + const A = Matrix.of(a) + const B = Matrix.of(b) + const C = Matrix.of(c) + + const M = Matrix.concat(Matrix.concat(A, B), C) + const N = Matrix.concat(A, Matrix.concat(B, C)) + + chai.expect(M).to.deep.equal(N) + }) + + it('Monoid empty and concat', () => { + const A = Matrix.of([[0, 1, 1], [2, 3, 4]]) + const B = Matrix.empty(2, 3) + + const M = A.concat(B) + const N = B.concat(A) + + chai.expect(M).to.deep.equal(N) + }) +}) + +describe('DOT product', function () { + it('should multiply by identity', function () { + const a = [[0, 1, 0], [2, 4, 0], [3, 4, 0]] + const b = [[2, 0, 0], [0, 2, 0], [0, 0, 2]] + + const A = Matrix.of(a) + const B = Matrix.of(b) + + const dot = A.dot(B) + chai.expect(dot.__value).to.deep.equal([[0, 2, 0], [4, 8, 0], [6, 8, 0]]) + }) + + it('multiply vectors', function () { + const a = [[2, 2]] + const b = [[1], [1]] + + const A = Matrix.of(a) + const B = Matrix.of(b) + + const dot = Matrix.dot(A, B) + const dot2 = Matrix.dot(B, A) + chai.expect(dot.__value).to.deep.equal([[4]]) + chai.expect(dot2.__value).to.deep.equal([[2, 2], [2, 2]]) + }) + + it('multiply vectors', function () { + const a = [[1, 2, 3], [4, 5, 6]] + const b = [[7, 8], [9, 10], [11, 12]] + + const A = Matrix.of(a) + const B = Matrix.of(b) + + const dot = Matrix.dot(A, B) + chai.expect(dot.__value).to.deep.equal([[58, 64], [139, 154]]) + }) +}) + +describe('Identity Matrix', function () { + it('should return identity matrix', function () { + const a = [[1, 2, 3], [4, 5, 6]] + const b = [[7, 8], [9, 10], [11, 12]] + + const A = Matrix.of(a) + const B = Matrix.of(b) + + const Aidentity = A.identity() + const AStaticIdentity = Matrix.identity(2, 3) + + const Bidentity = B.identity() + const BStaticIdentity = Matrix.identity(3, 2) + + chai.expect(Aidentity.__value).to.deep.equal([[1, 0, 0], [0, 1, 0]]) + chai.expect(AStaticIdentity.__value).to.deep.equal([[1, 0, 0], [0, 1, 0]]) + + chai.expect(Bidentity.__value).to.deep.equal([[1, 0], [0, 1], [0, 0]]) + chai.expect(BStaticIdentity.__value).to.deep.equal([[1, 0], [0, 1], [0, 0]]) + }) +}) + +describe('Transpose Matrix', function () { + it('should transpose a matrix', function () { + const A = Matrix.transpose([[-1, 2], [3, 4], [-8, 2]]) + const result = [[-1, 3, -8], [2, 4, 2]] + + chai.expect(A.__value).to.deep.equal(result) + }) + + it('should transpose an identity matrix', function () { + const A = Matrix.identity(10, 10) + const B = Matrix.identity(10, 10) + + chai.expect(A.transpose().__value).to.deep.equal(B.__value) + }) + + it('should transpose a matrix', function () { + const A = Matrix.identity(10, 5).zeros() + const B = Matrix.identity(5, 10).zeros().transpose() + + chai.expect(A.__value).to.deep.equal(B.__value) + }) + + it('should transpose a matrix', function () { + const a = Matrix.identity(10, 5).zeros().toArray() + const b = Matrix.identity(5, 10).zeros().toArray() + + chai.expect(Matrix.of(a)).to.deep.equal(Matrix.transpose(b)) + }) +}) + +describe('from and toArray Matrix', function () { + it('should make a Matrix from an array', function () { + const arr = [[-1, 2], [3, 4], [-8, 2]] + const A = Matrix.fromArray(arr) + chai.expect(Matrix.of(arr)).to.deep.equal(A) + chai.expect(arr).to.not.equal(A._value) + }) + + it('should return an array from a Matrix', function () { + const arr = [[-1, 2], [3, 4], [-8, 2]] + const a = Matrix.of(arr).toArray() + chai.expect(arr).to.deep.equal(a) + chai.expect(arr).to.not.equal(a) + }) +}) + +describe('Matrix properties', function () { + it('getCols, getRows, getShape', function () { + const arr = [[-1, 2], [3, 4], [-8, 2]] + const A = Matrix.of(arr) + chai.expect(A.getCols()).to.equal(2) + chai.expect(A.getRows()).to.equal(3) + chai.expect(A.getShape()).to.deep.equal([3, 2]) + }) +}) + +describe('Matrix equality', function () { + it('equals', function () { + const arr = [[-1, 2], [3, 4], [-8, 2]] + const brr = [[-1, 2], [3, 4], [-8, 2]] + const A = Matrix.of(arr) + const B = Matrix.of(brr) + const C = B.transpose() + chai.expect(A.equals(B)).to.be.true + chai.expect(A.equals(C)).to.be.false + }) +}) + +describe('Matrix operations addition', function () { + it('add a scalar', function () { + const A = Matrix.fromArray([[0, 0], [0, 0]]) + chai.expect(A.add(1).__value).to.deep.equal([[1, 1], [1, 1]]) + }) + + it('add a scalar', function () { + const A = Matrix.fromArray([[1, 1], [1, 1]]) + chai.expect(A.add(-1).__value).to.deep.equal([[0, 0], [0, 0]]) + }) + + it('add a matrix', function () { + const A = Matrix.fromArray([[0, 0], [0, 0]]) + const B = Matrix.fromArray([[1, 1], [1, 1]]) + chai.expect(A.add(B).__value).to.deep.equal([[1, 1], [1, 1]]) + }) + + it('subtract a scalar', function () { + const A = Matrix.fromArray([[1, 1], [1, 1]]) + chai.expect(A.subtract(1).__value).to.deep.equal([[0, 0], [0, 0]]) + }) + + it('subtract a matrix', function () { + const B = Matrix.fromArray([[1, 1], [1, 1]]) + chai.expect(B.subtract(B).__value).to.deep.equal([[0, 0], [0, 0]]) + }) +}) + +describe('Matrix operations multiplication', function () { + it('multiplies with a scalar', function () { + const result = [[2, 3], [3, 2]] + const A = Matrix.fromArray(result) + chai.expect(A.multiply(1).__value).to.deep.equal(result) + }) + + it('multiplies with a matrix', function () { + const result = [[2, 3], [3, 2]] + const A = Matrix.fromArray(result) + const B = Matrix.fromArray(result).ones() + chai.expect(A.multiply(B).__value).to.deep.equal(result) + }) +}) + +describe('Matrix operations additive inverse', function () { + it('matrix addition with additiveinverse returns zero matrix', function () { + const result = [[2, 3], [3, 2]] + const A = Matrix.fromArray(result) + const B = A.additiveinverse() + const C = Matrix.of(result).zeros() + chai.expect(A.add(B)).to.deep.equal(C) + }) +}) + +describe('Matrix properties: isSymmetric, isOrthogonal, isSquare', function () { + it('isSymmetric', function () { + const result = [[1, 7, 3], [7, 4, -5], [3, -5, 6]] + const A = Matrix.fromArray(result) + chai.expect(A.isSymmetric()).to.be.true + }) + + it('isOrthogonal', function () { + const result = [[-0.3092, -0.9510], [-0.9510, 0.3092]] + const A = Matrix.fromArray(result) + chai.expect(A.isOrthogonal()).to.be.true + }) + + it('isOrthogonal', function () { + const a = [[-0.3092, -0.9510], [-0.9510, 0.3092]] + const A = Matrix.fromArray(a) + chai.expect(A.isSquare()).to.be.true + + const b = [[-0.3092, -0.9510, 0], [-0.9510, 0.3092, 1]] + const B = Matrix.of(b) + chai.expect(B.isSquare()).to.be.false + }) +}) + +describe('Matrix decomposition', function () { + it('LU', function () { + const result = [[3, -7, -2, 2], [-3, 5, 1, 0], [6, -4, 0, -5], [-9, 5, -5, 12]] + const A = Matrix.fromArray(result) + const lu = A.lu() + chai.expect(Matrix.dot(lu[0], lu[1])).to.deep.equal(A) + }) + + it('rref', function () { + const A = Matrix.of([[-1, 1], [-1, 0], [0, -1], [-1, -2]]) + const rrefA = A.rref() + chai.expect(rrefA.__value).to.deep.equal([ [ 1, 0 ], [ -0, 1 ], [ 0, 0 ], [ 0, 0 ] ]) + + const B = Matrix.of([[-1, 1], [-1, 2], [-3, 2]]) + const rrefB = B.rref() + chai.expect(rrefB.__value).to.deep.equal([ [ 1, 0 ], [ 0, 1 ], [ 0, 0 ] ]) + + const C = Matrix.of([[-3, 3, -2], [2, 2, 3], [1, 1, 0]]) + const rrefC = C.rref() + chai.expect(rrefC.__value).to.deep.equal([ [ 1, 0, 0 ], [ 0, 1, 0 ], [ -0, -0, 1 ] ]) + }) + + it('solves xA = b', function () { + const A = Matrix.of([[1, -1], [1, 1]]) + const solveA = A.solve([5, 1]) + chai.expect(solveA).to.deep.equal([3, -2]) + + const B = Matrix.of([[5, 1], [3, -4]]) + const solveB = B.solve([7, 18]) + chai.expect(solveB).to.deep.equal([ 2, -3.0000000000000004 ]) + }) + + it('calculates the inverse', function () { + const A = Matrix.of([[1, 1], [2, 4]]).inverse() + chai.expect(A.__value).to.deep.equal([ [ 2, -0.5 ], [ -1, 0.5 ] ]) + }) +}) + +describe('Matrix values', function () { + it('ones and zeros', function () { + const one = Matrix.ones(2, 2) + const zero = Matrix.zeros(2, 2) + + chai.expect(one.__value).to.deep.equal([[1, 1], [1, 1]]) + chai.expect(zero.__value).to.deep.equal([[0, 0], [0, 0]]) + + chai.expect(one.zeros().__value).to.deep.equal([[0, 0], [0, 0]]) + chai.expect(zero.ones().__value).to.deep.equal([[1, 1], [1, 1]]) + }) +}) + +describe('Matrix diagonal', function () { + it('returns an array with diagonal values', function () { + const diag = Matrix.ones(2, 2).diag() + chai.expect(diag).to.deep.equal([1, 1]) + }) +}) + +describe('Matrix diagonal product', function () { + it('returns an array with diagonal values', function () { + const diag = Matrix.diagproduct([[2, 1], [1, 5]]) + chai.expect(diag).to.equal(10) + }) +}) + +describe('Matrix sum of all elements', function () { + it('returns the sum', function () { + const diag = Matrix.sum([[2, 1], [1, 5]]) + chai.expect(diag).to.equal(9) + + const diag1 = Matrix.ones(3, 3).sum() + chai.expect(diag1).to.equal(9) + }) +}) + +describe('Matrix kronecker product', function () { + it('returns the kronecker product', function () { + const A = Matrix.of([[1, 2], [3, 4]]) + const B = Matrix.of([[0, 5], [6, 7]]) + const kronecker = A.kronecker(B) + chai.expect(kronecker.__value).to.deep.equal([[0, 5, 0, 10], [6, 7, 12, 14], [0, 15, 0, 20], [18, 21, 24, 28]]) }) })