@cartanova/qgrid-cli 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
- package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
- package/bundle/dist/dist/_virtual/_rolldown/runtime.js +15 -0
- package/bundle/dist/dist/application/qgrid/oauth.js +140 -0
- package/bundle/dist/dist/application/qgrid/pool.js +100 -0
- package/bundle/dist/dist/application/qgrid/qgrid.frame.js +280 -0
- package/bundle/dist/dist/application/qgrid/qgrid.types.js +79 -0
- package/bundle/dist/dist/application/qgrid/worker.js +183 -0
- package/bundle/dist/dist/application/queries.generated.js +31 -0
- package/bundle/dist/dist/application/request-log/request-log.model.js +113 -0
- package/bundle/dist/dist/application/request-log/request-log.types.js +13 -0
- package/bundle/dist/dist/application/sonamu.generated.js +99 -0
- package/bundle/dist/dist/application/sonamu.generated.sso.js +34 -0
- package/bundle/dist/dist/application/token/token.model.js +157 -0
- package/bundle/dist/dist/application/token/token.types.js +22 -0
- package/bundle/dist/dist/i18n/en.js +63 -0
- package/bundle/dist/dist/i18n/ko.js +62 -0
- package/bundle/dist/dist/i18n/sd.generated.js +272 -0
- package/bundle/dist/dist/index.js +11 -0
- package/bundle/dist/dist/migrations/20260410171405_create__request_logs.js +26 -0
- package/bundle/dist/dist/migrations/20260410171406_create__tokens.js +24 -0
- package/bundle/dist/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
- package/bundle/dist/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
- package/bundle/dist/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
- package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
- package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
- package/bundle/dist/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
- package/bundle/dist/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
- package/bundle/dist/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +426 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +41 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +19 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +202 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +16 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +59 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +2910 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +44 -0
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js +28 -0
- package/bundle/dist/dist/sonamu.config.js +196 -0
- package/bundle/dist/dist/testing/fixture.js +8 -0
- package/bundle/dist/dist/testing/global.js +9 -0
- package/bundle/dist/dist/testing/setup-mocks.js +17 -0
- package/bundle/dist/dist/utils/subset-loaders.js +12 -0
- package/bundle/src/application/qgrid/oauth.ts +181 -0
- package/bundle/src/application/qgrid/pool.ts +132 -0
- package/bundle/src/application/qgrid/qgrid.frame.ts +275 -0
- package/bundle/src/application/qgrid/qgrid.types.ts +117 -0
- package/bundle/src/application/qgrid/worker.ts +234 -0
- package/bundle/src/application/queries.generated.ts +59 -0
- package/bundle/src/application/request-log/request-log.model.ts +155 -0
- package/bundle/src/application/request-log/request-log.types.ts +15 -0
- package/bundle/src/application/sonamu.generated.http +187 -0
- package/bundle/src/application/sonamu.generated.sso.ts +66 -0
- package/bundle/src/application/sonamu.generated.ts +135 -0
- package/bundle/src/application/token/token.model.ts +160 -0
- package/bundle/src/application/token/token.types.ts +26 -0
- package/bundle/src/i18n/en.ts +59 -0
- package/bundle/src/i18n/ko.ts +59 -0
- package/bundle/src/i18n/sd.generated.ts +384 -0
- package/bundle/src/index.ts +6 -0
- package/bundle/src/sonamu.config.ts +248 -0
- package/bundle/src/src/application/qgrid/oauth.ts +181 -0
- package/bundle/src/src/application/qgrid/pool.ts +132 -0
- package/bundle/src/src/application/qgrid/qgrid.frame.ts +275 -0
- package/bundle/src/src/application/qgrid/qgrid.types.ts +117 -0
- package/bundle/src/src/application/qgrid/worker.ts +234 -0
- package/bundle/src/src/application/queries.generated.ts +59 -0
- package/bundle/src/src/application/request-log/request-log.entity.json +75 -0
- package/bundle/src/src/application/request-log/request-log.model.ts +155 -0
- package/bundle/src/src/application/request-log/request-log.types.ts +15 -0
- package/bundle/src/src/application/sonamu.generated.http +187 -0
- package/bundle/src/src/application/sonamu.generated.sso.ts +66 -0
- package/bundle/src/src/application/sonamu.generated.ts +135 -0
- package/bundle/src/src/application/token/token.entity.json +37 -0
- package/bundle/src/src/application/token/token.model.ts +160 -0
- package/bundle/src/src/application/token/token.types.ts +26 -0
- package/bundle/src/src/i18n/en.ts +59 -0
- package/bundle/src/src/i18n/ko.ts +59 -0
- package/bundle/src/src/i18n/sd.generated.ts +384 -0
- package/bundle/src/src/index.ts +6 -0
- package/bundle/src/src/migrations/20260410171405_create__request_logs.ts +23 -0
- package/bundle/src/src/migrations/20260410171406_create__tokens.ts +21 -0
- package/bundle/src/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
- package/bundle/src/src/sonamu.config.ts +248 -0
- package/bundle/src/src/testing/fixture.ts +6 -0
- package/bundle/src/src/testing/global.ts +6 -0
- package/bundle/src/src/testing/setup-mocks.ts +44 -0
- package/bundle/src/src/typings/fastify.d.ts +8 -0
- package/bundle/src/src/typings/sonamu.d.ts +17 -0
- package/bundle/src/src/utils/subset-loaders.ts +11 -0
- package/bundle/src/testing/fixture.ts +6 -0
- package/bundle/src/testing/global.ts +6 -0
- package/bundle/src/testing/setup-mocks.ts +44 -0
- package/bundle/src/typings/fastify.d.ts +8 -0
- package/bundle/src/typings/sonamu.d.ts +17 -0
- package/bundle/src/utils/subset-loaders.ts +11 -0
- package/bundle/web-dist/web-dist/client/assets/index-DlPchHBY.js +116 -0
- package/bundle/web-dist/web-dist/client/assets/index-vZsvyuFn.css +1 -0
- package/bundle/web-dist/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/routes-CagDz23B.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
- package/bundle/web-dist/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/show-aXUGa0gm.js +29 -0
- package/bundle/web-dist/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
- package/bundle/web-dist/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
- package/bundle/web-dist/web-dist/client/index.html +18 -0
- package/bundle/web-dist/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
- package/bundle/web-dist/web-dist/server/assets/routes-ClzReRep.js +490 -0
- package/bundle/web-dist/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
- package/bundle/web-dist/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
- package/bundle/web-dist/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
- package/bundle/web-dist/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
- package/bundle/web-dist/web-dist/server/entry-server.generated.js +44646 -0
- package/package.json +11 -10
|
@@ -0,0 +1,2886 @@
|
|
|
1
|
+
import { __exportAll } from "../../../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region ../../node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js
|
|
3
|
+
var chai_exports = /* @__PURE__ */ __exportAll({
|
|
4
|
+
Assertion: () => Assertion,
|
|
5
|
+
AssertionError: () => AssertionError,
|
|
6
|
+
Should: () => Should,
|
|
7
|
+
assert: () => assert,
|
|
8
|
+
config: () => config,
|
|
9
|
+
expect: () => expect,
|
|
10
|
+
should: () => should,
|
|
11
|
+
use: () => use,
|
|
12
|
+
util: () => utils_exports
|
|
13
|
+
});
|
|
14
|
+
var __defProp = Object.defineProperty;
|
|
15
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
configurable: true,
|
|
18
|
+
writable: true,
|
|
19
|
+
value
|
|
20
|
+
}) : obj[key] = value;
|
|
21
|
+
var __name = (target, value) => __defProp(target, "name", {
|
|
22
|
+
value,
|
|
23
|
+
configurable: true
|
|
24
|
+
});
|
|
25
|
+
var __export = (target, all) => {
|
|
26
|
+
for (var name in all) __defProp(target, name, {
|
|
27
|
+
get: all[name],
|
|
28
|
+
enumerable: true
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
32
|
+
var utils_exports = {};
|
|
33
|
+
__export(utils_exports, {
|
|
34
|
+
addChainableMethod: () => addChainableMethod,
|
|
35
|
+
addLengthGuard: () => addLengthGuard,
|
|
36
|
+
addMethod: () => addMethod,
|
|
37
|
+
addProperty: () => addProperty,
|
|
38
|
+
checkError: () => check_error_exports,
|
|
39
|
+
compareByInspect: () => compareByInspect,
|
|
40
|
+
eql: () => deep_eql_default,
|
|
41
|
+
events: () => events,
|
|
42
|
+
expectTypes: () => expectTypes,
|
|
43
|
+
flag: () => flag,
|
|
44
|
+
getActual: () => getActual,
|
|
45
|
+
getMessage: () => getMessage2,
|
|
46
|
+
getName: () => getName,
|
|
47
|
+
getOperator: () => getOperator,
|
|
48
|
+
getOwnEnumerableProperties: () => getOwnEnumerableProperties,
|
|
49
|
+
getOwnEnumerablePropertySymbols: () => getOwnEnumerablePropertySymbols,
|
|
50
|
+
getPathInfo: () => getPathInfo,
|
|
51
|
+
hasProperty: () => hasProperty,
|
|
52
|
+
inspect: () => inspect2,
|
|
53
|
+
isNaN: () => isNaN2,
|
|
54
|
+
isNumeric: () => isNumeric,
|
|
55
|
+
isProxyEnabled: () => isProxyEnabled,
|
|
56
|
+
isRegExp: () => isRegExp2,
|
|
57
|
+
objDisplay: () => objDisplay,
|
|
58
|
+
overwriteChainableMethod: () => overwriteChainableMethod,
|
|
59
|
+
overwriteMethod: () => overwriteMethod,
|
|
60
|
+
overwriteProperty: () => overwriteProperty,
|
|
61
|
+
proxify: () => proxify,
|
|
62
|
+
test: () => test,
|
|
63
|
+
transferFlags: () => transferFlags,
|
|
64
|
+
type: () => type
|
|
65
|
+
});
|
|
66
|
+
var check_error_exports = {};
|
|
67
|
+
__export(check_error_exports, {
|
|
68
|
+
compatibleConstructor: () => compatibleConstructor,
|
|
69
|
+
compatibleInstance: () => compatibleInstance,
|
|
70
|
+
compatibleMessage: () => compatibleMessage,
|
|
71
|
+
getConstructorName: () => getConstructorName,
|
|
72
|
+
getMessage: () => getMessage
|
|
73
|
+
});
|
|
74
|
+
function isErrorInstance(obj) {
|
|
75
|
+
return obj instanceof Error || Object.prototype.toString.call(obj) === "[object Error]";
|
|
76
|
+
}
|
|
77
|
+
__name(isErrorInstance, "isErrorInstance");
|
|
78
|
+
function isRegExp(obj) {
|
|
79
|
+
return Object.prototype.toString.call(obj) === "[object RegExp]";
|
|
80
|
+
}
|
|
81
|
+
__name(isRegExp, "isRegExp");
|
|
82
|
+
function compatibleInstance(thrown, errorLike) {
|
|
83
|
+
return isErrorInstance(errorLike) && thrown === errorLike;
|
|
84
|
+
}
|
|
85
|
+
__name(compatibleInstance, "compatibleInstance");
|
|
86
|
+
function compatibleConstructor(thrown, errorLike) {
|
|
87
|
+
if (isErrorInstance(errorLike)) return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
|
|
88
|
+
else if ((typeof errorLike === "object" || typeof errorLike === "function") && errorLike.prototype) return thrown.constructor === errorLike || thrown instanceof errorLike;
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
__name(compatibleConstructor, "compatibleConstructor");
|
|
92
|
+
function compatibleMessage(thrown, errMatcher) {
|
|
93
|
+
const comparisonString = typeof thrown === "string" ? thrown : thrown.message;
|
|
94
|
+
if (isRegExp(errMatcher)) return errMatcher.test(comparisonString);
|
|
95
|
+
else if (typeof errMatcher === "string") return comparisonString.indexOf(errMatcher) !== -1;
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
__name(compatibleMessage, "compatibleMessage");
|
|
99
|
+
function getConstructorName(errorLike) {
|
|
100
|
+
let constructorName = errorLike;
|
|
101
|
+
if (isErrorInstance(errorLike)) constructorName = errorLike.constructor.name;
|
|
102
|
+
else if (typeof errorLike === "function") {
|
|
103
|
+
constructorName = errorLike.name;
|
|
104
|
+
if (constructorName === "") constructorName = new errorLike().name || constructorName;
|
|
105
|
+
}
|
|
106
|
+
return constructorName;
|
|
107
|
+
}
|
|
108
|
+
__name(getConstructorName, "getConstructorName");
|
|
109
|
+
function getMessage(errorLike) {
|
|
110
|
+
let msg = "";
|
|
111
|
+
if (errorLike && errorLike.message) msg = errorLike.message;
|
|
112
|
+
else if (typeof errorLike === "string") msg = errorLike;
|
|
113
|
+
return msg;
|
|
114
|
+
}
|
|
115
|
+
__name(getMessage, "getMessage");
|
|
116
|
+
function flag(obj, key, value) {
|
|
117
|
+
let flags = obj.__flags || (obj.__flags = /* @__PURE__ */ Object.create(null));
|
|
118
|
+
if (arguments.length === 3) flags[key] = value;
|
|
119
|
+
else return flags[key];
|
|
120
|
+
}
|
|
121
|
+
__name(flag, "flag");
|
|
122
|
+
function test(obj, args) {
|
|
123
|
+
let negate = flag(obj, "negate"), expr = args[0];
|
|
124
|
+
return negate ? !expr : expr;
|
|
125
|
+
}
|
|
126
|
+
__name(test, "test");
|
|
127
|
+
function type(obj) {
|
|
128
|
+
if (typeof obj === "undefined") return "undefined";
|
|
129
|
+
if (obj === null) return "null";
|
|
130
|
+
const stringTag = obj[Symbol.toStringTag];
|
|
131
|
+
if (typeof stringTag === "string") return stringTag;
|
|
132
|
+
return Object.prototype.toString.call(obj).slice(8, -1);
|
|
133
|
+
}
|
|
134
|
+
__name(type, "type");
|
|
135
|
+
var canElideFrames = "captureStackTrace" in Error;
|
|
136
|
+
var _AssertionError = class _AssertionError extends Error {
|
|
137
|
+
constructor(message = "Unspecified AssertionError", props, ssf) {
|
|
138
|
+
super(message);
|
|
139
|
+
__publicField(this, "message");
|
|
140
|
+
this.message = message;
|
|
141
|
+
if (canElideFrames) Error.captureStackTrace(this, ssf || _AssertionError);
|
|
142
|
+
for (const key in props) if (!(key in this)) this[key] = props[key];
|
|
143
|
+
}
|
|
144
|
+
get name() {
|
|
145
|
+
return "AssertionError";
|
|
146
|
+
}
|
|
147
|
+
get ok() {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
toJSON(stack) {
|
|
151
|
+
return {
|
|
152
|
+
...this,
|
|
153
|
+
name: this.name,
|
|
154
|
+
message: this.message,
|
|
155
|
+
ok: false,
|
|
156
|
+
stack: stack !== false ? this.stack : void 0
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
__name(_AssertionError, "AssertionError");
|
|
161
|
+
var AssertionError = _AssertionError;
|
|
162
|
+
function expectTypes(obj, types) {
|
|
163
|
+
let flagMsg = flag(obj, "message");
|
|
164
|
+
let ssfi = flag(obj, "ssfi");
|
|
165
|
+
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
166
|
+
obj = flag(obj, "object");
|
|
167
|
+
types = types.map(function(t) {
|
|
168
|
+
return t.toLowerCase();
|
|
169
|
+
});
|
|
170
|
+
types.sort();
|
|
171
|
+
let str = types.map(function(t, index) {
|
|
172
|
+
let art = ~[
|
|
173
|
+
"a",
|
|
174
|
+
"e",
|
|
175
|
+
"i",
|
|
176
|
+
"o",
|
|
177
|
+
"u"
|
|
178
|
+
].indexOf(t.charAt(0)) ? "an" : "a";
|
|
179
|
+
return (types.length > 1 && index === types.length - 1 ? "or " : "") + art + " " + t;
|
|
180
|
+
}).join(", ");
|
|
181
|
+
let objType = type(obj).toLowerCase();
|
|
182
|
+
if (!types.some(function(expected) {
|
|
183
|
+
return objType === expected;
|
|
184
|
+
})) throw new AssertionError(flagMsg + "object tested must be " + str + ", but " + objType + " given", void 0, ssfi);
|
|
185
|
+
}
|
|
186
|
+
__name(expectTypes, "expectTypes");
|
|
187
|
+
function getActual(obj, args) {
|
|
188
|
+
return args.length > 4 ? args[4] : obj._obj;
|
|
189
|
+
}
|
|
190
|
+
__name(getActual, "getActual");
|
|
191
|
+
var ansiColors = {
|
|
192
|
+
bold: ["1", "22"],
|
|
193
|
+
dim: ["2", "22"],
|
|
194
|
+
italic: ["3", "23"],
|
|
195
|
+
underline: ["4", "24"],
|
|
196
|
+
inverse: ["7", "27"],
|
|
197
|
+
hidden: ["8", "28"],
|
|
198
|
+
strike: ["9", "29"],
|
|
199
|
+
black: ["30", "39"],
|
|
200
|
+
red: ["31", "39"],
|
|
201
|
+
green: ["32", "39"],
|
|
202
|
+
yellow: ["33", "39"],
|
|
203
|
+
blue: ["34", "39"],
|
|
204
|
+
magenta: ["35", "39"],
|
|
205
|
+
cyan: ["36", "39"],
|
|
206
|
+
white: ["37", "39"],
|
|
207
|
+
brightblack: ["30;1", "39"],
|
|
208
|
+
brightred: ["31;1", "39"],
|
|
209
|
+
brightgreen: ["32;1", "39"],
|
|
210
|
+
brightyellow: ["33;1", "39"],
|
|
211
|
+
brightblue: ["34;1", "39"],
|
|
212
|
+
brightmagenta: ["35;1", "39"],
|
|
213
|
+
brightcyan: ["36;1", "39"],
|
|
214
|
+
brightwhite: ["37;1", "39"],
|
|
215
|
+
grey: ["90", "39"]
|
|
216
|
+
};
|
|
217
|
+
var styles = {
|
|
218
|
+
special: "cyan",
|
|
219
|
+
number: "yellow",
|
|
220
|
+
bigint: "yellow",
|
|
221
|
+
boolean: "yellow",
|
|
222
|
+
undefined: "grey",
|
|
223
|
+
null: "bold",
|
|
224
|
+
string: "green",
|
|
225
|
+
symbol: "green",
|
|
226
|
+
date: "magenta",
|
|
227
|
+
regexp: "red"
|
|
228
|
+
};
|
|
229
|
+
var truncator = "…";
|
|
230
|
+
function colorise(value, styleType) {
|
|
231
|
+
const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
|
|
232
|
+
if (!color) return String(value);
|
|
233
|
+
return `\x1B[${color[0]}m${String(value)}\x1B[${color[1]}m`;
|
|
234
|
+
}
|
|
235
|
+
__name(colorise, "colorise");
|
|
236
|
+
function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate: truncate2 = Infinity, stylize = String } = {}, inspect3) {
|
|
237
|
+
const options = {
|
|
238
|
+
showHidden: Boolean(showHidden),
|
|
239
|
+
depth: Number(depth),
|
|
240
|
+
colors: Boolean(colors),
|
|
241
|
+
customInspect: Boolean(customInspect),
|
|
242
|
+
showProxy: Boolean(showProxy),
|
|
243
|
+
maxArrayLength: Number(maxArrayLength),
|
|
244
|
+
breakLength: Number(breakLength),
|
|
245
|
+
truncate: Number(truncate2),
|
|
246
|
+
seen,
|
|
247
|
+
inspect: inspect3,
|
|
248
|
+
stylize
|
|
249
|
+
};
|
|
250
|
+
if (options.colors) options.stylize = colorise;
|
|
251
|
+
return options;
|
|
252
|
+
}
|
|
253
|
+
__name(normaliseOptions, "normaliseOptions");
|
|
254
|
+
function isHighSurrogate(char) {
|
|
255
|
+
return char >= "\ud800" && char <= "\udbff";
|
|
256
|
+
}
|
|
257
|
+
__name(isHighSurrogate, "isHighSurrogate");
|
|
258
|
+
function truncate(string, length, tail = truncator) {
|
|
259
|
+
string = String(string);
|
|
260
|
+
const tailLength = tail.length;
|
|
261
|
+
const stringLength = string.length;
|
|
262
|
+
if (tailLength > length && stringLength > tailLength) return tail;
|
|
263
|
+
if (stringLength > length && stringLength > tailLength) {
|
|
264
|
+
let end = length - tailLength;
|
|
265
|
+
if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
|
|
266
|
+
return `${string.slice(0, end)}${tail}`;
|
|
267
|
+
}
|
|
268
|
+
return string;
|
|
269
|
+
}
|
|
270
|
+
__name(truncate, "truncate");
|
|
271
|
+
function inspectList(list, options, inspectItem, separator = ", ") {
|
|
272
|
+
inspectItem = inspectItem || options.inspect;
|
|
273
|
+
const size = list.length;
|
|
274
|
+
if (size === 0) return "";
|
|
275
|
+
const originalLength = options.truncate;
|
|
276
|
+
let output = "";
|
|
277
|
+
let peek = "";
|
|
278
|
+
let truncated = "";
|
|
279
|
+
for (let i = 0; i < size; i += 1) {
|
|
280
|
+
const last = i + 1 === list.length;
|
|
281
|
+
const secondToLast = i + 2 === list.length;
|
|
282
|
+
truncated = `${truncator}(${list.length - i})`;
|
|
283
|
+
const value = list[i];
|
|
284
|
+
options.truncate = originalLength - output.length - (last ? 0 : separator.length);
|
|
285
|
+
const string = peek || inspectItem(value, options) + (last ? "" : separator);
|
|
286
|
+
const nextLength = output.length + string.length;
|
|
287
|
+
const truncatedLength = nextLength + truncated.length;
|
|
288
|
+
if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
|
|
289
|
+
if (!last && !secondToLast && truncatedLength > originalLength) break;
|
|
290
|
+
peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
|
|
291
|
+
if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
|
|
292
|
+
output += string;
|
|
293
|
+
if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
|
|
294
|
+
truncated = `${truncator}(${list.length - i - 1})`;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
truncated = "";
|
|
298
|
+
}
|
|
299
|
+
return `${output}${truncated}`;
|
|
300
|
+
}
|
|
301
|
+
__name(inspectList, "inspectList");
|
|
302
|
+
function quoteComplexKey(key) {
|
|
303
|
+
if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
|
|
304
|
+
return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
|
|
305
|
+
}
|
|
306
|
+
__name(quoteComplexKey, "quoteComplexKey");
|
|
307
|
+
function inspectProperty([key, value], options) {
|
|
308
|
+
options.truncate -= 2;
|
|
309
|
+
if (typeof key === "string") key = quoteComplexKey(key);
|
|
310
|
+
else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
|
|
311
|
+
options.truncate -= key.length;
|
|
312
|
+
value = options.inspect(value, options);
|
|
313
|
+
return `${key}: ${value}`;
|
|
314
|
+
}
|
|
315
|
+
__name(inspectProperty, "inspectProperty");
|
|
316
|
+
function inspectArray(array, options) {
|
|
317
|
+
const nonIndexProperties = Object.keys(array).slice(array.length);
|
|
318
|
+
if (!array.length && !nonIndexProperties.length) return "[]";
|
|
319
|
+
options.truncate -= 4;
|
|
320
|
+
const listContents = inspectList(array, options);
|
|
321
|
+
options.truncate -= listContents.length;
|
|
322
|
+
let propertyContents = "";
|
|
323
|
+
if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
|
|
324
|
+
return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
|
|
325
|
+
}
|
|
326
|
+
__name(inspectArray, "inspectArray");
|
|
327
|
+
var getArrayName = /* @__PURE__ */ __name((array) => {
|
|
328
|
+
if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
|
|
329
|
+
if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
|
|
330
|
+
return array.constructor.name;
|
|
331
|
+
}, "getArrayName");
|
|
332
|
+
function inspectTypedArray(array, options) {
|
|
333
|
+
const name = getArrayName(array);
|
|
334
|
+
options.truncate -= name.length + 4;
|
|
335
|
+
const nonIndexProperties = Object.keys(array).slice(array.length);
|
|
336
|
+
if (!array.length && !nonIndexProperties.length) return `${name}[]`;
|
|
337
|
+
let output = "";
|
|
338
|
+
for (let i = 0; i < array.length; i++) {
|
|
339
|
+
const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
|
|
340
|
+
options.truncate -= string.length;
|
|
341
|
+
if (array[i] !== array.length && options.truncate <= 3) {
|
|
342
|
+
output += `${truncator}(${array.length - array[i] + 1})`;
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
output += string;
|
|
346
|
+
}
|
|
347
|
+
let propertyContents = "";
|
|
348
|
+
if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
|
|
349
|
+
return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
|
|
350
|
+
}
|
|
351
|
+
__name(inspectTypedArray, "inspectTypedArray");
|
|
352
|
+
function inspectDate(dateObject, options) {
|
|
353
|
+
const stringRepresentation = dateObject.toJSON();
|
|
354
|
+
if (stringRepresentation === null) return "Invalid Date";
|
|
355
|
+
const split = stringRepresentation.split("T");
|
|
356
|
+
const date = split[0];
|
|
357
|
+
return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
|
|
358
|
+
}
|
|
359
|
+
__name(inspectDate, "inspectDate");
|
|
360
|
+
function inspectFunction(func, options) {
|
|
361
|
+
const functionType = func[Symbol.toStringTag] || "Function";
|
|
362
|
+
const name = func.name;
|
|
363
|
+
if (!name) return options.stylize(`[${functionType}]`, "special");
|
|
364
|
+
return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
|
|
365
|
+
}
|
|
366
|
+
__name(inspectFunction, "inspectFunction");
|
|
367
|
+
function inspectMapEntry([key, value], options) {
|
|
368
|
+
options.truncate -= 4;
|
|
369
|
+
key = options.inspect(key, options);
|
|
370
|
+
options.truncate -= key.length;
|
|
371
|
+
value = options.inspect(value, options);
|
|
372
|
+
return `${key} => ${value}`;
|
|
373
|
+
}
|
|
374
|
+
__name(inspectMapEntry, "inspectMapEntry");
|
|
375
|
+
function mapToEntries(map) {
|
|
376
|
+
const entries = [];
|
|
377
|
+
map.forEach((value, key) => {
|
|
378
|
+
entries.push([key, value]);
|
|
379
|
+
});
|
|
380
|
+
return entries;
|
|
381
|
+
}
|
|
382
|
+
__name(mapToEntries, "mapToEntries");
|
|
383
|
+
function inspectMap(map, options) {
|
|
384
|
+
if (map.size === 0) return "Map{}";
|
|
385
|
+
options.truncate -= 7;
|
|
386
|
+
return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
|
|
387
|
+
}
|
|
388
|
+
__name(inspectMap, "inspectMap");
|
|
389
|
+
var isNaN = Number.isNaN || ((i) => i !== i);
|
|
390
|
+
function inspectNumber(number, options) {
|
|
391
|
+
if (isNaN(number)) return options.stylize("NaN", "number");
|
|
392
|
+
if (number === Infinity) return options.stylize("Infinity", "number");
|
|
393
|
+
if (number === -Infinity) return options.stylize("-Infinity", "number");
|
|
394
|
+
if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
|
|
395
|
+
return options.stylize(truncate(String(number), options.truncate), "number");
|
|
396
|
+
}
|
|
397
|
+
__name(inspectNumber, "inspectNumber");
|
|
398
|
+
function inspectBigInt(number, options) {
|
|
399
|
+
let nums = truncate(number.toString(), options.truncate - 1);
|
|
400
|
+
if (nums !== truncator) nums += "n";
|
|
401
|
+
return options.stylize(nums, "bigint");
|
|
402
|
+
}
|
|
403
|
+
__name(inspectBigInt, "inspectBigInt");
|
|
404
|
+
function inspectRegExp(value, options) {
|
|
405
|
+
const flags = value.toString().split("/")[2];
|
|
406
|
+
const sourceLength = options.truncate - (2 + flags.length);
|
|
407
|
+
const source = value.source;
|
|
408
|
+
return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
|
|
409
|
+
}
|
|
410
|
+
__name(inspectRegExp, "inspectRegExp");
|
|
411
|
+
function arrayFromSet(set2) {
|
|
412
|
+
const values = [];
|
|
413
|
+
set2.forEach((value) => {
|
|
414
|
+
values.push(value);
|
|
415
|
+
});
|
|
416
|
+
return values;
|
|
417
|
+
}
|
|
418
|
+
__name(arrayFromSet, "arrayFromSet");
|
|
419
|
+
function inspectSet(set2, options) {
|
|
420
|
+
if (set2.size === 0) return "Set{}";
|
|
421
|
+
options.truncate -= 7;
|
|
422
|
+
return `Set{ ${inspectList(arrayFromSet(set2), options)} }`;
|
|
423
|
+
}
|
|
424
|
+
__name(inspectSet, "inspectSet");
|
|
425
|
+
var stringEscapeChars = /* @__PURE__ */ new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
|
|
426
|
+
var escapeCharacters = {
|
|
427
|
+
"\b": "\\b",
|
|
428
|
+
" ": "\\t",
|
|
429
|
+
"\n": "\\n",
|
|
430
|
+
"\f": "\\f",
|
|
431
|
+
"\r": "\\r",
|
|
432
|
+
"'": "\\'",
|
|
433
|
+
"\\": "\\\\"
|
|
434
|
+
};
|
|
435
|
+
var hex = 16;
|
|
436
|
+
var unicodeLength = 4;
|
|
437
|
+
function escape(char) {
|
|
438
|
+
return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-unicodeLength)}`;
|
|
439
|
+
}
|
|
440
|
+
__name(escape, "escape");
|
|
441
|
+
function inspectString(string, options) {
|
|
442
|
+
if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
|
|
443
|
+
return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
|
|
444
|
+
}
|
|
445
|
+
__name(inspectString, "inspectString");
|
|
446
|
+
function inspectSymbol(value) {
|
|
447
|
+
if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
|
|
448
|
+
return value.toString();
|
|
449
|
+
}
|
|
450
|
+
__name(inspectSymbol, "inspectSymbol");
|
|
451
|
+
var promise_default = /* @__PURE__ */ __name(() => "Promise{…}", "getPromiseValue");
|
|
452
|
+
function inspectObject(object, options) {
|
|
453
|
+
const properties = Object.getOwnPropertyNames(object);
|
|
454
|
+
const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
|
|
455
|
+
if (properties.length === 0 && symbols.length === 0) return "{}";
|
|
456
|
+
options.truncate -= 4;
|
|
457
|
+
options.seen = options.seen || [];
|
|
458
|
+
if (options.seen.includes(object)) return "[Circular]";
|
|
459
|
+
options.seen.push(object);
|
|
460
|
+
const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
|
|
461
|
+
const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
|
|
462
|
+
options.seen.pop();
|
|
463
|
+
let sep = "";
|
|
464
|
+
if (propertyContents && symbolContents) sep = ", ";
|
|
465
|
+
return `{ ${propertyContents}${sep}${symbolContents} }`;
|
|
466
|
+
}
|
|
467
|
+
__name(inspectObject, "inspectObject");
|
|
468
|
+
var toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
|
|
469
|
+
function inspectClass(value, options) {
|
|
470
|
+
let name = "";
|
|
471
|
+
if (toStringTag && toStringTag in value) name = value[toStringTag];
|
|
472
|
+
name = name || value.constructor.name;
|
|
473
|
+
if (!name || name === "_class") name = "<Anonymous Class>";
|
|
474
|
+
options.truncate -= name.length;
|
|
475
|
+
return `${name}${inspectObject(value, options)}`;
|
|
476
|
+
}
|
|
477
|
+
__name(inspectClass, "inspectClass");
|
|
478
|
+
function inspectArguments(args, options) {
|
|
479
|
+
if (args.length === 0) return "Arguments[]";
|
|
480
|
+
options.truncate -= 13;
|
|
481
|
+
return `Arguments[ ${inspectList(args, options)} ]`;
|
|
482
|
+
}
|
|
483
|
+
__name(inspectArguments, "inspectArguments");
|
|
484
|
+
var errorKeys = [
|
|
485
|
+
"stack",
|
|
486
|
+
"line",
|
|
487
|
+
"column",
|
|
488
|
+
"name",
|
|
489
|
+
"message",
|
|
490
|
+
"fileName",
|
|
491
|
+
"lineNumber",
|
|
492
|
+
"columnNumber",
|
|
493
|
+
"number",
|
|
494
|
+
"description",
|
|
495
|
+
"cause"
|
|
496
|
+
];
|
|
497
|
+
function inspectObject2(error, options) {
|
|
498
|
+
const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
|
|
499
|
+
const name = error.name;
|
|
500
|
+
options.truncate -= name.length;
|
|
501
|
+
let message = "";
|
|
502
|
+
if (typeof error.message === "string") message = truncate(error.message, options.truncate);
|
|
503
|
+
else properties.unshift("message");
|
|
504
|
+
message = message ? `: ${message}` : "";
|
|
505
|
+
options.truncate -= message.length + 5;
|
|
506
|
+
options.seen = options.seen || [];
|
|
507
|
+
if (options.seen.includes(error)) return "[Circular]";
|
|
508
|
+
options.seen.push(error);
|
|
509
|
+
const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
|
|
510
|
+
return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
|
|
511
|
+
}
|
|
512
|
+
__name(inspectObject2, "inspectObject");
|
|
513
|
+
function inspectAttribute([key, value], options) {
|
|
514
|
+
options.truncate -= 3;
|
|
515
|
+
if (!value) return `${options.stylize(String(key), "yellow")}`;
|
|
516
|
+
return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
|
|
517
|
+
}
|
|
518
|
+
__name(inspectAttribute, "inspectAttribute");
|
|
519
|
+
function inspectNodeCollection(collection, options) {
|
|
520
|
+
return inspectList(collection, options, inspectNode, "\n");
|
|
521
|
+
}
|
|
522
|
+
__name(inspectNodeCollection, "inspectNodeCollection");
|
|
523
|
+
function inspectNode(node, options) {
|
|
524
|
+
switch (node.nodeType) {
|
|
525
|
+
case 1: return inspectHTML(node, options);
|
|
526
|
+
case 3: return options.inspect(node.data, options);
|
|
527
|
+
default: return options.inspect(node, options);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
__name(inspectNode, "inspectNode");
|
|
531
|
+
function inspectHTML(element, options) {
|
|
532
|
+
const properties = element.getAttributeNames();
|
|
533
|
+
const name = element.tagName.toLowerCase();
|
|
534
|
+
const head = options.stylize(`<${name}`, "special");
|
|
535
|
+
const headClose = options.stylize(`>`, "special");
|
|
536
|
+
const tail = options.stylize(`</${name}>`, "special");
|
|
537
|
+
options.truncate -= name.length * 2 + 5;
|
|
538
|
+
let propertyContents = "";
|
|
539
|
+
if (properties.length > 0) {
|
|
540
|
+
propertyContents += " ";
|
|
541
|
+
propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
|
|
542
|
+
}
|
|
543
|
+
options.truncate -= propertyContents.length;
|
|
544
|
+
const truncate2 = options.truncate;
|
|
545
|
+
let children = inspectNodeCollection(element.children, options);
|
|
546
|
+
if (children && children.length > truncate2) children = `${truncator}(${element.children.length})`;
|
|
547
|
+
return `${head}${propertyContents}${headClose}${children}${tail}`;
|
|
548
|
+
}
|
|
549
|
+
__name(inspectHTML, "inspectHTML");
|
|
550
|
+
var chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? /* @__PURE__ */ Symbol.for("chai/inspect") : "@@chai/inspect";
|
|
551
|
+
var nodeInspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
|
|
552
|
+
var constructorMap = /* @__PURE__ */ new WeakMap();
|
|
553
|
+
var stringTagMap = {};
|
|
554
|
+
var baseTypesMap = {
|
|
555
|
+
undefined: /* @__PURE__ */ __name((value, options) => options.stylize("undefined", "undefined"), "undefined"),
|
|
556
|
+
null: /* @__PURE__ */ __name((value, options) => options.stylize("null", "null"), "null"),
|
|
557
|
+
boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "boolean"),
|
|
558
|
+
Boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "Boolean"),
|
|
559
|
+
number: inspectNumber,
|
|
560
|
+
Number: inspectNumber,
|
|
561
|
+
bigint: inspectBigInt,
|
|
562
|
+
BigInt: inspectBigInt,
|
|
563
|
+
string: inspectString,
|
|
564
|
+
String: inspectString,
|
|
565
|
+
function: inspectFunction,
|
|
566
|
+
Function: inspectFunction,
|
|
567
|
+
symbol: inspectSymbol,
|
|
568
|
+
Symbol: inspectSymbol,
|
|
569
|
+
Array: inspectArray,
|
|
570
|
+
Date: inspectDate,
|
|
571
|
+
Map: inspectMap,
|
|
572
|
+
Set: inspectSet,
|
|
573
|
+
RegExp: inspectRegExp,
|
|
574
|
+
Promise: promise_default,
|
|
575
|
+
WeakSet: /* @__PURE__ */ __name((value, options) => options.stylize("WeakSet{…}", "special"), "WeakSet"),
|
|
576
|
+
WeakMap: /* @__PURE__ */ __name((value, options) => options.stylize("WeakMap{…}", "special"), "WeakMap"),
|
|
577
|
+
Arguments: inspectArguments,
|
|
578
|
+
Int8Array: inspectTypedArray,
|
|
579
|
+
Uint8Array: inspectTypedArray,
|
|
580
|
+
Uint8ClampedArray: inspectTypedArray,
|
|
581
|
+
Int16Array: inspectTypedArray,
|
|
582
|
+
Uint16Array: inspectTypedArray,
|
|
583
|
+
Int32Array: inspectTypedArray,
|
|
584
|
+
Uint32Array: inspectTypedArray,
|
|
585
|
+
Float32Array: inspectTypedArray,
|
|
586
|
+
Float64Array: inspectTypedArray,
|
|
587
|
+
Generator: /* @__PURE__ */ __name(() => "", "Generator"),
|
|
588
|
+
DataView: /* @__PURE__ */ __name(() => "", "DataView"),
|
|
589
|
+
ArrayBuffer: /* @__PURE__ */ __name(() => "", "ArrayBuffer"),
|
|
590
|
+
Error: inspectObject2,
|
|
591
|
+
HTMLCollection: inspectNodeCollection,
|
|
592
|
+
NodeList: inspectNodeCollection
|
|
593
|
+
};
|
|
594
|
+
var inspectCustom = /* @__PURE__ */ __name((value, options, type3, inspectFn) => {
|
|
595
|
+
if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
|
|
596
|
+
if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
|
|
597
|
+
if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
|
|
598
|
+
if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
|
|
599
|
+
if (stringTagMap[type3]) return stringTagMap[type3](value, options);
|
|
600
|
+
return "";
|
|
601
|
+
}, "inspectCustom");
|
|
602
|
+
var toString = Object.prototype.toString;
|
|
603
|
+
function inspect(value, opts = {}) {
|
|
604
|
+
const options = normaliseOptions(opts, inspect);
|
|
605
|
+
const { customInspect } = options;
|
|
606
|
+
let type3 = value === null ? "null" : typeof value;
|
|
607
|
+
if (type3 === "object") type3 = toString.call(value).slice(8, -1);
|
|
608
|
+
if (type3 in baseTypesMap) return baseTypesMap[type3](value, options);
|
|
609
|
+
if (customInspect && value) {
|
|
610
|
+
const output = inspectCustom(value, options, type3, inspect);
|
|
611
|
+
if (output) {
|
|
612
|
+
if (typeof output === "string") return output;
|
|
613
|
+
return inspect(output, options);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
const proto = value ? Object.getPrototypeOf(value) : false;
|
|
617
|
+
if (proto === Object.prototype || proto === null) return inspectObject(value, options);
|
|
618
|
+
if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
|
|
619
|
+
if ("constructor" in value) {
|
|
620
|
+
if (value.constructor !== Object) return inspectClass(value, options);
|
|
621
|
+
return inspectObject(value, options);
|
|
622
|
+
}
|
|
623
|
+
if (value === Object(value)) return inspectObject(value, options);
|
|
624
|
+
return options.stylize(String(value), type3);
|
|
625
|
+
}
|
|
626
|
+
__name(inspect, "inspect");
|
|
627
|
+
var config = {
|
|
628
|
+
includeStack: false,
|
|
629
|
+
showDiff: true,
|
|
630
|
+
truncateThreshold: 40,
|
|
631
|
+
useProxy: true,
|
|
632
|
+
proxyExcludedKeys: [
|
|
633
|
+
"then",
|
|
634
|
+
"catch",
|
|
635
|
+
"inspect",
|
|
636
|
+
"toJSON"
|
|
637
|
+
],
|
|
638
|
+
deepEqual: null
|
|
639
|
+
};
|
|
640
|
+
function inspect2(obj, showHidden, depth, colors) {
|
|
641
|
+
return inspect(obj, {
|
|
642
|
+
colors,
|
|
643
|
+
depth: typeof depth === "undefined" ? 2 : depth,
|
|
644
|
+
showHidden,
|
|
645
|
+
truncate: config.truncateThreshold ? config.truncateThreshold : Infinity
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
__name(inspect2, "inspect");
|
|
649
|
+
function objDisplay(obj) {
|
|
650
|
+
let str = inspect2(obj), type3 = Object.prototype.toString.call(obj);
|
|
651
|
+
if (config.truncateThreshold && str.length >= config.truncateThreshold) if (type3 === "[object Function]") return !obj.name || obj.name === "" ? "[Function]" : "[Function: " + obj.name + "]";
|
|
652
|
+
else if (type3 === "[object Array]") return "[ Array(" + obj.length + ") ]";
|
|
653
|
+
else if (type3 === "[object Object]") {
|
|
654
|
+
let keys = Object.keys(obj);
|
|
655
|
+
return "{ Object (" + (keys.length > 2 ? keys.splice(0, 2).join(", ") + ", ..." : keys.join(", ")) + ") }";
|
|
656
|
+
} else return str;
|
|
657
|
+
else return str;
|
|
658
|
+
}
|
|
659
|
+
__name(objDisplay, "objDisplay");
|
|
660
|
+
function getMessage2(obj, args) {
|
|
661
|
+
let negate = flag(obj, "negate");
|
|
662
|
+
let val = flag(obj, "object");
|
|
663
|
+
let expected = args[3];
|
|
664
|
+
let actual = getActual(obj, args);
|
|
665
|
+
let msg = negate ? args[2] : args[1];
|
|
666
|
+
let flagMsg = flag(obj, "message");
|
|
667
|
+
if (typeof msg === "function") msg = msg();
|
|
668
|
+
msg = msg || "";
|
|
669
|
+
msg = msg.replace(/#\{this\}/g, function() {
|
|
670
|
+
return objDisplay(val);
|
|
671
|
+
}).replace(/#\{act\}/g, function() {
|
|
672
|
+
return objDisplay(actual);
|
|
673
|
+
}).replace(/#\{exp\}/g, function() {
|
|
674
|
+
return objDisplay(expected);
|
|
675
|
+
});
|
|
676
|
+
return flagMsg ? flagMsg + ": " + msg : msg;
|
|
677
|
+
}
|
|
678
|
+
__name(getMessage2, "getMessage");
|
|
679
|
+
function transferFlags(assertion, object, includeAll) {
|
|
680
|
+
let flags = assertion.__flags || (assertion.__flags = /* @__PURE__ */ Object.create(null));
|
|
681
|
+
if (!object.__flags) object.__flags = /* @__PURE__ */ Object.create(null);
|
|
682
|
+
includeAll = arguments.length === 3 ? includeAll : true;
|
|
683
|
+
for (let flag3 in flags) if (includeAll || flag3 !== "object" && flag3 !== "ssfi" && flag3 !== "lockSsfi" && flag3 != "message") object.__flags[flag3] = flags[flag3];
|
|
684
|
+
}
|
|
685
|
+
__name(transferFlags, "transferFlags");
|
|
686
|
+
function type2(obj) {
|
|
687
|
+
if (typeof obj === "undefined") return "undefined";
|
|
688
|
+
if (obj === null) return "null";
|
|
689
|
+
const stringTag = obj[Symbol.toStringTag];
|
|
690
|
+
if (typeof stringTag === "string") return stringTag;
|
|
691
|
+
return Object.prototype.toString.call(obj).slice(8, -1);
|
|
692
|
+
}
|
|
693
|
+
__name(type2, "type");
|
|
694
|
+
function FakeMap() {
|
|
695
|
+
this._key = "chai/deep-eql__" + Math.random() + Date.now();
|
|
696
|
+
}
|
|
697
|
+
__name(FakeMap, "FakeMap");
|
|
698
|
+
FakeMap.prototype = {
|
|
699
|
+
get: /* @__PURE__ */ __name(function get(key) {
|
|
700
|
+
return key[this._key];
|
|
701
|
+
}, "get"),
|
|
702
|
+
set: /* @__PURE__ */ __name(function set(key, value) {
|
|
703
|
+
if (Object.isExtensible(key)) Object.defineProperty(key, this._key, {
|
|
704
|
+
value,
|
|
705
|
+
configurable: true
|
|
706
|
+
});
|
|
707
|
+
}, "set")
|
|
708
|
+
};
|
|
709
|
+
var MemoizeMap = typeof WeakMap === "function" ? WeakMap : FakeMap;
|
|
710
|
+
function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
|
|
711
|
+
if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return null;
|
|
712
|
+
var leftHandMap = memoizeMap.get(leftHandOperand);
|
|
713
|
+
if (leftHandMap) {
|
|
714
|
+
var result = leftHandMap.get(rightHandOperand);
|
|
715
|
+
if (typeof result === "boolean") return result;
|
|
716
|
+
}
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
__name(memoizeCompare, "memoizeCompare");
|
|
720
|
+
function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
|
|
721
|
+
if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return;
|
|
722
|
+
var leftHandMap = memoizeMap.get(leftHandOperand);
|
|
723
|
+
if (leftHandMap) leftHandMap.set(rightHandOperand, result);
|
|
724
|
+
else {
|
|
725
|
+
leftHandMap = new MemoizeMap();
|
|
726
|
+
leftHandMap.set(rightHandOperand, result);
|
|
727
|
+
memoizeMap.set(leftHandOperand, leftHandMap);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
__name(memoizeSet, "memoizeSet");
|
|
731
|
+
var deep_eql_default = deepEqual;
|
|
732
|
+
function deepEqual(leftHandOperand, rightHandOperand, options) {
|
|
733
|
+
if (options && options.comparator) return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
|
|
734
|
+
var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
|
|
735
|
+
if (simpleResult !== null) return simpleResult;
|
|
736
|
+
return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
|
|
737
|
+
}
|
|
738
|
+
__name(deepEqual, "deepEqual");
|
|
739
|
+
function simpleEqual(leftHandOperand, rightHandOperand) {
|
|
740
|
+
if (leftHandOperand === rightHandOperand) return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
|
|
741
|
+
if (leftHandOperand !== leftHandOperand && rightHandOperand !== rightHandOperand) return true;
|
|
742
|
+
if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return false;
|
|
743
|
+
return null;
|
|
744
|
+
}
|
|
745
|
+
__name(simpleEqual, "simpleEqual");
|
|
746
|
+
function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
|
|
747
|
+
options = options || {};
|
|
748
|
+
options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
|
|
749
|
+
var comparator = options && options.comparator;
|
|
750
|
+
var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
|
|
751
|
+
if (memoizeResultLeft !== null) return memoizeResultLeft;
|
|
752
|
+
var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
|
|
753
|
+
if (memoizeResultRight !== null) return memoizeResultRight;
|
|
754
|
+
if (comparator) {
|
|
755
|
+
var comparatorResult = comparator(leftHandOperand, rightHandOperand);
|
|
756
|
+
if (comparatorResult === false || comparatorResult === true) {
|
|
757
|
+
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
|
|
758
|
+
return comparatorResult;
|
|
759
|
+
}
|
|
760
|
+
var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
|
|
761
|
+
if (simpleResult !== null) return simpleResult;
|
|
762
|
+
}
|
|
763
|
+
var leftHandType = type2(leftHandOperand);
|
|
764
|
+
if (leftHandType !== type2(rightHandOperand)) {
|
|
765
|
+
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
|
|
766
|
+
return false;
|
|
767
|
+
}
|
|
768
|
+
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
|
|
769
|
+
var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
|
|
770
|
+
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
|
|
771
|
+
return result;
|
|
772
|
+
}
|
|
773
|
+
__name(extensiveDeepEqual, "extensiveDeepEqual");
|
|
774
|
+
function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
|
|
775
|
+
switch (leftHandType) {
|
|
776
|
+
case "String":
|
|
777
|
+
case "Number":
|
|
778
|
+
case "Boolean":
|
|
779
|
+
case "Date": return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
|
|
780
|
+
case "Promise":
|
|
781
|
+
case "Symbol":
|
|
782
|
+
case "function":
|
|
783
|
+
case "WeakMap":
|
|
784
|
+
case "WeakSet": return leftHandOperand === rightHandOperand;
|
|
785
|
+
case "Error": return keysEqual(leftHandOperand, rightHandOperand, [
|
|
786
|
+
"name",
|
|
787
|
+
"message",
|
|
788
|
+
"code"
|
|
789
|
+
], options);
|
|
790
|
+
case "Arguments":
|
|
791
|
+
case "Int8Array":
|
|
792
|
+
case "Uint8Array":
|
|
793
|
+
case "Uint8ClampedArray":
|
|
794
|
+
case "Int16Array":
|
|
795
|
+
case "Uint16Array":
|
|
796
|
+
case "Int32Array":
|
|
797
|
+
case "Uint32Array":
|
|
798
|
+
case "Float32Array":
|
|
799
|
+
case "Float64Array":
|
|
800
|
+
case "Array": return iterableEqual(leftHandOperand, rightHandOperand, options);
|
|
801
|
+
case "RegExp": return regexpEqual(leftHandOperand, rightHandOperand);
|
|
802
|
+
case "Generator": return generatorEqual(leftHandOperand, rightHandOperand, options);
|
|
803
|
+
case "DataView": return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
|
|
804
|
+
case "ArrayBuffer": return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
|
|
805
|
+
case "Set": return entriesEqual(leftHandOperand, rightHandOperand, options);
|
|
806
|
+
case "Map": return entriesEqual(leftHandOperand, rightHandOperand, options);
|
|
807
|
+
case "Temporal.PlainDate":
|
|
808
|
+
case "Temporal.PlainTime":
|
|
809
|
+
case "Temporal.PlainDateTime":
|
|
810
|
+
case "Temporal.Instant":
|
|
811
|
+
case "Temporal.ZonedDateTime":
|
|
812
|
+
case "Temporal.PlainYearMonth":
|
|
813
|
+
case "Temporal.PlainMonthDay": return leftHandOperand.equals(rightHandOperand);
|
|
814
|
+
case "Temporal.Duration": return leftHandOperand.total("nanoseconds") === rightHandOperand.total("nanoseconds");
|
|
815
|
+
case "Temporal.TimeZone":
|
|
816
|
+
case "Temporal.Calendar": return leftHandOperand.toString() === rightHandOperand.toString();
|
|
817
|
+
default: return objectEqual(leftHandOperand, rightHandOperand, options);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
__name(extensiveDeepEqualByType, "extensiveDeepEqualByType");
|
|
821
|
+
function regexpEqual(leftHandOperand, rightHandOperand) {
|
|
822
|
+
return leftHandOperand.toString() === rightHandOperand.toString();
|
|
823
|
+
}
|
|
824
|
+
__name(regexpEqual, "regexpEqual");
|
|
825
|
+
function entriesEqual(leftHandOperand, rightHandOperand, options) {
|
|
826
|
+
try {
|
|
827
|
+
if (leftHandOperand.size !== rightHandOperand.size) return false;
|
|
828
|
+
if (leftHandOperand.size === 0) return true;
|
|
829
|
+
} catch (sizeError) {
|
|
830
|
+
return false;
|
|
831
|
+
}
|
|
832
|
+
var leftHandItems = [];
|
|
833
|
+
var rightHandItems = [];
|
|
834
|
+
leftHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
|
|
835
|
+
leftHandItems.push([key, value]);
|
|
836
|
+
}, "gatherEntries"));
|
|
837
|
+
rightHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
|
|
838
|
+
rightHandItems.push([key, value]);
|
|
839
|
+
}, "gatherEntries"));
|
|
840
|
+
return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
|
|
841
|
+
}
|
|
842
|
+
__name(entriesEqual, "entriesEqual");
|
|
843
|
+
function iterableEqual(leftHandOperand, rightHandOperand, options) {
|
|
844
|
+
var length = leftHandOperand.length;
|
|
845
|
+
if (length !== rightHandOperand.length) return false;
|
|
846
|
+
if (length === 0) return true;
|
|
847
|
+
var index = -1;
|
|
848
|
+
while (++index < length) if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) return false;
|
|
849
|
+
return true;
|
|
850
|
+
}
|
|
851
|
+
__name(iterableEqual, "iterableEqual");
|
|
852
|
+
function generatorEqual(leftHandOperand, rightHandOperand, options) {
|
|
853
|
+
return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
|
|
854
|
+
}
|
|
855
|
+
__name(generatorEqual, "generatorEqual");
|
|
856
|
+
function hasIteratorFunction(target) {
|
|
857
|
+
return typeof Symbol !== "undefined" && typeof target === "object" && typeof Symbol.iterator !== "undefined" && typeof target[Symbol.iterator] === "function";
|
|
858
|
+
}
|
|
859
|
+
__name(hasIteratorFunction, "hasIteratorFunction");
|
|
860
|
+
function getIteratorEntries(target) {
|
|
861
|
+
if (hasIteratorFunction(target)) try {
|
|
862
|
+
return getGeneratorEntries(target[Symbol.iterator]());
|
|
863
|
+
} catch (iteratorError) {
|
|
864
|
+
return [];
|
|
865
|
+
}
|
|
866
|
+
return [];
|
|
867
|
+
}
|
|
868
|
+
__name(getIteratorEntries, "getIteratorEntries");
|
|
869
|
+
function getGeneratorEntries(generator) {
|
|
870
|
+
var generatorResult = generator.next();
|
|
871
|
+
var accumulator = [generatorResult.value];
|
|
872
|
+
while (generatorResult.done === false) {
|
|
873
|
+
generatorResult = generator.next();
|
|
874
|
+
accumulator.push(generatorResult.value);
|
|
875
|
+
}
|
|
876
|
+
return accumulator;
|
|
877
|
+
}
|
|
878
|
+
__name(getGeneratorEntries, "getGeneratorEntries");
|
|
879
|
+
function getEnumerableKeys(target) {
|
|
880
|
+
var keys = [];
|
|
881
|
+
for (var key in target) keys.push(key);
|
|
882
|
+
return keys;
|
|
883
|
+
}
|
|
884
|
+
__name(getEnumerableKeys, "getEnumerableKeys");
|
|
885
|
+
function getEnumerableSymbols(target) {
|
|
886
|
+
var keys = [];
|
|
887
|
+
var allKeys = Object.getOwnPropertySymbols(target);
|
|
888
|
+
for (var i = 0; i < allKeys.length; i += 1) {
|
|
889
|
+
var key = allKeys[i];
|
|
890
|
+
if (Object.getOwnPropertyDescriptor(target, key).enumerable) keys.push(key);
|
|
891
|
+
}
|
|
892
|
+
return keys;
|
|
893
|
+
}
|
|
894
|
+
__name(getEnumerableSymbols, "getEnumerableSymbols");
|
|
895
|
+
function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
|
|
896
|
+
var length = keys.length;
|
|
897
|
+
if (length === 0) return true;
|
|
898
|
+
for (var i = 0; i < length; i += 1) if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) return false;
|
|
899
|
+
return true;
|
|
900
|
+
}
|
|
901
|
+
__name(keysEqual, "keysEqual");
|
|
902
|
+
function objectEqual(leftHandOperand, rightHandOperand, options) {
|
|
903
|
+
var leftHandKeys = getEnumerableKeys(leftHandOperand);
|
|
904
|
+
var rightHandKeys = getEnumerableKeys(rightHandOperand);
|
|
905
|
+
var leftHandSymbols = getEnumerableSymbols(leftHandOperand);
|
|
906
|
+
var rightHandSymbols = getEnumerableSymbols(rightHandOperand);
|
|
907
|
+
leftHandKeys = leftHandKeys.concat(leftHandSymbols);
|
|
908
|
+
rightHandKeys = rightHandKeys.concat(rightHandSymbols);
|
|
909
|
+
if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
|
|
910
|
+
if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) return false;
|
|
911
|
+
return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
|
|
912
|
+
}
|
|
913
|
+
var leftHandEntries = getIteratorEntries(leftHandOperand);
|
|
914
|
+
var rightHandEntries = getIteratorEntries(rightHandOperand);
|
|
915
|
+
if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
|
|
916
|
+
leftHandEntries.sort();
|
|
917
|
+
rightHandEntries.sort();
|
|
918
|
+
return iterableEqual(leftHandEntries, rightHandEntries, options);
|
|
919
|
+
}
|
|
920
|
+
if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) return true;
|
|
921
|
+
return false;
|
|
922
|
+
}
|
|
923
|
+
__name(objectEqual, "objectEqual");
|
|
924
|
+
function isPrimitive(value) {
|
|
925
|
+
return value === null || typeof value !== "object";
|
|
926
|
+
}
|
|
927
|
+
__name(isPrimitive, "isPrimitive");
|
|
928
|
+
function mapSymbols(arr) {
|
|
929
|
+
return arr.map(/* @__PURE__ */ __name(function mapSymbol(entry) {
|
|
930
|
+
if (typeof entry === "symbol") return entry.toString();
|
|
931
|
+
return entry;
|
|
932
|
+
}, "mapSymbol"));
|
|
933
|
+
}
|
|
934
|
+
__name(mapSymbols, "mapSymbols");
|
|
935
|
+
function hasProperty(obj, name) {
|
|
936
|
+
if (typeof obj === "undefined" || obj === null) return false;
|
|
937
|
+
return name in Object(obj);
|
|
938
|
+
}
|
|
939
|
+
__name(hasProperty, "hasProperty");
|
|
940
|
+
function parsePath(path) {
|
|
941
|
+
return path.replace(/([^\\])\[/g, "$1.[").match(/(\\\.|[^.]+?)+/g).map((value) => {
|
|
942
|
+
if (value === "constructor" || value === "__proto__" || value === "prototype") return {};
|
|
943
|
+
const mArr = /^\[(\d+)\]$/.exec(value);
|
|
944
|
+
let parsed = null;
|
|
945
|
+
if (mArr) parsed = { i: parseFloat(mArr[1]) };
|
|
946
|
+
else parsed = { p: value.replace(/\\([.[\]])/g, "$1") };
|
|
947
|
+
return parsed;
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
__name(parsePath, "parsePath");
|
|
951
|
+
function internalGetPathValue(obj, parsed, pathDepth) {
|
|
952
|
+
let temporaryValue = obj;
|
|
953
|
+
let res = null;
|
|
954
|
+
pathDepth = typeof pathDepth === "undefined" ? parsed.length : pathDepth;
|
|
955
|
+
for (let i = 0; i < pathDepth; i++) {
|
|
956
|
+
const part = parsed[i];
|
|
957
|
+
if (temporaryValue) {
|
|
958
|
+
if (typeof part.p === "undefined") temporaryValue = temporaryValue[part.i];
|
|
959
|
+
else temporaryValue = temporaryValue[part.p];
|
|
960
|
+
if (i === pathDepth - 1) res = temporaryValue;
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
return res;
|
|
964
|
+
}
|
|
965
|
+
__name(internalGetPathValue, "internalGetPathValue");
|
|
966
|
+
function getPathInfo(obj, path) {
|
|
967
|
+
const parsed = parsePath(path);
|
|
968
|
+
const last = parsed[parsed.length - 1];
|
|
969
|
+
const info = {
|
|
970
|
+
parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj,
|
|
971
|
+
name: last.p || last.i,
|
|
972
|
+
value: internalGetPathValue(obj, parsed)
|
|
973
|
+
};
|
|
974
|
+
info.exists = hasProperty(info.parent, info.name);
|
|
975
|
+
return info;
|
|
976
|
+
}
|
|
977
|
+
__name(getPathInfo, "getPathInfo");
|
|
978
|
+
var _Assertion = class _Assertion {
|
|
979
|
+
/**
|
|
980
|
+
* Creates object for chaining.
|
|
981
|
+
* `Assertion` objects contain metadata in the form of flags. Three flags can
|
|
982
|
+
* be assigned during instantiation by passing arguments to this constructor:
|
|
983
|
+
*
|
|
984
|
+
* - `object`: This flag contains the target of the assertion. For example, in
|
|
985
|
+
* the assertion `expect(numKittens).to.equal(7);`, the `object` flag will
|
|
986
|
+
* contain `numKittens` so that the `equal` assertion can reference it when
|
|
987
|
+
* needed.
|
|
988
|
+
*
|
|
989
|
+
* - `message`: This flag contains an optional custom error message to be
|
|
990
|
+
* prepended to the error message that's generated by the assertion when it
|
|
991
|
+
* fails.
|
|
992
|
+
*
|
|
993
|
+
* - `ssfi`: This flag stands for "start stack function indicator". It
|
|
994
|
+
* contains a function reference that serves as the starting point for
|
|
995
|
+
* removing frames from the stack trace of the error that's created by the
|
|
996
|
+
* assertion when it fails. The goal is to provide a cleaner stack trace to
|
|
997
|
+
* end users by removing Chai's internal functions. Note that it only works
|
|
998
|
+
* in environments that support `Error.captureStackTrace`, and only when
|
|
999
|
+
* `Chai.config.includeStack` hasn't been set to `false`.
|
|
1000
|
+
*
|
|
1001
|
+
* - `lockSsfi`: This flag controls whether or not the given `ssfi` flag
|
|
1002
|
+
* should retain its current value, even as assertions are chained off of
|
|
1003
|
+
* this object. This is usually set to `true` when creating a new assertion
|
|
1004
|
+
* from within another assertion. It's also temporarily set to `true` before
|
|
1005
|
+
* an overwritten assertion gets called by the overwriting assertion.
|
|
1006
|
+
*
|
|
1007
|
+
* - `eql`: This flag contains the deepEqual function to be used by the assertion.
|
|
1008
|
+
*
|
|
1009
|
+
* @param {unknown} obj target of the assertion
|
|
1010
|
+
* @param {string} [msg] (optional) custom error message
|
|
1011
|
+
* @param {Function} [ssfi] (optional) starting point for removing stack frames
|
|
1012
|
+
* @param {boolean} [lockSsfi] (optional) whether or not the ssfi flag is locked
|
|
1013
|
+
*/
|
|
1014
|
+
constructor(obj, msg, ssfi, lockSsfi) {
|
|
1015
|
+
/** @type {{}} */
|
|
1016
|
+
__publicField(this, "__flags", {});
|
|
1017
|
+
flag(this, "ssfi", ssfi || _Assertion);
|
|
1018
|
+
flag(this, "lockSsfi", lockSsfi);
|
|
1019
|
+
flag(this, "object", obj);
|
|
1020
|
+
flag(this, "message", msg);
|
|
1021
|
+
flag(this, "eql", config.deepEqual || deep_eql_default);
|
|
1022
|
+
return proxify(this);
|
|
1023
|
+
}
|
|
1024
|
+
/** @returns {boolean} */
|
|
1025
|
+
static get includeStack() {
|
|
1026
|
+
console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
|
|
1027
|
+
return config.includeStack;
|
|
1028
|
+
}
|
|
1029
|
+
/** @param {boolean} value */
|
|
1030
|
+
static set includeStack(value) {
|
|
1031
|
+
console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
|
|
1032
|
+
config.includeStack = value;
|
|
1033
|
+
}
|
|
1034
|
+
/** @returns {boolean} */
|
|
1035
|
+
static get showDiff() {
|
|
1036
|
+
console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
|
|
1037
|
+
return config.showDiff;
|
|
1038
|
+
}
|
|
1039
|
+
/** @param {boolean} value */
|
|
1040
|
+
static set showDiff(value) {
|
|
1041
|
+
console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
|
|
1042
|
+
config.showDiff = value;
|
|
1043
|
+
}
|
|
1044
|
+
/**
|
|
1045
|
+
* @param {string} name
|
|
1046
|
+
* @param {Function} fn
|
|
1047
|
+
*/
|
|
1048
|
+
static addProperty(name, fn) {
|
|
1049
|
+
addProperty(this.prototype, name, fn);
|
|
1050
|
+
}
|
|
1051
|
+
/**
|
|
1052
|
+
* @param {string} name
|
|
1053
|
+
* @param {Function} fn
|
|
1054
|
+
*/
|
|
1055
|
+
static addMethod(name, fn) {
|
|
1056
|
+
addMethod(this.prototype, name, fn);
|
|
1057
|
+
}
|
|
1058
|
+
/**
|
|
1059
|
+
* @param {string} name
|
|
1060
|
+
* @param {Function} fn
|
|
1061
|
+
* @param {Function} chainingBehavior
|
|
1062
|
+
*/
|
|
1063
|
+
static addChainableMethod(name, fn, chainingBehavior) {
|
|
1064
|
+
addChainableMethod(this.prototype, name, fn, chainingBehavior);
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* @param {string} name
|
|
1068
|
+
* @param {Function} fn
|
|
1069
|
+
*/
|
|
1070
|
+
static overwriteProperty(name, fn) {
|
|
1071
|
+
overwriteProperty(this.prototype, name, fn);
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* @param {string} name
|
|
1075
|
+
* @param {Function} fn
|
|
1076
|
+
*/
|
|
1077
|
+
static overwriteMethod(name, fn) {
|
|
1078
|
+
overwriteMethod(this.prototype, name, fn);
|
|
1079
|
+
}
|
|
1080
|
+
/**
|
|
1081
|
+
* @param {string} name
|
|
1082
|
+
* @param {Function} fn
|
|
1083
|
+
* @param {Function} chainingBehavior
|
|
1084
|
+
*/
|
|
1085
|
+
static overwriteChainableMethod(name, fn, chainingBehavior) {
|
|
1086
|
+
overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
|
|
1087
|
+
}
|
|
1088
|
+
/**
|
|
1089
|
+
* ### .assert(expression, message, negateMessage, expected, actual, showDiff)
|
|
1090
|
+
*
|
|
1091
|
+
* Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
|
|
1092
|
+
*
|
|
1093
|
+
* @name assert
|
|
1094
|
+
* @param {unknown} _expr to be tested
|
|
1095
|
+
* @param {string | Function} msg or function that returns message to display if expression fails
|
|
1096
|
+
* @param {string | Function} _negateMsg or function that returns negatedMessage to display if negated expression fails
|
|
1097
|
+
* @param {unknown} expected value (remember to check for negation)
|
|
1098
|
+
* @param {unknown} _actual (optional) will default to `this.obj`
|
|
1099
|
+
* @param {boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
|
|
1100
|
+
* @returns {void}
|
|
1101
|
+
*/
|
|
1102
|
+
assert(_expr, msg, _negateMsg, expected, _actual, showDiff) {
|
|
1103
|
+
const ok = test(this, arguments);
|
|
1104
|
+
if (false !== showDiff) showDiff = true;
|
|
1105
|
+
if (void 0 === expected && void 0 === _actual) showDiff = false;
|
|
1106
|
+
if (true !== config.showDiff) showDiff = false;
|
|
1107
|
+
if (!ok) {
|
|
1108
|
+
msg = getMessage2(this, arguments);
|
|
1109
|
+
const assertionErrorObjectProperties = {
|
|
1110
|
+
actual: getActual(this, arguments),
|
|
1111
|
+
expected,
|
|
1112
|
+
showDiff
|
|
1113
|
+
};
|
|
1114
|
+
const operator = getOperator(this, arguments);
|
|
1115
|
+
if (operator) assertionErrorObjectProperties.operator = operator;
|
|
1116
|
+
throw new AssertionError(msg, assertionErrorObjectProperties, config.includeStack ? this.assert : flag(this, "ssfi"));
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
/**
|
|
1120
|
+
* Quick reference to stored `actual` value for plugin developers.
|
|
1121
|
+
*
|
|
1122
|
+
* @returns {unknown}
|
|
1123
|
+
*/
|
|
1124
|
+
get _obj() {
|
|
1125
|
+
return flag(this, "object");
|
|
1126
|
+
}
|
|
1127
|
+
/**
|
|
1128
|
+
* Quick reference to stored `actual` value for plugin developers.
|
|
1129
|
+
*
|
|
1130
|
+
* @param {unknown} val
|
|
1131
|
+
*/
|
|
1132
|
+
set _obj(val) {
|
|
1133
|
+
flag(this, "object", val);
|
|
1134
|
+
}
|
|
1135
|
+
};
|
|
1136
|
+
__name(_Assertion, "Assertion");
|
|
1137
|
+
var Assertion = _Assertion;
|
|
1138
|
+
var events = new EventTarget();
|
|
1139
|
+
var _PluginEvent = class _PluginEvent extends Event {
|
|
1140
|
+
constructor(type3, name, fn) {
|
|
1141
|
+
super(type3);
|
|
1142
|
+
this.name = String(name);
|
|
1143
|
+
this.fn = fn;
|
|
1144
|
+
}
|
|
1145
|
+
};
|
|
1146
|
+
__name(_PluginEvent, "PluginEvent");
|
|
1147
|
+
var PluginEvent = _PluginEvent;
|
|
1148
|
+
function isProxyEnabled() {
|
|
1149
|
+
return config.useProxy && typeof Proxy !== "undefined" && typeof Reflect !== "undefined";
|
|
1150
|
+
}
|
|
1151
|
+
__name(isProxyEnabled, "isProxyEnabled");
|
|
1152
|
+
function addProperty(ctx, name, getter) {
|
|
1153
|
+
getter = getter === void 0 ? function() {} : getter;
|
|
1154
|
+
Object.defineProperty(ctx, name, {
|
|
1155
|
+
get: /* @__PURE__ */ __name(function propertyGetter() {
|
|
1156
|
+
if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", propertyGetter);
|
|
1157
|
+
let result = getter.call(this);
|
|
1158
|
+
if (result !== void 0) return result;
|
|
1159
|
+
let newAssertion = new Assertion();
|
|
1160
|
+
transferFlags(this, newAssertion);
|
|
1161
|
+
return newAssertion;
|
|
1162
|
+
}, "propertyGetter"),
|
|
1163
|
+
configurable: true
|
|
1164
|
+
});
|
|
1165
|
+
events.dispatchEvent(new PluginEvent("addProperty", name, getter));
|
|
1166
|
+
}
|
|
1167
|
+
__name(addProperty, "addProperty");
|
|
1168
|
+
var fnLengthDesc = Object.getOwnPropertyDescriptor(function() {}, "length");
|
|
1169
|
+
function addLengthGuard(fn, assertionName, isChainable) {
|
|
1170
|
+
if (!fnLengthDesc.configurable) return fn;
|
|
1171
|
+
Object.defineProperty(fn, "length", { get: /* @__PURE__ */ __name(function() {
|
|
1172
|
+
if (isChainable) throw Error("Invalid Chai property: " + assertionName + ".length. Due to a compatibility issue, \"length\" cannot directly follow \"" + assertionName + "\". Use \"" + assertionName + ".lengthOf\" instead.");
|
|
1173
|
+
throw Error("Invalid Chai property: " + assertionName + ".length. See docs for proper usage of \"" + assertionName + "\".");
|
|
1174
|
+
}, "get") });
|
|
1175
|
+
return fn;
|
|
1176
|
+
}
|
|
1177
|
+
__name(addLengthGuard, "addLengthGuard");
|
|
1178
|
+
function getProperties(object) {
|
|
1179
|
+
let result = Object.getOwnPropertyNames(object);
|
|
1180
|
+
function addProperty2(property) {
|
|
1181
|
+
if (result.indexOf(property) === -1) result.push(property);
|
|
1182
|
+
}
|
|
1183
|
+
__name(addProperty2, "addProperty");
|
|
1184
|
+
let proto = Object.getPrototypeOf(object);
|
|
1185
|
+
while (proto !== null) {
|
|
1186
|
+
Object.getOwnPropertyNames(proto).forEach(addProperty2);
|
|
1187
|
+
proto = Object.getPrototypeOf(proto);
|
|
1188
|
+
}
|
|
1189
|
+
return result;
|
|
1190
|
+
}
|
|
1191
|
+
__name(getProperties, "getProperties");
|
|
1192
|
+
var builtins = [
|
|
1193
|
+
"__flags",
|
|
1194
|
+
"__methods",
|
|
1195
|
+
"_obj",
|
|
1196
|
+
"assert"
|
|
1197
|
+
];
|
|
1198
|
+
function proxify(obj, nonChainableMethodName) {
|
|
1199
|
+
if (!isProxyEnabled()) return obj;
|
|
1200
|
+
return new Proxy(obj, { get: /* @__PURE__ */ __name(function proxyGetter(target, property) {
|
|
1201
|
+
if (typeof property === "string" && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) {
|
|
1202
|
+
if (nonChainableMethodName) throw Error("Invalid Chai property: " + nonChainableMethodName + "." + property + ". See docs for proper usage of \"" + nonChainableMethodName + "\".");
|
|
1203
|
+
let suggestion = null;
|
|
1204
|
+
let suggestionDistance = 4;
|
|
1205
|
+
getProperties(target).forEach(function(prop) {
|
|
1206
|
+
if (!Object.prototype.hasOwnProperty(prop) && builtins.indexOf(prop) === -1) {
|
|
1207
|
+
let dist = stringDistanceCapped(property, prop, suggestionDistance);
|
|
1208
|
+
if (dist < suggestionDistance) {
|
|
1209
|
+
suggestion = prop;
|
|
1210
|
+
suggestionDistance = dist;
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
});
|
|
1214
|
+
if (suggestion !== null) throw Error("Invalid Chai property: " + property + ". Did you mean \"" + suggestion + "\"?");
|
|
1215
|
+
else throw Error("Invalid Chai property: " + property);
|
|
1216
|
+
}
|
|
1217
|
+
if (builtins.indexOf(property) === -1 && !flag(target, "lockSsfi")) flag(target, "ssfi", proxyGetter);
|
|
1218
|
+
return Reflect.get(target, property);
|
|
1219
|
+
}, "proxyGetter") });
|
|
1220
|
+
}
|
|
1221
|
+
__name(proxify, "proxify");
|
|
1222
|
+
function stringDistanceCapped(strA, strB, cap) {
|
|
1223
|
+
if (Math.abs(strA.length - strB.length) >= cap) return cap;
|
|
1224
|
+
let memo = [];
|
|
1225
|
+
for (let i = 0; i <= strA.length; i++) {
|
|
1226
|
+
memo[i] = Array(strB.length + 1).fill(0);
|
|
1227
|
+
memo[i][0] = i;
|
|
1228
|
+
}
|
|
1229
|
+
for (let j = 0; j < strB.length; j++) memo[0][j] = j;
|
|
1230
|
+
for (let i = 1; i <= strA.length; i++) {
|
|
1231
|
+
let ch = strA.charCodeAt(i - 1);
|
|
1232
|
+
for (let j = 1; j <= strB.length; j++) {
|
|
1233
|
+
if (Math.abs(i - j) >= cap) {
|
|
1234
|
+
memo[i][j] = cap;
|
|
1235
|
+
continue;
|
|
1236
|
+
}
|
|
1237
|
+
memo[i][j] = Math.min(memo[i - 1][j] + 1, memo[i][j - 1] + 1, memo[i - 1][j - 1] + (ch === strB.charCodeAt(j - 1) ? 0 : 1));
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
return memo[strA.length][strB.length];
|
|
1241
|
+
}
|
|
1242
|
+
__name(stringDistanceCapped, "stringDistanceCapped");
|
|
1243
|
+
function addMethod(ctx, name, method) {
|
|
1244
|
+
let methodWrapper = /* @__PURE__ */ __name(function() {
|
|
1245
|
+
if (!flag(this, "lockSsfi")) flag(this, "ssfi", methodWrapper);
|
|
1246
|
+
let result = method.apply(this, arguments);
|
|
1247
|
+
if (result !== void 0) return result;
|
|
1248
|
+
let newAssertion = new Assertion();
|
|
1249
|
+
transferFlags(this, newAssertion);
|
|
1250
|
+
return newAssertion;
|
|
1251
|
+
}, "methodWrapper");
|
|
1252
|
+
addLengthGuard(methodWrapper, name, false);
|
|
1253
|
+
ctx[name] = proxify(methodWrapper, name);
|
|
1254
|
+
events.dispatchEvent(new PluginEvent("addMethod", name, method));
|
|
1255
|
+
}
|
|
1256
|
+
__name(addMethod, "addMethod");
|
|
1257
|
+
function overwriteProperty(ctx, name, getter) {
|
|
1258
|
+
let _get = Object.getOwnPropertyDescriptor(ctx, name), _super = /* @__PURE__ */ __name(function() {}, "_super");
|
|
1259
|
+
if (_get && "function" === typeof _get.get) _super = _get.get;
|
|
1260
|
+
Object.defineProperty(ctx, name, {
|
|
1261
|
+
get: /* @__PURE__ */ __name(function overwritingPropertyGetter() {
|
|
1262
|
+
if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", overwritingPropertyGetter);
|
|
1263
|
+
let origLockSsfi = flag(this, "lockSsfi");
|
|
1264
|
+
flag(this, "lockSsfi", true);
|
|
1265
|
+
let result = getter(_super).call(this);
|
|
1266
|
+
flag(this, "lockSsfi", origLockSsfi);
|
|
1267
|
+
if (result !== void 0) return result;
|
|
1268
|
+
let newAssertion = new Assertion();
|
|
1269
|
+
transferFlags(this, newAssertion);
|
|
1270
|
+
return newAssertion;
|
|
1271
|
+
}, "overwritingPropertyGetter"),
|
|
1272
|
+
configurable: true
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
__name(overwriteProperty, "overwriteProperty");
|
|
1276
|
+
function overwriteMethod(ctx, name, method) {
|
|
1277
|
+
let _method = ctx[name], _super = /* @__PURE__ */ __name(function() {
|
|
1278
|
+
throw new Error(name + " is not a function");
|
|
1279
|
+
}, "_super");
|
|
1280
|
+
if (_method && "function" === typeof _method) _super = _method;
|
|
1281
|
+
let overwritingMethodWrapper = /* @__PURE__ */ __name(function() {
|
|
1282
|
+
if (!flag(this, "lockSsfi")) flag(this, "ssfi", overwritingMethodWrapper);
|
|
1283
|
+
let origLockSsfi = flag(this, "lockSsfi");
|
|
1284
|
+
flag(this, "lockSsfi", true);
|
|
1285
|
+
let result = method(_super).apply(this, arguments);
|
|
1286
|
+
flag(this, "lockSsfi", origLockSsfi);
|
|
1287
|
+
if (result !== void 0) return result;
|
|
1288
|
+
let newAssertion = new Assertion();
|
|
1289
|
+
transferFlags(this, newAssertion);
|
|
1290
|
+
return newAssertion;
|
|
1291
|
+
}, "overwritingMethodWrapper");
|
|
1292
|
+
addLengthGuard(overwritingMethodWrapper, name, false);
|
|
1293
|
+
ctx[name] = proxify(overwritingMethodWrapper, name);
|
|
1294
|
+
}
|
|
1295
|
+
__name(overwriteMethod, "overwriteMethod");
|
|
1296
|
+
var canSetPrototype = typeof Object.setPrototypeOf === "function";
|
|
1297
|
+
var testFn = /* @__PURE__ */ __name(function() {}, "testFn");
|
|
1298
|
+
var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) {
|
|
1299
|
+
let propDesc = Object.getOwnPropertyDescriptor(testFn, name);
|
|
1300
|
+
if (typeof propDesc !== "object") return true;
|
|
1301
|
+
return !propDesc.configurable;
|
|
1302
|
+
});
|
|
1303
|
+
var call = Function.prototype.call;
|
|
1304
|
+
var apply = Function.prototype.apply;
|
|
1305
|
+
var _PluginAddChainableMethodEvent = class _PluginAddChainableMethodEvent extends PluginEvent {
|
|
1306
|
+
constructor(type3, name, fn, chainingBehavior) {
|
|
1307
|
+
super(type3, name, fn);
|
|
1308
|
+
this.chainingBehavior = chainingBehavior;
|
|
1309
|
+
}
|
|
1310
|
+
};
|
|
1311
|
+
__name(_PluginAddChainableMethodEvent, "PluginAddChainableMethodEvent");
|
|
1312
|
+
var PluginAddChainableMethodEvent = _PluginAddChainableMethodEvent;
|
|
1313
|
+
function addChainableMethod(ctx, name, method, chainingBehavior) {
|
|
1314
|
+
if (typeof chainingBehavior !== "function") chainingBehavior = /* @__PURE__ */ __name(function() {}, "chainingBehavior");
|
|
1315
|
+
let chainableBehavior = {
|
|
1316
|
+
method,
|
|
1317
|
+
chainingBehavior
|
|
1318
|
+
};
|
|
1319
|
+
if (!ctx.__methods) ctx.__methods = {};
|
|
1320
|
+
ctx.__methods[name] = chainableBehavior;
|
|
1321
|
+
Object.defineProperty(ctx, name, {
|
|
1322
|
+
get: /* @__PURE__ */ __name(function chainableMethodGetter() {
|
|
1323
|
+
chainableBehavior.chainingBehavior.call(this);
|
|
1324
|
+
let chainableMethodWrapper = /* @__PURE__ */ __name(function() {
|
|
1325
|
+
if (!flag(this, "lockSsfi")) flag(this, "ssfi", chainableMethodWrapper);
|
|
1326
|
+
let result = chainableBehavior.method.apply(this, arguments);
|
|
1327
|
+
if (result !== void 0) return result;
|
|
1328
|
+
let newAssertion = new Assertion();
|
|
1329
|
+
transferFlags(this, newAssertion);
|
|
1330
|
+
return newAssertion;
|
|
1331
|
+
}, "chainableMethodWrapper");
|
|
1332
|
+
addLengthGuard(chainableMethodWrapper, name, true);
|
|
1333
|
+
if (canSetPrototype) {
|
|
1334
|
+
let prototype = Object.create(this);
|
|
1335
|
+
prototype.call = call;
|
|
1336
|
+
prototype.apply = apply;
|
|
1337
|
+
Object.setPrototypeOf(chainableMethodWrapper, prototype);
|
|
1338
|
+
} else Object.getOwnPropertyNames(ctx).forEach(function(asserterName) {
|
|
1339
|
+
if (excludeNames.indexOf(asserterName) !== -1) return;
|
|
1340
|
+
Object.defineProperty(chainableMethodWrapper, asserterName, Object.getOwnPropertyDescriptor(ctx, asserterName));
|
|
1341
|
+
});
|
|
1342
|
+
transferFlags(this, chainableMethodWrapper);
|
|
1343
|
+
return proxify(chainableMethodWrapper);
|
|
1344
|
+
}, "chainableMethodGetter"),
|
|
1345
|
+
configurable: true
|
|
1346
|
+
});
|
|
1347
|
+
events.dispatchEvent(new PluginAddChainableMethodEvent("addChainableMethod", name, method, chainingBehavior));
|
|
1348
|
+
}
|
|
1349
|
+
__name(addChainableMethod, "addChainableMethod");
|
|
1350
|
+
function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
|
|
1351
|
+
let chainableBehavior = ctx.__methods[name];
|
|
1352
|
+
let _chainingBehavior = chainableBehavior.chainingBehavior;
|
|
1353
|
+
chainableBehavior.chainingBehavior = /* @__PURE__ */ __name(function overwritingChainableMethodGetter() {
|
|
1354
|
+
let result = chainingBehavior(_chainingBehavior).call(this);
|
|
1355
|
+
if (result !== void 0) return result;
|
|
1356
|
+
let newAssertion = new Assertion();
|
|
1357
|
+
transferFlags(this, newAssertion);
|
|
1358
|
+
return newAssertion;
|
|
1359
|
+
}, "overwritingChainableMethodGetter");
|
|
1360
|
+
let _method = chainableBehavior.method;
|
|
1361
|
+
chainableBehavior.method = /* @__PURE__ */ __name(function overwritingChainableMethodWrapper() {
|
|
1362
|
+
let result = method(_method).apply(this, arguments);
|
|
1363
|
+
if (result !== void 0) return result;
|
|
1364
|
+
let newAssertion = new Assertion();
|
|
1365
|
+
transferFlags(this, newAssertion);
|
|
1366
|
+
return newAssertion;
|
|
1367
|
+
}, "overwritingChainableMethodWrapper");
|
|
1368
|
+
}
|
|
1369
|
+
__name(overwriteChainableMethod, "overwriteChainableMethod");
|
|
1370
|
+
function compareByInspect(a, b) {
|
|
1371
|
+
return inspect2(a) < inspect2(b) ? -1 : 1;
|
|
1372
|
+
}
|
|
1373
|
+
__name(compareByInspect, "compareByInspect");
|
|
1374
|
+
function getOwnEnumerablePropertySymbols(obj) {
|
|
1375
|
+
if (typeof Object.getOwnPropertySymbols !== "function") return [];
|
|
1376
|
+
return Object.getOwnPropertySymbols(obj).filter(function(sym) {
|
|
1377
|
+
return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
|
|
1378
|
+
});
|
|
1379
|
+
}
|
|
1380
|
+
__name(getOwnEnumerablePropertySymbols, "getOwnEnumerablePropertySymbols");
|
|
1381
|
+
function getOwnEnumerableProperties(obj) {
|
|
1382
|
+
return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
|
|
1383
|
+
}
|
|
1384
|
+
__name(getOwnEnumerableProperties, "getOwnEnumerableProperties");
|
|
1385
|
+
var isNaN2 = Number.isNaN;
|
|
1386
|
+
function isObjectType(obj) {
|
|
1387
|
+
let objectType = type(obj);
|
|
1388
|
+
return [
|
|
1389
|
+
"Array",
|
|
1390
|
+
"Object",
|
|
1391
|
+
"Function"
|
|
1392
|
+
].indexOf(objectType) !== -1;
|
|
1393
|
+
}
|
|
1394
|
+
__name(isObjectType, "isObjectType");
|
|
1395
|
+
function getOperator(obj, args) {
|
|
1396
|
+
let operator = flag(obj, "operator");
|
|
1397
|
+
let negate = flag(obj, "negate");
|
|
1398
|
+
let expected = args[3];
|
|
1399
|
+
let msg = negate ? args[2] : args[1];
|
|
1400
|
+
if (operator) return operator;
|
|
1401
|
+
if (typeof msg === "function") msg = msg();
|
|
1402
|
+
msg = msg || "";
|
|
1403
|
+
if (!msg) return;
|
|
1404
|
+
if (/\shave\s/.test(msg)) return;
|
|
1405
|
+
let isObject = isObjectType(expected);
|
|
1406
|
+
if (/\snot\s/.test(msg)) return isObject ? "notDeepStrictEqual" : "notStrictEqual";
|
|
1407
|
+
return isObject ? "deepStrictEqual" : "strictEqual";
|
|
1408
|
+
}
|
|
1409
|
+
__name(getOperator, "getOperator");
|
|
1410
|
+
function getName(fn) {
|
|
1411
|
+
return fn.name;
|
|
1412
|
+
}
|
|
1413
|
+
__name(getName, "getName");
|
|
1414
|
+
function isRegExp2(obj) {
|
|
1415
|
+
return Object.prototype.toString.call(obj) === "[object RegExp]";
|
|
1416
|
+
}
|
|
1417
|
+
__name(isRegExp2, "isRegExp");
|
|
1418
|
+
function isNumeric(obj) {
|
|
1419
|
+
return ["Number", "BigInt"].includes(type(obj));
|
|
1420
|
+
}
|
|
1421
|
+
__name(isNumeric, "isNumeric");
|
|
1422
|
+
var { flag: flag2 } = utils_exports;
|
|
1423
|
+
[
|
|
1424
|
+
"to",
|
|
1425
|
+
"be",
|
|
1426
|
+
"been",
|
|
1427
|
+
"is",
|
|
1428
|
+
"and",
|
|
1429
|
+
"has",
|
|
1430
|
+
"have",
|
|
1431
|
+
"with",
|
|
1432
|
+
"that",
|
|
1433
|
+
"which",
|
|
1434
|
+
"at",
|
|
1435
|
+
"of",
|
|
1436
|
+
"same",
|
|
1437
|
+
"but",
|
|
1438
|
+
"does",
|
|
1439
|
+
"still",
|
|
1440
|
+
"also"
|
|
1441
|
+
].forEach(function(chain) {
|
|
1442
|
+
Assertion.addProperty(chain);
|
|
1443
|
+
});
|
|
1444
|
+
Assertion.addProperty("not", function() {
|
|
1445
|
+
flag2(this, "negate", true);
|
|
1446
|
+
});
|
|
1447
|
+
Assertion.addProperty("deep", function() {
|
|
1448
|
+
flag2(this, "deep", true);
|
|
1449
|
+
});
|
|
1450
|
+
Assertion.addProperty("nested", function() {
|
|
1451
|
+
flag2(this, "nested", true);
|
|
1452
|
+
});
|
|
1453
|
+
Assertion.addProperty("own", function() {
|
|
1454
|
+
flag2(this, "own", true);
|
|
1455
|
+
});
|
|
1456
|
+
Assertion.addProperty("ordered", function() {
|
|
1457
|
+
flag2(this, "ordered", true);
|
|
1458
|
+
});
|
|
1459
|
+
Assertion.addProperty("any", function() {
|
|
1460
|
+
flag2(this, "any", true);
|
|
1461
|
+
flag2(this, "all", false);
|
|
1462
|
+
});
|
|
1463
|
+
Assertion.addProperty("all", function() {
|
|
1464
|
+
flag2(this, "all", true);
|
|
1465
|
+
flag2(this, "any", false);
|
|
1466
|
+
});
|
|
1467
|
+
var functionTypes = {
|
|
1468
|
+
function: [
|
|
1469
|
+
"function",
|
|
1470
|
+
"asyncfunction",
|
|
1471
|
+
"generatorfunction",
|
|
1472
|
+
"asyncgeneratorfunction"
|
|
1473
|
+
],
|
|
1474
|
+
asyncfunction: ["asyncfunction", "asyncgeneratorfunction"],
|
|
1475
|
+
generatorfunction: ["generatorfunction", "asyncgeneratorfunction"],
|
|
1476
|
+
asyncgeneratorfunction: ["asyncgeneratorfunction"]
|
|
1477
|
+
};
|
|
1478
|
+
function an(type3, msg) {
|
|
1479
|
+
if (msg) flag2(this, "message", msg);
|
|
1480
|
+
type3 = type3.toLowerCase();
|
|
1481
|
+
let obj = flag2(this, "object"), article = ~[
|
|
1482
|
+
"a",
|
|
1483
|
+
"e",
|
|
1484
|
+
"i",
|
|
1485
|
+
"o",
|
|
1486
|
+
"u"
|
|
1487
|
+
].indexOf(type3.charAt(0)) ? "an " : "a ";
|
|
1488
|
+
const detectedType = type(obj).toLowerCase();
|
|
1489
|
+
if (functionTypes["function"].includes(type3)) this.assert(functionTypes[type3].includes(detectedType), "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
|
|
1490
|
+
else this.assert(type3 === detectedType, "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
|
|
1491
|
+
}
|
|
1492
|
+
__name(an, "an");
|
|
1493
|
+
Assertion.addChainableMethod("an", an);
|
|
1494
|
+
Assertion.addChainableMethod("a", an);
|
|
1495
|
+
function SameValueZero(a, b) {
|
|
1496
|
+
return isNaN2(a) && isNaN2(b) || a === b;
|
|
1497
|
+
}
|
|
1498
|
+
__name(SameValueZero, "SameValueZero");
|
|
1499
|
+
function includeChainingBehavior() {
|
|
1500
|
+
flag2(this, "contains", true);
|
|
1501
|
+
}
|
|
1502
|
+
__name(includeChainingBehavior, "includeChainingBehavior");
|
|
1503
|
+
function include(val, msg) {
|
|
1504
|
+
if (msg) flag2(this, "message", msg);
|
|
1505
|
+
let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), negate = flag2(this, "negate"), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), descriptor = isDeep ? "deep " : "", isEql = isDeep ? flag2(this, "eql") : SameValueZero;
|
|
1506
|
+
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1507
|
+
let included = false;
|
|
1508
|
+
switch (objType) {
|
|
1509
|
+
case "string":
|
|
1510
|
+
included = obj.indexOf(val) !== -1;
|
|
1511
|
+
break;
|
|
1512
|
+
case "weakset":
|
|
1513
|
+
if (isDeep) throw new AssertionError(flagMsg + "unable to use .deep.include with WeakSet", void 0, ssfi);
|
|
1514
|
+
included = obj.has(val);
|
|
1515
|
+
break;
|
|
1516
|
+
case "map":
|
|
1517
|
+
obj.forEach(function(item) {
|
|
1518
|
+
included = included || isEql(item, val);
|
|
1519
|
+
});
|
|
1520
|
+
break;
|
|
1521
|
+
case "set":
|
|
1522
|
+
if (isDeep) obj.forEach(function(item) {
|
|
1523
|
+
included = included || isEql(item, val);
|
|
1524
|
+
});
|
|
1525
|
+
else included = obj.has(val);
|
|
1526
|
+
break;
|
|
1527
|
+
case "array":
|
|
1528
|
+
if (isDeep) included = obj.some(function(item) {
|
|
1529
|
+
return isEql(item, val);
|
|
1530
|
+
});
|
|
1531
|
+
else included = obj.indexOf(val) !== -1;
|
|
1532
|
+
break;
|
|
1533
|
+
default: {
|
|
1534
|
+
if (val !== Object(val)) throw new AssertionError(flagMsg + "the given combination of arguments (" + objType + " and " + type(val).toLowerCase() + ") is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a " + type(val).toLowerCase(), void 0, ssfi);
|
|
1535
|
+
let props = Object.keys(val);
|
|
1536
|
+
let firstErr = null;
|
|
1537
|
+
let numErrs = 0;
|
|
1538
|
+
props.forEach(function(prop) {
|
|
1539
|
+
let propAssertion = new Assertion(obj);
|
|
1540
|
+
transferFlags(this, propAssertion, true);
|
|
1541
|
+
flag2(propAssertion, "lockSsfi", true);
|
|
1542
|
+
if (!negate || props.length === 1) {
|
|
1543
|
+
propAssertion.property(prop, val[prop]);
|
|
1544
|
+
return;
|
|
1545
|
+
}
|
|
1546
|
+
try {
|
|
1547
|
+
propAssertion.property(prop, val[prop]);
|
|
1548
|
+
} catch (err) {
|
|
1549
|
+
if (!check_error_exports.compatibleConstructor(err, AssertionError)) throw err;
|
|
1550
|
+
if (firstErr === null) firstErr = err;
|
|
1551
|
+
numErrs++;
|
|
1552
|
+
}
|
|
1553
|
+
}, this);
|
|
1554
|
+
if (negate && props.length > 1 && numErrs === props.length) throw firstErr;
|
|
1555
|
+
return;
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
this.assert(included, "expected #{this} to " + descriptor + "include " + inspect2(val), "expected #{this} to not " + descriptor + "include " + inspect2(val));
|
|
1559
|
+
}
|
|
1560
|
+
__name(include, "include");
|
|
1561
|
+
Assertion.addChainableMethod("include", include, includeChainingBehavior);
|
|
1562
|
+
Assertion.addChainableMethod("contain", include, includeChainingBehavior);
|
|
1563
|
+
Assertion.addChainableMethod("contains", include, includeChainingBehavior);
|
|
1564
|
+
Assertion.addChainableMethod("includes", include, includeChainingBehavior);
|
|
1565
|
+
Assertion.addProperty("ok", function() {
|
|
1566
|
+
this.assert(flag2(this, "object"), "expected #{this} to be truthy", "expected #{this} to be falsy");
|
|
1567
|
+
});
|
|
1568
|
+
Assertion.addProperty("true", function() {
|
|
1569
|
+
this.assert(true === flag2(this, "object"), "expected #{this} to be true", "expected #{this} to be false", flag2(this, "negate") ? false : true);
|
|
1570
|
+
});
|
|
1571
|
+
Assertion.addProperty("numeric", function() {
|
|
1572
|
+
const object = flag2(this, "object");
|
|
1573
|
+
this.assert(["Number", "BigInt"].includes(type(object)), "expected #{this} to be numeric", "expected #{this} to not be numeric", flag2(this, "negate") ? false : true);
|
|
1574
|
+
});
|
|
1575
|
+
Assertion.addProperty("callable", function() {
|
|
1576
|
+
const val = flag2(this, "object");
|
|
1577
|
+
const ssfi = flag2(this, "ssfi");
|
|
1578
|
+
const message = flag2(this, "message");
|
|
1579
|
+
const msg = message ? `${message}: ` : "";
|
|
1580
|
+
const negate = flag2(this, "negate");
|
|
1581
|
+
const assertionMessage = negate ? `${msg}expected ${inspect2(val)} not to be a callable function` : `${msg}expected ${inspect2(val)} to be a callable function`;
|
|
1582
|
+
const isCallable = [
|
|
1583
|
+
"Function",
|
|
1584
|
+
"AsyncFunction",
|
|
1585
|
+
"GeneratorFunction",
|
|
1586
|
+
"AsyncGeneratorFunction"
|
|
1587
|
+
].includes(type(val));
|
|
1588
|
+
if (isCallable && negate || !isCallable && !negate) throw new AssertionError(assertionMessage, void 0, ssfi);
|
|
1589
|
+
});
|
|
1590
|
+
Assertion.addProperty("false", function() {
|
|
1591
|
+
this.assert(false === flag2(this, "object"), "expected #{this} to be false", "expected #{this} to be true", flag2(this, "negate") ? true : false);
|
|
1592
|
+
});
|
|
1593
|
+
Assertion.addProperty("null", function() {
|
|
1594
|
+
this.assert(null === flag2(this, "object"), "expected #{this} to be null", "expected #{this} not to be null");
|
|
1595
|
+
});
|
|
1596
|
+
Assertion.addProperty("undefined", function() {
|
|
1597
|
+
this.assert(void 0 === flag2(this, "object"), "expected #{this} to be undefined", "expected #{this} not to be undefined");
|
|
1598
|
+
});
|
|
1599
|
+
Assertion.addProperty("NaN", function() {
|
|
1600
|
+
this.assert(isNaN2(flag2(this, "object")), "expected #{this} to be NaN", "expected #{this} not to be NaN");
|
|
1601
|
+
});
|
|
1602
|
+
function assertExist() {
|
|
1603
|
+
let val = flag2(this, "object");
|
|
1604
|
+
this.assert(val !== null && val !== void 0, "expected #{this} to exist", "expected #{this} to not exist");
|
|
1605
|
+
}
|
|
1606
|
+
__name(assertExist, "assertExist");
|
|
1607
|
+
Assertion.addProperty("exist", assertExist);
|
|
1608
|
+
Assertion.addProperty("exists", assertExist);
|
|
1609
|
+
Assertion.addProperty("empty", function() {
|
|
1610
|
+
let val = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), itemsCount;
|
|
1611
|
+
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1612
|
+
switch (type(val).toLowerCase()) {
|
|
1613
|
+
case "array":
|
|
1614
|
+
case "string":
|
|
1615
|
+
itemsCount = val.length;
|
|
1616
|
+
break;
|
|
1617
|
+
case "map":
|
|
1618
|
+
case "set":
|
|
1619
|
+
itemsCount = val.size;
|
|
1620
|
+
break;
|
|
1621
|
+
case "weakmap":
|
|
1622
|
+
case "weakset": throw new AssertionError(flagMsg + ".empty was passed a weak collection", void 0, ssfi);
|
|
1623
|
+
case "function": throw new AssertionError((flagMsg + ".empty was passed a function " + getName(val)).trim(), void 0, ssfi);
|
|
1624
|
+
default:
|
|
1625
|
+
if (val !== Object(val)) throw new AssertionError(flagMsg + ".empty was passed non-string primitive " + inspect2(val), void 0, ssfi);
|
|
1626
|
+
itemsCount = Object.keys(val).length;
|
|
1627
|
+
}
|
|
1628
|
+
this.assert(0 === itemsCount, "expected #{this} to be empty", "expected #{this} not to be empty");
|
|
1629
|
+
});
|
|
1630
|
+
function checkArguments() {
|
|
1631
|
+
let type3 = type(flag2(this, "object"));
|
|
1632
|
+
this.assert("Arguments" === type3, "expected #{this} to be arguments but got " + type3, "expected #{this} to not be arguments");
|
|
1633
|
+
}
|
|
1634
|
+
__name(checkArguments, "checkArguments");
|
|
1635
|
+
Assertion.addProperty("arguments", checkArguments);
|
|
1636
|
+
Assertion.addProperty("Arguments", checkArguments);
|
|
1637
|
+
function assertEqual(val, msg) {
|
|
1638
|
+
if (msg) flag2(this, "message", msg);
|
|
1639
|
+
let obj = flag2(this, "object");
|
|
1640
|
+
if (flag2(this, "deep")) {
|
|
1641
|
+
let prevLockSsfi = flag2(this, "lockSsfi");
|
|
1642
|
+
flag2(this, "lockSsfi", true);
|
|
1643
|
+
this.eql(val);
|
|
1644
|
+
flag2(this, "lockSsfi", prevLockSsfi);
|
|
1645
|
+
} else this.assert(val === obj, "expected #{this} to equal #{exp}", "expected #{this} to not equal #{exp}", val, this._obj, true);
|
|
1646
|
+
}
|
|
1647
|
+
__name(assertEqual, "assertEqual");
|
|
1648
|
+
Assertion.addMethod("equal", assertEqual);
|
|
1649
|
+
Assertion.addMethod("equals", assertEqual);
|
|
1650
|
+
Assertion.addMethod("eq", assertEqual);
|
|
1651
|
+
function assertEql(obj, msg) {
|
|
1652
|
+
if (msg) flag2(this, "message", msg);
|
|
1653
|
+
let eql = flag2(this, "eql");
|
|
1654
|
+
this.assert(eql(obj, flag2(this, "object")), "expected #{this} to deeply equal #{exp}", "expected #{this} to not deeply equal #{exp}", obj, this._obj, true);
|
|
1655
|
+
}
|
|
1656
|
+
__name(assertEql, "assertEql");
|
|
1657
|
+
Assertion.addMethod("eql", assertEql);
|
|
1658
|
+
Assertion.addMethod("eqls", assertEql);
|
|
1659
|
+
function assertAbove(n, msg) {
|
|
1660
|
+
if (msg) flag2(this, "message", msg);
|
|
1661
|
+
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase();
|
|
1662
|
+
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1663
|
+
if (!doLength && objType === "date" && nType !== "date") throw new AssertionError(msgPrefix + "the argument to above must be a date", void 0, ssfi);
|
|
1664
|
+
else if (!isNumeric(n) && (doLength || isNumeric(obj))) throw new AssertionError(msgPrefix + "the argument to above must be a number", void 0, ssfi);
|
|
1665
|
+
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1666
|
+
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1667
|
+
throw new AssertionError(msgPrefix + "expected " + printObj + " to be a number or a date", void 0, ssfi);
|
|
1668
|
+
}
|
|
1669
|
+
if (doLength) {
|
|
1670
|
+
let descriptor = "length", itemsCount;
|
|
1671
|
+
if (objType === "map" || objType === "set") {
|
|
1672
|
+
descriptor = "size";
|
|
1673
|
+
itemsCount = obj.size;
|
|
1674
|
+
} else itemsCount = obj.length;
|
|
1675
|
+
this.assert(itemsCount > n, "expected #{this} to have a " + descriptor + " above #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " above #{exp}", n, itemsCount);
|
|
1676
|
+
} else this.assert(obj > n, "expected #{this} to be above #{exp}", "expected #{this} to be at most #{exp}", n);
|
|
1677
|
+
}
|
|
1678
|
+
__name(assertAbove, "assertAbove");
|
|
1679
|
+
Assertion.addMethod("above", assertAbove);
|
|
1680
|
+
Assertion.addMethod("gt", assertAbove);
|
|
1681
|
+
Assertion.addMethod("greaterThan", assertAbove);
|
|
1682
|
+
function assertLeast(n, msg) {
|
|
1683
|
+
if (msg) flag2(this, "message", msg);
|
|
1684
|
+
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
|
|
1685
|
+
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1686
|
+
if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to least must be a date";
|
|
1687
|
+
else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to least must be a number";
|
|
1688
|
+
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1689
|
+
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1690
|
+
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1691
|
+
} else shouldThrow = false;
|
|
1692
|
+
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1693
|
+
if (doLength) {
|
|
1694
|
+
let descriptor = "length", itemsCount;
|
|
1695
|
+
if (objType === "map" || objType === "set") {
|
|
1696
|
+
descriptor = "size";
|
|
1697
|
+
itemsCount = obj.size;
|
|
1698
|
+
} else itemsCount = obj.length;
|
|
1699
|
+
this.assert(itemsCount >= n, "expected #{this} to have a " + descriptor + " at least #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " below #{exp}", n, itemsCount);
|
|
1700
|
+
} else this.assert(obj >= n, "expected #{this} to be at least #{exp}", "expected #{this} to be below #{exp}", n);
|
|
1701
|
+
}
|
|
1702
|
+
__name(assertLeast, "assertLeast");
|
|
1703
|
+
Assertion.addMethod("least", assertLeast);
|
|
1704
|
+
Assertion.addMethod("gte", assertLeast);
|
|
1705
|
+
Assertion.addMethod("greaterThanOrEqual", assertLeast);
|
|
1706
|
+
function assertBelow(n, msg) {
|
|
1707
|
+
if (msg) flag2(this, "message", msg);
|
|
1708
|
+
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
|
|
1709
|
+
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1710
|
+
if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to below must be a date";
|
|
1711
|
+
else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to below must be a number";
|
|
1712
|
+
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1713
|
+
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1714
|
+
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1715
|
+
} else shouldThrow = false;
|
|
1716
|
+
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1717
|
+
if (doLength) {
|
|
1718
|
+
let descriptor = "length", itemsCount;
|
|
1719
|
+
if (objType === "map" || objType === "set") {
|
|
1720
|
+
descriptor = "size";
|
|
1721
|
+
itemsCount = obj.size;
|
|
1722
|
+
} else itemsCount = obj.length;
|
|
1723
|
+
this.assert(itemsCount < n, "expected #{this} to have a " + descriptor + " below #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " below #{exp}", n, itemsCount);
|
|
1724
|
+
} else this.assert(obj < n, "expected #{this} to be below #{exp}", "expected #{this} to be at least #{exp}", n);
|
|
1725
|
+
}
|
|
1726
|
+
__name(assertBelow, "assertBelow");
|
|
1727
|
+
Assertion.addMethod("below", assertBelow);
|
|
1728
|
+
Assertion.addMethod("lt", assertBelow);
|
|
1729
|
+
Assertion.addMethod("lessThan", assertBelow);
|
|
1730
|
+
function assertMost(n, msg) {
|
|
1731
|
+
if (msg) flag2(this, "message", msg);
|
|
1732
|
+
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
|
|
1733
|
+
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1734
|
+
if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to most must be a date";
|
|
1735
|
+
else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to most must be a number";
|
|
1736
|
+
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1737
|
+
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1738
|
+
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1739
|
+
} else shouldThrow = false;
|
|
1740
|
+
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1741
|
+
if (doLength) {
|
|
1742
|
+
let descriptor = "length", itemsCount;
|
|
1743
|
+
if (objType === "map" || objType === "set") {
|
|
1744
|
+
descriptor = "size";
|
|
1745
|
+
itemsCount = obj.size;
|
|
1746
|
+
} else itemsCount = obj.length;
|
|
1747
|
+
this.assert(itemsCount <= n, "expected #{this} to have a " + descriptor + " at most #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " above #{exp}", n, itemsCount);
|
|
1748
|
+
} else this.assert(obj <= n, "expected #{this} to be at most #{exp}", "expected #{this} to be above #{exp}", n);
|
|
1749
|
+
}
|
|
1750
|
+
__name(assertMost, "assertMost");
|
|
1751
|
+
Assertion.addMethod("most", assertMost);
|
|
1752
|
+
Assertion.addMethod("lte", assertMost);
|
|
1753
|
+
Assertion.addMethod("lessThanOrEqual", assertMost);
|
|
1754
|
+
Assertion.addMethod("within", function(start, finish, msg) {
|
|
1755
|
+
if (msg) flag2(this, "message", msg);
|
|
1756
|
+
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), startType = type(start).toLowerCase(), finishType = type(finish).toLowerCase(), errorMessage, shouldThrow = true, range = startType === "date" && finishType === "date" ? start.toISOString() + ".." + finish.toISOString() : start + ".." + finish;
|
|
1757
|
+
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1758
|
+
if (!doLength && objType === "date" && (startType !== "date" || finishType !== "date")) errorMessage = msgPrefix + "the arguments to within must be dates";
|
|
1759
|
+
else if ((!isNumeric(start) || !isNumeric(finish)) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the arguments to within must be numbers";
|
|
1760
|
+
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1761
|
+
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1762
|
+
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1763
|
+
} else shouldThrow = false;
|
|
1764
|
+
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1765
|
+
if (doLength) {
|
|
1766
|
+
let descriptor = "length", itemsCount;
|
|
1767
|
+
if (objType === "map" || objType === "set") {
|
|
1768
|
+
descriptor = "size";
|
|
1769
|
+
itemsCount = obj.size;
|
|
1770
|
+
} else itemsCount = obj.length;
|
|
1771
|
+
this.assert(itemsCount >= start && itemsCount <= finish, "expected #{this} to have a " + descriptor + " within " + range, "expected #{this} to not have a " + descriptor + " within " + range);
|
|
1772
|
+
} else this.assert(obj >= start && obj <= finish, "expected #{this} to be within " + range, "expected #{this} to not be within " + range);
|
|
1773
|
+
});
|
|
1774
|
+
function assertInstanceOf(constructor, msg) {
|
|
1775
|
+
if (msg) flag2(this, "message", msg);
|
|
1776
|
+
let target = flag2(this, "object");
|
|
1777
|
+
let ssfi = flag2(this, "ssfi");
|
|
1778
|
+
let flagMsg = flag2(this, "message");
|
|
1779
|
+
let isInstanceOf;
|
|
1780
|
+
try {
|
|
1781
|
+
isInstanceOf = target instanceof constructor;
|
|
1782
|
+
} catch (err) {
|
|
1783
|
+
if (err instanceof TypeError) {
|
|
1784
|
+
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1785
|
+
throw new AssertionError(flagMsg + "The instanceof assertion needs a constructor but " + type(constructor) + " was given.", void 0, ssfi);
|
|
1786
|
+
}
|
|
1787
|
+
throw err;
|
|
1788
|
+
}
|
|
1789
|
+
let name = getName(constructor);
|
|
1790
|
+
if (name == null) name = "an unnamed constructor";
|
|
1791
|
+
this.assert(isInstanceOf, "expected #{this} to be an instance of " + name, "expected #{this} to not be an instance of " + name);
|
|
1792
|
+
}
|
|
1793
|
+
__name(assertInstanceOf, "assertInstanceOf");
|
|
1794
|
+
Assertion.addMethod("instanceof", assertInstanceOf);
|
|
1795
|
+
Assertion.addMethod("instanceOf", assertInstanceOf);
|
|
1796
|
+
function assertProperty(name, val, msg) {
|
|
1797
|
+
if (msg) flag2(this, "message", msg);
|
|
1798
|
+
let isNested = flag2(this, "nested"), isOwn = flag2(this, "own"), flagMsg = flag2(this, "message"), obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), nameType = typeof name;
|
|
1799
|
+
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1800
|
+
if (isNested) {
|
|
1801
|
+
if (nameType !== "string") throw new AssertionError(flagMsg + "the argument to property must be a string when using nested syntax", void 0, ssfi);
|
|
1802
|
+
} else if (nameType !== "string" && nameType !== "number" && nameType !== "symbol") throw new AssertionError(flagMsg + "the argument to property must be a string, number, or symbol", void 0, ssfi);
|
|
1803
|
+
if (isNested && isOwn) throw new AssertionError(flagMsg + "The \"nested\" and \"own\" flags cannot be combined.", void 0, ssfi);
|
|
1804
|
+
if (obj === null || obj === void 0) throw new AssertionError(flagMsg + "Target cannot be null or undefined.", void 0, ssfi);
|
|
1805
|
+
let isDeep = flag2(this, "deep"), negate = flag2(this, "negate"), pathInfo = isNested ? getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name], isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
|
|
1806
|
+
let descriptor = "";
|
|
1807
|
+
if (isDeep) descriptor += "deep ";
|
|
1808
|
+
if (isOwn) descriptor += "own ";
|
|
1809
|
+
if (isNested) descriptor += "nested ";
|
|
1810
|
+
descriptor += "property ";
|
|
1811
|
+
let hasProperty2;
|
|
1812
|
+
if (isOwn) hasProperty2 = Object.prototype.hasOwnProperty.call(obj, name);
|
|
1813
|
+
else if (isNested) hasProperty2 = pathInfo.exists;
|
|
1814
|
+
else hasProperty2 = hasProperty(obj, name);
|
|
1815
|
+
if (!negate || arguments.length === 1) this.assert(hasProperty2, "expected #{this} to have " + descriptor + inspect2(name), "expected #{this} to not have " + descriptor + inspect2(name));
|
|
1816
|
+
if (arguments.length > 1) this.assert(hasProperty2 && isEql(val, value), "expected #{this} to have " + descriptor + inspect2(name) + " of #{exp}, but got #{act}", "expected #{this} to not have " + descriptor + inspect2(name) + " of #{act}", val, value);
|
|
1817
|
+
flag2(this, "object", value);
|
|
1818
|
+
}
|
|
1819
|
+
__name(assertProperty, "assertProperty");
|
|
1820
|
+
Assertion.addMethod("property", assertProperty);
|
|
1821
|
+
function assertOwnProperty(_name, _value, _msg) {
|
|
1822
|
+
flag2(this, "own", true);
|
|
1823
|
+
assertProperty.apply(this, arguments);
|
|
1824
|
+
}
|
|
1825
|
+
__name(assertOwnProperty, "assertOwnProperty");
|
|
1826
|
+
Assertion.addMethod("ownProperty", assertOwnProperty);
|
|
1827
|
+
Assertion.addMethod("haveOwnProperty", assertOwnProperty);
|
|
1828
|
+
function assertOwnPropertyDescriptor(name, descriptor, msg) {
|
|
1829
|
+
if (typeof descriptor === "string") {
|
|
1830
|
+
msg = descriptor;
|
|
1831
|
+
descriptor = null;
|
|
1832
|
+
}
|
|
1833
|
+
if (msg) flag2(this, "message", msg);
|
|
1834
|
+
let obj = flag2(this, "object");
|
|
1835
|
+
let actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
|
|
1836
|
+
let eql = flag2(this, "eql");
|
|
1837
|
+
if (actualDescriptor && descriptor) this.assert(eql(descriptor, actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to match " + inspect2(descriptor) + ", got " + inspect2(actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to not match " + inspect2(descriptor), descriptor, actualDescriptor, true);
|
|
1838
|
+
else this.assert(actualDescriptor, "expected #{this} to have an own property descriptor for " + inspect2(name), "expected #{this} to not have an own property descriptor for " + inspect2(name));
|
|
1839
|
+
flag2(this, "object", actualDescriptor);
|
|
1840
|
+
}
|
|
1841
|
+
__name(assertOwnPropertyDescriptor, "assertOwnPropertyDescriptor");
|
|
1842
|
+
Assertion.addMethod("ownPropertyDescriptor", assertOwnPropertyDescriptor);
|
|
1843
|
+
Assertion.addMethod("haveOwnPropertyDescriptor", assertOwnPropertyDescriptor);
|
|
1844
|
+
function assertLengthChain() {
|
|
1845
|
+
flag2(this, "doLength", true);
|
|
1846
|
+
}
|
|
1847
|
+
__name(assertLengthChain, "assertLengthChain");
|
|
1848
|
+
function assertLength(n, msg) {
|
|
1849
|
+
if (msg) flag2(this, "message", msg);
|
|
1850
|
+
let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), descriptor = "length", itemsCount;
|
|
1851
|
+
switch (objType) {
|
|
1852
|
+
case "map":
|
|
1853
|
+
case "set":
|
|
1854
|
+
descriptor = "size";
|
|
1855
|
+
itemsCount = obj.size;
|
|
1856
|
+
break;
|
|
1857
|
+
default:
|
|
1858
|
+
new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1859
|
+
itemsCount = obj.length;
|
|
1860
|
+
}
|
|
1861
|
+
this.assert(itemsCount == n, "expected #{this} to have a " + descriptor + " of #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " of #{act}", n, itemsCount);
|
|
1862
|
+
}
|
|
1863
|
+
__name(assertLength, "assertLength");
|
|
1864
|
+
Assertion.addChainableMethod("length", assertLength, assertLengthChain);
|
|
1865
|
+
Assertion.addChainableMethod("lengthOf", assertLength, assertLengthChain);
|
|
1866
|
+
function assertMatch(re, msg) {
|
|
1867
|
+
if (msg) flag2(this, "message", msg);
|
|
1868
|
+
let obj = flag2(this, "object");
|
|
1869
|
+
this.assert(re.exec(obj), "expected #{this} to match " + re, "expected #{this} not to match " + re);
|
|
1870
|
+
}
|
|
1871
|
+
__name(assertMatch, "assertMatch");
|
|
1872
|
+
Assertion.addMethod("match", assertMatch);
|
|
1873
|
+
Assertion.addMethod("matches", assertMatch);
|
|
1874
|
+
Assertion.addMethod("string", function(str, msg) {
|
|
1875
|
+
if (msg) flag2(this, "message", msg);
|
|
1876
|
+
let obj = flag2(this, "object");
|
|
1877
|
+
new Assertion(obj, flag2(this, "message"), flag2(this, "ssfi"), true).is.a("string");
|
|
1878
|
+
this.assert(~obj.indexOf(str), "expected #{this} to contain " + inspect2(str), "expected #{this} to not contain " + inspect2(str));
|
|
1879
|
+
});
|
|
1880
|
+
function assertKeys(keys) {
|
|
1881
|
+
let obj = flag2(this, "object"), objType = type(obj), keysType = type(keys), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), str, deepStr = "", actual, ok = true, flagMsg = flag2(this, "message");
|
|
1882
|
+
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1883
|
+
let mixedArgsMsg = flagMsg + "when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments";
|
|
1884
|
+
if (objType === "Map" || objType === "Set") {
|
|
1885
|
+
deepStr = isDeep ? "deeply " : "";
|
|
1886
|
+
actual = [];
|
|
1887
|
+
obj.forEach(function(val, key) {
|
|
1888
|
+
actual.push(key);
|
|
1889
|
+
});
|
|
1890
|
+
if (keysType !== "Array") keys = Array.prototype.slice.call(arguments);
|
|
1891
|
+
} else {
|
|
1892
|
+
actual = getOwnEnumerableProperties(obj);
|
|
1893
|
+
switch (keysType) {
|
|
1894
|
+
case "Array":
|
|
1895
|
+
if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
|
|
1896
|
+
break;
|
|
1897
|
+
case "Object":
|
|
1898
|
+
if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
|
|
1899
|
+
keys = Object.keys(keys);
|
|
1900
|
+
break;
|
|
1901
|
+
default: keys = Array.prototype.slice.call(arguments);
|
|
1902
|
+
}
|
|
1903
|
+
keys = keys.map(function(val) {
|
|
1904
|
+
return typeof val === "symbol" ? val : String(val);
|
|
1905
|
+
});
|
|
1906
|
+
}
|
|
1907
|
+
if (!keys.length) throw new AssertionError(flagMsg + "keys required", void 0, ssfi);
|
|
1908
|
+
let len = keys.length, any = flag2(this, "any"), all = flag2(this, "all"), expected = keys, isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
|
|
1909
|
+
if (!any && !all) all = true;
|
|
1910
|
+
if (any) ok = expected.some(function(expectedKey) {
|
|
1911
|
+
return actual.some(function(actualKey) {
|
|
1912
|
+
return isEql(expectedKey, actualKey);
|
|
1913
|
+
});
|
|
1914
|
+
});
|
|
1915
|
+
if (all) {
|
|
1916
|
+
ok = expected.every(function(expectedKey) {
|
|
1917
|
+
return actual.some(function(actualKey) {
|
|
1918
|
+
return isEql(expectedKey, actualKey);
|
|
1919
|
+
});
|
|
1920
|
+
});
|
|
1921
|
+
if (!flag2(this, "contains")) ok = ok && keys.length == actual.length;
|
|
1922
|
+
}
|
|
1923
|
+
if (len > 1) {
|
|
1924
|
+
keys = keys.map(function(key) {
|
|
1925
|
+
return inspect2(key);
|
|
1926
|
+
});
|
|
1927
|
+
let last = keys.pop();
|
|
1928
|
+
if (all) str = keys.join(", ") + ", and " + last;
|
|
1929
|
+
if (any) str = keys.join(", ") + ", or " + last;
|
|
1930
|
+
} else str = inspect2(keys[0]);
|
|
1931
|
+
str = (len > 1 ? "keys " : "key ") + str;
|
|
1932
|
+
str = (flag2(this, "contains") ? "contain " : "have ") + str;
|
|
1933
|
+
this.assert(ok, "expected #{this} to " + deepStr + str, "expected #{this} to not " + deepStr + str, expected.slice(0).sort(compareByInspect), actual.sort(compareByInspect), true);
|
|
1934
|
+
}
|
|
1935
|
+
__name(assertKeys, "assertKeys");
|
|
1936
|
+
Assertion.addMethod("keys", assertKeys);
|
|
1937
|
+
Assertion.addMethod("key", assertKeys);
|
|
1938
|
+
function assertThrows(errorLike, errMsgMatcher, msg) {
|
|
1939
|
+
if (msg) flag2(this, "message", msg);
|
|
1940
|
+
let obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), negate = flag2(this, "negate") || false;
|
|
1941
|
+
new Assertion(obj, flagMsg, ssfi, true).is.a("function");
|
|
1942
|
+
if (isRegExp2(errorLike) || typeof errorLike === "string") {
|
|
1943
|
+
errMsgMatcher = errorLike;
|
|
1944
|
+
errorLike = null;
|
|
1945
|
+
}
|
|
1946
|
+
let caughtErr;
|
|
1947
|
+
let errorWasThrown = false;
|
|
1948
|
+
try {
|
|
1949
|
+
obj();
|
|
1950
|
+
} catch (err) {
|
|
1951
|
+
errorWasThrown = true;
|
|
1952
|
+
caughtErr = err;
|
|
1953
|
+
}
|
|
1954
|
+
let everyArgIsUndefined = errorLike === void 0 && errMsgMatcher === void 0;
|
|
1955
|
+
let everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
|
|
1956
|
+
let errorLikeFail = false;
|
|
1957
|
+
let errMsgMatcherFail = false;
|
|
1958
|
+
if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
|
|
1959
|
+
let errorLikeString = "an error";
|
|
1960
|
+
if (errorLike instanceof Error) errorLikeString = "#{exp}";
|
|
1961
|
+
else if (errorLike) errorLikeString = check_error_exports.getConstructorName(errorLike);
|
|
1962
|
+
let actual = caughtErr;
|
|
1963
|
+
if (caughtErr instanceof Error) actual = caughtErr.toString();
|
|
1964
|
+
else if (typeof caughtErr === "string") actual = caughtErr;
|
|
1965
|
+
else if (caughtErr && (typeof caughtErr === "object" || typeof caughtErr === "function")) try {
|
|
1966
|
+
actual = check_error_exports.getConstructorName(caughtErr);
|
|
1967
|
+
} catch (_err) {}
|
|
1968
|
+
this.assert(errorWasThrown, "expected #{this} to throw " + errorLikeString, "expected #{this} to not throw an error but #{act} was thrown", errorLike && errorLike.toString(), actual);
|
|
1969
|
+
}
|
|
1970
|
+
if (errorLike && caughtErr) {
|
|
1971
|
+
if (errorLike instanceof Error) {
|
|
1972
|
+
if (check_error_exports.compatibleInstance(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
|
|
1973
|
+
else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr && !negate ? " but #{act} was thrown" : ""), errorLike.toString(), caughtErr.toString());
|
|
1974
|
+
}
|
|
1975
|
+
if (check_error_exports.compatibleConstructor(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
|
|
1976
|
+
else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
|
|
1977
|
+
}
|
|
1978
|
+
if (caughtErr && errMsgMatcher !== void 0 && errMsgMatcher !== null) {
|
|
1979
|
+
let placeholder = "including";
|
|
1980
|
+
if (isRegExp2(errMsgMatcher)) placeholder = "matching";
|
|
1981
|
+
if (check_error_exports.compatibleMessage(caughtErr, errMsgMatcher) === negate) if (everyArgIsDefined && negate) errMsgMatcherFail = true;
|
|
1982
|
+
else this.assert(negate, "expected #{this} to throw error " + placeholder + " #{exp} but got #{act}", "expected #{this} to throw error not " + placeholder + " #{exp}", errMsgMatcher, check_error_exports.getMessage(caughtErr));
|
|
1983
|
+
}
|
|
1984
|
+
if (errorLikeFail && errMsgMatcherFail) this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
|
|
1985
|
+
flag2(this, "object", caughtErr);
|
|
1986
|
+
}
|
|
1987
|
+
__name(assertThrows, "assertThrows");
|
|
1988
|
+
Assertion.addMethod("throw", assertThrows);
|
|
1989
|
+
Assertion.addMethod("throws", assertThrows);
|
|
1990
|
+
Assertion.addMethod("Throw", assertThrows);
|
|
1991
|
+
function respondTo(method, msg) {
|
|
1992
|
+
if (msg) flag2(this, "message", msg);
|
|
1993
|
+
let obj = flag2(this, "object"), itself = flag2(this, "itself"), context = "function" === typeof obj && !itself ? obj.prototype[method] : obj[method];
|
|
1994
|
+
this.assert("function" === typeof context, "expected #{this} to respond to " + inspect2(method), "expected #{this} to not respond to " + inspect2(method));
|
|
1995
|
+
}
|
|
1996
|
+
__name(respondTo, "respondTo");
|
|
1997
|
+
Assertion.addMethod("respondTo", respondTo);
|
|
1998
|
+
Assertion.addMethod("respondsTo", respondTo);
|
|
1999
|
+
Assertion.addProperty("itself", function() {
|
|
2000
|
+
flag2(this, "itself", true);
|
|
2001
|
+
});
|
|
2002
|
+
function satisfy(matcher, msg) {
|
|
2003
|
+
if (msg) flag2(this, "message", msg);
|
|
2004
|
+
let result = matcher(flag2(this, "object"));
|
|
2005
|
+
this.assert(result, "expected #{this} to satisfy " + objDisplay(matcher), "expected #{this} to not satisfy" + objDisplay(matcher), flag2(this, "negate") ? false : true, result);
|
|
2006
|
+
}
|
|
2007
|
+
__name(satisfy, "satisfy");
|
|
2008
|
+
Assertion.addMethod("satisfy", satisfy);
|
|
2009
|
+
Assertion.addMethod("satisfies", satisfy);
|
|
2010
|
+
function closeTo(expected, delta, msg) {
|
|
2011
|
+
if (msg) flag2(this, "message", msg);
|
|
2012
|
+
let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2013
|
+
new Assertion(obj, flagMsg, ssfi, true).is.numeric;
|
|
2014
|
+
let message = "A `delta` value is required for `closeTo`";
|
|
2015
|
+
if (delta == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
|
|
2016
|
+
new Assertion(delta, flagMsg, ssfi, true).is.numeric;
|
|
2017
|
+
message = "A `expected` value is required for `closeTo`";
|
|
2018
|
+
if (expected == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
|
|
2019
|
+
new Assertion(expected, flagMsg, ssfi, true).is.numeric;
|
|
2020
|
+
const abs = /* @__PURE__ */ __name((x) => x < 0 ? -x : x, "abs");
|
|
2021
|
+
const strip = /* @__PURE__ */ __name((number) => parseFloat(parseFloat(number).toPrecision(12)), "strip");
|
|
2022
|
+
this.assert(strip(abs(obj - expected)) <= delta, "expected #{this} to be close to " + expected + " +/- " + delta, "expected #{this} not to be close to " + expected + " +/- " + delta);
|
|
2023
|
+
}
|
|
2024
|
+
__name(closeTo, "closeTo");
|
|
2025
|
+
Assertion.addMethod("closeTo", closeTo);
|
|
2026
|
+
Assertion.addMethod("approximately", closeTo);
|
|
2027
|
+
function isSubsetOf(_subset, _superset, cmp, contains, ordered) {
|
|
2028
|
+
let superset = Array.from(_superset);
|
|
2029
|
+
let subset = Array.from(_subset);
|
|
2030
|
+
if (!contains) {
|
|
2031
|
+
if (subset.length !== superset.length) return false;
|
|
2032
|
+
superset = superset.slice();
|
|
2033
|
+
}
|
|
2034
|
+
return subset.every(function(elem, idx) {
|
|
2035
|
+
if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
|
|
2036
|
+
if (!cmp) {
|
|
2037
|
+
let matchIdx = superset.indexOf(elem);
|
|
2038
|
+
if (matchIdx === -1) return false;
|
|
2039
|
+
if (!contains) superset.splice(matchIdx, 1);
|
|
2040
|
+
return true;
|
|
2041
|
+
}
|
|
2042
|
+
return superset.some(function(elem2, matchIdx) {
|
|
2043
|
+
if (!cmp(elem, elem2)) return false;
|
|
2044
|
+
if (!contains) superset.splice(matchIdx, 1);
|
|
2045
|
+
return true;
|
|
2046
|
+
});
|
|
2047
|
+
});
|
|
2048
|
+
}
|
|
2049
|
+
__name(isSubsetOf, "isSubsetOf");
|
|
2050
|
+
Assertion.addMethod("members", function(subset, msg) {
|
|
2051
|
+
if (msg) flag2(this, "message", msg);
|
|
2052
|
+
let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2053
|
+
new Assertion(obj, flagMsg, ssfi, true).to.be.iterable;
|
|
2054
|
+
new Assertion(subset, flagMsg, ssfi, true).to.be.iterable;
|
|
2055
|
+
let contains = flag2(this, "contains");
|
|
2056
|
+
let ordered = flag2(this, "ordered");
|
|
2057
|
+
let subject, failMsg, failNegateMsg;
|
|
2058
|
+
if (contains) {
|
|
2059
|
+
subject = ordered ? "an ordered superset" : "a superset";
|
|
2060
|
+
failMsg = "expected #{this} to be " + subject + " of #{exp}";
|
|
2061
|
+
failNegateMsg = "expected #{this} to not be " + subject + " of #{exp}";
|
|
2062
|
+
} else {
|
|
2063
|
+
subject = ordered ? "ordered members" : "members";
|
|
2064
|
+
failMsg = "expected #{this} to have the same " + subject + " as #{exp}";
|
|
2065
|
+
failNegateMsg = "expected #{this} to not have the same " + subject + " as #{exp}";
|
|
2066
|
+
}
|
|
2067
|
+
let cmp = flag2(this, "deep") ? flag2(this, "eql") : void 0;
|
|
2068
|
+
this.assert(isSubsetOf(subset, obj, cmp, contains, ordered), failMsg, failNegateMsg, subset, obj, true);
|
|
2069
|
+
});
|
|
2070
|
+
Assertion.addProperty("iterable", function(msg) {
|
|
2071
|
+
if (msg) flag2(this, "message", msg);
|
|
2072
|
+
let obj = flag2(this, "object");
|
|
2073
|
+
this.assert(obj != void 0 && obj[Symbol.iterator], "expected #{this} to be an iterable", "expected #{this} to not be an iterable", obj);
|
|
2074
|
+
});
|
|
2075
|
+
function oneOf(list, msg) {
|
|
2076
|
+
if (msg) flag2(this, "message", msg);
|
|
2077
|
+
let expected = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), contains = flag2(this, "contains"), isDeep = flag2(this, "deep"), eql = flag2(this, "eql");
|
|
2078
|
+
new Assertion(list, flagMsg, ssfi, true).to.be.an("array");
|
|
2079
|
+
if (contains) this.assert(list.some(function(possibility) {
|
|
2080
|
+
return expected.indexOf(possibility) > -1;
|
|
2081
|
+
}), "expected #{this} to contain one of #{exp}", "expected #{this} to not contain one of #{exp}", list, expected);
|
|
2082
|
+
else if (isDeep) this.assert(list.some(function(possibility) {
|
|
2083
|
+
return eql(expected, possibility);
|
|
2084
|
+
}), "expected #{this} to deeply equal one of #{exp}", "expected #{this} to deeply equal one of #{exp}", list, expected);
|
|
2085
|
+
else this.assert(list.indexOf(expected) > -1, "expected #{this} to be one of #{exp}", "expected #{this} to not be one of #{exp}", list, expected);
|
|
2086
|
+
}
|
|
2087
|
+
__name(oneOf, "oneOf");
|
|
2088
|
+
Assertion.addMethod("oneOf", oneOf);
|
|
2089
|
+
function assertChanges(subject, prop, msg) {
|
|
2090
|
+
if (msg) flag2(this, "message", msg);
|
|
2091
|
+
let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2092
|
+
new Assertion(fn, flagMsg, ssfi, true).is.a("function");
|
|
2093
|
+
let initial;
|
|
2094
|
+
if (!prop) {
|
|
2095
|
+
new Assertion(subject, flagMsg, ssfi, true).is.a("function");
|
|
2096
|
+
initial = subject();
|
|
2097
|
+
} else {
|
|
2098
|
+
new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
|
2099
|
+
initial = subject[prop];
|
|
2100
|
+
}
|
|
2101
|
+
fn();
|
|
2102
|
+
let final = prop === void 0 || prop === null ? subject() : subject[prop];
|
|
2103
|
+
let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
|
|
2104
|
+
flag2(this, "deltaMsgObj", msgObj);
|
|
2105
|
+
flag2(this, "initialDeltaValue", initial);
|
|
2106
|
+
flag2(this, "finalDeltaValue", final);
|
|
2107
|
+
flag2(this, "deltaBehavior", "change");
|
|
2108
|
+
flag2(this, "realDelta", final !== initial);
|
|
2109
|
+
this.assert(initial !== final, "expected " + msgObj + " to change", "expected " + msgObj + " to not change");
|
|
2110
|
+
}
|
|
2111
|
+
__name(assertChanges, "assertChanges");
|
|
2112
|
+
Assertion.addMethod("change", assertChanges);
|
|
2113
|
+
Assertion.addMethod("changes", assertChanges);
|
|
2114
|
+
function assertIncreases(subject, prop, msg) {
|
|
2115
|
+
if (msg) flag2(this, "message", msg);
|
|
2116
|
+
let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2117
|
+
new Assertion(fn, flagMsg, ssfi, true).is.a("function");
|
|
2118
|
+
let initial;
|
|
2119
|
+
if (!prop) {
|
|
2120
|
+
new Assertion(subject, flagMsg, ssfi, true).is.a("function");
|
|
2121
|
+
initial = subject();
|
|
2122
|
+
} else {
|
|
2123
|
+
new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
|
2124
|
+
initial = subject[prop];
|
|
2125
|
+
}
|
|
2126
|
+
new Assertion(initial, flagMsg, ssfi, true).is.a("number");
|
|
2127
|
+
fn();
|
|
2128
|
+
let final = prop === void 0 || prop === null ? subject() : subject[prop];
|
|
2129
|
+
let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
|
|
2130
|
+
flag2(this, "deltaMsgObj", msgObj);
|
|
2131
|
+
flag2(this, "initialDeltaValue", initial);
|
|
2132
|
+
flag2(this, "finalDeltaValue", final);
|
|
2133
|
+
flag2(this, "deltaBehavior", "increase");
|
|
2134
|
+
flag2(this, "realDelta", final - initial);
|
|
2135
|
+
this.assert(final - initial > 0, "expected " + msgObj + " to increase", "expected " + msgObj + " to not increase");
|
|
2136
|
+
}
|
|
2137
|
+
__name(assertIncreases, "assertIncreases");
|
|
2138
|
+
Assertion.addMethod("increase", assertIncreases);
|
|
2139
|
+
Assertion.addMethod("increases", assertIncreases);
|
|
2140
|
+
function assertDecreases(subject, prop, msg) {
|
|
2141
|
+
if (msg) flag2(this, "message", msg);
|
|
2142
|
+
let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2143
|
+
new Assertion(fn, flagMsg, ssfi, true).is.a("function");
|
|
2144
|
+
let initial;
|
|
2145
|
+
if (!prop) {
|
|
2146
|
+
new Assertion(subject, flagMsg, ssfi, true).is.a("function");
|
|
2147
|
+
initial = subject();
|
|
2148
|
+
} else {
|
|
2149
|
+
new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
|
2150
|
+
initial = subject[prop];
|
|
2151
|
+
}
|
|
2152
|
+
new Assertion(initial, flagMsg, ssfi, true).is.a("number");
|
|
2153
|
+
fn();
|
|
2154
|
+
let final = prop === void 0 || prop === null ? subject() : subject[prop];
|
|
2155
|
+
let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
|
|
2156
|
+
flag2(this, "deltaMsgObj", msgObj);
|
|
2157
|
+
flag2(this, "initialDeltaValue", initial);
|
|
2158
|
+
flag2(this, "finalDeltaValue", final);
|
|
2159
|
+
flag2(this, "deltaBehavior", "decrease");
|
|
2160
|
+
flag2(this, "realDelta", initial - final);
|
|
2161
|
+
this.assert(final - initial < 0, "expected " + msgObj + " to decrease", "expected " + msgObj + " to not decrease");
|
|
2162
|
+
}
|
|
2163
|
+
__name(assertDecreases, "assertDecreases");
|
|
2164
|
+
Assertion.addMethod("decrease", assertDecreases);
|
|
2165
|
+
Assertion.addMethod("decreases", assertDecreases);
|
|
2166
|
+
function assertDelta(delta, msg) {
|
|
2167
|
+
if (msg) flag2(this, "message", msg);
|
|
2168
|
+
let msgObj = flag2(this, "deltaMsgObj");
|
|
2169
|
+
let initial = flag2(this, "initialDeltaValue");
|
|
2170
|
+
let final = flag2(this, "finalDeltaValue");
|
|
2171
|
+
let behavior = flag2(this, "deltaBehavior");
|
|
2172
|
+
let realDelta = flag2(this, "realDelta");
|
|
2173
|
+
let expression;
|
|
2174
|
+
if (behavior === "change") expression = Math.abs(final - initial) === Math.abs(delta);
|
|
2175
|
+
else expression = realDelta === Math.abs(delta);
|
|
2176
|
+
this.assert(expression, "expected " + msgObj + " to " + behavior + " by " + delta, "expected " + msgObj + " to not " + behavior + " by " + delta);
|
|
2177
|
+
}
|
|
2178
|
+
__name(assertDelta, "assertDelta");
|
|
2179
|
+
Assertion.addMethod("by", assertDelta);
|
|
2180
|
+
Assertion.addProperty("extensible", function() {
|
|
2181
|
+
let obj = flag2(this, "object");
|
|
2182
|
+
let isExtensible = obj === Object(obj) && Object.isExtensible(obj);
|
|
2183
|
+
this.assert(isExtensible, "expected #{this} to be extensible", "expected #{this} to not be extensible");
|
|
2184
|
+
});
|
|
2185
|
+
Assertion.addProperty("sealed", function() {
|
|
2186
|
+
let obj = flag2(this, "object");
|
|
2187
|
+
let isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
|
|
2188
|
+
this.assert(isSealed, "expected #{this} to be sealed", "expected #{this} to not be sealed");
|
|
2189
|
+
});
|
|
2190
|
+
Assertion.addProperty("frozen", function() {
|
|
2191
|
+
let obj = flag2(this, "object");
|
|
2192
|
+
let isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
|
|
2193
|
+
this.assert(isFrozen, "expected #{this} to be frozen", "expected #{this} to not be frozen");
|
|
2194
|
+
});
|
|
2195
|
+
Assertion.addProperty("finite", function(_msg) {
|
|
2196
|
+
let obj = flag2(this, "object");
|
|
2197
|
+
this.assert(typeof obj === "number" && isFinite(obj), "expected #{this} to be a finite number", "expected #{this} to not be a finite number");
|
|
2198
|
+
});
|
|
2199
|
+
function compareSubset(expected, actual) {
|
|
2200
|
+
if (expected === actual) return true;
|
|
2201
|
+
if (typeof actual !== typeof expected) return false;
|
|
2202
|
+
if (typeof expected !== "object" || expected === null) return expected === actual;
|
|
2203
|
+
if (!actual) return false;
|
|
2204
|
+
if (Array.isArray(expected)) {
|
|
2205
|
+
if (!Array.isArray(actual)) return false;
|
|
2206
|
+
return expected.every(function(exp) {
|
|
2207
|
+
return actual.some(function(act) {
|
|
2208
|
+
return compareSubset(exp, act);
|
|
2209
|
+
});
|
|
2210
|
+
});
|
|
2211
|
+
}
|
|
2212
|
+
if (expected instanceof Date) if (actual instanceof Date) return expected.getTime() === actual.getTime();
|
|
2213
|
+
else return false;
|
|
2214
|
+
return Object.keys(expected).every(function(key) {
|
|
2215
|
+
let expectedValue = expected[key];
|
|
2216
|
+
let actualValue = actual[key];
|
|
2217
|
+
if (typeof expectedValue === "object" && expectedValue !== null && actualValue !== null) return compareSubset(expectedValue, actualValue);
|
|
2218
|
+
if (typeof expectedValue === "function") return expectedValue(actualValue);
|
|
2219
|
+
return actualValue === expectedValue;
|
|
2220
|
+
});
|
|
2221
|
+
}
|
|
2222
|
+
__name(compareSubset, "compareSubset");
|
|
2223
|
+
Assertion.addMethod("containSubset", function(expected) {
|
|
2224
|
+
const actual = flag(this, "object");
|
|
2225
|
+
const showDiff = config.showDiff;
|
|
2226
|
+
this.assert(compareSubset(expected, actual), "expected #{act} to contain subset #{exp}", "expected #{act} to not contain subset #{exp}", expected, actual, showDiff);
|
|
2227
|
+
});
|
|
2228
|
+
function expect(val, message) {
|
|
2229
|
+
return new Assertion(val, message);
|
|
2230
|
+
}
|
|
2231
|
+
__name(expect, "expect");
|
|
2232
|
+
expect.fail = function(actual, expected, message, operator) {
|
|
2233
|
+
if (arguments.length < 2) {
|
|
2234
|
+
message = actual;
|
|
2235
|
+
actual = void 0;
|
|
2236
|
+
}
|
|
2237
|
+
message = message || "expect.fail()";
|
|
2238
|
+
throw new AssertionError(message, {
|
|
2239
|
+
actual,
|
|
2240
|
+
expected,
|
|
2241
|
+
operator
|
|
2242
|
+
}, expect.fail);
|
|
2243
|
+
};
|
|
2244
|
+
var should_exports = {};
|
|
2245
|
+
__export(should_exports, {
|
|
2246
|
+
Should: () => Should,
|
|
2247
|
+
should: () => should
|
|
2248
|
+
});
|
|
2249
|
+
function loadShould() {
|
|
2250
|
+
function shouldGetter() {
|
|
2251
|
+
if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === "function" && this instanceof Symbol || typeof BigInt === "function" && this instanceof BigInt) return new Assertion(this.valueOf(), null, shouldGetter);
|
|
2252
|
+
return new Assertion(this, null, shouldGetter);
|
|
2253
|
+
}
|
|
2254
|
+
__name(shouldGetter, "shouldGetter");
|
|
2255
|
+
function shouldSetter(value) {
|
|
2256
|
+
Object.defineProperty(this, "should", {
|
|
2257
|
+
value,
|
|
2258
|
+
enumerable: true,
|
|
2259
|
+
configurable: true,
|
|
2260
|
+
writable: true
|
|
2261
|
+
});
|
|
2262
|
+
}
|
|
2263
|
+
__name(shouldSetter, "shouldSetter");
|
|
2264
|
+
Object.defineProperty(Object.prototype, "should", {
|
|
2265
|
+
set: shouldSetter,
|
|
2266
|
+
get: shouldGetter,
|
|
2267
|
+
configurable: true
|
|
2268
|
+
});
|
|
2269
|
+
let should2 = {};
|
|
2270
|
+
should2.fail = function(actual, expected, message, operator) {
|
|
2271
|
+
if (arguments.length < 2) {
|
|
2272
|
+
message = actual;
|
|
2273
|
+
actual = void 0;
|
|
2274
|
+
}
|
|
2275
|
+
message = message || "should.fail()";
|
|
2276
|
+
throw new AssertionError(message, {
|
|
2277
|
+
actual,
|
|
2278
|
+
expected,
|
|
2279
|
+
operator
|
|
2280
|
+
}, should2.fail);
|
|
2281
|
+
};
|
|
2282
|
+
should2.equal = function(actual, expected, message) {
|
|
2283
|
+
new Assertion(actual, message).to.equal(expected);
|
|
2284
|
+
};
|
|
2285
|
+
should2.Throw = function(fn, errt, errs, msg) {
|
|
2286
|
+
new Assertion(fn, msg).to.Throw(errt, errs);
|
|
2287
|
+
};
|
|
2288
|
+
should2.exist = function(val, msg) {
|
|
2289
|
+
new Assertion(val, msg).to.exist;
|
|
2290
|
+
};
|
|
2291
|
+
should2.not = {};
|
|
2292
|
+
should2.not.equal = function(actual, expected, msg) {
|
|
2293
|
+
new Assertion(actual, msg).to.not.equal(expected);
|
|
2294
|
+
};
|
|
2295
|
+
should2.not.Throw = function(fn, errt, errs, msg) {
|
|
2296
|
+
new Assertion(fn, msg).to.not.Throw(errt, errs);
|
|
2297
|
+
};
|
|
2298
|
+
should2.not.exist = function(val, msg) {
|
|
2299
|
+
new Assertion(val, msg).to.not.exist;
|
|
2300
|
+
};
|
|
2301
|
+
should2["throw"] = should2["Throw"];
|
|
2302
|
+
should2.not["throw"] = should2.not["Throw"];
|
|
2303
|
+
return should2;
|
|
2304
|
+
}
|
|
2305
|
+
__name(loadShould, "loadShould");
|
|
2306
|
+
var should = loadShould;
|
|
2307
|
+
var Should = loadShould;
|
|
2308
|
+
function assert(express, errmsg) {
|
|
2309
|
+
new Assertion(null, null, assert, true).assert(express, errmsg, "[ negation message unavailable ]");
|
|
2310
|
+
}
|
|
2311
|
+
__name(assert, "assert");
|
|
2312
|
+
assert.fail = function(actual, expected, message, operator) {
|
|
2313
|
+
if (arguments.length < 2) {
|
|
2314
|
+
message = actual;
|
|
2315
|
+
actual = void 0;
|
|
2316
|
+
}
|
|
2317
|
+
message = message || "assert.fail()";
|
|
2318
|
+
throw new AssertionError(message, {
|
|
2319
|
+
actual,
|
|
2320
|
+
expected,
|
|
2321
|
+
operator
|
|
2322
|
+
}, assert.fail);
|
|
2323
|
+
};
|
|
2324
|
+
assert.isOk = function(val, msg) {
|
|
2325
|
+
new Assertion(val, msg, assert.isOk, true).is.ok;
|
|
2326
|
+
};
|
|
2327
|
+
assert.isNotOk = function(val, msg) {
|
|
2328
|
+
new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
|
|
2329
|
+
};
|
|
2330
|
+
assert.equal = function(act, exp, msg) {
|
|
2331
|
+
let test2 = new Assertion(act, msg, assert.equal, true);
|
|
2332
|
+
test2.assert(exp == flag(test2, "object"), "expected #{this} to equal #{exp}", "expected #{this} to not equal #{act}", exp, act, true);
|
|
2333
|
+
};
|
|
2334
|
+
assert.notEqual = function(act, exp, msg) {
|
|
2335
|
+
let test2 = new Assertion(act, msg, assert.notEqual, true);
|
|
2336
|
+
test2.assert(exp != flag(test2, "object"), "expected #{this} to not equal #{exp}", "expected #{this} to equal #{act}", exp, act, true);
|
|
2337
|
+
};
|
|
2338
|
+
assert.strictEqual = function(act, exp, msg) {
|
|
2339
|
+
new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
|
|
2340
|
+
};
|
|
2341
|
+
assert.notStrictEqual = function(act, exp, msg) {
|
|
2342
|
+
new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
|
|
2343
|
+
};
|
|
2344
|
+
assert.deepEqual = assert.deepStrictEqual = function(act, exp, msg) {
|
|
2345
|
+
new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
|
|
2346
|
+
};
|
|
2347
|
+
assert.notDeepEqual = function(act, exp, msg) {
|
|
2348
|
+
new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
|
|
2349
|
+
};
|
|
2350
|
+
assert.isAbove = function(val, abv, msg) {
|
|
2351
|
+
new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
|
|
2352
|
+
};
|
|
2353
|
+
assert.isAtLeast = function(val, atlst, msg) {
|
|
2354
|
+
new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
|
|
2355
|
+
};
|
|
2356
|
+
assert.isBelow = function(val, blw, msg) {
|
|
2357
|
+
new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
|
|
2358
|
+
};
|
|
2359
|
+
assert.isAtMost = function(val, atmst, msg) {
|
|
2360
|
+
new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
|
|
2361
|
+
};
|
|
2362
|
+
assert.isTrue = function(val, msg) {
|
|
2363
|
+
new Assertion(val, msg, assert.isTrue, true).is["true"];
|
|
2364
|
+
};
|
|
2365
|
+
assert.isNotTrue = function(val, msg) {
|
|
2366
|
+
new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
|
|
2367
|
+
};
|
|
2368
|
+
assert.isFalse = function(val, msg) {
|
|
2369
|
+
new Assertion(val, msg, assert.isFalse, true).is["false"];
|
|
2370
|
+
};
|
|
2371
|
+
assert.isNotFalse = function(val, msg) {
|
|
2372
|
+
new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
|
|
2373
|
+
};
|
|
2374
|
+
assert.isNull = function(val, msg) {
|
|
2375
|
+
new Assertion(val, msg, assert.isNull, true).to.equal(null);
|
|
2376
|
+
};
|
|
2377
|
+
assert.isNotNull = function(val, msg) {
|
|
2378
|
+
new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
|
|
2379
|
+
};
|
|
2380
|
+
assert.isNaN = function(val, msg) {
|
|
2381
|
+
new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
|
|
2382
|
+
};
|
|
2383
|
+
assert.isNotNaN = function(value, message) {
|
|
2384
|
+
new Assertion(value, message, assert.isNotNaN, true).not.to.be.NaN;
|
|
2385
|
+
};
|
|
2386
|
+
assert.exists = function(val, msg) {
|
|
2387
|
+
new Assertion(val, msg, assert.exists, true).to.exist;
|
|
2388
|
+
};
|
|
2389
|
+
assert.notExists = function(val, msg) {
|
|
2390
|
+
new Assertion(val, msg, assert.notExists, true).to.not.exist;
|
|
2391
|
+
};
|
|
2392
|
+
assert.isUndefined = function(val, msg) {
|
|
2393
|
+
new Assertion(val, msg, assert.isUndefined, true).to.equal(void 0);
|
|
2394
|
+
};
|
|
2395
|
+
assert.isDefined = function(val, msg) {
|
|
2396
|
+
new Assertion(val, msg, assert.isDefined, true).to.not.equal(void 0);
|
|
2397
|
+
};
|
|
2398
|
+
assert.isCallable = function(value, message) {
|
|
2399
|
+
new Assertion(value, message, assert.isCallable, true).is.callable;
|
|
2400
|
+
};
|
|
2401
|
+
assert.isNotCallable = function(value, message) {
|
|
2402
|
+
new Assertion(value, message, assert.isNotCallable, true).is.not.callable;
|
|
2403
|
+
};
|
|
2404
|
+
assert.isObject = function(val, msg) {
|
|
2405
|
+
new Assertion(val, msg, assert.isObject, true).to.be.a("object");
|
|
2406
|
+
};
|
|
2407
|
+
assert.isNotObject = function(val, msg) {
|
|
2408
|
+
new Assertion(val, msg, assert.isNotObject, true).to.not.be.a("object");
|
|
2409
|
+
};
|
|
2410
|
+
assert.isArray = function(val, msg) {
|
|
2411
|
+
new Assertion(val, msg, assert.isArray, true).to.be.an("array");
|
|
2412
|
+
};
|
|
2413
|
+
assert.isNotArray = function(val, msg) {
|
|
2414
|
+
new Assertion(val, msg, assert.isNotArray, true).to.not.be.an("array");
|
|
2415
|
+
};
|
|
2416
|
+
assert.isString = function(val, msg) {
|
|
2417
|
+
new Assertion(val, msg, assert.isString, true).to.be.a("string");
|
|
2418
|
+
};
|
|
2419
|
+
assert.isNotString = function(val, msg) {
|
|
2420
|
+
new Assertion(val, msg, assert.isNotString, true).to.not.be.a("string");
|
|
2421
|
+
};
|
|
2422
|
+
assert.isNumber = function(val, msg) {
|
|
2423
|
+
new Assertion(val, msg, assert.isNumber, true).to.be.a("number");
|
|
2424
|
+
};
|
|
2425
|
+
assert.isNotNumber = function(val, msg) {
|
|
2426
|
+
new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a("number");
|
|
2427
|
+
};
|
|
2428
|
+
assert.isNumeric = function(val, msg) {
|
|
2429
|
+
new Assertion(val, msg, assert.isNumeric, true).is.numeric;
|
|
2430
|
+
};
|
|
2431
|
+
assert.isNotNumeric = function(val, msg) {
|
|
2432
|
+
new Assertion(val, msg, assert.isNotNumeric, true).is.not.numeric;
|
|
2433
|
+
};
|
|
2434
|
+
assert.isFinite = function(val, msg) {
|
|
2435
|
+
new Assertion(val, msg, assert.isFinite, true).to.be.finite;
|
|
2436
|
+
};
|
|
2437
|
+
assert.isBoolean = function(val, msg) {
|
|
2438
|
+
new Assertion(val, msg, assert.isBoolean, true).to.be.a("boolean");
|
|
2439
|
+
};
|
|
2440
|
+
assert.isNotBoolean = function(val, msg) {
|
|
2441
|
+
new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a("boolean");
|
|
2442
|
+
};
|
|
2443
|
+
assert.typeOf = function(val, type3, msg) {
|
|
2444
|
+
new Assertion(val, msg, assert.typeOf, true).to.be.a(type3);
|
|
2445
|
+
};
|
|
2446
|
+
assert.notTypeOf = function(value, type3, message) {
|
|
2447
|
+
new Assertion(value, message, assert.notTypeOf, true).to.not.be.a(type3);
|
|
2448
|
+
};
|
|
2449
|
+
assert.instanceOf = function(val, type3, msg) {
|
|
2450
|
+
new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type3);
|
|
2451
|
+
};
|
|
2452
|
+
assert.notInstanceOf = function(val, type3, msg) {
|
|
2453
|
+
new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type3);
|
|
2454
|
+
};
|
|
2455
|
+
assert.include = function(exp, inc, msg) {
|
|
2456
|
+
new Assertion(exp, msg, assert.include, true).include(inc);
|
|
2457
|
+
};
|
|
2458
|
+
assert.notInclude = function(exp, inc, msg) {
|
|
2459
|
+
new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
|
|
2460
|
+
};
|
|
2461
|
+
assert.deepInclude = function(exp, inc, msg) {
|
|
2462
|
+
new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
|
|
2463
|
+
};
|
|
2464
|
+
assert.notDeepInclude = function(exp, inc, msg) {
|
|
2465
|
+
new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
|
|
2466
|
+
};
|
|
2467
|
+
assert.nestedInclude = function(exp, inc, msg) {
|
|
2468
|
+
new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
|
|
2469
|
+
};
|
|
2470
|
+
assert.notNestedInclude = function(exp, inc, msg) {
|
|
2471
|
+
new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc);
|
|
2472
|
+
};
|
|
2473
|
+
assert.deepNestedInclude = function(exp, inc, msg) {
|
|
2474
|
+
new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc);
|
|
2475
|
+
};
|
|
2476
|
+
assert.notDeepNestedInclude = function(exp, inc, msg) {
|
|
2477
|
+
new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc);
|
|
2478
|
+
};
|
|
2479
|
+
assert.ownInclude = function(exp, inc, msg) {
|
|
2480
|
+
new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
|
|
2481
|
+
};
|
|
2482
|
+
assert.notOwnInclude = function(exp, inc, msg) {
|
|
2483
|
+
new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
|
|
2484
|
+
};
|
|
2485
|
+
assert.deepOwnInclude = function(exp, inc, msg) {
|
|
2486
|
+
new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc);
|
|
2487
|
+
};
|
|
2488
|
+
assert.notDeepOwnInclude = function(exp, inc, msg) {
|
|
2489
|
+
new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc);
|
|
2490
|
+
};
|
|
2491
|
+
assert.match = function(exp, re, msg) {
|
|
2492
|
+
new Assertion(exp, msg, assert.match, true).to.match(re);
|
|
2493
|
+
};
|
|
2494
|
+
assert.notMatch = function(exp, re, msg) {
|
|
2495
|
+
new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
|
|
2496
|
+
};
|
|
2497
|
+
assert.property = function(obj, prop, msg) {
|
|
2498
|
+
new Assertion(obj, msg, assert.property, true).to.have.property(prop);
|
|
2499
|
+
};
|
|
2500
|
+
assert.notProperty = function(obj, prop, msg) {
|
|
2501
|
+
new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop);
|
|
2502
|
+
};
|
|
2503
|
+
assert.propertyVal = function(obj, prop, val, msg) {
|
|
2504
|
+
new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val);
|
|
2505
|
+
};
|
|
2506
|
+
assert.notPropertyVal = function(obj, prop, val, msg) {
|
|
2507
|
+
new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val);
|
|
2508
|
+
};
|
|
2509
|
+
assert.deepPropertyVal = function(obj, prop, val, msg) {
|
|
2510
|
+
new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val);
|
|
2511
|
+
};
|
|
2512
|
+
assert.notDeepPropertyVal = function(obj, prop, val, msg) {
|
|
2513
|
+
new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val);
|
|
2514
|
+
};
|
|
2515
|
+
assert.ownProperty = function(obj, prop, msg) {
|
|
2516
|
+
new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop);
|
|
2517
|
+
};
|
|
2518
|
+
assert.notOwnProperty = function(obj, prop, msg) {
|
|
2519
|
+
new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop);
|
|
2520
|
+
};
|
|
2521
|
+
assert.ownPropertyVal = function(obj, prop, value, msg) {
|
|
2522
|
+
new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value);
|
|
2523
|
+
};
|
|
2524
|
+
assert.notOwnPropertyVal = function(obj, prop, value, msg) {
|
|
2525
|
+
new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value);
|
|
2526
|
+
};
|
|
2527
|
+
assert.deepOwnPropertyVal = function(obj, prop, value, msg) {
|
|
2528
|
+
new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value);
|
|
2529
|
+
};
|
|
2530
|
+
assert.notDeepOwnPropertyVal = function(obj, prop, value, msg) {
|
|
2531
|
+
new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value);
|
|
2532
|
+
};
|
|
2533
|
+
assert.nestedProperty = function(obj, prop, msg) {
|
|
2534
|
+
new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop);
|
|
2535
|
+
};
|
|
2536
|
+
assert.notNestedProperty = function(obj, prop, msg) {
|
|
2537
|
+
new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop);
|
|
2538
|
+
};
|
|
2539
|
+
assert.nestedPropertyVal = function(obj, prop, val, msg) {
|
|
2540
|
+
new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val);
|
|
2541
|
+
};
|
|
2542
|
+
assert.notNestedPropertyVal = function(obj, prop, val, msg) {
|
|
2543
|
+
new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val);
|
|
2544
|
+
};
|
|
2545
|
+
assert.deepNestedPropertyVal = function(obj, prop, val, msg) {
|
|
2546
|
+
new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val);
|
|
2547
|
+
};
|
|
2548
|
+
assert.notDeepNestedPropertyVal = function(obj, prop, val, msg) {
|
|
2549
|
+
new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val);
|
|
2550
|
+
};
|
|
2551
|
+
assert.lengthOf = function(exp, len, msg) {
|
|
2552
|
+
new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
|
|
2553
|
+
};
|
|
2554
|
+
assert.hasAnyKeys = function(obj, keys, msg) {
|
|
2555
|
+
new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
|
|
2556
|
+
};
|
|
2557
|
+
assert.hasAllKeys = function(obj, keys, msg) {
|
|
2558
|
+
new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
|
|
2559
|
+
};
|
|
2560
|
+
assert.containsAllKeys = function(obj, keys, msg) {
|
|
2561
|
+
new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys);
|
|
2562
|
+
};
|
|
2563
|
+
assert.doesNotHaveAnyKeys = function(obj, keys, msg) {
|
|
2564
|
+
new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys);
|
|
2565
|
+
};
|
|
2566
|
+
assert.doesNotHaveAllKeys = function(obj, keys, msg) {
|
|
2567
|
+
new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys);
|
|
2568
|
+
};
|
|
2569
|
+
assert.hasAnyDeepKeys = function(obj, keys, msg) {
|
|
2570
|
+
new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys);
|
|
2571
|
+
};
|
|
2572
|
+
assert.hasAllDeepKeys = function(obj, keys, msg) {
|
|
2573
|
+
new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys);
|
|
2574
|
+
};
|
|
2575
|
+
assert.containsAllDeepKeys = function(obj, keys, msg) {
|
|
2576
|
+
new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys);
|
|
2577
|
+
};
|
|
2578
|
+
assert.doesNotHaveAnyDeepKeys = function(obj, keys, msg) {
|
|
2579
|
+
new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys);
|
|
2580
|
+
};
|
|
2581
|
+
assert.doesNotHaveAllDeepKeys = function(obj, keys, msg) {
|
|
2582
|
+
new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys);
|
|
2583
|
+
};
|
|
2584
|
+
assert.throws = function(fn, errorLike, errMsgMatcher, msg) {
|
|
2585
|
+
if ("string" === typeof errorLike || errorLike instanceof RegExp) {
|
|
2586
|
+
errMsgMatcher = errorLike;
|
|
2587
|
+
errorLike = null;
|
|
2588
|
+
}
|
|
2589
|
+
return flag(new Assertion(fn, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher), "object");
|
|
2590
|
+
};
|
|
2591
|
+
assert.doesNotThrow = function(fn, errorLike, errMsgMatcher, message) {
|
|
2592
|
+
if ("string" === typeof errorLike || errorLike instanceof RegExp) {
|
|
2593
|
+
errMsgMatcher = errorLike;
|
|
2594
|
+
errorLike = null;
|
|
2595
|
+
}
|
|
2596
|
+
new Assertion(fn, message, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher);
|
|
2597
|
+
};
|
|
2598
|
+
assert.operator = function(val, operator, val2, msg) {
|
|
2599
|
+
let ok;
|
|
2600
|
+
switch (operator) {
|
|
2601
|
+
case "==":
|
|
2602
|
+
ok = val == val2;
|
|
2603
|
+
break;
|
|
2604
|
+
case "===":
|
|
2605
|
+
ok = val === val2;
|
|
2606
|
+
break;
|
|
2607
|
+
case ">":
|
|
2608
|
+
ok = val > val2;
|
|
2609
|
+
break;
|
|
2610
|
+
case ">=":
|
|
2611
|
+
ok = val >= val2;
|
|
2612
|
+
break;
|
|
2613
|
+
case "<":
|
|
2614
|
+
ok = val < val2;
|
|
2615
|
+
break;
|
|
2616
|
+
case "<=":
|
|
2617
|
+
ok = val <= val2;
|
|
2618
|
+
break;
|
|
2619
|
+
case "!=":
|
|
2620
|
+
ok = val != val2;
|
|
2621
|
+
break;
|
|
2622
|
+
case "!==":
|
|
2623
|
+
ok = val !== val2;
|
|
2624
|
+
break;
|
|
2625
|
+
default:
|
|
2626
|
+
msg = msg ? msg + ": " : msg;
|
|
2627
|
+
throw new AssertionError(msg + "Invalid operator \"" + operator + "\"", void 0, assert.operator);
|
|
2628
|
+
}
|
|
2629
|
+
let test2 = new Assertion(ok, msg, assert.operator, true);
|
|
2630
|
+
test2.assert(true === flag(test2, "object"), "expected " + inspect2(val) + " to be " + operator + " " + inspect2(val2), "expected " + inspect2(val) + " to not be " + operator + " " + inspect2(val2));
|
|
2631
|
+
};
|
|
2632
|
+
assert.closeTo = function(act, exp, delta, msg) {
|
|
2633
|
+
new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
|
|
2634
|
+
};
|
|
2635
|
+
assert.approximately = function(act, exp, delta, msg) {
|
|
2636
|
+
new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta);
|
|
2637
|
+
};
|
|
2638
|
+
assert.sameMembers = function(set1, set2, msg) {
|
|
2639
|
+
new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2);
|
|
2640
|
+
};
|
|
2641
|
+
assert.notSameMembers = function(set1, set2, msg) {
|
|
2642
|
+
new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2);
|
|
2643
|
+
};
|
|
2644
|
+
assert.sameDeepMembers = function(set1, set2, msg) {
|
|
2645
|
+
new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2);
|
|
2646
|
+
};
|
|
2647
|
+
assert.notSameDeepMembers = function(set1, set2, msg) {
|
|
2648
|
+
new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2);
|
|
2649
|
+
};
|
|
2650
|
+
assert.sameOrderedMembers = function(set1, set2, msg) {
|
|
2651
|
+
new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2);
|
|
2652
|
+
};
|
|
2653
|
+
assert.notSameOrderedMembers = function(set1, set2, msg) {
|
|
2654
|
+
new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2);
|
|
2655
|
+
};
|
|
2656
|
+
assert.sameDeepOrderedMembers = function(set1, set2, msg) {
|
|
2657
|
+
new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2);
|
|
2658
|
+
};
|
|
2659
|
+
assert.notSameDeepOrderedMembers = function(set1, set2, msg) {
|
|
2660
|
+
new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2);
|
|
2661
|
+
};
|
|
2662
|
+
assert.includeMembers = function(superset, subset, msg) {
|
|
2663
|
+
new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset);
|
|
2664
|
+
};
|
|
2665
|
+
assert.notIncludeMembers = function(superset, subset, msg) {
|
|
2666
|
+
new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset);
|
|
2667
|
+
};
|
|
2668
|
+
assert.includeDeepMembers = function(superset, subset, msg) {
|
|
2669
|
+
new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset);
|
|
2670
|
+
};
|
|
2671
|
+
assert.notIncludeDeepMembers = function(superset, subset, msg) {
|
|
2672
|
+
new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset);
|
|
2673
|
+
};
|
|
2674
|
+
assert.includeOrderedMembers = function(superset, subset, msg) {
|
|
2675
|
+
new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset);
|
|
2676
|
+
};
|
|
2677
|
+
assert.notIncludeOrderedMembers = function(superset, subset, msg) {
|
|
2678
|
+
new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset);
|
|
2679
|
+
};
|
|
2680
|
+
assert.includeDeepOrderedMembers = function(superset, subset, msg) {
|
|
2681
|
+
new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset);
|
|
2682
|
+
};
|
|
2683
|
+
assert.notIncludeDeepOrderedMembers = function(superset, subset, msg) {
|
|
2684
|
+
new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset);
|
|
2685
|
+
};
|
|
2686
|
+
assert.oneOf = function(inList, list, msg) {
|
|
2687
|
+
new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
|
|
2688
|
+
};
|
|
2689
|
+
assert.isIterable = function(obj, msg) {
|
|
2690
|
+
if (obj == void 0 || !obj[Symbol.iterator]) {
|
|
2691
|
+
msg = msg ? `${msg} expected ${inspect2(obj)} to be an iterable` : `expected ${inspect2(obj)} to be an iterable`;
|
|
2692
|
+
throw new AssertionError(msg, void 0, assert.isIterable);
|
|
2693
|
+
}
|
|
2694
|
+
};
|
|
2695
|
+
assert.changes = function(fn, obj, prop, msg) {
|
|
2696
|
+
if (arguments.length === 3 && typeof obj === "function") {
|
|
2697
|
+
msg = prop;
|
|
2698
|
+
prop = null;
|
|
2699
|
+
}
|
|
2700
|
+
new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
|
|
2701
|
+
};
|
|
2702
|
+
assert.changesBy = function(fn, obj, prop, delta, msg) {
|
|
2703
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2704
|
+
let tmpMsg = delta;
|
|
2705
|
+
delta = prop;
|
|
2706
|
+
msg = tmpMsg;
|
|
2707
|
+
} else if (arguments.length === 3) {
|
|
2708
|
+
delta = prop;
|
|
2709
|
+
prop = null;
|
|
2710
|
+
}
|
|
2711
|
+
new Assertion(fn, msg, assert.changesBy, true).to.change(obj, prop).by(delta);
|
|
2712
|
+
};
|
|
2713
|
+
assert.doesNotChange = function(fn, obj, prop, msg) {
|
|
2714
|
+
if (arguments.length === 3 && typeof obj === "function") {
|
|
2715
|
+
msg = prop;
|
|
2716
|
+
prop = null;
|
|
2717
|
+
}
|
|
2718
|
+
return new Assertion(fn, msg, assert.doesNotChange, true).to.not.change(obj, prop);
|
|
2719
|
+
};
|
|
2720
|
+
assert.changesButNotBy = function(fn, obj, prop, delta, msg) {
|
|
2721
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2722
|
+
let tmpMsg = delta;
|
|
2723
|
+
delta = prop;
|
|
2724
|
+
msg = tmpMsg;
|
|
2725
|
+
} else if (arguments.length === 3) {
|
|
2726
|
+
delta = prop;
|
|
2727
|
+
prop = null;
|
|
2728
|
+
}
|
|
2729
|
+
new Assertion(fn, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta);
|
|
2730
|
+
};
|
|
2731
|
+
assert.increases = function(fn, obj, prop, msg) {
|
|
2732
|
+
if (arguments.length === 3 && typeof obj === "function") {
|
|
2733
|
+
msg = prop;
|
|
2734
|
+
prop = null;
|
|
2735
|
+
}
|
|
2736
|
+
return new Assertion(fn, msg, assert.increases, true).to.increase(obj, prop);
|
|
2737
|
+
};
|
|
2738
|
+
assert.increasesBy = function(fn, obj, prop, delta, msg) {
|
|
2739
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2740
|
+
let tmpMsg = delta;
|
|
2741
|
+
delta = prop;
|
|
2742
|
+
msg = tmpMsg;
|
|
2743
|
+
} else if (arguments.length === 3) {
|
|
2744
|
+
delta = prop;
|
|
2745
|
+
prop = null;
|
|
2746
|
+
}
|
|
2747
|
+
new Assertion(fn, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta);
|
|
2748
|
+
};
|
|
2749
|
+
assert.doesNotIncrease = function(fn, obj, prop, msg) {
|
|
2750
|
+
if (arguments.length === 3 && typeof obj === "function") {
|
|
2751
|
+
msg = prop;
|
|
2752
|
+
prop = null;
|
|
2753
|
+
}
|
|
2754
|
+
return new Assertion(fn, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop);
|
|
2755
|
+
};
|
|
2756
|
+
assert.increasesButNotBy = function(fn, obj, prop, delta, msg) {
|
|
2757
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2758
|
+
let tmpMsg = delta;
|
|
2759
|
+
delta = prop;
|
|
2760
|
+
msg = tmpMsg;
|
|
2761
|
+
} else if (arguments.length === 3) {
|
|
2762
|
+
delta = prop;
|
|
2763
|
+
prop = null;
|
|
2764
|
+
}
|
|
2765
|
+
new Assertion(fn, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta);
|
|
2766
|
+
};
|
|
2767
|
+
assert.decreases = function(fn, obj, prop, msg) {
|
|
2768
|
+
if (arguments.length === 3 && typeof obj === "function") {
|
|
2769
|
+
msg = prop;
|
|
2770
|
+
prop = null;
|
|
2771
|
+
}
|
|
2772
|
+
return new Assertion(fn, msg, assert.decreases, true).to.decrease(obj, prop);
|
|
2773
|
+
};
|
|
2774
|
+
assert.decreasesBy = function(fn, obj, prop, delta, msg) {
|
|
2775
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2776
|
+
let tmpMsg = delta;
|
|
2777
|
+
delta = prop;
|
|
2778
|
+
msg = tmpMsg;
|
|
2779
|
+
} else if (arguments.length === 3) {
|
|
2780
|
+
delta = prop;
|
|
2781
|
+
prop = null;
|
|
2782
|
+
}
|
|
2783
|
+
new Assertion(fn, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta);
|
|
2784
|
+
};
|
|
2785
|
+
assert.doesNotDecrease = function(fn, obj, prop, msg) {
|
|
2786
|
+
if (arguments.length === 3 && typeof obj === "function") {
|
|
2787
|
+
msg = prop;
|
|
2788
|
+
prop = null;
|
|
2789
|
+
}
|
|
2790
|
+
return new Assertion(fn, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop);
|
|
2791
|
+
};
|
|
2792
|
+
assert.doesNotDecreaseBy = function(fn, obj, prop, delta, msg) {
|
|
2793
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2794
|
+
let tmpMsg = delta;
|
|
2795
|
+
delta = prop;
|
|
2796
|
+
msg = tmpMsg;
|
|
2797
|
+
} else if (arguments.length === 3) {
|
|
2798
|
+
delta = prop;
|
|
2799
|
+
prop = null;
|
|
2800
|
+
}
|
|
2801
|
+
return new Assertion(fn, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta);
|
|
2802
|
+
};
|
|
2803
|
+
assert.decreasesButNotBy = function(fn, obj, prop, delta, msg) {
|
|
2804
|
+
if (arguments.length === 4 && typeof obj === "function") {
|
|
2805
|
+
let tmpMsg = delta;
|
|
2806
|
+
delta = prop;
|
|
2807
|
+
msg = tmpMsg;
|
|
2808
|
+
} else if (arguments.length === 3) {
|
|
2809
|
+
delta = prop;
|
|
2810
|
+
prop = null;
|
|
2811
|
+
}
|
|
2812
|
+
new Assertion(fn, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta);
|
|
2813
|
+
};
|
|
2814
|
+
assert.ifError = function(val) {
|
|
2815
|
+
if (val) throw val;
|
|
2816
|
+
};
|
|
2817
|
+
assert.isExtensible = function(obj, msg) {
|
|
2818
|
+
new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
|
|
2819
|
+
};
|
|
2820
|
+
assert.isNotExtensible = function(obj, msg) {
|
|
2821
|
+
new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
|
|
2822
|
+
};
|
|
2823
|
+
assert.isSealed = function(obj, msg) {
|
|
2824
|
+
new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
|
|
2825
|
+
};
|
|
2826
|
+
assert.isNotSealed = function(obj, msg) {
|
|
2827
|
+
new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
|
|
2828
|
+
};
|
|
2829
|
+
assert.isFrozen = function(obj, msg) {
|
|
2830
|
+
new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
|
|
2831
|
+
};
|
|
2832
|
+
assert.isNotFrozen = function(obj, msg) {
|
|
2833
|
+
new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
|
|
2834
|
+
};
|
|
2835
|
+
assert.isEmpty = function(val, msg) {
|
|
2836
|
+
new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
|
|
2837
|
+
};
|
|
2838
|
+
assert.isNotEmpty = function(val, msg) {
|
|
2839
|
+
new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
|
|
2840
|
+
};
|
|
2841
|
+
assert.containsSubset = function(val, exp, msg) {
|
|
2842
|
+
new Assertion(val, msg).to.containSubset(exp);
|
|
2843
|
+
};
|
|
2844
|
+
assert.doesNotContainSubset = function(val, exp, msg) {
|
|
2845
|
+
new Assertion(val, msg).to.not.containSubset(exp);
|
|
2846
|
+
};
|
|
2847
|
+
for (const [name, as] of [
|
|
2848
|
+
["isOk", "ok"],
|
|
2849
|
+
["isNotOk", "notOk"],
|
|
2850
|
+
["throws", "throw"],
|
|
2851
|
+
["throws", "Throw"],
|
|
2852
|
+
["isExtensible", "extensible"],
|
|
2853
|
+
["isNotExtensible", "notExtensible"],
|
|
2854
|
+
["isSealed", "sealed"],
|
|
2855
|
+
["isNotSealed", "notSealed"],
|
|
2856
|
+
["isFrozen", "frozen"],
|
|
2857
|
+
["isNotFrozen", "notFrozen"],
|
|
2858
|
+
["isEmpty", "empty"],
|
|
2859
|
+
["isNotEmpty", "notEmpty"],
|
|
2860
|
+
["isCallable", "isFunction"],
|
|
2861
|
+
["isNotCallable", "isNotFunction"],
|
|
2862
|
+
["containsSubset", "containSubset"]
|
|
2863
|
+
]) assert[as] = assert[name];
|
|
2864
|
+
var used = [];
|
|
2865
|
+
function use(fn) {
|
|
2866
|
+
const exports = {
|
|
2867
|
+
use,
|
|
2868
|
+
AssertionError,
|
|
2869
|
+
util: utils_exports,
|
|
2870
|
+
config,
|
|
2871
|
+
expect,
|
|
2872
|
+
assert,
|
|
2873
|
+
Assertion,
|
|
2874
|
+
...should_exports
|
|
2875
|
+
};
|
|
2876
|
+
if (!~used.indexOf(fn)) {
|
|
2877
|
+
fn(exports, utils_exports);
|
|
2878
|
+
used.push(fn);
|
|
2879
|
+
}
|
|
2880
|
+
return exports;
|
|
2881
|
+
}
|
|
2882
|
+
__name(use, "use");
|
|
2883
|
+
//#endregion
|
|
2884
|
+
export { Assertion, assert, chai_exports, expect, should, use, utils_exports };
|
|
2885
|
+
|
|
2886
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANi4yLjIvbm9kZV9tb2R1bGVzL2NoYWkvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX25hbWUgPSAodGFyZ2V0LCB2YWx1ZSkgPT4gX19kZWZQcm9wKHRhcmdldCwgXCJuYW1lXCIsIHsgdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIiA/IGtleSArIFwiXCIgOiBrZXksIHZhbHVlKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaW5kZXguanNcbnZhciB1dGlsc19leHBvcnRzID0ge307XG5fX2V4cG9ydCh1dGlsc19leHBvcnRzLCB7XG4gIGFkZENoYWluYWJsZU1ldGhvZDogKCkgPT4gYWRkQ2hhaW5hYmxlTWV0aG9kLFxuICBhZGRMZW5ndGhHdWFyZDogKCkgPT4gYWRkTGVuZ3RoR3VhcmQsXG4gIGFkZE1ldGhvZDogKCkgPT4gYWRkTWV0aG9kLFxuICBhZGRQcm9wZXJ0eTogKCkgPT4gYWRkUHJvcGVydHksXG4gIGNoZWNrRXJyb3I6ICgpID0+IGNoZWNrX2Vycm9yX2V4cG9ydHMsXG4gIGNvbXBhcmVCeUluc3BlY3Q6ICgpID0+IGNvbXBhcmVCeUluc3BlY3QsXG4gIGVxbDogKCkgPT4gZGVlcF9lcWxfZGVmYXVsdCxcbiAgZXZlbnRzOiAoKSA9PiBldmVudHMsXG4gIGV4cGVjdFR5cGVzOiAoKSA9PiBleHBlY3RUeXBlcyxcbiAgZmxhZzogKCkgPT4gZmxhZyxcbiAgZ2V0QWN0dWFsOiAoKSA9PiBnZXRBY3R1YWwsXG4gIGdldE1lc3NhZ2U6ICgpID0+IGdldE1lc3NhZ2UyLFxuICBnZXROYW1lOiAoKSA9PiBnZXROYW1lLFxuICBnZXRPcGVyYXRvcjogKCkgPT4gZ2V0T3BlcmF0b3IsXG4gIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzOiAoKSA9PiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyxcbiAgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sczogKCkgPT4gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyxcbiAgZ2V0UGF0aEluZm86ICgpID0+IGdldFBhdGhJbmZvLFxuICBoYXNQcm9wZXJ0eTogKCkgPT4gaGFzUHJvcGVydHksXG4gIGluc3BlY3Q6ICgpID0+IGluc3BlY3QyLFxuICBpc05hTjogKCkgPT4gaXNOYU4yLFxuICBpc051bWVyaWM6ICgpID0+IGlzTnVtZXJpYyxcbiAgaXNQcm94eUVuYWJsZWQ6ICgpID0+IGlzUHJveHlFbmFibGVkLFxuICBpc1JlZ0V4cDogKCkgPT4gaXNSZWdFeHAyLFxuICBvYmpEaXNwbGF5OiAoKSA9PiBvYmpEaXNwbGF5LFxuICBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2Q6ICgpID0+IG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCxcbiAgb3ZlcndyaXRlTWV0aG9kOiAoKSA9PiBvdmVyd3JpdGVNZXRob2QsXG4gIG92ZXJ3cml0ZVByb3BlcnR5OiAoKSA9PiBvdmVyd3JpdGVQcm9wZXJ0eSxcbiAgcHJveGlmeTogKCkgPT4gcHJveGlmeSxcbiAgdGVzdDogKCkgPT4gdGVzdCxcbiAgdHJhbnNmZXJGbGFnczogKCkgPT4gdHJhbnNmZXJGbGFncyxcbiAgdHlwZTogKCkgPT4gdHlwZVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qc1xudmFyIGNoZWNrX2Vycm9yX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoZWNrX2Vycm9yX2V4cG9ydHMsIHtcbiAgY29tcGF0aWJsZUNvbnN0cnVjdG9yOiAoKSA9PiBjb21wYXRpYmxlQ29uc3RydWN0b3IsXG4gIGNvbXBhdGlibGVJbnN0YW5jZTogKCkgPT4gY29tcGF0aWJsZUluc3RhbmNlLFxuICBjb21wYXRpYmxlTWVzc2FnZTogKCkgPT4gY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogKCkgPT4gZ2V0Q29uc3RydWN0b3JOYW1lLFxuICBnZXRNZXNzYWdlOiAoKSA9PiBnZXRNZXNzYWdlXG59KTtcbmZ1bmN0aW9uIGlzRXJyb3JJbnN0YW5jZShvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRXJyb3JdXCI7XG59XG5fX25hbWUoaXNFcnJvckluc3RhbmNlLCBcImlzRXJyb3JJbnN0YW5jZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5fX25hbWUoaXNSZWdFeHAsIFwiaXNSZWdFeHBcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuX19uYW1lKGNvbXBhdGlibGVJbnN0YW5jZSwgXCJjb21wYXRpYmxlSW5zdGFuY2VcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpKSB7XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVycm9yTGlrZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZXJyb3JMaWtlID09PSBcImZ1bmN0aW9uXCIpICYmIGVycm9yTGlrZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gdGhyb3duLmNvbnN0cnVjdG9yID09PSBlcnJvckxpa2UgfHwgdGhyb3duIGluc3RhbmNlb2YgZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShjb21wYXRpYmxlQ29uc3RydWN0b3IsIFwiY29tcGF0aWJsZUNvbnN0cnVjdG9yXCIpO1xuZnVuY3Rpb24gY29tcGF0aWJsZU1lc3NhZ2UodGhyb3duLCBlcnJNYXRjaGVyKSB7XG4gIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0eXBlb2YgdGhyb3duID09PSBcInN0cmluZ1wiID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChpc1JlZ0V4cChlcnJNYXRjaGVyKSkge1xuICAgIHJldHVybiBlcnJNYXRjaGVyLnRlc3QoY29tcGFyaXNvblN0cmluZyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyck1hdGNoZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5fX25hbWUoY29tcGF0aWJsZU1lc3NhZ2UsIFwiY29tcGF0aWJsZU1lc3NhZ2VcIik7XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUoZXJyb3JMaWtlKSB7XG4gIGxldCBjb25zdHJ1Y3Rvck5hbWUgPSBlcnJvckxpa2U7XG4gIGlmIChpc0Vycm9ySW5zdGFuY2UoZXJyb3JMaWtlKSkge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvckxpa2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5uYW1lO1xuICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgPT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yTmFtZSA9IG5ldyBlcnJvckxpa2UoKS5uYW1lO1xuICAgICAgY29uc3RydWN0b3JOYW1lID0gbmV3Q29uc3RydWN0b3JOYW1lIHx8IGNvbnN0cnVjdG9yTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cbl9fbmFtZShnZXRDb25zdHJ1Y3Rvck5hbWUsIFwiZ2V0Q29uc3RydWN0b3JOYW1lXCIpO1xuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgbGV0IG1zZyA9IFwiXCI7XG4gIGlmIChlcnJvckxpa2UgJiYgZXJyb3JMaWtlLm1lc3NhZ2UpIHtcbiAgICBtc2cgPSBlcnJvckxpa2UubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSBcInN0cmluZ1wiKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZSwgXCJnZXRNZXNzYWdlXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9mbGFnLmpzXG5mdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICBsZXQgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZmxhZ3Nba2V5XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmbGFnc1trZXldO1xuICB9XG59XG5fX25hbWUoZmxhZywgXCJmbGFnXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy90ZXN0LmpzXG5mdW5jdGlvbiB0ZXN0KG9iaiwgYXJncykge1xuICBsZXQgbmVnYXRlID0gZmxhZyhvYmosIFwibmVnYXRlXCIpLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn1cbl9fbmFtZSh0ZXN0LCBcInRlc3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL3R5cGUtZGV0ZWN0LmpzXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgY29uc3Qgc3RyaW5nVGFnID0gb2JqW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuICBjb25zdCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcbiAgcmV0dXJuIHR5cGUzO1xufVxuX19uYW1lKHR5cGUsIFwidHlwZVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2Fzc2VydGlvbi1lcnJvci9pbmRleC5qc1xudmFyIGNhbkVsaWRlRnJhbWVzID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yO1xudmFyIF9Bc3NlcnRpb25FcnJvciA9IGNsYXNzIF9Bc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiVW5zcGVjaWZpZWQgQXNzZXJ0aW9uRXJyb3JcIiwgcHJvcHMsIHNzZikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJtZXNzYWdlXCIpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgaWYgKGNhbkVsaWRlRnJhbWVzKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzc2YgfHwgX0Fzc2VydGlvbkVycm9yKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gXCJBc3NlcnRpb25FcnJvclwiO1xuICB9XG4gIGdldCBvaygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdG9KU09OKHN0YWNrKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGFjazogc3RhY2sgIT09IGZhbHNlID8gdGhpcy5zdGFjayA6IHZvaWQgMFxuICAgIH07XG4gIH1cbn07XG5fX25hbWUoX0Fzc2VydGlvbkVycm9yLCBcIkFzc2VydGlvbkVycm9yXCIpO1xudmFyIEFzc2VydGlvbkVycm9yID0gX0Fzc2VydGlvbkVycm9yO1xuXG4vLyBsaWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qc1xuZnVuY3Rpb24gZXhwZWN0VHlwZXMob2JqLCB0eXBlcykge1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGxldCBzc2ZpID0gZmxhZyhvYmosIFwic3NmaVwiKTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgb2JqID0gZmxhZyhvYmosIFwib2JqZWN0XCIpO1xuICB0eXBlcyA9IHR5cGVzLm1hcChmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG4gIHR5cGVzLnNvcnQoKTtcbiAgbGV0IHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbih0LCBpbmRleCkge1xuICAgIGxldCBhcnQgPSB+W1wiYVwiLCBcImVcIiwgXCJpXCIsIFwib1wiLCBcInVcIl0uaW5kZXhPZih0LmNoYXJBdCgwKSkgPyBcImFuXCIgOiBcImFcIjtcbiAgICBsZXQgb3IgPSB0eXBlcy5sZW5ndGggPiAxICYmIGluZGV4ID09PSB0eXBlcy5sZW5ndGggLSAxID8gXCJvciBcIiA6IFwiXCI7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgXCIgXCIgKyB0O1xuICB9KS5qb2luKFwiLCBcIik7XG4gIGxldCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiBvYmpUeXBlID09PSBleHBlY3RlZDtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgXCJvYmplY3QgdGVzdGVkIG11c3QgYmUgXCIgKyBzdHIgKyBcIiwgYnV0IFwiICsgb2JqVHlwZSArIFwiIGdpdmVuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGV4cGVjdFR5cGVzLCBcImV4cGVjdFR5cGVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanNcbmZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn1cbl9fbmFtZShnZXRBY3R1YWwsIFwiZ2V0QWN0dWFsXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2hlbHBlcnMuanNcbnZhciBhbnNpQ29sb3JzID0ge1xuICBib2xkOiBbXCIxXCIsIFwiMjJcIl0sXG4gIGRpbTogW1wiMlwiLCBcIjIyXCJdLFxuICBpdGFsaWM6IFtcIjNcIiwgXCIyM1wiXSxcbiAgdW5kZXJsaW5lOiBbXCI0XCIsIFwiMjRcIl0sXG4gIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICBpbnZlcnNlOiBbXCI3XCIsIFwiMjdcIl0sXG4gIGhpZGRlbjogW1wiOFwiLCBcIjI4XCJdLFxuICBzdHJpa2U6IFtcIjlcIiwgXCIyOVwiXSxcbiAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gIC8vIDIxLTI5IGFyZSByZXNldHMgZm9yIDEtOVxuICBibGFjazogW1wiMzBcIiwgXCIzOVwiXSxcbiAgcmVkOiBbXCIzMVwiLCBcIjM5XCJdLFxuICBncmVlbjogW1wiMzJcIiwgXCIzOVwiXSxcbiAgeWVsbG93OiBbXCIzM1wiLCBcIjM5XCJdLFxuICBibHVlOiBbXCIzNFwiLCBcIjM5XCJdLFxuICBtYWdlbnRhOiBbXCIzNVwiLCBcIjM5XCJdLFxuICBjeWFuOiBbXCIzNlwiLCBcIjM5XCJdLFxuICB3aGl0ZTogW1wiMzdcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0YmxhY2s6IFtcIjMwOzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0cmVkOiBbXCIzMTsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodGdyZWVuOiBbXCIzMjsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodHllbGxvdzogW1wiMzM7MVwiLCBcIjM5XCJdLFxuICBicmlnaHRibHVlOiBbXCIzNDsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodG1hZ2VudGE6IFtcIjM1OzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0Y3lhbjogW1wiMzY7MVwiLCBcIjM5XCJdLFxuICBicmlnaHR3aGl0ZTogW1wiMzc7MVwiLCBcIjM5XCJdLFxuICBncmV5OiBbXCI5MFwiLCBcIjM5XCJdXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgc3BlY2lhbDogXCJjeWFuXCIsXG4gIG51bWJlcjogXCJ5ZWxsb3dcIixcbiAgYmlnaW50OiBcInllbGxvd1wiLFxuICBib29sZWFuOiBcInllbGxvd1wiLFxuICB1bmRlZmluZWQ6IFwiZ3JleVwiLFxuICBudWxsOiBcImJvbGRcIixcbiAgc3RyaW5nOiBcImdyZWVuXCIsXG4gIHN5bWJvbDogXCJncmVlblwiLFxuICBkYXRlOiBcIm1hZ2VudGFcIixcbiAgcmVnZXhwOiBcInJlZFwiXG59O1xudmFyIHRydW5jYXRvciA9IFwiXFx1MjAyNlwiO1xuZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCBcIlwiO1xuICBpZiAoIWNvbG9yKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGBcXHgxQlske2NvbG9yWzBdfW0ke1N0cmluZyh2YWx1ZSl9XFx4MUJbJHtjb2xvclsxXX1tYDtcbn1cbl9fbmFtZShjb2xvcmlzZSwgXCJjb2xvcmlzZVwiKTtcbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoe1xuICBzaG93SGlkZGVuID0gZmFsc2UsXG4gIGRlcHRoID0gMixcbiAgY29sb3JzID0gZmFsc2UsXG4gIGN1c3RvbUluc3BlY3QgPSB0cnVlLFxuICBzaG93UHJveHkgPSBmYWxzZSxcbiAgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSxcbiAgYnJlYWtMZW5ndGggPSBJbmZpbml0eSxcbiAgc2VlbiA9IFtdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRydW5jYXRlOiB0cnVuY2F0ZTIgPSBJbmZpbml0eSxcbiAgc3R5bGl6ZSA9IFN0cmluZ1xufSA9IHt9LCBpbnNwZWN0Mykge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgY29sb3JzOiBCb29sZWFuKGNvbG9ycyksXG4gICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICBtYXhBcnJheUxlbmd0aDogTnVtYmVyKG1heEFycmF5TGVuZ3RoKSxcbiAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlMiksXG4gICAgc2VlbixcbiAgICBpbnNwZWN0OiBpbnNwZWN0MyxcbiAgICBzdHlsaXplXG4gIH07XG4gIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgIG9wdGlvbnMuc3R5bGl6ZSA9IGNvbG9yaXNlO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuX19uYW1lKG5vcm1hbGlzZU9wdGlvbnMsIFwibm9ybWFsaXNlT3B0aW9uc1wiKTtcbmZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyKSB7XG4gIHJldHVybiBjaGFyID49IFwiXFx1RDgwMFwiICYmIGNoYXIgPD0gXCJcXHVEQkZGXCI7XG59XG5fX25hbWUoaXNIaWdoU3Vycm9nYXRlLCBcImlzSGlnaFN1cnJvZ2F0ZVwiKTtcbmZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCB0YWlsID0gdHJ1bmNhdG9yKSB7XG4gIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICBjb25zdCB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICBpZiAoZW5kID4gMCAmJiBpc0hpZ2hTdXJyb2dhdGUoc3RyaW5nW2VuZCAtIDFdKSkge1xuICAgICAgZW5kID0gZW5kIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5fX25hbWUodHJ1bmNhdGUsIFwidHJ1bmNhdGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0TGlzdChsaXN0LCBvcHRpb25zLCBpbnNwZWN0SXRlbSwgc2VwYXJhdG9yID0gXCIsIFwiKSB7XG4gIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICBjb25zdCBzaXplID0gbGlzdC5sZW5ndGg7XG4gIGlmIChzaXplID09PSAwKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGU7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBsZXQgcGVlayA9IFwiXCI7XG4gIGxldCB0cnVuY2F0ZWQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgIGNvbnN0IGxhc3QgPSBpICsgMSA9PT0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3Qgc2Vjb25kVG9MYXN0ID0gaSArIDIgPT09IGxpc3QubGVuZ3RoO1xuICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgY29uc3QgdmFsdWUgPSBsaXN0W2ldO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpbmcgPSBwZWVrIHx8IGluc3BlY3RJdGVtKHZhbHVlLCBvcHRpb25zKSArIChsYXN0ID8gXCJcIiA6IHNlcGFyYXRvcik7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoO1xuICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGVlayA9IGxhc3QgPyBcIlwiIDogaW5zcGVjdEl0ZW0obGlzdFtpICsgMV0sIG9wdGlvbnMpICsgKHNlY29uZFRvTGFzdCA/IFwiXCIgOiBzZXBhcmF0b3IpO1xuICAgIGlmICghbGFzdCAmJiBzZWNvbmRUb0xhc3QgJiYgdHJ1bmNhdGVkTGVuZ3RoID4gb3JpZ2luYWxMZW5ndGggJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID4gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgdHJ1bmNhdGVkID0gYCR7dHJ1bmNhdG9yfSgke2xpc3QubGVuZ3RoIC0gaSAtIDF9KWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdHJ1bmNhdGVkID0gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5fX25hbWUoaW5zcGVjdExpc3QsIFwiaW5zcGVjdExpc3RcIik7XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG59XG5fX25hbWUocXVvdGVDb21wbGV4S2V5LCBcInF1b3RlQ29tcGxleEtleVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShba2V5LCB2YWx1ZV0sIG9wdGlvbnMpIHtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSAyO1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIpIHtcbiAgICBrZXkgPSBgWyR7b3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyl9XWA7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIHJldHVybiBgJHtrZXl9OiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdFByb3BlcnR5LCBcImluc3BlY3RQcm9wZXJ0eVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9hcnJheS5qc1xuZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gXCJbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gIGNvbnN0IGxpc3RDb250ZW50cyA9IGluc3BlY3RMaXN0KGFycmF5LCBvcHRpb25zKTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBsaXN0Q29udGVudHMubGVuZ3RoO1xuICBsZXQgcHJvcGVydHlDb250ZW50cyA9IFwiXCI7XG4gIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KG5vbkluZGV4UHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICB9XG4gIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6IFwiXCJ9IF1gO1xufVxuX19uYW1lKGluc3BlY3RBcnJheSwgXCJpbnNwZWN0QXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvdHlwZWRhcnJheS5qc1xudmFyIGdldEFycmF5TmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGFycmF5KSA9PiB7XG4gIGlmICh0eXBlb2YgQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gXCJCdWZmZXJcIjtcbiAgfVxuICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgIHJldHVybiBhcnJheVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBhcnJheS5jb25zdHJ1Y3Rvci5uYW1lO1xufSwgXCJnZXRBcnJheU5hbWVcIik7XG5mdW5jdGlvbiBpbnNwZWN0VHlwZWRBcnJheShhcnJheSwgb3B0aW9ucykge1xuICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCArIDQ7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyaW5nID0gYCR7b3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKGFycmF5W2ldLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIil9JHtpID09PSBhcnJheS5sZW5ndGggLSAxID8gXCJcIiA6IFwiLCBcIn1gO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG91dHB1dCArPSBzdHJpbmc7XG4gIH1cbiAgbGV0IHByb3BlcnR5Q29udGVudHMgPSBcIlwiO1xuICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKChrZXkpID0+IFtrZXksIGFycmF5W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgfVxuICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogXCJcIn0gXWA7XG59XG5fX25hbWUoaW5zcGVjdFR5cGVkQXJyYXksIFwiaW5zcGVjdFR5cGVkQXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvZGF0ZS5qc1xuZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICBjb25zdCBzdHJpbmdSZXByZXNlbnRhdGlvbiA9IGRhdGVPYmplY3QudG9KU09OKCk7XG4gIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIkludmFsaWQgRGF0ZVwiO1xuICB9XG4gIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoXCJUXCIpO1xuICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgXCJkYXRlXCIpO1xufVxuX19uYW1lKGluc3BlY3REYXRlLCBcImluc3BlY3REYXRlXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Z1bmN0aW9uLmpzXG5mdW5jdGlvbiBpbnNwZWN0RnVuY3Rpb24oZnVuYywgb3B0aW9ucykge1xuICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgXCJGdW5jdGlvblwiO1xuICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsIFwic3BlY2lhbFwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9ICR7dHJ1bmNhdGUobmFtZSwgb3B0aW9ucy50cnVuY2F0ZSAtIDExKX1dYCwgXCJzcGVjaWFsXCIpO1xufVxuX19uYW1lKGluc3BlY3RGdW5jdGlvbiwgXCJpbnNwZWN0RnVuY3Rpb25cIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbWFwLmpzXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAga2V5ID0gb3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyk7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICByZXR1cm4gYCR7a2V5fSA9PiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdE1hcEVudHJ5LCBcImluc3BlY3RNYXBFbnRyeVwiKTtcbmZ1bmN0aW9uIG1hcFRvRW50cmllcyhtYXApIHtcbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG5fX25hbWUobWFwVG9FbnRyaWVzLCBcIm1hcFRvRW50cmllc1wiKTtcbmZ1bmN0aW9uIGluc3BlY3RNYXAobWFwLCBvcHRpb25zKSB7XG4gIGlmIChtYXAuc2l6ZSA9PT0gMClcbiAgICByZXR1cm4gXCJNYXB7fVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gIHJldHVybiBgTWFweyAke2luc3BlY3RMaXN0KG1hcFRvRW50cmllcyhtYXApLCBvcHRpb25zLCBpbnNwZWN0TWFwRW50cnkpfSB9YDtcbn1cbl9fbmFtZShpbnNwZWN0TWFwLCBcImluc3BlY3RNYXBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbnVtYmVyLmpzXG52YXIgaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgKChpKSA9PiBpICE9PSBpKTtcbmZ1bmN0aW9uIGluc3BlY3ROdW1iZXIobnVtYmVyLCBvcHRpb25zKSB7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShcIk5hTlwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCJJbmZpbml0eVwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiLUluZmluaXR5XCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gXCIrMFwiIDogXCItMFwiLCBcIm51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKFN0cmluZyhudW1iZXIpLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIik7XG59XG5fX25hbWUoaW5zcGVjdE51bWJlciwgXCJpbnNwZWN0TnVtYmVyXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2JpZ2ludC5qc1xuZnVuY3Rpb24gaW5zcGVjdEJpZ0ludChudW1iZXIsIG9wdGlvbnMpIHtcbiAgbGV0IG51bXMgPSB0cnVuY2F0ZShudW1iZXIudG9TdHJpbmcoKSwgb3B0aW9ucy50cnVuY2F0ZSAtIDEpO1xuICBpZiAobnVtcyAhPT0gdHJ1bmNhdG9yKVxuICAgIG51bXMgKz0gXCJuXCI7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUobnVtcywgXCJiaWdpbnRcIik7XG59XG5fX25hbWUoaW5zcGVjdEJpZ0ludCwgXCJpbnNwZWN0QmlnSW50XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3JlZ2V4cC5qc1xuZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoXCIvXCIpWzJdO1xuICBjb25zdCBzb3VyY2VMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlIC0gKDIgKyBmbGFncy5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZS5zb3VyY2U7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYC8ke3RydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKX0vJHtmbGFnc31gLCBcInJlZ2V4cFwiKTtcbn1cbl9fbmFtZShpbnNwZWN0UmVnRXhwLCBcImluc3BlY3RSZWdFeHBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvc2V0LmpzXG5mdW5jdGlvbiBhcnJheUZyb21TZXQoc2V0Mikge1xuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgc2V0Mi5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiB2YWx1ZXM7XG59XG5fX25hbWUoYXJyYXlGcm9tU2V0LCBcImFycmF5RnJvbVNldFwiKTtcbmZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0Miwgb3B0aW9ucykge1xuICBpZiAoc2V0Mi5zaXplID09PSAwKVxuICAgIHJldHVybiBcIlNldHt9XCI7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgcmV0dXJuIGBTZXR7ICR7aW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldDIpLCBvcHRpb25zKX0gfWA7XG59XG5fX25hbWUoaW5zcGVjdFNldCwgXCJpbnNwZWN0U2V0XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3N0cmluZy5qc1xudmFyIHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl1cIiwgXCJnXCIpO1xudmFyIGVzY2FwZUNoYXJhY3RlcnMgPSB7XG4gIFwiXFxiXCI6IFwiXFxcXGJcIixcbiAgXCJcdFwiOiBcIlxcXFx0XCIsXG4gIFwiXFxuXCI6IFwiXFxcXG5cIixcbiAgXCJcXGZcIjogXCJcXFxcZlwiLFxuICBcIlxcclwiOiBcIlxcXFxyXCIsXG4gIFwiJ1wiOiBcIlxcXFwnXCIsXG4gIFwiXFxcXFwiOiBcIlxcXFxcXFxcXCJcbn07XG52YXIgaGV4ID0gMTY7XG52YXIgdW5pY29kZUxlbmd0aCA9IDQ7XG5mdW5jdGlvbiBlc2NhcGUoY2hhcikge1xuICByZXR1cm4gZXNjYXBlQ2hhcmFjdGVyc1tjaGFyXSB8fCBgXFxcXHUke2AwMDAwJHtjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoaGV4KX1gLnNsaWNlKC11bmljb2RlTGVuZ3RoKX1gO1xufVxuX19uYW1lKGVzY2FwZSwgXCJlc2NhcGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICBpZiAoc3RyaW5nRXNjYXBlQ2hhcnMudGVzdChzdHJpbmcpKSB7XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nRXNjYXBlQ2hhcnMsIGVzY2FwZSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgJyR7dHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zLnRydW5jYXRlIC0gMil9J2AsIFwic3RyaW5nXCIpO1xufVxuX19uYW1lKGluc3BlY3RTdHJpbmcsIFwiaW5zcGVjdFN0cmluZ1wiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9zeW1ib2wuanNcbmZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgaWYgKFwiZGVzY3JpcHRpb25cIiBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8gYFN5bWJvbCgke3ZhbHVlLmRlc2NyaXB0aW9ufSlgIDogXCJTeW1ib2woKVwiO1xuICB9XG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuX19uYW1lKGluc3BlY3RTeW1ib2wsIFwiaW5zcGVjdFN5bWJvbFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9wcm9taXNlLmpzXG52YXIgZ2V0UHJvbWlzZVZhbHVlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlByb21pc2V7XFx1MjAyNn1cIiwgXCJnZXRQcm9taXNlVmFsdWVcIik7XG52YXIgcHJvbWlzZV9kZWZhdWx0ID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL29iamVjdC5qc1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChvYmplY3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpIDogW107XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCAmJiBzeW1ib2xzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcInt9XCI7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMob2JqZWN0KSkge1xuICAgIHJldHVybiBcIltDaXJjdWxhcl1cIjtcbiAgfVxuICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgb2JqZWN0W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgY29uc3Qgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcCgoa2V5KSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICBvcHRpb25zLnNlZW4ucG9wKCk7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgIHNlcCA9IFwiLCBcIjtcbiAgfVxuICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuX19uYW1lKGluc3BlY3RPYmplY3QsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9jbGFzcy5qc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbmZ1bmN0aW9uIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucykge1xuICBsZXQgbmFtZSA9IFwiXCI7XG4gIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIG5hbWUgPSB2YWx1ZVt0b1N0cmluZ1RhZ107XG4gIH1cbiAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKCFuYW1lIHx8IG5hbWUgPT09IFwiX2NsYXNzXCIpIHtcbiAgICBuYW1lID0gXCI8QW5vbnltb3VzIENsYXNzPlwiO1xuICB9XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGg7XG4gIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyl9YDtcbn1cbl9fbmFtZShpbnNwZWN0Q2xhc3MsIFwiaW5zcGVjdENsYXNzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2FyZ3VtZW50cy5qc1xuZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gXCJBcmd1bWVudHNbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICByZXR1cm4gYEFyZ3VtZW50c1sgJHtpbnNwZWN0TGlzdChhcmdzLCBvcHRpb25zKX0gXWA7XG59XG5fX25hbWUoaW5zcGVjdEFyZ3VtZW50cywgXCJpbnNwZWN0QXJndW1lbnRzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Vycm9yLmpzXG52YXIgZXJyb3JLZXlzID0gW1xuICBcInN0YWNrXCIsXG4gIFwibGluZVwiLFxuICBcImNvbHVtblwiLFxuICBcIm5hbWVcIixcbiAgXCJtZXNzYWdlXCIsXG4gIFwiZmlsZU5hbWVcIixcbiAgXCJsaW5lTnVtYmVyXCIsXG4gIFwiY29sdW1uTnVtYmVyXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJjYXVzZVwiXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdDIoZXJyb3IsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoKGtleSkgPT4gZXJyb3JLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xuICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvcGVydGllcy51bnNoaWZ0KFwibWVzc2FnZVwiKTtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIjtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBtZXNzYWdlLmxlbmd0aCArIDU7XG4gIG9wdGlvbnMuc2VlbiA9IG9wdGlvbnMuc2VlbiB8fCBbXTtcbiAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG4gIH1cbiAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICByZXR1cm4gYCR7bmFtZX0ke21lc3NhZ2V9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCB7ICR7cHJvcGVydHlDb250ZW50c30gfWAgOiBcIlwifWA7XG59XG5fX25hbWUoaW5zcGVjdE9iamVjdDIsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9odG1sLmpzXG5mdW5jdGlvbiBpbnNwZWN0QXR0cmlidXRlKFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICBvcHRpb25zLnRydW5jYXRlIC09IDM7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7b3B0aW9ucy5zdHlsaXplKFN0cmluZyhrZXkpLCBcInllbGxvd1wiKX1gO1xuICB9XG4gIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksIFwieWVsbG93XCIpfT0ke29wdGlvbnMuc3R5bGl6ZShgXCIke3ZhbHVlfVwiYCwgXCJzdHJpbmdcIil9YDtcbn1cbl9fbmFtZShpbnNwZWN0QXR0cmlidXRlLCBcImluc3BlY3RBdHRyaWJ1dGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdE5vZGUsIFwiXFxuXCIpO1xufVxuX19uYW1lKGluc3BlY3ROb2RlQ29sbGVjdGlvbiwgXCJpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZShub2RlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBpbnNwZWN0SFRNTChub2RlLCBvcHRpb25zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUuZGF0YSwgb3B0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25zLmluc3BlY3Qobm9kZSwgb3B0aW9ucyk7XG4gIH1cbn1cbl9fbmFtZShpbnNwZWN0Tm9kZSwgXCJpbnNwZWN0Tm9kZVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RIVE1MKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoZWFkID0gb3B0aW9ucy5zdHlsaXplKGA8JHtuYW1lfWAsIFwic3BlY2lhbFwiKTtcbiAgY29uc3QgaGVhZENsb3NlID0gb3B0aW9ucy5zdHlsaXplKGA+YCwgXCJzcGVjaWFsXCIpO1xuICBjb25zdCB0YWlsID0gb3B0aW9ucy5zdHlsaXplKGA8LyR7bmFtZX0+YCwgXCJzcGVjaWFsXCIpO1xuICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICogMiArIDU7XG4gIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gXCJcIjtcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgKz0gXCIgXCI7XG4gICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcCgoa2V5KSA9PiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXSksIG9wdGlvbnMsIGluc3BlY3RBdHRyaWJ1dGUsIFwiIFwiKTtcbiAgfVxuICBvcHRpb25zLnRydW5jYXRlIC09IHByb3BlcnR5Q29udGVudHMubGVuZ3RoO1xuICBjb25zdCB0cnVuY2F0ZTIgPSBvcHRpb25zLnRydW5jYXRlO1xuICBsZXQgY2hpbGRyZW4gPSBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG4gIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiB0cnVuY2F0ZTIpIHtcbiAgICBjaGlsZHJlbiA9IGAke3RydW5jYXRvcn0oJHtlbGVtZW50LmNoaWxkcmVuLmxlbmd0aH0pYDtcbiAgfVxuICByZXR1cm4gYCR7aGVhZH0ke3Byb3BlcnR5Q29udGVudHN9JHtoZWFkQ2xvc2V9JHtjaGlsZHJlbn0ke3RhaWx9YDtcbn1cbl9fbmFtZShpbnNwZWN0SFRNTCwgXCJpbnNwZWN0SFRNTFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9pbmRleC5qc1xudmFyIHN5bWJvbHNTdXBwb3J0ZWQgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09IFwiZnVuY3Rpb25cIjtcbnZhciBjaGFpSW5zcGVjdCA9IHN5bWJvbHNTdXBwb3J0ZWQgPyAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcImNoYWkvaW5zcGVjdFwiKSA6IFwiQEBjaGFpL2luc3BlY3RcIjtcbnZhciBub2RlSW5zcGVjdCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIik7XG52YXIgY29uc3RydWN0b3JNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBzdHJpbmdUYWdNYXAgPSB7fTtcbnZhciBiYXNlVHlwZXNNYXAgPSB7XG4gIHVuZGVmaW5lZDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcInVuZGVmaW5lZFwiLCBcInVuZGVmaW5lZFwiKSwgXCJ1bmRlZmluZWRcIiksXG4gIG51bGw6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoXCJudWxsXCIsIFwibnVsbFwiKSwgXCJudWxsXCIpLFxuICBib29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJib29sZWFuXCIpLFxuICBCb29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJCb29sZWFuXCIpLFxuICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gIE51bWJlcjogaW5zcGVjdE51bWJlcixcbiAgYmlnaW50OiBpbnNwZWN0QmlnSW50LFxuICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gIHN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgU3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBGdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBzeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgU3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICBBcnJheTogaW5zcGVjdEFycmF5LFxuICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgTWFwOiBpbnNwZWN0TWFwLFxuICBTZXQ6IGluc3BlY3RTZXQsXG4gIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgUHJvbWlzZTogcHJvbWlzZV9kZWZhdWx0LFxuICAvLyBXZWFrU2V0LCBXZWFrTWFwIGFyZSB0b3RhbGx5IG9wYXF1ZSB0byB1c1xuICBXZWFrU2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFwiV2Vha1NldHtcXHUyMDI2fVwiLCBcInNwZWNpYWxcIiksIFwiV2Vha1NldFwiKSxcbiAgV2Vha01hcDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcIldlYWtNYXB7XFx1MjAyNn1cIiwgXCJzcGVjaWFsXCIpLCBcIldlYWtNYXBcIiksXG4gIEFyZ3VtZW50czogaW5zcGVjdEFyZ3VtZW50cyxcbiAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQ2NEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgR2VuZXJhdG9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IFwiXCIsIFwiR2VuZXJhdG9yXCIpLFxuICBEYXRhVmlldzogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkRhdGFWaWV3XCIpLFxuICBBcnJheUJ1ZmZlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkFycmF5QnVmZmVyXCIpLFxuICBFcnJvcjogaW5zcGVjdE9iamVjdDIsXG4gIEhUTUxDb2xsZWN0aW9uOiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG4gIE5vZGVMaXN0OiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cbn07XG52YXIgaW5zcGVjdEN1c3RvbSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdEZuKSA9PiB7XG4gIGlmIChjaGFpSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbY2hhaUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbY2hhaUluc3BlY3RdKG9wdGlvbnMpO1xuICB9XG4gIGlmIChub2RlSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbbm9kZUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbbm9kZUluc3BlY3RdKG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMsIGluc3BlY3RGbik7XG4gIH1cbiAgaWYgKFwiaW5zcGVjdFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgfVxuICBpZiAoXCJjb25zdHJ1Y3RvclwiIGluIHZhbHVlICYmIGNvbnN0cnVjdG9yTWFwLmhhcyh2YWx1ZS5jb25zdHJ1Y3RvcikpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlM10pIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59LCBcImluc3BlY3RDdXN0b21cIik7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpc2VPcHRpb25zKG9wdHMsIGluc3BlY3QpO1xuICBjb25zdCB7IGN1c3RvbUluc3BlY3QgfSA9IG9wdGlvbnM7XG4gIGxldCB0eXBlMyA9IHZhbHVlID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlMyA9PT0gXCJvYmplY3RcIikge1xuICAgIHR5cGUzID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xuICB9XG4gIGlmICh0eXBlMyBpbiBiYXNlVHlwZXNNYXApIHtcbiAgICByZXR1cm4gYmFzZVR5cGVzTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGN1c3RvbUluc3BlY3QgJiYgdmFsdWUpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICByZXR1cm4gaW5zcGVjdChvdXRwdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjb25zdCBwcm90byA9IHZhbHVlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA6IGZhbHNlO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gaW5zcGVjdEhUTUwodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChcImNvbnN0cnVjdG9yXCIgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBpbnNwZWN0T2JqZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuICBpZiAodmFsdWUgPT09IE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCB0eXBlMyk7XG59XG5fX25hbWUoaW5zcGVjdCwgXCJpbnNwZWN0XCIpO1xuXG4vLyBsaWIvY2hhaS9jb25maWcuanNcbnZhciBjb25maWcgPSB7XG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmluY2x1ZGVTdGFja1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIHN0YWNrIHRyYWNlXG4gICAqIGlzIGluY2x1ZGVkIGluIEFzc2VydGlvbiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IG9mIGZhbHNlXG4gICAqIHN1cHByZXNzZXMgc3RhY2sgdHJhY2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgPSB0cnVlOyAgLy8gZW5hYmxlIHN0YWNrIG9uIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgaW5jbHVkZVN0YWNrOiBmYWxzZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcuc2hvd0RpZmZcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBvciBub3RcbiAgICogdGhlIGBzaG93RGlmZmAgZmxhZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93blxuICAgKiBBc3NlcnRpb25FcnJvcnMuIGBmYWxzZWAgd2lsbCBhbHdheXMgYmUgYGZhbHNlYDsgYHRydWVgXG4gICAqIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gaGFzIHJlcXVlc3RlZCBhIGRpZmZcbiAgICogYmUgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvd0RpZmY6IHRydWUsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnRydW5jYXRlVGhyZXNob2xkXG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBzZXRzIGxlbmd0aCB0aHJlc2hvbGQgZm9yIGFjdHVhbCBhbmRcbiAgICogZXhwZWN0ZWQgdmFsdWVzIGluIGFzc2VydGlvbiBlcnJvcnMuIElmIHRoaXMgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLCBmb3JcbiAgICogZXhhbXBsZSBmb3IgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzLCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmdcbiAgICogbGlrZSBgWyBBcnJheSgzKSBdYCBvciBgeyBPYmplY3QgKHByb3AxLCBwcm9wMikgfWAuXG4gICAqXG4gICAqIFNldCBpdCB0byB6ZXJvIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdHJ1bmNhdGluZyBhbHRvZ2V0aGVyLlxuICAgKlxuICAgKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlcmZ1bCB3aGVuIGRvaW5nIGFzc2VydGlvbnMgb24gYXJyYXlzOiBoYXZpbmcgdGhpc1xuICAgKiBzZXQgdG8gYSByZWFzb25hYmxlIGxhcmdlIHZhbHVlIG1ha2VzIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIHJlYWRpbHlcbiAgICogaW5zcGVjdGFibGUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA9IDA7ICAvLyBkaXNhYmxlIHRydW5jYXRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHRydW5jYXRlVGhyZXNob2xkOiA0MCxcbiAgLyoqXG4gICAqICMjIyBjb25maWcudXNlUHJveHlcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgaWYgY2hhaSB3aWxsIHVzZSBhIFByb3h5IHRvIHRocm93XG4gICAqIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgaXMgcmVhZCwgd2hpY2ggcHJvdGVjdHMgdXNlcnNcbiAgICogZnJvbSB0eXBvcyB3aGVuIHVzaW5nIHByb3BlcnR5LWJhc2VkIGFzc2VydGlvbnMuXG4gICAqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnVzZVByb3h5ID0gZmFsc2U7ICAvLyBkaXNhYmxlIHVzZSBvZiBQcm94eVxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlnIHZhbHVlXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgcHJveGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufVxuICAgKiBAcHVibGljXG4gICAqL1xuICB1c2VQcm94eTogdHJ1ZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcucHJveHlFeGNsdWRlZEtleXNcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24uXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBlbnZpcm9ubWVudCBDaGFpIGlzIHJ1bm5pbmcgaW4gc3VwcG9ydHMgcHJveGllcyBhbmRcbiAgICogaWYgdGhlIGB1c2VQcm94eWAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGVuYWJsZWQuXG4gICAqIEJ5IGRlZmF1bHQsIGB0aGVuYCBhbmQgYGluc3BlY3RgIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZVxuICAgKiBhc3NlcnRpb24gb2JqZWN0IGJlY2F1c2UgdGhlIGAuaW5zcGVjdGAgcHJvcGVydHkgaXMgcmVhZCBieSBgdXRpbC5pbnNwZWN0YCAoZm9yIGV4YW1wbGUsIHdoZW5cbiAgICogdXNpbmcgYGNvbnNvbGUubG9nYCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdCkgYW5kIGAudGhlbmAgaXMgbmVjZXNzYXJ5IGZvciBwcm9taXNlIHR5cGUtY2hlY2tpbmcuXG4gICAqXG4gICAqICAgICAvLyBCeSBkZWZhdWx0IHRoZXNlIGtleXMgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbiBvYmplY3RcbiAgICogICAgIGNoYWkuY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzID0gWyd0aGVuJywgJ2luc3BlY3QnXTtcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHJveHlFeGNsdWRlZEtleXM6IFtcInRoZW5cIiwgXCJjYXRjaFwiLCBcImluc3BlY3RcIiwgXCJ0b0pTT05cIl0sXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmRlZXBFcXVhbFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgZGVmaW5lcyB3aGljaCBhIGN1c3RvbSBmdW5jdGlvbiB0byB1c2UgZm9yIGRlZXBFcXVhbFxuICAgKiBjb21wYXJpc29ucy5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHVzZWQgaXMgdGhlIG9uZSBmcm9tIHRoZSBgZGVlcC1lcWxgIHBhY2thZ2Ugd2l0aG91dCBjdXN0b20gY29tcGFyYXRvci5cbiAgICpcbiAgICogICAgIC8vIHVzZSBhIGN1c3RvbSBjb21wYXJhdG9yXG4gICAqICAgICBjaGFpLmNvbmZpZy5kZWVwRXF1YWwgPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiBjaGFpLnV0aWwuZXFsKGV4cGVjdGVkLCBhY3R1YWwsIHtcbiAgICogICAgICAgICAgICAgY29tcGFyYXRvcjogKGV4cGVjdGVkLCBhY3R1YWwpID0+IHtcbiAgICogICAgICAgICAgICAgICAgIC8vIGZvciBub24gbnVtYmVyIGNvbXBhcmlzb24sIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgKiAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGV4cGVjdGVkICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gICAqICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhIGRpZmZlcmVuY2Ugb2YgMTAgYmV0d2VlbiBjb21wYXJlZCBudW1iZXJzXG4gICAqICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgMTBcbiAgICogICAgICAgICAgICAgfVxuICAgKiAgICAgICAgIH0pXG4gICAqICAgICB9O1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWVwRXF1YWw6IG51bGxcbn07XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luc3BlY3QuanNcbmZ1bmN0aW9uIGluc3BlY3QyKG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycykge1xuICBsZXQgb3B0aW9ucyA9IHtcbiAgICBjb2xvcnMsXG4gICAgZGVwdGg6IHR5cGVvZiBkZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IDIgOiBkZXB0aCxcbiAgICBzaG93SGlkZGVuLFxuICAgIHRydW5jYXRlOiBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPyBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgOiBJbmZpbml0eVxuICB9O1xuICByZXR1cm4gaW5zcGVjdChvYmosIG9wdGlvbnMpO1xufVxuX19uYW1lKGluc3BlY3QyLCBcImluc3BlY3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL29iakRpc3BsYXkuanNcbmZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIGxldCBzdHIgPSBpbnNwZWN0MihvYmopLCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUzID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09IFwiXCIgPyBcIltGdW5jdGlvbl1cIiA6IFwiW0Z1bmN0aW9uOiBcIiArIG9iai5uYW1lICsgXCJdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICByZXR1cm4gXCJbIEFycmF5KFwiICsgb2JqLmxlbmd0aCArIFwiKSBdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLCBrc3RyID0ga2V5cy5sZW5ndGggPiAyID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbihcIiwgXCIpICsgXCIsIC4uLlwiIDoga2V5cy5qb2luKFwiLCBcIik7XG4gICAgICByZXR1cm4gXCJ7IE9iamVjdCAoXCIgKyBrc3RyICsgXCIpIH1cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuX19uYW1lKG9iakRpc3BsYXksIFwib2JqRGlzcGxheVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0TWVzc2FnZS5qc1xuZnVuY3Rpb24gZ2V0TWVzc2FnZTIob2JqLCBhcmdzKSB7XG4gIGxldCBuZWdhdGUgPSBmbGFnKG9iaiwgXCJuZWdhdGVcIik7XG4gIGxldCB2YWwgPSBmbGFnKG9iaiwgXCJvYmplY3RcIik7XG4gIGxldCBleHBlY3RlZCA9IGFyZ3NbM107XG4gIGxldCBhY3R1YWwgPSBnZXRBY3R1YWwob2JqLCBhcmdzKTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGlmICh0eXBlb2YgbXNnID09PSBcImZ1bmN0aW9uXCIpIG1zZyA9IG1zZygpO1xuICBtc2cgPSBtc2cgfHwgXCJcIjtcbiAgbXNnID0gbXNnLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvYmpEaXNwbGF5KHZhbCk7XG4gIH0pLnJlcGxhY2UoLyNcXHthY3RcXH0vZywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9iakRpc3BsYXkoYWN0dWFsKTtcbiAgfSkucmVwbGFjZSgvI1xce2V4cFxcfS9nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7XG4gIH0pO1xuICByZXR1cm4gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgKyBtc2cgOiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZTIsIFwiZ2V0TWVzc2FnZVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvdHJhbnNmZXJGbGFncy5qc1xuZnVuY3Rpb24gdHJhbnNmZXJGbGFncyhhc3NlcnRpb24sIG9iamVjdCwgaW5jbHVkZUFsbCkge1xuICBsZXQgZmxhZ3MgPSBhc3NlcnRpb24uX19mbGFncyB8fCAoYXNzZXJ0aW9uLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmICghb2JqZWN0Ll9fZmxhZ3MpIHtcbiAgICBvYmplY3QuX19mbGFncyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG4gIGZvciAobGV0IGZsYWczIGluIGZsYWdzKSB7XG4gICAgaWYgKGluY2x1ZGVBbGwgfHwgZmxhZzMgIT09IFwib2JqZWN0XCIgJiYgZmxhZzMgIT09IFwic3NmaVwiICYmIGZsYWczICE9PSBcImxvY2tTc2ZpXCIgJiYgZmxhZzMgIT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWczXSA9IGZsYWdzW2ZsYWczXTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZSh0cmFuc2ZlckZsYWdzLCBcInRyYW5zZmVyRmxhZ3NcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9kZWVwLWVxbC9pbmRleC5qc1xuZnVuY3Rpb24gdHlwZTIob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBjb25zdCBzdHJpbmdUYWcgPSBvYmpbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgaWYgKHR5cGVvZiBzdHJpbmdUYWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG4gIGNvbnN0IHNsaWNlU3RhcnQgPSA4O1xuICBjb25zdCBzbGljZUVuZCA9IC0xO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2Uoc2xpY2VTdGFydCwgc2xpY2VFbmQpO1xufVxuX19uYW1lKHR5cGUyLCBcInR5cGVcIik7XG5mdW5jdGlvbiBGYWtlTWFwKCkge1xuICB0aGlzLl9rZXkgPSBcImNoYWkvZGVlcC1lcWxfX1wiICsgTWF0aC5yYW5kb20oKSArIERhdGUubm93KCk7XG59XG5fX25hbWUoRmFrZU1hcCwgXCJGYWtlTWFwXCIpO1xuRmFrZU1hcC5wcm90b3R5cGUgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIGtleVt0aGlzLl9rZXldO1xuICB9LCBcImdldFwiKSxcbiAgc2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5pc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtleSwgdGhpcy5fa2V5LCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgXCJzZXRcIilcbn07XG52YXIgTWVtb2l6ZU1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcImZ1bmN0aW9uXCIgPyBXZWFrTWFwIDogRmFrZU1hcDtcbmZ1bmN0aW9uIG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCkge1xuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIHZhciByZXN1bHQgPSBsZWZ0SGFuZE1hcC5nZXQocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShtZW1vaXplQ29tcGFyZSwgXCJtZW1vaXplQ29tcGFyZVwiKTtcbmZ1bmN0aW9uIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBtZW1vaXplTWFwLCByZXN1bHQpIHtcbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgbGVmdEhhbmRNYXAgPSBuZXcgTWVtb2l6ZU1hcCgpO1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICAgIG1lbW9pemVNYXAuc2V0KGxlZnRIYW5kT3BlcmFuZCwgbGVmdEhhbmRNYXApO1xuICB9XG59XG5fX25hbWUobWVtb2l6ZVNldCwgXCJtZW1vaXplU2V0XCIpO1xudmFyIGRlZXBfZXFsX2RlZmF1bHQgPSBkZWVwRXF1YWw7XG5mdW5jdGlvbiBkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxuICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBzaW1wbGVSZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xufVxuX19uYW1lKGRlZXBFcXVhbCwgXCJkZWVwRXF1YWxcIik7XG5mdW5jdGlvbiBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZCkge1xuICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQgIT09IDAgfHwgMSAvIGxlZnRIYW5kT3BlcmFuZCA9PT0gMSAvIHJpZ2h0SGFuZE9wZXJhbmQ7XG4gIH1cbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCAhPT0gbGVmdEhhbmRPcGVyYW5kICYmIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJpZ2h0SGFuZE9wZXJhbmQgIT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShzaW1wbGVFcXVhbCwgXCJzaW1wbGVFcXVhbFwiKTtcbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMubWVtb2l6ZSA9IG9wdGlvbnMubWVtb2l6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IG9wdGlvbnMubWVtb2l6ZSB8fCBuZXcgTWVtb2l6ZU1hcCgpO1xuICB2YXIgY29tcGFyYXRvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yO1xuICB2YXIgbWVtb2l6ZVJlc3VsdExlZnQgPSBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSk7XG4gIGlmIChtZW1vaXplUmVzdWx0TGVmdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0TGVmdDtcbiAgfVxuICB2YXIgbWVtb2l6ZVJlc3VsdFJpZ2h0ID0gbWVtb2l6ZUNvbXBhcmUocmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdFJpZ2h0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lbW9pemVSZXN1bHRSaWdodDtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIGlmIChjb21wYXJhdG9yUmVzdWx0ID09PSBmYWxzZSB8fCBjb21wYXJhdG9yUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBjb21wYXJhdG9yUmVzdWx0KTtcbiAgICAgIHJldHVybiBjb21wYXJhdG9yUmVzdWx0O1xuICAgIH1cbiAgICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICAgIH1cbiAgfVxuICB2YXIgbGVmdEhhbmRUeXBlID0gdHlwZTIobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kVHlwZSAhPT0gdHlwZTIocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHRydWUpO1xuICB2YXIgcmVzdWx0ID0gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKTtcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbl9fbmFtZShleHRlbnNpdmVEZWVwRXF1YWwsIFwiZXh0ZW5zaXZlRGVlcEVxdWFsXCIpO1xuZnVuY3Rpb24gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobGVmdEhhbmRUeXBlKSB7XG4gICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICByZXR1cm4gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZC52YWx1ZU9mKCksIHJpZ2h0SGFuZE9wZXJhbmQudmFsdWVPZigpKTtcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kID09PSByaWdodEhhbmRPcGVyYW5kO1xuICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwiY29kZVwiXSwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIkFyZ3VtZW50c1wiOlxuICAgIGNhc2UgXCJJbnQ4QXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgIGNhc2UgXCJJbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIkludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiUmVnRXhwXCI6XG4gICAgICByZXR1cm4gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBjYXNlIFwiR2VuZXJhdG9yXCI6XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZC5idWZmZXIpLCBuZXcgVWludDhBcnJheShyaWdodEhhbmRPcGVyYW5kLmJ1ZmZlciksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluRGF0ZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5QbGFpblRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5EYXRlVGltZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5JbnN0YW50XCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5ZZWFyTW9udGhcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5Nb250aERheVwiOlxuICAgICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC5lcXVhbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLkR1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvdGFsKFwibmFub3NlY29uZHNcIikgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG90YWwoXCJuYW5vc2Vjb25kc1wiKTtcbiAgICBjYXNlIFwiVGVtcG9yYWwuVGltZVpvbmVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuQ2FsZW5kYXJcIjpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0RXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxufVxuX19uYW1lKGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZSwgXCJleHRlbnNpdmVEZWVwRXF1YWxCeVR5cGVcIik7XG5mdW5jdGlvbiByZWdleHBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC50b1N0cmluZygpID09PSByaWdodEhhbmRPcGVyYW5kLnRvU3RyaW5nKCk7XG59XG5fX25hbWUocmVnZXhwRXF1YWwsIFwicmVnZXhwRXF1YWxcIik7XG5mdW5jdGlvbiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplICE9PSByaWdodEhhbmRPcGVyYW5kLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNpemVFcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVmdEhhbmRJdGVtcyA9IFtdO1xuICB2YXIgcmlnaHRIYW5kSXRlbXMgPSBbXTtcbiAgbGVmdEhhbmRPcGVyYW5kLmZvckVhY2goLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICBsZWZ0SGFuZEl0ZW1zLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSwgXCJnYXRoZXJFbnRyaWVzXCIpKTtcbiAgcmlnaHRIYW5kT3BlcmFuZC5mb3JFYWNoKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgcmlnaHRIYW5kSXRlbXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LCBcImdhdGhlckVudHJpZXNcIikpO1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEl0ZW1zLnNvcnQoKSwgcmlnaHRIYW5kSXRlbXMuc29ydCgpLCBvcHRpb25zKTtcbn1cbl9fbmFtZShlbnRyaWVzRXF1YWwsIFwiZW50cmllc0VxdWFsXCIpO1xuZnVuY3Rpb24gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGxlZnRIYW5kT3BlcmFuZC5sZW5ndGg7XG4gIGlmIChsZW5ndGggIT09IHJpZ2h0SGFuZE9wZXJhbmQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtpbmRleF0sIHJpZ2h0SGFuZE9wZXJhbmRbaW5kZXhdLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoaXRlcmFibGVFcXVhbCwgXCJpdGVyYWJsZUVxdWFsXCIpO1xuZnVuY3Rpb24gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHJldHVybiBpdGVyYWJsZUVxdWFsKGdldEdlbmVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKSwgZ2V0R2VuZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKSwgb3B0aW9ucyk7XG59XG5fX25hbWUoZ2VuZXJhdG9yRXF1YWwsIFwiZ2VuZXJhdG9yRXF1YWxcIik7XG5mdW5jdGlvbiBoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5fX25hbWUoaGFzSXRlcmF0b3JGdW5jdGlvbiwgXCJoYXNJdGVyYXRvckZ1bmN0aW9uXCIpO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JFbnRyaWVzKHRhcmdldCkge1xuICBpZiAoaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBnZXRHZW5lcmF0b3JFbnRyaWVzKHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICAgIH0gY2F0Y2ggKGl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuX19uYW1lKGdldEl0ZXJhdG9yRW50cmllcywgXCJnZXRJdGVyYXRvckVudHJpZXNcIik7XG5mdW5jdGlvbiBnZXRHZW5lcmF0b3JFbnRyaWVzKGdlbmVyYXRvcikge1xuICB2YXIgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgdmFyIGFjY3VtdWxhdG9yID0gW2dlbmVyYXRvclJlc3VsdC52YWx1ZV07XG4gIHdoaWxlIChnZW5lcmF0b3JSZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBnZW5lcmF0b3JSZXN1bHQgPSBnZW5lcmF0b3IubmV4dCgpO1xuICAgIGFjY3VtdWxhdG9yLnB1c2goZ2VuZXJhdG9yUmVzdWx0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5fX25hbWUoZ2V0R2VuZXJhdG9yRW50cmllcywgXCJnZXRHZW5lcmF0b3JFbnRyaWVzXCIpO1xuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZUtleXModGFyZ2V0KSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlS2V5cywgXCJnZXRFbnVtZXJhYmxlS2V5c1wiKTtcbmZ1bmN0aW9uIGdldEVudW1lcmFibGVTeW1ib2xzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgYWxsS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGtleSA9IGFsbEtleXNbaV07XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpLmVudW1lcmFibGUpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlU3ltYm9scywgXCJnZXRFbnVtZXJhYmxlU3ltYm9sc1wiKTtcbmZ1bmN0aW9uIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kW2tleXNbaV1dLCByaWdodEhhbmRPcGVyYW5kW2tleXNbaV1dLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoa2V5c0VxdWFsLCBcImtleXNFcXVhbFwiKTtcbmZ1bmN0aW9uIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB2YXIgbGVmdEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEtleXMgPSBnZXRFbnVtZXJhYmxlS2V5cyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgdmFyIGxlZnRIYW5kU3ltYm9scyA9IGdldEVudW1lcmFibGVTeW1ib2xzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRTeW1ib2xzID0gZ2V0RW51bWVyYWJsZVN5bWJvbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGxlZnRIYW5kS2V5cyA9IGxlZnRIYW5kS2V5cy5jb25jYXQobGVmdEhhbmRTeW1ib2xzKTtcbiAgcmlnaHRIYW5kS2V5cyA9IHJpZ2h0SGFuZEtleXMuY29uY2F0KHJpZ2h0SGFuZFN5bWJvbHMpO1xuICBpZiAobGVmdEhhbmRLZXlzLmxlbmd0aCAmJiBsZWZ0SGFuZEtleXMubGVuZ3RoID09PSByaWdodEhhbmRLZXlzLmxlbmd0aCkge1xuICAgIGlmIChpdGVyYWJsZUVxdWFsKG1hcFN5bWJvbHMobGVmdEhhbmRLZXlzKS5zb3J0KCksIG1hcFN5bWJvbHMocmlnaHRIYW5kS2V5cykuc29ydCgpKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kS2V5cywgb3B0aW9ucyk7XG4gIH1cbiAgdmFyIGxlZnRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kRW50cmllcy5sZW5ndGggJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gcmlnaHRIYW5kRW50cmllcy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kRW50cmllcywgcmlnaHRIYW5kRW50cmllcywgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRLZXlzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShvYmplY3RFcXVhbCwgXCJvYmplY3RFcXVhbFwiKTtcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCI7XG59XG5fX25hbWUoaXNQcmltaXRpdmUsIFwiaXNQcmltaXRpdmVcIik7XG5mdW5jdGlvbiBtYXBTeW1ib2xzKGFycikge1xuICByZXR1cm4gYXJyLm1hcCgvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG1hcFN5bWJvbChlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHJldHVybiBlbnRyeS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sIFwibWFwU3ltYm9sXCIpKTtcbn1cbl9fbmFtZShtYXBTeW1ib2xzLCBcIm1hcFN5bWJvbHNcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9wYXRodmFsL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuYW1lIGluIE9iamVjdChvYmopO1xufVxuX19uYW1lKGhhc1Byb3BlcnR5LCBcImhhc1Byb3BlcnR5XCIpO1xuZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgY29uc3Qgc3RyID0gcGF0aC5yZXBsYWNlKC8oW15cXFxcXSlcXFsvZywgXCIkMS5bXCIpO1xuICBjb25zdCBwYXJ0cyA9IHN0ci5tYXRjaCgvKFxcXFxcXC58W14uXSs/KSsvZyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBcImNvbnN0cnVjdG9yXCIgfHwgdmFsdWUgPT09IFwiX19wcm90b19fXCIgfHwgdmFsdWUgPT09IFwicHJvdG90eXBlXCIpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcmVnZXhwID0gL15cXFsoXFxkKylcXF0kLztcbiAgICBjb25zdCBtQXJyID0gcmVnZXhwLmV4ZWModmFsdWUpO1xuICAgIGxldCBwYXJzZWQgPSBudWxsO1xuICAgIGlmIChtQXJyKSB7XG4gICAgICBwYXJzZWQgPSB7IGk6IHBhcnNlRmxvYXQobUFyclsxXSkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkID0geyBwOiB2YWx1ZS5yZXBsYWNlKC9cXFxcKFsuW1xcXV0pL2csIFwiJDFcIikgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59XG5fX25hbWUocGFyc2VQYXRoLCBcInBhcnNlUGF0aFwiKTtcbmZ1bmN0aW9uIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXRoRGVwdGgpIHtcbiAgbGV0IHRlbXBvcmFyeVZhbHVlID0gb2JqO1xuICBsZXQgcmVzID0gbnVsbDtcbiAgcGF0aERlcHRoID0gdHlwZW9mIHBhdGhEZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IHBhcnNlZC5sZW5ndGggOiBwYXRoRGVwdGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFyc2VkW2ldO1xuICAgIGlmICh0ZW1wb3JhcnlWYWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0LnAgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LmldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LnBdO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IHBhdGhEZXB0aCAtIDEpIHtcbiAgICAgICAgcmVzID0gdGVtcG9yYXJ5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5fX25hbWUoaW50ZXJuYWxHZXRQYXRoVmFsdWUsIFwiaW50ZXJuYWxHZXRQYXRoVmFsdWVcIik7XG5mdW5jdGlvbiBnZXRQYXRoSW5mbyhvYmosIHBhdGgpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXRoKHBhdGgpO1xuICBjb25zdCBsYXN0ID0gcGFyc2VkW3BhcnNlZC5sZW5ndGggLSAxXTtcbiAgY29uc3QgaW5mbyA9IHtcbiAgICBwYXJlbnQ6IHBhcnNlZC5sZW5ndGggPiAxID8gaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6IG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZClcbiAgfTtcbiAgaW5mby5leGlzdHMgPSBoYXNQcm9wZXJ0eShpbmZvLnBhcmVudCwgaW5mby5uYW1lKTtcbiAgcmV0dXJuIGluZm87XG59XG5fX25hbWUoZ2V0UGF0aEluZm8sIFwiZ2V0UGF0aEluZm9cIik7XG5cbi8vIGxpYi9jaGFpL2Fzc2VydGlvbi5qc1xudmFyIF9Bc3NlcnRpb24gPSBjbGFzcyBfQXNzZXJ0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgb2JqZWN0IGZvciBjaGFpbmluZy5cbiAgICogYEFzc2VydGlvbmAgb2JqZWN0cyBjb250YWluIG1ldGFkYXRhIGluIHRoZSBmb3JtIG9mIGZsYWdzLiBUaHJlZSBmbGFncyBjYW5cbiAgICogYmUgYXNzaWduZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYnkgcGFzc2luZyBhcmd1bWVudHMgdG8gdGhpcyBjb25zdHJ1Y3RvcjpcbiAgICpcbiAgICogLSBgb2JqZWN0YDogVGhpcyBmbGFnIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgdGhlIGFzc2VydGlvbi4gRm9yIGV4YW1wbGUsIGluXG4gICAqIHRoZSBhc3NlcnRpb24gYGV4cGVjdChudW1LaXR0ZW5zKS50by5lcXVhbCg3KTtgLCB0aGUgYG9iamVjdGAgZmxhZyB3aWxsXG4gICAqIGNvbnRhaW4gYG51bUtpdHRlbnNgIHNvIHRoYXQgdGhlIGBlcXVhbGAgYXNzZXJ0aW9uIGNhbiByZWZlcmVuY2UgaXQgd2hlblxuICAgKiBuZWVkZWQuXG4gICAqXG4gICAqIC0gYG1lc3NhZ2VgOiBUaGlzIGZsYWcgY29udGFpbnMgYW4gb3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmVcbiAgICogcHJlcGVuZGVkIHRvIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQncyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VydGlvbiB3aGVuIGl0XG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiAtIGBzc2ZpYDogVGhpcyBmbGFnIHN0YW5kcyBmb3IgXCJzdGFydCBzdGFjayBmdW5jdGlvbiBpbmRpY2F0b3JcIi4gSXRcbiAgICogY29udGFpbnMgYSBmdW5jdGlvbiByZWZlcmVuY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgKiByZW1vdmluZyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGVycm9yIHRoYXQncyBjcmVhdGVkIGJ5IHRoZVxuICAgKiBhc3NlcnRpb24gd2hlbiBpdCBmYWlscy4gVGhlIGdvYWwgaXMgdG8gcHJvdmlkZSBhIGNsZWFuZXIgc3RhY2sgdHJhY2UgdG9cbiAgICogZW5kIHVzZXJzIGJ5IHJlbW92aW5nIENoYWkncyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdGUgdGhhdCBpdCBvbmx5IHdvcmtzXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgYEVycm9yLmNhcHR1cmVTdGFja1RyYWNlYCwgYW5kIG9ubHkgd2hlblxuICAgKiBgQ2hhaS5jb25maWcuaW5jbHVkZVN0YWNrYCBoYXNuJ3QgYmVlbiBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogLSBgbG9ja1NzZmlgOiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGBzc2ZpYCBmbGFnXG4gICAqIHNob3VsZCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUsIGV2ZW4gYXMgYXNzZXJ0aW9ucyBhcmUgY2hhaW5lZCBvZmYgb2ZcbiAgICogdGhpcyBvYmplY3QuIFRoaXMgaXMgdXN1YWxseSBzZXQgdG8gYHRydWVgIHdoZW4gY3JlYXRpbmcgYSBuZXcgYXNzZXJ0aW9uXG4gICAqIGZyb20gd2l0aGluIGFub3RoZXIgYXNzZXJ0aW9uLiBJdCdzIGFsc28gdGVtcG9yYXJpbHkgc2V0IHRvIGB0cnVlYCBiZWZvcmVcbiAgICogYW4gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uXG4gICAqXG4gICAqIC0gYGVxbGA6IFRoaXMgZmxhZyBjb250YWlucyB0aGUgZGVlcEVxdWFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VydGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSBvYmogdGFyZ2V0IG9mIHRoZSBhc3NlcnRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIChvcHRpb25hbCkgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NzZmldIChvcHRpb25hbCkgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIHN0YWNrIGZyYW1lc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2NrU3NmaV0gKG9wdGlvbmFsKSB3aGV0aGVyIG9yIG5vdCB0aGUgc3NmaSBmbGFnIGlzIGxvY2tlZFxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqLCBtc2csIHNzZmksIGxvY2tTc2ZpKSB7XG4gICAgLyoqIEB0eXBlIHt7fX0gKi9cbiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsIFwiX19mbGFnc1wiLCB7fSk7XG4gICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgc3NmaSB8fCBfQXNzZXJ0aW9uKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgbG9ja1NzZmkpO1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgb2JqKTtcbiAgICBmbGFnKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICAgIGZsYWcodGhpcywgXCJlcWxcIiwgY29uZmlnLmRlZXBFcXVhbCB8fCBkZWVwX2VxbF9kZWZhdWx0KTtcbiAgICByZXR1cm4gcHJveGlmeSh0aGlzKTtcbiAgfVxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIHN0YXRpYyBnZXQgaW5jbHVkZVN0YWNrKCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuXCJcbiAgICApO1xuICAgIHJldHVybiBjb25maWcuaW5jbHVkZVN0YWNrO1xuICB9XG4gIC8qKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlICovXG4gIHN0YXRpYyBzZXQgaW5jbHVkZVN0YWNrKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uaW5jbHVkZVN0YWNrIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICB9XG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgc3RhdGljIGdldCBzaG93RGlmZigpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkFzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgfVxuICAvKiogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAqL1xuICBzdGF0aWMgc2V0IHNob3dEaWZmKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uc2hvd0RpZmYgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLnNob3dEaWZmIGluc3RlYWQuXCJcbiAgICApO1xuICAgIGNvbmZpZy5zaG93RGlmZiA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIGFkZFByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgYWRkUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBhZGRNZXRob2QobmFtZSwgZm4pIHtcbiAgICBhZGRNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIGFkZENoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIGFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZVByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgb3ZlcndyaXRlUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBvdmVyd3JpdGVNZXRob2QobmFtZSwgZm4pIHtcbiAgICBvdmVyd3JpdGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiAjIyMgLmFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlLCBuZWdhdGVNZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBzaG93RGlmZilcbiAgICpcbiAgICogRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiBhbmQgY2hlY2sgZXhwZWN0YXRpb25zLiBUaHJvd3MgQXNzZXJ0aW9uRXJyb3IgZm9yIHJlcG9ydGluZyBpZiB0ZXN0IGRvZXNuJ3QgcGFzcy5cbiAgICpcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gX2V4cHIgdG8gYmUgdGVzdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBGdW5jdGlvbn0gX25lZ2F0ZU1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbmVnYXRlZE1lc3NhZ2UgdG8gZGlzcGxheSBpZiBuZWdhdGVkIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZCB2YWx1ZSAocmVtZW1iZXIgdG8gY2hlY2sgZm9yIG5lZ2F0aW9uKVxuICAgKiBAcGFyYW0ge3Vua25vd259IF9hY3R1YWwgKG9wdGlvbmFsKSB3aWxsIGRlZmF1bHQgdG8gYHRoaXMub2JqYFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dEaWZmIChvcHRpb25hbCkgd2hlbiBzZXQgdG8gYHRydWVgLCBhc3NlcnQgd2lsbCBkaXNwbGF5IGEgZGlmZiBpbiBhZGRpdGlvbiB0byB0aGUgbWVzc2FnZSBpZiBleHByZXNzaW9uIGZhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0KF9leHByLCBtc2csIF9uZWdhdGVNc2csIGV4cGVjdGVkLCBfYWN0dWFsLCBzaG93RGlmZikge1xuICAgIGNvbnN0IG9rID0gdGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChmYWxzZSAhPT0gc2hvd0RpZmYpIHNob3dEaWZmID0gdHJ1ZTtcbiAgICBpZiAodm9pZCAwID09PSBleHBlY3RlZCAmJiB2b2lkIDAgPT09IF9hY3R1YWwpIHNob3dEaWZmID0gZmFsc2U7XG4gICAgaWYgKHRydWUgIT09IGNvbmZpZy5zaG93RGlmZikgc2hvd0RpZmYgPSBmYWxzZTtcbiAgICBpZiAoIW9rKSB7XG4gICAgICBtc2cgPSBnZXRNZXNzYWdlMih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgY29uc3QgYWN0dWFsID0gZ2V0QWN0dWFsKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBjb25zdCBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMgPSB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIHNob3dEaWZmXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3BlcmF0b3IgPSBnZXRPcGVyYXRvcih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKG9wZXJhdG9yKSB7XG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2csXG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcyxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aGF0IHRvIGRvIGFib3V0IHRoZXNlIHR5cGVzIHlldFxuICAgICAgICBjb25maWcuaW5jbHVkZVN0YWNrID8gdGhpcy5hc3NlcnQgOiBmbGFnKHRoaXMsIFwic3NmaVwiKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFF1aWNrIHJlZmVyZW5jZSB0byBzdG9yZWQgYGFjdHVhbGAgdmFsdWUgZm9yIHBsdWdpbiBkZXZlbG9wZXJzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn1cbiAgICovXG4gIGdldCBfb2JqKCkge1xuICAgIHJldHVybiBmbGFnKHRoaXMsIFwib2JqZWN0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBRdWljayByZWZlcmVuY2UgdG8gc3RvcmVkIGBhY3R1YWxgIHZhbHVlIGZvciBwbHVnaW4gZGV2ZWxvcGVycy5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWxcbiAgICovXG4gIHNldCBfb2JqKHZhbCkge1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgdmFsKTtcbiAgfVxufTtcbl9fbmFtZShfQXNzZXJ0aW9uLCBcIkFzc2VydGlvblwiKTtcbnZhciBBc3NlcnRpb24gPSBfQXNzZXJ0aW9uO1xuXG4vLyBsaWIvY2hhaS91dGlscy9ldmVudHMuanNcbnZhciBldmVudHMgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbnZhciBfUGx1Z2luRXZlbnQgPSBjbGFzcyBfUGx1Z2luRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbikge1xuICAgIHN1cGVyKHR5cGUzKTtcbiAgICB0aGlzLm5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgdGhpcy5mbiA9IGZuO1xuICB9XG59O1xuX19uYW1lKF9QbHVnaW5FdmVudCwgXCJQbHVnaW5FdmVudFwiKTtcbnZhciBQbHVnaW5FdmVudCA9IF9QbHVnaW5FdmVudDtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanNcbmZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIHR5cGVvZiBQcm94eSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cbl9fbmFtZShpc1Byb3h5RW5hYmxlZCwgXCJpc1Byb3h5RW5hYmxlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanNcbmZ1bmN0aW9uIGFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKSB7XG4gIGdldHRlciA9IGdldHRlciA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7XG4gIH0gOiBnZXR0ZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICBpZiAoIWlzUHJveHlFbmFibGVkKCkgJiYgIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBwcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwodGhpcyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHJldHVybiByZXN1bHQ7XG4gICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgICB9LCBcInByb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkUHJvcGVydHlcIiwgbmFtZSwgZ2V0dGVyKSk7XG59XG5fX25hbWUoYWRkUHJvcGVydHksIFwiYWRkUHJvcGVydHlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZExlbmd0aEd1YXJkLmpzXG52YXIgZm5MZW5ndGhEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jdGlvbigpIHtcbn0sIFwibGVuZ3RoXCIpO1xuZnVuY3Rpb24gYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSkgcmV0dXJuIGZuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibGVuZ3RoXCIsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaXNDaGFpbmFibGUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnXCIuJ1xuICAgICAgKTtcbiAgICB9LCBcImdldFwiKVxuICB9KTtcbiAgcmV0dXJuIGZuO1xufVxuX19uYW1lKGFkZExlbmd0aEd1YXJkLCBcImFkZExlbmd0aEd1YXJkXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRQcm9wZXJ0aWVzLmpzXG5mdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcbiAgZnVuY3Rpb24gYWRkUHJvcGVydHkyKHByb3BlcnR5KSB7XG4gICAgaWYgKHJlc3VsdC5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgX19uYW1lKGFkZFByb3BlcnR5MiwgXCJhZGRQcm9wZXJ0eVwiKTtcbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5Mik7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5fX25hbWUoZ2V0UHJvcGVydGllcywgXCJnZXRQcm9wZXJ0aWVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9wcm94aWZ5LmpzXG52YXIgYnVpbHRpbnMgPSBbXCJfX2ZsYWdzXCIsIFwiX19tZXRob2RzXCIsIFwiX29ialwiLCBcImFzc2VydFwiXTtcbmZ1bmN0aW9uIHByb3hpZnkob2JqLCBub25DaGFpbmFibGVNZXRob2ROYW1lKSB7XG4gIGlmICghaXNQcm94eUVuYWJsZWQoKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJveHlHZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiAmJiBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5KSkge1xuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArIFwiLlwiICsgcHJvcGVydHkgKyAnLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgKyAnXCIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1Z2dlc3Rpb24gPSBudWxsO1xuICAgICAgICBsZXQgc3VnZ2VzdGlvbkRpc3RhbmNlID0gNDtcbiAgICAgICAgZ2V0UHJvcGVydGllcyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHdlIGFjdHVhbGx5IG1lYW4gdG8gY2hlY2sgYE9iamVjdC5wcm90b3R5cGVgIGhlcmVcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGJ1aWx0aW5zLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZGlzdCA9IHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHByb3BlcnR5LCBwcm9wLCBzdWdnZXN0aW9uRGlzdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGRpc3QgPCBzdWdnZXN0aW9uRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHByb3A7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIHByb3BlcnR5ICsgJy4gRGlkIHlvdSBtZWFuIFwiJyArIHN1Z2dlc3Rpb24gKyAnXCI/J1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYnVpbHRpbnMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFmbGFnKHRhcmdldCwgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgXCJzc2ZpXCIsIHByb3h5R2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9LCBcInByb3h5R2V0dGVyXCIpXG4gIH0pO1xufVxuX19uYW1lKHByb3hpZnksIFwicHJveGlmeVwiKTtcbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuICBsZXQgbWVtbyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKGxldCBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoID0gc3RyQS5jaGFyQ29kZUF0KGkgLSAxKTtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBzdHJCLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoaSAtIGopID49IGNhcCkge1xuICAgICAgICBtZW1vW2ldW2pdID0gY2FwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgbWVtb1tpIC0gMV1bal0gKyAxLFxuICAgICAgICBtZW1vW2ldW2ogLSAxXSArIDEsXG4gICAgICAgIG1lbW9baSAtIDFdW2ogLSAxXSArIChjaCA9PT0gc3RyQi5jaGFyQ29kZUF0KGogLSAxKSA/IDAgOiAxKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbl9fbmFtZShzdHJpbmdEaXN0YW5jZUNhcHBlZCwgXCJzdHJpbmdEaXN0YW5jZUNhcHBlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkTWV0aG9kLmpzXG5mdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IG1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm1ldGhvZFdyYXBwZXJcIik7XG4gIGFkZExlbmd0aEd1YXJkKG1ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShtZXRob2RXcmFwcGVyLCBuYW1lKTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkTWV0aG9kXCIsIG5hbWUsIG1ldGhvZCkpO1xufVxuX19uYW1lKGFkZE1ldGhvZCwgXCJhZGRNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZVByb3BlcnR5LmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBsZXQgX2dldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBuYW1lKSwgX3N1cGVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfZ2V0ICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9nZXQuZ2V0KSBfc3VwZXIgPSBfZ2V0LmdldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSwge1xuICAgIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKCkge1xuICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsIFwibG9ja1NzZmlcIikpIHtcbiAgICAgICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgICAgZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIsIHRydWUpO1xuICAgICAgbGV0IHJlc3VsdCA9IGdldHRlcihfc3VwZXIpLmNhbGwodGhpcyk7XG4gICAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgfSwgXCJvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cbl9fbmFtZShvdmVyd3JpdGVQcm9wZXJ0eSwgXCJvdmVyd3JpdGVQcm9wZXJ0eVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IF9tZXRob2QgPSBjdHhbbmFtZV0sIF9zdXBlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfbWV0aG9kICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9tZXRob2QpIF9zdXBlciA9IF9tZXRob2Q7XG4gIGxldCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cbiAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcodGhpcywgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICBsZXQgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH0sIFwib3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyXCIpO1xuICBhZGRMZW5ndGhHdWFyZChvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUpO1xufVxuX19uYW1lKG92ZXJ3cml0ZU1ldGhvZCwgXCJvdmVyd3JpdGVNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZENoYWluYWJsZU1ldGhvZC5qc1xudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09IFwiZnVuY3Rpb25cIjtcbnZhciB0ZXN0Rm4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xufSwgXCJ0ZXN0Rm5cIik7XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICBsZXQgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG4gIGlmICh0eXBlb2YgcHJvcERlc2MgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIXByb3BEZXNjLmNvbmZpZ3VyYWJsZTtcbn0pO1xudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBjbGFzcyBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgZXh0ZW5kcyBQbHVnaW5FdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIHN1cGVyKHR5cGUzLCBuYW1lLCBmbik7XG4gICAgdGhpcy5jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5pbmdCZWhhdmlvcjtcbiAgfVxufTtcbl9fbmFtZShfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQsIFwiUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnRcIik7XG52YXIgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQ7XG5mdW5jdGlvbiBhZGRDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgaWYgKHR5cGVvZiBjaGFpbmluZ0JlaGF2aW9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjaGFpbmluZ0JlaGF2aW9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgICB9LCBcImNoYWluaW5nQmVoYXZpb3JcIik7XG4gIH1cbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0ge1xuICAgIG1ldGhvZCxcbiAgICBjaGFpbmluZ0JlaGF2aW9yXG4gIH07XG4gIGlmICghY3R4Ll9fbWV0aG9kcykge1xuICAgIGN0eC5fX21ldGhvZHMgPSB7fTtcbiAgfVxuICBjdHguX19tZXRob2RzW25hbWVdID0gY2hhaW5hYmxlQmVoYXZpb3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gY2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuICAgICAgbGV0IGNoYWluYWJsZU1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICAgIGZsYWcodGhpcywgXCJzc2ZpXCIsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9LCBcImNoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG4gICAgICBhZGRMZW5ndGhHdWFyZChjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBuYW1lLCB0cnVlKTtcbiAgICAgIGlmIChjYW5TZXRQcm90b3R5cGUpIHtcbiAgICAgICAgbGV0IHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIHByb3RvdHlwZS5jYWxsID0gY2FsbDtcbiAgICAgICAgcHJvdG90eXBlLmFwcGx5ID0gYXBwbHk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBwcm90b3R5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGFzc2VydGVyTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdHgpO1xuICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24oYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgaWYgKGV4Y2x1ZGVOYW1lcy5pbmRleE9mKGFzc2VydGVyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBhc3NlcnRlck5hbWUpO1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBhc3NlcnRlck5hbWUsIHBkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHByb3hpZnkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgfSwgXCJjaGFpbmFibGVNZXRob2RHZXR0ZXJcIiksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBldmVudHMuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQoXG4gICAgICBcImFkZENoYWluYWJsZU1ldGhvZFwiLFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGNoYWluaW5nQmVoYXZpb3JcbiAgICApXG4gICk7XG59XG5fX25hbWUoYWRkQ2hhaW5hYmxlTWV0aG9kLCBcImFkZENoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0gY3R4Ll9fbWV0aG9kc1tuYW1lXTtcbiAgbGV0IF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gb3ZlcndyaXRpbmdDaGFpbmFibGVNZXRob2RHZXR0ZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNoYWluaW5nQmVoYXZpb3IoX2NoYWluaW5nQmVoYXZpb3IpLmNhbGwodGhpcyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyXCIpO1xuICBsZXQgX21ldGhvZCA9IGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZDtcbiAgY2hhaW5hYmxlQmVoYXZpb3IubWV0aG9kID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZChfbWV0aG9kKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfSwgXCJvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG59XG5fX25hbWUob3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLCBcIm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvY29tcGFyZUJ5SW5zcGVjdC5qc1xuZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0MihhKSA8IGluc3BlY3QyKGIpID8gLTEgOiAxO1xufVxuX19uYW1lKGNvbXBhcmVCeUluc3BlY3QsIFwiY29tcGFyZUJ5SW5zcGVjdFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scy5qc1xuZnVuY3Rpb24gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pLmVudW1lcmFibGU7XG4gIH0pO1xufVxuX19uYW1lKGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMsIFwiZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMuanNcbmZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5jb25jYXQoZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopKTtcbn1cbl9fbmFtZShnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcywgXCJnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNOYU4uanNcbnZhciBpc05hTjIgPSBOdW1iZXIuaXNOYU47XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE9wZXJhdG9yLmpzXG5mdW5jdGlvbiBpc09iamVjdFR5cGUob2JqKSB7XG4gIGxldCBvYmplY3RUeXBlID0gdHlwZShvYmopO1xuICBsZXQgb2JqZWN0VHlwZXMgPSBbXCJBcnJheVwiLCBcIk9iamVjdFwiLCBcIkZ1bmN0aW9uXCJdO1xuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5fX25hbWUoaXNPYmplY3RUeXBlLCBcImlzT2JqZWN0VHlwZVwiKTtcbmZ1bmN0aW9uIGdldE9wZXJhdG9yKG9iaiwgYXJncykge1xuICBsZXQgb3BlcmF0b3IgPSBmbGFnKG9iaiwgXCJvcGVyYXRvclwiKTtcbiAgbGV0IG5lZ2F0ZSA9IGZsYWcob2JqLCBcIm5lZ2F0ZVwiKTtcbiAgbGV0IGV4cGVjdGVkID0gYXJnc1szXTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cbiAgaWYgKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCBcIlwiO1xuICBpZiAoIW1zZykge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKC9cXHNoYXZlXFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGxldCBpc09iamVjdCA9IGlzT2JqZWN0VHlwZShleHBlY3RlZCk7XG4gIGlmICgvXFxzbm90XFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gaXNPYmplY3QgPyBcIm5vdERlZXBTdHJpY3RFcXVhbFwiIDogXCJub3RTdHJpY3RFcXVhbFwiO1xuICB9XG4gIHJldHVybiBpc09iamVjdCA/IFwiZGVlcFN0cmljdEVxdWFsXCIgOiBcInN0cmljdEVxdWFsXCI7XG59XG5fX25hbWUoZ2V0T3BlcmF0b3IsIFwiZ2V0T3BlcmF0b3JcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luZGV4LmpzXG5mdW5jdGlvbiBnZXROYW1lKGZuKSB7XG4gIHJldHVybiBmbi5uYW1lO1xufVxuX19uYW1lKGdldE5hbWUsIFwiZ2V0TmFtZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwMihvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuX19uYW1lKGlzUmVnRXhwMiwgXCJpc1JlZ0V4cFwiKTtcbmZ1bmN0aW9uIGlzTnVtZXJpYyhvYmopIHtcbiAgcmV0dXJuIFtcIk51bWJlclwiLCBcIkJpZ0ludFwiXS5pbmNsdWRlcyh0eXBlKG9iaikpO1xufVxuX19uYW1lKGlzTnVtZXJpYywgXCJpc051bWVyaWNcIik7XG5cbi8vIGxpYi9jaGFpL2NvcmUvYXNzZXJ0aW9ucy5qc1xudmFyIHsgZmxhZzogZmxhZzIgfSA9IHV0aWxzX2V4cG9ydHM7XG5bXG4gIFwidG9cIixcbiAgXCJiZVwiLFxuICBcImJlZW5cIixcbiAgXCJpc1wiLFxuICBcImFuZFwiLFxuICBcImhhc1wiLFxuICBcImhhdmVcIixcbiAgXCJ3aXRoXCIsXG4gIFwidGhhdFwiLFxuICBcIndoaWNoXCIsXG4gIFwiYXRcIixcbiAgXCJvZlwiLFxuICBcInNhbWVcIixcbiAgXCJidXRcIixcbiAgXCJkb2VzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJhbHNvXCJcbl0uZm9yRWFjaChmdW5jdGlvbihjaGFpbikge1xuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoY2hhaW4pO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJub3RcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIsIHRydWUpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJkZWVwXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImRlZXBcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm5lc3RlZFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJuZXN0ZWRcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm93blwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJvd25cIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9yZGVyZWRcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiYW55XCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImFueVwiLCB0cnVlKTtcbiAgZmxhZzIodGhpcywgXCJhbGxcIiwgZmFsc2UpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJhbGxcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwiYWxsXCIsIHRydWUpO1xuICBmbGFnMih0aGlzLCBcImFueVwiLCBmYWxzZSk7XG59KTtcbnZhciBmdW5jdGlvblR5cGVzID0ge1xuICBmdW5jdGlvbjogW1xuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcImFzeW5jZnVuY3Rpb25cIixcbiAgICBcImdlbmVyYXRvcmZ1bmN0aW9uXCIsXG4gICAgXCJhc3luY2dlbmVyYXRvcmZ1bmN0aW9uXCJcbiAgXSxcbiAgYXN5bmNmdW5jdGlvbjogW1wiYXN5bmNmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGdlbmVyYXRvcmZ1bmN0aW9uOiBbXCJnZW5lcmF0b3JmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGFzeW5jZ2VuZXJhdG9yZnVuY3Rpb246IFtcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl1cbn07XG5mdW5jdGlvbiBhbih0eXBlMywgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB0eXBlMyA9IHR5cGUzLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgYXJ0aWNsZSA9IH5bXCJhXCIsIFwiZVwiLCBcImlcIiwgXCJvXCIsIFwidVwiXS5pbmRleE9mKHR5cGUzLmNoYXJBdCgwKSkgPyBcImFuIFwiIDogXCJhIFwiO1xuICBjb25zdCBkZXRlY3RlZFR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGZ1bmN0aW9uVHlwZXNbXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlMykpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGZ1bmN0aW9uVHlwZXNbdHlwZTNdLmluY2x1ZGVzKGRldGVjdGVkVHlwZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIHR5cGUzID09PSBkZXRlY3RlZFR5cGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFuLCBcImFuXCIpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImFuXCIsIGFuKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJhXCIsIGFuKTtcbmZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oYSwgYikge1xuICByZXR1cm4gaXNOYU4yKGEpICYmIGlzTmFOMihiKSB8fCBhID09PSBiO1xufVxuX19uYW1lKFNhbWVWYWx1ZVplcm8sIFwiU2FtZVZhbHVlWmVyb1wiKTtcbmZ1bmN0aW9uIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKCkge1xuICBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIsIHRydWUpO1xufVxuX19uYW1lKGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yLCBcImluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yXCIpO1xuZnVuY3Rpb24gaW5jbHVkZSh2YWwsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBpc0RlZXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIiksIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyBcImRlZXAgXCIgOiBcIlwiLCBpc0VxbCA9IGlzRGVlcCA/IGZsYWcyKHRoaXMsIFwiZXFsXCIpIDogU2FtZVZhbHVlWmVybztcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgbGV0IGluY2x1ZGVkID0gZmFsc2U7XG4gIHN3aXRjaCAob2JqVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwid2Vha3NldFwiOlxuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwidW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldFwiLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic2V0XCI6XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IGluY2x1ZGVkIHx8IGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmICh2YWwgIT09IE9iamVjdCh2YWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBmbGFnTXNnICsgXCJ0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2YgYXJndW1lbnRzIChcIiArIG9ialR5cGUgKyBcIiBhbmQgXCIgKyB0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSArIFwiKSBpcyBpbnZhbGlkIGZvciB0aGlzIGFzc2VydGlvbi4gWW91IGNhbiB1c2UgYW4gYXJyYXksIGEgbWFwLCBhbiBvYmplY3QsIGEgc2V0LCBhIHN0cmluZywgb3IgYSB3ZWFrc2V0IGluc3RlYWQgb2YgYSBcIiArIHR5cGUodmFsKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgbGV0IGZpcnN0RXJyID0gbnVsbDtcbiAgICAgIGxldCBudW1FcnJzID0gMDtcbiAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBsZXQgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBwcm9wQXNzZXJ0aW9uLCB0cnVlKTtcbiAgICAgICAgZmxhZzIocHJvcEFzc2VydGlvbiwgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihlcnIsIEFzc2VydGlvbkVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlyc3RFcnIgPT09IG51bGwpIGZpcnN0RXJyID0gZXJyO1xuICAgICAgICAgIG51bUVycnMrKztcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgICBpZiAobmVnYXRlICYmIHByb3BzLmxlbmd0aCA+IDEgJiYgbnVtRXJycyA9PT0gcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IGZpcnN0RXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpbmNsdWRlZCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZXNjcmlwdG9yICsgXCJpbmNsdWRlIFwiICsgaW5zcGVjdDIodmFsKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IFwiICsgZGVzY3JpcHRvciArIFwiaW5jbHVkZSBcIiArIGluc3BlY3QyKHZhbClcbiAgKTtcbn1cbl9fbmFtZShpbmNsdWRlLCBcImluY2x1ZGVcIik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiaW5jbHVkZVwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpblwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpbnNcIiwgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImluY2x1ZGVzXCIsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9rXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1dGh5XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5XCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidHJ1ZVwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgdHJ1ZSA9PT0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydWVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJudW1lcmljXCIsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBvYmplY3QgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgW1wiTnVtYmVyXCIsIFwiQmlnSW50XCJdLmluY2x1ZGVzKHR5cGUob2JqZWN0KSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIG51bWVyaWNcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIG51bWVyaWNcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJjYWxsYWJsZVwiLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgdmFsID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIGNvbnN0IG1lc3NhZ2UgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UgPyBgJHttZXNzYWdlfTogYCA6IFwiXCI7XG4gIGNvbnN0IG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpO1xuICBjb25zdCBhc3NlcnRpb25NZXNzYWdlID0gbmVnYXRlID8gYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gbm90IHRvIGJlIGEgY2FsbGFibGUgZnVuY3Rpb25gIDogYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbmA7XG4gIGNvbnN0IGlzQ2FsbGFibGUgPSBbXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQXN5bmNGdW5jdGlvblwiLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIixcbiAgICBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIlxuICBdLmluY2x1ZGVzKHR5cGUodmFsKSk7XG4gIGlmIChpc0NhbGxhYmxlICYmIG5lZ2F0ZSB8fCAhaXNDYWxsYWJsZSAmJiAhbmVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGFzc2VydGlvbk1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZmFsc2VcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGZhbHNlID09PSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZVwiLFxuICAgIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpID8gdHJ1ZSA6IGZhbHNlXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm51bGxcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIG51bGwgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBudWxsXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBudWxsXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidW5kZWZpbmVkXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICB2b2lkIDAgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIHVuZGVmaW5lZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIk5hTlwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNOYU4yKGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgTmFOXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBOYU5cIlxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRFeGlzdCgpIHtcbiAgbGV0IHZhbCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdFwiXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0RXhpc3QsIFwiYXNzZXJ0RXhpc3RcIik7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdFwiLCBhc3NlcnRFeGlzdCk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdHNcIiwgYXNzZXJ0RXhpc3QpO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZW1wdHlcIiwgZnVuY3Rpb24oKSB7XG4gIGxldCB2YWwgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgaXRlbXNDb3VudDtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgc3dpdGNoICh0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1hcFwiOlxuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ3ZWFrbWFwXCI6XG4gICAgY2FzZSBcIndlYWtzZXRcIjpcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb25cIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBtc2cgPSBmbGFnTXNnICsgXCIuZW1wdHkgd2FzIHBhc3NlZCBhIGZ1bmN0aW9uIFwiICsgZ2V0TmFtZSh2YWwpO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZy50cmltKCksIHZvaWQgMCwgc3NmaSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgbm9uLXN0cmluZyBwcmltaXRpdmUgXCIgKyBpbnNwZWN0Mih2YWwpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpdGVtc0NvdW50ID0gT2JqZWN0LmtleXModmFsKS5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgMCA9PT0gaXRlbXNDb3VudCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZW1wdHlcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGVtcHR5XCJcbiAgKTtcbn0pO1xuZnVuY3Rpb24gY2hlY2tBcmd1bWVudHMoKSB7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgdHlwZTMgPSB0eXBlKG9iaik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIFwiQXJndW1lbnRzXCIgPT09IHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhcmd1bWVudHMgYnV0IGdvdCBcIiArIHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYXJndW1lbnRzXCJcbiAgKTtcbn1cbl9fbmFtZShjaGVja0FyZ3VtZW50cywgXCJjaGVja0FyZ3VtZW50c1wiKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImFyZ3VtZW50c1wiLCBjaGVja0FyZ3VtZW50cyk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJBcmd1bWVudHNcIiwgY2hlY2tBcmd1bWVudHMpO1xuZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgaWYgKGZsYWcyKHRoaXMsIFwiZGVlcFwiKSkge1xuICAgIGxldCBwcmV2TG9ja1NzZmkgPSBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcyKHRoaXMsIFwibG9ja1NzZmlcIiwgdHJ1ZSk7XG4gICAgdGhpcy5lcWwodmFsKTtcbiAgICBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIsIHByZXZMb2NrU3NmaSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICB2YWwgPT09IG9iaixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXF1YWwgI3tleHB9XCIsXG4gICAgICB2YWwsXG4gICAgICB0aGlzLl9vYmosXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEVxdWFsLCBcImFzc2VydEVxdWFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxdWFsXCIsIGFzc2VydEVxdWFsKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJlcXVhbHNcIiwgYXNzZXJ0RXF1YWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxXCIsIGFzc2VydEVxdWFsKTtcbmZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGVxbCA9IGZsYWcyKHRoaXMsIFwiZXFsXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICBlcWwob2JqLCBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBvYmosXG4gICAgdGhpcy5fb2JqLFxuICAgIHRydWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRFcWwsIFwiYXNzZXJ0RXFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbFwiLCBhc3NlcnRFcWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbHNcIiwgYXNzZXJ0RXFsKTtcbmZ1bmN0aW9uIGFzc2VydEFib3ZlKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYWJvdmUgbXVzdCBiZSBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGFib3ZlIG11c3QgYmUgYSBudW1iZXJcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIGlmIChkb0xlbmd0aCkge1xuICAgIGxldCBkZXNjcmlwdG9yID0gXCJsZW5ndGhcIiwgaXRlbXNDb3VudDtcbiAgICBpZiAob2JqVHlwZSA9PT0gXCJtYXBcIiB8fCBvYmpUeXBlID09PSBcInNldFwiKSB7XG4gICAgICBkZXNjcmlwdG9yID0gXCJzaXplXCI7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGl0ZW1zQ291bnQgPiBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGFib3ZlICN7ZXhwfVwiLFxuICAgICAgbixcbiAgICAgIGl0ZW1zQ291bnRcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgb2JqID4gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBtb3N0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRBYm92ZSwgXCJhc3NlcnRBYm92ZVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhYm92ZVwiLCBhc3NlcnRBYm92ZSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3RcIiwgYXNzZXJ0QWJvdmUpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImdyZWF0ZXJUaGFuXCIsIGFzc2VydEFib3ZlKTtcbmZ1bmN0aW9uIGFzc2VydExlYXN0KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbGVhc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA+PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBsZWFzdCAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPj0gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBsZWFzdCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBiZWxvdyAje2V4cH1cIixcbiAgICAgIG5cbiAgICApO1xuICB9XG59XG5fX25hbWUoYXNzZXJ0TGVhc3QsIFwiYXNzZXJ0TGVhc3RcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibGVhc3RcIiwgYXNzZXJ0TGVhc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImd0ZVwiLCBhc3NlcnRMZWFzdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsIGFzc2VydExlYXN0KTtcbmZ1bmN0aW9uIGFzc2VydEJlbG93KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGJlbG93ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPCBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRCZWxvdywgXCJhc3NlcnRCZWxvd1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJiZWxvd1wiLCBhc3NlcnRCZWxvdyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibHRcIiwgYXNzZXJ0QmVsb3cpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImxlc3NUaGFuXCIsIGFzc2VydEJlbG93KTtcbmZ1bmN0aW9uIGFzc2VydE1vc3QobiwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGRvTGVuZ3RoID0gZmxhZzIodGhpcywgXCJkb0xlbmd0aFwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgbXNnUHJlZml4ID0gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgOiBcIlwiLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIG5UeXBlID0gdHlwZShuKS50b0xvd2VyQ2FzZSgpLCBlcnJvck1lc3NhZ2UsIHNob3VsZFRocm93ID0gdHJ1ZTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgZGF0ZVwiO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBtb3N0ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH1cIixcbiAgICAgIG4sXG4gICAgICBpdGVtc0NvdW50XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9XCIsXG4gICAgICBuXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydE1vc3QsIFwiYXNzZXJ0TW9zdFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtb3N0XCIsIGFzc2VydE1vc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImx0ZVwiLCBhc3NlcnRNb3N0KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJsZXNzVGhhbk9yRXF1YWxcIiwgYXNzZXJ0TW9zdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwid2l0aGluXCIsIGZ1bmN0aW9uKHN0YXJ0LCBmaW5pc2gsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBzdGFydFR5cGUgPSB0eXBlKHN0YXJ0KS50b0xvd2VyQ2FzZSgpLCBmaW5pc2hUeXBlID0gdHlwZShmaW5pc2gpLnRvTG93ZXJDYXNlKCksIGVycm9yTWVzc2FnZSwgc2hvdWxkVGhyb3cgPSB0cnVlLCByYW5nZSA9IHN0YXJ0VHlwZSA9PT0gXCJkYXRlXCIgJiYgZmluaXNoVHlwZSA9PT0gXCJkYXRlXCIgPyBzdGFydC50b0lTT1N0cmluZygpICsgXCIuLlwiICsgZmluaXNoLnRvSVNPU3RyaW5nKCkgOiBzdGFydCArIFwiLi5cIiArIGZpbmlzaDtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgKHN0YXJ0VHlwZSAhPT0gXCJkYXRlXCIgfHwgZmluaXNoVHlwZSAhPT0gXCJkYXRlXCIpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIGRhdGVzXCI7XG4gIH0gZWxzZSBpZiAoKCFpc051bWVyaWMoc3RhcnQpIHx8ICFpc051bWVyaWMoZmluaXNoKSkgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBudW1iZXJzXCI7XG4gIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwiZGF0ZVwiICYmICFpc051bWVyaWMob2JqKSkge1xuICAgIGxldCBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICBsZXQgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50ID49IHN0YXJ0ICYmIGl0ZW1zQ291bnQgPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiB3aXRoaW4gXCIgKyByYW5nZSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIHdpdGhpbiBcIiArIHJhbmdlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA+PSBzdGFydCAmJiBvYmogPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHdpdGhpbiBcIiArIHJhbmdlLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSB3aXRoaW4gXCIgKyByYW5nZVxuICAgICk7XG4gIH1cbn0pO1xuZnVuY3Rpb24gYXNzZXJ0SW5zdGFuY2VPZihjb25zdHJ1Y3RvciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgdGFyZ2V0ID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKTtcbiAgbGV0IGlzSW5zdGFuY2VPZjtcbiAgdHJ5IHtcbiAgICBpc0luc3RhbmNlT2YgPSB0YXJnZXQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiVGhlIGluc3RhbmNlb2YgYXNzZXJ0aW9uIG5lZWRzIGEgY29uc3RydWN0b3IgYnV0IFwiICsgdHlwZShjb25zdHJ1Y3RvcikgKyBcIiB3YXMgZ2l2ZW4uXCIsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGxldCBuYW1lID0gZ2V0TmFtZShjb25zdHJ1Y3Rvcik7XG4gIGlmIChuYW1lID09IG51bGwpIHtcbiAgICBuYW1lID0gXCJhbiB1bm5hbWVkIGNvbnN0cnVjdG9yXCI7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNJbnN0YW5jZU9mLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWUsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRJbnN0YW5jZU9mLCBcImFzc2VydEluc3RhbmNlT2ZcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5zdGFuY2VvZlwiLCBhc3NlcnRJbnN0YW5jZU9mKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbnN0YW5jZU9mXCIsIGFzc2VydEluc3RhbmNlT2YpO1xuZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHkobmFtZSwgdmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBpc05lc3RlZCA9IGZsYWcyKHRoaXMsIFwibmVzdGVkXCIpLCBpc093biA9IGZsYWcyKHRoaXMsIFwib3duXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgbmFtZVR5cGUgPSB0eXBlb2YgbmFtZTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgaWYgKGlzTmVzdGVkKSB7XG4gICAgaWYgKG5hbWVUeXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyBcInRoZSBhcmd1bWVudCB0byBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nIHdoZW4gdXNpbmcgbmVzdGVkIHN5bnRheFwiLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYW1lVHlwZSAhPT0gXCJzdHJpbmdcIiAmJiBuYW1lVHlwZSAhPT0gXCJudW1iZXJcIiAmJiBuYW1lVHlwZSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgXCJ0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBzeW1ib2xcIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOZXN0ZWQgJiYgaXNPd24pIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgJ1RoZSBcIm5lc3RlZFwiIGFuZCBcIm93blwiIGZsYWdzIGNhbm5vdCBiZSBjb21iaW5lZC4nLFxuICAgICAgdm9pZCAwLFxuICAgICAgc3NmaVxuICAgICk7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyBcIlRhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxuICBsZXQgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSwgcGF0aEluZm8gPSBpc05lc3RlZCA/IGdldFBhdGhJbmZvKG9iaiwgbmFtZSkgOiBudWxsLCB2YWx1ZSA9IGlzTmVzdGVkID8gcGF0aEluZm8udmFsdWUgOiBvYmpbbmFtZV0sIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgbGV0IGRlc2NyaXB0b3IgPSBcIlwiO1xuICBpZiAoaXNEZWVwKSBkZXNjcmlwdG9yICs9IFwiZGVlcCBcIjtcbiAgaWYgKGlzT3duKSBkZXNjcmlwdG9yICs9IFwib3duIFwiO1xuICBpZiAoaXNOZXN0ZWQpIGRlc2NyaXB0b3IgKz0gXCJuZXN0ZWQgXCI7XG4gIGRlc2NyaXB0b3IgKz0gXCJwcm9wZXJ0eSBcIjtcbiAgbGV0IGhhc1Byb3BlcnR5MjtcbiAgaWYgKGlzT3duKSBoYXNQcm9wZXJ0eTIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKTtcbiAgZWxzZSBpZiAoaXNOZXN0ZWQpIGhhc1Byb3BlcnR5MiA9IHBhdGhJbmZvLmV4aXN0cztcbiAgZWxzZSBoYXNQcm9wZXJ0eTIgPSBoYXNQcm9wZXJ0eShvYmosIG5hbWUpO1xuICBpZiAoIW5lZ2F0ZSB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKVxuICAgICk7XG4gIH1cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIgJiYgaXNFcWwodmFsLCB2YWx1ZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7ZXhwfSwgYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7YWN0fVwiLFxuICAgICAgdmFsLFxuICAgICAgdmFsdWVcbiAgICApO1xuICB9XG4gIGZsYWcyKHRoaXMsIFwib2JqZWN0XCIsIHZhbHVlKTtcbn1cbl9fbmFtZShhc3NlcnRQcm9wZXJ0eSwgXCJhc3NlcnRQcm9wZXJ0eVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJwcm9wZXJ0eVwiLCBhc3NlcnRQcm9wZXJ0eSk7XG5mdW5jdGlvbiBhc3NlcnRPd25Qcm9wZXJ0eShfbmFtZSwgX3ZhbHVlLCBfbXNnKSB7XG4gIGZsYWcyKHRoaXMsIFwib3duXCIsIHRydWUpO1xuICBhc3NlcnRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuX19uYW1lKGFzc2VydE93blByb3BlcnR5LCBcImFzc2VydE93blByb3BlcnR5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5XCIsIGFzc2VydE93blByb3BlcnR5KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJoYXZlT3duUHJvcGVydHlcIiwgYXNzZXJ0T3duUHJvcGVydHkpO1xuZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGRlc2NyaXB0b3IsIG1zZykge1xuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtc2cgPSBkZXNjcmlwdG9yO1xuICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICB9XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBhY3R1YWxEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qob2JqKSwgbmFtZSk7XG4gIGxldCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgaWYgKGFjdHVhbERlc2NyaXB0b3IgJiYgZGVzY3JpcHRvcikge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXFsKGRlc2NyaXB0b3IsIGFjdHVhbERlc2NyaXB0b3IpLFxuICAgICAgXCJleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIFwiICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvbiAje3RoaXN9IHRvIG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvcikgKyBcIiwgZ290IFwiICsgaW5zcGVjdDIoYWN0dWFsRGVzY3JpcHRvciksXG4gICAgICBcImV4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgXCIgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9uICN7dGhpc30gdG8gbm90IG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvciksXG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIHRydWVcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBhY3R1YWxEZXNjcmlwdG9yKTtcbn1cbl9fbmFtZShhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIFwiYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5RGVzY3JpcHRvclwiLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcbmZ1bmN0aW9uIGFzc2VydExlbmd0aENoYWluKCkge1xuICBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIsIHRydWUpO1xufVxuX19uYW1lKGFzc2VydExlbmd0aENoYWluLCBcImFzc2VydExlbmd0aENoYWluXCIpO1xuZnVuY3Rpb24gYXNzZXJ0TGVuZ3RoKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICBzd2l0Y2ggKG9ialR5cGUpIHtcbiAgICBjYXNlIFwibWFwXCI6XG4gICAgY2FzZSBcInNldFwiOlxuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXRlbXNDb3VudCA9PSBuLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3tleHB9IGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3thY3R9XCIsXG4gICAgbixcbiAgICBpdGVtc0NvdW50XG4gICk7XG59XG5fX25hbWUoYXNzZXJ0TGVuZ3RoLCBcImFzc2VydExlbmd0aFwiKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJsZW5ndGhcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwibGVuZ3RoT2ZcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5mdW5jdGlvbiBhc3NlcnRNYXRjaChyZSwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHJlLmV4ZWMob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbWF0Y2ggXCIgKyByZSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIG1hdGNoIFwiICsgcmVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRNYXRjaCwgXCJhc3NlcnRNYXRjaFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtYXRjaFwiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibWF0Y2hlc1wiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic3RyaW5nXCIsIGZ1bmN0aW9uKHN0ciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwic3RyaW5nXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB+b2JqLmluZGV4T2Yoc3RyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBcIiArIGluc3BlY3QyKHN0ciksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIFwiICsgaW5zcGVjdDIoc3RyKVxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRLZXlzKGtleXMpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLCBrZXlzVHlwZSA9IHR5cGUoa2V5cyksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgc3RyLCBkZWVwU3RyID0gXCJcIiwgYWN0dWFsLCBvayA9IHRydWUsIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCI7XG4gIGxldCBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgXCJ3aGVuIHRlc3Rpbmcga2V5cyBhZ2FpbnN0IGFuIG9iamVjdCBvciBhbiBhcnJheSB5b3UgbXVzdCBnaXZlIGEgc2luZ2xlIEFycmF5fE9iamVjdHxTdHJpbmcgYXJndW1lbnQgb3IgbXVsdGlwbGUgU3RyaW5nIGFyZ3VtZW50c1wiO1xuICBpZiAob2JqVHlwZSA9PT0gXCJNYXBcIiB8fCBvYmpUeXBlID09PSBcIlNldFwiKSB7XG4gICAgZGVlcFN0ciA9IGlzRGVlcCA/IFwiZGVlcGx5IFwiIDogXCJcIjtcbiAgICBhY3R1YWwgPSBbXTtcbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgYWN0dWFsLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBpZiAoa2V5c1R5cGUgIT09IFwiQXJyYXlcIikge1xuICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFjdHVhbCA9IGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG4gICAgc3dpdGNoIChrZXlzVHlwZSkge1xuICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIH1cbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzeW1ib2xcIiA/IHZhbCA6IFN0cmluZyh2YWwpO1xuICAgIH0pO1xuICB9XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArIFwia2V5cyByZXF1aXJlZFwiLCB2b2lkIDAsIHNzZmkpO1xuICB9XG4gIGxldCBsZW4gPSBrZXlzLmxlbmd0aCwgYW55ID0gZmxhZzIodGhpcywgXCJhbnlcIiksIGFsbCA9IGZsYWcyKHRoaXMsIFwiYWxsXCIpLCBleHBlY3RlZCA9IGtleXMsIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgaWYgKCFhbnkgJiYgIWFsbCkge1xuICAgIGFsbCA9IHRydWU7XG4gIH1cbiAgaWYgKGFueSkge1xuICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBpZiAoYWxsKSB7XG4gICAgb2sgPSBleHBlY3RlZC5ldmVyeShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIWZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikpIHtcbiAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGxlbiA+IDEpIHtcbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gaW5zcGVjdDIoa2V5KTtcbiAgICB9KTtcbiAgICBsZXQgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgYW5kIFwiICsgbGFzdDtcbiAgICB9XG4gICAgaWYgKGFueSkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgb3IgXCIgKyBsYXN0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHIgPSBpbnNwZWN0MihrZXlzWzBdKTtcbiAgfVxuICBzdHIgPSAobGVuID4gMSA/IFwia2V5cyBcIiA6IFwia2V5IFwiKSArIHN0cjtcbiAgc3RyID0gKGZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikgPyBcImNvbnRhaW4gXCIgOiBcImhhdmUgXCIpICsgc3RyO1xuICB0aGlzLmFzc2VydChcbiAgICBvayxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgYWN0dWFsLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgdHJ1ZVxuICApO1xufVxuX19uYW1lKGFzc2VydEtleXMsIFwiYXNzZXJ0S2V5c1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJrZXlzXCIsIGFzc2VydEtleXMpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImtleVwiLCBhc3NlcnRLZXlzKTtcbmZ1bmN0aW9uIGFzc2VydFRocm93cyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSB8fCBmYWxzZTtcbiAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgaWYgKGlzUmVnRXhwMihlcnJvckxpa2UpIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgIGVycm9yTGlrZSA9IG51bGw7XG4gIH1cbiAgbGV0IGNhdWdodEVycjtcbiAgbGV0IGVycm9yV2FzVGhyb3duID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgb2JqKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yV2FzVGhyb3duID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnIgPSBlcnI7XG4gIH1cbiAgbGV0IGV2ZXJ5QXJnSXNVbmRlZmluZWQgPSBlcnJvckxpa2UgPT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyID09PSB2b2lkIDA7XG4gIGxldCBldmVyeUFyZ0lzRGVmaW5lZCA9IEJvb2xlYW4oZXJyb3JMaWtlICYmIGVyck1zZ01hdGNoZXIpO1xuICBsZXQgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICBsZXQgZXJyTXNnTWF0Y2hlckZhaWwgPSBmYWxzZTtcbiAgaWYgKGV2ZXJ5QXJnSXNVbmRlZmluZWQgfHwgIWV2ZXJ5QXJnSXNVbmRlZmluZWQgJiYgIW5lZ2F0ZSkge1xuICAgIGxldCBlcnJvckxpa2VTdHJpbmcgPSBcImFuIGVycm9yXCI7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBcIiN7ZXhwfVwiO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JMaWtlKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpO1xuICAgIH1cbiAgICBsZXQgYWN0dWFsID0gY2F1Z2h0RXJyO1xuICAgIGlmIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgYWN0dWFsID0gY2F1Z2h0RXJyLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2F1Z2h0RXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBhY3R1YWwgPSBjYXVnaHRFcnI7XG4gICAgfSBlbHNlIGlmIChjYXVnaHRFcnIgJiYgKHR5cGVvZiBjYXVnaHRFcnIgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhdWdodEVyciA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsID0gY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBlcnJvcldhc1Rocm93bixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyBcIiArIGVycm9yTGlrZVN0cmluZyxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIsXG4gICAgICBlcnJvckxpa2UgJiYgZXJyb3JMaWtlLnRvU3RyaW5nKCksXG4gICAgICBhY3R1YWxcbiAgICApO1xuICB9XG4gIGlmIChlcnJvckxpa2UgJiYgY2F1Z2h0RXJyKSB7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBsZXQgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVJbnN0YW5jZShcbiAgICAgICAgY2F1Z2h0RXJyLFxuICAgICAgICBlcnJvckxpa2VcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgJiYgIW5lZ2F0ZSA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgICBlcnJvckxpa2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNhdWdodEVyci50b1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihcbiAgICAgIGNhdWdodEVycixcbiAgICAgIGVycm9yTGlrZVxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID09PSBuZWdhdGUpIHtcbiAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd25cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHRocm93ICN7ZXhwfVwiICsgKGNhdWdodEVyciA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgICAgIGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2F1Z2h0RXJyICYmIGVyck1zZ01hdGNoZXIgIT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyICE9PSBudWxsKSB7XG4gICAgbGV0IHBsYWNlaG9sZGVyID0gXCJpbmNsdWRpbmdcIjtcbiAgICBpZiAoaXNSZWdFeHAyKGVyck1zZ01hdGNoZXIpKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IFwibWF0Y2hpbmdcIjtcbiAgICB9XG4gICAgbGV0IGlzQ29tcGF0aWJsZU1lc3NhZ2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVNZXNzYWdlKFxuICAgICAgY2F1Z2h0RXJyLFxuICAgICAgZXJyTXNnTWF0Y2hlclxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgaWYgKGV2ZXJ5QXJnSXNEZWZpbmVkICYmIG5lZ2F0ZSkge1xuICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3Igbm90IFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH1cIixcbiAgICAgICAgICBlcnJNc2dNYXRjaGVyLFxuICAgICAgICAgIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0TWVzc2FnZShjYXVnaHRFcnIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBuZWdhdGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgPyBcIiBidXQgI3thY3R9IHdhcyB0aHJvd25cIiA6IFwiXCIpLFxuICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgY2F1Z2h0RXJyIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnIudG9TdHJpbmcoKSA6IGNhdWdodEVyciAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBjYXVnaHRFcnIpO1xufVxuX19uYW1lKGFzc2VydFRocm93cywgXCJhc3NlcnRUaHJvd3NcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwidGhyb3dcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJ0aHJvd3NcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJUaHJvd1wiLCBhc3NlcnRUaHJvd3MpO1xuZnVuY3Rpb24gcmVzcG9uZFRvKG1ldGhvZCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGl0c2VsZiA9IGZsYWcyKHRoaXMsIFwiaXRzZWxmXCIpLCBjb250ZXh0ID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb2JqICYmICFpdHNlbGYgPyBvYmoucHJvdG90eXBlW21ldGhvZF0gOiBvYmpbbWV0aG9kXTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gcmVzcG9uZCB0byBcIiArIGluc3BlY3QyKG1ldGhvZCksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvIFwiICsgaW5zcGVjdDIobWV0aG9kKVxuICApO1xufVxuX19uYW1lKHJlc3BvbmRUbywgXCJyZXNwb25kVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZFRvXCIsIHJlc3BvbmRUbyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZHNUb1wiLCByZXNwb25kVG8pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiaXRzZWxmXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcIml0c2VsZlwiLCB0cnVlKTtcbn0pO1xuZnVuY3Rpb24gc2F0aXNmeShtYXRjaGVyLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgbGV0IHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgcmVzdWx0LFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5IFwiICsgb2JqRGlzcGxheShtYXRjaGVyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnlcIiArIG9iakRpc3BsYXkobWF0Y2hlciksXG4gICAgZmxhZzIodGhpcywgXCJuZWdhdGVcIikgPyBmYWxzZSA6IHRydWUsXG4gICAgcmVzdWx0XG4gICk7XG59XG5fX25hbWUoc2F0aXNmeSwgXCJzYXRpc2Z5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInNhdGlzZnlcIiwgc2F0aXNmeSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic2F0aXNmaWVzXCIsIHNhdGlzZnkpO1xuZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMubnVtZXJpYztcbiAgbGV0IG1lc3NhZ2UgPSBcIkEgYGRlbHRhYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChkZWx0YSA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZGVsdGEsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIG1lc3NhZ2UgPSBcIkEgYGV4cGVjdGVkYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChleHBlY3RlZCA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZXhwZWN0ZWQsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIGNvbnN0IGFicyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHgpID0+IHggPCAwID8gLXggOiB4LCBcImFic1wiKTtcbiAgY29uc3Qgc3RyaXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChudW1iZXIpID0+IHBhcnNlRmxvYXQocGFyc2VGbG9hdChudW1iZXIpLnRvUHJlY2lzaW9uKDEyKSksIFwic3RyaXBcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHN0cmlwKGFicyhvYmogLSBleHBlY3RlZCkpIDw9IGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGEsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShjbG9zZVRvLCBcImNsb3NlVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2xvc2VUb1wiLCBjbG9zZVRvKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhcHByb3hpbWF0ZWx5XCIsIGNsb3NlVG8pO1xuZnVuY3Rpb24gaXNTdWJzZXRPZihfc3Vic2V0LCBfc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgbGV0IHN1cGVyc2V0ID0gQXJyYXkuZnJvbShfc3VwZXJzZXQpO1xuICBsZXQgc3Vic2V0ID0gQXJyYXkuZnJvbShfc3Vic2V0KTtcbiAgaWYgKCFjb250YWlucykge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBzdXBlcnNldCA9IHN1cGVyc2V0LnNsaWNlKCk7XG4gIH1cbiAgcmV0dXJuIHN1YnNldC5ldmVyeShmdW5jdGlvbihlbGVtLCBpZHgpIHtcbiAgICBpZiAob3JkZXJlZCkgcmV0dXJuIGNtcCA/IGNtcChlbGVtLCBzdXBlcnNldFtpZHhdKSA6IGVsZW0gPT09IHN1cGVyc2V0W2lkeF07XG4gICAgaWYgKCFjbXApIHtcbiAgICAgIGxldCBtYXRjaElkeCA9IHN1cGVyc2V0LmluZGV4T2YoZWxlbSk7XG4gICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlcnNldC5zb21lKGZ1bmN0aW9uKGVsZW0yLCBtYXRjaElkeCkge1xuICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pO1xufVxuX19uYW1lKGlzU3Vic2V0T2YsIFwiaXNTdWJzZXRPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtZW1iZXJzXCIsIGZ1bmN0aW9uKHN1YnNldCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5pdGVyYWJsZTtcbiAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLml0ZXJhYmxlO1xuICBsZXQgY29udGFpbnMgPSBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIpO1xuICBsZXQgb3JkZXJlZCA9IGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiKTtcbiAgbGV0IHN1YmplY3QsIGZhaWxNc2csIGZhaWxOZWdhdGVNc2c7XG4gIGlmIChjb250YWlucykge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJhbiBvcmRlcmVkIHN1cGVyc2V0XCIgOiBcImEgc3VwZXJzZXRcIjtcbiAgICBmYWlsTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICAgIGZhaWxOZWdhdGVNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICB9IGVsc2Uge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJvcmRlcmVkIG1lbWJlcnNcIiA6IFwibWVtYmVyc1wiO1xuICAgIGZhaWxNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSB0aGUgc2FtZSBcIiArIHN1YmplY3QgKyBcIiBhcyAje2V4cH1cIjtcbiAgICBmYWlsTmVnYXRlTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIHRoZSBzYW1lIFwiICsgc3ViamVjdCArIFwiIGFzICN7ZXhwfVwiO1xuICB9XG4gIGxldCBjbXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIikgPyBmbGFnMih0aGlzLCBcImVxbFwiKSA6IHZvaWQgMDtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNTdWJzZXRPZihzdWJzZXQsIG9iaiwgY21wLCBjb250YWlucywgb3JkZXJlZCksXG4gICAgZmFpbE1zZyxcbiAgICBmYWlsTmVnYXRlTXNnLFxuICAgIHN1YnNldCxcbiAgICBvYmosXG4gICAgdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJpdGVyYWJsZVwiLCBmdW5jdGlvbihtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgb2JqICE9IHZvaWQgMCAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYW4gaXRlcmFibGVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGFuIGl0ZXJhYmxlXCIsXG4gICAgb2JqXG4gICk7XG59KTtcbmZ1bmN0aW9uIG9uZU9mKGxpc3QsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGV4cGVjdGVkID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGNvbnRhaW5zID0gZmxhZzIodGhpcywgXCJjb250YWluc1wiKSwgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgbmV3IEFzc2VydGlvbihsaXN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5hbihcImFycmF5XCIpO1xuICBpZiAoY29udGFpbnMpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQuaW5kZXhPZihwb3NzaWJpbGl0eSkgPiAtMTtcbiAgICAgIH0pLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGNvbnRhaW4gb25lIG9mICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIG9uZSBvZiAje2V4cH1cIixcbiAgICAgIGxpc3QsXG4gICAgICBleHBlY3RlZFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVlcCkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICAgIHJldHVybiBlcWwoZXhwZWN0ZWQsIHBvc3NpYmlsaXR5KTtcbiAgICAgICAgfSksXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH1cIixcbiAgICAgICAgbGlzdCxcbiAgICAgICAgZXhwZWN0ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBsaXN0LmluZGV4T2YoZXhwZWN0ZWQpID4gLTEsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBvbmUgb2YgI3tleHB9XCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBsaXN0LFxuICAgICAgICBleHBlY3RlZFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZShvbmVPZiwgXCJvbmVPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJvbmVPZlwiLCBvbmVPZik7XG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2VzKHN1YmplY3QsIHByb3AsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGZuID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgbGV0IGluaXRpYWw7XG4gIGlmICghcHJvcCkge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICB9XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImNoYW5nZVwiKTtcbiAgZmxhZzIodGhpcywgXCJyZWFsRGVsdGFcIiwgZmluYWwgIT09IGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBpbml0aWFsICE9PSBmaW5hbCxcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gY2hhbmdlXCIsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIG5vdCBjaGFuZ2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydENoYW5nZXMsIFwiYXNzZXJ0Q2hhbmdlc1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjaGFuZ2VcIiwgYXNzZXJ0Q2hhbmdlcyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2hhbmdlc1wiLCBhc3NlcnRDaGFuZ2VzKTtcbmZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImluY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBmaW5hbCAtIGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPiAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBpbmNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgaW5jcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydEluY3JlYXNlcywgXCJhc3NlcnRJbmNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5jcmVhc2VcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbmNyZWFzZXNcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImRlY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBpbml0aWFsIC0gZmluYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPCAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBkZWNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgZGVjcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydERlY3JlYXNlcywgXCJhc3NlcnREZWNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZGVjcmVhc2VcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJkZWNyZWFzZXNcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlbHRhKGRlbHRhLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBtc2dPYmogPSBmbGFnMih0aGlzLCBcImRlbHRhTXNnT2JqXCIpO1xuICBsZXQgaW5pdGlhbCA9IGZsYWcyKHRoaXMsIFwiaW5pdGlhbERlbHRhVmFsdWVcIik7XG4gIGxldCBmaW5hbCA9IGZsYWcyKHRoaXMsIFwiZmluYWxEZWx0YVZhbHVlXCIpO1xuICBsZXQgYmVoYXZpb3IgPSBmbGFnMih0aGlzLCBcImRlbHRhQmVoYXZpb3JcIik7XG4gIGxldCByZWFsRGVsdGEgPSBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiKTtcbiAgbGV0IGV4cHJlc3Npb247XG4gIGlmIChiZWhhdmlvciA9PT0gXCJjaGFuZ2VcIikge1xuICAgIGV4cHJlc3Npb24gPSBNYXRoLmFicyhmaW5hbCAtIGluaXRpYWwpID09PSBNYXRoLmFicyhkZWx0YSk7XG4gIH0gZWxzZSB7XG4gICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICB9XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGV4cHJlc3Npb24sXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIFwiICsgYmVoYXZpb3IgKyBcIiBieSBcIiArIGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgXCIgKyBiZWhhdmlvciArIFwiIGJ5IFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnREZWx0YSwgXCJhc3NlcnREZWx0YVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJieVwiLCBhc3NlcnREZWx0YSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleHRlbnNpYmxlXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc0V4dGVuc2libGUgPSBvYmogPT09IE9iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNFeHRlbnNpYmxlLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBleHRlbnNpYmxlXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwic2VhbGVkXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGlzU2VhbGVkLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBzZWFsZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImZyb3plblwiLCBmdW5jdGlvbigpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICBsZXQgaXNGcm96ZW4gPSBvYmogPT09IE9iamVjdChvYmopID8gT2JqZWN0LmlzRnJvemVuKG9iaikgOiB0cnVlO1xuICB0aGlzLmFzc2VydChcbiAgICBpc0Zyb3plbixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBmcm96ZW5cIlxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJmaW5pdGVcIiwgZnVuY3Rpb24oX21zZykge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHR5cGVvZiBvYmogPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYSBmaW5pdGUgbnVtYmVyXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhIGZpbml0ZSBudW1iZXJcIlxuICApO1xufSk7XG5mdW5jdGlvbiBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgaWYgKGV4cGVjdGVkID09PSBhY3R1YWwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdHVhbCAhPT0gdHlwZW9mIGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgIT09IFwib2JqZWN0XCIgfHwgZXhwZWN0ZWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQgPT09IGFjdHVhbDtcbiAgfVxuICBpZiAoIWFjdHVhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0dWFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoZnVuY3Rpb24oZXhwKSB7XG4gICAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oYWN0KSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlU3Vic2V0KGV4cCwgYWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkLmdldFRpbWUoKSA9PT0gYWN0dWFsLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoZXhwZWN0ZWQpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkge1xuICAgIGxldCBleHBlY3RlZFZhbHVlID0gZXhwZWN0ZWRba2V5XTtcbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBhY3R1YWxba2V5XTtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgZXhwZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBhY3R1YWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdWJzZXQoZXhwZWN0ZWRWYWx1ZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkVmFsdWUoYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWU7XG4gIH0pO1xufVxuX19uYW1lKGNvbXBhcmVTdWJzZXQsIFwiY29tcGFyZVN1YnNldFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjb250YWluU3Vic2V0XCIsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gIGNvbnN0IGFjdHVhbCA9IGZsYWcodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNob3dEaWZmID0gY29uZmlnLnNob3dEaWZmO1xuICB0aGlzLmFzc2VydChcbiAgICBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIGNvbnRhaW4gc3Vic2V0ICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIG5vdCBjb250YWluIHN1YnNldCAje2V4cH1cIixcbiAgICBleHBlY3RlZCxcbiAgICBhY3R1YWwsXG4gICAgc2hvd0RpZmZcbiAgKTtcbn0pO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvZXhwZWN0LmpzXG5mdW5jdGlvbiBleHBlY3QodmFsLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKHZhbCwgbWVzc2FnZSk7XG59XG5fX25hbWUoZXhwZWN0LCBcImV4cGVjdFwiKTtcbmV4cGVjdC5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICBhY3R1YWwgPSB2b2lkIDA7XG4gIH1cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJleHBlY3QuZmFpbCgpXCI7XG4gIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICBtZXNzYWdlLFxuICAgIHtcbiAgICAgIGFjdHVhbCxcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgb3BlcmF0b3JcbiAgICB9LFxuICAgIGV4cGVjdC5mYWlsXG4gICk7XG59O1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2Uvc2hvdWxkLmpzXG52YXIgc2hvdWxkX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNob3VsZF9leHBvcnRzLCB7XG4gIFNob3VsZDogKCkgPT4gU2hvdWxkLFxuICBzaG91bGQ6ICgpID0+IHNob3VsZFxufSk7XG5mdW5jdGlvbiBsb2FkU2hvdWxkKCkge1xuICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlciB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbCB8fCB0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcy52YWx1ZU9mKCksIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gIH1cbiAgX19uYW1lKHNob3VsZEdldHRlciwgXCJzaG91bGRHZXR0ZXJcIik7XG4gIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3VsZFwiLCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIF9fbmFtZShzaG91bGRTZXR0ZXIsIFwic2hvdWxkU2V0dGVyXCIpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgXCJzaG91bGRcIiwge1xuICAgIHNldDogc2hvdWxkU2V0dGVyLFxuICAgIGdldDogc2hvdWxkR2V0dGVyLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgbGV0IHNob3VsZDIgPSB7fTtcbiAgc2hvdWxkMi5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICBhY3R1YWwgPSB2b2lkIDA7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwic2hvdWxkLmZhaWwoKVwiO1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICB9LFxuICAgICAgc2hvdWxkMi5mYWlsXG4gICAgKTtcbiAgfTtcbiAgc2hvdWxkMi5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdHVhbCwgbWVzc2FnZSkudG8uZXF1YWwoZXhwZWN0ZWQpO1xuICB9O1xuICBzaG91bGQyLlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8uVGhyb3coZXJydCwgZXJycyk7XG4gIH07XG4gIHNob3VsZDIuZXhpc3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLmV4aXN0O1xuICB9O1xuICBzaG91bGQyLm5vdCA9IHt9O1xuICBzaG91bGQyLm5vdC5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0dWFsLCBtc2cpLnRvLm5vdC5lcXVhbChleHBlY3RlZCk7XG4gIH07XG4gIHNob3VsZDIubm90LlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICB9O1xuICBzaG91bGQyLm5vdC5leGlzdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmV4aXN0O1xuICB9O1xuICBzaG91bGQyW1widGhyb3dcIl0gPSBzaG91bGQyW1wiVGhyb3dcIl07XG4gIHNob3VsZDIubm90W1widGhyb3dcIl0gPSBzaG91bGQyLm5vdFtcIlRocm93XCJdO1xuICByZXR1cm4gc2hvdWxkMjtcbn1cbl9fbmFtZShsb2FkU2hvdWxkLCBcImxvYWRTaG91bGRcIik7XG52YXIgc2hvdWxkID0gbG9hZFNob3VsZDtcbnZhciBTaG91bGQgPSBsb2FkU2hvdWxkO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzXG5mdW5jdGlvbiBhc3NlcnQoZXhwcmVzcywgZXJybXNnKSB7XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgYXNzZXJ0LCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KGV4cHJlc3MsIGVycm1zZywgXCJbIG5lZ2F0aW9uIG1lc3NhZ2UgdW5hdmFpbGFibGUgXVwiKTtcbn1cbl9fbmFtZShhc3NlcnQsIFwiYXNzZXJ0XCIpO1xuYXNzZXJ0LmZhaWwgPSBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICBtZXNzYWdlID0gYWN0dWFsO1xuICAgIGFjdHVhbCA9IHZvaWQgMDtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSB8fCBcImFzc2VydC5mYWlsKClcIjtcbiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgIG1lc3NhZ2UsXG4gICAge1xuICAgICAgYWN0dWFsLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvcGVyYXRvclxuICAgIH0sXG4gICAgYXNzZXJ0LmZhaWxcbiAgKTtcbn07XG5hc3NlcnQuaXNPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09rLCB0cnVlKS5pcy5vaztcbn07XG5hc3NlcnQuaXNOb3RPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9rLCB0cnVlKS5pcy5ub3Qub2s7XG59O1xuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBsZXQgdGVzdDIgPSBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZXF1YWwsIHRydWUpO1xuICB0ZXN0Mi5hc3NlcnQoXG4gICAgZXhwID09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fVwiLFxuICAgIGV4cCxcbiAgICBhY3QsXG4gICAgdHJ1ZVxuICApO1xufTtcbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBtc2cpIHtcbiAgbGV0IHRlc3QyID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIGV4cCAhPSBmbGFnKHRlc3QyLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2FjdH1cIixcbiAgICBleHAsXG4gICAgYWN0LFxuICAgIHRydWVcbiAgKTtcbn07XG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbn07XG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG59O1xuYXNzZXJ0LmRlZXBFcXVhbCA9IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5kZWVwRXF1YWwsIHRydWUpLnRvLmVxbChleHApO1xufTtcbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3REZWVwRXF1YWwsIHRydWUpLnRvLm5vdC5lcWwoZXhwKTtcbn07XG5hc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uKHZhbCwgYWJ2LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG59O1xuYXNzZXJ0LmlzQXRMZWFzdCA9IGZ1bmN0aW9uKHZhbCwgYXRsc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdExlYXN0LCB0cnVlKS50by5iZS5sZWFzdChhdGxzdCk7XG59O1xuYXNzZXJ0LmlzQmVsb3cgPSBmdW5jdGlvbih2YWwsIGJsdywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0JlbG93LCB0cnVlKS50by5iZS5iZWxvdyhibHcpO1xufTtcbmFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uKHZhbCwgYXRtc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xufTtcbmFzc2VydC5pc1RydWUgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNUcnVlLCB0cnVlKS5pc1tcInRydWVcIl07XG59O1xuYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbn07XG5hc3NlcnQuaXNGYWxzZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0ZhbHNlLCB0cnVlKS5pc1tcImZhbHNlXCJdO1xufTtcbmFzc2VydC5pc05vdEZhbHNlID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90RmFsc2UsIHRydWUpLnRvLm5vdC5lcXVhbChmYWxzZSk7XG59O1xuYXNzZXJ0LmlzTnVsbCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bGwsIHRydWUpLnRvLmVxdWFsKG51bGwpO1xufTtcbmFzc2VydC5pc05vdE51bGwgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdWxsLCB0cnVlKS50by5ub3QuZXF1YWwobnVsbCk7XG59O1xuYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG59O1xuYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xufTtcbmFzc2VydC5leGlzdHMgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuZXhpc3RzLCB0cnVlKS50by5leGlzdDtcbn07XG5hc3NlcnQubm90RXhpc3RzID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEV4aXN0cywgdHJ1ZSkudG8ubm90LmV4aXN0O1xufTtcbmFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodm9pZCAwKTtcbn07XG5hc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHZvaWQgMCk7XG59O1xuYXNzZXJ0LmlzQ2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNDYWxsYWJsZSwgdHJ1ZSkuaXMuY2FsbGFibGU7XG59O1xuYXNzZXJ0LmlzTm90Q2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNOb3RDYWxsYWJsZSwgdHJ1ZSkuaXMubm90LmNhbGxhYmxlO1xufTtcbmFzc2VydC5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09iamVjdCwgdHJ1ZSkudG8uYmUuYShcIm9iamVjdFwiKTtcbn07XG5hc3NlcnQuaXNOb3RPYmplY3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RPYmplY3QsIHRydWUpLnRvLm5vdC5iZS5hKFwib2JqZWN0XCIpO1xufTtcbmFzc2VydC5pc0FycmF5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXJyYXksIHRydWUpLnRvLmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzTm90QXJyYXkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RBcnJheSwgdHJ1ZSkudG8ubm90LmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKFwic3RyaW5nXCIpO1xufTtcbmFzc2VydC5pc05vdFN0cmluZyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFN0cmluZywgdHJ1ZSkudG8ubm90LmJlLmEoXCJzdHJpbmdcIik7XG59O1xuYXNzZXJ0LmlzTnVtYmVyID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTnVtYmVyLCB0cnVlKS50by5iZS5hKFwibnVtYmVyXCIpO1xufTtcbmFzc2VydC5pc05vdE51bWJlciA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWJlciwgdHJ1ZSkudG8ubm90LmJlLmEoXCJudW1iZXJcIik7XG59O1xuYXNzZXJ0LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWVyaWMsIHRydWUpLmlzLm51bWVyaWM7XG59O1xuYXNzZXJ0LmlzTm90TnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWVyaWMsIHRydWUpLmlzLm5vdC5udW1lcmljO1xufTtcbmFzc2VydC5pc0Zpbml0ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0Zpbml0ZSwgdHJ1ZSkudG8uYmUuZmluaXRlO1xufTtcbmFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKFwiYm9vbGVhblwiKTtcbn07XG5hc3NlcnQuaXNOb3RCb29sZWFuID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90Qm9vbGVhbiwgdHJ1ZSkudG8ubm90LmJlLmEoXCJib29sZWFuXCIpO1xufTtcbmFzc2VydC50eXBlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LnR5cGVPZiwgdHJ1ZSkudG8uYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lm5vdFR5cGVPZiA9IGZ1bmN0aW9uKHZhbHVlLCB0eXBlMywgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lmluc3RhbmNlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lmluc3RhbmNlT2YsIHRydWUpLnRvLmJlLmluc3RhbmNlT2YodHlwZTMpO1xufTtcbmFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24odmFsLCB0eXBlMywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5ub3RJbnN0YW5jZU9mLCB0cnVlKS50by5ub3QuYmUuaW5zdGFuY2VPZihcbiAgICB0eXBlM1xuICApO1xufTtcbmFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5ub3RJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZSwgdHJ1ZSkubm90LmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQuZGVlcEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwSW5jbHVkZSwgdHJ1ZSkuZGVlcC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcEluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubmVzdGVkSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUsIHRydWUpLm5lc3RlZC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlLCB0cnVlKS5ub3QubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUsIHRydWUpLmRlZXAubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIGV4cCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlLFxuICAgIHRydWVcbiAgKS5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubm90T3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5kZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBPd25JbmNsdWRlLCB0cnVlKS5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLm93bi5pbmNsdWRlKFxuICAgIGluY1xuICApO1xufTtcbmFzc2VydC5tYXRjaCA9IGZ1bmN0aW9uKGV4cCwgcmUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubWF0Y2gsIHRydWUpLnRvLm1hdGNoKHJlKTtcbn07XG5hc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbihleHAsIHJlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xufTtcbmFzc2VydC5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5wcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LnByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHlWYWwsIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCwgdHJ1ZSkudG8uaGF2ZS5kZWVwLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQub3duUHJvcGVydHksIHRydWUpLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5ub3RPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RPd25Qcm9wZXJ0eSwgdHJ1ZSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLm93bi5wcm9wZXJ0eShcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gICk7XG59O1xuYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuZGVlcC5vd24ucHJvcGVydHkocHJvcCwgdmFsdWUpO1xufTtcbmFzc2VydC5uZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90TmVzdGVkUHJvcGVydHksXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubmVzdGVkUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBOZXN0ZWRQcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uKGV4cCwgbGVuLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG59O1xuYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQuaGFzQWxsS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxLZXlzLCB0cnVlKS50by5oYXZlLmFsbC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5jb250YWluc0FsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuY29udGFpbnNBbGxLZXlzLCB0cnVlKS50by5jb250YWluLmFsbC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cywgdHJ1ZSkudG8ubm90LmhhdmUuYW55LmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzLCB0cnVlKS50by5ub3QuaGF2ZS5hbGwua2V5cyhcbiAgICBrZXlzXG4gICk7XG59O1xuYXNzZXJ0Lmhhc0FueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FueURlZXBLZXlzLCB0cnVlKS50by5oYXZlLmFueS5kZWVwLmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5oYXNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxEZWVwS2V5cywgdHJ1ZSkudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyxcbiAgICB0cnVlXG4gICkudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtc2cpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIGxldCBhc3NlcnRFcnIgPSBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC50aHJvd3MsIHRydWUpLnRvLnRocm93KFxuICAgIGVycm9yTGlrZSxcbiAgICBlcnJNc2dNYXRjaGVyXG4gICk7XG4gIHJldHVybiBmbGFnKGFzc2VydEVyciwgXCJvYmplY3RcIik7XG59O1xuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGZuLCBlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1lc3NhZ2UpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1lc3NhZ2UsIGFzc2VydC5kb2VzTm90VGhyb3csIHRydWUpLnRvLm5vdC50aHJvdyhcbiAgICBlcnJvckxpa2UsXG4gICAgZXJyTXNnTWF0Y2hlclxuICApO1xufTtcbmFzc2VydC5vcGVyYXRvciA9IGZ1bmN0aW9uKHZhbCwgb3BlcmF0b3IsIHZhbDIsIG1zZykge1xuICBsZXQgb2s7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlIFwiPT1cIjpcbiAgICAgIG9rID0gdmFsID09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPT09XCI6XG4gICAgICBvayA9IHZhbCA9PT0gdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCI+XCI6XG4gICAgICBvayA9IHZhbCA+IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPj1cIjpcbiAgICAgIG9rID0gdmFsID49IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPFwiOlxuICAgICAgb2sgPSB2YWwgPCB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIjw9XCI6XG4gICAgICBvayA9IHZhbCA8PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9XCI6XG4gICAgICBvayA9IHZhbCAhPSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9PVwiOlxuICAgICAgb2sgPSB2YWwgIT09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbXNnID0gbXNnID8gbXNnICsgXCI6IFwiIDogbXNnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2cgKyAnSW52YWxpZCBvcGVyYXRvciBcIicgKyBvcGVyYXRvciArICdcIicsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgYXNzZXJ0Lm9wZXJhdG9yXG4gICAgICApO1xuICB9XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24ob2ssIG1zZywgYXNzZXJ0Lm9wZXJhdG9yLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIHRydWUgPT09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBpbnNwZWN0Mih2YWwpICsgXCIgdG8gYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMiksXG4gICAgXCJleHBlY3RlZCBcIiArIGluc3BlY3QyKHZhbCkgKyBcIiB0byBub3QgYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMilcbiAgKTtcbn07XG5hc3NlcnQuY2xvc2VUbyA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5jbG9zZVRvLCB0cnVlKS50by5iZS5jbG9zZVRvKGV4cCwgZGVsdGEpO1xufTtcbmFzc2VydC5hcHByb3hpbWF0ZWx5ID0gZnVuY3Rpb24oYWN0LCBleHAsIGRlbHRhLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmFwcHJveGltYXRlbHksIHRydWUpLnRvLmJlLmFwcHJveGltYXRlbHkoXG4gICAgZXhwLFxuICAgIGRlbHRhXG4gICk7XG59O1xuYXNzZXJ0LnNhbWVNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU1lbWJlcnMsIHRydWUpLnRvLmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIHNldDEsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RTYW1lTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5zYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5zYW1lLmRlZXAubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKS50by5pbmNsdWRlLm1lbWJlcnMoXG4gICAgc3Vic2V0XG4gICk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm9uZU9mID0gZnVuY3Rpb24oaW5MaXN0LCBsaXN0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihpbkxpc3QsIG1zZywgYXNzZXJ0Lm9uZU9mLCB0cnVlKS50by5iZS5vbmVPZihsaXN0KTtcbn07XG5hc3NlcnQuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIGlmIChvYmogPT0gdm9pZCAwIHx8ICFvYmpbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgIG1zZyA9IG1zZyA/IGAke21zZ30gZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWAgOiBgZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWA7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZywgdm9pZCAwLCBhc3NlcnQuaXNJdGVyYWJsZSk7XG4gIH1cbn07XG5hc3NlcnQuY2hhbmdlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXMsIHRydWUpLnRvLmNoYW5nZShvYmosIHByb3ApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRvZXNOb3RDaGFuZ2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdENoYW5nZSwgdHJ1ZSkudG8ubm90LmNoYW5nZShcbiAgICBvYmosXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlcywgdHJ1ZSkudG8uaW5jcmVhc2Uob2JqLCBwcm9wKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kb2VzTm90SW5jcmVhc2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdEluY3JlYXNlLCB0cnVlKS50by5ub3QuaW5jcmVhc2UoXG4gICAgb2JqLFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnV0Lm5vdC5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXMsIHRydWUpLnRvLmRlY3JlYXNlKG9iaiwgcHJvcCk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlc0J5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlc0J5LCB0cnVlKS50by5kZWNyZWFzZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKFxuICAgIG9iaixcbiAgICBwcm9wXG4gICk7XG59O1xuYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90RGVjcmVhc2VCeSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbGV0IHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSwgdHJ1ZSkudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodmFsKSB7XG4gICAgdGhyb3cgdmFsO1xuICB9XG59O1xuYXNzZXJ0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0V4dGVuc2libGUsIHRydWUpLnRvLmJlLmV4dGVuc2libGU7XG59O1xuYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdEV4dGVuc2libGUsIHRydWUpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xufTtcbmFzc2VydC5pc1NlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc1NlYWxlZCwgdHJ1ZSkudG8uYmUuc2VhbGVkO1xufTtcbmFzc2VydC5pc05vdFNlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdFNlYWxlZCwgdHJ1ZSkudG8ubm90LmJlLnNlYWxlZDtcbn07XG5hc3NlcnQuaXNGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNGcm96ZW4sIHRydWUpLnRvLmJlLmZyb3plbjtcbn07XG5hc3NlcnQuaXNOb3RGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RGcm96ZW4sIHRydWUpLnRvLm5vdC5iZS5mcm96ZW47XG59O1xuYXNzZXJ0LmlzRW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNFbXB0eSwgdHJ1ZSkudG8uYmUuZW1wdHk7XG59O1xuYXNzZXJ0LmlzTm90RW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RFbXB0eSwgdHJ1ZSkudG8ubm90LmJlLmVtcHR5O1xufTtcbmFzc2VydC5jb250YWluc1N1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8uY29udGFpblN1YnNldChleHApO1xufTtcbmFzc2VydC5kb2VzTm90Q29udGFpblN1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmNvbnRhaW5TdWJzZXQoZXhwKTtcbn07XG52YXIgYWxpYXNlcyA9IFtcbiAgW1wiaXNPa1wiLCBcIm9rXCJdLFxuICBbXCJpc05vdE9rXCIsIFwibm90T2tcIl0sXG4gIFtcInRocm93c1wiLCBcInRocm93XCJdLFxuICBbXCJ0aHJvd3NcIiwgXCJUaHJvd1wiXSxcbiAgW1wiaXNFeHRlbnNpYmxlXCIsIFwiZXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNOb3RFeHRlbnNpYmxlXCIsIFwibm90RXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNTZWFsZWRcIiwgXCJzZWFsZWRcIl0sXG4gIFtcImlzTm90U2VhbGVkXCIsIFwibm90U2VhbGVkXCJdLFxuICBbXCJpc0Zyb3plblwiLCBcImZyb3plblwiXSxcbiAgW1wiaXNOb3RGcm96ZW5cIiwgXCJub3RGcm96ZW5cIl0sXG4gIFtcImlzRW1wdHlcIiwgXCJlbXB0eVwiXSxcbiAgW1wiaXNOb3RFbXB0eVwiLCBcIm5vdEVtcHR5XCJdLFxuICBbXCJpc0NhbGxhYmxlXCIsIFwiaXNGdW5jdGlvblwiXSxcbiAgW1wiaXNOb3RDYWxsYWJsZVwiLCBcImlzTm90RnVuY3Rpb25cIl0sXG4gIFtcImNvbnRhaW5zU3Vic2V0XCIsIFwiY29udGFpblN1YnNldFwiXVxuXTtcbmZvciAoY29uc3QgW25hbWUsIGFzXSBvZiBhbGlhc2VzKSB7XG4gIGFzc2VydFthc10gPSBhc3NlcnRbbmFtZV07XG59XG5cbi8vIGxpYi9jaGFpLmpzXG52YXIgdXNlZCA9IFtdO1xuZnVuY3Rpb24gdXNlKGZuKSB7XG4gIGNvbnN0IGV4cG9ydHMgPSB7XG4gICAgdXNlLFxuICAgIEFzc2VydGlvbkVycm9yLFxuICAgIHV0aWw6IHV0aWxzX2V4cG9ydHMsXG4gICAgY29uZmlnLFxuICAgIGV4cGVjdCxcbiAgICBhc3NlcnQsXG4gICAgQXNzZXJ0aW9uLFxuICAgIC4uLnNob3VsZF9leHBvcnRzXG4gIH07XG4gIGlmICghfnVzZWQuaW5kZXhPZihmbikpIHtcbiAgICBmbihleHBvcnRzLCB1dGlsc19leHBvcnRzKTtcbiAgICB1c2VkLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBleHBvcnRzO1xufVxuX19uYW1lKHVzZSwgXCJ1c2VcIik7XG5leHBvcnQge1xuICBBc3NlcnRpb24sXG4gIEFzc2VydGlvbkVycm9yLFxuICBTaG91bGQsXG4gIGFzc2VydCxcbiAgY29uZmlnLFxuICBleHBlY3QsXG4gIHNob3VsZCxcbiAgdXNlLFxuICB1dGlsc19leHBvcnRzIGFzIHV0aWxcbn07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLElBQUksWUFBWSxPQUFPO0FBQ3ZCLElBQUksbUJBQW1CLEtBQUssS0FBSyxVQUFVLE9BQU8sTUFBTSxVQUFVLEtBQUssS0FBSztDQUFFLFlBQVk7Q0FBTSxjQUFjO0NBQU0sVUFBVTtDQUFNO0NBQU8sQ0FBQyxHQUFHLElBQUksT0FBTztBQUMxSixJQUFJLFVBQVUsUUFBUSxVQUFVLFVBQVUsUUFBUSxRQUFRO0NBQUU7Q0FBTyxjQUFjO0NBQU0sQ0FBQztBQUN4RixJQUFJLFlBQVksUUFBUSxRQUFRO0FBQzlCLE1BQUssSUFBSSxRQUFRLElBQ2YsV0FBVSxRQUFRLE1BQU07RUFBRSxLQUFLLElBQUk7RUFBTyxZQUFZO0VBQU0sQ0FBQzs7QUFFakUsSUFBSSxpQkFBaUIsS0FBSyxLQUFLLFVBQVUsZ0JBQWdCLEtBQUssT0FBTyxRQUFRLFdBQVcsTUFBTSxLQUFLLEtBQUssTUFBTTtBQUc5RyxJQUFJLGdCQUFnQixFQUFFO0FBQ3RCLFNBQVMsZUFBZTtDQUN0QiwwQkFBMEI7Q0FDMUIsc0JBQXNCO0NBQ3RCLGlCQUFpQjtDQUNqQixtQkFBbUI7Q0FDbkIsa0JBQWtCO0NBQ2xCLHdCQUF3QjtDQUN4QixXQUFXO0NBQ1gsY0FBYztDQUNkLG1CQUFtQjtDQUNuQixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLGtCQUFrQjtDQUNsQixlQUFlO0NBQ2YsbUJBQW1CO0NBQ25CLGtDQUFrQztDQUNsQyx1Q0FBdUM7Q0FDdkMsbUJBQW1CO0NBQ25CLG1CQUFtQjtDQUNuQixlQUFlO0NBQ2YsYUFBYTtDQUNiLGlCQUFpQjtD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
|