1var __defProp = Object.defineProperty; 2var __typeError = (msg) => { 3 throw TypeError(msg); 4}; 5var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 6var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); 7var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); 8var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); 9var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); 10var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value); 11var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method); 12var __privateWrapper = (obj, member, setter, getter) => ({ 13 set _(value) { 14 __privateSet(obj, member, value, setter); 15 }, 16 get _() { 17 return __privateGet(obj, member, getter); 18 } 19}); 20var _provider, _providerCalled, _a, _focused, _cleanup, _setup, _b, _online, _cleanup2, _setup2, _c, _gcTimeout, _d, _initialState, _revertState, _cache, _client, _retryer, _defaultOptions, _abortSignalConsumed, _Query_instances, dispatch_fn, _e, _client2, _currentQuery, _currentQueryInitialState, _currentResult, _currentResultState, _currentResultOptions, _currentThenable, _selectError, _selectFn, _selectResult, _lastQueryWithDefinedData, _staleTimeoutId, _refetchIntervalId, _currentRefetchInterval, _trackedProps, _QueryObserver_instances, executeFetch_fn, updateStaleTimeout_fn, computeRefetchInterval_fn, updateRefetchInterval_fn, updateTimers_fn, clearStaleTimeout_fn, clearRefetchInterval_fn, updateQuery_fn, notify_fn, _f, _client3, _observers, _mutationCache, _retryer2, _Mutation_instances, dispatch_fn2, _g, _mutations, _scopes, _mutationId, _h, _queries, _i, _queryCache, _mutationCache2, _defaultOptions2, _queryDefaults, _mutationDefaults, _mountCount, _unsubscribeFocus, _unsubscribeOnline, _j; 21(function polyfill() { 22 const relList = document.createElement("link").relList; 23 if (relList && relList.supports && relList.supports("modulepreload")) { 24 return; 25 } 26 for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { 27 processPreload(link); 28 } 29 new MutationObserver((mutations) => { 30 for (const mutation of mutations) { 31 if (mutation.type !== "childList") { 32 continue; 33 } 34 for (const node of mutation.addedNodes) { 35 if (node.tagName === "LINK" && node.rel === "modulepreload") 36 processPreload(node); 37 } 38 } 39 }).observe(document, { childList: true, subtree: true }); 40 function getFetchOpts(link) { 41 const fetchOpts = {}; 42 if (link.integrity) fetchOpts.integrity = link.integrity; 43 if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; 44 if (link.crossOrigin === "use-credentials") 45 fetchOpts.credentials = "include"; 46 else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; 47 else fetchOpts.credentials = "same-origin"; 48 return fetchOpts; 49 } 50 function processPreload(link) { 51 if (link.ep) 52 return; 53 link.ep = true; 54 const fetchOpts = getFetchOpts(link); 55 fetch(link.href, fetchOpts); 56 } 57})(); 58function getDefaultExportFromCjs(x2) { 59 return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2; 60} 61var jsxRuntime = { exports: {} }; 62var reactJsxRuntime_production_min = {}; 63var react = { exports: {} }; 64var react_production_min = {}; 65/** 66 * @license React 67 * react.production.min.js 68 * 69 * Copyright (c) Facebook, Inc. and its affiliates. 70 * 71 * This source code is licensed under the MIT license found in the 72 * LICENSE file in the root directory of this source tree. 73 */ 74var l$1 = Symbol.for("react.element"), n$1 = Symbol.for("react.portal"), p$2 = Symbol.for("react.fragment"), q$1 = Symbol.for("react.strict_mode"), r$1 = Symbol.for("react.profiler"), t = Symbol.for("react.provider"), u =
vendor: 4,623 bytes, lines 74-195
74Symbol.for("react.context"), v$1 = Symbol.for("react.forward_ref"), w = Symbol.for("react.suspense"), x = Symbol.for("react.memo"), y = Symbol.for("react.lazy"), z$1 = Symbol.iterator; 75function A$1(a) { 76 if (null === a || "object" !== typeof a) return null; 77 a = z$1 && a[z$1] || a["@@iterator"]; 78 return "function" === typeof a ? a : null; 79} 80var B$1 = { isMounted: function() { 81 return false; 82}, enqueueForceUpdate: function() { 83}, enqueueReplaceState: function() { 84}, enqueueSetState: function() { 85} }, C$1 = Object.assign, D$1 = {}; 86function E$1(a, b, e) { 87 this.props = a; 88 this.context = b; 89 this.refs = D$1; 90 this.updater = e || B$1; 91} 92E$1.prototype.isReactComponent = {}; 93E$1.prototype.setState = function(a, b) { 94 if ("object" !== typeof a && "function" !== typeof a && null != a) throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); 95 this.updater.enqueueSetState(this, a, b, "setState"); 96}; 97E$1.prototype.forceUpdate = function(a) { 98 this.updater.enqueueForceUpdate(this, a, "forceUpdate"); 99}; 100function F() { 101} 102F.prototype = E$1.prototype; 103function G$1(a, b, e) { 104 this.props = a; 105 this.context = b; 106 this.refs = D$1; 107 this.updater = e || B$1; 108} 109var H$1 = G$1.prototype = new F(); 110H$1.constructor = G$1; 111C$1(H$1, E$1.prototype); 112H$1.isPureReactComponent = true; 113var I$1 = Array.isArray, J = Object.prototype.hasOwnProperty, K$1 = { current: null }, L$1 = { key: true, ref: true, __self: true, __source: true }; 114function M$1(a, b, e) { 115 var d, c = {}, k2 = null, h = null; 116 if (null != b) for (d in void 0 !== b.ref && (h = b.ref), void 0 !== b.key && (k2 = "" + b.key), b) J.call(b, d) && !L$1.hasOwnProperty(d) && (c[d] = b[d]); 117 var g = arguments.length - 2; 118 if (1 === g) c.children = e; 119 else if (1 < g) { 120 for (var f2 = Array(g), m2 = 0; m2 < g; m2++) f2[m2] = arguments[m2 + 2]; 121 c.children = f2; 122 } 123 if (a && a.defaultProps) for (d in g = a.defaultProps, g) void 0 === c[d] && (c[d] = g[d]); 124 return { $$typeof: l$1, type: a, key: k2, ref: h, props: c, _owner: K$1.current }; 125} 126function N$1(a, b) { 127 return { $$typeof: l$1, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner }; 128} 129function O$1(a) { 130 return "object" === typeof a && null !== a && a.$$typeof === l$1; 131} 132function escape(a) { 133 var b = { "=": "=0", ":": "=2" }; 134 return "$" + a.replace(/[=:]/g, function(a2) { 135 return b[a2]; 136 }); 137} 138var P$1 = /\/+/g; 139function Q$1(a, b) { 140 return "object" === typeof a && null !== a && null != a.key ? escape("" + a.key) : b.toString(36); 141} 142function R$1(a, b, e, d, c) { 143 var k2 = typeof a; 144 if ("undefined" === k2 || "boolean" === k2) a = null; 145 var h = false; 146 if (null === a) h = true; 147 else switch (k2) { 148 case "string": 149 case "number": 150 h = true; 151 break; 152 case "object": 153 switch (a.$$typeof) { 154 case l$1: 155 case n$1: 156 h = true; 157 } 158 } 159 if (h) return h = a, c = c(h), a = "" === d ? "." + Q$1(h, 0) : d, I$1(c) ? (e = "", null != a && (e = a.replace(P$1, "$&/") + "/"), R$1(c, b, e, "", function(a2) { 160 return a2; 161 })) : null != c && (O$1(c) && (c = N$1(c, e + (!c.key || h && h.key === c.key ? "" : ("" + c.key).replace(P$1, "$&/") + "/") + a)), b.push(c)), 1; 162 h = 0; 163 d = "" === d ? "." : d + ":"; 164 if (I$1(a)) for (var g = 0; g < a.length; g++) { 165 k2 = a[g]; 166 var f2 = d + Q$1(k2, g); 167 h += R$1(k2, b, e, f2, c); 168 } 169 else if (f2 = A$1(a), "function" === typeof f2) for (a = f2.call(a), g = 0; !(k2 = a.next()).done; ) k2 = k2.value, f2 = d + Q$1(k2, g++), h += R$1(k2, b, e, f2, c); 170 else if ("object" === k2) throw b = String(a), Error("Objects are not valid as a React child (found: " + ("[object Object]" === b ? "object with keys {" + Object.keys(a).join(", ") + "}" : b) + "). If you meant to render a collection of children, use an array instead."); 171 return h; 172} 173function S$1(a, b, e) { 174 if (null == a) return a; 175 var d = [], c = 0; 176 R$1(a, d, "", "", function(a2) { 177 return b.call(e, a2, c++); 178 }); 179 return d; 180} 181function T$1(a) { 182 if (-1 === a._status) { 183 var b = a._result; 184 b = b(); 185 b.then(function(b2) { 186 if (0 === a._status || -1 === a._status) a._status = 1, a._result = b2; 187 }, function(b2) { 188 if (0 === a._status || -1 === a._status) a._status = 2, a._result = b2; 189 }); 190 -1 === a._status && (a._status = 0, a._result = b); 191 } 192 if (1 === a._status) return a._result.default; 193 throw a._result; 194} 195var U$1 = { current: null }, V$1 = { transition: null }, W$1 = { ReactCurrentDispatcher: U$1, ReactCurrentBatchConfig: V$1, ReactCurrentOwner: K$
vendor: 4,778 bytes, lines 195-336
1951 }; 196function X$2() { 197 throw Error("act(...) is not supported in production builds of React."); 198} 199react_production_min.Children = { map: S$1, forEach: function(a, b, e) { 200 S$1(a, function() { 201 b.apply(this, arguments); 202 }, e); 203}, count: function(a) { 204 var b = 0; 205 S$1(a, function() { 206 b++; 207 }); 208 return b; 209}, toArray: function(a) { 210 return S$1(a, function(a2) { 211 return a2; 212 }) || []; 213}, only: function(a) { 214 if (!O$1(a)) throw Error("React.Children.only expected to receive a single React element child."); 215 return a; 216} }; 217react_production_min.Component = E$1; 218react_production_min.Fragment = p$2; 219react_production_min.Profiler = r$1; 220react_production_min.PureComponent = G$1; 221react_production_min.StrictMode = q$1; 222react_production_min.Suspense = w; 223react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = W$1; 224react_production_min.act = X$2; 225react_production_min.cloneElement = function(a, b, e) { 226 if (null === a || void 0 === a) throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + a + "."); 227 var d = C$1({}, a.props), c = a.key, k2 = a.ref, h = a._owner; 228 if (null != b) { 229 void 0 !== b.ref && (k2 = b.ref, h = K$1.current); 230 void 0 !== b.key && (c = "" + b.key); 231 if (a.type && a.type.defaultProps) var g = a.type.defaultProps; 232 for (f2 in b) J.call(b, f2) && !L$1.hasOwnProperty(f2) && (d[f2] = void 0 === b[f2] && void 0 !== g ? g[f2] : b[f2]); 233 } 234 var f2 = arguments.length - 2; 235 if (1 === f2) d.children = e; 236 else if (1 < f2) { 237 g = Array(f2); 238 for (var m2 = 0; m2 < f2; m2++) g[m2] = arguments[m2 + 2]; 239 d.children = g; 240 } 241 return { $$typeof: l$1, type: a.type, key: c, ref: k2, props: d, _owner: h }; 242}; 243react_production_min.createContext = function(a) { 244 a = { $$typeof: u, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null, _defaultValue: null, _globalName: null }; 245 a.Provider = { $$typeof: t, _context: a }; 246 return a.Consumer = a; 247}; 248react_production_min.createElement = M$1; 249react_production_min.createFactory = function(a) { 250 var b = M$1.bind(null, a); 251 b.type = a; 252 return b; 253}; 254react_production_min.createRef = function() { 255 return { current: null }; 256}; 257react_production_min.forwardRef = function(a) { 258 return { $$typeof: v$1, render: a }; 259}; 260react_production_min.isValidElement = O$1; 261react_production_min.lazy = function(a) { 262 return { $$typeof: y, _payload: { _status: -1, _result: a }, _init: T$1 }; 263}; 264react_production_min.memo = function(a, b) { 265 return { $$typeof: x, type: a, compare: void 0 === b ? null : b }; 266}; 267react_production_min.startTransition = function(a) { 268 var b = V$1.transition; 269 V$1.transition = {}; 270 try { 271 a(); 272 } finally { 273 V$1.transition = b; 274 } 275}; 276react_production_min.unstable_act = X$2; 277react_production_min.useCallback = function(a, b) { 278 return U$1.current.useCallback(a, b); 279}; 280react_production_min.useContext = function(a) { 281 return U$1.current.useContext(a); 282}; 283react_production_min.useDebugValue = function() { 284}; 285react_production_min.useDeferredValue = function(a) { 286 return U$1.current.useDeferredValue(a); 287}; 288react_production_min.useEffect = function(a, b) { 289 return U$1.current.useEffect(a, b); 290}; 291react_production_min.useId = function() { 292 return U$1.current.useId(); 293}; 294react_production_min.useImperativeHandle = function(a, b, e) { 295 return U$1.current.useImperativeHandle(a, b, e); 296}; 297react_production_min.useInsertionEffect = function(a, b) { 298 return U$1.current.useInsertionEffect(a, b); 299}; 300react_production_min.useLayoutEffect = function(a, b) { 301 return U$1.current.useLayoutEffect(a, b); 302}; 303react_production_min.useMemo = function(a, b) { 304 return U$1.current.useMemo(a, b); 305}; 306react_production_min.useReducer = function(a, b, e) { 307 return U$1.current.useReducer(a, b, e); 308}; 309react_production_min.useRef = function(a) { 310 return U$1.current.useRef(a); 311}; 312react_production_min.useState = function(a) { 313 return U$1.current.useState(a); 314}; 315react_production_min.useSyncExternalStore = function(a, b, e) { 316 return U$1.current.useSyncExternalStore(a, b, e); 317}; 318react_production_min.useTransition = function() { 319 return U$1.current.useTransition(); 320}; 321react_production_min.version = "18.3.1"; 322{ 323 react.exports = react_production_min; 324} 325var reactExports = react.exports; 326const React$2 = /* @__PURE__ */ getDefaultExportFromCjs(reactExports); 327/** 328 * @license React 329 * react-jsx-runtime.production.min.js 330 * 331 * Copyright (c) Facebook, Inc. and its affiliates. 332 * 333 * This source code is licensed under the MIT license found in the 334 * LICENSE file in the root directory of this source tree. 335 */ 336var f = reactExports, k = Symbol.for("react.element"), l = Symbol.for("react.fragment"), m$1 = Object.prototype.hasOwnProperty, n = f.__SECRET_INT
vendor: 203,289 bytes, lines 336-6997
336ERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p$1 = { key: true, ref: true, __self: true, __source: true }; 337function q(c, a, g) { 338 var b, d = {}, e = null, h = null; 339 void 0 !== g && (e = "" + g); 340 void 0 !== a.key && (e = "" + a.key); 341 void 0 !== a.ref && (h = a.ref); 342 for (b in a) m$1.call(a, b) && !p$1.hasOwnProperty(b) && (d[b] = a[b]); 343 if (c && c.defaultProps) for (b in a = c.defaultProps, a) void 0 === d[b] && (d[b] = a[b]); 344 return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current }; 345} 346reactJsxRuntime_production_min.Fragment = l; 347reactJsxRuntime_production_min.jsx = q; 348reactJsxRuntime_production_min.jsxs = q; 349{ 350 jsxRuntime.exports = reactJsxRuntime_production_min; 351} 352var jsxRuntimeExports = jsxRuntime.exports; 353var client = {}; 354var reactDom = { exports: {} }; 355var reactDom_production_min = {}; 356var scheduler = { exports: {} }; 357var scheduler_production_min = {}; 358/** 359 * @license React 360 * scheduler.production.min.js 361 * 362 * Copyright (c) Facebook, Inc. and its affiliates. 363 * 364 * This source code is licensed under the MIT license found in the 365 * LICENSE file in the root directory of this source tree. 366 */ 367(function(exports) { 368 function f2(a, b) { 369 var c = a.length; 370 a.push(b); 371 a: for (; 0 < c; ) { 372 var d = c - 1 >>> 1, e = a[d]; 373 if (0 < g(e, b)) a[d] = b, a[c] = e, c = d; 374 else break a; 375 } 376 } 377 function h(a) { 378 return 0 === a.length ? null : a[0]; 379 } 380 function k2(a) { 381 if (0 === a.length) return null; 382 var b = a[0], c = a.pop(); 383 if (c !== b) { 384 a[0] = c; 385 a: for (var d = 0, e = a.length, w2 = e >>> 1; d < w2; ) { 386 var m2 = 2 * (d + 1) - 1, C2 = a[m2], n2 = m2 + 1, x2 = a[n2]; 387 if (0 > g(C2, c)) n2 < e && 0 > g(x2, C2) ? (a[d] = x2, a[n2] = c, d = n2) : (a[d] = C2, a[m2] = c, d = m2); 388 else if (n2 < e && 0 > g(x2, c)) a[d] = x2, a[n2] = c, d = n2; 389 else break a; 390 } 391 } 392 return b; 393 } 394 function g(a, b) { 395 var c = a.sortIndex - b.sortIndex; 396 return 0 !== c ? c : a.id - b.id; 397 } 398 if ("object" === typeof performance && "function" === typeof performance.now) { 399 var l2 = performance; 400 exports.unstable_now = function() { 401 return l2.now(); 402 }; 403 } else { 404 var p2 = Date, q2 = p2.now(); 405 exports.unstable_now = function() { 406 return p2.now() - q2; 407 }; 408 } 409 var r2 = [], t2 = [], u2 = 1, v2 = null, y2 = 3, z2 = false, A2 = false, B2 = false, D2 = "function" === typeof setTimeout ? setTimeout : null, E2 = "function" === typeof clearTimeout ? clearTimeout : null, F2 = "undefined" !== typeof setImmediate ? setImmediate : null; 410 "undefined" !== typeof navigator && void 0 !== navigator.scheduling && void 0 !== navigator.scheduling.isInputPending && navigator.scheduling.isInputPending.bind(navigator.scheduling); 411 function G2(a) { 412 for (var b = h(t2); null !== b; ) { 413 if (null === b.callback) k2(t2); 414 else if (b.startTime <= a) k2(t2), b.sortIndex = b.expirationTime, f2(r2, b); 415 else break; 416 b = h(t2); 417 } 418 } 419 function H2(a) { 420 B2 = false; 421 G2(a); 422 if (!A2) if (null !== h(r2)) A2 = true, I2(J2); 423 else { 424 var b = h(t2); 425 null !== b && K2(H2, b.startTime - a); 426 } 427 } 428 function J2(a, b) { 429 A2 = false; 430 B2 && (B2 = false, E2(L2), L2 = -1); 431 z2 = true; 432 var c = y2; 433 try { 434 G2(b); 435 for (v2 = h(r2); null !== v2 && (!(v2.expirationTime > b) || a && !M2()); ) { 436 var d = v2.callback; 437 if ("function" === typeof d) { 438 v2.callback = null; 439 y2 = v2.priorityLevel; 440 var e = d(v2.expirationTime <= b); 441 b = exports.unstable_now(); 442 "function" === typeof e ? v2.callback = e : v2 === h(r2) && k2(r2); 443 G2(b); 444 } else k2(r2); 445 v2 = h(r2); 446 } 447 if (null !== v2) var w2 = true; 448 else { 449 var m2 = h(t2); 450 null !== m2 && K2(H2, m2.startTime - b); 451 w2 = false; 452 } 453 return w2; 454 } finally { 455 v2 = null, y2 = c, z2 = false; 456 } 457 } 458 var N2 = false, O2 = null, L2 = -1, P2 = 5, Q2 = -1; 459 function M2() { 460 return exports.unstable_now() - Q2 < P2 ? false : true; 461 } 462 function R2() { 463 if (null !== O2) { 464 var a = exports.unstable_now(); 465 Q2 = a; 466 var b = true; 467 try { 468 b = O2(true, a); 469 } finally { 470 b ? S2() : (N2 = false, O2 = null); 471 } 472 } else N2 = false; 473 } 474 var S2; 475 if ("function" === typeof F2) S2 = function() { 476 F2(R2); 477 }; 478 else if ("undefined" !== typeof MessageChannel) { 479 var T2 = new MessageChannel(), U2 = T2.port2; 480 T2.port1.onmessage = R2; 481 S2 = function() { 482 U2.postMessage(null); 483 }; 484 } else S2 = function() { 485 D2(R2, 0); 486 }; 487 function I2(a) { 488 O2 = a; 489 N2 || (N2 = true, S2()); 490 } 491 function K2(a, b) { 492 L2 = D2(function() { 493 a(exports.unstable_now()); 494 }, b); 495 } 496 exports.unstable_IdlePriority = 5; 497 exports.unstable_ImmediatePriority = 1; 498 exports.unstable_LowPriority = 4; 499 exports.unstable_NormalPriority = 3; 500 exports.unstable_Profiling = null; 501 exports.unstable_UserBlockingPriority = 2; 502 exports.unstable_cancelCallback = function(a) { 503 a.callback = null; 504 }; 505 exports.unstable_continueExecution = function() { 506 A2 || z2 || (A2 = true, I2(J2)); 507 }; 508 exports.unstable_forceFrameRate = function(a) { 509 0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : P2 = 0 < a ? Math.floor(1e3 / a) : 5; 510 }; 511 exports.unstable_getCurrentPriorityLevel = function() { 512 return y2; 513 }; 514 exports.unstable_getFirstCallbackNode = function() { 515 return h(r2); 516 }; 517 exports.unstable_next = function(a) { 518 switch (y2) { 519 case 1: 520 case 2: 521 case 3: 522 var b = 3; 523 break; 524 default: 525 b = y2; 526 } 527 var c = y2; 528 y2 = b; 529 try { 530 return a(); 531 } finally { 532 y2 = c; 533 } 534 }; 535 exports.unstable_pauseExecution = function() { 536 }; 537 exports.unstable_requestPaint = function() { 538 }; 539 exports.unstable_runWithPriority = function(a, b) { 540 switch (a) { 541 case 1: 542 case 2: 543 case 3: 544 case 4: 545 case 5: 546 break; 547 default: 548 a = 3; 549 } 550 var c = y2; 551 y2 = a; 552 try { 553 return b(); 554 } finally { 555 y2 = c; 556 } 557 }; 558 exports.unstable_scheduleCallback = function(a, b, c) { 559 var d = exports.unstable_now(); 560 "object" === typeof c && null !== c ? (c = c.delay, c = "number" === typeof c && 0 < c ? d + c : d) : c = d; 561 switch (a) { 562 case 1: 563 var e = -1; 564 break; 565 case 2: 566 e = 250; 567 break; 568 case 5: 569 e = 1073741823; 570 break; 571 case 4: 572 e = 1e4; 573 break; 574 default: 575 e = 5e3; 576 } 577 e = c + e; 578 a = { id: u2++, callback: b, priorityLevel: a, startTime: c, expirationTime: e, sortIndex: -1 }; 579 c > d ? (a.sortIndex = c, f2(t2, a), null === h(r2) && a === h(t2) && (B2 ? (E2(L2), L2 = -1) : B2 = true, K2(H2, c - d))) : (a.sortIndex = e, f2(r2, a), A2 || z2 || (A2 = true, I2(J2))); 580 return a; 581 }; 582 exports.unstable_shouldYield = M2; 583 exports.unstable_wrapCallback = function(a) { 584 var b = y2; 585 return function() { 586 var c = y2; 587 y2 = b; 588 try { 589 return a.apply(this, arguments); 590 } finally { 591 y2 = c; 592 } 593 }; 594 }; 595})(scheduler_production_min); 596{ 597 scheduler.exports = scheduler_production_min; 598} 599var schedulerExports = scheduler.exports; 600/** 601 * @license React 602 * react-dom.production.min.js 603 * 604 * Copyright (c) Facebook, Inc. and its affiliates. 605 * 606 * This source code is licensed under the MIT license found in the 607 * LICENSE file in the root directory of this source tree. 608 */ 609var aa = reactExports, ca = schedulerExports; 610function p(a) { 611 for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++) b += "&args[]=" + encodeURIComponent(arguments[c]); 612 return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."; 613} 614var da = /* @__PURE__ */ new Set(), ea = {}; 615function fa(a, b) { 616 ha(a, b); 617 ha(a + "Capture", b); 618} 619function ha(a, b) { 620 ea[a] = b; 621 for (a = 0; a < b.length; a++) da.add(b[a]); 622} 623var ia = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement), ja = Object.prototype.hasOwnProperty, ka = /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, la = {}, ma = {}; 624function oa(a) { 625 if (ja.call(ma, a)) return true; 626 if (ja.call(la, a)) return false; 627 if (ka.test(a)) return ma[a] = true; 628 la[a] = true; 629 return false; 630} 631function pa(a, b, c, d) { 632 if (null !== c && 0 === c.type) return false; 633 switch (typeof b) { 634 case "function": 635 case "symbol": 636 return true; 637 case "boolean": 638 if (d) return false; 639 if (null !== c) return !c.acceptsBooleans; 640 a = a.toLowerCase().slice(0, 5); 641 return "data-" !== a && "aria-" !== a; 642 default: 643 return false; 644 } 645} 646function qa(a, b, c, d) { 647 if (null === b || "undefined" === typeof b || pa(a, b, c, d)) return true; 648 if (d) return false; 649 if (null !== c) switch (c.type) { 650 case 3: 651 return !b; 652 case 4: 653 return false === b; 654 case 5: 655 return isNaN(b); 656 case 6: 657 return isNaN(b) || 1 > b; 658 } 659 return false; 660} 661function v(a, b, c, d, e, f2, g) { 662 this.acceptsBooleans = 2 === b || 3 === b || 4 === b; 663 this.attributeName = d; 664 this.attributeNamespace = e; 665 this.mustUseProperty = c; 666 this.propertyName = a; 667 this.type = b; 668 this.sanitizeURL = f2; 669 this.removeEmptyString = g; 670} 671var z = {}; 672"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) { 673 z[a] = new v(a, 0, false, a, null, false, false); 674}); 675[["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(a) { 676 var b = a[0]; 677 z[b] = new v(b, 1, false, a[1], null, false, false); 678}); 679["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) { 680 z[a] = new v(a, 2, false, a.toLowerCase(), null, false, false); 681}); 682["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) { 683 z[a] = new v(a, 2, false, a, null, false, false); 684}); 685"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a) { 686 z[a] = new v(a, 3, false, a.toLowerCase(), null, false, false); 687}); 688["checked", "multiple", "muted", "selected"].forEach(function(a) { 689 z[a] = new v(a, 3, true, a, null, false, false); 690}); 691["capture", "download"].forEach(function(a) { 692 z[a] = new v(a, 4, false, a, null, false, false); 693}); 694["cols", "rows", "size", "span"].forEach(function(a) { 695 z[a] = new v(a, 6, false, a, null, false, false); 696}); 697["rowSpan", "start"].forEach(function(a) { 698 z[a] = new v(a, 5, false, a.toLowerCase(), null, false, false); 699}); 700var ra = /[\-:]([a-z])/g; 701function sa(a) { 702 return a[1].toUpperCase(); 703} 704"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a) { 705 var b = a.replace( 706 ra, 707 sa 708 ); 709 z[b] = new v(b, 1, false, a, null, false, false); 710}); 711"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) { 712 var b = a.replace(ra, sa); 713 z[b] = new v(b, 1, false, a, "http://www.w3.org/1999/xlink", false, false); 714}); 715["xml:base", "xml:lang", "xml:space"].forEach(function(a) { 716 var b = a.replace(ra, sa); 717 z[b] = new v(b, 1, false, a, "http://www.w3.org/XML/1998/namespace", false, false); 718}); 719["tabIndex", "crossOrigin"].forEach(function(a) { 720 z[a] = new v(a, 1, false, a.toLowerCase(), null, false, false); 721}); 722z.xlinkHref = new v("xlinkHref", 1, false, "xlink:href", "http://www.w3.org/1999/xlink", true, false); 723["src", "href", "action", "formAction"].forEach(function(a) { 724 z[a] = new v(a, 1, false, a.toLowerCase(), null, true, true); 725}); 726function ta(a, b, c, d) { 727 var e = z.hasOwnProperty(b) ? z[b] : null; 728 if (null !== e ? 0 !== e.type : d || !(2 < b.length) || "o" !== b[0] && "O" !== b[0] || "n" !== b[1] && "N" !== b[1]) qa(b, c, e, d) && (c = null), d || null === e ? oa(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 === e.type ? false : "" : c : (b = e.attributeName, d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && true === c ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))); 729} 730var ua = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, va = Symbol.for("react.element"), wa = Symbol.for("react.portal"), ya = Symbol.for("react.fragment"), za = Symbol.for("react.strict_mode"), Aa = Symbol.for("react.profiler"), Ba = Symbol.for("react.provider"), Ca = Symbol.for("react.context"), Da = Symbol.for("react.forward_ref"), Ea = Symbol.for("react.suspense"), Fa = Symbol.for("react.suspense_list"), Ga = Symbol.for("react.memo"), Ha = Symbol.for("react.lazy"); 731var Ia = Symbol.for("react.offscreen"); 732var Ja = Symbol.iterator; 733function Ka(a) { 734 if (null === a || "object" !== typeof a) return null; 735 a = Ja && a[Ja] || a["@@iterator"]; 736 return "function" === typeof a ? a : null; 737} 738var A = Object.assign, La; 739function Ma(a) { 740 if (void 0 === La) try { 741 throw Error(); 742 } catch (c) { 743 var b = c.stack.trim().match(/\n( *(at )?)/); 744 La = b && b[1] || ""; 745 } 746 return "\n" + La + a; 747} 748var Na = false; 749function Oa(a, b) { 750 if (!a || Na) return ""; 751 Na = true; 752 var c = Error.prepareStackTrace; 753 Error.prepareStackTrace = void 0; 754 try { 755 if (b) if (b = function() { 756 throw Error(); 757 }, Object.defineProperty(b.prototype, "props", { set: function() { 758 throw Error(); 759 } }), "object" === typeof Reflect && Reflect.construct) { 760 try { 761 Reflect.construct(b, []); 762 } catch (l2) { 763 var d = l2; 764 } 765 Reflect.construct(a, [], b); 766 } else { 767 try { 768 b.call(); 769 } catch (l2) { 770 d = l2; 771 } 772 a.call(b.prototype); 773 } 774 else { 775 try { 776 throw Error(); 777 } catch (l2) { 778 d = l2; 779 } 780 a(); 781 } 782 } catch (l2) { 783 if (l2 && d && "string" === typeof l2.stack) { 784 for (var e = l2.stack.split("\n"), f2 = d.stack.split("\n"), g = e.length - 1, h = f2.length - 1; 1 <= g && 0 <= h && e[g] !== f2[h]; ) h--; 785 for (; 1 <= g && 0 <= h; g--, h--) if (e[g] !== f2[h]) { 786 if (1 !== g || 1 !== h) { 787 do 788 if (g--, h--, 0 > h || e[g] !== f2[h]) { 789 var k2 = "\n" + e[g].replace(" at new ", " at "); 790 a.displayName && k2.includes("<anonymous>") && (k2 = k2.replace("<anonymous>", a.displayName)); 791 return k2; 792 } 793 while (1 <= g && 0 <= h); 794 } 795 break; 796 } 797 } 798 } finally { 799 Na = false, Error.prepareStackTrace = c; 800 } 801 return (a = a ? a.displayName || a.name : "") ? Ma(a) : ""; 802} 803function Pa(a) { 804 switch (a.tag) { 805 case 5: 806 return Ma(a.type); 807 case 16: 808 return Ma("Lazy"); 809 case 13: 810 return Ma("Suspense"); 811 case 19: 812 return Ma("SuspenseList"); 813 case 0: 814 case 2: 815 case 15: 816 return a = Oa(a.type, false), a; 817 case 11: 818 return a = Oa(a.type.render, false), a; 819 case 1: 820 return a = Oa(a.type, true), a; 821 default: 822 return ""; 823 } 824} 825function Qa(a) { 826 if (null == a) return null; 827 if ("function" === typeof a) return a.displayName || a.name || null; 828 if ("string" === typeof a) return a; 829 switch (a) { 830 case ya: 831 return "Fragment"; 832 case wa: 833 return "Portal"; 834 case Aa: 835 return "Profiler"; 836 case za: 837 return "StrictMode"; 838 case Ea: 839 return "Suspense"; 840 case Fa: 841 return "SuspenseList"; 842 } 843 if ("object" === typeof a) switch (a.$$typeof) { 844 case Ca: 845 return (a.displayName || "Context") + ".Consumer"; 846 case Ba: 847 return (a._context.displayName || "Context") + ".Provider"; 848 case Da: 849 var b = a.render; 850 a = a.displayName; 851 a || (a = b.displayName || b.name || "", a = "" !== a ? "ForwardRef(" + a + ")" : "ForwardRef"); 852 return a; 853 case Ga: 854 return b = a.displayName || null, null !== b ? b : Qa(a.type) || "Memo"; 855 case Ha: 856 b = a._payload; 857 a = a._init; 858 try { 859 return Qa(a(b)); 860 } catch (c) { 861 } 862 } 863 return null; 864} 865function Ra(a) { 866 var b = a.type; 867 switch (a.tag) { 868 case 24: 869 return "Cache"; 870 case 9: 871 return (b.displayName || "Context") + ".Consumer"; 872 case 10: 873 return (b._context.displayName || "Context") + ".Provider"; 874 case 18: 875 return "DehydratedFragment"; 876 case 11: 877 return a = b.render, a = a.displayName || a.name || "", b.displayName || ("" !== a ? "ForwardRef(" + a + ")" : "ForwardRef"); 878 case 7: 879 return "Fragment"; 880 case 5: 881 return b; 882 case 4: 883 return "Portal"; 884 case 3: 885 return "Root"; 886 case 6: 887 return "Text"; 888 case 16: 889 return Qa(b); 890 case 8: 891 return b === za ? "StrictMode" : "Mode"; 892 case 22: 893 return "Offscreen"; 894 case 12: 895 return "Profiler"; 896 case 21: 897 return "Scope"; 898 case 13: 899 return "Suspense"; 900 case 19: 901 return "SuspenseList"; 902 case 25: 903 return "TracingMarker"; 904 case 1: 905 case 0: 906 case 17: 907 case 2: 908 case 14: 909 case 15: 910 if ("function" === typeof b) return b.displayName || b.name || null; 911 if ("string" === typeof b) return b; 912 } 913 return null; 914} 915function Sa(a) { 916 switch (typeof a) { 917 case "boolean": 918 case "number": 919 case "string": 920 case "undefined": 921 return a; 922 case "object": 923 return a; 924 default: 925 return ""; 926 } 927} 928function Ta(a) { 929 var b = a.type; 930 return (a = a.nodeName) && "input" === a.toLowerCase() && ("checkbox" === b || "radio" === b); 931} 932function Ua(a) { 933 var b = Ta(a) ? "checked" : "value", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = "" + a[b]; 934 if (!a.hasOwnProperty(b) && "undefined" !== typeof c && "function" === typeof c.get && "function" === typeof c.set) { 935 var e = c.get, f2 = c.set; 936 Object.defineProperty(a, b, { configurable: true, get: function() { 937 return e.call(this); 938 }, set: function(a2) { 939 d = "" + a2; 940 f2.call(this, a2); 941 } }); 942 Object.defineProperty(a, b, { enumerable: c.enumerable }); 943 return { getValue: function() { 944 return d; 945 }, setValue: function(a2) { 946 d = "" + a2; 947 }, stopTracking: function() { 948 a._valueTracker = null; 949 delete a[b]; 950 } }; 951 } 952} 953function Va(a) { 954 a._valueTracker || (a._valueTracker = Ua(a)); 955} 956function Wa(a) { 957 if (!a) return false; 958 var b = a._valueTracker; 959 if (!b) return true; 960 var c = b.getValue(); 961 var d = ""; 962 a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value); 963 a = d; 964 return a !== c ? (b.setValue(a), true) : false; 965} 966function Xa(a) { 967 a = a || ("undefined" !== typeof document ? document : void 0); 968 if ("undefined" === typeof a) return null; 969 try { 970 return a.activeElement || a.body; 971 } catch (b) { 972 return a.body; 973 } 974} 975function Ya(a, b) { 976 var c = b.checked; 977 return A({}, b, { defaultChecked: void 0, defaultValue: void 0, value: void 0, checked: null != c ? c : a._wrapperState.initialChecked }); 978} 979function Za(a, b) { 980 var c = null == b.defaultValue ? "" : b.defaultValue, d = null != b.checked ? b.checked : b.defaultChecked; 981 c = Sa(null != b.value ? b.value : c); 982 a._wrapperState = { initialChecked: d, initialValue: c, controlled: "checkbox" === b.type || "radio" === b.type ? null != b.checked : null != b.value }; 983} 984function ab(a, b) { 985 b = b.checked; 986 null != b && ta(a, "checked", b, false); 987} 988function bb(a, b) { 989 ab(a, b); 990 var c = Sa(b.value), d = b.type; 991 if (null != c) if ("number" === d) { 992 if (0 === c && "" === a.value || a.value != c) a.value = "" + c; 993 } else a.value !== "" + c && (a.value = "" + c); 994 else if ("submit" === d || "reset" === d) { 995 a.removeAttribute("value"); 996 return; 997 } 998 b.hasOwnProperty("value") ? cb(a, b.type, c) : b.hasOwnProperty("defaultValue") && cb(a, b.type, Sa(b.defaultValue)); 999 null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked); 1000} 1001function db(a, b, c) { 1002 if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) { 1003 var d = b.type; 1004 if (!("submit" !== d && "reset" !== d || void 0 !== b.value && null !== b.value)) return; 1005 b = "" + a._wrapperState.initialValue; 1006 c || b === a.value || (a.value = b); 1007 a.defaultValue = b; 1008 } 1009 c = a.name; 1010 "" !== c && (a.name = ""); 1011 a.defaultChecked = !!a._wrapperState.initialChecked; 1012 "" !== c && (a.name = c); 1013} 1014function cb(a, b, c) { 1015 if ("number" !== b || Xa(a.ownerDocument) !== a) null == c ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c); 1016} 1017var eb = Array.isArray; 1018function fb(a, b, c, d) { 1019 a = a.options; 1020 if (b) { 1021 b = {}; 1022 for (var e = 0; e < c.length; e++) b["$" + c[e]] = true; 1023 for (c = 0; c < a.length; c++) e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = true); 1024 } else { 1025 c = "" + Sa(c); 1026 b = null; 1027 for (e = 0; e < a.length; e++) { 1028 if (a[e].value === c) { 1029 a[e].selected = true; 1030 d && (a[e].defaultSelected = true); 1031 return; 1032 } 1033 null !== b || a[e].disabled || (b = a[e]); 1034 } 1035 null !== b && (b.selected = true); 1036 } 1037} 1038function gb(a, b) { 1039 if (null != b.dangerouslySetInnerHTML) throw Error(p(91)); 1040 return A({}, b, { value: void 0, defaultValue: void 0, children: "" + a._wrapperState.initialValue }); 1041} 1042function hb(a, b) { 1043 var c = b.value; 1044 if (null == c) { 1045 c = b.children; 1046 b = b.defaultValue; 1047 if (null != c) { 1048 if (null != b) throw Error(p(92)); 1049 if (eb(c)) { 1050 if (1 < c.length) throw Error(p(93)); 1051 c = c[0]; 1052 } 1053 b = c; 1054 } 1055 null == b && (b = ""); 1056 c = b; 1057 } 1058 a._wrapperState = { initialValue: Sa(c) }; 1059} 1060function ib(a, b) { 1061 var c = Sa(b.value), d = Sa(b.defaultValue); 1062 null != c && (c = "" + c, c !== a.value && (a.value = c), null == b.defaultValue && a.defaultValue !== c && (a.defaultValue = c)); 1063 null != d && (a.defaultValue = "" + d); 1064} 1065function jb(a) { 1066 var b = a.textContent; 1067 b === a._wrapperState.initialValue && "" !== b && null !== b && (a.value = b); 1068} 1069function kb(a) { 1070 switch (a) { 1071 case "svg": 1072 return "http://www.w3.org/2000/svg"; 1073 case "math": 1074 return "http://www.w3.org/1998/Math/MathML"; 1075 default: 1076 return "http://www.w3.org/1999/xhtml"; 1077 } 1078} 1079function lb(a, b) { 1080 return null == a || "http://www.w3.org/1999/xhtml" === a ? kb(b) : "http://www.w3.org/2000/svg" === a && "foreignObject" === b ? "http://www.w3.org/1999/xhtml" : a; 1081} 1082var mb, nb = function(a) { 1083 return "undefined" !== typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) { 1084 MSApp.execUnsafeLocalFunction(function() { 1085 return a(b, c, d, e); 1086 }); 1087 } : a; 1088}(function(a, b) { 1089 if ("http://www.w3.org/2000/svg" !== a.namespaceURI || "innerHTML" in a) a.innerHTML = b; 1090 else { 1091 mb = mb || document.createElement("div"); 1092 mb.innerHTML = "<svg>" + b.valueOf().toString() + "</svg>"; 1093 for (b = mb.firstChild; a.firstChild; ) a.removeChild(a.firstChild); 1094 for (; b.firstChild; ) a.appendChild(b.firstChild); 1095 } 1096}); 1097function ob(a, b) { 1098 if (b) { 1099 var c = a.firstChild; 1100 if (c && c === a.lastChild && 3 === c.nodeType) { 1101 c.nodeValue = b; 1102 return; 1103 } 1104 } 1105 a.textContent = b; 1106} 1107var pb = { 1108 animationIterationCount: true, 1109 aspectRatio: true, 1110 borderImageOutset: true, 1111 borderImageSlice: true, 1112 borderImageWidth: true, 1113 boxFlex: true, 1114 boxFlexGroup: true, 1115 boxOrdinalGroup: true, 1116 columnCount: true, 1117 columns: true, 1118 flex: true, 1119 flexGrow: true, 1120 flexPositive: true, 1121 flexShrink: true, 1122 flexNegative: true, 1123 flexOrder: true, 1124 gridArea: true, 1125 gridRow: true, 1126 gridRowEnd: true, 1127 gridRowSpan: true, 1128 gridRowStart: true, 1129 gridColumn: true, 1130 gridColumnEnd: true, 1131 gridColumnSpan: true, 1132 gridColumnStart: true, 1133 fontWeight: true, 1134 lineClamp: true, 1135 lineHeight: true, 1136 opacity: true, 1137 order: true, 1138 orphans: true, 1139 tabSize: true, 1140 widows: true, 1141 zIndex: true, 1142 zoom: true, 1143 fillOpacity: true, 1144 floodOpacity: true, 1145 stopOpacity: true, 1146 strokeDasharray: true, 1147 strokeDashoffset: true, 1148 strokeMiterlimit: true, 1149 strokeOpacity: true, 1150 strokeWidth: true 1151}, qb = ["Webkit", "ms", "Moz", "O"]; 1152Object.keys(pb).forEach(function(a) { 1153 qb.forEach(function(b) { 1154 b = b + a.charAt(0).toUpperCase() + a.substring(1); 1155 pb[b] = pb[a]; 1156 }); 1157}); 1158function rb(a, b, c) { 1159 return null == b || "boolean" === typeof b || "" === b ? "" : c || "number" !== typeof b || 0 === b || pb.hasOwnProperty(a) && pb[a] ? ("" + b).trim() : b + "px"; 1160} 1161function sb(a, b) { 1162 a = a.style; 1163 for (var c in b) if (b.hasOwnProperty(c)) { 1164 var d = 0 === c.indexOf("--"), e = rb(c, b[c], d); 1165 "float" === c && (c = "cssFloat"); 1166 d ? a.setProperty(c, e) : a[c] = e; 1167 } 1168} 1169var tb = A({ menuitem: true }, { area: true, base: true, br: true, col: true, embed: true, hr: true, img: true, input: true, keygen: true, link: true, meta: true, param: true, source: true, track: true, wbr: true }); 1170function ub(a, b) { 1171 if (b) { 1172 if (tb[a] && (null != b.children || null != b.dangerouslySetInnerHTML)) throw Error(p(137, a)); 1173 if (null != b.dangerouslySetInnerHTML) { 1174 if (null != b.children) throw Error(p(60)); 1175 if ("object" !== typeof b.dangerouslySetInnerHTML || !("__html" in b.dangerouslySetInnerHTML)) throw Error(p(61)); 1176 } 1177 if (null != b.style && "object" !== typeof b.style) throw Error(p(62)); 1178 } 1179} 1180function vb(a, b) { 1181 if (-1 === a.indexOf("-")) return "string" === typeof b.is; 1182 switch (a) { 1183 case "annotation-xml": 1184 case "color-profile": 1185 case "font-face": 1186 case "font-face-src": 1187 case "font-face-uri": 1188 case "font-face-format": 1189 case "font-face-name": 1190 case "missing-glyph": 1191 return false; 1192 default: 1193 return true; 1194 } 1195} 1196var wb = null; 1197function xb(a) { 1198 a = a.target || a.srcElement || window; 1199 a.correspondingUseElement && (a = a.correspondingUseElement); 1200 return 3 === a.nodeType ? a.parentNode : a; 1201} 1202var yb = null, zb = null, Ab = null; 1203function Bb(a) { 1204 if (a = Cb(a)) { 1205 if ("function" !== typeof yb) throw Error(p(280)); 1206 var b = a.stateNode; 1207 b && (b = Db(b), yb(a.stateNode, a.type, b)); 1208 } 1209} 1210function Eb(a) { 1211 zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a; 1212} 1213function Fb() { 1214 if (zb) { 1215 var a = zb, b = Ab; 1216 Ab = zb = null; 1217 Bb(a); 1218 if (b) for (a = 0; a < b.length; a++) Bb(b[a]); 1219 } 1220} 1221function Gb(a, b) { 1222 return a(b); 1223} 1224function Hb() { 1225} 1226var Ib = false; 1227function Jb(a, b, c) { 1228 if (Ib) return a(b, c); 1229 Ib = true; 1230 try { 1231 return Gb(a, b, c); 1232 } finally { 1233 if (Ib = false, null !== zb || null !== Ab) Hb(), Fb(); 1234 } 1235} 1236function Kb(a, b) { 1237 var c = a.stateNode; 1238 if (null === c) return null; 1239 var d = Db(c); 1240 if (null === d) return null; 1241 c = d[b]; 1242 a: switch (b) { 1243 case "onClick": 1244 case "onClickCapture": 1245 case "onDoubleClick": 1246 case "onDoubleClickCapture": 1247 case "onMouseDown": 1248 case "onMouseDownCapture": 1249 case "onMouseMove": 1250 case "onMouseMoveCapture": 1251 case "onMouseUp": 1252 case "onMouseUpCapture": 1253 case "onMouseEnter": 1254 (d = !d.disabled) || (a = a.type, d = !("button" === a || "input" === a || "select" === a || "textarea" === a)); 1255 a = !d; 1256 break a; 1257 default: 1258 a = false; 1259 } 1260 if (a) return null; 1261 if (c && "function" !== typeof c) throw Error(p(231, b, typeof c)); 1262 return c; 1263} 1264var Lb = false; 1265if (ia) try { 1266 var Mb = {}; 1267 Object.defineProperty(Mb, "passive", { get: function() { 1268 Lb = true; 1269 } }); 1270 window.addEventListener("test", Mb, Mb); 1271 window.removeEventListener("test", Mb, Mb); 1272} catch (a) { 1273 Lb = false; 1274} 1275function Nb(a, b, c, d, e, f2, g, h, k2) { 1276 var l2 = Array.prototype.slice.call(arguments, 3); 1277 try { 1278 b.apply(c, l2); 1279 } catch (m2) { 1280 this.onError(m2); 1281 } 1282} 1283var Ob = false, Pb = null, Qb = false, Rb = null, Sb = { onError: function(a) { 1284 Ob = true; 1285 Pb = a; 1286} }; 1287function Tb(a, b, c, d, e, f2, g, h, k2) { 1288 Ob = false; 1289 Pb = null; 1290 Nb.apply(Sb, arguments); 1291} 1292function Ub(a, b, c, d, e, f2, g, h, k2) { 1293 Tb.apply(this, arguments); 1294 if (Ob) { 1295 if (Ob) { 1296 var l2 = Pb; 1297 Ob = false; 1298 Pb = null; 1299 } else throw Error(p(198)); 1300 Qb || (Qb = true, Rb = l2); 1301 } 1302} 1303function Vb(a) { 1304 var b = a, c = a; 1305 if (a.alternate) for (; b.return; ) b = b.return; 1306 else { 1307 a = b; 1308 do 1309 b = a, 0 !== (b.flags & 4098) && (c = b.return), a = b.return; 1310 while (a); 1311 } 1312 return 3 === b.tag ? c : null; 1313} 1314function Wb(a) { 1315 if (13 === a.tag) { 1316 var b = a.memoizedState; 1317 null === b && (a = a.alternate, null !== a && (b = a.memoizedState)); 1318 if (null !== b) return b.dehydrated; 1319 } 1320 return null; 1321} 1322function Xb(a) { 1323 if (Vb(a) !== a) throw Error(p(188)); 1324} 1325function Yb(a) { 1326 var b = a.alternate; 1327 if (!b) { 1328 b = Vb(a); 1329 if (null === b) throw Error(p(188)); 1330 return b !== a ? null : a; 1331 } 1332 for (var c = a, d = b; ; ) { 1333 var e = c.return; 1334 if (null === e) break; 1335 var f2 = e.alternate; 1336 if (null === f2) { 1337 d = e.return; 1338 if (null !== d) { 1339 c = d; 1340 continue; 1341 } 1342 break; 1343 } 1344 if (e.child === f2.child) { 1345 for (f2 = e.child; f2; ) { 1346 if (f2 === c) return Xb(e), a; 1347 if (f2 === d) return Xb(e), b; 1348 f2 = f2.sibling; 1349 } 1350 throw Error(p(188)); 1351 } 1352 if (c.return !== d.return) c = e, d = f2; 1353 else { 1354 for (var g = false, h = e.child; h; ) { 1355 if (h === c) { 1356 g = true; 1357 c = e; 1358 d = f2; 1359 break; 1360 } 1361 if (h === d) { 1362 g = true; 1363 d = e; 1364 c = f2; 1365 break; 1366 } 1367 h = h.sibling; 1368 } 1369 if (!g) { 1370 for (h = f2.child; h; ) { 1371 if (h === c) { 1372 g = true; 1373 c = f2; 1374 d = e; 1375 break; 1376 } 1377 if (h === d) { 1378 g = true; 1379 d = f2; 1380 c = e; 1381 break; 1382 } 1383 h = h.sibling; 1384 } 1385 if (!g) throw Error(p(189)); 1386 } 1387 } 1388 if (c.alternate !== d) throw Error(p(190)); 1389 } 1390 if (3 !== c.tag) throw Error(p(188)); 1391 return c.stateNode.current === c ? a : b; 1392} 1393function Zb(a) { 1394 a = Yb(a); 1395 return null !== a ? $b(a) : null; 1396} 1397function $b(a) { 1398 if (5 === a.tag || 6 === a.tag) return a; 1399 for (a = a.child; null !== a; ) { 1400 var b = $b(a); 1401 if (null !== b) return b; 1402 a = a.sibling; 1403 } 1404 return null; 1405} 1406var ac = ca.unstable_scheduleCallback, bc = ca.unstable_cancelCallback, cc = ca.unstable_shouldYield, dc = ca.unstable_requestPaint, B = ca.unstable_now, ec = ca.unstable_getCurrentPriorityLevel, fc = ca.unstable_ImmediatePriority, gc = ca.unstable_UserBlockingPriority, hc = ca.unstable_NormalPriority, ic = ca.unstable_LowPriority, jc = ca.unstable_IdlePriority, kc = null, lc = null; 1407function mc(a) { 1408 if (lc && "function" === typeof lc.onCommitFiberRoot) try { 1409 lc.onCommitFiberRoot(kc, a, void 0, 128 === (a.current.flags & 128)); 1410 } catch (b) { 1411 } 1412} 1413var oc = Math.clz32 ? Math.clz32 : nc, pc = Math.log, qc = Math.LN2; 1414function nc(a) { 1415 a >>>= 0; 1416 return 0 === a ? 32 : 31 - (pc(a) / qc | 0) | 0; 1417} 1418var rc = 64, sc = 4194304; 1419function tc(a) { 1420 switch (a & -a) { 1421 case 1: 1422 return 1; 1423 case 2: 1424 return 2; 1425 case 4: 1426 return 4; 1427 case 8: 1428 return 8; 1429 case 16: 1430 return 16; 1431 case 32: 1432 return 32; 1433 case 64: 1434 case 128: 1435 case 256: 1436 case 512: 1437 case 1024: 1438 case 2048: 1439 case 4096: 1440 case 8192: 1441 case 16384: 1442 case 32768: 1443 case 65536: 1444 case 131072: 1445 case 262144: 1446 case 524288: 1447 case 1048576: 1448 case 2097152: 1449 return a & 4194240; 1450 case 4194304: 1451 case 8388608: 1452 case 16777216: 1453 case 33554432: 1454 case 67108864: 1455 return a & 130023424; 1456 case 134217728: 1457 return 134217728; 1458 case 268435456: 1459 return 268435456; 1460 case 536870912: 1461 return 536870912; 1462 case 1073741824: 1463 return 1073741824; 1464 default: 1465 return a; 1466 } 1467} 1468function uc(a, b) { 1469 var c = a.pendingLanes; 1470 if (0 === c) return 0; 1471 var d = 0, e = a.suspendedLanes, f2 = a.pingedLanes, g = c & 268435455; 1472 if (0 !== g) { 1473 var h = g & ~e; 1474 0 !== h ? d = tc(h) : (f2 &= g, 0 !== f2 && (d = tc(f2))); 1475 } else g = c & ~e, 0 !== g ? d = tc(g) : 0 !== f2 && (d = tc(f2)); 1476 if (0 === d) return 0; 1477 if (0 !== b && b !== d && 0 === (b & e) && (e = d & -d, f2 = b & -b, e >= f2 || 16 === e && 0 !== (f2 & 4194240))) return b; 1478 0 !== (d & 4) && (d |= c & 16); 1479 b = a.entangledLanes; 1480 if (0 !== b) for (a = a.entanglements, b &= d; 0 < b; ) c = 31 - oc(b), e = 1 << c, d |= a[c], b &= ~e; 1481 return d; 1482} 1483function vc(a, b) { 1484 switch (a) { 1485 case 1: 1486 case 2: 1487 case 4: 1488 return b + 250; 1489 case 8: 1490 case 16: 1491 case 32: 1492 case 64: 1493 case 128: 1494 case 256: 1495 case 512: 1496 case 1024: 1497 case 2048: 1498 case 4096: 1499 case 8192: 1500 case 16384: 1501 case 32768: 1502 case 65536: 1503 case 131072: 1504 case 262144: 1505 case 524288: 1506 case 1048576: 1507 case 2097152: 1508 return b + 5e3; 1509 case 4194304: 1510 case 8388608: 1511 case 16777216: 1512 case 33554432: 1513 case 67108864: 1514 return -1; 1515 case 134217728: 1516 case 268435456: 1517 case 536870912: 1518 case 1073741824: 1519 return -1; 1520 default: 1521 return -1; 1522 } 1523} 1524function wc(a, b) { 1525 for (var c = a.suspendedLanes, d = a.pingedLanes, e = a.expirationTimes, f2 = a.pendingLanes; 0 < f2; ) { 1526 var g = 31 - oc(f2), h = 1 << g, k2 = e[g]; 1527 if (-1 === k2) { 1528 if (0 === (h & c) || 0 !== (h & d)) e[g] = vc(h, b); 1529 } else k2 <= b && (a.expiredLanes |= h); 1530 f2 &= ~h; 1531 } 1532} 1533function xc(a) { 1534 a = a.pendingLanes & -1073741825; 1535 return 0 !== a ? a : a & 1073741824 ? 1073741824 : 0; 1536} 1537function yc() { 1538 var a = rc; 1539 rc <<= 1; 1540 0 === (rc & 4194240) && (rc = 64); 1541 return a; 1542} 1543function zc(a) { 1544 for (var b = [], c = 0; 31 > c; c++) b.push(a); 1545 return b; 1546} 1547function Ac(a, b, c) { 1548 a.pendingLanes |= b; 1549 536870912 !== b && (a.suspendedLanes = 0, a.pingedLanes = 0); 1550 a = a.eventTimes; 1551 b = 31 - oc(b); 1552 a[b] = c; 1553} 1554function Bc(a, b) { 1555 var c = a.pendingLanes & ~b; 1556 a.pendingLanes = b; 1557 a.suspendedLanes = 0; 1558 a.pingedLanes = 0; 1559 a.expiredLanes &= b; 1560 a.mutableReadLanes &= b; 1561 a.entangledLanes &= b; 1562 b = a.entanglements; 1563 var d = a.eventTimes; 1564 for (a = a.expirationTimes; 0 < c; ) { 1565 var e = 31 - oc(c), f2 = 1 << e; 1566 b[e] = 0; 1567 d[e] = -1; 1568 a[e] = -1; 1569 c &= ~f2; 1570 } 1571} 1572function Cc(a, b) { 1573 var c = a.entangledLanes |= b; 1574 for (a = a.entanglements; c; ) { 1575 var d = 31 - oc(c), e = 1 << d; 1576 e & b | a[d] & b && (a[d] |= b); 1577 c &= ~e; 1578 } 1579} 1580var C = 0; 1581function Dc(a) { 1582 a &= -a; 1583 return 1 < a ? 4 < a ? 0 !== (a & 268435455) ? 16 : 536870912 : 4 : 1; 1584} 1585var Ec, Fc, Gc, Hc, Ic, Jc = false, Kc = [], Lc = null, Mc = null, Nc = null, Oc = /* @__PURE__ */ new Map(), Pc = /* @__PURE__ */ new Map(), Qc = [], Rc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" "); 1586function Sc(a, b) { 1587 switch (a) { 1588 case "focusin": 1589 case "focusout": 1590 Lc = null; 1591 break; 1592 case "dragenter": 1593 case "dragleave": 1594 Mc = null; 1595 break; 1596 case "mouseover": 1597 case "mouseout": 1598 Nc = null; 1599 break; 1600 case "pointerover": 1601 case "pointerout": 1602 Oc.delete(b.pointerId); 1603 break; 1604 case "gotpointercapture": 1605 case "lostpointercapture": 1606 Pc.delete(b.pointerId); 1607 } 1608} 1609function Tc(a, b, c, d, e, f2) { 1610 if (null === a || a.nativeEvent !== f2) return a = { blockedOn: b, domEventName: c, eventSystemFlags: d, nativeEvent: f2, targetContainers: [e] }, null !== b && (b = Cb(b), null !== b && Fc(b)), a; 1611 a.eventSystemFlags |= d; 1612 b = a.targetContainers; 1613 null !== e && -1 === b.indexOf(e) && b.push(e); 1614 return a; 1615} 1616function Uc(a, b, c, d, e) { 1617 switch (b) { 1618 case "focusin": 1619 return Lc = Tc(Lc, a, b, c, d, e), true; 1620 case "dragenter": 1621 return Mc = Tc(Mc, a, b, c, d, e), true; 1622 case "mouseover": 1623 return Nc = Tc(Nc, a, b, c, d, e), true; 1624 case "pointerover": 1625 var f2 = e.pointerId; 1626 Oc.set(f2, Tc(Oc.get(f2) || null, a, b, c, d, e)); 1627 return true; 1628 case "gotpointercapture": 1629 return f2 = e.pointerId, Pc.set(f2, Tc(Pc.get(f2) || null, a, b, c, d, e)), true; 1630 } 1631 return false; 1632} 1633function Vc(a) { 1634 var b = Wc(a.target); 1635 if (null !== b) { 1636 var c = Vb(b); 1637 if (null !== c) { 1638 if (b = c.tag, 13 === b) { 1639 if (b = Wb(c), null !== b) { 1640 a.blockedOn = b; 1641 Ic(a.priority, function() { 1642 Gc(c); 1643 }); 1644 return; 1645 } 1646 } else if (3 === b && c.stateNode.current.memoizedState.isDehydrated) { 1647 a.blockedOn = 3 === c.tag ? c.stateNode.containerInfo : null; 1648 return; 1649 } 1650 } 1651 } 1652 a.blockedOn = null; 1653} 1654function Xc(a) { 1655 if (null !== a.blockedOn) return false; 1656 for (var b = a.targetContainers; 0 < b.length; ) { 1657 var c = Yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent); 1658 if (null === c) { 1659 c = a.nativeEvent; 1660 var d = new c.constructor(c.type, c); 1661 wb = d; 1662 c.target.dispatchEvent(d); 1663 wb = null; 1664 } else return b = Cb(c), null !== b && Fc(b), a.blockedOn = c, false; 1665 b.shift(); 1666 } 1667 return true; 1668} 1669function Zc(a, b, c) { 1670 Xc(a) && c.delete(b); 1671} 1672function $c() { 1673 Jc = false; 1674 null !== Lc && Xc(Lc) && (Lc = null); 1675 null !== Mc && Xc(Mc) && (Mc = null); 1676 null !== Nc && Xc(Nc) && (Nc = null); 1677 Oc.forEach(Zc); 1678 Pc.forEach(Zc); 1679} 1680function ad(a, b) { 1681 a.blockedOn === b && (a.blockedOn = null, Jc || (Jc = true, ca.unstable_scheduleCallback(ca.unstable_NormalPriority, $c))); 1682} 1683function bd(a) { 1684 function b(b2) { 1685 return ad(b2, a); 1686 } 1687 if (0 < Kc.length) { 1688 ad(Kc[0], a); 1689 for (var c = 1; c < Kc.length; c++) { 1690 var d = Kc[c]; 1691 d.blockedOn === a && (d.blockedOn = null); 1692 } 1693 } 1694 null !== Lc && ad(Lc, a); 1695 null !== Mc && ad(Mc, a); 1696 null !== Nc && ad(Nc, a); 1697 Oc.forEach(b); 1698 Pc.forEach(b); 1699 for (c = 0; c < Qc.length; c++) d = Qc[c], d.blockedOn === a && (d.blockedOn = null); 1700 for (; 0 < Qc.length && (c = Qc[0], null === c.blockedOn); ) Vc(c), null === c.blockedOn && Qc.shift(); 1701} 1702var cd = ua.ReactCurrentBatchConfig, dd = true; 1703function ed(a, b, c, d) { 1704 var e = C, f2 = cd.transition; 1705 cd.transition = null; 1706 try { 1707 C = 1, fd(a, b, c, d); 1708 } finally { 1709 C = e, cd.transition = f2; 1710 } 1711} 1712function gd(a, b, c, d) { 1713 var e = C, f2 = cd.transition; 1714 cd.transition = null; 1715 try { 1716 C = 4, fd(a, b, c, d); 1717 } finally { 1718 C = e, cd.transition = f2; 1719 } 1720} 1721function fd(a, b, c, d) { 1722 if (dd) { 1723 var e = Yc(a, b, c, d); 1724 if (null === e) hd(a, b, d, id, c), Sc(a, d); 1725 else if (Uc(e, a, b, c, d)) d.stopPropagation(); 1726 else if (Sc(a, d), b & 4 && -1 < Rc.indexOf(a)) { 1727 for (; null !== e; ) { 1728 var f2 = Cb(e); 1729 null !== f2 && Ec(f2); 1730 f2 = Yc(a, b, c, d); 1731 null === f2 && hd(a, b, d, id, c); 1732 if (f2 === e) break; 1733 e = f2; 1734 } 1735 null !== e && d.stopPropagation(); 1736 } else hd(a, b, d, null, c); 1737 } 1738} 1739var id = null; 1740function Yc(a, b, c, d) { 1741 id = null; 1742 a = xb(d); 1743 a = Wc(a); 1744 if (null !== a) if (b = Vb(a), null === b) a = null; 1745 else if (c = b.tag, 13 === c) { 1746 a = Wb(b); 1747 if (null !== a) return a; 1748 a = null; 1749 } else if (3 === c) { 1750 if (b.stateNode.current.memoizedState.isDehydrated) return 3 === b.tag ? b.stateNode.containerInfo : null; 1751 a = null; 1752 } else b !== a && (a = null); 1753 id = a; 1754 return null; 1755} 1756function jd(a) { 1757 switch (a) { 1758 case "cancel": 1759 case "click": 1760 case "close": 1761 case "contextmenu": 1762 case "copy": 1763 case "cut": 1764 case "auxclick": 1765 case "dblclick": 1766 case "dragend": 1767 case "dragstart": 1768 case "drop": 1769 case "focusin": 1770 case "focusout": 1771 case "input": 1772 case "invalid": 1773 case "keydown": 1774 case "keypress": 1775 case "keyup": 1776 case "mousedown": 1777 case "mouseup": 1778 case "paste": 1779 case "pause": 1780 case "play": 1781 case "pointercancel": 1782 case "pointerdown": 1783 case "pointerup": 1784 case "ratechange": 1785 case "reset": 1786 case "resize": 1787 case "seeked": 1788 case "submit": 1789 case "touchcancel": 1790 case "touchend": 1791 case "touchstart": 1792 case "volumechange": 1793 case "change": 1794 case "selectionchange": 1795 case "textInput": 1796 case "compositionstart": 1797 case "compositionend": 1798 case "compositionupdate": 1799 case "beforeblur": 1800 case "afterblur": 1801 case "beforeinput": 1802 case "blur": 1803 case "fullscreenchange": 1804 case "focus": 1805 case "hashchange": 1806 case "popstate": 1807 case "select": 1808 case "selectstart": 1809 return 1; 1810 case "drag": 1811 case "dragenter": 1812 case "dragexit": 1813 case "dragleave": 1814 case "dragover": 1815 case "mousemove": 1816 case "mouseout": 1817 case "mouseover": 1818 case "pointermove": 1819 case "pointerout": 1820 case "pointerover": 1821 case "scroll": 1822 case "toggle": 1823 case "touchmove": 1824 case "wheel": 1825 case "mouseenter": 1826 case "mouseleave": 1827 case "pointerenter": 1828 case "pointerleave": 1829 return 4; 1830 case "message": 1831 switch (ec()) { 1832 case fc: 1833 return 1; 1834 case gc: 1835 return 4; 1836 case hc: 1837 case ic: 1838 return 16; 1839 case jc: 1840 return 536870912; 1841 default: 1842 return 16; 1843 } 1844 default: 1845 return 16; 1846 } 1847} 1848var kd = null, ld = null, md = null; 1849function nd() { 1850 if (md) return md; 1851 var a, b = ld, c = b.length, d, e = "value" in kd ? kd.value : kd.textContent, f2 = e.length; 1852 for (a = 0; a < c && b[a] === e[a]; a++) ; 1853 var g = c - a; 1854 for (d = 1; d <= g && b[c - d] === e[f2 - d]; d++) ; 1855 return md = e.slice(a, 1 < d ? 1 - d : void 0); 1856} 1857function od(a) { 1858 var b = a.keyCode; 1859 "charCode" in a ? (a = a.charCode, 0 === a && 13 === b && (a = 13)) : a = b; 1860 10 === a && (a = 13); 1861 return 32 <= a || 13 === a ? a : 0; 1862} 1863function pd() { 1864 return true; 1865} 1866function qd() { 1867 return false; 1868} 1869function rd(a) { 1870 function b(b2, d, e, f2, g) { 1871 this._reactName = b2; 1872 this._targetInst = e; 1873 this.type = d; 1874 this.nativeEvent = f2; 1875 this.target = g; 1876 this.currentTarget = null; 1877 for (var c in a) a.hasOwnProperty(c) && (b2 = a[c], this[c] = b2 ? b2(f2) : f2[c]); 1878 this.isDefaultPrevented = (null != f2.defaultPrevented ? f2.defaultPrevented : false === f2.returnValue) ? pd : qd; 1879 this.isPropagationStopped = qd; 1880 return this; 1881 } 1882 A(b.prototype, { preventDefault: function() { 1883 this.defaultPrevented = true; 1884 var a2 = this.nativeEvent; 1885 a2 && (a2.preventDefault ? a2.preventDefault() : "unknown" !== typeof a2.returnValue && (a2.returnValue = false), this.isDefaultPrevented = pd); 1886 }, stopPropagation: function() { 1887 var a2 = this.nativeEvent; 1888 a2 && (a2.stopPropagation ? a2.stopPropagation() : "unknown" !== typeof a2.cancelBubble && (a2.cancelBubble = true), this.isPropagationStopped = pd); 1889 }, persist: function() { 1890 }, isPersistent: pd }); 1891 return b; 1892} 1893var sd = { eventPhase: 0, bubbles: 0, cancelable: 0, timeStamp: function(a) { 1894 return a.timeStamp || Date.now(); 1895}, defaultPrevented: 0, isTrusted: 0 }, td = rd(sd), ud = A({}, sd, { view: 0, detail: 0 }), vd = rd(ud), wd, xd, yd, Ad = A({}, ud, { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, getModifierState: zd, button: 0, buttons: 0, relatedTarget: function(a) { 1896 return void 0 === a.relatedTarget ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget; 1897}, movementX: function(a) { 1898 if ("movementX" in a) return a.movementX; 1899 a !== yd && (yd && "mousemove" === a.type ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a); 1900 return wd; 1901}, movementY: function(a) { 1902 return "movementY" in a ? a.movementY : xd; 1903} }), Bd = rd(Ad), Cd = A({}, Ad, { dataTransfer: 0 }), Dd = rd(Cd), Ed = A({}, ud, { relatedTarget: 0 }), Fd = rd(Ed), Gd = A({}, sd, { animationName: 0, elapsedTime: 0, pseudoElement: 0 }), Hd = rd(Gd), Id = A({}, sd, { clipboardData: function(a) { 1904 return "clipboardData" in a ? a.clipboardData : window.clipboardData; 1905} }), Jd = rd(Id), Kd = A({}, sd, { data: 0 }), Ld = rd(Kd), Md = { 1906 Esc: "Escape", 1907 Spacebar: " ", 1908 Left: "ArrowLeft", 1909 Up: "ArrowUp", 1910 Right: "ArrowRight", 1911 Down: "ArrowDown", 1912 Del: "Delete", 1913 Win: "OS", 1914 Menu: "ContextMenu", 1915 Apps: "ContextMenu", 1916 Scroll: "ScrollLock", 1917 MozPrintableKey: "Unidentified" 1918}, Nd = { 1919 8: "Backspace", 1920 9: "Tab", 1921 12: "Clear", 1922 13: "Enter", 1923 16: "Shift", 1924 17: "Control", 1925 18: "Alt", 1926 19: "Pause", 1927 20: "CapsLock", 1928 27: "Escape", 1929 32: " ", 1930 33: "PageUp", 1931 34: "PageDown", 1932 35: "End", 1933 36: "Home", 1934 37: "ArrowLeft", 1935 38: "ArrowUp", 1936 39: "ArrowRight", 1937 40: "ArrowDown", 1938 45: "Insert", 1939 46: "Delete", 1940 112: "F1", 1941 113: "F2", 1942 114: "F3", 1943 115: "F4", 1944 116: "F5", 1945 117: "F6", 1946 118: "F7", 1947 119: "F8", 1948 120: "F9", 1949 121: "F10", 1950 122: "F11", 1951 123: "F12", 1952 144: "NumLock", 1953 145: "ScrollLock", 1954 224: "Meta" 1955}, Od = { Alt: "altKey", Control: "ctrlKey", Meta: "metaKey", Shift: "shiftKey" }; 1956function Pd(a) { 1957 var b = this.nativeEvent; 1958 return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : false; 1959} 1960function zd() { 1961 return Pd; 1962} 1963var Qd = A({}, ud, { key: function(a) { 1964 if (a.key) { 1965 var b = Md[a.key] || a.key; 1966 if ("Unidentified" !== b) return b; 1967 } 1968 return "keypress" === a.type ? (a = od(a), 13 === a ? "Enter" : String.fromCharCode(a)) : "keydown" === a.type || "keyup" === a.type ? Nd[a.keyCode] || "Unidentified" : ""; 1969}, code: 0, location: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, repeat: 0, locale: 0, getModifierState: zd, charCode: function(a) { 1970 return "keypress" === a.type ? od(a) : 0; 1971}, keyCode: function(a) { 1972 return "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0; 1973}, which: function(a) { 1974 return "keypress" === a.type ? od(a) : "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0; 1975} }), Rd = rd(Qd), Sd = A({}, Ad, { pointerId: 0, width: 0, height: 0, pressure: 0, tangentialPressure: 0, tiltX: 0, tiltY: 0, twist: 0, pointerType: 0, isPrimary: 0 }), Td = rd(Sd), Ud = A({}, ud, { touches: 0, targetTouches: 0, changedTouches: 0, altKey: 0, metaKey: 0, ctrlKey: 0, shiftKey: 0, getModifierState: zd }), Vd = rd(Ud), Wd = A({}, sd, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 }), Xd = rd(Wd), Yd = A({}, Ad, { 1976 deltaX: function(a) { 1977 return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0; 1978 }, 1979 deltaY: function(a) { 1980 return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0; 1981 }, 1982 deltaZ: 0, 1983 deltaMode: 0 1984}), Zd = rd(Yd), $d = [9, 13, 27, 32], ae = ia && "CompositionEvent" in window, be = null; 1985ia && "documentMode" in document && (be = document.documentMode); 1986var ce = ia && "TextEvent" in window && !be, de = ia && (!ae || be && 8 < be && 11 >= be), ee = String.fromCharCode(32), fe = false; 1987function ge(a, b) { 1988 switch (a) { 1989 case "keyup": 1990 return -1 !== $d.indexOf(b.keyCode); 1991 case "keydown": 1992 return 229 !== b.keyCode; 1993 case "keypress": 1994 case "mousedown": 1995 case "focusout": 1996 return true; 1997 default: 1998 return false; 1999 } 2000} 2001function he(a) { 2002 a = a.detail; 2003 return "object" === typeof a && "data" in a ? a.data : null; 2004} 2005var ie = false; 2006function je(a, b) { 2007 switch (a) { 2008 case "compositionend": 2009 return he(b); 2010 case "keypress": 2011 if (32 !== b.which) return null; 2012 fe = true; 2013 return ee; 2014 case "textInput": 2015 return a = b.data, a === ee && fe ? null : a; 2016 default: 2017 return null; 2018 } 2019} 2020function ke(a, b) { 2021 if (ie) return "compositionend" === a || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = false, a) : null; 2022 switch (a) { 2023 case "paste": 2024 return null; 2025 case "keypress": 2026 if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) { 2027 if (b.char && 1 < b.char.length) return b.char; 2028 if (b.which) return String.fromCharCode(b.which); 2029 } 2030 return null; 2031 case "compositionend": 2032 return de && "ko" !== b.locale ? null : b.data; 2033 default: 2034 return null; 2035 } 2036} 2037var le = { color: true, date: true, datetime: true, "datetime-local": true, email: true, month: true, number: true, password: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true }; 2038function me(a) { 2039 var b = a && a.nodeName && a.nodeName.toLowerCase(); 2040 return "input" === b ? !!le[a.type] : "textarea" === b ? true : false; 2041} 2042function ne(a, b, c, d) { 2043 Eb(d); 2044 b = oe(b, "onChange"); 2045 0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({ event: c, listeners: b })); 2046} 2047var pe = null, qe = null; 2048function re(a) { 2049 se(a, 0); 2050} 2051function te(a) { 2052 var b = ue(a); 2053 if (Wa(b)) return a; 2054} 2055function ve(a, b) { 2056 if ("change" === a) return b; 2057} 2058var we = false; 2059if (ia) { 2060 var xe; 2061 if (ia) { 2062 var ye = "oninput" in document; 2063 if (!ye) { 2064 var ze = document.createElement("div"); 2065 ze.setAttribute("oninput", "return;"); 2066 ye = "function" === typeof ze.oninput; 2067 } 2068 xe = ye; 2069 } else xe = false; 2070 we = xe && (!document.documentMode || 9 < document.documentMode); 2071} 2072function Ae() { 2073 pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null); 2074} 2075function Be(a) { 2076 if ("value" === a.propertyName && te(qe)) { 2077 var b = []; 2078 ne(b, qe, a, xb(a)); 2079 Jb(re, b); 2080 } 2081} 2082function Ce(a, b, c) { 2083 "focusin" === a ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : "focusout" === a && Ae(); 2084} 2085function De(a) { 2086 if ("selectionchange" === a || "keyup" === a || "keydown" === a) return te(qe); 2087} 2088function Ee(a, b) { 2089 if ("click" === a) return te(b); 2090} 2091function Fe(a, b) { 2092 if ("input" === a || "change" === a) return te(b); 2093} 2094function Ge(a, b) { 2095 return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b; 2096} 2097var He = "function" === typeof Object.is ? Object.is : Ge; 2098function Ie(a, b) { 2099 if (He(a, b)) return true; 2100 if ("object" !== typeof a || null === a || "object" !== typeof b || null === b) return false; 2101 var c = Object.keys(a), d = Object.keys(b); 2102 if (c.length !== d.length) return false; 2103 for (d = 0; d < c.length; d++) { 2104 var e = c[d]; 2105 if (!ja.call(b, e) || !He(a[e], b[e])) return false; 2106 } 2107 return true; 2108} 2109function Je(a) { 2110 for (; a && a.firstChild; ) a = a.firstChild; 2111 return a; 2112} 2113function Ke(a, b) { 2114 var c = Je(a); 2115 a = 0; 2116 for (var d; c; ) { 2117 if (3 === c.nodeType) { 2118 d = a + c.textContent.length; 2119 if (a <= b && d >= b) return { node: c, offset: b - a }; 2120 a = d; 2121 } 2122 a: { 2123 for (; c; ) { 2124 if (c.nextSibling) { 2125 c = c.nextSibling; 2126 break a; 2127 } 2128 c = c.parentNode; 2129 } 2130 c = void 0; 2131 } 2132 c = Je(c); 2133 } 2134} 2135function Le(a, b) { 2136 return a && b ? a === b ? true : a && 3 === a.nodeType ? false : b && 3 === b.nodeType ? Le(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : false : false; 2137} 2138function Me() { 2139 for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement; ) { 2140 try { 2141 var c = "string" === typeof b.contentWindow.location.href; 2142 } catch (d) { 2143 c = false; 2144 } 2145 if (c) a = b.contentWindow; 2146 else break; 2147 b = Xa(a.document); 2148 } 2149 return b; 2150} 2151function Ne(a) { 2152 var b = a && a.nodeName && a.nodeName.toLowerCase(); 2153 return b && ("input" === b && ("text" === a.type || "search" === a.type || "tel" === a.type || "url" === a.type || "password" === a.type) || "textarea" === b || "true" === a.contentEditable); 2154} 2155function Oe(a) { 2156 var b = Me(), c = a.focusedElem, d = a.selectionRange; 2157 if (b !== c && c && c.ownerDocument && Le(c.ownerDocument.documentElement, c)) { 2158 if (null !== d && Ne(c)) { 2159 if (b = d.start, a = d.end, void 0 === a && (a = b), "selectionStart" in c) c.selectionStart = b, c.selectionEnd = Math.min(a, c.value.length); 2160 else if (a = (b = c.ownerDocument || document) && b.defaultView || window, a.getSelection) { 2161 a = a.getSelection(); 2162 var e = c.textContent.length, f2 = Math.min(d.start, e); 2163 d = void 0 === d.end ? f2 : Math.min(d.end, e); 2164 !a.extend && f2 > d && (e = d, d = f2, f2 = e); 2165 e = Ke(c, f2); 2166 var g = Ke( 2167 c, 2168 d 2169 ); 2170 e && g && (1 !== a.rangeCount || a.anchorNode !== e.node || a.anchorOffset !== e.offset || a.focusNode !== g.node || a.focusOffset !== g.offset) && (b = b.createRange(), b.setStart(e.node, e.offset), a.removeAllRanges(), f2 > d ? (a.addRange(b), a.extend(g.node, g.offset)) : (b.setEnd(g.node, g.offset), a.addRange(b))); 2171 } 2172 } 2173 b = []; 2174 for (a = c; a = a.parentNode; ) 1 === a.nodeType && b.push({ element: a, left: a.scrollLeft, top: a.scrollTop }); 2175 "function" === typeof c.focus && c.focus(); 2176 for (c = 0; c < b.length; c++) a = b[c], a.element.scrollLeft = a.left, a.element.scrollTop = a.top; 2177 } 2178} 2179var Pe = ia && "documentMode" in document && 11 >= document.documentMode, Qe = null, Re = null, Se = null, Te = false; 2180function Ue(a, b, c) { 2181 var d = c.window === c ? c.document : 9 === c.nodeType ? c : c.ownerDocument; 2182 Te || null == Qe || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Ne(d) ? d = { start: d.selectionStart, end: d.selectionEnd } : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = { anchorNode: d.anchorNode, anchorOffset: d.anchorOffset, focusNode: d.focusNode, focusOffset: d.focusOffset }), Se && Ie(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({ event: b, listeners: d }), b.target = Qe))); 2183} 2184function Ve(a, b) { 2185 var c = {}; 2186 c[a.toLowerCase()] = b.toLowerCase(); 2187 c["Webkit" + a] = "webkit" + b; 2188 c["Moz" + a] = "moz" + b; 2189 return c; 2190} 2191var We = { animationend: Ve("Animation", "AnimationEnd"), animationiteration: Ve("Animation", "AnimationIteration"), animationstart: Ve("Animation", "AnimationStart"), transitionend: Ve("Transition", "TransitionEnd") }, Xe = {}, Ye = {}; 2192ia && (Ye = document.createElement("div").style, "AnimationEvent" in window || (delete We.animationend.animation, delete We.animationiteration.animation, delete We.animationstart.animation), "TransitionEvent" in window || delete We.transitionend.transition); 2193function Ze(a) { 2194 if (Xe[a]) return Xe[a]; 2195 if (!We[a]) return a; 2196 var b = We[a], c; 2197 for (c in b) if (b.hasOwnProperty(c) && c in Ye) return Xe[a] = b[c]; 2198 return a; 2199} 2200var $e = Ze("animationend"), af = Ze("animationiteration"), bf = Ze("animationstart"), cf = Ze("transitionend"), df = /* @__PURE__ */ new Map(), ef = "abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" "); 2201function ff(a, b) { 2202 df.set(a, b); 2203 fa(b, [a]); 2204} 2205for (var gf = 0; gf < ef.length; gf++) { 2206 var hf = ef[gf], jf = hf.toLowerCase(), kf = hf[0].toUpperCase() + hf.slice(1); 2207 ff(jf, "on" + kf); 2208} 2209ff($e, "onAnimationEnd"); 2210ff(af, "onAnimationIteration"); 2211ff(bf, "onAnimationStart"); 2212ff("dblclick", "onDoubleClick"); 2213ff("focusin", "onFocus"); 2214ff("focusout", "onBlur"); 2215ff(cf, "onTransitionEnd"); 2216ha("onMouseEnter", ["mouseout", "mouseover"]); 2217ha("onMouseLeave", ["mouseout", "mouseover"]); 2218ha("onPointerEnter", ["pointerout", "pointerover"]); 2219ha("onPointerLeave", ["pointerout", "pointerover"]); 2220fa("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" ")); 2221fa("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")); 2222fa("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]); 2223fa("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" ")); 2224fa("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" ")); 2225fa("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" ")); 2226var lf = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), mf = new Set("cancel close invalid load scroll toggle".split(" ").concat(lf)); 2227function nf(a, b, c) { 2228 var d = a.type || "unknown-event"; 2229 a.currentTarget = c; 2230 Ub(d, b, void 0, a); 2231 a.currentTarget = null; 2232} 2233function se(a, b) { 2234 b = 0 !== (b & 4); 2235 for (var c = 0; c < a.length; c++) { 2236 var d = a[c], e = d.event; 2237 d = d.listeners; 2238 a: { 2239 var f2 = void 0; 2240 if (b) for (var g = d.length - 1; 0 <= g; g--) { 2241 var h = d[g], k2 = h.instance, l2 = h.currentTarget; 2242 h = h.listener; 2243 if (k2 !== f2 && e.isPropagationStopped()) break a; 2244 nf(e, h, l2); 2245 f2 = k2; 2246 } 2247 else for (g = 0; g < d.length; g++) { 2248 h = d[g]; 2249 k2 = h.instance; 2250 l2 = h.currentTarget; 2251 h = h.listener; 2252 if (k2 !== f2 && e.isPropagationStopped()) break a; 2253 nf(e, h, l2); 2254 f2 = k2; 2255 } 2256 } 2257 } 2258 if (Qb) throw a = Rb, Qb = false, Rb = null, a; 2259} 2260function D(a, b) { 2261 var c = b[of]; 2262 void 0 === c && (c = b[of] = /* @__PURE__ */ new Set()); 2263 var d = a + "__bubble"; 2264 c.has(d) || (pf(b, a, 2, false), c.add(d)); 2265} 2266function qf(a, b, c) { 2267 var d = 0; 2268 b && (d |= 4); 2269 pf(c, a, d, b); 2270} 2271var rf = "_reactListening" + Math.random().toString(36).slice(2); 2272function sf(a) { 2273 if (!a[rf]) { 2274 a[rf] = true; 2275 da.forEach(function(b2) { 2276 "selectionchange" !== b2 && (mf.has(b2) || qf(b2, false, a), qf(b2, true, a)); 2277 }); 2278 var b = 9 === a.nodeType ? a : a.ownerDocument; 2279 null === b || b[rf] || (b[rf] = true, qf("selectionchange", false, b)); 2280 } 2281} 2282function pf(a, b, c, d) { 2283 switch (jd(b)) { 2284 case 1: 2285 var e = ed; 2286 break; 2287 case 4: 2288 e = gd; 2289 break; 2290 default: 2291 e = fd; 2292 } 2293 c = e.bind(null, b, c, a); 2294 e = void 0; 2295 !Lb || "touchstart" !== b && "touchmove" !== b && "wheel" !== b || (e = true); 2296 d ? void 0 !== e ? a.addEventListener(b, c, { capture: true, passive: e }) : a.addEventListener(b, c, true) : void 0 !== e ? a.addEventListener(b, c, { passive: e }) : a.addEventListener(b, c, false); 2297} 2298function hd(a, b, c, d, e) { 2299 var f2 = d; 2300 if (0 === (b & 1) && 0 === (b & 2) && null !== d) a: for (; ; ) { 2301 if (null === d) return; 2302 var g = d.tag; 2303 if (3 === g || 4 === g) { 2304 var h = d.stateNode.containerInfo; 2305 if (h === e || 8 === h.nodeType && h.parentNode === e) break; 2306 if (4 === g) for (g = d.return; null !== g; ) { 2307 var k2 = g.tag; 2308 if (3 === k2 || 4 === k2) { 2309 if (k2 = g.stateNode.containerInfo, k2 === e || 8 === k2.nodeType && k2.parentNode === e) return; 2310 } 2311 g = g.return; 2312 } 2313 for (; null !== h; ) { 2314 g = Wc(h); 2315 if (null === g) return; 2316 k2 = g.tag; 2317 if (5 === k2 || 6 === k2) { 2318 d = f2 = g; 2319 continue a; 2320 } 2321 h = h.parentNode; 2322 } 2323 } 2324 d = d.return; 2325 } 2326 Jb(function() { 2327 var d2 = f2, e2 = xb(c), g2 = []; 2328 a: { 2329 var h2 = df.get(a); 2330 if (void 0 !== h2) { 2331 var k3 = td, n2 = a; 2332 switch (a) { 2333 case "keypress": 2334 if (0 === od(c)) break a; 2335 case "keydown": 2336 case "keyup": 2337 k3 = Rd; 2338 break; 2339 case "focusin": 2340 n2 = "focus"; 2341 k3 = Fd; 2342 break; 2343 case "focusout": 2344 n2 = "blur"; 2345 k3 = Fd; 2346 break; 2347 case "beforeblur": 2348 case "afterblur": 2349 k3 = Fd; 2350 break; 2351 case "click": 2352 if (2 === c.button) break a; 2353 case "auxclick": 2354 case "dblclick": 2355 case "mousedown": 2356 case "mousemove": 2357 case "mouseup": 2358 case "mouseout": 2359 case "mouseover": 2360 case "contextmenu": 2361 k3 = Bd; 2362 break; 2363 case "drag": 2364 case "dragend": 2365 case "dragenter": 2366 case "dragexit": 2367 case "dragleave": 2368 case "dragover": 2369 case "dragstart": 2370 case "drop": 2371 k3 = Dd; 2372 break; 2373 case "touchcancel": 2374 case "touchend": 2375 case "touchmove": 2376 case "touchstart": 2377 k3 = Vd; 2378 break; 2379 case $e: 2380 case af: 2381 case bf: 2382 k3 = Hd; 2383 break; 2384 case cf: 2385 k3 = Xd; 2386 break; 2387 case "scroll": 2388 k3 = vd; 2389 break; 2390 case "wheel": 2391 k3 = Zd; 2392 break; 2393 case "copy": 2394 case "cut": 2395 case "paste": 2396 k3 = Jd; 2397 break; 2398 case "gotpointercapture": 2399 case "lostpointercapture": 2400 case "pointercancel": 2401 case "pointerdown": 2402 case "pointermove": 2403 case "pointerout": 2404 case "pointerover": 2405 case "pointerup": 2406 k3 = Td; 2407 } 2408 var t2 = 0 !== (b & 4), J2 = !t2 && "scroll" === a, x2 = t2 ? null !== h2 ? h2 + "Capture" : null : h2; 2409 t2 = []; 2410 for (var w2 = d2, u2; null !== w2; ) { 2411 u2 = w2; 2412 var F2 = u2.stateNode; 2413 5 === u2.tag && null !== F2 && (u2 = F2, null !== x2 && (F2 = Kb(w2, x2), null != F2 && t2.push(tf(w2, F2, u2)))); 2414 if (J2) break; 2415 w2 = w2.return; 2416 } 2417 0 < t2.length && (h2 = new k3(h2, n2, null, c, e2), g2.push({ event: h2, listeners: t2 })); 2418 } 2419 } 2420 if (0 === (b & 7)) { 2421 a: { 2422 h2 = "mouseover" === a || "pointerover" === a; 2423 k3 = "mouseout" === a || "pointerout" === a; 2424 if (h2 && c !== wb && (n2 = c.relatedTarget || c.fromElement) && (Wc(n2) || n2[uf])) break a; 2425 if (k3 || h2) { 2426 h2 = e2.window === e2 ? e2 : (h2 = e2.ownerDocument) ? h2.defaultView || h2.parentWindow : window; 2427 if (k3) { 2428 if (n2 = c.relatedTarget || c.toElement, k3 = d2, n2 = n2 ? Wc(n2) : null, null !== n2 && (J2 = Vb(n2), n2 !== J2 || 5 !== n2.tag && 6 !== n2.tag)) n2 = null; 2429 } else k3 = null, n2 = d2; 2430 if (k3 !== n2) { 2431 t2 = Bd; 2432 F2 = "onMouseLeave"; 2433 x2 = "onMouseEnter"; 2434 w2 = "mouse"; 2435 if ("pointerout" === a || "pointerover" === a) t2 = Td, F2 = "onPointerLeave", x2 = "onPointerEnter", w2 = "pointer"; 2436 J2 = null == k3 ? h2 : ue(k3); 2437 u2 = null == n2 ? h2 : ue(n2); 2438 h2 = new t2(F2, w2 + "leave", k3, c, e2); 2439 h2.target = J2; 2440 h2.relatedTarget = u2; 2441 F2 = null; 2442 Wc(e2) === d2 && (t2 = new t2(x2, w2 + "enter", n2, c, e2), t2.target = u2, t2.relatedTarget = J2, F2 = t2); 2443 J2 = F2; 2444 if (k3 && n2) b: { 2445 t2 = k3; 2446 x2 = n2; 2447 w2 = 0; 2448 for (u2 = t2; u2; u2 = vf(u2)) w2++; 2449 u2 = 0; 2450 for (F2 = x2; F2; F2 = vf(F2)) u2++; 2451 for (; 0 < w2 - u2; ) t2 = vf(t2), w2--; 2452 for (; 0 < u2 - w2; ) x2 = vf(x2), u2--; 2453 for (; w2--; ) { 2454 if (t2 === x2 || null !== x2 && t2 === x2.alternate) break b; 2455 t2 = vf(t2); 2456 x2 = vf(x2); 2457 } 2458 t2 = null; 2459 } 2460 else t2 = null; 2461 null !== k3 && wf(g2, h2, k3, t2, false); 2462 null !== n2 && null !== J2 && wf(g2, J2, n2, t2, true); 2463 } 2464 } 2465 } 2466 a: { 2467 h2 = d2 ? ue(d2) : window; 2468 k3 = h2.nodeName && h2.nodeName.toLowerCase(); 2469 if ("select" === k3 || "input" === k3 && "file" === h2.type) var na = ve; 2470 else if (me(h2)) if (we) na = Fe; 2471 else { 2472 na = De; 2473 var xa = Ce; 2474 } 2475 else (k3 = h2.nodeName) && "input" === k3.toLowerCase() && ("checkbox" === h2.type || "radio" === h2.type) && (na = Ee); 2476 if (na && (na = na(a, d2))) { 2477 ne(g2, na, c, e2); 2478 break a; 2479 } 2480 xa && xa(a, h2, d2); 2481 "focusout" === a && (xa = h2._wrapperState) && xa.controlled && "number" === h2.type && cb(h2, "number", h2.value); 2482 } 2483 xa = d2 ? ue(d2) : window; 2484 switch (a) { 2485 case "focusin": 2486 if (me(xa) || "true" === xa.contentEditable) Qe = xa, Re = d2, Se = null; 2487 break; 2488 case "focusout": 2489 Se = Re = Qe = null; 2490 break; 2491 case "mousedown": 2492 Te = true; 2493 break; 2494 case "contextmenu": 2495 case "mouseup": 2496 case "dragend": 2497 Te = false; 2498 Ue(g2, c, e2); 2499 break; 2500 case "selectionchange": 2501 if (Pe) break; 2502 case "keydown": 2503 case "keyup": 2504 Ue(g2, c, e2); 2505 } 2506 var $a; 2507 if (ae) b: { 2508 switch (a) { 2509 case "compositionstart": 2510 var ba = "onCompositionStart"; 2511 break b; 2512 case "compositionend": 2513 ba = "onCompositionEnd"; 2514 break b; 2515 case "compositionupdate": 2516 ba = "onCompositionUpdate"; 2517 break b; 2518 } 2519 ba = void 0; 2520 } 2521 else ie ? ge(a, c) && (ba = "onCompositionEnd") : "keydown" === a && 229 === c.keyCode && (ba = "onCompositionStart"); 2522 ba && (de && "ko" !== c.locale && (ie || "onCompositionStart" !== ba ? "onCompositionEnd" === ba && ie && ($a = nd()) : (kd = e2, ld = "value" in kd ? kd.value : kd.textContent, ie = true)), xa = oe(d2, ba), 0 < xa.length && (ba = new Ld(ba, a, null, c, e2), g2.push({ event: ba, listeners: xa }), $a ? ba.data = $a : ($a = he(c), null !== $a && (ba.data = $a)))); 2523 if ($a = ce ? je(a, c) : ke(a, c)) d2 = oe(d2, "onBeforeInput"), 0 < d2.length && (e2 = new Ld("onBeforeInput", "beforeinput", null, c, e2), g2.push({ event: e2, listeners: d2 }), e2.data = $a); 2524 } 2525 se(g2, b); 2526 }); 2527} 2528function tf(a, b, c) { 2529 return { instance: a, listener: b, currentTarget: c }; 2530} 2531function oe(a, b) { 2532 for (var c = b + "Capture", d = []; null !== a; ) { 2533 var e = a, f2 = e.stateNode; 2534 5 === e.tag && null !== f2 && (e = f2, f2 = Kb(a, c), null != f2 && d.unshift(tf(a, f2, e)), f2 = Kb(a, b), null != f2 && d.push(tf(a, f2, e))); 2535 a = a.return; 2536 } 2537 return d; 2538} 2539function vf(a) { 2540 if (null === a) return null; 2541 do 2542 a = a.return; 2543 while (a && 5 !== a.tag); 2544 return a ? a : null; 2545} 2546function wf(a, b, c, d, e) { 2547 for (var f2 = b._reactName, g = []; null !== c && c !== d; ) { 2548 var h = c, k2 = h.alternate, l2 = h.stateNode; 2549 if (null !== k2 && k2 === d) break; 2550 5 === h.tag && null !== l2 && (h = l2, e ? (k2 = Kb(c, f2), null != k2 && g.unshift(tf(c, k2, h))) : e || (k2 = Kb(c, f2), null != k2 && g.push(tf(c, k2, h)))); 2551 c = c.return; 2552 } 2553 0 !== g.length && a.push({ event: b, listeners: g }); 2554} 2555var xf = /\r\n?/g, yf = /\u0000|\uFFFD/g; 2556function zf(a) { 2557 return ("string" === typeof a ? a : "" + a).replace(xf, "\n").replace(yf, ""); 2558} 2559function Af(a, b, c) { 2560 b = zf(b); 2561 if (zf(a) !== b && c) throw Error(p(425)); 2562} 2563function Bf() { 2564} 2565var Cf = null, Df = null; 2566function Ef(a, b) { 2567 return "textarea" === a || "noscript" === a || "string" === typeof b.children || "number" === typeof b.children || "object" === typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && null != b.dangerouslySetInnerHTML.__html; 2568} 2569var Ff = "function" === typeof setTimeout ? setTimeout : void 0, Gf = "function" === typeof clearTimeout ? clearTimeout : void 0, Hf = "function" === typeof Promise ? Promise : void 0, Jf = "function" === typeof queueMicrotask ? queueMicrotask : "undefined" !== typeof Hf ? function(a) { 2570 return Hf.resolve(null).then(a).catch(If); 2571} : Ff; 2572function If(a) { 2573 setTimeout(function() { 2574 throw a; 2575 }); 2576} 2577function Kf(a, b) { 2578 var c = b, d = 0; 2579 do { 2580 var e = c.nextSibling; 2581 a.removeChild(c); 2582 if (e && 8 === e.nodeType) if (c = e.data, "/$" === c) { 2583 if (0 === d) { 2584 a.removeChild(e); 2585 bd(b); 2586 return; 2587 } 2588 d--; 2589 } else "$" !== c && "$?" !== c && "$!" !== c || d++; 2590 c = e; 2591 } while (c); 2592 bd(b); 2593} 2594function Lf(a) { 2595 for (; null != a; a = a.nextSibling) { 2596 var b = a.nodeType; 2597 if (1 === b || 3 === b) break; 2598 if (8 === b) { 2599 b = a.data; 2600 if ("$" === b || "$!" === b || "$?" === b) break; 2601 if ("/$" === b) return null; 2602 } 2603 } 2604 return a; 2605} 2606function Mf(a) { 2607 a = a.previousSibling; 2608 for (var b = 0; a; ) { 2609 if (8 === a.nodeType) { 2610 var c = a.data; 2611 if ("$" === c || "$!" === c || "$?" === c) { 2612 if (0 === b) return a; 2613 b--; 2614 } else "/$" === c && b++; 2615 } 2616 a = a.previousSibling; 2617 } 2618 return null; 2619} 2620var Nf = Math.random().toString(36).slice(2), Of = "__reactFiber$" + Nf, Pf = "__reactProps$" + Nf, uf = "__reactContainer$" + Nf, of = "__reactEvents$" + Nf, Qf = "__reactListeners$" + Nf, Rf = "__reactHandles$" + Nf; 2621function Wc(a) { 2622 var b = a[Of]; 2623 if (b) return b; 2624 for (var c = a.parentNode; c; ) { 2625 if (b = c[uf] || c[Of]) { 2626 c = b.alternate; 2627 if (null !== b.child || null !== c && null !== c.child) for (a = Mf(a); null !== a; ) { 2628 if (c = a[Of]) return c; 2629 a = Mf(a); 2630 } 2631 return b; 2632 } 2633 a = c; 2634 c = a.parentNode; 2635 } 2636 return null; 2637} 2638function Cb(a) { 2639 a = a[Of] || a[uf]; 2640 return !a || 5 !== a.tag && 6 !== a.tag && 13 !== a.tag && 3 !== a.tag ? null : a; 2641} 2642function ue(a) { 2643 if (5 === a.tag || 6 === a.tag) return a.stateNode; 2644 throw Error(p(33)); 2645} 2646function Db(a) { 2647 return a[Pf] || null; 2648} 2649var Sf = [], Tf = -1; 2650function Uf(a) { 2651 return { current: a }; 2652} 2653function E(a) { 2654 0 > Tf || (a.current = Sf[Tf], Sf[Tf] = null, Tf--); 2655} 2656function G(a, b) { 2657 Tf++; 2658 Sf[Tf] = a.current; 2659 a.current = b; 2660} 2661var Vf = {}, H = Uf(Vf), Wf = Uf(false), Xf = Vf; 2662function Yf(a, b) { 2663 var c = a.type.contextTypes; 2664 if (!c) return Vf; 2665 var d = a.stateNode; 2666 if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext; 2667 var e = {}, f2; 2668 for (f2 in c) e[f2] = b[f2]; 2669 d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e); 2670 return e; 2671} 2672function Zf(a) { 2673 a = a.childContextTypes; 2674 return null !== a && void 0 !== a; 2675} 2676function $f() { 2677 E(Wf); 2678 E(H); 2679} 2680function ag(a, b, c) { 2681 if (H.current !== Vf) throw Error(p(168)); 2682 G(H, b); 2683 G(Wf, c); 2684} 2685function bg(a, b, c) { 2686 var d = a.stateNode; 2687 b = b.childContextTypes; 2688 if ("function" !== typeof d.getChildContext) return c; 2689 d = d.getChildContext(); 2690 for (var e in d) if (!(e in b)) throw Error(p(108, Ra(a) || "Unknown", e)); 2691 return A({}, c, d); 2692} 2693function cg(a) { 2694 a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Vf; 2695 Xf = H.current; 2696 G(H, a); 2697 G(Wf, Wf.current); 2698 return true; 2699} 2700function dg(a, b, c) { 2701 var d = a.stateNode; 2702 if (!d) throw Error(p(169)); 2703 c ? (a = bg(a, b, Xf), d.__reactInternalMemoizedMergedChildContext = a, E(Wf), E(H), G(H, a)) : E(Wf); 2704 G(Wf, c); 2705} 2706var eg = null, fg = false, gg = false; 2707function hg(a) { 2708 null === eg ? eg = [a] : eg.push(a); 2709} 2710function ig(a) { 2711 fg = true; 2712 hg(a); 2713} 2714function jg() { 2715 if (!gg && null !== eg) { 2716 gg = true; 2717 var a = 0, b = C; 2718 try { 2719 var c = eg; 2720 for (C = 1; a < c.length; a++) { 2721 var d = c[a]; 2722 do 2723 d = d(true); 2724 while (null !== d); 2725 } 2726 eg = null; 2727 fg = false; 2728 } catch (e) { 2729 throw null !== eg && (eg = eg.slice(a + 1)), ac(fc, jg), e; 2730 } finally { 2731 C = b, gg = false; 2732 } 2733 } 2734 return null; 2735} 2736var kg = [], lg = 0, mg = null, ng = 0, og = [], pg = 0, qg = null, rg = 1, sg = ""; 2737function tg(a, b) { 2738 kg[lg++] = ng; 2739 kg[lg++] = mg; 2740 mg = a; 2741 ng = b; 2742} 2743function ug(a, b, c) { 2744 og[pg++] = rg; 2745 og[pg++] = sg; 2746 og[pg++] = qg; 2747 qg = a; 2748 var d = rg; 2749 a = sg; 2750 var e = 32 - oc(d) - 1; 2751 d &= ~(1 << e); 2752 c += 1; 2753 var f2 = 32 - oc(b) + e; 2754 if (30 < f2) { 2755 var g = e - e % 5; 2756 f2 = (d & (1 << g) - 1).toString(32); 2757 d >>= g; 2758 e -= g; 2759 rg = 1 << 32 - oc(b) + e | c << e | d; 2760 sg = f2 + a; 2761 } else rg = 1 << f2 | c << e | d, sg = a; 2762} 2763function vg(a) { 2764 null !== a.return && (tg(a, 1), ug(a, 1, 0)); 2765} 2766function wg(a) { 2767 for (; a === mg; ) mg = kg[--lg], kg[lg] = null, ng = kg[--lg], kg[lg] = null; 2768 for (; a === qg; ) qg = og[--pg], og[pg] = null, sg = og[--pg], og[pg] = null, rg = og[--pg], og[pg] = null; 2769} 2770var xg = null, yg = null, I = false, zg = null; 2771function Ag(a, b) { 2772 var c = Bg(5, null, null, 0); 2773 c.elementType = "DELETED"; 2774 c.stateNode = b; 2775 c.return = a; 2776 b = a.deletions; 2777 null === b ? (a.deletions = [c], a.flags |= 16) : b.push(c); 2778} 2779function Cg(a, b) { 2780 switch (a.tag) { 2781 case 5: 2782 var c = a.type; 2783 b = 1 !== b.nodeType || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b; 2784 return null !== b ? (a.stateNode = b, xg = a, yg = Lf(b.firstChild), true) : false; 2785 case 6: 2786 return b = "" === a.pendingProps || 3 !== b.nodeType ? null : b, null !== b ? (a.stateNode = b, xg = a, yg = null, true) : false; 2787 case 13: 2788 return b = 8 !== b.nodeType ? null : b, null !== b ? (c = null !== qg ? { id: rg, overflow: sg } : null, a.memoizedState = { dehydrated: b, treeContext: c, retryLane: 1073741824 }, c = Bg(18, null, null, 0), c.stateNode = b, c.return = a, a.child = c, xg = a, yg = null, true) : false; 2789 default: 2790 return false; 2791 } 2792} 2793function Dg(a) { 2794 return 0 !== (a.mode & 1) && 0 === (a.flags & 128); 2795} 2796function Eg(a) { 2797 if (I) { 2798 var b = yg; 2799 if (b) { 2800 var c = b; 2801 if (!Cg(a, b)) { 2802 if (Dg(a)) throw Error(p(418)); 2803 b = Lf(c.nextSibling); 2804 var d = xg; 2805 b && Cg(a, b) ? Ag(d, c) : (a.flags = a.flags & -4097 | 2, I = false, xg = a); 2806 } 2807 } else { 2808 if (Dg(a)) throw Error(p(418)); 2809 a.flags = a.flags & -4097 | 2; 2810 I = false; 2811 xg = a; 2812 } 2813 } 2814} 2815function Fg(a) { 2816 for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag && 13 !== a.tag; ) a = a.return; 2817 xg = a; 2818} 2819function Gg(a) { 2820 if (a !== xg) return false; 2821 if (!I) return Fg(a), I = true, false; 2822 var b; 2823 (b = 3 !== a.tag) && !(b = 5 !== a.tag) && (b = a.type, b = "head" !== b && "body" !== b && !Ef(a.type, a.memoizedProps)); 2824 if (b && (b = yg)) { 2825 if (Dg(a)) throw Hg(), Error(p(418)); 2826 for (; b; ) Ag(a, b), b = Lf(b.nextSibling); 2827 } 2828 Fg(a); 2829 if (13 === a.tag) { 2830 a = a.memoizedState; 2831 a = null !== a ? a.dehydrated : null; 2832 if (!a) throw Error(p(317)); 2833 a: { 2834 a = a.nextSibling; 2835 for (b = 0; a; ) { 2836 if (8 === a.nodeType) { 2837 var c = a.data; 2838 if ("/$" === c) { 2839 if (0 === b) { 2840 yg = Lf(a.nextSibling); 2841 break a; 2842 } 2843 b--; 2844 } else "$" !== c && "$!" !== c && "$?" !== c || b++; 2845 } 2846 a = a.nextSibling; 2847 } 2848 yg = null; 2849 } 2850 } else yg = xg ? Lf(a.stateNode.nextSibling) : null; 2851 return true; 2852} 2853function Hg() { 2854 for (var a = yg; a; ) a = Lf(a.nextSibling); 2855} 2856function Ig() { 2857 yg = xg = null; 2858 I = false; 2859} 2860function Jg(a) { 2861 null === zg ? zg = [a] : zg.push(a); 2862} 2863var Kg = ua.ReactCurrentBatchConfig; 2864function Lg(a, b, c) { 2865 a = c.ref; 2866 if (null !== a && "function" !== typeof a && "object" !== typeof a) { 2867 if (c._owner) { 2868 c = c._owner; 2869 if (c) { 2870 if (1 !== c.tag) throw Error(p(309)); 2871 var d = c.stateNode; 2872 } 2873 if (!d) throw Error(p(147, a)); 2874 var e = d, f2 = "" + a; 2875 if (null !== b && null !== b.ref && "function" === typeof b.ref && b.ref._stringRef === f2) return b.ref; 2876 b = function(a2) { 2877 var b2 = e.refs; 2878 null === a2 ? delete b2[f2] : b2[f2] = a2; 2879 }; 2880 b._stringRef = f2; 2881 return b; 2882 } 2883 if ("string" !== typeof a) throw Error(p(284)); 2884 if (!c._owner) throw Error(p(290, a)); 2885 } 2886 return a; 2887} 2888function Mg(a, b) { 2889 a = Object.prototype.toString.call(b); 2890 throw Error(p(31, "[object Object]" === a ? "object with keys {" + Object.keys(b).join(", ") + "}" : a)); 2891} 2892function Ng(a) { 2893 var b = a._init; 2894 return b(a._payload); 2895} 2896function Og(a) { 2897 function b(b2, c2) { 2898 if (a) { 2899 var d2 = b2.deletions; 2900 null === d2 ? (b2.deletions = [c2], b2.flags |= 16) : d2.push(c2); 2901 } 2902 } 2903 function c(c2, d2) { 2904 if (!a) return null; 2905 for (; null !== d2; ) b(c2, d2), d2 = d2.sibling; 2906 return null; 2907 } 2908 function d(a2, b2) { 2909 for (a2 = /* @__PURE__ */ new Map(); null !== b2; ) null !== b2.key ? a2.set(b2.key, b2) : a2.set(b2.index, b2), b2 = b2.sibling; 2910 return a2; 2911 } 2912 function e(a2, b2) { 2913 a2 = Pg(a2, b2); 2914 a2.index = 0; 2915 a2.sibling = null; 2916 return a2; 2917 } 2918 function f2(b2, c2, d2) { 2919 b2.index = d2; 2920 if (!a) return b2.flags |= 1048576, c2; 2921 d2 = b2.alternate; 2922 if (null !== d2) return d2 = d2.index, d2 < c2 ? (b2.flags |= 2, c2) : d2; 2923 b2.flags |= 2; 2924 return c2; 2925 } 2926 function g(b2) { 2927 a && null === b2.alternate && (b2.flags |= 2); 2928 return b2; 2929 } 2930 function h(a2, b2, c2, d2) { 2931 if (null === b2 || 6 !== b2.tag) return b2 = Qg(c2, a2.mode, d2), b2.return = a2, b2; 2932 b2 = e(b2, c2); 2933 b2.return = a2; 2934 return b2; 2935 } 2936 function k2(a2, b2, c2, d2) { 2937 var f3 = c2.type; 2938 if (f3 === ya) return m2(a2, b2, c2.props.children, d2, c2.key); 2939 if (null !== b2 && (b2.elementType === f3 || "object" === typeof f3 && null !== f3 && f3.$$typeof === Ha && Ng(f3) === b2.type)) return d2 = e(b2, c2.props), d2.ref = Lg(a2, b2, c2), d2.return = a2, d2; 2940 d2 = Rg(c2.type, c2.key, c2.props, null, a2.mode, d2); 2941 d2.ref = Lg(a2, b2, c2); 2942 d2.return = a2; 2943 return d2; 2944 } 2945 function l2(a2, b2, c2, d2) { 2946 if (null === b2 || 4 !== b2.tag || b2.stateNode.containerInfo !== c2.containerInfo || b2.stateNode.implementation !== c2.implementation) return b2 = Sg(c2, a2.mode, d2), b2.return = a2, b2; 2947 b2 = e(b2, c2.children || []); 2948 b2.return = a2; 2949 return b2; 2950 } 2951 function m2(a2, b2, c2, d2, f3) { 2952 if (null === b2 || 7 !== b2.tag) return b2 = Tg(c2, a2.mode, d2, f3), b2.return = a2, b2; 2953 b2 = e(b2, c2); 2954 b2.return = a2; 2955 return b2; 2956 } 2957 function q2(a2, b2, c2) { 2958 if ("string" === typeof b2 && "" !== b2 || "number" === typeof b2) return b2 = Qg("" + b2, a2.mode, c2), b2.return = a2, b2; 2959 if ("object" === typeof b2 && null !== b2) { 2960 switch (b2.$$typeof) { 2961 case va: 2962 return c2 = Rg(b2.type, b2.key, b2.props, null, a2.mode, c2), c2.ref = Lg(a2, null, b2), c2.return = a2, c2; 2963 case wa: 2964 return b2 = Sg(b2, a2.mode, c2), b2.return = a2, b2; 2965 case Ha: 2966 var d2 = b2._init; 2967 return q2(a2, d2(b2._payload), c2); 2968 } 2969 if (eb(b2) || Ka(b2)) return b2 = Tg(b2, a2.mode, c2, null), b2.return = a2, b2; 2970 Mg(a2, b2); 2971 } 2972 return null; 2973 } 2974 function r2(a2, b2, c2, d2) { 2975 var e2 = null !== b2 ? b2.key : null; 2976 if ("string" === typeof c2 && "" !== c2 || "number" === typeof c2) return null !== e2 ? null : h(a2, b2, "" + c2, d2); 2977 if ("object" === typeof c2 && null !== c2) { 2978 switch (c2.$$typeof) { 2979 case va: 2980 return c2.key === e2 ? k2(a2, b2, c2, d2) : null; 2981 case wa: 2982 return c2.key === e2 ? l2(a2, b2, c2, d2) : null; 2983 case Ha: 2984 return e2 = c2._init, r2( 2985 a2, 2986 b2, 2987 e2(c2._payload), 2988 d2 2989 ); 2990 } 2991 if (eb(c2) || Ka(c2)) return null !== e2 ? null : m2(a2, b2, c2, d2, null); 2992 Mg(a2, c2); 2993 } 2994 return null; 2995 } 2996 function y2(a2, b2, c2, d2, e2) { 2997 if ("string" === typeof d2 && "" !== d2 || "number" === typeof d2) return a2 = a2.get(c2) || null, h(b2, a2, "" + d2, e2); 2998 if ("object" === typeof d2 && null !== d2) { 2999 switch (d2.$$typeof) { 3000 case va: 3001 return a2 = a2.get(null === d2.key ? c2 : d2.key) || null, k2(b2, a2, d2, e2); 3002 case wa: 3003 return a2 = a2.get(null === d2.key ? c2 : d2.key) || null, l2(b2, a2, d2, e2); 3004 case Ha: 3005 var f3 = d2._init; 3006 return y2(a2, b2, c2, f3(d2._payload), e2); 3007 } 3008 if (eb(d2) || Ka(d2)) return a2 = a2.get(c2) || null, m2(b2, a2, d2, e2, null); 3009 Mg(b2, d2); 3010 } 3011 return null; 3012 } 3013 function n2(e2, g2, h2, k3) { 3014 for (var l3 = null, m3 = null, u2 = g2, w2 = g2 = 0, x2 = null; null !== u2 && w2 < h2.length; w2++) { 3015 u2.index > w2 ? (x2 = u2, u2 = null) : x2 = u2.sibling; 3016 var n3 = r2(e2, u2, h2[w2], k3); 3017 if (null === n3) { 3018 null === u2 && (u2 = x2); 3019 break; 3020 } 3021 a && u2 && null === n3.alternate && b(e2, u2); 3022 g2 = f2(n3, g2, w2); 3023 null === m3 ? l3 = n3 : m3.sibling = n3; 3024 m3 = n3; 3025 u2 = x2; 3026 } 3027 if (w2 === h2.length) return c(e2, u2), I && tg(e2, w2), l3; 3028 if (null === u2) { 3029 for (; w2 < h2.length; w2++) u2 = q2(e2, h2[w2], k3), null !== u2 && (g2 = f2(u2, g2, w2), null === m3 ? l3 = u2 : m3.sibling = u2, m3 = u2); 3030 I && tg(e2, w2); 3031 return l3; 3032 } 3033 for (u2 = d(e2, u2); w2 < h2.length; w2++) x2 = y2(u2, e2, w2, h2[w2], k3), null !== x2 && (a && null !== x2.alternate && u2.delete(null === x2.key ? w2 : x2.key), g2 = f2(x2, g2, w2), null === m3 ? l3 = x2 : m3.sibling = x2, m3 = x2); 3034 a && u2.forEach(function(a2) { 3035 return b(e2, a2); 3036 }); 3037 I && tg(e2, w2); 3038 return l3; 3039 } 3040 function t2(e2, g2, h2, k3) { 3041 var l3 = Ka(h2); 3042 if ("function" !== typeof l3) throw Error(p(150)); 3043 h2 = l3.call(h2); 3044 if (null == h2) throw Error(p(151)); 3045 for (var u2 = l3 = null, m3 = g2, w2 = g2 = 0, x2 = null, n3 = h2.next(); null !== m3 && !n3.done; w2++, n3 = h2.next()) { 3046 m3.index > w2 ? (x2 = m3, m3 = null) : x2 = m3.sibling; 3047 var t3 = r2(e2, m3, n3.value, k3); 3048 if (null === t3) { 3049 null === m3 && (m3 = x2); 3050 break; 3051 } 3052 a && m3 && null === t3.alternate && b(e2, m3); 3053 g2 = f2(t3, g2, w2); 3054 null === u2 ? l3 = t3 : u2.sibling = t3; 3055 u2 = t3; 3056 m3 = x2; 3057 } 3058 if (n3.done) return c( 3059 e2, 3060 m3 3061 ), I && tg(e2, w2), l3; 3062 if (null === m3) { 3063 for (; !n3.done; w2++, n3 = h2.next()) n3 = q2(e2, n3.value, k3), null !== n3 && (g2 = f2(n3, g2, w2), null === u2 ? l3 = n3 : u2.sibling = n3, u2 = n3); 3064 I && tg(e2, w2); 3065 return l3; 3066 } 3067 for (m3 = d(e2, m3); !n3.done; w2++, n3 = h2.next()) n3 = y2(m3, e2, w2, n3.value, k3), null !== n3 && (a && null !== n3.alternate && m3.delete(null === n3.key ? w2 : n3.key), g2 = f2(n3, g2, w2), null === u2 ? l3 = n3 : u2.sibling = n3, u2 = n3); 3068 a && m3.forEach(function(a2) { 3069 return b(e2, a2); 3070 }); 3071 I && tg(e2, w2); 3072 return l3; 3073 } 3074 function J2(a2, d2, f3, h2) { 3075 "object" === typeof f3 && null !== f3 && f3.type === ya && null === f3.key && (f3 = f3.props.children); 3076 if ("object" === typeof f3 && null !== f3) { 3077 switch (f3.$$typeof) { 3078 case va: 3079 a: { 3080 for (var k3 = f3.key, l3 = d2; null !== l3; ) { 3081 if (l3.key === k3) { 3082 k3 = f3.type; 3083 if (k3 === ya) { 3084 if (7 === l3.tag) { 3085 c(a2, l3.sibling); 3086 d2 = e(l3, f3.props.children); 3087 d2.return = a2; 3088 a2 = d2; 3089 break a; 3090 } 3091 } else if (l3.elementType === k3 || "object" === typeof k3 && null !== k3 && k3.$$typeof === Ha && Ng(k3) === l3.type) { 3092 c(a2, l3.sibling); 3093 d2 = e(l3, f3.props); 3094 d2.ref = Lg(a2, l3, f3); 3095 d2.return = a2; 3096 a2 = d2; 3097 break a; 3098 } 3099 c(a2, l3); 3100 break; 3101 } else b(a2, l3); 3102 l3 = l3.sibling; 3103 } 3104 f3.type === ya ? (d2 = Tg(f3.props.children, a2.mode, h2, f3.key), d2.return = a2, a2 = d2) : (h2 = Rg(f3.type, f3.key, f3.props, null, a2.mode, h2), h2.ref = Lg(a2, d2, f3), h2.return = a2, a2 = h2); 3105 } 3106 return g(a2); 3107 case wa: 3108 a: { 3109 for (l3 = f3.key; null !== d2; ) { 3110 if (d2.key === l3) if (4 === d2.tag && d2.stateNode.containerInfo === f3.containerInfo && d2.stateNode.implementation === f3.implementation) { 3111 c(a2, d2.sibling); 3112 d2 = e(d2, f3.children || []); 3113 d2.return = a2; 3114 a2 = d2; 3115 break a; 3116 } else { 3117 c(a2, d2); 3118 break; 3119 } 3120 else b(a2, d2); 3121 d2 = d2.sibling; 3122 } 3123 d2 = Sg(f3, a2.mode, h2); 3124 d2.return = a2; 3125 a2 = d2; 3126 } 3127 return g(a2); 3128 case Ha: 3129 return l3 = f3._init, J2(a2, d2, l3(f3._payload), h2); 3130 } 3131 if (eb(f3)) return n2(a2, d2, f3, h2); 3132 if (Ka(f3)) return t2(a2, d2, f3, h2); 3133 Mg(a2, f3); 3134 } 3135 return "string" === typeof f3 && "" !== f3 || "number" === typeof f3 ? (f3 = "" + f3, null !== d2 && 6 === d2.tag ? (c(a2, d2.sibling), d2 = e(d2, f3), d2.return = a2, a2 = d2) : (c(a2, d2), d2 = Qg(f3, a2.mode, h2), d2.return = a2, a2 = d2), g(a2)) : c(a2, d2); 3136 } 3137 return J2; 3138} 3139var Ug = Og(true), Vg = Og(false), Wg = Uf(null), Xg = null, Yg = null, Zg = null; 3140function $g() { 3141 Zg = Yg = Xg = null; 3142} 3143function ah(a) { 3144 var b = Wg.current; 3145 E(Wg); 3146 a._currentValue = b; 3147} 3148function bh(a, b, c) { 3149 for (; null !== a; ) { 3150 var d = a.alternate; 3151 (a.childLanes & b) !== b ? (a.childLanes |= b, null !== d && (d.childLanes |= b)) : null !== d && (d.childLanes & b) !== b && (d.childLanes |= b); 3152 if (a === c) break; 3153 a = a.return; 3154 } 3155} 3156function ch(a, b) { 3157 Xg = a; 3158 Zg = Yg = null; 3159 a = a.dependencies; 3160 null !== a && null !== a.firstContext && (0 !== (a.lanes & b) && (dh = true), a.firstContext = null); 3161} 3162function eh(a) { 3163 var b = a._currentValue; 3164 if (Zg !== a) if (a = { context: a, memoizedValue: b, next: null }, null === Yg) { 3165 if (null === Xg) throw Error(p(308)); 3166 Yg = a; 3167 Xg.dependencies = { lanes: 0, firstContext: a }; 3168 } else Yg = Yg.next = a; 3169 return b; 3170} 3171var fh = null; 3172function gh(a) { 3173 null === fh ? fh = [a] : fh.push(a); 3174} 3175function hh(a, b, c, d) { 3176 var e = b.interleaved; 3177 null === e ? (c.next = c, gh(b)) : (c.next = e.next, e.next = c); 3178 b.interleaved = c; 3179 return ih(a, d); 3180} 3181function ih(a, b) { 3182 a.lanes |= b; 3183 var c = a.alternate; 3184 null !== c && (c.lanes |= b); 3185 c = a; 3186 for (a = a.return; null !== a; ) a.childLanes |= b, c = a.alternate, null !== c && (c.childLanes |= b), c = a, a = a.return; 3187 return 3 === c.tag ? c.stateNode : null; 3188} 3189var jh = false; 3190function kh(a) { 3191 a.updateQueue = { baseState: a.memoizedState, firstBaseUpdate: null, lastBaseUpdate: null, shared: { pending: null, interleaved: null, lanes: 0 }, effects: null }; 3192} 3193function lh(a, b) { 3194 a = a.updateQueue; 3195 b.updateQueue === a && (b.updateQueue = { baseState: a.baseState, firstBaseUpdate: a.firstBaseUpdate, lastBaseUpdate: a.lastBaseUpdate, shared: a.shared, effects: a.effects }); 3196} 3197function mh(a, b) { 3198 return { eventTime: a, lane: b, tag: 0, payload: null, callback: null, next: null }; 3199} 3200function nh(a, b, c) { 3201 var d = a.updateQueue; 3202 if (null === d) return null; 3203 d = d.shared; 3204 if (0 !== (K & 2)) { 3205 var e = d.pending; 3206 null === e ? b.next = b : (b.next = e.next, e.next = b); 3207 d.pending = b; 3208 return ih(a, c); 3209 } 3210 e = d.interleaved; 3211 null === e ? (b.next = b, gh(d)) : (b.next = e.next, e.next = b); 3212 d.interleaved = b; 3213 return ih(a, c); 3214} 3215function oh(a, b, c) { 3216 b = b.updateQueue; 3217 if (null !== b && (b = b.shared, 0 !== (c & 4194240))) { 3218 var d = b.lanes; 3219 d &= a.pendingLanes; 3220 c |= d; 3221 b.lanes = c; 3222 Cc(a, c); 3223 } 3224} 3225function ph(a, b) { 3226 var c = a.updateQueue, d = a.alternate; 3227 if (null !== d && (d = d.updateQueue, c === d)) { 3228 var e = null, f2 = null; 3229 c = c.firstBaseUpdate; 3230 if (null !== c) { 3231 do { 3232 var g = { eventTime: c.eventTime, lane: c.lane, tag: c.tag, payload: c.payload, callback: c.callback, next: null }; 3233 null === f2 ? e = f2 = g : f2 = f2.next = g; 3234 c = c.next; 3235 } while (null !== c); 3236 null === f2 ? e = f2 = b : f2 = f2.next = b; 3237 } else e = f2 = b; 3238 c = { baseState: d.baseState, firstBaseUpdate: e, lastBaseUpdate: f2, shared: d.shared, effects: d.effects }; 3239 a.updateQueue = c; 3240 return; 3241 } 3242 a = c.lastBaseUpdate; 3243 null === a ? c.firstBaseUpdate = b : a.next = b; 3244 c.lastBaseUpdate = b; 3245} 3246function qh(a, b, c, d) { 3247 var e = a.updateQueue; 3248 jh = false; 3249 var f2 = e.firstBaseUpdate, g = e.lastBaseUpdate, h = e.shared.pending; 3250 if (null !== h) { 3251 e.shared.pending = null; 3252 var k2 = h, l2 = k2.next; 3253 k2.next = null; 3254 null === g ? f2 = l2 : g.next = l2; 3255 g = k2; 3256 var m2 = a.alternate; 3257 null !== m2 && (m2 = m2.updateQueue, h = m2.lastBaseUpdate, h !== g && (null === h ? m2.firstBaseUpdate = l2 : h.next = l2, m2.lastBaseUpdate = k2)); 3258 } 3259 if (null !== f2) { 3260 var q2 = e.baseState; 3261 g = 0; 3262 m2 = l2 = k2 = null; 3263 h = f2; 3264 do { 3265 var r2 = h.lane, y2 = h.eventTime; 3266 if ((d & r2) === r2) { 3267 null !== m2 && (m2 = m2.next = { 3268 eventTime: y2, 3269 lane: 0, 3270 tag: h.tag, 3271 payload: h.payload, 3272 callback: h.callback, 3273 next: null 3274 }); 3275 a: { 3276 var n2 = a, t2 = h; 3277 r2 = b; 3278 y2 = c; 3279 switch (t2.tag) { 3280 case 1: 3281 n2 = t2.payload; 3282 if ("function" === typeof n2) { 3283 q2 = n2.call(y2, q2, r2); 3284 break a; 3285 } 3286 q2 = n2; 3287 break a; 3288 case 3: 3289 n2.flags = n2.flags & -65537 | 128; 3290 case 0: 3291 n2 = t2.payload; 3292 r2 = "function" === typeof n2 ? n2.call(y2, q2, r2) : n2; 3293 if (null === r2 || void 0 === r2) break a; 3294 q2 = A({}, q2, r2); 3295 break a; 3296 case 2: 3297 jh = true; 3298 } 3299 } 3300 null !== h.callback && 0 !== h.lane && (a.flags |= 64, r2 = e.effects, null === r2 ? e.effects = [h] : r2.push(h)); 3301 } else y2 = { eventTime: y2, lane: r2, tag: h.tag, payload: h.payload, callback: h.callback, next: null }, null === m2 ? (l2 = m2 = y2, k2 = q2) : m2 = m2.next = y2, g |= r2; 3302 h = h.next; 3303 if (null === h) if (h = e.shared.pending, null === h) break; 3304 else r2 = h, h = r2.next, r2.next = null, e.lastBaseUpdate = r2, e.shared.pending = null; 3305 } while (1); 3306 null === m2 && (k2 = q2); 3307 e.baseState = k2; 3308 e.firstBaseUpdate = l2; 3309 e.lastBaseUpdate = m2; 3310 b = e.shared.interleaved; 3311 if (null !== b) { 3312 e = b; 3313 do 3314 g |= e.lane, e = e.next; 3315 while (e !== b); 3316 } else null === f2 && (e.shared.lanes = 0); 3317 rh |= g; 3318 a.lanes = g; 3319 a.memoizedState = q2; 3320 } 3321} 3322function sh(a, b, c) { 3323 a = b.effects; 3324 b.effects = null; 3325 if (null !== a) for (b = 0; b < a.length; b++) { 3326 var d = a[b], e = d.callback; 3327 if (null !== e) { 3328 d.callback = null; 3329 d = c; 3330 if ("function" !== typeof e) throw Error(p(191, e)); 3331 e.call(d); 3332 } 3333 } 3334} 3335var th = {}, uh = Uf(th), vh = Uf(th), wh = Uf(th); 3336function xh(a) { 3337 if (a === th) throw Error(p(174)); 3338 return a; 3339} 3340function yh(a, b) { 3341 G(wh, b); 3342 G(vh, a); 3343 G(uh, th); 3344 a = b.nodeType; 3345 switch (a) { 3346 case 9: 3347 case 11: 3348 b = (b = b.documentElement) ? b.namespaceURI : lb(null, ""); 3349 break; 3350 default: 3351 a = 8 === a ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = lb(b, a); 3352 } 3353 E(uh); 3354 G(uh, b); 3355} 3356function zh() { 3357 E(uh); 3358 E(vh); 3359 E(wh); 3360} 3361function Ah(a) { 3362 xh(wh.current); 3363 var b = xh(uh.current); 3364 var c = lb(b, a.type); 3365 b !== c && (G(vh, a), G(uh, c)); 3366} 3367function Bh(a) { 3368 vh.current === a && (E(uh), E(vh)); 3369} 3370var L = Uf(0); 3371function Ch(a) { 3372 for (var b = a; null !== b; ) { 3373 if (13 === b.tag) { 3374 var c = b.memoizedState; 3375 if (null !== c && (c = c.dehydrated, null === c || "$?" === c.data || "$!" === c.data)) return b; 3376 } else if (19 === b.tag && void 0 !== b.memoizedProps.revealOrder) { 3377 if (0 !== (b.flags & 128)) return b; 3378 } else if (null !== b.child) { 3379 b.child.return = b; 3380 b = b.child; 3381 continue; 3382 } 3383 if (b === a) break; 3384 for (; null === b.sibling; ) { 3385 if (null === b.return || b.return === a) return null; 3386 b = b.return; 3387 } 3388 b.sibling.return = b.return; 3389 b = b.sibling; 3390 } 3391 return null; 3392} 3393var Dh = []; 3394function Eh() { 3395 for (var a = 0; a < Dh.length; a++) Dh[a]._workInProgressVersionPrimary = null; 3396 Dh.length = 0; 3397} 3398var Fh = ua.ReactCurrentDispatcher, Gh = ua.ReactCurrentBatchConfig, Hh = 0, M = null, N = null, O = null, Ih = false, Jh = false, Kh = 0, Lh = 0; 3399function P() { 3400 throw Error(p(321)); 3401} 3402function Mh(a, b) { 3403 if (null === b) return false; 3404 for (var c = 0; c < b.length && c < a.length; c++) if (!He(a[c], b[c])) return false; 3405 return true; 3406} 3407function Nh(a, b, c, d, e, f2) { 3408 Hh = f2; 3409 M = b; 3410 b.memoizedState = null; 3411 b.updateQueue = null; 3412 b.lanes = 0; 3413 Fh.current = null === a || null === a.memoizedState ? Oh : Ph; 3414 a = c(d, e); 3415 if (Jh) { 3416 f2 = 0; 3417 do { 3418 Jh = false; 3419 Kh = 0; 3420 if (25 <= f2) throw Error(p(301)); 3421 f2 += 1; 3422 O = N = null; 3423 b.updateQueue = null; 3424 Fh.current = Qh; 3425 a = c(d, e); 3426 } while (Jh); 3427 } 3428 Fh.current = Rh; 3429 b = null !== N && null !== N.next; 3430 Hh = 0; 3431 O = N = M = null; 3432 Ih = false; 3433 if (b) throw Error(p(300)); 3434 return a; 3435} 3436function Sh() { 3437 var a = 0 !== Kh; 3438 Kh = 0; 3439 return a; 3440} 3441function Th() { 3442 var a = { memoizedState: null, baseState: null, baseQueue: null, queue: null, next: null }; 3443 null === O ? M.memoizedState = O = a : O = O.next = a; 3444 return O; 3445} 3446function Uh() { 3447 if (null === N) { 3448 var a = M.alternate; 3449 a = null !== a ? a.memoizedState : null; 3450 } else a = N.next; 3451 var b = null === O ? M.memoizedState : O.next; 3452 if (null !== b) O = b, N = a; 3453 else { 3454 if (null === a) throw Error(p(310)); 3455 N = a; 3456 a = { memoizedState: N.memoizedState, baseState: N.baseState, baseQueue: N.baseQueue, queue: N.queue, next: null }; 3457 null === O ? M.memoizedState = O = a : O = O.next = a; 3458 } 3459 return O; 3460} 3461function Vh(a, b) { 3462 return "function" === typeof b ? b(a) : b; 3463} 3464function Wh(a) { 3465 var b = Uh(), c = b.queue; 3466 if (null === c) throw Error(p(311)); 3467 c.lastRenderedReducer = a; 3468 var d = N, e = d.baseQueue, f2 = c.pending; 3469 if (null !== f2) { 3470 if (null !== e) { 3471 var g = e.next; 3472 e.next = f2.next; 3473 f2.next = g; 3474 } 3475 d.baseQueue = e = f2; 3476 c.pending = null; 3477 } 3478 if (null !== e) { 3479 f2 = e.next; 3480 d = d.baseState; 3481 var h = g = null, k2 = null, l2 = f2; 3482 do { 3483 var m2 = l2.lane; 3484 if ((Hh & m2) === m2) null !== k2 && (k2 = k2.next = { lane: 0, action: l2.action, hasEagerState: l2.hasEagerState, eagerState: l2.eagerState, next: null }), d = l2.hasEagerState ? l2.eagerState : a(d, l2.action); 3485 else { 3486 var q2 = { 3487 lane: m2, 3488 action: l2.action, 3489 hasEagerState: l2.hasEagerState, 3490 eagerState: l2.eagerState, 3491 next: null 3492 }; 3493 null === k2 ? (h = k2 = q2, g = d) : k2 = k2.next = q2; 3494 M.lanes |= m2; 3495 rh |= m2; 3496 } 3497 l2 = l2.next; 3498 } while (null !== l2 && l2 !== f2); 3499 null === k2 ? g = d : k2.next = h; 3500 He(d, b.memoizedState) || (dh = true); 3501 b.memoizedState = d; 3502 b.baseState = g; 3503 b.baseQueue = k2; 3504 c.lastRenderedState = d; 3505 } 3506 a = c.interleaved; 3507 if (null !== a) { 3508 e = a; 3509 do 3510 f2 = e.lane, M.lanes |= f2, rh |= f2, e = e.next; 3511 while (e !== a); 3512 } else null === e && (c.lanes = 0); 3513 return [b.memoizedState, c.dispatch]; 3514} 3515function Xh(a) { 3516 var b = Uh(), c = b.queue; 3517 if (null === c) throw Error(p(311)); 3518 c.lastRenderedReducer = a; 3519 var d = c.dispatch, e = c.pending, f2 = b.memoizedState; 3520 if (null !== e) { 3521 c.pending = null; 3522 var g = e = e.next; 3523 do 3524 f2 = a(f2, g.action), g = g.next; 3525 while (g !== e); 3526 He(f2, b.memoizedState) || (dh = true); 3527 b.memoizedState = f2; 3528 null === b.baseQueue && (b.baseState = f2); 3529 c.lastRenderedState = f2; 3530 } 3531 return [f2, d]; 3532} 3533function Yh() { 3534} 3535function Zh(a, b) { 3536 var c = M, d = Uh(), e = b(), f2 = !He(d.memoizedState, e); 3537 f2 && (d.memoizedState = e, dh = true); 3538 d = d.queue; 3539 $h(ai.bind(null, c, d, a), [a]); 3540 if (d.getSnapshot !== b || f2 || null !== O && O.memoizedState.tag & 1) { 3541 c.flags |= 2048; 3542 bi(9, ci.bind(null, c, d, e, b), void 0, null); 3543 if (null === Q) throw Error(p(349)); 3544 0 !== (Hh & 30) || di(c, b, e); 3545 } 3546 return e; 3547} 3548function di(a, b, c) { 3549 a.flags |= 16384; 3550 a = { getSnapshot: b, value: c }; 3551 b = M.updateQueue; 3552 null === b ? (b = { lastEffect: null, stores: null }, M.updateQueue = b, b.stores = [a]) : (c = b.stores, null === c ? b.stores = [a] : c.push(a)); 3553} 3554function ci(a, b, c, d) { 3555 b.value = c; 3556 b.getSnapshot = d; 3557 ei(b) && fi(a); 3558} 3559function ai(a, b, c) { 3560 return c(function() { 3561 ei(b) && fi(a); 3562 }); 3563} 3564function ei(a) { 3565 var b = a.getSnapshot; 3566 a = a.value; 3567 try { 3568 var c = b(); 3569 return !He(a, c); 3570 } catch (d) { 3571 return true; 3572 } 3573} 3574function fi(a) { 3575 var b = ih(a, 1); 3576 null !== b && gi(b, a, 1, -1); 3577} 3578function hi(a) { 3579 var b = Th(); 3580 "function" === typeof a && (a = a()); 3581 b.memoizedState = b.baseState = a; 3582 a = { pending: null, interleaved: null, lanes: 0, dispatch: null, lastRenderedReducer: Vh, lastRenderedState: a }; 3583 b.queue = a; 3584 a = a.dispatch = ii.bind(null, M, a); 3585 return [b.memoizedState, a]; 3586} 3587function bi(a, b, c, d) { 3588 a = { tag: a, create: b, destroy: c, deps: d, next: null }; 3589 b = M.updateQueue; 3590 null === b ? (b = { lastEffect: null, stores: null }, M.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, null === c ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a)); 3591 return a; 3592} 3593function ji() { 3594 return Uh().memoizedState; 3595} 3596function ki(a, b, c, d) { 3597 var e = Th(); 3598 M.flags |= a; 3599 e.memoizedState = bi(1 | b, c, void 0, void 0 === d ? null : d); 3600} 3601function li(a, b, c, d) { 3602 var e = Uh(); 3603 d = void 0 === d ? null : d; 3604 var f2 = void 0; 3605 if (null !== N) { 3606 var g = N.memoizedState; 3607 f2 = g.destroy; 3608 if (null !== d && Mh(d, g.deps)) { 3609 e.memoizedState = bi(b, c, f2, d); 3610 return; 3611 } 3612 } 3613 M.flags |= a; 3614 e.memoizedState = bi(1 | b, c, f2, d); 3615} 3616function mi(a, b) { 3617 return ki(8390656, 8, a, b); 3618} 3619function $h(a, b) { 3620 return li(2048, 8, a, b); 3621} 3622function ni(a, b) { 3623 return li(4, 2, a, b); 3624} 3625function oi(a, b) { 3626 return li(4, 4, a, b); 3627} 3628function pi(a, b) { 3629 if ("function" === typeof b) return a = a(), b(a), function() { 3630 b(null); 3631 }; 3632 if (null !== b && void 0 !== b) return a = a(), b.current = a, function() { 3633 b.current = null; 3634 }; 3635} 3636function qi(a, b, c) { 3637 c = null !== c && void 0 !== c ? c.concat([a]) : null; 3638 return li(4, 4, pi.bind(null, b, a), c); 3639} 3640function ri() { 3641} 3642function si(a, b) { 3643 var c = Uh(); 3644 b = void 0 === b ? null : b; 3645 var d = c.memoizedState; 3646 if (null !== d && null !== b && Mh(b, d[1])) return d[0]; 3647 c.memoizedState = [a, b]; 3648 return a; 3649} 3650function ti(a, b) { 3651 var c = Uh(); 3652 b = void 0 === b ? null : b; 3653 var d = c.memoizedState; 3654 if (null !== d && null !== b && Mh(b, d[1])) return d[0]; 3655 a = a(); 3656 c.memoizedState = [a, b]; 3657 return a; 3658} 3659function ui(a, b, c) { 3660 if (0 === (Hh & 21)) return a.baseState && (a.baseState = false, dh = true), a.memoizedState = c; 3661 He(c, b) || (c = yc(), M.lanes |= c, rh |= c, a.baseState = true); 3662 return b; 3663} 3664function vi(a, b) { 3665 var c = C; 3666 C = 0 !== c && 4 > c ? c : 4; 3667 a(true); 3668 var d = Gh.transition; 3669 Gh.transition = {}; 3670 try { 3671 a(false), b(); 3672 } finally { 3673 C = c, Gh.transition = d; 3674 } 3675} 3676function wi() { 3677 return Uh().memoizedState; 3678} 3679function xi(a, b, c) { 3680 var d = yi(a); 3681 c = { lane: d, action: c, hasEagerState: false, eagerState: null, next: null }; 3682 if (zi(a)) Ai(b, c); 3683 else if (c = hh(a, b, c, d), null !== c) { 3684 var e = R(); 3685 gi(c, a, d, e); 3686 Bi(c, b, d); 3687 } 3688} 3689function ii(a, b, c) { 3690 var d = yi(a), e = { lane: d, action: c, hasEagerState: false, eagerState: null, next: null }; 3691 if (zi(a)) Ai(b, e); 3692 else { 3693 var f2 = a.alternate; 3694 if (0 === a.lanes && (null === f2 || 0 === f2.lanes) && (f2 = b.lastRenderedReducer, null !== f2)) try { 3695 var g = b.lastRenderedState, h = f2(g, c); 3696 e.hasEagerState = true; 3697 e.eagerState = h; 3698 if (He(h, g)) { 3699 var k2 = b.interleaved; 3700 null === k2 ? (e.next = e, gh(b)) : (e.next = k2.next, k2.next = e); 3701 b.interleaved = e; 3702 return; 3703 } 3704 } catch (l2) { 3705 } finally { 3706 } 3707 c = hh(a, b, e, d); 3708 null !== c && (e = R(), gi(c, a, d, e), Bi(c, b, d)); 3709 } 3710} 3711function zi(a) { 3712 var b = a.alternate; 3713 return a === M || null !== b && b === M; 3714} 3715function Ai(a, b) { 3716 Jh = Ih = true; 3717 var c = a.pending; 3718 null === c ? b.next = b : (b.next = c.next, c.next = b); 3719 a.pending = b; 3720} 3721function Bi(a, b, c) { 3722 if (0 !== (c & 4194240)) { 3723 var d = b.lanes; 3724 d &= a.pendingLanes; 3725 c |= d; 3726 b.lanes = c; 3727 Cc(a, c); 3728 } 3729} 3730var Rh = { readContext: eh, useCallback: P, useContext: P, useEffect: P, useImperativeHandle: P, useInsertionEffect: P, useLayoutEffect: P, useMemo: P, useReducer: P, useRef: P, useState: P, useDebugValue: P, useDeferredValue: P, useTransition: P, useMutableSource: P, useSyncExternalStore: P, useId: P, unstable_isNewReconciler: false }, Oh = { readContext: eh, useCallback: function(a, b) { 3731 Th().memoizedState = [a, void 0 === b ? null : b]; 3732 return a; 3733}, useContext: eh, useEffect: mi, useImperativeHandle: function(a, b, c) { 3734 c = null !== c && void 0 !== c ? c.concat([a]) : null; 3735 return ki( 3736 4194308, 3737 4, 3738 pi.bind(null, b, a), 3739 c 3740 ); 3741}, useLayoutEffect: function(a, b) { 3742 return ki(4194308, 4, a, b); 3743}, useInsertionEffect: function(a, b) { 3744 return ki(4, 2, a, b); 3745}, useMemo: function(a, b) { 3746 var c = Th(); 3747 b = void 0 === b ? null : b; 3748 a = a(); 3749 c.memoizedState = [a, b]; 3750 return a; 3751}, useReducer: function(a, b, c) { 3752 var d = Th(); 3753 b = void 0 !== c ? c(b) : b; 3754 d.memoizedState = d.baseState = b; 3755 a = { pending: null, interleaved: null, lanes: 0, dispatch: null, lastRenderedReducer: a, lastRenderedState: b }; 3756 d.queue = a; 3757 a = a.dispatch = xi.bind(null, M, a); 3758 return [d.memoizedState, a]; 3759}, useRef: function(a) { 3760 var b = Th(); 3761 a = { current: a }; 3762 return b.memoizedState = a; 3763}, useState: hi, useDebugValue: ri, useDeferredValue: function(a) { 3764 return Th().memoizedState = a; 3765}, useTransition: function() { 3766 var a = hi(false), b = a[0]; 3767 a = vi.bind(null, a[1]); 3768 Th().memoizedState = a; 3769 return [b, a]; 3770}, useMutableSource: function() { 3771}, useSyncExternalStore: function(a, b, c) { 3772 var d = M, e = Th(); 3773 if (I) { 3774 if (void 0 === c) throw Error(p(407)); 3775 c = c(); 3776 } else { 3777 c = b(); 3778 if (null === Q) throw Error(p(349)); 3779 0 !== (Hh & 30) || di(d, b, c); 3780 } 3781 e.memoizedState = c; 3782 var f2 = { value: c, getSnapshot: b }; 3783 e.queue = f2; 3784 mi(ai.bind( 3785 null, 3786 d, 3787 f2, 3788 a 3789 ), [a]); 3790 d.flags |= 2048; 3791 bi(9, ci.bind(null, d, f2, c, b), void 0, null); 3792 return c; 3793}, useId: function() { 3794 var a = Th(), b = Q.identifierPrefix; 3795 if (I) { 3796 var c = sg; 3797 var d = rg; 3798 c = (d & ~(1 << 32 - oc(d) - 1)).toString(32) + c; 3799 b = ":" + b + "R" + c; 3800 c = Kh++; 3801 0 < c && (b += "H" + c.toString(32)); 3802 b += ":"; 3803 } else c = Lh++, b = ":" + b + "r" + c.toString(32) + ":"; 3804 return a.memoizedState = b; 3805}, unstable_isNewReconciler: false }, Ph = { 3806 readContext: eh, 3807 useCallback: si, 3808 useContext: eh, 3809 useEffect: $h, 3810 useImperativeHandle: qi, 3811 useInsertionEffect: ni, 3812 useLayoutEffect: oi, 3813 useMemo: ti, 3814 useReducer: Wh, 3815 useRef: ji, 3816 useState: function() { 3817 return Wh(Vh); 3818 }, 3819 useDebugValue: ri, 3820 useDeferredValue: function(a) { 3821 var b = Uh(); 3822 return ui(b, N.memoizedState, a); 3823 }, 3824 useTransition: function() { 3825 var a = Wh(Vh)[0], b = Uh().memoizedState; 3826 return [a, b]; 3827 }, 3828 useMutableSource: Yh, 3829 useSyncExternalStore: Zh, 3830 useId: wi, 3831 unstable_isNewReconciler: false 3832}, Qh = { readContext: eh, useCallback: si, useContext: eh, useEffect: $h, useImperativeHandle: qi, useInsertionEffect: ni, useLayoutEffect: oi, useMemo: ti, useReducer: Xh, useRef: ji, useState: function() { 3833 return Xh(Vh); 3834}, useDebugValue: ri, useDeferredValue: function(a) { 3835 var b = Uh(); 3836 return null === N ? b.memoizedState = a : ui(b, N.memoizedState, a); 3837}, useTransition: function() { 3838 var a = Xh(Vh)[0], b = Uh().memoizedState; 3839 return [a, b]; 3840}, useMutableSource: Yh, useSyncExternalStore: Zh, useId: wi, unstable_isNewReconciler: false }; 3841function Ci(a, b) { 3842 if (a && a.defaultProps) { 3843 b = A({}, b); 3844 a = a.defaultProps; 3845 for (var c in a) void 0 === b[c] && (b[c] = a[c]); 3846 return b; 3847 } 3848 return b; 3849} 3850function Di(a, b, c, d) { 3851 b = a.memoizedState; 3852 c = c(d, b); 3853 c = null === c || void 0 === c ? b : A({}, b, c); 3854 a.memoizedState = c; 3855 0 === a.lanes && (a.updateQueue.baseState = c); 3856} 3857var Ei = { isMounted: function(a) { 3858 return (a = a._reactInternals) ? Vb(a) === a : false; 3859}, enqueueSetState: function(a, b, c) { 3860 a = a._reactInternals; 3861 var d = R(), e = yi(a), f2 = mh(d, e); 3862 f2.payload = b; 3863 void 0 !== c && null !== c && (f2.callback = c); 3864 b = nh(a, f2, e); 3865 null !== b && (gi(b, a, e, d), oh(b, a, e)); 3866}, enqueueReplaceState: function(a, b, c) { 3867 a = a._reactInternals; 3868 var d = R(), e = yi(a), f2 = mh(d, e); 3869 f2.tag = 1; 3870 f2.payload = b; 3871 void 0 !== c && null !== c && (f2.callback = c); 3872 b = nh(a, f2, e); 3873 null !== b && (gi(b, a, e, d), oh(b, a, e)); 3874}, enqueueForceUpdate: function(a, b) { 3875 a = a._reactInternals; 3876 var c = R(), d = yi(a), e = mh(c, d); 3877 e.tag = 2; 3878 void 0 !== b && null !== b && (e.callback = b); 3879 b = nh(a, e, d); 3880 null !== b && (gi(b, a, d, c), oh(b, a, d)); 3881} }; 3882function Fi(a, b, c, d, e, f2, g) { 3883 a = a.stateNode; 3884 return "function" === typeof a.shouldComponentUpdate ? a.shouldComponentUpdate(d, f2, g) : b.prototype && b.prototype.isPureReactComponent ? !Ie(c, d) || !Ie(e, f2) : true; 3885} 3886function Gi(a, b, c) { 3887 var d = false, e = Vf; 3888 var f2 = b.contextType; 3889 "object" === typeof f2 && null !== f2 ? f2 = eh(f2) : (e = Zf(b) ? Xf : H.current, d = b.contextTypes, f2 = (d = null !== d && void 0 !== d) ? Yf(a, e) : Vf); 3890 b = new b(c, f2); 3891 a.memoizedState = null !== b.state && void 0 !== b.state ? b.state : null; 3892 b.updater = Ei; 3893 a.stateNode = b; 3894 b._reactInternals = a; 3895 d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f2); 3896 return b; 3897} 3898function Hi(a, b, c, d) { 3899 a = b.state; 3900 "function" === typeof b.componentWillReceiveProps && b.componentWillReceiveProps(c, d); 3901 "function" === typeof b.UNSAFE_componentWillReceiveProps && b.UNSAFE_componentWillReceiveProps(c, d); 3902 b.state !== a && Ei.enqueueReplaceState(b, b.state, null); 3903} 3904function Ii(a, b, c, d) { 3905 var e = a.stateNode; 3906 e.props = c; 3907 e.state = a.memoizedState; 3908 e.refs = {}; 3909 kh(a); 3910 var f2 = b.contextType; 3911 "object" === typeof f2 && null !== f2 ? e.context = eh(f2) : (f2 = Zf(b) ? Xf : H.current, e.context = Yf(a, f2)); 3912 e.state = a.memoizedState; 3913 f2 = b.getDerivedStateFromProps; 3914 "function" === typeof f2 && (Di(a, b, f2, c), e.state = a.memoizedState); 3915 "function" === typeof b.getDerivedStateFromProps || "function" === typeof e.getSnapshotBeforeUpdate || "function" !== typeof e.UNSAFE_componentWillMount && "function" !== typeof e.componentWillMount || (b = e.state, "function" === typeof e.componentWillMount && e.componentWillMount(), "function" === typeof e.UNSAFE_componentWillMount && e.UNSAFE_componentWillMount(), b !== e.state && Ei.enqueueReplaceState(e, e.state, null), qh(a, c, e, d), e.state = a.memoizedState); 3916 "function" === typeof e.componentDidMount && (a.flags |= 4194308); 3917} 3918function Ji(a, b) { 3919 try { 3920 var c = "", d = b; 3921 do 3922 c += Pa(d), d = d.return; 3923 while (d); 3924 var e = c; 3925 } catch (f2) { 3926 e = "\nError generating stack: " + f2.message + "\n" + f2.stack; 3927 } 3928 return { value: a, source: b, stack: e, digest: null }; 3929} 3930function Ki(a, b, c) { 3931 return { value: a, source: null, stack: null != c ? c : null, digest: null != b ? b : null }; 3932} 3933function Li(a, b) { 3934 try { 3935 console.error(b.value); 3936 } catch (c) { 3937 setTimeout(function() { 3938 throw c; 3939 }); 3940 } 3941} 3942var Mi = "function" === typeof WeakMap ? WeakMap : Map; 3943function Ni(a, b, c) { 3944 c = mh(-1, c); 3945 c.tag = 3; 3946 c.payload = { element: null }; 3947 var d = b.value; 3948 c.callback = function() { 3949 Oi || (Oi = true, Pi = d); 3950 Li(a, b); 3951 }; 3952 return c; 3953} 3954function Qi(a, b, c) { 3955 c = mh(-1, c); 3956 c.tag = 3; 3957 var d = a.type.getDerivedStateFromError; 3958 if ("function" === typeof d) { 3959 var e = b.value; 3960 c.payload = function() { 3961 return d(e); 3962 }; 3963 c.callback = function() { 3964 Li(a, b); 3965 }; 3966 } 3967 var f2 = a.stateNode; 3968 null !== f2 && "function" === typeof f2.componentDidCatch && (c.callback = function() { 3969 Li(a, b); 3970 "function" !== typeof d && (null === Ri ? Ri = /* @__PURE__ */ new Set([this]) : Ri.add(this)); 3971 var c2 = b.stack; 3972 this.componentDidCatch(b.value, { componentStack: null !== c2 ? c2 : "" }); 3973 }); 3974 return c; 3975} 3976function Si(a, b, c) { 3977 var d = a.pingCache; 3978 if (null === d) { 3979 d = a.pingCache = new Mi(); 3980 var e = /* @__PURE__ */ new Set(); 3981 d.set(b, e); 3982 } else e = d.get(b), void 0 === e && (e = /* @__PURE__ */ new Set(), d.set(b, e)); 3983 e.has(c) || (e.add(c), a = Ti.bind(null, a, b, c), b.then(a, a)); 3984} 3985function Ui(a) { 3986 do { 3987 var b; 3988 if (b = 13 === a.tag) b = a.memoizedState, b = null !== b ? null !== b.dehydrated ? true : false : true; 3989 if (b) return a; 3990 a = a.return; 3991 } while (null !== a); 3992 return null; 3993} 3994function Vi(a, b, c, d, e) { 3995 if (0 === (a.mode & 1)) return a === b ? a.flags |= 65536 : (a.flags |= 128, c.flags |= 131072, c.flags &= -52805, 1 === c.tag && (null === c.alternate ? c.tag = 17 : (b = mh(-1, 1), b.tag = 2, nh(c, b, 1))), c.lanes |= 1), a; 3996 a.flags |= 65536; 3997 a.lanes = e; 3998 return a; 3999} 4000var Wi = ua.ReactCurrentOwner, dh = false; 4001function Xi(a, b, c, d) { 4002 b.child = null === a ? Vg(b, null, c, d) : Ug(b, a.child, c, d); 4003} 4004function Yi(a, b, c, d, e) { 4005 c = c.render; 4006 var f2 = b.ref; 4007 ch(b, e); 4008 d = Nh(a, b, c, d, f2, e); 4009 c = Sh(); 4010 if (null !== a && !dh) return b.updateQueue = a.updateQueue, b.flags &= -2053, a.lanes &= ~e, Zi(a, b, e); 4011 I && c && vg(b); 4012 b.flags |= 1; 4013 Xi(a, b, d, e); 4014 return b.child; 4015} 4016function $i(a, b, c, d, e) { 4017 if (null === a) { 4018 var f2 = c.type; 4019 if ("function" === typeof f2 && !aj(f2) && void 0 === f2.defaultProps && null === c.compare && void 0 === c.defaultProps) return b.tag = 15, b.type = f2, bj(a, b, f2, d, e); 4020 a = Rg(c.type, null, d, b, b.mode, e); 4021 a.ref = b.ref; 4022 a.return = b; 4023 return b.child = a; 4024 } 4025 f2 = a.child; 4026 if (0 === (a.lanes & e)) { 4027 var g = f2.memoizedProps; 4028 c = c.compare; 4029 c = null !== c ? c : Ie; 4030 if (c(g, d) && a.ref === b.ref) return Zi(a, b, e); 4031 } 4032 b.flags |= 1; 4033 a = Pg(f2, d); 4034 a.ref = b.ref; 4035 a.return = b; 4036 return b.child = a; 4037} 4038function bj(a, b, c, d, e) { 4039 if (null !== a) { 4040 var f2 = a.memoizedProps; 4041 if (Ie(f2, d) && a.ref === b.ref) if (dh = false, b.pendingProps = d = f2, 0 !== (a.lanes & e)) 0 !== (a.flags & 131072) && (dh = true); 4042 else return b.lanes = a.lanes, Zi(a, b, e); 4043 } 4044 return cj(a, b, c, d, e); 4045} 4046function dj(a, b, c) { 4047 var d = b.pendingProps, e = d.children, f2 = null !== a ? a.memoizedState : null; 4048 if ("hidden" === d.mode) if (0 === (b.mode & 1)) b.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }, G(ej, fj), fj |= c; 4049 else { 4050 if (0 === (c & 1073741824)) return a = null !== f2 ? f2.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = { baseLanes: a, cachePool: null, transitions: null }, b.updateQueue = null, G(ej, fj), fj |= a, null; 4051 b.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }; 4052 d = null !== f2 ? f2.baseLanes : c; 4053 G(ej, fj); 4054 fj |= d; 4055 } 4056 else null !== f2 ? (d = f2.baseLanes | c, b.memoizedState = null) : d = c, G(ej, fj), fj |= d; 4057 Xi(a, b, e, c); 4058 return b.child; 4059} 4060function gj(a, b) { 4061 var c = b.ref; 4062 if (null === a && null !== c || null !== a && a.ref !== c) b.flags |= 512, b.flags |= 2097152; 4063} 4064function cj(a, b, c, d, e) { 4065 var f2 = Zf(c) ? Xf : H.current; 4066 f2 = Yf(b, f2); 4067 ch(b, e); 4068 c = Nh(a, b, c, d, f2, e); 4069 d = Sh(); 4070 if (null !== a && !dh) return b.updateQueue = a.updateQueue, b.flags &= -2053, a.lanes &= ~e, Zi(a, b, e); 4071 I && d && vg(b); 4072 b.flags |= 1; 4073 Xi(a, b, c, e); 4074 return b.child; 4075} 4076function hj(a, b, c, d, e) { 4077 if (Zf(c)) { 4078 var f2 = true; 4079 cg(b); 4080 } else f2 = false; 4081 ch(b, e); 4082 if (null === b.stateNode) ij(a, b), Gi(b, c, d), Ii(b, c, d, e), d = true; 4083 else if (null === a) { 4084 var g = b.stateNode, h = b.memoizedProps; 4085 g.props = h; 4086 var k2 = g.context, l2 = c.contextType; 4087 "object" === typeof l2 && null !== l2 ? l2 = eh(l2) : (l2 = Zf(c) ? Xf : H.current, l2 = Yf(b, l2)); 4088 var m2 = c.getDerivedStateFromProps, q2 = "function" === typeof m2 || "function" === typeof g.getSnapshotBeforeUpdate; 4089 q2 || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== d || k2 !== l2) && Hi(b, g, d, l2); 4090 jh = false; 4091 var r2 = b.memoizedState; 4092 g.state = r2; 4093 qh(b, d, g, e); 4094 k2 = b.memoizedState; 4095 h !== d || r2 !== k2 || Wf.current || jh ? ("function" === typeof m2 && (Di(b, c, m2, d), k2 = b.memoizedState), (h = jh || Fi(b, c, h, d, r2, k2, l2)) ? (q2 || "function" !== typeof g.UNSAFE_componentWillMount && "function" !== typeof g.componentWillMount || ("function" === typeof g.componentWillMount && g.componentWillMount(), "function" === typeof g.UNSAFE_componentWillMount && g.UNSAFE_componentWillMount()), "function" === typeof g.componentDidMount && (b.flags |= 4194308)) : ("function" === typeof g.componentDidMount && (b.flags |= 4194308), b.memoizedProps = d, b.memoizedState = k2), g.props = d, g.state = k2, g.context = l2, d = h) : ("function" === typeof g.componentDidMount && (b.flags |= 4194308), d = false); 4096 } else { 4097 g = b.stateNode; 4098 lh(a, b); 4099 h = b.memoizedProps; 4100 l2 = b.type === b.elementType ? h : Ci(b.type, h); 4101 g.props = l2; 4102 q2 = b.pendingProps; 4103 r2 = g.context; 4104 k2 = c.contextType; 4105 "object" === typeof k2 && null !== k2 ? k2 = eh(k2) : (k2 = Zf(c) ? Xf : H.current, k2 = Yf(b, k2)); 4106 var y2 = c.getDerivedStateFromProps; 4107 (m2 = "function" === typeof y2 || "function" === typeof g.getSnapshotBeforeUpdate) || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== q2 || r2 !== k2) && Hi(b, g, d, k2); 4108 jh = false; 4109 r2 = b.memoizedState; 4110 g.state = r2; 4111 qh(b, d, g, e); 4112 var n2 = b.memoizedState; 4113 h !== q2 || r2 !== n2 || Wf.current || jh ? ("function" === typeof y2 && (Di(b, c, y2, d), n2 = b.memoizedState), (l2 = jh || Fi(b, c, l2, d, r2, n2, k2) || false) ? (m2 || "function" !== typeof g.UNSAFE_componentWillUpdate && "function" !== typeof g.componentWillUpdate || ("function" === typeof g.componentWillUpdate && g.componentWillUpdate(d, n2, k2), "function" === typeof g.UNSAFE_componentWillUpdate && g.UNSAFE_componentWillUpdate(d, n2, k2)), "function" === typeof g.componentDidUpdate && (b.flags |= 4), "function" === typeof g.getSnapshotBeforeUpdate && (b.flags |= 1024)) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 1024), b.memoizedProps = d, b.memoizedState = n2), g.props = d, g.state = n2, g.context = k2, d = l2) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && r2 === a.memoizedState || (b.flags |= 1024), d = false); 4114 } 4115 return jj(a, b, c, d, f2, e); 4116} 4117function jj(a, b, c, d, e, f2) { 4118 gj(a, b); 4119 var g = 0 !== (b.flags & 128); 4120 if (!d && !g) return e && dg(b, c, false), Zi(a, b, f2); 4121 d = b.stateNode; 4122 Wi.current = b; 4123 var h = g && "function" !== typeof c.getDerivedStateFromError ? null : d.render(); 4124 b.flags |= 1; 4125 null !== a && g ? (b.child = Ug(b, a.child, null, f2), b.child = Ug(b, null, h, f2)) : Xi(a, b, h, f2); 4126 b.memoizedState = d.state; 4127 e && dg(b, c, true); 4128 return b.child; 4129} 4130function kj(a) { 4131 var b = a.stateNode; 4132 b.pendingContext ? ag(a, b.pendingContext, b.pendingContext !== b.context) : b.context && ag(a, b.context, false); 4133 yh(a, b.containerInfo); 4134} 4135function lj(a, b, c, d, e) { 4136 Ig(); 4137 Jg(e); 4138 b.flags |= 256; 4139 Xi(a, b, c, d); 4140 return b.child; 4141} 4142var mj = { dehydrated: null, treeContext: null, retryLane: 0 }; 4143function nj(a) { 4144 return { baseLanes: a, cachePool: null, transitions: null }; 4145} 4146function oj(a, b, c) { 4147 var d = b.pendingProps, e = L.current, f2 = false, g = 0 !== (b.flags & 128), h; 4148 (h = g) || (h = null !== a && null === a.memoizedState ? false : 0 !== (e & 2)); 4149 if (h) f2 = true, b.flags &= -129; 4150 else if (null === a || null !== a.memoizedState) e |= 1; 4151 G(L, e & 1); 4152 if (null === a) { 4153 Eg(b); 4154 a = b.memoizedState; 4155 if (null !== a && (a = a.dehydrated, null !== a)) return 0 === (b.mode & 1) ? b.lanes = 1 : "$!" === a.data ? b.lanes = 8 : b.lanes = 1073741824, null; 4156 g = d.children; 4157 a = d.fallback; 4158 return f2 ? (d = b.mode, f2 = b.child, g = { mode: "hidden", children: g }, 0 === (d & 1) && null !== f2 ? (f2.childLanes = 0, f2.pendingProps = g) : f2 = pj(g, d, 0, null), a = Tg(a, d, c, null), f2.return = b, a.return = b, f2.sibling = a, b.child = f2, b.child.memoizedState = nj(c), b.memoizedState = mj, a) : qj(b, g); 4159 } 4160 e = a.memoizedState; 4161 if (null !== e && (h = e.dehydrated, null !== h)) return rj(a, b, g, d, h, e, c); 4162 if (f2) { 4163 f2 = d.fallback; 4164 g = b.mode; 4165 e = a.child; 4166 h = e.sibling; 4167 var k2 = { mode: "hidden", children: d.children }; 4168 0 === (g & 1) && b.child !== e ? (d = b.child, d.childLanes = 0, d.pendingProps = k2, b.deletions = null) : (d = Pg(e, k2), d.subtreeFlags = e.subtreeFlags & 14680064); 4169 null !== h ? f2 = Pg(h, f2) : (f2 = Tg(f2, g, c, null), f2.flags |= 2); 4170 f2.return = b; 4171 d.return = b; 4172 d.sibling = f2; 4173 b.child = d; 4174 d = f2; 4175 f2 = b.child; 4176 g = a.child.memoizedState; 4177 g = null === g ? nj(c) : { baseLanes: g.baseLanes | c, cachePool: null, transitions: g.transitions }; 4178 f2.memoizedState = g; 4179 f2.childLanes = a.childLanes & ~c; 4180 b.memoizedState = mj; 4181 return d; 4182 } 4183 f2 = a.child; 4184 a = f2.sibling; 4185 d = Pg(f2, { mode: "visible", children: d.children }); 4186 0 === (b.mode & 1) && (d.lanes = c); 4187 d.return = b; 4188 d.sibling = null; 4189 null !== a && (c = b.deletions, null === c ? (b.deletions = [a], b.flags |= 16) : c.push(a)); 4190 b.child = d; 4191 b.memoizedState = null; 4192 return d; 4193} 4194function qj(a, b) { 4195 b = pj({ mode: "visible", children: b }, a.mode, 0, null); 4196 b.return = a; 4197 return a.child = b; 4198} 4199function sj(a, b, c, d) { 4200 null !== d && Jg(d); 4201 Ug(b, a.child, null, c); 4202 a = qj(b, b.pendingProps.children); 4203 a.flags |= 2; 4204 b.memoizedState = null; 4205 return a; 4206} 4207function rj(a, b, c, d, e, f2, g) { 4208 if (c) { 4209 if (b.flags & 256) return b.flags &= -257, d = Ki(Error(p(422))), sj(a, b, g, d); 4210 if (null !== b.memoizedState) return b.child = a.child, b.flags |= 128, null; 4211 f2 = d.fallback; 4212 e = b.mode; 4213 d = pj({ mode: "visible", children: d.children }, e, 0, null); 4214 f2 = Tg(f2, e, g, null); 4215 f2.flags |= 2; 4216 d.return = b; 4217 f2.return = b; 4218 d.sibling = f2; 4219 b.child = d; 4220 0 !== (b.mode & 1) && Ug(b, a.child, null, g); 4221 b.child.memoizedState = nj(g); 4222 b.memoizedState = mj; 4223 return f2; 4224 } 4225 if (0 === (b.mode & 1)) return sj(a, b, g, null); 4226 if ("$!" === e.data) { 4227 d = e.nextSibling && e.nextSibling.dataset; 4228 if (d) var h = d.dgst; 4229 d = h; 4230 f2 = Error(p(419)); 4231 d = Ki(f2, d, void 0); 4232 return sj(a, b, g, d); 4233 } 4234 h = 0 !== (g & a.childLanes); 4235 if (dh || h) { 4236 d = Q; 4237 if (null !== d) { 4238 switch (g & -g) { 4239 case 4: 4240 e = 2; 4241 break; 4242 case 16: 4243 e = 8; 4244 break; 4245 case 64: 4246 case 128: 4247 case 256: 4248 case 512: 4249 case 1024: 4250 case 2048: 4251 case 4096: 4252 case 8192: 4253 case 16384: 4254 case 32768: 4255 case 65536: 4256 case 131072: 4257 case 262144: 4258 case 524288: 4259 case 1048576: 4260 case 2097152: 4261 case 4194304: 4262 case 8388608: 4263 case 16777216: 4264 case 33554432: 4265 case 67108864: 4266 e = 32; 4267 break; 4268 case 536870912: 4269 e = 268435456; 4270 break; 4271 default: 4272 e = 0; 4273 } 4274 e = 0 !== (e & (d.suspendedLanes | g)) ? 0 : e; 4275 0 !== e && e !== f2.retryLane && (f2.retryLane = e, ih(a, e), gi(d, a, e, -1)); 4276 } 4277 tj(); 4278 d = Ki(Error(p(421))); 4279 return sj(a, b, g, d); 4280 } 4281 if ("$?" === e.data) return b.flags |= 128, b.child = a.child, b = uj.bind(null, a), e._reactRetry = b, null; 4282 a = f2.treeContext; 4283 yg = Lf(e.nextSibling); 4284 xg = b; 4285 I = true; 4286 zg = null; 4287 null !== a && (og[pg++] = rg, og[pg++] = sg, og[pg++] = qg, rg = a.id, sg = a.overflow, qg = b); 4288 b = qj(b, d.children); 4289 b.flags |= 4096; 4290 return b; 4291} 4292function vj(a, b, c) { 4293 a.lanes |= b; 4294 var d = a.alternate; 4295 null !== d && (d.lanes |= b); 4296 bh(a.return, b, c); 4297} 4298function wj(a, b, c, d, e) { 4299 var f2 = a.memoizedState; 4300 null === f2 ? a.memoizedState = { isBackwards: b, rendering: null, renderingStartTime: 0, last: d, tail: c, tailMode: e } : (f2.isBackwards = b, f2.rendering = null, f2.renderingStartTime = 0, f2.last = d, f2.tail = c, f2.tailMode = e); 4301} 4302function xj(a, b, c) { 4303 var d = b.pendingProps, e = d.revealOrder, f2 = d.tail; 4304 Xi(a, b, d.children, c); 4305 d = L.current; 4306 if (0 !== (d & 2)) d = d & 1 | 2, b.flags |= 128; 4307 else { 4308 if (null !== a && 0 !== (a.flags & 128)) a: for (a = b.child; null !== a; ) { 4309 if (13 === a.tag) null !== a.memoizedState && vj(a, c, b); 4310 else if (19 === a.tag) vj(a, c, b); 4311 else if (null !== a.child) { 4312 a.child.return = a; 4313 a = a.child; 4314 continue; 4315 } 4316 if (a === b) break a; 4317 for (; null === a.sibling; ) { 4318 if (null === a.return || a.return === b) break a; 4319 a = a.return; 4320 } 4321 a.sibling.return = a.return; 4322 a = a.sibling; 4323 } 4324 d &= 1; 4325 } 4326 G(L, d); 4327 if (0 === (b.mode & 1)) b.memoizedState = null; 4328 else switch (e) { 4329 case "forwards": 4330 c = b.child; 4331 for (e = null; null !== c; ) a = c.alternate, null !== a && null === Ch(a) && (e = c), c = c.sibling; 4332 c = e; 4333 null === c ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null); 4334 wj(b, false, e, c, f2); 4335 break; 4336 case "backwards": 4337 c = null; 4338 e = b.child; 4339 for (b.child = null; null !== e; ) { 4340 a = e.alternate; 4341 if (null !== a && null === Ch(a)) { 4342 b.child = e; 4343 break; 4344 } 4345 a = e.sibling; 4346 e.sibling = c; 4347 c = e; 4348 e = a; 4349 } 4350 wj(b, true, c, null, f2); 4351 break; 4352 case "together": 4353 wj(b, false, null, null, void 0); 4354 break; 4355 default: 4356 b.memoizedState = null; 4357 } 4358 return b.child; 4359} 4360function ij(a, b) { 4361 0 === (b.mode & 1) && null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2); 4362} 4363function Zi(a, b, c) { 4364 null !== a && (b.dependencies = a.dependencies); 4365 rh |= b.lanes; 4366 if (0 === (c & b.childLanes)) return null; 4367 if (null !== a && b.child !== a.child) throw Error(p(153)); 4368 if (null !== b.child) { 4369 a = b.child; 4370 c = Pg(a, a.pendingProps); 4371 b.child = c; 4372 for (c.return = b; null !== a.sibling; ) a = a.sibling, c = c.sibling = Pg(a, a.pendingProps), c.return = b; 4373 c.sibling = null; 4374 } 4375 return b.child; 4376} 4377function yj(a, b, c) { 4378 switch (b.tag) { 4379 case 3: 4380 kj(b); 4381 Ig(); 4382 break; 4383 case 5: 4384 Ah(b); 4385 break; 4386 case 1: 4387 Zf(b.type) && cg(b); 4388 break; 4389 case 4: 4390 yh(b, b.stateNode.containerInfo); 4391 break; 4392 case 10: 4393 var d = b.type._context, e = b.memoizedProps.value; 4394 G(Wg, d._currentValue); 4395 d._currentValue = e; 4396 break; 4397 case 13: 4398 d = b.memoizedState; 4399 if (null !== d) { 4400 if (null !== d.dehydrated) return G(L, L.current & 1), b.flags |= 128, null; 4401 if (0 !== (c & b.child.childLanes)) return oj(a, b, c); 4402 G(L, L.current & 1); 4403 a = Zi(a, b, c); 4404 return null !== a ? a.sibling : null; 4405 } 4406 G(L, L.current & 1); 4407 break; 4408 case 19: 4409 d = 0 !== (c & b.childLanes); 4410 if (0 !== (a.flags & 128)) { 4411 if (d) return xj(a, b, c); 4412 b.flags |= 128; 4413 } 4414 e = b.memoizedState; 4415 null !== e && (e.rendering = null, e.tail = null, e.lastEffect = null); 4416 G(L, L.current); 4417 if (d) break; 4418 else return null; 4419 case 22: 4420 case 23: 4421 return b.lanes = 0, dj(a, b, c); 4422 } 4423 return Zi(a, b, c); 4424} 4425var zj, Aj, Bj, Cj; 4426zj = function(a, b) { 4427 for (var c = b.child; null !== c; ) { 4428 if (5 === c.tag || 6 === c.tag) a.appendChild(c.stateNode); 4429 else if (4 !== c.tag && null !== c.child) { 4430 c.child.return = c; 4431 c = c.child; 4432 continue; 4433 } 4434 if (c === b) break; 4435 for (; null === c.sibling; ) { 4436 if (null === c.return || c.return === b) return; 4437 c = c.return; 4438 } 4439 c.sibling.return = c.return; 4440 c = c.sibling; 4441 } 4442}; 4443Aj = function() { 4444}; 4445Bj = function(a, b, c, d) { 4446 var e = a.memoizedProps; 4447 if (e !== d) { 4448 a = b.stateNode; 4449 xh(uh.current); 4450 var f2 = null; 4451 switch (c) { 4452 case "input": 4453 e = Ya(a, e); 4454 d = Ya(a, d); 4455 f2 = []; 4456 break; 4457 case "select": 4458 e = A({}, e, { value: void 0 }); 4459 d = A({}, d, { value: void 0 }); 4460 f2 = []; 4461 break; 4462 case "textarea": 4463 e = gb(a, e); 4464 d = gb(a, d); 4465 f2 = []; 4466 break; 4467 default: 4468 "function" !== typeof e.onClick && "function" === typeof d.onClick && (a.onclick = Bf); 4469 } 4470 ub(c, d); 4471 var g; 4472 c = null; 4473 for (l2 in e) if (!d.hasOwnProperty(l2) && e.hasOwnProperty(l2) && null != e[l2]) if ("style" === l2) { 4474 var h = e[l2]; 4475 for (g in h) h.hasOwnProperty(g) && (c || (c = {}), c[g] = ""); 4476 } else "dangerouslySetInnerHTML" !== l2 && "children" !== l2 && "suppressContentEditableWarning" !== l2 && "suppressHydrationWarning" !== l2 && "autoFocus" !== l2 && (ea.hasOwnProperty(l2) ? f2 || (f2 = []) : (f2 = f2 || []).push(l2, null)); 4477 for (l2 in d) { 4478 var k2 = d[l2]; 4479 h = null != e ? e[l2] : void 0; 4480 if (d.hasOwnProperty(l2) && k2 !== h && (null != k2 || null != h)) if ("style" === l2) if (h) { 4481 for (g in h) !h.hasOwnProperty(g) || k2 && k2.hasOwnProperty(g) || (c || (c = {}), c[g] = ""); 4482 for (g in k2) k2.hasOwnProperty(g) && h[g] !== k2[g] && (c || (c = {}), c[g] = k2[g]); 4483 } else c || (f2 || (f2 = []), f2.push( 4484 l2, 4485 c 4486 )), c = k2; 4487 else "dangerouslySetInnerHTML" === l2 ? (k2 = k2 ? k2.__html : void 0, h = h ? h.__html : void 0, null != k2 && h !== k2 && (f2 = f2 || []).push(l2, k2)) : "children" === l2 ? "string" !== typeof k2 && "number" !== typeof k2 || (f2 = f2 || []).push(l2, "" + k2) : "suppressContentEditableWarning" !== l2 && "suppressHydrationWarning" !== l2 && (ea.hasOwnProperty(l2) ? (null != k2 && "onScroll" === l2 && D("scroll", a), f2 || h === k2 || (f2 = [])) : (f2 = f2 || []).push(l2, k2)); 4488 } 4489 c && (f2 = f2 || []).push("style", c); 4490 var l2 = f2; 4491 if (b.updateQueue = l2) b.flags |= 4; 4492 } 4493}; 4494Cj = function(a, b, c, d) { 4495 c !== d && (b.flags |= 4); 4496}; 4497function Dj(a, b) { 4498 if (!I) switch (a.tailMode) { 4499 case "hidden": 4500 b = a.tail; 4501 for (var c = null; null !== b; ) null !== b.alternate && (c = b), b = b.sibling; 4502 null === c ? a.tail = null : c.sibling = null; 4503 break; 4504 case "collapsed": 4505 c = a.tail; 4506 for (var d = null; null !== c; ) null !== c.alternate && (d = c), c = c.sibling; 4507 null === d ? b || null === a.tail ? a.tail = null : a.tail.sibling = null : d.sibling = null; 4508 } 4509} 4510function S(a) { 4511 var b = null !== a.alternate && a.alternate.child === a.child, c = 0, d = 0; 4512 if (b) for (var e = a.child; null !== e; ) c |= e.lanes | e.childLanes, d |= e.subtreeFlags & 14680064, d |= e.flags & 14680064, e.return = a, e = e.sibling; 4513 else for (e = a.child; null !== e; ) c |= e.lanes | e.childLanes, d |= e.subtreeFlags, d |= e.flags, e.return = a, e = e.sibling; 4514 a.subtreeFlags |= d; 4515 a.childLanes = c; 4516 return b; 4517} 4518function Ej(a, b, c) { 4519 var d = b.pendingProps; 4520 wg(b); 4521 switch (b.tag) { 4522 case 2: 4523 case 16: 4524 case 15: 4525 case 0: 4526 case 11: 4527 case 7: 4528 case 8: 4529 case 12: 4530 case 9: 4531 case 14: 4532 return S(b), null; 4533 case 1: 4534 return Zf(b.type) && $f(), S(b), null; 4535 case 3: 4536 d = b.stateNode; 4537 zh(); 4538 E(Wf); 4539 E(H); 4540 Eh(); 4541 d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null); 4542 if (null === a || null === a.child) Gg(b) ? b.flags |= 4 : null === a || a.memoizedState.isDehydrated && 0 === (b.flags & 256) || (b.flags |= 1024, null !== zg && (Fj(zg), zg = null)); 4543 Aj(a, b); 4544 S(b); 4545 return null; 4546 case 5: 4547 Bh(b); 4548 var e = xh(wh.current); 4549 c = b.type; 4550 if (null !== a && null != b.stateNode) Bj(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 512, b.flags |= 2097152); 4551 else { 4552 if (!d) { 4553 if (null === b.stateNode) throw Error(p(166)); 4554 S(b); 4555 return null; 4556 } 4557 a = xh(uh.current); 4558 if (Gg(b)) { 4559 d = b.stateNode; 4560 c = b.type; 4561 var f2 = b.memoizedProps; 4562 d[Of] = b; 4563 d[Pf] = f2; 4564 a = 0 !== (b.mode & 1); 4565 switch (c) { 4566 case "dialog": 4567 D("cancel", d); 4568 D("close", d); 4569 break; 4570 case "iframe": 4571 case "object": 4572 case "embed": 4573 D("load", d); 4574 break; 4575 case "video": 4576 case "audio": 4577 for (e = 0; e < lf.length; e++) D(lf[e], d); 4578 break; 4579 case "source": 4580 D("error", d); 4581 break; 4582 case "img": 4583 case "image": 4584 case "link": 4585 D( 4586 "error", 4587 d 4588 ); 4589 D("load", d); 4590 break; 4591 case "details": 4592 D("toggle", d); 4593 break; 4594 case "input": 4595 Za(d, f2); 4596 D("invalid", d); 4597 break; 4598 case "select": 4599 d._wrapperState = { wasMultiple: !!f2.multiple }; 4600 D("invalid", d); 4601 break; 4602 case "textarea": 4603 hb(d, f2), D("invalid", d); 4604 } 4605 ub(c, f2); 4606 e = null; 4607 for (var g in f2) if (f2.hasOwnProperty(g)) { 4608 var h = f2[g]; 4609 "children" === g ? "string" === typeof h ? d.textContent !== h && (true !== f2.suppressHydrationWarning && Af(d.textContent, h, a), e = ["children", h]) : "number" === typeof h && d.textContent !== "" + h && (true !== f2.suppressHydrationWarning && Af( 4610 d.textContent, 4611 h, 4612 a 4613 ), e = ["children", "" + h]) : ea.hasOwnProperty(g) && null != h && "onScroll" === g && D("scroll", d); 4614 } 4615 switch (c) { 4616 case "input": 4617 Va(d); 4618 db(d, f2, true); 4619 break; 4620 case "textarea": 4621 Va(d); 4622 jb(d); 4623 break; 4624 case "select": 4625 case "option": 4626 break; 4627 default: 4628 "function" === typeof f2.onClick && (d.onclick = Bf); 4629 } 4630 d = e; 4631 b.updateQueue = d; 4632 null !== d && (b.flags |= 4); 4633 } else { 4634 g = 9 === e.nodeType ? e : e.ownerDocument; 4635 "http://www.w3.org/1999/xhtml" === a && (a = kb(c)); 4636 "http://www.w3.org/1999/xhtml" === a ? "script" === c ? (a = g.createElement("div"), a.innerHTML = "<script><\/script>", a = a.removeChild(a.firstChild)) : "string" === typeof d.is ? a = g.createElement(c, { is: d.is }) : (a = g.createElement(c), "select" === c && (g = a, d.multiple ? g.multiple = true : d.size && (g.size = d.size))) : a = g.createElementNS(a, c); 4637 a[Of] = b; 4638 a[Pf] = d; 4639 zj(a, b, false, false); 4640 b.stateNode = a; 4641 a: { 4642 g = vb(c, d); 4643 switch (c) { 4644 case "dialog": 4645 D("cancel", a); 4646 D("close", a); 4647 e = d; 4648 break; 4649 case "iframe": 4650 case "object": 4651 case "embed": 4652 D("load", a); 4653 e = d; 4654 break; 4655 case "video": 4656 case "audio": 4657 for (e = 0; e < lf.length; e++) D(lf[e], a); 4658 e = d; 4659 break; 4660 case "source": 4661 D("error", a); 4662 e = d; 4663 break; 4664 case "img": 4665 case "image": 4666 case "link": 4667 D( 4668 "error", 4669 a 4670 ); 4671 D("load", a); 4672 e = d; 4673 break; 4674 case "details": 4675 D("toggle", a); 4676 e = d; 4677 break; 4678 case "input": 4679 Za(a, d); 4680 e = Ya(a, d); 4681 D("invalid", a); 4682 break; 4683 case "option": 4684 e = d; 4685 break; 4686 case "select": 4687 a._wrapperState = { wasMultiple: !!d.multiple }; 4688 e = A({}, d, { value: void 0 }); 4689 D("invalid", a); 4690 break; 4691 case "textarea": 4692 hb(a, d); 4693 e = gb(a, d); 4694 D("invalid", a); 4695 break; 4696 default: 4697 e = d; 4698 } 4699 ub(c, e); 4700 h = e; 4701 for (f2 in h) if (h.hasOwnProperty(f2)) { 4702 var k2 = h[f2]; 4703 "style" === f2 ? sb(a, k2) : "dangerouslySetInnerHTML" === f2 ? (k2 = k2 ? k2.__html : void 0, null != k2 && nb(a, k2)) : "children" === f2 ? "string" === typeof k2 ? ("textarea" !== c || "" !== k2) && ob(a, k2) : "number" === typeof k2 && ob(a, "" + k2) : "suppressContentEditableWarning" !== f2 && "suppressHydrationWarning" !== f2 && "autoFocus" !== f2 && (ea.hasOwnProperty(f2) ? null != k2 && "onScroll" === f2 && D("scroll", a) : null != k2 && ta(a, f2, k2, g)); 4704 } 4705 switch (c) { 4706 case "input": 4707 Va(a); 4708 db(a, d, false); 4709 break; 4710 case "textarea": 4711 Va(a); 4712 jb(a); 4713 break; 4714 case "option": 4715 null != d.value && a.setAttribute("value", "" + Sa(d.value)); 4716 break; 4717 case "select": 4718 a.multiple = !!d.multiple; 4719 f2 = d.value; 4720 null != f2 ? fb(a, !!d.multiple, f2, false) : null != d.defaultValue && fb( 4721 a, 4722 !!d.multiple, 4723 d.defaultValue, 4724 true 4725 ); 4726 break; 4727 default: 4728 "function" === typeof e.onClick && (a.onclick = Bf); 4729 } 4730 switch (c) { 4731 case "button": 4732 case "input": 4733 case "select": 4734 case "textarea": 4735 d = !!d.autoFocus; 4736 break a; 4737 case "img": 4738 d = true; 4739 break a; 4740 default: 4741 d = false; 4742 } 4743 } 4744 d && (b.flags |= 4); 4745 } 4746 null !== b.ref && (b.flags |= 512, b.flags |= 2097152); 4747 } 4748 S(b); 4749 return null; 4750 case 6: 4751 if (a && null != b.stateNode) Cj(a, b, a.memoizedProps, d); 4752 else { 4753 if ("string" !== typeof d && null === b.stateNode) throw Error(p(166)); 4754 c = xh(wh.current); 4755 xh(uh.current); 4756 if (Gg(b)) { 4757 d = b.stateNode; 4758 c = b.memoizedProps; 4759 d[Of] = b; 4760 if (f2 = d.nodeValue !== c) { 4761 if (a = xg, null !== a) switch (a.tag) { 4762 case 3: 4763 Af(d.nodeValue, c, 0 !== (a.mode & 1)); 4764 break; 4765 case 5: 4766 true !== a.memoizedProps.suppressHydrationWarning && Af(d.nodeValue, c, 0 !== (a.mode & 1)); 4767 } 4768 } 4769 f2 && (b.flags |= 4); 4770 } else d = (9 === c.nodeType ? c : c.ownerDocument).createTextNode(d), d[Of] = b, b.stateNode = d; 4771 } 4772 S(b); 4773 return null; 4774 case 13: 4775 E(L); 4776 d = b.memoizedState; 4777 if (null === a || null !== a.memoizedState && null !== a.memoizedState.dehydrated) { 4778 if (I && null !== yg && 0 !== (b.mode & 1) && 0 === (b.flags & 128)) Hg(), Ig(), b.flags |= 98560, f2 = false; 4779 else if (f2 = Gg(b), null !== d && null !== d.dehydrated) { 4780 if (null === a) { 4781 if (!f2) throw Error(p(318)); 4782 f2 = b.memoizedState; 4783 f2 = null !== f2 ? f2.dehydrated : null; 4784 if (!f2) throw Error(p(317)); 4785 f2[Of] = b; 4786 } else Ig(), 0 === (b.flags & 128) && (b.memoizedState = null), b.flags |= 4; 4787 S(b); 4788 f2 = false; 4789 } else null !== zg && (Fj(zg), zg = null), f2 = true; 4790 if (!f2) return b.flags & 65536 ? b : null; 4791 } 4792 if (0 !== (b.flags & 128)) return b.lanes = c, b; 4793 d = null !== d; 4794 d !== (null !== a && null !== a.memoizedState) && d && (b.child.flags |= 8192, 0 !== (b.mode & 1) && (null === a || 0 !== (L.current & 1) ? 0 === T && (T = 3) : tj())); 4795 null !== b.updateQueue && (b.flags |= 4); 4796 S(b); 4797 return null; 4798 case 4: 4799 return zh(), Aj(a, b), null === a && sf(b.stateNode.containerInfo), S(b), null; 4800 case 10: 4801 return ah(b.type._context), S(b), null; 4802 case 17: 4803 return Zf(b.type) && $f(), S(b), null; 4804 case 19: 4805 E(L); 4806 f2 = b.memoizedState; 4807 if (null === f2) return S(b), null; 4808 d = 0 !== (b.flags & 128); 4809 g = f2.rendering; 4810 if (null === g) if (d) Dj(f2, false); 4811 else { 4812 if (0 !== T || null !== a && 0 !== (a.flags & 128)) for (a = b.child; null !== a; ) { 4813 g = Ch(a); 4814 if (null !== g) { 4815 b.flags |= 128; 4816 Dj(f2, false); 4817 d = g.updateQueue; 4818 null !== d && (b.updateQueue = d, b.flags |= 4); 4819 b.subtreeFlags = 0; 4820 d = c; 4821 for (c = b.child; null !== c; ) f2 = c, a = d, f2.flags &= 14680066, g = f2.alternate, null === g ? (f2.childLanes = 0, f2.lanes = a, f2.child = null, f2.subtreeFlags = 0, f2.memoizedProps = null, f2.memoizedState = null, f2.updateQueue = null, f2.dependencies = null, f2.stateNode = null) : (f2.childLanes = g.childLanes, f2.lanes = g.lanes, f2.child = g.child, f2.subtreeFlags = 0, f2.deletions = null, f2.memoizedProps = g.memoizedProps, f2.memoizedState = g.memoizedState, f2.updateQueue = g.updateQueue, f2.type = g.type, a = g.dependencies, f2.dependencies = null === a ? null : { lanes: a.lanes, firstContext: a.firstContext }), c = c.sibling; 4822 G(L, L.current & 1 | 2); 4823 return b.child; 4824 } 4825 a = a.sibling; 4826 } 4827 null !== f2.tail && B() > Gj && (b.flags |= 128, d = true, Dj(f2, false), b.lanes = 4194304); 4828 } 4829 else { 4830 if (!d) if (a = Ch(g), null !== a) { 4831 if (b.flags |= 128, d = true, c = a.updateQueue, null !== c && (b.updateQueue = c, b.flags |= 4), Dj(f2, true), null === f2.tail && "hidden" === f2.tailMode && !g.alternate && !I) return S(b), null; 4832 } else 2 * B() - f2.renderingStartTime > Gj && 1073741824 !== c && (b.flags |= 128, d = true, Dj(f2, false), b.lanes = 4194304); 4833 f2.isBackwards ? (g.sibling = b.child, b.child = g) : (c = f2.last, null !== c ? c.sibling = g : b.child = g, f2.last = g); 4834 } 4835 if (null !== f2.tail) return b = f2.tail, f2.rendering = b, f2.tail = b.sibling, f2.renderingStartTime = B(), b.sibling = null, c = L.current, G(L, d ? c & 1 | 2 : c & 1), b; 4836 S(b); 4837 return null; 4838 case 22: 4839 case 23: 4840 return Hj(), d = null !== b.memoizedState, null !== a && null !== a.memoizedState !== d && (b.flags |= 8192), d && 0 !== (b.mode & 1) ? 0 !== (fj & 1073741824) && (S(b), b.subtreeFlags & 6 && (b.flags |= 8192)) : S(b), null; 4841 case 24: 4842 return null; 4843 case 25: 4844 return null; 4845 } 4846 throw Error(p(156, b.tag)); 4847} 4848function Ij(a, b) { 4849 wg(b); 4850 switch (b.tag) { 4851 case 1: 4852 return Zf(b.type) && $f(), a = b.flags, a & 65536 ? (b.flags = a & -65537 | 128, b) : null; 4853 case 3: 4854 return zh(), E(Wf), E(H), Eh(), a = b.flags, 0 !== (a & 65536) && 0 === (a & 128) ? (b.flags = a & -65537 | 128, b) : null; 4855 case 5: 4856 return Bh(b), null; 4857 case 13: 4858 E(L); 4859 a = b.memoizedState; 4860 if (null !== a && null !== a.dehydrated) { 4861 if (null === b.alternate) throw Error(p(340)); 4862 Ig(); 4863 } 4864 a = b.flags; 4865 return a & 65536 ? (b.flags = a & -65537 | 128, b) : null; 4866 case 19: 4867 return E(L), null; 4868 case 4: 4869 return zh(), null; 4870 case 10: 4871 return ah(b.type._context), null; 4872 case 22: 4873 case 23: 4874 return Hj(), null; 4875 case 24: 4876 return null; 4877 default: 4878 return null; 4879 } 4880} 4881var Jj = false, U = false, Kj = "function" === typeof WeakSet ? WeakSet : Set, V = null; 4882function Lj(a, b) { 4883 var c = a.ref; 4884 if (null !== c) if ("function" === typeof c) try { 4885 c(null); 4886 } catch (d) { 4887 W(a, b, d); 4888 } 4889 else c.current = null; 4890} 4891function Mj(a, b, c) { 4892 try { 4893 c(); 4894 } catch (d) { 4895 W(a, b, d); 4896 } 4897} 4898var Nj = false; 4899function Oj(a, b) { 4900 Cf = dd; 4901 a = Me(); 4902 if (Ne(a)) { 4903 if ("selectionStart" in a) var c = { start: a.selectionStart, end: a.selectionEnd }; 4904 else a: { 4905 c = (c = a.ownerDocument) && c.defaultView || window; 4906 var d = c.getSelection && c.getSelection(); 4907 if (d && 0 !== d.rangeCount) { 4908 c = d.anchorNode; 4909 var e = d.anchorOffset, f2 = d.focusNode; 4910 d = d.focusOffset; 4911 try { 4912 c.nodeType, f2.nodeType; 4913 } catch (F2) { 4914 c = null; 4915 break a; 4916 } 4917 var g = 0, h = -1, k2 = -1, l2 = 0, m2 = 0, q2 = a, r2 = null; 4918 b: for (; ; ) { 4919 for (var y2; ; ) { 4920 q2 !== c || 0 !== e && 3 !== q2.nodeType || (h = g + e); 4921 q2 !== f2 || 0 !== d && 3 !== q2.nodeType || (k2 = g + d); 4922 3 === q2.nodeType && (g += q2.nodeValue.length); 4923 if (null === (y2 = q2.firstChild)) break; 4924 r2 = q2; 4925 q2 = y2; 4926 } 4927 for (; ; ) { 4928 if (q2 === a) break b; 4929 r2 === c && ++l2 === e && (h = g); 4930 r2 === f2 && ++m2 === d && (k2 = g); 4931 if (null !== (y2 = q2.nextSibling)) break; 4932 q2 = r2; 4933 r2 = q2.parentNode; 4934 } 4935 q2 = y2; 4936 } 4937 c = -1 === h || -1 === k2 ? null : { start: h, end: k2 }; 4938 } else c = null; 4939 } 4940 c = c || { start: 0, end: 0 }; 4941 } else c = null; 4942 Df = { focusedElem: a, selectionRange: c }; 4943 dd = false; 4944 for (V = b; null !== V; ) if (b = V, a = b.child, 0 !== (b.subtreeFlags & 1028) && null !== a) a.return = b, V = a; 4945 else for (; null !== V; ) { 4946 b = V; 4947 try { 4948 var n2 = b.alternate; 4949 if (0 !== (b.flags & 1024)) switch (b.tag) { 4950 case 0: 4951 case 11: 4952 case 15: 4953 break; 4954 case 1: 4955 if (null !== n2) { 4956 var t2 = n2.memoizedProps, J2 = n2.memoizedState, x2 = b.stateNode, w2 = x2.getSnapshotBeforeUpdate(b.elementType === b.type ? t2 : Ci(b.type, t2), J2); 4957 x2.__reactInternalSnapshotBeforeUpdate = w2; 4958 } 4959 break; 4960 case 3: 4961 var u2 = b.stateNode.containerInfo; 4962 1 === u2.nodeType ? u2.textContent = "" : 9 === u2.nodeType && u2.documentElement && u2.removeChild(u2.documentElement); 4963 break; 4964 case 5: 4965 case 6: 4966 case 4: 4967 case 17: 4968 break; 4969 default: 4970 throw Error(p(163)); 4971 } 4972 } catch (F2) { 4973 W(b, b.return, F2); 4974 } 4975 a = b.sibling; 4976 if (null !== a) { 4977 a.return = b.return; 4978 V = a; 4979 break; 4980 } 4981 V = b.return; 4982 } 4983 n2 = Nj; 4984 Nj = false; 4985 return n2; 4986} 4987function Pj(a, b, c) { 4988 var d = b.updateQueue; 4989 d = null !== d ? d.lastEffect : null; 4990 if (null !== d) { 4991 var e = d = d.next; 4992 do { 4993 if ((e.tag & a) === a) { 4994 var f2 = e.destroy; 4995 e.destroy = void 0; 4996 void 0 !== f2 && Mj(b, c, f2); 4997 } 4998 e = e.next; 4999 } while (e !== d); 5000 } 5001} 5002function Qj(a, b) { 5003 b = b.updateQueue; 5004 b = null !== b ? b.lastEffect : null; 5005 if (null !== b) { 5006 var c = b = b.next; 5007 do { 5008 if ((c.tag & a) === a) { 5009 var d = c.create; 5010 c.destroy = d(); 5011 } 5012 c = c.next; 5013 } while (c !== b); 5014 } 5015} 5016function Rj(a) { 5017 var b = a.ref; 5018 if (null !== b) { 5019 var c = a.stateNode; 5020 switch (a.tag) { 5021 case 5: 5022 a = c; 5023 break; 5024 default: 5025 a = c; 5026 } 5027 "function" === typeof b ? b(a) : b.current = a; 5028 } 5029} 5030function Sj(a) { 5031 var b = a.alternate; 5032 null !== b && (a.alternate = null, Sj(b)); 5033 a.child = null; 5034 a.deletions = null; 5035 a.sibling = null; 5036 5 === a.tag && (b = a.stateNode, null !== b && (delete b[Of], delete b[Pf], delete b[of], delete b[Qf], delete b[Rf])); 5037 a.stateNode = null; 5038 a.return = null; 5039 a.dependencies = null; 5040 a.memoizedProps = null; 5041 a.memoizedState = null; 5042 a.pendingProps = null; 5043 a.stateNode = null; 5044 a.updateQueue = null; 5045} 5046function Tj(a) { 5047 return 5 === a.tag || 3 === a.tag || 4 === a.tag; 5048} 5049function Uj(a) { 5050 a: for (; ; ) { 5051 for (; null === a.sibling; ) { 5052 if (null === a.return || Tj(a.return)) return null; 5053 a = a.return; 5054 } 5055 a.sibling.return = a.return; 5056 for (a = a.sibling; 5 !== a.tag && 6 !== a.tag && 18 !== a.tag; ) { 5057 if (a.flags & 2) continue a; 5058 if (null === a.child || 4 === a.tag) continue a; 5059 else a.child.return = a, a = a.child; 5060 } 5061 if (!(a.flags & 2)) return a.stateNode; 5062 } 5063} 5064function Vj(a, b, c) { 5065 var d = a.tag; 5066 if (5 === d || 6 === d) a = a.stateNode, b ? 8 === c.nodeType ? c.parentNode.insertBefore(a, b) : c.insertBefore(a, b) : (8 === c.nodeType ? (b = c.parentNode, b.insertBefore(a, c)) : (b = c, b.appendChild(a)), c = c._reactRootContainer, null !== c && void 0 !== c || null !== b.onclick || (b.onclick = Bf)); 5067 else if (4 !== d && (a = a.child, null !== a)) for (Vj(a, b, c), a = a.sibling; null !== a; ) Vj(a, b, c), a = a.sibling; 5068} 5069function Wj(a, b, c) { 5070 var d = a.tag; 5071 if (5 === d || 6 === d) a = a.stateNode, b ? c.insertBefore(a, b) : c.appendChild(a); 5072 else if (4 !== d && (a = a.child, null !== a)) for (Wj(a, b, c), a = a.sibling; null !== a; ) Wj(a, b, c), a = a.sibling; 5073} 5074var X$1 = null, Xj = false; 5075function Yj(a, b, c) { 5076 for (c = c.child; null !== c; ) Zj(a, b, c), c = c.sibling; 5077} 5078function Zj(a, b, c) { 5079 if (lc && "function" === typeof lc.onCommitFiberUnmount) try { 5080 lc.onCommitFiberUnmount(kc, c); 5081 } catch (h) { 5082 } 5083 switch (c.tag) { 5084 case 5: 5085 U || Lj(c, b); 5086 case 6: 5087 var d = X$1, e = Xj; 5088 X$1 = null; 5089 Yj(a, b, c); 5090 X$1 = d; 5091 Xj = e; 5092 null !== X$1 && (Xj ? (a = X$1, c = c.stateNode, 8 === a.nodeType ? a.parentNode.removeChild(c) : a.removeChild(c)) : X$1.removeChild(c.stateNode)); 5093 break; 5094 case 18: 5095 null !== X$1 && (Xj ? (a = X$1, c = c.stateNode, 8 === a.nodeType ? Kf(a.parentNode, c) : 1 === a.nodeType && Kf(a, c), bd(a)) : Kf(X$1, c.stateNode)); 5096 break; 5097 case 4: 5098 d = X$1; 5099 e = Xj; 5100 X$1 = c.stateNode.containerInfo; 5101 Xj = true; 5102 Yj(a, b, c); 5103 X$1 = d; 5104 Xj = e; 5105 break; 5106 case 0: 5107 case 11: 5108 case 14: 5109 case 15: 5110 if (!U && (d = c.updateQueue, null !== d && (d = d.lastEffect, null !== d))) { 5111 e = d = d.next; 5112 do { 5113 var f2 = e, g = f2.destroy; 5114 f2 = f2.tag; 5115 void 0 !== g && (0 !== (f2 & 2) ? Mj(c, b, g) : 0 !== (f2 & 4) && Mj(c, b, g)); 5116 e = e.next; 5117 } while (e !== d); 5118 } 5119 Yj(a, b, c); 5120 break; 5121 case 1: 5122 if (!U && (Lj(c, b), d = c.stateNode, "function" === typeof d.componentWillUnmount)) try { 5123 d.props = c.memoizedProps, d.state = c.memoizedState, d.componentWillUnmount(); 5124 } catch (h) { 5125 W(c, b, h); 5126 } 5127 Yj(a, b, c); 5128 break; 5129 case 21: 5130 Yj(a, b, c); 5131 break; 5132 case 22: 5133 c.mode & 1 ? (U = (d = U) || null !== c.memoizedState, Yj(a, b, c), U = d) : Yj(a, b, c); 5134 break; 5135 default: 5136 Yj(a, b, c); 5137 } 5138} 5139function ak(a) { 5140 var b = a.updateQueue; 5141 if (null !== b) { 5142 a.updateQueue = null; 5143 var c = a.stateNode; 5144 null === c && (c = a.stateNode = new Kj()); 5145 b.forEach(function(b2) { 5146 var d = bk.bind(null, a, b2); 5147 c.has(b2) || (c.add(b2), b2.then(d, d)); 5148 }); 5149 } 5150} 5151function ck(a, b) { 5152 var c = b.deletions; 5153 if (null !== c) for (var d = 0; d < c.length; d++) { 5154 var e = c[d]; 5155 try { 5156 var f2 = a, g = b, h = g; 5157 a: for (; null !== h; ) { 5158 switch (h.tag) { 5159 case 5: 5160 X$1 = h.stateNode; 5161 Xj = false; 5162 break a; 5163 case 3: 5164 X$1 = h.stateNode.containerInfo; 5165 Xj = true; 5166 break a; 5167 case 4: 5168 X$1 = h.stateNode.containerInfo; 5169 Xj = true; 5170 break a; 5171 } 5172 h = h.return; 5173 } 5174 if (null === X$1) throw Error(p(160)); 5175 Zj(f2, g, e); 5176 X$1 = null; 5177 Xj = false; 5178 var k2 = e.alternate; 5179 null !== k2 && (k2.return = null); 5180 e.return = null; 5181 } catch (l2) { 5182 W(e, b, l2); 5183 } 5184 } 5185 if (b.subtreeFlags & 12854) for (b = b.child; null !== b; ) dk(b, a), b = b.sibling; 5186} 5187function dk(a, b) { 5188 var c = a.alternate, d = a.flags; 5189 switch (a.tag) { 5190 case 0: 5191 case 11: 5192 case 14: 5193 case 15: 5194 ck(b, a); 5195 ek(a); 5196 if (d & 4) { 5197 try { 5198 Pj(3, a, a.return), Qj(3, a); 5199 } catch (t2) { 5200 W(a, a.return, t2); 5201 } 5202 try { 5203 Pj(5, a, a.return); 5204 } catch (t2) { 5205 W(a, a.return, t2); 5206 } 5207 } 5208 break; 5209 case 1: 5210 ck(b, a); 5211 ek(a); 5212 d & 512 && null !== c && Lj(c, c.return); 5213 break; 5214 case 5: 5215 ck(b, a); 5216 ek(a); 5217 d & 512 && null !== c && Lj(c, c.return); 5218 if (a.flags & 32) { 5219 var e = a.stateNode; 5220 try { 5221 ob(e, ""); 5222 } catch (t2) { 5223 W(a, a.return, t2); 5224 } 5225 } 5226 if (d & 4 && (e = a.stateNode, null != e)) { 5227 var f2 = a.memoizedProps, g = null !== c ? c.memoizedProps : f2, h = a.type, k2 = a.updateQueue; 5228 a.updateQueue = null; 5229 if (null !== k2) try { 5230 "input" === h && "radio" === f2.type && null != f2.name && ab(e, f2); 5231 vb(h, g); 5232 var l2 = vb(h, f2); 5233 for (g = 0; g < k2.length; g += 2) { 5234 var m2 = k2[g], q2 = k2[g + 1]; 5235 "style" === m2 ? sb(e, q2) : "dangerouslySetInnerHTML" === m2 ? nb(e, q2) : "children" === m2 ? ob(e, q2) : ta(e, m2, q2, l2); 5236 } 5237 switch (h) { 5238 case "input": 5239 bb(e, f2); 5240 break; 5241 case "textarea": 5242 ib(e, f2); 5243 break; 5244 case "select": 5245 var r2 = e._wrapperState.wasMultiple; 5246 e._wrapperState.wasMultiple = !!f2.multiple; 5247 var y2 = f2.value; 5248 null != y2 ? fb(e, !!f2.multiple, y2, false) : r2 !== !!f2.multiple && (null != f2.defaultValue ? fb( 5249 e, 5250 !!f2.multiple, 5251 f2.defaultValue, 5252 true 5253 ) : fb(e, !!f2.multiple, f2.multiple ? [] : "", false)); 5254 } 5255 e[Pf] = f2; 5256 } catch (t2) { 5257 W(a, a.return, t2); 5258 } 5259 } 5260 break; 5261 case 6: 5262 ck(b, a); 5263 ek(a); 5264 if (d & 4) { 5265 if (null === a.stateNode) throw Error(p(162)); 5266 e = a.stateNode; 5267 f2 = a.memoizedProps; 5268 try { 5269 e.nodeValue = f2; 5270 } catch (t2) { 5271 W(a, a.return, t2); 5272 } 5273 } 5274 break; 5275 case 3: 5276 ck(b, a); 5277 ek(a); 5278 if (d & 4 && null !== c && c.memoizedState.isDehydrated) try { 5279 bd(b.containerInfo); 5280 } catch (t2) { 5281 W(a, a.return, t2); 5282 } 5283 break; 5284 case 4: 5285 ck(b, a); 5286 ek(a); 5287 break; 5288 case 13: 5289 ck(b, a); 5290 ek(a); 5291 e = a.child; 5292 e.flags & 8192 && (f2 = null !== e.memoizedState, e.stateNode.isHidden = f2, !f2 || null !== e.alternate && null !== e.alternate.memoizedState || (fk = B())); 5293 d & 4 && ak(a); 5294 break; 5295 case 22: 5296 m2 = null !== c && null !== c.memoizedState; 5297 a.mode & 1 ? (U = (l2 = U) || m2, ck(b, a), U = l2) : ck(b, a); 5298 ek(a); 5299 if (d & 8192) { 5300 l2 = null !== a.memoizedState; 5301 if ((a.stateNode.isHidden = l2) && !m2 && 0 !== (a.mode & 1)) for (V = a, m2 = a.child; null !== m2; ) { 5302 for (q2 = V = m2; null !== V; ) { 5303 r2 = V; 5304 y2 = r2.child; 5305 switch (r2.tag) { 5306 case 0: 5307 case 11: 5308 case 14: 5309 case 15: 5310 Pj(4, r2, r2.return); 5311 break; 5312 case 1: 5313 Lj(r2, r2.return); 5314 var n2 = r2.stateNode; 5315 if ("function" === typeof n2.componentWillUnmount) { 5316 d = r2; 5317 c = r2.return; 5318 try { 5319 b = d, n2.props = b.memoizedProps, n2.state = b.memoizedState, n2.componentWillUnmount(); 5320 } catch (t2) { 5321 W(d, c, t2); 5322 } 5323 } 5324 break; 5325 case 5: 5326 Lj(r2, r2.return); 5327 break; 5328 case 22: 5329 if (null !== r2.memoizedState) { 5330 gk(q2); 5331 continue; 5332 } 5333 } 5334 null !== y2 ? (y2.return = r2, V = y2) : gk(q2); 5335 } 5336 m2 = m2.sibling; 5337 } 5338 a: for (m2 = null, q2 = a; ; ) { 5339 if (5 === q2.tag) { 5340 if (null === m2) { 5341 m2 = q2; 5342 try { 5343 e = q2.stateNode, l2 ? (f2 = e.style, "function" === typeof f2.setProperty ? f2.setProperty("display", "none", "important") : f2.display = "none") : (h = q2.stateNode, k2 = q2.memoizedProps.style, g = void 0 !== k2 && null !== k2 && k2.hasOwnProperty("display") ? k2.display : null, h.style.display = rb("display", g)); 5344 } catch (t2) { 5345 W(a, a.return, t2); 5346 } 5347 } 5348 } else if (6 === q2.tag) { 5349 if (null === m2) try { 5350 q2.stateNode.nodeValue = l2 ? "" : q2.memoizedProps; 5351 } catch (t2) { 5352 W(a, a.return, t2); 5353 } 5354 } else if ((22 !== q2.tag && 23 !== q2.tag || null === q2.memoizedState || q2 === a) && null !== q2.child) { 5355 q2.child.return = q2; 5356 q2 = q2.child; 5357 continue; 5358 } 5359 if (q2 === a) break a; 5360 for (; null === q2.sibling; ) { 5361 if (null === q2.return || q2.return === a) break a; 5362 m2 === q2 && (m2 = null); 5363 q2 = q2.return; 5364 } 5365 m2 === q2 && (m2 = null); 5366 q2.sibling.return = q2.return; 5367 q2 = q2.sibling; 5368 } 5369 } 5370 break; 5371 case 19: 5372 ck(b, a); 5373 ek(a); 5374 d & 4 && ak(a); 5375 break; 5376 case 21: 5377 break; 5378 default: 5379 ck( 5380 b, 5381 a 5382 ), ek(a); 5383 } 5384} 5385function ek(a) { 5386 var b = a.flags; 5387 if (b & 2) { 5388 try { 5389 a: { 5390 for (var c = a.return; null !== c; ) { 5391 if (Tj(c)) { 5392 var d = c; 5393 break a; 5394 } 5395 c = c.return; 5396 } 5397 throw Error(p(160)); 5398 } 5399 switch (d.tag) { 5400 case 5: 5401 var e = d.stateNode; 5402 d.flags & 32 && (ob(e, ""), d.flags &= -33); 5403 var f2 = Uj(a); 5404 Wj(a, f2, e); 5405 break; 5406 case 3: 5407 case 4: 5408 var g = d.stateNode.containerInfo, h = Uj(a); 5409 Vj(a, h, g); 5410 break; 5411 default: 5412 throw Error(p(161)); 5413 } 5414 } catch (k2) { 5415 W(a, a.return, k2); 5416 } 5417 a.flags &= -3; 5418 } 5419 b & 4096 && (a.flags &= -4097); 5420} 5421function hk(a, b, c) { 5422 V = a; 5423 ik(a); 5424} 5425function ik(a, b, c) { 5426 for (var d = 0 !== (a.mode & 1); null !== V; ) { 5427 var e = V, f2 = e.child; 5428 if (22 === e.tag && d) { 5429 var g = null !== e.memoizedState || Jj; 5430 if (!g) { 5431 var h = e.alternate, k2 = null !== h && null !== h.memoizedState || U; 5432 h = Jj; 5433 var l2 = U; 5434 Jj = g; 5435 if ((U = k2) && !l2) for (V = e; null !== V; ) g = V, k2 = g.child, 22 === g.tag && null !== g.memoizedState ? jk(e) : null !== k2 ? (k2.return = g, V = k2) : jk(e); 5436 for (; null !== f2; ) V = f2, ik(f2), f2 = f2.sibling; 5437 V = e; 5438 Jj = h; 5439 U = l2; 5440 } 5441 kk(a); 5442 } else 0 !== (e.subtreeFlags & 8772) && null !== f2 ? (f2.return = e, V = f2) : kk(a); 5443 } 5444} 5445function kk(a) { 5446 for (; null !== V; ) { 5447 var b = V; 5448 if (0 !== (b.flags & 8772)) { 5449 var c = b.alternate; 5450 try { 5451 if (0 !== (b.flags & 8772)) switch (b.tag) { 5452 case 0: 5453 case 11: 5454 case 15: 5455 U || Qj(5, b); 5456 break; 5457 case 1: 5458 var d = b.stateNode; 5459 if (b.flags & 4 && !U) if (null === c) d.componentDidMount(); 5460 else { 5461 var e = b.elementType === b.type ? c.memoizedProps : Ci(b.type, c.memoizedProps); 5462 d.componentDidUpdate(e, c.memoizedState, d.__reactInternalSnapshotBeforeUpdate); 5463 } 5464 var f2 = b.updateQueue; 5465 null !== f2 && sh(b, f2, d); 5466 break; 5467 case 3: 5468 var g = b.updateQueue; 5469 if (null !== g) { 5470 c = null; 5471 if (null !== b.child) switch (b.child.tag) { 5472 case 5: 5473 c = b.child.stateNode; 5474 break; 5475 case 1: 5476 c = b.child.stateNode; 5477 } 5478 sh(b, g, c); 5479 } 5480 break; 5481 case 5: 5482 var h = b.stateNode; 5483 if (null === c && b.flags & 4) { 5484 c = h; 5485 var k2 = b.memoizedProps; 5486 switch (b.type) { 5487 case "button": 5488 case "input": 5489 case "select": 5490 case "textarea": 5491 k2.autoFocus && c.focus(); 5492 break; 5493 case "img": 5494 k2.src && (c.src = k2.src); 5495 } 5496 } 5497 break; 5498 case 6: 5499 break; 5500 case 4: 5501 break; 5502 case 12: 5503 break; 5504 case 13: 5505 if (null === b.memoizedState) { 5506 var l2 = b.alternate; 5507 if (null !== l2) { 5508 var m2 = l2.memoizedState; 5509 if (null !== m2) { 5510 var q2 = m2.dehydrated; 5511 null !== q2 && bd(q2); 5512 } 5513 } 5514 } 5515 break; 5516 case 19: 5517 case 17: 5518 case 21: 5519 case 22: 5520 case 23: 5521 case 25: 5522 break; 5523 default: 5524 throw Error(p(163)); 5525 } 5526 U || b.flags & 512 && Rj(b); 5527 } catch (r2) { 5528 W(b, b.return, r2); 5529 } 5530 } 5531 if (b === a) { 5532 V = null; 5533 break; 5534 } 5535 c = b.sibling; 5536 if (null !== c) { 5537 c.return = b.return; 5538 V = c; 5539 break; 5540 } 5541 V = b.return; 5542 } 5543} 5544function gk(a) { 5545 for (; null !== V; ) { 5546 var b = V; 5547 if (b === a) { 5548 V = null; 5549 break; 5550 } 5551 var c = b.sibling; 5552 if (null !== c) { 5553 c.return = b.return; 5554 V = c; 5555 break; 5556 } 5557 V = b.return; 5558 } 5559} 5560function jk(a) { 5561 for (; null !== V; ) { 5562 var b = V; 5563 try { 5564 switch (b.tag) { 5565 case 0: 5566 case 11: 5567 case 15: 5568 var c = b.return; 5569 try { 5570 Qj(4, b); 5571 } catch (k2) { 5572 W(b, c, k2); 5573 } 5574 break; 5575 case 1: 5576 var d = b.stateNode; 5577 if ("function" === typeof d.componentDidMount) { 5578 var e = b.return; 5579 try { 5580 d.componentDidMount(); 5581 } catch (k2) { 5582 W(b, e, k2); 5583 } 5584 } 5585 var f2 = b.return; 5586 try { 5587 Rj(b); 5588 } catch (k2) { 5589 W(b, f2, k2); 5590 } 5591 break; 5592 case 5: 5593 var g = b.return; 5594 try { 5595 Rj(b); 5596 } catch (k2) { 5597 W(b, g, k2); 5598 } 5599 } 5600 } catch (k2) { 5601 W(b, b.return, k2); 5602 } 5603 if (b === a) { 5604 V = null; 5605 break; 5606 } 5607 var h = b.sibling; 5608 if (null !== h) { 5609 h.return = b.return; 5610 V = h; 5611 break; 5612 } 5613 V = b.return; 5614 } 5615} 5616var lk = Math.ceil, mk = ua.ReactCurrentDispatcher, nk = ua.ReactCurrentOwner, ok = ua.ReactCurrentBatchConfig, K = 0, Q = null, Y = null, Z = 0, fj = 0, ej = Uf(0), T = 0, pk = null, rh = 0, qk = 0, rk = 0, sk = null, tk = null, fk = 0, Gj = Infinity, uk = null, Oi = false, Pi = null, Ri = null, vk = false, wk = null, xk = 0, yk = 0, zk = null, Ak = -1, Bk = 0; 5617function R() { 5618 return 0 !== (K & 6) ? B() : -1 !== Ak ? Ak : Ak = B(); 5619} 5620function yi(a) { 5621 if (0 === (a.mode & 1)) return 1; 5622 if (0 !== (K & 2) && 0 !== Z) return Z & -Z; 5623 if (null !== Kg.transition) return 0 === Bk && (Bk = yc()), Bk; 5624 a = C; 5625 if (0 !== a) return a; 5626 a = window.event; 5627 a = void 0 === a ? 16 : jd(a.type); 5628 return a; 5629} 5630function gi(a, b, c, d) { 5631 if (50 < yk) throw yk = 0, zk = null, Error(p(185)); 5632 Ac(a, c, d); 5633 if (0 === (K & 2) || a !== Q) a === Q && (0 === (K & 2) && (qk |= c), 4 === T && Ck(a, Z)), Dk(a, d), 1 === c && 0 === K && 0 === (b.mode & 1) && (Gj = B() + 500, fg && jg()); 5634} 5635function Dk(a, b) { 5636 var c = a.callbackNode; 5637 wc(a, b); 5638 var d = uc(a, a === Q ? Z : 0); 5639 if (0 === d) null !== c && bc(c), a.callbackNode = null, a.callbackPriority = 0; 5640 else if (b = d & -d, a.callbackPriority !== b) { 5641 null != c && bc(c); 5642 if (1 === b) 0 === a.tag ? ig(Ek.bind(null, a)) : hg(Ek.bind(null, a)), Jf(function() { 5643 0 === (K & 6) && jg(); 5644 }), c = null; 5645 else { 5646 switch (Dc(d)) { 5647 case 1: 5648 c = fc; 5649 break; 5650 case 4: 5651 c = gc; 5652 break; 5653 case 16: 5654 c = hc; 5655 break; 5656 case 536870912: 5657 c = jc; 5658 break; 5659 default: 5660 c = hc; 5661 } 5662 c = Fk(c, Gk.bind(null, a)); 5663 } 5664 a.callbackPriority = b; 5665 a.callbackNode = c; 5666 } 5667} 5668function Gk(a, b) { 5669 Ak = -1; 5670 Bk = 0; 5671 if (0 !== (K & 6)) throw Error(p(327)); 5672 var c = a.callbackNode; 5673 if (Hk() && a.callbackNode !== c) return null; 5674 var d = uc(a, a === Q ? Z : 0); 5675 if (0 === d) return null; 5676 if (0 !== (d & 30) || 0 !== (d & a.expiredLanes) || b) b = Ik(a, d); 5677 else { 5678 b = d; 5679 var e = K; 5680 K |= 2; 5681 var f2 = Jk(); 5682 if (Q !== a || Z !== b) uk = null, Gj = B() + 500, Kk(a, b); 5683 do 5684 try { 5685 Lk(); 5686 break; 5687 } catch (h) { 5688 Mk(a, h); 5689 } 5690 while (1); 5691 $g(); 5692 mk.current = f2; 5693 K = e; 5694 null !== Y ? b = 0 : (Q = null, Z = 0, b = T); 5695 } 5696 if (0 !== b) { 5697 2 === b && (e = xc(a), 0 !== e && (d = e, b = Nk(a, e))); 5698 if (1 === b) throw c = pk, Kk(a, 0), Ck(a, d), Dk(a, B()), c; 5699 if (6 === b) Ck(a, d); 5700 else { 5701 e = a.current.alternate; 5702 if (0 === (d & 30) && !Ok(e) && (b = Ik(a, d), 2 === b && (f2 = xc(a), 0 !== f2 && (d = f2, b = Nk(a, f2))), 1 === b)) throw c = pk, Kk(a, 0), Ck(a, d), Dk(a, B()), c; 5703 a.finishedWork = e; 5704 a.finishedLanes = d; 5705 switch (b) { 5706 case 0: 5707 case 1: 5708 throw Error(p(345)); 5709 case 2: 5710 Pk(a, tk, uk); 5711 break; 5712 case 3: 5713 Ck(a, d); 5714 if ((d & 130023424) === d && (b = fk + 500 - B(), 10 < b)) { 5715 if (0 !== uc(a, 0)) break; 5716 e = a.suspendedLanes; 5717 if ((e & d) !== d) { 5718 R(); 5719 a.pingedLanes |= a.suspendedLanes & e; 5720 break; 5721 } 5722 a.timeoutHandle = Ff(Pk.bind(null, a, tk, uk), b); 5723 break; 5724 } 5725 Pk(a, tk, uk); 5726 break; 5727 case 4: 5728 Ck(a, d); 5729 if ((d & 4194240) === d) break; 5730 b = a.eventTimes; 5731 for (e = -1; 0 < d; ) { 5732 var g = 31 - oc(d); 5733 f2 = 1 << g; 5734 g = b[g]; 5735 g > e && (e = g); 5736 d &= ~f2; 5737 } 5738 d = e; 5739 d = B() - d; 5740 d = (120 > d ? 120 : 480 > d ? 480 : 1080 > d ? 1080 : 1920 > d ? 1920 : 3e3 > d ? 3e3 : 4320 > d ? 4320 : 1960 * lk(d / 1960)) - d; 5741 if (10 < d) { 5742 a.timeoutHandle = Ff(Pk.bind(null, a, tk, uk), d); 5743 break; 5744 } 5745 Pk(a, tk, uk); 5746 break; 5747 case 5: 5748 Pk(a, tk, uk); 5749 break; 5750 default: 5751 throw Error(p(329)); 5752 } 5753 } 5754 } 5755 Dk(a, B()); 5756 return a.callbackNode === c ? Gk.bind(null, a) : null; 5757} 5758function Nk(a, b) { 5759 var c = sk; 5760 a.current.memoizedState.isDehydrated && (Kk(a, b).flags |= 256); 5761 a = Ik(a, b); 5762 2 !== a && (b = tk, tk = c, null !== b && Fj(b)); 5763 return a; 5764} 5765function Fj(a) { 5766 null === tk ? tk = a : tk.push.apply(tk, a); 5767} 5768function Ok(a) { 5769 for (var b = a; ; ) { 5770 if (b.flags & 16384) { 5771 var c = b.updateQueue; 5772 if (null !== c && (c = c.stores, null !== c)) for (var d = 0; d < c.length; d++) { 5773 var e = c[d], f2 = e.getSnapshot; 5774 e = e.value; 5775 try { 5776 if (!He(f2(), e)) return false; 5777 } catch (g) { 5778 return false; 5779 } 5780 } 5781 } 5782 c = b.child; 5783 if (b.subtreeFlags & 16384 && null !== c) c.return = b, b = c; 5784 else { 5785 if (b === a) break; 5786 for (; null === b.sibling; ) { 5787 if (null === b.return || b.return === a) return true; 5788 b = b.return; 5789 } 5790 b.sibling.return = b.return; 5791 b = b.sibling; 5792 } 5793 } 5794 return true; 5795} 5796function Ck(a, b) { 5797 b &= ~rk; 5798 b &= ~qk; 5799 a.suspendedLanes |= b; 5800 a.pingedLanes &= ~b; 5801 for (a = a.expirationTimes; 0 < b; ) { 5802 var c = 31 - oc(b), d = 1 << c; 5803 a[c] = -1; 5804 b &= ~d; 5805 } 5806} 5807function Ek(a) { 5808 if (0 !== (K & 6)) throw Error(p(327)); 5809 Hk(); 5810 var b = uc(a, 0); 5811 if (0 === (b & 1)) return Dk(a, B()), null; 5812 var c = Ik(a, b); 5813 if (0 !== a.tag && 2 === c) { 5814 var d = xc(a); 5815 0 !== d && (b = d, c = Nk(a, d)); 5816 } 5817 if (1 === c) throw c = pk, Kk(a, 0), Ck(a, b), Dk(a, B()), c; 5818 if (6 === c) throw Error(p(345)); 5819 a.finishedWork = a.current.alternate; 5820 a.finishedLanes = b; 5821 Pk(a, tk, uk); 5822 Dk(a, B()); 5823 return null; 5824} 5825function Qk(a, b) { 5826 var c = K; 5827 K |= 1; 5828 try { 5829 return a(b); 5830 } finally { 5831 K = c, 0 === K && (Gj = B() + 500, fg && jg()); 5832 } 5833} 5834function Rk(a) { 5835 null !== wk && 0 === wk.tag && 0 === (K & 6) && Hk(); 5836 var b = K; 5837 K |= 1; 5838 var c = ok.transition, d = C; 5839 try { 5840 if (ok.transition = null, C = 1, a) return a(); 5841 } finally { 5842 C = d, ok.transition = c, K = b, 0 === (K & 6) && jg(); 5843 } 5844} 5845function Hj() { 5846 fj = ej.current; 5847 E(ej); 5848} 5849function Kk(a, b) { 5850 a.finishedWork = null; 5851 a.finishedLanes = 0; 5852 var c = a.timeoutHandle; 5853 -1 !== c && (a.timeoutHandle = -1, Gf(c)); 5854 if (null !== Y) for (c = Y.return; null !== c; ) { 5855 var d = c; 5856 wg(d); 5857 switch (d.tag) { 5858 case 1: 5859 d = d.type.childContextTypes; 5860 null !== d && void 0 !== d && $f(); 5861 break; 5862 case 3: 5863 zh(); 5864 E(Wf); 5865 E(H); 5866 Eh(); 5867 break; 5868 case 5: 5869 Bh(d); 5870 break; 5871 case 4: 5872 zh(); 5873 break; 5874 case 13: 5875 E(L); 5876 break; 5877 case 19: 5878 E(L); 5879 break; 5880 case 10: 5881 ah(d.type._context); 5882 break; 5883 case 22: 5884 case 23: 5885 Hj(); 5886 } 5887 c = c.return; 5888 } 5889 Q = a; 5890 Y = a = Pg(a.current, null); 5891 Z = fj = b; 5892 T = 0; 5893 pk = null; 5894 rk = qk = rh = 0; 5895 tk = sk = null; 5896 if (null !== fh) { 5897 for (b = 0; b < fh.length; b++) if (c = fh[b], d = c.interleaved, null !== d) { 5898 c.interleaved = null; 5899 var e = d.next, f2 = c.pending; 5900 if (null !== f2) { 5901 var g = f2.next; 5902 f2.next = e; 5903 d.next = g; 5904 } 5905 c.pending = d; 5906 } 5907 fh = null; 5908 } 5909 return a; 5910} 5911function Mk(a, b) { 5912 do { 5913 var c = Y; 5914 try { 5915 $g(); 5916 Fh.current = Rh; 5917 if (Ih) { 5918 for (var d = M.memoizedState; null !== d; ) { 5919 var e = d.queue; 5920 null !== e && (e.pending = null); 5921 d = d.next; 5922 } 5923 Ih = false; 5924 } 5925 Hh = 0; 5926 O = N = M = null; 5927 Jh = false; 5928 Kh = 0; 5929 nk.current = null; 5930 if (null === c || null === c.return) { 5931 T = 1; 5932 pk = b; 5933 Y = null; 5934 break; 5935 } 5936 a: { 5937 var f2 = a, g = c.return, h = c, k2 = b; 5938 b = Z; 5939 h.flags |= 32768; 5940 if (null !== k2 && "object" === typeof k2 && "function" === typeof k2.then) { 5941 var l2 = k2, m2 = h, q2 = m2.tag; 5942 if (0 === (m2.mode & 1) && (0 === q2 || 11 === q2 || 15 === q2)) { 5943 var r2 = m2.alternate; 5944 r2 ? (m2.updateQueue = r2.updateQueue, m2.memoizedState = r2.memoizedState, m2.lanes = r2.lanes) : (m2.updateQueue = null, m2.memoizedState = null); 5945 } 5946 var y2 = Ui(g); 5947 if (null !== y2) { 5948 y2.flags &= -257; 5949 Vi(y2, g, h, f2, b); 5950 y2.mode & 1 && Si(f2, l2, b); 5951 b = y2; 5952 k2 = l2; 5953 var n2 = b.updateQueue; 5954 if (null === n2) { 5955 var t2 = /* @__PURE__ */ new Set(); 5956 t2.add(k2); 5957 b.updateQueue = t2; 5958 } else n2.add(k2); 5959 break a; 5960 } else { 5961 if (0 === (b & 1)) { 5962 Si(f2, l2, b); 5963 tj(); 5964 break a; 5965 } 5966 k2 = Error(p(426)); 5967 } 5968 } else if (I && h.mode & 1) { 5969 var J2 = Ui(g); 5970 if (null !== J2) { 5971 0 === (J2.flags & 65536) && (J2.flags |= 256); 5972 Vi(J2, g, h, f2, b); 5973 Jg(Ji(k2, h)); 5974 break a; 5975 } 5976 } 5977 f2 = k2 = Ji(k2, h); 5978 4 !== T && (T = 2); 5979 null === sk ? sk = [f2] : sk.push(f2); 5980 f2 = g; 5981 do { 5982 switch (f2.tag) { 5983 case 3: 5984 f2.flags |= 65536; 5985 b &= -b; 5986 f2.lanes |= b; 5987 var x2 = Ni(f2, k2, b); 5988 ph(f2, x2); 5989 break a; 5990 case 1: 5991 h = k2; 5992 var w2 = f2.type, u2 = f2.stateNode; 5993 if (0 === (f2.flags & 128) && ("function" === typeof w2.getDerivedStateFromError || null !== u2 && "function" === typeof u2.componentDidCatch && (null === Ri || !Ri.has(u2)))) { 5994 f2.flags |= 65536; 5995 b &= -b; 5996 f2.lanes |= b; 5997 var F2 = Qi(f2, h, b); 5998 ph(f2, F2); 5999 break a; 6000 } 6001 } 6002 f2 = f2.return; 6003 } while (null !== f2); 6004 } 6005 Sk(c); 6006 } catch (na) { 6007 b = na; 6008 Y === c && null !== c && (Y = c = c.return); 6009 continue; 6010 } 6011 break; 6012 } while (1); 6013} 6014function Jk() { 6015 var a = mk.current; 6016 mk.current = Rh; 6017 return null === a ? Rh : a; 6018} 6019function tj() { 6020 if (0 === T || 3 === T || 2 === T) T = 4; 6021 null === Q || 0 === (rh & 268435455) && 0 === (qk & 268435455) || Ck(Q, Z); 6022} 6023function Ik(a, b) { 6024 var c = K; 6025 K |= 2; 6026 var d = Jk(); 6027 if (Q !== a || Z !== b) uk = null, Kk(a, b); 6028 do 6029 try { 6030 Tk(); 6031 break; 6032 } catch (e) { 6033 Mk(a, e); 6034 } 6035 while (1); 6036 $g(); 6037 K = c; 6038 mk.current = d; 6039 if (null !== Y) throw Error(p(261)); 6040 Q = null; 6041 Z = 0; 6042 return T; 6043} 6044function Tk() { 6045 for (; null !== Y; ) Uk(Y); 6046} 6047function Lk() { 6048 for (; null !== Y && !cc(); ) Uk(Y); 6049} 6050function Uk(a) { 6051 var b = Vk(a.alternate, a, fj); 6052 a.memoizedProps = a.pendingProps; 6053 null === b ? Sk(a) : Y = b; 6054 nk.current = null; 6055} 6056function Sk(a) { 6057 var b = a; 6058 do { 6059 var c = b.alternate; 6060 a = b.return; 6061 if (0 === (b.flags & 32768)) { 6062 if (c = Ej(c, b, fj), null !== c) { 6063 Y = c; 6064 return; 6065 } 6066 } else { 6067 c = Ij(c, b); 6068 if (null !== c) { 6069 c.flags &= 32767; 6070 Y = c; 6071 return; 6072 } 6073 if (null !== a) a.flags |= 32768, a.subtreeFlags = 0, a.deletions = null; 6074 else { 6075 T = 6; 6076 Y = null; 6077 return; 6078 } 6079 } 6080 b = b.sibling; 6081 if (null !== b) { 6082 Y = b; 6083 return; 6084 } 6085 Y = b = a; 6086 } while (null !== b); 6087 0 === T && (T = 5); 6088} 6089function Pk(a, b, c) { 6090 var d = C, e = ok.transition; 6091 try { 6092 ok.transition = null, C = 1, Wk(a, b, c, d); 6093 } finally { 6094 ok.transition = e, C = d; 6095 } 6096 return null; 6097} 6098function Wk(a, b, c, d) { 6099 do 6100 Hk(); 6101 while (null !== wk); 6102 if (0 !== (K & 6)) throw Error(p(327)); 6103 c = a.finishedWork; 6104 var e = a.finishedLanes; 6105 if (null === c) return null; 6106 a.finishedWork = null; 6107 a.finishedLanes = 0; 6108 if (c === a.current) throw Error(p(177)); 6109 a.callbackNode = null; 6110 a.callbackPriority = 0; 6111 var f2 = c.lanes | c.childLanes; 6112 Bc(a, f2); 6113 a === Q && (Y = Q = null, Z = 0); 6114 0 === (c.subtreeFlags & 2064) && 0 === (c.flags & 2064) || vk || (vk = true, Fk(hc, function() { 6115 Hk(); 6116 return null; 6117 })); 6118 f2 = 0 !== (c.flags & 15990); 6119 if (0 !== (c.subtreeFlags & 15990) || f2) { 6120 f2 = ok.transition; 6121 ok.transition = null; 6122 var g = C; 6123 C = 1; 6124 var h = K; 6125 K |= 4; 6126 nk.current = null; 6127 Oj(a, c); 6128 dk(c, a); 6129 Oe(Df); 6130 dd = !!Cf; 6131 Df = Cf = null; 6132 a.current = c; 6133 hk(c); 6134 dc(); 6135 K = h; 6136 C = g; 6137 ok.transition = f2; 6138 } else a.current = c; 6139 vk && (vk = false, wk = a, xk = e); 6140 f2 = a.pendingLanes; 6141 0 === f2 && (Ri = null); 6142 mc(c.stateNode); 6143 Dk(a, B()); 6144 if (null !== b) for (d = a.onRecoverableError, c = 0; c < b.length; c++) e = b[c], d(e.value, { componentStack: e.stack, digest: e.digest }); 6145 if (Oi) throw Oi = false, a = Pi, Pi = null, a; 6146 0 !== (xk & 1) && 0 !== a.tag && Hk(); 6147 f2 = a.pendingLanes; 6148 0 !== (f2 & 1) ? a === zk ? yk++ : (yk = 0, zk = a) : yk = 0; 6149 jg(); 6150 return null; 6151} 6152function Hk() { 6153 if (null !== wk) { 6154 var a = Dc(xk), b = ok.transition, c = C; 6155 try { 6156 ok.transition = null; 6157 C = 16 > a ? 16 : a; 6158 if (null === wk) var d = false; 6159 else { 6160 a = wk; 6161 wk = null; 6162 xk = 0; 6163 if (0 !== (K & 6)) throw Error(p(331)); 6164 var e = K; 6165 K |= 4; 6166 for (V = a.current; null !== V; ) { 6167 var f2 = V, g = f2.child; 6168 if (0 !== (V.flags & 16)) { 6169 var h = f2.deletions; 6170 if (null !== h) { 6171 for (var k2 = 0; k2 < h.length; k2++) { 6172 var l2 = h[k2]; 6173 for (V = l2; null !== V; ) { 6174 var m2 = V; 6175 switch (m2.tag) { 6176 case 0: 6177 case 11: 6178 case 15: 6179 Pj(8, m2, f2); 6180 } 6181 var q2 = m2.child; 6182 if (null !== q2) q2.return = m2, V = q2; 6183 else for (; null !== V; ) { 6184 m2 = V; 6185 var r2 = m2.sibling, y2 = m2.return; 6186 Sj(m2); 6187 if (m2 === l2) { 6188 V = null; 6189 break; 6190 } 6191 if (null !== r2) { 6192 r2.return = y2; 6193 V = r2; 6194 break; 6195 } 6196 V = y2; 6197 } 6198 } 6199 } 6200 var n2 = f2.alternate; 6201 if (null !== n2) { 6202 var t2 = n2.child; 6203 if (null !== t2) { 6204 n2.child = null; 6205 do { 6206 var J2 = t2.sibling; 6207 t2.sibling = null; 6208 t2 = J2; 6209 } while (null !== t2); 6210 } 6211 } 6212 V = f2; 6213 } 6214 } 6215 if (0 !== (f2.subtreeFlags & 2064) && null !== g) g.return = f2, V = g; 6216 else b: for (; null !== V; ) { 6217 f2 = V; 6218 if (0 !== (f2.flags & 2048)) switch (f2.tag) { 6219 case 0: 6220 case 11: 6221 case 15: 6222 Pj(9, f2, f2.return); 6223 } 6224 var x2 = f2.sibling; 6225 if (null !== x2) { 6226 x2.return = f2.return; 6227 V = x2; 6228 break b; 6229 } 6230 V = f2.return; 6231 } 6232 } 6233 var w2 = a.current; 6234 for (V = w2; null !== V; ) { 6235 g = V; 6236 var u2 = g.child; 6237 if (0 !== (g.subtreeFlags & 2064) && null !== u2) u2.return = g, V = u2; 6238 else b: for (g = w2; null !== V; ) { 6239 h = V; 6240 if (0 !== (h.flags & 2048)) try { 6241 switch (h.tag) { 6242 case 0: 6243 case 11: 6244 case 15: 6245 Qj(9, h); 6246 } 6247 } catch (na) { 6248 W(h, h.return, na); 6249 } 6250 if (h === g) { 6251 V = null; 6252 break b; 6253 } 6254 var F2 = h.sibling; 6255 if (null !== F2) { 6256 F2.return = h.return; 6257 V = F2; 6258 break b; 6259 } 6260 V = h.return; 6261 } 6262 } 6263 K = e; 6264 jg(); 6265 if (lc && "function" === typeof lc.onPostCommitFiberRoot) try { 6266 lc.onPostCommitFiberRoot(kc, a); 6267 } catch (na) { 6268 } 6269 d = true; 6270 } 6271 return d; 6272 } finally { 6273 C = c, ok.transition = b; 6274 } 6275 } 6276 return false; 6277} 6278function Xk(a, b, c) { 6279 b = Ji(c, b); 6280 b = Ni(a, b, 1); 6281 a = nh(a, b, 1); 6282 b = R(); 6283 null !== a && (Ac(a, 1, b), Dk(a, b)); 6284} 6285function W(a, b, c) { 6286 if (3 === a.tag) Xk(a, a, c); 6287 else for (; null !== b; ) { 6288 if (3 === b.tag) { 6289 Xk(b, a, c); 6290 break; 6291 } else if (1 === b.tag) { 6292 var d = b.stateNode; 6293 if ("function" === typeof b.type.getDerivedStateFromError || "function" === typeof d.componentDidCatch && (null === Ri || !Ri.has(d))) { 6294 a = Ji(c, a); 6295 a = Qi(b, a, 1); 6296 b = nh(b, a, 1); 6297 a = R(); 6298 null !== b && (Ac(b, 1, a), Dk(b, a)); 6299 break; 6300 } 6301 } 6302 b = b.return; 6303 } 6304} 6305function Ti(a, b, c) { 6306 var d = a.pingCache; 6307 null !== d && d.delete(b); 6308 b = R(); 6309 a.pingedLanes |= a.suspendedLanes & c; 6310 Q === a && (Z & c) === c && (4 === T || 3 === T && (Z & 130023424) === Z && 500 > B() - fk ? Kk(a, 0) : rk |= c); 6311 Dk(a, b); 6312} 6313function Yk(a, b) { 6314 0 === b && (0 === (a.mode & 1) ? b = 1 : (b = sc, sc <<= 1, 0 === (sc & 130023424) && (sc = 4194304))); 6315 var c = R(); 6316 a = ih(a, b); 6317 null !== a && (Ac(a, b, c), Dk(a, c)); 6318} 6319function uj(a) { 6320 var b = a.memoizedState, c = 0; 6321 null !== b && (c = b.retryLane); 6322 Yk(a, c); 6323} 6324function bk(a, b) { 6325 var c = 0; 6326 switch (a.tag) { 6327 case 13: 6328 var d = a.stateNode; 6329 var e = a.memoizedState; 6330 null !== e && (c = e.retryLane); 6331 break; 6332 case 19: 6333 d = a.stateNode; 6334 break; 6335 default: 6336 throw Error(p(314)); 6337 } 6338 null !== d && d.delete(b); 6339 Yk(a, c); 6340} 6341var Vk; 6342Vk = function(a, b, c) { 6343 if (null !== a) if (a.memoizedProps !== b.pendingProps || Wf.current) dh = true; 6344 else { 6345 if (0 === (a.lanes & c) && 0 === (b.flags & 128)) return dh = false, yj(a, b, c); 6346 dh = 0 !== (a.flags & 131072) ? true : false; 6347 } 6348 else dh = false, I && 0 !== (b.flags & 1048576) && ug(b, ng, b.index); 6349 b.lanes = 0; 6350 switch (b.tag) { 6351 case 2: 6352 var d = b.type; 6353 ij(a, b); 6354 a = b.pendingProps; 6355 var e = Yf(b, H.current); 6356 ch(b, c); 6357 e = Nh(null, b, d, a, e, c); 6358 var f2 = Sh(); 6359 b.flags |= 1; 6360 "object" === typeof e && null !== e && "function" === typeof e.render && void 0 === e.$$typeof ? (b.tag = 1, b.memoizedState = null, b.updateQueue = null, Zf(d) ? (f2 = true, cg(b)) : f2 = false, b.memoizedState = null !== e.state && void 0 !== e.state ? e.state : null, kh(b), e.updater = Ei, b.stateNode = e, e._reactInternals = b, Ii(b, d, a, c), b = jj(null, b, d, true, f2, c)) : (b.tag = 0, I && f2 && vg(b), Xi(null, b, e, c), b = b.child); 6361 return b; 6362 case 16: 6363 d = b.elementType; 6364 a: { 6365 ij(a, b); 6366 a = b.pendingProps; 6367 e = d._init; 6368 d = e(d._payload); 6369 b.type = d; 6370 e = b.tag = Zk(d); 6371 a = Ci(d, a); 6372 switch (e) { 6373 case 0: 6374 b = cj(null, b, d, a, c); 6375 break a; 6376 case 1: 6377 b = hj(null, b, d, a, c); 6378 break a; 6379 case 11: 6380 b = Yi(null, b, d, a, c); 6381 break a; 6382 case 14: 6383 b = $i(null, b, d, Ci(d.type, a), c); 6384 break a; 6385 } 6386 throw Error(p( 6387 306, 6388 d, 6389 "" 6390 )); 6391 } 6392 return b; 6393 case 0: 6394 return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), cj(a, b, d, e, c); 6395 case 1: 6396 return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), hj(a, b, d, e, c); 6397 case 3: 6398 a: { 6399 kj(b); 6400 if (null === a) throw Error(p(387)); 6401 d = b.pendingProps; 6402 f2 = b.memoizedState; 6403 e = f2.element; 6404 lh(a, b); 6405 qh(b, d, null, c); 6406 var g = b.memoizedState; 6407 d = g.element; 6408 if (f2.isDehydrated) if (f2 = { element: d, isDehydrated: false, cache: g.cache, pendingSuspenseBoundaries: g.pendingSuspenseBoundaries, transitions: g.transitions }, b.updateQueue.baseState = f2, b.memoizedState = f2, b.flags & 256) { 6409 e = Ji(Error(p(423)), b); 6410 b = lj(a, b, d, c, e); 6411 break a; 6412 } else if (d !== e) { 6413 e = Ji(Error(p(424)), b); 6414 b = lj(a, b, d, c, e); 6415 break a; 6416 } else for (yg = Lf(b.stateNode.containerInfo.firstChild), xg = b, I = true, zg = null, c = Vg(b, null, d, c), b.child = c; c; ) c.flags = c.flags & -3 | 4096, c = c.sibling; 6417 else { 6418 Ig(); 6419 if (d === e) { 6420 b = Zi(a, b, c); 6421 break a; 6422 } 6423 Xi(a, b, d, c); 6424 } 6425 b = b.child; 6426 } 6427 return b; 6428 case 5: 6429 return Ah(b), null === a && Eg(b), d = b.type, e = b.pendingProps, f2 = null !== a ? a.memoizedProps : null, g = e.children, Ef(d, e) ? g = null : null !== f2 && Ef(d, f2) && (b.flags |= 32), gj(a, b), Xi(a, b, g, c), b.child; 6430 case 6: 6431 return null === a && Eg(b), null; 6432 case 13: 6433 return oj(a, b, c); 6434 case 4: 6435 return yh(b, b.stateNode.containerInfo), d = b.pendingProps, null === a ? b.child = Ug(b, null, d, c) : Xi(a, b, d, c), b.child; 6436 case 11: 6437 return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), Yi(a, b, d, e, c); 6438 case 7: 6439 return Xi(a, b, b.pendingProps, c), b.child; 6440 case 8: 6441 return Xi(a, b, b.pendingProps.children, c), b.child; 6442 case 12: 6443 return Xi(a, b, b.pendingProps.children, c), b.child; 6444 case 10: 6445 a: { 6446 d = b.type._context; 6447 e = b.pendingProps; 6448 f2 = b.memoizedProps; 6449 g = e.value; 6450 G(Wg, d._currentValue); 6451 d._currentValue = g; 6452 if (null !== f2) if (He(f2.value, g)) { 6453 if (f2.children === e.children && !Wf.current) { 6454 b = Zi(a, b, c); 6455 break a; 6456 } 6457 } else for (f2 = b.child, null !== f2 && (f2.return = b); null !== f2; ) { 6458 var h = f2.dependencies; 6459 if (null !== h) { 6460 g = f2.child; 6461 for (var k2 = h.firstContext; null !== k2; ) { 6462 if (k2.context === d) { 6463 if (1 === f2.tag) { 6464 k2 = mh(-1, c & -c); 6465 k2.tag = 2; 6466 var l2 = f2.updateQueue; 6467 if (null !== l2) { 6468 l2 = l2.shared; 6469 var m2 = l2.pending; 6470 null === m2 ? k2.next = k2 : (k2.next = m2.next, m2.next = k2); 6471 l2.pending = k2; 6472 } 6473 } 6474 f2.lanes |= c; 6475 k2 = f2.alternate; 6476 null !== k2 && (k2.lanes |= c); 6477 bh( 6478 f2.return, 6479 c, 6480 b 6481 ); 6482 h.lanes |= c; 6483 break; 6484 } 6485 k2 = k2.next; 6486 } 6487 } else if (10 === f2.tag) g = f2.type === b.type ? null : f2.child; 6488 else if (18 === f2.tag) { 6489 g = f2.return; 6490 if (null === g) throw Error(p(341)); 6491 g.lanes |= c; 6492 h = g.alternate; 6493 null !== h && (h.lanes |= c); 6494 bh(g, c, b); 6495 g = f2.sibling; 6496 } else g = f2.child; 6497 if (null !== g) g.return = f2; 6498 else for (g = f2; null !== g; ) { 6499 if (g === b) { 6500 g = null; 6501 break; 6502 } 6503 f2 = g.sibling; 6504 if (null !== f2) { 6505 f2.return = g.return; 6506 g = f2; 6507 break; 6508 } 6509 g = g.return; 6510 } 6511 f2 = g; 6512 } 6513 Xi(a, b, e.children, c); 6514 b = b.child; 6515 } 6516 return b; 6517 case 9: 6518 return e = b.type, d = b.pendingProps.children, ch(b, c), e = eh(e), d = d(e), b.flags |= 1, Xi(a, b, d, c), b.child; 6519 case 14: 6520 return d = b.type, e = Ci(d, b.pendingProps), e = Ci(d.type, e), $i(a, b, d, e, c); 6521 case 15: 6522 return bj(a, b, b.type, b.pendingProps, c); 6523 case 17: 6524 return d = b.type, e = b.pendingProps, e = b.elementType === d ? e : Ci(d, e), ij(a, b), b.tag = 1, Zf(d) ? (a = true, cg(b)) : a = false, ch(b, c), Gi(b, d, e), Ii(b, d, e, c), jj(null, b, d, true, a, c); 6525 case 19: 6526 return xj(a, b, c); 6527 case 22: 6528 return dj(a, b, c); 6529 } 6530 throw Error(p(156, b.tag)); 6531}; 6532function Fk(a, b) { 6533 return ac(a, b); 6534} 6535function $k(a, b, c, d) { 6536 this.tag = a; 6537 this.key = c; 6538 this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null; 6539 this.index = 0; 6540 this.ref = null; 6541 this.pendingProps = b; 6542 this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null; 6543 this.mode = d; 6544 this.subtreeFlags = this.flags = 0; 6545 this.deletions = null; 6546 this.childLanes = this.lanes = 0; 6547 this.alternate = null; 6548} 6549function Bg(a, b, c, d) { 6550 return new $k(a, b, c, d); 6551} 6552function aj(a) { 6553 a = a.prototype; 6554 return !(!a || !a.isReactComponent); 6555} 6556function Zk(a) { 6557 if ("function" === typeof a) return aj(a) ? 1 : 0; 6558 if (void 0 !== a && null !== a) { 6559 a = a.$$typeof; 6560 if (a === Da) return 11; 6561 if (a === Ga) return 14; 6562 } 6563 return 2; 6564} 6565function Pg(a, b) { 6566 var c = a.alternate; 6567 null === c ? (c = Bg(a.tag, b, a.key, a.mode), c.elementType = a.elementType, c.type = a.type, c.stateNode = a.stateNode, c.alternate = a, a.alternate = c) : (c.pendingProps = b, c.type = a.type, c.flags = 0, c.subtreeFlags = 0, c.deletions = null); 6568 c.flags = a.flags & 14680064; 6569 c.childLanes = a.childLanes; 6570 c.lanes = a.lanes; 6571 c.child = a.child; 6572 c.memoizedProps = a.memoizedProps; 6573 c.memoizedState = a.memoizedState; 6574 c.updateQueue = a.updateQueue; 6575 b = a.dependencies; 6576 c.dependencies = null === b ? null : { lanes: b.lanes, firstContext: b.firstContext }; 6577 c.sibling = a.sibling; 6578 c.index = a.index; 6579 c.ref = a.ref; 6580 return c; 6581} 6582function Rg(a, b, c, d, e, f2) { 6583 var g = 2; 6584 d = a; 6585 if ("function" === typeof a) aj(a) && (g = 1); 6586 else if ("string" === typeof a) g = 5; 6587 else a: switch (a) { 6588 case ya: 6589 return Tg(c.children, e, f2, b); 6590 case za: 6591 g = 8; 6592 e |= 8; 6593 break; 6594 case Aa: 6595 return a = Bg(12, c, b, e | 2), a.elementType = Aa, a.lanes = f2, a; 6596 case Ea: 6597 return a = Bg(13, c, b, e), a.elementType = Ea, a.lanes = f2, a; 6598 case Fa: 6599 return a = Bg(19, c, b, e), a.elementType = Fa, a.lanes = f2, a; 6600 case Ia: 6601 return pj(c, e, f2, b); 6602 default: 6603 if ("object" === typeof a && null !== a) switch (a.$$typeof) { 6604 case Ba: 6605 g = 10; 6606 break a; 6607 case Ca: 6608 g = 9; 6609 break a; 6610 case Da: 6611 g = 11; 6612 break a; 6613 case Ga: 6614 g = 14; 6615 break a; 6616 case Ha: 6617 g = 16; 6618 d = null; 6619 break a; 6620 } 6621 throw Error(p(130, null == a ? a : typeof a, "")); 6622 } 6623 b = Bg(g, c, b, e); 6624 b.elementType = a; 6625 b.type = d; 6626 b.lanes = f2; 6627 return b; 6628} 6629function Tg(a, b, c, d) { 6630 a = Bg(7, a, d, b); 6631 a.lanes = c; 6632 return a; 6633} 6634function pj(a, b, c, d) { 6635 a = Bg(22, a, d, b); 6636 a.elementType = Ia; 6637 a.lanes = c; 6638 a.stateNode = { isHidden: false }; 6639 return a; 6640} 6641function Qg(a, b, c) { 6642 a = Bg(6, a, null, b); 6643 a.lanes = c; 6644 return a; 6645} 6646function Sg(a, b, c) { 6647 b = Bg(4, null !== a.children ? a.children : [], a.key, b); 6648 b.lanes = c; 6649 b.stateNode = { containerInfo: a.containerInfo, pendingChildren: null, implementation: a.implementation }; 6650 return b; 6651} 6652function al(a, b, c, d, e) { 6653 this.tag = b; 6654 this.containerInfo = a; 6655 this.finishedWork = this.pingCache = this.current = this.pendingChildren = null; 6656 this.timeoutHandle = -1; 6657 this.callbackNode = this.pendingContext = this.context = null; 6658 this.callbackPriority = 0; 6659 this.eventTimes = zc(0); 6660 this.expirationTimes = zc(-1); 6661 this.entangledLanes = this.finishedLanes = this.mutableReadLanes = this.expiredLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0; 6662 this.entanglements = zc(0); 6663 this.identifierPrefix = d; 6664 this.onRecoverableError = e; 6665 this.mutableSourceEagerHydrationData = null; 6666} 6667function bl(a, b, c, d, e, f2, g, h, k2) { 6668 a = new al(a, b, c, h, k2); 6669 1 === b ? (b = 1, true === f2 && (b |= 8)) : b = 0; 6670 f2 = Bg(3, null, null, b); 6671 a.current = f2; 6672 f2.stateNode = a; 6673 f2.memoizedState = { element: d, isDehydrated: c, cache: null, transitions: null, pendingSuspenseBoundaries: null }; 6674 kh(f2); 6675 return a; 6676} 6677function cl(a, b, c) { 6678 var d = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; 6679 return { $$typeof: wa, key: null == d ? null : "" + d, children: a, containerInfo: b, implementation: c }; 6680} 6681function dl(a) { 6682 if (!a) return Vf; 6683 a = a._reactInternals; 6684 a: { 6685 if (Vb(a) !== a || 1 !== a.tag) throw Error(p(170)); 6686 var b = a; 6687 do { 6688 switch (b.tag) { 6689 case 3: 6690 b = b.stateNode.context; 6691 break a; 6692 case 1: 6693 if (Zf(b.type)) { 6694 b = b.stateNode.__reactInternalMemoizedMergedChildContext; 6695 break a; 6696 } 6697 } 6698 b = b.return; 6699 } while (null !== b); 6700 throw Error(p(171)); 6701 } 6702 if (1 === a.tag) { 6703 var c = a.type; 6704 if (Zf(c)) return bg(a, c, b); 6705 } 6706 return b; 6707} 6708function el(a, b, c, d, e, f2, g, h, k2) { 6709 a = bl(c, d, true, a, e, f2, g, h, k2); 6710 a.context = dl(null); 6711 c = a.current; 6712 d = R(); 6713 e = yi(c); 6714 f2 = mh(d, e); 6715 f2.callback = void 0 !== b && null !== b ? b : null; 6716 nh(c, f2, e); 6717 a.current.lanes = e; 6718 Ac(a, e, d); 6719 Dk(a, d); 6720 return a; 6721} 6722function fl(a, b, c, d) { 6723 var e = b.current, f2 = R(), g = yi(e); 6724 c = dl(c); 6725 null === b.context ? b.context = c : b.pendingContext = c; 6726 b = mh(f2, g); 6727 b.payload = { element: a }; 6728 d = void 0 === d ? null : d; 6729 null !== d && (b.callback = d); 6730 a = nh(e, b, g); 6731 null !== a && (gi(a, e, g, f2), oh(a, e, g)); 6732 return g; 6733} 6734function gl(a) { 6735 a = a.current; 6736 if (!a.child) return null; 6737 switch (a.child.tag) { 6738 case 5: 6739 return a.child.stateNode; 6740 default: 6741 return a.child.stateNode; 6742 } 6743} 6744function hl(a, b) { 6745 a = a.memoizedState; 6746 if (null !== a && null !== a.dehydrated) { 6747 var c = a.retryLane; 6748 a.retryLane = 0 !== c && c < b ? c : b; 6749 } 6750} 6751function il(a, b) { 6752 hl(a, b); 6753 (a = a.alternate) && hl(a, b); 6754} 6755function jl() { 6756 return null; 6757} 6758var kl = "function" === typeof reportError ? reportError : function(a) { 6759 console.error(a); 6760}; 6761function ll(a) { 6762 this._internalRoot = a; 6763} 6764ml.prototype.render = ll.prototype.render = function(a) { 6765 var b = this._internalRoot; 6766 if (null === b) throw Error(p(409)); 6767 fl(a, b, null, null); 6768}; 6769ml.prototype.unmount = ll.prototype.unmount = function() { 6770 var a = this._internalRoot; 6771 if (null !== a) { 6772 this._internalRoot = null; 6773 var b = a.containerInfo; 6774 Rk(function() { 6775 fl(null, a, null, null); 6776 }); 6777 b[uf] = null; 6778 } 6779}; 6780function ml(a) { 6781 this._internalRoot = a; 6782} 6783ml.prototype.unstable_scheduleHydration = function(a) { 6784 if (a) { 6785 var b = Hc(); 6786 a = { blockedOn: null, target: a, priority: b }; 6787 for (var c = 0; c < Qc.length && 0 !== b && b < Qc[c].priority; c++) ; 6788 Qc.splice(c, 0, a); 6789 0 === c && Vc(a); 6790 } 6791}; 6792function nl(a) { 6793 return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType); 6794} 6795function ol(a) { 6796 return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType && (8 !== a.nodeType || " react-mount-point-unstable " !== a.nodeValue)); 6797} 6798function pl() { 6799} 6800function ql(a, b, c, d, e) { 6801 if (e) { 6802 if ("function" === typeof d) { 6803 var f2 = d; 6804 d = function() { 6805 var a2 = gl(g); 6806 f2.call(a2); 6807 }; 6808 } 6809 var g = el(b, d, a, 0, null, false, false, "", pl); 6810 a._reactRootContainer = g; 6811 a[uf] = g.current; 6812 sf(8 === a.nodeType ? a.parentNode : a); 6813 Rk(); 6814 return g; 6815 } 6816 for (; e = a.lastChild; ) a.removeChild(e); 6817 if ("function" === typeof d) { 6818 var h = d; 6819 d = function() { 6820 var a2 = gl(k2); 6821 h.call(a2); 6822 }; 6823 } 6824 var k2 = bl(a, 0, false, null, null, false, false, "", pl); 6825 a._reactRootContainer = k2; 6826 a[uf] = k2.current; 6827 sf(8 === a.nodeType ? a.parentNode : a); 6828 Rk(function() { 6829 fl(b, k2, c, d); 6830 }); 6831 return k2; 6832} 6833function rl(a, b, c, d, e) { 6834 var f2 = c._reactRootContainer; 6835 if (f2) { 6836 var g = f2; 6837 if ("function" === typeof e) { 6838 var h = e; 6839 e = function() { 6840 var a2 = gl(g); 6841 h.call(a2); 6842 }; 6843 } 6844 fl(b, g, a, e); 6845 } else g = ql(c, b, a, e, d); 6846 return gl(g); 6847} 6848Ec = function(a) { 6849 switch (a.tag) { 6850 case 3: 6851 var b = a.stateNode; 6852 if (b.current.memoizedState.isDehydrated) { 6853 var c = tc(b.pendingLanes); 6854 0 !== c && (Cc(b, c | 1), Dk(b, B()), 0 === (K & 6) && (Gj = B() + 500, jg())); 6855 } 6856 break; 6857 case 13: 6858 Rk(function() { 6859 var b2 = ih(a, 1); 6860 if (null !== b2) { 6861 var c2 = R(); 6862 gi(b2, a, 1, c2); 6863 } 6864 }), il(a, 1); 6865 } 6866}; 6867Fc = function(a) { 6868 if (13 === a.tag) { 6869 var b = ih(a, 134217728); 6870 if (null !== b) { 6871 var c = R(); 6872 gi(b, a, 134217728, c); 6873 } 6874 il(a, 134217728); 6875 } 6876}; 6877Gc = function(a) { 6878 if (13 === a.tag) { 6879 var b = yi(a), c = ih(a, b); 6880 if (null !== c) { 6881 var d = R(); 6882 gi(c, a, b, d); 6883 } 6884 il(a, b); 6885 } 6886}; 6887Hc = function() { 6888 return C; 6889}; 6890Ic = function(a, b) { 6891 var c = C; 6892 try { 6893 return C = a, b(); 6894 } finally { 6895 C = c; 6896 } 6897}; 6898yb = function(a, b, c) { 6899 switch (b) { 6900 case "input": 6901 bb(a, c); 6902 b = c.name; 6903 if ("radio" === c.type && null != b) { 6904 for (c = a; c.parentNode; ) c = c.parentNode; 6905 c = c.querySelectorAll("input[name=" + JSON.stringify("" + b) + '][type="radio"]'); 6906 for (b = 0; b < c.length; b++) { 6907 var d = c[b]; 6908 if (d !== a && d.form === a.form) { 6909 var e = Db(d); 6910 if (!e) throw Error(p(90)); 6911 Wa(d); 6912 bb(d, e); 6913 } 6914 } 6915 } 6916 break; 6917 case "textarea": 6918 ib(a, c); 6919 break; 6920 case "select": 6921 b = c.value, null != b && fb(a, !!c.multiple, b, false); 6922 } 6923}; 6924Gb = Qk; 6925Hb = Rk; 6926var sl = { usingClientEntryPoint: false, Events: [Cb, ue, Db, Eb, Fb, Qk] }, tl = { findFiberByHostInstance: Wc, bundleType: 0, version: "18.3.1", rendererPackageName: "react-dom" }; 6927var ul = { bundleType: tl.bundleType, version: tl.version, rendererPackageName: tl.rendererPackageName, rendererConfig: tl.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, overrideProps: null, overridePropsDeletePath: null, overridePropsRenamePath: null, setErrorHandler: null, setSuspenseHandler: null, scheduleUpdate: null, currentDispatcherRef: ua.ReactCurrentDispatcher, findHostInstanceByFiber: function(a) { 6928 a = Zb(a); 6929 return null === a ? null : a.stateNode; 6930}, findFiberByHostInstance: tl.findFiberByHostInstance || jl, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, reconcilerVersion: "18.3.1-next-f1338f8080-20240426" }; 6931if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { 6932 var vl = __REACT_DEVTOOLS_GLOBAL_HOOK__; 6933 if (!vl.isDisabled && vl.supportsFiber) try { 6934 kc = vl.inject(ul), lc = vl; 6935 } catch (a) { 6936 } 6937} 6938reactDom_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = sl; 6939reactDom_production_min.createPortal = function(a, b) { 6940 var c = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null; 6941 if (!nl(b)) throw Error(p(200)); 6942 return cl(a, b, null, c); 6943}; 6944reactDom_production_min.createRoot = function(a, b) { 6945 if (!nl(a)) throw Error(p(299)); 6946 var c = false, d = "", e = kl; 6947 null !== b && void 0 !== b && (true === b.unstable_strictMode && (c = true), void 0 !== b.identifierPrefix && (d = b.identifierPrefix), void 0 !== b.onRecoverableError && (e = b.onRecoverableError)); 6948 b = bl(a, 1, false, null, null, c, false, d, e); 6949 a[uf] = b.current; 6950 sf(8 === a.nodeType ? a.parentNode : a); 6951 return new ll(b); 6952}; 6953reactDom_production_min.findDOMNode = function(a) { 6954 if (null == a) return null; 6955 if (1 === a.nodeType) return a; 6956 var b = a._reactInternals; 6957 if (void 0 === b) { 6958 if ("function" === typeof a.render) throw Error(p(188)); 6959 a = Object.keys(a).join(","); 6960 throw Error(p(268, a)); 6961 } 6962 a = Zb(b); 6963 a = null === a ? null : a.stateNode; 6964 return a; 6965}; 6966reactDom_production_min.flushSync = function(a) { 6967 return Rk(a); 6968}; 6969reactDom_production_min.hydrate = function(a, b, c) { 6970 if (!ol(b)) throw Error(p(200)); 6971 return rl(null, a, b, true, c); 6972}; 6973reactDom_production_min.hydrateRoot = function(a, b, c) { 6974 if (!nl(a)) throw Error(p(405)); 6975 var d = null != c && c.hydratedSources || null, e = false, f2 = "", g = kl; 6976 null !== c && void 0 !== c && (true === c.unstable_strictMode && (e = true), void 0 !== c.identifierPrefix && (f2 = c.identifierPrefix), void 0 !== c.onRecoverableError && (g = c.onRecoverableError)); 6977 b = el(b, null, a, 1, null != c ? c : null, e, false, f2, g); 6978 a[uf] = b.current; 6979 sf(a); 6980 if (d) for (a = 0; a < d.length; a++) c = d[a], e = c._getVersion, e = e(c._source), null == b.mutableSourceEagerHydrationData ? b.mutableSourceEagerHydrationData = [c, e] : b.mutableSourceEagerHydrationData.push( 6981 c, 6982 e 6983 ); 6984 return new ml(b); 6985}; 6986reactDom_production_min.render = function(a, b, c) { 6987 if (!ol(b)) throw Error(p(200)); 6988 return rl(null, a, b, false, c); 6989}; 6990reactDom_production_min.unmountComponentAtNode = function(a) { 6991 if (!ol(a)) throw Error(p(40)); 6992 return a._reactRootContainer ? (Rk(function() { 6993 rl(null, null, a, false, function() { 6994 a._reactRootContainer = null; 6995 a[uf] = null; 6996 }); 6997 }), true) : false;
6998}; 6999reactDom_production_min.unstable_batchedUpdates = Qk; 7000reactDom_production_min.unstable_renderSubtreeIntoContainer = function(a, b, c, d) { 7001 if (!ol(c)) throw Error(p(200)); 7002 if (null == a || void 0 === a._reactInternals) throw Error(p(38)); 7003 return rl(a, b, c, false, d); 7004}; 7005reactDom_production_min.version = "18.3.1-next-f1338f8080-20240426"; 7006function checkDCE() { 7007 if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") { 7008 return; 7009 } 7010 try { 7011 __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); 7012 } catch (err) { 7013 console.error(err); 7014 } 7015} 7016{ 7017 checkDCE(); 7018 reactDom.exports = reactDom_production_min; 7019} 7020var reactDomExports = reactDom.exports; 7021var m = reactDomExports; 7022{ 7023 client.createRoot = m.createRoot; 7024 client.hydrateRoot = m.hydrateRoot; 7025} 7026var Subscribable = class { 7027 constructor() { 7028 this.listeners = /* @__PURE__ */ new Set(); 7029 this.subscribe = this.subscribe.bind(this); 7030 } 7031 subscribe(listener) { 7032 this.listeners.add(listener); 7033 this.onSubscribe(); 7034 return () => { 7035 this.listeners.delete(listener); 7036 this.onUnsubscribe(); 7037 }; 7038 } 7039 hasListeners() { 7040 return this.listeners.size > 0; 7041 } 7042 onSubscribe() { 7043 } 7044 onUnsubscribe() { 7045 } 7046}; 7047var defaultTimeoutProvider = { 7048 // We need the wrapper function syntax below instead of direct references to 7049 // global setTimeout etc. 7050 // 7051 // BAD: `setTimeout: setTimeout` 7052 // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)` 7053 // 7054 // If we use direct references here, then anything that wants to spy on or 7055 // replace the global setTimeout (like tests) won't work since we'll already 7056 // have a hard reference to the original implementation at the time when this 7057 // file was imported. 7058 setTimeout: (callback, delay) => setTimeout(callback, delay), 7059 clearTimeout: (timeoutId) => clearTimeout(timeoutId), 7060 setInterval: (callback, delay) => setInterval(callback, delay), 7061 clearInterval: (intervalId) => clearInterval(intervalId) 7062}; 7063var TimeoutManager = (_a = class { 7064 constructor() { 7065 // We cannot have TimeoutManager<T> as we must instantiate it with a concrete 7066 // type at app boot; and if we leave that type, then any new timer provider 7067 // would need to support ReturnType<typeof setTimeout>, which is infeasible. 7068 // 7069 // We settle for type safety for the TimeoutProvider type, and accept that 7070 // this class is unsafe internally to allow for extension. 7071 __privateAdd(this, _provider, defaultTimeoutProvider); 7072 __privateAdd(this, _providerCalled, false); 7073 } 7074 setTimeoutProvider(provider) { 7075 __privateSet(this, _provider, provider); 7076 } 7077 setTimeout(callback, delay) { 7078 return __privateGet(this, _provider).setTimeout(callback, delay); 7079 } 7080 clearTimeout(timeoutId) { 7081 __privateGet(this, _provider).clearTimeout(timeoutId); 7082 } 7083 setInterval(callback, delay) { 7084 return __privateGet(this, _provider).setInterval(callback, delay); 7085 } 7086 clearInterval(intervalId) { 7087 __privateGet(this, _provider).clearInterval(intervalId); 7088 } 7089}, _provider = new WeakMap(), _providerCalled = new WeakMap(), _a); 7090var timeoutManager = new TimeoutManager(); 7091function systemSetTimeoutZero(callback) { 7092 setTimeout(callback, 0); 7093} 7094var isServer = typeof window === "undefined" || "Deno" in globalThis; 7095function noop$1() { 7096} 7097function functionalUpdate(updater, input) { 7098 return typeof updater === "function" ? updater(input) : updater; 7099} 7100function isValidTimeout(value) { 7101 return typeof value === "number" && value >= 0 && value !== Infinity; 7102} 7103function timeUntilStale(updatedAt, staleTime) { 7104 return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0); 7105} 7106function resolveStaleTime(staleTime, query) { 7107 return typeof staleTime === "function" ? staleTime(query) : staleTime; 7108} 7109function resolveEnabled(enabled, query) { 7110 return typeof enabled === "function" ? enabled(query) : enabled; 7111} 7112function matchQuery(filters, query) { 7113 const { 7114 type = "all", 7115 exact, 7116 fetchStatus, 7117 predicate, 7118 queryKey, 7119 stale 7120 } = filters; 7121 if (queryKey) { 7122 if (exact) { 7123 if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) { 7124 return false;
vendor: 6,327 bytes, lines 7125-7352
7125 } 7126 } else if (!partialMatchKey(query.queryKey, queryKey)) { 7127 return false; 7128 } 7129 } 7130 if (type !== "all") { 7131 const isActive = query.isActive(); 7132 if (type === "active" && !isActive) { 7133 return false; 7134 } 7135 if (type === "inactive" && isActive) { 7136 return false; 7137 } 7138 } 7139 if (typeof stale === "boolean" && query.isStale() !== stale) { 7140 return false; 7141 } 7142 if (fetchStatus && fetchStatus !== query.state.fetchStatus) { 7143 return false; 7144 } 7145 if (predicate && !predicate(query)) { 7146 return false; 7147 } 7148 return true; 7149} 7150function matchMutation(filters, mutation) { 7151 const { exact, status, predicate, mutationKey } = filters; 7152 if (mutationKey) { 7153 if (!mutation.options.mutationKey) { 7154 return false; 7155 } 7156 if (exact) { 7157 if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) { 7158 return false; 7159 } 7160 } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) { 7161 return false; 7162 } 7163 } 7164 if (status && mutation.state.status !== status) { 7165 return false; 7166 } 7167 if (predicate && !predicate(mutation)) { 7168 return false; 7169 } 7170 return true; 7171} 7172function hashQueryKeyByOptions(queryKey, options) { 7173 const hashFn = options?.queryKeyHashFn || hashKey; 7174 return hashFn(queryKey); 7175} 7176function hashKey(queryKey) { 7177 return JSON.stringify( 7178 queryKey, 7179 (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => { 7180 result[key] = val[key]; 7181 return result; 7182 }, {}) : val 7183 ); 7184} 7185function partialMatchKey(a, b) { 7186 if (a === b) { 7187 return true; 7188 } 7189 if (typeof a !== typeof b) { 7190 return false; 7191 } 7192 if (a && b && typeof a === "object" && typeof b === "object") { 7193 return Object.keys(b).every((key) => partialMatchKey(a[key], b[key])); 7194 } 7195 return false; 7196} 7197var hasOwn = Object.prototype.hasOwnProperty; 7198function replaceEqualDeep(a, b) { 7199 if (a === b) { 7200 return a; 7201 } 7202 const array = isPlainArray(a) && isPlainArray(b); 7203 if (!array && !(isPlainObject(a) && isPlainObject(b))) return b; 7204 const aItems = array ? a : Object.keys(a); 7205 const aSize = aItems.length; 7206 const bItems = array ? b : Object.keys(b); 7207 const bSize = bItems.length; 7208 const copy = array ? new Array(bSize) : {}; 7209 let equalItems = 0; 7210 for (let i = 0; i < bSize; i++) { 7211 const key = array ? i : bItems[i]; 7212 const aItem = a[key]; 7213 const bItem = b[key]; 7214 if (aItem === bItem) { 7215 copy[key] = aItem; 7216 if (array ? i < aSize : hasOwn.call(a, key)) equalItems++; 7217 continue; 7218 } 7219 if (aItem === null || bItem === null || typeof aItem !== "object" || typeof bItem !== "object") { 7220 copy[key] = bItem; 7221 continue; 7222 } 7223 const v2 = replaceEqualDeep(aItem, bItem); 7224 copy[key] = v2; 7225 if (v2 === aItem) equalItems++; 7226 } 7227 return aSize === bSize && equalItems === aSize ? a : copy; 7228} 7229function shallowEqualObjects(a, b) { 7230 if (!b || Object.keys(a).length !== Object.keys(b).length) { 7231 return false; 7232 } 7233 for (const key in a) { 7234 if (a[key] !== b[key]) { 7235 return false; 7236 } 7237 } 7238 return true; 7239} 7240function isPlainArray(value) { 7241 return Array.isArray(value) && value.length === Object.keys(value).length; 7242} 7243function isPlainObject(o) { 7244 if (!hasObjectPrototype(o)) { 7245 return false; 7246 } 7247 const ctor = o.constructor; 7248 if (ctor === void 0) { 7249 return true; 7250 } 7251 const prot = ctor.prototype; 7252 if (!hasObjectPrototype(prot)) { 7253 return false; 7254 } 7255 if (!prot.hasOwnProperty("isPrototypeOf")) { 7256 return false; 7257 } 7258 if (Object.getPrototypeOf(o) !== Object.prototype) { 7259 return false; 7260 } 7261 return true; 7262} 7263function hasObjectPrototype(o) { 7264 return Object.prototype.toString.call(o) === "[object Object]"; 7265} 7266function sleep(timeout) { 7267 return new Promise((resolve) => { 7268 timeoutManager.setTimeout(resolve, timeout); 7269 }); 7270} 7271function replaceData(prevData, data, options) { 7272 if (typeof options.structuralSharing === "function") { 7273 return options.structuralSharing(prevData, data); 7274 } else if (options.structuralSharing !== false) { 7275 return replaceEqualDeep(prevData, data); 7276 } 7277 return data; 7278} 7279function addToEnd(items, item, max = 0) { 7280 const newItems = [...items, item]; 7281 return max && newItems.length > max ? newItems.slice(1) : newItems; 7282} 7283function addToStart(items, item, max = 0) { 7284 const newItems = [item, ...items]; 7285 return max && newItems.length > max ? newItems.slice(0, -1) : newItems; 7286} 7287var skipToken = Symbol(); 7288function ensureQueryFn(options, fetchOptions) { 7289 if (!options.queryFn && fetchOptions?.initialPromise) { 7290 return () => fetchOptions.initialPromise; 7291 } 7292 if (!options.queryFn || options.queryFn === skipToken) { 7293 return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`)); 7294 } 7295 return options.queryFn; 7296} 7297function shouldThrowError(throwOnError, params) { 7298 if (typeof throwOnError === "function") { 7299 return throwOnError(...params); 7300 } 7301 return !!throwOnError; 7302} 7303var FocusManager = (_b = class extends Subscribable { 7304 constructor() { 7305 super(); 7306 __privateAdd(this, _focused); 7307 __privateAdd(this, _cleanup); 7308 __privateAdd(this, _setup); 7309 __privateSet(this, _setup, (onFocus) => { 7310 if (!isServer && window.addEventListener) { 7311 const listener = () => onFocus(); 7312 window.addEventListener("visibilitychange", listener, false); 7313 return () => { 7314 window.removeEventListener("visibilitychange", listener); 7315 }; 7316 } 7317 return; 7318 }); 7319 } 7320 onSubscribe() { 7321 if (!__privateGet(this, _cleanup)) { 7322 this.setEventListener(__privateGet(this, _setup)); 7323 } 7324 } 7325 onUnsubscribe() { 7326 var _a2; 7327 if (!this.hasListeners()) { 7328 (_a2 = __privateGet(this, _cleanup)) == null ? void 0 : _a2.call(this); 7329 __privateSet(this, _cleanup, void 0); 7330 } 7331 } 7332 setEventListener(setup) { 7333 var _a2; 7334 __privateSet(this, _setup, setup); 7335 (_a2 = __privateGet(this, _cleanup)) == null ? void 0 : _a2.call(this); 7336 __privateSet(this, _cleanup, setup((focused) => { 7337 if (typeof focused === "boolean") { 7338 this.setFocused(focused); 7339 } else { 7340 this.onFocus(); 7341 } 7342 })); 7343 } 7344 setFocused(focused) { 7345 const changed = __privateGet(this, _focused) !== focused; 7346 if (changed) { 7347 __privateSet(this, _focused, focused); 7348 this.onFocus(); 7349 } 7350 } 7351 onFocus() { 7352 const isFocused = this.isFocused();
7353 this.listeners.forEach((listener) => { 7354 listener(isFocused); 7355 }); 7356 } 7357 isFocused() { 7358 if (typeof __privateGet(this, _focused) === "boolean") { 7359 return __privateGet(this, _focused); 7360 } 7361 return globalThis.document?.visibilityState !== "hidden"; 7362 } 7363}, _focused = new WeakMap(), _cleanup = new WeakMap(), _setup = new WeakMap(), _b); 7364var focusManager = new FocusManager(); 7365function pendingThenable() { 7366 let resolve; 7367 let reject; 7368 const thenable = new Promise((_resolve, _reject) => { 7369 resolve = _resolve; 7370 reject = _reject; 7371 }); 7372 thenable.status = "pending"; 7373 thenable.catch(() => { 7374 }); 7375 function finalize(data) { 7376 Object.assign(thenable, data); 7377 delete thenable.resolve; 7378 delete thenable.reject; 7379 } 7380 thenable.resolve = (value) => { 7381 finalize({ 7382 status: "fulfilled", 7383 value 7384 }); 7385 resolve(value); 7386 }; 7387 thenable.reject = (reason) => { 7388 finalize({ 7389 status: "rejected", 7390 reason 7391 }); 7392 reject(reason); 7393 }; 7394 return thenable; 7395} 7396function tryResolveSync(promise) { 7397 let data; 7398 promise.then((result) => { 7399 data = result; 7400 return result; 7401 }, noop$1)?.catch(noop$1); 7402 if (data !== void 0) { 7403 return { data }; 7404 } 7405 return void 0; 7406} 7407function defaultTransformerFn(data) { 7408 return data; 7409} 7410function dehydrateMutation(mutation) { 7411 return { 7412 mutationKey: mutation.options.mutationKey, 7413 state: mutation.state, 7414 ...mutation.options.scope && { scope: mutation.options.scope }, 7415 ...mutation.meta && { meta: mutation.meta } 7416 }; 7417} 7418function dehydrateQuery(query, serializeData, shouldRedactErrors) { 7419 return { 7420 dehydratedAt: Date.now(), 7421 state: { 7422 ...query.state, 7423 ...query.state.data !== void 0 && { 7424 data: serializeData(query.state.data) 7425 } 7426 }, 7427 queryKey: query.queryKey, 7428 queryHash: query.queryHash, 7429 ...query.state.status === "pending" && { 7430 promise: query.promise?.then(serializeData).catch((error) => { 7431 if (!shouldRedactErrors(error)) { 7432 return Promise.reject(error); 7433 } 7434 return Promise.reject(new Error("redacted")); 7435 }) 7436 }, 7437 ...query.meta && { meta: query.meta } 7438 }; 7439} 7440function defaultShouldDehydrateMutation(mutation) { 7441 return mutation.state.isPaused; 7442} 7443function defaultShouldDehydrateQuery(query) { 7444 return query.state.status === "success"; 7445} 7446function defaultShouldRedactErrors(_) { 7447 return true; 7448} 7449function dehydrate(client2, options = {}) { 7450 const filterMutation = options.shouldDehydrateMutation ?? client2.getDefaultOptions().dehydrate?.shouldDehydrateMutation ?? defaultShouldDehydrateMutation; 7451 const mutations = client2.getMutationCache().getAll().flatMap( 7452 (mutation) => filterMutation(mutation) ? [dehydrateMutation(mutation)] : [] 7453 ); 7454 const filterQuery = options.shouldDehydrateQuery ?? client2.getDefaultOptions().dehydrate?.shouldDehydrateQuery ?? defaultShouldDehydrateQuery; 7455 const shouldRedactErrors = options.shouldRedactErrors ?? client2.getDefaultOptions().dehydrate?.shouldRedactErrors ?? defaultShouldRedactErrors; 7456 const serializeData = options.serializeData ?? client2.getDefaultOptions().dehydrate?.serializeData ?? defaultTransformerFn; 7457 const queries = client2.getQueryCache().getAll().flatMap( 7458 (query) => filterQuery(query) ? [dehydrateQuery(query, serializeData, shouldRedactErrors)] : [] 7459 ); 7460 return { mutations, queries }; 7461} 7462function hydrate(client2, dehydratedState, options) { 7463 if (typeof dehydratedState !== "object" || dehydratedState === null) { 7464 return; 7465 } 7466 const mutationCache = client2.getMutationCache(); 7467 const queryCache = client2.getQueryCache(); 7468 const deserializeData = options?.defaultOptions?.deserializeData ?? client2.getDefaultOptions().hydrate?.deserializeData ?? defaultTransformerFn; 7469 const mutations = dehydratedState.mutations || []; 7470 const queries = dehydratedState.queries || []; 7471 mutations.forEach(({ state, ...mutationOptions }) => { 7472 mutationCache.build( 7473 client2, 7474 { 7475 ...client2.getDefaultOptions().hydrate?.mutations, 7476 ...options?.defaultOptions?.mutations, 7477 ...mutationOptions 7478 }, 7479 state 7480 ); 7481 });
7482 queries.forEach( 7483 ({ queryKey, state, queryHash, meta, promise, dehydratedAt }) => { 7484 const syncData = promise ? tryResolveSync(promise) : void 0; 7485 const rawData = state.data === void 0 ? syncData?.data : state.data; 7486 const data = rawData === void 0 ? rawData : deserializeData(rawData); 7487 let query = queryCache.get(queryHash); 7488 const existingQueryIsPending = query?.state.status === "pending"; 7489 const existingQueryIsFetching = query?.state.fetchStatus === "fetching"; 7490 if (query) { 7491 const hasNewerSyncData = syncData && // We only need this undefined check to handle older dehydration 7492 // payloads that might not have dehydratedAt 7493 dehydratedAt !== void 0 && dehydratedAt > query.state.dataUpdatedAt; 7494 if (state.dataUpdatedAt > query.state.dataUpdatedAt || hasNewerSyncData) { 7495 const { fetchStatus: _ignored, ...serializedState } = state; 7496 query.setState({ 7497 ...serializedState, 7498 data 7499 }); 7500 } 7501 } else { 7502 query = queryCache.build( 7503 client2, 7504 { 7505 ...client2.getDefaultOptions().hydrate?.queries, 7506 ...options?.defaultOptions?.queries, 7507 queryKey, 7508 queryHash, 7509 meta 7510 }, 7511 // Reset fetch status to idle to avoid 7512 // query being stuck in fetching state upon hydration 7513 { 7514 ...state, 7515 data, 7516 fetchStatus: "idle", 7517 status: data !== void 0 ? "success" : state.status 7518 } 7519 ); 7520 } 7521 if (promise && !existingQueryIsPending && !existingQueryIsFetching && // Only hydrate if dehydration is newer than any existing data, 7522 // this is always true for new queries 7523 (dehydratedAt === void 0 || dehydratedAt > query.state.dataUpdatedAt)) { 7524 void query.fetch(void 0, { 7525 // RSC transformed promises are not thenable 7526 initialPromise: Promise.resolve(promise).then(deserializeData) 7527 }); 7528 } 7529 } 7530 ); 7531} 7532var defaultScheduler = systemSetTimeoutZero; 7533function createNotifyManager() { 7534 let queue = []; 7535 let transactions = 0; 7536 let notifyFn = (callback) => { 7537 callback(); 7538 }; 7539 let batchNotifyFn = (callback) => { 7540 callback(); 7541 }; 7542 let scheduleFn = defaultScheduler; 7543 const schedule = (callback) => { 7544 if (transactions) { 7545 queue.push(callback); 7546 } else { 7547 scheduleFn(() => { 7548 notifyFn(callback); 7549 }); 7550 } 7551 }; 7552 const flush = () => { 7553 const originalQueue = queue; 7554 queue = []; 7555 if (originalQueue.length) { 7556 scheduleFn(() => { 7557 batchNotifyFn(() => { 7558 originalQueue.forEach((callback) => { 7559 notifyFn(callback); 7560 }); 7561 }); 7562 }); 7563 } 7564 }; 7565 return { 7566 batch: (callback) => { 7567 let result; 7568 transactions++;
7569 try { 7570 result = callback(); 7571 } finally { 7572 transactions--; 7573 if (!transactions) { 7574 flush(); 7575 } 7576 } 7577 return result; 7578 }, 7579 /** 7580 * All calls to the wrapped function will be batched. 7581 */ 7582 batchCalls: (callback) => { 7583 return (...args) => { 7584 schedule(() => { 7585 callback(...args); 7586 }); 7587 }; 7588 }, 7589 schedule, 7590 /** 7591 * Use this method to set a custom notify function. 7592 * This can be used to for example wrap notifications with `React.act` while running tests. 7593 */ 7594 setNotifyFunction: (fn) => { 7595 notifyFn = fn; 7596 }, 7597 /** 7598 * Use this method to set a custom function to batch notifications together into a single tick. 7599 * By default React Query will use the batch function provided by ReactDOM or React Native. 7600 */ 7601 setBatchNotifyFunction: (fn) => { 7602 batchNotifyFn = fn; 7603 }, 7604 setScheduler: (fn) => { 7605 scheduleFn = fn; 7606 } 7607 }; 7608} 7609var notifyManager = createNotifyManager(); 7610var OnlineManager = (_c = class extends Subscribable { 7611 constructor() { 7612 super(); 7613 __privateAdd(this, _online, true); 7614 __privateAdd(this, _cleanup2); 7615 __privateAdd(this, _setup2); 7616 __privateSet(this, _setup2, (onOnline) => { 7617 if (!isServer && window.addEventListener) { 7618 const onlineListener = () => onOnline(true); 7619 const offlineListener = () => onOnline(false); 7620 window.addEventListener("online", onlineListener, false); 7621 window.addEventListener("offline", offlineListener, false); 7622 return () => { 7623 window.removeEventListener("online", onlineListener); 7624 window.removeEventListener("offline", offlineListener); 7625 }; 7626 } 7627 return; 7628 }); 7629 } 7630 onSubscribe() { 7631 if (!__privateGet(this, _cleanup2)) { 7632 this.setEventListener(__privateGet(this, _setup2)); 7633 } 7634 } 7635 onUnsubscribe() { 7636 var _a2; 7637 if (!this.hasListeners()) { 7638 (_a2 = __privateGet(this, _cleanup2)) == null ? void 0 : _a2.call(this); 7639 __privateSet(this, _cleanup2, void 0); 7640 } 7641 } 7642 setEventListener(setup) { 7643 var _a2; 7644 __privateSet(this, _setup2, setup); 7645 (_a2 = __privateGet(this, _cleanup2)) == null ? void 0 : _a2.call(this); 7646 __privateSet(this, _cleanup2, setup(this.setOnline.bind(this))); 7647 } 7648 setOnline(online) { 7649 const changed = __privateGet(this, _online) !== online; 7650 if (changed) { 7651 __privateSet(this, _online, online); 7652 this.listeners.forEach((listener) => { 7653 listener(online); 7654 }); 7655 } 7656 } 7657 isOnline() { 7658 return __privateGet(this, _online); 7659 } 7660}, _online = new WeakMap(), _cleanup2 = new WeakMap(), _setup2 = new WeakMap(), _c); 7661var onlineManager = new OnlineManager(); 7662function defaultRetryDelay(failureCount) { 7663 return Math.min(1e3 * 2 ** failureCount, 3e4); 7664} 7665function canFetch(networkMode) { 7666 return (networkMode ?? "online") === "online" ? onlineManager.isOnline() : true; 7667} 7668var CancelledError = class extends Error { 7669 constructor(options) { 7670 super("CancelledError"); 7671 this.revert = options?.revert; 7672 this.silent = options?.silent; 7673 } 7674}; 7675function createRetryer(config) { 7676 let isRetryCancelled = false; 7677 let failureCount = 0; 7678 let continueFn; 7679 const thenable = pendingThenable(); 7680 const isResolved = () => thenable.status !== "pending"; 7681 const cancel = (cancelOptions) => { 7682 if (!isResolved()) { 7683 const error = new CancelledError(cancelOptions); 7684 reject(error); 7685 config.onCancel?.(error); 7686 } 7687 }; 7688 const cancelRetry = () => { 7689 isRetryCancelled = true; 7690 }; 7691 const continueRetry = () => { 7692 isRetryCancelled = false; 7693 }; 7694 const canContinue = () => focusManager.isFocused() && (config.networkMode === "always" || onlineManager.isOnline()) && config.canRun(); 7695 const canStart = () => canFetch(config.networkMode) && config.canRun(); 7696 const resolve = (value) => { 7697 if (!isResolved()) { 7698 continueFn?.(); 7699 thenable.resolve(value); 7700 } 7701 }; 7702 const reject = (value) => { 7703 if (!isResolved()) { 7704 continueFn?.(); 7705 thenable.reject(value); 7706 } 7707 }; 7708 const pause = () => { 7709 return new Promise((continueResolve) => { 7710 continueFn = (value) => {
7711 if (isResolved() || canContinue()) { 7712 continueResolve(value); 7713 } 7714 }; 7715 config.onPause?.(); 7716 }).then(() => { 7717 continueFn = void 0; 7718 if (!isResolved()) { 7719 config.onContinue?.(); 7720 } 7721 }); 7722 }; 7723 const run = () => { 7724 if (isResolved()) { 7725 return; 7726 } 7727 let promiseOrValue; 7728 const initialPromise = failureCount === 0 ? config.initialPromise : void 0; 7729 try { 7730 promiseOrValue = initialPromise ?? config.fn(); 7731 } catch (error) { 7732 promiseOrValue = Promise.reject(error); 7733 } 7734 Promise.resolve(promiseOrValue).then(resolve).catch((error) => { 7735 if (isResolved()) { 7736 return; 7737 } 7738 const retry = config.retry ?? (isServer ? 0 : 3); 7739 const retryDelay = config.retryDelay ?? defaultRetryDelay; 7740 const delay = typeof retryDelay === "function" ? retryDelay(failureCount, error) : retryDelay; 7741 const shouldRetry = retry === true || typeof retry === "number" && failureCount < retry || typeof retry === "function" && retry(failureCount, error); 7742 if (isRetryCancelled || !shouldRetry) { 7743 reject(error); 7744 return; 7745 } 7746 failureCount++; 7747 config.onFail?.(failureCount, error); 7748 sleep(delay).then(() => { 7749 return canContinue() ? void 0 : pause(); 7750 }).then(() => { 7751 if (isRetryCancelled) { 7752 reject(error); 7753 } else { 7754 run(); 7755 } 7756 }); 7757 }); 7758 }; 7759 return { 7760 promise: thenable, 7761 status: () => thenable.status, 7762 cancel, 7763 continue: () => { 7764 continueFn?.(); 7765 return thenable; 7766 }, 7767 cancelRetry, 7768 continueRetry, 7769 canStart, 7770 start: () => { 7771 if (canStart()) { 7772 run(); 7773 } else { 7774 pause().then(run); 7775 } 7776 return thenable; 7777 } 7778 }; 7779} 7780var Removable = (_d = class { 7781 constructor() { 7782 __privateAdd(this, _gcTimeout); 7783 } 7784 destroy() { 7785 this.clearGcTimeout(); 7786 } 7787 scheduleGc() { 7788 this.clearGcTimeout(); 7789 if (isValidTimeout(this.gcTime)) { 7790 __privateSet(this, _gcTimeout, timeoutManager.setTimeout(() => { 7791 this.optionalRemove(); 7792 }, this.gcTime)); 7793 } 7794 } 7795 updateGcTime(newGcTime) { 7796 this.gcTime = Math.max( 7797 this.gcTime || 0, 7798 newGcTime ?? (isServer ? Infinity : 5 * 60 * 1e3) 7799 ); 7800 } 7801 clearGcTimeout() { 7802 if (__privateGet(this, _gcTimeout)) { 7803 timeoutManager.clearTimeout(__privateGet(this, _gcTimeout)); 7804 __privateSet(this, _gcTimeout, void 0); 7805 } 7806 } 7807}, _gcTimeout = new WeakMap(), _d); 7808var Query = (_e = class extends Removable { 7809 constructor(config) { 7810 super(); 7811 __privateAdd(this, _Query_instances); 7812 __privateAdd(this, _initialState); 7813 __privateAdd(this, _revertState); 7814 __privateAdd(this, _cache); 7815 __privateAdd(this, _client); 7816 __privateAdd(this, _retryer); 7817 __privateAdd(this, _defaultOptions); 7818 __privateAdd(this, _abortSignalConsumed); 7819 __privateSet(this, _abortSignalConsumed, false); 7820 __privateSet(this, _defaultOptions, config.defaultOptions); 7821 this.setOptions(config.options); 7822 this.observers = []; 7823 __privateSet(this, _client, config.client); 7824 __privateSet(this, _cache, __privateGet(this, _client).getQueryCache()); 7825 this.queryKey = config.queryKey; 7826 this.queryHash = config.queryHash; 7827 __privateSet(this, _initialState, getDefaultState$1(this.options)); 7828 this.state = config.state ?? __privateGet(this, _initialState); 7829 this.scheduleGc(); 7830 } 7831 get meta() { 7832 return this.options.meta; 7833 } 7834 get promise() { 7835 return __privateGet(this, _retryer)?.promise; 7836 } 7837 setOptions(options) { 7838 this.options = { ...__privateGet(this, _defaultOptions), ...options }; 7839 this.updateGcTime(this.options.gcTime); 7840 if (this.state && this.state.data === void 0) { 7841 const defaultState = getDefaultState$1(this.options); 7842 if (defaultState.data !== void 0) { 7843 this.setData(defaultState.data, { 7844 updatedAt: defaultState.dataUpdatedAt, 7845 manual: true 7846 }); 7847 __privateSet(this, _initialState, defaultState); 7848 } 7849 } 7850 } 7851 optionalRemove() { 7852 if (!this.observers.length && this.state.fetchStatus === "idle") { 7853 __privateGet(this, _cache).remove(this); 7854 } 7855 } 7856 setData(newData, options) { 7857 const data = replaceData(this.state.data, newData, this.options);
vendor: 5,650 bytes, lines 7858-8030
7858 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { 7859 data, 7860 type: "success", 7861 dataUpdatedAt: options?.updatedAt, 7862 manual: options?.manual 7863 }); 7864 return data; 7865 } 7866 setState(state, setStateOptions) { 7867 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "setState", state, setStateOptions }); 7868 } 7869 cancel(options) { 7870 const promise = __privateGet(this, _retryer)?.promise; 7871 __privateGet(this, _retryer)?.cancel(options); 7872 return promise ? promise.then(noop$1).catch(noop$1) : Promise.resolve(); 7873 } 7874 destroy() { 7875 super.destroy(); 7876 this.cancel({ silent: true }); 7877 } 7878 reset() { 7879 this.destroy(); 7880 this.setState(__privateGet(this, _initialState)); 7881 } 7882 isActive() { 7883 return this.observers.some( 7884 (observer) => resolveEnabled(observer.options.enabled, this) !== false 7885 ); 7886 } 7887 isDisabled() { 7888 if (this.getObserversCount() > 0) { 7889 return !this.isActive(); 7890 } 7891 return this.options.queryFn === skipToken || this.state.dataUpdateCount + this.state.errorUpdateCount === 0; 7892 } 7893 isStatic() { 7894 if (this.getObserversCount() > 0) { 7895 return this.observers.some( 7896 (observer) => resolveStaleTime(observer.options.staleTime, this) === "static" 7897 ); 7898 } 7899 return false; 7900 } 7901 isStale() { 7902 if (this.getObserversCount() > 0) { 7903 return this.observers.some( 7904 (observer) => observer.getCurrentResult().isStale 7905 ); 7906 } 7907 return this.state.data === void 0 || this.state.isInvalidated; 7908 } 7909 isStaleByTime(staleTime = 0) { 7910 if (this.state.data === void 0) { 7911 return true; 7912 } 7913 if (staleTime === "static") { 7914 return false; 7915 } 7916 if (this.state.isInvalidated) { 7917 return true; 7918 } 7919 return !timeUntilStale(this.state.dataUpdatedAt, staleTime); 7920 } 7921 onFocus() { 7922 const observer = this.observers.find((x2) => x2.shouldFetchOnWindowFocus()); 7923 observer?.refetch({ cancelRefetch: false }); 7924 __privateGet(this, _retryer)?.continue(); 7925 } 7926 onOnline() { 7927 const observer = this.observers.find((x2) => x2.shouldFetchOnReconnect()); 7928 observer?.refetch({ cancelRefetch: false }); 7929 __privateGet(this, _retryer)?.continue(); 7930 } 7931 addObserver(observer) { 7932 if (!this.observers.includes(observer)) { 7933 this.observers.push(observer); 7934 this.clearGcTimeout(); 7935 __privateGet(this, _cache).notify({ type: "observerAdded", query: this, observer }); 7936 } 7937 } 7938 removeObserver(observer) { 7939 if (this.observers.includes(observer)) { 7940 this.observers = this.observers.filter((x2) => x2 !== observer); 7941 if (!this.observers.length) { 7942 if (__privateGet(this, _retryer)) { 7943 if (__privateGet(this, _abortSignalConsumed)) { 7944 __privateGet(this, _retryer).cancel({ revert: true }); 7945 } else { 7946 __privateGet(this, _retryer).cancelRetry(); 7947 } 7948 } 7949 this.scheduleGc(); 7950 } 7951 __privateGet(this, _cache).notify({ type: "observerRemoved", query: this, observer }); 7952 } 7953 } 7954 getObserversCount() { 7955 return this.observers.length; 7956 } 7957 invalidate() { 7958 if (!this.state.isInvalidated) { 7959 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "invalidate" }); 7960 } 7961 } 7962 async fetch(options, fetchOptions) { 7963 if (this.state.fetchStatus !== "idle" && // If the promise in the retyer is already rejected, we have to definitely 7964 // re-start the fetch; there is a chance that the query is still in a 7965 // pending state when that happens 7966 __privateGet(this, _retryer)?.status() !== "rejected") { 7967 if (this.state.data !== void 0 && fetchOptions?.cancelRefetch) { 7968 this.cancel({ silent: true }); 7969 } else if (__privateGet(this, _retryer)) { 7970 __privateGet(this, _retryer).continueRetry(); 7971 return __privateGet(this, _retryer).promise; 7972 } 7973 } 7974 if (options) { 7975 this.setOptions(options); 7976 } 7977 if (!this.options.queryFn) { 7978 const observer = this.observers.find((x2) => x2.options.queryFn); 7979 if (observer) { 7980 this.setOptions(observer.options); 7981 } 7982 } 7983 const abortController = new AbortController(); 7984 const addSignalProperty = (object) => { 7985 Object.defineProperty(object, "signal", { 7986 enumerable: true, 7987 get: () => { 7988 __privateSet(this, _abortSignalConsumed, true); 7989 return abortController.signal; 7990 } 7991 }); 7992 }; 7993 const fetchFn = () => { 7994 const queryFn = ensureQueryFn(this.options, fetchOptions); 7995 const createQueryFnContext = () => { 7996 const queryFnContext2 = { 7997 client: __privateGet(this, _client), 7998 queryKey: this.queryKey, 7999 meta: this.meta 8000 }; 8001 addSignalProperty(queryFnContext2); 8002 return queryFnContext2; 8003 }; 8004 const queryFnContext = createQueryFnContext(); 8005 __privateSet(this, _abortSignalConsumed, false); 8006 if (this.options.persister) { 8007 return this.options.persister( 8008 queryFn, 8009 queryFnContext, 8010 this 8011 ); 8012 } 8013 return queryFn(queryFnContext); 8014 }; 8015 const createFetchContext = () => { 8016 const context2 = { 8017 fetchOptions, 8018 options: this.options, 8019 queryKey: this.queryKey, 8020 client: __privateGet(this, _client), 8021 state: this.state, 8022 fetchFn 8023 }; 8024 addSignalProperty(context2); 8025 return context2; 8026 }; 8027 const context = createFetchContext(); 8028 this.options.behavior?.onFetch(context, this); 8029 __privateSet(this, _revertState, this.state); 8030 if (this.state.fetchStatus === "idle" || this.state.fetchMeta !== context.fetchOptions?.meta) {
8031 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "fetch", meta: context.fetchOptions?.meta }); 8032 } 8033 __privateSet(this, _retryer, createRetryer({ 8034 initialPromise: fetchOptions?.initialPromise, 8035 fn: context.fetchFn, 8036 onCancel: (error) => { 8037 if (error instanceof CancelledError && error.revert) { 8038 this.setState({ 8039 ...__privateGet(this, _revertState), 8040 fetchStatus: "idle" 8041 }); 8042 } 8043 abortController.abort(); 8044 }, 8045 onFail: (failureCount, error) => { 8046 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "failed", failureCount, error }); 8047 }, 8048 onPause: () => { 8049 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "pause" }); 8050 }, 8051 onContinue: () => { 8052 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { type: "continue" }); 8053 }, 8054 retry: context.options.retry, 8055 retryDelay: context.options.retryDelay, 8056 networkMode: context.options.networkMode, 8057 canRun: () => true 8058 })); 8059 try { 8060 const data = await __privateGet(this, _retryer).start(); 8061 if (data === void 0) { 8062 if (false) ; 8063 throw new Error(`${this.queryHash} data is undefined`); 8064 } 8065 this.setData(data); 8066 __privateGet(this, _cache).config.onSuccess?.(data, this); 8067 __privateGet(this, _cache).config.onSettled?.( 8068 data, 8069 this.state.error, 8070 this 8071 ); 8072 return data; 8073 } catch (error) { 8074 if (error instanceof CancelledError) { 8075 if (error.silent) { 8076 return __privateGet(this, _retryer).promise; 8077 } else if (error.revert) { 8078 if (this.state.data === void 0) { 8079 throw error; 8080 } 8081 return this.state.data; 8082 } 8083 } 8084 __privateMethod(this, _Query_instances, dispatch_fn).call(this, { 8085 type: "error", 8086 error 8087 }); 8088 __privateGet(this, _cache).config.onError?.( 8089 error, 8090 this 8091 ); 8092 __privateGet(this, _cache).config.onSettled?.( 8093 this.state.data, 8094 error, 8095 this 8096 ); 8097 throw error; 8098 } finally { 8099 this.scheduleGc(); 8100 } 8101 } 8102}, _initialState = new WeakMap(), _revertState = new WeakMap(), _cache = new WeakMap(), _client = new WeakMap(), _retryer = new WeakMap(), _defaultOptions = new WeakMap(), _abortSignalConsumed = new WeakMap(), _Query_instances = new WeakSet(), dispatch_fn = function(action) { 8103 const reducer = (state) => { 8104 switch (action.type) { 8105 case "failed": 8106 return { 8107 ...state, 8108 fetchFailureCount: action.failureCount, 8109 fetchFailureReason: action.error 8110 }; 8111 case "pause": 8112 return { 8113 ...state, 8114 fetchStatus: "paused" 8115 }; 8116 case "continue": 8117 return { 8118 ...state, 8119 fetchStatus: "fetching" 8120 }; 8121 case "fetch": 8122 return { 8123 ...state, 8124 ...fetchState(state.data, this.options), 8125 fetchMeta: action.meta ?? null 8126 }; 8127 case "success": 8128 const newState = { 8129 ...state, 8130 data: action.data, 8131 dataUpdateCount: state.dataUpdateCount + 1, 8132 dataUpdatedAt: action.dataUpdatedAt ?? Date.now(), 8133 error: null, 8134 isInvalidated: false, 8135 status: "success", 8136 ...!action.manual && { 8137 fetchStatus: "idle", 8138 fetchFailureCount: 0, 8139 fetchFailureReason: null 8140 } 8141 }; 8142 __privateSet(this, _revertState, action.manual ? newState : void 0); 8143 return newState; 8144 case "error": 8145 const error = action.error; 8146 return { 8147 ...state, 8148 error, 8149 errorUpdateCount: state.errorUpdateCount + 1, 8150 errorUpdatedAt: Date.now(), 8151 fetchFailureCount: state.fetchFailureCount + 1, 8152 fetchFailureReason: error, 8153 fetchStatus: "idle", 8154 status: "error" 8155 }; 8156 case "invalidate": 8157 return { 8158 ...state, 8159 isInvalidated: true 8160 }; 8161 case "setState": 8162 return { 8163 ...state, 8164 ...action.state 8165 }; 8166 } 8167 }; 8168 this.state = reducer(this.state); 8169 notifyManager.batch(() => {
vendor: 4,788 bytes, lines 8170-8298
8170 this.observers.forEach((observer) => { 8171 observer.onQueryUpdate(); 8172 }); 8173 __privateGet(this, _cache).notify({ query: this, type: "updated", action }); 8174 }); 8175}, _e); 8176function fetchState(data, options) { 8177 return { 8178 fetchFailureCount: 0, 8179 fetchFailureReason: null, 8180 fetchStatus: canFetch(options.networkMode) ? "fetching" : "paused", 8181 ...data === void 0 && { 8182 error: null, 8183 status: "pending" 8184 } 8185 }; 8186} 8187function getDefaultState$1(options) { 8188 const data = typeof options.initialData === "function" ? options.initialData() : options.initialData; 8189 const hasData = data !== void 0; 8190 const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === "function" ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0; 8191 return { 8192 data, 8193 dataUpdateCount: 0, 8194 dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0, 8195 error: null, 8196 errorUpdateCount: 0, 8197 errorUpdatedAt: 0, 8198 fetchFailureCount: 0, 8199 fetchFailureReason: null, 8200 fetchMeta: null, 8201 isInvalidated: false, 8202 status: hasData ? "success" : "pending", 8203 fetchStatus: "idle" 8204 }; 8205} 8206var QueryObserver = (_f = class extends Subscribable { 8207 constructor(client2, options) { 8208 super(); 8209 __privateAdd(this, _QueryObserver_instances); 8210 __privateAdd(this, _client2); 8211 __privateAdd(this, _currentQuery); 8212 __privateAdd(this, _currentQueryInitialState); 8213 __privateAdd(this, _currentResult); 8214 __privateAdd(this, _currentResultState); 8215 __privateAdd(this, _currentResultOptions); 8216 __privateAdd(this, _currentThenable); 8217 __privateAdd(this, _selectError); 8218 __privateAdd(this, _selectFn); 8219 __privateAdd(this, _selectResult); 8220 // This property keeps track of the last query with defined data. 8221 // It will be used to pass the previous data and query to the placeholder function between renders. 8222 __privateAdd(this, _lastQueryWithDefinedData); 8223 __privateAdd(this, _staleTimeoutId); 8224 __privateAdd(this, _refetchIntervalId); 8225 __privateAdd(this, _currentRefetchInterval); 8226 __privateAdd(this, _trackedProps, /* @__PURE__ */ new Set()); 8227 this.options = options; 8228 __privateSet(this, _client2, client2); 8229 __privateSet(this, _selectError, null); 8230 __privateSet(this, _currentThenable, pendingThenable()); 8231 this.bindMethods(); 8232 this.setOptions(options); 8233 } 8234 bindMethods() { 8235 this.refetch = this.refetch.bind(this); 8236 } 8237 onSubscribe() { 8238 if (this.listeners.size === 1) { 8239 __privateGet(this, _currentQuery).addObserver(this); 8240 if (shouldFetchOnMount(__privateGet(this, _currentQuery), this.options)) { 8241 __privateMethod(this, _QueryObserver_instances, executeFetch_fn).call(this); 8242 } else { 8243 this.updateResult(); 8244 } 8245 __privateMethod(this, _QueryObserver_instances, updateTimers_fn).call(this); 8246 } 8247 } 8248 onUnsubscribe() { 8249 if (!this.hasListeners()) { 8250 this.destroy(); 8251 } 8252 } 8253 shouldFetchOnReconnect() { 8254 return shouldFetchOn( 8255 __privateGet(this, _currentQuery), 8256 this.options, 8257 this.options.refetchOnReconnect 8258 ); 8259 } 8260 shouldFetchOnWindowFocus() { 8261 return shouldFetchOn( 8262 __privateGet(this, _currentQuery), 8263 this.options, 8264 this.options.refetchOnWindowFocus 8265 ); 8266 } 8267 destroy() { 8268 this.listeners = /* @__PURE__ */ new Set(); 8269 __privateMethod(this, _QueryObserver_instances, clearStaleTimeout_fn).call(this); 8270 __privateMethod(this, _QueryObserver_instances, clearRefetchInterval_fn).call(this); 8271 __privateGet(this, _currentQuery).removeObserver(this); 8272 } 8273 setOptions(options) { 8274 const prevOptions = this.options; 8275 const prevQuery = __privateGet(this, _currentQuery); 8276 this.options = __privateGet(this, _client2).defaultQueryOptions(options); 8277 if (this.options.enabled !== void 0 && typeof this.options.enabled !== "boolean" && typeof this.options.enabled !== "function" && typeof resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) !== "boolean") { 8278 throw new Error( 8279 "Expected enabled to be a boolean or a callback that returns a boolean" 8280 ); 8281 } 8282 __privateMethod(this, _QueryObserver_instances, updateQuery_fn).call(this); 8283 __privateGet(this, _currentQuery).setOptions(this.options); 8284 if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) { 8285 __privateGet(this, _client2).getQueryCache().notify({ 8286 type: "observerOptionsUpdated", 8287 query: __privateGet(this, _currentQuery), 8288 observer: this 8289 }); 8290 } 8291 const mounted = this.hasListeners(); 8292 if (mounted && shouldFetchOptionally( 8293 __privateGet(this, _currentQuery), 8294 prevQuery, 8295 this.options, 8296 prevOptions 8297 )) { 8298 __privateMethod(this, _QueryObserver_instances, executeFetch_fn).c
8298all(this); 8299 } 8300 this.updateResult(); 8301 if (mounted && (__privateGet(this, _currentQuery) !== prevQuery || resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) !== resolveEnabled(prevOptions.enabled, __privateGet(this, _currentQuery)) || resolveStaleTime(this.options.staleTime, __privateGet(this, _currentQuery)) !== resolveStaleTime(prevOptions.staleTime, __privateGet(this, _currentQuery)))) { 8302 __privateMethod(this, _QueryObserver_instances, updateStaleTimeout_fn).call(this); 8303 } 8304 const nextRefetchInterval = __privateMethod(this, _QueryObserver_instances, computeRefetchInterval_fn).call(this); 8305 if (mounted && (__privateGet(this, _currentQuery) !== prevQuery || resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) !== resolveEnabled(prevOptions.enabled, __privateGet(this, _currentQuery)) || nextRefetchInterval !== __privateGet(this, _currentRefetchInterval))) { 8306 __privateMethod(this, _QueryObserver_instances, updateRefetchInterval_fn).call(this, nextRefetchInterval); 8307 } 8308 } 8309 getOptimisticResult(options) { 8310 const query = __privateGet(this, _client2).getQueryCache().build(__privateGet(this, _client2), options); 8311 const result = this.createResult(query, options); 8312 if (shouldAssignObserverCurrentProperties(this, result)) { 8313 __privateSet(this, _currentResult, result); 8314 __privateSet(this, _currentResultOptions, this.options); 8315 __privateSet(this, _currentResultState, __privateGet(this, _currentQuery).state); 8316 } 8317 return result; 8318 } 8319 getCurrentResult() { 8320 return __privateGet(this, _currentResult); 8321 } 8322 trackResult(result, onPropTracked) { 8323 return new Proxy(result, { 8324 get: (target, key) => { 8325 this.trackProp(key); 8326 onPropTracked?.(key); 8327 if (key === "promise" && !this.options.experimental_prefetchInRender && __privateGet(this, _currentThenable).status === "pending") { 8328 __privateGet(this, _currentThenable).reject( 8329 new Error( 8330 "experimental_prefetchInRender feature flag is not enabled" 8331 ) 8332 ); 8333 } 8334 return Reflect.get(target, key); 8335 } 8336 }); 8337 } 8338 trackProp(key) { 8339 __privateGet(this, _trackedProps).add(key); 8340 } 8341 getCurrentQuery() { 8342 return __privateGet(this, _currentQuery); 8343 } 8344 refetch({ ...options } = {}) { 8345 return this.fetch({ 8346 ...options 8347 }); 8348 } 8349 fetchOptimistic(options) { 8350 const defaultedOptions = __privateGet(this, _client2).defaultQueryOptions(options); 8351 const query = __privateGet(this, _client2).getQueryCache().build(__privateGet(this, _client2), defaultedOptions); 8352 return query.fetch().then(() => this.createResult(query, defaultedOptions)); 8353 } 8354 fetch(fetchOptions) { 8355 return __privateMethod(this, _QueryObserver_instances, executeFetch_fn).call(this, { 8356 ...fetchOptions, 8357 cancelRefetch: fetchOptions.cancelRefetch ?? true 8358 }).then(() => { 8359 this.updateResult(); 8360 return __privateGet(this, _currentResult); 8361 }); 8362 } 8363 createResult(query, options) { 8364 const prevQuery = __privateGet(this, _currentQuery); 8365 const prevOptions = this.options; 8366 const prevResult = __privateGet(this, _currentResult); 8367 const prevResultState = __privateGet(this, _currentResultState); 8368 const prevResultOptions = __privateGet(this, _currentResultOptions); 8369 const queryChange = query !== prevQuery; 8370 const queryInitialState = queryChange ? query.state : __privateGet(this, _currentQueryInitialState); 8371 const { state } = query; 8372 let newState = { ...state }; 8373 let isPlaceholderData = false; 8374 let data; 8375 if (options._optimisticResults) { 8376 const mounted = this.hasListeners(); 8377 const fetchOnMount = !mounted && shouldFetchOnMount(query, options); 8378 const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions); 8379 if (fetchOnMount || fetchOptionally) { 8380 newState = { 8381 ...newState, 8382 ...fetchState(state.data, query.options) 8383 }; 8384 } 8385 if (options._optimisticResults === "isRestoring") { 8386 newState.fetchStatus = "idle"; 8387 } 8388 } 8389 let { error, errorUpdatedAt, status } = newState; 8390 data = newState.data; 8391 let skipSelect = false;
vendor: 10,709 bytes, lines 8392-8630
8392 if (options.placeholderData !== void 0 && data === void 0 && status === "pending") { 8393 let placeholderData; 8394 if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) { 8395 placeholderData = prevResult.data; 8396 skipSelect = true; 8397 } else { 8398 placeholderData = typeof options.placeholderData === "function" ? options.placeholderData( 8399 __privateGet(this, _lastQueryWithDefinedData)?.state.data, 8400 __privateGet(this, _lastQueryWithDefinedData) 8401 ) : options.placeholderData; 8402 } 8403 if (placeholderData !== void 0) { 8404 status = "success"; 8405 data = replaceData( 8406 prevResult?.data, 8407 placeholderData, 8408 options 8409 ); 8410 isPlaceholderData = true; 8411 } 8412 } 8413 if (options.select && data !== void 0 && !skipSelect) { 8414 if (prevResult && data === prevResultState?.data && options.select === __privateGet(this, _selectFn)) { 8415 data = __privateGet(this, _selectResult); 8416 } else { 8417 try { 8418 __privateSet(this, _selectFn, options.select); 8419 data = options.select(data); 8420 data = replaceData(prevResult?.data, data, options); 8421 __privateSet(this, _selectResult, data); 8422 __privateSet(this, _selectError, null); 8423 } catch (selectError) { 8424 __privateSet(this, _selectError, selectError); 8425 } 8426 } 8427 } 8428 if (__privateGet(this, _selectError)) { 8429 error = __privateGet(this, _selectError); 8430 data = __privateGet(this, _selectResult); 8431 errorUpdatedAt = Date.now(); 8432 status = "error"; 8433 } 8434 const isFetching = newState.fetchStatus === "fetching"; 8435 const isPending = status === "pending"; 8436 const isError = status === "error"; 8437 const isLoading = isPending && isFetching; 8438 const hasData = data !== void 0; 8439 const result = { 8440 status, 8441 fetchStatus: newState.fetchStatus, 8442 isPending, 8443 isSuccess: status === "success", 8444 isError, 8445 isInitialLoading: isLoading, 8446 isLoading, 8447 data, 8448 dataUpdatedAt: newState.dataUpdatedAt, 8449 error, 8450 errorUpdatedAt, 8451 failureCount: newState.fetchFailureCount, 8452 failureReason: newState.fetchFailureReason, 8453 errorUpdateCount: newState.errorUpdateCount, 8454 isFetched: newState.dataUpdateCount > 0 || newState.errorUpdateCount > 0, 8455 isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount, 8456 isFetching, 8457 isRefetching: isFetching && !isPending, 8458 isLoadingError: isError && !hasData, 8459 isPaused: newState.fetchStatus === "paused", 8460 isPlaceholderData, 8461 isRefetchError: isError && hasData, 8462 isStale: isStale(query, options), 8463 refetch: this.refetch, 8464 promise: __privateGet(this, _currentThenable), 8465 isEnabled: resolveEnabled(options.enabled, query) !== false 8466 }; 8467 const nextResult = result; 8468 if (this.options.experimental_prefetchInRender) { 8469 const finalizeThenableIfPossible = (thenable) => { 8470 if (nextResult.status === "error") { 8471 thenable.reject(nextResult.error); 8472 } else if (nextResult.data !== void 0) { 8473 thenable.resolve(nextResult.data); 8474 } 8475 }; 8476 const recreateThenable = () => { 8477 const pending = __privateSet(this, _currentThenable, nextResult.promise = pendingThenable()); 8478 finalizeThenableIfPossible(pending); 8479 }; 8480 const prevThenable = __privateGet(this, _currentThenable); 8481 switch (prevThenable.status) { 8482 case "pending": 8483 if (query.queryHash === prevQuery.queryHash) { 8484 finalizeThenableIfPossible(prevThenable); 8485 } 8486 break; 8487 case "fulfilled": 8488 if (nextResult.status === "error" || nextResult.data !== prevThenable.value) { 8489 recreateThenable(); 8490 } 8491 break; 8492 case "rejected": 8493 if (nextResult.status !== "error" || nextResult.error !== prevThenable.reason) { 8494 recreateThenable(); 8495 } 8496 break; 8497 } 8498 } 8499 return nextResult; 8500 } 8501 updateResult() { 8502 const prevResult = __privateGet(this, _currentResult); 8503 const nextResult = this.createResult(__privateGet(this, _currentQuery), this.options); 8504 __privateSet(this, _currentResultState, __privateGet(this, _currentQuery).state); 8505 __privateSet(this, _currentResultOptions, this.options); 8506 if (__privateGet(this, _currentResultState).data !== void 0) { 8507 __privateSet(this, _lastQueryWithDefinedData, __privateGet(this, _currentQuery)); 8508 } 8509 if (shallowEqualObjects(nextResult, prevResult)) { 8510 return; 8511 } 8512 __privateSet(this, _currentResult, nextResult); 8513 const shouldNotifyListeners = () => { 8514 if (!prevResult) { 8515 return true; 8516 } 8517 const { notifyOnChangeProps } = this.options; 8518 const notifyOnChangePropsValue = typeof notifyOnChangeProps === "function" ? notifyOnChangeProps() : notifyOnChangeProps; 8519 if (notifyOnChangePropsValue === "all" || !notifyOnChangePropsValue && !__privateGet(this, _trackedProps).size) { 8520 return true; 8521 } 8522 const includedProps = new Set( 8523 notifyOnChangePropsValue ?? __privateGet(this, _trackedProps) 8524 ); 8525 if (this.options.throwOnError) { 8526 includedProps.add("error"); 8527 } 8528 return Object.keys(__privateGet(this, _currentResult)).some((key) => { 8529 const typedKey = key; 8530 const changed = __privateGet(this, _currentResult)[typedKey] !== prevResult[typedKey]; 8531 return changed && includedProps.has(typedKey); 8532 }); 8533 }; 8534 __privateMethod(this, _QueryObserver_instances, notify_fn).call(this, { listeners: shouldNotifyListeners() }); 8535 } 8536 onQueryUpdate() { 8537 this.updateResult(); 8538 if (this.hasListeners()) { 8539 __privateMethod(this, _QueryObserver_instances, updateTimers_fn).call(this); 8540 } 8541 } 8542}, _client2 = new WeakMap(), _currentQuery = new WeakMap(), _currentQueryInitialState = new WeakMap(), _currentResult = new WeakMap(), _currentResultState = new WeakMap(), _currentResultOptions = new WeakMap(), _currentThenable = new WeakMap(), _selectError = new WeakMap(), _selectFn = new WeakMap(), _selectResult = new WeakMap(), _lastQueryWithDefinedData = new WeakMap(), _staleTimeoutId = new WeakMap(), _refetchIntervalId = new WeakMap(), _currentRefetchInterval = new WeakMap(), _trackedProps = new WeakMap(), _QueryObserver_instances = new WeakSet(), executeFetch_fn = function(fetchOptions) { 8543 __privateMethod(this, _QueryObserver_instances, updateQuery_fn).call(this); 8544 let promise = __privateGet(this, _currentQuery).fetch( 8545 this.options, 8546 fetchOptions 8547 ); 8548 if (!fetchOptions?.throwOnError) { 8549 promise = promise.catch(noop$1); 8550 } 8551 return promise; 8552}, updateStaleTimeout_fn = function() { 8553 __privateMethod(this, _QueryObserver_instances, clearStaleTimeout_fn).call(this); 8554 const staleTime = resolveStaleTime( 8555 this.options.staleTime, 8556 __privateGet(this, _currentQuery) 8557 ); 8558 if (isServer || __privateGet(this, _currentResult).isStale || !isValidTimeout(staleTime)) { 8559 return; 8560 } 8561 const time = timeUntilStale(__privateGet(this, _currentResult).dataUpdatedAt, staleTime); 8562 const timeout = time + 1; 8563 __privateSet(this, _staleTimeoutId, timeoutManager.setTimeout(() => { 8564 if (!__privateGet(this, _currentResult).isStale) { 8565 this.updateResult(); 8566 } 8567 }, timeout)); 8568}, computeRefetchInterval_fn = function() { 8569 return (typeof this.options.refetchInterval === "function" ? this.options.refetchInterval(__privateGet(this, _currentQuery)) : this.options.refetchInterval) ?? false; 8570}, updateRefetchInterval_fn = function(nextInterval) { 8571 __privateMethod(this, _QueryObserver_instances, clearRefetchInterval_fn).call(this); 8572 __privateSet(this, _currentRefetchInterval, nextInterval); 8573 if (isServer || resolveEnabled(this.options.enabled, __privateGet(this, _currentQuery)) === false || !isValidTimeout(__privateGet(this, _currentRefetchInterval)) || __privateGet(this, _currentRefetchInterval) === 0) { 8574 return; 8575 } 8576 __privateSet(this, _refetchIntervalId, timeoutManager.setInterval(() => { 8577 if (this.options.refetchIntervalInBackground || focusManager.isFocused()) { 8578 __privateMethod(this, _QueryObserver_instances, executeFetch_fn).call(this); 8579 } 8580 }, __privateGet(this, _currentRefetchInterval))); 8581}, updateTimers_fn = function() { 8582 __privateMethod(this, _QueryObserver_instances, updateStaleTimeout_fn).call(this); 8583 __privateMethod(this, _QueryObserver_instances, updateRefetchInterval_fn).call(this, __privateMethod(this, _QueryObserver_instances, computeRefetchInterval_fn).call(this)); 8584}, clearStaleTimeout_fn = function() { 8585 if (__privateGet(this, _staleTimeoutId)) { 8586 timeoutManager.clearTimeout(__privateGet(this, _staleTimeoutId)); 8587 __privateSet(this, _staleTimeoutId, void 0); 8588 } 8589}, clearRefetchInterval_fn = function() { 8590 if (__privateGet(this, _refetchIntervalId)) { 8591 timeoutManager.clearInterval(__privateGet(this, _refetchIntervalId)); 8592 __privateSet(this, _refetchIntervalId, void 0); 8593 } 8594}, updateQuery_fn = function() { 8595 const query = __privateGet(this, _client2).getQueryCache().build(__privateGet(this, _client2), this.options); 8596 if (query === __privateGet(this, _currentQuery)) { 8597 return; 8598 } 8599 const prevQuery = __privateGet(this, _currentQuery); 8600 __privateSet(this, _currentQuery, query); 8601 __privateSet(this, _currentQueryInitialState, query.state); 8602 if (this.hasListeners()) { 8603 prevQuery?.removeObserver(this); 8604 query.addObserver(this); 8605 } 8606}, notify_fn = function(notifyOptions) { 8607 notifyManager.batch(() => { 8608 if (notifyOptions.listeners) { 8609 this.listeners.forEach((listener) => { 8610 listener(__privateGet(this, _currentResult)); 8611 }); 8612 } 8613 __privateGet(this, _client2).getQueryCache().notify({ 8614 query: __privateGet(this, _currentQuery), 8615 type: "observerResultsUpdated" 8616 }); 8617 }); 8618}, _f); 8619function shouldLoadOnMount(query, options) { 8620 return resolveEnabled(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === "error" && options.retryOnMount === false); 8621} 8622function shouldFetchOnMount(query, options) { 8623 return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount); 8624} 8625function shouldFetchOn(query, options, field) { 8626 if (resolveEnabled(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== "static") { 8627 const value = typeof field === "function" ? field(query) : field; 8628 return value === "always" || value !== false && isStale(query, options); 8629 } 8630 return false;
8631} 8632function shouldFetchOptionally(query, prevQuery, options, prevOptions) { 8633 return (query !== prevQuery || resolveEnabled(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== "error") && isStale(query, options); 8634} 8635function isStale(query, options) { 8636 return resolveEnabled(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query)); 8637} 8638function shouldAssignObserverCurrentProperties(observer, optimisticResult) { 8639 if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) { 8640 return true; 8641 } 8642 return false; 8643} 8644function infiniteQueryBehavior(pages) { 8645 return { 8646 onFetch: (context, query) => { 8647 const options = context.options; 8648 const direction = context.fetchOptions?.meta?.fetchMore?.direction; 8649 const oldPages = context.state.data?.pages || []; 8650 const oldPageParams = context.state.data?.pageParams || []; 8651 let result = { pages: [], pageParams: [] }; 8652 let currentPage = 0; 8653 const fetchFn = async () => { 8654 let cancelled = false; 8655 const addSignalProperty = (object) => { 8656 Object.defineProperty(object, "signal", { 8657 enumerable: true, 8658 get: () => { 8659 if (context.signal.aborted) { 8660 cancelled = true; 8661 } else { 8662 context.signal.addEventListener("abort", () => { 8663 cancelled = true; 8664 }); 8665 } 8666 return context.signal; 8667 } 8668 }); 8669 }; 8670 const queryFn = ensureQueryFn(context.options, context.fetchOptions); 8671 const fetchPage = async (data, param, previous) => { 8672 if (cancelled) { 8673 return Promise.reject(); 8674 } 8675 if (param == null && data.pages.length) { 8676 return Promise.resolve(data); 8677 } 8678 const createQueryFnContext = () => { 8679 const queryFnContext2 = { 8680 client: context.client, 8681 queryKey: context.queryKey, 8682 pageParam: param, 8683 direction: previous ? "backward" : "forward", 8684 meta: context.options.meta 8685 }; 8686 addSignalProperty(queryFnContext2); 8687 return queryFnContext2; 8688 }; 8689 const queryFnContext = createQueryFnContext(); 8690 const page = await queryFn(queryFnContext); 8691 const { maxPages } = context.options; 8692 const addTo = previous ? addToStart : addToEnd; 8693 return { 8694 pages: addTo(data.pages, page, maxPages), 8695 pageParams: addTo(data.pageParams, param, maxPages) 8696 }; 8697 }; 8698 if (direction && oldPages.length) { 8699 const previous = direction === "backward"; 8700 const pageParamFn = previous ? getPreviousPageParam : getNextPageParam; 8701 const oldData = { 8702 pages: oldPages, 8703 pageParams: oldPageParams 8704 }; 8705 const param = pageParamFn(options, oldData); 8706 result = await fetchPage(oldData, param, previous); 8707 } else { 8708 const remainingPages = pages ?? oldPages.length; 8709 do { 8710 const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result); 8711 if (currentPage > 0 && param == null) { 8712 break; 8713 } 8714 result = await fetchPage(result, param); 8715 currentPage++; 8716 } while (currentPage < remainingPages); 8717 } 8718 return result; 8719 }; 8720 if (context.options.persister) { 8721 context.fetchFn = () => { 8722 return context.options.persister?.( 8723 fetchFn, 8724 { 8725 client: context.client, 8726 queryKey: context.queryKey, 8727 meta: context.options.meta, 8728 signal: context.signal 8729 }, 8730 query 8731 ); 8732 }; 8733 } else { 8734 context.fetchFn = fetchFn; 8735 } 8736 } 8737 }; 8738} 8739function getNextPageParam(options, { pages, pageParams }) { 8740 const lastIndex = pages.length - 1; 8741 return pages.length > 0 ? options.getNextPageParam( 8742 pages[lastIndex], 8743 pages, 8744 pageParams[lastIndex], 8745 pageParams 8746 ) : void 0; 8747} 8748function getPreviousPageParam(options, { pages, pageParams }) { 8749 return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0; 8750} 8751var Mutation = (_g = class extends Removable { 8752 constructor(config) { 8753 super(); 8754 __privateAdd(this, _Mutation_instances); 8755 __privateAdd(this, _client3); 8756 __privateAdd(this, _observers); 8757 __privateAdd(this, _mutationCache); 8758 __privateAdd(this, _retryer2); 8759 __privateSet(this, _client3, config.client); 8760 this.mutationId = config.mutationId; 8761 __privateSet(this, _mutationCache, config.mutationCache); 8762 __privateSet(this, _observers, []); 8763 this.state = config.state || getDefaultState(); 8764 this.setOptions(config.options); 8765 this.scheduleGc(); 8766 } 8767 setOptions(options) { 8768 this.options = options; 8769 this.updateGcTime(this.options.gcTime); 8770 } 8771 get meta() { 8772 return this.options.meta; 8773 } 8774 addObserver(observer) { 8775 if (!__privateGet(this, _observers).includes(observer)) { 8776 __privateGet(this, _observers).push(observer); 8777 this.clearGcTimeout(); 8778 __privateGet(this, _mutationCache).notify({ 8779 type: "observerAdded", 8780 mutation: this, 8781 observer 8782 }); 8783 } 8784 } 8785 removeObserver(observer) { 8786 __privateSet(this, _observers, __privateGet(this, _observers).filter((x2) => x2 !== observer)); 8787 this.scheduleGc(); 8788 __privateGet(this, _mutationCache).notify({ 8789 type: "observerRemoved", 8790 mutation: this, 8791 observer 8792 }); 8793 } 8794 optionalRemove() { 8795 if (!__privateGet(this, _observers).length) { 8796 if (this.state.status === "pending") { 8797 this.scheduleGc(); 8798 } else { 8799 __privateGet(this, _mutationCache).remove(this); 8800 } 8801 } 8802 } 8803 continue() { 8804 return __privateGet(this, _retryer2)?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before 8805 this.execute(this.state.variables); 8806 } 8807 async execute(variables) { 8808 const onContinue = () => { 8809 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "continue" }); 8810 }; 8811 const mutationFnContext = { 8812 client: __privateGet(this, _client3), 8813 meta: this.options.meta, 8814 mutationKey: this.options.mutationKey 8815 }; 8816 __privateSet(this, _retryer2, createRetryer({ 8817 fn: () => { 8818 if (!this.options.mutationFn) { 8819 return Promise.reject(new Error("No mutationFn found")); 8820 } 8821 return this.options.mutationFn(variables, mutationFnContext); 8822 }, 8823 onFail: (failureCount, error) => { 8824 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "failed", failureCount, error }); 8825 }, 8826 onPause: () => { 8827 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "pause" }); 8828 }, 8829 onContinue, 8830 retry: this.options.retry ?? 0, 8831 retryDelay: this.options.retryDelay, 8832 networkMode: this.options.networkMode, 8833 canRun: () => __privateGet(this, _mutationCache).canRun(this) 8834 })); 8835 const restored = this.state.status === "pending"; 8836 const isPaused = !__privateGet(this, _retryer2).canStart(); 8837 try { 8838 if (restored) { 8839 onContinue(); 8840 } else { 8841 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "pending", variables, isPaused }); 8842 await __privateGet(this, _mutationCache).config.onMutate?.( 8843 variables, 8844 this, 8845 mutationFnContext 8846 ); 8847 const context = await this.options.onMutate?.( 8848 variables, 8849 mutationFnContext 8850 ); 8851 if (context !== this.state.context) { 8852 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { 8853 type: "pending", 8854 context, 8855 variables, 8856 isPaused 8857 }); 8858 } 8859 } 8860 const data = await __privateGet(this, _retryer2).start(); 8861 await __privateGet(this, _mutationCache).config.onSuccess?.( 8862 data, 8863 variables, 8864 this.state.context, 8865 this, 8866 mutationFnContext 8867 ); 8868 await this.options.onSuccess?.( 8869 data, 8870 variables, 8871 this.state.context, 8872 mutationFnContext 8873 ); 8874 await __privateGet(this, _mutationCache).config.onSettled?.( 8875 data, 8876 null, 8877 this.state.variables, 8878 this.state.context, 8879 this, 8880 mutationFnContext 8881 ); 8882 await this.options.onSettled?.( 8883 data, 8884 null, 8885 variables, 8886 this.state.context, 8887 mutationFnContext 8888 ); 8889 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "success", data }); 8890 return data; 8891 } catch (error) {
8892 try { 8893 await __privateGet(this, _mutationCache).config.onError?.( 8894 error, 8895 variables, 8896 this.state.context, 8897 this, 8898 mutationFnContext 8899 ); 8900 await this.options.onError?.( 8901 error, 8902 variables, 8903 this.state.context, 8904 mutationFnContext 8905 ); 8906 await __privateGet(this, _mutationCache).config.onSettled?.( 8907 void 0, 8908 error, 8909 this.state.variables, 8910 this.state.context, 8911 this, 8912 mutationFnContext 8913 ); 8914 await this.options.onSettled?.( 8915 void 0, 8916 error, 8917 variables, 8918 this.state.context, 8919 mutationFnContext 8920 ); 8921 throw error; 8922 } finally { 8923 __privateMethod(this, _Mutation_instances, dispatch_fn2).call(this, { type: "error", error }); 8924 } 8925 } finally { 8926 __privateGet(this, _mutationCache).runNext(this); 8927 } 8928 } 8929}, _client3 = new WeakMap(), _observers = new WeakMap(), _mutationCache = new WeakMap(), _retryer2 = new WeakMap(), _Mutation_instances = new WeakSet(), dispatch_fn2 = function(action) { 8930 const reducer = (state) => { 8931 switch (action.type) { 8932 case "failed": 8933 return { 8934 ...state, 8935 failureCount: action.failureCount, 8936 failureReason: action.error 8937 }; 8938 case "pause": 8939 return { 8940 ...state, 8941 isPaused: true 8942 }; 8943 case "continue": 8944 return { 8945 ...state, 8946 isPaused: false 8947 }; 8948 case "pending": 8949 return { 8950 ...state, 8951 context: action.context, 8952 data: void 0, 8953 failureCount: 0, 8954 failureReason: null, 8955 error: null, 8956 isPaused: action.isPaused, 8957 status: "pending", 8958 variables: action.variables, 8959 submittedAt: Date.now() 8960 }; 8961 case "success": 8962 return { 8963 ...state, 8964 data: action.data, 8965 failureCount: 0, 8966 failureReason: null, 8967 error: null, 8968 status: "success", 8969 isPaused: false 8970 }; 8971 case "error": 8972 return { 8973 ...state, 8974 data: void 0, 8975 error: action.error, 8976 failureCount: state.failureCount + 1, 8977 failureReason: action.error, 8978 isPaused: false, 8979 status: "error" 8980 }; 8981 } 8982 }; 8983 this.state = reducer(this.state); 8984 notifyManager.batch(() => { 8985 __privateGet(this, _observers).forEach((observer) => { 8986 observer.onMutationUpdate(action); 8987 }); 8988 __privateGet(this, _mutationCache).notify({ 8989 mutation: this, 8990 type: "updated", 8991 action 8992 }); 8993 }); 8994}, _g); 8995function getDefaultState() { 8996 return { 8997 context: void 0, 8998 data: void 0, 8999 error: null, 9000 failureCount: 0, 9001 failureReason: null, 9002 isPaused: false, 9003 status: "idle", 9004 variables: void 0, 9005 submittedAt: 0 9006 }; 9007} 9008var MutationCache = (_h = class extends Subscribable { 9009 constructor(config = {}) { 9010 super(); 9011 __privateAdd(this, _mutations); 9012 __privateAdd(this, _scopes); 9013 __privateAdd(this, _mutationId); 9014 this.config = config; 9015 __privateSet(this, _mutations, /* @__PURE__ */ new Set()); 9016 __privateSet(this, _scopes, /* @__PURE__ */ new Map()); 9017 __privateSet(this, _mutationId, 0); 9018 } 9019 build(client2, options, state) { 9020 const mutation = new Mutation({ 9021 client: client2, 9022 mutationCache: this, 9023 mutationId: ++__privateWrapper(this, _mutationId)._, 9024 options: client2.defaultMutationOptions(options), 9025 state 9026 }); 9027 this.add(mutation); 9028 return mutation; 9029 } 9030 add(mutation) { 9031 __privateGet(this, _mutations).add(mutation); 9032 const scope = scopeFor(mutation); 9033 if (typeof scope === "string") { 9034 const scopedMutations = __privateGet(this, _scopes).get(scope); 9035 if (scopedMutations) { 9036 scopedMutations.push(mutation); 9037 } else { 9038 __privateGet(this, _scopes).set(scope, [mutation]); 9039 } 9040 } 9041 this.notify({ type: "added", mutation }); 9042 } 9043 remove(mutation) { 9044 if (__privateGet(this, _mutations).delete(mutation)) { 9045 const scope = scopeFor(mutation); 9046 if (typeof scope === "string") { 9047 const scopedMutations = __privateGet(this, _scopes).get(scope); 9048 if (scopedMutations) { 9049 if (scopedMutations.length > 1) { 9050 const index = scopedMutations.indexOf(mutation); 9051 if (index !== -1) { 9052 scopedMutations.splice(index, 1); 9053 } 9054 } else if (scopedMutations[0] === mutation) { 9055 __privateGet(this, _scopes).delete(scope); 9056 } 9057 } 9058 } 9059 } 9060 this.notify({ type: "removed", mutation }); 9061 } 9062 canRun(mutation) { 9063 const scope = scopeFor(mutation); 9064 if (typeof scope === "string") { 9065 const mutationsWithSameScope = __privateGet(this, _scopes).get(scope); 9066 const firstPendingMutation = mutationsWithSameScope?.find( 9067 (m2) => m2.state.status === "pending" 9068 ); 9069 return !firstPendingMutation || firstPendingMutation === mutation; 9070 } else { 9071 return true; 9072 } 9073 } 9074 runNext(mutation) { 9075 const scope = scopeFor(mutation); 9076 if (typeof scope === "string") { 9077 const foundMutation = __privateGet(this, _scopes).get(scope)?.find((m2) =>
vendor: 4,272 bytes, lines 9077-9223
9077 m2 !== mutation && m2.state.isPaused); 9078 return foundMutation?.continue() ?? Promise.resolve(); 9079 } else { 9080 return Promise.resolve(); 9081 } 9082 } 9083 clear() { 9084 notifyManager.batch(() => { 9085 __privateGet(this, _mutations).forEach((mutation) => { 9086 this.notify({ type: "removed", mutation }); 9087 }); 9088 __privateGet(this, _mutations).clear(); 9089 __privateGet(this, _scopes).clear(); 9090 }); 9091 } 9092 getAll() { 9093 return Array.from(__privateGet(this, _mutations)); 9094 } 9095 find(filters) { 9096 const defaultedFilters = { exact: true, ...filters }; 9097 return this.getAll().find( 9098 (mutation) => matchMutation(defaultedFilters, mutation) 9099 ); 9100 } 9101 findAll(filters = {}) { 9102 return this.getAll().filter((mutation) => matchMutation(filters, mutation)); 9103 } 9104 notify(event) { 9105 notifyManager.batch(() => { 9106 this.listeners.forEach((listener) => { 9107 listener(event); 9108 }); 9109 }); 9110 } 9111 resumePausedMutations() { 9112 const pausedMutations = this.getAll().filter((x2) => x2.state.isPaused); 9113 return notifyManager.batch( 9114 () => Promise.all( 9115 pausedMutations.map((mutation) => mutation.continue().catch(noop$1)) 9116 ) 9117 ); 9118 } 9119}, _mutations = new WeakMap(), _scopes = new WeakMap(), _mutationId = new WeakMap(), _h); 9120function scopeFor(mutation) { 9121 return mutation.options.scope?.id; 9122} 9123var QueryCache = (_i = class extends Subscribable { 9124 constructor(config = {}) { 9125 super(); 9126 __privateAdd(this, _queries); 9127 this.config = config; 9128 __privateSet(this, _queries, /* @__PURE__ */ new Map()); 9129 } 9130 build(client2, options, state) { 9131 const queryKey = options.queryKey; 9132 const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options); 9133 let query = this.get(queryHash); 9134 if (!query) { 9135 query = new Query({ 9136 client: client2, 9137 queryKey, 9138 queryHash, 9139 options: client2.defaultQueryOptions(options), 9140 state, 9141 defaultOptions: client2.getQueryDefaults(queryKey) 9142 }); 9143 this.add(query); 9144 } 9145 return query; 9146 } 9147 add(query) { 9148 if (!__privateGet(this, _queries).has(query.queryHash)) { 9149 __privateGet(this, _queries).set(query.queryHash, query); 9150 this.notify({ 9151 type: "added", 9152 query 9153 }); 9154 } 9155 } 9156 remove(query) { 9157 const queryInMap = __privateGet(this, _queries).get(query.queryHash); 9158 if (queryInMap) { 9159 query.destroy(); 9160 if (queryInMap === query) { 9161 __privateGet(this, _queries).delete(query.queryHash); 9162 } 9163 this.notify({ type: "removed", query }); 9164 } 9165 } 9166 clear() { 9167 notifyManager.batch(() => { 9168 this.getAll().forEach((query) => { 9169 this.remove(query); 9170 }); 9171 }); 9172 } 9173 get(queryHash) { 9174 return __privateGet(this, _queries).get(queryHash); 9175 } 9176 getAll() { 9177 return [...__privateGet(this, _queries).values()]; 9178 } 9179 find(filters) { 9180 const defaultedFilters = { exact: true, ...filters }; 9181 return this.getAll().find( 9182 (query) => matchQuery(defaultedFilters, query) 9183 ); 9184 } 9185 findAll(filters = {}) { 9186 const queries = this.getAll(); 9187 return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries; 9188 } 9189 notify(event) { 9190 notifyManager.batch(() => { 9191 this.listeners.forEach((listener) => { 9192 listener(event); 9193 }); 9194 }); 9195 } 9196 onFocus() { 9197 notifyManager.batch(() => { 9198 this.getAll().forEach((query) => { 9199 query.onFocus(); 9200 }); 9201 }); 9202 } 9203 onOnline() { 9204 notifyManager.batch(() => { 9205 this.getAll().forEach((query) => { 9206 query.onOnline(); 9207 }); 9208 }); 9209 } 9210}, _queries = new WeakMap(), _i); 9211var QueryClient = (_j = class { 9212 constructor(config = {}) { 9213 __privateAdd(this, _queryCache); 9214 __privateAdd(this, _mutationCache2); 9215 __privateAdd(this, _defaultOptions2); 9216 __privateAdd(this, _queryDefaults); 9217 __privateAdd(this, _mutationDefaults); 9218 __privateAdd(this, _mountCount); 9219 __privateAdd(this, _unsubscribeFocus); 9220 __privateAdd(this, _unsubscribeOnline); 9221 __privateSet(this, _queryCache, config.queryCache || new QueryCache()); 9222 __privateSet(this, _mutationCache2, config.mutationCache || new MutationCache()); 9223 __privateSet(this, _defaultOptions2, config.defaultOptions || {});
9224 __privateSet(this, _queryDefaults, /* @__PURE__ */ new Map()); 9225 __privateSet(this, _mutationDefaults, /* @__PURE__ */ new Map()); 9226 __privateSet(this, _mountCount, 0); 9227 } 9228 mount() { 9229 __privateWrapper(this, _mountCount)._++; 9230 if (__privateGet(this, _mountCount) !== 1) return; 9231 __privateSet(this, _unsubscribeFocus, focusManager.subscribe(async (focused) => { 9232 if (focused) { 9233 await this.resumePausedMutations(); 9234 __privateGet(this, _queryCache).onFocus(); 9235 } 9236 })); 9237 __privateSet(this, _unsubscribeOnline, onlineManager.subscribe(async (online) => { 9238 if (online) { 9239 await this.resumePausedMutations(); 9240 __privateGet(this, _queryCache).onOnline(); 9241 } 9242 })); 9243 } 9244 unmount() { 9245 var _a2, _b2; 9246 __privateWrapper(this, _mountCount)._--; 9247 if (__privateGet(this, _mountCount) !== 0) return; 9248 (_a2 = __privateGet(this, _unsubscribeFocus)) == null ? void 0 : _a2.call(this); 9249 __privateSet(this, _unsubscribeFocus, void 0); 9250 (_b2 = __privateGet(this, _unsubscribeOnline)) == null ? void 0 : _b2.call(this); 9251 __privateSet(this, _unsubscribeOnline, void 0); 9252 } 9253 isFetching(filters) { 9254 return __privateGet(this, _queryCache).findAll({ ...filters, fetchStatus: "fetching" }).length; 9255 } 9256 isMutating(filters) { 9257 return __privateGet(this, _mutationCache2).findAll({ ...filters, status: "pending" }).length; 9258 } 9259 /** 9260 * Imperative (non-reactive) way to retrieve data for a QueryKey. 9261 * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates. 9262 * 9263 * Hint: Do not use this function inside a component, because it won't receive updates. 9264 * Use `useQuery` to create a `QueryObserver` that subscribes to changes. 9265 */ 9266 getQueryData(queryKey) { 9267 const options = this.defaultQueryOptions({ queryKey }); 9268 return __privateGet(this, _queryCache).get(options.queryHash)?.state.data; 9269 } 9270 ensureQueryData(options) { 9271 const defaultedOptions = this.defaultQueryOptions(options); 9272 const query = __privateGet(this, _queryCache).build(this, defaultedOptions); 9273 const cachedData = query.state.data; 9274 if (cachedData === void 0) { 9275 return this.fetchQuery(options); 9276 } 9277 if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) { 9278 void this.prefetchQuery(defaultedOptions); 9279 } 9280 return Promise.resolve(cachedData); 9281 } 9282 getQueriesData(filters) { 9283 return __privateGet(this, _queryCache).findAll(filters).map(({ queryKey, state }) => { 9284 const data = state.data; 9285 return [queryKey, data]; 9286 }); 9287 } 9288 setQueryData(queryKey, updater, options) { 9289 const defaultedOptions = this.defaultQueryOptions({ queryKey }); 9290 const query = __privateGet(this, _queryCache).get( 9291 defaultedOptions.queryHash 9292 ); 9293 const prevData = query?.state.data; 9294 const data = functionalUpdate(updater, prevData); 9295 if (data === void 0) { 9296 return void 0; 9297 } 9298 return __privateGet(this, _queryCache).build(this, defaultedOptions).setData(data, { ...options, manual: true }); 9299 } 9300 setQueriesData(filters, updater, options) { 9301 return notifyManager.batch( 9302 () => __privateGet(this, _queryCache).findAll(filters).map(({ queryKey }) => [ 9303 queryKey, 9304 this.setQueryData(queryKey, updater, options) 9305 ]) 9306 ); 9307 } 9308 getQueryState(queryKey) { 9309 const options = this.defaultQueryOptions({ queryKey }); 9310 return __privateGet(this, _queryCache).get( 9311 options.queryHash 9312 )?.state; 9313 } 9314 removeQueries(filters) { 9315 const queryCache = __privateGet(this, _queryCache); 9316 notifyManager.batch(() => { 9317 queryCache.findAll(filters).forEach((query) => { 9318 queryCache.remove(query); 9319 }); 9320 }); 9321 } 9322 resetQueries(filters, options) { 9323 const queryCache = __privateGet(this, _queryCache); 9324 return notifyManager.batch(() => { 9325 queryCache.findAll(filters).forEach((query) => { 9326 query.reset(); 9327 }); 9328 return this.refetchQueries( 9329 { 9330 type: "active", 9331 ...filters 9332 }, 9333 options 9334 ); 9335 }); 9336 } 9337 cancelQueries(filters, cancelOptions = {}) { 9338 const defaultedCancelOptions = { revert: true, ...cancelOptions }; 9339 const promises = notifyManager.batch( 9340 () => __privateGet(this, _queryCache).findAll(filters).map((query) => query.cancel(defaultedCancelOptions)) 9341 ); 9342 return Promise.all(promises).then(noop$1).catch(noop$1); 9343 } 9344 invalidateQueries(filters, options = {}) { 9345 return notifyManager.batch(() => {
9346 __privateGet(this, _queryCache).findAll(filters).forEach((query) => { 9347 query.invalidate(); 9348 }); 9349 if (filters?.refetchType === "none") { 9350 return Promise.resolve(); 9351 } 9352 return this.refetchQueries( 9353 { 9354 ...filters, 9355 type: filters?.refetchType ?? filters?.type ?? "active" 9356 }, 9357 options 9358 ); 9359 }); 9360 } 9361 refetchQueries(filters, options = {}) { 9362 const fetchOptions = { 9363 ...options, 9364 cancelRefetch: options.cancelRefetch ?? true 9365 }; 9366 const promises = notifyManager.batch( 9367 () => __privateGet(this, _queryCache).findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => { 9368 let promise = query.fetch(void 0, fetchOptions); 9369 if (!fetchOptions.throwOnError) { 9370 promise = promise.catch(noop$1); 9371 } 9372 return query.state.fetchStatus === "paused" ? Promise.resolve() : promise; 9373 }) 9374 ); 9375 return Promise.all(promises).then(noop$1); 9376 } 9377 fetchQuery(options) { 9378 const defaultedOptions = this.defaultQueryOptions(options); 9379 if (defaultedOptions.retry === void 0) { 9380 defaultedOptions.retry = false; 9381 } 9382 const query = __privateGet(this, _queryCache).build(this, defaultedOptions); 9383 return query.isStaleByTime( 9384 resolveStaleTime(defaultedOptions.staleTime, query) 9385 ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data); 9386 } 9387 prefetchQuery(options) { 9388 return this.fetchQuery(options).then(noop$1).catch(noop$1); 9389 } 9390 fetchInfiniteQuery(options) { 9391 options.behavior = infiniteQueryBehavior(options.pages); 9392 return this.fetchQuery(options); 9393 } 9394 prefetchInfiniteQuery(options) { 9395 return this.fetchInfiniteQuery(options).then(noop$1).catch(noop$1); 9396 } 9397 ensureInfiniteQueryData(options) { 9398 options.behavior = infiniteQueryBehavior(options.pages); 9399 return this.ensureQueryData(options); 9400 } 9401 resumePausedMutations() { 9402 if (onlineManager.isOnline()) { 9403 return __privateGet(this, _mutationCache2).resumePausedMutations(); 9404 } 9405 return Promise.resolve(); 9406 } 9407 getQueryCache() { 9408 return __privateGet(this, _queryCache); 9409 } 9410 getMutationCache() { 9411 return __privateGet(this, _mutationCache2); 9412 } 9413 getDefaultOptions() { 9414 return __privateGet(this, _defaultOptions2); 9415 } 9416 setDefaultOptions(options) { 9417 __privateSet(this, _defaultOptions2, options); 9418 } 9419 setQueryDefaults(queryKey, options) { 9420 __privateGet(this, _queryDefaults).set(hashKey(queryKey), { 9421 queryKey, 9422 defaultOptions: options 9423 }); 9424 } 9425 getQueryDefaults(queryKey) { 9426 const defaults = [...__privateGet(this, _queryDefaults).values()]; 9427 const result = {}; 9428 defaults.forEach((queryDefault) => { 9429 if (partialMatchKey(queryKey, queryDefault.queryKey)) { 9430 Object.assign(result, queryDefault.defaultOptions); 9431 } 9432 }); 9433 return result; 9434 } 9435 setMutationDefaults(mutationKey, options) { 9436 __privateGet(this, _mutationDefaults).set(hashKey(mutationKey), { 9437 mutationKey, 9438 defaultOptions: options 9439 }); 9440 } 9441 getMutationDefaults(mutationKey) { 9442 const defaults = [...__privateGet(this, _mutationDefaults).values()]; 9443 const result = {}; 9444 defaults.forEach((queryDefault) => { 9445 if (partialMatchKey(mutationKey, queryDefault.mutationKey)) { 9446 Object.assign(result, queryDefault.defaultOptions); 9447 } 9448 }); 9449 return result; 9450 } 9451 defaultQueryOptions(options) { 9452 if (options._defaulted) { 9453 return options; 9454 } 9455 const defaultedOptions = { 9456 ...__privateGet(this, _defaultOptions2).queries, 9457 ...this.getQueryDefaults(options.queryKey), 9458 ...options, 9459 _defaulted: true 9460 }; 9461 if (!defaultedOptions.queryHash) { 9462 defaultedOptions.queryHash = hashQueryKeyByOptions( 9463 defaultedOptions.queryKey, 9464 defaultedOptions 9465 ); 9466 } 9467 if (defaultedOptions.refetchOnReconnect === void 0) { 9468 defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== "always"; 9469 } 9470 if (defaultedOptions.throwOnError === void 0) { 9471 defaultedOptions.throwOnError = !!defaultedOptions.suspense; 9472 } 9473 if (!defaultedOptions.networkMode && defaultedOptions.persister) { 9474 defaultedOptions.networkMode = "offlineFirst"; 9475 } 9476 if (defaultedOptions.queryFn === skipToken) { 9477 defaultedOptions.enabled = false;
9478 } 9479 return defaultedOptions; 9480 } 9481 defaultMutationOptions(options) { 9482 if (options?._defaulted) { 9483 return options; 9484 } 9485 return { 9486 ...__privateGet(this, _defaultOptions2).mutations, 9487 ...options?.mutationKey && this.getMutationDefaults(options.mutationKey), 9488 ...options, 9489 _defaulted: true 9490 }; 9491 } 9492 clear() { 9493 __privateGet(this, _queryCache).clear(); 9494 __privateGet(this, _mutationCache2).clear(); 9495 } 9496}, _queryCache = new WeakMap(), _mutationCache2 = new WeakMap(), _defaultOptions2 = new WeakMap(), _queryDefaults = new WeakMap(), _mutationDefaults = new WeakMap(), _mountCount = new WeakMap(), _unsubscribeFocus = new WeakMap(), _unsubscribeOnline = new WeakMap(), _j); 9497var QueryClientContext = reactExports.createContext( 9498 void 0 9499); 9500var useQueryClient = (queryClient2) => { 9501 const client2 = reactExports.useContext(QueryClientContext); 9502 if (!client2) { 9503 throw new Error("No QueryClient set, use QueryClientProvider to set one"); 9504 } 9505 return client2; 9506}; 9507var QueryClientProvider = ({ 9508 client: client2, 9509 children 9510}) => { 9511 reactExports.useEffect(() => { 9512 client2.mount(); 9513 return () => { 9514 client2.unmount(); 9515 }; 9516 }, [client2]); 9517 return /* @__PURE__ */ jsxRuntimeExports.jsx(QueryClientContext.Provider, { value: client2, children }); 9518}; 9519var IsRestoringContext = reactExports.createContext(false); 9520var useIsRestoring = () => reactExports.useContext(IsRestoringContext); 9521IsRestoringContext.Provider; 9522function createValue() { 9523 let isReset = false; 9524 return { 9525 clearReset: () => { 9526 isReset = false; 9527 }, 9528 reset: () => { 9529 isReset = true; 9530 }, 9531 isReset: () => { 9532 return isReset; 9533 } 9534 }; 9535} 9536var QueryErrorResetBoundaryContext = reactExports.createContext(createValue()); 9537var useQueryErrorResetBoundary = () => reactExports.useContext(QueryErrorResetBoundaryContext); 9538var ensurePreventErrorBoundaryRetry = (options, errorResetBoundary) => { 9539 if (options.suspense || options.throwOnError || options.experimental_prefetchInRender) { 9540 if (!errorResetBoundary.isReset()) { 9541 options.retryOnMount = false; 9542 } 9543 } 9544}; 9545var useClearResetErrorBoundary = (errorResetBoundary) => { 9546 reactExports.useEffect(() => { 9547 errorResetBoundary.clearReset(); 9548 }, [errorResetBoundary]); 9549}; 9550var getHasError = ({ 9551 result, 9552 errorResetBoundary, 9553 throwOnError, 9554 query, 9555 suspense 9556}) => { 9557 return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query])); 9558}; 9559var ensureSuspenseTimers = (defaultedOptions) => { 9560 if (defaultedOptions.suspense) { 9561 const MIN_SUSPENSE_TIME_MS = 1e3; 9562 const clamp = (value) => value === "static" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS); 9563 const originalStaleTime = defaultedOptions.staleTime; 9564 defaultedOptions.staleTime = typeof originalStaleTime === "function" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime); 9565 if (typeof defaultedOptions.gcTime === "number") { 9566 defaultedOptions.gcTime = Math.max( 9567 defaultedOptions.gcTime, 9568 MIN_SUSPENSE_TIME_MS 9569 ); 9570 } 9571 } 9572}; 9573var willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring; 9574var shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending; 9575var fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => { 9576 errorResetBoundary.clearReset(); 9577}); 9578function useBaseQuery(options, Observer, queryClient2) { 9579 const isRestoring = useIsRestoring(); 9580 const errorResetBoundary = useQueryErrorResetBoundary(); 9581 const client2 = useQueryClient(); 9582 const defaultedOptions = client2.defaultQueryOptions(options); 9583 client2.getDefaultOptions().queries?._experimental_beforeQuery?.( 9584 defaultedOptions 9585 ); 9586 defaultedOptions._optimisticResults = isRestoring ? "isRestoring" : "optimistic"; 9587 ensureSuspenseTimers(defaultedOptions); 9588 ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary); 9589 useClearResetErrorBoundary(errorResetBoundary); 9590 const isNewCacheEntry = !client2.getQueryCache().get(defaultedOptions.queryHash); 9591 const [observer] = reactExports.useState( 9592 () => new Observer( 9593 client2, 9594 defaultedOptions 9595 ) 9596 ); 9597 const result = observer.getOptimisticResult(defaultedOptions); 9598 const shouldSubscribe = !isRestoring && options.subscribed !== false; 9599 reactExports.useSyncExternalStore( 9600 reactExports.useCallback( 9601 (onStoreChange) => { 9602 const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop$1; 9603 observer.updateResult(); 9604 return unsubscribe; 9605 }, 9606 [observer, shouldSubscribe] 9607 ), 9608 () => observer.getCurrentResult(), 9609 () => observer.getCurrentResult() 9610 ); 9611 reactExports.useEffect(() => { 9612 observer.setOptions(defaultedOptions); 9613 }, [defaultedOptions, observer]); 9614 if (shouldSuspend(defaultedOptions, result)) { 9615 throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary); 9616 } 9617 if (getHasError({ 9618 result, 9619 errorResetBoundary, 9620 throwOnError: defaultedOptions.throwOnError, 9621 query: client2.getQueryCache().get(defaultedOptions.queryHash), 9622 suspense: defaultedOptions.suspense 9623 })) { 9624 throw result.error; 9625 } 9626 client2.getDefaultOptions().queries?._experimental_afterQuery?.( 9627 defaultedOptions, 9628 result 9629 ); 9630 if (defaultedOptions.experimental_prefetchInRender && !isServer && willFetch(result, isRestoring)) { 9631 const promise = isNewCacheEntry ? ( 9632 // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted 9633 fetchOptimistic(defaultedOptions, observer, errorResetBoundary) 9634 ) : (
9635 // subscribe to the "cache promise" so that we can finalize the currentThenable once data comes in 9636 client2.getQueryCache().get(defaultedOptions.queryHash)?.promise 9637 ); 9638 promise?.catch(noop$1).finally(() => { 9639 observer.updateResult(); 9640 }); 9641 } 9642 return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result; 9643} 9644function useQuery(options, queryClient2) { 9645 return useBaseQuery(options, QueryObserver); 9646} 9647/** 9648 * react-router v7.9.3 9649 * 9650 * Copyright (c) Remix Software Inc. 9651 * 9652 * This source code is licensed under the MIT license found in the 9653 * LICENSE.md file in the root directory of this source tree. 9654 * 9655 * @license MIT 9656 */ 9657var __typeError2 = (msg) => { 9658 throw TypeError(msg); 9659}; 9660var __accessCheck2 = (obj, member, msg) => member.has(obj) || __typeError2("Cannot " + msg); 9661var __privateGet2 = (obj, member, getter) => (__accessCheck2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); 9662var __privateAdd2 = (obj, member, value) => member.has(obj) ? __typeError2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); 9663var PopStateEventType = "popstate"; 9664function createBrowserHistory(options = {}) { 9665 function createBrowserLocation(window2, globalHistory) { 9666 let { pathname, search, hash } = window2.location; 9667 return createLocation( 9668 "", 9669 { pathname, search, hash }, 9670 // state defaults to `null` because `window.history.state` does 9671 globalHistory.state && globalHistory.state.usr || null, 9672 globalHistory.state && globalHistory.state.key || "default" 9673 ); 9674 } 9675 function createBrowserHref(window2, to) { 9676 return typeof to === "string" ? to : createPath(to); 9677 } 9678 return getUrlBasedHistory( 9679 createBrowserLocation, 9680 createBrowserHref, 9681 null, 9682 options 9683 ); 9684} 9685function invariant(value, message) { 9686 if (value === false || value === null || typeof value === "undefined") { 9687 throw new Error(message); 9688 } 9689} 9690function warning(cond, message) { 9691 if (!cond) { 9692 if (typeof console !== "undefined") console.warn(message); 9693 try { 9694 throw new Error(message); 9695 } catch (e) { 9696 } 9697 } 9698} 9699function createKey() { 9700 return Math.random().toString(36).substring(2, 10); 9701} 9702function getHistoryState(location, index) { 9703 return { 9704 usr: location.state, 9705 key: location.key, 9706 idx: index 9707 }; 9708} 9709function createLocation(current, to, state = null, key) { 9710 let location = { 9711 pathname: typeof current === "string" ? current : current.pathname, 9712 search: "", 9713 hash: "", 9714 ...typeof to === "string" ? parsePath(to) : to, 9715 state, 9716 // TODO: This could be cleaned up. push/replace should probably just take 9717 // full Locations now and avoid the need to run through this flow at all 9718 // But that's a pretty big refactor to the current test suite so going to 9719 // keep as is for the time being and just let any incoming keys take precedence 9720 key: to && to.key || key || createKey() 9721 }; 9722 return location; 9723} 9724function createPath({ 9725 pathname = "/", 9726 search = "", 9727 hash = "" 9728}) { 9729 if (search && search !== "?") 9730 pathname += search.charAt(0) === "?" ? search : "?" + search; 9731 if (hash && hash !== "#") 9732 pathname += hash.charAt(0) === "#" ? hash : "#" + hash; 9733 return pathname; 9734} 9735function parsePath(path) { 9736 let parsedPath = {}; 9737 if (path) { 9738 let hashIndex = path.indexOf("#"); 9739 if (hashIndex >= 0) { 9740 parsedPath.hash = path.substring(hashIndex); 9741 path = path.substring(0, hashIndex); 9742 } 9743 let searchIndex = path.indexOf("?"); 9744 if (searchIndex >= 0) { 9745 parsedPath.search = path.substring(searchIndex); 9746 path = path.substring(0, searchIndex); 9747 } 9748 if (path) { 9749 parsedPath.pathname = path; 9750 } 9751 } 9752 return parsedPath; 9753} 9754function getUrlBasedHistory(getLocation, createHref2, validateLocation, options = {}) { 9755 let { window: window2 = document.defaultView, v5Compat = false } = options; 9756 let globalHistory = window2.history; 9757 let action = "POP"; 9758 let listener = null; 9759 let index = getIndex(); 9760 if (index == null) { 9761 index = 0; 9762 globalHistory.replaceState({ ...globalHistory.state, idx: index }, ""); 9763 } 9764 function getIndex() { 9765 let state = globalHistory.state || { idx: null }; 9766 return state.idx; 9767 } 9768 function handlePop() { 9769 action = "POP"; 9770 let nextIndex = getIndex(); 9771 let delta = nextIndex == null ? null : nextIndex - index; 9772 index = nextIndex; 9773 if (listener) { 9774 listener({ action, location: history.location, delta }); 9775 } 9776 } 9777 function push(to, state) { 9778 action = "PUSH"; 9779 let location = createLocation(history.location, to, state); 9780 index = getIndex() + 1; 9781 let historyState = getHistoryState(location, index); 9782 let url = history.createHref(location); 9783 try { 9784 globalHistory.pushState(historyState, "", url); 9785 } catch (error) {
9786 if (error instanceof DOMException && error.name === "DataCloneError") { 9787 throw error; 9788 } 9789 window2.location.assign(url); 9790 } 9791 if (v5Compat && listener) { 9792 listener({ action, location: history.location, delta: 1 }); 9793 } 9794 } 9795 function replace2(to, state) { 9796 action = "REPLACE"; 9797 let location = createLocation(history.location, to, state); 9798 index = getIndex(); 9799 let historyState = getHistoryState(location, index); 9800 let url = history.createHref(location); 9801 globalHistory.replaceState(historyState, "", url); 9802 if (v5Compat && listener) { 9803 listener({ action, location: history.location, delta: 0 }); 9804 } 9805 } 9806 function createURL(to) { 9807 return createBrowserURLImpl(to); 9808 } 9809 let history = { 9810 get action() { 9811 return action; 9812 }, 9813 get location() { 9814 return getLocation(window2, globalHistory); 9815 }, 9816 listen(fn) { 9817 if (listener) { 9818 throw new Error("A history only accepts one active listener"); 9819 } 9820 window2.addEventListener(PopStateEventType, handlePop); 9821 listener = fn; 9822 return () => { 9823 window2.removeEventListener(PopStateEventType, handlePop); 9824 listener = null; 9825 }; 9826 }, 9827 createHref(to) { 9828 return createHref2(window2, to); 9829 }, 9830 createURL, 9831 encodeLocation(to) { 9832 let url = createURL(to); 9833 return { 9834 pathname: url.pathname, 9835 search: url.search, 9836 hash: url.hash 9837 }; 9838 }, 9839 push, 9840 replace: replace2, 9841 go(n2) { 9842 return globalHistory.go(n2); 9843 } 9844 }; 9845 return history; 9846} 9847function createBrowserURLImpl(to, isAbsolute = false) { 9848 let base = "http://localhost"; 9849 if (typeof window !== "undefined") { 9850 base = window.location.origin !== "null" ? window.location.origin : window.location.href; 9851 } 9852 invariant(base, "No window.location.(origin|href) available to create URL"); 9853 let href = typeof to === "string" ? to : createPath(to); 9854 href = href.replace(/ $/, "%20"); 9855 if (!isAbsolute && href.startsWith("//")) { 9856 href = base + href; 9857 } 9858 return new URL(href, base); 9859} 9860var _map; 9861var RouterContextProvider = class { 9862 /** 9863 * Create a new `RouterContextProvider` instance 9864 * @param init An optional initial context map to populate the provider with 9865 */ 9866 constructor(init) { 9867 __privateAdd2(this, _map, /* @__PURE__ */ new Map()); 9868 if (init) { 9869 for (let [context, value] of init) { 9870 this.set(context, value); 9871 } 9872 } 9873 } 9874 /** 9875 * Access a value from the context. If no value has been set for the context, 9876 * it will return the context's `defaultValue` if provided, or throw an error 9877 * if no `defaultValue` was set. 9878 * @param context The context to get the value for 9879 * @returns The value for the context, or the context's `defaultValue` if no 9880 * value was set 9881 */ 9882 get(context) { 9883 if (__privateGet2(this, _map).has(context)) { 9884 return __privateGet2(this, _map).get(context); 9885 } 9886 if (context.defaultValue !== void 0) { 9887 return context.defaultValue; 9888 } 9889 throw new Error("No value found for context"); 9890 } 9891 /** 9892 * Set a value for the context. If the context already has a value set, this 9893 * will overwrite it. 9894 * 9895 * @param context The context to set the value for 9896 * @param value The value to set for the context 9897 * @returns {void} 9898 */ 9899 set(context, value) { 9900 __privateGet2(this, _map).set(context, value); 9901 } 9902}; 9903_map = /* @__PURE__ */ new WeakMap(); 9904var unsupportedLazyRouteObjectKeys = /* @__PURE__ */ new Set([ 9905 "lazy", 9906 "caseSensitive", 9907 "path", 9908 "id", 9909 "index", 9910 "children" 9911]); 9912function isUnsupportedLazyRouteObjectKey(key) { 9913 return unsupportedLazyRouteObjectKeys.has( 9914 key 9915 ); 9916} 9917var unsupportedLazyRouteFunctionKeys = /* @__PURE__ */ new Set([ 9918 "lazy", 9919 "caseSensitive", 9920 "path", 9921 "id", 9922 "index", 9923 "middleware", 9924 "children" 9925]); 9926function isUnsupportedLazyRouteFunctionKey(key) { 9927 return unsupportedLazyRouteFunctionKeys.has( 9928 key 9929 ); 9930} 9931function isIndexRoute(route) { 9932 return route.index === true; 9933} 9934function convertRoutesToDataRoutes(routes, mapRouteProperties2, parentPath = [], manifest = {}, allowInPlaceMutations = false) { 9935 return routes.map((route, index) => {
9936 let treePath = [...parentPath, String(index)]; 9937 let id2 = typeof route.id === "string" ? route.id : treePath.join("-"); 9938 invariant( 9939 route.index !== true || !route.children, 9940 `Cannot specify children on an index route` 9941 ); 9942 invariant( 9943 allowInPlaceMutations || !manifest[id2], 9944 `Found a route id collision on id "${id2}". Route id's must be globally unique within Data Router usages` 9945 ); 9946 if (isIndexRoute(route)) { 9947 let indexRoute = { 9948 ...route, 9949 ...mapRouteProperties2(route), 9950 id: id2 9951 }; 9952 manifest[id2] = indexRoute; 9953 return indexRoute; 9954 } else { 9955 let pathOrLayoutRoute = { 9956 ...route, 9957 ...mapRouteProperties2(route), 9958 id: id2, 9959 children: void 0 9960 }; 9961 manifest[id2] = pathOrLayoutRoute; 9962 if (route.children) { 9963 pathOrLayoutRoute.children = convertRoutesToDataRoutes( 9964 route.children, 9965 mapRouteProperties2, 9966 treePath, 9967 manifest, 9968 allowInPlaceMutations 9969 ); 9970 } 9971 return pathOrLayoutRoute; 9972 } 9973 }); 9974} 9975function matchRoutes(routes, locationArg, basename = "/") { 9976 return matchRoutesImpl(routes, locationArg, basename, false); 9977} 9978function matchRoutesImpl(routes, locationArg, basename, allowPartial) { 9979 let location = typeof locationArg === "string" ? parsePath(locationArg) : locationArg; 9980 let pathname = stripBasename(location.pathname || "/", basename); 9981 if (pathname == null) { 9982 return null; 9983 } 9984 let branches = flattenRoutes(routes); 9985 rankRouteBranches(branches); 9986 let matches = null; 9987 for (let i = 0; matches == null && i < branches.length; ++i) { 9988 let decoded = decodePath(pathname); 9989 matches = matchRouteBranch( 9990 branches[i], 9991 decoded, 9992 allowPartial 9993 ); 9994 } 9995 return matches; 9996} 9997function convertRouteMatchToUiMatch(match, loaderData) { 9998 let { route, pathname, params } = match; 9999 return { 10000 id: route.id, 10001 pathname, 10002 params, 10003 data: loaderData[route.id], 10004 loaderData: loaderData[route.id], 10005 handle: route.handle 10006 }; 10007} 10008function flattenRoutes(routes, branches = [], parentsMeta = [], parentPath = "", _hasParentOptionalSegments = false) { 10009 let flattenRoute = (route, index, hasParentOptionalSegments = _hasParentOptionalSegments, relativePath) => { 10010 let meta = { 10011 relativePath: relativePath === void 0 ? route.path || "" : relativePath, 10012 caseSensitive: route.caseSensitive === true, 10013 childrenIndex: index, 10014 route 10015 }; 10016 if (meta.relativePath.startsWith("/")) { 10017 if (!meta.relativePath.startsWith(parentPath) && hasParentOptionalSegments) { 10018 return; 10019 } 10020 invariant( 10021 meta.relativePath.startsWith(parentPath), 10022 `Absolute route path "${meta.relativePath}" nested under path "${parentPath}" is not valid. An absolute child route path must start with the combined path of all its parent routes.` 10023 ); 10024 meta.relativePath = meta.relativePath.slice(parentPath.length); 10025 } 10026 let path = joinPaths([parentPath, meta.relativePath]); 10027 let routesMeta = parentsMeta.concat(meta); 10028 if (route.children && route.children.length > 0) { 10029 invariant( 10030 // Our types know better, but runtime JS may not! 10031 // @ts-expect-error 10032 route.index !== true, 10033 `Index routes must not have child routes. Please remove all child routes from route path "${path}".` 10034 ); 10035 flattenRoutes( 10036 route.children, 10037 branches, 10038 routesMeta, 10039 path, 10040 hasParentOptionalSegments 10041 ); 10042 } 10043 if (route.path == null && !route.index) { 10044 return; 10045 } 10046 branches.push({ 10047 path, 10048 score: computeScore(path, route.index), 10049 routesMeta 10050 }); 10051 }; 10052 routes.forEach((route, index) => { 10053 if (route.path === "" || !route.path?.includes("?")) { 10054 flattenRoute(route, index); 10055 } else { 10056 for (let exploded of explodeOptionalSegments(route.path)) { 10057 flattenRoute(route, index, true, exploded); 10058 } 10059 } 10060 }); 10061 return branches; 10062} 10063function explodeOptionalSegments(path) { 10064 let segments = path.split("/"); 10065 if (segments.length === 0) return []; 10066 let [first, ...rest] = segments; 10067 let isOptional = first.endsWith("?"); 10068 let required = first.replace(/\?$/, ""); 10069 if (rest.length === 0) { 10070 return isOptional ? [required, ""] : [required]; 10071 }
vendor: 10,167 bytes, lines 10072-10364
10072 let restExploded = explodeOptionalSegments(rest.join("/")); 10073 let result = []; 10074 result.push( 10075 ...restExploded.map( 10076 (subpath) => subpath === "" ? required : [required, subpath].join("/") 10077 ) 10078 ); 10079 if (isOptional) { 10080 result.push(...restExploded); 10081 } 10082 return result.map( 10083 (exploded) => path.startsWith("/") && exploded === "" ? "/" : exploded 10084 ); 10085} 10086function rankRouteBranches(branches) { 10087 branches.sort( 10088 (a, b) => a.score !== b.score ? b.score - a.score : compareIndexes( 10089 a.routesMeta.map((meta) => meta.childrenIndex), 10090 b.routesMeta.map((meta) => meta.childrenIndex) 10091 ) 10092 ); 10093} 10094var paramRe = /^:[\w-]+$/; 10095var dynamicSegmentValue = 3; 10096var indexRouteValue = 2; 10097var emptySegmentValue = 1; 10098var staticSegmentValue = 10; 10099var splatPenalty = -2; 10100var isSplat = (s) => s === "*"; 10101function computeScore(path, index) { 10102 let segments = path.split("/"); 10103 let initialScore = segments.length; 10104 if (segments.some(isSplat)) { 10105 initialScore += splatPenalty; 10106 } 10107 if (index) { 10108 initialScore += indexRouteValue; 10109 } 10110 return segments.filter((s) => !isSplat(s)).reduce( 10111 (score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), 10112 initialScore 10113 ); 10114} 10115function compareIndexes(a, b) { 10116 let siblings = a.length === b.length && a.slice(0, -1).every((n2, i) => n2 === b[i]); 10117 return siblings ? ( 10118 // If two routes are siblings, we should try to match the earlier sibling 10119 // first. This allows people to have fine-grained control over the matching 10120 // behavior by simply putting routes with identical paths in the order they 10121 // want them tried. 10122 a[a.length - 1] - b[b.length - 1] 10123 ) : ( 10124 // Otherwise, it doesn't really make sense to rank non-siblings by index, 10125 // so they sort equally. 10126 0 10127 ); 10128} 10129function matchRouteBranch(branch, pathname, allowPartial = false) { 10130 let { routesMeta } = branch; 10131 let matchedParams = {}; 10132 let matchedPathname = "/"; 10133 let matches = []; 10134 for (let i = 0; i < routesMeta.length; ++i) { 10135 let meta = routesMeta[i]; 10136 let end = i === routesMeta.length - 1; 10137 let remainingPathname = matchedPathname === "/" ? pathname : pathname.slice(matchedPathname.length) || "/"; 10138 let match = matchPath( 10139 { path: meta.relativePath, caseSensitive: meta.caseSensitive, end }, 10140 remainingPathname 10141 ); 10142 let route = meta.route; 10143 if (!match && end && allowPartial && !routesMeta[routesMeta.length - 1].route.index) { 10144 match = matchPath( 10145 { 10146 path: meta.relativePath, 10147 caseSensitive: meta.caseSensitive, 10148 end: false 10149 }, 10150 remainingPathname 10151 ); 10152 } 10153 if (!match) { 10154 return null; 10155 } 10156 Object.assign(matchedParams, match.params); 10157 matches.push({ 10158 // TODO: Can this as be avoided? 10159 params: matchedParams, 10160 pathname: joinPaths([matchedPathname, match.pathname]), 10161 pathnameBase: normalizePathname( 10162 joinPaths([matchedPathname, match.pathnameBase]) 10163 ), 10164 route 10165 }); 10166 if (match.pathnameBase !== "/") { 10167 matchedPathname = joinPaths([matchedPathname, match.pathnameBase]); 10168 } 10169 } 10170 return matches; 10171} 10172function matchPath(pattern, pathname) { 10173 if (typeof pattern === "string") { 10174 pattern = { path: pattern, caseSensitive: false, end: true }; 10175 } 10176 let [matcher, compiledParams] = compilePath( 10177 pattern.path, 10178 pattern.caseSensitive, 10179 pattern.end 10180 ); 10181 let match = pathname.match(matcher); 10182 if (!match) return null; 10183 let matchedPathname = match[0]; 10184 let pathnameBase = matchedPathname.replace(/(.)\/+$/, "$1"); 10185 let captureGroups = match.slice(1); 10186 let params = compiledParams.reduce( 10187 (memo2, { paramName, isOptional }, index) => { 10188 if (paramName === "*") { 10189 let splatValue = captureGroups[index] || ""; 10190 pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\/+$/, "$1"); 10191 } 10192 const value = captureGroups[index]; 10193 if (isOptional && !value) { 10194 memo2[paramName] = void 0; 10195 } else { 10196 memo2[paramName] = (value || "").replace(/%2F/g, "/"); 10197 } 10198 return memo2; 10199 }, 10200 {} 10201 ); 10202 return { 10203 params, 10204 pathname: matchedPathname, 10205 pathnameBase, 10206 pattern 10207 }; 10208} 10209function compilePath(path, caseSensitive = false, end = true) { 10210 warning( 10211 path === "*" || !path.endsWith("*") || path.endsWith("/*"), 10212 `Route path "${path}" will be treated as if it were "${path.replace(/\*$/, "/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${path.replace(/\*$/, "/*")}".` 10213 ); 10214 let params = []; 10215 let regexpSource = "^" + path.replace(/\/*\*?$/, "").replace(/^\/*/, "/").replace(/[\\.*+^${}|()[\]]/g, "\\$&").replace( 10216 /\/:([\w-]+)(\?)?/g, 10217 (_, paramName, isOptional) => { 10218 params.push({ paramName, isOptional: isOptional != null }); 10219 return isOptional ? "/?([^\\/]+)?" : "/([^\\/]+)"; 10220 } 10221 ).replace(/\/([\w-]+)\?(\/|$)/g, "(/$1)?$2"); 10222 if (path.endsWith("*")) { 10223 params.push({ paramName: "*" }); 10224 regexpSource += path === "*" || path === "/*" ? "(.*)$" : "(?:\\/(.+)|\\/*)$"; 10225 } else if (end) { 10226 regexpSource += "\\/*$"; 10227 } else if (path !== "" && path !== "/") { 10228 regexpSource += "(?:(?=\\/|$))"; 10229 } else ; 10230 let matcher = new RegExp(regexpSource, caseSensitive ? void 0 : "i"); 10231 return [matcher, params]; 10232} 10233function decodePath(value) { 10234 try { 10235 return value.split("/").map((v2) => decodeURIComponent(v2).replace(/\//g, "%2F")).join("/"); 10236 } catch (error) { 10237 warning( 10238 false, 10239 `The URL path "${value}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${error}).` 10240 ); 10241 return value; 10242 } 10243} 10244function stripBasename(pathname, basename) { 10245 if (basename === "/") return pathname; 10246 if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) { 10247 return null; 10248 } 10249 let startIndex = basename.endsWith("/") ? basename.length - 1 : basename.length; 10250 let nextChar = pathname.charAt(startIndex); 10251 if (nextChar && nextChar !== "/") { 10252 return null; 10253 } 10254 return pathname.slice(startIndex) || "/"; 10255} 10256function prependBasename({ 10257 basename, 10258 pathname 10259}) { 10260 return pathname === "/" ? basename : joinPaths([basename, pathname]); 10261} 10262function resolvePath(to, fromPathname = "/") { 10263 let { 10264 pathname: toPathname, 10265 search = "", 10266 hash = "" 10267 } = typeof to === "string" ? parsePath(to) : to; 10268 let pathname = toPathname ? toPathname.startsWith("/") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname; 10269 return { 10270 pathname, 10271 search: normalizeSearch(search), 10272 hash: normalizeHash(hash) 10273 }; 10274} 10275function resolvePathname(relativePath, fromPathname) { 10276 let segments = fromPathname.replace(/\/+$/, "").split("/"); 10277 let relativeSegments = relativePath.split("/"); 10278 relativeSegments.forEach((segment) => { 10279 if (segment === "..") { 10280 if (segments.length > 1) segments.pop(); 10281 } else if (segment !== ".") { 10282 segments.push(segment); 10283 } 10284 }); 10285 return segments.length > 1 ? segments.join("/") : "/"; 10286} 10287function getInvalidPathError(char, field, dest, path) { 10288 return `Cannot include a '${char}' character in a manually specified \`to.${field}\` field [${JSON.stringify( 10289 path 10290 )}]. Please separate it out to the \`to.${dest}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`; 10291} 10292function getPathContributingMatches(matches) { 10293 return matches.filter( 10294 (match, index) => index === 0 || match.route.path && match.route.path.length > 0 10295 ); 10296} 10297function getResolveToMatches(matches) { 10298 let pathMatches = getPathContributingMatches(matches); 10299 return pathMatches.map( 10300 (match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase 10301 ); 10302} 10303function resolveTo(toArg, routePathnames, locationPathname, isPathRelative = false) { 10304 let to; 10305 if (typeof toArg === "string") { 10306 to = parsePath(toArg); 10307 } else { 10308 to = { ...toArg }; 10309 invariant( 10310 !to.pathname || !to.pathname.includes("?"), 10311 getInvalidPathError("?", "pathname", "search", to) 10312 ); 10313 invariant( 10314 !to.pathname || !to.pathname.includes("#"), 10315 getInvalidPathError("#", "pathname", "hash", to) 10316 ); 10317 invariant( 10318 !to.search || !to.search.includes("#"), 10319 getInvalidPathError("#", "search", "hash", to) 10320 ); 10321 } 10322 let isEmptyPath = toArg === "" || to.pathname === ""; 10323 let toPathname = isEmptyPath ? "/" : to.pathname; 10324 let from; 10325 if (toPathname == null) { 10326 from = locationPathname; 10327 } else { 10328 let routePathnameIndex = routePathnames.length - 1; 10329 if (!isPathRelative && toPathname.startsWith("..")) { 10330 let toSegments = toPathname.split("/"); 10331 while (toSegments[0] === "..") { 10332 toSegments.shift(); 10333 routePathnameIndex -= 1; 10334 } 10335 to.pathname = toSegments.join("/"); 10336 } 10337 from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : "/"; 10338 } 10339 let path = resolvePath(to, from); 10340 let hasExplicitTrailingSlash = toPathname && toPathname !== "/" && toPathname.endsWith("/"); 10341 let hasCurrentTrailingSlash = (isEmptyPath || toPathname === ".") && locationPathname.endsWith("/"); 10342 if (!path.pathname.endsWith("/") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) { 10343 path.pathname += "/"; 10344 } 10345 return path; 10346} 10347var joinPaths = (paths) => paths.join("/").replace(/\/\/+/g, "/"); 10348var normalizePathname = (pathname) => pathname.replace(/\/+$/, "").replace(/^\/*/, "/"); 10349var normalizeSearch = (search) => !search || search === "?" ? "" : search.startsWith("?") ? search : "?" + search; 10350var normalizeHash = (hash) => !hash || hash === "#" ? "" : hash.startsWith("#") ? hash : "#" + hash; 10351var ErrorResponseImpl = class { 10352 constructor(status, statusText, data2, internal = false) { 10353 this.status = status; 10354 this.statusText = statusText || ""; 10355 this.internal = internal; 10356 if (data2 instanceof Error) { 10357 this.data = data2.toString(); 10358 this.error = data2; 10359 } else { 10360 this.data = data2; 10361 } 10362 } 10363}; 10364function isRouteErrorResponse(error) {
10365 return error != null && typeof error.status === "number" && typeof error.statusText === "string" && typeof error.internal === "boolean" && "data" in error; 10366} 10367var validMutationMethodsArr = [ 10368 "POST", 10369 "PUT", 10370 "PATCH", 10371 "DELETE" 10372]; 10373var validMutationMethods = new Set( 10374 validMutationMethodsArr 10375); 10376var validRequestMethodsArr = [ 10377 "GET", 10378 ...validMutationMethodsArr 10379]; 10380var validRequestMethods = new Set(validRequestMethodsArr); 10381var redirectStatusCodes = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]); 10382var redirectPreserveMethodStatusCodes = /* @__PURE__ */ new Set([307, 308]); 10383var IDLE_NAVIGATION = { 10384 state: "idle", 10385 location: void 0, 10386 formMethod: void 0, 10387 formAction: void 0, 10388 formEncType: void 0, 10389 formData: void 0, 10390 json: void 0, 10391 text: void 0 10392}; 10393var IDLE_FETCHER = { 10394 state: "idle", 10395 data: void 0, 10396 formMethod: void 0, 10397 formAction: void 0, 10398 formEncType: void 0, 10399 formData: void 0, 10400 json: void 0, 10401 text: void 0 10402}; 10403var IDLE_BLOCKER = { 10404 state: "unblocked", 10405 proceed: void 0, 10406 reset: void 0, 10407 location: void 0 10408}; 10409var ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i; 10410var isAbsoluteUrl = (url) => ABSOLUTE_URL_REGEX.test(url); 10411var defaultMapRouteProperties = (route) => ({ 10412 hasErrorBoundary: Boolean(route.hasErrorBoundary) 10413}); 10414var TRANSITIONS_STORAGE_KEY = "remix-router-transitions"; 10415var ResetLoaderDataSymbol = Symbol("ResetLoaderData"); 10416function createRouter(init) { 10417 const routerWindow = init.window ? init.window : typeof window !== "undefined" ? window : void 0; 10418 const isBrowser2 = typeof routerWindow !== "undefined" && typeof routerWindow.document !== "undefined" && typeof routerWindow.document.createElement !== "undefined"; 10419 invariant( 10420 init.routes.length > 0, 10421 "You must provide a non-empty routes array to createRouter" 10422 ); 10423 let hydrationRouteProperties2 = init.hydrationRouteProperties || []; 10424 let mapRouteProperties2 = init.mapRouteProperties || defaultMapRouteProperties; 10425 let manifest = {}; 10426 let dataRoutes = convertRoutesToDataRoutes( 10427 init.routes, 10428 mapRouteProperties2, 10429 void 0, 10430 manifest 10431 ); 10432 let inFlightDataRoutes; 10433 let basename = init.basename || "/"; 10434 if (!basename.startsWith("/")) { 10435 basename = `/${basename}`; 10436 } 10437 let dataStrategyImpl = init.dataStrategy || defaultDataStrategyWithMiddleware; 10438 let future = { 10439 ...init.future 10440 }; 10441 let unlistenHistory = null; 10442 let subscribers = /* @__PURE__ */ new Set(); 10443 let savedScrollPositions2 = null; 10444 let getScrollRestorationKey2 = null; 10445 let getScrollPosition = null; 10446 let initialScrollRestored = init.hydrationData != null; 10447 let initialMatches = matchRoutes(dataRoutes, init.history.location, basename); 10448 let initialMatchesIsFOW = false;
10449 let initialErrors = null; 10450 let initialized; 10451 if (initialMatches == null && !init.patchRoutesOnNavigation) { 10452 let error = getInternalRouterError(404, { 10453 pathname: init.history.location.pathname 10454 }); 10455 let { matches, route } = getShortCircuitMatches(dataRoutes); 10456 initialized = true; 10457 initialMatches = matches; 10458 initialErrors = { [route.id]: error }; 10459 } else { 10460 if (initialMatches && !init.hydrationData) { 10461 let fogOfWar = checkFogOfWar( 10462 initialMatches, 10463 dataRoutes, 10464 init.history.location.pathname 10465 ); 10466 if (fogOfWar.active) { 10467 initialMatches = null; 10468 } 10469 } 10470 if (!initialMatches) { 10471 initialized = false; 10472 initialMatches = []; 10473 let fogOfWar = checkFogOfWar( 10474 null, 10475 dataRoutes, 10476 init.history.location.pathname 10477 ); 10478 if (fogOfWar.active && fogOfWar.matches) { 10479 initialMatchesIsFOW = true; 10480 initialMatches = fogOfWar.matches; 10481 } 10482 } else if (initialMatches.some((m2) => m2.route.lazy)) { 10483 initialized = false; 10484 } else if (!initialMatches.some((m2) => routeHasLoaderOrMiddleware(m2.route))) { 10485 initialized = true; 10486 } else { 10487 let loaderData = init.hydrationData ? init.hydrationData.loaderData : null; 10488 let errors = init.hydrationData ? init.hydrationData.errors : null; 10489 if (errors) { 10490 let idx = initialMatches.findIndex( 10491 (m2) => errors[m2.route.id] !== void 0 10492 ); 10493 initialized = initialMatches.slice(0, idx + 1).every( 10494 (m2) => !shouldLoadRouteOnHydration(m2.route, loaderData, errors) 10495 ); 10496 } else { 10497 initialized = initialMatches.every( 10498 (m2) => !shouldLoadRouteOnHydration(m2.route, loaderData, errors) 10499 ); 10500 } 10501 } 10502 } 10503 let router2; 10504 let state = { 10505 historyAction: init.history.action, 10506 location: init.history.location, 10507 matches: initialMatches, 10508 initialized, 10509 navigation: IDLE_NAVIGATION, 10510 // Don't restore on initial updateState() if we were SSR'd 10511 restoreScrollPosition: init.hydrationData != null ? false : null, 10512 preventScrollReset: false, 10513 revalidation: "idle", 10514 loaderData: init.hydrationData && init.hydrationData.loaderData || {}, 10515 actionData: init.hydrationData && init.hydrationData.actionData || null, 10516 errors: init.hydrationData && init.hydrationData.errors || initialErrors, 10517 fetchers: /* @__PURE__ */ new Map(), 10518 blockers: /* @__PURE__ */ new Map() 10519 }; 10520 let pendingAction = "POP"; 10521 let pendingPreventScrollReset = false; 10522 let pendingNavigationController; 10523 let pendingViewTransitionEnabled = false; 10524 let appliedViewTransitions = /* @__PURE__ */ new Map(); 10525 let removePageHideEventListener = null; 10526 let isUninterruptedRevalidation = false; 10527 let isRevalidationRequired = false; 10528 let cancelledFetcherLoads = /* @__PURE__ */ new Set(); 10529 let fetchControllers = /* @__PURE__ */ new Map(); 10530 let incrementingLoadId = 0; 10531 let pendingNavigationLoadId = -1; 10532 let fetchReloadIds = /* @__PURE__ */ new Map(); 10533 let fetchRedirectIds = /* @__PURE__ */ new Set(); 10534 let fetchLoadMatches = /* @__PURE__ */ new Map(); 10535 let activeFetchers = /* @__PURE__ */ new Map(); 10536 let fetchersQueuedForDeletion = /* @__PURE__ */ new Set(); 10537 let blockerFunctions = /* @__PURE__ */ new Map(); 10538 let unblockBlockerHistoryUpdate = void 0; 10539 let pendingRevalidationDfd = null; 10540 function initialize() { 10541 unlistenHistory = init.history.listen( 10542 ({ action: historyAction, location, delta }) => { 10543 if (unblockBlockerHistoryUpdate) { 10544 unblockBlockerHistoryUpdate(); 10545 unblockBlockerHistoryUpdate = void 0; 10546 return; 10547 } 10548 warning( 10549 blockerFunctions.size === 0 || delta != null, 10550 "You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL." 10551 ); 10552 let blockerKey = shouldBlockNavigation({ 10553 currentLocation: state.location, 10554 nextLocation: location, 10555 historyAction 10556 }); 10557 if (blockerKey && delta != null) { 10558 let nextHistoryUpdatePromise = new Promise((resolve) => { 10559 unblockBlockerHistoryUpdate = resolve; 10560 }); 10561 init.history.go(delta * -1); 10562 updateBlocker(blockerKey, { 10563 state: "blocked", 10564 location, 10565 proceed() { 10566 updateBlocker(blockerKey, { 10567 state: "proceeding", 10568 proceed: void 0, 10569 reset: void 0, 10570 location 10571 }); 10572 nextHistoryUpdatePromise.then(() => init.history.go(delta)); 10573 }, 10574 reset() { 10575 let blockers = new Map(state.blockers); 10576 blockers.set(blockerKey, IDLE_BLOCKER); 10577 updateState({ blockers }); 10578 } 10579 }); 10580 return; 10581 } 10582 return startNavigation(historyAction, location); 10583 } 10584 ); 10585 if (isBrowser2) { 10586 restoreAppliedTransitions(routerWindow, appliedViewTransitions); 10587 let _saveAppliedTransitions = () => persistAppliedTransitions(routerWindow, appliedViewTransitions); 10588 routerWindow.addEventListener("pagehide", _saveAppliedTransitions); 10589 removePageHideEventListener = () => routerWindow.removeEventListener("pagehide", _saveAppliedTransitions); 10590 } 10591 if (!state.initialized) { 10592 startNavigation("POP", state.location, { 10593 initialHydration: true 10594 }); 10595 } 10596 return router2; 10597 } 10598 function dispose() { 10599 if (unlistenHistory) { 10600 unlistenHistory(); 10601 } 10602 if (removePageHideEventListener) { 10603 removePageHideEventListener(); 10604 } 10605 subscribers.clear(); 10606 pendingNavigationController && pendingNavigationController.abort();
10607 state.fetchers.forEach((_, key) => deleteFetcher(key)); 10608 state.blockers.forEach((_, key) => deleteBlocker(key)); 10609 } 10610 function subscribe(fn) { 10611 subscribers.add(fn); 10612 return () => subscribers.delete(fn); 10613 } 10614 function updateState(newState, opts = {}) { 10615 if (newState.matches) { 10616 newState.matches = newState.matches.map((m2) => { 10617 let route = manifest[m2.route.id]; 10618 let matchRoute = m2.route; 10619 if (matchRoute.element !== route.element || matchRoute.errorElement !== route.errorElement || matchRoute.hydrateFallbackElement !== route.hydrateFallbackElement) { 10620 return { 10621 ...m2, 10622 route 10623 }; 10624 } 10625 return m2; 10626 }); 10627 } 10628 state = { 10629 ...state, 10630 ...newState 10631 }; 10632 let unmountedFetchers = []; 10633 let mountedFetchers = []; 10634 state.fetchers.forEach((fetcher, key) => { 10635 if (fetcher.state === "idle") { 10636 if (fetchersQueuedForDeletion.has(key)) { 10637 unmountedFetchers.push(key); 10638 } else { 10639 mountedFetchers.push(key); 10640 } 10641 } 10642 }); 10643 fetchersQueuedForDeletion.forEach((key) => { 10644 if (!state.fetchers.has(key) && !fetchControllers.has(key)) { 10645 unmountedFetchers.push(key); 10646 } 10647 }); 10648 [...subscribers].forEach( 10649 (subscriber) => subscriber(state, { 10650 deletedFetchers: unmountedFetchers, 10651 viewTransitionOpts: opts.viewTransitionOpts, 10652 flushSync: opts.flushSync === true 10653 }) 10654 ); 10655 unmountedFetchers.forEach((key) => deleteFetcher(key)); 10656 mountedFetchers.forEach((key) => state.fetchers.delete(key)); 10657 } 10658 function completeNavigation(location, newState, { flushSync } = {}) { 10659 let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === "loading" && location.state?._isRedirect !== true; 10660 let actionData; 10661 if (newState.actionData) { 10662 if (Object.keys(newState.actionData).length > 0) { 10663 actionData = newState.actionData; 10664 } else { 10665 actionData = null; 10666 } 10667 } else if (isActionReload) { 10668 actionData = state.actionData; 10669 } else { 10670 actionData = null; 10671 } 10672 let loaderData = newState.loaderData ? mergeLoaderData( 10673 state.loaderData, 10674 newState.loaderData, 10675 newState.matches || [], 10676 newState.errors 10677 ) : state.loaderData; 10678 let blockers = state.blockers; 10679 if (blockers.size > 0) { 10680 blockers = new Map(blockers); 10681 blockers.forEach((_, k2) => blockers.set(k2, IDLE_BLOCKER)); 10682 } 10683 let restoreScrollPosition = isUninterruptedRevalidation ? false : getSavedScrollPosition(location, newState.matches || state.matches); 10684 let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && location.state?._isRedirect !== true; 10685 if (inFlightDataRoutes) { 10686 dataRoutes = inFlightDataRoutes; 10687 inFlightDataRoutes = void 0; 10688 } 10689 if (isUninterruptedRevalidation) ; 10690 else if (pendingAction === "POP") ; 10691 else if (pendingAction === "PUSH") { 10692 init.history.push(location, location.state); 10693 } else if (pendingAction === "REPLACE") { 10694 init.history.replace(location, location.state); 10695 } 10696 let viewTransitionOpts; 10697 if (pendingAction === "POP") { 10698 let priorPaths = appliedViewTransitions.get(state.location.pathname); 10699 if (priorPaths && priorPaths.has(location.pathname)) { 10700 viewTransitionOpts = { 10701 currentLocation: state.location, 10702 nextLocation: location 10703 }; 10704 } else if (appliedViewTransitions.has(location.pathname)) { 10705 viewTransitionOpts = { 10706 currentLocation: location, 10707 nextLocation: state.location 10708 }; 10709 } 10710 } else if (pendingViewTransitionEnabled) { 10711 let toPaths = appliedViewTransitions.get(state.location.pathname); 10712 if (toPaths) { 10713 toPaths.add(location.pathname); 10714 } else { 10715 toPaths = /* @__PURE__ */ new Set([location.pathname]); 10716 appliedViewTransitions.set(state.location.pathname, toPaths); 10717 } 10718 viewTransitionOpts = { 10719 currentLocation: state.location, 10720 nextLocation: location 10721 }; 10722 } 10723 updateState( 10724 { 10725 ...newState, 10726 // matches, errors, fetchers go through as-is 10727 actionData, 10728 loaderData, 10729 historyAction: pendingAction, 10730 location, 10731 initialized: true, 10732 navigation: IDLE_NAVIGATION, 10733 revalidation: "idle", 10734 restoreScrollPosition, 10735 preventScrollReset, 10736 blockers 10737 }, 10738 { 10739 viewTransitionOpts, 10740 flushSync: flushSync === true 10741 } 10742 ); 10743 pendingAction = "POP"; 10744 pendingPreventScrollReset = false;
10745 pendingViewTransitionEnabled = false; 10746 isUninterruptedRevalidation = false; 10747 isRevalidationRequired = false; 10748 pendingRevalidationDfd?.resolve(); 10749 pendingRevalidationDfd = null; 10750 } 10751 async function navigate(to, opts) { 10752 if (typeof to === "number") { 10753 init.history.go(to); 10754 return; 10755 } 10756 let normalizedPath = normalizeTo( 10757 state.location, 10758 state.matches, 10759 basename, 10760 to, 10761 opts?.fromRouteId, 10762 opts?.relative 10763 ); 10764 let { path, submission, error } = normalizeNavigateOptions( 10765 false, 10766 normalizedPath, 10767 opts 10768 ); 10769 let currentLocation = state.location; 10770 let nextLocation = createLocation(state.location, path, opts && opts.state); 10771 nextLocation = { 10772 ...nextLocation, 10773 ...init.history.encodeLocation(nextLocation) 10774 }; 10775 let userReplace = opts && opts.replace != null ? opts.replace : void 0; 10776 let historyAction = "PUSH"; 10777 if (userReplace === true) { 10778 historyAction = "REPLACE"; 10779 } else if (userReplace === false) ; 10780 else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) { 10781 historyAction = "REPLACE"; 10782 } 10783 let preventScrollReset = opts && "preventScrollReset" in opts ? opts.preventScrollReset === true : void 0; 10784 let flushSync = (opts && opts.flushSync) === true; 10785 let blockerKey = shouldBlockNavigation({ 10786 currentLocation, 10787 nextLocation, 10788 historyAction 10789 }); 10790 if (blockerKey) { 10791 updateBlocker(blockerKey, { 10792 state: "blocked", 10793 location: nextLocation, 10794 proceed() { 10795 updateBlocker(blockerKey, { 10796 state: "proceeding", 10797 proceed: void 0, 10798 reset: void 0, 10799 location: nextLocation 10800 }); 10801 navigate(to, opts); 10802 }, 10803 reset() { 10804 let blockers = new Map(state.blockers); 10805 blockers.set(blockerKey, IDLE_BLOCKER); 10806 updateState({ blockers }); 10807 } 10808 }); 10809 return; 10810 } 10811 await startNavigation(historyAction, nextLocation, { 10812 submission, 10813 // Send through the formData serialization error if we have one so we can 10814 // render at the right error boundary after we match routes 10815 pendingError: error, 10816 preventScrollReset, 10817 replace: opts && opts.replace, 10818 enableViewTransition: opts && opts.viewTransition, 10819 flushSync 10820 }); 10821 } 10822 function revalidate() { 10823 if (!pendingRevalidationDfd) { 10824 pendingRevalidationDfd = createDeferred(); 10825 } 10826 interruptActiveLoads(); 10827 updateState({ revalidation: "loading" }); 10828 let promise = pendingRevalidationDfd.promise; 10829 if (state.navigation.state === "submitting") { 10830 return promise; 10831 } 10832 if (state.navigation.state === "idle") { 10833 startNavigation(state.historyAction, state.location, { 10834 startUninterruptedRevalidation: true 10835 }); 10836 return promise; 10837 } 10838 startNavigation( 10839 pendingAction || state.historyAction, 10840 state.navigation.location, 10841 { 10842 overrideNavigation: state.navigation, 10843 // Proxy through any rending view transition 10844 enableViewTransition: pendingViewTransitionEnabled === true 10845 } 10846 ); 10847 return promise; 10848 } 10849 async function startNavigation(historyAction, location, opts) { 10850 pendingNavigationController && pendingNavigationController.abort(); 10851 pendingNavigationController = null; 10852 pendingAction = historyAction; 10853 isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true; 10854 saveScrollPosition(state.location, state.matches); 10855 pendingPreventScrollReset = (opts && opts.preventScrollReset) === true; 10856 pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true; 10857 let routesToUse = inFlightDataRoutes || dataRoutes; 10858 let loadingNavigation = opts && opts.overrideNavigation; 10859 let matches = opts?.initialHydration && state.matches && state.matches.length > 0 && !initialMatchesIsFOW ? ( 10860 // `matchRoutes()` has already been called if we're in here via `router.initialize()` 10861 state.matches 10862 ) : matchRoutes(routesToUse, location, basename); 10863 let flushSync = (opts && opts.flushSync) === true; 10864 if (matches && state.initialized && !isRevalidationRequired && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) { 10865 completeNavigation(location, { matches }, { flushSync }); 10866 return; 10867 } 10868 let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname); 10869 if (fogOfWar.active && fogOfWar.matches) { 10870 matches = fogOfWar.matches; 10871 } 10872 if (!matches) { 10873 let { error, notFoundMatches, route } = handleNavigational404( 10874 location.pathname 10875 ); 10876 completeNavigation( 10877 location, 10878 { 10879 matches: notFoundMatches, 10880 loaderData: {}, 10881 errors: { 10882 [route.id]: error 10883 } 10884 }, 10885 { flushSync } 10886 ); 10887 return; 10888 } 10889 pendingNavigationController = new AbortController();
10890 let request = createClientSideRequest( 10891 init.history, 10892 location, 10893 pendingNavigationController.signal, 10894 opts && opts.submission 10895 ); 10896 let scopedContext = init.getContext ? await init.getContext() : new RouterContextProvider(); 10897 let pendingActionResult; 10898 if (opts && opts.pendingError) { 10899 pendingActionResult = [ 10900 findNearestBoundary(matches).route.id, 10901 { type: "error", error: opts.pendingError } 10902 ]; 10903 } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) { 10904 let actionResult = await handleAction( 10905 request, 10906 location, 10907 opts.submission, 10908 matches, 10909 scopedContext, 10910 fogOfWar.active, 10911 opts && opts.initialHydration === true, 10912 { replace: opts.replace, flushSync } 10913 ); 10914 if (actionResult.shortCircuited) { 10915 return; 10916 } 10917 if (actionResult.pendingActionResult) { 10918 let [routeId, result] = actionResult.pendingActionResult; 10919 if (isErrorResult(result) && isRouteErrorResponse(result.error) && result.error.status === 404) { 10920 pendingNavigationController = null; 10921 completeNavigation(location, { 10922 matches: actionResult.matches, 10923 loaderData: {}, 10924 errors: { 10925 [routeId]: result.error 10926 } 10927 }); 10928 return; 10929 } 10930 } 10931 matches = actionResult.matches || matches; 10932 pendingActionResult = actionResult.pendingActionResult; 10933 loadingNavigation = getLoadingNavigation(location, opts.submission); 10934 flushSync = false; 10935 fogOfWar.active = false; 10936 request = createClientSideRequest( 10937 init.history, 10938 request.url, 10939 request.signal 10940 ); 10941 } 10942 let { 10943 shortCircuited, 10944 matches: updatedMatches, 10945 loaderData, 10946 errors 10947 } = await handleLoaders( 10948 request, 10949 location, 10950 matches, 10951 scopedContext, 10952 fogOfWar.active, 10953 loadingNavigation, 10954 opts && opts.submission, 10955 opts && opts.fetcherSubmission, 10956 opts && opts.replace, 10957 opts && opts.initialHydration === true, 10958 flushSync, 10959 pendingActionResult 10960 ); 10961 if (shortCircuited) { 10962 return; 10963 } 10964 pendingNavigationController = null; 10965 completeNavigation(location, { 10966 matches: updatedMatches || matches, 10967 ...getActionDataForCommit(pendingActionResult), 10968 loaderData, 10969 errors 10970 }); 10971 } 10972 async function handleAction(request, location, submission, matches, scopedContext, isFogOfWar, initialHydration, opts = {}) { 10973 interruptActiveLoads(); 10974 let navigation = getSubmittingNavigation(location, submission); 10975 updateState({ navigation }, { flushSync: opts.flushSync === true }); 10976 if (isFogOfWar) { 10977 let discoverResult = await discoverRoutes( 10978 matches, 10979 location.pathname, 10980 request.signal 10981 ); 10982 if (discoverResult.type === "aborted") { 10983 return { shortCircuited: true }; 10984 } else if (discoverResult.type === "error") { 10985 if (discoverResult.partialMatches.length === 0) { 10986 let { matches: matches2, route } = getShortCircuitMatches(dataRoutes); 10987 return { 10988 matches: matches2, 10989 pendingActionResult: [ 10990 route.id, 10991 { 10992 type: "error", 10993 error: discoverResult.error 10994 } 10995 ] 10996 }; 10997 } 10998 let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id; 10999 return { 11000 matches: discoverResult.partialMatches, 11001 pendingActionResult: [ 11002 boundaryId, 11003 { 11004 type: "error", 11005 error: discoverResult.error 11006 } 11007 ] 11008 }; 11009 } else if (!discoverResult.matches) { 11010 let { notFoundMatches, error, route } = handleNavigational404( 11011 location.pathname 11012 ); 11013 return { 11014 matches: notFoundMatches, 11015 pendingActionResult: [ 11016 route.id, 11017 { 11018 type: "error", 11019 error 11020 } 11021 ] 11022 }; 11023 } else { 11024 matches = discoverResult.matches; 11025 } 11026 } 11027 let result; 11028 let actionMatch = getTargetMatch(matches, location); 11029 if (!actionMatch.route.action && !actionMatch.route.lazy) { 11030 result = { 11031 type: "error", 11032 error: getInternalRouterError(405, { 11033 method: request.method, 11034 pathname: location.pathname, 11035 routeId: actionMatch.route.id 11036 }) 11037 }; 11038 } else { 11039 let dsMatches = getTargetedDataStrategyMatches( 11040 mapRouteProperties2, 11041 manifest, 11042 request, 11043 matches, 11044 actionMatch, 11045 initialHydration ? [] : hydrationRouteProperties2, 11046 scopedContext 11047 ); 11048 let results = await callDataStrategy( 11049 request, 11050 dsMatches, 11051 scopedContext, 11052 null 11053 ); 11054 result = results[actionMatch.route.id]; 11055 if (!result) { 11056 for (let match of matches) { 11057 if (results[match.route.id]) { 11058 result = results[match.route.id]; 11059 break; 11060 } 11061 } 11062 } 11063 if (request.signal.aborted) { 11064 return { shortCircuited: true }; 11065 } 11066 } 11067 if (isRedirectResult(result)) { 11068 let replace2; 11069 if (opts && opts.replace != null) { 11070 replace2 = opts.replace; 11071 } else { 11072 let location2 = normalizeRedirectLocation( 11073 result.response.headers.get("Location"), 11074 new URL(request.url), 11075 basename 11076 ); 11077 replace2 = location2 === state.location.pathname + state.location.search; 11078 } 11079 await startRedirectNavigation(request, result, true, { 11080 submission, 11081 replace: replace2 11082 }); 11083 return { shortCircuited: true }; 11084 } 11085 if (isErrorResult(result)) {
11086 let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id); 11087 if ((opts && opts.replace) !== true) { 11088 pendingAction = "PUSH"; 11089 } 11090 return { 11091 matches, 11092 pendingActionResult: [ 11093 boundaryMatch.route.id, 11094 result, 11095 actionMatch.route.id 11096 ] 11097 }; 11098 } 11099 return { 11100 matches, 11101 pendingActionResult: [actionMatch.route.id, result] 11102 }; 11103 } 11104 async function handleLoaders(request, location, matches, scopedContext, isFogOfWar, overrideNavigation, submission, fetcherSubmission, replace2, initialHydration, flushSync, pendingActionResult) { 11105 let loadingNavigation = overrideNavigation || getLoadingNavigation(location, submission); 11106 let activeSubmission = submission || fetcherSubmission || getSubmissionFromNavigation(loadingNavigation); 11107 let shouldUpdateNavigationState = !isUninterruptedRevalidation && !initialHydration; 11108 if (isFogOfWar) { 11109 if (shouldUpdateNavigationState) { 11110 let actionData = getUpdatedActionData(pendingActionResult); 11111 updateState( 11112 { 11113 navigation: loadingNavigation, 11114 ...actionData !== void 0 ? { actionData } : {} 11115 }, 11116 { 11117 flushSync 11118 } 11119 ); 11120 } 11121 let discoverResult = await discoverRoutes( 11122 matches, 11123 location.pathname, 11124 request.signal 11125 ); 11126 if (discoverResult.type === "aborted") { 11127 return { shortCircuited: true }; 11128 } else if (discoverResult.type === "error") { 11129 if (discoverResult.partialMatches.length === 0) { 11130 let { matches: matches2, route } = getShortCircuitMatches(dataRoutes); 11131 return { 11132 matches: matches2, 11133 loaderData: {}, 11134 errors: { 11135 [route.id]: discoverResult.error 11136 } 11137 }; 11138 } 11139 let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id; 11140 return { 11141 matches: discoverResult.partialMatches, 11142 loaderData: {}, 11143 errors: { 11144 [boundaryId]: discoverResult.error 11145 } 11146 }; 11147 } else if (!discoverResult.matches) { 11148 let { error, notFoundMatches, route } = handleNavigational404( 11149 location.pathname 11150 ); 11151 return { 11152 matches: notFoundMatches, 11153 loaderData: {}, 11154 errors: { 11155 [route.id]: error 11156 } 11157 }; 11158 } else { 11159 matches = discoverResult.matches; 11160 } 11161 } 11162 let routesToUse = inFlightDataRoutes || dataRoutes; 11163 let { dsMatches, revalidatingFetchers } = getMatchesToLoad( 11164 request, 11165 scopedContext, 11166 mapRouteProperties2, 11167 manifest, 11168 init.history, 11169 state, 11170 matches, 11171 activeSubmission, 11172 location, 11173 initialHydration ? [] : hydrationRouteProperties2, 11174 initialHydration === true, 11175 isRevalidationRequired, 11176 cancelledFetcherLoads, 11177 fetchersQueuedForDeletion, 11178 fetchLoadMatches, 11179 fetchRedirectIds, 11180 routesToUse, 11181 basename, 11182 init.patchRoutesOnNavigation != null, 11183 pendingActionResult 11184 ); 11185 pendingNavigationLoadId = ++incrementingLoadId; 11186 if (!init.dataStrategy && !dsMatches.some((m2) => m2.shouldLoad) && !dsMatches.some( 11187 (m2) => m2.route.middleware && m2.route.middleware.length > 0 11188 ) && revalidatingFetchers.length === 0) { 11189 let updatedFetchers2 = markFetchRedirectsDone(); 11190 completeNavigation( 11191 location, 11192 { 11193 matches, 11194 loaderData: {}, 11195 // Commit pending error if we're short circuiting 11196 errors: pendingActionResult && isErrorResult(pendingActionResult[1]) ? { [pendingActionResult[0]]: pendingActionResult[1].error } : null, 11197 ...getActionDataForCommit(pendingActionResult), 11198 ...updatedFetchers2 ? { fetchers: new Map(state.fetchers) } : {} 11199 }, 11200 { flushSync } 11201 ); 11202 return { shortCircuited: true }; 11203 } 11204 if (shouldUpdateNavigationState) { 11205 let updates = {}; 11206 if (!isFogOfWar) { 11207 updates.navigation = loadingNavigation; 11208 let actionData = getUpdatedActionData(pendingActionResult); 11209 if (actionData !== void 0) { 11210 updates.actionData = actionData; 11211 } 11212 } 11213 if (revalidatingFetchers.length > 0) { 11214 updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers); 11215 } 11216 updateState(updates, { flushSync }); 11217 }
11218 revalidatingFetchers.forEach((rf2) => { 11219 abortFetcher(rf2.key); 11220 if (rf2.controller) { 11221 fetchControllers.set(rf2.key, rf2.controller); 11222 } 11223 }); 11224 let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach((f2) => abortFetcher(f2.key)); 11225 if (pendingNavigationController) { 11226 pendingNavigationController.signal.addEventListener( 11227 "abort", 11228 abortPendingFetchRevalidations 11229 ); 11230 } 11231 let { loaderResults, fetcherResults } = await callLoadersAndMaybeResolveData( 11232 dsMatches, 11233 revalidatingFetchers, 11234 request, 11235 scopedContext 11236 ); 11237 if (request.signal.aborted) { 11238 return { shortCircuited: true }; 11239 } 11240 if (pendingNavigationController) { 11241 pendingNavigationController.signal.removeEventListener( 11242 "abort", 11243 abortPendingFetchRevalidations 11244 ); 11245 } 11246 revalidatingFetchers.forEach((rf2) => fetchControllers.delete(rf2.key)); 11247 let redirect2 = findRedirect(loaderResults); 11248 if (redirect2) { 11249 await startRedirectNavigation(request, redirect2.result, true, { 11250 replace: replace2 11251 }); 11252 return { shortCircuited: true }; 11253 } 11254 redirect2 = findRedirect(fetcherResults); 11255 if (redirect2) { 11256 fetchRedirectIds.add(redirect2.key); 11257 await startRedirectNavigation(request, redirect2.result, true, { 11258 replace: replace2 11259 }); 11260 return { shortCircuited: true }; 11261 } 11262 let { loaderData, errors } = processLoaderData( 11263 state, 11264 matches, 11265 loaderResults, 11266 pendingActionResult, 11267 revalidatingFetchers, 11268 fetcherResults 11269 ); 11270 if (initialHydration && state.errors) { 11271 errors = { ...state.errors, ...errors }; 11272 } 11273 let updatedFetchers = markFetchRedirectsDone(); 11274 let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId); 11275 let shouldUpdateFetchers = updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0; 11276 return { 11277 matches, 11278 loaderData, 11279 errors, 11280 ...shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {} 11281 }; 11282 } 11283 function getUpdatedActionData(pendingActionResult) { 11284 if (pendingActionResult && !isErrorResult(pendingActionResult[1])) { 11285 return { 11286 [pendingActionResult[0]]: pendingActionResult[1].data 11287 }; 11288 } else if (state.actionData) { 11289 if (Object.keys(state.actionData).length === 0) { 11290 return null; 11291 } else { 11292 return state.actionData; 11293 } 11294 } 11295 } 11296 function getUpdatedRevalidatingFetchers(revalidatingFetchers) { 11297 revalidatingFetchers.forEach((rf2) => { 11298 let fetcher = state.fetchers.get(rf2.key); 11299 let revalidatingFetcher = getLoadingFetcher( 11300 void 0, 11301 fetcher ? fetcher.data : void 0 11302 ); 11303 state.fetchers.set(rf2.key, revalidatingFetcher); 11304 }); 11305 return new Map(state.fetchers); 11306 } 11307 async function fetch2(key, routeId, href, opts) { 11308 abortFetcher(key); 11309 let flushSync = (opts && opts.flushSync) === true; 11310 let routesToUse = inFlightDataRoutes || dataRoutes; 11311 let normalizedPath = normalizeTo( 11312 state.location, 11313 state.matches, 11314 basename, 11315 href, 11316 routeId, 11317 opts?.relative 11318 ); 11319 let matches = matchRoutes(routesToUse, normalizedPath, basename); 11320 let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath); 11321 if (fogOfWar.active && fogOfWar.matches) { 11322 matches = fogOfWar.matches; 11323 } 11324 if (!matches) { 11325 setFetcherError( 11326 key, 11327 routeId, 11328 getInternalRouterError(404, { pathname: normalizedPath }), 11329 { flushSync } 11330 ); 11331 return; 11332 } 11333 let { path, submission, error } = normalizeNavigateOptions( 11334 true, 11335 normalizedPath, 11336 opts 11337 ); 11338 if (error) { 11339 setFetcherError(key, routeId, error, { flushSync }); 11340 return; 11341 } 11342 let scopedContext = init.getContext ? await init.getContext() : new RouterContextProvider(); 11343 let preventScrollReset = (opts && opts.preventScrollReset) === true; 11344 if (submission && isMutationMethod(submission.formMethod)) { 11345 await handleFetcherAction( 11346 key, 11347 routeId, 11348 path, 11349 matches, 11350 scopedContext, 11351 fogOfWar.active, 11352 flushSync, 11353 preventScrollReset, 11354 submission 11355 ); 11356 return; 11357 } 11358 fetchLoadMatches.set(key, { routeId, path }); 11359 await handleFetcherLoader( 11360 key, 11361 routeId, 11362 path, 11363 matches, 11364 scopedContext, 11365 fogOfWar.active, 11366 flushSync, 11367 preventScrollReset, 11368 submission 11369 ); 11370 } 11371 async function handleFetcherAction(key, routeId, path, requestMatches, scopedContext, isFogOfWar, flushSync, preventScrollReset, submission) { 11372 interruptActiveLoads(); 11373 fetchLoadMatches.delete(key); 11374 let existingFetcher = state.fetchers.get(key); 11375 updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), { 11376 flushSync 11377 }); 11378 let abortController = new AbortController();
11379 let fetchRequest = createClientSideRequest( 11380 init.history, 11381 path, 11382 abortController.signal, 11383 submission 11384 ); 11385 if (isFogOfWar) { 11386 let discoverResult = await discoverRoutes( 11387 requestMatches, 11388 new URL(fetchRequest.url).pathname, 11389 fetchRequest.signal, 11390 key 11391 ); 11392 if (discoverResult.type === "aborted") { 11393 return; 11394 } else if (discoverResult.type === "error") { 11395 setFetcherError(key, routeId, discoverResult.error, { flushSync }); 11396 return; 11397 } else if (!discoverResult.matches) { 11398 setFetcherError( 11399 key, 11400 routeId, 11401 getInternalRouterError(404, { pathname: path }), 11402 { flushSync } 11403 ); 11404 return; 11405 } else { 11406 requestMatches = discoverResult.matches; 11407 } 11408 } 11409 let match = getTargetMatch(requestMatches, path); 11410 if (!match.route.action && !match.route.lazy) { 11411 let error = getInternalRouterError(405, { 11412 method: submission.formMethod, 11413 pathname: path, 11414 routeId 11415 }); 11416 setFetcherError(key, routeId, error, { flushSync }); 11417 return; 11418 } 11419 fetchControllers.set(key, abortController); 11420 let originatingLoadId = incrementingLoadId; 11421 let fetchMatches = getTargetedDataStrategyMatches( 11422 mapRouteProperties2, 11423 manifest, 11424 fetchRequest, 11425 requestMatches, 11426 match, 11427 hydrationRouteProperties2, 11428 scopedContext 11429 ); 11430 let actionResults = await callDataStrategy( 11431 fetchRequest, 11432 fetchMatches, 11433 scopedContext, 11434 key 11435 ); 11436 let actionResult = actionResults[match.route.id]; 11437 if (fetchRequest.signal.aborted) { 11438 if (fetchControllers.get(key) === abortController) { 11439 fetchControllers.delete(key); 11440 } 11441 return; 11442 } 11443 if (fetchersQueuedForDeletion.has(key)) { 11444 if (isRedirectResult(actionResult) || isErrorResult(actionResult)) { 11445 updateFetcherState(key, getDoneFetcher(void 0)); 11446 return; 11447 } 11448 } else { 11449 if (isRedirectResult(actionResult)) { 11450 fetchControllers.delete(key); 11451 if (pendingNavigationLoadId > originatingLoadId) { 11452 updateFetcherState(key, getDoneFetcher(void 0)); 11453 return; 11454 } else { 11455 fetchRedirectIds.add(key); 11456 updateFetcherState(key, getLoadingFetcher(submission)); 11457 return startRedirectNavigation(fetchRequest, actionResult, false, { 11458 fetcherSubmission: submission, 11459 preventScrollReset 11460 }); 11461 } 11462 } 11463 if (isErrorResult(actionResult)) { 11464 setFetcherError(key, routeId, actionResult.error); 11465 return; 11466 } 11467 } 11468 let nextLocation = state.navigation.location || state.location; 11469 let revalidationRequest = createClientSideRequest( 11470 init.history, 11471 nextLocation, 11472 abortController.signal 11473 ); 11474 let routesToUse = inFlightDataRoutes || dataRoutes; 11475 let matches = state.navigation.state !== "idle" ? matchRoutes(routesToUse, state.navigation.location, basename) : state.matches; 11476 invariant(matches, "Didn't find any matches after fetcher action"); 11477 let loadId = ++incrementingLoadId; 11478 fetchReloadIds.set(key, loadId); 11479 let loadFetcher = getLoadingFetcher(submission, actionResult.data); 11480 state.fetchers.set(key, loadFetcher); 11481 let { dsMatches, revalidatingFetchers } = getMatchesToLoad( 11482 revalidationRequest, 11483 scopedContext, 11484 mapRouteProperties2, 11485 manifest, 11486 init.history, 11487 state, 11488 matches, 11489 submission, 11490 nextLocation, 11491 hydrationRouteProperties2, 11492 false, 11493 isRevalidationRequired, 11494 cancelledFetcherLoads, 11495 fetchersQueuedForDeletion, 11496 fetchLoadMatches, 11497 fetchRedirectIds, 11498 routesToUse, 11499 basename, 11500 init.patchRoutesOnNavigation != null, 11501 [match.route.id, actionResult] 11502 ); 11503 revalidatingFetchers.filter((rf2) => rf2.key !== key).forEach((rf2) => { 11504 let staleKey = rf2.key; 11505 let existingFetcher2 = state.fetchers.get(staleKey); 11506 let revalidatingFetcher = getLoadingFetcher( 11507 void 0, 11508 existingFetcher2 ? existingFetcher2.data : void 0 11509 ); 11510 state.fetchers.set(staleKey, revalidatingFetcher); 11511 abortFetcher(staleKey); 11512 if (rf2.controller) { 11513 fetchControllers.set(staleKey, rf2.controller); 11514 } 11515 }); 11516 updateState({ fetchers: new Map(state.fetchers) }); 11517 let abortPendingFetchRevalidations = () =>
11517 revalidatingFetchers.forEach((rf2) => abortFetcher(rf2.key)); 11518 abortController.signal.addEventListener( 11519 "abort", 11520 abortPendingFetchRevalidations 11521 ); 11522 let { loaderResults, fetcherResults } = await callLoadersAndMaybeResolveData( 11523 dsMatches, 11524 revalidatingFetchers, 11525 revalidationRequest, 11526 scopedContext 11527 ); 11528 if (abortController.signal.aborted) { 11529 return; 11530 } 11531 abortController.signal.removeEventListener( 11532 "abort", 11533 abortPendingFetchRevalidations 11534 ); 11535 fetchReloadIds.delete(key); 11536 fetchControllers.delete(key); 11537 revalidatingFetchers.forEach((r2) => fetchControllers.delete(r2.key)); 11538 if (state.fetchers.has(key)) { 11539 let doneFetcher = getDoneFetcher(actionResult.data); 11540 state.fetchers.set(key, doneFetcher); 11541 } 11542 let redirect2 = findRedirect(loaderResults); 11543 if (redirect2) { 11544 return startRedirectNavigation( 11545 revalidationRequest, 11546 redirect2.result, 11547 false, 11548 { preventScrollReset } 11549 ); 11550 } 11551 redirect2 = findRedirect(fetcherResults); 11552 if (redirect2) { 11553 fetchRedirectIds.add(redirect2.key); 11554 return startRedirectNavigation( 11555 revalidationRequest, 11556 redirect2.result, 11557 false, 11558 { preventScrollReset } 11559 ); 11560 } 11561 let { loaderData, errors } = processLoaderData( 11562 state, 11563 matches, 11564 loaderResults, 11565 void 0, 11566 revalidatingFetchers, 11567 fetcherResults 11568 ); 11569 abortStaleFetchLoads(loadId); 11570 if (state.navigation.state === "loading" && loadId > pendingNavigationLoadId) { 11571 invariant(pendingAction, "Expected pending action"); 11572 pendingNavigationController && pendingNavigationController.abort(); 11573 completeNavigation(state.navigation.location, { 11574 matches, 11575 loaderData, 11576 errors, 11577 fetchers: new Map(state.fetchers) 11578 }); 11579 } else { 11580 updateState({ 11581 errors, 11582 loaderData: mergeLoaderData( 11583 state.loaderData, 11584 loaderData, 11585 matches, 11586 errors 11587 ), 11588 fetchers: new Map(state.fetchers) 11589 }); 11590 isRevalidationRequired = false; 11591 } 11592 } 11593 async function handleFetcherLoader(key, routeId, path, matches, scopedContext, isFogOfWar, flushSync, preventScrollReset, submission) { 11594 let existingFetcher = state.fetchers.get(key); 11595 updateFetcherState( 11596 key, 11597 getLoadingFetcher( 11598 submission, 11599 existingFetcher ? existingFetcher.data : void 0 11600 ), 11601 { flushSync } 11602 ); 11603 let abortController = new AbortController(); 11604 let fetchRequest = createClientSideRequest( 11605 init.history, 11606 path, 11607 abortController.signal 11608 ); 11609 if (isFogOfWar) { 11610 let discoverResult = await discoverRoutes( 11611 matches, 11612 new URL(fetchRequest.url).pathname, 11613 fetchRequest.signal, 11614 key 11615 ); 11616 if (discoverResult.type === "aborted") { 11617 return; 11618 } else if (discoverResult.type === "error") { 11619 setFetcherError(key, routeId, discoverResult.error, { flushSync }); 11620 return; 11621 } else if (!discoverResult.matches) { 11622 setFetcherError( 11623 key, 11624 routeId, 11625 getInternalRouterError(404, { pathname: path }), 11626 { flushSync } 11627 ); 11628 return; 11629 } else { 11630 matches = discoverResult.matches; 11631 } 11632 } 11633 let match = getTargetMatch(matches, path); 11634 fetchControllers.set(key, abortController); 11635 let originatingLoadId = incrementingLoadId; 11636 let dsMatches = getTargetedDataStrategyMatches( 11637 mapRouteProperties2, 11638 manifest, 11639 fetchRequest, 11640 matches, 11641 match, 11642 hydrationRouteProperties2, 11643 scopedContext 11644 ); 11645 let results = await callDataStrategy( 11646 fetchRequest, 11647 dsMatches, 11648 scopedContext, 11649 key 11650 ); 11651 let result = results[match.route.id]; 11652 if (fetchControllers.get(key) === abortController) { 11653 fetchControllers.delete(key); 11654 } 11655 if (fetchRequest.signal.aborted) { 11656 return; 11657 } 11658 if (fetchersQueuedForDeletion.has(key)) { 11659 updateFetcherState(key, getDoneFetcher(void 0)); 11660 return; 11661 } 11662 if (isRedirectResult(result)) { 11663 if (pendingNavigationLoadId > originatingLoadId) { 11664 updateFetcherState(key, getDoneFetcher(void 0)); 11665 return; 11666 } else { 11667 fetchRedirectIds.add(key); 11668 await startRedirectNavigation(fetchRequest, result, false, { 11669 preventScrollReset 11670 }); 11671 return; 11672 } 11673 } 11674 if (isErrorResult(result)) { 11675 setFetcherError(key, routeId, result.error); 11676 return; 11677 } 11678 updateFetcherState(key, getDoneFetcher(result.data)); 11679 } 11680 async function startRedirectNavigation(request, redirect2, isNavigation, { 11681 submission, 11682 fetcherSubmission, 11683 preventScrollReset, 11684 replace: replace2 11685 } = {}) { 11686 if (redirect2.response.headers.has("X-Remix-Revalidate")) { 11687 isRevalidationRequired = true; 11688 } 11689 let location = redirect2.response.headers.get("Location"); 11690 invariant(location, "Expected a Location header on the redirect Response"); 11691 location = normalizeRedirectLocation( 11692 location, 11693 new URL(request.url), 11694 basename 11695 ); 11696 let redirectLocation = createLocation(state.location, location, { 11697 _isRedirect: true 11698 }); 11699 if (isBrowser2) { 11700 let isDocumentReload = false;
11701 if (redirect2.response.headers.has("X-Remix-Reload-Document")) { 11702 isDocumentReload = true; 11703 } else if (isAbsoluteUrl(location)) { 11704 const url = createBrowserURLImpl(location, true); 11705 isDocumentReload = // Hard reload if it's an absolute URL to a new origin 11706 url.origin !== routerWindow.location.origin || // Hard reload if it's an absolute URL that does not match our basename 11707 stripBasename(url.pathname, basename) == null; 11708 } 11709 if (isDocumentReload) { 11710 if (replace2) { 11711 routerWindow.location.replace(location); 11712 } else { 11713 routerWindow.location.assign(location); 11714 } 11715 return; 11716 } 11717 } 11718 pendingNavigationController = null; 11719 let redirectNavigationType = replace2 === true || redirect2.response.headers.has("X-Remix-Replace") ? "REPLACE" : "PUSH"; 11720 let { formMethod, formAction, formEncType } = state.navigation; 11721 if (!submission && !fetcherSubmission && formMethod && formAction && formEncType) { 11722 submission = getSubmissionFromNavigation(state.navigation); 11723 } 11724 let activeSubmission = submission || fetcherSubmission; 11725 if (redirectPreserveMethodStatusCodes.has(redirect2.response.status) && activeSubmission && isMutationMethod(activeSubmission.formMethod)) { 11726 await startNavigation(redirectNavigationType, redirectLocation, { 11727 submission: { 11728 ...activeSubmission, 11729 formAction: location 11730 }, 11731 // Preserve these flags across redirects 11732 preventScrollReset: preventScrollReset || pendingPreventScrollReset, 11733 enableViewTransition: isNavigation ? pendingViewTransitionEnabled : void 0 11734 }); 11735 } else { 11736 let overrideNavigation = getLoadingNavigation( 11737 redirectLocation, 11738 submission 11739 ); 11740 await startNavigation(redirectNavigationType, redirectLocation, { 11741 overrideNavigation, 11742 // Send fetcher submissions through for shouldRevalidate 11743 fetcherSubmission, 11744 // Preserve these flags across redirects 11745 preventScrollReset: preventScrollReset || pendingPreventScrollReset, 11746 enableViewTransition: isNavigation ? pendingViewTransitionEnabled : void 0 11747 }); 11748 } 11749 } 11750 async function callDataStrategy(request, matches, scopedContext, fetcherKey) { 11751 let results; 11752 let dataResults = {}; 11753 try { 11754 results = await callDataStrategyImpl( 11755 dataStrategyImpl, 11756 request, 11757 matches, 11758 fetcherKey, 11759 scopedContext, 11760 false 11761 ); 11762 } catch (e) { 11763 matches.filter((m2) => m2.shouldLoad).forEach((m2) => { 11764 dataResults[m2.route.id] = { 11765 type: "error", 11766 error: e 11767 }; 11768 }); 11769 return dataResults; 11770 } 11771 if (request.signal.aborted) { 11772 return dataResults; 11773 } 11774 for (let [routeId, result] of Object.entries(results)) { 11775 if (isRedirectDataStrategyResult(result)) { 11776 let response = result.result; 11777 dataResults[routeId] = { 11778 type: "redirect", 11779 response: normalizeRelativeRoutingRedirectResponse( 11780 response, 11781 request, 11782 routeId, 11783 matches, 11784 basename 11785 ) 11786 }; 11787 } else { 11788 dataResults[routeId] = await convertDataStrategyResultToDataResult(result); 11789 } 11790 } 11791 return dataResults; 11792 } 11793 async function callLoadersAndMaybeResolveData(matches, fetchersToLoad, request, scopedContext) { 11794 let loaderResultsPromise = callDataStrategy( 11795 request, 11796 matches, 11797 scopedContext, 11798 null 11799 ); 11800 let fetcherResultsPromise = Promise.all( 11801 fetchersToLoad.map(async (f2) => { 11802 if (f2.matches && f2.match && f2.request && f2.controller) { 11803 let results = await callDataStrategy( 11804 f2.request, 11805 f2.matches, 11806 scopedContext, 11807 f2.key 11808 ); 11809 let result = results[f2.match.route.id]; 11810 return { [f2.key]: result }; 11811 } else { 11812 return Promise.resolve({ 11813 [f2.key]: { 11814 type: "error", 11815 error: getInternalRouterError(404, { 11816 pathname: f2.path 11817 }) 11818 } 11819 }); 11820 } 11821 }) 11822 ); 11823 let loaderResults = await loaderResultsPromise; 11824 let fetcherResults = (await fetcherResultsPromise).reduce( 11825 (acc, r2) => Object.assign(acc, r2), 11826 {} 11827 ); 11828 return { 11829 loaderResults, 11830 fetcherResults 11831 }; 11832 } 11833 function interruptActiveLoads() { 11834 isRevalidationRequired = true;
vendor: 7,498 bytes, lines 11835-12063
11835 fetchLoadMatches.forEach((_, key) => { 11836 if (fetchControllers.has(key)) { 11837 cancelledFetcherLoads.add(key); 11838 } 11839 abortFetcher(key); 11840 }); 11841 } 11842 function updateFetcherState(key, fetcher, opts = {}) { 11843 state.fetchers.set(key, fetcher); 11844 updateState( 11845 { fetchers: new Map(state.fetchers) }, 11846 { flushSync: (opts && opts.flushSync) === true } 11847 ); 11848 } 11849 function setFetcherError(key, routeId, error, opts = {}) { 11850 let boundaryMatch = findNearestBoundary(state.matches, routeId); 11851 deleteFetcher(key); 11852 updateState( 11853 { 11854 errors: { 11855 [boundaryMatch.route.id]: error 11856 }, 11857 fetchers: new Map(state.fetchers) 11858 }, 11859 { flushSync: (opts && opts.flushSync) === true } 11860 ); 11861 } 11862 function getFetcher(key) { 11863 activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1); 11864 if (fetchersQueuedForDeletion.has(key)) { 11865 fetchersQueuedForDeletion.delete(key); 11866 } 11867 return state.fetchers.get(key) || IDLE_FETCHER; 11868 } 11869 function resetFetcher(key, opts) { 11870 abortFetcher(key, opts?.reason); 11871 updateFetcherState(key, getDoneFetcher(null)); 11872 } 11873 function deleteFetcher(key) { 11874 let fetcher = state.fetchers.get(key); 11875 if (fetchControllers.has(key) && !(fetcher && fetcher.state === "loading" && fetchReloadIds.has(key))) { 11876 abortFetcher(key); 11877 } 11878 fetchLoadMatches.delete(key); 11879 fetchReloadIds.delete(key); 11880 fetchRedirectIds.delete(key); 11881 fetchersQueuedForDeletion.delete(key); 11882 cancelledFetcherLoads.delete(key); 11883 state.fetchers.delete(key); 11884 } 11885 function queueFetcherForDeletion(key) { 11886 let count = (activeFetchers.get(key) || 0) - 1; 11887 if (count <= 0) { 11888 activeFetchers.delete(key); 11889 fetchersQueuedForDeletion.add(key); 11890 } else { 11891 activeFetchers.set(key, count); 11892 } 11893 updateState({ fetchers: new Map(state.fetchers) }); 11894 } 11895 function abortFetcher(key, reason) { 11896 let controller = fetchControllers.get(key); 11897 if (controller) { 11898 controller.abort(reason); 11899 fetchControllers.delete(key); 11900 } 11901 } 11902 function markFetchersDone(keys) { 11903 for (let key of keys) { 11904 let fetcher = getFetcher(key); 11905 let doneFetcher = getDoneFetcher(fetcher.data); 11906 state.fetchers.set(key, doneFetcher); 11907 } 11908 } 11909 function markFetchRedirectsDone() { 11910 let doneKeys = []; 11911 let updatedFetchers = false; 11912 for (let key of fetchRedirectIds) { 11913 let fetcher = state.fetchers.get(key); 11914 invariant(fetcher, `Expected fetcher: ${key}`); 11915 if (fetcher.state === "loading") { 11916 fetchRedirectIds.delete(key); 11917 doneKeys.push(key); 11918 updatedFetchers = true; 11919 } 11920 } 11921 markFetchersDone(doneKeys); 11922 return updatedFetchers; 11923 } 11924 function abortStaleFetchLoads(landedId) { 11925 let yeetedKeys = []; 11926 for (let [key, id2] of fetchReloadIds) { 11927 if (id2 < landedId) { 11928 let fetcher = state.fetchers.get(key); 11929 invariant(fetcher, `Expected fetcher: ${key}`); 11930 if (fetcher.state === "loading") { 11931 abortFetcher(key); 11932 fetchReloadIds.delete(key); 11933 yeetedKeys.push(key); 11934 } 11935 } 11936 } 11937 markFetchersDone(yeetedKeys); 11938 return yeetedKeys.length > 0; 11939 } 11940 function getBlocker(key, fn) { 11941 let blocker = state.blockers.get(key) || IDLE_BLOCKER; 11942 if (blockerFunctions.get(key) !== fn) { 11943 blockerFunctions.set(key, fn); 11944 } 11945 return blocker; 11946 } 11947 function deleteBlocker(key) { 11948 state.blockers.delete(key); 11949 blockerFunctions.delete(key); 11950 } 11951 function updateBlocker(key, newBlocker) { 11952 let blocker = state.blockers.get(key) || IDLE_BLOCKER; 11953 invariant( 11954 blocker.state === "unblocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "proceeding" || blocker.state === "blocked" && newBlocker.state === "unblocked" || blocker.state === "proceeding" && newBlocker.state === "unblocked", 11955 `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}` 11956 ); 11957 let blockers = new Map(state.blockers); 11958 blockers.set(key, newBlocker); 11959 updateState({ blockers }); 11960 } 11961 function shouldBlockNavigation({ 11962 currentLocation, 11963 nextLocation, 11964 historyAction 11965 }) { 11966 if (blockerFunctions.size === 0) { 11967 return; 11968 } 11969 if (blockerFunctions.size > 1) { 11970 warning(false, "A router only supports one blocker at a time"); 11971 } 11972 let entries = Array.from(blockerFunctions.entries()); 11973 let [blockerKey, blockerFunction] = entries[entries.length - 1]; 11974 let blocker = state.blockers.get(blockerKey); 11975 if (blocker && blocker.state === "proceeding") { 11976 return; 11977 } 11978 if (blockerFunction({ currentLocation, nextLocation, historyAction })) { 11979 return blockerKey; 11980 } 11981 } 11982 function handleNavigational404(pathname) { 11983 let error = getInternalRouterError(404, { pathname }); 11984 let routesToUse = inFlightDataRoutes || dataRoutes; 11985 let { matches, route } = getShortCircuitMatches(routesToUse); 11986 return { notFoundMatches: matches, route, error }; 11987 } 11988 function enableScrollRestoration(positions, getPosition, getKey) { 11989 savedScrollPositions2 = positions; 11990 getScrollPosition = getPosition; 11991 getScrollRestorationKey2 = getKey || null; 11992 if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) { 11993 initialScrollRestored = true; 11994 let y2 = getSavedScrollPosition(state.location, state.matches); 11995 if (y2 != null) { 11996 updateState({ restoreScrollPosition: y2 }); 11997 } 11998 } 11999 return () => { 12000 savedScrollPositions2 = null; 12001 getScrollPosition = null; 12002 getScrollRestorationKey2 = null; 12003 }; 12004 } 12005 function getScrollKey(location, matches) { 12006 if (getScrollRestorationKey2) { 12007 let key = getScrollRestorationKey2( 12008 location, 12009 matches.map((m2) => convertRouteMatchToUiMatch(m2, state.loaderData)) 12010 ); 12011 return key || location.key; 12012 } 12013 return location.key; 12014 } 12015 function saveScrollPosition(location, matches) { 12016 if (savedScrollPositions2 && getScrollPosition) { 12017 let key = getScrollKey(location, matches); 12018 savedScrollPositions2[key] = getScrollPosition(); 12019 } 12020 } 12021 function getSavedScrollPosition(location, matches) { 12022 if (savedScrollPositions2) { 12023 let key = getScrollKey(location, matches); 12024 let y2 = savedScrollPositions2[key]; 12025 if (typeof y2 === "number") { 12026 return y2; 12027 } 12028 } 12029 return null; 12030 } 12031 function checkFogOfWar(matches, routesToUse, pathname) { 12032 if (init.patchRoutesOnNavigation) { 12033 if (!matches) { 12034 let fogMatches = matchRoutesImpl( 12035 routesToUse, 12036 pathname, 12037 basename, 12038 true 12039 ); 12040 return { active: true, matches: fogMatches || [] }; 12041 } else { 12042 if (Object.keys(matches[0].params).length > 0) { 12043 let partialMatches = matchRoutesImpl( 12044 routesToUse, 12045 pathname, 12046 basename, 12047 true 12048 ); 12049 return { active: true, matches: partialMatches }; 12050 } 12051 } 12052 } 12053 return { active: false, matches: null }; 12054 } 12055 async function discoverRoutes(matches, pathname, signal, fetcherKey) { 12056 if (!init.patchRoutesOnNavigation) { 12057 return { type: "success", matches }; 12058 } 12059 let partialMatches = matches; 12060 while (true) { 12061 let isNonHMR = inFlightDataRoutes == null; 12062 let routesToUse = inFlightDataRoutes || dataRoutes; 12063 let localManifest = manifest;
12064 try { 12065 await init.patchRoutesOnNavigation({ 12066 signal, 12067 path: pathname, 12068 matches: partialMatches, 12069 fetcherKey, 12070 patch: (routeId, children) => { 12071 if (signal.aborted) return; 12072 patchRoutesImpl( 12073 routeId, 12074 children, 12075 routesToUse, 12076 localManifest, 12077 mapRouteProperties2, 12078 false 12079 ); 12080 } 12081 }); 12082 } catch (e) { 12083 return { type: "error", error: e, partialMatches }; 12084 } finally { 12085 if (isNonHMR && !signal.aborted) { 12086 dataRoutes = [...dataRoutes]; 12087 } 12088 } 12089 if (signal.aborted) { 12090 return { type: "aborted" }; 12091 } 12092 let newMatches = matchRoutes(routesToUse, pathname, basename); 12093 if (newMatches) { 12094 return { type: "success", matches: newMatches }; 12095 } 12096 let newPartialMatches = matchRoutesImpl( 12097 routesToUse, 12098 pathname, 12099 basename, 12100 true 12101 ); 12102 if (!newPartialMatches || partialMatches.length === newPartialMatches.length && partialMatches.every( 12103 (m2, i) => m2.route.id === newPartialMatches[i].route.id 12104 )) { 12105 return { type: "success", matches: null }; 12106 } 12107 partialMatches = newPartialMatches; 12108 } 12109 } 12110 function _internalSetRoutes(newRoutes) { 12111 manifest = {}; 12112 inFlightDataRoutes = convertRoutesToDataRoutes( 12113 newRoutes, 12114 mapRouteProperties2, 12115 void 0, 12116 manifest 12117 ); 12118 } 12119 function patchRoutes(routeId, children, unstable_allowElementMutations = false) { 12120 let isNonHMR = inFlightDataRoutes == null; 12121 let routesToUse = inFlightDataRoutes || dataRoutes; 12122 patchRoutesImpl( 12123 routeId, 12124 children, 12125 routesToUse, 12126 manifest, 12127 mapRouteProperties2, 12128 unstable_allowElementMutations 12129 ); 12130 if (isNonHMR) { 12131 dataRoutes = [...dataRoutes]; 12132 updateState({}); 12133 } 12134 } 12135 router2 = { 12136 get basename() { 12137 return basename; 12138 }, 12139 get future() { 12140 return future; 12141 }, 12142 get state() { 12143 return state; 12144 }, 12145 get routes() { 12146 return dataRoutes; 12147 }, 12148 get window() { 12149 return routerWindow; 12150 }, 12151 initialize, 12152 subscribe, 12153 enableScrollRestoration, 12154 navigate, 12155 fetch: fetch2, 12156 revalidate, 12157 // Passthrough to history-aware createHref used by useHref so we get proper 12158 // hash-aware URLs in DOM paths 12159 createHref: (to) => init.history.createHref(to), 12160 encodeLocation: (to) => init.history.encodeLocation(to), 12161 getFetcher, 12162 resetFetcher, 12163 deleteFetcher: queueFetcherForDeletion, 12164 dispose, 12165 getBlocker, 12166 deleteBlocker, 12167 patchRoutes, 12168 _internalFetchControllers: fetchControllers, 12169 // TODO: Remove setRoutes, it's temporary to avoid dealing with 12170 // updating the tree while validating the update algorithm. 12171 _internalSetRoutes, 12172 _internalSetStateDoNotUseOrYouWillBreakYourApp(newState) { 12173 updateState(newState); 12174 } 12175 }; 12176 return router2; 12177} 12178function isSubmissionNavigation(opts) { 12179 return opts != null && ("formData" in opts && opts.formData != null || "body" in opts && opts.body !== void 0); 12180} 12181function normalizeTo(location, matches, basename, to, fromRouteId, relative) { 12182 let contextualMatches; 12183 let activeRouteMatch; 12184 if (fromRouteId) { 12185 contextualMatches = []; 12186 for (let match of matches) { 12187 contextualMatches.push(match); 12188 if (match.route.id === fromRouteId) { 12189 activeRouteMatch = match; 12190 break; 12191 } 12192 } 12193 } else { 12194 contextualMatches = matches; 12195 activeRouteMatch = matches[matches.length - 1]; 12196 } 12197 let path = resolveTo( 12198 to ? to : ".", 12199 getResolveToMatches(contextualMatches), 12200 stripBasename(location.pathname, basename) || location.pathname, 12201 relative === "path" 12202 ); 12203 if (to == null) { 12204 path.search = location.search; 12205 path.hash = location.hash; 12206 } 12207 if ((to == null || to === "" || to === ".") && activeRouteMatch) { 12208 let nakedIndex = hasNakedIndexQuery(path.search); 12209 if (activeRouteMatch.route.index && !nakedIndex) { 12210 path.search = path.search ? path.search.replace(/^\?/, "?index&")
12210: "?index"; 12211 } else if (!activeRouteMatch.route.index && nakedIndex) { 12212 let params = new URLSearchParams(path.search); 12213 let indexValues = params.getAll("index"); 12214 params.delete("index"); 12215 indexValues.filter((v2) => v2).forEach((v2) => params.append("index", v2)); 12216 let qs = params.toString(); 12217 path.search = qs ? `?${qs}` : ""; 12218 } 12219 } 12220 if (basename !== "/") { 12221 path.pathname = prependBasename({ basename, pathname: path.pathname }); 12222 } 12223 return createPath(path); 12224} 12225function normalizeNavigateOptions(isFetcher, path, opts) { 12226 if (!opts || !isSubmissionNavigation(opts)) { 12227 return { path }; 12228 } 12229 if (opts.formMethod && !isValidMethod(opts.formMethod)) { 12230 return { 12231 path, 12232 error: getInternalRouterError(405, { method: opts.formMethod }) 12233 }; 12234 } 12235 let getInvalidBodyError = () => ({ 12236 path, 12237 error: getInternalRouterError(400, { type: "invalid-body" }) 12238 }); 12239 let rawFormMethod = opts.formMethod || "get"; 12240 let formMethod = rawFormMethod.toUpperCase(); 12241 let formAction = stripHashFromPath(path); 12242 if (opts.body !== void 0) { 12243 if (opts.formEncType === "text/plain") { 12244 if (!isMutationMethod(formMethod)) { 12245 return getInvalidBodyError(); 12246 } 12247 let text = typeof opts.body === "string" ? opts.body : opts.body instanceof FormData || opts.body instanceof URLSearchParams ? ( 12248 // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data 12249 Array.from(opts.body.entries()).reduce( 12250 (acc, [name, value]) => `${acc}${name}=${value} 12251`, 12252 "" 12253 ) 12254 ) : String(opts.body); 12255 return { 12256 path, 12257 submission: { 12258 formMethod, 12259 formAction, 12260 formEncType: opts.formEncType, 12261 formData: void 0, 12262 json: void 0, 12263 text 12264 } 12265 }; 12266 } else if (opts.formEncType === "application/json") { 12267 if (!isMutationMethod(formMethod)) { 12268 return getInvalidBodyError(); 12269 } 12270 try { 12271 let json = typeof opts.body === "string" ? JSON.parse(opts.body) : opts.body; 12272 return { 12273 path, 12274 submission: { 12275 formMethod, 12276 formAction, 12277 formEncType: opts.formEncType, 12278 formData: void 0, 12279 json, 12280 text: void 0 12281 } 12282 }; 12283 } catch (e) { 12284 return getInvalidBodyError(); 12285 } 12286 } 12287 } 12288 invariant( 12289 typeof FormData === "function", 12290 "FormData is not available in this environment" 12291 ); 12292 let searchParams; 12293 let formData; 12294 if (opts.formData) { 12295 searchParams = convertFormDataToSearchParams(opts.formData); 12296 formData = opts.formData; 12297 } else if (opts.body instanceof FormData) { 12298 searchParams = convertFormDataToSearchParams(opts.body); 12299 formData = opts.body; 12300 } else if (opts.body instanceof URLSearchParams) { 12301 searchParams = opts.body; 12302 formData = convertSearchParamsToFormData(searchParams); 12303 } else if (opts.body == null) { 12304 searchParams = new URLSearchParams(); 12305 formData = new FormData(); 12306 } else { 12307 try { 12308 searchParams = new URLSearchParams(opts.body); 12309 formData = convertSearchParamsToFormData(searchParams); 12310 } catch (e) { 12311 return getInvalidBodyError(); 12312 } 12313 } 12314 let submission = { 12315 formMethod, 12316 formAction, 12317 formEncType: opts && opts.formEncType || "application/x-www-form-urlencoded", 12318 formData, 12319 json: void 0, 12320 text: void 0 12321 }; 12322 if (isMutationMethod(submission.formMethod)) { 12323 return { path, submission }; 12324 } 12325 let parsedPath = parsePath(path); 12326 if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) { 12327 searchParams.append("index", ""); 12328 } 12329 parsedPath.search = `?${searchParams}`; 12330 return { path: createPath(parsedPath), submission }; 12331} 12332function getMatchesToLoad(request, scopedContext, mapRouteProperties2, manifest, history, state, matches, submission, location, lazyRoutePropertiesToSkip, initialHydration, isRevalidationRequired, cancelledFetcherLoads, fetchersQueuedForDeletion, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, hasPatchRoutesOnNavigation, pendingActionResult) { 12333 let actionResult = pendingActionResult ? isErrorResult(pendingActionResult[1]) ? pe
12333ndingActionResult[1].error : pendingActionResult[1].data : void 0; 12334 let currentUrl = history.createURL(state.location); 12335 let nextUrl = history.createURL(location); 12336 let maxIdx; 12337 if (initialHydration && state.errors) { 12338 let boundaryId = Object.keys(state.errors)[0]; 12339 maxIdx = matches.findIndex((m2) => m2.route.id === boundaryId); 12340 } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) { 12341 let boundaryId = pendingActionResult[0]; 12342 maxIdx = matches.findIndex((m2) => m2.route.id === boundaryId) - 1; 12343 } 12344 let actionStatus = pendingActionResult ? pendingActionResult[1].statusCode : void 0; 12345 let shouldSkipRevalidation = actionStatus && actionStatus >= 400; 12346 let baseShouldRevalidateArgs = { 12347 currentUrl, 12348 currentParams: state.matches[0]?.params || {}, 12349 nextUrl, 12350 nextParams: matches[0].params, 12351 ...submission, 12352 actionResult, 12353 actionStatus 12354 }; 12355 let dsMatches = matches.map((match, index) => { 12356 let { route } = match; 12357 let forceShouldLoad = null; 12358 if (maxIdx != null && index > maxIdx) { 12359 forceShouldLoad = false; 12360 } else if (route.lazy) { 12361 forceShouldLoad = true; 12362 } else if (!routeHasLoaderOrMiddleware(route)) { 12363 forceShouldLoad = false; 12364 } else if (initialHydration) { 12365 forceShouldLoad = shouldLoadRouteOnHydration( 12366 route, 12367 state.loaderData, 12368 state.errors 12369 ); 12370 } else if (isNewLoader(state.loaderData, state.matches[index], match)) { 12371 forceShouldLoad = true; 12372 } 12373 if (forceShouldLoad !== null) { 12374 return getDataStrategyMatch( 12375 mapRouteProperties2, 12376 manifest, 12377 request, 12378 match, 12379 lazyRoutePropertiesToSkip, 12380 scopedContext, 12381 forceShouldLoad 12382 ); 12383 } 12384 let defaultShouldRevalidate = shouldSkipRevalidation ? false : ( 12385 // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate 12386 isRevalidationRequired || currentUrl.pathname + currentUrl.search === nextUrl.pathname + nextUrl.search || // Search params affect all loaders 12387 currentUrl.search !== nextUrl.search || isNewRouteInstance(state.matches[index], match) 12388 ); 12389 let shouldRevalidateArgs = { 12390 ...baseShouldRevalidateArgs, 12391 defaultShouldRevalidate 12392 }; 12393 let shouldLoad = shouldRevalidateLoader(match, shouldRevalidateArgs); 12394 return getDataStrategyMatch( 12395 mapRouteProperties2, 12396 manifest, 12397 request, 12398 match, 12399 lazyRoutePropertiesToSkip, 12400 scopedContext, 12401 shouldLoad, 12402 shouldRevalidateArgs 12403 ); 12404 }); 12405 let revalidatingFetchers = []; 12406 fetchLoadMatches.forEach((f2, key) => { 12407 if (initialHydration || !matches.some((m2) => m2.route.id === f2.routeId) || fetchersQueuedForDeletion.has(key)) { 12408 return; 12409 } 12410 let fetcher = state.fetchers.get(key); 12411 let isMidInitialLoad = fetcher && fetcher.state !== "idle" && fetcher.data === void 0; 12412 let fetcherMatches = matchRoutes(routesToUse, f2.path, basename); 12413 if (!fetcherMatches) { 12414 if (hasPatchRoutesOnNavigation && isMidInitialLoad) { 12415 return; 12416 } 12417 revalidatingFetchers.push({ 12418 key, 12419 routeId: f2.routeId, 12420 path: f2.path, 12421 matches: null, 12422 match: null, 12423 request: null, 12424 controller: null 12425 }); 12426 return; 12427 } 12428 if (fetchRedirectIds.has(key)) { 12429 return; 12430 } 12431 let fetcherMatch = getTargetMatch(fetcherMatches, f2.path); 12432 let fetchController = new AbortController(); 12433 let fetchRequest = createClientSideRequest( 12434 history, 12435 f2.path, 12436 fetchController.signal 12437 ); 12438 let fetcherDsMatches = null; 12439 if (cancelledFetcherLoads.has(key)) { 12440 cancelledFetcherLoads.delete(key); 12441 fetcherDsMatches = getTargetedDataStrategyMatches( 12442 mapRouteProperties2, 12443 manifest, 12444 fetchRequest, 12445 fetcherMatches, 12446 fetcherMatch, 12447 lazyRoutePropertiesToSkip, 12448 scopedContext 12449 ); 12450 } else if (isMidInitialLoad) { 12451 if (isRevalidationRequired) { 12452 fetcherDsMatches = getTargetedDataStrategyMatches( 12453 mapRouteProperties2, 12454 manifest, 12455 fetchRequest, 12456 fetcherMatches, 12457 fetcherMatch, 12458 lazyRoutePropertiesToSkip, 12459 scopedContext 12460 ); 12461 } 12462 } else { 12463 let shouldRevalidateArgs = { 12464 ...baseShouldRevalidateArgs, 12465 defaultShouldRevalidate: shouldSkipRevalidation ? false : isRevalidationRequired 12466 }; 12467 if (shouldRevalidateLoader(fetcherMatch, shouldRevalidateArgs)) { 12468 fetcherDsMatches = getTargetedDataStrategyMatches( 12469 mapRouteProperties2, 12470 manifest, 12471 fetchRequest, 12472 fetcherMatches, 12473 fetcherMatch, 12474 lazyRoutePropertiesToSkip, 12475 scopedContext, 12476 shouldRevalidateArgs 12477 ); 12478 } 12479 } 12480 if (fetcherDsMatches) { 12481 revalidatingFetchers.push({ 12482 key, 12483 routeId: f2.routeId, 12484 path: f2.path, 12485 matches: fetcherDsMatches, 12486 match: fetcherMatch, 12487 request: fetchRequest, 12488 controller: fetchController 12489 }); 12490 } 12491 }); 12492 return { dsMatches, revalidatingFetchers }; 12493} 12494function routeHasLoaderOrMiddleware(route) { 12495 return route.loader != null || route.middleware != null && route.middleware.length > 0; 12496} 12497function shouldLoadRouteOnHydration(route, loaderData, errors) { 12498 if (route.lazy) { 12499 return true; 12500 } 12501 if (!routeHasLoaderOrMiddleware(route)) { 12502 return false;
12503 } 12504 let hasData = loaderData != null && route.id in loaderData; 12505 let hasError = errors != null && errors[route.id] !== void 0; 12506 if (!hasData && hasError) { 12507 return false; 12508 } 12509 if (typeof route.loader === "function" && route.loader.hydrate === true) { 12510 return true; 12511 } 12512 return !hasData && !hasError; 12513} 12514function isNewLoader(currentLoaderData, currentMatch, match) { 12515 let isNew = ( 12516 // [a] -> [a, b] 12517 !currentMatch || // [a, b] -> [a, c] 12518 match.route.id !== currentMatch.route.id 12519 ); 12520 let isMissingData = !currentLoaderData.hasOwnProperty(match.route.id); 12521 return isNew || isMissingData; 12522} 12523function isNewRouteInstance(currentMatch, match) { 12524 let currentPath = currentMatch.route.path; 12525 return ( 12526 // param change for this match, /users/123 -> /users/456 12527 currentMatch.pathname !== match.pathname || // splat param changed, which is not present in match.path 12528 // e.g. /files/images/avatar.jpg -> files/finances.xls 12529 currentPath != null && currentPath.endsWith("*") && currentMatch.params["*"] !== match.params["*"] 12530 ); 12531} 12532function shouldRevalidateLoader(loaderMatch, arg) { 12533 if (loaderMatch.route.shouldRevalidate) { 12534 let routeChoice = loaderMatch.route.shouldRevalidate(arg); 12535 if (typeof routeChoice === "boolean") { 12536 return routeChoice; 12537 } 12538 } 12539 return arg.defaultShouldRevalidate; 12540} 12541function patchRoutesImpl(routeId, children, routesToUse, manifest, mapRouteProperties2, allowElementMutations) { 12542 let childrenToPatch; 12543 if (routeId) { 12544 let route = manifest[routeId]; 12545 invariant( 12546 route, 12547 `No route found to patch children into: routeId = ${routeId}` 12548 ); 12549 if (!route.children) { 12550 route.children = []; 12551 } 12552 childrenToPatch = route.children; 12553 } else { 12554 childrenToPatch = routesToUse; 12555 } 12556 let uniqueChildren = []; 12557 let existingChildren = []; 12558 children.forEach((newRoute) => { 12559 let existingRoute = childrenToPatch.find( 12560 (existingRoute2) => isSameRoute(newRoute, existingRoute2) 12561 ); 12562 if (existingRoute) { 12563 existingChildren.push({ existingRoute, newRoute }); 12564 } else { 12565 uniqueChildren.push(newRoute); 12566 } 12567 }); 12568 if (uniqueChildren.length > 0) { 12569 let newRoutes = convertRoutesToDataRoutes( 12570 uniqueChildren, 12571 mapRouteProperties2, 12572 [routeId || "_", "patch", String(childrenToPatch?.length || "0")], 12573 manifest 12574 ); 12575 childrenToPatch.push(...newRoutes); 12576 } 12577 if (allowElementMutations && existingChildren.length > 0) { 12578 for (let i = 0; i < existingChildren.length; i++) { 12579 let { existingRoute, newRoute } = existingChildren[i]; 12580 let existingRouteTyped = existingRoute; 12581 let [newRouteTyped] = convertRoutesToDataRoutes( 12582 [newRoute], 12583 mapRouteProperties2, 12584 [], 12585 // Doesn't matter for mutated routes since they already have an id 12586 {}, 12587 // Don't touch the manifest here since we're updating in place 12588 true 12589 ); 12590 Object.assign(existingRouteTyped, { 12591 element: newRouteTyped.element ? newRouteTyped.element : existingRouteTyped.element, 12592 errorElement: newRouteTyped.errorElement ? newRouteTyped.errorElement : existingRouteTyped.errorElement, 12593 hydrateFallbackElement: newRouteTyped.hydrateFallbackElement ? newRouteTyped.hydrateFallbackElement : existingRouteTyped.hydrateFallbackElement 12594 }); 12595 } 12596 } 12597} 12598function isSameRoute(newRoute, existingRoute) { 12599 if ("id" in newRoute && "id" in existingRoute && newRoute.id === existingRoute.id) { 12600 return true; 12601 } 12602 if (!(newRoute.index === existingRoute.index && newRoute.path === existingRoute.path && newRoute.caseSensitive === existingRoute.caseSensitive)) { 12603 return false; 12604 } 12605 if ((!newRoute.children || newRoute.children.length === 0) && (!existingRoute.children || existingRoute.children.length === 0)) { 12606 return true; 12607 } 12608 return newRoute.children.every( 12609 (aChild, i) => existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild)) 12610 ); 12611} 12612var lazyRoutePropertyCache = /* @__PURE__ */ new WeakMap(); 12613var loadLazyRouteProperty = ({ 12614 key, 12615 route, 12616 manifest, 12617 mapRouteProperties: mapRouteProperties2 12618}) => { 12619 let routeToUpdate = manifest[route.id]; 12620 invariant(routeToUpdate, "No route found in manifest"); 12621 if (!routeToUpdate.lazy || typeof routeToUpdate.lazy !== "object") { 12622 return; 12623 } 12624 let lazyFn = routeToUpdate.lazy[key]; 12625 if (!lazyFn) { 12626 return; 12627 } 12628 let cache = lazyRoutePropertyCache.get(routeToUpdate); 12629 if (!cache) { 12630 cache = {}; 12631 lazyRoutePropertyCache.set(routeToUpdate, cache); 12632 }
12633 let cachedPromise = cache[key]; 12634 if (cachedPromise) { 12635 return cachedPromise; 12636 } 12637 let propertyPromise = (async () => { 12638 let isUnsupported = isUnsupportedLazyRouteObjectKey(key); 12639 let staticRouteValue = routeToUpdate[key]; 12640 let isStaticallyDefined = staticRouteValue !== void 0 && key !== "hasErrorBoundary"; 12641 if (isUnsupported) { 12642 warning( 12643 !isUnsupported, 12644 "Route property " + key + " is not a supported lazy route property. This property will be ignored." 12645 ); 12646 cache[key] = Promise.resolve(); 12647 } else if (isStaticallyDefined) { 12648 warning( 12649 false, 12650 `Route "${routeToUpdate.id}" has a static property "${key}" defined. The lazy property will be ignored.` 12651 ); 12652 } else { 12653 let value = await lazyFn(); 12654 if (value != null) { 12655 Object.assign(routeToUpdate, { [key]: value }); 12656 Object.assign(routeToUpdate, mapRouteProperties2(routeToUpdate)); 12657 } 12658 } 12659 if (typeof routeToUpdate.lazy === "object") { 12660 routeToUpdate.lazy[key] = void 0; 12661 if (Object.values(routeToUpdate.lazy).every((value) => value === void 0)) { 12662 routeToUpdate.lazy = void 0; 12663 } 12664 } 12665 })(); 12666 cache[key] = propertyPromise; 12667 return propertyPromise; 12668}; 12669var lazyRouteFunctionCache = /* @__PURE__ */ new WeakMap(); 12670function loadLazyRoute(route, type, manifest, mapRouteProperties2, lazyRoutePropertiesToSkip) { 12671 let routeToUpdate = manifest[route.id]; 12672 invariant(routeToUpdate, "No route found in manifest"); 12673 if (!route.lazy) { 12674 return { 12675 lazyRoutePromise: void 0, 12676 lazyHandlerPromise: void 0 12677 }; 12678 } 12679 if (typeof route.lazy === "function") { 12680 let cachedPromise = lazyRouteFunctionCache.get(routeToUpdate); 12681 if (cachedPromise) { 12682 return { 12683 lazyRoutePromise: cachedPromise, 12684 lazyHandlerPromise: cachedPromise 12685 }; 12686 } 12687 let lazyRoutePromise2 = (async () => { 12688 invariant( 12689 typeof route.lazy === "function", 12690 "No lazy route function found" 12691 ); 12692 let lazyRoute = await route.lazy(); 12693 let routeUpdates = {}; 12694 for (let lazyRouteProperty in lazyRoute) { 12695 let lazyValue = lazyRoute[lazyRouteProperty]; 12696 if (lazyValue === void 0) { 12697 continue; 12698 } 12699 let isUnsupported = isUnsupportedLazyRouteFunctionKey(lazyRouteProperty); 12700 let staticRouteValue = routeToUpdate[lazyRouteProperty]; 12701 let isStaticallyDefined = staticRouteValue !== void 0 && // This property isn't static since it should always be updated based 12702 // on the route updates 12703 lazyRouteProperty !== "hasErrorBoundary"; 12704 if (isUnsupported) { 12705 warning( 12706 !isUnsupported, 12707 "Route property " + lazyRouteProperty + " is not a supported property to be returned from a lazy route function. This property will be ignored." 12708 ); 12709 } else if (isStaticallyDefined) { 12710 warning( 12711 !isStaticallyDefined, 12712 `Route "${routeToUpdate.id}" has a static property "${lazyRouteProperty}" defined but its lazy function is also returning a value for this property. The lazy route property "${lazyRouteProperty}" will be ignored.` 12713 ); 12714 } else { 12715 routeUpdates[lazyRouteProperty] = lazyValue; 12716 } 12717 } 12718 Object.assign(routeToUpdate, routeUpdates); 12719 Object.assign(routeToUpdate, { 12720 // To keep things framework agnostic, we use the provided `mapRouteProperties` 12721 // function to set the framework-aware properties (`element`/`hasErrorBoundary`) 12722 // since the logic will differ between frameworks. 12723 ...mapRouteProperties2(routeToUpdate), 12724 lazy: void 0 12725 }); 12726 })(); 12727 lazyRouteFunctionCache.set(routeToUpdate, lazyRoutePromise2); 12728 lazyRoutePromise2.catch(() => { 12729 }); 12730 return { 12731 lazyRoutePromise: lazyRoutePromise2, 12732 lazyHandlerPromise: lazyRoutePromise2 12733 }; 12734 } 12735 let lazyKeys = Object.keys(route.lazy); 12736 let lazyPropertyPromises = []; 12737 let lazyHandlerPromise = void 0; 12738 for (let key of lazyKeys) { 12739 if (lazyRoutePropertiesToSkip && lazyRoutePropertiesToSkip.includes(key)) { 12740 continue; 12741 } 12742 let promise = loadLazyRouteProperty({ 12743 key, 12744 route, 12745 manifest, 12746 mapRouteProperties: mapRouteProperties2 12747 }); 12748 if (promise) { 12749 lazyPropertyPromises.push(promise); 12750 if (key === type) { 12751 lazyHandlerPromise = promise; 12752 } 12753 } 12754 } 12755 let lazyRoutePromise = lazyPropertyPromises.length > 0 ? Promise.all(lazyPropertyPromises).then(() => { 12756 }) : void 0; 12757 lazyRoutePromise?.catch(() => { 12758 }); 12759 lazyHandlerPromise?.catch(() => { 12760 }); 12761 return { 12762 lazyRoutePromise, 12763 lazyHandlerPromise 12764 }; 12765} 12766async function defaultDataStrategy(args) { 12767 let matchesToLoad = args.matches.filter((m2) => m2.shouldLoad); 12768 let keyedResults = {}; 12769 let results = await Promise.all(matchesToLoad.map((m2) => m2.resolve()));
12770 results.forEach((result, i) => { 12771 keyedResults[matchesToLoad[i].route.id] = result; 12772 }); 12773 return keyedResults; 12774} 12775async function defaultDataStrategyWithMiddleware(args) { 12776 if (!args.matches.some((m2) => m2.route.middleware)) { 12777 return defaultDataStrategy(args); 12778 } 12779 return runClientMiddlewarePipeline(args, () => defaultDataStrategy(args)); 12780} 12781function runClientMiddlewarePipeline(args, handler) { 12782 return runMiddlewarePipeline( 12783 args, 12784 handler, 12785 (r2) => r2, 12786 // No post-processing needed on the client 12787 isDataStrategyResults, 12788 errorHandler 12789 ); 12790 function errorHandler(error, routeId, nextResult) { 12791 if (nextResult) { 12792 return Promise.resolve( 12793 Object.assign(nextResult.value, { 12794 [routeId]: { type: "error", result: error } 12795 }) 12796 ); 12797 } else { 12798 let { matches } = args; 12799 let maxBoundaryIdx = Math.min( 12800 // Throwing route 12801 Math.max( 12802 matches.findIndex((m2) => m2.route.id === routeId), 12803 0 12804 ), 12805 // or the shallowest route that needs to load data 12806 Math.max( 12807 matches.findIndex((m2) => m2.unstable_shouldCallHandler()), 12808 0 12809 ) 12810 ); 12811 let boundaryRouteId = findNearestBoundary( 12812 matches, 12813 matches[maxBoundaryIdx].route.id 12814 ).route.id; 12815 return Promise.resolve({ 12816 [boundaryRouteId]: { type: "error", result: error } 12817 }); 12818 } 12819 } 12820} 12821async function runMiddlewarePipeline(args, handler, processResult, isResult, errorHandler) { 12822 let { matches, request, params, context } = args; 12823 let tuples = matches.flatMap( 12824 (m2) => m2.route.middleware ? m2.route.middleware.map((fn) => [m2.route.id, fn]) : [] 12825 ); 12826 let result = await callRouteMiddleware( 12827 { request, params, context }, 12828 tuples, 12829 handler, 12830 processResult, 12831 isResult, 12832 errorHandler 12833 ); 12834 return result; 12835} 12836async function callRouteMiddleware(args, middlewares, handler, processResult, isResult, errorHandler, idx = 0) { 12837 let { request } = args; 12838 if (request.signal.aborted) { 12839 throw request.signal.reason ?? new Error(`Request aborted: ${request.method} ${request.url}`); 12840 } 12841 let tuple = middlewares[idx]; 12842 if (!tuple) { 12843 let result = await handler(); 12844 return result; 12845 } 12846 let [routeId, middleware] = tuple; 12847 let nextResult; 12848 let next = async () => { 12849 if (nextResult) { 12850 throw new Error("You may only call `next()` once per middleware"); 12851 } 12852 try { 12853 let result = await callRouteMiddleware( 12854 args, 12855 middlewares, 12856 handler, 12857 processResult, 12858 isResult, 12859 errorHandler, 12860 idx + 1 12861 ); 12862 nextResult = { value: result }; 12863 return nextResult.value; 12864 } catch (error) { 12865 nextResult = { value: await errorHandler(error, routeId, nextResult) }; 12866 return nextResult.value; 12867 } 12868 }; 12869 try { 12870 let value = await middleware(args, next); 12871 let result = value != null ? processResult(value) : void 0; 12872 if (isResult(result)) { 12873 return result; 12874 } else if (nextResult) { 12875 return result ?? nextResult.value; 12876 } else { 12877 nextResult = { value: await next() }; 12878 return nextResult.value; 12879 } 12880 } catch (error) { 12881 let response = await errorHandler(error, routeId, nextResult); 12882 return response; 12883 } 12884} 12885function getDataStrategyMatchLazyPromises(mapRouteProperties2, manifest, request, match, lazyRoutePropertiesToSkip) { 12886 let lazyMiddlewarePromise = loadLazyRouteProperty({ 12887 key: "middleware", 12888 route: match.route, 12889 manifest, 12890 mapRouteProperties: mapRouteProperties2 12891 }); 12892 let lazyRoutePromises = loadLazyRoute( 12893 match.route, 12894 isMutationMethod(request.method) ? "action" : "loader", 12895 manifest, 12896 mapRouteProperties2, 12897 lazyRoutePropertiesToSkip 12898 ); 12899 return { 12900 middleware: lazyMiddlewarePromise, 12901 route: lazyRoutePromises.lazyRoutePromise, 12902 handler: lazyRoutePromises.lazyHandlerPromise 12903 }; 12904} 12905function getDataStrategyMatch(mapRouteProperties2, manifest, request, match, lazyRoutePropertiesToSkip, scopedContext, shouldLoad, unstable_shouldRevalidateArgs = null) { 12906 let isUsingNewApi = false;
12907 let _lazyPromises = getDataStrategyMatchLazyPromises( 12908 mapRouteProperties2, 12909 manifest, 12910 request, 12911 match, 12912 lazyRoutePropertiesToSkip 12913 ); 12914 return { 12915 ...match, 12916 _lazyPromises, 12917 shouldLoad, 12918 unstable_shouldRevalidateArgs, 12919 unstable_shouldCallHandler(defaultShouldRevalidate) { 12920 isUsingNewApi = true; 12921 if (!unstable_shouldRevalidateArgs) { 12922 return shouldLoad; 12923 } 12924 if (typeof defaultShouldRevalidate === "boolean") { 12925 return shouldRevalidateLoader(match, { 12926 ...unstable_shouldRevalidateArgs, 12927 defaultShouldRevalidate 12928 }); 12929 } 12930 return shouldRevalidateLoader(match, unstable_shouldRevalidateArgs); 12931 }, 12932 resolve(handlerOverride) { 12933 let { lazy, loader, middleware } = match.route; 12934 let callHandler = isUsingNewApi || shouldLoad || handlerOverride && !isMutationMethod(request.method) && (lazy || loader); 12935 let isMiddlewareOnlyRoute = middleware && middleware.length > 0 && !loader && !lazy; 12936 if (callHandler && !isMiddlewareOnlyRoute) { 12937 return callLoaderOrAction({ 12938 request, 12939 match, 12940 lazyHandlerPromise: _lazyPromises?.handler, 12941 lazyRoutePromise: _lazyPromises?.route, 12942 handlerOverride, 12943 scopedContext 12944 }); 12945 } 12946 return Promise.resolve({ type: "data", result: void 0 }); 12947 } 12948 }; 12949} 12950function getTargetedDataStrategyMatches(mapRouteProperties2, manifest, request, matches, targetMatch, lazyRoutePropertiesToSkip, scopedContext, shouldRevalidateArgs = null) { 12951 return matches.map((match) => { 12952 if (match.route.id !== targetMatch.route.id) { 12953 return { 12954 ...match, 12955 shouldLoad: false, 12956 unstable_shouldRevalidateArgs: shouldRevalidateArgs, 12957 unstable_shouldCallHandler: () => false, 12958 _lazyPromises: getDataStrategyMatchLazyPromises( 12959 mapRouteProperties2, 12960 manifest, 12961 request, 12962 match, 12963 lazyRoutePropertiesToSkip 12964 ), 12965 resolve: () => Promise.resolve({ type: "data", result: void 0 }) 12966 }; 12967 } 12968 return getDataStrategyMatch( 12969 mapRouteProperties2, 12970 manifest, 12971 request, 12972 match, 12973 lazyRoutePropertiesToSkip, 12974 scopedContext, 12975 true, 12976 shouldRevalidateArgs 12977 ); 12978 }); 12979} 12980async function callDataStrategyImpl(dataStrategyImpl, request, matches, fetcherKey, scopedContext, isStaticHandler) { 12981 if (matches.some((m2) => m2._lazyPromises?.middleware)) { 12982 await Promise.all(matches.map((m2) => m2._lazyPromises?.middleware)); 12983 } 12984 let dataStrategyArgs = { 12985 request, 12986 params: matches[0].params, 12987 context: scopedContext, 12988 matches 12989 }; 12990 let runClientMiddleware = (cb2) => { 12991 let typedDataStrategyArgs = dataStrategyArgs; 12992 return runClientMiddlewarePipeline(typedDataStrategyArgs, () => { 12993 return cb2({ 12994 ...typedDataStrategyArgs, 12995 fetcherKey, 12996 runClientMiddleware: () => { 12997 throw new Error( 12998 "Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler" 12999 ); 13000 } 13001 }); 13002 }); 13003 }; 13004 let results = await dataStrategyImpl({ 13005 ...dataStrategyArgs, 13006 fetcherKey, 13007 runClientMiddleware 13008 }); 13009 try { 13010 await Promise.all( 13011 matches.flatMap((m2) => [ 13012 m2._lazyPromises?.handler, 13013 m2._lazyPromises?.route 13014 ]) 13015 ); 13016 } catch (e) { 13017 } 13018 return results; 13019} 13020async function callLoaderOrAction({ 13021 request, 13022 match, 13023 lazyHandlerPromise, 13024 lazyRoutePromise, 13025 handlerOverride, 13026 scopedContext 13027}) { 13028 let result; 13029 let onReject; 13030 let isAction = isMutationMethod(request.method); 13031 let type = isAction ? "action" : "loader"; 13032 let runHandler = (handler) => { 13033 let reject; 13034 let abortPromise = new Promise((_, r2) => reject = r2); 13035 onReject = () => reject(); 13036 request.signal.addEventListener("abort", onReject); 13037 let actualHandler = (ctx) => { 13038 if (typeof handler !== "function") { 13039 return Promise.reject( 13040 new Error( 13041 `You cannot call the handler for a route which defines a boolean "${type}" [routeId: ${match.route.id}]` 13042 ) 13043 ); 13044 } 13045 return handler( 13046 { 13047 request, 13048 params: match.params, 13049 context: scopedContext 13050 }, 13051 ...ctx !== void 0 ? [ctx] : [] 13052 ); 13053 }; 13054 let handlerPromise = (async () => {
13055 try { 13056 let val = await (handlerOverride ? handlerOverride((ctx) => actualHandler(ctx)) : actualHandler()); 13057 return { type: "data", result: val }; 13058 } catch (e) { 13059 return { type: "error", result: e }; 13060 } 13061 })(); 13062 return Promise.race([handlerPromise, abortPromise]); 13063 }; 13064 try { 13065 let handler = isAction ? match.route.action : match.route.loader; 13066 if (lazyHandlerPromise || lazyRoutePromise) { 13067 if (handler) { 13068 let handlerError; 13069 let [value] = await Promise.all([ 13070 // If the handler throws, don't let it immediately bubble out, 13071 // since we need to let the lazy() execution finish so we know if this 13072 // route has a boundary that can handle the error 13073 runHandler(handler).catch((e) => { 13074 handlerError = e; 13075 }), 13076 // Ensure all lazy route promises are resolved before continuing 13077 lazyHandlerPromise, 13078 lazyRoutePromise 13079 ]); 13080 if (handlerError !== void 0) { 13081 throw handlerError; 13082 } 13083 result = value; 13084 } else { 13085 await lazyHandlerPromise; 13086 let handler2 = isAction ? match.route.action : match.route.loader; 13087 if (handler2) { 13088 [result] = await Promise.all([runHandler(handler2), lazyRoutePromise]); 13089 } else if (type === "action") { 13090 let url = new URL(request.url); 13091 let pathname = url.pathname + url.search; 13092 throw getInternalRouterError(405, { 13093 method: request.method, 13094 pathname, 13095 routeId: match.route.id 13096 }); 13097 } else { 13098 return { type: "data", result: void 0 }; 13099 } 13100 } 13101 } else if (!handler) { 13102 let url = new URL(request.url); 13103 let pathname = url.pathname + url.search; 13104 throw getInternalRouterError(404, { 13105 pathname 13106 }); 13107 } else { 13108 result = await runHandler(handler); 13109 } 13110 } catch (e) { 13111 return { type: "error", result: e }; 13112 } finally { 13113 if (onReject) { 13114 request.signal.removeEventListener("abort", onReject); 13115 } 13116 } 13117 return result; 13118} 13119async function parseResponseBody(response) { 13120 let contentType = response.headers.get("Content-Type"); 13121 if (contentType && /\bapplication\/json\b/.test(contentType)) { 13122 return response.body == null ? null : response.json(); 13123 } 13124 return response.text(); 13125} 13126async function convertDataStrategyResultToDataResult(dataStrategyResult) { 13127 let { result, type } = dataStrategyResult; 13128 if (isResponse(result)) { 13129 let data2; 13130 try { 13131 data2 = await parseResponseBody(result); 13132 } catch (e) { 13133 return { type: "error", error: e }; 13134 } 13135 if (type === "error") { 13136 return { 13137 type: "error", 13138 error: new ErrorResponseImpl(result.status, result.statusText, data2), 13139 statusCode: result.status, 13140 headers: result.headers 13141 }; 13142 } 13143 return { 13144 type: "data", 13145 data: data2, 13146 statusCode: result.status, 13147 headers: result.headers 13148 }; 13149 } 13150 if (type === "error") { 13151 if (isDataWithResponseInit(result)) { 13152 if (result.data instanceof Error) { 13153 return { 13154 type: "error", 13155 error: result.data, 13156 statusCode: result.init?.status, 13157 headers: result.init?.headers ? new Headers(result.init.headers) : void 0 13158 }; 13159 } 13160 return { 13161 type: "error", 13162 error: new ErrorResponseImpl( 13163 result.init?.status || 500, 13164 void 0, 13165 result.data 13166 ), 13167 statusCode: isRouteErrorResponse(result) ? result.status : void 0, 13168 headers: result.init?.headers ? new Headers(result.init.headers) : void 0 13169 }; 13170 } 13171 return { 13172 type: "error", 13173 error: result, 13174 statusCode: isRouteErrorResponse(result) ? result.status : void 0 13175 }; 13176 } 13177 if (isDataWithResponseInit(result)) { 13178 return { 13179 type: "data", 13180 data: result.data, 13181 statusCode: result.init?.status, 13182 headers: result.init?.headers ? new Headers(result.init.headers) : void 0 13183 }; 13184 } 13185 return { type: "data", data: result }; 13186} 13187function normalizeRelativeRoutingRedirectResponse(response, request, routeId, matches, basename) { 13188 let location = response.headers.get("Location"); 13189 invariant( 13190 location, 13191 "Redirects returned/thrown from loaders/actions must have a Location header" 13192 ); 13193 if (!isAbsoluteUrl(location)) { 13194 let trimmedMatches = matches.slice( 13195 0, 13196 matches.findIndex((m2) => m2.route.id === routeId) + 1 13197 ); 13198 location = normalizeTo( 13199 new URL(request.url), 13200 trimmedMatches, 13201 basename, 13202 location 13203 ); 13204 response.headers.set("Location", location); 13205 } 13206 return response; 13207} 13208function normalizeRedirectLocation(location, currentUrl, basename) { 13209 if (isAbsoluteUrl(location)) { 13210 let normalizedLocation = location; 13211 let url = normalizedLocation.startsWith("//") ? new URL(currentUrl.protocol + normalizedLocation) : new URL(normalizedLocation);
13212 let isSameBasename = stripBasename(url.pathname, basename) != null; 13213 if (url.origin === currentUrl.origin && isSameBasename) { 13214 return url.pathname + url.search + url.hash; 13215 } 13216 } 13217 return location; 13218} 13219function createClientSideRequest(history, location, signal, submission) { 13220 let url = history.createURL(stripHashFromPath(location)).toString(); 13221 let init = { signal }; 13222 if (submission && isMutationMethod(submission.formMethod)) { 13223 let { formMethod, formEncType } = submission; 13224 init.method = formMethod.toUpperCase(); 13225 if (formEncType === "application/json") { 13226 init.headers = new Headers({ "Content-Type": formEncType }); 13227 init.body = JSON.stringify(submission.json); 13228 } else if (formEncType === "text/plain") { 13229 init.body = submission.text; 13230 } else if (formEncType === "application/x-www-form-urlencoded" && submission.formData) { 13231 init.body = convertFormDataToSearchParams(submission.formData); 13232 } else { 13233 init.body = submission.formData; 13234 } 13235 } 13236 return new Request(url, init); 13237} 13238function convertFormDataToSearchParams(formData) { 13239 let searchParams = new URLSearchParams(); 13240 for (let [key, value] of formData.entries()) { 13241 searchParams.append(key, typeof value === "string" ? value : value.name); 13242 } 13243 return searchParams; 13244} 13245function convertSearchParamsToFormData(searchParams) { 13246 let formData = new FormData(); 13247 for (let [key, value] of searchParams.entries()) { 13248 formData.append(key, value); 13249 } 13250 return formData; 13251} 13252function processRouteLoaderData(matches, results, pendingActionResult, isStaticHandler = false, skipLoaderErrorBubbling = false) { 13253 let loaderData = {}; 13254 let errors = null; 13255 let statusCode; 13256 let foundError = false; 13257 let loaderHeaders = {}; 13258 let pendingError = pendingActionResult && isErrorResult(pendingActionResult[1]) ? pendingActionResult[1].error : void 0; 13259 matches.forEach((match) => { 13260 if (!(match.route.id in results)) { 13261 return; 13262 } 13263 let id2 = match.route.id; 13264 let result = results[id2]; 13265 invariant( 13266 !isRedirectResult(result), 13267 "Cannot handle redirect results in processLoaderData" 13268 ); 13269 if (isErrorResult(result)) { 13270 let error = result.error; 13271 if (pendingError !== void 0) { 13272 error = pendingError; 13273 pendingError = void 0; 13274 } 13275 errors = errors || {}; 13276 if (skipLoaderErrorBubbling) { 13277 errors[id2] = error; 13278 } else { 13279 let boundaryMatch = findNearestBoundary(matches, id2); 13280 if (errors[boundaryMatch.route.id] == null) { 13281 errors[boundaryMatch.route.id] = error; 13282 } 13283 } 13284 if (!isStaticHandler) { 13285 loaderData[id2] = ResetLoaderDataSymbol; 13286 } 13287 if (!foundError) { 13288 foundError = true; 13289 statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500; 13290 } 13291 if (result.headers) { 13292 loaderHeaders[id2] = result.headers; 13293 } 13294 } else { 13295 loaderData[id2] = result.data; 13296 if (result.statusCode && result.statusCode !== 200 && !foundError) { 13297 statusCode = result.statusCode; 13298 } 13299 if (result.headers) { 13300 loaderHeaders[id2] = result.headers; 13301 } 13302 } 13303 }); 13304 if (pendingError !== void 0 && pendingActionResult) { 13305 errors = { [pendingActionResult[0]]: pendingError }; 13306 if (pendingActionResult[2]) { 13307 loaderData[pendingActionResult[2]] = void 0; 13308 } 13309 } 13310 return { 13311 loaderData, 13312 errors, 13313 statusCode: statusCode || 200, 13314 loaderHeaders 13315 }; 13316} 13317function processLoaderData(state, matches, results, pendingActionResult, revalidatingFetchers, fetcherResults) { 13318 let { loaderData, errors } = processRouteLoaderData( 13319 matches, 13320 results, 13321 pendingActionResult 13322 ); 13323 revalidatingFetchers.filter((f2) => !f2.matches || f2.matches.some((m2) => m2.shouldLoad)).forEach((rf2) => { 13324 let { key, match, controller } = rf2; 13325 if (controller && controller.signal.aborted) { 13326 return; 13327 } 13328 let result = fetcherResults[key]; 13329 invariant(result, "Did not find corresponding fetcher result"); 13330 if (isErrorResult(result)) { 13331 let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);
13332 if (!(errors && errors[boundaryMatch.route.id])) { 13333 errors = { 13334 ...errors, 13335 [boundaryMatch.route.id]: result.error 13336 }; 13337 } 13338 state.fetchers.delete(key); 13339 } else if (isRedirectResult(result)) { 13340 invariant(false, "Unhandled fetcher revalidation redirect"); 13341 } else { 13342 let doneFetcher = getDoneFetcher(result.data); 13343 state.fetchers.set(key, doneFetcher); 13344 } 13345 }); 13346 return { loaderData, errors }; 13347} 13348function mergeLoaderData(loaderData, newLoaderData, matches, errors) { 13349 let mergedLoaderData = Object.entries(newLoaderData).filter(([, v2]) => v2 !== ResetLoaderDataSymbol).reduce((merged, [k2, v2]) => { 13350 merged[k2] = v2; 13351 return merged; 13352 }, {}); 13353 for (let match of matches) { 13354 let id2 = match.route.id; 13355 if (!newLoaderData.hasOwnProperty(id2) && loaderData.hasOwnProperty(id2) && match.route.loader) { 13356 mergedLoaderData[id2] = loaderData[id2]; 13357 } 13358 if (errors && errors.hasOwnProperty(id2)) { 13359 break; 13360 } 13361 } 13362 return mergedLoaderData; 13363} 13364function getActionDataForCommit(pendingActionResult) { 13365 if (!pendingActionResult) { 13366 return {}; 13367 } 13368 return isErrorResult(pendingActionResult[1]) ? { 13369 // Clear out prior actionData on errors 13370 actionData: {} 13371 } : { 13372 actionData: { 13373 [pendingActionResult[0]]: pendingActionResult[1].data 13374 } 13375 }; 13376} 13377function findNearestBoundary(matches, routeId) { 13378 let eligibleMatches = routeId ? matches.slice(0, matches.findIndex((m2) => m2.route.id === routeId) + 1) : [...matches]; 13379 return eligibleMatches.reverse().find((m2) => m2.route.hasErrorBoundary === true) || matches[0]; 13380} 13381function getShortCircuitMatches(routes) { 13382 let route = routes.length === 1 ? routes[0] : routes.find((r2) => r2.index || !r2.path || r2.path === "/") || { 13383 id: `__shim-error-route__` 13384 }; 13385 return { 13386 matches: [ 13387 { 13388 params: {}, 13389 pathname: "", 13390 pathnameBase: "", 13391 route 13392 } 13393 ], 13394 route 13395 }; 13396} 13397function getInternalRouterError(status, { 13398 pathname, 13399 routeId, 13400 method, 13401 type, 13402 message 13403} = {}) { 13404 let statusText = "Unknown Server Error"; 13405 let errorMessage = "Unknown @remix-run/router error"; 13406 if (status === 400) { 13407 statusText = "Bad Request"; 13408 if (method && pathname && routeId) { 13409 errorMessage = `You made a ${method} request to "${pathname}" but did not provide a \`loader\` for route "${routeId}", so there is no way to handle the request.`; 13410 } else if (type === "invalid-body") { 13411 errorMessage = "Unable to encode submission body"; 13412 } 13413 } else if (status === 403) { 13414 statusText = "Forbidden"; 13415 errorMessage = `Route "${routeId}" does not match URL "${pathname}"`; 13416 } else if (status === 404) { 13417 statusText = "Not Found"; 13418 errorMessage = `No route matches URL "${pathname}"`; 13419 } else if (status === 405) { 13420 statusText = "Method Not Allowed"; 13421 if (method && pathname && routeId) { 13422 errorMessage = `You made a ${method.toUpperCase()} request to "${pathname}" but did not provide an \`action\` for route "${routeId}", so there is no way to handle the request.`; 13423 } else if (method) { 13424 errorMessage = `Invalid request method "${method.toUpperCase()}"`; 13425 } 13426 } 13427 return new ErrorResponseImpl( 13428 status || 500, 13429 statusText, 13430 new Error(errorMessage), 13431 true 13432 ); 13433} 13434function findRedirect(results) { 13435 let entries = Object.entries(results); 13436 for (let i = entries.length - 1; i >= 0; i--) { 13437 let [key, result] = entries[i]; 13438 if (isRedirectResult(result)) { 13439 return { key, result }; 13440 } 13441 } 13442} 13443function stripHashFromPath(path) { 13444 let parsedPath = typeof path === "string" ? parsePath(path) : path; 13445 return createPath({ ...parsedPath, hash: "" }); 13446} 13447function isHashChangeOnly(a, b) { 13448 if (a.pathname !== b.pathname || a.search !== b.search) { 13449 return false; 13450 } 13451 if (a.hash === "") { 13452 return b.hash !== ""; 13453 } else if (a.hash === b.hash) { 13454 return true; 13455 } else if (b.hash !== "") { 13456 return true; 13457 } 13458 return false; 13459} 13460function isDataStrategyResults(result) { 13461 return result != null && typeof result === "object" && Object.entries(result).every( 13462 ([key, value]) => typeof key === "string" && isDataStrategyResult(value) 13463 ); 13464} 13465function isDataStrategyResult(result) { 13466 return result != null && typeof result === "object" && "type" in result && "result" in result && (result.type === "data" || result.type === "error"); 13467} 13468function isRedirectDataStrategyResult(result) { 13469 return isResponse(result.result) && redirectStatusCodes.has(result.result.status); 13470} 13471function isErrorResult(result) { 13472 return result.type === "error"; 13473} 13474function isRedirectResult(result) { 13475 return (result && result.type) === "redirect"; 13476} 13477function isDataWithResponseInit(value) { 13478 return typeof value === "object" && value != null && "type" in value && "data" in value && "init" in value && value.type === "DataWithResponseInit"; 13479} 13480function isResponse(value) {
13481 return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined"; 13482} 13483function isValidMethod(method) { 13484 return validRequestMethods.has(method.toUpperCase()); 13485} 13486function isMutationMethod(method) { 13487 return validMutationMethods.has(method.toUpperCase()); 13488} 13489function hasNakedIndexQuery(search) { 13490 return new URLSearchParams(search).getAll("index").some((v2) => v2 === ""); 13491} 13492function getTargetMatch(matches, location) { 13493 let search = typeof location === "string" ? parsePath(location).search : location.search; 13494 if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || "")) { 13495 return matches[matches.length - 1]; 13496 } 13497 let pathMatches = getPathContributingMatches(matches); 13498 return pathMatches[pathMatches.length - 1]; 13499} 13500function getSubmissionFromNavigation(navigation) { 13501 let { formMethod, formAction, formEncType, text, formData, json } = navigation; 13502 if (!formMethod || !formAction || !formEncType) { 13503 return; 13504 } 13505 if (text != null) { 13506 return { 13507 formMethod, 13508 formAction, 13509 formEncType, 13510 formData: void 0, 13511 json: void 0, 13512 text 13513 }; 13514 } else if (formData != null) { 13515 return { 13516 formMethod, 13517 formAction, 13518 formEncType, 13519 formData, 13520 json: void 0, 13521 text: void 0 13522 }; 13523 } else if (json !== void 0) { 13524 return { 13525 formMethod, 13526 formAction, 13527 formEncType, 13528 formData: void 0, 13529 json, 13530 text: void 0 13531 }; 13532 } 13533} 13534function getLoadingNavigation(location, submission) { 13535 if (submission) { 13536 let navigation = { 13537 state: "loading", 13538 location, 13539 formMethod: submission.formMethod, 13540 formAction: submission.formAction, 13541 formEncType: submission.formEncType, 13542 formData: submission.formData, 13543 json: submission.json, 13544 text: submission.text 13545 }; 13546 return navigation; 13547 } else { 13548 let navigation = { 13549 state: "loading", 13550 location, 13551 formMethod: void 0, 13552 formAction: void 0, 13553 formEncType: void 0, 13554 formData: void 0, 13555 json: void 0, 13556 text: void 0 13557 }; 13558 return navigation; 13559 } 13560} 13561function getSubmittingNavigation(location, submission) { 13562 let navigation = { 13563 state: "submitting", 13564 location, 13565 formMethod: submission.formMethod, 13566 formAction: submission.formAction, 13567 formEncType: submission.formEncType, 13568 formData: submission.formData, 13569 json: submission.json, 13570 text: submission.text 13571 }; 13572 return navigation; 13573} 13574function getLoadingFetcher(submission, data2) { 13575 if (submission) { 13576 let fetcher = { 13577 state: "loading", 13578 formMethod: submission.formMethod, 13579 formAction: submission.formAction, 13580 formEncType: submission.formEncType, 13581 formData: submission.formData, 13582 json: submission.json, 13583 text: submission.text, 13584 data: data2 13585 }; 13586 return fetcher; 13587 } else { 13588 let fetcher = { 13589 state: "loading", 13590 formMethod: void 0, 13591 formAction: void 0, 13592 formEncType: void 0, 13593 formData: void 0, 13594 json: void 0, 13595 text: void 0, 13596 data: data2 13597 }; 13598 return fetcher; 13599 } 13600} 13601function getSubmittingFetcher(submission, existingFetcher) { 13602 let fetcher = { 13603 state: "submitting", 13604 formMethod: submission.formMethod, 13605 formAction: submission.formAction, 13606 formEncType: submission.formEncType, 13607 formData: submission.formData, 13608 json: submission.json, 13609 text: submission.text, 13610 data: existingFetcher ? existingFetcher.data : void 0 13611 }; 13612 return fetcher; 13613} 13614function getDoneFetcher(data2) { 13615 let fetcher = { 13616 state: "idle", 13617 formMethod: void 0, 13618 formAction: void 0, 13619 formEncType: void 0, 13620 formData: void 0, 13621 json: void 0, 13622 text: void 0, 13623 data: data2 13624 }; 13625 return fetcher; 13626} 13627function restoreAppliedTransitions(_window, transitions) { 13628 try { 13629 let sessionPositions = _window.sessionStorage.getItem( 13630 TRANSITIONS_STORAGE_KEY 13631 ); 13632 if (sessionPositions) { 13633 let json = JSON.parse(sessionPositions); 13634 for (let [k2, v2] of Object.entries(json || {})) { 13635 if (v2 && Array.isArray(v2)) { 13636 transitions.set(k2, new Set(v2 || [])); 13637 } 13638 } 13639 } 13640 } catch (e) { 13641 } 13642} 13643function persistAppliedTransitions(_window, transitions) { 13644 if (transitions.size > 0) { 13645 let json = {}; 13646 for (let [k2, v2] of transitions) { 13647 json[k2] = [...v2]; 13648 } 13649 try { 13650 _window.sessionStorage.setItem( 13651 TRANSITIONS_STORAGE_KEY, 13652 JSON.stringify(json) 13653 ); 13654 } catch (error) { 13655 warning( 13656 false, 13657 `Failed to save applied view transitions in sessionStorage (${error}).` 13658 ); 13659 } 13660 } 13661} 13662function createDeferred() { 13663 let resolve; 13664 let reject; 13665 let promise = new Promise((res, rej) => { 13666 resolve = async (val) => { 13667 res(val);
13668 try { 13669 await promise; 13670 } catch (e) { 13671 } 13672 }; 13673 reject = async (error) => { 13674 rej(error); 13675 try { 13676 await promise; 13677 } catch (e) { 13678 } 13679 }; 13680 }); 13681 return { 13682 promise, 13683 //@ts-ignore 13684 resolve, 13685 //@ts-ignore 13686 reject 13687 }; 13688} 13689var DataRouterContext = reactExports.createContext(null); 13690DataRouterContext.displayName = "DataRouter"; 13691var DataRouterStateContext = reactExports.createContext(null); 13692DataRouterStateContext.displayName = "DataRouterState"; 13693reactExports.createContext(false); 13694var ViewTransitionContext = reactExports.createContext({ 13695 isTransitioning: false 13696}); 13697ViewTransitionContext.displayName = "ViewTransition"; 13698var FetchersContext = reactExports.createContext( 13699 /* @__PURE__ */ new Map() 13700); 13701FetchersContext.displayName = "Fetchers"; 13702var AwaitContext = reactExports.createContext(null); 13703AwaitContext.displayName = "Await"; 13704var NavigationContext = reactExports.createContext( 13705 null 13706); 13707NavigationContext.displayName = "Navigation"; 13708var LocationContext = reactExports.createContext( 13709 null 13710); 13711LocationContext.displayName = "Location"; 13712var RouteContext = reactExports.createContext({ 13713 outlet: null, 13714 matches: [], 13715 isDataRoute: false 13716}); 13717RouteContext.displayName = "Route"; 13718var RouteErrorContext = reactExports.createContext(null); 13719RouteErrorContext.displayName = "RouteError"; 13720function useHref(to, { relative } = {}) { 13721 invariant( 13722 useInRouterContext(), 13723 // TODO: This error is probably because they somehow have 2 versions of the 13724 // router loaded. We can help them understand how to avoid that. 13725 `useHref() may be used only in the context of a <Router> component.` 13726 ); 13727 let { basename, navigator: navigator2 } = reactExports.useContext(NavigationContext); 13728 let { hash, pathname, search } = useResolvedPath(to, { relative }); 13729 let joinedPathname = pathname; 13730 if (basename !== "/") { 13731 joinedPathname = pathname === "/" ? basename : joinPaths([basename, pathname]); 13732 } 13733 return navigator2.createHref({ pathname: joinedPathname, search, hash }); 13734} 13735function useInRouterContext() { 13736 return reactExports.useContext(LocationContext) != null; 13737} 13738function useLocation$1() { 13739 invariant( 13740 useInRouterContext(), 13741 // TODO: This error is probably because they somehow have 2 versions of the 13742 // router loaded. We can help them understand how to avoid that. 13743 `useLocation() may be used only in the context of a <Router> component.` 13744 ); 13745 return reactExports.useContext(LocationContext).location; 13746} 13747var navigateEffectWarning = `You should call navigate() in a React.useEffect(), not when your component is first rendered.`; 13748function useIsomorphicLayoutEffect(cb2) { 13749 let isStatic = reactExports.useContext(NavigationContext).static; 13750 if (!isStatic) { 13751 reactExports.useLayoutEffect(cb2); 13752 } 13753} 13754function useNavigate() { 13755 let { isDataRoute } = reactExports.useContext(RouteContext); 13756 return isDataRoute ? useNavigateStable() : useNavigateUnstable(); 13757} 13758function useNavigateUnstable() { 13759 invariant( 13760 useInRouterContext(), 13761 // TODO: This error is probably because they somehow have 2 versions of the 13762 // router loaded. We can help them understand how to avoid that. 13763 `useNavigate() may be used only in the context of a <Router> component.` 13764 ); 13765 let dataRouterContext = reactExports.useContext(DataRouterContext); 13766 let { basename, navigator: navigator2 } = reactExports.useContext(NavigationContext); 13767 let { matches } = reactExports.useContext(RouteContext); 13768 let { pathname: locationPathname } = useLocation$1(); 13769 let routePathnamesJson = JSON.stringify(getResolveToMatches(matches)); 13770 let activeRef = reactExports.useRef(false); 13771 useIsomorphicLayoutEffect(() => { 13772 activeRef.current = true; 13773 }); 13774 let navigate = reactExports.useCallback( 13775 (to, options = {}) => { 13776 warning(activeRef.current, navigateEffectWarning); 13777 if (!activeRef.current) return; 13778 if (typeof to === "number") { 13779 navigator2.go(to); 13780 return; 13781 } 13782 let path = resolveTo( 13783 to, 13784 JSON.parse(routePathnamesJson), 13785 locationPathname, 13786 options.relative === "path" 13787 ); 13788 if (dataRouterContext == null && basename !== "/") { 13789 path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]); 13790 } 13791 (!!options.replace ? navigator2.replace : navigator2.push)( 13792 path, 13793 options.state, 13794 options 13795 ); 13796 }, 13797 [ 13798 basename, 13799 navigator2, 13800 routePathnamesJson, 13801 locationPathname, 13802 dataRouterContext 13803 ] 13804 ); 13805 return navigate; 13806} 13807reactExports.createContext(null); 13808function useResolvedPath(to, { relative } = {}) { 13809 let { matches } = reactExports.useContext(RouteContext); 13810 let { pathname: locationPathname } = useLocation$1(); 13811 let routePathnamesJson = JSON.stringify(getResolveToMatches(matches)); 13812 return reactExports.useMemo( 13813 () => resolveTo( 13814 to, 13815 JSON.parse(routePathnamesJson), 13816 locationPathname, 13817 relative === "path" 13818 ), 13819 [to, routePathnamesJson, locationPathname, relative] 13820 ); 13821} 13822function useRoutesImpl(routes, locationArg, dataRouterState, unstable_onError, future) { 13823 invariant( 13824 useInRouterContext(), 13825 // TODO: This error is probably because they somehow have 2 versions of the 13826 // router loaded. We can help them understand how to avoid that. 13827 `useRoutes() may be used only in the context of a <Router> component.` 13828 ); 13829 let { navigator: navigator2 } = reactExports.useContext(NavigationContext); 13830 let { matches: parentMatches } = reactExports.useContext(RouteContext); 13831 let routeMatch = parentMatches[parentMatches.length - 1];
13832 let parentParams = routeMatch ? routeMatch.params : {}; 13833 let parentPathname = routeMatch ? routeMatch.pathname : "/"; 13834 let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : "/"; 13835 let parentRoute = routeMatch && routeMatch.route; 13836 { 13837 let parentPath = parentRoute && parentRoute.path || ""; 13838 warningOnce( 13839 parentPathname, 13840 !parentRoute || parentPath.endsWith("*") || parentPath.endsWith("*?"), 13841 `You rendered descendant <Routes> (or called \`useRoutes()\`) at "${parentPathname}" (under <Route path="${parentPath}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. 13842 13843Please change the parent <Route path="${parentPath}"> to <Route path="${parentPath === "/" ? "*" : `${parentPath}/*`}">.` 13844 ); 13845 } 13846 let locationFromContext = useLocation$1(); 13847 let location; 13848 { 13849 location = locationFromContext; 13850 } 13851 let pathname = location.pathname || "/"; 13852 let remainingPathname = pathname; 13853 if (parentPathnameBase !== "/") { 13854 let parentSegments = parentPathnameBase.replace(/^\//, "").split("/"); 13855 let segments = pathname.replace(/^\//, "").split("/"); 13856 remainingPathname = "/" + segments.slice(parentSegments.length).join("/"); 13857 } 13858 let matches = matchRoutes(routes, { pathname: remainingPathname }); 13859 { 13860 warning( 13861 parentRoute || matches != null, 13862 `No routes matched location "${location.pathname}${location.search}${location.hash}" ` 13863 ); 13864 warning( 13865 matches == null || matches[matches.length - 1].route.element !== void 0 || matches[matches.length - 1].route.Component !== void 0 || matches[matches.length - 1].route.lazy !== void 0, 13866 `Matched leaf route at location "${location.pathname}${location.search}${location.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.` 13867 ); 13868 } 13869 let renderedMatches = _renderMatches( 13870 matches && matches.map( 13871 (match) => Object.assign({}, match, { 13872 params: Object.assign({}, parentParams, match.params), 13873 pathname: joinPaths([ 13874 parentPathnameBase, 13875 // Re-encode pathnames that were decoded inside matchRoutes. 13876 // Pre-encode `?` and `#` ahead of `encodeLocation` because it uses 13877 // `new URL()` internally and we need to prevent it from treating 13878 // them as separators 13879 navigator2.encodeLocation ? navigator2.encodeLocation( 13880 match.pathname.replace(/\?/g, "%3F").replace(/#/g, "%23") 13881 ).pathname : match.pathname 13882 ]), 13883 pathnameBase: match.pathnameBase === "/" ? parentPathnameBase : joinPaths([ 13884 parentPathnameBase, 13885 // Re-encode pathnames that were decoded inside matchRoutes 13886 // Pre-encode `?` and `#` ahead of `encodeLocation` because it uses 13887 // `new URL()` internally and we need to prevent it from treating 13888 // them as separators 13889 navigator2.encodeLocation ? navigator2.encodeLocation( 13890 match.pathnameBase.replace(/\?/g, "%3F").replace(/#/g, "%23") 13891 ).pathname : match.pathnameBase 13892 ]) 13893 }) 13894 ), 13895 parentMatches, 13896 dataRouterState, 13897 unstable_onError, 13898 future 13899 ); 13900 return renderedMatches; 13901} 13902function DefaultErrorComponent() { 13903 let error = useRouteError(); 13904 let message = isRouteErrorResponse(error) ? `${error.status} ${error.statusText}` : error instanceof Error ? error.message : JSON.stringify(error); 13905 let stack = error instanceof Error ? error.stack : null; 13906 let lightgrey = "rgba(200,200,200, 0.5)"; 13907 let preStyles = { padding: "0.5rem", backgroundColor: lightgrey }; 13908 let codeStyles = { padding: "2px 4px", backgroundColor: lightgrey }; 13909 let devInfo = null; 13910 { 13911 console.error( 13912 "Error handled by React Router default ErrorBoundary:", 13913 error 13914 ); 13915 devInfo = /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, /* @__PURE__ */ reactExports.createElement("p", null, "ð¿ Hey developer ð"), /* @__PURE__ */ reactExports.createElement("p", null, "You can provide a way better UX than this when your app throws errors by providing your own ", /* @__P
13915URE__ */ reactExports.createElement("code", { style: codeStyles }, "ErrorBoundary"), " or", " ", /* @__PURE__ */ reactExports.createElement("code", { style: codeStyles }, "errorElement"), " prop on your route.")); 13916 } 13917 return /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, /* @__PURE__ */ reactExports.createElement("h2", null, "Unexpected Application Error!"), /* @__PURE__ */ reactExports.createElement("h3", { style: { fontStyle: "italic" } }, message), stack ? /* @__PURE__ */ reactExports.createElement("pre", { style: preStyles }, stack) : null, devInfo); 13918} 13919var defaultErrorElement = /* @__PURE__ */ reactExports.createElement(DefaultErrorComponent, null); 13920var RenderErrorBoundary = class extends reactExports.Component { 13921 constructor(props) { 13922 super(props); 13923 this.state = { 13924 location: props.location, 13925 revalidation: props.revalidation, 13926 error: props.error 13927 }; 13928 } 13929 static getDerivedStateFromError(error) { 13930 return { error }; 13931 } 13932 static getDerivedStateFromProps(props, state) { 13933 if (state.location !== props.location || state.revalidation !== "idle" && props.revalidation === "idle") { 13934 return { 13935 error: props.error, 13936 location: props.location, 13937 revalidation: props.revalidation 13938 }; 13939 } 13940 return { 13941 error: props.error !== void 0 ? props.error : state.error, 13942 location: state.location, 13943 revalidation: props.revalidation || state.revalidation 13944 }; 13945 } 13946 componentDidCatch(error, errorInfo) { 13947 if (this.props.unstable_onError) { 13948 this.props.unstable_onError(error, errorInfo); 13949 } else { 13950 console.error( 13951 "React Router caught the following error during render", 13952 error 13953 ); 13954 } 13955 } 13956 render() { 13957 return this.state.error !== void 0 ? /* @__PURE__ */ reactExports.createElement(RouteContext.Provider, { value: this.props.routeContext }, /* @__PURE__ */ reactExports.createElement( 13958 RouteErrorContext.Provider, 13959 { 13960 value: this.state.error, 13961 children: this.props.component 13962 } 13963 )) : this.props.children; 13964 } 13965}; 13966function RenderedRoute({ routeContext, match, children }) { 13967 let dataRouterContext = reactExports.useContext(DataRouterContext); 13968 if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) { 13969 dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id; 13970 } 13971 return /* @__PURE__ */ reactExports.createElement(RouteContext.Provider, { value: routeContext }, children); 13972} 13973function _renderMatches(matches, parentMatches = [], dataRouterState = null, unstable_onError = null, future = null) { 13974 if (matches == null) { 13975 if (!dataRouterState) { 13976 return null; 13977 } 13978 if (dataRouterState.errors) { 13979 matches = dataRouterState.matches; 13980 } else if (parentMatches.length === 0 && !dataRouterState.initialized && dataRouterState.matches.length > 0) { 13981 matches = dataRouterState.matches; 13982 } else { 13983 return null; 13984 } 13985 } 13986 let renderedMatches = matches; 13987 let errors = dataRouterState?.errors; 13988 if (errors != null) { 13989 let errorIndex = renderedMatches.findIndex( 13990 (m2) => m2.route.id && errors?.[m2.route.id] !== void 0 13991 ); 13992 invariant( 13993 errorIndex >= 0, 13994 `Could not find a matching route for errors on route IDs: ${Object.keys( 13995 errors 13996 ).join(",")}` 13997 ); 13998 renderedMatches = renderedMatches.slice( 13999 0, 14000 Math.min(renderedMatches.length, errorIndex + 1) 14001 ); 14002 } 14003 let renderFallback = false; 14004 let fallbackIndex = -1; 14005 if (dataRouterState) { 14006 for (let i = 0; i < renderedMatches.length; i++) { 14007 let match = renderedMatches[i]; 14008 if (match.route.HydrateFallback || match.route.hydrateFallbackElement) { 14009 fallbackIndex = i; 14010 } 14011 if (match.route.id) { 14012 let { loaderData, errors: errors2 } = dataRouterState; 14013 let needsToRunLoader = match.route.loader && !loaderData.hasOwnProperty(match.route.id) && (!errors2 || errors2[match.route.id] === void 0); 14014 if (match.route.lazy || needsToRunLoader) { 14015 renderFallback = true; 14016 if (fallbackIndex >= 0) { 14017 renderedMatches = renderedMatches.slice(0, fallbackIndex + 1); 14018 } else { 14019 renderedMatches = [renderedMatches[0]]; 14020 } 14021 break; 14022 } 14023 } 14024 } 14025 } 14026 return renderedMatches.reduceRight( 14027 (outlet, match, index) => { 14028 let error; 14029 let shouldRenderHydrateFallback = false;
14030 let errorElement = null; 14031 let hydrateFallbackElement = null; 14032 if (dataRouterState) { 14033 error = errors && match.route.id ? errors[match.route.id] : void 0; 14034 errorElement = match.route.errorElement || defaultErrorElement; 14035 if (renderFallback) { 14036 if (fallbackIndex < 0 && index === 0) { 14037 warningOnce( 14038 "route-fallback", 14039 false, 14040 "No `HydrateFallback` element provided to render during initial hydration" 14041 ); 14042 shouldRenderHydrateFallback = true; 14043 hydrateFallbackElement = null; 14044 } else if (fallbackIndex === index) { 14045 shouldRenderHydrateFallback = true; 14046 hydrateFallbackElement = match.route.hydrateFallbackElement || null; 14047 } 14048 } 14049 } 14050 let matches2 = parentMatches.concat(renderedMatches.slice(0, index + 1)); 14051 let getChildren = () => { 14052 let children; 14053 if (error) { 14054 children = errorElement; 14055 } else if (shouldRenderHydrateFallback) { 14056 children = hydrateFallbackElement; 14057 } else if (match.route.Component) { 14058 children = /* @__PURE__ */ reactExports.createElement(match.route.Component, null); 14059 } else if (match.route.element) { 14060 children = match.route.element; 14061 } else { 14062 children = outlet; 14063 } 14064 return /* @__PURE__ */ reactExports.createElement( 14065 RenderedRoute, 14066 { 14067 match, 14068 routeContext: { 14069 outlet, 14070 matches: matches2, 14071 isDataRoute: dataRouterState != null 14072 }, 14073 children 14074 } 14075 ); 14076 }; 14077 return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /* @__PURE__ */ reactExports.createElement( 14078 RenderErrorBoundary, 14079 { 14080 location: dataRouterState.location, 14081 revalidation: dataRouterState.revalidation, 14082 component: errorElement, 14083 error, 14084 children: getChildren(), 14085 routeContext: { outlet: null, matches: matches2, isDataRoute: true }, 14086 unstable_onError 14087 } 14088 ) : getChildren(); 14089 }, 14090 null 14091 ); 14092} 14093function getDataRouterConsoleError(hookName) { 14094 return `${hookName} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`; 14095} 14096function useDataRouterContext(hookName) { 14097 let ctx = reactExports.useContext(DataRouterContext); 14098 invariant(ctx, getDataRouterConsoleError(hookName)); 14099 return ctx; 14100} 14101function useDataRouterState(hookName) { 14102 let state = reactExports.useContext(DataRouterStateContext); 14103 invariant(state, getDataRouterConsoleError(hookName)); 14104 return state; 14105} 14106function useRouteContext(hookName) { 14107 let route = reactExports.useContext(RouteContext); 14108 invariant(route, getDataRouterConsoleError(hookName)); 14109 return route; 14110} 14111function useCurrentRouteId(hookName) { 14112 let route = useRouteContext(hookName); 14113 let thisRoute = route.matches[route.matches.length - 1]; 14114 invariant( 14115 thisRoute.route.id, 14116 `${hookName} can only be used on routes that contain a unique "id"` 14117 ); 14118 return thisRoute.route.id; 14119} 14120function useRouteId() { 14121 return useCurrentRouteId( 14122 "useRouteId" 14123 /* UseRouteId */ 14124 ); 14125} 14126function useRouteError() { 14127 let error = reactExports.useContext(RouteErrorContext); 14128 let state = useDataRouterState( 14129 "useRouteError" 14130 /* UseRouteError */ 14131 ); 14132 let routeId = useCurrentRouteId( 14133 "useRouteError" 14134 /* UseRouteError */ 14135 ); 14136 if (error !== void 0) { 14137 return error; 14138 } 14139 return state.errors?.[routeId]; 14140} 14141function useNavigateStable() { 14142 let { router: router2 } = useDataRouterContext( 14143 "useNavigate" 14144 /* UseNavigateStable */ 14145 ); 14146 let id2 = useCurrentRouteId( 14147 "useNavigate" 14148 /* UseNavigateStable */ 14149 ); 14150 let activeRef = reactExports.useRef(false); 14151 useIsomorphicLayoutEffect(() => { 14152 activeRef.current = true; 14153 }); 14154 let navigate = reactExports.useCallback( 14155 async (to, options = {}) => { 14156 warning(activeRef.current, navigateEffectWarning); 14157 if (!activeRef.current) return; 14158 if (typeof to === "number") { 14159 router2.navigate(to); 14160 } else { 14161 await router2.navigate(to, { fromRouteId: id2, ...options }); 14162 } 14163 }, 14164 [router2, id2] 14165 ); 14166 return navigate; 14167} 14168var alreadyWarned = {}; 14169function warningOnce(key, cond, message) { 14170 if (!cond && !alreadyWarned[key]) { 14171 alreadyWarned[key] = true; 14172 warning(false, message); 14173 } 14174} 14175var alreadyWarned2 = {}; 14176function warnOnce(condition, message) { 14177 if (!condition && !alreadyWarned2[message]) { 14178 alreadyWarned2[message] = true; 14179 console.warn(message); 14180 } 14181} 14182function mapRouteProperties(route) { 14183 let updates = { 14184 // Note: this check also occurs in createRoutesFromChildren so update 14185 // there if you change this -- please and thank you! 14186 hasErrorBoundary: route.hasErrorBoundary || route.ErrorBoundary != null || route.errorElement != null 14187 }; 14188 if (route.Component) { 14189 { 14190 if (route.element) { 14191 warning( 14192 false, 14193 "You should not include both `Component` and `element` on your route - `Component` will be used." 14194 ); 14195 } 14196 } 14197 Object.assign(updates, { 14198 element: reactExports.createElement(route.Component), 14199 Component: void 0 14200 }); 14201 } 14202 if (route.HydrateFallback) { 14203 { 14204 if (route.hydrateFallbackElement) { 14205 warning( 14206 false, 14207 "You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used." 14208 ); 14209 } 14210 } 14211 Object.assign(updates, { 14212 hydrateFallbackElement: reactExports.createElement(route.HydrateFallback), 14213 HydrateFallback: void 0 14214 }); 14215 } 14216 if (route.ErrorBoundary) { 14217 { 14218 if (route.errorElement) { 14219 warning( 14220 false, 14221 "You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used." 14222 ); 14223 } 14224 } 14225 Object.assign(updates, { 14226 errorElement: reactExports.createElement(route.ErrorBoundary), 14227 ErrorBoundary: void 0 14228 }); 14229 } 14230 return updates; 14231} 14232var hydrationRouteProperties = [ 14233 "HydrateFallback", 14234 "hydrateFallbackElement" 14235]; 14236var Deferred = class { 14237 constructor() { 14238 this.status = "pending"; 14239 this.promise = new Promise((resolve, reject) => { 14240 this.resolve = (value) => { 14241 if (this.status === "pending") { 14242 this.status = "resolved"; 14243 resolve(value); 14244 } 14245 }; 14246 this.reject = (reason) => { 14247 if (this.status === "pending") { 14248 this.status = "rejected"; 14249 reject(reason); 14250 } 14251 }; 14252 }); 14253 } 14254}; 14255function RouterProvider({ 14256 router: router2, 14257 flushSync: reactDomFlushSyncImpl, 14258 unstable_onError 14259}) { 14260 let [state, setStateImpl] = reactExports.useState(router2.state); 14261 let [pendingState, setPendingState] = reactExports.useState(); 14262 let [vtContext, setVtContext] = reactExports.useState({ 14263 isTransitioning: false 14264 }); 14265 let [renderDfd, setRenderDfd] = reactExports.useState(); 14266 let [transition, setTransition] = reactExports.useState(); 14267 let [interruption, setInterruption] = reactExports.useState(); 14268 let fetcherData = reactExports.useRef(/* @__PURE__ */ new Map()); 14269 let logErrorsAndSetState = reactExports.useCallback( 14270 (newState) => { 14271 setStateImpl((prevState) => { 14272 if (newState.errors && unstable_onError) {
14273 Object.entries(newState.errors).forEach(([routeId, error]) => { 14274 if (prevState.errors?.[routeId] !== error) { 14275 unstable_onError(error); 14276 } 14277 }); 14278 } 14279 return newState; 14280 }); 14281 }, 14282 [unstable_onError] 14283 ); 14284 let setState = reactExports.useCallback( 14285 (newState, { deletedFetchers, flushSync, viewTransitionOpts }) => { 14286 newState.fetchers.forEach((fetcher, key) => { 14287 if (fetcher.data !== void 0) { 14288 fetcherData.current.set(key, fetcher.data); 14289 } 14290 }); 14291 deletedFetchers.forEach((key) => fetcherData.current.delete(key)); 14292 warnOnce( 14293 flushSync === false || reactDomFlushSyncImpl != null, 14294 'You provided the `flushSync` option to a router update, but you are not using the `<RouterProvider>` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.' 14295 ); 14296 let isViewTransitionAvailable = router2.window != null && router2.window.document != null && typeof router2.window.document.startViewTransition === "function"; 14297 warnOnce( 14298 viewTransitionOpts == null || isViewTransitionAvailable, 14299 "You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available." 14300 ); 14301 if (!viewTransitionOpts || !isViewTransitionAvailable) { 14302 if (reactDomFlushSyncImpl && flushSync) { 14303 reactDomFlushSyncImpl(() => logErrorsAndSetState(newState)); 14304 } else { 14305 reactExports.startTransition(() => logErrorsAndSetState(newState)); 14306 } 14307 return; 14308 } 14309 if (reactDomFlushSyncImpl && flushSync) { 14310 reactDomFlushSyncImpl(() => { 14311 if (transition) { 14312 renderDfd && renderDfd.resolve(); 14313 transition.skipTransition(); 14314 } 14315 setVtContext({ 14316 isTransitioning: true, 14317 flushSync: true, 14318 currentLocation: viewTransitionOpts.currentLocation, 14319 nextLocation: viewTransitionOpts.nextLocation 14320 }); 14321 }); 14322 let t2 = router2.window.document.startViewTransition(() => { 14323 reactDomFlushSyncImpl(() => logErrorsAndSetState(newState)); 14324 }); 14325 t2.finished.finally(() => { 14326 reactDomFlushSyncImpl(() => { 14327 setRenderDfd(void 0); 14328 setTransition(void 0); 14329 setPendingState(void 0); 14330 setVtContext({ isTransitioning: false }); 14331 }); 14332 }); 14333 reactDomFlushSyncImpl(() => setTransition(t2)); 14334 return; 14335 } 14336 if (transition) { 14337 renderDfd && renderDfd.resolve(); 14338 transition.skipTransition(); 14339 setInterruption({ 14340 state: newState, 14341 currentLocation: viewTransitionOpts.currentLocation, 14342 nextLocation: viewTransitionOpts.nextLocation 14343 }); 14344 } else { 14345 setPendingState(newState); 14346 setVtContext({ 14347 isTransitioning: true, 14348 flushSync: false, 14349 currentLocation: viewTransitionOpts.currentLocation, 14350 nextLocation: viewTransitionOpts.nextLocation 14351 }); 14352 } 14353 }, 14354 [ 14355 router2.window, 14356 reactDomFlushSyncImpl, 14357 transition, 14358 renderDfd, 14359 logErrorsAndSetState 14360 ] 14361 ); 14362 reactExports.useLayoutEffect(() => router2.subscribe(setState), [router2, setState]); 14363 reactExports.useEffect(() => { 14364 if (vtContext.isTransitioning && !vtContext.flushSync) { 14365 setRenderDfd(new Deferred()); 14366 } 14367 }, [vtContext]); 14368 reactExports.useEffect(() => { 14369 if (renderDfd && pendingState && router2.window) { 14370 let newState = pendingState; 14371 let renderPromise = renderDfd.promise; 14372 let transition2 = router2.window.document.startViewTransition(async () => { 14373 reactExports.startTransition(() => logErrorsAndSetState(newState)); 14374 await renderPromise; 14375 }); 14376 transition2.finished.finally(() => { 14377 setRenderDfd(void 0); 14378 setTransition(void 0); 14379 setPendingState(void 0); 14380 setVtContext({ isTransitioning: false }); 14381 }); 14382 setTransition(transition2); 14383 } 14384 }, [pendingState, renderDfd, router2.window, logErrorsAndSetState]); 14385 reactExports.useEffect(() => { 14386 if (renderDfd && pendingState && state.location.key === pendingState.location.key) { 14387 renderDfd.resolve(); 14388 } 14389 }, [renderDfd, transition, state.location, pendingState]); 14390 reactExports.useEffect(() => {
14391 if (!vtContext.isTransitioning && interruption) { 14392 setPendingState(interruption.state); 14393 setVtContext({ 14394 isTransitioning: true, 14395 flushSync: false, 14396 currentLocation: interruption.currentLocation, 14397 nextLocation: interruption.nextLocation 14398 }); 14399 setInterruption(void 0); 14400 } 14401 }, [vtContext.isTransitioning, interruption]); 14402 let navigator2 = reactExports.useMemo(() => { 14403 return { 14404 createHref: router2.createHref, 14405 encodeLocation: router2.encodeLocation, 14406 go: (n2) => router2.navigate(n2), 14407 push: (to, state2, opts) => router2.navigate(to, { 14408 state: state2, 14409 preventScrollReset: opts?.preventScrollReset 14410 }), 14411 replace: (to, state2, opts) => router2.navigate(to, { 14412 replace: true, 14413 state: state2, 14414 preventScrollReset: opts?.preventScrollReset 14415 }) 14416 }; 14417 }, [router2]); 14418 let basename = router2.basename || "/"; 14419 let dataRouterContext = reactExports.useMemo( 14420 () => ({ 14421 router: router2, 14422 navigator: navigator2, 14423 static: false, 14424 basename, 14425 unstable_onError 14426 }), 14427 [router2, navigator2, basename, unstable_onError] 14428 ); 14429 return /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, /* @__PURE__ */ reactExports.createElement(DataRouterContext.Provider, { value: dataRouterContext }, /* @__PURE__ */ reactExports.createElement(DataRouterStateContext.Provider, { value: state }, /* @__PURE__ */ reactExports.createElement(FetchersContext.Provider, { value: fetcherData.current }, /* @__PURE__ */ reactExports.createElement(ViewTransitionContext.Provider, { value: vtContext }, /* @__PURE__ */ reactExports.createElement( 14430 Router, 14431 { 14432 basename, 14433 location: state.location, 14434 navigationType: state.historyAction, 14435 navigator: navigator2 14436 }, 14437 /* @__PURE__ */ reactExports.createElement( 14438 MemoizedDataRoutes, 14439 { 14440 routes: router2.routes, 14441 future: router2.future, 14442 state, 14443 unstable_onError 14444 } 14445 ) 14446 ))))), null); 14447} 14448var MemoizedDataRoutes = reactExports.memo(DataRoutes); 14449function DataRoutes({ 14450 routes, 14451 future, 14452 state, 14453 unstable_onError 14454}) { 14455 return useRoutesImpl(routes, void 0, state, unstable_onError, future); 14456} 14457function Router({ 14458 basename: basenameProp = "/", 14459 children = null, 14460 location: locationProp, 14461 navigationType = "POP", 14462 navigator: navigator2, 14463 static: staticProp = false 14464}) { 14465 invariant( 14466 !useInRouterContext(), 14467 `You cannot render a <Router> inside another <Router>. You should never have more than one in your app.` 14468 ); 14469 let basename = basenameProp.replace(/^\/*/, "/"); 14470 let navigationContext = reactExports.useMemo( 14471 () => ({ 14472 basename, 14473 navigator: navigator2, 14474 static: staticProp, 14475 future: {} 14476 }), 14477 [basename, navigator2, staticProp] 14478 ); 14479 if (typeof locationProp === "string") { 14480 locationProp = parsePath(locationProp); 14481 } 14482 let { 14483 pathname = "/", 14484 search = "", 14485 hash = "", 14486 state = null, 14487 key = "default" 14488 } = locationProp; 14489 let locationContext = reactExports.useMemo(() => { 14490 let trailingPathname = stripBasename(pathname, basename); 14491 if (trailingPathname == null) { 14492 return null; 14493 } 14494 return { 14495 location: { 14496 pathname: trailingPathname, 14497 search, 14498 hash, 14499 state, 14500 key 14501 }, 14502 navigationType 14503 }; 14504 }, [basename, pathname, search, hash, state, key, navigationType]); 14505 warning( 14506 locationContext != null, 14507 `<Router basename="${basename}"> is not able to match the URL "${pathname}${search}${hash}" because it does not start with the basename, so the <Router> won't render anything.` 14508 ); 14509 if (locationContext == null) { 14510 return null; 14511 } 14512 return /* @__PURE__ */ reactExports.createElement(NavigationContext.Provider, { value: navigationContext }, /* @__PURE__ */ reactExports.createElement(LocationContext.Provider, { children, value: locationContext })); 14513} 14514var defaultMethod = "get"; 14515var defaultEncType = "application/x-www-form-urlencoded"; 14516function isHtmlElement(object) { 14517 return object != null && typeof object.tagName === "string"; 14518} 14519function isButtonElement(object) { 14520 return isHtmlElement(object) && object.tagName.toLowerCase() === "button"; 14521} 14522function isFormElement(object) { 14523 return isHtmlElement(object) && object.tagName.toLowerCase() === "form"; 14524} 14525function isInputElement(object) { 14526 return isHtmlElement(object) && object.tagName.toLowerCase() === "input"; 14527} 14528function isModifiedEvent(event) { 14529 return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); 14530} 14531function shouldProcessLinkClick(event, target) { 14532 return event.button === 0 && // Ignore everything but left clicks 14533 (!target || target === "_self") && // Let browser handle "target=_blank" etc. 14534 !isModifiedEvent(event); 14535} 14536var _formDataSupportsSubmitter = null; 14537function isFormDataSubmitterSupported() { 14538 if (_formDataSupportsSubmitter === null) { 14539 try { 14540 new FormData( 14541 document.createElement("form"), 14542 // @ts-expect-error if FormData supports the submitter parameter, this will throw 14543 0 14544 ); 14545 _formDataSupportsSubmitter = false;
vendor: 14,361 bytes, lines 14546-14980
14546 } catch (e) { 14547 _formDataSupportsSubmitter = true; 14548 } 14549 } 14550 return _formDataSupportsSubmitter; 14551} 14552var supportedFormEncTypes = /* @__PURE__ */ new Set([ 14553 "application/x-www-form-urlencoded", 14554 "multipart/form-data", 14555 "text/plain" 14556]); 14557function getFormEncType(encType) { 14558 if (encType != null && !supportedFormEncTypes.has(encType)) { 14559 warning( 14560 false, 14561 `"${encType}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${defaultEncType}"` 14562 ); 14563 return null; 14564 } 14565 return encType; 14566} 14567function getFormSubmissionInfo(target, basename) { 14568 let method; 14569 let action; 14570 let encType; 14571 let formData; 14572 let body; 14573 if (isFormElement(target)) { 14574 let attr = target.getAttribute("action"); 14575 action = attr ? stripBasename(attr, basename) : null; 14576 method = target.getAttribute("method") || defaultMethod; 14577 encType = getFormEncType(target.getAttribute("enctype")) || defaultEncType; 14578 formData = new FormData(target); 14579 } else if (isButtonElement(target) || isInputElement(target) && (target.type === "submit" || target.type === "image")) { 14580 let form = target.form; 14581 if (form == null) { 14582 throw new Error( 14583 `Cannot submit a <button> or <input type="submit"> without a <form>` 14584 ); 14585 } 14586 let attr = target.getAttribute("formaction") || form.getAttribute("action"); 14587 action = attr ? stripBasename(attr, basename) : null; 14588 method = target.getAttribute("formmethod") || form.getAttribute("method") || defaultMethod; 14589 encType = getFormEncType(target.getAttribute("formenctype")) || getFormEncType(form.getAttribute("enctype")) || defaultEncType; 14590 formData = new FormData(form, target); 14591 if (!isFormDataSubmitterSupported()) { 14592 let { name, type, value } = target; 14593 if (type === "image") { 14594 let prefix = name ? `${name}.` : ""; 14595 formData.append(`${prefix}x`, "0"); 14596 formData.append(`${prefix}y`, "0"); 14597 } else if (name) { 14598 formData.append(name, value); 14599 } 14600 } 14601 } else if (isHtmlElement(target)) { 14602 throw new Error( 14603 `Cannot submit element that is not <form>, <button>, or <input type="submit|image">` 14604 ); 14605 } else { 14606 method = defaultMethod; 14607 action = null; 14608 encType = defaultEncType; 14609 body = target; 14610 } 14611 if (formData && encType === "text/plain") { 14612 body = formData; 14613 formData = void 0; 14614 } 14615 return { action, method: method.toLowerCase(), encType, formData, body }; 14616} 14617Object.getOwnPropertyNames(Object.prototype).sort().join("\0"); 14618function invariant2(value, message) { 14619 if (value === false || value === null || typeof value === "undefined") { 14620 throw new Error(message); 14621 } 14622} 14623function singleFetchUrl(reqUrl, basename, extension) { 14624 let url = typeof reqUrl === "string" ? new URL( 14625 reqUrl, 14626 // This can be called during the SSR flow via PrefetchPageLinksImpl so 14627 // don't assume window is available 14628 typeof window === "undefined" ? "server://singlefetch/" : window.location.origin 14629 ) : reqUrl; 14630 if (url.pathname === "/") { 14631 url.pathname = `_root.${extension}`; 14632 } else if (basename && stripBasename(url.pathname, basename) === "/") { 14633 url.pathname = `${basename.replace(/\/$/, "")}/_root.${extension}`; 14634 } else { 14635 url.pathname = `${url.pathname.replace(/\/$/, "")}.${extension}`; 14636 } 14637 return url; 14638} 14639async function loadRouteModule(route, routeModulesCache) { 14640 if (route.id in routeModulesCache) { 14641 return routeModulesCache[route.id]; 14642 } 14643 try { 14644 let routeModule = await import( 14645 /* @vite-ignore */ 14646 /* webpackIgnore: true */ 14647 route.module 14648 ); 14649 routeModulesCache[route.id] = routeModule; 14650 return routeModule; 14651 } catch (error) { 14652 console.error( 14653 `Error loading route module \`${route.module}\`, reloading page...` 14654 ); 14655 console.error(error); 14656 if (window.__reactRouterContext && window.__reactRouterContext.isSpaMode && // @ts-expect-error 14657 void 0) ; 14658 window.location.reload(); 14659 return new Promise(() => { 14660 }); 14661 } 14662} 14663function isHtmlLinkDescriptor(object) { 14664 if (object == null) { 14665 return false; 14666 } 14667 if (object.href == null) { 14668 return object.rel === "preload" && typeof object.imageSrcSet === "string" && typeof object.imageSizes === "string"; 14669 } 14670 return typeof object.rel === "string" && typeof object.href === "string"; 14671} 14672async function getKeyedPrefetchLinks(matches, manifest, routeModules) { 14673 let links = await Promise.all( 14674 matches.map(async (match) => { 14675 let route = manifest.routes[match.route.id]; 14676 if (route) { 14677 let mod = await loadRouteModule(route, routeModules); 14678 return mod.links ? mod.links() : []; 14679 } 14680 return []; 14681 }) 14682 ); 14683 return dedupeLinkDescriptors( 14684 links.flat(1).filter(isHtmlLinkDescriptor).filter((link) => link.rel === "stylesheet" || link.rel === "preload").map( 14685 (link) => link.rel === "stylesheet" ? { ...link, rel: "prefetch", as: "style" } : { ...link, rel: "prefetch" } 14686 ) 14687 ); 14688} 14689function getNewMatchesForLinks(page, nextMatches, currentMatches, manifest, location, mode) { 14690 let isNew = (match, index) => { 14691 if (!currentMatches[index]) return true; 14692 return match.route.id !== currentMatches[index].route.id; 14693 }; 14694 let matchPathChanged = (match, index) => { 14695 return ( 14696 // param change, /users/123 -> /users/456 14697 currentMatches[index].pathname !== match.pathname || // splat param changed, which is not present in match.path 14698 // e.g. /files/images/avatar.jpg -> files/finances.xls 14699 currentMatches[index].route.path?.endsWith("*") && currentMatches[index].params["*"] !== match.params["*"] 14700 ); 14701 }; 14702 if (mode === "assets") { 14703 return nextMatches.filter( 14704 (match, index) => isNew(match, index) || matchPathChanged(match, index) 14705 ); 14706 } 14707 if (mode === "data") { 14708 return nextMatches.filter((match, index) => { 14709 let manifestRoute = manifest.routes[match.route.id]; 14710 if (!manifestRoute || !manifestRoute.hasLoader) { 14711 return false; 14712 } 14713 if (isNew(match, index) || matchPathChanged(match, index)) { 14714 return true; 14715 } 14716 if (match.route.shouldRevalidate) { 14717 let routeChoice = match.route.shouldRevalidate({ 14718 currentUrl: new URL( 14719 location.pathname + location.search + location.hash, 14720 window.origin 14721 ), 14722 currentParams: currentMatches[0]?.params || {}, 14723 nextUrl: new URL(page, window.origin), 14724 nextParams: match.params, 14725 defaultShouldRevalidate: true 14726 }); 14727 if (typeof routeChoice === "boolean") { 14728 return routeChoice; 14729 } 14730 } 14731 return true; 14732 }); 14733 } 14734 return []; 14735} 14736function getModuleLinkHrefs(matches, manifest, { includeHydrateFallback } = {}) { 14737 return dedupeHrefs( 14738 matches.map((match) => { 14739 let route = manifest.routes[match.route.id]; 14740 if (!route) return []; 14741 let hrefs = [route.module]; 14742 if (route.clientActionModule) { 14743 hrefs = hrefs.concat(route.clientActionModule); 14744 } 14745 if (route.clientLoaderModule) { 14746 hrefs = hrefs.concat(route.clientLoaderModule); 14747 } 14748 if (includeHydrateFallback && route.hydrateFallbackModule) { 14749 hrefs = hrefs.concat(route.hydrateFallbackModule); 14750 } 14751 if (route.imports) { 14752 hrefs = hrefs.concat(route.imports); 14753 } 14754 return hrefs; 14755 }).flat(1) 14756 ); 14757} 14758function dedupeHrefs(hrefs) { 14759 return [...new Set(hrefs)]; 14760} 14761function sortKeys(obj) { 14762 let sorted = {}; 14763 let keys = Object.keys(obj).sort(); 14764 for (let key of keys) { 14765 sorted[key] = obj[key]; 14766 } 14767 return sorted; 14768} 14769function dedupeLinkDescriptors(descriptors, preloads) { 14770 let set = /* @__PURE__ */ new Set(); 14771 new Set(preloads); 14772 return descriptors.reduce((deduped, descriptor) => { 14773 let key = JSON.stringify(sortKeys(descriptor)); 14774 if (!set.has(key)) { 14775 set.add(key); 14776 deduped.push({ key, link: descriptor }); 14777 } 14778 return deduped; 14779 }, []); 14780} 14781function useDataRouterContext2() { 14782 let context = reactExports.useContext(DataRouterContext); 14783 invariant2( 14784 context, 14785 "You must render this element inside a <DataRouterContext.Provider> element" 14786 ); 14787 return context; 14788} 14789function useDataRouterStateContext() { 14790 let context = reactExports.useContext(DataRouterStateContext); 14791 invariant2( 14792 context, 14793 "You must render this element inside a <DataRouterStateContext.Provider> element" 14794 ); 14795 return context; 14796} 14797var FrameworkContext = reactExports.createContext(void 0); 14798FrameworkContext.displayName = "FrameworkContext"; 14799function useFrameworkContext() { 14800 let context = reactExports.useContext(FrameworkContext); 14801 invariant2( 14802 context, 14803 "You must render this element inside a <HydratedRouter> element" 14804 ); 14805 return context; 14806} 14807function usePrefetchBehavior(prefetch, theirElementProps) { 14808 let frameworkContext = reactExports.useContext(FrameworkContext); 14809 let [maybePrefetch, setMaybePrefetch] = reactExports.useState(false); 14810 let [shouldPrefetch, setShouldPrefetch] = reactExports.useState(false); 14811 let { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps; 14812 let ref = reactExports.useRef(null); 14813 reactExports.useEffect(() => { 14814 if (prefetch === "render") { 14815 setShouldPrefetch(true); 14816 } 14817 if (prefetch === "viewport") { 14818 let callback = (entries) => { 14819 entries.forEach((entry) => { 14820 setShouldPrefetch(entry.isIntersecting); 14821 }); 14822 }; 14823 let observer = new IntersectionObserver(callback, { threshold: 0.5 }); 14824 if (ref.current) observer.observe(ref.current); 14825 return () => { 14826 observer.disconnect(); 14827 }; 14828 } 14829 }, [prefetch]); 14830 reactExports.useEffect(() => { 14831 if (maybePrefetch) { 14832 let id2 = setTimeout(() => { 14833 setShouldPrefetch(true); 14834 }, 100); 14835 return () => { 14836 clearTimeout(id2); 14837 }; 14838 } 14839 }, [maybePrefetch]); 14840 let setIntent = () => { 14841 setMaybePrefetch(true); 14842 }; 14843 let cancelIntent = () => { 14844 setMaybePrefetch(false); 14845 setShouldPrefetch(false); 14846 }; 14847 if (!frameworkContext) { 14848 return [false, ref, {}]; 14849 } 14850 if (prefetch !== "intent") { 14851 return [shouldPrefetch, ref, {}]; 14852 } 14853 return [ 14854 shouldPrefetch, 14855 ref, 14856 { 14857 onFocus: composeEventHandlers(onFocus, setIntent), 14858 onBlur: composeEventHandlers(onBlur, cancelIntent), 14859 onMouseEnter: composeEventHandlers(onMouseEnter, setIntent), 14860 onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent), 14861 onTouchStart: composeEventHandlers(onTouchStart, setIntent) 14862 } 14863 ]; 14864} 14865function composeEventHandlers(theirHandler, ourHandler) { 14866 return (event) => { 14867 theirHandler && theirHandler(event); 14868 if (!event.defaultPrevented) { 14869 ourHandler(event); 14870 } 14871 }; 14872} 14873function PrefetchPageLinks({ page, ...linkProps }) { 14874 let { router: router2 } = useDataRouterContext2(); 14875 let matches = reactExports.useMemo( 14876 () => matchRoutes(router2.routes, page, router2.basename), 14877 [router2.routes, page, router2.basename] 14878 ); 14879 if (!matches) { 14880 return null; 14881 } 14882 return /* @__PURE__ */ reactExports.createElement(PrefetchPageLinksImpl, { page, matches, ...linkProps }); 14883} 14884function useKeyedPrefetchLinks(matches) { 14885 let { manifest, routeModules } = useFrameworkContext(); 14886 let [keyedPrefetchLinks, setKeyedPrefetchLinks] = reactExports.useState([]); 14887 reactExports.useEffect(() => { 14888 let interrupted = false; 14889 void getKeyedPrefetchLinks(matches, manifest, routeModules).then( 14890 (links) => { 14891 if (!interrupted) { 14892 setKeyedPrefetchLinks(links); 14893 } 14894 } 14895 ); 14896 return () => { 14897 interrupted = true; 14898 }; 14899 }, [matches, manifest, routeModules]); 14900 return keyedPrefetchLinks; 14901} 14902function PrefetchPageLinksImpl({ 14903 page, 14904 matches: nextMatches, 14905 ...linkProps 14906}) { 14907 let location = useLocation$1(); 14908 let { manifest, routeModules } = useFrameworkContext(); 14909 let { basename } = useDataRouterContext2(); 14910 let { loaderData, matches } = useDataRouterStateContext(); 14911 let newMatchesForData = reactExports.useMemo( 14912 () => getNewMatchesForLinks( 14913 page, 14914 nextMatches, 14915 matches, 14916 manifest, 14917 location, 14918 "data" 14919 ), 14920 [page, nextMatches, matches, manifest, location] 14921 ); 14922 let newMatchesForAssets = reactExports.useMemo( 14923 () => getNewMatchesForLinks( 14924 page, 14925 nextMatches, 14926 matches, 14927 manifest, 14928 location, 14929 "assets" 14930 ), 14931 [page, nextMatches, matches, manifest, location] 14932 ); 14933 let dataHrefs = reactExports.useMemo(() => { 14934 if (page === location.pathname + location.search + location.hash) { 14935 return []; 14936 } 14937 let routesParams = /* @__PURE__ */ new Set(); 14938 let foundOptOutRoute = false; 14939 nextMatches.forEach((m2) => { 14940 let manifestRoute = manifest.routes[m2.route.id]; 14941 if (!manifestRoute || !manifestRoute.hasLoader) { 14942 return; 14943 } 14944 if (!newMatchesForData.some((m22) => m22.route.id === m2.route.id) && m2.route.id in loaderData && routeModules[m2.route.id]?.shouldRevalidate) { 14945 foundOptOutRoute = true; 14946 } else if (manifestRoute.hasClientLoader) { 14947 foundOptOutRoute = true; 14948 } else { 14949 routesParams.add(m2.route.id); 14950 } 14951 }); 14952 if (routesParams.size === 0) { 14953 return []; 14954 } 14955 let url = singleFetchUrl(page, basename, "data"); 14956 if (foundOptOutRoute && routesParams.size > 0) { 14957 url.searchParams.set( 14958 "_routes", 14959 nextMatches.filter((m2) => routesParams.has(m2.route.id)).map((m2) => m2.route.id).join(",") 14960 ); 14961 } 14962 return [url.pathname + url.search]; 14963 }, [ 14964 basename, 14965 loaderData, 14966 location, 14967 manifest, 14968 newMatchesForData, 14969 nextMatches, 14970 page, 14971 routeModules 14972 ]); 14973 let moduleHrefs = reactExports.useMemo( 14974 () => getModuleLinkHrefs(newMatchesForAssets, manifest), 14975 [newMatchesForAssets, manifest] 14976 ); 14977 let keyedPrefetchLinks = useKeyedPrefetchLinks(newMatchesForAssets); 14978 return /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, dataHrefs.map((href) => /* @__PURE__ */ reactExports.createElement("link", { key: href, rel: "prefetch", as: "fetch", href, ...linkProps })), moduleHrefs.map((href) => /* @__PURE__ */ reactExports.createElement("link", { key: href, rel: "modulepreload", href, ...linkProps })), keyedPrefetchLinks.map(({ key, link }) => ( 14979 // these don't spread `linkProps` because they are full link descriptors 14980 // already with their own props
14981 /* @__PURE__ */ reactExports.createElement("link", { key, nonce: linkProps.nonce, ...link }) 14982 ))); 14983} 14984function mergeRefs(...refs) { 14985 return (value) => { 14986 refs.forEach((ref) => { 14987 if (typeof ref === "function") { 14988 ref(value); 14989 } else if (ref != null) { 14990 ref.current = value; 14991 } 14992 }); 14993 }; 14994} 14995var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined"; 14996try { 14997 if (isBrowser) { 14998 window.__reactRouterVersion = // @ts-expect-error 14999 "7.9.3"; 15000 } 15001} catch (e) { 15002} 15003function createBrowserRouter(routes, opts) { 15004 return createRouter({ 15005 basename: opts?.basename, 15006 getContext: opts?.getContext, 15007 future: opts?.future, 15008 history: createBrowserHistory({ window: opts?.window }), 15009 hydrationData: parseHydrationData(), 15010 routes, 15011 mapRouteProperties, 15012 hydrationRouteProperties, 15013 dataStrategy: opts?.dataStrategy, 15014 patchRoutesOnNavigation: opts?.patchRoutesOnNavigation, 15015 window: opts?.window 15016 }).initialize(); 15017} 15018function parseHydrationData() { 15019 let state = window?.__staticRouterHydrationData; 15020 if (state && state.errors) { 15021 state = { 15022 ...state, 15023 errors: deserializeErrors(state.errors) 15024 }; 15025 } 15026 return state; 15027} 15028function deserializeErrors(errors) { 15029 if (!errors) return null; 15030 let entries = Object.entries(errors); 15031 let serialized = {}; 15032 for (let [key, val] of entries) { 15033 if (val && val.__type === "RouteErrorResponse") { 15034 serialized[key] = new ErrorResponseImpl( 15035 val.status, 15036 val.statusText, 15037 val.data, 15038 val.internal === true 15039 ); 15040 } else if (val && val.__type === "Error") { 15041 if (val.__subType) { 15042 let ErrorConstructor = window[val.__subType]; 15043 if (typeof ErrorConstructor === "function") { 15044 try { 15045 let error = new ErrorConstructor(val.message); 15046 error.stack = ""; 15047 serialized[key] = error; 15048 } catch (e) { 15049 } 15050 } 15051 } 15052 if (serialized[key] == null) { 15053 let error = new Error(val.message); 15054 error.stack = ""; 15055 serialized[key] = error; 15056 } 15057 } else { 15058 serialized[key] = val; 15059 } 15060 } 15061 return serialized; 15062} 15063var ABSOLUTE_URL_REGEX2 = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i; 15064var Link = reactExports.forwardRef( 15065 function LinkWithRef({ 15066 onClick, 15067 discover = "render", 15068 prefetch = "none", 15069 relative, 15070 reloadDocument, 15071 replace: replace2, 15072 state, 15073 target, 15074 to, 15075 preventScrollReset, 15076 viewTransition, 15077 ...rest 15078 }, forwardedRef) { 15079 let { basename } = reactExports.useContext(NavigationContext); 15080 let isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX2.test(to); 15081 let absoluteHref; 15082 let isExternal = false; 15083 if (typeof to === "string" && isAbsolute) { 15084 absoluteHref = to; 15085 if (isBrowser) { 15086 try { 15087 let currentUrl = new URL(window.location.href); 15088 let targetUrl = to.startsWith("//") ? new URL(currentUrl.protocol + to) : new URL(to); 15089 let path = stripBasename(targetUrl.pathname, basename); 15090 if (targetUrl.origin === currentUrl.origin && path != null) { 15091 to = path + targetUrl.search + targetUrl.hash; 15092 } else { 15093 isExternal = true; 15094 } 15095 } catch (e) { 15096 warning( 15097 false, 15098 `<Link to="${to}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.` 15099 ); 15100 } 15101 } 15102 } 15103 let href = useHref(to, { relative }); 15104 let [shouldPrefetch, prefetchRef, prefetchHandlers] = usePrefetchBehavior( 15105 prefetch, 15106 rest 15107 ); 15108 let internalOnClick = useLinkClickHandler(to, { 15109 replace: replace2, 15110 state, 15111 target, 15112 preventScrollReset, 15113 relative, 15114 viewTransition 15115 }); 15116 function handleClick(event) { 15117 if (onClick) onClick(event); 15118 if (!event.defaultPrevented) { 15119 internalOnClick(event); 15120 } 15121 } 15122 let link = ( 15123 // eslint-disable-next-line jsx-a11y/anchor-has-content
vendor: 8,564 bytes, lines 15124-15369
15124 /* @__PURE__ */ reactExports.createElement( 15125 "a", 15126 { 15127 ...rest, 15128 ...prefetchHandlers, 15129 href: absoluteHref || href, 15130 onClick: isExternal || reloadDocument ? onClick : handleClick, 15131 ref: mergeRefs(forwardedRef, prefetchRef), 15132 target, 15133 "data-discover": !isAbsolute && discover === "render" ? "true" : void 0 15134 } 15135 ) 15136 ); 15137 return shouldPrefetch && !isAbsolute ? /* @__PURE__ */ reactExports.createElement(reactExports.Fragment, null, link, /* @__PURE__ */ reactExports.createElement(PrefetchPageLinks, { page: href })) : link; 15138 } 15139); 15140Link.displayName = "Link"; 15141var NavLink = reactExports.forwardRef( 15142 function NavLinkWithRef({ 15143 "aria-current": ariaCurrentProp = "page", 15144 caseSensitive = false, 15145 className: classNameProp = "", 15146 end = false, 15147 style: styleProp, 15148 to, 15149 viewTransition, 15150 children, 15151 ...rest 15152 }, ref) { 15153 let path = useResolvedPath(to, { relative: rest.relative }); 15154 let location = useLocation$1(); 15155 let routerState = reactExports.useContext(DataRouterStateContext); 15156 let { navigator: navigator2, basename } = reactExports.useContext(NavigationContext); 15157 let isTransitioning = routerState != null && // Conditional usage is OK here because the usage of a data router is static 15158 // eslint-disable-next-line react-hooks/rules-of-hooks 15159 useViewTransitionState(path) && viewTransition === true; 15160 let toPathname = navigator2.encodeLocation ? navigator2.encodeLocation(path).pathname : path.pathname; 15161 let locationPathname = location.pathname; 15162 let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null; 15163 if (!caseSensitive) { 15164 locationPathname = locationPathname.toLowerCase(); 15165 nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null; 15166 toPathname = toPathname.toLowerCase(); 15167 } 15168 if (nextLocationPathname && basename) { 15169 nextLocationPathname = stripBasename(nextLocationPathname, basename) || nextLocationPathname; 15170 } 15171 const endSlashPosition = toPathname !== "/" && toPathname.endsWith("/") ? toPathname.length - 1 : toPathname.length; 15172 let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(endSlashPosition) === "/"; 15173 let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === "/"); 15174 let renderProps = { 15175 isActive, 15176 isPending, 15177 isTransitioning 15178 }; 15179 let ariaCurrent = isActive ? ariaCurrentProp : void 0; 15180 let className; 15181 if (typeof classNameProp === "function") { 15182 className = classNameProp(renderProps); 15183 } else { 15184 className = [ 15185 classNameProp, 15186 isActive ? "active" : null, 15187 isPending ? "pending" : null, 15188 isTransitioning ? "transitioning" : null 15189 ].filter(Boolean).join(" "); 15190 } 15191 let style = typeof styleProp === "function" ? styleProp(renderProps) : styleProp; 15192 return /* @__PURE__ */ reactExports.createElement( 15193 Link, 15194 { 15195 ...rest, 15196 "aria-current": ariaCurrent, 15197 className, 15198 ref, 15199 style, 15200 to, 15201 viewTransition 15202 }, 15203 typeof children === "function" ? children(renderProps) : children 15204 ); 15205 } 15206); 15207NavLink.displayName = "NavLink"; 15208var Form = reactExports.forwardRef( 15209 ({ 15210 discover = "render", 15211 fetcherKey, 15212 navigate, 15213 reloadDocument, 15214 replace: replace2, 15215 state, 15216 method = defaultMethod, 15217 action, 15218 onSubmit, 15219 relative, 15220 preventScrollReset, 15221 viewTransition, 15222 ...props 15223 }, forwardedRef) => { 15224 let submit = useSubmit(); 15225 let formAction = useFormAction(action, { relative }); 15226 let formMethod = method.toLowerCase() === "get" ? "get" : "post"; 15227 let isAbsolute = typeof action === "string" && ABSOLUTE_URL_REGEX2.test(action); 15228 let submitHandler = (event) => { 15229 onSubmit && onSubmit(event); 15230 if (event.defaultPrevented) return; 15231 event.preventDefault(); 15232 let submitter = event.nativeEvent.submitter; 15233 let submitMethod = submitter?.getAttribute("formmethod") || method; 15234 submit(submitter || event.currentTarget, { 15235 fetcherKey, 15236 method: submitMethod, 15237 navigate, 15238 replace: replace2, 15239 state, 15240 relative, 15241 preventScrollReset, 15242 viewTransition 15243 }); 15244 }; 15245 return /* @__PURE__ */ reactExports.createElement( 15246 "form", 15247 { 15248 ref: forwardedRef, 15249 method: formMethod, 15250 action: formAction, 15251 onSubmit: reloadDocument ? onSubmit : submitHandler, 15252 ...props, 15253 "data-discover": !isAbsolute && discover === "render" ? "true" : void 0 15254 } 15255 ); 15256 } 15257); 15258Form.displayName = "Form"; 15259function getDataRouterConsoleError2(hookName) { 15260 return `${hookName} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`; 15261} 15262function useDataRouterContext3(hookName) { 15263 let ctx = reactExports.useContext(DataRouterContext); 15264 invariant(ctx, getDataRouterConsoleError2(hookName)); 15265 return ctx; 15266} 15267function useLinkClickHandler(to, { 15268 target, 15269 replace: replaceProp, 15270 state, 15271 preventScrollReset, 15272 relative, 15273 viewTransition 15274} = {}) { 15275 let navigate = useNavigate(); 15276 let location = useLocation$1(); 15277 let path = useResolvedPath(to, { relative }); 15278 return reactExports.useCallback( 15279 (event) => { 15280 if (shouldProcessLinkClick(event, target)) { 15281 event.preventDefault(); 15282 let replace2 = replaceProp !== void 0 ? replaceProp : createPath(location) === createPath(path); 15283 navigate(to, { 15284 replace: replace2, 15285 state, 15286 preventScrollReset, 15287 relative, 15288 viewTransition 15289 }); 15290 } 15291 }, 15292 [ 15293 location, 15294 navigate, 15295 path, 15296 replaceProp, 15297 state, 15298 target, 15299 to, 15300 preventScrollReset, 15301 relative, 15302 viewTransition 15303 ] 15304 ); 15305} 15306var fetcherId = 0; 15307var getUniqueFetcherId = () => `__${String(++fetcherId)}__`; 15308function useSubmit() { 15309 let { router: router2 } = useDataRouterContext3( 15310 "useSubmit" 15311 /* UseSubmit */ 15312 ); 15313 let { basename } = reactExports.useContext(NavigationContext); 15314 let currentRouteId = useRouteId(); 15315 return reactExports.useCallback( 15316 async (target, options = {}) => { 15317 let { action, method, encType, formData, body } = getFormSubmissionInfo( 15318 target, 15319 basename 15320 ); 15321 if (options.navigate === false) { 15322 let key = options.fetcherKey || getUniqueFetcherId(); 15323 await router2.fetch(key, currentRouteId, options.action || action, { 15324 preventScrollReset: options.preventScrollReset, 15325 formData, 15326 body, 15327 formMethod: options.method || method, 15328 formEncType: options.encType || encType, 15329 flushSync: options.flushSync 15330 }); 15331 } else { 15332 await router2.navigate(options.action || action, { 15333 preventScrollReset: options.preventScrollReset, 15334 formData, 15335 body, 15336 formMethod: options.method || method, 15337 formEncType: options.encType || encType, 15338 replace: options.replace, 15339 state: options.state, 15340 fromRouteId: currentRouteId, 15341 flushSync: options.flushSync, 15342 viewTransition: options.viewTransition 15343 }); 15344 } 15345 }, 15346 [router2, basename, currentRouteId] 15347 ); 15348} 15349function useFormAction(action, { relative } = {}) { 15350 let { basename } = reactExports.useContext(NavigationContext); 15351 let routeContext = reactExports.useContext(RouteContext); 15352 invariant(routeContext, "useFormAction must be used inside a RouteContext"); 15353 let [match] = routeContext.matches.slice(-1); 15354 let path = { ...useResolvedPath(action ? action : ".", { relative }) }; 15355 let location = useLocation$1(); 15356 if (action == null) { 15357 path.search = location.search; 15358 let params = new URLSearchParams(path.search); 15359 let indexValues = params.getAll("index"); 15360 let hasNakedIndexParam = indexValues.some((v2) => v2 === ""); 15361 if (hasNakedIndexParam) { 15362 params.delete("index"); 15363 indexValues.filter((v2) => v2).forEach((v2) => params.append("index", v2)); 15364 let qs = params.toString(); 15365 path.search = qs ? `?${qs}` : ""; 15366 } 15367 } 15368 if ((!action || action === ".") && match.route.index) { 15369 path.search = path.search ? path.search.replace(/^\?/, "?index&")
15369: "?index"; 15370 } 15371 if (basename !== "/") { 15372 path.pathname = path.pathname === "/" ? basename : joinPaths([basename, path.pathname]); 15373 } 15374 return createPath(path); 15375} 15376function useViewTransitionState(to, { relative } = {}) { 15377 let vtContext = reactExports.useContext(ViewTransitionContext); 15378 invariant( 15379 vtContext != null, 15380 "`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?" 15381 ); 15382 let { basename } = useDataRouterContext3( 15383 "useViewTransitionState" 15384 /* useViewTransitionState */ 15385 ); 15386 let path = useResolvedPath(to, { relative }); 15387 if (!vtContext.isTransitioning) { 15388 return false; 15389 } 15390 let currentPath = stripBasename(vtContext.currentLocation.pathname, basename) || vtContext.currentLocation.pathname; 15391 let nextPath = stripBasename(vtContext.nextLocation.pathname, basename) || vtContext.nextLocation.pathname; 15392 return matchPath(path.pathname, nextPath) != null || matchPath(path.pathname, currentPath) != null; 15393} 15394function RouterProvider2(props) { 15395 return /* @__PURE__ */ reactExports.createElement(RouterProvider, { flushSync: reactDomExports.flushSync, ...props }); 15396} 15397const __vite_import_meta_env__$2 = {}; 15398const createStoreImpl = (createState) => { 15399 let state; 15400 const listeners = /* @__PURE__ */ new Set(); 15401 const setState = (partial, replace) => { 15402 const nextState = typeof partial === "function" ? partial(state) : partial; 15403 if (!Object.is(nextState, state)) { 15404 const previousState = state; 15405 state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState); 15406 listeners.forEach((listener) => listener(state, previousState)); 15407 } 15408 }; 15409 const getState = () => state; 15410 const getInitialState = () => initialState2; 15411 const subscribe = (listener) => { 15412 listeners.add(listener); 15413 return () => listeners.delete(listener); 15414 }; 15415 const destroy = () => { 15416 if ((__vite_import_meta_env__$2 ? "production" : void 0) !== "production") { 15417 console.warn( 15418 "[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected." 15419 ); 15420 } 15421 listeners.clear(); 15422 }; 15423 const api = { setState, getState, getInitialState, subscribe, destroy }; 15424 const initialState2 = state = createState(setState, getState, api); 15425 return api; 15426}; 15427const createStore$1 = (createState) => createState ? createStoreImpl(createState) : createStoreImpl; 15428var withSelector = { exports: {} }; 15429var withSelector_production = {}; 15430var shim$2 = { exports: {} }; 15431var useSyncExternalStoreShim_production = {}; 15432/** 15433 * @license React 15434 * use-sync-external-store-shim.production.js 15435 * 15436 * Copyright (c) Meta Platforms, Inc. and affiliates. 15437 * 15438 * This source code is licensed under the MIT license found in the 15439 * LICENSE file in the root directory of this source tree. 15440 */ 15441var React$1 = reactExports; 15442function is$1(x2, y2) { 15443 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2; 15444} 15445var objectIs$1 = "function" === typeof Object.is ? Object.is : is$1, useState = React$1.useState, useEffect$1 = React$1.useEffect, useLayoutEffect = React$1.useLayoutEffect, useDebugValue$2 = React$1.useDebugValue; 15446function useSyncExternalStore$2(subscribe, getSnapshot) { 15447 var value = getSnapshot(), _useState = useState({ inst: { value, getSnapshot } }), inst = _useState[0].inst, forceUpdate = _useState[1]; 15448 useLayoutEffect( 15449 function() { 15450 inst.value = value; 15451 inst.getSnapshot = getSnapshot; 15452 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 15453 }, 15454 [subscribe, value, getSnapshot] 15455 ); 15456 useEffect$1( 15457 function() { 15458 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 15459 return subscribe(function() { 15460 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 15461 }); 15462 }, 15463 [subscribe] 15464 ); 15465 useDebugValue$2(value); 15466 return value; 15467} 15468function checkIfSnapshotChanged(inst) { 15469 var latestGetSnapshot = inst.getSnapshot; 15470 inst = inst.value; 15471 try { 15472 var nextValue = latestGetSnapshot(); 15473 return !objectIs$1(inst, nextValue); 15474 } catch (error) { 15475 return true; 15476 } 15477} 15478function useSyncExternalStore$1(subscribe, getSnapshot) { 15479 return getSnapshot(); 15480} 15481var shim$1 = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; 15482useSyncExternalStoreShim_production.useSyncExternalStore = void 0 !== React$1.use
15482SyncExternalStore ? React$1.useSyncExternalStore : shim$1; 15483{ 15484 shim$2.exports = useSyncExternalStoreShim_production; 15485} 15486var shimExports = shim$2.exports; 15487/** 15488 * @license React 15489 * use-sync-external-store-shim/with-selector.production.js 15490 * 15491 * Copyright (c) Meta Platforms, Inc. and affiliates. 15492 * 15493 * This source code is licensed under the MIT license found in the 15494 * LICENSE file in the root directory of this source tree. 15495 */ 15496var React = reactExports, shim = shimExports; 15497function is(x2, y2) { 15498 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2; 15499} 15500var objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore = shim.useSyncExternalStore, useRef = React.useRef, useEffect = React.useEffect, useMemo = React.useMemo, useDebugValue$1 = React.useDebugValue; 15501withSelector_production.useSyncExternalStoreWithSelector = function(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) { 15502 var instRef = useRef(null); 15503 if (null === instRef.current) { 15504 var inst = { hasValue: false, value: null }; 15505 instRef.current = inst; 15506 } else inst = instRef.current; 15507 instRef = useMemo( 15508 function() { 15509 function memoizedSelector(nextSnapshot) { 15510 if (!hasMemo) { 15511 hasMemo = true; 15512 memoizedSnapshot = nextSnapshot; 15513 nextSnapshot = selector(nextSnapshot); 15514 if (void 0 !== isEqual && inst.hasValue) { 15515 var currentSelection = inst.value; 15516 if (isEqual(currentSelection, nextSnapshot)) 15517 return memoizedSelection = currentSelection; 15518 } 15519 return memoizedSelection = nextSnapshot; 15520 } 15521 currentSelection = memoizedSelection; 15522 if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection; 15523 var nextSelection = selector(nextSnapshot); 15524 if (void 0 !== isEqual && isEqual(currentSelection, nextSelection)) 15525 return memoizedSnapshot = nextSnapshot, currentSelection; 15526 memoizedSnapshot = nextSnapshot; 15527 return memoizedSelection = nextSelection; 15528 } 15529 var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot; 15530 return [ 15531 function() { 15532 return memoizedSelector(getSnapshot()); 15533 }, 15534 null === maybeGetServerSnapshot ? void 0 : function() { 15535 return memoizedSelector(maybeGetServerSnapshot()); 15536 } 15537 ]; 15538 }, 15539 [getSnapshot, getServerSnapshot, selector, isEqual] 15540 ); 15541 var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]); 15542 useEffect( 15543 function() { 15544 inst.hasValue = true; 15545 inst.value = value; 15546 }, 15547 [value] 15548 ); 15549 useDebugValue$1(value); 15550 return value; 15551}; 15552{ 15553 withSelector.exports = withSelector_production; 15554} 15555var withSelectorExports = withSelector.exports; 15556const useSyncExternalStoreExports = /* @__PURE__ */ getDefaultExportFromCjs(withSelectorExports); 15557const __vite_import_meta_env__$1 = {}; 15558const { useDebugValue } = React$2; 15559const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports; 15560let didWarnAboutEqualityFn = false; 15561const identity = (arg) => arg; 15562function useStore(api, selector = identity, equalityFn) { 15563 if ((__vite_import_meta_env__$1 ? "production" : void 0) !== "production" && equalityFn && !didWarnAboutEqualityFn) { 15564 console.warn( 15565 "[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937" 15566 ); 15567 didWarnAboutEqualityFn = true; 15568 } 15569 const slice = useSyncExternalStoreWithSelector( 15570 api.subscribe, 15571 api.getState, 15572 api.getServerState || api.getInitialState, 15573 selector, 15574 equalityFn 15575 ); 15576 useDebugValue(slice); 15577 return slice; 15578} 15579const createImpl = (createState) => { 15580 if ((__vite_import_meta_env__$1 ? "production" : void 0) !== "production" && typeof createState !== "function") { 15581 console.warn( 15582 "[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { use
15582Store } from 'zustand'`." 15583 ); 15584 } 15585 const api = typeof createState === "function" ? createStore$1(createState) : createState; 15586 const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn); 15587 Object.assign(useBoundStore, api); 15588 return useBoundStore; 15589}; 15590const create = (createState) => createImpl; 15591const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false, "VITE_API_URL": "https://mec-portfolio-backend.onrender.com", "VITE_WS_URL": "https://mec-portfolio-backend.onrender.com" }; 15592const trackedConnections = /* @__PURE__ */ new Map(); 15593const getTrackedConnectionState = (name) => { 15594 const api = trackedConnections.get(name); 15595 if (!api) return {}; 15596 return Object.fromEntries( 15597 Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()]) 15598 ); 15599}; 15600const extractConnectionInformation = (store2, extensionConnector, options) => { 15601 if (store2 === void 0) { 15602 return { 15603 type: "untracked", 15604 connection: extensionConnector.connect(options) 15605 }; 15606 } 15607 const existingConnection = trackedConnections.get(options.name); 15608 if (existingConnection) { 15609 return { type: "tracked", store: store2, ...existingConnection }; 15610 } 15611 const newConnection = { 15612 connection: extensionConnector.connect(options), 15613 stores: {} 15614 }; 15615 trackedConnections.set(options.name, newConnection); 15616 return { type: "tracked", store: store2, ...newConnection }; 15617}; 15618const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => { 15619 const { enabled, anonymousActionType, store: store2, ...options } = devtoolsOptions; 15620 let extensionConnector; 15621 try { 15622 extensionConnector = (enabled != null ? enabled : (__vite_import_meta_env__ ? "production" : void 0) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__; 15623 } catch (_e2) { 15624 } 15625 if (!extensionConnector) { 15626 if ((__vite_import_meta_env__ ? "production" : void 0) !== "production" && enabled) { 15627 console.warn( 15628 "[zustand devtools middleware] Please install/enable Redux devtools extension" 15629 ); 15630 } 15631 return fn(set, get, api); 15632 } 15633 const { connection, ...connectionInformation } = extractConnectionInformation(store2, extensionConnector, options); 15634 let isRecording = true; 15635 api.setState = (state, replace, nameOrAction) => { 15636 const r2 = set(state, replace); 15637 if (!isRecording) return r2; 15638 const action = nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction; 15639 if (store2 === void 0) { 15640 connection == null ? void 0 : connection.send(action, get()); 15641 return r2; 15642 } 15643 connection == null ? void 0 : connection.send( 15644 { 15645 ...action, 15646 type: `${store2}/${action.type}` 15647 }, 15648 { 15649 ...getTrackedConnectionState(options.name), 15650 [store2]: api.getState() 15651 } 15652 ); 15653 return r2; 15654 }; 15655 const setStateFromDevtools = (...a) => { 15656 const originalIsRecording = isRecording; 15657 isRecording = false; 15658 set(...a); 15659 isRecording = originalIsRecording; 15660 }; 15661 const initialState2 = fn(api.setState, get, api); 15662 if (connectionInformation.type === "untracked") { 15663 connection == null ? void 0 : connection.init(initialState2); 15664 } else { 15665 connectionInformation.stores[connectionInformation.store] = api; 15666 connection == null ? void 0 : connection.init( 15667 Object.fromEntries( 15668 Object.entries(connectionInformation.stores).map(([key, store22]) => [ 15669 key, 15670 key === connectionInformation.store ? initialState2 : store22.getState() 15671 ]) 15672 ) 15673 ); 15674 } 15675 if (api.dispatchFromDevtools && typeof api.dispatch === "function") { 15676 let didWarnAboutReservedActionType = false;
vendor: 7,229 bytes, lines 15677-15893
15677 const originalDispatch = api.dispatch; 15678 api.dispatch = (...a) => { 15679 if ((__vite_import_meta_env__ ? "production" : void 0) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) { 15680 console.warn( 15681 '[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.' 15682 ); 15683 didWarnAboutReservedActionType = true; 15684 } 15685 originalDispatch(...a); 15686 }; 15687 } 15688 connection.subscribe((message) => { 15689 var _a2; 15690 switch (message.type) { 15691 case "ACTION": 15692 if (typeof message.payload !== "string") { 15693 console.error( 15694 "[zustand devtools middleware] Unsupported action format" 15695 ); 15696 return; 15697 } 15698 return parseJsonThen( 15699 message.payload, 15700 (action) => { 15701 if (action.type === "__setState") { 15702 if (store2 === void 0) { 15703 setStateFromDevtools(action.state); 15704 return; 15705 } 15706 if (Object.keys(action.state).length !== 1) { 15707 console.error( 15708 ` 15709 [zustand devtools middleware] Unsupported __setState action format. 15710 When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(), 15711 and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } } 15712 ` 15713 ); 15714 } 15715 const stateFromDevtools = action.state[store2]; 15716 if (stateFromDevtools === void 0 || stateFromDevtools === null) { 15717 return; 15718 } 15719 if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) { 15720 setStateFromDevtools(stateFromDevtools); 15721 } 15722 return; 15723 } 15724 if (!api.dispatchFromDevtools) return; 15725 if (typeof api.dispatch !== "function") return; 15726 api.dispatch(action); 15727 } 15728 ); 15729 case "DISPATCH": 15730 switch (message.payload.type) { 15731 case "RESET": 15732 setStateFromDevtools(initialState2); 15733 if (store2 === void 0) { 15734 return connection == null ? void 0 : connection.init(api.getState()); 15735 } 15736 return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name)); 15737 case "COMMIT": 15738 if (store2 === void 0) { 15739 connection == null ? void 0 : connection.init(api.getState()); 15740 return; 15741 } 15742 return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name)); 15743 case "ROLLBACK": 15744 return parseJsonThen(message.state, (state) => { 15745 if (store2 === void 0) { 15746 setStateFromDevtools(state); 15747 connection == null ? void 0 : connection.init(api.getState()); 15748 return; 15749 } 15750 setStateFromDevtools(state[store2]); 15751 connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name)); 15752 }); 15753 case "JUMP_TO_STATE": 15754 case "JUMP_TO_ACTION": 15755 return parseJsonThen(message.state, (state) => { 15756 if (store2 === void 0) { 15757 setStateFromDevtools(state); 15758 return; 15759 } 15760 if (JSON.stringify(api.getState()) !== JSON.stringify(state[store2])) { 15761 setStateFromDevtools(state[store2]); 15762 } 15763 }); 15764 case "IMPORT_STATE": { 15765 const { nextLiftedState } = message.payload; 15766 const lastComputedState = (_a2 = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a2.state; 15767 if (!lastComputedState) return; 15768 if (store2 === void 0) { 15769 setStateFromDevtools(lastComputedState); 15770 } else { 15771 setStateFromDevtools(lastComputedState[store2]); 15772 } 15773 connection == null ? void 0 : connection.send( 15774 null, 15775 // FIXME no-any 15776 nextLiftedState 15777 ); 15778 return; 15779 } 15780 case "PAUSE_RECORDING": 15781 return isRecording = !isRecording; 15782 } 15783 return; 15784 } 15785 }); 15786 return initialState2; 15787}; 15788const devtools = devtoolsImpl; 15789const parseJsonThen = (stringified, f2) => { 15790 let parsed; 15791 try { 15792 parsed = JSON.parse(stringified); 15793 } catch (e) { 15794 console.error( 15795 "[zustand devtools middleware] Could not parse the received json", 15796 e 15797 ); 15798 } 15799 if (parsed !== void 0) f2(parsed); 15800}; 15801const subscribeWithSelectorImpl = (fn) => (set, get, api) => { 15802 const origSubscribe = api.subscribe; 15803 api.subscribe = (selector, optListener, options) => { 15804 let listener = selector; 15805 if (optListener) { 15806 const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is; 15807 let currentSlice = selector(api.getState()); 15808 listener = (state) => { 15809 const nextSlice = selector(state); 15810 if (!equalityFn(currentSlice, nextSlice)) { 15811 const previousSlice = currentSlice; 15812 optListener(currentSlice = nextSlice, previousSlice); 15813 } 15814 }; 15815 if (options == null ? void 0 : options.fireImmediately) { 15816 optListener(currentSlice, currentSlice); 15817 } 15818 } 15819 return origSubscribe(listener); 15820 }; 15821 const initialState2 = fn(set, get, api); 15822 return initialState2; 15823}; 15824const subscribeWithSelector = subscribeWithSelectorImpl; 15825function createJSONStorage(getStorage, options) { 15826 let storage; 15827 try { 15828 storage = getStorage(); 15829 } catch (_e2) { 15830 return; 15831 } 15832 const persistStorage = { 15833 getItem: (name) => { 15834 var _a2; 15835 const parse = (str2) => { 15836 if (str2 === null) { 15837 return null; 15838 } 15839 return JSON.parse(str2, void 0); 15840 }; 15841 const str = (_a2 = storage.getItem(name)) != null ? _a2 : null; 15842 if (str instanceof Promise) { 15843 return str.then(parse); 15844 } 15845 return parse(str); 15846 }, 15847 setItem: (name, newValue) => storage.setItem( 15848 name, 15849 JSON.stringify(newValue, void 0) 15850 ), 15851 removeItem: (name) => storage.removeItem(name) 15852 }; 15853 return persistStorage; 15854} 15855const toThenable = (fn) => (input) => { 15856 try { 15857 const result = fn(input); 15858 if (result instanceof Promise) { 15859 return result; 15860 } 15861 return { 15862 then(onFulfilled) { 15863 return toThenable(onFulfilled)(result); 15864 }, 15865 catch(_onRejected) { 15866 return this; 15867 } 15868 }; 15869 } catch (e) { 15870 return { 15871 then(_onFulfilled) { 15872 return this; 15873 }, 15874 catch(onRejected) { 15875 return toThenable(onRejected)(e); 15876 } 15877 }; 15878 } 15879}; 15880const oldImpl = (config, baseOptions) => (set, get, api) => { 15881 let options = { 15882 getStorage: () => localStorage, 15883 serialize: JSON.stringify, 15884 deserialize: JSON.parse, 15885 partialize: (state) => state, 15886 version: 0, 15887 merge: (persistedState, currentState) => ({ 15888 ...currentState, 15889 ...persistedState 15890 }), 15891 ...baseOptions 15892 }; 15893 let hasHydrated = false;
vendor: 4,984 bytes, lines 15894-16067
15894 const hydrationListeners = /* @__PURE__ */ new Set(); 15895 const finishHydrationListeners = /* @__PURE__ */ new Set(); 15896 let storage; 15897 try { 15898 storage = options.getStorage(); 15899 } catch (_e2) { 15900 } 15901 if (!storage) { 15902 return config( 15903 (...args) => { 15904 console.warn( 15905 `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.` 15906 ); 15907 set(...args); 15908 }, 15909 get, 15910 api 15911 ); 15912 } 15913 const thenableSerialize = toThenable(options.serialize); 15914 const setItem = () => { 15915 const state = options.partialize({ ...get() }); 15916 let errorInSync; 15917 const thenable = thenableSerialize({ state, version: options.version }).then( 15918 (serializedValue) => storage.setItem(options.name, serializedValue) 15919 ).catch((e) => { 15920 errorInSync = e; 15921 }); 15922 if (errorInSync) { 15923 throw errorInSync; 15924 } 15925 return thenable; 15926 }; 15927 const savedSetState = api.setState; 15928 api.setState = (state, replace) => { 15929 savedSetState(state, replace); 15930 void setItem(); 15931 }; 15932 const configResult = config( 15933 (...args) => { 15934 set(...args); 15935 void setItem(); 15936 }, 15937 get, 15938 api 15939 ); 15940 let stateFromStorage; 15941 const hydrate2 = () => { 15942 var _a2; 15943 if (!storage) return; 15944 hasHydrated = false; 15945 hydrationListeners.forEach((cb2) => cb2(get())); 15946 const postRehydrationCallback = ((_a2 = options.onRehydrateStorage) == null ? void 0 : _a2.call(options, get())) || void 0; 15947 return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => { 15948 if (storageValue) { 15949 return options.deserialize(storageValue); 15950 } 15951 }).then((deserializedStorageValue) => { 15952 if (deserializedStorageValue) { 15953 if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) { 15954 if (options.migrate) { 15955 return options.migrate( 15956 deserializedStorageValue.state, 15957 deserializedStorageValue.version 15958 ); 15959 } 15960 console.error( 15961 `State loaded from storage couldn't be migrated since no migrate function was provided` 15962 ); 15963 } else { 15964 return deserializedStorageValue.state; 15965 } 15966 } 15967 }).then((migratedState) => { 15968 var _a22; 15969 stateFromStorage = options.merge( 15970 migratedState, 15971 (_a22 = get()) != null ? _a22 : configResult 15972 ); 15973 set(stateFromStorage, true); 15974 return setItem(); 15975 }).then(() => { 15976 postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0); 15977 hasHydrated = true; 15978 finishHydrationListeners.forEach((cb2) => cb2(stateFromStorage)); 15979 }).catch((e) => { 15980 postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e); 15981 }); 15982 }; 15983 api.persist = { 15984 setOptions: (newOptions) => { 15985 options = { 15986 ...options, 15987 ...newOptions 15988 }; 15989 if (newOptions.getStorage) { 15990 storage = newOptions.getStorage(); 15991 } 15992 }, 15993 clearStorage: () => { 15994 storage == null ? void 0 : storage.removeItem(options.name); 15995 }, 15996 getOptions: () => options, 15997 rehydrate: () => hydrate2(), 15998 hasHydrated: () => hasHydrated, 15999 onHydrate: (cb2) => { 16000 hydrationListeners.add(cb2); 16001 return () => { 16002 hydrationListeners.delete(cb2); 16003 }; 16004 }, 16005 onFinishHydration: (cb2) => { 16006 finishHydrationListeners.add(cb2); 16007 return () => { 16008 finishHydrationListeners.delete(cb2); 16009 }; 16010 } 16011 }; 16012 hydrate2(); 16013 return stateFromStorage || configResult; 16014}; 16015const newImpl = (config, baseOptions) => (set, get, api) => { 16016 let options = { 16017 storage: createJSONStorage(() => localStorage), 16018 partialize: (state) => state, 16019 version: 0, 16020 merge: (persistedState, currentState) => ({ 16021 ...currentState, 16022 ...persistedState 16023 }), 16024 ...baseOptions 16025 }; 16026 let hasHydrated = false; 16027 const hydrationListeners = /* @__PURE__ */ new Set(); 16028 const finishHydrationListeners = /* @__PURE__ */ new Set(); 16029 let storage = options.storage; 16030 if (!storage) { 16031 return config( 16032 (...args) => { 16033 console.warn( 16034 `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.` 16035 ); 16036 set(...args); 16037 }, 16038 get, 16039 api 16040 ); 16041 } 16042 const setItem = () => { 16043 const state = options.partialize({ ...get() }); 16044 return storage.setItem(options.name, { 16045 state, 16046 version: options.version 16047 }); 16048 }; 16049 const savedSetState = api.setState; 16050 api.setState = (state, replace) => { 16051 savedSetState(state, replace); 16052 void setItem(); 16053 }; 16054 const configResult = config( 16055 (...args) => { 16056 set(...args); 16057 void setItem(); 16058 }, 16059 get, 16060 api 16061 ); 16062 api.getInitialState = () => configResult; 16063 let stateFromStorage; 16064 const hydrate2 = () => { 16065 var _a2, _b2; 16066 if (!storage) return; 16067 hasHydrated = false;
16068 hydrationListeners.forEach((cb2) => { 16069 var _a22; 16070 return cb2((_a22 = get()) != null ? _a22 : configResult); 16071 }); 16072 const postRehydrationCallback = ((_b2 = options.onRehydrateStorage) == null ? void 0 : _b2.call(options, (_a2 = get()) != null ? _a2 : configResult)) || void 0; 16073 return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => { 16074 if (deserializedStorageValue) { 16075 if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) { 16076 if (options.migrate) { 16077 return [ 16078 true, 16079 options.migrate( 16080 deserializedStorageValue.state, 16081 deserializedStorageValue.version 16082 ) 16083 ]; 16084 } 16085 console.error( 16086 `State loaded from storage couldn't be migrated since no migrate function was provided` 16087 ); 16088 } else { 16089 return [false, deserializedStorageValue.state]; 16090 } 16091 } 16092 return [false, void 0]; 16093 }).then((migrationResult) => { 16094 var _a22; 16095 const [migrated, migratedState] = migrationResult; 16096 stateFromStorage = options.merge( 16097 migratedState, 16098 (_a22 = get()) != null ? _a22 : configResult 16099 ); 16100 set(stateFromStorage, true); 16101 if (migrated) { 16102 return setItem(); 16103 } 16104 }).then(() => { 16105 postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0); 16106 stateFromStorage = get(); 16107 hasHydrated = true; 16108 finishHydrationListeners.forEach((cb2) => cb2(stateFromStorage)); 16109 }).catch((e) => { 16110 postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e); 16111 }); 16112 }; 16113 api.persist = { 16114 setOptions: (newOptions) => { 16115 options = { 16116 ...options, 16117 ...newOptions 16118 }; 16119 if (newOptions.storage) { 16120 storage = newOptions.storage; 16121 } 16122 }, 16123 clearStorage: () => { 16124 storage == null ? void 0 : storage.removeItem(options.name); 16125 }, 16126 getOptions: () => options, 16127 rehydrate: () => hydrate2(), 16128 hasHydrated: () => hasHydrated, 16129 onHydrate: (cb2) => { 16130 hydrationListeners.add(cb2); 16131 return () => { 16132 hydrationListeners.delete(cb2); 16133 }; 16134 }, 16135 onFinishHydration: (cb2) => { 16136 finishHydrationListeners.add(cb2); 16137 return () => { 16138 finishHydrationListeners.delete(cb2); 16139 }; 16140 } 16141 }; 16142 if (!options.skipHydration) { 16143 hydrate2(); 16144 } 16145 return stateFromStorage || configResult; 16146}; 16147const persistImpl = (config, baseOptions) => { 16148 if ("getStorage" in baseOptions || "serialize" in baseOptions || "deserialize" in baseOptions) { 16149 if ((__vite_import_meta_env__ ? "production" : void 0) !== "production") { 16150 console.warn( 16151 "[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead." 16152 ); 16153 } 16154 return oldImpl(config, baseOptions); 16155 } 16156 return newImpl(config, baseOptions); 16157}; 16158const persist = persistImpl; 16159const initialState = { 16160 // UI State 16161 selectedLocationId: null, 16162 selectedContact: null, 16163 isLocationModalOpen: false, 16164 isContactModalOpen: false, 16165 // Filters 16166 searchQuery: "", 16167 selectedDepartments: [], 16168 selectedLanguages: [], 16169 selectedStates: [], 16170 selectedServices: [], 16171 // View preferences 16172 mapView: "list", 16173 contactLayout: "grid", 16174 activeTab: "locations", 16175 // Loading states 16176 isLoading: false, 16177 error: null 16178}; 16179const isLocalStorageAvailable$1 = () => { 16180 try { 16181 const test = "__localStorage_test__"; 16182 window.localStorage.setItem(test, test); 16183 window.localStorage.removeItem(test); 16184 return true; 16185 } catch { 16186 return false; 16187 } 16188}; 16189const createStore = () => { 16190 const storeConfig = subscribeWithSelector((set, get) => ({ 16191 // Initial state 16192 ...initialState, 16193 // Location actions 16194 setSelectedLocation: (locationId) => { 16195 set({ selectedLocationId: locationId }); 16196 }, 16197 openLocationModal: (locationId) => { 16198 set({ 16199 selectedLocationId: locationId, 16200 isLocationModalOpen: true 16201 }); 16202 }, 16203 closeLocationModal: () => { 16204 set({ 16205 isLocationModalOpen: false 16206 }); 16207 }, 16208 // Contact actions 16209 setSelectedContact: (contact) => { 16210 set({ selectedContact: contact }); 16211 }, 16212 openContactModal: (contact) => { 16213 set({ 16214 selectedContact: contact, 16215 isContactModalOpen: true 16216 }); 16217 }, 16218 closeContactModal: () => { 16219 set({ 16220 isContactModalOpen: false, 16221 selectedContact: null 16222 }); 16223 }, 16224 // Filter actions 16225 setSearchQuery: (query) => { 16226 set({ searchQuery: query }); 16227 }, 16228 setSelectedDepartments: (departments) => { 16229 set({ selectedDepartments: departments }); 16230 }, 16231 setSelectedLanguages: (languages) => { 16232 set({ selectedLanguages: languages }); 16233 }, 16234 setSelectedStates: (states) => { 16235 set({ selectedStates: states }); 16236 }, 16237 setSelectedServices: (services) => { 16238 set({ selectedServices: services }); 16239 }, 16240 // View actions 16241 setMapView: (view) => { 16242 set({ mapView: view }); 16243 }, 16244 setContactLayout: (layout) => { 16245 set({ contactLayout: layout }); 16246 }, 16247 setActiveTab: (tab) => { 16248 set({ activeTab: tab }); 16249 }, 16250 // Loading actions
16251 setLoading: (loading) => { 16252 set({ isLoading: loading }); 16253 }, 16254 setError: (error) => { 16255 set({ error }); 16256 } 16257 })); 16258 try { 16259 if (isLocalStorageAvailable$1()) { 16260 return devtools( 16261 persist(storeConfig, { 16262 name: "mec-portfolio-store", 16263 // Only serialize specific parts of the state 16264 partialize: (state) => ({ 16265 mapView: state.mapView, 16266 contactLayout: state.contactLayout, 16267 selectedDepartments: state.selectedDepartments, 16268 selectedLanguages: state.selectedLanguages, 16269 selectedStates: state.selectedStates, 16270 selectedServices: state.selectedServices 16271 }) 16272 }), 16273 { name: "mec-portfolio-store" } 16274 ); 16275 } else { 16276 console.log("â ï¸ localStorage not available - running without persistence (iframe mode)"); 16277 return devtools(storeConfig, { name: "mec-portfolio-store-no-persist" }); 16278 } 16279 } catch (error) { 16280 console.error("â ï¸ Store creation failed, using basic store:", error); 16281 return storeConfig; 16282 } 16283}; 16284let store; 16285try { 16286 store = createStore(); 16287} catch (error) { 16288 console.error("â ï¸ Store creation failed, using basic store:", error); 16289 store = subscribeWithSelector((set, get) => ({ 16290 ...initialState, 16291 setSelectedLocation: (locationId) => set({ selectedLocationId: locationId }), 16292 setSelectedContact: (contactId) => set({ selectedContactId: contactId }), 16293 setMapView: (view) => set({ mapView: view }), 16294 setContactLayout: (layout) => set({ contactLayout: layout }), 16295 setSearchQuery: (query) => set({ searchQuery: query }), 16296 setSelectedDepartments: (departments) => set({ selectedDepartments: departments }), 16297 setSelectedLanguages: (languages) => set({ selectedLanguages: languages }), 16298 setSelectedStates: (states) => set({ selectedStates: states }), 16299 setSelectedServices: (services) => set({ selectedServices: services }), 16300 setError: (error2) => set({ error: error2 }) 16301 })); 16302} 16303const useAppStore = create()(store); 16304const useLocationModal = () => useAppStore((state) => ({ 16305 isOpen: state.isLocationModalOpen, 16306 locationId: state.selectedLocationId, 16307 open: state.openLocationModal, 16308 close: state.closeLocationModal 16309})); 16310const useContactModal = () => useAppStore((state) => ({ 16311 isOpen: state.isContactModalOpen, 16312 contact: state.selectedContact, 16313 open: state.openContactModal, 16314 close: state.closeContactModal 16315})); 16316const useFilters = () => useAppStore((state) => ({ 16317 searchQuery: state.searchQuery, 16318 selectedDepartments: state.selectedDepartments, 16319 selectedLanguages: state.selectedLanguages, 16320 selectedStates: state.selectedStates, 16321 selectedServices: state.selectedServices, 16322 setSearchQuery: state.setSearchQuery, 16323 setSelectedDepartments: state.setSelectedDepartments, 16324 setSelectedLanguages: state.setSelectedLanguages, 16325 setSelectedStates: state.setSelectedStates, 16326 setSelectedServices: state.setSelectedServices 16327})); 16328const useViewPreferences = () => useAppStore((state) => ({ 16329 mapView: state.mapView, 16330 contactLayout: state.contactLayout, 16331 activeTab: state.activeTab, 16332 setMapView: state.setMapView, 16333 setContactLayout: state.setContactLayout, 16334 setActiveTab: state.setActiveTab 16335})); 16336if (typeof window !== "undefined") { 16337 let previousLocationId = null; 16338 useAppStore.subscribe((state) => { 16339 const currentLocationId = state.selectedLocationId; 16340 if (currentLocationId !== previousLocationId) { 16341 previousLocationId = currentLocationId; 16342 const url = new URL(window.location.href); 16343 if (currentLocationId) { 16344 url.searchParams.set("location", currentLocationId); 16345 } else { 16346 url.searchParams.delete("location"); 16347 } 16348 window.history.replaceState({}, "", url.toString()); 16349 } 16350 }); 16351 let previousError = null; 16352 useAppStore.subscribe((state) => { 16353 const currentError = state.error; 16354 if (currentError !== previousError) { 16355 previousError = currentError; 16356 if (currentError && true) { 16357 console.error("MEC Portfolio Error:", currentError); 16358 } 16359 } 16360 }); 16361} 16362useAppStore.subscribe; 16363const API_BASE_URL = "https://mec-portfolio-backend.onrender.com"; 16364const API_VERSION = "v1"; 16365const API_URL = `${API_BASE_URL}/api/${API_VERSION}`; 16366const REQUEST_TIMEOUT = 1e4; 16367class ApiClient { 16368 constructor(baseURL, timeout = REQUEST_TIMEOUT) { 16369 __publicField(this, "baseURL"); 16370 __publicField(this, "timeout"); 16371 this.baseURL = baseURL; 16372 this.timeout = timeout; 16373 } 16374 async request(endpoint, options = {}) { 16375 const url = `${this.baseURL}
16375${endpoint}`; 16376 const controller = new AbortController(); 16377 const timeoutId = setTimeout(() => controller.abort(), this.timeout); 16378 try { 16379 const response = await fetch(url, { 16380 ...options, 16381 signal: controller.signal, 16382 headers: { 16383 "Content-Type": "application/json", 16384 ...options.headers 16385 } 16386 }); 16387 clearTimeout(timeoutId); 16388 if (!response.ok) { 16389 const errorData = await response.json().catch(() => ({})); 16390 throw new ApiError( 16391 errorData.message || `HTTP ${response.status}: ${response.statusText}`, 16392 response.status, 16393 errorData 16394 ); 16395 } 16396 return await response.json(); 16397 } catch (error) { 16398 clearTimeout(timeoutId); 16399 if (error instanceof ApiError) { 16400 throw error; 16401 } 16402 if (error instanceof Error) { 16403 if (error.name === "AbortError") { 16404 throw new ApiError("Request timeout", 408); 16405 } 16406 throw new ApiError(error.message, 0); 16407 } 16408 throw new ApiError("Unknown error occurred", 0); 16409 } 16410 } 16411 async get(endpoint) { 16412 return this.request(endpoint, { method: "GET" }); 16413 } 16414 async post(endpoint, data) { 16415 return this.request(endpoint, { 16416 method: "POST", 16417 body: data ? JSON.stringify(data) : void 0 16418 }); 16419 } 16420 async put(endpoint, data) { 16421 return this.request(endpoint, { 16422 method: "PUT", 16423 body: data ? JSON.stringify(data) : void 0 16424 }); 16425 } 16426 async delete(endpoint) { 16427 return this.request(endpoint, { method: "DELETE" }); 16428 } 16429} 16430class ApiError extends Error { 16431 constructor(message, status = 0, data) { 16432 super(message); 16433 __publicField(this, "status"); 16434 __publicField(this, "data"); 16435 this.name = "ApiError"; 16436 this.status = status; 16437 this.data = data; 16438 } 16439} 16440const apiClient = new ApiClient(API_URL); 16441const locationsApi = { 16442 // Get all locations 16443 getAll: () => apiClient.get("/locations?limit=100"), 16444 // Get location by ID 16445 getById: (id2) => apiClient.get(`/locations/${id2}`), 16446 // Search locations 16447 search: (query) => apiClient.get(`/locations/search?q=${encodeURIComponent(query)}`), 16448 // Get services for filtering 16449 getServices: () => apiClient.get("/locations/services"), 16450 // Get states/regions for filtering 16451 getStates: () => apiClient.get("/locations/states"), 16452 // Get opening years for filtering 16453 getOpeningYears: () => apiClient.get("/locations/opening-years") 16454}; 16455const contactsApi = { 16456 // Get all contacts 16457 getAll: (params) => { 16458 const searchParams = new URLSearchParams(); 16459 if (params?.page) searchParams.set("page", params.page.toString()); 16460 if (params?.limit) searchParams.set("limit", params.limit.toString()); 16461 if (params?.locationId) searchParams.set("locationId", params.locationId); 16462 if (params?.department) searchParams.set("department", params.department); 16463 if (params?.search) searchParams.set("search", params.search); 16464 const queryString = searchParams.toString(); 16465 return apiClient.get(`/contacts${queryString ? `?${queryString}` : ""}`); 16466 }, 16467 // Get contact by ID 16468 getById: (id2) => apiClient.get(`/contacts/${id2}`), 16469 // Get all locations for a contact 16470 getContactLocations: (contactId) => apiClient.get(`/contacts/${contactId}/locations`), 16471 // Get contacts by location 16472 getByLocation: (locationId) => apiClient.get(`/contacts/location/${locationId}`), 16473 // Search contacts 16474 search: (query, locationId) => { 16475 const params = new URLSearchParams({ q: query }); 16476 if (locationId) params.set("locationId", locationId); 16477 return apiClient.get(`/contacts/search?${params.toString()}`); 16478 }, 16479 // Get departments 16480 getDepartments: () => apiClient.get("/contacts/departments"), 16481 // Get languages 16482 getLanguages: () => apiClient.get("/contacts/languages"), 16483 // Get positions 16484 getPositions: () => apiClient.get("/contacts/positions"), 16485 // Get availability types 16486 getAvailabilityTypes: () => apiClient.get("/contacts/availability-types") 16487}; 16488const isApiError = (error) => { 16489 return error instanceof ApiError; 16490}; 16491const getErrorMessage = (error) => { 16492 if (isApiError(error)) { 16493 return error.message; 16494 } 16495 if (error instanceof Error) { 16496 return error.message; 16497 } 16498 return "An unknown error occurred"; 16499}; 16500const locationKeys = { 16501 all: ["locations"], 16502 lists: () => [...locationKeys.all, "list"], 16503 list: (filters) => [...locationKeys.lists(), filters], 16504 details: () => [...locationKeys.all, "detail"], 16505 detail: (id2) => [...locationKeys.details(), id2], 16506 search: (query) => [...locationKeys.all, "search", query] 16507};
16508const useLocations = (options) => { 16509 const { setError } = useAppStore(); 16510 return useQuery({ 16511 queryKey: locationKeys.lists(), 16512 queryFn: async () => { 16513 try { 16514 const response = await locationsApi.getAll(); 16515 return response.data; 16516 } catch (error) { 16517 const errorMessage = getErrorMessage(error); 16518 setError(errorMessage); 16519 throw error; 16520 } 16521 }, 16522 staleTime: 10 * 60 * 1e3, 16523 // 10 minutes 16524 gcTime: 30 * 60 * 1e3, 16525 // 30 minutes 16526 retry: (failureCount, error) => { 16527 if (isApiError(error) && error.status >= 400 && error.status < 500) { 16528 return false; 16529 } 16530 return failureCount < 3; 16531 }, 16532 ...options 16533 }); 16534}; 16535const useLocation = (id2, options) => { 16536 const { setError } = useAppStore(); 16537 return useQuery({ 16538 queryKey: locationKeys.detail(id2 || ""), 16539 queryFn: async () => { 16540 if (!id2) throw new Error("Location ID is required"); 16541 try { 16542 const response = await locationsApi.getById(id2); 16543 return response.data; 16544 } catch (error) { 16545 const errorMessage = getErrorMessage(error); 16546 setError(errorMessage); 16547 throw error; 16548 } 16549 }, 16550 enabled: !!id2, 16551 staleTime: 15 * 60 * 1e3, 16552 // 15 minutes 16553 gcTime: 30 * 60 * 1e3, 16554 // 30 minutes 16555 ...options 16556 }); 16557}; 16558const contactKeys = { 16559 all: ["contacts"], 16560 lists: () => [...contactKeys.all, "list"], 16561 list: (filters) => [...contactKeys.lists(), filters], 16562 details: () => [...contactKeys.all, "detail"], 16563 detail: (id2) => [...contactKeys.details(), id2], 16564 byLocation: (locationId) => [...contactKeys.all, "location", locationId], 16565 contactLocations: (contactId) => [...contactKeys.all, "contact-locations", contactId], 16566 search: (query, locationId) => [...contactKeys.all, "search", query, locationId] 16567}; 16568const useContacts = (params, options) => { 16569 const { setError } = useAppStore(); 16570 return useQuery({ 16571 queryKey: contactKeys.list(params || {}), 16572 queryFn: async () => { 16573 try { 16574 const response = await contactsApi.getAll(params); 16575 if (response.data && Array.isArray(response.data)) { 16576 response.data = response.data.map((contact) => ({ 16577 ...contact, 16578 fullName: contact.fullname || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim() || contact.fullName, 16579 firstName: contact.firstname || contact.firstName, 16580 lastName: contact.lastname || contact.lastName, 16581 locationId: contact.locationid || contact.locationId, 16582 createdAt: contact.createdat || contact.createdAt, 16583 updatedAt: contact.updatedat || contact.updatedAt, 16584 isActive: contact.is_active !== false, 16585 socialLinks: contact.socialLinks || [] 16586 })); 16587 } 16588 return response; 16589 } catch (error) { 16590 const errorMessage = getErrorMessage(error); 16591 setError(errorMessage); 16592 throw error; 16593 } 16594 }, 16595 staleTime: 5 * 60 * 1e3, 16596 // 5 minutes 16597 gcTime: 15 * 60 * 1e3, 16598 // 15 minutes 16599 retry: (failureCount, error) => { 16600 if (isApiError(error) && error.status >= 400 && error.status < 500) { 16601 return false; 16602 } 16603 return failureCount < 3; 16604 }, 16605 ...options 16606 }); 16607}; 16608const useContactLocations = (contactId, options) => { 16609 const { setError } = useAppStore(); 16610 return useQuery({ 16611 queryKey: contactKeys.contactLocations(contactId || ""), 16612 queryFn: async () => { 16613 if (!contactId) return [];
16614 try { 16615 const response = await contactsApi.getContactLocations(contactId); 16616 return response.data || []; 16617 } catch (error) { 16618 const errorMessage = getErrorMessage(error); 16619 setError(errorMessage); 16620 console.error("Error fetching contact locations:", error); 16621 return []; 16622 } 16623 }, 16624 enabled: !!contactId, 16625 staleTime: 10 * 60 * 1e3, 16626 // 10 minutes 16627 gcTime: 30 * 60 * 1e3, 16628 // 30 minutes 16629 ...options 16630 }); 16631}; 16632const useContactsByLocation = (locationId, options) => { 16633 const { setError } = useAppStore(); 16634 const normalizedLocationId = locationId ? locationId.startsWith("wp-") ? locationId : `wp-${locationId}` : null; 16635 return useQuery({ 16636 queryKey: contactKeys.byLocation(normalizedLocationId || ""), 16637 queryFn: async () => { 16638 if (!normalizedLocationId) return []; 16639 try { 16640 const response = await contactsApi.getByLocation(normalizedLocationId); 16641 if (Array.isArray(response.data)) { 16642 const normalizedContacts = response.data.map((contact) => ({ 16643 ...contact, 16644 fullName: contact.fullname || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim() || contact.fullName, 16645 firstName: contact.firstname || contact.firstName, 16646 lastName: contact.lastname || contact.lastName, 16647 locationId: contact.locationid || contact.locationId, 16648 createdAt: contact.createdat || contact.createdAt, 16649 updatedAt: contact.updatedat || contact.updatedAt, 16650 isActive: contact.is_active !== false, 16651 // Default to true 16652 socialLinks: contact.socialLinks || [], 16653 // Already transformed by backend 16654 // Location information from backend joins 16655 locationName: contact.locationname || contact.locationName, 16656 locationCity: contact.locationcity || contact.locationCity, 16657 locationAddress: contact.locationaddress || contact.locationAddress 16658 })); 16659 return normalizedContacts; 16660 } else if (response.data && typeof response.data === "object" && "locationContacts" in response.data) { 16661 const apiData = response.data; 16662 const allContacts = [ 16663 ...apiData.locationContacts || [], 16664 ...apiData.managementContacts || [] 16665 ]; 16666 return allContacts.map((contact) => ({ 16667 ...contact, 16668 fullName: contact.fullname || contact.fullName || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim(), 16669 firstName: contact.firstname || contact.firstName, 16670 lastName: contact.lastname || contact.lastName, 16671 locationId: contact.locationid || contact.locationId, 16672 createdAt: contact.createdat || contact.createdAt, 16673 updatedAt: contact.updatedat || contact.updatedAt, 16674 isActive: contact.is_active !== false, 16675 // Default to true 16676 socialLinks: contact.socialLinks || [], 16677 // Already transformed by backend 16678 // Location information from backend joins 16679 locationName: contact.locationname || contact.locationName, 16680 locationCity: contact.locationcity || contact.locationCity, 16681 locationAddress: contact.locationaddress || contact.locationAddress 16682 })); 16683 } else if (response.data && response.data.data && Array.isArray(response.data.data)) { 16684 return response.data.data.map((contact) => ({ 16685 ...contact, 16686 fullName: contact.fullname || contact.fullName || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim(), 16687 firstName: contact.firstname || contact.firstName, 16688 lastName: contact.lastname || contact.lastName, 16689 locationId: contact.locationid || contact.locationId, 16690 createdAt: contact.createdat || contact.createdAt, 16691 updatedAt: contact.updatedat || contact.updatedAt, 16692 isActive: contact.is_active !== false, 16693 socialLinks: contact.socialLinks || [], 16694 // Location information from backend joins 16695 locationName: contact.locationname || contact.locationName, 16696 locationCity: contact.locationcity || contact.locationCity, 16697 locationAddress: contact.locationaddress || contact.locationAddress 16698 })); 16699 } else if (response.data && response.data.pagination && response.data.pagination.total === 0) { 16700 return []; 16701 } else { 16702 return response.data || []; 16703 } 16704 } catch (error) { 16705 const errorMessage = getErrorMessage(error); 16706 setError(errorMessage); 16707 throw error; 16708 } 16709 }, 16710 enabled: !!locationId, 16711 staleTime: 5 * 60 * 1e3, 16712 // 5 minutes 16713 gcTime: 15 * 60 * 1e3, 16714 // 15 minutes 16715 ...options 16716 }); 16717}; 16718const useFilteredContacts = (locationId) => { 16719 const { searchQuery, selectedDepartments, selectedLanguages } = useAppStore(); 16720 const normalizedLocationId = locationId ? locationId.startsWith("wp-") ? locationId : `wp-${locationId}` : void 0; 16721 const contactsByLocationQuery = useContactsByLocation(normalizedLocationId || null); 16722 const params = { 16723 locationId: normalizedLocationId, 16724 search: searchQuery || void 0, 16725 department: selectedDepartments.length > 0 ? selectedDepartments[0] : void 0, 16726 // Simplified for now 16727 limit: 1e3 16728 // High limit to get all contacts (no pagination) 16729 }; 16730 const contactsQuery = useContacts(params); 16731 const activeQuery = normalizedLocationId ? contactsByLocationQuery : contactsQuery; 16732 const rawContacts = normalizedLocationId ? activeQuery.data || [] : contactsQuery.data?.data || []; 16733 const normalizedContacts = rawContacts.map((contact) => ({ 16734 ...contact, 16735 // Normalize fullName field like in useContactsByLocation 16736 fullName: contact.fullname || `${contact.firstname || contact.firstName || ""} ${contact.lastname || contact.lastName || ""}`.trim() || contact.fullName, 16737 firstName: contact.firstname || contact.firstName, 16738 lastName: contact.lastname || contact.lastName, 16739 locationId: contact.locationid || contact.locationId, 16740 createdAt: contact.createdat || contact.createdAt, 16741 updatedAt: contact.updatedat || contact.updatedAt,
16742 isActive: contact.is_active !== false, 16743 socialLinks: contact.socialLinks || [] 16744 })); 16745 const deduplicatedContacts = (() => { 16746 const seenWpIds = /* @__PURE__ */ new Set(); 16747 return normalizedContacts.filter((contact) => { 16748 let wpId = contact.wp_id; 16749 if (!wpId && contact.id.startsWith("wp-")) { 16750 const idParts = contact.id.split("-"); 16751 if (idParts.length >= 2) { 16752 wpId = parseInt(idParts[1]); 16753 } 16754 } 16755 console.log("ð DEBUG: Deduplication - contact:", contact.id, "wp_id:", wpId, "fullName:", contact.fullName); 16756 if (!wpId) { 16757 console.log("ð DEBUG: Keeping contact without wp_id:", contact.id); 16758 return true; 16759 } 16760 if (seenWpIds.has(wpId)) { 16761 console.log("ð DEBUG: Skipping duplicate wp_id:", wpId, "for contact:", contact.id); 16762 return false; 16763 } 16764 seenWpIds.add(wpId); 16765 console.log("ð DEBUG: Keeping first occurrence of wp_id:", wpId, "for contact:", contact.id); 16766 return true; 16767 }); 16768 })(); 16769 const filteredContacts = deduplicatedContacts.filter((contact) => { 16770 if (selectedLanguages.length === 0) return true; 16771 return contact.languages?.some((lang) => selectedLanguages.includes(lang)); 16772 }); 16773 const locationSpecificContacts = normalizedLocationId ? filteredContacts.filter((contact) => { 16774 const contactLocationId = contact.locationid || contact.locationId; 16775 return contactLocationId === normalizedLocationId; 16776 }) : []; 16777 console.log("ð DEBUG: useFilteredContacts - Raw API data:", rawContacts); 16778 console.log("ð DEBUG: useFilteredContacts - First raw contact:", rawContacts?.[0]); 16779 console.log("ð DEBUG: useFilteredContacts - Normalized contacts:", normalizedContacts?.length || 0); 16780 console.log("ð DEBUG: useFilteredContacts - First normalized contact:", normalizedContacts?.[0]); 16781 console.log("ð DEBUG: useFilteredContacts - Deduplicated contacts:", deduplicatedContacts?.length || 0); 16782 console.log("ð DEBUG: useFilteredContacts - Final filtered contacts:", filteredContacts?.length || 0); 16783 console.log("ð DEBUG: useFilteredContacts - Location-specific contacts:", locationSpecificContacts?.length || 0); 16784 console.log("ð DEBUG: useFilteredContacts - original locationId:", locationId); 16785 console.log("ð DEBUG: useFilteredContacts - normalized locationId:", normalizedLocationId); 16786 console.log("ð DEBUG: useFilteredContacts - searchQuery:", searchQuery); 16787 console.log("ð DEBUG: useFilteredContacts - selectedLanguages:", selectedLanguages); 16788 return { 16789 contacts: filteredContacts, 16790 locationSpecificContacts, 16791 // NEW: Only location-specific contacts 16792 locationSpecificCount: locationSpecificContacts.length, 16793 // NEW: Count of location-specific contacts only 16794 pagination: normalizedLocationId ? void 0 : contactsQuery.data?.pagination, 16795 isLoading: activeQuery.isLoading, 16796 error: activeQuery.error, 16797 refetch: activeQuery.refetch 16798 }; 16799}; 16800function r(e) { 16801 var t2, f2, n2 = ""; 16802 if ("string" == typeof e || "number" == typeof e) n2 += e; 16803 else if ("object" == typeof e) if (Array.isArray(e)) { 16804 var o = e.length; 16805 for (t2 = 0; t2 < o; t2++) e[t2] && (f2 = r(e[t2])) && (n2 && (n2 += " "), n2 += f2); 16806 } else for (f2 in e) e[f2] && (n2 && (n2 += " "), n2 += f2); 16807 return n2; 16808} 16809function clsx() { 16810 for (var e, t2, f2 = 0, n2 = "", o = arguments.length; f2 < o; f2++) (e = arguments[f2]) && (t2 = r(e)) && (n2 && (n2 += " "), n2 += t2); 16811 return n2; 16812} 16813const sizeClasses = { 16814 sm: "w-4 h-4 border-2", 16815 md: "w-6 h-6 border-2", 16816 lg: "w-8 h-8 border-3", 16817 xl: "w-12 h-12 border-4" 16818}; 16819const colorClasses = { 16820 primary: "border-mec-primary/20 border-t-mec-primary", 16821 secondary: "border-text-muted/20 border-t-text-muted", 16822 white: "border-white/20 border-t-white" 16823}; 16824const LoadingSpinner = ({ 16825 size = "md", 16826 color = "primary", 16827 className, 16828 label = "Lädt..." 16829}) => { 16830 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 16831 "div", 16832 { 16833 className: clsx("inline-flex items-center gap-2", className), 16834 role: "status", 16835 "aria-label": label, 16836 children: [
16837 /* @__PURE__ */ jsxRuntimeExports.jsx( 16838 "div", 16839 { 16840 className: clsx( 16841 "animate-spin rounded-full", 16842 sizeClasses[size], 16843 colorClasses[color] 16844 ), 16845 "aria-hidden": "true" 16846 } 16847 ), 16848 label && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: label }) 16849 ] 16850 } 16851 ); 16852}; 16853const Skeleton = ({ 16854 className, 16855 variant = "text", 16856 width, 16857 height, 16858 lines = 1 16859}) => { 16860 const baseClasses = "loading-skeleton"; 16861 const variantClasses = { 16862 text: "h-4 rounded", 16863 rectangular: "rounded-mec", 16864 circular: "rounded-full" 16865 }; 16866 const style = {}; 16867 if (width) style.width = typeof width === "number" ? `${width}px` : width; 16868 if (height) style.height = typeof height === "number" ? `${height}px` : height; 16869 if (variant === "text" && lines > 1) { 16870 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-2", className), children: Array.from({ length: lines }).map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 16871 "div", 16872 { 16873 className: clsx(baseClasses, variantClasses[variant]), 16874 style: { 16875 ...style, 16876 width: index === lines - 1 ? "75%" : "100%" 16877 } 16878 }, 16879 index 16880 )) }); 16881 } 16882 return /* @__PURE__ */ jsxRuntimeExports.jsx( 16883 "div", 16884 { 16885 className: clsx(baseClasses, variantClasses[variant], className), 16886 style 16887 } 16888 ); 16889}; 16890const LoadingCard = ({ 16891 className, 16892 showImage = true, 16893 showTitle = true, 16894 showDescription = true, 16895 lines = 2 16896}) => { 16897 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("card p-4 space-y-3", className), children: [ 16898 showImage && /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "rectangular", height: 120 }), 16899 showTitle && /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", width: "75%" }),
16900 showDescription && /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", lines }) 16901 ] }); 16902}; 16903const LoadingList = ({ 16904 items = 3, 16905 className 16906}) => { 16907 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-3", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3 p-3 border border-background-tertiary rounded-mec", children: [ 16908 /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "circular", width: 40, height: 40 }), 16909 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 space-y-2", children: [ 16910 /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", width: "60%" }), 16911 /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { variant: "text", width: "40%" }) 16912 ] }) 16913 ] }, index)) }); 16914}; 16915/** 16916 * @license lucide-react v0.294.0 - ISC 16917 * 16918 * This source code is licensed under the ISC license. 16919 * See the LICENSE file in the root directory of this source tree. 16920 */ 16921var defaultAttributes = { 16922 xmlns: "http://www.w3.org/2000/svg", 16923 width: 24, 16924 height: 24, 16925 viewBox: "0 0 24 24", 16926 fill: "none", 16927 stroke: "currentColor", 16928 strokeWidth: 2, 16929 strokeLinecap: "round", 16930 strokeLinejoin: "round" 16931}; 16932/** 16933 * @license lucide-react v0.294.0 - ISC 16934 * 16935 * This source code is licensed under the ISC license. 16936 * See the LICENSE file in the root directory of this source tree. 16937 */ 16938const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase().trim(); 16939const createLucideIcon = (iconName, iconNode) => { 16940 const Component = reactExports.forwardRef( 16941 ({ color = "currentColor", size = 24, strokeWidth = 2, absoluteStrokeWidth, className = "", children, ...rest }, ref) => reactExports.createElement( 16942 "svg", 16943 { 16944 ref, 16945 ...defaultAttributes, 16946 width: size, 16947 height: size, 16948 stroke: color, 16949 strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth, 16950 className: ["lucide", `lucide-${toKebabCase(iconName)}`, className].join(" "), 16951 ...rest 16952 }, 16953 [ 16954 ...iconNode.map(([tag, attrs]) => reactExports.createElement(tag, attrs)), 16955 ...Array.isArray(children) ? children : [children] 16956 ] 16957 ) 16958 ); 16959 Component.displayName = `${iconName}`; 16960 return Component; 16961}; 16962/** 16963 * @license lucide-react v0.294.0 - ISC 16964 * 16965 * This source code is licensed under the ISC license. 16966 * See the LICENSE file in the root directory of this source tree. 16967 */ 16968const AlertCircle = createLucideIcon("AlertCircle", [ 16969 ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }], 16970 ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }], 16971 ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }] 16972]); 16973/** 16974 * @license lucide-react v0.294.0 - ISC 16975 * 16976 * This source code is licensed under the ISC license. 16977 * See the LICENSE file in the root directory of this source tree. 16978 */ 16979const AlertTriangle = createLucideIcon("AlertTriangle", [ 16980 [ 16981 "path", 16982 { 16983 d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z", 16984 key: "c3ski4" 16985 } 16986 ], 16987 ["path", { d: "M12 9v4", key: "juzpu7" }], 16988 ["path", { d: "M12 17h.01", key: "p32p05" }] 16989]); 16990/** 16991 * @license lucide-react v0.294.0 - ISC 16992 * 16993 * This source code is licensed under the ISC license. 16994 * See the LICENSE file in the root directory of this source tree. 16995 */ 16996const ArrowRight = createLucideIcon("ArrowRight", [ 16997 ["path", { d: "M5 12h14", key: "1ays0h" }], 16998 ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }] 16999]); 17000/** 17001 * @license lucide-react v0.294.0 - ISC 17002 * 17003 * This source code is licensed under the ISC license. 17004 * See the LICENSE file in the root directory of this source tree. 17005 */ 17006const Building2 = createLucideIcon("Building2", [ 17007 ["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }], 17008 ["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }], 17009 ["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }], 17010 ["path", { d: "M10 6h4", key: "1itunk" }], 17011 ["path", { d: "M10 10h4", key: "tcdvrf" }], 17012 ["path", { d: "M10 14h4", key: "kelpxr" }], 17013 ["path", { d: "M10 18h4", key: "1ulq68" }] 17014]); 17015/** 17016 * @license lucide-react v0.294.0 - ISC 17017 * 17018 * This source code is licensed under the ISC license. 17019 * See the LICENSE file in the root directory of this source tree. 17020 */ 17021const CheckCircle = createLucideIcon("CheckCircle", [ 17022 ["path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14", key: "g774vq" }], 17023 ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }] 17024]); 17025/** 17026 * @license lucide-react v0.294.0 - ISC 17027 * 17028 * This source code is licensed under the ISC license. 17029 * See the LICENSE file in the root directory of this source tree. 17030 */ 17031const ChevronDown = createLucideIcon("ChevronDown", [ 17032 ["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }] 17033]); 17034/** 17035 * @license lucide-react v0.294.0 - ISC 17036 * 17037 * This source code is licensed under the ISC license. 17038 * See the LICENSE file in the root directory of this source tree. 17039 */ 17040const ChevronLeft = createLucideIcon("ChevronLeft", [ 17041 ["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }] 17042]); 17043/** 17044 * @license lucide-react v0.294.0 - ISC 17045 * 17046 * This source code is licensed under the ISC license. 17047 * See the LICENSE file in the root directory of this source tree. 17048 */ 17049const ChevronRight = createLucideIcon("ChevronRight", [ 17050 ["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }] 17051]); 17052/** 17053 * @license lucide-react v0.294.0 - ISC 17054 * 17055 * This source code is licensed under the ISC license. 17056 * See the LICENSE file in the root directory of this source tree. 17057 */ 17058const ChevronUp = createLucideIcon("ChevronUp", [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]]); 17059/** 17060 * @license lucide-react v0.294.0 - ISC 17061 * 17062 * This source code is licensed under the ISC license. 17063 * See the LICENSE file in the root directory of this source tree. 17064 */ 17065const Clock = createLucideIcon("Clock", [ 17066 ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }], 17067 ["polyline", { points: "12 6 12 12 16 14", key: "68esgv" }] 17068]); 17069/** 17070 * @license lucide-react v0.294.0 - ISC 17071 * 17072 * This source code is licensed under the ISC license. 17073 * See the LICENSE file in the root directory of this source tree. 17074 */ 17075const Crosshair = createLucideIcon("Crosshair", [ 17076 ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }], 17077 ["line", { x1: "22", x2: "18", y1: "12", y2: "12", key: "l9bcsi" }], 17078 ["line", { x1: "6", x2: "2", y1: "12", y2: "12", key: "13hhkx" }], 17079 ["line", { x1: "12", x2: "12", y1: "6", y2: "2", key: "10w3f3" }], 17080 ["line", { x1: "12", x2: "12", y1: "22", y2: "18", key: "15g9kq" }] 17081]); 17082/** 17083 * @license lucide-react v0.294.0 - ISC 17084 * 17085 * This source code is licensed under the ISC license. 17086 * See the LICENSE file in the root directory of this source tree. 17087 */ 17088const Database = createLucideIcon("Database", [ 17089 ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }], 17090 ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }], 17091 ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }] 17092]); 17093/** 17094 * @license lucide-react v0.294.0 - ISC 17095 * 17096 * This source code is licensed under the ISC license. 17097 * See the LICENSE file in the root directory of this source tree. 17098 */
17099const ExternalLink = createLucideIcon("ExternalLink", [ 17100 ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }], 17101 ["polyline", { points: "15 3 21 3 21 9", key: "mznyad" }], 17102 ["line", { x1: "10", x2: "21", y1: "14", y2: "3", key: "18c3s4" }] 17103]); 17104/** 17105 * @license lucide-react v0.294.0 - ISC 17106 * 17107 * This source code is licensed under the ISC license. 17108 * See the LICENSE file in the root directory of this source tree. 17109 */ 17110const Globe = createLucideIcon("Globe", [ 17111 ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }], 17112 ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }], 17113 ["path", { d: "M2 12h20", key: "9i4pu4" }] 17114]); 17115/** 17116 * @license lucide-react v0.294.0 - ISC 17117 * 17118 * This source code is licensed under the ISC license. 17119 * See the LICENSE file in the root directory of this source tree. 17120 */ 17121const Grid3x3 = createLucideIcon("Grid3x3", [ 17122 ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }], 17123 ["path", { d: "M3 9h18", key: "1pudct" }], 17124 ["path", { d: "M3 15h18", key: "5xshup" }], 17125 ["path", { d: "M9 3v18", key: "fh3hqa" }], 17126 ["path", { d: "M15 3v18", key: "14nvp0" }] 17127]); 17128/** 17129 * @license lucide-react v0.294.0 - ISC 17130 * 17131 * This source code is licensed under the ISC license. 17132 * See the LICENSE file in the root directory of this source tree. 17133 */ 17134const Home = createLucideIcon("Home", [ 17135 ["path", { d: "m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z", key: "y5dka4" }], 17136 ["polyline", { points: "9 22 9 12 15 12 15 22", key: "e2us08" }] 17137]); 17138/** 17139 * @license lucide-react v0.294.0 - ISC 17140 * 17141 * This source code is licensed under the ISC license. 17142 * See the LICENSE file in the root directory of this source tree. 17143 */ 17144const Layers = createLucideIcon("Layers", [ 17145 [ 17146 "path", 17147 { 17148 d: "m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z", 17149 key: "8b97xw" 17150 } 17151 ], 17152 ["path", { d: "m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65", key: "dd6zsq" }], 17153 ["path", { d: "m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65", key: "ep9fru" }] 17154]); 17155/** 17156 * @license lucide-react v0.294.0 - ISC 17157 * 17158 * This source code is licensed under the ISC license. 17159 * See the LICENSE file in the root directory of this source tree. 17160 */ 17161const List = createLucideIcon("List", [ 17162 ["line", { x1: "8", x2: "21", y1: "6", y2: "6", key: "7ey8pc" }], 17163 ["line", { x1: "8", x2: "21", y1: "12", y2: "12", key: "rjfblc" }], 17164 ["line", { x1: "8", x2: "21", y1: "18", y2: "18", key: "c3b1m8" }], 17165 ["line", { x1: "3", x2: "3.01", y1: "6", y2: "6", key: "1g7gq3" }], 17166 ["line", { x1: "3", x2: "3.01", y1: "12", y2: "12", key: "1pjlvk" }], 17167 ["line", { x1: "3", x2: "3.01", y1: "18", y2: "18", key: "28t2mc" }] 17168]); 17169/** 17170 * @license lucide-react v0.294.0 - ISC 17171 * 17172 * This source code is licensed under the ISC license. 17173 * See the LICENSE file in the root directory of this source tree. 17174 */ 17175const Loader2 = createLucideIcon("Loader2", [ 17176 ["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }] 17177]); 17178/** 17179 * @license lucide-react v0.294.0 - ISC 17180 * 17181 * This source code is licensed under the ISC license. 17182 * See the LICENSE file in the root directory of this source tree. 17183 */ 17184const Mail = createLucideIcon("Mail", [ 17185 ["rect", { width: "20", height: "16", x: "2", y: "4", rx: "2", key: "18n3k1" }], 17186 ["path", { d: "m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7", key: "1ocrg3" }] 17187]); 17188/** 17189 * @license lucide-react v0.294.0 - ISC 17190 * 17191 * This source code is licensed under the ISC license. 17192 * See the LICENSE file in the root directory of this source tree. 17193 */ 17194const MapPin = createLucideIcon("MapPin", [ 17195 ["path", { d: "M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z", key: "2oe9fu" }], 17196 ["circle", { cx: "12", cy: "10", r: "3", key: "ilqhr7" }] 17197]); 17198/** 17199 * @license lucide-react v0.294.0 - ISC 17200 * 17201 * This source code is licensed under the ISC license. 17202 * See the LICENSE file in the root directory of this source tree. 17203 */ 17204const Map$1 = createLucideIcon("Map", [ 17205 ["polygon", { points: "3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21", key: "ok2ie8" }], 17206 ["line", { x1: "9", x2: "9", y1: "3", y2: "18", key: "w34qz5" }], 17207 ["line", { x1: "15", x2: "15", y1: "6", y2: "21", key: "volv9a" }] 17208]); 17209/** 17210 * @license lucide-react v0.294.0 - ISC 17211 * 17212 * This source code is licensed under the ISC license. 17213 * See the LICENSE file in the root directory of this source tree. 17214 */ 17215const Phone = createLucideIcon("Phone", [ 17216 [ 17217 "path", 17218 { 17219 d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z", 17220 key: "foiqr5" 17221 } 17222 ] 17223]); 17224/** 17225 * @license lucide-react v0.294.0 - ISC 17226 * 17227 * This source code is licensed under the ISC license. 17228 * See the LICENSE file in the root directory of this source tree. 17229 */
17230const RefreshCw = createLucideIcon("RefreshCw", [ 17231 ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }], 17232 ["path", { d: "M21 3v5h-5", key: "1q7to0" }], 17233 ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }], 17234 ["path", { d: "M8 16H3v5", key: "1cv678" }] 17235]); 17236/** 17237 * @license lucide-react v0.294.0 - ISC 17238 * 17239 * This source code is licensed under the ISC license. 17240 * See the LICENSE file in the root directory of this source tree. 17241 */ 17242const RotateCcw = createLucideIcon("RotateCcw", [ 17243 ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }], 17244 ["path", { d: "M3 3v5h5", key: "1xhq8a" }] 17245]); 17246/** 17247 * @license lucide-react v0.294.0 - ISC 17248 * 17249 * This source code is licensed under the ISC license. 17250 * See the LICENSE file in the root directory of this source tree. 17251 */ 17252const Search = createLucideIcon("Search", [ 17253 ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }], 17254 ["path", { d: "m21 21-4.3-4.3", key: "1qie3q" }] 17255]); 17256/** 17257 * @license lucide-react v0.294.0 - ISC 17258 * 17259 * This source code is licensed under the ISC license. 17260 * See the LICENSE file in the root directory of this source tree. 17261 */ 17262const Settings = createLucideIcon("Settings", [ 17263 [ 17264 "path", 17265 { 17266 d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z", 17267 key: "1qme2f" 17268 } 17269 ], 17270 ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }] 17271]); 17272/** 17273 * @license lucide-react v0.294.0 - ISC 17274 * 17275 * This source code is licensed under the ISC license. 17276 * See the LICENSE file in the root directory of this source tree. 17277 */ 17278const ShoppingBag = createLucideIcon("ShoppingBag", [ 17279 ["path", { d: "M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z", key: "hou9p0" }], 17280 ["path", { d: "M3 6h18", key: "d0wm0j" }], 17281 ["path", { d: "M16 10a4 4 0 0 1-8 0", key: "1ltviw" }] 17282]); 17283/** 17284 * @license lucide-react v0.294.0 - ISC 17285 * 17286 * This source code is licensed under the ISC license. 17287 * See the LICENSE file in the root directory of this source tree. 17288 */ 17289const User = createLucideIcon("User", [ 17290 ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }], 17291 ["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }] 17292]); 17293/** 17294 * @license lucide-react v0.294.0 - ISC 17295 * 17296 * This source code is licensed under the ISC license. 17297 * See the LICENSE file in the root directory of this source tree. 17298 */ 17299const Users = createLucideIcon("Users", [ 17300 ["path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2", key: "1yyitq" }], 17301 ["circle", { cx: "9", cy: "7", r: "4", key: "nufk8" }], 17302 ["path", { d: "M22 21v-2a4 4 0 0 0-3-3.87", key: "kshegd" }], 17303 ["path", { d: "M16 3.13a4 4 0 0 1 0 7.75", key: "1da9ce" }] 17304]); 17305/** 17306 * @license lucide-react v0.294.0 - ISC 17307 * 17308 * This source code is licensed under the ISC license. 17309 * See the LICENSE file in the root directory of this source tree. 17310 */ 17311const WifiOff = createLucideIcon("WifiOff", [ 17312 ["line", { x1: "2", x2: "22", y1: "2", y2: "22", key: "a6p6uj" }], 17313 ["path", { d: "M8.5 16.5a5 5 0 0 1 7 0", key: "sej527" }], 17314 ["path", { d: "M2 8.82a15 15 0 0 1 4.17-2.65", key: "11utq1" }], 17315 ["path", { d: "M10.66 5c4.01-.36 8.14.9 11.34 3.76", key: "hxefdu" }], 17316 ["path", { d: "M16.85 11.25a10 10 0 0 1 2.22 1.68", key: "q734kn" }], 17317 ["path", { d: "M5 13a10 10 0 0 1 5.24-2.76", key: "piq4yl" }], 17318 ["line", { x1: "12", x2: "12.01", y1: "20", y2: "20", key: "of4bc4" }] 17319]); 17320/** 17321 * @license lucide-react v0.294.0 - ISC 17322 * 17323 * This source code is licensed under the ISC license. 17324 * See the LICENSE file in the root directory of this source tree. 17325 */ 17326const Wifi = createLucideIcon("Wifi", [ 17327 ["path", { d: "M5 13a10 10 0 0 1 14 0", key: "6v8j51" }], 17328 ["path", { d: "M8.5 16.5a5 5 0 0 1 7 0", key: "sej527" }],
17329 ["path", { d: "M2 8.82a15 15 0 0 1 20 0", key: "dnpr2z" }], 17330 ["line", { x1: "12", x2: "12.01", y1: "20", y2: "20", key: "of4bc4" }] 17331]); 17332/** 17333 * @license lucide-react v0.294.0 - ISC 17334 * 17335 * This source code is licensed under the ISC license. 17336 * See the LICENSE file in the root directory of this source tree. 17337 */ 17338const X = createLucideIcon("X", [ 17339 ["path", { d: "M18 6 6 18", key: "1bl5f8" }], 17340 ["path", { d: "m6 6 12 12", key: "d8bk6v" }] 17341]); 17342/** 17343 * @license lucide-react v0.294.0 - ISC 17344 * 17345 * This source code is licensed under the ISC license. 17346 * See the LICENSE file in the root directory of this source tree. 17347 */ 17348const ZoomIn = createLucideIcon("ZoomIn", [ 17349 ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }], 17350 ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65", key: "13gj7c" }], 17351 ["line", { x1: "11", x2: "11", y1: "8", y2: "14", key: "1vmskp" }], 17352 ["line", { x1: "8", x2: "14", y1: "11", y2: "11", key: "durymu" }] 17353]); 17354/** 17355 * @license lucide-react v0.294.0 - ISC 17356 * 17357 * This source code is licensed under the ISC license. 17358 * See the LICENSE file in the root directory of this source tree. 17359 */ 17360const ZoomOut = createLucideIcon("ZoomOut", [ 17361 ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }], 17362 ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65", key: "13gj7c" }], 17363 ["line", { x1: "8", x2: "14", y1: "11", y2: "11", key: "durymu" }] 17364]); 17365let ErrorBoundary$1 = class ErrorBoundary extends reactExports.Component { 17366 constructor(props) { 17367 super(props); 17368 __publicField(this, "handleRetry", () => { 17369 this.setState({ hasError: false, error: void 0, errorInfo: void 0 }); 17370 }); 17371 this.state = { hasError: false }; 17372 } 17373 static getDerivedStateFromError(error) { 17374 return { 17375 hasError: true, 17376 error 17377 }; 17378 } 17379 componentDidCatch(error, errorInfo) { 17380 this.setState({ 17381 error, 17382 errorInfo 17383 }); 17384 console.error("ErrorBoundary caught an error:", error, errorInfo); 17385 this.props.onError?.(error, errorInfo); 17386 } 17387 render() { 17388 if (this.state.hasError) { 17389 if (this.props.fallback) { 17390 return this.props.fallback; 17391 } 17392 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `p-6 text-center bg-background-secondary rounded-mec border border-background-tertiary ${this.props.className || ""}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center space-y-4", children: [
17393 /* @__PURE__ */ jsxRuntimeExports.jsx(AlertTriangle, { className: "w-12 h-12 text-red-500" }), 17394 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 17395 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Oops! Etwas ist schiefgelaufen" }), 17396 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Diese Komponente konnte nicht geladen werden." }) 17397 ] }), 17398 this.props.showDetails && this.state.error && /* @__PURE__ */ jsxRuntimeExports.jsxs("details", { className: "w-full max-w-md", children: [ 17399 /* @__PURE__ */ jsxRuntimeExports.jsx("summary", { className: "cursor-pointer text-sm text-text-muted hover:text-text-secondary", children: "Technische Details anzeigen" }), 17400 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 p-3 bg-red-50 rounded border text-left", children: [ 17401 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-mono text-red-800 break-all", children: this.state.error.message }),
17402 this.state.errorInfo?.componentStack && /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "mt-2 text-xs text-red-700 overflow-auto max-h-32", children: this.state.errorInfo.componentStack }) 17403 ] }) 17404 ] }), 17405 /* @__PURE__ */ jsxRuntimeExports.jsxs( 17406 "button", 17407 { 17408 onClick: this.handleRetry, 17409 className: "btn-primary inline-flex items-center gap-2", 17410 children: [ 17411 /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "w-4 h-4" }), 17412 "Erneut versuchen" 17413 ] 17414 } 17415 ) 17416 ] }) }); 17417 } 17418 return this.props.children; 17419 } 17420}; 17421class MapTooltipHandler { 17422 constructor(container, locations, contacts = []) { 17423 __publicField(this, "container"); 17424 __publicField(this, "locations"); 17425 __publicField(this, "contacts", []); 17426 __publicField(this, "tooltipElement", null); 17427 __publicField(this, "currentLocationId", null); 17428 __publicField(this, "showTimeout", null); 17429 __publicField(this, "hideTimeout", null); 17430 __publicField(this, "isTouch", false); 17431 this.container = container; 17432 this.locations = locations; 17433 this.contacts = contacts; 17434 this.createTooltipElement(); 17435 this.bindEvents(); 17436 } 17437 createTooltipElement() { 17438 this.tooltipElement = document.createElement("div"); 17439 this.tooltipElement.className = ` 17440 fixed z-50 px-3 py-2 text-sm text-white bg-gray-900 rounded-lg shadow-lg 17441 pointer-events-none opacity-0 transition-opacity duration-200 17442 max-w-[280px] 17443 `.trim(); 17444 document.body.appendChild(this.tooltipElement); 17445 } 17446 bindEvents() { 17447 this.container.addEventListener("touchstart", () => { 17448 this.isTouch = true; 17449 }, { once: true, passive: true }); 17450 this.container.addEventListener("mouseover", this.handleMouseOver.bind(this)); 17451 this.container.addEventListener("mouseout", this.handleMouseOut.bind(this)); 17452 this.container.addEventListener("mousemove", this.handleMouseMove.bind(this)); 17453 window.addEventListener("resize", this.hideTooltip.bind(this)); 17454 } 17455 handleMouseOver(event) { 17456 if (this.isTouch) return; 17457 const target = event.target; 17458 const locationElement = target.closest("[data-location-id]"); 17459 if (locationElement) { 17460 const locationId = locationElement.getAttribute("data-location-id"); 17461 if (locationId && locationId !== this.currentLocationId) { 17462 this.currentLocationId = locationId; 17463 this.showTooltip(locationId, event); 17464 } 17465 } 17466 } 17467 handleMouseOut(event) { 17468 if (this.isTouch) return; 17469 const target = event.target; 17470 const locationElement = target.closest("[data-location-id]"); 17471 if (!locationElement) { 17472 this.scheduleHideTooltip(); 17473 } 17474 } 17475 handleMouseMove(event) { 17476 if (this.isTouch || !this.tooltipElement || !this.currentLocationId) return; 17477 this.updateTooltipPosition(event.clientX, event.clientY); 17478 } 17479 showTooltip(locationId, event) { 17480 if (!this.tooltipElement) return; 17481 if (this.hideTimeout) { 17482 clearTimeout(this.hideTimeout); 17483 this.hideTimeout = null; 17484 } 17485 const location = this.locations.find((loc) => loc.id === locationId); 17486 if (!location) return; 17487 const primaryContact = this.contacts.find( 17488 (contact) => contact.locationId === locationId && contact.isActive 17489 ); 17490 const tooltipData = { 17491 locationName: location.name, 17492 contactName: primaryContact?.fullName, 17493 contactRole: primaryContact?.position 17494 }; 17495 this.updateTooltipContent(tooltipData); 17496 this.showTimeout = setTimeout(() => { 17497 if (this.tooltipElement) { 17498 this.tooltipElement.style.opacity = "1"; 17499 this.updateTooltipPosition(event.clientX, event.clientY); 17500 } 17501 }, 300); 17502 } 17503 scheduleHideTooltip() { 17504 if (this.showTimeout) { 17505 clearTimeout(this.showTimeout); 17506 this.showTimeout = null; 17507 } 17508 this.hideTimeout = setTimeout(() => { 17509 this.hideTooltip(); 17510 }, 100); 17511 } 17512 hideTooltip() { 17513 if (this.tooltipElement) { 17514 this.tooltipElement.style.opacity = "0"; 17515 } 17516 this.currentLocationId = null; 17517 if (this.showTimeout) { 17518 clearTimeout(this.showTimeout); 17519 this.showTimeout = null; 17520 } 17521 if (this.hideTimeout) { 17522 clearTimeout(this.hideTimeout); 17523 this.hideTimeout = null; 17524 } 17525 } 17526 updateTooltipContent(data) { 17527 if (!this.tooltipElement) return;
17528 let content = `<div class="text-center">`; 17529 content += `<div class="font-semibold text-white mb-1">${data.locationName}</div>`; 17530 if (data.contactName) { 17531 content += `<div class="text-gray-300 text-xs">`; 17532 content += `<div>${data.contactName}</div>`; 17533 if (data.contactRole) { 17534 content += `<div class="text-gray-400">${data.contactRole}</div>`; 17535 } 17536 content += `</div>`; 17537 } else { 17538 content += `<div class="text-gray-400 text-xs">Kein Ansprechpartner zugewiesen</div>`; 17539 } 17540 content += `</div>`; 17541 this.tooltipElement.innerHTML = content; 17542 } 17543 updateTooltipPosition(mouseX, mouseY) { 17544 if (!this.tooltipElement) return; 17545 const tooltip = this.tooltipElement; 17546 const rect = tooltip.getBoundingClientRect(); 17547 const viewport = { 17548 width: window.innerWidth, 17549 height: window.innerHeight 17550 }; 17551 const spacing = 12; 17552 let x2 = mouseX + spacing; 17553 let y2 = mouseY - rect.height - spacing; 17554 if (x2 + rect.width > viewport.width) { 17555 x2 = mouseX - rect.width - spacing; 17556 } 17557 if (y2 < 0) { 17558 y2 = mouseY + spacing; 17559 } 17560 x2 = Math.max(spacing, Math.min(x2, viewport.width - rect.width - spacing)); 17561 y2 = Math.max(spacing, Math.min(y2, viewport.height - rect.height - spacing)); 17562 tooltip.style.left = `${x2}px`; 17563 tooltip.style.top = `${y2}px`; 17564 } 17565 updateLocations(locations) { 17566 this.locations = locations; 17567 if (this.currentLocationId && !locations.find((loc) => loc.id === this.currentLocationId)) { 17568 this.hideTooltip(); 17569 } 17570 } 17571 destroy() { 17572 if (this.showTimeout) { 17573 clearTimeout(this.showTimeout); 17574 } 17575 if (this.hideTimeout) { 17576 clearTimeout(this.hideTimeout); 17577 } 17578 if (this.tooltipElement) { 17579 document.body.removeChild(this.tooltipElement); 17580 this.tooltipElement = null; 17581 } 17582 this.container.removeEventListener("mouseover", this.handleMouseOver.bind(this)); 17583 this.container.removeEventListener("mouseout", this.handleMouseOut.bind(this)); 17584 this.container.removeEventListener("mousemove", this.handleMouseMove.bind(this)); 17585 window.removeEventListener("resize", this.hideTooltip.bind(this)); 17586 } 17587} 17588class MapHandler { 17589 constructor(options) { 17590 __publicField(this, "container"); 17591 __publicField(this, "locations"); 17592 __publicField(this, "contacts"); 17593 __publicField(this, "selectedLocationId"); 17594 __publicField(this, "onLocationSelect"); 17595 __publicField(this, "enableZoom"); 17596 __publicField(this, "enablePan"); 17597 __publicField(this, "panZoomInstance", null); 17598 __publicField(this, "svgElement", null); 17599 __publicField(this, "locationElements", /* @__PURE__ */ new Map()); 17600 __publicField(this, "tooltipHandler", null); 17601 __publicField(this, "isInitialized", false); 17602 __publicField(this, "touchStartTime", 0); 17603 __publicField(this, "touchStartPosition", { x: 0, y: 0 }); 17604 __publicField(this, "touchMoved", false); 17605 __publicField(this, "TOUCH_DELAY_MS", 50); 17606 // Minimum touch duration to prevent accidental taps 17607 __publicField(this, "TOUCH_MOVE_THRESHOLD", 15); 17608 this.container = options.container; 17609 this.locations = options.locations; 17610 this.contacts = options.contacts || []; 17611 this.selectedLocationId = options.selectedLocationId || null; 17612 this.onLocationSelect = options.onLocationSelect; 17613 this.enableZoom = options.enableZoom ?? true; 17614 this.enablePan = options.enablePan ?? true; 17615 } 17616 async initialize() { 17617 try { 17618 this.svgElement = this.container.querySelector("svg"); 17619 if (!this.svgElement) { 17620 throw new Error("No SVG element found in container"); 17621 } 17622 this.setupSVGViewport(); 17623 await this.loadSvgPanZoom(); 17624 this.setupPanZoom(); 17625 this.setupLocationElements(); 17626 this.bindEvents(); 17627 this.setupTooltips(); 17628 if (this.selectedLocationId) { 17629 this.highlightLocation(this.selectedLocationId); 17630 } 17631 this.isInitialized = true; 17632 } catch (error) { 17633 console.error("Failed to initialize map handler:", error); 17634 throw error; 17635 } 17636 } 17637 setupSVGViewport() { 17638 if (!this.svgElement) return; 17639 this.svgElement.style.width = "100%"; 17640 this.svgElement.style.height = "100%"; 17641 this.svgElement.style.display = "block"; 17642 this.svgElement.setAttribute("preserveAspectRatio", "xMidYMid meet"); 17643 if (!this.svgElement.getAttribute("viewBox")) {
17644 try { 17645 const bbox = this.svgElement.getBBox(); 17646 this.svgElement.setAttribute("viewBox", `${bbox.x} ${bbox.y} ${bbox.width} ${bbox.height}`); 17647 } catch (error) { 17648 console.warn("Could not get SVG bounding box, using default viewBox"); 17649 } 17650 } 17651 } 17652 async loadSvgPanZoom() { 17653 if (window.svgPanZoom) { 17654 return; 17655 } 17656 return new Promise((resolve, reject) => { 17657 const script = document.createElement("script"); 17658 script.src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/svg-pan-zoom.min.js"; 17659 script.onload = () => resolve(); 17660 script.onerror = () => reject(new Error("Failed to load svg-pan-zoom library")); 17661 document.head.appendChild(script); 17662 }); 17663 } 17664 setupPanZoom() { 17665 if (!this.svgElement || !window.svgPanZoom) return; 17666 this.panZoomInstance = window.svgPanZoom(this.svgElement, { 17667 zoomEnabled: this.enableZoom, 17668 panEnabled: this.enablePan, 17669 controlIconsEnabled: false, 17670 // We'll use custom controls 17671 fit: true, 17672 center: true, 17673 minZoom: 0.8, 17674 maxZoom: 8, 17675 zoomScaleSensitivity: 0.15, 17676 // Smoother zoom steps 17677 dblClickZoomEnabled: this.enableZoom, 17678 mouseWheelZoomEnabled: this.enableZoom, 17679 preventMouseEventsDefault: true, 17680 // Smooth animations 17681 animationTime: 300, 17682 easing: "easeInOutCubic", 17683 beforeZoom: () => { 17684 this.svgElement?.classList.add("zooming"); 17685 }, 17686 onZoom: () => { 17687 setTimeout(() => { 17688 this.svgElement?.classList.remove("zooming"); 17689 }, 350); 17690 } 17691 }); 17692 } 17693 setupLocationElements() { 17694 if (!this.svgElement) return; 17695 this.locationElements.clear(); 17696 const locationElements = this.svgElement.querySelectorAll('[data-location-id], [id^="location-"], [id^="hover-location-"]'); 17697 console.log("ðºï¸ Found", locationElements.length, "location elements in SVG"); 17698 locationElements.forEach((element) => { 17699 let locationId = element.getAttribute("data-location-id"); 17700 if (!locationId && element.id) { 17701 const match = element.id.match(/^(?:hover-)?location-(\d+)$/); 17702 if (match) { 17703 locationId = match[1]; 17704 element.setAttribute("data-location-id", locationId); 17705 } 17706 } 17707 if (locationId && element instanceof SVGElement) { 17708 const internalLocationId = `wp-${locationId}`; 17709 this.locationElements.set(internalLocationId, element); 17710 element.classList.add("map-location"); 17711 } 17712 }); 17713 console.log(`Found ${this.locationElements.size} location elements on map`); 17714 } 17715 setupTooltips() { 17716 if (!this.container) return; 17717 this.tooltipHandler = new MapTooltipHandler(this.container, this.locations, this.contacts); 17718 } 17719 // Max pixels moved to still count as tap 17720 bindEvents() { 17721 if (!this.container) return; 17722 this.container.addEventListener("touchstart", this.handleTouchStart.bind(this), { passive: true }); 17723 this.container.addEventListener("touchmove", this.handleTouchMove.bind(this), { passive: true }); 17724 this.container.addEventListener("touchend", this.handleTouchEnd.bind(this), { passive: false }); 17725 this.container.addEventListener("click", this.handleClick.bind(this), { passive: false }); 17726 } 17727 handleTouchStart(event) { 17728 this.container.dataset.touchActive = "true"; 17729 this.touchStartTime = Date.now(); 17730 this.touchMoved = false; 17731 if (event.touches.length > 0) { 17732 const touch = event.touches[0]; 17733 this.touchStartPosition = { x: touch.clientX, y: touch.clientY }; 17734 } 17735 } 17736 handleTouchMove(event) { 17737 if (event.touches.length > 0) { 17738 const touch = event.touches[0]; 17739 const deltaX = Math.abs(touch.clientX - this.touchStartPosition.x); 17740 const deltaY = Math.abs(touch.clientY - this.touchStartPosition.y); 17741 if (deltaX > this.TOUCH_MOVE_THRESHOLD || deltaY > this.TOUCH_MOVE_THRESHOLD) { 17742 this.touchMoved = true; 17743 } 17744 } 17745 } 17746 handleTouchEnd(event) { 17747 event.preventDefault(); 17748 const touchDuration = Date.now() - this.touchStartTime; 17749 console.log("ð Touch end - duration:", touchDuration, "moved:", this.touchMoved); 17750 if (touchDuration >= this.TOUCH_DELAY_MS && !this.touchMoved) { 17751 const target = event.target; 17752 const locationElement = target.closest("[data-location-id]"); 17753 console.log("ð¯ Touch location element found:", locationElement); 17754 if (locationElement) { 17755 const locationId = locationElement.getAttribute("data-location-id"); 17756 console.log("ð Touch location ID:", locationId); 17757 if (locationId) { 17758 this.handleLocationTouch(locationId, locationElement); 17759 } 17760 } else { 17761 console.log("â No location element found for touch"); 17762 } 17763 } else { 17764 console.log("âï¸ Touch ignored - too short or moved too much"); 17765 } 17766 setTimeout(() => { 17767 delete this.container.dataset.touchActive; 17768 }, 300); 17769 } 17770 handleClick(event) { 17771 console.log("ð±ï¸ Click event:", event.target); 17772 if (this.container.dataset.touchActive) { 17773 console.log("âï¸ Skipping click - touch active"); 17774 return; 17775 } 17776 const target = event.target; 17777 const locationElement = target.closest("[data-location-id]"); 17778 console.log("ð¯ Location element found:", locationElement); 17779 if (locationElement) { 17780 const locationId = locationElement.getAttribute("data-location-id"); 17781 console.log("ð Location ID:", locationId); 17782 if (locationId) { 17783 this.handleLocationClick(locationId, locationElement); 17784 } 17785 } else { 17786 console.log("â No location element found for click"); 17787 } 17788 } 17789 handleLocationTouch(locationId, element) { 17790 element.classList.add("map-location-active"); 17791 setTimeout(() => { 17792 element.classList.remove("map-location-active"); 17793 }, 150); 17794 this.setSelectedLocation(locationId); 17795 this.onLocationSelect(locationId); 17796 } 17797 handleLocationClick(locationId, element) { 17798 element.classList.add("map-location-active"); 17799 setTimeout(() => { 17800 element.classList.remove("map-location-active"); 17801 }, 200); 17802 this.setSelectedLocation(locationId); 17803 this.onLocationSelect(locationId); 17804 if (this.enableZoom && this.panZoomInstance) { 17805 this.zoomToLocation(locationId); 17806 } 17807 } 17808 highlightLocation(locationId) {
17809 this.locationElements.forEach((element2, id2) => { 17810 element2.classList.remove("map-location-selected"); 17811 }); 17812 const element = this.locationElements.get(locationId); 17813 if (element) { 17814 element.classList.add("map-location-selected"); 17815 } 17816 } 17817 zoomToLocation(locationId) { 17818 const element = this.locationElements.get(locationId); 17819 if (!element || !this.panZoomInstance || !this.svgElement) return; 17820 try { 17821 const bbox = element.getBBox(); 17822 const svgRect = this.svgElement.getBoundingClientRect(); 17823 const centerX = bbox.x + bbox.width / 2; 17824 const centerY = bbox.y + bbox.height / 2; 17825 const padding = 50; 17826 const scaleX = (svgRect.width - padding * 2) / bbox.width; 17827 const scaleY = (svgRect.height - padding * 2) / bbox.height; 17828 const scale = Math.min(scaleX, scaleY, 3); 17829 this.panZoomInstance.zoom(scale); 17830 this.panZoomInstance.pan({ 17831 x: svgRect.width / 2 - centerX * scale, 17832 y: svgRect.height / 2 - centerY * scale 17833 }); 17834 } catch (error) { 17835 console.warn("Failed to zoom to location:", error); 17836 } 17837 } 17838 // Public methods 17839 updateLocations(locations) { 17840 this.locations = locations; 17841 if (this.isInitialized) { 17842 this.setupLocationElements(); 17843 } 17844 if (this.tooltipHandler) { 17845 this.tooltipHandler.updateLocations(locations); 17846 } 17847 } 17848 setSelectedLocation(locationId) { 17849 this.selectedLocationId = locationId; 17850 if (this.isInitialized && locationId) { 17851 this.highlightLocation(locationId); 17852 } 17853 } 17854 // Pan/Zoom controls 17855 zoomIn() { 17856 this.panZoomInstance?.zoomIn(); 17857 } 17858 zoomOut() { 17859 this.panZoomInstance?.zoomOut(); 17860 } 17861 resetView() { 17862 this.panZoomInstance?.reset(); 17863 } 17864 fitToView() { 17865 this.panZoomInstance?.fit(); 17866 } 17867 centerView() { 17868 this.panZoomInstance?.center(); 17869 } 17870 getZoomLevel() { 17871 return this.panZoomInstance?.getZoom() || 1; 17872 } 17873 destroy() { 17874 if (this.panZoomInstance) { 17875 this.panZoomInstance.destroy(); 17876 this.panZoomInstance = null; 17877 } 17878 if (this.tooltipHandler) { 17879 this.tooltipHandler.destroy(); 17880 this.tooltipHandler = null; 17881 } 17882 this.locationElements.clear(); 17883 this.isInitialized = false; 17884 } 17885} 17886const MapControls = ({ 17887 mapHandler, 17888 className, 17889 variant = "default" 17890}) => {
17891 const [zoomLevel, setZoomLevel] = reactExports.useState(1); 17892 reactExports.useEffect(() => { 17893 const updateZoomLevel = () => { 17894 const currentZoom = mapHandler.getZoomLevel(); 17895 setZoomLevel(Math.round(currentZoom * 100) / 100); 17896 }; 17897 updateZoomLevel(); 17898 const interval = setInterval(updateZoomLevel, 500); 17899 return () => clearInterval(interval); 17900 }, [mapHandler]); 17901 const controlButtonClass = clsx( 17902 "flex items-center justify-center w-10 h-10 bg-white border border-background-tertiary rounded-mec shadow-sm", 17903 "hover:bg-background-secondary hover:border-mec-primary/20 hover:shadow-md", 17904 "active:scale-95 transition-all duration-150", 17905 "text-text-secondary hover:text-mec-primary", 17906 "touch-manipulation tap-highlight-none" 17907 ); 17908 const compactButtonClass = clsx( 17909 "flex items-center justify-center w-8 h-8 bg-white/90 backdrop-blur-sm rounded border border-white/20", 17910 "hover:bg-white hover:border-mec-primary/20", 17911 "active:scale-95 transition-all duration-150", 17912 "text-text-secondary hover:text-mec-primary", 17913 "touch-manipulation tap-highlight-none" 17914 ); 17915 const buttonClass = variant === "compact" ? compactButtonClass : controlButtonClass; 17916 const iconSize = variant === "compact" ? "w-3 h-3" : "w-4 h-4"; 17917 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("flex flex-col space-y-2", className), children: [ 17918 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col space-y-1", children: [
17919 /* @__PURE__ */ jsxRuntimeExports.jsx( 17920 "button", 17921 { 17922 onClick: () => mapHandler.zoomIn(), 17923 className: buttonClass, 17924 title: "VergröÃern", 17925 "aria-label": "Karte vergröÃern", 17926 children: /* @__PURE__ */ jsxRuntimeExports.jsx(ZoomIn, { className: iconSize }) 17927 } 17928 ), 17929 /* @__PURE__ */ jsxRuntimeExports.jsx( 17930 "button", 17931 { 17932 onClick: () => mapHandler.zoomOut(), 17933 className: buttonClass, 17934 title: "Verkleinern", 17935 "aria-label": "Karte verkleinern", 17936 children: /* @__PURE__ */ jsxRuntimeExports.jsx(ZoomOut, { className: iconSize }) 17937 } 17938 ) 17939 ] }), 17940 variant === "default" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/90 backdrop-blur-sm border border-background-tertiary rounded-mec px-2 py-1 shadow-sm", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-text-secondary font-mono", children: [ 17941 Math.round(zoomLevel * 100), 17942 "%" 17943 ] }) }), 17944 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col space-y-1", children: [
17945 /* @__PURE__ */ jsxRuntimeExports.jsx( 17946 "button", 17947 { 17948 onClick: () => mapHandler.centerView(), 17949 className: buttonClass, 17950 title: "Zentrieren", 17951 "aria-label": "Karte zentrieren", 17952 children: /* @__PURE__ */ jsxRuntimeExports.jsx(Crosshair, { className: iconSize }) 17953 } 17954 ), 17955 /* @__PURE__ */ jsxRuntimeExports.jsx( 17956 "button", 17957 { 17958 onClick: () => mapHandler.resetView(), 17959 className: buttonClass, 17960 title: "Zurücksetzen", 17961 "aria-label": "Ansicht zurücksetzen", 17962 children: /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: iconSize }) 17963 } 17964 ) 17965 ] }) 17966 ] }); 17967}; 17968const mapSvg = "/assets/map-BpCifMi3.svg"; 17969const MapContainer = ({ 17970 locations, 17971 contacts = [], 17972 selectedLocationId, 17973 className, 17974 height = 500, 17975 enableZoom = true, 17976 // Enable zoom for better pin targeting 17977 enablePan = true, 17978 // Enable pan for navigation 17979 svgUrl = mapSvg, 17980 // Use imported SVG 17981 showControls = true, 17982 // Show zoom controls 17983 showLoadingButton = false 17984}) => { 17985 const containerRef = reactExports.useRef(null); 17986 const svgContainerRef = reactExports.useRef(null); 17987 const mapHandlerRef = reactExports.useRef(null); 17988 const { setSelectedLocation, openLocationModal } = useAppStore(); 17989 const [isLoading, setIsLoading] = reactExports.useState(false); 17990 const [isMapLoaded, setIsMapLoaded] = reactExports.useState(false); 17991 const [error, setError] = reactExports.useState(null); 17992 const handleLocationSelect = (locationId) => { 17993 setSelectedLocation(locationId); 17994 openLocationModal(locationId); 17995 }; 17996 const loadMap = async () => { 17997 if (!svgContainerRef.current || isMapLoaded) return; 17998 setIsLoading(true); 17999 setError(null); 18000 try { 18001 const response = await fetch(svgUrl); 18002 if (!response.ok) { 18003 throw new Error(`Failed to load map: ${response.statusText}`); 18004 } 18005 const svgContent = await response.text(); 18006 if (svgContainerRef.current) { 18007 svgContainerRef.current.innerHTML = svgContent; 18008 if (mapHandlerRef.current) { 18009 mapHandlerRef.current.destroy(); 18010 } 18011 mapHandlerRef.current = new MapHandler({ 18012 container: svgContainerRef.current, 18013 locations, 18014 contacts, 18015 selectedLocationId, 18016 onLocationSelect: handleLocationSelect, 18017 enableZoom, 18018 enablePan 18019 }); 18020 await mapHandlerRef.current.initialize(); 18021 setIsMapLoaded(true); 18022 } 18023 } catch (err) { 18024 const errorMessage = err instanceof Error ? err.message : "Failed to load map"; 18025 setError(errorMessage); 18026 console.error("Map loading error:", err); 18027 } finally { 18028 setIsLoading(false); 18029 } 18030 }; 18031 reactExports.useEffect(() => { 18032 if (mapHandlerRef.current && isMapLoaded) { 18033 mapHandlerRef.current.updateLocations(locations); 18034 } 18035 }, [locations, isMapLoaded]); 18036 reactExports.useEffect(() => { 18037 if (mapHandlerRef.current && isMapLoaded) { 18038 mapHandlerRef.current.setSelectedLocation(selectedLocationId || null); 18039 } 18040 }, [selectedLocationId, isMapLoaded]); 18041 reactExports.useEffect(() => { 18042 return () => { 18043 if (mapHandlerRef.current) { 18044 mapHandlerRef.current.destroy(); 18045 } 18046 }; 18047 }, []); 18048 reactExports.useEffect(() => { 18049 if (!isMapLoaded && !isLoading && !error) { 18050 loadMap(); 18051 } 18052 }, [isMapLoaded, isLoading, error]); 18053 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18054 "div", 18055 { 18056 ref: containerRef, 18057 className: clsx("relative bg-background-secondary", className), 18058 style: { 18059 height, 18060 touchAction: "manipulation", 18061 // Allow zoom and pan gestures 18062 userSelect: "none" 18063 // Prevent text selection on touch 18064 }, 18065 children: [ 18066 !isMapLoaded && !error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex flex-col items-center justify-center", children: isLoading ? /* @__P
18066URE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [ 18067 /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }), 18068 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-text-secondary", children: "Karte wird geladen..." }) 18069 ] }) : showLoadingButton ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [ 18070 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4", children: [ 18071 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-mec-primary/10 rounded-full flex items-center justify-center mx-auto mb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-8 h-8 text-mec-primary", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-1.447-.894L15 4m0 13V4m-6 3l6-3" }) }) }),
18072 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Interaktive Karte" }), 18073 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4", children: 'Klicken Sie auf "Karte laden" um die interaktive Standortkarte anzuzeigen' }) 18074 ] }), 18075 /* @__PURE__ */ jsxRuntimeExports.jsx( 18076 "button", 18077 { 18078 onClick: loadMap, 18079 className: "btn-primary", 18080 disabled: isLoading, 18081 children: "Karte laden" 18082 } 18083 ) 18084 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [ 18085 /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }), 18086 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-text-secondary", children: "Karte wird automatisch geladen..." }) 18087 ] }) }), 18088 error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-6", children: [
18089 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-8 h-8 text-red-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" }) }) }), 18090 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Karte konnte nicht geladen werden" }), 18091 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4 text-sm", children: error }), 18092 /* @__PURE__ */ jsxRuntimeExports.jsx( 18093 "button", 18094 { 18095 onClick: loadMap, 18096 className: "btn-secondary", 18097 children: "Erneut versuchen" 18098 } 18099 ) 18100 ] }) }),
18101 /* @__PURE__ */ jsxRuntimeExports.jsx( 18102 "div", 18103 { 18104 ref: svgContainerRef, 18105 className: clsx( 18106 "w-full h-full overflow-hidden", 18107 !isMapLoaded && "opacity-0" 18108 ), 18109 style: { 18110 transition: "opacity 0.3s ease-in-out", 18111 touchAction: "manipulation", 18112 // Allow zoom and pan gestures 18113 cursor: "pointer" 18114 // Show pointer cursor for clickable locations 18115 } 18116 } 18117 ), 18118 showControls && isMapLoaded && mapHandlerRef.current && /* @__PURE__ */ jsxRuntimeExports.jsx( 18119 MapControls, 18120 { 18121 mapHandler: mapHandlerRef.current, 18122 className: "absolute top-4 right-4" 18123 } 18124 ) 18125 ] 18126 } 18127 ); 18128}; 18129const UnifiedContactCard = ({ 18130 contact, 18131 variant = "default", 18132 onClick, 18133 showLocation = false, 18134 className 18135}) => { 18136 console.log("ð DEBUG: Full contact object:", contact); 18137 console.log("ð DEBUG: Contact fields:", { 18138 id: contact.id, 18139 fullName: contact.fullName, 18140 position: contact.position, 18141 department: contact.department, 18142 email: contact.email, 18143 phone: contact.phone, 18144 mobile: contact.mobile, 18145 image: contact.image, 18146 locationName: contact.locationName, 18147 locationCity: contact.locationCity, 18148 specialties: contact.specialties, 18149 socialLinks: contact.socialLinks 18150 }); 18151 const handleClick = () => { 18152 onClick?.(contact); 18153 }; 18154 const handleEmailClick = (e) => { 18155 e.stopPropagation(); 18156 window.location.href = `mailto:${contact.email}`; 18157 }; 18158 const handlePhoneClick = (e) => { 18159 e.stopPropagation(); 18160 if (contact.phone) { 18161 window.location.href = `tel:${contact.phone}`; 18162 } 18163 }; 18164 if (variant === "compact") { 18165 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18166 "div", 18167 { 18168 className: clsx( 18169 "flex items-center space-x-3 p-3 bg-white border border-background-tertiary rounded-mec", 18170 "hover:border-mec-primary/20 hover:shadow-card transition-all duration-200", 18171 "touch-target-lg", 18172 onClick && "cursor-pointer", 18173 className 18174 ), 18175 onClick: handleClick, 18176 children: [
18177 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx( 18178 "img", 18179 { 18180 src: contact.image, 18181 alt: contact.fullName, 18182 className: "w-10 h-10 rounded-full object-cover object-center" 18183 } 18184 ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 bg-mec-primary/10 rounded-full flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-5 h-5 text-mec-primary" }) }) }), 18185 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 18186 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-medium text-text-primary truncate", children: contact.fullName }), 18187 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary truncate", children: contact.position }), 18188 contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-text-muted truncate", children: [ 18189 contact.specialties.slice(0, 2).join(", "), 18190 contact.specialties.length > 2 && ` +${contact.specialties.length - 2}` 18191 ] }), 18192 showLocation && contact.locationName && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-text-muted truncate flex items-center mt-1", children: [
18193 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-3 h-3 mr-1" }), 18194 contact.locationName 18195 ] }) 18196 ] }), 18197 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 flex-shrink-0", children: [ 18198 contact.email && /* @__PURE__ */ jsxRuntimeExports.jsx( 18199 "button", 18200 { 18201 onClick: handleEmailClick, 18202 className: "p-1.5 text-text-muted hover:text-mec-primary hover:bg-mec-primary/10 rounded transition-colors", 18203 title: "E-Mail senden", 18204 children: /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-4 h-4" }) 18205 } 18206 ), 18207 contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsx( 18208 "button", 18209 { 18210 onClick: handlePhoneClick, 18211 className: "p-1.5 text-text-muted hover:text-mec-primary hover:bg-mec-primary/10 rounded transition-colors", 18212 title: "Anrufen", 18213 children: /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-4 h-4" }) 18214 } 18215 ) 18216 ] }) 18217 ] 18218 } 18219 ); 18220 } 18221 if (variant === "detailed") { 18222 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18223 "div", 18224 { 18225 className: clsx( 18226 "bg-white rounded-mec-lg border border-background-tertiary p-6 cursor-pointer", 18227 "hover:border-mec-primary/20 hover:shadow-card transition-all duration-200", 18228 "touch-target-lg", 18229 className 18230 ), 18231 onClick: handleClick, 18232 children: [
18233 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start space-x-4 mb-4", children: [ 18234 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx( 18235 "img", 18236 { 18237 src: contact.image, 18238 alt: contact.fullName, 18239 className: "w-16 h-16 rounded-full object-cover object-center" 18240 } 18241 ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-mec-primary/10 rounded-full flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-8 h-8 text-mec-primary" }) }) }), 18242 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 18243 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-1", children: contact.fullName }), 18244 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-1", children: contact.position }), 18245 contact.department && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted", children: contact.department }), 18246 showLocation && contact.locationName && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-text-muted flex items-center mt-2", children: [
18247 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 mr-1" }), 18248 contact.locationName, 18249 ", ", 18250 contact.locationCity 18251 ] }) 18252 ] }) 18253 ] }), 18254 contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2", children: [ 18255 contact.specialties.slice(0, 4).map((specialty, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 18256 "span", 18257 { 18258 className: "px-2 py-1 bg-mec-primary/10 text-mec-primary text-xs rounded-full", 18259 children: specialty 18260 }, 18261 index 18262 )), 18263 contact.specialties.length > 4 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "px-2 py-1 bg-background-tertiary text-text-muted text-xs rounded-full", children: [ 18264 "+", 18265 contact.specialties.length - 4, 18266 " weitere" 18267 ] }) 18268 ] }) }), 18269 contact.languages && contact.languages.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4", children: [
18270 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary mb-2", children: "Sprachen:" }), 18271 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-1", children: [ 18272 contact.languages.slice(0, 3).map((language, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 18273 "span", 18274 { 18275 className: "px-2 py-1 bg-background-secondary text-text-primary text-xs rounded", 18276 children: language 18277 }, 18278 index 18279 )), 18280 contact.languages.length > 3 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "px-2 py-1 bg-background-tertiary text-text-muted text-xs rounded", children: [ 18281 "+", 18282 contact.languages.length - 3 18283 ] }) 18284 ] }) 18285 ] }), 18286 contact.bio && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary line-clamp-3", children: contact.bio }) }),
18287 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3 pt-4 border-t border-background-tertiary", children: [ 18288 contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs( 18289 "button", 18290 { 18291 onClick: handleEmailClick, 18292 className: "btn-primary text-sm flex-1 inline-flex items-center justify-center", 18293 children: [ 18294 /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-4 h-4 mr-2" }), 18295 "E-Mail" 18296 ] 18297 } 18298 ), 18299 contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs( 18300 "button", 18301 { 18302 onClick: handlePhoneClick, 18303 className: "btn-secondary text-sm flex-1 inline-flex items-center justify-center", 18304 children: [ 18305 /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-4 h-4 mr-2" }), 18306 "Anrufen" 18307 ] 18308 } 18309 ) 18310 ] }) 18311 ] 18312 } 18313 ); 18314 } 18315 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18316 "div", 18317 { 18318 className: clsx( 18319 "bg-white rounded-lg overflow-hidden cursor-pointer shadow-sm", 18320 "hover:shadow-md transition-all duration-200", 18321 "h-full flex flex-col", 18322 // Full height + flex column for equal height cards 18323 className 18324 ), 18325 onClick: handleClick, 18326 style: { fontFamily: "Helvetica Neue, Arial, sans-serif" }, 18327 children: [
18328 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-[5px]", style: { backgroundColor: "#d20028" } }), 18329 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative w-full h-[24rem] sm:h-[26rem] md:h-[28rem] flex-shrink-0", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx( 18330 "img", 18331 { 18332 src: contact.image, 18333 alt: contact.fullName, 18334 className: "w-full h-full object-cover object-center" 18335 } 18336 ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full bg-gray-200 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-16 h-16 text-gray-400" }) }) }), 18337 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 flex-1 flex flex-col", style: { backgroundColor: "#E0E6EB" }, children: [ 18338 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm mb-2", style: { color: "#28323c" }, children: [ 18339 contact.position, 18340 contact.department && ` ⢠${contact.department}` 18341 ] }),
18342 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-xl font-semibold mb-4", style: { color: "#28323c" }, children: contact.fullName }), 18343 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 18344 contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs( 18345 "button", 18346 { 18347 onClick: handlePhoneClick, 18348 className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-white/50 transition-colors", 18349 style: { backgroundColor: "rgba(255, 255, 255, 0.3)" }, 18350 children: [ 18351 /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-5 h-5 flex-shrink-0", style: { color: "#d20028" } }), 18352 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium", style: { color: "#28323c" }, children: contact.phone }) 18353 ] 18354 } 18355 ), 18356 contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs( 18357 "button", 18358 { 18359 onClick: handleEmailClick, 18360 className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-white/50 transition-colors", 18361 style: { backgroundColor: "rgba(255, 255, 255, 0.3)" }, 18362 children: [
18363 /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-5 h-5 flex-shrink-0", style: { color: "#d20028" } }), 18364 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium break-all", style: { color: "#28323c" }, children: contact.email }) 18365 ] 18366 } 18367 ) 18368 ] }), 18369 showLocation && contact.locationName && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 pt-4 border-t", style: { borderColor: "#a3b2c2" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 text-sm", style: { color: "#28323c" }, children: [ 18370 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4" }), 18371 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 18372 contact.locationName, 18373 ", ", 18374 contact.locationCity 18375 ] }) 18376 ] }) }), 18377 contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 pt-4 border-t", style: { borderColor: "#a3b2c2" }, children: [
18378 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-medium mb-2", style: { color: "#28323c" }, children: "Fachbereiche" }), 18379 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2", children: [ 18380 contact.specialties.slice(0, 3).map((specialty, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 18381 "span", 18382 { 18383 className: "px-2 py-1 text-xs rounded-lg", 18384 style: { backgroundColor: "#d20028", color: "white" }, 18385 children: specialty 18386 }, 18387 index 18388 )), 18389 contact.specialties.length > 3 && /* @__PURE__ */ jsxRuntimeExports.jsxs( 18390 "span", 18391 { 18392 className: "px-2 py-1 text-xs rounded-lg", 18393 style: { backgroundColor: "#a3b2c2", color: "white" }, 18394 children: [ 18395 "+", 18396 contact.specialties.length - 3 18397 ] 18398 } 18399 ) 18400 ] }) 18401 ] }) 18402 ] }), 18403 contact.socialLinks && contact.socialLinks.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-6 py-4", style: { backgroundColor: "#EFF3F5" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center space-x-4", children: contact.socialLinks.map((link, index) => { 18404 const isXing = link.platform?.toLowerCase() === "xing" || link.url?.includes("xing.com"); 18405 const isLinkedIn = link.platform?.toLowerCase() === "linkedin" || link.url?.includes("linkedin.com"); 18406 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18407 "a", 18408 { 18409 href: link.url, 18410 target: "_blank", 18411 rel: "noopener noreferrer", 18412 onClick: (e) => e.stopPropagation(), 18413 className: "hover:opacity-70 transition-opacity", 18414 style: { color: "#a3b2c2" }, 18415 children: [ 18416 isXing && /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 384 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z" }) }),
18417 isLinkedIn && /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 448 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z" }) }) 18418 ] 18419 }, 18420 index 18421 ); 18422 }) }) }) 18423 ] 18424 } 18425 ); 18426}; 18427const ContactCard = ({ 18428 contact, 18429 onClick, 18430 variant = "default", 18431 showLocation = false, 18432 className 18433}) => { 18434 return /* @__PURE__ */ jsxRuntimeExports.jsx( 18435 UnifiedContactCard, 18436 { 18437 contact, 18438 onClick, 18439 variant, 18440 showLocation, 18441 className 18442 } 18443 ); 18444}; 18445const ContactGrid = ({ 18446 contacts: providedContacts, 18447 loading: providedLoading, 18448 onContactClick, 18449 layout: providedLayout, 18450 columns = 3, 18451 className, 18452 locationId 18453}) => { 18454 const { contactLayout } = useViewPreferences(); 18455 const { open: openContactModal } = useContactModal(); 18456 const { 18457 contacts: fetchedContacts, 18458 locationSpecificContacts: fetchedLocationSpecificContacts, 18459 isLoading: fetchedLoading, 18460 error 18461 } = useFilteredContacts(locationId); 18462 const contacts = providedContacts || (locationId ? fetchedLocationSpecificContacts : fetchedContacts); 18463 const isLoading = providedLoading || fetchedLoading; 18464 const layout = providedLayout || contactLayout; 18465 console.log("ð DEBUG: ContactGrid - contacts array:", contacts); 18466 console.log("ð DEBUG: ContactGrid - contacts count:", contacts?.length || 0); 18467 console.log("ð DEBUG: ContactGrid - locationId:", locationId); 18468 console.log("ð DEBUG: ContactGrid - layout:", layout); 18469 console.log("ð DEBUG: ContactGrid - isLoading:", isLoading); 18470 const handleContactClick = (contact) => { 18471 if (onContactClick) { 18472 onContactClick(contact); 18473 } else { 18474 openContactModal(contact); 18475 } 18476 }; 18477 if (isLoading) { 18478 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className, children: layout === "grid" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx( 18479 "grid gap-4", 18480 columns === 1 && "grid-cols-1", 18481 columns === 2 && "grid-cols-1 sm:grid-cols-2", 18482 columns === 3 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3", 18483 columns === 4 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4" 18484 ), children: Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingCard, {}, index)) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingList, { items: 6 }) }); 18485 } 18486 if (error) { 18487 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("text-center py-8", className), children: [
18488 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-8 h-8 text-red-500" }) }), 18489 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Fehler beim Laden der Kontakte" }), 18490 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Die Ansprechpartner konnten nicht geladen werden." }) 18491 ] }); 18492 } 18493 if (!contacts || contacts.length === 0) { 18494 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("text-center py-8", className), children: [ 18495 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-background-secondary rounded-full flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "w-8 h-8 text-text-muted" }) }), 18496 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Keine Ansprechpartner gefunden" }),
18497 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: locationId ? "Für diesen Standort sind keine Ansprechpartner verfügbar." : "Versuchen Sie andere Suchkriterien oder Filter." }) 18498 ] }); 18499 } 18500 if (layout === "grid") { 18501 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className, children: [ 18502 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx( 18503 "grid gap-4 items-stretch", 18504 columns === 1 && "grid-cols-1", 18505 columns === 2 && "grid-cols-1 sm:grid-cols-2", 18506 columns === 3 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3", 18507 // 3 Kacheln auf Desktop 18508 columns === 4 && "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4" 18509 ), children: contacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx( 18510 ContactCard, 18511 { 18512 contact, 18513 onClick: handleContactClick, 18514 variant: "default", 18515 showLocation: !locationId 18516 }, 18517 contact.id 18518 )) }), 18519 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 text-center text-sm text-text-muted", children: [ 18520 contacts.length, 18521 " Ansprechpartner", 18522 contacts.length !== 1 ? "" : "", 18523 locationId && " an diesem Standort" 18524 ] }) 18525 ] }); 18526 } 18527 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className, children: [ 18528 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3", children: contacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx( 18529 ContactCard, 18530 { 18531 contact, 18532 onClick: handleContactClick, 18533 variant: "compact", 18534 showLocation: !locationId 18535 }, 18536 contact.id 18537 )) }), 18538 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 text-center text-sm text-text-muted", children: [ 18539 contacts.length, 18540 " Ansprechpartner", 18541 contacts.length !== 1 ? "" : "", 18542 locationId && " an diesem Standort" 18543 ] }) 18544 ] }); 18545}; 18546const LocationMiniGridCard = ({ 18547 location, 18548 onClick, 18549 className 18550}) => { 18551 const handleClick = () => { 18552 onClick?.(location.id); 18553 }; 18554 const getImageUrl = () => { 18555 return location.image || location.logo || "/assets/placeholder-location.jpg"; 18556 }; 18557 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18558 "div", 18559 { 18560 onClick: handleClick, 18561 className: clsx( 18562 "bg-white rounded-lg overflow-hidden cursor-pointer", 18563 "hover:shadow-md transition-all duration-200", 18564 "border border-background-tertiary hover:border-mec-primary/30", 18565 "h-full flex flex-col touch-target-lg", 18566 className 18567 ), 18568 children: [
18569 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative w-full h-32 flex-shrink-0 bg-background-secondary", children: [ 18570 /* @__PURE__ */ jsxRuntimeExports.jsx( 18571 "img", 18572 { 18573 src: getImageUrl(), 18574 alt: location.name, 18575 className: "w-full h-full object-cover", 18576 loading: "lazy" 18577 } 18578 ), 18579 location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-3 right-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/95 backdrop-blur-sm rounded-lg p-2 shadow-sm border border-white/20", children: /* @__PURE__ */ jsxRuntimeExports.jsx( 18580 "img", 18581 { 18582 src: location.logo, 18583 alt: `${location.name} Logo`, 18584 className: "h-8 w-auto object-contain max-w-[60px]" 18585 } 18586 ) }) }) 18587 ] }), 18588 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3 flex-1 flex flex-col", children: [
18589 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold text-text-primary mb-1 line-clamp-1", children: location.name }), 18590 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-xs text-text-secondary mb-2", children: [ 18591 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-3 h-3 mr-1 flex-shrink-0" }), 18592 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [ 18593 location.postalCode && `${location.postalCode} `, 18594 location.city 18595 ] }) 18596 ] }), 18597 location.address && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start text-xs text-text-muted mt-auto", children: [ 18598 /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-3 h-3 mr-1 flex-shrink-0 mt-0.5" }), 18599 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "line-clamp-2 leading-tight", children: location.address }) 18600 ] }) 18601 ] }) 18602 ] 18603 } 18604 ); 18605}; 18606const UnifiedTabs = ({ 18607 tabs, 18608 activeTab, 18609 onTabChange, 18610 variant = "default", 18611 size = "md", 18612 className, 18613 fullWidth = false 18614}) => { 18615 const handleTabClick = (tabId, disabled) => { 18616 if (!disabled) { 18617 onTabChange(tabId); 18618 } 18619 }; 18620 const getVariantStyles = () => { 18621 switch (variant) { 18622 case "pills": 18623 return { 18624 container: "bg-background-secondary rounded-mec p-1", 18625 tab: "rounded-mec-sm transition-all duration-200", 18626 active: "bg-white shadow-sm text-text-primary", 18627 inactive: "text-text-secondary hover:text-text-primary hover:bg-white/50" 18628 }; 18629 case "underline": 18630 return { 18631 container: "border-b border-background-tertiary", 18632 tab: "border-b-2 border-transparent transition-all duration-200 -mb-px", 18633 active: "border-mec-primary text-mec-primary", 18634 inactive: "text-text-secondary hover:text-text-primary hover:border-text-muted" 18635 }; 18636 default: 18637 return { 18638 container: "bg-background-secondary rounded-mec-lg p-1", 18639 tab: "rounded-mec transition-all duration-200", 18640 active: "bg-white shadow-card text-text-primary", 18641 inactive: "text-text-secondary hover:text-text-primary hover:bg-white/50" 18642 }; 18643 } 18644 }; 18645 const getSizeStyles = () => { 18646 switch (size) { 18647 case "sm": 18648 return "px-3 py-1.5 text-sm"; 18649 case "lg": 18650 return "px-6 py-3 text-lg"; 18651 default: 18652 return "px-4 py-2 text-base"; 18653 } 18654 }; 18655 const styles = getVariantStyles(); 18656 const sizeStyles = getSizeStyles(); 18657 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(styles.container, className), children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx( 18658 // Mobile: Stack vertically if tabs don't fit, Desktop: Horizontal 18659 "flex flex-wrap sm:flex-nowrap", 18660 fullWidth ? "w-full" : "inline-flex", 18661 variant === "underline" ? "gap-2 sm:gap-8" : "gap-1" 18662 ), children: tabs.map((tab) => { 18663 const isActive = activeTab === tab.id; 18664 const isDisabled = tab.disabled; 18665 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 18666 "button", 18667 { 18668 onClick: () => handleTabClick(tab.id, isDisabled), 18669 disabled: isDisabled, 18670 className: clsx( 18671 "font-medium transition-all duration-200 flex items-center gap-1 sm:gap-2", 18672 styles.tab, 18673 sizeStyles, 18674 // Mobile: Full width on small screens, Desktop: Flex-1 if fullWidth 18675 fullWidth && "w-full sm:flex-1 justify-center", 18676 // Mobile: Enhanced touch target 18677 "touch-target-lg min-w-0", 18678 isActive ? styles.active : styles.inactive, 18679 isDisabled && "opacity-50 cursor-not-allowed" 18680 ), 18681 children: [
18682 tab.icon && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-shrink-0", children: tab.icon }), 18683 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: clsx( 18684 "truncate text-xs sm:text-sm", 18685 fullWidth ? "text-center" : "text-left" 18686 ), children: tab.label }), 18687 tab.count !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: clsx( 18688 "hidden", 18689 // Hidden via CSS - can be re-enabled by removing this class 18690 "inline-flex items-center justify-center min-w-[1.25rem] h-5 px-1.5 rounded-full text-xs font-medium flex-shrink-0", 18691 isActive ? "bg-mec-primary text-white" : "bg-background-tertiary text-text-muted" 18692 ), children: tab.count }) 18693 ] 18694 }, 18695 tab.id 18696 ); 18697 }) }) }); 18698}; 18699const useServices = () => { 18700 return useQuery({ 18701 queryKey: ["services"], 18702 queryFn: () => locationsApi.getServices(), 18703 select: (data) => data.data || [], 18704 staleTime: 5 * 60 * 1e3, 18705 gcTime: 10 * 60 * 1e3 18706 }); 18707}; 18708const useStates = () => { 18709 return useQuery({ 18710 queryKey: ["states"], 18711 queryFn: () => locationsApi.getStates(), 18712 select: (data) => data.data || [], 18713 staleTime: 5 * 60 * 1e3, 18714 gcTime: 10 * 60 * 1e3 18715 }); 18716}; 18717const useOpeningYears = () => { 18718 return useQuery({ 18719 queryKey: ["opening-years"], 18720 queryFn: () => locationsApi.getOpeningYears(), 18721 select: (data) => data.data || { years: [], decades: [] }, 18722 staleTime: 5 * 60 * 1e3, 18723 gcTime: 10 * 60 * 1e3 18724 }); 18725}; 18726const useLocationFilterData = () => { 18727 const services = useServices(); 18728 const states = useStates(); 18729 const openingYears = useOpeningYears(); 18730 return { 18731 services: { 18732 data: services.data, 18733 isLoading: services.isLoading, 18734 error: services.error 18735 }, 18736 states: { 18737 data: states.data, 18738 isLoading: states.isLoading, 18739 error: states.error 18740 }, 18741 openingYears: { 18742 data: openingYears.data, 18743 isLoading: openingYears.isLoading, 18744 error: openingYears.error 18745 }, 18746 isLoading: services.isLoading || states.isLoading || openingYears.isLoading, 18747 error: services.error || states.error || openingYears.error 18748 }; 18749}; 18750const ViewToggle = ({ 18751 className, 18752 size = "md" 18753}) => { 18754 const { mapView, contactLayout, setMapView, setContactLayout } = useViewPreferences(); 18755 const sizeClasses2 = { 18756 sm: "text-xs px-2 py-1", 18757 md: "text-sm px-3 py-2", 18758 lg: "text-base px-4 py-3" 18759 }; 18760 const iconSizes = { 18761 sm: "w-3 h-3", 18762 md: "w-4 h-4", 18763 lg: "w-5 h-5" 18764 }; 18765 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("flex items-center space-x-2", className), children: [ 18766 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex bg-background-secondary rounded-mec p-1", children: [
18767 /* @__PURE__ */ jsxRuntimeExports.jsxs( 18768 "button", 18769 { 18770 onClick: () => setMapView("interactive"), 18771 className: clsx( 18772 "inline-flex items-center space-x-2 rounded transition-all duration-200", 18773 sizeClasses2[size], 18774 mapView === "interactive" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50" 18775 ), 18776 title: "Interaktive Karte", 18777 children: [ 18778 /* @__PURE__ */ jsxRuntimeExports.jsx(Map$1, { className: iconSizes[size] }), 18779 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Karte" }) 18780 ] 18781 } 18782 ), 18783 /* @__PURE__ */ jsxRuntimeExports.jsxs( 18784 "button", 18785 { 18786 onClick: () => setMapView("list"), 18787 className: clsx( 18788 "inline-flex items-center space-x-2 rounded transition-all duration-200", 18789 sizeClasses2[size], 18790 mapView === "list" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50" 18791 ), 18792 title: "Listenansicht", 18793 children: [
18794 /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: iconSizes[size] }), 18795 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Liste" }) 18796 ] 18797 } 18798 ) 18799 ] }), 18800 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px h-6 bg-background-tertiary" }), 18801 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex bg-background-secondary rounded-mec p-1", children: [ 18802 /* @__PURE__ */ jsxRuntimeExports.jsxs( 18803 "button", 18804 { 18805 onClick: () => setContactLayout("grid"), 18806 disabled: mapView !== "list", 18807 className: clsx( 18808 "inline-flex items-center space-x-2 rounded transition-all duration-200", 18809 sizeClasses2[size], 18810 mapView !== "list" ? "text-text-muted cursor-not-allowed opacity-50" : contactLayout === "grid" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50" 18811 ), 18812 title: mapView !== "list" ? "Nur in Listenansicht verfügbar" : "Raster-Layout", 18813 children: [
18814 /* @__PURE__ */ jsxRuntimeExports.jsx(Grid3x3, { className: iconSizes[size] }), 18815 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden md:inline", children: "Raster" }) 18816 ] 18817 } 18818 ), 18819 /* @__PURE__ */ jsxRuntimeExports.jsxs( 18820 "button", 18821 { 18822 onClick: () => setContactLayout("list"), 18823 disabled: mapView !== "list", 18824 className: clsx( 18825 "inline-flex items-center space-x-2 rounded transition-all duration-200", 18826 sizeClasses2[size], 18827 mapView !== "list" ? "text-text-muted cursor-not-allowed opacity-50" : contactLayout === "list" ? "bg-white text-mec-primary shadow-sm" : "text-text-secondary hover:text-text-primary hover:bg-white/50" 18828 ), 18829 title: mapView !== "list" ? "Nur in Listenansicht verfügbar" : "Listen-Layout", 18830 children: [ 18831 /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: iconSizes[size] }), 18832 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden md:inline", children: "Liste" }) 18833 ] 18834 } 18835 ) 18836 ] }) 18837 ] }); 18838}; 18839const CustomDropdown = ({ 18840 label, 18841 icon, 18842 options, 18843 selectedValues, 18844 onSelectionChange, 18845 placeholder = "Alle", 18846 loading = false 18847}) => { 18848 const [isOpen, setIsOpen] = reactExports.useState(false); 18849 const dropdownRef = reactExports.useRef(null); 18850 reactExports.useEffect(() => { 18851 const handleClickOutside = (event) => { 18852 if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { 18853 setIsOpen(false); 18854 } 18855 }; 18856 document.addEventListener("mousedown", handleClickOutside); 18857 return () => document.removeEventListener("mousedown", handleClickOutside); 18858 }, []); 18859 const toggleOption = (option) => { 18860 if (selectedValues.includes(option)) { 18861 onSelectionChange(selectedValues.filter((v2) => v2 !== option)); 18862 } else { 18863 onSelectionChange([...selectedValues, option]); 18864 } 18865 }; 18866 const clearAll = () => { 18867 onSelectionChange([]); 18868 }; 18869 const displayText = selectedValues.length === 0 ? placeholder : selectedValues.length === 1 ? selectedValues[0] : `${selectedValues.length} ausgewählt`; 18870 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", ref: dropdownRef, children: [ 18871 /* @__PURE__ */ jsxRuntimeExports.jsxs( 18872 "button", 18873 { 18874 onClick: () => setIsOpen(!isOpen), 18875 className: clsx( 18876 "flex items-center gap-2 px-4 py-2.5 bg-white border rounded-lg transition-all duration-200", 18877 "hover:border-mec-primary hover:shadow-sm focus:outline-none focus:ring-2 focus:ring-mec-primary/20", 18878 "w-full sm:w-auto min-w-[140px]", 18879 isOpen ? "border-mec-primary shadow-sm" : "border-gray-300", 18880 selectedValues.length > 0 && "border-mec-primary bg-mec-primary/5" 18881 ), 18882 disabled: loading, 18883 children: [ 18884 icon,
18885 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium text-gray-700 min-w-0 truncate", children: loading ? "Lädt..." : displayText }), 18886 selectedValues.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-mec-primary text-white text-xs px-2 py-0.5 rounded-full", children: selectedValues.length }), 18887 /* @__PURE__ */ jsxRuntimeExports.jsx( 18888 ChevronDown, 18889 { 18890 className: clsx( 18891 "w-4 h-4 text-gray-500 transition-transform duration-200 flex-shrink-0", 18892 isOpen && "rotate-180" 18893 ) 18894 } 18895 ) 18896 ] 18897 } 18898 ), 18899 isOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute top-full left-0 right-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 min-w-[200px]", children: [ 18900 selectedValues.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-gray-100", children: [
18901 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs font-medium text-gray-600", children: [ 18902 selectedValues.length, 18903 " ausgewählt" 18904 ] }), 18905 /* @__PURE__ */ jsxRuntimeExports.jsx( 18906 "button", 18907 { 18908 onClick: clearAll, 18909 className: "text-xs text-mec-primary hover:text-mec-primary/80 font-medium", 18910 children: "Alle entfernen" 18911 } 18912 ) 18913 ] }), 18914 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "max-h-60 overflow-y-auto", children: options.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-2 text-sm text-gray-500", children: "Keine Optionen verfügbar" }) : options.map((option) => /* @__PURE__ */ jsxRuntimeExports.jsxs( 18915 "label", 18916 { 18917 className: "flex items-center gap-3 px-3 py-2 hover:bg-gray-50 cursor-pointer transition-colors", 18918 children: [ 18919 /* @__PURE__ */ jsxRuntimeExports.jsx( 18920 "input", 18921 { 18922 type: "checkbox", 18923 checked: selectedValues.includes(option), 18924 onChange: () => toggleOption(option), 18925 className: "w-4 h-4 text-mec-primary border-gray-300 rounded focus:ring-mec-primary/20" 18926 } 18927 ),
18928 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-gray-700 flex-1 min-w-0 truncate", children: option }) 18929 ] 18930 }, 18931 option 18932 )) }) 18933 ] }) 18934 ] }); 18935}; 18936const FilterBar = ({ 18937 className, 18938 searchQuery, 18939 onSearchChange 18940}) => { 18941 const { activeTab } = useViewPreferences(); 18942 const { 18943 selectedStates, 18944 setSelectedStates 18945 } = useFilters(); 18946 const { states, isLoading: locationFiltersLoading } = useLocationFilterData(); 18947 const statesArray = states.data?.map((item) => item.state) || []; 18948 const showFilters = activeTab === "locations"; 18949 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("bg-white rounded-lg border border-gray-200 p-3 sm:p-4", className), children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 sm:gap-4 lg:flex-row lg:items-center", children: [ 18950 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex-1 min-w-0", children: [ 18951 /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400" }),
18952 /* @__PURE__ */ jsxRuntimeExports.jsx( 18953 "input", 18954 { 18955 type: "text", 18956 placeholder: activeTab === "locations" ? "Standorte durchsuchen..." : "Ansprechpartner durchsuchen...", 18957 value: searchQuery, 18958 onChange: (e) => onSearchChange(e.target.value), 18959 className: "w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-primary/20 focus:border-mec-primary transition-colors" 18960 } 18961 ) 18962 ] }), 18963 showFilters && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col sm:flex-row flex-wrap gap-3 w-full sm:w-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsx( 18964 CustomDropdown, 18965 { 18966 label: "Region", 18967 icon: /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 text-gray-500" }), 18968 options: statesArray, 18969 selectedValues: selectedStates, 18970 onSelectionChange: setSelectedStates, 18971 placeholder: "Alle Regionen", 18972 loading: locationFiltersLoading 18973 } 18974 ) }), 18975 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ViewToggle, { size: "sm" }) }), 18976 showFilters && selectedStates.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
18977 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm text-gray-600", children: [ 18978 selectedStates.length, 18979 " Filter aktiv" 18980 ] }), 18981 /* @__PURE__ */ jsxRuntimeExports.jsx( 18982 "button", 18983 { 18984 onClick: () => { 18985 setSelectedStates([]); 18986 }, 18987 className: "text-sm text-mec-primary hover:text-mec-primary/80 font-medium", 18988 children: "Zurücksetzen" 18989 } 18990 ) 18991 ] }) 18992 ] }) }); 18993}; 18994class SafeFilterBarErrorBoundary extends React$2.Component { 18995 constructor(props) { 18996 super(props); 18997 this.state = { hasError: false }; 18998 } 18999 static getDerivedStateFromError(error) { 19000 return { hasError: true, error }; 19001 } 19002 componentDidCatch(error, errorInfo) { 19003 console.error("SafeFilterBar: Caught error in FilterBar:", error, errorInfo); 19004 } 19005 render() { 19006 if (this.state.hasError) { 19007 return this.props.fallback || /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-lg border border-gray-200 p-3 sm:p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 sm:gap-4 lg:flex-row lg:items-center", children: [
19008 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [ 19009 /* @__PURE__ */ jsxRuntimeExports.jsx( 19010 "input", 19011 { 19012 type: "text", 19013 placeholder: "Standorte durchsuchen...", 19014 value: this.props.searchQuery || "", 19015 onChange: (e) => this.props.onSearchChange?.(e.target.value), 19016 className: "w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-mec-primary/20 focus:border-mec-primary transition-all duration-200" 19017 } 19018 ), 19019 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "h-5 w-5 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }) }) 19020 ] }) }),
19021 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-gray-500", children: "Filter im Embed-Modus vereinfacht" }) 19022 ] }) }); 19023 } 19024 return /* @__PURE__ */ jsxRuntimeExports.jsx(FilterBar, { ...this.props }); 19025 } 19026} 19027const SafeFilterBar = (props) => { 19028 return /* @__PURE__ */ jsxRuntimeExports.jsx(SafeFilterBarErrorBoundary, { ...props }); 19029}; 19030const UnifiedListView = ({ className }) => { 19031 const { contactLayout, activeTab, setActiveTab } = useViewPreferences(); 19032 const { open: openLocationModal } = useLocationModal(); 19033 const { open: openContactModal } = useContactModal(); 19034 const { 19035 searchQuery, 19036 setSearchQuery, 19037 selectedStates, 19038 selectedServices 19039 } = useFilters(); 19040 const { data: locations, isLoading: locationsLoading, error: locationsError } = useLocations(); 19041 const { contacts, isLoading: contactsLoading, error: contactsError } = useFilteredContacts(); 19042 const isLoading = locationsLoading || contactsLoading; 19043 const hasError = locationsError || contactsError; 19044 const handleLocationClick = (locationId) => { 19045 openLocationModal(locationId); 19046 }; 19047 const handleContactClick = (contact) => { 19048 openContactModal(contact); 19049 }; 19050 if (isLoading) { 19051 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-6", className), children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }) }) }) }); 19052 } 19053 if (hasError) { 19054 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("space-y-6", className), children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Fehler beim Laden der Daten. Bitte versuchen Sie es später erneut." }) }) }) }); 19055 } 19056 const activeLocations = locations || []; 19057 const activeContacts = contacts || []; 19058 console.log("ð DEBUG: UnifiedListView - activeContacts:", activeContacts.length); 19059 console.log("ð DEBUG: UnifiedListView - searchQuery:", searchQuery); 19060 const getStateFromPostalCode = (postalCode) => { 19061 if (!postalCode) return "Sonstige"; 19062 const firstChar = postalCode.charAt(0); 19063 switch (firstChar) { 19064 case "0": 19065 case "1": 19066 return "Berlin/Brandenburg/Sachsen"; 19067 case "2": 19068 return "Hamburg/Schleswig-Holstein/Niedersachsen"; 19069 case "3": 19070 return "Niedersachsen/Sachsen-Anhalt/Thüringen"; 19071 case "4": 19072 return "Nordrhein-Westfalen"; 19073 case "5": 19074 return "Nordrhein-Westfalen/Rheinland-Pfalz"; 19075 case "6": 19076 return "Hessen/Rheinland-Pfalz/Saarland"; 19077 case "7": 19078 return "Baden-Württemberg"; 19079 case "8": 19080 return "Bayern"; 19081 case "9": 19082 return "Bayern/Thüringen/Sachsen"; 19083 default: 19084 return "Sonstige"; 19085 } 19086 }; 19087 const filteredLocations = activeLocations.filter((location) => { 19088 const matchesSearch = !searchQuery || (location.name || "").toLowerCase().includes(searchQuery.toLowerCase()) || (location.city || "").toLowerCase().includes(searchQuery.toLowerCase()) || (location.address || "").toLowerCase().includes(searchQuery.toLowerCase()); 19089 const matchesState = selectedStates.length === 0 || selectedStates.includes(getStateFromPostalCode(location.postalCode || "")); 19090 const matchesServices = selectedServices.length === 0 || location.services && Array.isArray(location.services) && selectedServices.some((service) => location.services.includes(service)); 19091 return matchesSearch && matchesState && matchesServices; 19092 }); 19093 const filteredContacts = activeContacts.filter( 19094 (contact) => (contact.fullName || "").toLowerCase().includes(searchQuery.toLowerCase()) || (contact.position || "").toLowerCase().includes(searchQuery.toLowerCase()) || (contact.email || "").toLowerCase().includes(searchQuery.toLowerCase()) || contact.specialties && contact.specialties.some( 19095 (specialty) => (specialty || "").toLowerCase().includes(searchQuery.toLowerCase()) 19096 ) 19097 ); 19098 console.log("ð DEBUG: UnifiedListView - filteredContacts:", filteredContacts.length); 19099 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("space-y-6 scroll-container", className), children: [
19100 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx( 19101 UnifiedTabs, 19102 { 19103 tabs: [ 19104 { 19105 id: "locations", 19106 label: "Standorte", 19107 count: filteredLocations.length, 19108 icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-4 h-4 sm:w-5 sm:h-5" }) 19109 }, 19110 { 19111 id: "contacts", 19112 label: "Kontakte", 19113 count: filteredContacts.length, 19114 icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-4 h-4 sm:w-5 sm:h-5" }) 19115 } 19116 ], 19117 activeTab, 19118 onTabChange: (tabId) => setActiveTab(tabId), 19119 variant: "underline", 19120 fullWidth: true 19121 } 19122 ) }), 19123 /* @__PURE__ */ jsxRuntimeExports.jsx( 19124 SafeFilterBar, 19125 { 19126 searchQuery, 19127 onSearchChange: setSearchQuery, 19128 className: "shadow-card" 19129 } 19130 ), 19131 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white rounded-mec-lg shadow-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-6 scroll-container", children: activeTab === "locations" ? ( 19132 // Locations Tab 19133 filteredLocations.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-8 text-text-muted", children: searchQuery ? "Keine Handelsimmobilien gefunden" : "Keine Handelsimmobilien verfügbar" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx( 19134 contactLayout === "grid" ? "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 items-stretch" : "space-y-2" 19135 ), children: filteredLocations.map((location) => /* @__PURE__ */ jsxRuntimeExports.jsx( 19136 LocationMiniGridCard, 19137 { 19138 location, 19139 onClick: handleLocationClick, 19140 className: "h-full" 19141 }, 19142 location.id 19143 )) }) 19144 ) : ( 19145 // Contacts Tab 19146 filteredContacts.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-8 text-text-muted", children: searchQuery ? "Keine Ansprechpartner gefunden" : "Keine Ansprechpartner verfügbar" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx( 19147 contactLayout === "grid" ? "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 items-stretch" : "space-y-2" 19148 ), children: filteredContacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx( 19149 UnifiedContactCard, 19150 { 19151 contact, 19152 onClick: handleContactClick, 19153 variant: contactLayout === "grid" ? "default" : "compact", 19154 showLocation: false 19155 }, 19156 contact.id 19157 )) }) 19158 ) }) }) 19159 ] }); 19160}; 19161const Modal = ({ 19162 isOpen, 19163 onClose, 19164 title, 19165 children, 19166 size = "md", 19167 className, 19168 closeOnOverlayClick = true, 19169 closeOnEscape = true, 19170 showCloseButton = true 19171}) => { 19172 const modalRef = reactExports.useRef(null); 19173 const previousActiveElement = reactExports.useRef(null); 19174 reactExports.useEffect(() => { 19175 if (!closeOnEscape) return; 19176 const handleEscape = (e) => { 19177 if (e.key === "Escape" && isOpen) { 19178 onClose(); 19179 } 19180 }; 19181 document.addEventListener("keydown", handleEscape); 19182 return () => document.removeEventListener("keydown", handleEscape); 19183 }, [isOpen, onClose, closeOnEscape]); 19184 reactExports.useEffect(() => { 19185 if (isOpen) { 19186 previousActiveElement.current = document.activeElement; 19187 modalRef.current?.focus(); 19188 document.body.style.overflow = "hidden"; 19189 } else { 19190 if (previousActiveElement.current) { 19191 previousActiveElement.current.focus(); 19192 } 19193 document.body.style.overflow = ""; 19194 } 19195 return () => { 19196 document.body.style.overflow = ""; 19197 }; 19198 }, [isOpen]); 19199 const handleOverlayClick = (e) => { 19200 if (closeOnOverlayClick && e.target === e.currentTarget) { 19201 onClose(); 19202 } 19203 }; 19204 if (!isOpen) return null; 19205 const sizeClasses2 = { 19206 sm: "max-w-md", 19207 md: "max-w-lg", 19208 lg: "max-w-2xl", 19209 xl: "max-w-4xl", 19210 full: "max-w-full" 19211 }; 19212 const modalContent = /* @__PURE__ */ jsxRuntimeExports.jsxs( 19213 "div", 19214 { 19215 className: clsx( 19216 "fixed inset-0 z-50 flex items-center justify-center", 19217 // Mobile: Fullscreen, Desktop: Centered with padding 19218 "p-0 sm:p-4 md:p-6" 19219 ), 19220 onClick: handleOverlayClick, 19221 children: [
19222 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/50 backdrop-blur-sm animate-in fade-in duration-200" }), 19223 /* @__PURE__ */ jsxRuntimeExports.jsxs( 19224 "div", 19225 { 19226 ref: modalRef, 19227 className: clsx( 19228 "relative bg-white shadow-modal flex flex-col", 19229 "animate-in zoom-in-95 slide-in-from-bottom-2 duration-200", 19230 // Full size: Always fullscreen, Others: Mobile fullscreen, Desktop rounded with max-height 19231 size === "full" ? "h-full w-full" : "h-full w-full sm:h-auto sm:max-h-[calc(100vh-3rem)] sm:rounded-mec-lg md:max-h-[calc(100vh-4rem)]", 19232 sizeClasses2[size], 19233 className 19234 ), 19235 tabIndex: -1, 19236 role: "dialog", 19237 "aria-modal": "true", 19238 "aria-labelledby": title ? "modal-title" : void 0, 19239 children: [ 19240 (title || showCloseButton) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 flex items-center justify-between p-4 sm:p-6 border-b border-background-tertiary bg-white z-10", children: [ 19241 title && /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { id: "modal-title", className: "text-lg sm:text-xl font-semibold text-text-primary", children: title }),
19242 showCloseButton && /* @__PURE__ */ jsxRuntimeExports.jsx( 19243 "button", 19244 { 19245 onClick: onClose, 19246 className: "p-2 -mr-2 text-text-muted hover:text-text-primary hover:bg-background-secondary rounded-mec transition-colors", 19247 "aria-label": "Modal schlieÃen", 19248 children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-5 h-5" }) 19249 } 19250 ) 19251 ] }), 19252 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden", children }) 19253 ] 19254 } 19255 ) 19256 ] 19257 } 19258 ); 19259 return reactDomExports.createPortal(modalContent, document.body); 19260}; 19261function parseMietflaeche(value) { 19262 if (value == null || value === "") return null; 19263 let num; 19264 if (typeof value === "string") { 19265 const trimmed = value.trim().replace(/\s/g, ""); 19266 if (!trimmed) return null; 19267 if (/^\d{1,3}(\.\d{3})+(,\d+)?$/.test(trimmed)) { 19268 num = Number.parseFloat(trimmed.replace(/\./g, "").replace(",", ".")); 19269 } else if (trimmed.includes(",") && !trimmed.includes(".")) { 19270 num = Number.parseFloat(trimmed.replace(",", ".")); 19271 } else { 19272 num = Number.parseFloat(trimmed); 19273 } 19274 } else { 19275 num = Number(value); 19276 } 19277 if (!Number.isFinite(num) || num <= 0) return null; 19278 if (num < 1e3) return Math.round(num * 1e3); 19279 return Math.round(num); 19280} 19281function formatMietflaeche(value) { 19282 const sqm = parseMietflaeche(value); 19283 if (sqm == null) return ""; 19284 return sqm.toLocaleString("de-DE", { maximumFractionDigits: 0 }); 19285} 19286const LocationModalHero = ({ 19287 location, 19288 centerData 19289}) => { 19290 const handleCenterLinkClick = () => { 19291 const centerLink = location.centerlink || location.centerLink; 19292 if (centerLink) { 19293 window.open(centerLink, "_blank", "noopener,noreferrer"); 19294 } 19295 }; 19296 const getImageUrl = () => { 19297 return location.heroimage || location.heroImage || location.image || location.logo || "/assets/placeholder-location.jpg"; 19298 }; 19299 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-full flex flex-col overflow-y-auto", children: [ 19300 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative w-full h-[25vh] md:h-[45vh] min-h-[200px] md:min-h-[300px] flex-shrink-0", children: [
19301 /* @__PURE__ */ jsxRuntimeExports.jsx( 19302 "img", 19303 { 19304 src: getImageUrl(), 19305 alt: location.name, 19306 className: "w-full h-full object-cover" 19307 } 19308 ), 19309 location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-4 right-4 md:top-6 md:right-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/90 backdrop-blur-sm rounded-lg p-2 md:p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx( 19310 "img", 19311 { 19312 src: location.logo, 19313 alt: `${location.name} Logo`, 19314 className: "h-8 md:h-12 w-auto object-contain" 19315 } 19316 ) }) }) 19317 ] }), 19318 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 p-4 md:p-6 lg:p-8 flex flex-col bg-mec-secondary overflow-y-auto", children: [ 19319 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 md:mb-6 lg:mb-8", children: [ 19320 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl md:text-3xl lg:text-4xl font-bold mb-1 md:mb-2 leading-tight text-white", children: location.name }),
19321 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg md:text-xl lg:text-2xl text-white/90", children: location.city }) 19322 ] }), 19323 (centerData.vermietbareFlaeche || centerData.anzahlShops || centerData.verkaufsebenen) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 md:mb-6 lg:mb-8", children: [ 19324 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "block md:hidden space-y-3", children: [ 19325 centerData.vermietbareFlaeche && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-4 text-center flex flex-col justify-center", children: [ 19326 /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-6 h-6 text-white mx-auto mb-2" }), 19327 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-lg font-bold text-white mb-1", children: [ 19328 formatMietflaeche(centerData.vermietbareFlaeche), 19329 "m²" 19330 ] }), 19331 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-white/80 leading-tight", children: "Vermietbare Fläche" }) 19332 ] }), 19333 (centerData.anzahlShops || centerData.verkaufsebenen) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
19334 centerData.anzahlShops && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-4 text-center flex flex-col justify-center", children: [ 19335 /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingBag, { className: "w-6 h-6 text-white mx-auto mb-2" }), 19336 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-bold text-white mb-1", children: centerData.anzahlShops }), 19337 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-white/80", children: "Mietflächen" }) 19338 ] }), 19339 centerData.verkaufsebenen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-4 text-center flex flex-col justify-center", children: [ 19340 /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "w-6 h-6 text-white mx-auto mb-2" }), 19341 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-bold text-white mb-1", children: centerData.verkaufsebenen }),
19342 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-white/80", children: "Verkaufsebenen" }) 19343 ] }) 19344 ] }) 19345 ] }), 19346 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden md:grid md:grid-cols-3 md:gap-4 lg:gap-6 overflow-hidden", children: [ 19347 centerData.vermietbareFlaeche && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-5 lg:p-6 text-center flex flex-col justify-center min-w-0", children: [ 19348 /* @__PURE__ */ jsxRuntimeExports.jsx(Building2, { className: "w-8 h-8 lg:w-10 lg:h-10 text-white mx-auto mb-3 flex-shrink-0" }), 19349 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-2xl lg:text-3xl font-bold text-white mb-1 break-words", children: [ 19350 formatMietflaeche(centerData.vermietbareFlaeche), 19351 "m²" 19352 ] }), 19353 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm lg:text-base text-white/80 leading-tight", children: "Vermietbare Fläche" }) 19354 ] }),
19355 centerData.anzahlShops && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-5 lg:p-6 text-center flex flex-col justify-center min-w-0", children: [ 19356 /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingBag, { className: "w-8 h-8 lg:w-10 lg:h-10 text-white mx-auto mb-3 flex-shrink-0" }), 19357 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl lg:text-3xl font-bold text-white mb-1 break-words", children: centerData.anzahlShops }), 19358 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm lg:text-base text-white/80", children: "Mietflächen" }) 19359 ] }), 19360 centerData.verkaufsebenen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/10 backdrop-blur-sm rounded-lg p-5 lg:p-6 text-center flex flex-col justify-center min-w-0", children: [ 19361 /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "w-8 h-8 lg:w-10 lg:h-10 text-white mx-auto mb-3 flex-shrink-0" }),
19362 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl lg:text-3xl font-bold text-white mb-1 break-words", children: centerData.verkaufsebenen }), 19363 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm lg:text-base text-white/80", children: "Verkaufsebenen" }) 19364 ] }) 19365 ] }) 19366 ] }), 19367 (location.centerlink || location.centerLink) && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19368 "button", 19369 { 19370 onClick: handleCenterLinkClick, 19371 className: "inline-flex items-center justify-center w-full md:w-auto px-6 py-3.5 md:py-3 bg-mec-primary hover:bg-mec-primary-dark active:bg-mec-primary-dark text-white font-semibold rounded-lg transition-colors duration-200 min-h-[48px] text-base md:text-base", 19372 children: [ 19373 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Zum Center" }), 19374 /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-5 h-5 md:w-4 md:h-4 ml-2" }) 19375 ] 19376 } 19377 ) 19378 ] }) 19379 ] }); 19380}; 19381const LocationModalInfo = ({ 19382 location 19383}) => { 19384 const [showFullDescription, setShowFullDescription] = reactExports.useState(false); 19385 const handleEmailClick = () => { 19386 if (location.email) { 19387 window.location.href = `mailto:${location.email}`; 19388 } 19389 }; 19390 const handlePhoneClick = () => { 19391 if (location.phone) { 19392 window.location.href = `tel:${location.phone}`; 19393 } 19394 }; 19395 const handleWebsiteClick = () => { 19396 if (location.website) { 19397 window.open(location.website, "_blank", "noopener,noreferrer"); 19398 } 19399 }; 19400 const description = location.description || ""; 19401 const shouldTruncate = description.length > 200; 19402 const displayDescription = shouldTruncate && !showFullDescription ? description.substring(0, 200) + "..." : description; 19403 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [ 19404 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 p-6 border-b border-background-tertiary", children: [
19405 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary", children: location.name }), 19406 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-text-secondary mt-1", children: location.city }) 19407 ] }), 19408 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto p-6 space-y-8", children: [ 19409 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 19410 /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-lg font-semibold text-text-primary mb-4 flex items-center", children: [ 19411 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 mr-2 text-mec-primary" }), 19412 "Adresse" 19413 ] }), 19414 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-background-secondary rounded-lg p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [ 19415 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-text-primary", children: location.name }),
19416 location.address && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: location.address }), 19417 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-text-secondary", children: [ 19418 (location.postalcode || location.postalCode) && `${location.postalcode || location.postalCode} `, 19419 location.city, 19420 location.country && location.country !== "Deutschland" && `, ${location.country}` 19421 ] }) 19422 ] }) }) 19423 ] }), 19424 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 19425 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Kontakt" }), 19426 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 19427 location.email && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19428 "button", 19429 { 19430 onClick: handleEmailClick, 19431 className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-background-secondary active:bg-background-tertiary transition-colors min-h-[60px]", 19432 children: [
19433 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 bg-mec-primary/10 rounded-full flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-6 h-6 text-mec-primary" }) }), 19434 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 19435 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted mb-0.5", children: "E-Mail" }), 19436 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-mec-primary font-medium truncate", children: location.email }) 19437 ] }) 19438 ] 19439 } 19440 ), 19441 location.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19442 "button", 19443 { 19444 onClick: handlePhoneClick, 19445 className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-background-secondary active:bg-background-tertiary transition-colors min-h-[60px]", 19446 children: [
19447 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 bg-mec-primary/10 rounded-full flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-6 h-6 text-mec-primary" }) }), 19448 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 19449 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted mb-0.5", children: "Telefon" }), 19450 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-mec-primary font-medium", children: location.phone }) 19451 ] }) 19452 ] 19453 } 19454 ), 19455 location.website && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19456 "button", 19457 { 19458 onClick: handleWebsiteClick, 19459 className: "flex items-center space-x-3 w-full text-left p-3 rounded-lg hover:bg-background-secondary active:bg-background-tertiary transition-colors min-h-[60px]", 19460 children: [
19461 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 bg-mec-primary/10 rounded-full flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Globe, { className: "w-6 h-6 text-mec-primary" }) }), 19462 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 19463 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted mb-0.5", children: "Website" }), 19464 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-mec-primary font-medium truncate", children: location.website.replace(/^https?:\/\//, "") }) 19465 ] }) 19466 ] 19467 } 19468 ) 19469 ] }) 19470 ] }), 19471 description && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 19472 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Beschreibung" }), 19473 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-lg p-4", children: [
19474 /* @__PURE__ */ jsxRuntimeExports.jsx( 19475 "div", 19476 { 19477 className: "text-text-secondary leading-relaxed", 19478 dangerouslySetInnerHTML: { __html: displayDescription } 19479 } 19480 ), 19481 shouldTruncate && /* @__PURE__ */ jsxRuntimeExports.jsx( 19482 "button", 19483 { 19484 onClick: () => setShowFullDescription(!showFullDescription), 19485 className: "mt-3 inline-flex items-center text-mec-primary hover:text-mec-primary-dark font-medium text-sm transition-colors", 19486 children: showFullDescription ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 19487 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Weniger anzeigen" }), 19488 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronUp, { className: "w-4 h-4 ml-1" }) 19489 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 19490 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Mehr anzeigen" }),
19491 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "w-4 h-4 ml-1" }) 19492 ] }) 19493 } 19494 ) 19495 ] }) 19496 ] }), 19497 (location.openingdate || location.openingDate || location.parkingspaces || location.parkingSpaces) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 19498 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Weitere Informationen" }), 19499 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-lg p-4 space-y-3", children: [ 19500 (location.openingdate || location.openingDate) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 19501 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted", children: "Eröffnung" }), 19502 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-text-primary", children: new Date(location.openingdate || location.openingDate).getFullYear() }) 19503 ] }), 19504 (location.parkingspaces || location.parkingSpaces) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
19505 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-muted", children: "Parkplätze" }), 19506 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-text-primary", children: location.parkingspaces || location.parkingSpaces }) 19507 ] }) 19508 ] }) 19509 ] }) 19510 ] }) 19511 ] }); 19512}; 19513const LocationModalContacts = ({ 19514 location, 19515 contacts, 19516 isLoading 19517}) => { 19518 const { open: openContactModal } = useContactModal(); 19519 const locationContacts = contacts.filter((contact) => { 19520 const hasLocationId = contact.locationId === location.id; 19521 return hasLocationId; 19522 }); 19523 if (isLoading) { 19524 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [ 19525 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 p-6 border-b border-background-tertiary", children: [ 19526 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary", children: "Ansprechpartner" }),
19527 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-text-secondary mt-1", children: location.name }) 19528 ] }), 19529 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [ 19530 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-12 w-12 border-b-2 border-mec-primary mx-auto mb-4" }), 19531 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-muted", children: "Lade Ansprechpartner..." }) 19532 ] }) }) 19533 ] }); 19534 } 19535 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [ 19536 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 p-6 border-b border-background-tertiary", children: [ 19537 /* @__PURE__ */ jsxRuntimeExports.jsxs("h2", { className: "text-2xl font-bold text-text-primary", children: [ 19538 "Kontakte (", 19539 locationContacts.length, 19540 ")" 19541 ] }),
19542 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-text-secondary mt-1", children: location.name }) 19543 ] }), 19544 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto", children: locationContacts.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 md:p-6", children: [ 19545 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 md:mb-6", children: [ 19546 /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-lg font-semibold text-text-primary mb-2 flex items-center", children: [ 19547 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 mr-2 text-mec-primary" }), 19548 "Ihr Ansprechpartner" 19549 ] }), 19550 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-text-muted", children: [ 19551 locationContacts.length, 19552 " Ansprechpartner an diesem Standort" 19553 ] }) 19554 ] }), 19555 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 md:gap-4 items-stretch", children: locationContacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx( 19556 ContactCard, 19557 { 19558 contact, 19559 onClick: openContactModal, 19560 variant: "default", 19561 className: "w-full", 19562 showLocation: false 19563 }, 19564 contact.id 19565 )) }) 19566 ] }) : ( 19567 /* Empty State */
19568 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex items-center justify-center p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center max-w-md", children: [ 19569 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-background-secondary rounded-full flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-8 h-8 text-text-muted" }) }), 19570 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Keine Ansprechpartner verfügbar" }), 19571 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-muted text-sm leading-relaxed", children: "Für diesen Standort sind aktuell keine direkten Ansprechpartner hinterlegt. Nutzen Sie die allgemeinen Kontaktdaten des Standorts." }) 19572 ] }) }) 19573 ) }) 19574 ] }); 19575}; 19576const OfflineFallback = ({ 19577 message = "Diese Daten sind offline nicht verfügbar", 19578 onRetry 19579}) => { 19580 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center p-8 text-center", children: [ 19581 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-16 h-16 bg-yellow-100 rounded-full flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(WifiOff, { className: "w-8 h-8 text-yellow-600" }) }), 19582 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: "Offline-Modus" }), 19583 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4 max-w-md", children: message }), 19584 onRetry && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19585 "button", 19586 { 19587 onClick: onRetry, 19588 className: "flex items-center space-x-2 px-4 py-2 bg-mec-primary text-white rounded-lg hover:bg-mec-primary-dark transition-colors", 19589 children: [
19590 /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "w-4 h-4" }), 19591 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Erneut versuchen" }) 19592 ] 19593 } 19594 ), 19595 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-text-muted mt-4", children: "Ãffnen Sie diese Seite online, um die Daten zu laden" }) 19596 ] }); 19597}; 19598const LocationContactModal = () => { 19599 const { isOpen, locationId, close } = useLocationModal(); 19600 const [activeView, setActiveView] = reactExports.useState("hero"); 19601 reactExports.useEffect(() => { 19602 if (locationId) { 19603 setActiveView("hero"); 19604 } 19605 }, [locationId]); 19606 const onClose = close; 19607 const { data: location, isLoading: locationLoading, error: locationError } = useLocation(locationId); 19608 const { contacts, locationSpecificCount, isLoading: contactsLoading } = useFilteredContacts(locationId || void 0); 19609 if (!isOpen || !locationId) return null; 19610 const isLoading = locationLoading || contactsLoading; 19611 const hasError = locationError || !location; 19612 if (isLoading) { 19613 return /* @__PURE__ */ jsxRuntimeExports.jsx( 19614 Modal, 19615 { 19616 isOpen, 19617 onClose, 19618 title: "Lade Standort...", 19619 size: "full", 19620 children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-96", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-12 w-12 border-b-2 border-mec-primary" }) }) 19621 } 19622 ); 19623 } 19624 if (hasError) { 19625 const isOfflineError = !navigator.onLine || locationError?.status === 503; 19626 return /* @__PURE__ */ jsxRuntimeExports.jsx( 19627 Modal, 19628 { 19629 isOpen, 19630 onClose, 19631 title: isOfflineError ? "Offline-Modus" : "Fehler", 19632 size: "full", 19633 children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-96", children: isOfflineError ? /* @__PURE__ */ jsxRuntimeExports.jsx( 19634 OfflineFallback, 19635 { 19636 message: "Dieser Standort wurde noch nicht offline gespeichert. Ãffnen Sie ihn online, um die Daten zu cachen.", 19637 onRetry: () => window.location.reload() 19638 } 19639 ) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
19640 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-muted mb-4", children: "Standort konnte nicht geladen werden." }), 19641 /* @__PURE__ */ jsxRuntimeExports.jsx( 19642 "button", 19643 { 19644 onClick: onClose, 19645 className: "btn-primary", 19646 children: "SchlieÃen" 19647 } 19648 ) 19649 ] }) }) 19650 } 19651 ); 19652 } 19653 const getCenterData = () => { 19654 console.log("ð DEBUG: Full location object:", location); 19655 const rentableArea = location.rentableArea || location.rentablearea; 19656 const shopCount = location.shopCount || location.shopcount; 19657 const salesLevels = location.salesLevels || location.saleslevels; 19658 if (rentableArea || shopCount || salesLevels) { 19659 console.log("â Using database fields:", { 19660 rentableArea, 19661 shopCount, 19662 salesLevels 19663 }); 19664 return { 19665 vermietbareFlaeche: rentableArea, 19666 anzahlShops: shopCount, 19667 verkaufsebenen: salesLevels 19668 }; 19669 } 19670 const wpData = location.wpData; 19671 if (wpData && wpData.acf) { 19672 console.log("ð DEBUG: wpData:", wpData); 19673 console.log("ð DEBUG: ACF fields:", wpData.acf); 19674 const acf = wpData.acf; 19675 const centerData2 = { 19676 vermietbareFlaeche: acf["center-grunddaten-vermietbare-flaeche"], 19677 anzahlShops: acf["center-grunddaten-anzahl-shops"], 19678 verkaufsebenen: acf["center-grunddaten-verkaufsebenen"] 19679 }; 19680 console.log("ð DEBUG: Extracted center data:", centerData2); 19681 return centerData2; 19682 } 19683 console.log("â No wpData and no database fields found"); 19684 return {}; 19685 }; 19686 const centerData = getCenterData(); 19687 const locationContacts = contacts || []; 19688 const navigationItems = [ 19689 { 19690 id: "hero", 19691 label: "Ãbersicht", 19692 icon: Home, 19693 description: "Hero-Ansicht mit Stats" 19694 }, 19695 { 19696 id: "info", 19697 label: "Info", 19698 icon: Building2, 19699 description: "Adresse und Details" 19700 }, 19701 { 19702 id: "contacts", 19703 label: "Kontakte", 19704 icon: Users, 19705 count: locationSpecificCount, 19706 // Use location-specific count instead of total 19707 description: "Lokale Kontakte" 19708 } 19709 ]; 19710 const currentNavItem = navigationItems.find((item) => item.id === activeView); 19711 return /* @__PURE__ */ jsxRuntimeExports.jsx( 19712 Modal, 19713 { 19714 isOpen, 19715 onClose, 19716 title: "", 19717 size: "full", 19718 className: "p-0", 19719 showCloseButton: false, 19720 children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col", children: [
19721 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-shrink-0 bg-white border-b border-background-tertiary relative z-20", children: [ 19722 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between p-4 min-h-[60px]", children: [ 19723 activeView !== "hero" && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19724 "button", 19725 { 19726 onClick: () => setActiveView("hero"), 19727 className: "flex items-center text-mec-primary hover:text-mec-primary-dark transition-colors p-2 -ml-2 min-w-[44px] min-h-[44px]", 19728 children: [ 19729 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronLeft, { className: "w-6 h-6 mr-1" }), 19730 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base", children: "Zurück" }) 19731 ] 19732 } 19733 ), 19734 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center px-2", children: [ 19735 /* @__P
19735URE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg md:text-xl font-semibold text-text-primary", children: currentNavItem?.label }), 19736 currentNavItem?.count !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm text-text-muted", children: [ 19737 "(", 19738 currentNavItem.count, 19739 ")" 19740 ] }) 19741 ] }), 19742 /* @__PURE__ */ jsxRuntimeExports.jsx( 19743 "button", 19744 { 19745 onClick: onClose, 19746 className: "p-2 hover:bg-background-secondary rounded-full transition-colors min-w-[44px] min-h-[44px] flex items-center justify-center", 19747 "aria-label": "SchlieÃen", 19748 children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-6 h-6" }) 19749 } 19750 ) 19751 ] }), 19752 activeView === "hero" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 pb-3 md:px-4 md:pb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-3 gap-2 md:gap-3", children: navigationItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs( 19753 "button", 19754 { 19755 onClick: () => setActiveView(item.id), 19756 className: ` 19757 p-3 md:p-3 rounded-lg text-center transition-all duration-200 19758 min-h-[68px] md:min-h-[auto] 19759 active:scale-95 touch-manipulation 19760 ${item.id === activeView ? "bg-mec-primary text-white shadow-md" : "bg-background-secondary hover:bg-background-tertiary text-text-secondary hover:text-text-primary"} 19761 `, 19762 children: [
19763 /* @__PURE__ */ jsxRuntimeExports.jsx(item.icon, { className: "w-5 h-5 md:w-5 md:h-5 mx-auto mb-1" }), 19764 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs md:text-sm font-medium leading-tight px-1", children: [ 19765 item.label, 19766 item.count !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "block text-xs mt-0.5", children: [ 19767 "(", 19768 item.count, 19769 ")" 19770 ] }) 19771 ] }) 19772 ] 19773 }, 19774 item.id 19775 )) }) }) 19776 ] }), 19777 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-h-0 overflow-hidden", children: [ 19778 activeView === "hero" && /* @__PURE__ */ jsxRuntimeExports.jsx( 19779 LocationModalHero, 19780 { 19781 location, 19782 centerData 19783 } 19784 ), 19785 activeView === "info" && /* @__PURE__ */ jsxRuntimeExports.jsx( 19786 LocationModalInfo, 19787 { 19788 location 19789 } 19790 ), 19791 activeView === "contacts" && /* @__PURE__ */ jsxRuntimeExports.jsx( 19792 LocationModalContacts, 19793 { 19794 location, 19795 contacts: locationContacts, 19796 isLoading: contactsLoading 19797 } 19798 ) 19799 ] }) 19800 ] }) 19801 } 19802 ); 19803}; 19804const LocationMiniCard = ({ location, onClick }) => { 19805 const handleClick = () => {
19806 console.log("ð¢ LocationMiniCard - clicked:", location.name, location.id); 19807 onClick(); 19808 }; 19809 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 19810 "button", 19811 { 19812 onClick: handleClick, 19813 className: "w-full flex items-center gap-4 p-4 rounded-lg transition-all hover:bg-white/70 active:bg-white/90 min-h-[60px]", 19814 style: { backgroundColor: "rgba(255, 255, 255, 0.5)" }, 19815 children: [ 19816 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0 w-16 h-16 md:w-20 md:h-20 rounded-lg overflow-hidden bg-white shadow-sm border border-gray-100", children: location.logo || location.heroImage ? /* @__PURE__ */ jsxRuntimeExports.jsx( 19817 "img", 19818 { 19819 src: location.logo || location.heroImage, 19820 alt: location.name, 19821 className: "w-full h-full object-contain p-2" 19822 } 19823 ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full flex items-center justify-center", style: { backgroundColor: "#E0E6EB" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-8 h-8 md:w-10 md:h-10", style: { color: "#d20028" } }) }) }),
19824 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0 text-left", children: [ 19825 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-semibold text-base md:text-lg truncate mb-1", style: { color: "#28323c" }, children: location.name }), 19826 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm md:text-base truncate", style: { color: "#6b7280" }, children: [ 19827 location.city, 19828 location.address && ` ⢠${location.address}` 19829 ] }) 19830 ] }), 19831 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "flex-shrink-0 w-5 h-5 md:w-6 md:h-6", style: { color: "#d20028" } }) 19832 ] 19833 } 19834 ); 19835}; 19836const ContactModal = () => { 19837 const { isOpen, contact, close } = useContactModal(); 19838 const { open: openLocationModal } = useLocationModal(); 19839 const { data: contactLocations, isLoading: locationsLoading, error: locationsError } = useContactLocations(contact?.id || null); 19840 console.log("ð ContactModal - contact:", contact); 19841 console.log("ð ContactModal - contactLocations:", contactLocations); 19842 console.log("ð ContactModal - locationsLoading:", locationsLoading); 19843 console.log("ð ContactModal - locationsError:", locationsError); 19844 if (!contact) return null; 19845 const handleEmailClick = (e) => { 19846 e?.stopPropagation(); 19847 window.location.href = `mailto:${contact.email}`; 19848 }; 19849 const handlePhoneClick = (e) => { 19850 e?.stopPropagation(); 19851 if (contact.phone) { 19852 window.location.href = `tel:${contact.phone}`; 19853 } 19854 }; 19855 const handleLocationClick = (locationId) => { 19856 console.log("ð¯ ContactModal - handleLocationClick called with:", locationId); 19857 console.log("ð ContactModal - closing contact modal..."); 19858 close(); 19859 console.log("ð ContactModal - opening location modal..."); 19860 openLocationModal(locationId); 19861 }; 19862 const hasMultipleLocations = contactLocations && contactLocations.length > 1; 19863 const hasSingleLocation = contactLocations && contactLocations.length === 1; 19864 return /* @__PURE__ */ jsxRuntimeExports.jsx( 19865 Modal, 19866 { 19867 isOpen, 19868 onClose: close, 19869 title: "", 19870 size: "lg", 19871 className: "p-0", 19872 showCloseButton: true, 19873 children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white", style: { fontFamily: "Helvetica Neue, Arial, sans-serif" }, children: [
19874 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-[5px]", style: { backgroundColor: "#d20028" } }), 19875 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative w-full h-[24rem] sm:h-[26rem] md:h-[28rem]", children: contact.image ? /* @__PURE__ */ jsxRuntimeExports.jsx( 19876 "img", 19877 { 19878 src: contact.image, 19879 alt: contact.fullName, 19880 className: "w-full h-full object-cover" 19881 } 19882 ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full bg-gray-200 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-12 h-12 md:w-16 md:h-16 text-gray-400" }) }) }), 19883 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 md:p-6 lg:p-8", style: { backgroundColor: "#E0E6EB" }, children: [ 19884 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm md:text-base mb-2", style: { color: "#28323c" }, children: [ 19885 contact.position, 19886 contact.department && ` ⢠${contact.department}` 19887 ] }),
19888 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl md:text-3xl lg:text-4xl font-semibold mb-4 md:mb-6", style: { color: "#28323c" }, children: contact.fullName }), 19889 locationsLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-6 p-4 md:p-5 rounded-lg", style: { backgroundColor: "rgba(255, 255, 255, 0.5)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3", children: [ 19890 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-5 w-5 border-b-2", style: { borderColor: "#d20028" } }), 19891 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", style: { color: "#6b7280" }, children: "Lade Standorte..." }) 19892 ] }) }) : locationsError ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-6 p-4 md:p-5 rounded-lg", style: { backgroundColor: "rgba(255, 0, 0, 0.1)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", style: { color: "#d20028" }, children: "Fehler beim Laden der Standorte" }) }) : hasMultipleLocations ? ( 19893 /* Multiple Locations - Show as Mini Cards */
19894 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [ 19895 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 mb-3", children: [ 19896 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 md:w-6 md:h-6", style: { color: "#d20028" } }), 19897 /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "font-semibold text-base md:text-lg", style: { color: "#28323c" }, children: [ 19898 "Zugewiesene Standorte (", 19899 contactLocations.length, 19900 ")" 19901 ] }) 19902 ] }), 19903 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2", children: contactLocations.map((location) => /* @__PURE__ */ jsxRuntimeExports.jsx( 19904 LocationMiniCard, 19905 { 19906 location, 19907 onClick: () => handleLocationClick(location.id) 19908 }, 19909 location.id 19910 )) }) 19911 ] }) 19912 ) : hasSingleLocation ? ( 19913 /* Single Location - Show as before */
19914 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-6 p-4 md:p-5 rounded-lg", style: { backgroundColor: "rgba(255, 255, 255, 0.5)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start space-x-3", children: [ 19915 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-5 h-5 md:w-6 md:h-6 flex-shrink-0 mt-1", style: { color: "#d20028" } }), 19916 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 19917 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm mb-1.5 md:mb-2", style: { color: "#6b7280" }, children: "Zugewiesener Standort" }), 19918 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-semibold mb-1 text-base md:text-lg", style: { color: "#28323c" }, children: contactLocations[0].name }), 19919 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm md:text-base mb-1", style: { color: "#28323c" }, children: contactLocations[0].city }),
19920 contactLocations[0].address && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm", style: { color: "#6b7280" }, children: contactLocations[0].address }), 19921 /* @__PURE__ */ jsxRuntimeExports.jsxs( 19922 "button", 19923 { 19924 onClick: () => handleLocationClick(contactLocations[0].id), 19925 className: "mt-3 inline-flex items-center text-sm md:text-base font-medium hover:underline active:opacity-70 min-h-[44px] md:min-h-0 py-2 md:py-0", 19926 style: { color: "#d20028" }, 19927 children: [ 19928 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Standort anzeigen" }), 19929 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 ml-1" }) 19930 ] 19931 } 19932 ) 19933 ] }) 19934 ] }) }) 19935 ) : null, 19936 contact.specialties && contact.specialties.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-5 md:mb-6", children: [
19937 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-3", style: { color: "#28323c" }, children: "Fachbereiche" }), 19938 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: contact.specialties.map((specialty, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 19939 "span", 19940 { 19941 className: "px-3 py-2 text-sm md:text-base font-medium rounded-lg", 19942 style: { backgroundColor: "#d20028", color: "white" }, 19943 children: specialty 19944 }, 19945 index 19946 )) }) 19947 ] }), 19948 contact.languages && contact.languages.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-5 md:mb-6", children: [ 19949 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-3", style: { color: "#28323c" }, children: "Sprachen" }), 19950 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: contact.languages.map((language, index) => /* @__PURE__ */ jsxRuntimeExports.jsx( 19951 "span", 19952 { 19953 className: "px-3 py-2 text-sm md:text-base rounded-lg", 19954 style: { backgroundColor: "#a3b2c2", color: "white" }, 19955 children: language 19956 }, 19957 index 19958 )) }) 19959 ] }), 19960 contact.bio && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-5 md:mb-6", children: [
19961 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-3", style: { color: "#28323c" }, children: "Ãber mich" }), 19962 /* @__PURE__ */ jsxRuntimeExports.jsx( 19963 "div", 19964 { 19965 className: "text-sm md:text-base leading-relaxed prose prose-sm max-w-none", 19966 style: { color: "#28323c" }, 19967 dangerouslySetInnerHTML: { __html: contact.bio } 19968 } 19969 ) 19970 ] }), 19971 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 md:space-y-3", children: [ 19972 contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19973 "button", 19974 { 19975 onClick: handlePhoneClick, 19976 className: "flex items-center space-x-3 w-full text-left p-4 md:p-4 rounded-lg hover:bg-white/70 active:bg-white/80 transition-colors min-h-[64px] md:min-h-[60px]", 19977 style: { backgroundColor: "rgba(255, 255, 255, 0.4)" }, 19978 children: [
19979 /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-6 h-6 md:w-5 md:h-5 flex-shrink-0", style: { color: "#d20028" } }), 19980 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 19981 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-xs mb-1", style: { color: "#6b7280" }, children: "Telefon" }), 19982 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base md:text-base", style: { color: "#28323c" }, children: contact.phone }) 19983 ] }) 19984 ] 19985 } 19986 ), 19987 contact.mobile && /* @__PURE__ */ jsxRuntimeExports.jsxs( 19988 "button", 19989 { 19990 onClick: (e) => { 19991 e.stopPropagation(); 19992 window.location.href = `tel:${contact.mobile}`; 19993 }, 19994 className: "flex items-center space-x-3 w-full text-left p-4 md:p-4 rounded-lg hover:bg-white/70 active:bg-white/80 transition-colors min-h-[64px] md:min-h-[60px]", 19995 style: { backgroundColor: "rgba(255, 255, 255, 0.4)" }, 19996 children: [
19997 /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-6 h-6 md:w-5 md:h-5 flex-shrink-0", style: { color: "#d20028" } }), 19998 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 19999 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-xs mb-1", style: { color: "#6b7280" }, children: "Mobil" }), 20000 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base md:text-base", style: { color: "#28323c" }, children: contact.mobile }) 20001 ] }) 20002 ] 20003 } 20004 ), 20005 contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs( 20006 "button", 20007 { 20008 onClick: handleEmailClick, 20009 className: "flex items-center space-x-3 w-full text-left p-4 md:p-4 rounded-lg hover:bg-white/70 active:bg-white/80 transition-colors min-h-[64px] md:min-h-[60px]", 20010 style: { backgroundColor: "rgba(255, 255, 255, 0.4)" }, 20011 children: [
20012 /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-6 h-6 md:w-5 md:h-5 flex-shrink-0", style: { color: "#d20028" } }), 20013 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 20014 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-xs mb-1", style: { color: "#6b7280" }, children: "E-Mail" }), 20015 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-base md:text-base truncate block", style: { color: "#28323c" }, children: contact.email }) 20016 ] }) 20017 ] 20018 } 20019 ) 20020 ] }) 20021 ] }), 20022 contact.socialLinks && contact.socialLinks.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-4 py-5 md:px-8 md:py-6", style: { backgroundColor: "#EFF3F5" }, children: [ 20023 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm md:text-base font-medium mb-4", style: { color: "#28323c" }, children: "Social Media" }),
20024 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center flex-wrap gap-4 md:gap-6", children: contact.socialLinks.map((link, index) => { 20025 const isXing = link.platform?.toLowerCase() === "xing" || link.url?.includes("xing.com"); 20026 const isLinkedIn = link.platform?.toLowerCase() === "linkedin" || link.url?.includes("linkedin.com"); 20027 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 20028 "a", 20029 { 20030 href: link.url, 20031 target: "_blank", 20032 rel: "noopener noreferrer", 20033 onClick: (e) => e.stopPropagation(), 20034 className: "flex items-center space-x-2 hover:opacity-70 active:opacity-50 transition-opacity min-h-[44px] py-2", 20035 style: { color: "#a3b2c2" }, 20036 children: [ 20037 isXing && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 20038 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-7 h-7 md:w-6 md:h-6", fill: "currentColor", viewBox: "0 0 384 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z" }) }),
20039 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm md:text-sm font-medium", children: "Xing" }) 20040 ] }), 20041 isLinkedIn && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 20042 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-7 h-7 md:w-6 md:h-6", fill: "currentColor", viewBox: "0 0 448 512", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z" }) }), 20043 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm md:text-sm font-medium", children: "LinkedIn" }) 20044 ] }) 20045 ] 20046 }, 20047 index 20048 ); 20049 }) }) 20050 ] }),
20051 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-5 md:px-8 md:py-6 bg-white border-t", style: { borderColor: "#E0E6EB" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 md:gap-4", children: [ 20052 contact.email && /* @__PURE__ */ jsxRuntimeExports.jsxs( 20053 "button", 20054 { 20055 onClick: handleEmailClick, 20056 className: "flex items-center justify-center space-x-3 px-6 py-4 md:py-4 rounded-lg font-semibold text-white transition-all hover:opacity-90 active:opacity-80 shadow-md min-h-[56px] text-base md:text-base", 20057 style: { backgroundColor: "#d20028" }, 20058 children: [ 20059 /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-5 h-5 md:w-5 md:h-5" }), 20060 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "E-Mail senden" }) 20061 ] 20062 } 20063 ), 20064 contact.phone && /* @__PURE__ */ jsxRuntimeExports.jsxs( 20065 "button", 20066 { 20067 onClick: handlePhoneClick, 20068 className: "flex items-center justify-center space-x-3 px-6 py-4 md:py-4 rounded-lg font-semibold transition-all hover:bg-gray-100 active:bg-gray-200 shadow-md min-h-[56px] text-base md:text-base", 20069 style: { backgroundColor: "#E0E6EB", color: "#28323c" }, 20070 children: [
20071 /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-5 h-5 md:w-5 md:h-5" }), 20072 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Anrufen" }) 20073 ] 20074 } 20075 ) 20076 ] }) }) 20077 ] }) 20078 } 20079 ); 20080}; 20081const MECLogo = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='180'%20height='65.033'%20viewBox='0%200%20180%2065.033'%3e%3cg%20id='MEC_Logo'%20data-name='MEC%20Logo'%20transform='translate(0%200)'%3e%3cg%20id='MEC_Logo-2'%20data-name='MEC%20Logo'%20transform='translate(0%200)'%3e%3cpath%20id='Fill_1'%20data-name='Fill%201'%20d='M0,4.994,8.542,9.956V0Z'%20transform='translate(24.895)'%20fill='%23b30022'%3e%3c/path%3e%3cpath%20id='Fill_2'%20data-name='Fill%202'%20d='M0,0V9.956l8.023,4.661V41.8l9.888,5.744V10.406Z'%20transform='translate(33.438)'%20fill='%23d20028'%3e%3c/path%3e%3cpath%20id='Fill_3'%20data-name='Fill%203'%20d='M0,5.592l9.573,5.559V0Z'%20transform='translate(10.665%207.719)'%20fill='%23b30022'%3e%3c/path%3e%3cpath%20id='Fill_4'%20data-name='Fill%204'%20d='M16.57,9.622,0,0V11.152L8.65,16.174V42.161l7.918,4.6Z'%20transform='translate(20.236%207.718)'%20fill='%23d20028'%3e%3c/path%3e%3cpath%20id='Fill_5'%20data-name='Fill%205'%20d='M0,37.135,23.954,51.04V13.911L0,0Z'%20transform='translate(0%2012.872)'%20fill='%23d20028'%3e%3c/path%3e%3cpath%20id='Fill_6'%20data-name='Fill%206'%20d='M11.44,0l8.641,25.563h.106L28.363,0H39.8V37.174H32.193V10.83h-.1L23.033,37.174H16.77L7.712,11.09h-.1V37.174H0V0Z'%20transform='translate(65.857%2010.359)'%20fill='%2328323c'%3e%3c/path%3e%3cpath%20id='Fill_7'%20data-name='Fill%207'%20d='M27.639,0V6.871H8.127v7.966H26.034V21.19H8.127V30.3H28.052v6.874H0V0Z'%20transform='translate(112.802%2010.359)'%20fill='%2328323c'%3e%3c/path%3e%3cpath%20id='Fill_8'%20data-name='Fill%208'%20d='M25.309,10.8A8.261,8.261,0,0,0,23.5,8.746a8.443,8.443,0,0,0-5.331-1.873,9.44,9.44,0,0,0-4.658,1.066A8.846,8.846,0,0,0,10.4,10.8a12.578,12.578,0,0,0-1.733,4.087,20.533,20.533,0,0,0-.542,4.738,19.079,19.079,0,0,0,.542,4.556A12.306,12.306,0,0,0,10.4,28.165,8.907,8.907,0,0,0,13.507,31a9.415,9.415,0,0,0,4.658,1.068,7.492,7.492,0,0,0,5.82-2.291,10.606,10.606,0,0,0,2.563-6.039h7.87a19.151,19.151,0,0,1-1.6,6.3A15.129,15.129,0,0,1,29.4,34.829a14.478,14.478,0,0,1-4.968,3.021,18.1,18.1,0,0,1-6.263,1.041,18.875,18.875,0,0,1-7.635-1.482,16.374,16.374,0,0,1-5.717-4.088A18.1,18.1,0,0,1,1.24,27.2,22.6,22.6,0,0,1,0,19.627,23.391,23.391,0,0,1,1.24,11.9,18.589,18.589,0,0,1,4.812,5.674,16.343,16.343,0,0,1,10.529,1.51,18.592,18.592,0,0,1,18.165,0a18.55,18.55,0,0,1,5.772.884A15.608,15.608,0,0,1,28.8,3.462a13.913,13.913,0,0,1,3.547,4.191,15.1,15.1,0,0,1,1.759,5.726H26.239a6.76,6.76,0,0,0-.93-2.577'%20transform='translate(144.739%209.475)'%20fill='%2328323c'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e"; 20082const Header = ({ className }) => { 20083 const handleLogoClick = () => { 20084 window.scrollTo({ top: 0, behavior: "smooth" }); 20085 }; 20086 const isEmbedMode = new URLSearchParams(window.location.search).get("embed") === "true"; 20087 return /* @__PURE__ */ jsxRuntimeExports.jsx("header", { className: `bg-white border-b border-background-tertiary ${className || ""}`, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: isEmbedMode ? "px-3 sm:px-4 py-3 sm:py-4" : "container mx-auto px-3 sm:px-4 py-3 sm:py-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 20088 "button", 20089 { 20090 onClick: handleLogoClick, 20091 className: "flex items-center space-x-2 sm:space-x-4 min-w-0 flex-1 hover:opacity-80 transition-opacity cursor-pointer", 20092 children: [
20093 /* @__PURE__ */ jsxRuntimeExports.jsx( 20094 "img", 20095 { 20096 src: MECLogo, 20097 alt: "MEC Logo", 20098 className: "h-10 sm:h-12 w-auto object-contain flex-shrink-0", 20099 style: { fontFamily: "Helvetica Neue, Arial, sans-serif" } 20100 } 20101 ), 20102 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 text-left", children: [ 20103 /* @__PURE__ */ jsxRuntimeExports.jsxs("h1", { className: "text-base sm:text-xl font-semibold truncate", style: { color: "#28323c", fontFamily: "Helvetica Neue, Arial, sans-serif" }, children: [ 20104 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Portfolio Leasing Management" }), 20105 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sm:hidden", children: "Portfolio Leasing" }) 20106 ] }), 20107 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs sm:text-sm truncate", style: { color: "#28323c", fontFamily: "Helvetica Neue, Arial, sans-serif" }, children: [
20108 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Finden Sie Ihren Ansprechpartner" }), 20109 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sm:hidden", children: "Ansprechpartner" }) 20110 ] }) 20111 ] }) 20112 ] 20113 } 20114 ) }) }) }); 20115}; 20116const Footer = () => { 20117 const currentYear = (/* @__PURE__ */ new Date()).getFullYear(); 20118 return /* @__PURE__ */ jsxRuntimeExports.jsx("footer", { className: "bg-slate-800 text-white mt-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-4 py-4 md:py-6", children: [ 20119 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-6", children: [ 20120 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 20121 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg md:text-xl font-bold mb-2 md:mb-3", children: "MEC METRO-ECE Centermanagement" }), 20122 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-slate-300 text-sm space-y-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start space-x-2", children: [
20123 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 mt-0.5 flex-shrink-0" }), 20124 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 20125 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Fritz-Vomfelde-StraÃe 18" }), 20126 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "40547 Düsseldorf" }) 20127 ] }) 20128 ] }) }) 20129 ] }), 20130 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 20131 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-base md:text-lg font-semibold mb-2 md:mb-3", children: "Quick Links" }), 20132 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "space-y-1 text-sm", children: [ 20133 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 20134 "a", 20135 { 20136 href: "https://mec-cm.com", 20137 target: "_blank", 20138 rel: "noopener noreferrer", 20139 className: "text-slate-300 hover:text-white transition-colors inline-flex items-center", 20140 children: [ 20141 "MEC Website",
20142 /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-3 h-3 ml-1" }) 20143 ] 20144 } 20145 ) }), 20146 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 20147 "a", 20148 { 20149 href: "https://mec-cm.com/handelsimmobilien-overview/", 20150 target: "_blank", 20151 rel: "noopener noreferrer", 20152 className: "text-slate-300 hover:text-white transition-colors inline-flex items-center", 20153 children: [ 20154 "Handelsimmobilien", 20155 /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-3 h-3 ml-1" }) 20156 ] 20157 } 20158 ) }), 20159 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs( 20160 "a", 20161 { 20162 href: "https://mec-cm.com/unternehmen/management-team/", 20163 target: "_blank", 20164 rel: "noopener noreferrer", 20165 className: "text-slate-300 hover:text-white transition-colors inline-flex items-center", 20166 children: [ 20167 "Management-Team",
20168 /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-3 h-3 ml-1" }) 20169 ] 20170 } 20171 ) }) 20172 ] }) 20173 ] }), 20174 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 20175 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-base md:text-lg font-semibold mb-2 md:mb-3", children: "Kontakt" }), 20176 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [ 20177 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 text-slate-300", children: [ 20178 /* @__PURE__ */ jsxRuntimeExports.jsx(Phone, { className: "w-4 h-4 flex-shrink-0" }), 20179 /* @__PURE__ */ jsxRuntimeExports.jsx( 20180 "a", 20181 { 20182 href: "tel:+4921130153-0", 20183 className: "hover:text-white transition-colors", 20184 children: "+49 (0)211 30153-0" 20185 } 20186 ) 20187 ] }), 20188 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2 text-slate-300", children: [
20189 /* @__PURE__ */ jsxRuntimeExports.jsx(Mail, { className: "w-4 h-4 flex-shrink-0" }), 20190 /* @__PURE__ */ jsxRuntimeExports.jsx( 20191 "a", 20192 { 20193 href: "mailto:[email protected]", 20194 className: "hover:text-white transition-colors", 20195 children: "[email protected]" 20196 } 20197 ) 20198 ] }) 20199 ] }) 20200 ] }) 20201 ] }), 20202 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-slate-700 mt-4 md:mt-6 pt-3 md:pt-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col md:flex-row justify-between items-center text-xs md:text-sm", children: [ 20203 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-slate-400", children: [ 20204 "© ", 20205 currentYear, 20206 " MEC METRO-ECE Centermanagement. Alle Rechte vorbehalten." 20207 ] }), 20208 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex space-x-4 md:space-x-6 mt-2 md:mt-0", children: [
20209 /* @__PURE__ */ jsxRuntimeExports.jsx( 20210 "a", 20211 { 20212 href: "https://mec-cm.com/datenschutzerklaerung", 20213 target: "_blank", 20214 rel: "noopener noreferrer", 20215 className: "text-slate-400 hover:text-white transition-colors", 20216 children: "Datenschutzerklärung" 20217 } 20218 ), 20219 /* @__PURE__ */ jsxRuntimeExports.jsx( 20220 "a", 20221 { 20222 href: "https://mec-cm.com/impressum", 20223 target: "_blank", 20224 rel: "noopener noreferrer", 20225 className: "text-slate-400 hover:text-white transition-colors", 20226 children: "Impressum" 20227 } 20228 ) 20229 ] }) 20230 ] }) }) 20231 ] }) }); 20232}; 20233const Container = ({ 20234 children, 20235 size = "lg", 20236 padding = "md", 20237 className 20238}) => { 20239 const sizeClasses2 = { 20240 sm: "max-w-sm", 20241 md: "max-w-2xl", 20242 lg: "max-w-4xl", 20243 xl: "max-w-6xl", 20244 full: "max-w-full" 20245 }; 20246 const paddingClasses = { 20247 none: "", 20248 sm: "px-2", 20249 md: "px-4", 20250 lg: "px-6" 20251 }; 20252 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx( 20253 "mx-auto", 20254 sizeClasses2[size], 20255 paddingClasses[padding], 20256 className 20257 ), children }); 20258}; 20259const Section = ({ 20260 children, 20261 spacing = "md", 20262 className 20263}) => { 20264 const spacingClasses = { 20265 none: "", 20266 sm: "space-y-2", 20267 md: "space-y-4", 20268 lg: "space-y-6", 20269 xl: "space-y-8" 20270 }; 20271 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx(spacingClasses[spacing], className), children }); 20272}; 20273const CardContainer = ({ 20274 children, 20275 variant = "default", 20276 padding = "md", 20277 className, 20278 onClick 20279}) => { 20280 const variantClasses = { 20281 default: "bg-white rounded-mec-lg shadow-card border border-background-tertiary", 20282 elevated: "bg-white rounded-mec-lg shadow-card-hover", 20283 outlined: "bg-white rounded-mec-lg border-2 border-background-tertiary" 20284 }; 20285 const paddingClasses = { 20286 none: "", 20287 sm: "p-3", 20288 md: "p-4", 20289 lg: "p-6" 20290 }; 20291 return /* @__PURE__ */ jsxRuntimeExports.jsx( 20292 "div", 20293 { 20294 className: clsx( 20295 variantClasses[variant], 20296 paddingClasses[padding], 20297 onClick && "cursor-pointer hover:shadow-card-hover transition-shadow duration-200", 20298 "overflow-hidden", 20299 className 20300 ), 20301 onClick, 20302 children 20303 } 20304 ); 20305}; 20306const PageLayout = ({ 20307 children, 20308 title, 20309 subtitle, 20310 actions, 20311 className 20312}) => { 20313 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("space-y-6", className), children: [ 20314 (title || subtitle || actions) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [
20315 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 20316 title && /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold text-text-primary", children: title }), 20317 subtitle && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mt-1", children: subtitle }) 20318 ] }), 20319 actions && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 w-full sm:flex-shrink-0 sm:w-auto", children: actions }) 20320 ] }), 20321 children 20322 ] }); 20323}; 20324const OfflineIndicator = () => { 20325 const [isOnline, setIsOnline] = reactExports.useState(navigator.onLine); 20326 const [showBanner, setShowBanner] = reactExports.useState(!navigator.onLine); 20327 const [justCameOnline, setJustCameOnline] = reactExports.useState(false); 20328 reactExports.useEffect(() => { 20329 const handleOnline = () => { 20330 setIsOnline(true); 20331 setJustCameOnline(true); 20332 setShowBanner(true); 20333 setTimeout(() => { 20334 setShowBanner(false); 20335 setJustCameOnline(false); 20336 }, 3e3); 20337 }; 20338 const handleOffline = () => { 20339 setIsOnline(false); 20340 setShowBanner(true); 20341 setJustCameOnline(false); 20342 }; 20343 window.addEventListener("online", handleOnline); 20344 window.addEventListener("offline", handleOffline); 20345 return () => { 20346 window.removeEventListener("online", handleOnline); 20347 window.removeEventListener("offline", handleOffline); 20348 }; 20349 }, []); 20350 if (isOnline && !justCameOnline) { 20351 return null; 20352 } 20353 if (!showBanner) { 20354 return null; 20355 } 20356 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 20357 "div", 20358 { 20359 className: clsx( 20360 "fixed top-0 left-0 right-0 z-50 transition-all duration-300", 20361 "shadow-lg" 20362 ), 20363 children: [ 20364 !isOnline && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-yellow-500 text-white px-4 py-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto flex items-center justify-center space-x-3", children: [
20365 /* @__PURE__ */ jsxRuntimeExports.jsx(WifiOff, { className: "w-5 h-5 flex-shrink-0" }), 20366 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center", children: [ 20367 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-sm md:text-base", children: "Offline-Modus" }), 20368 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm opacity-90", children: "Sie verwenden gespeicherte Daten. Einige Funktionen sind möglicherweise eingeschränkt." }) 20369 ] }) 20370 ] }) }), 20371 isOnline && justCameOnline && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-500 text-white px-4 py-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto flex items-center justify-center space-x-3", children: [ 20372 /* @__PURE__ */ jsxRuntimeExports.jsx(Wifi, { className: "w-5 h-5 flex-shrink-0" }), 20373 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center", children: [
20374 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-sm md:text-base", children: "Verbindung wiederhergestellt" }), 20375 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs md:text-sm opacity-90", children: "Daten werden aktualisiert..." }) 20376 ] }) 20377 ] }) }) 20378 ] 20379 } 20380 ); 20381}; 20382function App() { 20383 const { 20384 mapView, 20385 selectedLocationId, 20386 openLocationModal, 20387 isContactModalOpen 20388 } = useAppStore(); 20389 const { data: locations, isLoading, error } = useLocations(); 20390 const { data: contacts } = useContacts(); 20391 const urlParams = new URLSearchParams(window.location.search); 20392 const embedParam = urlParams.get("embed"); 20393 const hideHeaderParam = urlParams.get("hideHeader"); 20394 const hideFooterParam = urlParams.get("hideFooter"); 20395 const isEmbedMode = embedParam === "true"; 20396 const showHeader = hideHeaderParam === "true" ? false : embedParam !== "true"; 20397 const showFooter = hideFooterParam === "true" ? false : embedParam !== "true"; 20398 reactExports.useEffect(() => { 20399 const locationParam = urlParams.get("location"); 20400 if (locationParam && !selectedLocationId) { 20401 const locationId = locationParam.startsWith("wp-") ? locationParam : `wp-${locationParam}`; 20402 openLocationModal(locationId); 20403 } 20404 }, [selectedLocationId, openLocationModal]); 20405 if (isLoading) { 20406 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen flex items-center justify-center bg-background-secondary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
20407 /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingSpinner, { size: "lg" }), 20408 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-text-secondary", children: "Lade Portfolio-Daten..." }) 20409 ] }) }); 20410 } 20411 if (error) { 20412 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen flex items-center justify-center bg-background-secondary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-8", children: [ 20413 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "â ï¸" }), 20414 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold text-text-primary mb-2", children: "Fehler beim Laden" }), 20415 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4", children: "Die Portfolio-Daten konnten nicht geladen werden." }), 20416 /* @__PURE__ */ jsxRuntimeExports.jsx( 20417 "button", 20418 { 20419 onClick: () => window.location.reload(), 20420 className: "btn-primary", 20421 children: "Erneut versuchen" 20422 } 20423 ) 20424 ] }) }); 20425 } 20426 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `min-h-screen bg-background-primary scroll-smooth ${isEmbedMode ? "embed-mode" : ""}`, children: [ 20427 /* @__PURE__ */ jsxRuntimeExports.jsx(OfflineIndicator, {}), 20428 showHeader && /* @__PURE__ */ jsxRuntimeExports.jsx(Header, {}), 20429 /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: isEmbedMode ? "py-2" : "py-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Container, { size: isEmbedMode ? "full" : "xl", padding: isEmbedMode ? "none" : "md", children: /* @__PURE__ */ jsxRuntimeExports.jsx(PageLayout, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { spacing: "lg", children: mapView === "interactive" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
20430 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContainer, { children: [ 20431 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 border-b border-background-tertiary flex items-center justify-between", children: [ 20432 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 20433 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-text-primary", children: "Finden Sie Ihren Ansprechpartner" }), 20434 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary mt-1", children: "Klicken Sie auf einen Standort auf der Karte" }) 20435 ] }), 20436 /* @__PURE__ */ jsxRuntimeExports.jsx(ViewToggle, { size: "sm" }) 20437 ] }), 20438 /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary$1, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-8 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Karte konnte nicht geladen werden" }) }), children: /* @__PURE__ */ jsxRuntimeExports.jsx( 20439 MapContainer, 20440 { 20441 locations: locations || [], 20442 contacts: contacts?.data || [], 20443 height: 500, 20444 className: "w-full" 20445 } 20446 ) }) 20447 ] }), 20448 selectedLocationId && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-mec-lg shadow-card p-6", children: [
20449 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary mb-4", children: "Ansprechpartner am ausgewählten Standort" }), 20450 /* @__PURE__ */ jsxRuntimeExports.jsx(ContactGrid, { locationId: selectedLocationId }) 20451 ] }) 20452 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(UnifiedListView, {}) }) }) }) }) }), 20453 /* @__PURE__ */ jsxRuntimeExports.jsx(LocationContactModal, {}), 20454 isContactModalOpen && /* @__PURE__ */ jsxRuntimeExports.jsx(ContactModal, {}), 20455 showFooter && /* @__PURE__ */ jsxRuntimeExports.jsx(Footer, {}) 20456 ] }); 20457} 20458const CLASS_PART_SEPARATOR = "-"; 20459const createClassGroupUtils = (config) => { 20460 const classMap = createClassMap(config); 20461 const { 20462 conflictingClassGroups, 20463 conflictingClassGroupModifiers 20464 } = config; 20465 const getClassGroupId = (className) => { 20466 const classParts = className.split(CLASS_PART_SEPARATOR); 20467 if (classParts[0] === "" && classParts.length !== 1) { 20468 classParts.shift(); 20469 } 20470 return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className); 20471 }; 20472 const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => { 20473 const conflicts = conflictingClassGroups[classGroupId] || []; 20474 if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) { 20475 return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]]; 20476 } 20477 return conflicts; 20478 }; 20479 return { 20480 getClassGroupId, 20481 getConflictingClassGroupIds 20482 }; 20483}; 20484const getGroupRecursive = (classParts, classPartObject) => { 20485 if (classParts.length === 0) { 20486 return classPartObject.classGroupId; 20487 } 20488 const currentClassPart = classParts[0]; 20489 const nextClassPartObject = classPartObject.nextPart.get(currentClassPart); 20490 const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : void 0; 20491 if (classGroupFromNextClassPart) { 20492 return classGroupFromNextClassPart; 20493 } 20494 if (classPartObject.validators.length === 0) { 20495 return void 0; 20496 } 20497 const classRest = classParts.join(CLASS_PART_SEPARATOR); 20498 return classPartObject.validators.find(({ 20499 validator 20500 }) => validator(classRest))?.classGroupId; 20501}; 20502const arbitraryPropertyRegex = /^\[(.+)\]$/; 20503const getGroupIdForArbitraryProperty = (className) => { 20504 if (arbitraryPropertyRegex.test(className)) { 20505 const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1]; 20506 const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(":")); 20507 if (property) { 20508 return "arbitrary.." + property; 20509 } 20510 } 20511}; 20512const createClassMap = (config) => { 20513 const { 20514 theme, 20515 classGroups 20516 } = config; 20517 const classMap = { 20518 nextPart: /* @__PURE__ */ new Map(), 20519 validators: [] 20520 }; 20521 for (const classGroupId in classGroups) { 20522 processClassesRecursively(classGroups[classGroupId], classMap, classGroupId, theme); 20523 } 20524 return classMap; 20525}; 20526const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => { 20527 classGroup.forEach((classDefinition) => { 20528 if (typeof classDefinition === "string") { 20529 const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition); 20530 classPartObjectToEdit.classGroupId = classGroupId; 20531 return; 20532 } 20533 if (typeof classDefinition === "function") { 20534 if (isThemeGetter(classDefinition)) { 20535 processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme); 20536 return; 20537 } 20538 classPartObject.validators.push({ 20539 validator: classDefinition, 20540 classGroupId 20541 }); 20542 return; 20543 } 20544 Object.entries(classDefinition).forEach(([key, classGroup2]) => { 20545 processClassesRecursively(classGroup2, getPart(classPartObject, key), classGroupId, theme); 20546 }); 20547 }); 20548}; 20549const getPart = (classPartObject, path) => { 20550 let currentClassPartObject = classPartObject; 20551 path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => { 20552 if (!currentClassPartObject.nextPart.has(pathPart)) { 20553 currentClassPartObject.nextPart.set(pathPart, { 20554 nextPart: /* @__PURE__ */ new Map(), 20555 validators: [] 20556 }); 20557 } 20558 currentClassPartObject = currentClassPartObject.nextPart.get(pathPart); 20559 }); 20560 return currentClassPartObject; 20561}; 20562const isThemeGetter = (func) => func.isThemeGetter; 20563const createLruCache = (maxCacheSize) => { 20564 if (maxCacheSize < 1) { 20565 return { 20566 get: () => void 0, 20567 set: () => { 20568 } 20569 }; 20570 } 20571 let cacheSize = 0; 20572 let cache = /* @__PURE__ */ new Map(); 20573 let previousCache = /* @__PURE__ */ new Map(); 20574 const update = (key, value) => { 20575 cache.set(key, value); 20576 cacheSize++; 20577 if (cacheSize > maxCacheSize) { 20578 cacheSize = 0; 20579 previousCache = cache; 20580 cache = /* @__PURE__ */ new Map(); 20581 } 20582 }; 20583 return { 20584 get(key) { 20585 let value = cache.get(key); 20586 if (value !== void 0) { 20587 return value; 20588 } 20589 if ((value = previousCache.get(key)) !== void 0) { 20590 update(key, value); 20591 return value; 20592 } 20593 }, 20594 set(key, value) { 20595 if (cache.has(key)) { 20596 cache.set(key, value); 20597 } else { 20598 update(key, value); 20599 } 20600 } 20601 }; 20602}; 20603const IMPORTANT_MODIFIER = "!"; 20604const MODIFIER_SEPARATOR = ":"; 20605const MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length; 20606const createParseClassName = (config) => { 20607 const { 20608 prefix, 20609 experimentalParseClassName 20610 } = config; 20611 let parseClassName = (className) => { 20612 const modifiers = []; 20613 let bracketDepth = 0; 20614 let parenDepth = 0; 20615 let modifierStart = 0; 20616 let postfixModifierPosition; 20617 for (let index = 0; index < className.length; index++) { 20618 let currentCharacter = className[index]; 20619 if (bracketDepth === 0 && parenDepth === 0) { 20620 if (currentCharacter === MODIFIER_SEPARATOR) { 20621 modifiers.push(className.slice(modifierStart, index)); 20622 modifierStart = index + MODIFIER_SEPARATOR_LENGTH; 20623 continue; 20624 } 20625 if (currentCharacter === "/") { 20626 postfixModifierPosition = index; 20627 continue; 20628 } 20629 } 20630 if (currentCharacter === "[") { 20631 bracketDepth++; 20632 } else if (currentCharacter === "]") { 20633 bracketDepth--; 20634 } else if (currentCharacter === "(") { 20635 parenDepth++; 20636 } else if (currentCharacter === ")") { 20637 parenDepth--; 20638 } 20639 } 20640 const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart); 20641 const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier); 20642 const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier; 20643 const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0; 20644 return { 20645 modifiers, 20646 hasImportantModifier, 20647 baseClassName, 20648 maybePostfixModifierPosition 20649 }; 20650 }; 20651 if (prefix) { 20652 const fullPrefix = prefix + MODIFIER_SEPARATOR; 20653 const parseClassNameOriginal = parseClassName; 20654 parseClassName = (className) => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.substring(fullPrefix.length)) : { 20655 isExternal: true, 20656 modifiers: [], 20657 hasImportantModifier: false, 20658 baseClassName: className, 20659 maybePostfixModifierPosition: void 0 20660 }; 20661 } 20662 if (experimentalParseClassName) { 20663 const parseClassNameOriginal = parseClassName; 20664 parseClassName = (className) => experimentalParseClassName({ 20665 className, 20666 parseClassName: parseClassNameOriginal 20667 }); 20668 } 20669 return parseClassName; 20670}; 20671const stripImportantModifier = (baseClassName) => { 20672 if (baseClassName.endsWith(IMPORTANT_MODIFIER)) { 20673 return baseClassName.substring(0, baseClassName.length - 1); 20674 } 20675 if (baseClassName.startsWith(IMPORTANT_MODIFIER)) { 20676 return baseClassName.substring(1); 20677 } 20678 return baseClassName; 20679}; 20680const createSortModifiers = (config) => { 20681 const orderSensitiveModifiers = Object.fromEntries(config.orderSensitiveModifiers.map((modifier) => [modifier, true])); 20682 const sortModifiers = (modifiers) => { 20683 if (modifiers.length <= 1) { 20684 return modifiers; 20685 } 20686 const sortedModifiers = []; 20687 let unsortedModifiers = [];
vendor: 1,998 bytes, lines 20688-20744
20688 modifiers.forEach((modifier) => { 20689 const isPositionSensitive = modifier[0] === "[" || orderSensitiveModifiers[modifier]; 20690 if (isPositionSensitive) { 20691 sortedModifiers.push(...unsortedModifiers.sort(), modifier); 20692 unsortedModifiers = []; 20693 } else { 20694 unsortedModifiers.push(modifier); 20695 } 20696 }); 20697 sortedModifiers.push(...unsortedModifiers.sort()); 20698 return sortedModifiers; 20699 }; 20700 return sortModifiers; 20701}; 20702const createConfigUtils = (config) => ({ 20703 cache: createLruCache(config.cacheSize), 20704 parseClassName: createParseClassName(config), 20705 sortModifiers: createSortModifiers(config), 20706 ...createClassGroupUtils(config) 20707}); 20708const SPLIT_CLASSES_REGEX = /\s+/; 20709const mergeClassList = (classList, configUtils) => { 20710 const { 20711 parseClassName, 20712 getClassGroupId, 20713 getConflictingClassGroupIds, 20714 sortModifiers 20715 } = configUtils; 20716 const classGroupsInConflict = []; 20717 const classNames = classList.trim().split(SPLIT_CLASSES_REGEX); 20718 let result = ""; 20719 for (let index = classNames.length - 1; index >= 0; index -= 1) { 20720 const originalClassName = classNames[index]; 20721 const { 20722 isExternal, 20723 modifiers, 20724 hasImportantModifier, 20725 baseClassName, 20726 maybePostfixModifierPosition 20727 } = parseClassName(originalClassName); 20728 if (isExternal) { 20729 result = originalClassName + (result.length > 0 ? " " + result : result); 20730 continue; 20731 } 20732 let hasPostfixModifier = !!maybePostfixModifierPosition; 20733 let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName); 20734 if (!classGroupId) { 20735 if (!hasPostfixModifier) { 20736 result = originalClassName + (result.length > 0 ? " " + result : result); 20737 continue; 20738 } 20739 classGroupId = getClassGroupId(baseClassName); 20740 if (!classGroupId) { 20741 result = originalClassName + (result.length > 0 ? " " + result : result); 20742 continue; 20743 } 20744 hasPostfixModifier = false;
20745 } 20746 const variantModifier = sortModifiers(modifiers).join(":"); 20747 const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier; 20748 const classId = modifierId + classGroupId; 20749 if (classGroupsInConflict.includes(classId)) { 20750 continue; 20751 } 20752 classGroupsInConflict.push(classId); 20753 const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier); 20754 for (let i = 0; i < conflictGroups.length; ++i) { 20755 const group = conflictGroups[i]; 20756 classGroupsInConflict.push(modifierId + group); 20757 } 20758 result = originalClassName + (result.length > 0 ? " " + result : result); 20759 } 20760 return result; 20761}; 20762function twJoin() { 20763 let index = 0; 20764 let argument; 20765 let resolvedValue; 20766 let string = ""; 20767 while (index < arguments.length) { 20768 if (argument = arguments[index++]) { 20769 if (resolvedValue = toValue(argument)) { 20770 string && (string += " "); 20771 string += resolvedValue; 20772 } 20773 } 20774 } 20775 return string; 20776} 20777const toValue = (mix) => { 20778 if (typeof mix === "string") { 20779 return mix; 20780 } 20781 let resolvedValue; 20782 let string = ""; 20783 for (let k2 = 0; k2 < mix.length; k2++) { 20784 if (mix[k2]) { 20785 if (resolvedValue = toValue(mix[k2])) { 20786 string && (string += " "); 20787 string += resolvedValue; 20788 } 20789 } 20790 } 20791 return string; 20792}; 20793function createTailwindMerge(createConfigFirst, ...createConfigRest) { 20794 let configUtils; 20795 let cacheGet; 20796 let cacheSet; 20797 let functionToCall = initTailwindMerge; 20798 function initTailwindMerge(classList) { 20799 const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst()); 20800 configUtils = createConfigUtils(config); 20801 cacheGet = configUtils.cache.get; 20802 cacheSet = configUtils.cache.set; 20803 functionToCall = tailwindMerge; 20804 return tailwindMerge(classList); 20805 } 20806 function tailwindMerge(classList) { 20807 const cachedResult = cacheGet(classList); 20808 if (cachedResult) { 20809 return cachedResult; 20810 } 20811 const result = mergeClassList(classList, configUtils); 20812 cacheSet(classList, result); 20813 return result; 20814 } 20815 return function callTailwindMerge() { 20816 return functionToCall(twJoin.apply(null, arguments)); 20817 }; 20818} 20819const fromTheme = (key) => { 20820 const themeGetter = (theme) => theme[key] || []; 20821 themeGetter.isThemeGetter = true; 20822 return themeGetter; 20823}; 20824const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i; 20825const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i; 20826const fractionRegex = /^\d+\/\d+$/; 20827const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/; 20828const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/; 20829const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/; 20830const shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/; 20831const imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/; 20832const isFraction = (value) => fractionRegex.test(value); 20833const isNumber = (value) => !!value && !Number.isNaN(Number(value)); 20834const isInteger = (value) => !!value && Number.isInteger(Number(value)); 20835const isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1)); 20836const isTshirtSize = (value) => tshirtUnitRegex.test(value); 20837const isAny = () => true; 20838const isLengthOnly = (value) => ( 20839 // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths. 20840 // For example, `hsl(0 0% 0%)` would be classified as a length without this check. 20841 // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough. 20842 lengthUnitRegex.test(value) && !colorFunctionRegex.test(value) 20843); 20844const isNever = () => false; 20845const isShadow = (value) => shadowRegex.test(value); 20846const isImage = (value) => imageRegex.test(value); 20847const isAnyNonArbitrary = (value) => !isArbitraryValue(value) && !isArbitraryVariable(value); 20848const isArbitrarySize = (value) => getIsArbitraryValue(value, isLabelSize, isNever); 20849const isArbitraryValue = (value) => arbitraryValueRegex.test(value); 20850const isArbitraryLength = (value) => getIsArbitraryValue(value, isLabelLength, isLengthOnly); 20851const isArbitraryNumber = (value) => getIsArbitraryValue(value, isLabelNumber, isNumber); 20852const isArbitraryPosition = (value) => getIsArbitraryValue(value, isLabelPosition, isNever); 20853const isArbitraryImage = (value) => getIsArbitraryValue(value, isLabelImage, isImage); 20854const isArbitraryShadow = (value) => getIsArbitraryValue(value, isLabelShadow, isShadow); 20855const isArbitraryVariable = (value) => arbitraryVariableRegex.test(value); 20856const isArbitraryVariableLength = (value) => getIsArbitraryVariable(value, isLabelLength); 20857const isArbitraryVariableFamilyName = (value) => getIsArbitraryVariable(value, isLabelFamilyName); 20858const isArbitraryVariablePosition = (value) => getIsArbitraryVariable(value, isLabelPosition); 20859const isArbitraryVariableSize = (value) => getIsArbitraryVariable(value, isLabelSize); 20860const isArbitraryVariableImage = (value) => getIsArbitraryVariable(value, isLabelImage); 20861const isArbitraryVariableShadow = (value) => getIsArbitraryVariable(value, isLabelShadow, true); 20862const getIsArbitraryValue = (value, testLabel, testValue) => { 20863 const result = arbitraryValueRegex.exec(value); 20864 if (result) { 20865 if (result[1]) { 20866 return testLabel(result[1]); 20867 } 20868 return testValue(result[2]); 20869 } 20870 return false;
vendor: 18,276 bytes, lines 20871-21449
20871}; 20872const getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => { 20873 const result = arbitraryVariableRegex.exec(value); 20874 if (result) { 20875 if (result[1]) { 20876 return testLabel(result[1]); 20877 } 20878 return shouldMatchNoLabel; 20879 } 20880 return false; 20881}; 20882const isLabelPosition = (label) => label === "position" || label === "percentage"; 20883const isLabelImage = (label) => label === "image" || label === "url"; 20884const isLabelSize = (label) => label === "length" || label === "size" || label === "bg-size"; 20885const isLabelLength = (label) => label === "length"; 20886const isLabelNumber = (label) => label === "number"; 20887const isLabelFamilyName = (label) => label === "family-name"; 20888const isLabelShadow = (label) => label === "shadow"; 20889const getDefaultConfig = () => { 20890 const themeColor = fromTheme("color"); 20891 const themeFont = fromTheme("font"); 20892 const themeText = fromTheme("text"); 20893 const themeFontWeight = fromTheme("font-weight"); 20894 const themeTracking = fromTheme("tracking"); 20895 const themeLeading = fromTheme("leading"); 20896 const themeBreakpoint = fromTheme("breakpoint"); 20897 const themeContainer = fromTheme("container"); 20898 const themeSpacing = fromTheme("spacing"); 20899 const themeRadius = fromTheme("radius"); 20900 const themeShadow = fromTheme("shadow"); 20901 const themeInsetShadow = fromTheme("inset-shadow"); 20902 const themeTextShadow = fromTheme("text-shadow"); 20903 const themeDropShadow = fromTheme("drop-shadow"); 20904 const themeBlur = fromTheme("blur"); 20905 const themePerspective = fromTheme("perspective"); 20906 const themeAspect = fromTheme("aspect"); 20907 const themeEase = fromTheme("ease"); 20908 const themeAnimate = fromTheme("animate"); 20909 const scaleBreak = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"]; 20910 const scalePosition = () => [ 20911 "center", 20912 "top", 20913 "bottom", 20914 "left", 20915 "right", 20916 "top-left", 20917 // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378 20918 "left-top", 20919 "top-right", 20920 // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378 20921 "right-top", 20922 "bottom-right", 20923 // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378 20924 "right-bottom", 20925 "bottom-left", 20926 // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378 20927 "left-bottom" 20928 ]; 20929 const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue]; 20930 const scaleOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"]; 20931 const scaleOverscroll = () => ["auto", "contain", "none"]; 20932 const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing]; 20933 const scaleInset = () => [isFraction, "full", "auto", ...scaleUnambiguousSpacing()]; 20934 const scaleGridTemplateColsRows = () => [isInteger, "none", "subgrid", isArbitraryVariable, isArbitraryValue]; 20935 const scaleGridColRowStartAndEnd = () => ["auto", { 20936 span: ["full", isInteger, isArbitraryVariable, isArbitraryValue] 20937 }, isInteger, isArbitraryVariable, isArbitraryValue]; 20938 const scaleGridColRowStartOrEnd = () => [isInteger, "auto", isArbitraryVariable, isArbitraryValue]; 20939 const scaleGridAutoColsRows = () => ["auto", "min", "max", "fr", isArbitraryVariable, isArbitraryValue]; 20940 const scaleAlignPrimaryAxis = () => ["start", "end", "center", "between", "around", "evenly", "stretch", "baseline", "center-safe", "end-safe"]; 20941 const scaleAlignSecondaryAxis = () => ["start", "end", "center", "stretch", "center-safe", "end-safe"]; 20942 const scaleMargin = () => ["auto", ...scaleUnambiguousSpacing()]; 20943 const scaleSizing = () => [isFraction, "auto", "full", "dvw", "dvh", "lvw", "lvh", "svw", "svh", "min", "max", "fit", ...scaleUnambiguousSpacing()]; 20944 const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue]; 20945 const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, { 20946 position: [isArbitraryVariable, isArbitraryValue] 20947 }]; 20948 const scaleBgRepeat = () => ["no-repeat", { 20949 repeat: ["", "x", "y", "space", "round"] 20950 }]; 20951 const scaleBgSize = () => ["auto", "cover", "contain", isArbitraryVariableSize, isArbitrarySize, { 20952 size: [isArbitraryVariable, isArbitraryValue] 20953 }]; 20954 const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength]; 20955 const scaleRadius = () => [ 20956 // Deprecated since Tailwind CSS v4.0.0 20957 "", 20958 "none", 20959 "full", 20960 themeRadius, 20961 isArbitraryVariable, 20962 isArbitraryValue 20963 ]; 20964 const scaleBorderWidth = () => ["", isNumber, isArbitraryVariableLength, isArbitraryLength]; 20965 const scaleLineStyle = () => ["solid", "dashed", "dotted", "double"]; 20966 const scaleBlendMode = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"]; 20967 const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition]; 20968 const scaleBlur = () => [ 20969 // Deprecated since Tailwind CSS v4.0.0 20970 "", 20971 "none", 20972 themeBlur, 20973 isArbitraryVariable, 20974 isArbitraryValue 20975 ]; 20976 const scaleRotate = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue]; 20977 const scaleScale = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue]; 20978 const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue]; 20979 const scaleTranslate = () => [isFraction, "full", ...scaleUnambiguousSpacing()]; 20980 return { 20981 cacheSize: 500, 20982 theme: { 20983 animate: ["spin", "ping", "pulse", "bounce"], 20984 aspect: ["video"], 20985 blur: [isTshirtSize], 20986 breakpoint: [isTshirtSize], 20987 color: [isAny], 20988 container: [isTshirtSize], 20989 "drop-shadow": [isTshirtSize], 20990 ease: ["in", "out", "in-out"], 20991 font: [isAnyNonArbitrary], 20992 "font-weight": ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black"], 20993 "inset-shadow": [isTshirtSize], 20994 leading: ["none", "tight", "snug", "normal", "relaxed", "loose"], 20995 perspective: ["dramatic", "near", "normal", "midrange", "distant", "none"], 20996 radius: [isTshirtSize], 20997 shadow: [isTshirtSize], 20998 spacing: ["px", isNumber], 20999 text: [isTshirtSize], 21000 "text-shadow": [isTshirtSize], 21001 tracking: ["tighter", "tight", "normal", "wide", "wider", "widest"] 21002 }, 21003 classGroups: { 21004 // -------------- 21005 // --- Layout --- 21006 // -------------- 21007 /** 21008 * Aspect Ratio 21009 * @see https://tailwindcss.com/docs/aspect-ratio 21010 */ 21011 aspect: [{ 21012 aspect: ["auto", "square", isFraction, isArbitraryValue, isArbitraryVariable, themeAspect] 21013 }], 21014 /** 21015 * Container 21016 * @see https://tailwindcss.com/docs/container 21017 * @deprecated since Tailwind CSS v4.0.0 21018 */ 21019 container: ["container"], 21020 /** 21021 * Columns 21022 * @see https://tailwindcss.com/docs/columns 21023 */ 21024 columns: [{ 21025 columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer] 21026 }], 21027 /** 21028 * Break After 21029 * @see https://tailwindcss.com/docs/break-after 21030 */ 21031 "break-after": [{ 21032 "break-after": scaleBreak() 21033 }], 21034 /** 21035 * Break Before 21036 * @see https://tailwindcss.com/docs/break-before 21037 */ 21038 "break-before": [{ 21039 "break-before": scaleBreak() 21040 }], 21041 /** 21042 * Break Inside 21043 * @see https://tailwindcss.com/docs/break-inside 21044 */ 21045 "break-inside": [{ 21046 "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"] 21047 }], 21048 /** 21049 * Box Decoration Break 21050 * @see https://tailwindcss.com/docs/box-decoration-break 21051 */ 21052 "box-decoration": [{ 21053 "box-decoration": ["slice", "clone"] 21054 }], 21055 /** 21056 * Box Sizing 21057 * @see https://tailwindcss.com/docs/box-sizing 21058 */ 21059 box: [{ 21060 box: ["border", "content"] 21061 }], 21062 /** 21063 * Display 21064 * @see https://tailwindcss.com/docs/display 21065 */ 21066 display: ["block", "inline-block", "inline", "flex", "inline-flex", "table", "inline-table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row-group", "table-row", "flow-root", "grid", "inline-grid", "contents", "list-item", "hidden"], 21067 /** 21068 * Screen Reader Only 21069 * @see https://tailwindcss.com/docs/display#screen-reader-only 21070 */ 21071 sr: ["sr-only", "not-sr-only"], 21072 /** 21073 * Floats 21074 * @see https://tailwindcss.com/docs/float 21075 */ 21076 float: [{ 21077 float: ["right", "left", "none", "start", "end"] 21078 }], 21079 /** 21080 * Clear 21081 * @see https://tailwindcss.com/docs/clear 21082 */ 21083 clear: [{ 21084 clear: ["left", "right", "both", "none", "start", "end"] 21085 }], 21086 /** 21087 * Isolation 21088 * @see https://tailwindcss.com/docs/isolation 21089 */ 21090 isolation: ["isolate", "isolation-auto"], 21091 /** 21092 * Object Fit 21093 * @see https://tailwindcss.com/docs/object-fit 21094 */ 21095 "object-fit": [{ 21096 object: ["contain", "cover", "fill", "none", "scale-down"] 21097 }], 21098 /** 21099 * Object Position 21100 * @see https://tailwindcss.com/docs/object-position 21101 */ 21102 "object-position": [{ 21103 object: scalePositionWithArbitrary() 21104 }], 21105 /** 21106 * Overflow 21107 * @see https://tailwindcss.com/docs/overflow 21108 */ 21109 overflow: [{ 21110 overflow: scaleOverflow() 21111 }], 21112 /** 21113 * Overflow X 21114 * @see https://tailwindcss.com/docs/overflow 21115 */ 21116 "overflow-x": [{ 21117 "overflow-x": scaleOverflow() 21118 }], 21119 /** 21120 * Overflow Y 21121 * @see https://tailwindcss.com/docs/overflow 21122 */ 21123 "overflow-y": [{ 21124 "overflow-y": scaleOverflow() 21125 }], 21126 /** 21127 * Overscroll Behavior 21128 * @see https://tailwindcss.com/docs/overscroll-behavior 21129 */ 21130 overscroll: [{ 21131 overscroll: scaleOverscroll() 21132 }], 21133 /** 21134 * Overscroll Behavior X 21135 * @see https://tailwindcss.com/docs/overscroll-behavior 21136 */ 21137 "overscroll-x": [{ 21138 "overscroll-x": scaleOverscroll() 21139 }], 21140 /** 21141 * Overscroll Behavior Y 21142 * @see https://tailwindcss.com/docs/overscroll-behavior 21143 */ 21144 "overscroll-y": [{ 21145 "overscroll-y": scaleOverscroll() 21146 }], 21147 /** 21148 * Position 21149 * @see https://tailwindcss.com/docs/position 21150 */ 21151 position: ["static", "fixed", "absolute", "relative", "sticky"], 21152 /** 21153 * Top / Right / Bottom / Left 21154 * @see https://tailwindcss.com/docs/top-right-bottom-left 21155 */ 21156 inset: [{ 21157 inset: scaleInset() 21158 }], 21159 /** 21160 * Right / Left 21161 * @see https://tailwindcss.com/docs/top-right-bottom-left 21162 */ 21163 "inset-x": [{ 21164 "inset-x": scaleInset() 21165 }], 21166 /** 21167 * Top / Bottom 21168 * @see https://tailwindcss.com/docs/top-right-bottom-left 21169 */ 21170 "inset-y": [{ 21171 "inset-y": scaleInset() 21172 }], 21173 /** 21174 * Start 21175 * @see https://tailwindcss.com/docs/top-right-bottom-left 21176 */ 21177 start: [{ 21178 start: scaleInset() 21179 }], 21180 /** 21181 * End 21182 * @see https://tailwindcss.com/docs/top-right-bottom-left 21183 */ 21184 end: [{ 21185 end: scaleInset() 21186 }], 21187 /** 21188 * Top 21189 * @see https://tailwindcss.com/docs/top-right-bottom-left 21190 */ 21191 top: [{ 21192 top: scaleInset() 21193 }], 21194 /** 21195 * Right 21196 * @see https://tailwindcss.com/docs/top-right-bottom-left 21197 */ 21198 right: [{ 21199 right: scaleInset() 21200 }], 21201 /** 21202 * Bottom 21203 * @see https://tailwindcss.com/docs/top-right-bottom-left 21204 */ 21205 bottom: [{ 21206 bottom: scaleInset() 21207 }], 21208 /** 21209 * Left 21210 * @see https://tailwindcss.com/docs/top-right-bottom-left 21211 */ 21212 left: [{ 21213 left: scaleInset() 21214 }], 21215 /** 21216 * Visibility 21217 * @see https://tailwindcss.com/docs/visibility 21218 */ 21219 visibility: ["visible", "invisible", "collapse"], 21220 /** 21221 * Z-Index 21222 * @see https://tailwindcss.com/docs/z-index 21223 */ 21224 z: [{ 21225 z: [isInteger, "auto", isArbitraryVariable, isArbitraryValue] 21226 }], 21227 // ------------------------ 21228 // --- Flexbox and Grid --- 21229 // ------------------------ 21230 /** 21231 * Flex Basis 21232 * @see https://tailwindcss.com/docs/flex-basis 21233 */ 21234 basis: [{ 21235 basis: [isFraction, "full", "auto", themeContainer, ...scaleUnambiguousSpacing()] 21236 }], 21237 /** 21238 * Flex Direction 21239 * @see https://tailwindcss.com/docs/flex-direction 21240 */ 21241 "flex-direction": [{ 21242 flex: ["row", "row-reverse", "col", "col-reverse"] 21243 }], 21244 /** 21245 * Flex Wrap 21246 * @see https://tailwindcss.com/docs/flex-wrap 21247 */ 21248 "flex-wrap": [{ 21249 flex: ["nowrap", "wrap", "wrap-reverse"] 21250 }], 21251 /** 21252 * Flex 21253 * @see https://tailwindcss.com/docs/flex 21254 */ 21255 flex: [{ 21256 flex: [isNumber, isFraction, "auto", "initial", "none", isArbitraryValue] 21257 }], 21258 /** 21259 * Flex Grow 21260 * @see https://tailwindcss.com/docs/flex-grow 21261 */ 21262 grow: [{ 21263 grow: ["", isNumber, isArbitraryVariable, isArbitraryValue] 21264 }], 21265 /** 21266 * Flex Shrink 21267 * @see https://tailwindcss.com/docs/flex-shrink 21268 */ 21269 shrink: [{ 21270 shrink: ["", isNumber, isArbitraryVariable, isArbitraryValue] 21271 }], 21272 /** 21273 * Order 21274 * @see https://tailwindcss.com/docs/order 21275 */ 21276 order: [{ 21277 order: [isInteger, "first", "last", "none", isArbitraryVariable, isArbitraryValue] 21278 }], 21279 /** 21280 * Grid Template Columns 21281 * @see https://tailwindcss.com/docs/grid-template-columns 21282 */ 21283 "grid-cols": [{ 21284 "grid-cols": scaleGridTemplateColsRows() 21285 }], 21286 /** 21287 * Grid Column Start / End 21288 * @see https://tailwindcss.com/docs/grid-column 21289 */ 21290 "col-start-end": [{ 21291 col: scaleGridColRowStartAndEnd() 21292 }], 21293 /** 21294 * Grid Column Start 21295 * @see https://tailwindcss.com/docs/grid-column 21296 */ 21297 "col-start": [{ 21298 "col-start": scaleGridColRowStartOrEnd() 21299 }], 21300 /** 21301 * Grid Column End 21302 * @see https://tailwindcss.com/docs/grid-column 21303 */ 21304 "col-end": [{ 21305 "col-end": scaleGridColRowStartOrEnd() 21306 }], 21307 /** 21308 * Grid Template Rows 21309 * @see https://tailwindcss.com/docs/grid-template-rows 21310 */ 21311 "grid-rows": [{ 21312 "grid-rows": scaleGridTemplateColsRows() 21313 }], 21314 /** 21315 * Grid Row Start / End 21316 * @see https://tailwindcss.com/docs/grid-row 21317 */ 21318 "row-start-end": [{ 21319 row: scaleGridColRowStartAndEnd() 21320 }], 21321 /** 21322 * Grid Row Start 21323 * @see https://tailwindcss.com/docs/grid-row 21324 */ 21325 "row-start": [{ 21326 "row-start": scaleGridColRowStartOrEnd() 21327 }], 21328 /** 21329 * Grid Row End 21330 * @see https://tailwindcss.com/docs/grid-row 21331 */ 21332 "row-end": [{ 21333 "row-end": scaleGridColRowStartOrEnd() 21334 }], 21335 /** 21336 * Grid Auto Flow 21337 * @see https://tailwindcss.com/docs/grid-auto-flow 21338 */ 21339 "grid-flow": [{ 21340 "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"] 21341 }], 21342 /** 21343 * Grid Auto Columns 21344 * @see https://tailwindcss.com/docs/grid-auto-columns 21345 */ 21346 "auto-cols": [{ 21347 "auto-cols": scaleGridAutoColsRows() 21348 }], 21349 /** 21350 * Grid Auto Rows 21351 * @see https://tailwindcss.com/docs/grid-auto-rows 21352 */ 21353 "auto-rows": [{ 21354 "auto-rows": scaleGridAutoColsRows() 21355 }], 21356 /** 21357 * Gap 21358 * @see https://tailwindcss.com/docs/gap 21359 */ 21360 gap: [{ 21361 gap: scaleUnambiguousSpacing() 21362 }], 21363 /** 21364 * Gap X 21365 * @see https://tailwindcss.com/docs/gap 21366 */ 21367 "gap-x": [{ 21368 "gap-x": scaleUnambiguousSpacing() 21369 }], 21370 /** 21371 * Gap Y 21372 * @see https://tailwindcss.com/docs/gap 21373 */ 21374 "gap-y": [{ 21375 "gap-y": scaleUnambiguousSpacing() 21376 }], 21377 /** 21378 * Justify Content 21379 * @see https://tailwindcss.com/docs/justify-content 21380 */ 21381 "justify-content": [{ 21382 justify: [...scaleAlignPrimaryAxis(), "normal"] 21383 }], 21384 /** 21385 * Justify Items 21386 * @see https://tailwindcss.com/docs/justify-items 21387 */ 21388 "justify-items": [{ 21389 "justify-items": [...scaleAlignSecondaryAxis(), "normal"] 21390 }], 21391 /** 21392 * Justify Self 21393 * @see https://tailwindcss.com/docs/justify-self 21394 */ 21395 "justify-self": [{ 21396 "justify-self": ["auto", ...scaleAlignSecondaryAxis()] 21397 }], 21398 /** 21399 * Align Content 21400 * @see https://tailwindcss.com/docs/align-content 21401 */ 21402 "align-content": [{ 21403 content: ["normal", ...scaleAlignPrimaryAxis()] 21404 }], 21405 /** 21406 * Align Items 21407 * @see https://tailwindcss.com/docs/align-items 21408 */ 21409 "align-items": [{ 21410 items: [...scaleAlignSecondaryAxis(), { 21411 baseline: ["", "last"] 21412 }] 21413 }], 21414 /** 21415 * Align Self 21416 * @see https://tailwindcss.com/docs/align-self 21417 */ 21418 "align-self": [{ 21419 self: ["auto", ...scaleAlignSecondaryAxis(), { 21420 baseline: ["", "last"] 21421 }] 21422 }], 21423 /** 21424 * Place Content 21425 * @see https://tailwindcss.com/docs/place-content 21426 */ 21427 "place-content": [{ 21428 "place-content": scaleAlignPrimaryAxis() 21429 }], 21430 /** 21431 * Place Items 21432 * @see https://tailwindcss.com/docs/place-items 21433 */ 21434 "place-items": [{ 21435 "place-items": [...scaleAlignSecondaryAxis(), "baseline"] 21436 }], 21437 /** 21438 * Place Self 21439 * @see https://tailwindcss.com/docs/place-self 21440 */ 21441 "place-self": [{ 21442 "place-self": ["auto", ...scaleAlignSecondaryAxis()] 21443 }], 21444 // Spacing 21445 /** 21446 * Padding 21447 * @see https://tailwindcss.com/docs/padding 21448 */ 21449 p: [{
21450 p: scaleUnambiguousSpacing() 21451 }], 21452 /** 21453 * Padding X 21454 * @see https://tailwindcss.com/docs/padding 21455 */ 21456 px: [{ 21457 px: scaleUnambiguousSpacing() 21458 }], 21459 /** 21460 * Padding Y 21461 * @see https://tailwindcss.com/docs/padding 21462 */ 21463 py: [{ 21464 py: scaleUnambiguousSpacing() 21465 }], 21466 /** 21467 * Padding Start 21468 * @see https://tailwindcss.com/docs/padding 21469 */ 21470 ps: [{ 21471 ps: scaleUnambiguousSpacing() 21472 }], 21473 /** 21474 * Padding End 21475 * @see https://tailwindcss.com/docs/padding 21476 */ 21477 pe: [{ 21478 pe: scaleUnambiguousSpacing() 21479 }], 21480 /** 21481 * Padding Top 21482 * @see https://tailwindcss.com/docs/padding 21483 */ 21484 pt: [{ 21485 pt: scaleUnambiguousSpacing() 21486 }], 21487 /** 21488 * Padding Right 21489 * @see https://tailwindcss.com/docs/padding 21490 */ 21491 pr: [{ 21492 pr: scaleUnambiguousSpacing() 21493 }], 21494 /** 21495 * Padding Bottom 21496 * @see https://tailwindcss.com/docs/padding 21497 */ 21498 pb: [{ 21499 pb: scaleUnambiguousSpacing() 21500 }], 21501 /** 21502 * Padding Left 21503 * @see https://tailwindcss.com/docs/padding 21504 */ 21505 pl: [{ 21506 pl: scaleUnambiguousSpacing() 21507 }], 21508 /** 21509 * Margin 21510 * @see https://tailwindcss.com/docs/margin 21511 */ 21512 m: [{ 21513 m: scaleMargin() 21514 }], 21515 /** 21516 * Margin X 21517 * @see https://tailwindcss.com/docs/margin 21518 */ 21519 mx: [{ 21520 mx: scaleMargin() 21521 }], 21522 /** 21523 * Margin Y 21524 * @see https://tailwindcss.com/docs/margin 21525 */ 21526 my: [{ 21527 my: scaleMargin() 21528 }], 21529 /** 21530 * Margin Start 21531 * @see https://tailwindcss.com/docs/margin 21532 */ 21533 ms: [{ 21534 ms: scaleMargin() 21535 }], 21536 /** 21537 * Margin End 21538 * @see https://tailwindcss.com/docs/margin 21539 */ 21540 me: [{ 21541 me: scaleMargin() 21542 }], 21543 /** 21544 * Margin Top 21545 * @see https://tailwindcss.com/docs/margin 21546 */ 21547 mt: [{ 21548 mt: scaleMargin() 21549 }], 21550 /** 21551 * Margin Right 21552 * @see https://tailwindcss.com/docs/margin 21553 */ 21554 mr: [{ 21555 mr: scaleMargin() 21556 }], 21557 /** 21558 * Margin Bottom 21559 * @see https://tailwindcss.com/docs/margin 21560 */ 21561 mb: [{ 21562 mb: scaleMargin() 21563 }], 21564 /** 21565 * Margin Left 21566 * @see https://tailwindcss.com/docs/margin 21567 */ 21568 ml: [{ 21569 ml: scaleMargin() 21570 }], 21571 /** 21572 * Space Between X 21573 * @see https://tailwindcss.com/docs/margin#adding-space-between-children 21574 */ 21575 "space-x": [{ 21576 "space-x": scaleUnambiguousSpacing() 21577 }], 21578 /** 21579 * Space Between X Reverse 21580 * @see https://tailwindcss.com/docs/margin#adding-space-between-children 21581 */ 21582 "space-x-reverse": ["space-x-reverse"], 21583 /** 21584 * Space Between Y 21585 * @see https://tailwindcss.com/docs/margin#adding-space-between-children 21586 */ 21587 "space-y": [{ 21588 "space-y": scaleUnambiguousSpacing() 21589 }], 21590 /** 21591 * Space Between Y Reverse 21592 * @see https://tailwindcss.com/docs/margin#adding-space-between-children 21593 */ 21594 "space-y-reverse": ["space-y-reverse"], 21595 // -------------- 21596 // --- Sizing --- 21597 // -------------- 21598 /** 21599 * Size 21600 * @see https://tailwindcss.com/docs/width#setting-both-width-and-height 21601 */ 21602 size: [{ 21603 size: scaleSizing() 21604 }], 21605 /** 21606 * Width 21607 * @see https://tailwindcss.com/docs/width 21608 */ 21609 w: [{ 21610 w: [themeContainer, "screen", ...scaleSizing()] 21611 }], 21612 /** 21613 * Min-Width 21614 * @see https://tailwindcss.com/docs/min-width 21615 */ 21616 "min-w": [{ 21617 "min-w": [ 21618 themeContainer, 21619 "screen", 21620 /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */ 21621 "none", 21622 ...scaleSizing() 21623 ] 21624 }], 21625 /** 21626 * Max-Width 21627 * @see https://tailwindcss.com/docs/max-width 21628 */ 21629 "max-w": [{ 21630 "max-w": [
vendor: 11,206 bytes, lines 21631-22006
21631 themeContainer, 21632 "screen", 21633 "none", 21634 /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */ 21635 "prose", 21636 /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */ 21637 { 21638 screen: [themeBreakpoint] 21639 }, 21640 ...scaleSizing() 21641 ] 21642 }], 21643 /** 21644 * Height 21645 * @see https://tailwindcss.com/docs/height 21646 */ 21647 h: [{ 21648 h: ["screen", "lh", ...scaleSizing()] 21649 }], 21650 /** 21651 * Min-Height 21652 * @see https://tailwindcss.com/docs/min-height 21653 */ 21654 "min-h": [{ 21655 "min-h": ["screen", "lh", "none", ...scaleSizing()] 21656 }], 21657 /** 21658 * Max-Height 21659 * @see https://tailwindcss.com/docs/max-height 21660 */ 21661 "max-h": [{ 21662 "max-h": ["screen", "lh", ...scaleSizing()] 21663 }], 21664 // ------------------ 21665 // --- Typography --- 21666 // ------------------ 21667 /** 21668 * Font Size 21669 * @see https://tailwindcss.com/docs/font-size 21670 */ 21671 "font-size": [{ 21672 text: ["base", themeText, isArbitraryVariableLength, isArbitraryLength] 21673 }], 21674 /** 21675 * Font Smoothing 21676 * @see https://tailwindcss.com/docs/font-smoothing 21677 */ 21678 "font-smoothing": ["antialiased", "subpixel-antialiased"], 21679 /** 21680 * Font Style 21681 * @see https://tailwindcss.com/docs/font-style 21682 */ 21683 "font-style": ["italic", "not-italic"], 21684 /** 21685 * Font Weight 21686 * @see https://tailwindcss.com/docs/font-weight 21687 */ 21688 "font-weight": [{ 21689 font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber] 21690 }], 21691 /** 21692 * Font Stretch 21693 * @see https://tailwindcss.com/docs/font-stretch 21694 */ 21695 "font-stretch": [{ 21696 "font-stretch": ["ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", isPercent, isArbitraryValue] 21697 }], 21698 /** 21699 * Font Family 21700 * @see https://tailwindcss.com/docs/font-family 21701 */ 21702 "font-family": [{ 21703 font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont] 21704 }], 21705 /** 21706 * Font Variant Numeric 21707 * @see https://tailwindcss.com/docs/font-variant-numeric 21708 */ 21709 "fvn-normal": ["normal-nums"], 21710 /** 21711 * Font Variant Numeric 21712 * @see https://tailwindcss.com/docs/font-variant-numeric 21713 */ 21714 "fvn-ordinal": ["ordinal"], 21715 /** 21716 * Font Variant Numeric 21717 * @see https://tailwindcss.com/docs/font-variant-numeric 21718 */ 21719 "fvn-slashed-zero": ["slashed-zero"], 21720 /** 21721 * Font Variant Numeric 21722 * @see https://tailwindcss.com/docs/font-variant-numeric 21723 */ 21724 "fvn-figure": ["lining-nums", "oldstyle-nums"], 21725 /** 21726 * Font Variant Numeric 21727 * @see https://tailwindcss.com/docs/font-variant-numeric 21728 */ 21729 "fvn-spacing": ["proportional-nums", "tabular-nums"], 21730 /** 21731 * Font Variant Numeric 21732 * @see https://tailwindcss.com/docs/font-variant-numeric 21733 */ 21734 "fvn-fraction": ["diagonal-fractions", "stacked-fractions"], 21735 /** 21736 * Letter Spacing 21737 * @see https://tailwindcss.com/docs/letter-spacing 21738 */ 21739 tracking: [{ 21740 tracking: [themeTracking, isArbitraryVariable, isArbitraryValue] 21741 }], 21742 /** 21743 * Line Clamp 21744 * @see https://tailwindcss.com/docs/line-clamp 21745 */ 21746 "line-clamp": [{ 21747 "line-clamp": [isNumber, "none", isArbitraryVariable, isArbitraryNumber] 21748 }], 21749 /** 21750 * Line Height 21751 * @see https://tailwindcss.com/docs/line-height 21752 */ 21753 leading: [{ 21754 leading: [ 21755 /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */ 21756 themeLeading, 21757 ...scaleUnambiguousSpacing() 21758 ] 21759 }], 21760 /** 21761 * List Style Image 21762 * @see https://tailwindcss.com/docs/list-style-image 21763 */ 21764 "list-image": [{ 21765 "list-image": ["none", isArbitraryVariable, isArbitraryValue] 21766 }], 21767 /** 21768 * List Style Position 21769 * @see https://tailwindcss.com/docs/list-style-position 21770 */ 21771 "list-style-position": [{ 21772 list: ["inside", "outside"] 21773 }], 21774 /** 21775 * List Style Type 21776 * @see https://tailwindcss.com/docs/list-style-type 21777 */ 21778 "list-style-type": [{ 21779 list: ["disc", "decimal", "none", isArbitraryVariable, isArbitraryValue] 21780 }], 21781 /** 21782 * Text Alignment 21783 * @see https://tailwindcss.com/docs/text-align 21784 */ 21785 "text-alignment": [{ 21786 text: ["left", "center", "right", "justify", "start", "end"] 21787 }], 21788 /** 21789 * Placeholder Color 21790 * @deprecated since Tailwind CSS v3.0.0 21791 * @see https://v3.tailwindcss.com/docs/placeholder-color 21792 */ 21793 "placeholder-color": [{ 21794 placeholder: scaleColor() 21795 }], 21796 /** 21797 * Text Color 21798 * @see https://tailwindcss.com/docs/text-color 21799 */ 21800 "text-color": [{ 21801 text: scaleColor() 21802 }], 21803 /** 21804 * Text Decoration 21805 * @see https://tailwindcss.com/docs/text-decoration 21806 */ 21807 "text-decoration": ["underline", "overline", "line-through", "no-underline"], 21808 /** 21809 * Text Decoration Style 21810 * @see https://tailwindcss.com/docs/text-decoration-style 21811 */ 21812 "text-decoration-style": [{ 21813 decoration: [...scaleLineStyle(), "wavy"] 21814 }], 21815 /** 21816 * Text Decoration Thickness 21817 * @see https://tailwindcss.com/docs/text-decoration-thickness 21818 */ 21819 "text-decoration-thickness": [{ 21820 decoration: [isNumber, "from-font", "auto", isArbitraryVariable, isArbitraryLength] 21821 }], 21822 /** 21823 * Text Decoration Color 21824 * @see https://tailwindcss.com/docs/text-decoration-color 21825 */ 21826 "text-decoration-color": [{ 21827 decoration: scaleColor() 21828 }], 21829 /** 21830 * Text Underline Offset 21831 * @see https://tailwindcss.com/docs/text-underline-offset 21832 */ 21833 "underline-offset": [{ 21834 "underline-offset": [isNumber, "auto", isArbitraryVariable, isArbitraryValue] 21835 }], 21836 /** 21837 * Text Transform 21838 * @see https://tailwindcss.com/docs/text-transform 21839 */ 21840 "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"], 21841 /** 21842 * Text Overflow 21843 * @see https://tailwindcss.com/docs/text-overflow 21844 */ 21845 "text-overflow": ["truncate", "text-ellipsis", "text-clip"], 21846 /** 21847 * Text Wrap 21848 * @see https://tailwindcss.com/docs/text-wrap 21849 */ 21850 "text-wrap": [{ 21851 text: ["wrap", "nowrap", "balance", "pretty"] 21852 }], 21853 /** 21854 * Text Indent 21855 * @see https://tailwindcss.com/docs/text-indent 21856 */ 21857 indent: [{ 21858 indent: scaleUnambiguousSpacing() 21859 }], 21860 /** 21861 * Vertical Alignment 21862 * @see https://tailwindcss.com/docs/vertical-align 21863 */ 21864 "vertical-align": [{ 21865 align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryVariable, isArbitraryValue] 21866 }], 21867 /** 21868 * Whitespace 21869 * @see https://tailwindcss.com/docs/whitespace 21870 */ 21871 whitespace: [{ 21872 whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"] 21873 }], 21874 /** 21875 * Word Break 21876 * @see https://tailwindcss.com/docs/word-break 21877 */ 21878 break: [{ 21879 break: ["normal", "words", "all", "keep"] 21880 }], 21881 /** 21882 * Overflow Wrap 21883 * @see https://tailwindcss.com/docs/overflow-wrap 21884 */ 21885 wrap: [{ 21886 wrap: ["break-word", "anywhere", "normal"] 21887 }], 21888 /** 21889 * Hyphens 21890 * @see https://tailwindcss.com/docs/hyphens 21891 */ 21892 hyphens: [{ 21893 hyphens: ["none", "manual", "auto"] 21894 }], 21895 /** 21896 * Content 21897 * @see https://tailwindcss.com/docs/content 21898 */ 21899 content: [{ 21900 content: ["none", isArbitraryVariable, isArbitraryValue] 21901 }], 21902 // ------------------- 21903 // --- Backgrounds --- 21904 // ------------------- 21905 /** 21906 * Background Attachment 21907 * @see https://tailwindcss.com/docs/background-attachment 21908 */ 21909 "bg-attachment": [{ 21910 bg: ["fixed", "local", "scroll"] 21911 }], 21912 /** 21913 * Background Clip 21914 * @see https://tailwindcss.com/docs/background-clip 21915 */ 21916 "bg-clip": [{ 21917 "bg-clip": ["border", "padding", "content", "text"] 21918 }], 21919 /** 21920 * Background Origin 21921 * @see https://tailwindcss.com/docs/background-origin 21922 */ 21923 "bg-origin": [{ 21924 "bg-origin": ["border", "padding", "content"] 21925 }], 21926 /** 21927 * Background Position 21928 * @see https://tailwindcss.com/docs/background-position 21929 */ 21930 "bg-position": [{ 21931 bg: scaleBgPosition() 21932 }], 21933 /** 21934 * Background Repeat 21935 * @see https://tailwindcss.com/docs/background-repeat 21936 */ 21937 "bg-repeat": [{ 21938 bg: scaleBgRepeat() 21939 }], 21940 /** 21941 * Background Size 21942 * @see https://tailwindcss.com/docs/background-size 21943 */ 21944 "bg-size": [{ 21945 bg: scaleBgSize() 21946 }], 21947 /** 21948 * Background Image 21949 * @see https://tailwindcss.com/docs/background-image 21950 */ 21951 "bg-image": [{ 21952 bg: ["none", { 21953 linear: [{ 21954 to: ["t", "tr", "r", "br", "b", "bl", "l", "tl"] 21955 }, isInteger, isArbitraryVariable, isArbitraryValue], 21956 radial: ["", isArbitraryVariable, isArbitraryValue], 21957 conic: [isInteger, isArbitraryVariable, isArbitraryValue] 21958 }, isArbitraryVariableImage, isArbitraryImage] 21959 }], 21960 /** 21961 * Background Color 21962 * @see https://tailwindcss.com/docs/background-color 21963 */ 21964 "bg-color": [{ 21965 bg: scaleColor() 21966 }], 21967 /** 21968 * Gradient Color Stops From Position 21969 * @see https://tailwindcss.com/docs/gradient-color-stops 21970 */ 21971 "gradient-from-pos": [{ 21972 from: scaleGradientStopPosition() 21973 }], 21974 /** 21975 * Gradient Color Stops Via Position 21976 * @see https://tailwindcss.com/docs/gradient-color-stops 21977 */ 21978 "gradient-via-pos": [{ 21979 via: scaleGradientStopPosition() 21980 }], 21981 /** 21982 * Gradient Color Stops To Position 21983 * @see https://tailwindcss.com/docs/gradient-color-stops 21984 */ 21985 "gradient-to-pos": [{ 21986 to: scaleGradientStopPosition() 21987 }], 21988 /** 21989 * Gradient Color Stops From 21990 * @see https://tailwindcss.com/docs/gradient-color-stops 21991 */ 21992 "gradient-from": [{ 21993 from: scaleColor() 21994 }], 21995 /** 21996 * Gradient Color Stops Via 21997 * @see https://tailwindcss.com/docs/gradient-color-stops 21998 */ 21999 "gradient-via": [{ 22000 via: scaleColor() 22001 }], 22002 /** 22003 * Gradient Color Stops To 22004 * @see https://tailwindcss.com/docs/gradient-color-stops 22005 */ 22006 "gradient-to": [{
22007 to: scaleColor() 22008 }], 22009 // --------------- 22010 // --- Borders --- 22011 // --------------- 22012 /** 22013 * Border Radius 22014 * @see https://tailwindcss.com/docs/border-radius 22015 */ 22016 rounded: [{ 22017 rounded: scaleRadius() 22018 }], 22019 /** 22020 * Border Radius Start 22021 * @see https://tailwindcss.com/docs/border-radius 22022 */ 22023 "rounded-s": [{ 22024 "rounded-s": scaleRadius() 22025 }], 22026 /** 22027 * Border Radius End 22028 * @see https://tailwindcss.com/docs/border-radius 22029 */ 22030 "rounded-e": [{ 22031 "rounded-e": scaleRadius() 22032 }], 22033 /** 22034 * Border Radius Top 22035 * @see https://tailwindcss.com/docs/border-radius 22036 */ 22037 "rounded-t": [{ 22038 "rounded-t": scaleRadius() 22039 }], 22040 /** 22041 * Border Radius Right 22042 * @see https://tailwindcss.com/docs/border-radius 22043 */ 22044 "rounded-r": [{ 22045 "rounded-r": scaleRadius() 22046 }], 22047 /** 22048 * Border Radius Bottom 22049 * @see https://tailwindcss.com/docs/border-radius 22050 */ 22051 "rounded-b": [{ 22052 "rounded-b": scaleRadius() 22053 }], 22054 /** 22055 * Border Radius Left 22056 * @see https://tailwindcss.com/docs/border-radius 22057 */ 22058 "rounded-l": [{ 22059 "rounded-l": scaleRadius() 22060 }], 22061 /** 22062 * Border Radius Start Start 22063 * @see https://tailwindcss.com/docs/border-radius 22064 */ 22065 "rounded-ss": [{ 22066 "rounded-ss": scaleRadius() 22067 }], 22068 /** 22069 * Border Radius Start End 22070 * @see https://tailwindcss.com/docs/border-radius 22071 */ 22072 "rounded-se": [{ 22073 "rounded-se": scaleRadius() 22074 }], 22075 /** 22076 * Border Radius End End 22077 * @see https://tailwindcss.com/docs/border-radius 22078 */ 22079 "rounded-ee": [{ 22080 "rounded-ee": scaleRadius() 22081 }], 22082 /** 22083 * Border Radius End Start 22084 * @see https://tailwindcss.com/docs/border-radius 22085 */ 22086 "rounded-es": [{ 22087 "rounded-es": scaleRadius() 22088 }], 22089 /** 22090 * Border Radius Top Left 22091 * @see https://tailwindcss.com/docs/border-radius 22092 */ 22093 "rounded-tl": [{ 22094 "rounded-tl": scaleRadius() 22095 }], 22096 /** 22097 * Border Radius Top Right 22098 * @see https://tailwindcss.com/docs/border-radius 22099 */ 22100 "rounded-tr": [{ 22101 "rounded-tr": scaleRadius() 22102 }], 22103 /** 22104 * Border Radius Bottom Right 22105 * @see https://tailwindcss.com/docs/border-radius 22106 */ 22107 "rounded-br": [{ 22108 "rounded-br": scaleRadius() 22109 }], 22110 /** 22111 * Border Radius Bottom Left 22112 * @see https://tailwindcss.com/docs/border-radius 22113 */ 22114 "rounded-bl": [{ 22115 "rounded-bl": scaleRadius() 22116 }], 22117 /** 22118 * Border Width 22119 * @see https://tailwindcss.com/docs/border-width 22120 */ 22121 "border-w": [{ 22122 border: scaleBorderWidth() 22123 }], 22124 /** 22125 * Border Width X 22126 * @see https://tailwindcss.com/docs/border-width 22127 */ 22128 "border-w-x": [{ 22129 "border-x": scaleBorderWidth() 22130 }], 22131 /** 22132 * Border Width Y 22133 * @see https://tailwindcss.com/docs/border-width 22134 */ 22135 "border-w-y": [{ 22136 "border-y": scaleBorderWidth() 22137 }], 22138 /** 22139 * Border Width Start 22140 * @see https://tailwindcss.com/docs/border-width 22141 */ 22142 "border-w-s": [{ 22143 "border-s": scaleBorderWidth() 22144 }], 22145 /** 22146 * Border Width End 22147 * @see https://tailwindcss.com/docs/border-width 22148 */ 22149 "border-w-e": [{ 22150 "border-e": scaleBorderWidth() 22151 }], 22152 /** 22153 * Border Width Top 22154 * @see https://tailwindcss.com/docs/border-width 22155 */ 22156 "border-w-t": [{ 22157 "border-t": scaleBorderWidth() 22158 }], 22159 /** 22160 * Border Width Right 22161 * @see https://tailwindcss.com/docs/border-width 22162 */ 22163 "border-w-r": [{ 22164 "border-r": scaleBorderWidth() 22165 }], 22166 /** 22167 * Border Width Bottom 22168 * @see https://tailwindcss.com/docs/border-width 22169 */ 22170 "border-w-b": [{ 22171 "border-b": scaleBorderWidth() 22172 }], 22173 /** 22174 * Border Width Left 22175 * @see https://tailwindcss.com/docs/border-width 22176 */
vendor: 24,896 bytes, lines 22177-23088
22177 "border-w-l": [{ 22178 "border-l": scaleBorderWidth() 22179 }], 22180 /** 22181 * Divide Width X 22182 * @see https://tailwindcss.com/docs/border-width#between-children 22183 */ 22184 "divide-x": [{ 22185 "divide-x": scaleBorderWidth() 22186 }], 22187 /** 22188 * Divide Width X Reverse 22189 * @see https://tailwindcss.com/docs/border-width#between-children 22190 */ 22191 "divide-x-reverse": ["divide-x-reverse"], 22192 /** 22193 * Divide Width Y 22194 * @see https://tailwindcss.com/docs/border-width#between-children 22195 */ 22196 "divide-y": [{ 22197 "divide-y": scaleBorderWidth() 22198 }], 22199 /** 22200 * Divide Width Y Reverse 22201 * @see https://tailwindcss.com/docs/border-width#between-children 22202 */ 22203 "divide-y-reverse": ["divide-y-reverse"], 22204 /** 22205 * Border Style 22206 * @see https://tailwindcss.com/docs/border-style 22207 */ 22208 "border-style": [{ 22209 border: [...scaleLineStyle(), "hidden", "none"] 22210 }], 22211 /** 22212 * Divide Style 22213 * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style 22214 */ 22215 "divide-style": [{ 22216 divide: [...scaleLineStyle(), "hidden", "none"] 22217 }], 22218 /** 22219 * Border Color 22220 * @see https://tailwindcss.com/docs/border-color 22221 */ 22222 "border-color": [{ 22223 border: scaleColor() 22224 }], 22225 /** 22226 * Border Color X 22227 * @see https://tailwindcss.com/docs/border-color 22228 */ 22229 "border-color-x": [{ 22230 "border-x": scaleColor() 22231 }], 22232 /** 22233 * Border Color Y 22234 * @see https://tailwindcss.com/docs/border-color 22235 */ 22236 "border-color-y": [{ 22237 "border-y": scaleColor() 22238 }], 22239 /** 22240 * Border Color S 22241 * @see https://tailwindcss.com/docs/border-color 22242 */ 22243 "border-color-s": [{ 22244 "border-s": scaleColor() 22245 }], 22246 /** 22247 * Border Color E 22248 * @see https://tailwindcss.com/docs/border-color 22249 */ 22250 "border-color-e": [{ 22251 "border-e": scaleColor() 22252 }], 22253 /** 22254 * Border Color Top 22255 * @see https://tailwindcss.com/docs/border-color 22256 */ 22257 "border-color-t": [{ 22258 "border-t": scaleColor() 22259 }], 22260 /** 22261 * Border Color Right 22262 * @see https://tailwindcss.com/docs/border-color 22263 */ 22264 "border-color-r": [{ 22265 "border-r": scaleColor() 22266 }], 22267 /** 22268 * Border Color Bottom 22269 * @see https://tailwindcss.com/docs/border-color 22270 */ 22271 "border-color-b": [{ 22272 "border-b": scaleColor() 22273 }], 22274 /** 22275 * Border Color Left 22276 * @see https://tailwindcss.com/docs/border-color 22277 */ 22278 "border-color-l": [{ 22279 "border-l": scaleColor() 22280 }], 22281 /** 22282 * Divide Color 22283 * @see https://tailwindcss.com/docs/divide-color 22284 */ 22285 "divide-color": [{ 22286 divide: scaleColor() 22287 }], 22288 /** 22289 * Outline Style 22290 * @see https://tailwindcss.com/docs/outline-style 22291 */ 22292 "outline-style": [{ 22293 outline: [...scaleLineStyle(), "none", "hidden"] 22294 }], 22295 /** 22296 * Outline Offset 22297 * @see https://tailwindcss.com/docs/outline-offset 22298 */ 22299 "outline-offset": [{ 22300 "outline-offset": [isNumber, isArbitraryVariable, isArbitraryValue] 22301 }], 22302 /** 22303 * Outline Width 22304 * @see https://tailwindcss.com/docs/outline-width 22305 */ 22306 "outline-w": [{ 22307 outline: ["", isNumber, isArbitraryVariableLength, isArbitraryLength] 22308 }], 22309 /** 22310 * Outline Color 22311 * @see https://tailwindcss.com/docs/outline-color 22312 */ 22313 "outline-color": [{ 22314 outline: scaleColor() 22315 }], 22316 // --------------- 22317 // --- Effects --- 22318 // --------------- 22319 /** 22320 * Box Shadow 22321 * @see https://tailwindcss.com/docs/box-shadow 22322 */ 22323 shadow: [{ 22324 shadow: [ 22325 // Deprecated since Tailwind CSS v4.0.0 22326 "", 22327 "none", 22328 themeShadow, 22329 isArbitraryVariableShadow, 22330 isArbitraryShadow 22331 ] 22332 }], 22333 /** 22334 * Box Shadow Color 22335 * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color 22336 */ 22337 "shadow-color": [{ 22338 shadow: scaleColor() 22339 }], 22340 /** 22341 * Inset Box Shadow 22342 * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow 22343 */ 22344 "inset-shadow": [{ 22345 "inset-shadow": ["none", themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow] 22346 }], 22347 /** 22348 * Inset Box Shadow Color 22349 * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color 22350 */ 22351 "inset-shadow-color": [{ 22352 "inset-shadow": scaleColor() 22353 }], 22354 /** 22355 * Ring Width 22356 * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring 22357 */ 22358 "ring-w": [{ 22359 ring: scaleBorderWidth() 22360 }], 22361 /** 22362 * Ring Width Inset 22363 * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings 22364 * @deprecated since Tailwind CSS v4.0.0 22365 * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158 22366 */ 22367 "ring-w-inset": ["ring-inset"], 22368 /** 22369 * Ring Color 22370 * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color 22371 */ 22372 "ring-color": [{ 22373 ring: scaleColor() 22374 }], 22375 /** 22376 * Ring Offset Width 22377 * @see https://v3.tailwindcss.com/docs/ring-offset-width 22378 * @deprecated since Tailwind CSS v4.0.0 22379 * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158 22380 */ 22381 "ring-offset-w": [{ 22382 "ring-offset": [isNumber, isArbitraryLength] 22383 }], 22384 /** 22385 * Ring Offset Color 22386 * @see https://v3.tailwindcss.com/docs/ring-offset-color 22387 * @deprecated since Tailwind CSS v4.0.0 22388 * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158 22389 */ 22390 "ring-offset-color": [{ 22391 "ring-offset": scaleColor() 22392 }], 22393 /** 22394 * Inset Ring Width 22395 * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring 22396 */ 22397 "inset-ring-w": [{ 22398 "inset-ring": scaleBorderWidth() 22399 }], 22400 /** 22401 * Inset Ring Color 22402 * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color 22403 */ 22404 "inset-ring-color": [{ 22405 "inset-ring": scaleColor() 22406 }], 22407 /** 22408 * Text Shadow 22409 * @see https://tailwindcss.com/docs/text-shadow 22410 */ 22411 "text-shadow": [{ 22412 "text-shadow": ["none", themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow] 22413 }], 22414 /** 22415 * Text Shadow Color 22416 * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color 22417 */ 22418 "text-shadow-color": [{ 22419 "text-shadow": scaleColor() 22420 }], 22421 /** 22422 * Opacity 22423 * @see https://tailwindcss.com/docs/opacity 22424 */ 22425 opacity: [{ 22426 opacity: [isNumber, isArbitraryVariable, isArbitraryValue] 22427 }], 22428 /** 22429 * Mix Blend Mode 22430 * @see https://tailwindcss.com/docs/mix-blend-mode 22431 */ 22432 "mix-blend": [{ 22433 "mix-blend": [...scaleBlendMode(), "plus-darker", "plus-lighter"] 22434 }], 22435 /** 22436 * Background Blend Mode 22437 * @see https://tailwindcss.com/docs/background-blend-mode 22438 */ 22439 "bg-blend": [{ 22440 "bg-blend": scaleBlendMode() 22441 }], 22442 /** 22443 * Mask Clip 22444 * @see https://tailwindcss.com/docs/mask-clip 22445 */ 22446 "mask-clip": [{ 22447 "mask-clip": ["border", "padding", "content", "fill", "stroke", "view"] 22448 }, "mask-no-clip"], 22449 /** 22450 * Mask Composite 22451 * @see https://tailwindcss.com/docs/mask-composite 22452 */ 22453 "mask-composite": [{ 22454 mask: ["add", "subtract", "intersect", "exclude"] 22455 }], 22456 /** 22457 * Mask Image 22458 * @see https://tailwindcss.com/docs/mask-image 22459 */ 22460 "mask-image-linear-pos": [{ 22461 "mask-linear": [isNumber] 22462 }], 22463 "mask-image-linear-from-pos": [{ 22464 "mask-linear-from": scaleMaskImagePosition() 22465 }], 22466 "mask-image-linear-to-pos": [{ 22467 "mask-linear-to": scaleMaskImagePosition() 22468 }], 22469 "mask-image-linear-from-color": [{ 22470 "mask-linear-from": scaleColor() 22471 }], 22472 "mask-image-linear-to-color": [{ 22473 "mask-linear-to": scaleColor() 22474 }], 22475 "mask-image-t-from-pos": [{ 22476 "mask-t-from": scaleMaskImagePosition() 22477 }], 22478 "mask-image-t-to-pos": [{ 22479 "mask-t-to": scaleMaskImagePosition() 22480 }], 22481 "mask-image-t-from-color": [{ 22482 "mask-t-from": scaleColor() 22483 }], 22484 "mask-image-t-to-color": [{ 22485 "mask-t-to": scaleColor() 22486 }], 22487 "mask-image-r-from-pos": [{ 22488 "mask-r-from": scaleMaskImagePosition() 22489 }], 22490 "mask-image-r-to-pos": [{ 22491 "mask-r-to": scaleMaskImagePosition() 22492 }], 22493 "mask-image-r-from-color": [{ 22494 "mask-r-from": scaleColor() 22495 }], 22496 "mask-image-r-to-color": [{ 22497 "mask-r-to": scaleColor() 22498 }], 22499 "mask-image-b-from-pos": [{ 22500 "mask-b-from": scaleMaskImagePosition() 22501 }], 22502 "mask-image-b-to-pos": [{ 22503 "mask-b-to": scaleMaskImagePosition() 22504 }], 22505 "mask-image-b-from-color": [{ 22506 "mask-b-from": scaleColor() 22507 }], 22508 "mask-image-b-to-color": [{ 22509 "mask-b-to": scaleColor() 22510 }], 22511 "mask-image-l-from-pos": [{ 22512 "mask-l-from": scaleMaskImagePosition() 22513 }], 22514 "mask-image-l-to-pos": [{ 22515 "mask-l-to": scaleMaskImagePosition() 22516 }], 22517 "mask-image-l-from-color": [{ 22518 "mask-l-from": scaleColor() 22519 }], 22520 "mask-image-l-to-color": [{ 22521 "mask-l-to": scaleColor() 22522 }], 22523 "mask-image-x-from-pos": [{ 22524 "mask-x-from": scaleMaskImagePosition() 22525 }], 22526 "mask-image-x-to-pos": [{ 22527 "mask-x-to": scaleMaskImagePosition() 22528 }], 22529 "mask-image-x-from-color": [{ 22530 "mask-x-from": scaleColor() 22531 }], 22532 "mask-image-x-to-color": [{ 22533 "mask-x-to": scaleColor() 22534 }], 22535 "mask-image-y-from-pos": [{ 22536 "mask-y-from": scaleMaskImagePosition() 22537 }], 22538 "mask-image-y-to-pos": [{ 22539 "mask-y-to": scaleMaskImagePosition() 22540 }], 22541 "mask-image-y-from-color": [{ 22542 "mask-y-from": scaleColor() 22543 }], 22544 "mask-image-y-to-color": [{ 22545 "mask-y-to": scaleColor() 22546 }], 22547 "mask-image-radial": [{ 22548 "mask-radial": [isArbitraryVariable, isArbitraryValue] 22549 }], 22550 "mask-image-radial-from-pos": [{ 22551 "mask-radial-from": scaleMaskImagePosition() 22552 }], 22553 "mask-image-radial-to-pos": [{ 22554 "mask-radial-to": scaleMaskImagePosition() 22555 }], 22556 "mask-image-radial-from-color": [{ 22557 "mask-radial-from": scaleColor() 22558 }], 22559 "mask-image-radial-to-color": [{ 22560 "mask-radial-to": scaleColor() 22561 }], 22562 "mask-image-radial-shape": [{ 22563 "mask-radial": ["circle", "ellipse"] 22564 }], 22565 "mask-image-radial-size": [{ 22566 "mask-radial": [{ 22567 closest: ["side", "corner"], 22568 farthest: ["side", "corner"] 22569 }] 22570 }], 22571 "mask-image-radial-pos": [{ 22572 "mask-radial-at": scalePosition() 22573 }], 22574 "mask-image-conic-pos": [{ 22575 "mask-conic": [isNumber] 22576 }], 22577 "mask-image-conic-from-pos": [{ 22578 "mask-conic-from": scaleMaskImagePosition() 22579 }], 22580 "mask-image-conic-to-pos": [{ 22581 "mask-conic-to": scaleMaskImagePosition() 22582 }], 22583 "mask-image-conic-from-color": [{ 22584 "mask-conic-from": scaleColor() 22585 }], 22586 "mask-image-conic-to-color": [{ 22587 "mask-conic-to": scaleColor() 22588 }], 22589 /** 22590 * Mask Mode 22591 * @see https://tailwindcss.com/docs/mask-mode 22592 */ 22593 "mask-mode": [{ 22594 mask: ["alpha", "luminance", "match"] 22595 }], 22596 /** 22597 * Mask Origin 22598 * @see https://tailwindcss.com/docs/mask-origin 22599 */ 22600 "mask-origin": [{ 22601 "mask-origin": ["border", "padding", "content", "fill", "stroke", "view"] 22602 }], 22603 /** 22604 * Mask Position 22605 * @see https://tailwindcss.com/docs/mask-position 22606 */ 22607 "mask-position": [{ 22608 mask: scaleBgPosition() 22609 }], 22610 /** 22611 * Mask Repeat 22612 * @see https://tailwindcss.com/docs/mask-repeat 22613 */ 22614 "mask-repeat": [{ 22615 mask: scaleBgRepeat() 22616 }], 22617 /** 22618 * Mask Size 22619 * @see https://tailwindcss.com/docs/mask-size 22620 */ 22621 "mask-size": [{ 22622 mask: scaleBgSize() 22623 }], 22624 /** 22625 * Mask Type 22626 * @see https://tailwindcss.com/docs/mask-type 22627 */ 22628 "mask-type": [{ 22629 "mask-type": ["alpha", "luminance"] 22630 }], 22631 /** 22632 * Mask Image 22633 * @see https://tailwindcss.com/docs/mask-image 22634 */ 22635 "mask-image": [{ 22636 mask: ["none", isArbitraryVariable, isArbitraryValue] 22637 }], 22638 // --------------- 22639 // --- Filters --- 22640 // --------------- 22641 /** 22642 * Filter 22643 * @see https://tailwindcss.com/docs/filter 22644 */ 22645 filter: [{ 22646 filter: [ 22647 // Deprecated since Tailwind CSS v3.0.0 22648 "", 22649 "none", 22650 isArbitraryVariable, 22651 isArbitraryValue 22652 ] 22653 }], 22654 /** 22655 * Blur 22656 * @see https://tailwindcss.com/docs/blur 22657 */ 22658 blur: [{ 22659 blur: scaleBlur() 22660 }], 22661 /** 22662 * Brightness 22663 * @see https://tailwindcss.com/docs/brightness 22664 */ 22665 brightness: [{ 22666 brightness: [isNumber, isArbitraryVariable, isArbitraryValue] 22667 }], 22668 /** 22669 * Contrast 22670 * @see https://tailwindcss.com/docs/contrast 22671 */ 22672 contrast: [{ 22673 contrast: [isNumber, isArbitraryVariable, isArbitraryValue] 22674 }], 22675 /** 22676 * Drop Shadow 22677 * @see https://tailwindcss.com/docs/drop-shadow 22678 */ 22679 "drop-shadow": [{ 22680 "drop-shadow": [ 22681 // Deprecated since Tailwind CSS v4.0.0 22682 "", 22683 "none", 22684 themeDropShadow, 22685 isArbitraryVariableShadow, 22686 isArbitraryShadow 22687 ] 22688 }], 22689 /** 22690 * Drop Shadow Color 22691 * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color 22692 */ 22693 "drop-shadow-color": [{ 22694 "drop-shadow": scaleColor() 22695 }], 22696 /** 22697 * Grayscale 22698 * @see https://tailwindcss.com/docs/grayscale 22699 */ 22700 grayscale: [{ 22701 grayscale: ["", isNumber, isArbitraryVariable, isArbitraryValue] 22702 }], 22703 /** 22704 * Hue Rotate 22705 * @see https://tailwindcss.com/docs/hue-rotate 22706 */ 22707 "hue-rotate": [{ 22708 "hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue] 22709 }], 22710 /** 22711 * Invert 22712 * @see https://tailwindcss.com/docs/invert 22713 */ 22714 invert: [{ 22715 invert: ["", isNumber, isArbitraryVariable, isArbitraryValue] 22716 }], 22717 /** 22718 * Saturate 22719 * @see https://tailwindcss.com/docs/saturate 22720 */ 22721 saturate: [{ 22722 saturate: [isNumber, isArbitraryVariable, isArbitraryValue] 22723 }], 22724 /** 22725 * Sepia 22726 * @see https://tailwindcss.com/docs/sepia 22727 */ 22728 sepia: [{ 22729 sepia: ["", isNumber, isArbitraryVariable, isArbitraryValue] 22730 }], 22731 /** 22732 * Backdrop Filter 22733 * @see https://tailwindcss.com/docs/backdrop-filter 22734 */ 22735 "backdrop-filter": [{ 22736 "backdrop-filter": [ 22737 // Deprecated since Tailwind CSS v3.0.0 22738 "", 22739 "none", 22740 isArbitraryVariable, 22741 isArbitraryValue 22742 ] 22743 }], 22744 /** 22745 * Backdrop Blur 22746 * @see https://tailwindcss.com/docs/backdrop-blur 22747 */ 22748 "backdrop-blur": [{ 22749 "backdrop-blur": scaleBlur() 22750 }], 22751 /** 22752 * Backdrop Brightness 22753 * @see https://tailwindcss.com/docs/backdrop-brightness 22754 */ 22755 "backdrop-brightness": [{ 22756 "backdrop-brightness": [isNumber, isArbitraryVariable, isArbitraryValue] 22757 }], 22758 /** 22759 * Backdrop Contrast 22760 * @see https://tailwindcss.com/docs/backdrop-contrast 22761 */ 22762 "backdrop-contrast": [{ 22763 "backdrop-contrast": [isNumber, isArbitraryVariable, isArbitraryValue] 22764 }], 22765 /** 22766 * Backdrop Grayscale 22767 * @see https://tailwindcss.com/docs/backdrop-grayscale 22768 */ 22769 "backdrop-grayscale": [{ 22770 "backdrop-grayscale": ["", isNumber, isArbitraryVariable, isArbitraryValue] 22771 }], 22772 /** 22773 * Backdrop Hue Rotate 22774 * @see https://tailwindcss.com/docs/backdrop-hue-rotate 22775 */ 22776 "backdrop-hue-rotate": [{ 22777 "backdrop-hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue] 22778 }], 22779 /** 22780 * Backdrop Invert 22781 * @see https://tailwindcss.com/docs/backdrop-invert 22782 */ 22783 "backdrop-invert": [{ 22784 "backdrop-invert": ["", isNumber, isArbitraryVariable, isArbitraryValue] 22785 }], 22786 /** 22787 * Backdrop Opacity 22788 * @see https://tailwindcss.com/docs/backdrop-opacity 22789 */ 22790 "backdrop-opacity": [{ 22791 "backdrop-opacity": [isNumber, isArbitraryVariable, isArbitraryValue] 22792 }], 22793 /** 22794 * Backdrop Saturate 22795 * @see https://tailwindcss.com/docs/backdrop-saturate 22796 */ 22797 "backdrop-saturate": [{ 22798 "backdrop-saturate": [isNumber, isArbitraryVariable, isArbitraryValue] 22799 }], 22800 /** 22801 * Backdrop Sepia 22802 * @see https://tailwindcss.com/docs/backdrop-sepia 22803 */ 22804 "backdrop-sepia": [{ 22805 "backdrop-sepia": ["", isNumber, isArbitraryVariable, isArbitraryValue] 22806 }], 22807 // -------------- 22808 // --- Tables --- 22809 // -------------- 22810 /** 22811 * Border Collapse 22812 * @see https://tailwindcss.com/docs/border-collapse 22813 */ 22814 "border-collapse": [{ 22815 border: ["collapse", "separate"] 22816 }], 22817 /** 22818 * Border Spacing 22819 * @see https://tailwindcss.com/docs/border-spacing 22820 */ 22821 "border-spacing": [{ 22822 "border-spacing": scaleUnambiguousSpacing() 22823 }], 22824 /** 22825 * Border Spacing X 22826 * @see https://tailwindcss.com/docs/border-spacing 22827 */ 22828 "border-spacing-x": [{ 22829 "border-spacing-x": scaleUnambiguousSpacing() 22830 }], 22831 /** 22832 * Border Spacing Y 22833 * @see https://tailwindcss.com/docs/border-spacing 22834 */ 22835 "border-spacing-y": [{ 22836 "border-spacing-y": scaleUnambiguousSpacing() 22837 }], 22838 /** 22839 * Table Layout 22840 * @see https://tailwindcss.com/docs/table-layout 22841 */ 22842 "table-layout": [{ 22843 table: ["auto", "fixed"] 22844 }], 22845 /** 22846 * Caption Side 22847 * @see https://tailwindcss.com/docs/caption-side 22848 */ 22849 caption: [{ 22850 caption: ["top", "bottom"] 22851 }], 22852 // --------------------------------- 22853 // --- Transitions and Animation --- 22854 // --------------------------------- 22855 /** 22856 * Transition Property 22857 * @see https://tailwindcss.com/docs/transition-property 22858 */ 22859 transition: [{ 22860 transition: ["", "all", "colors", "opacity", "shadow", "transform", "none", isArbitraryVariable, isArbitraryValue] 22861 }], 22862 /** 22863 * Transition Behavior 22864 * @see https://tailwindcss.com/docs/transition-behavior 22865 */ 22866 "transition-behavior": [{ 22867 transition: ["normal", "discrete"] 22868 }], 22869 /** 22870 * Transition Duration 22871 * @see https://tailwindcss.com/docs/transition-duration 22872 */ 22873 duration: [{ 22874 duration: [isNumber, "initial", isArbitraryVariable, isArbitraryValue] 22875 }], 22876 /** 22877 * Transition Timing Function 22878 * @see https://tailwindcss.com/docs/transition-timing-function 22879 */ 22880 ease: [{ 22881 ease: ["linear", "initial", themeEase, isArbitraryVariable, isArbitraryValue] 22882 }], 22883 /** 22884 * Transition Delay 22885 * @see https://tailwindcss.com/docs/transition-delay 22886 */ 22887 delay: [{ 22888 delay: [isNumber, isArbitraryVariable, isArbitraryValue] 22889 }], 22890 /** 22891 * Animation 22892 * @see https://tailwindcss.com/docs/animation 22893 */ 22894 animate: [{ 22895 animate: ["none", themeAnimate, isArbitraryVariable, isArbitraryValue] 22896 }], 22897 // ------------------ 22898 // --- Transforms --- 22899 // ------------------ 22900 /** 22901 * Backface Visibility 22902 * @see https://tailwindcss.com/docs/backface-visibility 22903 */ 22904 backface: [{ 22905 backface: ["hidden", "visible"] 22906 }], 22907 /** 22908 * Perspective 22909 * @see https://tailwindcss.com/docs/perspective 22910 */ 22911 perspective: [{ 22912 perspective: [themePerspective, isArbitraryVariable, isArbitraryValue] 22913 }], 22914 /** 22915 * Perspective Origin 22916 * @see https://tailwindcss.com/docs/perspective-origin 22917 */ 22918 "perspective-origin": [{ 22919 "perspective-origin": scalePositionWithArbitrary() 22920 }], 22921 /** 22922 * Rotate 22923 * @see https://tailwindcss.com/docs/rotate 22924 */ 22925 rotate: [{ 22926 rotate: scaleRotate() 22927 }], 22928 /** 22929 * Rotate X 22930 * @see https://tailwindcss.com/docs/rotate 22931 */ 22932 "rotate-x": [{ 22933 "rotate-x": scaleRotate() 22934 }], 22935 /** 22936 * Rotate Y 22937 * @see https://tailwindcss.com/docs/rotate 22938 */ 22939 "rotate-y": [{ 22940 "rotate-y": scaleRotate() 22941 }], 22942 /** 22943 * Rotate Z 22944 * @see https://tailwindcss.com/docs/rotate 22945 */ 22946 "rotate-z": [{ 22947 "rotate-z": scaleRotate() 22948 }], 22949 /** 22950 * Scale 22951 * @see https://tailwindcss.com/docs/scale 22952 */ 22953 scale: [{ 22954 scale: scaleScale() 22955 }], 22956 /** 22957 * Scale X 22958 * @see https://tailwindcss.com/docs/scale 22959 */ 22960 "scale-x": [{ 22961 "scale-x": scaleScale() 22962 }], 22963 /** 22964 * Scale Y 22965 * @see https://tailwindcss.com/docs/scale 22966 */ 22967 "scale-y": [{ 22968 "scale-y": scaleScale() 22969 }], 22970 /** 22971 * Scale Z 22972 * @see https://tailwindcss.com/docs/scale 22973 */ 22974 "scale-z": [{ 22975 "scale-z": scaleScale() 22976 }], 22977 /** 22978 * Scale 3D 22979 * @see https://tailwindcss.com/docs/scale 22980 */ 22981 "scale-3d": ["scale-3d"], 22982 /** 22983 * Skew 22984 * @see https://tailwindcss.com/docs/skew 22985 */ 22986 skew: [{ 22987 skew: scaleSkew() 22988 }], 22989 /** 22990 * Skew X 22991 * @see https://tailwindcss.com/docs/skew 22992 */ 22993 "skew-x": [{ 22994 "skew-x": scaleSkew() 22995 }], 22996 /** 22997 * Skew Y 22998 * @see https://tailwindcss.com/docs/skew 22999 */ 23000 "skew-y": [{ 23001 "skew-y": scaleSkew() 23002 }], 23003 /** 23004 * Transform 23005 * @see https://tailwindcss.com/docs/transform 23006 */ 23007 transform: [{ 23008 transform: [isArbitraryVariable, isArbitraryValue, "", "none", "gpu", "cpu"] 23009 }], 23010 /** 23011 * Transform Origin 23012 * @see https://tailwindcss.com/docs/transform-origin 23013 */ 23014 "transform-origin": [{ 23015 origin: scalePositionWithArbitrary() 23016 }], 23017 /** 23018 * Transform Style 23019 * @see https://tailwindcss.com/docs/transform-style 23020 */ 23021 "transform-style": [{ 23022 transform: ["3d", "flat"] 23023 }], 23024 /** 23025 * Translate 23026 * @see https://tailwindcss.com/docs/translate 23027 */ 23028 translate: [{ 23029 translate: scaleTranslate() 23030 }], 23031 /** 23032 * Translate X 23033 * @see https://tailwindcss.com/docs/translate 23034 */ 23035 "translate-x": [{ 23036 "translate-x": scaleTranslate() 23037 }], 23038 /** 23039 * Translate Y 23040 * @see https://tailwindcss.com/docs/translate 23041 */ 23042 "translate-y": [{ 23043 "translate-y": scaleTranslate() 23044 }], 23045 /** 23046 * Translate Z 23047 * @see https://tailwindcss.com/docs/translate 23048 */ 23049 "translate-z": [{ 23050 "translate-z": scaleTranslate() 23051 }], 23052 /** 23053 * Translate None 23054 * @see https://tailwindcss.com/docs/translate 23055 */ 23056 "translate-none": ["translate-none"], 23057 // --------------------- 23058 // --- Interactivity --- 23059 // --------------------- 23060 /** 23061 * Accent Color 23062 * @see https://tailwindcss.com/docs/accent-color 23063 */ 23064 accent: [{ 23065 accent: scaleColor() 23066 }], 23067 /** 23068 * Appearance 23069 * @see https://tailwindcss.com/docs/appearance 23070 */ 23071 appearance: [{ 23072 appearance: ["none", "auto"] 23073 }], 23074 /** 23075 * Caret Color 23076 * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities 23077 */ 23078 "caret-color": [{ 23079 caret: scaleColor() 23080 }], 23081 /** 23082 * Color Scheme 23083 * @see https://tailwindcss.com/docs/color-scheme 23084 */ 23085 "color-scheme": [{ 23086 scheme: ["normal", "dark", "light", "light-dark", "only-dark", "only-light"] 23087 }], 23088 /**
23089 * Cursor 23090 * @see https://tailwindcss.com/docs/cursor 23091 */ 23092 cursor: [{ 23093 cursor: ["auto", "default", "pointer", "wait", "text", "move", "help", "not-allowed", "none", "context-menu", "progress", "cell", "crosshair", "vertical-text", "alias", "copy", "no-drop", "grab", "grabbing", "all-scroll", "col-resize", "row-resize", "n-resize", "e-resize", "s-resize", "w-resize", "ne-resize", "nw-resize", "se-resize", "sw-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "zoom-in", "zoom-out", isArbitraryVariable, isArbitraryValue] 23094 }], 23095 /** 23096 * Field Sizing 23097 * @see https://tailwindcss.com/docs/field-sizing 23098 */ 23099 "field-sizing": [{ 23100 "field-sizing": ["fixed", "content"] 23101 }], 23102 /** 23103 * Pointer Events 23104 * @see https://tailwindcss.com/docs/pointer-events 23105 */ 23106 "pointer-events": [{ 23107 "pointer-events": ["auto", "none"] 23108 }], 23109 /** 23110 * Resize 23111 * @see https://tailwindcss.com/docs/resize 23112 */ 23113 resize: [{ 23114 resize: ["none", "", "y", "x"] 23115 }], 23116 /** 23117 * Scroll Behavior 23118 * @see https://tailwindcss.com/docs/scroll-behavior 23119 */ 23120 "scroll-behavior": [{ 23121 scroll: ["auto", "smooth"] 23122 }], 23123 /** 23124 * Scroll Margin 23125 * @see https://tailwindcss.com/docs/scroll-margin 23126 */ 23127 "scroll-m": [{ 23128 "scroll-m": scaleUnambiguousSpacing() 23129 }], 23130 /** 23131 * Scroll Margin X 23132 * @see https://tailwindcss.com/docs/scroll-margin 23133 */ 23134 "scroll-mx": [{ 23135 "scroll-mx": scaleUnambiguousSpacing() 23136 }], 23137 /** 23138 * Scroll Margin Y 23139 * @see https://tailwindcss.com/docs/scroll-margin 23140 */ 23141 "scroll-my": [{ 23142 "scroll-my": scaleUnambiguousSpacing() 23143 }], 23144 /** 23145 * Scroll Margin Start 23146 * @see https://tailwindcss.com/docs/scroll-margin 23147 */ 23148 "scroll-ms": [{ 23149 "scroll-ms": scaleUnambiguousSpacing() 23150 }], 23151 /** 23152 * Scroll Margin End 23153 * @see https://tailwindcss.com/docs/scroll-margin 23154 */ 23155 "scroll-me": [{ 23156 "scroll-me": scaleUnambiguousSpacing() 23157 }], 23158 /** 23159 * Scroll Margin Top 23160 * @see https://tailwindcss.com/docs/scroll-margin 23161 */ 23162 "scroll-mt": [{ 23163 "scroll-mt": scaleUnambiguousSpacing() 23164 }], 23165 /** 23166 * Scroll Margin Right 23167 * @see https://tailwindcss.com/docs/scroll-margin 23168 */ 23169 "scroll-mr": [{ 23170 "scroll-mr": scaleUnambiguousSpacing() 23171 }], 23172 /** 23173 * Scroll Margin Bottom 23174 * @see https://tailwindcss.com/docs/scroll-margin 23175 */ 23176 "scroll-mb": [{ 23177 "scroll-mb": scaleUnambiguousSpacing() 23178 }], 23179 /** 23180 * Scroll Margin Left 23181 * @see https://tailwindcss.com/docs/scroll-margin 23182 */ 23183 "scroll-ml": [{ 23184 "scroll-ml": scaleUnambiguousSpacing() 23185 }], 23186 /** 23187 * Scroll Padding 23188 * @see https://tailwindcss.com/docs/scroll-padding 23189 */ 23190 "scroll-p": [{ 23191 "scroll-p": scaleUnambiguousSpacing() 23192 }], 23193 /** 23194 * Scroll Padding X 23195 * @see https://tailwindcss.com/docs/scroll-padding 23196 */ 23197 "scroll-px": [{ 23198 "scroll-px": scaleUnambiguousSpacing() 23199 }], 23200 /** 23201 * Scroll Padding Y 23202 * @see https://tailwindcss.com/docs/scroll-padding 23203 */ 23204 "scroll-py": [{ 23205 "scroll-py": scaleUnambiguousSpacing() 23206 }], 23207 /** 23208 * Scroll Padding Start 23209 * @see https://tailwindcss.com/docs/scroll-padding 23210 */ 23211 "scroll-ps": [{ 23212 "scroll-ps": scaleUnambiguousSpacing() 23213 }], 23214 /** 23215 * Scroll Padding End 23216 * @see https://tailwindcss.com/docs/scroll-padding 23217 */ 23218 "scroll-pe": [{ 23219 "scroll-pe": scaleUnambiguousSpacing() 23220 }], 23221 /** 23222 * Scroll Padding Top 23223 * @see https://tailwindcss.com/docs/scroll-padding 23224 */ 23225 "scroll-pt": [{ 23226 "scroll-pt": scaleUnambiguousSpacing() 23227 }], 23228 /** 23229 * Scroll Padding Right 23230 * @see https://tailwindcss.com/docs/scroll-padding 23231 */ 23232 "scroll-pr": [{
vendor: 9,277 bytes, lines 23233-23518
23233 "scroll-pr": scaleUnambiguousSpacing() 23234 }], 23235 /** 23236 * Scroll Padding Bottom 23237 * @see https://tailwindcss.com/docs/scroll-padding 23238 */ 23239 "scroll-pb": [{ 23240 "scroll-pb": scaleUnambiguousSpacing() 23241 }], 23242 /** 23243 * Scroll Padding Left 23244 * @see https://tailwindcss.com/docs/scroll-padding 23245 */ 23246 "scroll-pl": [{ 23247 "scroll-pl": scaleUnambiguousSpacing() 23248 }], 23249 /** 23250 * Scroll Snap Align 23251 * @see https://tailwindcss.com/docs/scroll-snap-align 23252 */ 23253 "snap-align": [{ 23254 snap: ["start", "end", "center", "align-none"] 23255 }], 23256 /** 23257 * Scroll Snap Stop 23258 * @see https://tailwindcss.com/docs/scroll-snap-stop 23259 */ 23260 "snap-stop": [{ 23261 snap: ["normal", "always"] 23262 }], 23263 /** 23264 * Scroll Snap Type 23265 * @see https://tailwindcss.com/docs/scroll-snap-type 23266 */ 23267 "snap-type": [{ 23268 snap: ["none", "x", "y", "both"] 23269 }], 23270 /** 23271 * Scroll Snap Type Strictness 23272 * @see https://tailwindcss.com/docs/scroll-snap-type 23273 */ 23274 "snap-strictness": [{ 23275 snap: ["mandatory", "proximity"] 23276 }], 23277 /** 23278 * Touch Action 23279 * @see https://tailwindcss.com/docs/touch-action 23280 */ 23281 touch: [{ 23282 touch: ["auto", "none", "manipulation"] 23283 }], 23284 /** 23285 * Touch Action X 23286 * @see https://tailwindcss.com/docs/touch-action 23287 */ 23288 "touch-x": [{ 23289 "touch-pan": ["x", "left", "right"] 23290 }], 23291 /** 23292 * Touch Action Y 23293 * @see https://tailwindcss.com/docs/touch-action 23294 */ 23295 "touch-y": [{ 23296 "touch-pan": ["y", "up", "down"] 23297 }], 23298 /** 23299 * Touch Action Pinch Zoom 23300 * @see https://tailwindcss.com/docs/touch-action 23301 */ 23302 "touch-pz": ["touch-pinch-zoom"], 23303 /** 23304 * User Select 23305 * @see https://tailwindcss.com/docs/user-select 23306 */ 23307 select: [{ 23308 select: ["none", "text", "all", "auto"] 23309 }], 23310 /** 23311 * Will Change 23312 * @see https://tailwindcss.com/docs/will-change 23313 */ 23314 "will-change": [{ 23315 "will-change": ["auto", "scroll", "contents", "transform", isArbitraryVariable, isArbitraryValue] 23316 }], 23317 // ----------- 23318 // --- SVG --- 23319 // ----------- 23320 /** 23321 * Fill 23322 * @see https://tailwindcss.com/docs/fill 23323 */ 23324 fill: [{ 23325 fill: ["none", ...scaleColor()] 23326 }], 23327 /** 23328 * Stroke Width 23329 * @see https://tailwindcss.com/docs/stroke-width 23330 */ 23331 "stroke-w": [{ 23332 stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber] 23333 }], 23334 /** 23335 * Stroke 23336 * @see https://tailwindcss.com/docs/stroke 23337 */ 23338 stroke: [{ 23339 stroke: ["none", ...scaleColor()] 23340 }], 23341 // --------------------- 23342 // --- Accessibility --- 23343 // --------------------- 23344 /** 23345 * Forced Color Adjust 23346 * @see https://tailwindcss.com/docs/forced-color-adjust 23347 */ 23348 "forced-color-adjust": [{ 23349 "forced-color-adjust": ["auto", "none"] 23350 }] 23351 }, 23352 conflictingClassGroups: { 23353 overflow: ["overflow-x", "overflow-y"], 23354 overscroll: ["overscroll-x", "overscroll-y"], 23355 inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"], 23356 "inset-x": ["right", "left"], 23357 "inset-y": ["top", "bottom"], 23358 flex: ["basis", "grow", "shrink"], 23359 gap: ["gap-x", "gap-y"], 23360 p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"], 23361 px: ["pr", "pl"], 23362 py: ["pt", "pb"], 23363 m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"], 23364 mx: ["mr", "ml"], 23365 my: ["mt", "mb"], 23366 size: ["w", "h"], 23367 "font-size": ["leading"], 23368 "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"], 23369 "fvn-ordinal": ["fvn-normal"], 23370 "fvn-slashed-zero": ["fvn-normal"], 23371 "fvn-figure": ["fvn-normal"], 23372 "fvn-spacing": ["fvn-normal"], 23373 "fvn-fraction": ["fvn-normal"], 23374 "line-clamp": ["display", "overflow"], 23375 rounded: ["rounded-s", "rounded-e", "rounded-t", "rounded-r", "rounded-b", "rounded-l", "rounded-ss", "rounded-se", "rounded-ee", "rounded-es", "rounded-tl", "rounded-tr", "rounded-br", "rounded-bl"], 23376 "rounded-s": ["rounded-ss", "rounded-es"], 23377 "rounded-e": ["rounded-se", "rounded-ee"], 23378 "rounded-t": ["rounded-tl", "rounded-tr"], 23379 "rounded-r": ["rounded-tr", "rounded-br"], 23380 "rounded-b": ["rounded-br", "rounded-bl"], 23381 "rounded-l": ["rounded-tl", "rounded-bl"], 23382 "border-spacing": ["border-spacing-x", "border-spacing-y"], 23383 "border-w": ["border-w-x", "border-w-y", "border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"], 23384 "border-w-x": ["border-w-r", "border-w-l"], 23385 "border-w-y": ["border-w-t", "border-w-b"], 23386 "border-color": ["border-color-x", "border-color-y", "border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"], 23387 "border-color-x": ["border-color-r", "border-color-l"], 23388 "border-color-y": ["border-color-t", "border-color-b"], 23389 translate: ["translate-x", "translate-y", "translate-none"], 23390 "translate-none": ["translate", "translate-x", "translate-y", "translate-z"], 23391 "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"], 23392 "scroll-mx": ["scroll-mr", "scroll-ml"], 23393 "scroll-my": ["scroll-mt", "scroll-mb"], 23394 "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"], 23395 "scroll-px": ["scroll-pr", "scroll-pl"], 23396 "scroll-py": ["scroll-pt", "scroll-pb"], 23397 touch: ["touch-x", "touch-y", "touch-pz"], 23398 "touch-x": ["touch"], 23399 "touch-y": ["touch"], 23400 "touch-pz": ["touch"] 23401 }, 23402 conflictingClassGroupModifiers: { 23403 "font-size": ["leading"] 23404 }, 23405 orderSensitiveModifiers: ["*", "**", "after", "backdrop", "before", "details-content", "file", "first-letter", "first-line", "marker", "placeholder", "selection"] 23406 }; 23407}; 23408const twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig); 23409function cn(...inputs) { 23410 return twMerge(clsx(inputs)); 23411} 23412const Card = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx( 23413 "div", 23414 { 23415 ref, 23416 className: cn( 23417 "rounded-lg border bg-card text-card-foreground shadow-sm", 23418 className 23419 ), 23420 ...props 23421 } 23422)); 23423Card.displayName = "Card"; 23424const CardHeader = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx( 23425 "div", 23426 { 23427 ref, 23428 className: cn("flex flex-col space-y-1.5 p-6", className), 23429 ...props 23430 } 23431)); 23432CardHeader.displayName = "CardHeader"; 23433const CardTitle = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx( 23434 "h3", 23435 { 23436 ref, 23437 className: cn( 23438 "text-2xl font-semibold leading-none tracking-tight", 23439 className 23440 ), 23441 ...props 23442 } 23443)); 23444CardTitle.displayName = "CardTitle"; 23445const CardDescription = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx( 23446 "p", 23447 { 23448 ref, 23449 className: cn("text-sm text-muted-foreground", className), 23450 ...props 23451 } 23452)); 23453CardDescription.displayName = "CardDescription"; 23454const CardContent = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("p-6 pt-0", className), ...props })); 23455CardContent.displayName = "CardContent"; 23456const CardFooter = React$2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx( 23457 "div", 23458 { 23459 ref, 23460 className: cn("flex items-center p-6 pt-0", className), 23461 ...props 23462 } 23463)); 23464CardFooter.displayName = "CardFooter"; 23465const Button = ({ 23466 variant = "primary", 23467 size = "md", 23468 showArrow = false, 23469 fullWidth = false, 23470 loading = false, 23471 className, 23472 disabled, 23473 children, 23474 ...props 23475}) => { 23476 const baseClasses = [ 23477 // Base styles 23478 "inline-flex items-center justify-center", 23479 "font-helvetica-now font-bold", 23480 "transition-all duration-200", 23481 "focus:outline-none focus:ring-2 focus:ring-offset-2", 23482 "disabled:opacity-50 disabled:cursor-not-allowed", 23483 "uppercase tracking-wide", 23484 // No rounded corners for MEC 23485 "border-0" 23486 ]; 23487 const variantClasses = { 23488 // Dark background (like "Alle Nachrichten") 23489 primary: [ 23490 "bg-mec-secondary text-white", 23491 "hover:bg-mec-secondary/90", 23492 "focus:ring-mec-secondary" 23493 ], 23494 // Light background (like "Jetzt bewerben") 23495 secondary: [ 23496 "bg-gray-400 text-white", 23497 "hover:bg-gray-500", 23498 "focus:ring-gray-400" 23499 ], 23500 // Red background (like "Weitere Informationen") 23501 accent: [ 23502 "bg-mec-primary text-white", 23503 "hover:bg-mec-primary/90", 23504 "focus:ring-mec-primary" 23505 ], 23506 // Transparent/Ghost buttons 23507 ghost: [ 23508 "bg-transparent border-2", 23509 "text-mec-secondary border-mec-secondary", 23510 "hover:bg-mec-secondary hover:text-white", 23511 "focus:ring-mec-secondary" 23512 ] 23513 }; 23514 const sizeClasses2 = { 23515 sm: "px-4 py-2 text-sm", 23516 md: "px-6 py-3 text-base", 23517 lg: "px-8 py-4 text-lg" 23518 };
23519 const widthClasses = fullWidth ? "w-full" : ""; 23520 return /* @__PURE__ */ jsxRuntimeExports.jsx( 23521 "button", 23522 { 23523 className: clsx( 23524 baseClasses, 23525 variantClasses[variant], 23526 sizeClasses2[size], 23527 widthClasses, 23528 className 23529 ), 23530 disabled: disabled || loading, 23531 ...props, 23532 children: loading ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2", children: [ 23533 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-4 h-4 border-2 border-current border-t-transparent animate-spin rounded-full" }), 23534 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Laden..." }) 23535 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2", children: [ 23536 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children }), 23537 showArrow && /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-5 h-5 ml-2" }) 23538 ] }) 23539 } 23540 ); 23541}; 23542const MECButtonPrimary = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "primary", showArrow: true, ...props }); 23543const MECButtonSecondary = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "secondary", showArrow: true, ...props }); 23544const MECButtonAccent = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "accent", showArrow: true, ...props }); 23545const MECButtonGhost = (props) => /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", showArrow: true, ...props }); 23546const Badge = ({ 23547 className, 23548 variant = "default", 23549 ...props 23550}) => { 23551 const baseClasses = [ 23552 "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors" 23553 ]; 23554 const variantClasses = { 23555 default: "border-transparent bg-mec-primary text-white", 23556 secondary: "border-transparent bg-gray-100 text-gray-800", 23557 destructive: "border-transparent bg-red-500 text-white", 23558 outline: "text-gray-700 border-gray-300" 23559 }; 23560 return /* @__PURE__ */ jsxRuntimeExports.jsx( 23561 "div", 23562 { 23563 className: clsx( 23564 baseClasses, 23565 variantClasses[variant], 23566 className 23567 ), 23568 ...props 23569 } 23570 ); 23571}; 23572const SyncManager = () => { 23573 const [syncStatus, setSyncStatus] = reactExports.useState(null); 23574 const [isLoading, setIsLoading] = reactExports.useState(false); 23575 const [isSyncing, setIsSyncing] = reactExports.useState(false); 23576 const [lastSyncResult, setLastSyncResult] = reactExports.useState(null); 23577 const [error, setError] = reactExports.useState(null); 23578 reactExports.useEffect(() => { 23579 loadSyncStatus(); 23580 }, []); 23581 const loadSyncStatus = async () => { 23582 setIsLoading(true); 23583 setError(null); 23584 try { 23585 const response = await fetch("/api/v1/contacts/sync/status"); 23586 const data = await response.json(); 23587 if (data.success) { 23588 setSyncStatus(data); 23589 } else { 23590 setError(data.error || "Failed to load sync status"); 23591 } 23592 } catch (err) { 23593 setError("Network error loading sync status"); 23594 console.error("Error loading sync status:", err); 23595 } finally { 23596 setIsLoading(false); 23597 } 23598 }; 23599 const performIncrementalSync = async () => { 23600 setIsSyncing(true); 23601 setError(null); 23602 setLastSyncResult(null); 23603 try { 23604 const response = await fetch("/api/v1/contacts/sync/incremental", { 23605 method: "POST", 23606 headers: { 23607 "Content-Type": "application/json" 23608 } 23609 }); 23610 const data = await response.json(); 23611 if (data.success) { 23612 setLastSyncResult(data); 23613 await loadSyncStatus(); 23614 } else { 23615 setError(data.error || "Sync failed"); 23616 } 23617 } catch (err) { 23618 setError("Network error during sync"); 23619 console.error("Error during sync:", err); 23620 } finally { 23621 setIsSyncing(false); 23622 } 23623 }; 23624 const performFullSync = async () => { 23625 setIsSyncing(true); 23626 setError(null); 23627 setLastSyncResult(null); 23628 try { 23629 const response = await fetch("/api/v1/contacts/debug/ultimate-wordpress-sync", { 23630 method: "POST", 23631 headers: { 23632 "Content-Type": "application/json" 23633 } 23634 }); 23635 const data = await response.json(); 23636 if (data.success) { 23637 const convertedResult = { 23638 success: true, 23639 syncType: "full", 23640 startTime: data.timestamp, 23641 endTime: data.timestamp, 23642 locations: { 23643 checked: data.summary?.locationsChecked || 0, 23644 new: data.results?.locations?.synced || 0, 23645 updated: 0, 23646 deleted: 0, 23647 errors: data.results?.locations?.errors || [] 23648 }, 23649 contacts: { 23650 checked: data.summary?.contactsProcessed || 0, 23651 new: data.results?.contacts?.synced || 0, 23652 updated: 0, 23653 deleted: 0, 23654 errors: data.results?.contacts?.errors || [] 23655 }, 23656 media: { 23657 downloaded: data.results?.media?.downloaded || 0, 23658 errors: data.results?.media?.errors || [] 23659 } 23660 }; 23661 setLastSyncResult(convertedResult); 23662 await loadSyncStatus(); 23663 } else { 23664 setError(data.error || data.message || "Full sync failed"); 23665 } 23666 } catch (err) { 23667 setError("Network error during full sync"); 23668 console.error("Error during full sync:", err); 23669 } finally { 23670 setIsSyncing(false); 23671 } 23672 }; 23673 const formatDate = (dateString) => { 23674 if (!dateString) return "Never";
23675 return new Date(dateString).toLocaleString("de-DE"); 23676 }; 23677 const formatDuration = (ms) => { 23678 if (ms < 1e3) return `${ms}ms`; 23679 if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`; 23680 return `${(ms / 6e4).toFixed(1)}min`; 23681 }; 23682 if (isLoading) { 23683 return /* @__PURE__ */ jsxRuntimeExports.jsx(Card, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "flex items-center justify-center p-8", children: [ 23684 /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-8 w-8 animate-spin" }), 23685 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-2", children: "Loading sync status..." }) 23686 ] }) }); 23687 } 23688 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [ 23689 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23690 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 23691 /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { className: "h-5 w-5" }), 23692 "WordPress Sync Manager" 23693 ] }) }),
23694 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [ 23695 error && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-red-50 border border-red-200 rounded-md p-4", children: [ 23696 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-red-800", children: [ 23697 /* @__PURE__ */ jsxRuntimeExports.jsx(AlertCircle, { className: "h-4 w-4" }), 23698 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium", children: "Error" }) 23699 ] }), 23700 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-red-700 mt-1", children: error }) 23701 ] }), 23702 syncStatus && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [ 23703 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 23704 /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "font-medium flex items-center gap-2", children: [
23705 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "h-4 w-4" }), 23706 "Sync Status" 23707 ] }), 23708 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [ 23709 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23710 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Last Sync:" }), 23711 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: formatDate(syncStatus.lastSyncTime) }) 23712 ] }), 23713 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23714 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Status:" }), 23715 syncStatus.needsInitialSync ? /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "text-orange-600 border-orange-200", children: "Needs Initial Sync" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "text-green-600 border-green-200", children: [
23716 /* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle, { className: "h-3 w-3 mr-1" }), 23717 "Up to Date" 23718 ] }) 23719 ] }) 23720 ] }) 23721 ] }), 23722 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 23723 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-medium", children: "Data Statistics" }), 23724 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [ 23725 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23726 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Contacts:" }), 23727 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: syncStatus.statistics.contacts?.totalRecords || 0 }) 23728 ] }), 23729 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23730 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Locations:" }),
23731 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: syncStatus.statistics.locations?.totalRecords || 0 }) 23732 ] }) 23733 ] }) 23734 ] }) 23735 ] }), 23736 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-3 pt-4 border-t", children: [ 23737 /* @__PURE__ */ jsxRuntimeExports.jsxs( 23738 Button, 23739 { 23740 onClick: performIncrementalSync, 23741 disabled: isSyncing, 23742 variant: "primary", 23743 className: "flex items-center gap-2", 23744 children: [ 23745 isSyncing ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "h-4 w-4" }), 23746 syncStatus?.needsInitialSync ? "Initial Sync" : "Incremental Sync" 23747 ] 23748 } 23749 ), 23750 /* @__PURE__ */ jsxRuntimeExports.jsxs( 23751 Button, 23752 { 23753 onClick: performFullSync, 23754 disabled: isSyncing, 23755 variant: "secondary", 23756 className: "flex items-center gap-2", 23757 children: [
23758 isSyncing ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { className: "h-4 w-4" }), 23759 "Full Sync" 23760 ] 23761 } 23762 ), 23763 /* @__PURE__ */ jsxRuntimeExports.jsx( 23764 Button, 23765 { 23766 onClick: loadSyncStatus, 23767 disabled: isLoading || isSyncing, 23768 variant: "ghost", 23769 size: "sm", 23770 children: "Refresh" 23771 } 23772 ) 23773 ] }) 23774 ] }) 23775 ] }), 23776 lastSyncResult && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23777 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 23778 /* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle, { className: "h-5 w-5 text-green-600" }), 23779 "Last Sync Result" 23780 ] }) }), 23781 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [
23782 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4", children: [ 23783 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 23784 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Locations" }), 23785 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [ 23786 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23787 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Checked:" }), 23788 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: lastSyncResult.locations.checked }) 23789 ] }), 23790 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23791 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "New:" }), 23792 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-green-600", children: lastSyncResult.locations.new }) 23793 ] }),
23794 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23795 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Updated:" }), 23796 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-blue-600", children: lastSyncResult.locations.updated }) 23797 ] }), 23798 lastSyncResult.locations.errors.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23799 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Errors:" }), 23800 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-red-600", children: lastSyncResult.locations.errors.length }) 23801 ] }) 23802 ] }) 23803 ] }), 23804 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 23805 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Contacts" }), 23806 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [
23807 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23808 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Checked:" }), 23809 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: lastSyncResult.contacts.checked }) 23810 ] }), 23811 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23812 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "New:" }), 23813 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-green-600", children: lastSyncResult.contacts.new }) 23814 ] }), 23815 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23816 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Updated:" }), 23817 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-blue-600", children: lastSyncResult.contacts.updated }) 23818 ] }), 23819 lastSyncResult.contacts.errors.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23820 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Errors:" }), 23821 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-red-600", children: lastSyncResult.contacts.errors.length }) 23822 ] }) 23823 ] }) 23824 ] }), 23825 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 23826 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Media" }), 23827 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 text-sm", children: [ 23828 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23829 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Downloaded:" }), 23830 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-green-600", children: lastSyncResult.media.downloaded }) 23831 ] }), 23832 lastSyncResult.media.errors.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [
23833 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Errors:" }), 23834 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-red-600", children: lastSyncResult.media.errors.length }) 23835 ] }), 23836 lastSyncResult.duration && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between", children: [ 23837 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Duration:" }), 23838 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono", children: formatDuration(lastSyncResult.duration) }) 23839 ] }) 23840 ] }) 23841 ] }) 23842 ] }), 23843 (lastSyncResult.locations.errors.length > 0 || lastSyncResult.contacts.errors.length > 0 || lastSyncResult.media.errors.length > 0) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 pt-4 border-t", children: [ 23844 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium text-red-600 mb-2", children: "Errors" }),
23845 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-1 text-sm", children: [...lastSyncResult.locations.errors, ...lastSyncResult.contacts.errors, ...lastSyncResult.media.errors].map((error2, index) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-red-600 font-mono text-xs bg-red-50 p-2 rounded", children: error2 }, index)) }) 23846 ] }) 23847 ] }) 23848 ] }) 23849 ] }); 23850}; 23851const AdminPage = () => { 23852 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-4 py-8", children: [ 23853 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [ 23854 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "Admin Dashboard" }), 23855 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600", children: "Manage your MEC Portfolio application" }) 23856 ] }), 23857 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8", children: [
23858 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23859 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [ 23860 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-sm font-medium", children: "Total Contacts" }), 23861 /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "h-4 w-4 text-muted-foreground" }) 23862 ] }), 23863 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [ 23864 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl font-bold", children: "Loading..." }), 23865 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Active contact entries" }) 23866 ] }) 23867 ] }), 23868 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23869 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [ 23870 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-sm font-medium", children: "Total Locations" }),
23871 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "h-4 w-4 text-muted-foreground" }) 23872 ] }), 23873 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [ 23874 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl font-bold", children: "Loading..." }), 23875 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Active locations" }) 23876 ] }) 23877 ] }), 23878 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23879 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [ 23880 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-sm font-medium", children: "Sync Status" }), 23881 /* @__PURE__ */ jsxRuntimeExports.jsx(Database, { className: "h-4 w-4 text-muted-foreground" }) 23882 ] }), 23883 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { children: [ 23884 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-2xl font-bold", children: "Active" }),
23885 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "WordPress integration" }) 23886 ] }) 23887 ] }) 23888 ] }), 23889 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 xl:grid-cols-2 gap-6", children: [ 23890 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SyncManager, {}) }), 23891 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [ 23892 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23893 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 23894 /* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "h-5 w-5" }), 23895 "System Settings" 23896 ] }) }), 23897 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
23898 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [ 23899 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 23900 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Auto Sync" }), 23901 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Automatically sync data every 15 minutes" }) 23902 ] }), 23903 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-red-100 text-red-800 px-2 py-1 rounded text-sm", children: "Disabled" }) 23904 ] }), 23905 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [ 23906 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 23907 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Rate Limiting" }), 23908 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Prevent WordPress API rate limits" }) 23909 ] }),
23910 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-100 text-green-800 px-2 py-1 rounded text-sm", children: "Active" }) 23911 ] }), 23912 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [ 23913 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 23914 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Media Downloads" }), 23915 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Download and cache contact images" }) 23916 ] }), 23917 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-100 text-green-800 px-2 py-1 rounded text-sm", children: "Active" }) 23918 ] }), 23919 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [ 23920 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 23921 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Incremental Sync" }),
23922 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Only sync changed data" }) 23923 ] }), 23924 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-green-100 text-green-800 px-2 py-1 rounded text-sm", children: "Active" }) 23925 ] }) 23926 ] }) }) 23927 ] }), 23928 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 23929 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { children: "Quick Actions" }) }), 23930 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 23931 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [ 23932 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "View Sync Logs" }), 23933 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Check detailed sync history and errors" }) 23934 ] }),
23935 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [ 23936 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Clear Cache" }), 23937 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Clear all cached media files" }) 23938 ] }), 23939 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [ 23940 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "Export Data" }), 23941 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Export contacts and locations as CSV" }) 23942 ] }), 23943 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "w-full text-left p-3 rounded-lg border hover:bg-gray-50 transition-colors", children: [
23944 /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "font-medium", children: "System Health" }), 23945 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-600", children: "Check API status and performance" }) 23946 ] }) 23947 ] }) }) 23948 ] }) 23949 ] }) 23950 ] }) 23951 ] }) }); 23952}; 23953const TestOverview = () => { 23954 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50 py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8", children: [ 23955 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [ 23956 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-gray-900 mb-4", children: "MEC Portfolio Management" }), 23957 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl text-gray-600", children: "Test-Ãbersicht für die neuen Card-Designs" }) 23958 ] }), 23959 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", children: [
23960 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden", children: [ 23961 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 bg-gradient-to-br from-blue-500 to-blue-600 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [ 23962 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "ð¢" }), 23963 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Location Cards" }) 23964 ] }) }), 23965 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [ 23966 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: 'Neue Location Cards im Design der Vorlage mit Hero-Images, Center-Statistiken und "Zum Center" Button.' }), 23967 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-6", children: [ 23968 /* @__P
23968URE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 23969 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 23970 "Hero-Image (obere Hälfte)" 23971 ] }), 23972 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 23973 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 23974 "Dunkler Content-Bereich" 23975 ] }), 23976 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 23977 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 23978 "Center-Statistiken mit Icons" 23979 ] }), 23980 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 23981 /* @__P
23981URE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 23982 "Responsive Grid Layout" 23983 ] }) 23984 ] }), 23985 /* @__PURE__ */ jsxRuntimeExports.jsxs( 23986 Link, 23987 { 23988 to: "/test/location-cards", 23989 className: "inline-flex items-center px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors", 23990 children: [ 23991 "Location Cards testen", 23992 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) }) 23993 ] 23994 } 23995 ) 23996 ] }) 23997 ] }), 23998 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden", children: [ 23999 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 bg-gradient-to-br from-pink-500 to-pink-600 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [
24000 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "ð¤" }), 24001 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Contact Cards" }) 24002 ] }) }), 24003 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [ 24004 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: "Neue Contact Cards im Design der Vorlage mit Portrait-Images, Kontaktdaten und Social Media Links." }), 24005 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-6", children: [ 24006 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 24007 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24008 "Portrait-Image (obere Hälfte)" 24009 ] }), 24010 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24011 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24012 "Heller Content-Bereich" 24013 ] }), 24014 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 24015 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24016 "Kontaktdaten mit Icons" 24017 ] }), 24018 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 24019 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24020 "XING & LinkedIn Links" 24021 ] }) 24022 ] }), 24023 /* @__PURE__ */ jsxRuntimeExports.jsxs( 24024 Link, 24025 { 24026 to: "/test/contact-cards", 24027 className: "inline-flex items-center px-4 py-2 bg-pink-600 text-white rounded-lg hover:bg-pink-700 transition-colors", 24028 children: [ 24029 "Contact Cards testen",
24030 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) }) 24031 ] 24032 } 24033 ) 24034 ] }) 24035 ] }), 24036 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden", children: [ 24037 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 bg-gradient-to-br from-red-500 to-red-600 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [ 24038 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "ð" }), 24039 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Button Styles" }) 24040 ] }) }), 24041 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [
24042 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: "MEC Button-Styles mit Helvetica Now Display Schriftart und den originalen MEC-Farben." }), 24043 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-6", children: [ 24044 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 24045 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24046 "Helvetica Now Display Font" 24047 ] }), 24048 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 24049 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24050 "MEC Farben (#d20028, #28323C)" 24051 ] }), 24052 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [
24053 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24054 "Keine Rundungen (eckiges Design)" 24055 ] }), 24056 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center text-sm text-gray-500", children: [ 24057 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 bg-green-500 rounded-full mr-2" }), 24058 "Pfeil-Icons wie im Original" 24059 ] }) 24060 ] }), 24061 /* @__PURE__ */ jsxRuntimeExports.jsxs( 24062 Link, 24063 { 24064 to: "/test/buttons", 24065 className: "inline-flex items-center px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors", 24066 children: [ 24067 "Button Styles testen", 24068 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) }) 24069 ] 24070 } 24071 ) 24072 ] }) 24073 ] }),
24074 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white rounded-lg shadow-lg overflow-hidden lg:col-span-3", children: [ 24075 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-32 bg-gradient-to-br from-gray-700 to-gray-800 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-white", children: [ 24076 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-4xl mb-2", children: "ðºï¸" }), 24077 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold", children: "Original Portfolio App" }) 24078 ] }) }), 24079 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [ 24080 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600 mb-4", children: "Die ursprüngliche Portfolio Management App mit interaktiver Karte und Ansprechpartner-Suche." }), 24081 /* @__PURE__ */ jsxRuntimeExports.jsxs( 24082 Link, 24083 { 24084 to: "/app", 24085 className: "inline-flex items-center px-4 py-2 bg-gray-700 text-white rounded-lg hover:bg-gray-800 transition-colors", 24086 children: [ 24087 "Original App öffnen",
24088 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4 ml-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M17 8l4 4m0 0l-4 4m4-4H3" }) }) 24089 ] 24090 } 24091 ) 24092 ] }) 24093 ] }) 24094 ] }), 24095 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-12 text-center text-gray-500", children: [ 24096 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm", children: [ 24097 "MEC Portfolio Management v", 24098 "1.0.0" 24099 ] }), 24100 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs mt-1", children: "Powered by React + TypeScript + Tailwind CSS" }) 24101 ] }) 24102 ] }) }); 24103}; 24104const UnifiedLocationCard = ({ 24105 location, 24106 variant = "default", 24107 onSelect, 24108 className 24109}) => { 24110 const handleSelect = () => { 24111 onSelect?.(location); 24112 }; 24113 const handleCenterClick = (e) => { 24114 e.stopPropagation(); 24115 if (location.centerLink) { 24116 window.open(location.centerLink, "_blank", "noopener,noreferrer"); 24117 } 24118 }; 24119 const getImageUrl = () => { 24120 return location.heroImage || location.image || location.logo || "/assets/placeholder-location.jpg"; 24121 }; 24122 if (variant === "compact") { 24123 return /* @__PURE__ */ jsxRuntimeExports.jsx( 24124 "div", 24125 { 24126 className: clsx( 24127 "bg-white rounded-mec border border-background-tertiary p-4 cursor-pointer", 24128 "hover:border-mec-primary/20 hover:shadow-card transition-all duration-200", 24129 className 24130 ), 24131 onClick: handleSelect, 24132 children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3", children: [
24133 location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx( 24134 "img", 24135 { 24136 src: location.logo, 24137 alt: `${location.name} Logo`, 24138 className: "w-12 h-12 object-contain rounded flex-shrink-0" 24139 } 24140 ), 24141 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 24142 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-text-primary truncate", children: location.name }), 24143 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-text-secondary truncate", children: location.city }), 24144 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-3 mt-1 text-xs text-text-muted", children: [ 24145 location.rentableArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 24146 formatMietflaeche(location.rentableArea), 24147 "m²" 24148 ] }), 24149 location.shopCount && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 24150 location.shopCount, 24151 " Shops" 24152 ] }), 24153 location.parkingSpaces && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 24154 location.parkingSpaces, 24155 " Parkplätze" 24156 ] }) 24157 ] }) 24158 ] }),
24159 location.centerLink && /* @__PURE__ */ jsxRuntimeExports.jsx( 24160 "button", 24161 { 24162 onClick: handleCenterClick, 24163 className: "text-xs bg-mec-primary text-white px-2 py-1 rounded hover:bg-mec-primary/80 transition-colors flex-shrink-0", 24164 children: "Zum Center" 24165 } 24166 ) 24167 ] }) 24168 } 24169 ); 24170 } 24171 if (variant === "detailed") { 24172 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 24173 "div", 24174 { 24175 className: clsx( 24176 "bg-white rounded-mec-lg shadow-card border border-background-tertiary overflow-hidden cursor-pointer", 24177 "hover:shadow-card-hover transition-all duration-300", 24178 className 24179 ), 24180 onClick: handleSelect, 24181 children: [ 24182 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-48", children: [ 24183 /* @__PURE__ */ jsxRuntimeExports.jsx( 24184 "img", 24185 { 24186 src: getImageUrl(), 24187 alt: location.name, 24188 className: "w-full h-full object-cover" 24189 } 24190 ),
24191 location.logo && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-4 left-4 bg-white p-2 rounded-mec shadow-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx( 24192 "img", 24193 { 24194 src: location.logo, 24195 alt: `${location.name} Logo`, 24196 className: "w-12 h-12 object-contain" 24197 } 24198 ) }) 24199 ] }), 24200 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6", children: [ 24201 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-between items-start mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1", children: [ 24202 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-xl font-bold text-text-primary mb-2", children: location.name }), 24203 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-text-secondary space-y-1", children: [ 24204 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "flex items-center", children: [
24205 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "w-4 h-4 mr-2" }), 24206 location.address 24207 ] }), 24208 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "ml-6", children: [ 24209 location.postalCode, 24210 " ", 24211 location.city 24212 ] }) 24213 ] }) 24214 ] }) }), 24215 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4 mb-4", children: [ 24216 location.rentableArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [ 24217 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Vermietbare Fläche" }), 24218 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "font-semibold text-text-primary", children: [ 24219 formatMietflaeche(location.rentableArea), 24220 "m²" 24221 ] }) 24222 ] }), 24223 location.shopCount && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [
24224 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Anzahl Shops" }), 24225 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-semibold text-text-primary", children: location.shopCount }) 24226 ] }), 24227 location.parkingSpaces && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [ 24228 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Parkplätze" }), 24229 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-semibold text-text-primary", children: location.parkingSpaces }) 24230 ] }), 24231 location.salesLevels && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background-secondary rounded-mec p-3", children: [ 24232 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-text-secondary", children: "Verkaufsebenen" }),
24233 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-semibold text-text-primary", children: location.salesLevels }) 24234 ] }) 24235 ] }), 24236 location.description && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary text-sm mb-4 line-clamp-3", children: location.description.replace(/<[^>]*>/g, "") }), 24237 (location.anchorTenants || location.catchmentAreaPopulation) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 mb-4 text-sm", children: [ 24238 location.anchorTenants && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 24239 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-secondary", children: "Ankermieter: " }), 24240 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-primary", children: location.anchorTenants }) 24241 ] }), 24242 location.catchmentAreaPopulation && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24243 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-text-secondary", children: "Einzugsgebiet: " }), 24244 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-text-primary", children: [ 24245 location.catchmentAreaPopulation.toLocaleString(), 24246 " Einwohner" 24247 ] }) 24248 ] }) 24249 ] }), 24250 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between pt-4 border-t border-background-tertiary", children: [ 24251 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-4 text-sm text-text-muted", children: [ 24252 location.openingDate && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 24253 "Eröffnet ", 24254 new Date(location.openingDate).getFullYear() 24255 ] }), 24256 location.type && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: location.type }) 24257 ] }),
24258 location.centerLink && /* @__PURE__ */ jsxRuntimeExports.jsxs( 24259 "button", 24260 { 24261 onClick: handleCenterClick, 24262 className: "btn-secondary text-sm inline-flex items-center", 24263 children: [ 24264 /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-4 h-4 mr-1" }), 24265 "Zum Center" 24266 ] 24267 } 24268 ) 24269 ] }) 24270 ] }) 24271 ] 24272 } 24273 ); 24274 } 24275 return /* @__PURE__ */ jsxRuntimeExports.jsxs( 24276 "div", 24277 { 24278 className: clsx( 24279 "bg-white rounded-mec-lg shadow-card overflow-hidden cursor-pointer", 24280 "hover:shadow-card-hover transition-all duration-300", 24281 className 24282 ), 24283 onClick: handleSelect, 24284 children: [ 24285 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-80", children: /* @__PURE__ */ jsxRuntimeExports.jsx( 24286 "img", 24287 { 24288 src: getImageUrl(), 24289 alt: location.name, 24290 className: "w-full h-full object-cover" 24291 } 24292 ) }),
24293 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-slate-700 text-white p-6 min-h-[200px] flex flex-col", children: [ 24294 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [ 24295 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-2xl font-bold mb-2 leading-tight", children: location.name }), 24296 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl text-slate-300", children: location.city }) 24297 ] }), 24298 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4 mb-6 flex-1", children: [ 24299 location.rentableArea && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 24300 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Vermietbare Fläche" }), 24301 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-lg font-semibold", children: [ 24302 formatMietflaeche(location.rentableArea), 24303 "m²" 24304 ] }) 24305 ] }), 24306 location.shopCount && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
24307 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Anzahl Shops" }), 24308 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-semibold", children: location.shopCount }) 24309 ] }), 24310 location.parkingSpaces && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 24311 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Parkplätze" }), 24312 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-semibold", children: location.parkingSpaces }) 24313 ] }), 24314 location.salesLevels && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 24315 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Verkaufsebenen" }), 24316 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-lg font-semibold", children: location.salesLevels }) 24317 ] }), 24318 location.anchorTenants && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "col-span-2", children: [
24319 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-slate-400", children: "Ankermieter" }), 24320 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium truncate", children: location.anchorTenants }) 24321 ] }) 24322 ] }), 24323 location.centerLink && /* @__PURE__ */ jsxRuntimeExports.jsxs( 24324 "button", 24325 { 24326 onClick: handleCenterClick, 24327 className: "bg-white text-slate-700 px-4 py-2 rounded-mec font-medium hover:bg-slate-100 transition-colors inline-flex items-center justify-center", 24328 children: [ 24329 /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "w-4 h-4 mr-2" }), 24330 "Zum Center" 24331 ] 24332 } 24333 ) 24334 ] }) 24335 ] 24336 } 24337 ); 24338}; 24339const LocationCard = ({ 24340 location, 24341 variant = "default", 24342 onSelect, 24343 className = "" 24344}) => { 24345 return /* @__PURE__ */ jsxRuntimeExports.jsx( 24346 UnifiedLocationCard, 24347 { 24348 location, 24349 onSelect, 24350 variant, 24351 className 24352 } 24353 ); 24354}; 24355const LocationGrid = ({ 24356 locations, 24357 onLocationSelect, 24358 className = "" 24359}) => { 24360 const [searchTerm, setSearchTerm] = reactExports.useState(""); 24361 const [selectedCity, setSelectedCity] = reactExports.useState(""); 24362 const [selectedType, setSelectedType] = reactExports.useState(""); 24363 const cities = reactExports.useMemo(() => { 24364 const citySet = new Set(locations.map((loc) => loc.city).filter(Boolean)); 24365 return Array.from(citySet).sort(); 24366 }, [locations]); 24367 const types = reactExports.useMemo(() => { 24368 const typeSet = new Set(locations.map((loc) => loc.type).filter(Boolean)); 24369 return Array.from(typeSet).sort(); 24370 }, [locations]); 24371 const filteredLocations = reactExports.useMemo(() => { 24372 return locations.filter((location) => { 24373 const matchesSearch = !searchTerm || location.name.toLowerCase().includes(searchTerm.toLowerCase()) || location.city?.toLowerCase().includes(searchTerm.toLowerCase()) || location.address?.toLowerCase().includes(searchTerm.toLowerCase()); 24374 const matchesCity = !selectedCity || location.city === selectedCity; 24375 const matchesType = !selectedType || location.type === selectedType; 24376 return matchesSearch && matchesCity && matchesType; 24377 }); 24378 }, [locations, searchTerm, selectedCity, selectedType]); 24379 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `space-y-6 ${className}`, children: [ 24380 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [
24381 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 max-w-md", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [ 24382 /* @__PURE__ */ jsxRuntimeExports.jsx( 24383 "input", 24384 { 24385 type: "text", 24386 placeholder: "Standorte durchsuchen...", 24387 value: searchTerm, 24388 onChange: (e) => setSearchTerm(e.target.value), 24389 className: "w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-blue focus:border-transparent" 24390 } 24391 ), 24392 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "h-5 w-5 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }) }) 24393 ] }) }),
24394 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [ 24395 /* @__PURE__ */ jsxRuntimeExports.jsxs( 24396 "select", 24397 { 24398 value: selectedCity, 24399 onChange: (e) => setSelectedCity(e.target.value), 24400 className: "px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-blue focus:border-transparent", 24401 children: [ 24402 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "", children: "Alle Städte" }), 24403 cities.map((city) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: city, children: city }, city)) 24404 ] 24405 } 24406 ), 24407 /* @__PURE__ */ jsxRuntimeExports.jsxs( 24408 "select", 24409 { 24410 value: selectedType, 24411 onChange: (e) => setSelectedType(e.target.value), 24412 className: "px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-mec-blue focus:border-transparent", 24413 children: [ 24414 /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "", children: "Alle Typen" }), 24415 types.map((type) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: type, children: type }, type)) 24416 ] 24417 } 24418 ) 24419 ] }) 24420 ] }), 24421 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-sm text-gray-600", children: [ 24422 filteredLocations.length, 24423 " von ", 24424 locations.length, 24425 " Standorten" 24426 ] }), 24427 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8", children: filteredLocations.map((location) => /* @__PURE__ */ jsxRuntimeExports.jsx( 24428 LocationCard, 24429 { 24430 location, 24431 onSelect: onLocationSelect, 24432 className: "h-full" 24433 }, 24434 location.id 24435 )) }), 24436 filteredLocations.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center py-12", children: [
24437 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-gray-400 mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "mx-auto h-12 w-12", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" }) }) }), 24438 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium text-gray-900 mb-2", children: "Keine Standorte gefunden" }), 24439 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-500", children: "Versuchen Sie andere Suchbegriffe oder Filter." }) 24440 ] }) 24441 ] }); 24442}; 24443const testLocations = [ 24444 { 24445 id: "1", 24446 name: "Sieben Seen Center", 24447 city: "Schwerin", 24448 address: "Platz der Freiheit 1", 24449 postalCode: "19053", 24450 country: "Deutschland", 24451 coordinates: { lat: 53.6355, lng: 11.401 }, 24452 heroImage: "https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=800&h=400&fit=crop", 24453 centerLink: "https://sieben-seen-center.de", 24454 type: "Shopping Center", 24455 wpData: { 24456 id: 1, 24457 slug: "sieben-seen-center", 24458 acf: { 24459 "center-grunddaten-vermietbare-flaeche": 26496, 24460 "center-grunddaten-anzahl-shops-fachmaerkte": 54, 24461 "center-grunddaten-verkaufsebenen": 1 24462 } 24463 }, 24464 createdAt: "2024-01-01T00:00:00Z", 24465 updatedAt: "2024-01-01T00:00:00Z" 24466 }, 24467 { 24468 id: "2", 24469 name: "Allee-Center", 24470 city: "Magdeburg", 24471 address: "Johannes-Göderitz-StraÃe 103", 24472 postalCode: "39108", 24473 country: "Deutschland", 24474 coordinates: { lat: 52.1205, lng: 11.6276 }, 24475 heroImage: "https://images.unsplash.com/photo-1555529669-e69e7aa0ba9a?w=800&h=400&fit=crop", 24476 centerLink: "https://allee-center-magdeburg.de", 24477 type: "Shopping Center", 24478 wpData: { 24479 id: 2, 24480 slug: "allee-center-magdeburg", 24481 acf: { 24482 "center-grunddaten-vermietbare-flaeche": 45e3, 24483 "center-grunddaten-anzahl-shops-fachmaerkte": 120, 24484 "center-grunddaten-verkaufsebenen": 2 24485 } 24486 }, 24487 createdAt: "2024-01-01T00:00:00Z", 24488 updatedAt: "2024-01-01T00:00:00Z" 24489 }, 24490 { 24491 id: "3", 24492 name: "Elbe Park", 24493 city: "Dresden", 24494 address: "Budapester StraÃe 25a", 24495 postalCode: "01069", 24496 country: "Deutschland", 24497 coordinates: { lat: 51.0504, lng: 13.7373 }, 24498 heroImage: "https://images.unsplash.com/photo-1519567241046-7f570eee3ce6?w=800&h=400&fit=crop", 24499 centerLink: "https://elbepark-dresden.de", 24500 type: "Shopping Center", 24501 wpData: { 24502 id: 3, 24503 slug: "elbe-park-dresden", 24504 acf: { 24505 "center-grunddaten-vermietbare-flaeche": 65e3, 24506 "center-grunddaten-anzahl-shops-fachmaerkte": 180, 24507 "center-grunddaten-verkaufsebenen": 3 24508 } 24509 }, 24510 createdAt: "2024-01-01T00:00:00Z", 24511 updatedAt: "2024-01-01T00:00:00Z" 24512 }, 24513 { 24514 id: "4", 24515 name: "Fachmarktzentrum Nord", 24516 city: "Hamburg", 24517 address: "Langenhorner Chaussee 200", 24518 postalCode: "22415", 24519 country: "Deutschland", 24520 coordinates: { lat: 53.6355, lng: 10.001 }, 24521 heroImage: "https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=800&h=400&fit=crop", 24522 centerLink: "https://fachmarktzentrum-nord.de", 24523 type: "Fachmarktzentrum", 24524 wpData: { 24525 id: 4, 24526 slug: "fachmarktzentrum-nord", 24527 acf: { 24528 "center-grunddaten-vermietbare-flaeche": 18500, 24529 "center-grunddaten-anzahl-shops-fachmaerkte": 12, 24530 "center-grunddaten-verkaufsebenen": 1 24531 } 24532 }, 24533 createdAt: "2024-01-01T00:00:00Z", 24534 updatedAt: "2024-01-01T00:00:00Z" 24535 } 24536]; 24537const LocationCardsTest = () => { 24538 const handleLocationSelect = (location) => { 24539 console.log("Selected location:", location); 24540 alert(`Location selected: ${location.name} in ${location.city}`); 24541 }; 24542 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50 py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
24543 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [ 24544 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "Location Cards Test" }), 24545 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600", children: "Test der neuen Location Cards im Design der Vorlage" }) 24546 ] }), 24547 /* @__PURE__ */ jsxRuntimeExports.jsx( 24548 LocationGrid, 24549 { 24550 locations: testLocations, 24551 onLocationSelect: handleLocationSelect 24552 } 24553 ) 24554 ] }) }); 24555}; 24556const testContacts = [ 24557 { 24558 id: "1", 24559 locationId: "1", 24560 firstName: "Tycho", 24561 lastName: "Johannsen", 24562 fullName: "Tycho Johannsen", 24563 position: "Head of Center Management Region North", 24564 department: "", 24565 email: "[email protected]", 24566 phone: "+49 (0) 4321 5577 60", 24567 image: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=500&fit=crop&crop=face", 24568 bio: "Erfahrener Center Manager mit über 15 Jahren Expertise im Einzelhandelsimmobilienmanagement.", 24569 specialties: ["Center Management", "Vermietung", "Kundenbetreuung"], 24570 languages: ["Deutsch", "Englisch", "Dänisch"], 24571 socialLinks: [ 24572 { 24573 platform: "xing", 24574 url: "https://www.xing.com/profile/Tycho_Johannsen", 24575 label: "XING Profil" 24576 }, 24577 { 24578 platform: "linkedin", 24579 url: "https://www.linkedin.com/in/tycho-johannsen", 24580 label: "LinkedIn Profil" 24581 } 24582 ], 24583 isActive: true, 24584 createdAt: "2024-01-01T00:00:00Z", 24585 updatedAt: "2024-01-01T00:00:00Z" 24586 }, 24587 { 24588 id: "2", 24589 locationId: "2", 24590 firstName: "Sarah", 24591 lastName: "Müller", 24592 fullName: "Sarah Müller", 24593 position: "Center Managerin", 24594 department: "Allee-Center Magdeburg", 24595 email: "[email protected]", 24596 phone: "+49 (0) 391 123 456", 24597 image: "https://images.unsplash.com/photo-1494790108755-2616b612b786?w=400&h=500&fit=crop&crop=face", 24598 bio: "Spezialistin für Kundenbetreuung und Vermietungsmanagement mit Fokus auf nachhaltige Centerlösungen.", 24599 specialties: ["Vermietung", "Marketing", "Nachhaltigkeit"], 24600 languages: ["Deutsch", "Englisch"], 24601 socialLinks: [ 24602 { 24603 platform: "linkedin", 24604 url: "https://www.linkedin.com/in/sarah-mueller", 24605 label: "LinkedIn Profil" 24606 } 24607 ], 24608 isActive: true, 24609 createdAt: "2024-01-01T00:00:00Z", 24610 updatedAt: "2024-01-01T00:00:00Z" 24611 }, 24612 { 24613 id: "3", 24614 locationId: "3", 24615 firstName: "Michael", 24616 lastName: "Schmidt", 24617 fullName: "Michael Schmidt", 24618 position: "Leiter Technisches Management", 24619 department: "Elbe Park Dresden", 24620 email: "[email protected]", 24621 phone: "+49 (0) 351 789 012", 24622 image: "https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=400&h=500&fit=crop&crop=face", 24623 bio: "Experte für technische Infrastruktur und Facility Management in Shopping Centern.", 24624 specialties: ["Technisches Management", "Facility Management", "Energieeffizienz"], 24625 languages: ["Deutsch", "Englisch", "Tschechisch"], 24626 socialLinks: [ 24627 { 24628 platform: "xing", 24629 url: "https://www.xing.com/profile/Michael_Schmidt", 24630 label: "XING Profil" 24631 } 24632 ], 24633 isActive: true, 24634 createdAt: "2024-01-01T00:00:00Z", 24635 updatedAt: "2024-01-01T00:00:00Z" 24636 }, 24637 { 24638 id: "4", 24639 locationId: "4", 24640 firstName: "Anna", 24641 lastName: "Weber", 24642 fullName: "Anna Weber", 24643 position: "Marketing & Events Managerin", 24644 department: "Fachmarktzentrum Nord", 24645 email: "[email protected]", 24646 phone: "+49 (0) 40 567 890", 24647 image: "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=400&h=500&fit=crop&crop=face", 24648 bio: "Kreative Marketingexpertin mit Leidenschaft für innovative Kundenerlebnisse und Events.", 24649 specialties: ["Marketing", "Event Management", "Social Media"], 24650 languages: ["Deutsch", "Englisch", "Französisch"], 24651 socialLinks: [ 24652 { 24653 platform: "linkedin", 24654 url: "https://www.linkedin.com/in/anna-weber", 24655 label: "LinkedIn Profil" 24656 }, 24657 { 24658 platform: "xing", 24659 url: "https://www.xing.com/profile/Anna_Weber", 24660 label: "XING Profil" 24661 } 24662 ], 24663 isActive: true, 24664 createdAt: "2024-01-01T00:00:00Z", 24665 updatedAt: "2024-01-01T00:00:00Z" 24666 } 24667]; 24668const ContactCardsTest = () => { 24669 const handleContactSelect = (contact) => { 24670 console.log("Selected contact:", contact); 24671 alert(`Contact selected: ${contact.fullName} - ${contact.position}`); 24672 }; 24673 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-gray-50 py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
24674 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8", children: [ 24675 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-2", children: "Contact Cards Test" }), 24676 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-gray-600", children: "Test der neuen Contact Cards im Design der Vorlage" }) 24677 ] }), 24678 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8", children: testContacts.map((contact) => /* @__PURE__ */ jsxRuntimeExports.jsx( 24679 ContactCard, 24680 { 24681 contact, 24682 onClick: handleContactSelect, 24683 className: "h-full" 24684 }, 24685 contact.id 24686 )) }) 24687 ] }) }); 24688}; 24689const ButtonTest = () => { 24690 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-background-primary p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-4xl mx-auto space-y-12", children: [ 24691 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
24692 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-text-primary mb-4 font-helvetica-now", children: "MEC Button Styles Test" }), 24693 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary", children: "Basierend auf den MEC-Designs mit Helvetica Now Display Schriftart" }) 24694 ] }), 24695 /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [ 24696 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "MEC Button Varianten" }), 24697 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6", children: [ 24698 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24699 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Primary (Dark)" }), 24700 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24701 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { size: "sm", children: "Alle Nachrichten" }), 24702 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { size: "md", children: "Alle Nachrichten" }), 24703 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { size: "lg", children: "Alle Nachrichten" }) 24704 ] }) 24705 ] }), 24706 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24707 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Secondary (Light)" }), 24708 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 24709 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { size: "sm", children: "Jetzt bewerben" }), 24710 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { size: "md", children: "Jetzt bewerben" }), 24711 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { size: "lg", children: "Jetzt bewerben" }) 24712 ] }) 24713 ] }),
24714 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24715 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Accent (Red)" }), 24716 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 24717 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { size: "sm", children: "Weitere Informationen" }), 24718 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { size: "md", children: "Weitere Informationen" }), 24719 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { size: "lg", children: "Weitere Informationen" }) 24720 ] }) 24721 ] }), 24722 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24723 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Ghost (Transparent)" }), 24724 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24725 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { size: "sm", children: "Mehr erfahren" }), 24726 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { size: "md", children: "Mehr erfahren" }), 24727 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { size: "lg", children: "Mehr erfahren" }) 24728 ] }) 24729 ] }) 24730 ] }) 24731 ] }), 24732 /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [ 24733 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "Button States" }), 24734 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [ 24735 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24736 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Normal" }), 24737 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
24738 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { children: "Alle Nachrichten" }), 24739 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { children: "Weitere Informationen" }), 24740 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { children: "Mehr erfahren" }) 24741 ] }) 24742 ] }), 24743 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24744 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Loading" }), 24745 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 24746 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { loading: true, children: "Alle Nachrichten" }), 24747 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { loading: true, children: "Weitere Informationen" }), 24748 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { loading: true, children: "Mehr erfahren" }) 24749 ] }) 24750 ] }),
24751 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24752 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-text-primary", children: "Disabled" }), 24753 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 24754 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { disabled: true, children: "Alle Nachrichten" }), 24755 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { disabled: true, children: "Weitere Informationen" }), 24756 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { disabled: true, children: "Mehr erfahren" }) 24757 ] }) 24758 ] }) 24759 ] }) 24760 ] }), 24761 /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [ 24762 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "Full Width Buttons" }), 24763 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 max-w-md", children: [
24764 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonPrimary, { fullWidth: true, children: "Alle Nachrichten" }), 24765 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonSecondary, { fullWidth: true, children: "Jetzt bewerben" }), 24766 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonAccent, { fullWidth: true, children: "Weitere Informationen" }), 24767 /* @__PURE__ */ jsxRuntimeExports.jsx(MECButtonGhost, { fullWidth: true, children: "Mehr erfahren" }) 24768 ] }) 24769 ] }), 24770 /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-8", children: [ 24771 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-text-primary font-helvetica-now", children: "Helvetica Now Display Typography" }), 24772 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 24773 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-normal text-lg text-text-primary", children: "Regular: Dies ist ein Test der Helvetica Now Display Regular Schriftart." }),
24774 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-bold text-lg text-text-primary", children: "Bold: Dies ist ein Test der Helvetica Now Display Bold Schriftart." }), 24775 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-bold text-3xl text-mec-primary", children: "GroÃe Ãberschrift in MEC Rot" }), 24776 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-helvetica-now font-bold text-2xl text-mec-secondary", children: "Mittlere Ãberschrift in MEC Grau" }) 24777 ] }) 24778 ] }) 24779 ] }) }); 24780}; 24781const router = createBrowserRouter([ 24782 { 24783 path: "/", 24784 element: /* @__PURE__ */ jsxRuntimeExports.jsx(App, {}) 24785 }, 24786 { 24787 path: "/admin", 24788 element: /* @__PURE__ */ jsxRuntimeExports.jsx(AdminPage, {}) 24789 }, 24790 { 24791 path: "/test", 24792 element: /* @__PURE__ */ jsxRuntimeExports.jsx(TestOverview, {}) 24793 }, 24794 { 24795 path: "/test/location-cards", 24796 element: /* @__PURE__ */ jsxRuntimeExports.jsx(LocationCardsTest, {}) 24797 }, 24798 { 24799 path: "/test/contact-cards", 24800 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ContactCardsTest, {}) 24801 }, 24802 { 24803 path: "/test/buttons", 24804 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ButtonTest, {}) 24805 } 24806]); 24807const AppRouter = () => { 24808 return /* @__PURE__ */ jsxRuntimeExports.jsx(RouterProvider2, { router }); 24809}; 24810var cacheEventTypes = ["added", "removed", "updated"]; 24811function isCacheEventType(eventType) { 24812 return cacheEventTypes.includes(eventType); 24813} 24814async function persistQueryClientRestore({ 24815 queryClient: queryClient2, 24816 persister, 24817 maxAge = 1e3 * 60 * 60 * 24, 24818 buster = "", 24819 hydrateOptions 24820}) { 24821 try { 24822 const persistedClient = await persister.restoreClient(); 24823 if (persistedClient) { 24824 if (persistedClient.timestamp) { 24825 const expired = Date.now() - persistedClient.timestamp > maxAge; 24826 const busted = persistedClient.buster !== buster; 24827 if (expired || busted) { 24828 return persister.removeClient(); 24829 } else { 24830 hydrate(queryClient2, persistedClient.clientState, hydrateOptions); 24831 } 24832 } else { 24833 return persister.removeClient(); 24834 } 24835 } 24836 } catch (err) { 24837 await persister.removeClient(); 24838 throw err; 24839 } 24840} 24841async function persistQueryClientSave({ 24842 queryClient: queryClient2, 24843 persister, 24844 buster = "", 24845 dehydrateOptions 24846}) { 24847 const persistClient = { 24848 buster, 24849 timestamp: Date.now(), 24850 clientState: dehydrate(queryClient2, dehydrateOptions) 24851 }; 24852 await persister.persistClient(persistClient); 24853} 24854function persistQueryClientSubscribe(props) { 24855 const unsubscribeQueryCache = props.queryClient.getQueryCache().subscribe((event) => { 24856 if (isCacheEventType(event.type)) { 24857 persistQueryClientSave(props); 24858 } 24859 }); 24860 const unsubscribeMutationCache = props.queryClient.getMutationCache().subscribe((event) => { 24861 if (isCacheEventType(event.type)) { 24862 persistQueryClientSave(props); 24863 } 24864 }); 24865 return () => { 24866 unsubscribeQueryCache(); 24867 unsubscribeMutationCache(); 24868 }; 24869} 24870function persistQueryClient(props) { 24871 let hasUnsubscribed = false; 24872 let persistQueryClientUnsubscribe; 24873 const unsubscribe = () => { 24874 hasUnsubscribed = true; 24875 persistQueryClientUnsubscribe?.(); 24876 }; 24877 const restorePromise = persistQueryClientRestore(props).then(() => { 24878 if (!hasUnsubscribed) { 24879 persistQueryClientUnsubscribe = persistQueryClientSubscribe(props); 24880 } 24881 }); 24882 return [unsubscribe, restorePromise]; 24883} 24884function noop() { 24885} 24886function createSyncStoragePersister({ 24887 storage, 24888 key = `REACT_QUERY_OFFLINE_CACHE`, 24889 throttleTime = 1e3, 24890 serialize = JSON.stringify, 24891 deserialize = JSON.parse, 24892 retry 24893}) { 24894 if (storage) { 24895 const trySave = (persistedClient) => { 24896 try { 24897 storage.setItem(key, serialize(persistedClient)); 24898 return; 24899 } catch (error) { 24900 return error; 24901 } 24902 }; 24903 return { 24904 persistClient: throttle((persistedClient) => { 24905 let client2 = persistedClient; 24906 let error = trySave(client2); 24907 let errorCount = 0; 24908 while (error && client2) { 24909 errorCount++; 24910 client2 = retry?.({ 24911 persistedClient: client2, 24912 error, 24913 errorCount 24914 }); 24915 if (client2) { 24916 error = trySave(client2); 24917 } 24918 } 24919 }, throttleTime), 24920 restoreClient: () => { 24921 const cacheString = storage.getItem(key); 24922 if (!cacheString) { 24923 return; 24924 } 24925 return deserialize(cacheString); 24926 }, 24927 removeClient: () => { 24928 storage.removeItem(key); 24929 } 24930 }; 24931 } 24932 return {
24933 persistClient: noop, 24934 restoreClient: noop, 24935 removeClient: noop 24936 }; 24937} 24938function throttle(func, wait = 100) { 24939 let timer = null; 24940 let params; 24941 return function(...args) { 24942 params = args; 24943 if (timer === null) { 24944 timer = timeoutManager.setTimeout(() => { 24945 func(...params); 24946 timer = null; 24947 }, wait); 24948 } 24949 }; 24950} 24951const isLocalStorageAvailable = () => { 24952 try { 24953 const test = "__localStorage_test__"; 24954 window.localStorage.setItem(test, test); 24955 window.localStorage.removeItem(test); 24956 return true; 24957 } catch { 24958 return false; 24959 } 24960}; 24961const localStoragePersister = isLocalStorageAvailable() ? createSyncStoragePersister({ 24962 storage: window.localStorage, 24963 key: "MEC_PORTFOLIO_CACHE", 24964 // Serialize/deserialize to handle complex data structures 24965 serialize: JSON.stringify, 24966 deserialize: JSON.parse 24967}) : null; 24968const queryClient = new QueryClient({ 24969 defaultOptions: { 24970 queries: { 24971 // Stale time: 5 minutes (data is considered fresh for 5 minutes) 24972 staleTime: 5 * 60 * 1e3, 24973 // Cache time: 24 hours (data stays in cache for 24 hours) 24974 gcTime: 24 * 60 * 60 * 1e3, 24975 // Retry failed requests 24976 retry: (failureCount, error) => { 24977 if (error?.status >= 400 && error?.status < 500) { 24978 return false; 24979 } 24980 if (error?.status === 503 && !navigator.onLine) { 24981 return false; 24982 } 24983 return failureCount < 3; 24984 }, 24985 // Don't refetch on window focus (to save bandwidth) 24986 refetchOnWindowFocus: false, 24987 // Refetch on reconnect (when internet comes back) 24988 refetchOnReconnect: true, 24989 // Network mode: offlineFirst 24990 // This allows queries to succeed with cached data even when offline 24991 networkMode: "offlineFirst" 24992 }, 24993 mutations: { 24994 // Retry mutations once 24995 retry: 1, 24996 // Network mode for mutations 24997 networkMode: "offlineFirst" 24998 } 24999 } 25000}); 25001if (localStoragePersister) { 25002 persistQueryClient({ 25003 queryClient, 25004 persister: localStoragePersister, 25005 // Maximum age of cached data: 24 hours 25006 maxAge: 24 * 60 * 60 * 1e3, 25007 // Dehydrate options - what to persist 25008 dehydrateOptions: { 25009 // Don't persist queries that have errors 25010 shouldDehydrateQuery: (query) => { 25011 return query.state.status === "success"; 25012 } 25013 } 25014 }); 25015} else { 25016 console.log("â ï¸ localStorage not available - persistence disabled (iframe mode)"); 25017} 25018const setupOnlineDetection = (onOnline, onOffline) => { 25019 const handleOnline = () => { 25020 console.log("ð¢ App is online - refetching data"); 25021 queryClient.refetchQueries(); 25022 onOnline?.(); 25023 }; 25024 const handleOffline = () => { 25025 console.log("ð´ App is offline - using cached data"); 25026 onOffline?.(); 25027 }; 25028 window.addEventListener("online", handleOnline); 25029 window.addEventListener("offline", handleOffline); 25030 return () => { 25031 window.removeEventListener("online", handleOnline); 25032 window.removeEventListener("offline", handleOffline); 25033 }; 25034}; 25035const registerServiceWorker = async () => { 25036 if (!("serviceWorker" in navigator)) { 25037 console.log("[SW] Service Workers not supported"); 25038 return; 25039 } 25040 try { 25041 const registration = await navigator.serviceWorker.register("/sw.js", { 25042 scope: "/" 25043 }); 25044 console.log("[SW] Service Worker registered successfully:", registration.scope); 25045 setInterval(() => { 25046 registration.update(); 25047 }, 60 * 60 * 1e3); 25048 registration.addEventListener("updatefound", () => { 25049 const newWorker = registration.installing; 25050 if (!newWorker) return; 25051 newWorker.addEventListener("statechange", () => { 25052 if (newWorker.state === "installed" && navigator.serviceWorker.controller) { 25053 console.log("[SW] New version available"); 25054 if (confirm("Eine neue Version ist verfügbar. Jetzt aktualisieren?")) { 25055 newWorker.postMessage({ type: "SKIP_WAITING" }); 25056 window.location.reload(); 25057 } 25058 } 25059 }); 25060 }); 25061 navigator.serviceWorker.addEventListener("controllerchange", () => { 25062 console.log("[SW] Controller changed, reloading page"); 25063 window.location.reload(); 25064 }); 25065 } catch (error) { 25066 console.error("[SW] Service Worker registration failed:", error); 25067 } 25068}; 25069setupOnlineDetection( 25070 () => { 25071 console.log("â Verbindung wiederhergestellt"); 25072 }, 25073 () => { 25074 console.log("â ï¸ Offline-Modus - Verwende gespeicherte Daten"); 25075 } 25076); 25077registerServiceWorker(); 25078class ErrorBoundary2 extends React$2.Component { 25079 constructor(props) { 25080 super(props); 25081 this.state = { hasError: false }; 25082 } 25083 static getDerivedStateFromError(error) { 25084 return { hasError: true, error }; 25085 } 25086 componentDidCatch(error, errorInfo) { 25087 console.error("MEC Portfolio Error:", error, errorInfo); 25088 } 25089 render() { 25090 if (this.state.hasError) { 25091 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen flex items-center justify-center bg-background-secondary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-8", children: [
25092 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-6xl mb-4", children: "ðµ" }), 25093 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold text-text-primary mb-2", children: "Oops! Etwas ist schiefgelaufen" }), 25094 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-text-secondary mb-4", children: "Die Anwendung konnte nicht geladen werden." }), 25095 /* @__PURE__ */ jsxRuntimeExports.jsx( 25096 "button", 25097 { 25098 onClick: () => window.location.reload(), 25099 className: "bg-mec-primary text-white px-4 py-2 rounded-mec hover:bg-mec-primary-dark transition-colors", 25100 children: "Seite neu laden" 25101 } 25102 ) 25103 ] }) }); 25104 } 25105 return this.props.children; 25106 } 25107} 25108client.createRoot(document.getElementById("root")).render( 25109 /* @__PURE__ */ jsxRuntimeExports.jsx(React$2.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary2, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(QueryClientProvider, { client: queryClient, children: [ 25110 /* @__PURE__ */ jsxRuntimeExports.jsx(AppRouter, {}), 25111 false 25112 ] }) }) }) 25113); 25114//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtRFY3SGJIRm0uanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vc3Vic2NyaWJhYmxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1jb3JlL2J1aWxkL21vZGVybi90aW1lb3V0TWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LWNvcmUvYnVpbGQvbW9kZXJuL2ZvY3VzTWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vdGhlbmFibGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LWNvcmUvYnVpbGQvbW9kZXJuL2h5ZHJhdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vbm90aWZ5TWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vb25saW5lTWFuYWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcmV0cnllci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcmVtb3ZhYmxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1jb3JlL2J1aWxkL21vZGVybi9xdWVyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcXVlcnlPYnNlcnZlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vaW5maW5pdGVRdWVyeUJlaGF2aW9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1jb3JlL2J1aWxkL21vZGVybi9tdXRhdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vbXV0YXRpb25DYWNoZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcXVlcnlDYWNoZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcXVlcnktY29yZS9idWlsZC9tb2Rlcm4vcXVlcnlDbGllbnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5L2J1aWxkL21vZGVybi9RdWVyeUNsaWVudFByb3ZpZGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS9idWlsZC9tb2Rlcm4vSXNSZXN0b3JpbmdQcm92aWRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdGFuc3RhY2svcmVhY3QtcXVlcnkvYnVpbGQvbW9kZXJuL1F1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS9idWlsZC9tb2Rlcm4vZXJyb3JCb3VuZGFyeVV0aWxzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS9idWlsZC9tb2Rlcm4vc3VzcGVuc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5L2J1aWxkL21vZGVybi91c2VCYXNlUXVlcnkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5L2J1aWxkL21vZGVybi91c2VRdWVyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXIvZGlzdC9kZXZlbG9wbWVudC9jaHVuay1OSVNIWVJJSy5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2Rpc3QvZGV2ZWxvcG1lbnQvZG9tLWV4cG9ydC5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvenVzdGFuZC9lc20vdmFuaWxsYS5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvenVzdGFuZC9lc20vaW5kZXgubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL21pZGRsZXdhcmUubWpzIiwiLi4vLi4vc3JjL3N0b3Jlcy91c2VBcHBTdG9yZS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9hcGkudHMiLCIuLi8uLi9zcmMvaG9va3MvdXNlTG9jYXRpb25zLnRzIiwiLi4vLi4vc3JjL2hvb2tzL3VzZUNvbnRhY3RzLnRzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0xvYWRpbmdTcGlubmVyLnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vZGVmYXVsdEF0dHJpYnV0ZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2NyZWF0ZUx1Y2lkZUljb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2FsZXJ0LWNpcmNsZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvYWxlcnQtdHJpYW5nbGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9idWlsZGluZy0yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jaGVjay1jaXJjbGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tZG93bi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1sZWZ0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLXJpZ2h0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLXVwLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9jbG9jay5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY3Jvc3
25114NoYWlyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZXh0ZXJuYWwtbGluay5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZ2xvYmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2dyaWQtM3gzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9ob21lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9sYXllcnMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2xpc3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2xvYWRlci0yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9tYWlsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9tYXAtcGluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9tYXAuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3Bob25lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9yZWZyZXNoLWN3LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9yb3RhdGUtY2N3LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9zZWFyY2guanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3NldHRpbmdzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy9zaG9wcGluZy1iYWcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3VzZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL3VzZXJzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdC9kaXN0L2VzbS9pY29ucy93aWZpLW9mZi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvd2lmaS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMveC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvem9vbS1pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvem9vbS1vdXQuanMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL01hcC9NYXBUb29sdGlwSGFuZGxlci50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL01hcC9NYXBIYW5kbGVyLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTWFwL01hcENvbnRyb2xzLnRzeCIsIi4uLy4uL3NyYy9hc3NldHMvbWFwLnN2ZyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL01hcC9NYXBDb250YWluZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvVW5pZmllZENvbnRhY3RDYXJkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0NvbnRhY3QvQ29udGFjdENhcmQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvQ29udGFjdC9Db250YWN0R3JpZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlHcmlkQ2FyZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9VSS9VbmlmaWVkVGFicy50c3giLCIuLi8uLi9zcmMvaG9va3MvdXNlRmlsdGVyRGF0YS50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL1ZpZXdUb2dnbGUudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvRmlsdGVyQmFyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL1NhZmVGaWx0ZXJCYXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvVW5pZmllZExpc3RWaWV3LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL01vZGFsLnRzeCIsIi4uLy4uL3NyYy91dGlscy9mb3JtYXRBcmVhLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25Nb2RhbEhlcm8udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25Nb2RhbEluZm8udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25Nb2RhbENvbnRhY3RzLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL09mZmxpbmVGYWxsYmFjay50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbkNvbnRhY3RNb2RhbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlDYXJkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0NvbnRhY3QvQ29udGFjdE1vZGFsLnRzeCIsIi4uLy4uL3NyYy9hc3NldHMvTUVDLUxvZ28uc3ZnIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTGF5b3V0L0hlYWRlci50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9MYXlvdXQvRm9vdGVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0xheW91dC9Db250YWluZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvT2ZmbGluZUluZGljYXRvci50c3giLCIuLi8uLi9zcmMvQXBwLnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy90YWlsd2luZC1tZXJnZS9kaXN0L2J1bmRsZS1tanMubWpzIiwiLi4vLi4vc3JjL3V0aWxzL2NuLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvQ2FyZC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9VSS9CdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvVUkvQmFkZ2UudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvQWRtaW4vU3luY01hbmFnZXIudHN4IiwiLi4vLi4vc3JjL3BhZ2VzL0FkbWluUGFnZS50c3giLCIuLi8uLi9zcmMvcGFnZXMvVGVzdE92ZXJ2aWV3LnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL1VJL1VuaWZpZWRMb2NhdGlvbkNhcmQudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9jYXRpb24vTG9jYXRpb25DYXJkLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0xvY2F0aW9uL0xvY2F0aW9uR3JpZC50c3giLCIuLi8uLi9zcmMvcGFnZXMvTG9jYXRpb25DYXJkc1Rlc3QudHN4IiwiLi4vLi4vc3JjL3BhZ2VzL0NvbnRhY3RDYXJkc1Rlc3QudHN4IiwiLi4vLi4vc3JjL3BhZ2VzL0J1dHRvblRlc3QudHN4IiwiLi4vLi4vc3JjL3JvdXRlci9pbmRleC50c3giLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LXBlcnNpc3QtY2xpZW50LWNvcmUvYnVpbGQvbW9kZXJuL3BlcnNpc3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHRhbnN0YWNrL3F1ZXJ5LXN5bmMtc3RvcmFnZS1wZXJzaXN0ZXIvYnVpbGQvbW9kZXJuL3V0aWxzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9xdWVyeS1zeW5jLXN0b3JhZ2UtcGVyc2lzdGVyL2J1aWxkL21vZGVybi9pbmRleC5qcyIsIi4uLy4uL3NyYy9saWIvcXVlcnlDbGllbnQudHMiLCIuLi8uLi9zcmMvbGliL3NlcnZpY2VXb3JrZXIudHMiLCIuLi8uLi9zcmMvbWFpbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aG
25114VcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBsPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLG49U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxwPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxxPVN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxyPVN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKSx0PVN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSx1PVN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLHY9U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLHc9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLHg9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIikseT1TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSx6PVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBBKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT16JiZhW3pdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9XG52YXIgQj17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sQz1PYmplY3QuYXNzaWduLEQ9e307ZnVuY3Rpb24gRShhLGIsZSl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1EO3RoaXMudXBkYXRlcj1lfHxCfUUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e307XG5FLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihhLGIpe2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJm51bGwhPWEpdGhyb3cgRXJyb3IoXCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy5cIik7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtFLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtmdW5jdGlvbiBGKCl7fUYucHJvdG90eXBlPUUucHJvdG90eXBlO2Z1bmN0aW9uIEcoYSxiLGUpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9RDt0aGlzLnVwZGF0ZXI9ZXx8Qn12YXIgSD1HLnByb3RvdHlwZT1uZXcgRjtcbkguY29uc3RydWN0b3I9RztDKEgsRS5wcm90b3R5cGUpO0guaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEk9QXJyYXkuaXNBcnJheSxKPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSz17Y3VycmVudDpudWxsfSxMPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07XG5mdW5jdGlvbiBNKGEsYixlKXt2YXIgZCxjPXt9LGs9bnVsbCxoPW51bGw7aWYobnVsbCE9Yilmb3IoZCBpbiB2b2lkIDAhPT1iLnJlZiYmKGg9Yi5yZWYpLHZvaWQgMCE9PWIua2V5JiYoaz1cIlwiK2Iua2V5KSxiKUouY2FsbChiLGQpJiYhTC5oYXNPd25Qcm9wZXJ0eShkKSYmKGNbZF09YltkXSk7dmFyIGc9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1nKWMuY2hpbGRyZW49ZTtlbHNlIGlmKDE8Zyl7Zm9yKHZhciBmPUFycmF5KGcpLG09MDttPGc7bSsrKWZbbV09YXJndW1lbnRzW20rMl07Yy5jaGlsZHJlbj1mfWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihkIGluIGc9YS5kZWZhdWx0UHJvcHMsZyl2b2lkIDA9PT1jW2RdJiYoY1tkXT1nW2RdKTtyZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEsa2V5OmsscmVmOmgscHJvcHM6Yyxfb3duZXI6Sy5jdXJyZW50fX1cbmZ1bmN0aW9uIE4oYSxiKXtyZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YixyZWY6YS5yZWYscHJvcHM6YS5wcm9wcyxfb3duZXI6YS5fb3duZXJ9fWZ1bmN0aW9uIE8oYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmYS4kJHR5cGVvZj09PWx9ZnVuY3Rpb24gZXNjYXBlKGEpe3ZhciBiPXtcIj1cIjpcIj0wXCIsXCI6XCI6XCI9MlwifTtyZXR1cm5cIiRcIithLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXX0pfXZhciBQPS9cXC8rL2c7ZnVuY3Rpb24gUShhLGIpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P2VzY2FwZShcIlwiK2Eua2V5KTpiLnRvU3RyaW5nKDM2KX1cbmZ1bmN0aW9uIFIoYSxiLGUsZCxjKXt2YXIgaz10eXBlb2YgYTtpZihcInVuZGVmaW5lZFwiPT09a3x8XCJib29sZWFuXCI9PT1rKWE9bnVsbDt2YXIgaD0hMTtpZihudWxsPT09YSloPSEwO2Vsc2Ugc3dpdGNoKGspe2Nhc2UgXCJzdHJpbmdcIjpjYXNlIFwibnVtYmVyXCI6aD0hMDticmVhaztjYXNlIFwib2JqZWN0XCI6c3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgbDpjYXNlIG46aD0hMH19aWYoaClyZXR1cm4gaD1hLGM9YyhoKSxhPVwiXCI9PT1kP1wiLlwiK1EoaCwwKTpkLEkoYyk/KGU9XCJcIixudWxsIT1hJiYoZT1hLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIiksUihjLGIsZSxcIlwiLGZ1bmN0aW9uKGEpe3JldHVybiBhfSkpOm51bGwhPWMmJihPKGMpJiYoYz1OKGMsZSsoIWMua2V5fHxoJiZoLmtleT09PWMua2V5P1wiXCI6KFwiXCIrYy5rZXkpLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIikrYSkpLGIucHVzaChjKSksMTtoPTA7ZD1cIlwiPT09ZD9cIi5cIjpkK1wiOlwiO2lmKEkoYSkpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe2s9XG5hW2ddO3ZhciBmPWQrUShrLGcpO2grPVIoayxiLGUsZixjKX1lbHNlIGlmKGY9QShhKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZilmb3IoYT1mLmNhbGwoYSksZz0wOyEoaz1hLm5leHQoKSkuZG9uZTspaz1rLnZhbHVlLGY9ZCtRKGssZysrKSxoKz1SKGssYixlLGYsYyk7ZWxzZSBpZihcIm9iamVjdFwiPT09ayl0aHJvdyBiPVN0cmluZyhhKSxFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBh
25114IFJlYWN0IGNoaWxkIChmb3VuZDogXCIrKFwiW29iamVjdCBPYmplY3RdXCI9PT1iP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYSkuam9pbihcIiwgXCIpK1wifVwiOmIpK1wiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLlwiKTtyZXR1cm4gaH1cbmZ1bmN0aW9uIFMoYSxiLGUpe2lmKG51bGw9PWEpcmV0dXJuIGE7dmFyIGQ9W10sYz0wO1IoYSxkLFwiXCIsXCJcIixmdW5jdGlvbihhKXtyZXR1cm4gYi5jYWxsKGUsYSxjKyspfSk7cmV0dXJuIGR9ZnVuY3Rpb24gVChhKXtpZigtMT09PWEuX3N0YXR1cyl7dmFyIGI9YS5fcmVzdWx0O2I9YigpO2IudGhlbihmdW5jdGlvbihiKXtpZigwPT09YS5fc3RhdHVzfHwtMT09PWEuX3N0YXR1cylhLl9zdGF0dXM9MSxhLl9yZXN1bHQ9Yn0sZnVuY3Rpb24oYil7aWYoMD09PWEuX3N0YXR1c3x8LTE9PT1hLl9zdGF0dXMpYS5fc3RhdHVzPTIsYS5fcmVzdWx0PWJ9KTstMT09PWEuX3N0YXR1cyYmKGEuX3N0YXR1cz0wLGEuX3Jlc3VsdD1iKX1pZigxPT09YS5fc3RhdHVzKXJldHVybiBhLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBhLl9yZXN1bHQ7fVxudmFyIFU9e2N1cnJlbnQ6bnVsbH0sVj17dHJhbnNpdGlvbjpudWxsfSxXPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOlUsUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6VixSZWFjdEN1cnJlbnRPd25lcjpLfTtmdW5jdGlvbiBYKCl7dGhyb3cgRXJyb3IoXCJhY3QoLi4uKSBpcyBub3Qgc3VwcG9ydGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzIG9mIFJlYWN0LlwiKTt9XG5leHBvcnRzLkNoaWxkcmVuPXttYXA6Uyxmb3JFYWNoOmZ1bmN0aW9uKGEsYixlKXtTKGEsZnVuY3Rpb24oKXtiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZSl9LGNvdW50OmZ1bmN0aW9uKGEpe3ZhciBiPTA7UyhhLGZ1bmN0aW9uKCl7YisrfSk7cmV0dXJuIGJ9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIFMoYSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pfHxbXX0sb25seTpmdW5jdGlvbihhKXtpZighTyhhKSl0aHJvdyBFcnJvcihcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiKTtyZXR1cm4gYX19O2V4cG9ydHMuQ29tcG9uZW50PUU7ZXhwb3J0cy5GcmFnbWVudD1wO2V4cG9ydHMuUHJvZmlsZXI9cjtleHBvcnRzLlB1cmVDb21wb25lbnQ9RztleHBvcnRzLlN0cmljdE1vZGU9cTtleHBvcnRzLlN1c3BlbnNlPXc7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVc7ZXhwb3J0cy5hY3Q9WDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGEsYixlKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiK2ErXCIuXCIpO3ZhciBkPUMoe30sYS5wcm9wcyksYz1hLmtleSxrPWEucmVmLGg9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihrPWIucmVmLGg9Sy5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGM9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGYgaW4gYilKLmNhbGwoYixmKSYmIUwuaGFzT3duUHJvcGVydHkoZikmJihkW2ZdPXZvaWQgMD09PWJbZl0mJnZvaWQgMCE9PWc/Z1tmXTpiW2ZdKX12YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZC5jaGlsZHJlbj1lO2Vsc2UgaWYoMTxmKXtnPUFycmF5KGYpO1xuZm9yKHZhciBtPTA7bTxmO20rKylnW21dPWFyZ3VtZW50c1ttKzJdO2QuY2hpbGRyZW49Z31yZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YyxyZWY6ayxwcm9wczpkLF9vd25lcjpofX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEpe2E9eyQkdHlwZW9mOnUsX2N1cnJlbnRWYWx1ZTphLF9jdXJyZW50VmFsdWUyOmEsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfTthLlByb3ZpZGVyPXskJHR5cGVvZjp0LF9jb250ZXh0OmF9O3JldHVybiBhLkNvbnN1bWVyPWF9O2V4cG9ydHMuY3JlYXRlRWxlbWVudD1NO2V4cG9ydHMuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihhKXt2YXIgYj1NLmJpbmQobnVsbCxhKTtiLnR5cGU9YTtyZXR1cm4gYn07ZXhwb3J0cy5jcmVhdGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsfX07XG5leHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnYscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PU87ZXhwb3J0cy5sYXp5PWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp5LF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6YX0sX2luaXQ6VH19O2V4cG9ydHMubWVtbz1mdW5jdGlvbihhLGIpe3JldHVybnskJHR5cGVvZjp4LHR5cGU6YSxjb21wYXJlOnZvaWQgMD09PWI/bnVsbDpifX07ZXhwb3J0cy5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9Vi50cmFuc2l0aW9uO1YudHJhbnNpdGlvbj17fTt0cnl7YSgpfWZpbmFsbHl7Vi50cmFuc2l0aW9uPWJ9fTtleHBvcnRzLnVuc3RhYmxlX2FjdD1YO2V4cG9ydHMudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNhbGxiYWNrKGEsYil9O2V4cG9ydHMudXNlQ29udGV4dD1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNvbnRleHQoYSl9O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VEZWZlcnJlZFZhbHVlKGEpfTtleHBvcnRzLnVzZUVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlRWZmZWN0KGEsYil9O2V4cG9ydHMudXNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gVS5jdXJyZW50LnVzZUlkKCl9O2V4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIFUuY3VycmVudC51c2VJbXBlcmF0aXZlSGFuZGxlKGEsYixlKX07ZXhwb3J0cy51c2VJbnNlcnRpb25
25114FZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGEsYil9O1xuZXhwb3J0cy51c2VNZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFUuY3VycmVudC51c2VNZW1vKGEsYil9O2V4cG9ydHMudXNlUmVkdWNlcj1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIFUuY3VycmVudC51c2VSZWR1Y2VyKGEsYixlKX07ZXhwb3J0cy51c2VSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VSZWYoYSl9O2V4cG9ydHMudXNlU3RhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFUuY3VycmVudC51c2VTdGF0ZShhKX07ZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihhLGIsZSl7cmV0dXJuIFUuY3VycmVudC51c2VTeW5jRXh0ZXJuYWxTdG9yZShhLGIsZSl9O2V4cG9ydHMudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBVLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtleHBvcnRzLnZlcnNpb249XCIxOC4zLjFcIjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBmPXJlcXVpcmUoXCJyZWFjdFwiKSxrPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLGw9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxuPWYuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIscD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O1xuZnVuY3Rpb24gcShjLGEsZyl7dmFyIGIsZD17fSxlPW51bGwsaD1udWxsO3ZvaWQgMCE9PWcmJihlPVwiXCIrZyk7dm9pZCAwIT09YS5rZXkmJihlPVwiXCIrYS5rZXkpO3ZvaWQgMCE9PWEucmVmJiYoaD1hLnJlZik7Zm9yKGIgaW4gYSltLmNhbGwoYSxiKSYmIXAuaGFzT3duUHJvcGVydHkoYikmJihkW2JdPWFbYl0pO2lmKGMmJmMuZGVmYXVsdFByb3BzKWZvcihiIGluIGE9Yy5kZWZhdWx0UHJvcHMsYSl2b2lkIDA9PT1kW2JdJiYoZFtiXT1hW2JdKTtyZXR1cm57JCR0eXBlb2Y6ayx0eXBlOmMsa2V5OmUscmVmOmgscHJvcHM6ZCxfb3duZXI6bi5jdXJyZW50fX1leHBvcnRzLkZyYWdtZW50PWw7ZXhwb3J0cy5qc3g9cTtleHBvcnRzLmpzeHM9cTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0JztmdW5jdGlvbiBmKGEsYil7dmFyIGM9YS5sZW5ndGg7YS5wdXNoKGIpO2E6Zm9yKDswPGM7KXt2YXIgZD1jLTE+Pj4xLGU9YVtkXTtpZigwPGcoZSxiKSlhW2RdPWIsYVtjXT1lLGM9ZDtlbHNlIGJyZWFrIGF9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD9udWxsOmFbMF19ZnVuY3Rpb24gayhhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGI9YVswXSxjPWEucG9wKCk7aWYoYyE9PWIpe2FbMF09YzthOmZvcih2YXIgZD0wLGU9YS5sZW5ndGgsdz1lPj4+MTtkPHc7KXt2YXIgbT0yKihkKzEpLTEsQz1hW21dLG49bSsxLHg9YVtuXTtpZigwPmcoQyxjKSluPGUmJjA+Zyh4LEMpPyhhW2RdPXgsYVtuXT1jLGQ9bik6KGFbZF09QyxhW21dPWMsZD1tKTtlbHNlIGlmKG48ZSYmMD5nKHgsYykpYVtkXT14LGFbbl09YyxkPW47ZWxzZSBicmVhayBhfX1yZXR1cm4gYn1cbmZ1bmN0aW9uIGcoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9aWYoXCJvYmplY3RcIj09PXR5cGVvZiBwZXJmb3JtYW5jZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIGw9cGVyZm9ybWFuY2U7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gbC5ub3coKX19ZWxzZXt2YXIgcD1EYXRlLHE9cC5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBwLm5vdygpLXF9fXZhciByPVtdLHQ9W10sdT0xLHY9bnVsbCx5PTMsej0hMSxBPSExLEI9ITEsRD1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om51bGwsRT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpudWxsLEY9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZXRJbW1lZGlhdGU/c2V0SW1tZWRpYXRlOm51bGw7XG5cInVuZGVmaW5lZFwiIT09dHlwZW9mIG5hdmlnYXRvciYmdm9pZCAwIT09bmF2aWdhdG9yLnNjaGVkdWxpbmcmJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTtmdW5jdGlvbiBHKGEpe2Zvcih2YXIgYj1oKHQpO251bGwhPT1iOyl7aWYobnVsbD09PWIuY2FsbGJhY2spayh0KTtlbHNlIGlmKGIuc3RhcnRUaW1lPD1hKWsodCksYi5zb3J0SW5kZXg9Yi5leHBpcmF0aW9uVGltZSxmKHIsYik7ZWxzZSBicmVhaztiPWgodCl9fWZ1bmN0aW9uIEgoYSl7Qj0hMTtHKGEpO2lmKCFBKWlmKG51bGwhPT1oKHIpKUE9ITAsSShKKTtlbHNle3ZhciBiPWgodCk7bnVsbCE9PWImJksoSCxiLnN0YXJ0VGltZS1hKX19XG5mdW5jdGlvbiBKKGEsYil7QT0hMTtCJiYoQj0hMSxFKEwpLEw9LTEpO3o9ITA7dmFyIGM9eTt0cnl7RyhiKTtmb3Iodj1oKHIpO251bGwhPT12JiYoISh2LmV4cGlyYXRpb25UaW1lPmIpfHxhJiYhTSgpKTspe3ZhciBkPXYuY2FsbGJhY2s7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3YuY2FsbGJhY2s9bnVsbDt5PXYucHJpb3JpdHlM
25114ZXZlbDt2YXIgZT1kKHYuZXhwaXJhdGlvblRpbWU8PWIpO2I9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZT92LmNhbGxiYWNrPWU6dj09PWgocikmJmsocik7RyhiKX1lbHNlIGsocik7dj1oKHIpfWlmKG51bGwhPT12KXZhciB3PSEwO2Vsc2V7dmFyIG09aCh0KTtudWxsIT09bSYmSyhILG0uc3RhcnRUaW1lLWIpO3c9ITF9cmV0dXJuIHd9ZmluYWxseXt2PW51bGwseT1jLHo9ITF9fXZhciBOPSExLE89bnVsbCxMPS0xLFA9NSxRPS0xO1xuZnVuY3Rpb24gTSgpe3JldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpLVE8UD8hMTohMH1mdW5jdGlvbiBSKCl7aWYobnVsbCE9PU8pe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7UT1hO3ZhciBiPSEwO3RyeXtiPU8oITAsYSl9ZmluYWxseXtiP1MoKTooTj0hMSxPPW51bGwpfX1lbHNlIE49ITF9dmFyIFM7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEYpUz1mdW5jdGlvbigpe0YoUil9O2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIFQ9bmV3IE1lc3NhZ2VDaGFubmVsLFU9VC5wb3J0MjtULnBvcnQxLm9ubWVzc2FnZT1SO1M9ZnVuY3Rpb24oKXtVLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIFM9ZnVuY3Rpb24oKXtEKFIsMCl9O2Z1bmN0aW9uIEkoYSl7Tz1hO058fChOPSEwLFMoKSl9ZnVuY3Rpb24gSyhhLGIpe0w9RChmdW5jdGlvbigpe2EoZXhwb3J0cy51bnN0YWJsZV9ub3coKSl9LGIpfVxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NTtleHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7ZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eT00O2V4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MztleHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2V4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MjtleHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKGEpe2EuY2FsbGJhY2s9bnVsbH07ZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe0F8fHp8fChBPSEwLEkoSikpfTtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oYSl7MD5hfHwxMjU8YT9jb25zb2xlLmVycm9yKFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkXCIpOlA9MDxhP01hdGguZmxvb3IoMUUzL2EpOjV9O2V4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4geX07ZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBoKHIpfTtleHBvcnRzLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oYSl7c3dpdGNoKHkpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBiPTM7YnJlYWs7ZGVmYXVsdDpiPXl9dmFyIGM9eTt5PWI7dHJ5e3JldHVybiBhKCl9ZmluYWxseXt5PWN9fTtleHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPXk7eT1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7eT1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yz8oYz1jLmRlbGF5LGM9XCJudW1iZXJcIj09PXR5cGVvZiBjJiYwPGM/ZCtjOmQpOmM9ZDtzd2l0Y2goYSl7Y2FzZSAxOnZhciBlPS0xO2JyZWFrO2Nhc2UgMjplPTI1MDticmVhaztjYXNlIDU6ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDplPTFFNDticmVhaztkZWZhdWx0OmU9NUUzfWU9YytlO2E9e2lkOnUrKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6YyxleHBpcmF0aW9uVGltZTplLHNvcnRJbmRleDotMX07Yz5kPyhhLnNvcnRJbmRleD1jLGYodCxhKSxudWxsPT09aChyKSYmYT09PWgodCkmJihCPyhFKEwpLEw9LTEpOkI9ITAsSyhILGMtZCkpKTooYS5zb3J0SW5kZXg9ZSxmKHIsYSksQXx8enx8KEE9ITAsSShKKSkpO3JldHVybiBhfTtcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQ9TTtleHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj15O3JldHVybiBmdW5jdGlvbigpe3ZhciBjPXk7eT1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXt5PWN9fX07XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8qXG4gTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4qL1xuJ3VzZSBzdHJpY3QnO3ZhciBhYT1yZXF1aXJlKFwicmVhY3RcIiksY2E9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiBwKGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifXZhciBkYT1uZXcgU2V0LGVhPXt9O2Z1bmN0aW9uIGZ
25114hKGEsYil7aGEoYSxiKTtoYShhK1wiQ2FwdHVyZVwiLGIpfVxuZnVuY3Rpb24gaGEoYSxiKXtlYVthXT1iO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspZGEuYWRkKGJbYV0pfVxudmFyIGlhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxqYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGthPS9eWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokLyxsYT1cbnt9LG1hPXt9O2Z1bmN0aW9uIG9hKGEpe2lmKGphLmNhbGwobWEsYSkpcmV0dXJuITA7aWYoamEuY2FsbChsYSxhKSlyZXR1cm4hMTtpZihrYS50ZXN0KGEpKXJldHVybiBtYVthXT0hMDtsYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBwYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIHFhKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fHBhKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gdihhLGIsYyxkLGUsZixnKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zjt0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWd9dmFyIHo9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwwLCExLGEsbnVsbCwhMSwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07eltiXT1uZXcgdihiLDEsITEsYVsxXSxudWxsLCExLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwyLCExLGEsbnVsbCwhMSwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBkaXNhYmxlUmVtb3RlUGxheWJhY2sgZm9ybU5vVmFsaWRhdGUgaGlkZGVuIGxvb3Agbm9Nb2R1bGUgbm9WYWxpZGF0ZSBvcGVuIHBsYXlzSW5saW5lIHJlYWRPbmx5IHJlcXVpcmVkIHJldmVyc2VkIHNjb3BlZCBzZWFtbGVzcyBpdGVtU2NvcGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsMywhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtcbltcImNoZWNrZWRcIixcIm11bHRpcGxlXCIsXCJtdXRlZFwiLFwic2VsZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsMywhMCxhLG51bGwsITEsITEpfSk7W1wiY2FwdHVyZVwiLFwiZG93bmxvYWRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt6W2FdPW5ldyB2KGEsNCwhMSxhLG51bGwsITEsITEpfSk7W1wiY29sc1wiLFwicm93c1wiLFwic2l6ZVwiLFwic3BhblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSw2LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJyb3dTcGFuXCIsXCJzdGFydFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSw1LCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciByYT0vW1xcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHNhKGEpe3JldHVybiBhWzFdLnRvVXBwZXJDYXNlKCl9XG5cImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbn
25114RhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHJhLFxuc2EpO3pbYl09bmV3IHYoYiwxLCExLGEsbnVsbCwhMSwhMSl9KTtcInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShyYSxzYSk7eltiXT1uZXcgdihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMSwhMSl9KTtbXCJ4bWw6YmFzZVwiLFwieG1sOmxhbmdcIixcInhtbDpzcGFjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShyYSxzYSk7eltiXT1uZXcgdihiLDEsITEsYSxcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLCExLCExKX0pO1tcInRhYkluZGV4XCIsXCJjcm9zc09yaWdpblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuei54bGlua0hyZWY9bmV3IHYoXCJ4bGlua0hyZWZcIiwxLCExLFwieGxpbms6aHJlZlwiLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCEwLCExKTtbXCJzcmNcIixcImhyZWZcIixcImFjdGlvblwiLFwiZm9ybUFjdGlvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHYoYSwxLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO1xuZnVuY3Rpb24gdGEoYSxiLGMsZCl7dmFyIGU9ei5oYXNPd25Qcm9wZXJ0eShiKT96W2JdOm51bGw7aWYobnVsbCE9PWU/MCE9PWUudHlwZTpkfHwhKDI8Yi5sZW5ndGgpfHxcIm9cIiE9PWJbMF0mJlwiT1wiIT09YlswXXx8XCJuXCIhPT1iWzFdJiZcIk5cIiE9PWJbMV0pcWEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP29hKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKX1cbnZhciB1YT1hYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCx2YT1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSx3YT1TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLHlhPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSx6YT1TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksQWE9U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLEJhPVN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKSxDYT1TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxEYT1TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksRWE9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLEZhPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLEdhPVN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLEhhPVN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKTtTeW1ib2wuZm9yKFwicmVhY3QuZGVidWdfdHJhY2VfbW9kZVwiKTtcbnZhciBJYT1TeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5sZWdhY3lfaGlkZGVuXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5jYWNoZVwiKTtTeW1ib2wuZm9yKFwicmVhY3QudHJhY2luZ19tYXJrZXJcIik7dmFyIEphPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBLYShhKXtpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhKXJldHVybiBudWxsO2E9SmEmJmFbSmFdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9dmFyIEE9T2JqZWN0LmFzc2lnbixMYTtmdW5jdGlvbiBNYShhKXtpZih2b2lkIDA9PT1MYSl0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goYyl7dmFyIGI9Yy5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtMYT1iJiZiWzFdfHxcIlwifXJldHVyblwiXFxuXCIrTGErYX12YXIgTmE9ITE7XG5mdW5jdGlvbiBPYShhLGIpe2lmKCFhfHxOYSlyZXR1cm5cIlwiO05hPSEwO3ZhciBjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoYilpZihiPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSxcInByb3BzXCIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fX0pLFwib2JqZWN0XCI9PT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChiLFtdKX1jYXRjaChsKXt2YXIgZD1sfVJlZmxlY3QuY29uc3RydWN0KGEsW10sYil9ZWxzZXt0cnl7Yi5jYWxsKCl9Y2F0Y2gobCl7ZD1sfWEuY2FsbChiLnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2gobCl7ZD1sfWEoKX19Y2F0Y2gobCl7aWYobCYmZCYmXCJzdHJpbmdcIj09PXR5cGVvZiBsLnN0YWNrKXtmb3IodmFyIGU9bC5zdGFjay5zcGxpdChcIlxcblwiKSxcbmY9ZC5zdGFjay5zcGxpdChcIlxcblwiKSxnPWUubGVuZ3RoLTEsaD1mLmxlbmd0aC0xOzE8PWcmJjA8PWgmJmVbZ10hPT1mW2hdOyloLS07Zm9yKDsxPD1nJiYwPD1oO2ctLSxoLS0paWYoZVtnXSE9PWZbaF0pe2lmKDEhPT1nfHwxIT09aCl7ZG8gaWYoZy0tLGgtLSwwPmh8fGVbZ10hPT1mW2hdKXt2YXIgaz1cIlxcblwiK2VbZ10ucmVwbGFjZShcIiBhdCBuZXcgXCIsXCIgYXQgXCIpO2EuZGlzcGxheU5hbWUmJmsuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSYmKGs9ay5yZXBsYWNlKFwiPGFub255bW91cz5cIixhLmRpc3BsYXlOYW1lKSk7cmV0dXJuIGt9d2hpbGUoMTw9ZyYmMDw9aCl9YnJlYWt9fX1maW5hbGx5e05hPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWN9cmV0dXJuKGE9YT9hLmRpc3BsYXlOYW1lfHxhLm5hbWU6XCJcIik/TWEoYSk6XCJcIn1cbmZ1bmN0aW9uIFBhKGEpe3N3aXRjaC
25114hhLnRhZyl7Y2FzZSA1OnJldHVybiBNYShhLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIE1hKFwiTGF6eVwiKTtjYXNlIDEzOnJldHVybiBNYShcIlN1c3BlbnNlXCIpO2Nhc2UgMTk6cmV0dXJuIE1hKFwiU3VzcGVuc2VMaXN0XCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gYT1PYShhLnR5cGUsITEpLGE7Y2FzZSAxMTpyZXR1cm4gYT1PYShhLnR5cGUucmVuZGVyLCExKSxhO2Nhc2UgMTpyZXR1cm4gYT1PYShhLnR5cGUsITApLGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFFhKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGEuZGlzcGxheU5hbWV8fGEubmFtZXx8bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7c3dpdGNoKGEpe2Nhc2UgeWE6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2Ugd2E6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIEFhOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIHphOnJldHVyblwiU3RyaWN0TW9kZVwiO2Nhc2UgRWE6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgRmE6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIn1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQ2E6cmV0dXJuKGEuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgQmE6cmV0dXJuKGEuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgRGE6dmFyIGI9YS5yZW5kZXI7YT1hLmRpc3BsYXlOYW1lO2F8fChhPWIuZGlzcGxheU5hbWV8fFxuYi5uYW1lfHxcIlwiLGE9XCJcIiE9PWE/XCJGb3J3YXJkUmVmKFwiK2ErXCIpXCI6XCJGb3J3YXJkUmVmXCIpO3JldHVybiBhO2Nhc2UgR2E6cmV0dXJuIGI9YS5kaXNwbGF5TmFtZXx8bnVsbCxudWxsIT09Yj9iOlFhKGEudHlwZSl8fFwiTWVtb1wiO2Nhc2UgSGE6Yj1hLl9wYXlsb2FkO2E9YS5faW5pdDt0cnl7cmV0dXJuIFFhKGEoYikpfWNhdGNoKGMpe319cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBSYShhKXt2YXIgYj1hLnR5cGU7c3dpdGNoKGEudGFnKXtjYXNlIDI0OnJldHVyblwiQ2FjaGVcIjtjYXNlIDk6cmV0dXJuKGIuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Db25zdW1lclwiO2Nhc2UgMTA6cmV0dXJuKGIuX2NvbnRleHQuZGlzcGxheU5hbWV8fFwiQ29udGV4dFwiKStcIi5Qcm92aWRlclwiO2Nhc2UgMTg6cmV0dXJuXCJEZWh5ZHJhdGVkRnJhZ21lbnRcIjtjYXNlIDExOnJldHVybiBhPWIucmVuZGVyLGE9YS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxcIlwiLGIuZGlzcGxheU5hbWV8fChcIlwiIT09YT9cIkZvcndhcmRSZWYoXCIrYStcIilcIjpcIkZvcndhcmRSZWZcIik7Y2FzZSA3OnJldHVyblwiRnJhZ21lbnRcIjtjYXNlIDU6cmV0dXJuIGI7Y2FzZSA0OnJldHVyblwiUG9ydGFsXCI7Y2FzZSAzOnJldHVyblwiUm9vdFwiO2Nhc2UgNjpyZXR1cm5cIlRleHRcIjtjYXNlIDE2OnJldHVybiBRYShiKTtjYXNlIDg6cmV0dXJuIGI9PT16YT9cIlN0cmljdE1vZGVcIjpcIk1vZGVcIjtjYXNlIDIyOnJldHVyblwiT2Zmc2NyZWVuXCI7XG5jYXNlIDEyOnJldHVyblwiUHJvZmlsZXJcIjtjYXNlIDIxOnJldHVyblwiU2NvcGVcIjtjYXNlIDEzOnJldHVyblwiU3VzcGVuc2VcIjtjYXNlIDE5OnJldHVyblwiU3VzcGVuc2VMaXN0XCI7Y2FzZSAyNTpyZXR1cm5cIlRyYWNpbmdNYXJrZXJcIjtjYXNlIDE6Y2FzZSAwOmNhc2UgMTc6Y2FzZSAyOmNhc2UgMTQ6Y2FzZSAxNTppZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYi5kaXNwbGF5TmFtZXx8Yi5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYilyZXR1cm4gYn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYShhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwidW5kZWZpbmVkXCI6cmV0dXJuIGE7Y2FzZSBcIm9iamVjdFwiOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuXCJcIn19XG5mdW5jdGlvbiBUYShhKXt2YXIgYj1hLnR5cGU7cmV0dXJuKGE9YS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWEudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWJ8fFwicmFkaW9cIj09PWIpfVxuZnVuY3Rpb24gVWEoYSl7dmFyIGI9VGEoYSk/XCJjaGVja2VkXCI6XCJ2YWx1ZVwiLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxiKSxkPVwiXCIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5nZXQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnNldCl7dmFyIGU9Yy5nZXQsZj1jLnNldDtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEpe2Q9XCJcIithO2YuY2FsbCh0aGlzLGEpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6Yy5lbnVtZXJhYmxlfSk7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9XCJcIithfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXthLl92YWx1ZVRyYWNrZXI9XG5udWxsO2RlbGV0ZSBhW2JdfX19fWZ1bmN0aW9uIFZhKGEpe2EuX3ZhbHVlVHJhY2tlcnx8KGEuX3ZhbHVlVHJhY2tlcj1VYShhKSl9ZnVuY3Rpb24gV2EoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS5fdmFsdWVUcmFja2VyO2lmKCFiKXJldHVybiEwO3ZhciBjPWIuZ2V0VmFsdWUoKTt2YXIgZD1cIlwiO2EmJihkPVRhKGEpP2EuY2hlY2tlZD9cInRydWVcIjpcImZhbHNlXCI6YS52YWx1ZSk7YT1kO3JldHVybiBhIT09Yz8oYi5zZXRWYWx1ZShhKSwhMCk6ITF9ZnVuY3Rpb24gWGEoYSl7YT1hfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fVxuZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1iLmNoZWNrZWQ7cmV0dXJuIEEoe30sYix7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bnVsbCE9Yz9jOmEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIFphKGEsYil7dmFyIGM9bnVsbD09Yi5kZWZhdWx0VmFsdWU/XCJcIjpiLmRlZmF1bHRWYWx1ZSxkPW51bGwhPWIuY2hlY2tlZD9iLmNoZWNrZWQ6Yi5kZWZhdWx0Q2hlY2tlZDtjPVNhKG51bGwhPWIudmFsdWU/Yi52YWx1ZTpjKTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOmQsaW5pdGlhbFZhbHVlOmMsY29udHJvbGxlZDpcImNoZWNrYm94XCI9PT1iLnR5cGV8fFwicmFkaW9cIj09PWIudHlwZT9udWxsIT1iLmNoZWNrZWQ6bnVsbCE9Yi52YWx1ZX19ZnVuY3Rpb24gYWIoYSxiKXtiPWIuY2hlY2tlZDtudWxsIT1iJiZ0YShhLFwiY2hlY2tlZFwiLGIsITEpfVxuZnVuY3Rpb24gYmIoYSxiKXthYihhLGIpO3ZhciBjPVNhKGIudmFsdWUpLGQ9Yi50eXBlO2lmKG51bGwhPWMpaWYoXCJudW1iZXJcIj09PWQpe2lmK
25114DA9PT1jJiZcIlwiPT09YS52YWx1ZXx8YS52YWx1ZSE9YylhLnZhbHVlPVwiXCIrY31lbHNlIGEudmFsdWUhPT1cIlwiK2MmJihhLnZhbHVlPVwiXCIrYyk7ZWxzZSBpZihcInN1Ym1pdFwiPT09ZHx8XCJyZXNldFwiPT09ZCl7YS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtyZXR1cm59Yi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpP2NiKGEsYi50eXBlLGMpOmIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikmJmNiKGEsYi50eXBlLFNhKGIuZGVmYXVsdFZhbHVlKSk7bnVsbD09Yi5jaGVja2VkJiZudWxsIT1iLmRlZmF1bHRDaGVja2VkJiYoYS5kZWZhdWx0Q2hlY2tlZD0hIWIuZGVmYXVsdENoZWNrZWQpfVxuZnVuY3Rpb24gZGIoYSxiLGMpe2lmKGIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKXx8Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSl7dmFyIGQ9Yi50eXBlO2lmKCEoXCJzdWJtaXRcIiE9PWQmJlwicmVzZXRcIiE9PWR8fHZvaWQgMCE9PWIudmFsdWUmJm51bGwhPT1iLnZhbHVlKSlyZXR1cm47Yj1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7Y3x8Yj09PWEudmFsdWV8fChhLnZhbHVlPWIpO2EuZGVmYXVsdFZhbHVlPWJ9Yz1hLm5hbWU7XCJcIiE9PWMmJihhLm5hbWU9XCJcIik7YS5kZWZhdWx0Q2hlY2tlZD0hIWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcIlwiIT09YyYmKGEubmFtZT1jKX1cbmZ1bmN0aW9uIGNiKGEsYixjKXtpZihcIm51bWJlclwiIT09Ynx8WGEoYS5vd25lckRvY3VtZW50KSE9PWEpbnVsbD09Yz9hLmRlZmF1bHRWYWx1ZT1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6YS5kZWZhdWx0VmFsdWUhPT1cIlwiK2MmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2MpfXZhciBlYj1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gZmIoYSxiLGMsZCl7YT1hLm9wdGlvbnM7aWYoYil7Yj17fTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyliW1wiJFwiK2NbZV1dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZT1iLmhhc093blByb3BlcnR5KFwiJFwiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz1cIlwiK1NhKGMpO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1udWxsIT09Ynx8YVtlXS5kaXNhYmxlZHx8KGI9YVtlXSl9bnVsbCE9PWImJihiLnNlbGVjdGVkPSEwKX19XG5mdW5jdGlvbiBnYihhLGIpe2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IocCg5MSkpO3JldHVybiBBKHt9LGIse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOlwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGhiKGEsYil7dmFyIGM9Yi52YWx1ZTtpZihudWxsPT1jKXtjPWIuY2hpbGRyZW47Yj1iLmRlZmF1bHRWYWx1ZTtpZihudWxsIT1jKXtpZihudWxsIT1iKXRocm93IEVycm9yKHAoOTIpKTtpZihlYihjKSl7aWYoMTxjLmxlbmd0aCl0aHJvdyBFcnJvcihwKDkzKSk7Yz1jWzBdfWI9Y31udWxsPT1iJiYoYj1cIlwiKTtjPWJ9YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6U2EoYyl9fVxuZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1TYShiLnZhbHVlKSxkPVNhKGIuZGVmYXVsdFZhbHVlKTtudWxsIT1jJiYoYz1cIlwiK2MsYyE9PWEudmFsdWUmJihhLnZhbHVlPWMpLG51bGw9PWIuZGVmYXVsdFZhbHVlJiZhLmRlZmF1bHRWYWx1ZSE9PWMmJihhLmRlZmF1bHRWYWx1ZT1jKSk7bnVsbCE9ZCYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrZCl9ZnVuY3Rpb24gamIoYSl7dmFyIGI9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmXCJcIiE9PWImJm51bGwhPT1iJiYoYS52YWx1ZT1iKX1mdW5jdGlvbiBrYihhKXtzd2l0Y2goYSl7Y2FzZSBcInN2Z1wiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtjYXNlIFwibWF0aFwiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO2RlZmF1bHQ6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJ9fVxuZnVuY3Rpb24gbGIoYSxiKXtyZXR1cm4gbnVsbD09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP2tiKGIpOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj09PWEmJlwiZm9yZWlnbk9iamVjdFwiPT09Yj9cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjphfVxudmFyIG1iLG5iPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKGIsYyxkLGUpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGEoYixjLGQsZSl9KX06YX0oZnVuY3Rpb24oYSxiKXtpZihcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIhPT1hLm5hbWVzcGFjZVVSSXx8XCJpbm5lckhUTUxcImluIGEpYS5pbm5lckhUTUw9YjtlbHNle21iPW1ifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO21iLmlubmVySFRNTD1cIjxzdmc+XCIrYi52YWx1ZU9mKCkudG9TdHJpbmcoKStcIjwvc3ZnPlwiO2ZvcihiPW1iLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KTtcbmZ1bmN0aW9uIG9iKGEsYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9XG52YXIgcGI9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLH
25114RhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCxcbnpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0scWI9W1wiV2Via2l0XCIsXCJtc1wiLFwiTW96XCIsXCJPXCJdO09iamVjdC5rZXlzKHBiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3FiLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7cGJbYl09cGJbYV19KX0pO2Z1bmN0aW9uIHJiKGEsYixjKXtyZXR1cm4gbnVsbD09Ynx8XCJib29sZWFuXCI9PT10eXBlb2YgYnx8XCJcIj09PWI/XCJcIjpjfHxcIm51bWJlclwiIT09dHlwZW9mIGJ8fDA9PT1ifHxwYi5oYXNPd25Qcm9wZXJ0eShhKSYmcGJbYV0/KFwiXCIrYikudHJpbSgpOmIrXCJweFwifVxuZnVuY3Rpb24gc2IoYSxiKXthPWEuc3R5bGU7Zm9yKHZhciBjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9MD09PWMuaW5kZXhPZihcIi0tXCIpLGU9cmIoYyxiW2NdLGQpO1wiZmxvYXRcIj09PWMmJihjPVwiY3NzRmxvYXRcIik7ZD9hLnNldFByb3BlcnR5KGMsZSk6YVtjXT1lfX12YXIgdGI9QSh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtcbmZ1bmN0aW9uIHViKGEsYil7aWYoYil7aWYodGJbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDEzNyxhKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcihwKDYwKSk7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfHwhKFwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcihwKDYyKSk7fX1cbmZ1bmN0aW9uIHZiKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgd2I9bnVsbDtmdW5jdGlvbiB4YihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9dmFyIHliPW51bGwsemI9bnVsbCxBYj1udWxsO1xuZnVuY3Rpb24gQmIoYSl7aWYoYT1DYihhKSl7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIHliKXRocm93IEVycm9yKHAoMjgwKSk7dmFyIGI9YS5zdGF0ZU5vZGU7YiYmKGI9RGIoYikseWIoYS5zdGF0ZU5vZGUsYS50eXBlLGIpKX19ZnVuY3Rpb24gRWIoYSl7emI/QWI/QWIucHVzaChhKTpBYj1bYV06emI9YX1mdW5jdGlvbiBGYigpe2lmKHpiKXt2YXIgYT16YixiPUFiO0FiPXpiPW51bGw7QmIoYSk7aWYoYilmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKUJiKGJbYV0pfX1mdW5jdGlvbiBHYihhLGIpe3JldHVybiBhKGIpfWZ1bmN0aW9uIEhiKCl7fXZhciBJYj0hMTtmdW5jdGlvbiBKYihhLGIsYyl7aWYoSWIpcmV0dXJuIGEoYixjKTtJYj0hMDt0cnl7cmV0dXJuIEdiKGEsYixjKX1maW5hbGx5e2lmKEliPSExLG51bGwhPT16Ynx8bnVsbCE9PUFiKUhiKCksRmIoKX19XG5mdW5jdGlvbiBLYihhLGIpe3ZhciBjPWEuc3RhdGVOb2RlO2lmKG51bGw9PT1jKXJldHVybiBudWxsO3ZhciBkPURiKGMpO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2M9ZFtiXTthOnN3aXRjaChiKXtjYXNlIFwib25DbGlja1wiOmNhc2UgXCJvbkNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbkRvdWJsZUNsaWNrXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VEb3duXCI6Y2FzZSBcIm9uTW91c2VEb3duQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlTW92ZVwiOmNhc2UgXCJvbk1vdXNlTW92ZUNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZVVwXCI6Y2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpjYXNlIFwib25Nb3VzZUVudGVyXCI6KGQ9IWQuZGlzYWJsZWQpfHwoYT1hLnR5cGUsZD0hKFwiYnV0dG9uXCI9PT1hfHxcImlucHV0XCI9PT1hfHxcInNlbGVjdFwiPT09YXx8XCJ0ZXh0YXJlYVwiPT09YSkpO2E9IWQ7YnJlYWsgYTtkZWZhdWx0OmE9ITF9aWYoYSlyZXR1cm4gbnVsbDtpZihjJiZcImZ1bmN0aW9uXCIhPT1cbnR5cGVvZiBjKXRocm93IEVycm9yKHAoMjMxLGIsdHlwZW9mIGMpKTtyZXR1cm4gY312YXIgTGI9ITE7aWYoaWEpdHJ5e3ZhciBNYj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTWIsXCJwYXNzaXZlXCIse2dldDpmdW5jdGlvbigpe0xiPSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLE1iLE1iKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIixNYixNYil9Y2F0Y2goYSl7TGI9ITF9ZnVuY3Rpb24gTmIoYSxiLGMsZCxlLGYsZyxoLGspe3ZhciBsPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7Yi5hcHBseShjLGwpfWNhdGNoKG0pe3RoaXMub25FcnJvcihtKX19dmFyIE9iPSExLFBiPW51bGwsUWI9ITEsUmI9bnVsbCxTYj17b25FcnJvcjpmdW5jdGlvbihhKXtPYj0hMDtQYj1hfX07ZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYsZyxoLGspe09iPSExO1BiPW51bGw7TmIuYXBwbHkoU2IsYXJndW1lbnRzKX1cbmZ1bmN0aW9uIFViKGEsYixjLGQsZSxmLGcsaCxrKXtUYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoT2Ipe2lmKE9iKXt2YXIgbD1QYjtPYj0hMTtQYj1udWxsfWVsc2UgdGhyb3cgRXJyb3IocCgxOTgpKTtRYnx8KFFiPSEwLFJiPWwpfX1mdW5jdGlvbiBWYihhKXt2YXIgYj1hLGM9YTtpZihhLmFsdGVybmF0ZSlmb3IoO2IucmV0dXJuOyliPWIucmV0dXJuO2Vsc2V7YT1iO2RvIGI9YSwwIT09KGIuZmxhZ3MmNDA5OCkmJihjPWIucmV0dXJuKSxhPWIucmV0dXJuO3doaWxlKGEpfXJldHVybiAzPT09Yi50YWc/YzpudWxsfWZ1bmN0aW9uIFdiKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09YiYmKGE9YS5hbHRlcm5hdGUsbnVsbCE9PWEmJihiPWEubWVtb2l6ZWRTdGF0ZSkpO2lmKG51bGwhPT1iKXJldHVybi
25114BiLmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gWGIoYSl7aWYoVmIoYSkhPT1hKXRocm93IEVycm9yKHAoMTg4KSk7fVxuZnVuY3Rpb24gWWIoYSl7dmFyIGI9YS5hbHRlcm5hdGU7aWYoIWIpe2I9VmIoYSk7aWYobnVsbD09PWIpdGhyb3cgRXJyb3IocCgxODgpKTtyZXR1cm4gYiE9PWE/bnVsbDphfWZvcih2YXIgYz1hLGQ9Yjs7KXt2YXIgZT1jLnJldHVybjtpZihudWxsPT09ZSlicmVhazt2YXIgZj1lLmFsdGVybmF0ZTtpZihudWxsPT09Zil7ZD1lLnJldHVybjtpZihudWxsIT09ZCl7Yz1kO2NvbnRpbnVlfWJyZWFrfWlmKGUuY2hpbGQ9PT1mLmNoaWxkKXtmb3IoZj1lLmNoaWxkO2Y7KXtpZihmPT09YylyZXR1cm4gWGIoZSksYTtpZihmPT09ZClyZXR1cm4gWGIoZSksYjtmPWYuc2libGluZ310aHJvdyBFcnJvcihwKDE4OCkpO31pZihjLnJldHVybiE9PWQucmV0dXJuKWM9ZSxkPWY7ZWxzZXtmb3IodmFyIGc9ITEsaD1lLmNoaWxkO2g7KXtpZihoPT09Yyl7Zz0hMDtjPWU7ZD1mO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZTtjPWY7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpe2ZvcihoPWYuY2hpbGQ7aDspe2lmKGg9PT1cbmMpe2c9ITA7Yz1mO2Q9ZTticmVha31pZihoPT09ZCl7Zz0hMDtkPWY7Yz1lO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXRocm93IEVycm9yKHAoMTg5KSk7fX1pZihjLmFsdGVybmF0ZSE9PWQpdGhyb3cgRXJyb3IocCgxOTApKTt9aWYoMyE9PWMudGFnKXRocm93IEVycm9yKHAoMTg4KSk7cmV0dXJuIGMuc3RhdGVOb2RlLmN1cnJlbnQ9PT1jP2E6Yn1mdW5jdGlvbiBaYihhKXthPVliKGEpO3JldHVybiBudWxsIT09YT8kYihhKTpudWxsfWZ1bmN0aW9uICRiKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhO2ZvcihhPWEuY2hpbGQ7bnVsbCE9PWE7KXt2YXIgYj0kYihhKTtpZihudWxsIT09YilyZXR1cm4gYjthPWEuc2libGluZ31yZXR1cm4gbnVsbH1cbnZhciBhYz1jYS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLGJjPWNhLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLGNjPWNhLnVuc3RhYmxlX3Nob3VsZFlpZWxkLGRjPWNhLnVuc3RhYmxlX3JlcXVlc3RQYWludCxCPWNhLnVuc3RhYmxlX25vdyxlYz1jYS51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxmYz1jYS51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxnYz1jYS51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxoYz1jYS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxpYz1jYS51bnN0YWJsZV9Mb3dQcmlvcml0eSxqYz1jYS51bnN0YWJsZV9JZGxlUHJpb3JpdHksa2M9bnVsbCxsYz1udWxsO2Z1bmN0aW9uIG1jKGEpe2lmKGxjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgbGMub25Db21taXRGaWJlclJvb3QpdHJ5e2xjLm9uQ29tbWl0RmliZXJSb290KGtjLGEsdm9pZCAwLDEyOD09PShhLmN1cnJlbnQuZmxhZ3MmMTI4KSl9Y2F0Y2goYil7fX1cbnZhciBvYz1NYXRoLmNsejMyP01hdGguY2x6MzI6bmMscGM9TWF0aC5sb2cscWM9TWF0aC5MTjI7ZnVuY3Rpb24gbmMoYSl7YT4+Pj0wO3JldHVybiAwPT09YT8zMjozMS0ocGMoYSkvcWN8MCl8MH12YXIgcmM9NjQsc2M9NDE5NDMwNDtcbmZ1bmN0aW9uIHRjKGEpe3N3aXRjaChhJi1hKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gYSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGEmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtcbmRlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIHVjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXM7aWYoMD09PWMpcmV0dXJuIDA7dmFyIGQ9MCxlPWEuc3VzcGVuZGVkTGFuZXMsZj1hLnBpbmdlZExhbmVzLGc9YyYyNjg0MzU0NTU7aWYoMCE9PWcpe3ZhciBoPWcmfmU7MCE9PWg/ZD10YyhoKTooZiY9ZywwIT09ZiYmKGQ9dGMoZikpKX1lbHNlIGc9YyZ+ZSwwIT09Zz9kPXRjKGcpOjAhPT1mJiYoZD10YyhmKSk7aWYoMD09PWQpcmV0dXJuIDA7aWYoMCE9PWImJmIhPT1kJiYwPT09KGImZSkmJihlPWQmLWQsZj1iJi1iLGU+PWZ8fDE2PT09ZSYmMCE9PShmJjQxOTQyNDApKSlyZXR1cm4gYjswIT09KGQmNCkmJihkfD1jJjE2KTtiPWEuZW50YW5nbGVkTGFuZXM7aWYoMCE9PWIpZm9yKGE9YS5lbnRhbmdsZW1lbnRzLGImPWQ7MDxiOyljPTMxLW9jKGIpLGU9MTw8YyxkfD1hW2NdLGImPX5lO3JldHVybiBkfVxuZnVuY3Rpb24gdmMoYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDQ6cmV0dXJuIGIrMjUwO2Nhc2UgODpjYXNlIDE2OmNhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gYis1RTM7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4tMTtjYXNlIDEzNDIxNzcyODpjYXNlIDI2ODQzNTQ1NjpjYXNlIDUzNjg3MDkxMjpjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuLTE7ZGVmYXVsdDpyZXR1cm4tMX19XG5mdW5jdGlvbiB3YyhhLGIpe2Zvcih2YXIgYz1hLnN1c3BlbmRlZExhbmVzLGQ9YS5waW5nZWRMYW5lcyxlPWEuZXhwaXJhdGlvblRpbWVzLGY9YS5wZW5kaW5nTGFuZXM7MDxmOyl7dmFyIGc9MzEtb2MoZiksaD0xPDxnLGs9ZVtnXTtpZigtMT09PWspe2lmKDA9PT0oaCZjKXx8MCE9PShoJmQ
25114pKWVbZ109dmMoaCxiKX1lbHNlIGs8PWImJihhLmV4cGlyZWRMYW5lc3w9aCk7ZiY9fmh9fWZ1bmN0aW9uIHhjKGEpe2E9YS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjU7cmV0dXJuIDAhPT1hP2E6YSYxMDczNzQxODI0PzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiB5Yygpe3ZhciBhPXJjO3JjPDw9MTswPT09KHJjJjQxOTQyNDApJiYocmM9NjQpO3JldHVybiBhfWZ1bmN0aW9uIHpjKGEpe2Zvcih2YXIgYj1bXSxjPTA7MzE+YztjKyspYi5wdXNoKGEpO3JldHVybiBifVxuZnVuY3Rpb24gQWMoYSxiLGMpe2EucGVuZGluZ0xhbmVzfD1iOzUzNjg3MDkxMiE9PWImJihhLnN1c3BlbmRlZExhbmVzPTAsYS5waW5nZWRMYW5lcz0wKTthPWEuZXZlbnRUaW1lcztiPTMxLW9jKGIpO2FbYl09Y31mdW5jdGlvbiBCYyhhLGIpe3ZhciBjPWEucGVuZGluZ0xhbmVzJn5iO2EucGVuZGluZ0xhbmVzPWI7YS5zdXNwZW5kZWRMYW5lcz0wO2EucGluZ2VkTGFuZXM9MDthLmV4cGlyZWRMYW5lcyY9YjthLm11dGFibGVSZWFkTGFuZXMmPWI7YS5lbnRhbmdsZWRMYW5lcyY9YjtiPWEuZW50YW5nbGVtZW50czt2YXIgZD1hLmV2ZW50VGltZXM7Zm9yKGE9YS5leHBpcmF0aW9uVGltZXM7MDxjOyl7dmFyIGU9MzEtb2MoYyksZj0xPDxlO2JbZV09MDtkW2VdPS0xO2FbZV09LTE7YyY9fmZ9fVxuZnVuY3Rpb24gQ2MoYSxiKXt2YXIgYz1hLmVudGFuZ2xlZExhbmVzfD1iO2ZvcihhPWEuZW50YW5nbGVtZW50cztjOyl7dmFyIGQ9MzEtb2MoYyksZT0xPDxkO2UmYnxhW2RdJmImJihhW2RdfD1iKTtjJj1+ZX19dmFyIEM9MDtmdW5jdGlvbiBEYyhhKXthJj0tYTtyZXR1cm4gMTxhPzQ8YT8wIT09KGEmMjY4NDM1NDU1KT8xNjo1MzY4NzA5MTI6NDoxfXZhciBFYyxGYyxHYyxIYyxJYyxKYz0hMSxLYz1bXSxMYz1udWxsLE1jPW51bGwsTmM9bnVsbCxPYz1uZXcgTWFwLFBjPW5ldyBNYXAsUWM9W10sUmM9XCJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gU2MoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjpjYXNlIFwiZm9jdXNvdXRcIjpMYz1udWxsO2JyZWFrO2Nhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6TWM9bnVsbDticmVhaztjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcIm1vdXNlb3V0XCI6TmM9bnVsbDticmVhaztjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcm91dFwiOk9jLmRlbGV0ZShiLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOlBjLmRlbGV0ZShiLnBvaW50ZXJJZCl9fVxuZnVuY3Rpb24gVGMoYSxiLGMsZCxlLGYpe2lmKG51bGw9PT1hfHxhLm5hdGl2ZUV2ZW50IT09ZilyZXR1cm4gYT17YmxvY2tlZE9uOmIsZG9tRXZlbnROYW1lOmMsZXZlbnRTeXN0ZW1GbGFnczpkLG5hdGl2ZUV2ZW50OmYsdGFyZ2V0Q29udGFpbmVyczpbZV19LG51bGwhPT1iJiYoYj1DYihiKSxudWxsIT09YiYmRmMoYikpLGE7YS5ldmVudFN5c3RlbUZsYWdzfD1kO2I9YS50YXJnZXRDb250YWluZXJzO251bGwhPT1lJiYtMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpO3JldHVybiBhfVxuZnVuY3Rpb24gVWMoYSxiLGMsZCxlKXtzd2l0Y2goYil7Y2FzZSBcImZvY3VzaW5cIjpyZXR1cm4gTGM9VGMoTGMsYSxiLGMsZCxlKSwhMDtjYXNlIFwiZHJhZ2VudGVyXCI6cmV0dXJuIE1jPVRjKE1jLGEsYixjLGQsZSksITA7Y2FzZSBcIm1vdXNlb3ZlclwiOnJldHVybiBOYz1UYyhOYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJwb2ludGVyb3ZlclwiOnZhciBmPWUucG9pbnRlcklkO09jLnNldChmLFRjKE9jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKTtyZXR1cm4hMDtjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpyZXR1cm4gZj1lLnBvaW50ZXJJZCxQYy5zZXQoZixUYyhQYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSksITB9cmV0dXJuITF9XG5mdW5jdGlvbiBWYyhhKXt2YXIgYj1XYyhhLnRhcmdldCk7aWYobnVsbCE9PWIpe3ZhciBjPVZiKGIpO2lmKG51bGwhPT1jKWlmKGI9Yy50YWcsMTM9PT1iKXtpZihiPVdiKGMpLG51bGwhPT1iKXthLmJsb2NrZWRPbj1iO0ljKGEucHJpb3JpdHksZnVuY3Rpb24oKXtHYyhjKX0pO3JldHVybn19ZWxzZSBpZigzPT09YiYmYy5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7YS5ibG9ja2VkT249Mz09PWMudGFnP2Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fWEuYmxvY2tlZE9uPW51bGx9XG5mdW5jdGlvbiBYYyhhKXtpZihudWxsIT09YS5ibG9ja2VkT24pcmV0dXJuITE7Zm9yKHZhciBiPWEudGFyZ2V0Q29udGFpbmVyczswPGIubGVuZ3RoOyl7dmFyIGM9WWMoYS5kb21FdmVudE5hbWUsYS5ldmVudFN5c3RlbUZsYWdzLGJbMF0sYS5uYXRpdmVFdmVudCk7aWYobnVsbD09PWMpe2M9YS5uYXRpdmVFdmVudDt2YXIgZD1uZXcgYy5jb25zdHJ1Y3RvcihjLnR5cGUsYyk7d2I9ZDtjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpO3diPW51bGx9ZWxzZSByZXR1cm4gYj1DYihjKSxudWxsIT09YiYmRmMoYiksYS5ibG9ja2VkT249YywhMTtiLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gWmMoYSxiLGMpe1hjKGEpJiZjLmRlbGV0ZShiKX1mdW5jdGlvbiAkYygpe0pjPSExO251bGwhPT1MYyYmWGMoTGMpJiYoTGM9bnVsbCk7bnVsbCE9PU1jJiZYYyhNYykmJihNYz1udWxsKTtudWxsIT09TmMmJlhjKE5jKSYmKE5jPW51bGwpO09jLmZvckVhY2goWmMpO1BjLmZvckVhY2goWmMpfVxuZnVuY3Rpb24gYWQoYSxiKXthLmJsb2NrZWRPbj09PWImJihhLmJsb2NrZWRPbj1udWxsLEpjfHwoSmM9ITAsY2EudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhjYS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwkYykpKX1cbmZ1bmN0aW9uIGJkKGEpe2Z1bmN0aW9uIGIoYil7cmV0dXJuIGFkKGIsYSl9aWYoMDxLYy5sZW5ndGgpe2FkKEtjWzBdLGEpO2Zvcih2YXIgYz0xO2M8S2MubGVuZ3RoO2MrKyl7dmFyIGQ9S2NbY107ZC5ibG9ja2VkT249PT1hJiYo
25114ZC5ibG9ja2VkT249bnVsbCl9fW51bGwhPT1MYyYmYWQoTGMsYSk7bnVsbCE9PU1jJiZhZChNYyxhKTtudWxsIT09TmMmJmFkKE5jLGEpO09jLmZvckVhY2goYik7UGMuZm9yRWFjaChiKTtmb3IoYz0wO2M8UWMubGVuZ3RoO2MrKylkPVFjW2NdLGQuYmxvY2tlZE9uPT09YSYmKGQuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxRYy5sZW5ndGgmJihjPVFjWzBdLG51bGw9PT1jLmJsb2NrZWRPbik7KVZjKGMpLG51bGw9PT1jLmJsb2NrZWRPbiYmUWMuc2hpZnQoKX12YXIgY2Q9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsZGQ9ITA7XG5mdW5jdGlvbiBlZChhLGIsYyxkKXt2YXIgZT1DLGY9Y2QudHJhbnNpdGlvbjtjZC50cmFuc2l0aW9uPW51bGw7dHJ5e0M9MSxmZChhLGIsYyxkKX1maW5hbGx5e0M9ZSxjZC50cmFuc2l0aW9uPWZ9fWZ1bmN0aW9uIGdkKGEsYixjLGQpe3ZhciBlPUMsZj1jZC50cmFuc2l0aW9uO2NkLnRyYW5zaXRpb249bnVsbDt0cnl7Qz00LGZkKGEsYixjLGQpfWZpbmFsbHl7Qz1lLGNkLnRyYW5zaXRpb249Zn19XG5mdW5jdGlvbiBmZChhLGIsYyxkKXtpZihkZCl7dmFyIGU9WWMoYSxiLGMsZCk7aWYobnVsbD09PWUpaGQoYSxiLGQsaWQsYyksU2MoYSxkKTtlbHNlIGlmKFVjKGUsYSxiLGMsZCkpZC5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKFNjKGEsZCksYiY0JiYtMTxSYy5pbmRleE9mKGEpKXtmb3IoO251bGwhPT1lOyl7dmFyIGY9Q2IoZSk7bnVsbCE9PWYmJkVjKGYpO2Y9WWMoYSxiLGMsZCk7bnVsbD09PWYmJmhkKGEsYixkLGlkLGMpO2lmKGY9PT1lKWJyZWFrO2U9Zn1udWxsIT09ZSYmZC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIGhkKGEsYixkLG51bGwsYyl9fXZhciBpZD1udWxsO1xuZnVuY3Rpb24gWWMoYSxiLGMsZCl7aWQ9bnVsbDthPXhiKGQpO2E9V2MoYSk7aWYobnVsbCE9PWEpaWYoYj1WYihhKSxudWxsPT09YilhPW51bGw7ZWxzZSBpZihjPWIudGFnLDEzPT09Yyl7YT1XYihiKTtpZihudWxsIT09YSlyZXR1cm4gYTthPW51bGx9ZWxzZSBpZigzPT09Yyl7aWYoYi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gMz09PWIudGFnP2Iuc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDthPW51bGx9ZWxzZSBiIT09YSYmKGE9bnVsbCk7aWQ9YTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGpkKGEpe3N3aXRjaChhKXtjYXNlIFwiY2FuY2VsXCI6Y2FzZSBcImNsaWNrXCI6Y2FzZSBcImNsb3NlXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6Y2FzZSBcImNvcHlcIjpjYXNlIFwiY3V0XCI6Y2FzZSBcImF1eGNsaWNrXCI6Y2FzZSBcImRibGNsaWNrXCI6Y2FzZSBcImRyYWdlbmRcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjpjYXNlIFwiZm9jdXNpblwiOmNhc2UgXCJmb2N1c291dFwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJpbnZhbGlkXCI6Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwia2V5dXBcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwicGFzdGVcIjpjYXNlIFwicGF1c2VcIjpjYXNlIFwicGxheVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOmNhc2UgXCJyYXRlY2hhbmdlXCI6Y2FzZSBcInJlc2V0XCI6Y2FzZSBcInJlc2l6ZVwiOmNhc2UgXCJzZWVrZWRcIjpjYXNlIFwic3VibWl0XCI6Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNoc3RhcnRcIjpjYXNlIFwidm9sdW1lY2hhbmdlXCI6Y2FzZSBcImNoYW5nZVwiOmNhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjpjYXNlIFwidGV4dElucHV0XCI6Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjpjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjpjYXNlIFwiYmVmb3JlaW5wdXRcIjpjYXNlIFwiYmx1clwiOmNhc2UgXCJmdWxsc2NyZWVuY2hhbmdlXCI6Y2FzZSBcImZvY3VzXCI6Y2FzZSBcImhhc2hjaGFuZ2VcIjpjYXNlIFwicG9wc3RhdGVcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInNlbGVjdHN0YXJ0XCI6cmV0dXJuIDE7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdleGl0XCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmNhc2UgXCJkcmFnb3ZlclwiOmNhc2UgXCJtb3VzZW1vdmVcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwic2Nyb2xsXCI6Y2FzZSBcInRvZ2dsZVwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwid2hlZWxcIjpjYXNlIFwibW91c2VlbnRlclwiOmNhc2UgXCJtb3VzZWxlYXZlXCI6Y2FzZSBcInBvaW50ZXJlbnRlclwiOmNhc2UgXCJwb2ludGVybGVhdmVcIjpyZXR1cm4gNDtcbmNhc2UgXCJtZXNzYWdlXCI6c3dpdGNoKGVjKCkpe2Nhc2UgZmM6cmV0dXJuIDE7Y2FzZSBnYzpyZXR1cm4gNDtjYXNlIGhjOmNhc2UgaWM6cmV0dXJuIDE2O2Nhc2UgamM6cmV0dXJuIDUzNjg3MDkxMjtkZWZhdWx0OnJldHVybiAxNn1kZWZhdWx0OnJldHVybiAxNn19dmFyIGtkPW51bGwsbGQ9bnVsbCxtZD1udWxsO2Z1bmN0aW9uIG5kKCl7aWYobWQpcmV0dXJuIG1kO3ZhciBhLGI9bGQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4ga2Q/a2QudmFsdWU6a2QudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gbWQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1cbmZ1bmN0aW9uIG9kKGEpe3ZhciBiPWEua2V5Q29kZTtcImNoYXJDb2RlXCJpbiBhPyhhPWEuY2hhckNvZGUsMD09PWEmJjEzPT09YiYmKGE9MTMpKTphPWI7MTA9PT1hJiYoYT0xMyk7cmV0dXJuIDMyPD1hfHwxMz09PWE/YTowfWZ1bmN0aW9uIHBkKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWQoKXtyZXR1cm4hMX1cbmZ1bmN0aW9uIHJkKGEpe2Z1bmN0aW9uIGIoYixkLGUsZixnKXt0aGlzLl9yZWFjdE5hbWU9Yjt0aGlzLl90YXJnZXRJbnN0PWU7dGhpcy50eXBlPWQ7dGhpcy5uYXRpdmVFdmVudD1mO3RoaXMudGFyZ2V0PWc7dGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKGI9YVtjXSx0aGlzW2NdPWI/YihmKTpmW2NdKTt0aGlzLmlzRGVmYXVsdFByZXZlbn
25114RlZD0obnVsbCE9Zi5kZWZhdWx0UHJldmVudGVkP2YuZGVmYXVsdFByZXZlbnRlZDohMT09PWYucmV0dXJuVmFsdWUpP3BkOnFkO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWQ7cmV0dXJuIHRoaXN9QShiLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5yZXR1cm5WYWx1ZSYmXG4oYS5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGQpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOlwidW5rbm93blwiIT09dHlwZW9mIGEuY2FuY2VsQnViYmxlJiYoYS5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cGQpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cGR9KTtyZXR1cm4gYn1cbnZhciBzZD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSx0ZD1yZChzZCksdWQ9QSh7fSxzZCx7dmlldzowLGRldGFpbDowfSksdmQ9cmQodWQpLHdkLHhkLHlkLEFkPUEoe30sdWQse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6emQsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWEucmVsYXRlZFRhcmdldD9hLmZyb21FbGVtZW50PT09YS5zcmNFbGVtZW50P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ6YS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFhcImluXG5hKXJldHVybiBhLm1vdmVtZW50WDthIT09eWQmJih5ZCYmXCJtb3VzZW1vdmVcIj09PWEudHlwZT8od2Q9YS5zY3JlZW5YLXlkLnNjcmVlblgseGQ9YS5zY3JlZW5ZLXlkLnNjcmVlblkpOnhkPXdkPTAseWQ9YSk7cmV0dXJuIHdkfSxtb3ZlbWVudFk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJtb3ZlbWVudFlcImluIGE/YS5tb3ZlbWVudFk6eGR9fSksQmQ9cmQoQWQpLENkPUEoe30sQWQse2RhdGFUcmFuc2ZlcjowfSksRGQ9cmQoQ2QpLEVkPUEoe30sdWQse3JlbGF0ZWRUYXJnZXQ6MH0pLEZkPXJkKEVkKSxHZD1BKHt9LHNkLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxIZD1yZChHZCksSWQ9QSh7fSxzZCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm5cImNsaXBib2FyZERhdGFcImluIGE/YS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLEpkPXJkKElkKSxLZD1BKHt9LHNkLHtkYXRhOjB9KSxMZD1yZChLZCksTWQ9e0VzYzpcIkVzY2FwZVwiLFxuU3BhY2ViYXI6XCIgXCIsTGVmdDpcIkFycm93TGVmdFwiLFVwOlwiQXJyb3dVcFwiLFJpZ2h0OlwiQXJyb3dSaWdodFwiLERvd246XCJBcnJvd0Rvd25cIixEZWw6XCJEZWxldGVcIixXaW46XCJPU1wiLE1lbnU6XCJDb250ZXh0TWVudVwiLEFwcHM6XCJDb250ZXh0TWVudVwiLFNjcm9sbDpcIlNjcm9sbExvY2tcIixNb3pQcmludGFibGVLZXk6XCJVbmlkZW50aWZpZWRcIn0sTmQ9ezg6XCJCYWNrc3BhY2VcIiw5OlwiVGFiXCIsMTI6XCJDbGVhclwiLDEzOlwiRW50ZXJcIiwxNjpcIlNoaWZ0XCIsMTc6XCJDb250cm9sXCIsMTg6XCJBbHRcIiwxOTpcIlBhdXNlXCIsMjA6XCJDYXBzTG9ja1wiLDI3OlwiRXNjYXBlXCIsMzI6XCIgXCIsMzM6XCJQYWdlVXBcIiwzNDpcIlBhZ2VEb3duXCIsMzU6XCJFbmRcIiwzNjpcIkhvbWVcIiwzNzpcIkFycm93TGVmdFwiLDM4OlwiQXJyb3dVcFwiLDM5OlwiQXJyb3dSaWdodFwiLDQwOlwiQXJyb3dEb3duXCIsNDU6XCJJbnNlcnRcIiw0NjpcIkRlbGV0ZVwiLDExMjpcIkYxXCIsMTEzOlwiRjJcIiwxMTQ6XCJGM1wiLDExNTpcIkY0XCIsMTE2OlwiRjVcIiwxMTc6XCJGNlwiLDExODpcIkY3XCIsXG4xMTk6XCJGOFwiLDEyMDpcIkY5XCIsMTIxOlwiRjEwXCIsMTIyOlwiRjExXCIsMTIzOlwiRjEyXCIsMTQ0OlwiTnVtTG9ja1wiLDE0NTpcIlNjcm9sbExvY2tcIiwyMjQ6XCJNZXRhXCJ9LE9kPXtBbHQ6XCJhbHRLZXlcIixDb250cm9sOlwiY3RybEtleVwiLE1ldGE6XCJtZXRhS2V5XCIsU2hpZnQ6XCJzaGlmdEtleVwifTtmdW5jdGlvbiBQZChhKXt2YXIgYj10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiBiLmdldE1vZGlmaWVyU3RhdGU/Yi5nZXRNb2RpZmllclN0YXRlKGEpOihhPU9kW2FdKT8hIWJbYV06ITF9ZnVuY3Rpb24gemQoKXtyZXR1cm4gUGR9XG52YXIgUWQ9QSh7fSx1ZCx7a2V5OmZ1bmN0aW9uKGEpe2lmKGEua2V5KXt2YXIgYj1NZFthLmtleV18fGEua2V5O2lmKFwiVW5pZGVudGlmaWVkXCIhPT1iKXJldHVybiBifXJldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT8oYT1vZChhKSwxMz09PWE/XCJFbnRlclwiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/TmRbYS5rZXlDb2RlXXx8XCJVbmlkZW50aWZpZWRcIjpcIlwifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZCxjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/b2QoYSk6MH0sa2V5Q29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1cbmEudHlwZT9vZChhKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfX0pLFJkPXJkKFFkKSxTZD1BKHt9LEFkLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pL
25114FRkPXJkKFNkKSxVZD1BKHt9LHVkLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6emR9KSxWZD1yZChVZCksV2Q9QSh7fSxzZCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxYZD1yZChXZCksWWQ9QSh7fSxBZCx7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFYXCJpbiBhP2EuZGVsdGFYOlwid2hlZWxEZWx0YVhcImluIGE/LWEud2hlZWxEZWx0YVg6MH0sXG5kZWx0YVk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVlcImluIGE/YS5kZWx0YVk6XCJ3aGVlbERlbHRhWVwiaW4gYT8tYS53aGVlbERlbHRhWTpcIndoZWVsRGVsdGFcImluIGE/LWEud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLFpkPXJkKFlkKSwkZD1bOSwxMywyNywzMl0sYWU9aWEmJlwiQ29tcG9zaXRpb25FdmVudFwiaW4gd2luZG93LGJlPW51bGw7aWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmKGJlPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGNlPWlhJiZcIlRleHRFdmVudFwiaW4gd2luZG93JiYhYmUsZGU9aWEmJighYWV8fGJlJiY4PGJlJiYxMT49YmUpLGVlPVN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLGZlPSExO1xuZnVuY3Rpb24gZ2UoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImtleXVwXCI6cmV0dXJuLTEhPT0kZC5pbmRleE9mKGIua2V5Q29kZSk7Y2FzZSBcImtleWRvd25cIjpyZXR1cm4gMjI5IT09Yi5rZXlDb2RlO2Nhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwiZm9jdXNvdXRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBoZShhKXthPWEuZGV0YWlsO3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmXCJkYXRhXCJpbiBhP2EuZGF0YTpudWxsfXZhciBpZT0hMTtmdW5jdGlvbiBqZShhLGIpe3N3aXRjaChhKXtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gaGUoYik7Y2FzZSBcImtleXByZXNzXCI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO2ZlPSEwO3JldHVybiBlZTtjYXNlIFwidGV4dElucHV0XCI6cmV0dXJuIGE9Yi5kYXRhLGE9PT1lZSYmZmU/bnVsbDphO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24ga2UoYSxiKXtpZihpZSlyZXR1cm5cImNvbXBvc2l0aW9uZW5kXCI9PT1hfHwhYWUmJmdlKGEsYik/KGE9bmQoKSxtZD1sZD1rZD1udWxsLGllPSExLGEpOm51bGw7c3dpdGNoKGEpe2Nhc2UgXCJwYXN0ZVwiOnJldHVybiBudWxsO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKCEoYi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5KXx8Yi5jdHJsS2V5JiZiLmFsdEtleSl7aWYoYi5jaGFyJiYxPGIuY2hhci5sZW5ndGgpcmV0dXJuIGIuY2hhcjtpZihiLndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIud2hpY2gpfXJldHVybiBudWxsO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBkZSYmXCJrb1wiIT09Yi5sb2NhbGU/bnVsbDpiLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG52YXIgbGU9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsXCJkYXRldGltZS1sb2NhbFwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gbWUoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWI/ISFsZVthLnR5cGVdOlwidGV4dGFyZWFcIj09PWI/ITA6ITF9ZnVuY3Rpb24gbmUoYSxiLGMsZCl7RWIoZCk7Yj1vZShiLFwib25DaGFuZ2VcIik7MDxiLmxlbmd0aCYmKGM9bmV3IHRkKFwib25DaGFuZ2VcIixcImNoYW5nZVwiLG51bGwsYyxkKSxhLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOmJ9KSl9dmFyIHBlPW51bGwscWU9bnVsbDtmdW5jdGlvbiByZShhKXtzZShhLDApfWZ1bmN0aW9uIHRlKGEpe3ZhciBiPXVlKGEpO2lmKFdhKGIpKXJldHVybiBhfVxuZnVuY3Rpb24gdmUoYSxiKXtpZihcImNoYW5nZVwiPT09YSlyZXR1cm4gYn12YXIgd2U9ITE7aWYoaWEpe3ZhciB4ZTtpZihpYSl7dmFyIHllPVwib25pbnB1dFwiaW4gZG9jdW1lbnQ7aWYoIXllKXt2YXIgemU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt6ZS5zZXRBdHRyaWJ1dGUoXCJvbmlucHV0XCIsXCJyZXR1cm47XCIpO3llPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB6ZS5vbmlucHV0fXhlPXllfWVsc2UgeGU9ITE7d2U9eGUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gQWUoKXtwZSYmKHBlLmRldGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSxxZT1wZT1udWxsKX1mdW5jdGlvbiBCZShhKXtpZihcInZhbHVlXCI9PT1hLnByb3BlcnR5TmFtZSYmdGUocWUpKXt2YXIgYj1bXTtuZShiLHFlLGEseGIoYSkpO0piKHJlLGIpfX1cbmZ1bmN0aW9uIENlKGEsYixjKXtcImZvY3VzaW5cIj09PWE/KEFlKCkscGU9YixxZT1jLHBlLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSk6XCJmb2N1c291dFwiPT09YSYmQWUoKX1mdW5jdGlvbiBEZShhKXtpZihcInNlbGVjdGlvbmNoYW5nZVwiPT09YXx8XCJrZXl1cFwiPT09YXx8XCJrZXlkb3duXCI9PT1hKXJldHVybiB0ZShxZSl9ZnVuY3Rpb24gRWUoYSxiKXtpZihcImNsaWNrXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBGZShhLGIpe2lmKFwiaW5wdXRcIj09PWF8fFwiY2hhbmdlXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBHZShhLGIpe3JldHVybiBhPT09YiYmKDAhPT1hfHwxL2E9PT0xL2IpfHxhIT09YSYmYiE9PWJ9dmFyIEhlPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOkdlO1xuZnVuY3Rpb24gSWUoYSxiKXtpZihIZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07aWYoIWphLmNhbGwoYixlKXx8IUhlKGFbZV0sYltlXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gSmUoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfVxuZnVuY3Rpb24gS2UoYSxiKXt2YXIgYz1KZShhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz1KZShjKX19ZnVuY3Rpb24gTGUoYSxiKXtyZXR1cm4gYSYmYj9hPT09Yj8hMDphJiYzPT09YS5ub2RlVHlwZT8hMTpiJiYzPT09Yi5ub2RlVHlwZT9MZShhLGIucGFyZW50Tm9kZSk6XCJjb250YWluc1wiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9XG5mdW5jdGlvbiBNZSgpe2Zvcih2YXIgYT13aW5kb3csYj1YYSgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhy
25114ZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj1YYShhLmRvY3VtZW50KX1yZXR1cm4gYn1mdW5jdGlvbiBOZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJihcImlucHV0XCI9PT1iJiYoXCJ0ZXh0XCI9PT1hLnR5cGV8fFwic2VhcmNoXCI9PT1hLnR5cGV8fFwidGVsXCI9PT1hLnR5cGV8fFwidXJsXCI9PT1hLnR5cGV8fFwicGFzc3dvcmRcIj09PWEudHlwZSl8fFwidGV4dGFyZWFcIj09PWJ8fFwidHJ1ZVwiPT09YS5jb250ZW50RWRpdGFibGUpfVxuZnVuY3Rpb24gT2UoYSl7dmFyIGI9TWUoKSxjPWEuZm9jdXNlZEVsZW0sZD1hLnNlbGVjdGlvblJhbmdlO2lmKGIhPT1jJiZjJiZjLm93bmVyRG9jdW1lbnQmJkxlKGMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYykpe2lmKG51bGwhPT1kJiZOZShjKSlpZihiPWQuc3RhcnQsYT1kLmVuZCx2b2lkIDA9PT1hJiYoYT1iKSxcInNlbGVjdGlvblN0YXJ0XCJpbiBjKWMuc2VsZWN0aW9uU3RhcnQ9YixjLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihhLGMudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGE9KGI9Yy5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJmIuZGVmYXVsdFZpZXd8fHdpbmRvdyxhLmdldFNlbGVjdGlvbil7YT1hLmdldFNlbGVjdGlvbigpO3ZhciBlPWMudGV4dENvbnRlbnQubGVuZ3RoLGY9TWF0aC5taW4oZC5zdGFydCxlKTtkPXZvaWQgMD09PWQuZW5kP2Y6TWF0aC5taW4oZC5lbmQsZSk7IWEuZXh0ZW5kJiZmPmQmJihlPWQsZD1mLGY9ZSk7ZT1LZShjLGYpO3ZhciBnPUtlKGMsXG5kKTtlJiZnJiYoMSE9PWEucmFuZ2VDb3VudHx8YS5hbmNob3JOb2RlIT09ZS5ub2RlfHxhLmFuY2hvck9mZnNldCE9PWUub2Zmc2V0fHxhLmZvY3VzTm9kZSE9PWcubm9kZXx8YS5mb2N1c09mZnNldCE9PWcub2Zmc2V0KSYmKGI9Yi5jcmVhdGVSYW5nZSgpLGIuc2V0U3RhcnQoZS5ub2RlLGUub2Zmc2V0KSxhLnJlbW92ZUFsbFJhbmdlcygpLGY+ZD8oYS5hZGRSYW5nZShiKSxhLmV4dGVuZChnLm5vZGUsZy5vZmZzZXQpKTooYi5zZXRFbmQoZy5ub2RlLGcub2Zmc2V0KSxhLmFkZFJhbmdlKGIpKSl9Yj1bXTtmb3IoYT1jO2E9YS5wYXJlbnROb2RlOykxPT09YS5ub2RlVHlwZSYmYi5wdXNoKHtlbGVtZW50OmEsbGVmdDphLnNjcm9sbExlZnQsdG9wOmEuc2Nyb2xsVG9wfSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGMuZm9jdXMmJmMuZm9jdXMoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWE9YltjXSxhLmVsZW1lbnQuc2Nyb2xsTGVmdD1hLmxlZnQsYS5lbGVtZW50LnNjcm9sbFRvcD1hLnRvcH19XG52YXIgUGU9aWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxRZT1udWxsLFJlPW51bGwsU2U9bnVsbCxUZT0hMTtcbmZ1bmN0aW9uIFVlKGEsYixjKXt2YXIgZD1jLndpbmRvdz09PWM/Yy5kb2N1bWVudDo5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudDtUZXx8bnVsbD09UWV8fFFlIT09WGEoZCl8fChkPVFlLFwic2VsZWN0aW9uU3RhcnRcImluIGQmJk5lKGQpP2Q9e3N0YXJ0OmQuc2VsZWN0aW9uU3RhcnQsZW5kOmQuc2VsZWN0aW9uRW5kfTooZD0oZC5vd25lckRvY3VtZW50JiZkLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCksZD17YW5jaG9yTm9kZTpkLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpkLmZvY3VzTm9kZSxmb2N1c09mZnNldDpkLmZvY3VzT2Zmc2V0fSksU2UmJkllKFNlLGQpfHwoU2U9ZCxkPW9lKFJlLFwib25TZWxlY3RcIiksMDxkLmxlbmd0aCYmKGI9bmV3IHRkKFwib25TZWxlY3RcIixcInNlbGVjdFwiLG51bGwsYixjKSxhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmR9KSxiLnRhcmdldD1RZSkpKX1cbmZ1bmN0aW9uIFZlKGEsYil7dmFyIGM9e307Y1thLnRvTG93ZXJDYXNlKCldPWIudG9Mb3dlckNhc2UoKTtjW1wiV2Via2l0XCIrYV09XCJ3ZWJraXRcIitiO2NbXCJNb3pcIithXT1cIm1velwiK2I7cmV0dXJuIGN9dmFyIFdlPXthbmltYXRpb25lbmQ6VmUoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkVuZFwiKSxhbmltYXRpb25pdGVyYXRpb246VmUoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkl0ZXJhdGlvblwiKSxhbmltYXRpb25zdGFydDpWZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uU3RhcnRcIiksdHJhbnNpdGlvbmVuZDpWZShcIlRyYW5zaXRpb25cIixcIlRyYW5zaXRpb25FbmRcIil9LFhlPXt9LFllPXt9O1xuaWEmJihZZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLnN0eWxlLFwiQW5pbWF0aW9uRXZlbnRcImluIHdpbmRvd3x8KGRlbGV0ZSBXZS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBXZS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBXZS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLFwiVHJhbnNpdGlvbkV2ZW50XCJpbiB3aW5kb3d8fGRlbGV0ZSBXZS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pO2Z1bmN0aW9uIFplKGEpe2lmKFhlW2FdKXJldHVybiBYZVthXTtpZighV2VbYV0pcmV0dXJuIGE7dmFyIGI9V2VbYV0sYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykmJmMgaW4gWWUpcmV0dXJuIFhlW2FdPWJbY107cmV0dXJuIGF9dmFyICRlPVplKFwiYW5pbWF0aW9uZW5kXCIpLGFmPVplKFwiYW5pbWF0aW9uaXRlcmF0aW9uXCIpLGJmPVplKFwiYW5pbWF0aW9uc3RhcnRcIiksY2Y9WmUoXCJ0cmFuc2l0aW9uZW5kXCIpLGRmPW5ldyBNYXAsZWY9XCJhYm9ydCBhdXhDbGljayBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBnb3RQb2ludGVyQ2FwdHVyZSBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBsb3N0UG9pbnRlckNhcHR1cmUgbW91c2VEb3duIG1vdXNlTW92ZSBtb3VzZU91dCBtb3VzZU92ZXIgbW91c2VVcCBwYXN0ZSBwYXVzZSBwbGF5IHBsYXlpbmcgcG9pbnRlckNhbmNlbCBwb2ludGVyRG93biBwb2ludGVyTW92ZSBwb2ludGVyT3V0IHBvaW50ZXJPdmVyIHBvaW50ZXJVcCBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG91Y2hDYW5jZWwgdG91Y2hFbmQgdG91Y2hTdGFydCB2b2x1bWVDaGFuZ2Ugc2Nyb2xsIHRvZ2dsZSB0b3VjaE1vdmUgd2FpdGluZyB3aGVlbFwiLnNwbGl0KFwiIFwiKTtcbmZ1bmN0aW9uIGZmKGEsYil7ZGYuc2V0KGEsYik7ZmEoYixbYV0pfWZvcih2YXIgZ2Y9MDtnZjxlZi5sZW5ndGg7Z2YrKyl7dmFyIGhmPWVmW2dmXSxqZj1oZi50b0xvd2VyQ2FzZSgpLGtmPWhmWzBdLnRvVXBwZXJDYXNlKCkraGYuc2xpY2UoMSk7ZmYoamYsXCJvblwiK2tmKX1mZigkZSxcIm9uQW5pbWF0aW9uRW5kXCIpO2ZmKGFmLFwib25BbmltYXRpb25JdGVyYXRpb25cIik7ZmYoYmYsXCJvbkFuaW1hdGlvblN0YXJ0XCIpO2ZmKFwiZGJsY2xpY2tcIixcIm9uRG91YmxlQ2xpY2tcIik7ZmYoXCJmb2N1c2luXCIsXCJvbkZvY3VzXCIpO2ZmKFwiZm9jdXNvdXRcIixcIm9uQmx1clwiKTtmZihjZixcIm9uVHJhbnNpdGlvbkVuZFwiKTtoYShcIm9uTW91c2VFbnRlclwiLFtcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl0pO2hhKFwib25Nb3VzZUxlYXZlXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7aGEoXCJvblBvaW50ZXJFbnRlclwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtcbmhhKFwib25Qb2ludGVyTGVhdmVcIixbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXSk7ZmEoXCJvbkNoYW5nZVwiLFwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2VcIi5zcGxpdChcIiBcIikpO2ZhKFwib25TZWxlY3RcIixcImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZmEoXCJvbkJlZm9yZUlucHV0XCIsW1wiY29tcG9zaXRpb25lbmRcIixcImtleXByZXNzXCIsXCJ0ZXh0SW5wdXRcIixcInBhc3RlXCJdKTtmYShcIm9uQ29tcG9zaXRpb25
25114FbmRcIixcImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTtmYShcIm9uQ29tcG9zaXRpb25TdGFydFwiLFwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7XG5mYShcIm9uQ29tcG9zaXRpb25VcGRhdGVcIixcImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTt2YXIgbGY9XCJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZ1wiLnNwbGl0KFwiIFwiKSxtZj1uZXcgU2V0KFwiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlXCIuc3BsaXQoXCIgXCIpLmNvbmNhdChsZikpO1xuZnVuY3Rpb24gbmYoYSxiLGMpe3ZhciBkPWEudHlwZXx8XCJ1bmtub3duLWV2ZW50XCI7YS5jdXJyZW50VGFyZ2V0PWM7VWIoZCxiLHZvaWQgMCxhKTthLmN1cnJlbnRUYXJnZXQ9bnVsbH1cbmZ1bmN0aW9uIHNlKGEsYil7Yj0wIT09KGImNCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT1kLmV2ZW50O2Q9ZC5saXN0ZW5lcnM7YTp7dmFyIGY9dm9pZCAwO2lmKGIpZm9yKHZhciBnPWQubGVuZ3RoLTE7MDw9ZztnLS0pe3ZhciBoPWRbZ10saz1oLmluc3RhbmNlLGw9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7bmYoZSxoLGwpO2Y9a31lbHNlIGZvcihnPTA7ZzxkLmxlbmd0aDtnKyspe2g9ZFtnXTtrPWguaW5zdGFuY2U7bD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTtuZihlLGgsbCk7Zj1rfX19aWYoUWIpdGhyb3cgYT1SYixRYj0hMSxSYj1udWxsLGE7fVxuZnVuY3Rpb24gRChhLGIpe3ZhciBjPWJbb2ZdO3ZvaWQgMD09PWMmJihjPWJbb2ZdPW5ldyBTZXQpO3ZhciBkPWErXCJfX2J1YmJsZVwiO2MuaGFzKGQpfHwocGYoYixhLDIsITEpLGMuYWRkKGQpKX1mdW5jdGlvbiBxZihhLGIsYyl7dmFyIGQ9MDtiJiYoZHw9NCk7cGYoYyxhLGQsYil9dmFyIHJmPVwiX3JlYWN0TGlzdGVuaW5nXCIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gc2YoYSl7aWYoIWFbcmZdKXthW3JmXT0hMDtkYS5mb3JFYWNoKGZ1bmN0aW9uKGIpe1wic2VsZWN0aW9uY2hhbmdlXCIhPT1iJiYobWYuaGFzKGIpfHxxZihiLCExLGEpLHFmKGIsITAsYSkpfSk7dmFyIGI9OT09PWEubm9kZVR5cGU/YTphLm93bmVyRG9jdW1lbnQ7bnVsbD09PWJ8fGJbcmZdfHwoYltyZl09ITAscWYoXCJzZWxlY3Rpb25jaGFuZ2VcIiwhMSxiKSl9fVxuZnVuY3Rpb24gcGYoYSxiLGMsZCl7c3dpdGNoKGpkKGIpKXtjYXNlIDE6dmFyIGU9ZWQ7YnJlYWs7Y2FzZSA0OmU9Z2Q7YnJlYWs7ZGVmYXVsdDplPWZkfWM9ZS5iaW5kKG51bGwsYixjLGEpO2U9dm9pZCAwOyFMYnx8XCJ0b3VjaHN0YXJ0XCIhPT1iJiZcInRvdWNobW92ZVwiIT09YiYmXCJ3aGVlbFwiIT09Ynx8KGU9ITApO2Q/dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITApOnZvaWQgMCE9PWU/YS5hZGRFdmVudExpc3RlbmVyKGIsYyx7cGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSl9XG5mdW5jdGlvbiBoZChhLGIsYyxkLGUpe3ZhciBmPWQ7aWYoMD09PShiJjEpJiYwPT09KGImMikmJm51bGwhPT1kKWE6Zm9yKDs7KXtpZihudWxsPT09ZClyZXR1cm47dmFyIGc9ZC50YWc7aWYoMz09PWd8fDQ9PT1nKXt2YXIgaD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKGg9PT1lfHw4PT09aC5ub2RlVHlwZSYmaC5wYXJlbnROb2RlPT09ZSlicmVhaztpZig0PT09Zylmb3IoZz1kLnJldHVybjtudWxsIT09Zzspe3ZhciBrPWcudGFnO2lmKDM9PT1rfHw0PT09aylpZihrPWcuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saz09PWV8fDg9PT1rLm5vZGVUeXBlJiZrLnBhcmVudE5vZGU9PT1lKXJldHVybjtnPWcucmV0dXJufWZvcig7bnVsbCE9PWg7KXtnPVdjKGgpO2lmKG51bGw9PT1nKXJldHVybjtrPWcudGFnO2lmKDU9PT1rfHw2PT09ayl7ZD1mPWc7Y29udGludWUgYX1oPWgucGFyZW50Tm9kZX19ZD1kLnJldHVybn1KYihmdW5jdGlvbigpe3ZhciBkPWYsZT14YihjKSxnPVtdO1xuYTp7dmFyIGg9ZGYuZ2V0KGEpO2lmKHZvaWQgMCE9PWgpe3ZhciBrPXRkLG49YTtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9kKGMpKWJyZWFrIGE7Y2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjprPVJkO2JyZWFrO2Nhc2UgXCJmb2N1c2luXCI6bj1cImZvY3VzXCI7az1GZDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjpuPVwiYmx1clwiO2s9RmQ7YnJlYWs7Y2FzZSBcImJlZm9yZWJsdXJcIjpjYXNlIFwiYWZ0ZXJibHVyXCI6az1GZDticmVhaztjYXNlIFwiY2xpY2tcIjppZigyPT09Yy5idXR0b24pYnJlYWsgYTtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOms9QmQ7YnJlYWs7Y2FzZSBcImRyYWdcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcImRyYWdzdGFydFwiOmNhc2UgXCJkcm9wXCI6az1cbkRkO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOms9VmQ7YnJlYWs7Y2FzZSAkZTpjYXNlIGFmOmNhc2UgYmY6az1IZDticmVhaztjYXNlIGNmOms9WGQ7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOms9dmQ7YnJlYWs7Y2FzZSBcIndoZWVsXCI6az1aZDticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJj
25114dXRcIjpjYXNlIFwicGFzdGVcIjprPUpkO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOms9VGR9dmFyIHQ9MCE9PShiJjQpLEo9IXQmJlwic2Nyb2xsXCI9PT1hLHg9dD9udWxsIT09aD9oK1wiQ2FwdHVyZVwiOm51bGw6aDt0PVtdO2Zvcih2YXIgdz1kLHU7bnVsbCE9PVxudzspe3U9dzt2YXIgRj11LnN0YXRlTm9kZTs1PT09dS50YWcmJm51bGwhPT1GJiYodT1GLG51bGwhPT14JiYoRj1LYih3LHgpLG51bGwhPUYmJnQucHVzaCh0Zih3LEYsdSkpKSk7aWYoSilicmVhazt3PXcucmV0dXJufTA8dC5sZW5ndGgmJihoPW5ldyBrKGgsbixudWxsLGMsZSksZy5wdXNoKHtldmVudDpoLGxpc3RlbmVyczp0fSkpfX1pZigwPT09KGImNykpe2E6e2g9XCJtb3VzZW92ZXJcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWE7az1cIm1vdXNlb3V0XCI9PT1hfHxcInBvaW50ZXJvdXRcIj09PWE7aWYoaCYmYyE9PXdiJiYobj1jLnJlbGF0ZWRUYXJnZXR8fGMuZnJvbUVsZW1lbnQpJiYoV2Mobil8fG5bdWZdKSlicmVhayBhO2lmKGt8fGgpe2g9ZS53aW5kb3c9PT1lP2U6KGg9ZS5vd25lckRvY3VtZW50KT9oLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvdzp3aW5kb3c7aWYoayl7aWYobj1jLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50LGs9ZCxuPW4/V2Mobik6bnVsbCxudWxsIT09XG5uJiYoSj1WYihuKSxuIT09Snx8NSE9PW4udGFnJiY2IT09bi50YWcpKW49bnVsbH1lbHNlIGs9bnVsbCxuPWQ7aWYoayE9PW4pe3Q9QmQ7Rj1cIm9uTW91c2VMZWF2ZVwiO3g9XCJvbk1vdXNlRW50ZXJcIjt3PVwibW91c2VcIjtpZihcInBvaW50ZXJvdXRcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWEpdD1UZCxGPVwib25Qb2ludGVyTGVhdmVcIix4PVwib25Qb2ludGVyRW50ZXJcIix3PVwicG9pbnRlclwiO0o9bnVsbD09az9oOnVlKGspO3U9bnVsbD09bj9oOnVlKG4pO2g9bmV3IHQoRix3K1wibGVhdmVcIixrLGMsZSk7aC50YXJnZXQ9SjtoLnJlbGF0ZWRUYXJnZXQ9dTtGPW51bGw7V2MoZSk9PT1kJiYodD1uZXcgdCh4LHcrXCJlbnRlclwiLG4sYyxlKSx0LnRhcmdldD11LHQucmVsYXRlZFRhcmdldD1KLEY9dCk7Sj1GO2lmKGsmJm4pYjp7dD1rO3g9bjt3PTA7Zm9yKHU9dDt1O3U9dmYodSkpdysrO3U9MDtmb3IoRj14O0Y7Rj12ZihGKSl1Kys7Zm9yKDswPHctdTspdD12Zih0KSx3LS07Zm9yKDswPHUtdzspeD1cbnZmKHgpLHUtLTtmb3IoO3ctLTspe2lmKHQ9PT14fHxudWxsIT09eCYmdD09PXguYWx0ZXJuYXRlKWJyZWFrIGI7dD12Zih0KTt4PXZmKHgpfXQ9bnVsbH1lbHNlIHQ9bnVsbDtudWxsIT09ayYmd2YoZyxoLGssdCwhMSk7bnVsbCE9PW4mJm51bGwhPT1KJiZ3ZihnLEosbix0LCEwKX19fWE6e2g9ZD91ZShkKTp3aW5kb3c7az1oLm5vZGVOYW1lJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoXCJzZWxlY3RcIj09PWt8fFwiaW5wdXRcIj09PWsmJlwiZmlsZVwiPT09aC50eXBlKXZhciBuYT12ZTtlbHNlIGlmKG1lKGgpKWlmKHdlKW5hPUZlO2Vsc2V7bmE9RGU7dmFyIHhhPUNlfWVsc2Uoaz1oLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09ay50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09aC50eXBlfHxcInJhZGlvXCI9PT1oLnR5cGUpJiYobmE9RWUpO2lmKG5hJiYobmE9bmEoYSxkKSkpe25lKGcsbmEsYyxlKTticmVhayBhfXhhJiZ4YShhLGgsZCk7XCJmb2N1c291dFwiPT09YSYmKHhhPWguX3dyYXBwZXJTdGF0ZSkmJlxueGEuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmY2IoaCxcIm51bWJlclwiLGgudmFsdWUpfXhhPWQ/dWUoZCk6d2luZG93O3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmlmKG1lKHhhKXx8XCJ0cnVlXCI9PT14YS5jb250ZW50RWRpdGFibGUpUWU9eGEsUmU9ZCxTZT1udWxsO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOlNlPVJlPVFlPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlZG93blwiOlRlPSEwO2JyZWFrO2Nhc2UgXCJjb250ZXh0bWVudVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcImRyYWdlbmRcIjpUZT0hMTtVZShnLGMsZSk7YnJlYWs7Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmlmKFBlKWJyZWFrO2Nhc2UgXCJrZXlkb3duXCI6Y2FzZSBcImtleXVwXCI6VWUoZyxjLGUpfXZhciAkYTtpZihhZSliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgYmE9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmJhPVwib25Db21wb3NpdGlvbkVuZFwiO1xuYnJlYWsgYjtjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpiYT1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifWJhPXZvaWQgMH1lbHNlIGllP2dlKGEsYykmJihiYT1cIm9uQ29tcG9zaXRpb25FbmRcIik6XCJrZXlkb3duXCI9PT1hJiYyMjk9PT1jLmtleUNvZGUmJihiYT1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtiYSYmKGRlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGllfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09YmE/XCJvbkNvbXBvc2l0aW9uRW5kXCI9PT1iYSYmaWUmJigkYT1uZCgpKTooa2Q9ZSxsZD1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxpZT0hMCkpLHhhPW9lKGQsYmEpLDA8eGEubGVuZ3RoJiYoYmE9bmV3IExkKGJhLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6YmEsbGlzdGVuZXJzOnhhfSksJGE/YmEuZGF0YT0kYTooJGE9aGUoYyksbnVsbCE9PSRhJiYoYmEuZGF0YT0kYSkpKSk7aWYoJGE9Y2U/amUoYSxjKTprZShhLGMpKWQ9b2UoZCxcIm9uQmVmb3JlSW5wdXRcIiksXG4wPGQubGVuZ3RoJiYoZT1uZXcgTGQoXCJvbkJlZm9yZUlucHV0XCIsXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9JGEpfXNlKGcsYil9KX1mdW5jdGlvbiB0ZihhLGIsYyl7cmV0dXJue2luc3RhbmNlOmEsbGlzdGVuZXI6YixjdXJyZW50VGFyZ2V0OmN9fWZ1bmN0aW9uIG9lKGEsYil7Zm9yKHZhciBjPWIrXCJDYXB0dXJlXCIsZD1bXTtudWxsIT09YTspe3ZhciBlPWEsZj1lLnN0YXRlTm9kZTs1PT09ZS50YWcmJm51bGwhPT1mJiYoZT1mLGY9S2IoYSxjKSxudWxsIT1mJiZkLnVuc2hpZnQodGYoYSxmLGUpKSxmPUtiKGEsYiksbnVsbCE9ZiYmZC5wdXNoKHRmKGEsZixlKSkpO2E9YS5yZXR1cm59cmV0dXJuIGR9ZnVuY3Rpb24gdmYoYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7ZG8gYT1hLnJldHVybjt3aGlsZShhJiY1IT09YS50YWcpO3JldHVybiBhP2E6bnVsbH1cbmZ1bmN0aW9uIHdmKGEsYixjLGQsZSl7Zm9yKHZhciBmPWIuX3JlYWN0TmFtZSxnPVtdO251bGwhPT1jJiZjIT09ZDspe3ZhciBoPWMsaz1oLmFsdGVybmF0ZSxsPWguc3RhdGVOb2RlO2lmKG51bGwhPT1rJiZrPT09ZClicmVhazs1PT09aC50YWcmJm51bGwhPT1sJiYoaD1sLGU/KGs9S2IoYyxmKSxudWxsIT1rJiZnLnVuc2hpZnQodGYoYyxrLGgpKSk6ZXx8KGs9S2IoYyxmKSxudWxsIT1rJiZnLnB1c2godGYoYyxrLGgpKSkpO2M9Yy5yZXR1cm59MCE9PWcubGVuZ3RoJiZhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmd9KX12YXIgeGY9L1xcclxcbj8vZyx5Zj0vXFx1MDAwMHxcXHVGRkZEL2c7ZnVuY3Rpb24gemYoYSl7cmV0dXJuKFwic3RyaW5nXCI9PT10eXBlb2YgYT9hOlwiXCIrYSkucmVwbGFjZSh4ZixcIlxcblwiKS5yZXBsYWNlKHlmLFwiXCIpfWZ1bmN0aW9uIEFmKGEsYixjKXtiPXpmKGIpO2lmKHpmKGEpIT09YiYmYyl0aHJvdyBFcnJvcihwKDQyNSkpO31mdW5jdGlvbiBCZigpe31cbnZhciBDZj1udWxsLERmPW51bGw7ZnVuY3Rpb24gRWYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9XG52YXIgRmY9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDp2b2lkIDAsR2Y9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6dm9p
25114ZCAwLEhmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBQcm9taXNlP1Byb21pc2U6dm9pZCAwLEpmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz9xdWV1ZU1pY3JvdGFzazpcInVuZGVmaW5lZFwiIT09dHlwZW9mIEhmP2Z1bmN0aW9uKGEpe3JldHVybiBIZi5yZXNvbHZlKG51bGwpLnRoZW4oYSkuY2F0Y2goSWYpfTpGZjtmdW5jdGlvbiBJZihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYTt9KX1cbmZ1bmN0aW9uIEtmKGEsYil7dmFyIGM9YixkPTA7ZG97dmFyIGU9Yy5uZXh0U2libGluZzthLnJlbW92ZUNoaWxkKGMpO2lmKGUmJjg9PT1lLm5vZGVUeXBlKWlmKGM9ZS5kYXRhLFwiLyRcIj09PWMpe2lmKDA9PT1kKXthLnJlbW92ZUNoaWxkKGUpO2JkKGIpO3JldHVybn1kLS19ZWxzZVwiJFwiIT09YyYmXCIkP1wiIT09YyYmXCIkIVwiIT09Y3x8ZCsrO2M9ZX13aGlsZShjKTtiZChiKX1mdW5jdGlvbiBMZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVhaztpZig4PT09Yil7Yj1hLmRhdGE7aWYoXCIkXCI9PT1ifHxcIiQhXCI9PT1ifHxcIiQ/XCI9PT1iKWJyZWFrO2lmKFwiLyRcIj09PWIpcmV0dXJuIG51bGx9fXJldHVybiBhfVxuZnVuY3Rpb24gTWYoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIE5mPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLE9mPVwiX19yZWFjdEZpYmVyJFwiK05mLFBmPVwiX19yZWFjdFByb3BzJFwiK05mLHVmPVwiX19yZWFjdENvbnRhaW5lciRcIitOZixvZj1cIl9fcmVhY3RFdmVudHMkXCIrTmYsUWY9XCJfX3JlYWN0TGlzdGVuZXJzJFwiK05mLFJmPVwiX19yZWFjdEhhbmRsZXMkXCIrTmY7XG5mdW5jdGlvbiBXYyhhKXt2YXIgYj1hW09mXTtpZihiKXJldHVybiBiO2Zvcih2YXIgYz1hLnBhcmVudE5vZGU7Yzspe2lmKGI9Y1t1Zl18fGNbT2ZdKXtjPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1iLmNoaWxkfHxudWxsIT09YyYmbnVsbCE9PWMuY2hpbGQpZm9yKGE9TWYoYSk7bnVsbCE9PWE7KXtpZihjPWFbT2ZdKXJldHVybiBjO2E9TWYoYSl9cmV0dXJuIGJ9YT1jO2M9YS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIENiKGEpe2E9YVtPZl18fGFbdWZdO3JldHVybiFhfHw1IT09YS50YWcmJjYhPT1hLnRhZyYmMTMhPT1hLnRhZyYmMyE9PWEudGFnP251bGw6YX1mdW5jdGlvbiB1ZShhKXtpZig1PT09YS50YWd8fDY9PT1hLnRhZylyZXR1cm4gYS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IocCgzMykpO31mdW5jdGlvbiBEYihhKXtyZXR1cm4gYVtQZl18fG51bGx9dmFyIFNmPVtdLFRmPS0xO2Z1bmN0aW9uIFVmKGEpe3JldHVybntjdXJyZW50OmF9fVxuZnVuY3Rpb24gRShhKXswPlRmfHwoYS5jdXJyZW50PVNmW1RmXSxTZltUZl09bnVsbCxUZi0tKX1mdW5jdGlvbiBHKGEsYil7VGYrKztTZltUZl09YS5jdXJyZW50O2EuY3VycmVudD1ifXZhciBWZj17fSxIPVVmKFZmKSxXZj1VZighMSksWGY9VmY7ZnVuY3Rpb24gWWYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBWZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1cbmZ1bmN0aW9uIFpmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gJGYoKXtFKFdmKTtFKEgpfWZ1bmN0aW9uIGFnKGEsYixjKXtpZihILmN1cnJlbnQhPT1WZil0aHJvdyBFcnJvcihwKDE2OCkpO0coSCxiKTtHKFdmLGMpfWZ1bmN0aW9uIGJnKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtiPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYikpdGhyb3cgRXJyb3IocCgxMDgsUmEoYSl8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gQSh7fSxjLGQpfVxuZnVuY3Rpb24gY2coYSl7YT0oYT1hLnN0YXRlTm9kZSkmJmEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fFZmO1hmPUguY3VycmVudDtHKEgsYSk7RyhXZixXZi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBkZyhhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IocCgxNjkpKTtjPyhhPWJnKGEsYixYZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEUoV2YpLEUoSCksRyhILGEpKTpFKFdmKTtHKFdmLGMpfXZhciBlZz1udWxsLGZnPSExLGdnPSExO2Z1bmN0aW9uIGhnKGEpe251bGw9PT1lZz9lZz1bYV06ZWcucHVzaChhKX1mdW5jdGlvbiBpZyhhKXtmZz0hMDtoZyhhKX1cbmZ1bmN0aW9uIGpnKCl7aWYoIWdnJiZudWxsIT09ZWcpe2dnPSEwO3ZhciBhPTAsYj1DO3RyeXt2YXIgYz1lZztmb3IoQz0xO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1jW2FdO2RvIGQ9ZCghMCk7d2hpbGUobnVsbCE9PWQpfWVnPW51bGw7Zmc9ITF9Y2F0Y2goZSl7dGhyb3cgbnVsbCE9PWVnJiYoZWc9ZWcuc2xpY2UoYSsxKSksYWMoZmMsamcpLGU7fWZpbmFsbHl7Qz1iLGdnPSExfX1yZXR1cm4gbnVsbH12YXIga2c9W10sbGc9MCxtZz1udWxsLG5nPTAsb2c9W10scGc9MCxxZz1udWxsLHJnPTEsc2c9XCJcIjtmdW5jdGlvbiB0ZyhhLGIpe2tnW2xnKytdPW5nO2tnW2xnKytdPW1nO21nPWE7bmc9Yn1cbmZ1bmN0aW9uIHVnKGEsYixjKXtvZ1twZysrXT1yZztvZ1twZysrXT1zZztvZ1twZysrXT1xZztxZz1hO3ZhciBkPXJnO2E9c2c7dmFyIGU9MzItb2MoZCktMTtkJj1+KDE8PGUpO2MrPTE7dmFyIGY9MzItb2MoYikrZTtpZigzMDxmKXt2YXIgZz1lLWUlNTtmPShkJigxPDxnKS0xKS50b1N0cmluZygzMik7ZD4+PWc7ZS09ZztyZz0xPDwzMi1vYyhiKStlfGM8PGV8ZDtzZz1mK2F9ZWxzZSByZz0xPDxmfGM8PGV8ZCxzZz1hfWZ1bmN0aW9uIHZnKGEpe251bGwhPT1hLnJldHVybiYmKHRnKGEsMSksdWcoYSwxLDApKX1mdW5jdGlvbiB3Zy
25114hhKXtmb3IoO2E9PT1tZzspbWc9a2dbLS1sZ10sa2dbbGddPW51bGwsbmc9a2dbLS1sZ10sa2dbbGddPW51bGw7Zm9yKDthPT09cWc7KXFnPW9nWy0tcGddLG9nW3BnXT1udWxsLHNnPW9nWy0tcGddLG9nW3BnXT1udWxsLHJnPW9nWy0tcGddLG9nW3BnXT1udWxsfXZhciB4Zz1udWxsLHlnPW51bGwsST0hMSx6Zz1udWxsO1xuZnVuY3Rpb24gQWcoYSxiKXt2YXIgYz1CZyg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2Muc3RhdGVOb2RlPWI7Yy5yZXR1cm49YTtiPWEuZGVsZXRpb25zO251bGw9PT1iPyhhLmRlbGV0aW9ucz1bY10sYS5mbGFnc3w9MTYpOmIucHVzaChjKX1cbmZ1bmN0aW9uIENnKGEsYil7c3dpdGNoKGEudGFnKXtjYXNlIDU6dmFyIGM9YS50eXBlO2I9MSE9PWIubm9kZVR5cGV8fGMudG9Mb3dlckNhc2UoKSE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOmI7cmV0dXJuIG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLHhnPWEseWc9TGYoYi5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiBiPVwiXCI9PT1hLnBlbmRpbmdQcm9wc3x8MyE9PWIubm9kZVR5cGU/bnVsbDpiLG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLHhnPWEseWc9bnVsbCwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4gYj04IT09Yi5ub2RlVHlwZT9udWxsOmIsbnVsbCE9PWI/KGM9bnVsbCE9PXFnP3tpZDpyZyxvdmVyZmxvdzpzZ306bnVsbCxhLm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6Yix0cmVlQ29udGV4dDpjLHJldHJ5TGFuZToxMDczNzQxODI0fSxjPUJnKDE4LG51bGwsbnVsbCwwKSxjLnN0YXRlTm9kZT1iLGMucmV0dXJuPWEsYS5jaGlsZD1jLHhnPWEseWc9XG5udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBEZyhhKXtyZXR1cm4gMCE9PShhLm1vZGUmMSkmJjA9PT0oYS5mbGFncyYxMjgpfWZ1bmN0aW9uIEVnKGEpe2lmKEkpe3ZhciBiPXlnO2lmKGIpe3ZhciBjPWI7aWYoIUNnKGEsYikpe2lmKERnKGEpKXRocm93IEVycm9yKHAoNDE4KSk7Yj1MZihjLm5leHRTaWJsaW5nKTt2YXIgZD14ZztiJiZDZyhhLGIpP0FnKGQsYyk6KGEuZmxhZ3M9YS5mbGFncyYtNDA5N3wyLEk9ITEseGc9YSl9fWVsc2V7aWYoRGcoYSkpdGhyb3cgRXJyb3IocCg0MTgpKTthLmZsYWdzPWEuZmxhZ3MmLTQwOTd8MjtJPSExO3hnPWF9fX1mdW5jdGlvbiBGZyhhKXtmb3IoYT1hLnJldHVybjtudWxsIT09YSYmNSE9PWEudGFnJiYzIT09YS50YWcmJjEzIT09YS50YWc7KWE9YS5yZXR1cm47eGc9YX1cbmZ1bmN0aW9uIEdnKGEpe2lmKGEhPT14ZylyZXR1cm4hMTtpZighSSlyZXR1cm4gRmcoYSksST0hMCwhMTt2YXIgYjsoYj0zIT09YS50YWcpJiYhKGI9NSE9PWEudGFnKSYmKGI9YS50eXBlLGI9XCJoZWFkXCIhPT1iJiZcImJvZHlcIiE9PWImJiFFZihhLnR5cGUsYS5tZW1vaXplZFByb3BzKSk7aWYoYiYmKGI9eWcpKXtpZihEZyhhKSl0aHJvdyBIZygpLEVycm9yKHAoNDE4KSk7Zm9yKDtiOylBZyhhLGIpLGI9TGYoYi5uZXh0U2libGluZyl9RmcoYSk7aWYoMTM9PT1hLnRhZyl7YT1hLm1lbW9pemVkU3RhdGU7YT1udWxsIT09YT9hLmRlaHlkcmF0ZWQ6bnVsbDtpZighYSl0aHJvdyBFcnJvcihwKDMxNykpO2E6e2E9YS5uZXh0U2libGluZztmb3IoYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiLyRcIj09PWMpe2lmKDA9PT1iKXt5Zz1MZihhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlXCIkXCIhPT1jJiZcIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfXlnPVxubnVsbH19ZWxzZSB5Zz14Zz9MZihhLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBIZygpe2Zvcih2YXIgYT15ZzthOylhPUxmKGEubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIElnKCl7eWc9eGc9bnVsbDtJPSExfWZ1bmN0aW9uIEpnKGEpe251bGw9PT16Zz96Zz1bYV06emcucHVzaChhKX12YXIgS2c9dWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG5mdW5jdGlvbiBMZyhhLGIsYyl7YT1jLnJlZjtpZihudWxsIT09YSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJlwib2JqZWN0XCIhPT10eXBlb2YgYSl7aWYoYy5fb3duZXIpe2M9Yy5fb3duZXI7aWYoYyl7aWYoMSE9PWMudGFnKXRocm93IEVycm9yKHAoMzA5KSk7dmFyIGQ9Yy5zdGF0ZU5vZGV9aWYoIWQpdGhyb3cgRXJyb3IocCgxNDcsYSkpO3Z
25114hciBlPWQsZj1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZilyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1lLnJlZnM7bnVsbD09PWE/ZGVsZXRlIGJbZl06YltmXT1hfTtiLl9zdHJpbmdSZWY9ZjtyZXR1cm4gYn1pZihcInN0cmluZ1wiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IocCgyODQpKTtpZighYy5fb3duZXIpdGhyb3cgRXJyb3IocCgyOTAsYSkpO31yZXR1cm4gYX1cbmZ1bmN0aW9uIE1nKGEsYil7YT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik7dGhyb3cgRXJyb3IocCgzMSxcIltvYmplY3QgT2JqZWN0XVwiPT09YT9cIm9iamVjdCB3aXRoIGtleXMge1wiK09iamVjdC5rZXlzKGIpLmpvaW4oXCIsIFwiKStcIn1cIjphKSk7fWZ1bmN0aW9uIE5nKGEpe3ZhciBiPWEuX2luaXQ7cmV0dXJuIGIoYS5fcGF5bG9hZCl9XG5mdW5jdGlvbiBPZyhhKXtmdW5jdGlvbiBiKGIsYyl7aWYoYSl7dmFyIGQ9Yi5kZWxldGlvbnM7bnVsbD09PWQ/KGIuZGVsZXRpb25zPVtjXSxiLmZsYWdzfD0xNik6ZC5wdXNoKGMpfX1mdW5jdGlvbiBjKGMsZCl7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKDtudWxsIT09ZDspYihjLGQpLGQ9ZC5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIGQoYSxiKXtmb3IoYT1uZXcgTWFwO251bGwhPT1iOyludWxsIT09Yi5rZXk/YS5zZXQoYi5rZXksYik6YS5zZXQoYi5pbmRleCxiKSxiPWIuc2libGluZztyZXR1cm4gYX1mdW5jdGlvbiBlKGEsYil7YT1QZyhhLGIpO2EuaW5kZXg9MDthLnNpYmxpbmc9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiBmKGIsYyxkKXtiLmluZGV4PWQ7aWYoIWEpcmV0dXJuIGIuZmxhZ3N8PTEwNDg1NzYsYztkPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1kKXJldHVybiBkPWQuaW5kZXgsZDxjPyhiLmZsYWdzfD0yLGMpOmQ7Yi5mbGFnc3w9MjtyZXR1cm4gY31mdW5jdGlvbiBnKGIpe2EmJlxubnVsbD09PWIuYWx0ZXJuYXRlJiYoYi5mbGFnc3w9Mik7cmV0dXJuIGJ9ZnVuY3Rpb24gaChhLGIsYyxkKXtpZihudWxsPT09Ynx8NiE9PWIudGFnKXJldHVybiBiPVFnKGMsYS5tb2RlLGQpLGIucmV0dXJuPWEsYjtiPWUoYixjKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIGsoYSxiLGMsZCl7dmFyIGY9Yy50eXBlO2lmKGY9PT15YSlyZXR1cm4gbShhLGIsYy5wcm9wcy5jaGlsZHJlbixkLGMua2V5KTtpZihudWxsIT09YiYmKGIuZWxlbWVudFR5cGU9PT1mfHxcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLiQkdHlwZW9mPT09SGEmJk5nKGYpPT09Yi50eXBlKSlyZXR1cm4gZD1lKGIsYy5wcm9wcyksZC5yZWY9TGcoYSxiLGMpLGQucmV0dXJuPWEsZDtkPVJnKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwsYS5tb2RlLGQpO2QucmVmPUxnKGEsYixjKTtkLnJldHVybj1hO3JldHVybiBkfWZ1bmN0aW9uIGwoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8XG5iLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIT09Yy5jb250YWluZXJJbmZvfHxiLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiE9PWMuaW1wbGVtZW50YXRpb24pcmV0dXJuIGI9U2coYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMuY2hpbGRyZW58fFtdKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIG0oYSxiLGMsZCxmKXtpZihudWxsPT09Ynx8NyE9PWIudGFnKXJldHVybiBiPVRnKGMsYS5tb2RlLGQsZiksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gcShhLGIsYyl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBiJiZcIlwiIT09Ynx8XCJudW1iZXJcIj09PXR5cGVvZiBiKXJldHVybiBiPVFnKFwiXCIrYixhLm1vZGUsYyksYi5yZXR1cm49YSxiO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYiYmbnVsbCE9PWIpe3N3aXRjaChiLiQkdHlwZW9mKXtjYXNlIHZhOnJldHVybiBjPVJnKGIudHlwZSxiLmtleSxiLnByb3BzLG51bGwsYS5tb2RlLGMpLFxuYy5yZWY9TGcoYSxudWxsLGIpLGMucmV0dXJuPWEsYztjYXNlIHdhOnJldHVybiBiPVNnKGIsYS5tb2RlLGMpLGIucmV0dXJuPWEsYjtjYXNlIEhhOnZhciBkPWIuX2luaXQ7cmV0dXJuIHEoYSxkKGIuX3BheWxvYWQpLGMpfWlmKGViKGIpfHxLYShiKSlyZXR1cm4gYj1UZyhiLGEubW9kZSxjLG51bGwpLGIucmV0dXJuPWEsYjtNZyhhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIHIoYSxiLGMsZCl7dmFyIGU9bnVsbCE9PWI/Yi5rZXk6bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGMmJlwiXCIhPT1jfHxcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIG51bGwhPT1lP251bGw6aChhLGIsXCJcIitjLGQpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWMpe3N3aXRjaChjLiQkdHlwZW9mKXtjYXNlIHZhOnJldHVybiBjLmtleT09PWU/ayhhLGIsYyxkKTpudWxsO2Nhc2Ugd2E6cmV0dXJuIGMua2V5PT09ZT9sKGEsYixjLGQpOm51bGw7Y2FzZSBIYTpyZXR1cm4gZT1jLl9pbml0LHIoYSxcbmIsZShjLl9wYXlsb2FkKSxkKX1pZihlYihjKXx8S2EoYykpcmV0dXJuIG51bGwhPT1lP251bGw6bShhLGIsYyxkLG51bGwpO01nKGEsYyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geShhLGIsYyxkLGUpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZCYmXCJcIiE9PWR8fFwibnVtYmVyXCI9PT10eXBlb2YgZClyZXR1cm4gYT1hLmdldChjKXx8bnVsbCxoKGIsYSxcIlwiK2QsZSk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBkJiZudWxsIT09ZCl7c3dpdGNoKGQuJCR0eXBlb2Ype2Nhc2UgdmE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGsoYixhLGQsZSk7Y2FzZSB3YTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsbChiLGEsZCxlKTtjYXNlIEhhOnZhciBmPWQuX2luaXQ7cmV0dXJuIHkoYSxiLGMsZihkLl9wYXlsb2FkKSxlKX1pZihlYihkKXx8S2EoZCkpcmV0dXJuIGE9YS5nZXQoYyl8fG51bGwsbShiLGEsZCxlLG51bGwpO01nKGIsZCl9cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBuKGUsZyxoLGspe2Zvcih2YXIgbD1udWxsLG09bnVsbCx1PWcsdz1nPTAseD1udWxsO251bGwhPT11JiZ3PGgubGVuZ3RoO3crKyl7dS5pbmRleD53Pyh4PXUsdT1udWxsKTp4PXUuc2libGluZzt2YXIgbj1yKGUsdSxoW3ddLGspO2lmKG51bGw9PT1uKXtudWxsPT09dSYmKHU9eCk7YnJlYWt9YSYmdSYmbnVsbD09PW4uYWx0ZXJuYXRlJiZiKGUsdSk7Zz1mKG4sZyx3KTtudWxsPT09bT9sPW46bS5zaWJsaW5nPW47bT1uO3U9eH1pZih3PT09aC5sZW5ndGgpcmV0dXJuIGMoZSx1KSxJJiZ0ZyhlLHcpLGw7aWYobnVsbD09PXUpe2Zvcig7dzxoLmxlbmd0aDt3Kysp
25114dT1xKGUsaFt3XSxrKSxudWxsIT09dSYmKGc9Zih1LGcsdyksbnVsbD09PW0/bD11Om0uc2libGluZz11LG09dSk7SSYmdGcoZSx3KTtyZXR1cm4gbH1mb3IodT1kKGUsdSk7dzxoLmxlbmd0aDt3KyspeD15KHUsZSx3LGhbd10sayksbnVsbCE9PXgmJihhJiZudWxsIT09eC5hbHRlcm5hdGUmJnUuZGVsZXRlKG51bGw9PT1cbngua2V5P3c6eC5rZXkpLGc9Zih4LGcsdyksbnVsbD09PW0/bD14Om0uc2libGluZz14LG09eCk7YSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtJJiZ0ZyhlLHcpO3JldHVybiBsfWZ1bmN0aW9uIHQoZSxnLGgsayl7dmFyIGw9S2EoaCk7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGwpdGhyb3cgRXJyb3IocCgxNTApKTtoPWwuY2FsbChoKTtpZihudWxsPT1oKXRocm93IEVycm9yKHAoMTUxKSk7Zm9yKHZhciB1PWw9bnVsbCxtPWcsdz1nPTAseD1udWxsLG49aC5uZXh0KCk7bnVsbCE9PW0mJiFuLmRvbmU7dysrLG49aC5uZXh0KCkpe20uaW5kZXg+dz8oeD1tLG09bnVsbCk6eD1tLnNpYmxpbmc7dmFyIHQ9cihlLG0sbi52YWx1ZSxrKTtpZihudWxsPT09dCl7bnVsbD09PW0mJihtPXgpO2JyZWFrfWEmJm0mJm51bGw9PT10LmFsdGVybmF0ZSYmYihlLG0pO2c9Zih0LGcsdyk7bnVsbD09PXU/bD10OnUuc2libGluZz10O3U9dDttPXh9aWYobi5kb25lKXJldHVybiBjKGUsXG5tKSxJJiZ0ZyhlLHcpLGw7aWYobnVsbD09PW0pe2Zvcig7IW4uZG9uZTt3Kyssbj1oLm5leHQoKSluPXEoZSxuLnZhbHVlLGspLG51bGwhPT1uJiYoZz1mKG4
25114sZyx3KSxudWxsPT09dT9sPW46dS5zaWJsaW5nPW4sdT1uKTtJJiZ0ZyhlLHcpO3JldHVybiBsfWZvcihtPWQoZSxtKTshbi5kb25lO3crKyxuPWgubmV4dCgpKW49eShtLGUsdyxuLnZhbHVlLGspLG51bGwhPT1uJiYoYSYmbnVsbCE9PW4uYWx0ZXJuYXRlJiZtLmRlbGV0ZShudWxsPT09bi5rZXk/dzpuLmtleSksZz1mKG4sZyx3KSxudWxsPT09dT9sPW46dS5zaWJsaW5nPW4sdT1uKTthJiZtLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO0kmJnRnKGUsdyk7cmV0dXJuIGx9ZnVuY3Rpb24gSihhLGQsZixoKXtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mJiZmLnR5cGU9PT15YSYmbnVsbD09PWYua2V5JiYoZj1mLnByb3BzLmNoaWxkcmVuKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mKXtzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSB2YTphOntmb3IodmFyIGs9XG5mLmtleSxsPWQ7bnVsbCE9PWw7KXtpZihsLmtleT09PWspe2s9Zi50eXBlO2lmKGs9PT15YSl7aWYoNz09PWwudGFnKXtjKGEsbC5zaWJsaW5nKTtkPWUobCxmLnByb3BzLmNoaWxkcmVuKTtkLnJldHVybj1hO2E9ZDticmVhayBhfX1lbHNlIGlmKGwuZWxlbWVudFR5cGU9PT1rfHxcIm9iamVjdFwiPT09dHlwZW9mIGsmJm51bGwhPT1rJiZrLiQkdHlwZW9mPT09SGEmJk5nKGspPT09bC50eXBlKXtjKGEsbC5zaWJsaW5nKTtkPWUobCxmLnByb3BzKTtkLnJlZj1MZyhhLGwsZik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX1jKGEsbCk7YnJlYWt9ZWxzZSBiKGEsbCk7bD1sLnNpYmxpbmd9Zi50eXBlPT09eWE/KGQ9VGcoZi5wcm9wcy5jaGlsZHJlbixhLm1vZGUsaCxmLmtleSksZC5yZXR1cm49YSxhPWQpOihoPVJnKGYudHlwZSxmLmtleSxmLnByb3BzLG51bGwsYS5tb2RlLGgpLGgucmVmPUxnKGEsZCxmKSxoLnJldHVybj1hLGE9aCl9cmV0dXJuIGcoYSk7Y2FzZSB3YTphOntmb3IobD1mLmtleTtudWxsIT09XG5kOyl7aWYoZC5rZXk9PT1sKWlmKDQ9PT1kLnRhZyYmZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PWYuY29udGFpbmVySW5mbyYmZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT1mLmltcGxlbWVudGF0aW9uKXtjKGEsZC5zaWJsaW5nKTtkPWUoZCxmLmNoaWxkcmVufHxbXSk7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX1lbHNle2MoYSxkKTticmVha31lbHNlIGIoYSxkKTtkPWQuc2libGluZ31kPVNnKGYsYS5tb2RlLGgpO2QucmV0dXJuPWE7YT1kfXJldHVybiBnKGEpO2Nhc2UgSGE6cmV0dXJuIGw9Zi5faW5pdCxKKGEsZCxsKGYuX3BheWxvYWQpLGgpfWlmKGViKGYpKXJldHVybiBuKGEsZCxmLGgpO2lmKEthKGYpKXJldHVybiB0KGEsZCxmLGgpO01nKGEsZil9cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBmJiZcIlwiIT09Znx8XCJudW1iZXJcIj09PXR5cGVvZiBmPyhmPVwiXCIrZixudWxsIT09ZCYmNj09PWQudGFnPyhjKGEsZC5zaWJsaW5nKSxkPWUoZCxmKSxkLnJldHVybj1hLGE9ZCk6XG4oYyhhLGQpLGQ9UWcoZixhLm1vZGUsaCksZC5yZXR1cm49YSxhPWQpLGcoYSkpOmMoYSxkKX1yZXR1cm4gSn12YXIgVWc9T2coITApLFZnPU9nKCExKSxXZz1VZihudWxsKSxYZz1udWxsLFlnPW51bGwsWmc9bnVsbDtmdW5jdGlvbiAkZygpe1pnPVlnPVhnPW51bGx9ZnVuY3Rpb24gYWgoYSl7dmFyIGI9V2cuY3VycmVudDtFKFdnKTthLl9jdXJyZW50VmFsdWU9Yn1mdW5jdGlvbiBiaChhLGIsYyl7Zm9yKDtudWxsIT09YTspe3ZhciBkPWEuYWx0ZXJuYXRlOyhhLmNoaWxkTGFuZXMmYikhPT1iPyhhLmNoaWxkTGFuZXN8PWIsbnVsbCE9PWQmJihkLmNoaWxkTGFuZXN8PWIpKTpudWxsIT09ZCYmKGQuY2hpbGRMYW5lcyZiKSE9PWImJihkLmNoaWxkTGFuZXN8PWIpO2lmKGE9PT1jKWJyZWFrO2E9YS5yZXR1cm59fVxuZnVuY3Rpb24gY2goYSxiKXtYZz1hO1pnPVlnPW51bGw7YT1hLmRlcGVuZGVuY2llcztudWxsIT09YSYmbnVsbCE9PWEuZmlyc3RDb250ZXh0JiYoMCE9PShhLmxhbmVzJmIpJiYoZGg9ITApLGEuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIGVoKGEpe3ZhciBiPWEuX2N1cnJlbnRWYWx1ZTtpZihaZyE9PWEpaWYoYT17Y29udGV4dDphLG1lbW9pemVkVmFsdWU6YixuZXh0Om51bGx9LG51bGw9PT1ZZyl7aWYobnVsbD09PVhnKXRocm93IEVycm9yKHAoMzA4KSk7WWc9YTtYZy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmF9fWVsc2UgWWc9WWcubmV4dD1hO3JldHVybiBifXZhciBmaD1udWxsO2Z1bmN0aW9uIGdoKGEpe251bGw9PT1maD9maD1bYV06ZmgucHVzaChhKX1cbmZ1bmN0aW9uIGhoKGEsYixjLGQpe3ZhciBlPWIuaW50ZXJsZWF2ZWQ7bnVsbD09PWU/KGMubmV4dD1jLGdoKGIpKTooYy5uZXh0PWUubmV4dCxlLm5leHQ9Yyk7Yi5pbnRlcmxlYXZlZD1jO3JldHVybiBpaChhLGQpfWZ1bmN0aW9uIGloKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO2M9YTtmb3IoYT1hLnJldHVybjtudWxsIT09YTspYS5jaGlsZExhbmVzfD1iLGM9YS5hbHRlcm5hdGUsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpLGM9YSxhPWEucmV0dXJuO3JldHVybiAzPT09Yy50YWc/Yy5zdGF0ZU5vZGU6bnVsbH12YXIgamg9ITE7ZnVuY3Rpb24ga2goYSl7YS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1cbmZ1bmN0aW9uIGxoKGEsYil7YT1hLnVwZGF0ZVF1ZXVlO2IudXBkYXRlUXVldWU9PT1hJiYoYi51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmEuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTphLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTphLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDphLnNoYXJlZCxlZmZlY3RzOmEuZWZmZWN0c30pfWZ1bmN0aW9uIG1oKGEsYil7cmV0dXJue2V2ZW50VGltZTphLGxhbmU6Yix0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fVxuZnVuY3Rpb24gbmgoYSxiLGMpe3ZhciBkPWEudXBkYXRlUXVldWU7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7ZD1kLnNoYXJlZDtpZigwIT09KEsmMikpe3ZhciBlPWQucGVuZGluZztudWxsPT09ZT9iLm5leHQ9YjooYi5uZXh0PWUubmV4dCxlLm5leHQ9Yik7ZC5wZW5kaW5nPWI
251147cmV0dXJuIGloKGEsYyl9ZT1kLmludGVybGVhdmVkO251bGw9PT1lPyhiLm5leHQ9YixnaChkKSk6KGIubmV4dD1lLm5leHQsZS5uZXh0PWIpO2QuaW50ZXJsZWF2ZWQ9YjtyZXR1cm4gaWgoYSxjKX1mdW5jdGlvbiBvaChhLGIsYyl7Yj1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iJiYoYj1iLnNoYXJlZCwwIT09KGMmNDE5NDI0MCkpKXt2YXIgZD1iLmxhbmVzO2QmPWEucGVuZGluZ0xhbmVzO2N8PWQ7Yi5sYW5lcz1jO0NjKGEsYyl9fVxuZnVuY3Rpb24gcGgoYSxiKXt2YXIgYz1hLnVwZGF0ZVF1ZXVlLGQ9YS5hbHRlcm5hdGU7aWYobnVsbCE9PWQmJihkPWQudXBkYXRlUXVldWUsYz09PWQpKXt2YXIgZT1udWxsLGY9bnVsbDtjPWMuZmlyc3RCYXNlVXBkYXRlO2lmKG51bGwhPT1jKXtkb3t2YXIgZz17ZXZlbnRUaW1lOmMuZXZlbnRUaW1lLGxhbmU6Yy5sYW5lLHRhZzpjLnRhZyxwYXlsb2FkOmMucGF5bG9hZCxjYWxsYmFjazpjLmNhbGxiYWNrLG5leHQ6bnVsbH07bnVsbD09PWY/ZT1mPWc6Zj1mLm5leHQ9ZztjPWMubmV4dH13aGlsZShudWxsIT09Yyk7bnVsbD09PWY/ZT1mPWI6Zj1mLm5leHQ9Yn1lbHNlIGU9Zj1iO2M9e2Jhc2VTdGF0ZTpkLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6ZSxsYXN0QmFzZVVwZGF0ZTpmLHNoYXJlZDpkLnNoYXJlZCxlZmZlY3RzOmQuZWZmZWN0c307YS51cGRhdGVRdWV1ZT1jO3JldHVybn1hPWMubGFzdEJhc2VVcGRhdGU7bnVsbD09PWE/Yy5maXJzdEJhc2VVcGRhdGU9YjphLm5leHQ9XG5iO2MubGFzdEJhc2VVcGRhdGU9Yn1cbmZ1bmN0aW9uIHFoKGEsYixjLGQpe3ZhciBlPWEudXBkYXRlUXVldWU7amg9ITE7dmFyIGY9ZS5maXJzdEJhc2VVcGRhdGUsZz1lLmxhc3RCYXNlVXBkYXRlLGg9ZS5zaGFyZWQucGVuZGluZztpZihudWxsIT09aCl7ZS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBrPWgsbD1rLm5leHQ7ay5uZXh0PW51bGw7bnVsbD09PWc/Zj1sOmcubmV4dD1sO2c9azt2YXIgbT1hLmFsdGVybmF0ZTtudWxsIT09bSYmKG09bS51cGRhdGVRdWV1ZSxoPW0ubGFzdEJhc2VVcGRhdGUsaCE9PWcmJihudWxsPT09aD9tLmZpcnN0QmFzZVVwZGF0ZT1sOmgubmV4dD1sLG0ubGFzdEJhc2VVcGRhdGU9aykpfWlmKG51bGwhPT1mKXt2YXIgcT1lLmJhc2VTdGF0ZTtnPTA7bT1sPWs9bnVsbDtoPWY7ZG97dmFyIHI9aC5sYW5lLHk9aC5ldmVudFRpbWU7aWYoKGQmcik9PT1yKXtudWxsIT09bSYmKG09bS5uZXh0PXtldmVudFRpbWU6eSxsYW5lOjAsdGFnOmgudGFnLHBheWxvYWQ6aC5wYXlsb2FkLGNhbGxiYWNrOmguY2FsbGJhY2ssXG5uZXh0Om51bGx9KTthOnt2YXIgbj1hLHQ9aDtyPWI7eT1jO3N3aXRjaCh0LnRhZyl7Y2FzZSAxOm49dC5wYXlsb2FkO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuKXtxPW4uY2FsbCh5LHEscik7YnJlYWsgYX1xPW47YnJlYWsgYTtjYXNlIDM6bi5mbGFncz1uLmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOm49dC5wYXlsb2FkO3I9XCJmdW5jdGlvblwiPT09dHlwZW9mIG4/bi5jYWxsKHkscSxyKTpuO2lmKG51bGw9PT1yfHx2b2lkIDA9PT1yKWJyZWFrIGE7cT1BKHt9LHEscik7YnJlYWsgYTtjYXNlIDI6amg9ITB9fW51bGwhPT1oLmNhbGxiYWNrJiYwIT09aC5sYW5lJiYoYS5mbGFnc3w9NjQscj1lLmVmZmVjdHMsbnVsbD09PXI/ZS5lZmZlY3RzPVtoXTpyLnB1c2goaCkpfWVsc2UgeT17ZXZlbnRUaW1lOnksbGFuZTpyLHRhZzpoLnRhZyxwYXlsb2FkOmgucGF5bG9hZCxjYWxsYmFjazpoLmNhbGxiYWNrLG5leHQ6bnVsbH0sbnVsbD09PW0/KGw9bT15LGs9cSk6bT1tLm5leHQ9eSxnfD1yO1xuaD1oLm5leHQ7aWYobnVsbD09PWgpaWYoaD1lLnNoYXJlZC5wZW5kaW5nLG51bGw9PT1oKWJyZWFrO2Vsc2Ugcj1oLGg9ci5uZXh0LHIubmV4dD1udWxsLGUubGFzdEJhc2VVcGRhdGU9cixlLnNoYXJlZC5wZW5kaW5nPW51bGx9d2hpbGUoMSk7bnVsbD09PW0mJihrPXEpO2UuYmFzZVN0YXRlPWs7ZS5maXJzdEJhc2VVcGRhdGU9bDtlLmxhc3RCYXNlVXBkYXRlPW07Yj1lLnNoYXJlZC5pbnRlcmxlYXZlZDtpZihudWxsIT09Yil7ZT1iO2RvIGd8PWUubGFuZSxlPWUubmV4dDt3aGlsZShlIT09Yil9ZWxzZSBudWxsPT09ZiYmKGUuc2hhcmVkLmxhbmVzPTApO3JofD1nO2EubGFuZXM9ZzthLm1lbW9pemVkU3RhdGU9cX19XG5mdW5jdGlvbiBzaChhLGIsYyl7YT1iLmVmZmVjdHM7Yi5lZmZlY3RzPW51bGw7aWYobnVsbCE9PWEpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXSxlPWQuY2FsbGJhY2s7aWYobnVsbCE9PWUpe2QuY2FsbGJhY2s9bnVsbDtkPWM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGUpdGhyb3cgRXJyb3IocCgxOTEsZSkpO2UuY2FsbChkKX19fXZhciB0aD17fSx1aD1VZih0aCksdmg9VWYodGgpLHdoPVVmKHRoKTtmdW5jdGlvbiB4aChhKXtpZihhPT09dGgpdGhyb3cgRXJyb3IocCgxNzQpKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHloKGEsYil7Ryh3aCxiKTtHKHZoLGEpO0codWgsdGgpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6bGIobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPWxiKGIsYSl9RSh1aCk7Ryh1aCxiKX1mdW5jdGlvbiB6aCgpe0UodWgpO0UodmgpO0Uod2gpfWZ1bmN0aW9uIEFoKGEpe3hoKHdoLmN1cnJlbnQpO3ZhciBiPXhoKHVoLmN1cnJlbnQpO3ZhciBjPWxiKGIsYS50eXBlKTtiIT09YyYmKEcodmgsYSksRyh1aCxjKSl9ZnVuY3Rpb24gQmgoYSl7dmguY3VycmVudD09PWEmJihFKHVoKSxFKHZoKSl9dmFyIEw9VWYoMCk7XG5mdW5jdGlvbiBDaChhKXtmb3IodmFyIGI9YTtudWxsIT09Yjspe2lmKDEzPT09Yi50YWcpe3ZhciBjPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YyYmKGM9Yy5kZWh5ZHJhdGVkLG51bGw9PT1jfHxcIiQ/XCI9PT1jLmRhdGF8fFwiJCFcIj09PWMuZGF0YSkpcmV0dXJuIGJ9ZWxzZSBpZigxOT09PWIudGFnJiZ2b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIpe2lmKDAhPT0oYi5mbGFncyYxMjgpKXJldHVybi
25114BifWVsc2UgaWYobnVsbCE9PWIuY2hpbGQpe2IuY2hpbGQucmV0dXJuPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ31yZXR1cm4gbnVsbH12YXIgRGg9W107XG5mdW5jdGlvbiBFaCgpe2Zvcih2YXIgYT0wO2E8RGgubGVuZ3RoO2ErKylEaFthXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO0RoLmxlbmd0aD0wfXZhciBGaD11YS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLEdoPXVhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLEhoPTAsTT1udWxsLE49bnVsbCxPPW51bGwsSWg9ITEsSmg9ITEsS2g9MCxMaD0wO2Z1bmN0aW9uIFAoKXt0aHJvdyBFcnJvcihwKDMyMSkpO31mdW5jdGlvbiBNaChhLGIpe2lmKG51bGw9PT1iKXJldHVybiExO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGgmJmM8YS5sZW5ndGg7YysrKWlmKCFIZShhW2NdLGJbY10pKXJldHVybiExO3JldHVybiEwfVxuZnVuY3Rpb24gTmgoYSxiLGMsZCxlLGYpe0hoPWY7TT1iO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtiLmxhbmVzPTA7RmguY3VycmVudD1udWxsPT09YXx8bnVsbD09PWEubWVtb2l6ZWRTdGF0ZT9PaDpQaDthPWMoZCxlKTtpZihKaCl7Zj0wO2Rve0poPSExO0toPTA7aWYoMjU8PWYpdGhyb3cgRXJyb3IocCgzMDEpKTtmKz0xO089Tj1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtGaC5jdXJyZW50PVFoO2E9YyhkLGUpfXdoaWxlKEpoKX1GaC5jdXJyZW50PVJoO2I9bnVsbCE9PU4mJm51bGwhPT1OLm5leHQ7SGg9MDtPPU49TT1udWxsO0loPSExO2lmKGIpdGhyb3cgRXJyb3IocCgzMDApKTtyZXR1cm4gYX1mdW5jdGlvbiBTaCgpe3ZhciBhPTAhPT1LaDtLaD0wO3JldHVybiBhfVxuZnVuY3Rpb24gVGgoKXt2YXIgYT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtudWxsPT09Tz9NLm1lbW9pemVkU3RhdGU9Tz1hOk89Ty5uZXh0PWE7cmV0dXJuIE99ZnVuY3Rpb24gVWgoKXtpZihudWxsPT09Til7dmFyIGE9TS5hbHRlcm5hdGU7YT1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGE9Ti5uZXh0O3ZhciBiPW51bGw9PT1PP00ubWVtb2l6ZWRTdGF0ZTpPLm5leHQ7aWYobnVsbCE9PWIpTz1iLE49YTtlbHNle2lmKG51bGw9PT1hKXRocm93IEVycm9yKHAoMzEwKSk7Tj1hO2E9e21lbW9pemVkU3RhdGU6Ti5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpOLmJhc2VTdGF0ZSxiYXNlUXVldWU6Ti5iYXNlUXVldWUscXVldWU6Ti5xdWV1ZSxuZXh0Om51bGx9O251bGw9PT1PP00ubWVtb2l6ZWRTdGF0ZT1PPWE6Tz1PLm5leHQ9YX1yZXR1cm4gT31cbmZ1bmN0aW9uIFZoKGEsYil7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpifVxuZnVuY3Rpb24gV2goYSl7dmFyIGI9VWgoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IocCgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1OLGU9ZC5iYXNlUXVldWUsZj1jLnBlbmRpbmc7aWYobnVsbCE9PWYpe2lmKG51bGwhPT1lKXt2YXIgZz1lLm5leHQ7ZS5uZXh0PWYubmV4dDtmLm5leHQ9Z31kLmJhc2VRdWV1ZT1lPWY7Yy5wZW5kaW5nPW51bGx9aWYobnVsbCE9PWUpe2Y9ZS5uZXh0O2Q9ZC5iYXNlU3RhdGU7dmFyIGg9Zz1udWxsLGs9bnVsbCxsPWY7ZG97dmFyIG09bC5sYW5lO2lmKChIaCZtKT09PW0pbnVsbCE9PWsmJihrPWsubmV4dD17bGFuZTowLGFjdGlvbjpsLmFjdGlvbixoYXNFYWdlclN0YXRlOmwuaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOmwuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxkPWwuaGFzRWFnZXJTdGF0ZT9sLmVhZ2VyU3RhdGU6YShkLGwuYWN0aW9uKTtlbHNle3ZhciBxPXtsYW5lOm0sYWN0aW9uOmwuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6bC5oYXNFYWdlclN0YXRlLFxuZWFnZXJTdGF0ZTpsLmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtudWxsPT09az8oaD1rPXEsZz1kKTprPWsubmV4dD1xO00ubGFuZXN8PW07cmh8PW19bD1sLm5leHR9d2hpbGUobnVsbCE9PWwmJmwhPT1mKTtudWxsPT09az9nPWQ6ay5uZXh0PWg7SGUoZCxiLm1lbW9pemVkU3RhdGUpfHwoZGg9ITApO2IubWVtb2l6ZWRTdGF0ZT1kO2IuYmFzZVN0YXRlPWc7Yi5iYXNlUXVldWU9aztjLmxhc3RSZW5kZXJlZFN0YXRlPWR9YT1jLmludGVybGVhdmVkO2lmKG51bGwhPT1hKXtlPWE7ZG8gZj1lLmxhbmUsTS5sYW5lc3w9ZixyaHw9ZixlPWUubmV4dDt3aGlsZShlIT09YSl9ZWxzZSBudWxsPT09ZSYmKGMubGFuZXM9MCk7cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxjLmRpc3BhdGNoXX1cbmZ1bmN0aW9uIFhoKGEpe3ZhciBiPVVoKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHAoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9Yy5kaXNwYXRjaCxlPWMucGVuZGluZyxmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZSl7Yy5wZW5kaW5nPW51bGw7dmFyIGc9ZT1lLm5leHQ7ZG8gZj1hKGYsZy5hY3Rpb24pLGc9Zy5uZXh0O3doaWxlKGchPT1lKTtIZShmLGIubWVtb2l6ZWRTdGF0ZSl8fChkaD0hMCk7Yi5tZW1vaXplZFN0YXRlPWY7bnVsbD09PWIuYmFzZVF1ZXVlJiYoYi5iYXNlU3RhdGU9Zik7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1mfXJldHVybltmLGRdfWZ1bmN0aW9uIFloKCl7fVxuZnVuY3Rpb24gWmgoYSxiKXt2YXIgYz1NLGQ9VWgoKSxlPWIoKSxmPSFIZShkLm1lbW9pemVkU3RhdGUsZSk7ZiYmKGQubWVtb2l6ZWRTdGF0ZT1lLGRoPSEwKTtkPWQucXVldWU7JGgoYWkuYmluZChudWxsLGMsZCxhKSxbYV0pO2lmKGQuZ2V0U25hcHNob3QhPT1ifHxmfHxudWxsIT09TyYmTy5tZW1vaXplZFN0YXRlLnRhZyYxKXtjLmZsYWdzfD0yMDQ4O2JpKDksY2kuYmluZChudWxsLGMsZCxlLGIpLHZvaWQgMCxudWxsKTtpZihudWxsPT09USl0aHJvdyBFcnJvcihwKDM0OSkpOzAhPT0oSGgmMzApfHxkaShjLGIsZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZGkoYSxiLGMpe2EuZmxhZ3N8PTE2Mzg0O2E9e2dldFNuYXBzaG90OmIsdmFsdWU6Y307Yj1NLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LE0udXBkYXRlUXVldWU9YixiLnN0b3Jlcz1bYV0pOihjPWIuc3RvcmVzLG51bGw9PT1jP2Iuc3RvcmVzPVthXTpjLnB1c2goYSkpfVxuZnVuY3Rpb24gY2koYSxiLGMsZCl7Yi52YWx1ZT1jO2IuZ2V0U25hcHNob3Q9ZDtlaShiKSYmZmkoYSl9ZnVuY3Rpb24gYWkoYSxiLGMpe3JldHVybiBjKGZ1bmN0aW9uKCl7ZWkoYikmJmZpKGEpfSl9ZnVuY3Rpb24gZWkoYSl7dmFyIGI9YS5nZXRTbmFwc2hvdDthPWEudmFsdWU7dHJ5e3ZhciBjPWIoKTtyZXR1cm4hSGUoYSxjKX1jYXRjaChkKXtyZXR1cm4hMH19ZnVuY3Rpb24gZmkoYSl7dmFyIGI9aWgoYSwxKTtudWxsIT09YiYmZ2koYixhLDEsLT
25114EpfVxuZnVuY3Rpb24gaGkoYSl7dmFyIGI9VGgoKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmKGE9YSgpKTtiLm1lbW9pemVkU3RhdGU9Yi5iYXNlU3RhdGU9YTthPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpWaCxsYXN0UmVuZGVyZWRTdGF0ZTphfTtiLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPWlpLmJpbmQobnVsbCxNLGEpO3JldHVybltiLm1lbW9pemVkU3RhdGUsYV19XG5mdW5jdGlvbiBiaShhLGIsYyxkKXthPXt0YWc6YSxjcmVhdGU6YixkZXN0cm95OmMsZGVwczpkLG5leHQ6bnVsbH07Yj1NLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LE0udXBkYXRlUXVldWU9YixiLmxhc3RFZmZlY3Q9YS5uZXh0PWEpOihjPWIubGFzdEVmZmVjdCxudWxsPT09Yz9iLmxhc3RFZmZlY3Q9YS5uZXh0PWE6KGQ9Yy5uZXh0LGMubmV4dD1hLGEubmV4dD1kLGIubGFzdEVmZmVjdD1hKSk7cmV0dXJuIGF9ZnVuY3Rpb24gamkoKXtyZXR1cm4gVWgoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIGtpKGEsYixjLGQpe3ZhciBlPVRoKCk7TS5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9YmkoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1cbmZ1bmN0aW9uIGxpKGEsYixjLGQpe3ZhciBlPVVoKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PU4pe3ZhciBnPU4ubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmTWgoZCxnLmRlcHMpKXtlLm1lbW9pemVkU3RhdGU9YmkoYixjLGYsZCk7cmV0dXJufX1NLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1iaSgxfGIsYyxmLGQpfWZ1bmN0aW9uIG1pKGEsYil7cmV0dXJuIGtpKDgzOTA2NTYsOCxhLGIpfWZ1bmN0aW9uICRoKGEsYil7cmV0dXJuIGxpKDIwNDgsOCxhLGIpfWZ1bmN0aW9uIG5pKGEsYil7cmV0dXJuIGxpKDQsMixhLGIpfWZ1bmN0aW9uIG9pKGEsYil7cmV0dXJuIGxpKDQsNCxhLGIpfVxuZnVuY3Rpb24gcGkoYSxiKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYT1hKCksYihhKSxmdW5jdGlvbigpe2IobnVsbCl9O2lmKG51bGwhPT1iJiZ2b2lkIDAhPT1iKXJldHVybiBhPWEoKSxiLmN1cnJlbnQ9YSxmdW5jdGlvbigpe2IuY3VycmVudD1udWxsfX1mdW5jdGlvbiBxaShhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIGxpKDQsNCxwaS5iaW5kKG51bGwsYixhKSxjKX1mdW5jdGlvbiByaSgpe31mdW5jdGlvbiBzaShhLGIpe3ZhciBjPVVoKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZNaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHRpKGEsYil7dmFyIGM9VWgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO3ZhciBkPWMubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCYmbnVsbCE9PWImJk1oKGIsZFsxXSkpcmV0dXJuIGRbMF07YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfWZ1bmN0aW9uIHVpKGEsYixjKXtpZigwPT09KEhoJjIxKSlyZXR1cm4gYS5iYXNlU3RhdGUmJihhLmJhc2VTdGF0ZT0hMSxkaD0hMCksYS5tZW1vaXplZFN0YXRlPWM7SGUoYyxiKXx8KGM9eWMoKSxNLmxhbmVzfD1jLHJofD1jLGEuYmFzZVN0YXRlPSEwKTtyZXR1cm4gYn1mdW5jdGlvbiB2aShhLGIpe3ZhciBjPUM7Qz0wIT09YyYmND5jP2M6NDthKCEwKTt2YXIgZD1HaC50cmFuc2l0aW9uO0doLnRyYW5zaXRpb249e307dHJ5e2EoITEpLGIoKX1maW5hbGx5e0M9YyxHaC50cmFuc2l0aW9uPWR9fWZ1bmN0aW9uIHdpKCl7cmV0dXJuIFVoKCkubWVtb2l6ZWRTdGF0ZX1cbmZ1bmN0aW9uIHhpKGEsYixjKXt2YXIgZD15aShhKTtjPXtsYW5lOmQsYWN0aW9uOmMsaGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZih6aShhKSlBaShiLGMpO2Vsc2UgaWYoYz1oaChhLGIsYyxkKSxudWxsIT09Yyl7dmFyIGU9UigpO2dpKGMsYSxkLGUpO0JpKGMsYixkKX19XG5mdW5jdGlvbiBpaShhLGIsYyl7dmFyIGQ9eWkoYSksZT17bGFuZTpkLGFjdGlvbjpjLGhhc0VhZ2VyU3RhdGU6ITEsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH07aWYoemkoYSkpQWkoYixlKTtlbHNle3ZhciBmPWEuYWx0ZXJuYXRlO2lmKDA9PT1hLmxhbmVzJiYobnVsbD09PWZ8fDA9PT1mLmxhbmVzKSYmKGY9Yi5sYXN0UmVuZGVyZWRSZWR1Y2VyLG51bGwhPT1mKSl0cnl7dmFyIGc9Yi5sYXN0UmVuZGVyZWRTdGF0ZSxoPWYoZyxjKTtlLmhhc0VhZ2VyU3RhdGU9ITA7ZS5lYWdlclN0YXRlPWg7aWYoSGUoaCxnKSl7dmFyIGs9Yi5pbnRlcmxlYXZlZDtudWxsPT09az8oZS5uZXh0PWUsZ2goYikpOihlLm5leHQ9ay5uZXh0LGsubmV4dD1lKTtiLmludGVybGVhdmVkPWU7cmV0dXJufX1jYXRjaChsKXt9ZmluYWxseXt9Yz1oaChhLGIsZSxkKTtudWxsIT09YyYmKGU9UigpLGdpKGMsYSxkLGUpLEJpKGMsYixkKSl9fVxuZnVuY3Rpb24gemkoYSl7dmFyIGI9YS5hbHRlcm5hdGU7cmV0dXJuIGE9PT1NfHxudWxsIT09YiYmYj09PU19ZnVuY3Rpb24gQWkoYSxiKXtKaD1JaD0hMDt2YXIgYz1hLnBlbmRpbmc7bnVsbD09PWM/Yi5uZXh0PWI6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpO2EucGVuZGluZz1ifWZ1bmN0aW9uIEJpKGEsYixjKXtpZigwIT09KGMmNDE5NDI0MCkpe3ZhciBkPWIubGFuZXM7ZCY9YS5wZW5kaW5nTGFuZXM7Y3w9ZDtiLmxhbmVzPWM7Q2MoYSxjKX19XG52YXIgUmg9e3JlYWRDb250ZXh0OmVoLHVzZUNhbGxiYWNrOlAsdXNlQ29udGV4dDpQLHVzZUVmZmVjdDpQLHVzZUltcGVyYXRpdmVIYW5kbGU6UCx1c2VJbnNlcnRpb25FZmZlY3Q6UCx1c2VMYXlvdXRFZmZlY3Q6UCx1c2VNZW1vOlAsdXNlUmVkdWNlcjpQLHVzZVJlZjpQLHVzZVN0YXRlOlAsdXNlRGVidWdWYWx1ZTpQLHVzZURlZmVycmVkVmFsdWU6UCx1c2VUcmFuc2l0aW9uOlAsdXNlTXV0YWJsZVNvdXJjZTpQLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlAsdXNlSWQ6UCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LE9oPXtyZWFkQ29udGV4dDplaCx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpe1RoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6ZWgsdXNlRWZmZWN0Om1pLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBraSg0MTk0MzA4LFxuNCxwaS5iaW5kKG51bGwsYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGtpKDQxOTQzMDgsNCxhLGIpfSx1c2VJbnNlcnRpb25
25114FZmZlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4ga2koNCwyLGEsYil9LHVzZU1lbW86ZnVuY3Rpb24oYSxiKXt2YXIgYz1UaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1UaCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6YSxsYXN0UmVuZGVyZWRTdGF0ZTpifTtkLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPXhpLmJpbmQobnVsbCxNLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpmdW5jdGlvbihhKXt2YXIgYj1cblRoKCk7YT17Y3VycmVudDphfTtyZXR1cm4gYi5tZW1vaXplZFN0YXRlPWF9LHVzZVN0YXRlOmhpLHVzZURlYnVnVmFsdWU6cmksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gVGgoKS5tZW1vaXplZFN0YXRlPWF9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1oaSghMSksYj1hWzBdO2E9dmkuYmluZChudWxsLGFbMV0pO1RoKCkubWVtb2l6ZWRTdGF0ZT1hO3JldHVybltiLGFdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TSxlPVRoKCk7aWYoSSl7aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcihwKDQwNykpO2M9YygpfWVsc2V7Yz1iKCk7aWYobnVsbD09PVEpdGhyb3cgRXJyb3IocCgzNDkpKTswIT09KEhoJjMwKXx8ZGkoZCxiLGMpfWUubWVtb2l6ZWRTdGF0ZT1jO3ZhciBmPXt2YWx1ZTpjLGdldFNuYXBzaG90OmJ9O2UucXVldWU9ZjttaShhaS5iaW5kKG51bGwsZCxcbmYsYSksW2FdKTtkLmZsYWdzfD0yMDQ4O2JpKDksY2kuYmluZChudWxsLGQsZixjLGIpLHZvaWQgMCxudWxsKTtyZXR1cm4gY30sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgYT1UaCgpLGI9US5pZGVudGlmaWVyUHJlZml4O2lmKEkpe3ZhciBjPXNnO3ZhciBkPXJnO2M9KGQmfigxPDwzMi1vYyhkKS0xKSkudG9TdHJpbmcoMzIpK2M7Yj1cIjpcIitiK1wiUlwiK2M7Yz1LaCsrOzA8YyYmKGIrPVwiSFwiK2MudG9TdHJpbmcoMzIpKTtiKz1cIjpcIn1lbHNlIGM9TGgrKyxiPVwiOlwiK2IrXCJyXCIrYy50b1N0cmluZygzMikrXCI6XCI7cmV0dXJuIGEubWVtb2l6ZWRTdGF0ZT1ifSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFBoPXtyZWFkQ29udGV4dDplaCx1c2VDYWxsYmFjazpzaSx1c2VDb250ZXh0OmVoLHVzZUVmZmVjdDokaCx1c2VJbXBlcmF0aXZlSGFuZGxlOnFpLHVzZUluc2VydGlvbkVmZmVjdDpuaSx1c2VMYXlvdXRFZmZlY3Q6b2ksdXNlTWVtbzp0aSx1c2VSZWR1Y2VyOldoLHVzZVJlZjpqaSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBXaChWaCl9LFxudXNlRGVidWdWYWx1ZTpyaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVVoKCk7cmV0dXJuIHVpKGIsTi5tZW1vaXplZFN0YXRlLGEpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9V2goVmgpWzBdLGI9VWgoKS5tZW1vaXplZFN0YXRlO3JldHVyblthLGJdfSx1c2VNdXRhYmxlU291cmNlOlloLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlpoLHVzZUlkOndpLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sUWg9e3JlYWRDb250ZXh0OmVoLHVzZUNhbGxiYWNrOnNpLHVzZUNvbnRleHQ6ZWgsdXNlRWZmZWN0OiRoLHVzZUltcGVyYXRpdmVIYW5kbGU6cWksdXNlSW5zZXJ0aW9uRWZmZWN0Om5pLHVzZUxheW91dEVmZmVjdDpvaSx1c2VNZW1vOnRpLHVzZVJlZHVjZXI6WGgsdXNlUmVmOmppLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIFhoKFZoKX0sdXNlRGVidWdWYWx1ZTpyaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPVVoKCk7cmV0dXJuIG51bGw9PT1cbk4/Yi5tZW1vaXplZFN0YXRlPWE6dWkoYixOLm1lbW9pemVkU3RhdGUsYSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1YaChWaClbMF0sYj1VaCgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6WWgsdXNlU3luY0V4dGVybmFsU3RvcmU6WmgsdXNlSWQ6d2ksdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfTtmdW5jdGlvbiBDaShhLGIpe2lmKGEmJmEuZGVmYXVsdFByb3BzKXtiPUEoe30sYik7YT1hLmRlZmF1bHRQcm9wcztmb3IodmFyIGMgaW4gYSl2b2lkIDA9PT1iW2NdJiYoYltjXT1hW2NdKTtyZXR1cm4gYn1yZXR1cm4gYn1mdW5jdGlvbiBEaShhLGIsYyxkKXtiPWEubWVtb2l6ZWRTdGF0ZTtjPWMoZCxiKTtjPW51bGw9PT1jfHx2b2lkIDA9PT1jP2I6QSh7fSxiLGMpO2EubWVtb2l6ZWRTdGF0ZT1jOzA9PT1hLmxhbmVzJiYoYS51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9Yyl9XG52YXIgRWk9e2lzTW91bnRlZDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLl9yZWFjdEludGVybmFscyk/VmIoYSk9PT1hOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGQ9UigpLGU9eWkoYSksZj1taChkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtiPW5oKGEsZixlKTtudWxsIT09YiYmKGdpKGIsYSxlLGQpLG9oKGIsYSxlKSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGQ9UigpLGU9eWkoYSksZj1taChkLGUpO2YudGFnPTE7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO2I9bmgoYSxmLGUpO251bGwhPT1iJiYoZ2koYixhLGUsZCksb2goYixhLGUpKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGEsYil7YT1hLl9yZWFjdEludGVybmFsczt2YXIgYz1SKCksZD1cbnlpKGEpLGU9bWgoYyxkKTtlLnRhZz0yO3ZvaWQgMCE9PWImJm51bGwhPT1iJiYoZS5jYWxsYmFjaz1iKTtiPW5oKGEsZSxkKTtudWxsIT09YiYmKGdpKGIsYSxkLGMpLG9oKGIsYSxkKSl9fTtmdW5jdGlvbiBGaShhLGIsYyxkLGUsZixnKXthPWEuc3RhdGVOb2RlO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnNob3VsZENvbXBvbmVudFVwZGF0ZT9hLnNob3VsZENvbXBvbmVudFVwZGF0ZShkLGYsZyk6Yi5wcm90b3R5cGUmJmIucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PyFJZShjLGQpfHwhSWUoZSxmKTohMH1cbmZ1bmN0aW9uIEdpKGEsYixjKXt2YXIgZD0hMSxlPVZmO3ZhciBmPWIuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zj9mPWVoKGYpOihlPVpmKGIpP1hmOkguY3VycmVudCxkPWIuY29udGV4dFR5cGVzLGY9KGQ9bnVsbCE9PWQmJnZvaWQgMCE9PWQpP
251141lmKGEsZSk6VmYpO2I9bmV3IGIoYyxmKTthLm1lbW9pemVkU3RhdGU9bnVsbCE9PWIuc3RhdGUmJnZvaWQgMCE9PWIuc3RhdGU/Yi5zdGF0ZTpudWxsO2IudXBkYXRlcj1FaTthLnN0YXRlTm9kZT1iO2IuX3JlYWN0SW50ZXJuYWxzPWE7ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1mKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIEhpKGEsYixjLGQpe2E9Yi5zdGF0ZTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxkKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO2Iuc3RhdGUhPT1hJiZFaS5lbnF1ZXVlUmVwbGFjZVN0YXRlKGIsYi5zdGF0ZSxudWxsKX1cbmZ1bmN0aW9uIElpKGEsYixjLGQpe3ZhciBlPWEuc3RhdGVOb2RlO2UucHJvcHM9YztlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtlLnJlZnM9e307a2goYSk7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2UuY29udGV4dD1laChmKTooZj1aZihiKT9YZjpILmN1cnJlbnQsZS5jb250ZXh0PVlmKGEsZikpO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2Y9Yi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XCJmdW5jdGlvblwiPT09dHlwZW9mIGYmJihEaShhLGIsZixjKSxlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGUuY29tcG9uZW50V2lsbE1vdW50fHwoYj1lLnN0YXRlLFxuXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuY29tcG9uZW50V2lsbE1vdW50JiZlLmNvbXBvbmVudFdpbGxNb3VudCgpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJmUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLGIhPT1lLnN0YXRlJiZFaS5lbnF1ZXVlUmVwbGFjZVN0YXRlKGUsZS5zdGF0ZSxudWxsKSxxaChhLGMsZSxkKSxlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGUuY29tcG9uZW50RGlkTW91bnQmJihhLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiBKaShhLGIpe3RyeXt2YXIgYz1cIlwiLGQ9YjtkbyBjKz1QYShkKSxkPWQucmV0dXJuO3doaWxlKGQpO3ZhciBlPWN9Y2F0Y2goZil7ZT1cIlxcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFwiK2YubWVzc2FnZStcIlxcblwiK2Yuc3RhY2t9cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6ZSxkaWdlc3Q6bnVsbH19XG5mdW5jdGlvbiBLaShhLGIsYyl7cmV0dXJue3ZhbHVlOmEsc291cmNlOm51bGwsc3RhY2s6bnVsbCE9Yz9jOm51bGwsZGlnZXN0Om51bGwhPWI/YjpudWxsfX1mdW5jdGlvbiBMaShhLGIpe3RyeXtjb25zb2xlLmVycm9yKGIudmFsdWUpfWNhdGNoKGMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBjO30pfX12YXIgTWk9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gTmkoYSxiLGMpe2M9bWgoLTEsYyk7Yy50YWc9MztjLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIGQ9Yi52YWx1ZTtjLmNhbGxiYWNrPWZ1bmN0aW9uKCl7T2l8fChPaT0hMCxQaT1kKTtMaShhLGIpfTtyZXR1cm4gY31cbmZ1bmN0aW9uIFFpKGEsYixjKXtjPW1oKC0xLGMpO2MudGFnPTM7dmFyIGQ9YS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7dmFyIGU9Yi52YWx1ZTtjLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZChlKX07Yy5jYWxsYmFjaz1mdW5jdGlvbigpe0xpKGEsYil9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtMaShhLGIpO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PVJpP1JpPW5ldyBTZXQoW3RoaXNdKTpSaS5hZGQodGhpcykpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfVxuZnVuY3Rpb24gU2koYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO2lmKG51bGw9PT1kKXtkPWEucGluZ0NhY2hlPW5ldyBNaTt2YXIgZT1uZXcgU2V0O2Quc2V0KGIsZSl9ZWxzZSBlPWQuZ2V0KGIpLHZvaWQgMD09PWUmJihlPW5ldyBTZXQsZC5zZXQoYixlKSk7ZS5oYXMoYyl8fChlLmFkZChjKSxhPVRpLmJpbmQobnVsbCxhLGIsYyksYi50aGVuKGEsYSkpfWZ1bmN0aW9uIFVpKGEpe2Rve3ZhciBiO2lmKGI9MTM9PT1hLnRhZyliPWEubWVtb2l6ZWRTdGF0ZSxiPW51bGwhPT1iP251bGwhPT1iLmRlaHlkcmF0ZWQ/ITA6ITE6ITA7aWYoYilyZXR1cm4gYTthPWEucmV0dXJufXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFZpKGEsYixjLGQsZSl7aWYoMD09PShhLm1vZGUmMSkpcmV0dXJuIGE9PT1iP2EuZmxhZ3N8PTY1NTM2OihhLmZsYWdzfD0xMjgsYy5mbGFnc3w9MTMxMDcyLGMuZmxhZ3MmPS01MjgwNSwxPT09Yy50YWcmJihudWxsPT09Yy5hbHRlcm5hdGU/Yy50YWc9MTc6KGI9bWgoLTEsMSksYi50YWc9MixuaChjLGIsMSkpKSxjLmxhbmVzfD0xKSxhO2EuZmxhZ3N8PTY1NTM2O2EubGFuZXM9ZTtyZXR1cm4gYX12YXIgV2k9dWEuUmVhY3RDdXJyZW50T3duZXIsZGg9ITE7ZnVuY3Rpb24gWGkoYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT9WZyhiLG51bGwsYyxkKTpVZyhiLGEuY2hpbGQsYyxkKX1cbmZ1bmN0aW9uIFlpKGEsYixjLGQsZSl7Yz1jLnJlbmRlcjt2YXIgZj1iLnJlZjtjaChiLGUpO2Q9TmgoYSxiLGMsZCxmLGUpO2M9U2goKTtpZihudWxsIT09YSYmIWRoKXJldHVybi
25114BiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTIwNTMsYS5sYW5lcyY9fmUsWmkoYSxiLGUpO0kmJmMmJnZnKGIpO2IuZmxhZ3N8PTE7WGkoYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiAkaShhLGIsYyxkLGUpe2lmKG51bGw9PT1hKXt2YXIgZj1jLnR5cGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGYmJiFhaihmKSYmdm9pZCAwPT09Zi5kZWZhdWx0UHJvcHMmJm51bGw9PT1jLmNvbXBhcmUmJnZvaWQgMD09PWMuZGVmYXVsdFByb3BzKXJldHVybiBiLnRhZz0xNSxiLnR5cGU9ZixiaihhLGIsZixkLGUpO2E9UmcoYy50eXBlLG51bGwsZCxiLGIubW9kZSxlKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zj1hLmNoaWxkO2lmKDA9PT0oYS5sYW5lcyZlKSl7dmFyIGc9Zi5tZW1vaXplZFByb3BzO2M9Yy5jb21wYXJlO2M9bnVsbCE9PWM/YzpJZTtpZihjKGcsZCkmJmEucmVmPT09Yi5yZWYpcmV0dXJuIFppKGEsYixlKX1iLmZsYWdzfD0xO2E9UGcoZixkKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9XG5mdW5jdGlvbiBiaihhLGIsYyxkLGUpe2lmKG51bGwhPT1hKXt2YXIgZj1hLm1lbW9pemVkUHJvcHM7aWYoSWUoZixkKSYmYS5yZWY9PT1iLnJlZilpZihkaD0hMSxiLnBlbmRpbmdQcm9wcz1kPWYsMCE9PShhLmxhbmVzJmUpKTAhPT0oYS5mbGFncyYxMzEwNzIpJiYoZGg9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxaaShhLGIsZSl9cmV0dXJuIGNqKGEsYixjLGQsZSl9XG5mdW5jdGlvbiBkaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZSlpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LEcoZWosZmopLGZqfD1jO2Vsc2V7aWYoMD09PShjJjEwNzM3NDE4MjQpKXJldHVybiBhPW51bGwhPT1mP2YuYmFzZUxhbmVzfGM6YyxiLmxhbmVzPWIuY2hpbGRMYW5lcz0xMDczNzQxODI0LGIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmEsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sYi51cGRhdGVRdWV1ZT1udWxsLEcoZWosZmopLGZqfD1hLG51bGw7Yi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfTtkPW51bGwhPT1mP2YuYmFzZUxhbmVzOmM7Ryhlaixmaik7Zmp8PWR9ZWxzZSBudWxsIT09XG5mPyhkPWYuYmFzZUxhbmVzfGMsYi5tZW1vaXplZFN0YXRlPW51bGwpOmQ9YyxHKGVqLGZqKSxmanw9ZDtYaShhLGIsZSxjKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBnaihhLGIpe3ZhciBjPWIucmVmO2lmKG51bGw9PT1hJiZudWxsIT09Y3x8bnVsbCE9PWEmJmEucmVmIT09YyliLmZsYWdzfD01MTIsYi5mbGFnc3w9MjA5NzE1Mn1mdW5jdGlvbiBjaihhLGIsYyxkLGUpe3ZhciBmPVpmKGMpP1hmOkguY3VycmVudDtmPVlmKGIsZik7Y2goYixlKTtjPU5oKGEsYixjLGQsZixlKTtkPVNoKCk7aWYobnVsbCE9PWEmJiFkaClyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS0yMDUzLGEubGFuZXMmPX5lLFppKGEsYixlKTtJJiZkJiZ2ZyhiKTtiLmZsYWdzfD0xO1hpKGEsYixjLGUpO3JldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gaGooYSxiLGMsZCxlKXtpZihaZihjKSl7dmFyIGY9ITA7Y2coYil9ZWxzZSBmPSExO2NoKGIsZSk7aWYobnVsbD09PWIuc3RhdGVOb2RlKWlqKGEsYiksR2koYixjLGQpLElpKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPWVoKGwpOihsPVpmKGMpP1hmOkguY3VycmVudCxsPVlmKGIsbCkpO3Z
25114hciBtPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHE9XCJmdW5jdGlvblwiPT09dHlwZW9mIG18fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO3F8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHxcbihoIT09ZHx8ayE9PWwpJiZIaShiLGcsZCxsKTtqaD0hMTt2YXIgcj1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1yO3FoKGIsZCxnLGUpO2s9Yi5tZW1vaXplZFN0YXRlO2ghPT1kfHxyIT09a3x8V2YuY3VycmVudHx8amg/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBtJiYoRGkoYixjLG0sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPWpofHxGaShiLGMsaCxkLHIsayxsKSk/KHF8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSk6XG4oXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQxOTQzMDgpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTtsaChhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOkNpKGIudHlwZSxoKTtnLnByb3BzPWw7cT1iLnBlbmRpbmdQcm9wcztyPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPWVoKGspOihrPVpmKGMpP1hmOkguY3VycmVudCxrPVlmKGIsaykpO3ZhciB5PWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhtPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB5fHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSl8fFxuXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09cXx8ciE9PWspJiZIaShiLGcsZCxrKTtqaD0hMTtyPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXI7cWgoYixkLGcsZSk7dmFyIG49Yi5tZW1vaXplZFN0YXRlO2ghPT1xfHxyIT09bnx8V2YuY3VycmVudHx8amg/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiB5JiYoRGkoYixjLHksZCksbj1iLm1lbW9pemVkU3RhdGUpLChsPWpofHxGaShiLGMsbCxkLHIsbixrKXx8ITEpPyhtfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZXx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUmJmcuY29tcG9uZW50V2lsbFVwZGF0ZShkLG4sayksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlxuZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShkLG4saykpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZSYmKGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5mbGFnc3w9MTAyNCkpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnI9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcj09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTEwMjQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1uKSxnLnByb3BzPWQsZy5zdGF0ZT1uLGcuY29udGV4dD1rLGQ9bCk6KFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcj09PVxuYS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9NCksXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnI9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD0xMDI0KSxkPSExKX1yZXR1cm4gamooYSxiLGMsZCxmLGUpfVxuZnVuY3Rpb24gamooYSxiLGMsZCxlLGYpe2dqKGEsYik7dmFyIGc9MCE9PShiLmZsYWdzJjEyOCk7aWYoIWQmJiFnKXJldHVybiBlJiZkZyhiLGMsITEpLFppKGEsYixmKTtkPWIuc3RhdGVOb2RlO1dpLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9VWcoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD1VZyhiLG51bGwsaCxmKSk6WGkoYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmZGcoYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBraihhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0P2FnKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJmFnKGEsYi5jb250ZXh0LCExKTt5aChhLGIuY29udGFpbmVySW5mbyl9XG5mdW5jdGlvbiBsaihhLGIsYyxkLGUpe0lnKCk7SmcoZSk7Yi5mbGFnc3w9MjU2O1hpKGEsYixjLGQpO3JldHVybiBiLmNoaWxkfXZhciBtaj17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIG5qKGEpe3JldHVybntiYXNlTGFuZXM6YSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1cbmZ1bmN0aW9uIG9qKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPUwuY3VycmVudCxmPSExLGc9MCE9PShiLmZsYWdzJjEyOCksaDsoaD1nKXx8KGg9bnVsbCE9PWEmJm51bGw9PT1hLm1lbW9pemVkU3RhdGU/ITE6MCE9PShlJjIpKTtpZihoKWY9ITAsYi5mbGFncyY9LTEyOTtlbHNlIGlmKG51bGw9PT1hfHxudWxsIT09YS5tZW1vaXplZFN0YXRlKW
25114V8PTE7RyhMLGUmMSk7aWYobnVsbD09PWEpe0VnKGIpO2E9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiYoYT1hLmRlaHlkcmF0ZWQsbnVsbCE9PWEpKXJldHVybiAwPT09KGIubW9kZSYxKT9iLmxhbmVzPTE6XCIkIVwiPT09YS5kYXRhP2IubGFuZXM9ODpiLmxhbmVzPTEwNzM3NDE4MjQsbnVsbDtnPWQuY2hpbGRyZW47YT1kLmZhbGxiYWNrO3JldHVybiBmPyhkPWIubW9kZSxmPWIuY2hpbGQsZz17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmd9LDA9PT0oZCYxKSYmbnVsbCE9PWY/KGYuY2hpbGRMYW5lcz0wLGYucGVuZGluZ1Byb3BzPVxuZyk6Zj1waihnLGQsMCxudWxsKSxhPVRnKGEsZCxjLG51bGwpLGYucmV0dXJuPWIsYS5yZXR1cm49YixmLnNpYmxpbmc9YSxiLmNoaWxkPWYsYi5jaGlsZC5tZW1vaXplZFN0YXRlPW5qKGMpLGIubWVtb2l6ZWRTdGF0ZT1taixhKTpxaihiLGcpfWU9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lJiYoaD1lLmRlaHlkcmF0ZWQsbnVsbCE9PWgpKXJldHVybiByaihhLGIsZyxkLGgsZSxjKTtpZihmKXtmPWQuZmFsbGJhY2s7Zz1iLm1vZGU7ZT1hLmNoaWxkO2g9ZS5zaWJsaW5nO3ZhciBrPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46ZC5jaGlsZHJlbn07MD09PShnJjEpJiZiLmNoaWxkIT09ZT8oZD1iLmNoaWxkLGQuY2hpbGRMYW5lcz0wLGQucGVuZGluZ1Byb3BzPWssYi5kZWxldGlvbnM9bnVsbCk6KGQ9UGcoZSxrKSxkLnN1YnRyZWVGbGFncz1lLnN1YnRyZWVGbGFncyYxNDY4MDA2NCk7bnVsbCE9PWg/Zj1QZyhoLGYpOihmPVRnKGYsZyxjLG51bGwpLGYuZmxhZ3N8PTIpO2YucmV0dXJuPVxuYjtkLnJldHVybj1iO2Quc2libGluZz1mO2IuY2hpbGQ9ZDtkPWY7Zj1iLmNoaWxkO2c9YS5jaGlsZC5tZW1vaXplZFN0YXRlO2c9bnVsbD09PWc/bmooYyk6e2Jhc2VMYW5lczpnLmJhc2VMYW5lc3xjLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmcudHJhbnNpdGlvbnN9O2YubWVtb2l6ZWRTdGF0ZT1nO2YuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmM7Yi5tZW1vaXplZFN0YXRlPW1qO3JldHVybiBkfWY9YS5jaGlsZDthPWYuc2libGluZztkPVBnKGYse21vZGU6XCJ2aXNpYmxlXCIsY2hpbGRyZW46ZC5jaGlsZHJlbn0pOzA9PT0oYi5tb2RlJjEpJiYoZC5sYW5lcz1jKTtkLnJldHVybj1iO2Quc2libGluZz1udWxsO251bGwhPT1hJiYoYz1iLmRlbGV0aW9ucyxudWxsPT09Yz8oYi5kZWxldGlvbnM9W2FdLGIuZmxhZ3N8PTE2KTpjLnB1c2goYSkpO2IuY2hpbGQ9ZDtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gZH1cbmZ1bmN0aW9uIHFqKGEsYil7Yj1waih7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpifSxhLm1vZGUsMCxudWxsKTtiLnJldHVybj1hO3JldHVybiBhLmNoaWxkPWJ9ZnVuY3Rpb24gc2ooYSxiLGMsZCl7bnVsbCE9PWQmJkpnKGQpO1VnKGIsYS5jaGlsZCxudWxsLGMpO2E9cWooYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbik7YS5mbGFnc3w9MjtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gYX1cbmZ1bmN0aW9uIHJqKGEsYixjLGQsZSxmLGcpe2lmKGMpe2lmKGIuZmxhZ3MmMjU2KXJldHVybiBiLmZsYWdzJj0tMjU3LGQ9S2koRXJyb3IocCg0MjIpKSksc2ooYSxiLGcsZCk7aWYobnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSlyZXR1cm4gYi5jaGlsZD1hLmNoaWxkLGIuZmxhZ3N8PTEyOCxudWxsO2Y9ZC5mYWxsYmFjaztlPWIubW9kZTtkPXBqKHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmQuY2hpbGRyZW59LGUsMCxudWxsKTtmPVRnKGYsZSxnLG51bGwpO2YuZmxhZ3N8PTI7ZC5yZXR1cm49YjtmLnJldHVybj1iO2Quc2libGluZz1mO2IuY2hpbGQ9ZDswIT09KGIubW9kZSYxKSYmVWcoYixhLmNoaWxkLG51bGwsZyk7Yi5jaGlsZC5tZW1vaXplZFN0YXRlPW5qKGcpO2IubWVtb2l6ZWRTdGF0ZT1tajtyZXR1cm4gZn1pZigwPT09KGIubW9kZSYxKSlyZXR1cm4gc2ooYSxiLGcsbnVsbCk7aWYoXCIkIVwiPT09ZS5kYXRhKXtkPWUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmcuZGF0YXNldDtcbmlmKGQpdmFyIGg9ZC5kZ3N0O2Q9aDtmPUVycm9yKHAoNDE5KSk7ZD1LaShmLGQsdm9pZCAwKTtyZXR1cm4gc2ooYSxiLGcsZCl9aD0wIT09KGcmYS5jaGlsZExhbmVzKTtpZihkaHx8aCl7ZD1RO2lmKG51bGwhPT1kKXtzd2l0Y2goZyYtZyl7Y2FzZSA0OmU9MjticmVhaztjYXNlIDE2OmU9ODticmVhaztjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOmNhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6ZT0zMjticmVhaztjYXNlIDUzNjg3MDkxMjplPTI2ODQzNTQ1NjticmVhaztkZWZhdWx0OmU9MH1lPTAhPT0oZSYoZC5zdXNwZW5kZWRMYW5lc3xnKSk/MDplO1xuMCE9PWUmJmUhPT1mLnJldHJ5TGFuZSYmKGYucmV0cnlMYW5lPWUsaWgoYSxlKSxnaShkLGEsZSwtMSkpfXRqKCk7ZD1LaShFcnJvcihwKDQyMSkpKTtyZXR1cm4gc2ooYSxiLGcsZCl9aWYoXCIkP1wiPT09ZS5kYXRhKXJldHVybiBiLmZsYWdzfD0xMjgsYi5jaGlsZD1hLmNoaWxkLGI9dWouYmluZChudWxsLGEpLGUuX3JlYWN0UmV0cnk9YixudWxsO2E9Zi50cmVlQ29udGV4dDt5Zz1MZihlLm5leHRTaWJsaW5nKTt4Zz1iO0k9ITA7emc9bnVsbDtudWxsIT09YSYmKG9nW3BnKytdPXJnLG9nW3BnKytdPXNnLG9nW3BnKytdPXFnLHJnPWEuaWQsc2c9YS5vdmVyZmxvdyxxZz1iKTtiPXFqKGIsZC5jaGlsZHJlbik7Yi5mbGFnc3w9NDA5NjtyZXR1cm4gYn1mdW5jdGlvbiB2aihhLGIsYyl7YS5sYW5lc3w9Yjt2YXIgZD1hLmFsdGVybmF0ZTtudWxsIT09ZCYmKGQubGFuZXN8PWIpO2JoKGEucmV0dXJuLGIsYyl9XG5mdW5jdGlvbiB3aihhLGIsYyxkLGUpe3ZhciBmPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09Zj9hLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOmIscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpkLHRhaWw6Yyx0YWlsTW9kZTplfTooZi5pc0JhY2t3YXJkcz1iLGYucmVuZGVyaW5nPW51bGwsZi5yZW5kZXJpbmdTdGFydFRpbWU9MCxmLmx
25114hc3Q9ZCxmLnRhaWw9YyxmLnRhaWxNb2RlPWUpfVxuZnVuY3Rpb24geGooYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzLGU9ZC5yZXZlYWxPcmRlcixmPWQudGFpbDtYaShhLGIsZC5jaGlsZHJlbixjKTtkPUwuY3VycmVudDtpZigwIT09KGQmMikpZD1kJjF8MixiLmZsYWdzfD0xMjg7ZWxzZXtpZihudWxsIT09YSYmMCE9PShhLmZsYWdzJjEyOCkpYTpmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7aWYoMTM9PT1hLnRhZyludWxsIT09YS5tZW1vaXplZFN0YXRlJiZ2aihhLGMsYik7ZWxzZSBpZigxOT09PWEudGFnKXZqKGEsYyxiKTtlbHNlIGlmKG51bGwhPT1hLmNoaWxkKXthLmNoaWxkLnJldHVybj1hO2E9YS5jaGlsZDtjb250aW51ZX1pZihhPT09YilicmVhayBhO2Zvcig7bnVsbD09PWEuc2libGluZzspe2lmKG51bGw9PT1hLnJldHVybnx8YS5yZXR1cm49PT1iKWJyZWFrIGE7YT1hLnJldHVybn1hLnNpYmxpbmcucmV0dXJuPWEucmV0dXJuO2E9YS5zaWJsaW5nfWQmPTF9RyhMLGQpO2lmKDA9PT0oYi5tb2RlJjEpKWIubWVtb2l6ZWRTdGF0ZT1cbm51bGw7ZWxzZSBzd2l0Y2goZSl7Y2FzZSBcImZvcndhcmRzXCI6Yz1iLmNoaWxkO2ZvcihlPW51bGw7bnVsbCE9PWM7KWE9Yy5hbHRlcm5hdGUsbnVsbCE9PWEmJm51bGw9PT1DaChhKSYmKGU9YyksYz1jLnNpYmxpbmc7Yz1lO251bGw9PT1jPyhlPWIuY2hpbGQsYi5jaGlsZD1udWxsKTooZT1jLnNpYmxpbmcsYy5zaWJsaW5nPW51bGwpO3dqKGIsITEsZSxjLGYpO2JyZWFrO2Nhc2UgXCJiYWNrd2FyZHNcIjpjPW51bGw7ZT1iLmNoaWxkO2ZvcihiLmNoaWxkPW51bGw7bnVsbCE9PWU7KXthPWUuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZudWxsPT09Q2goYSkpe2IuY2hpbGQ9ZTticmVha31hPWUuc2libGluZztlLnNpYmxpbmc9YztjPWU7ZT1hfXdqKGIsITAsYyxudWxsLGYpO2JyZWFrO2Nhc2UgXCJ0b2dldGhlclwiOndqKGIsITEsbnVsbCxudWxsLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDpiLm1lbW9pemVkU3RhdGU9bnVsbH1yZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGlqKGEsYil7MD09PShiLm1vZGUmMSkmJm51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpfWZ1bmN0aW9uIFppKGEsYixjKXtudWxsIT09YSYmKGIuZGVwZW5kZW5jaWVzPWEuZGVwZW5kZW5jaWVzKTtyaHw9Yi5sYW5lcztpZigwPT09KGMmYi5jaGlsZExhbmVzKSlyZXR1cm4gbnVsbDtpZihudWxsIT09YSYmYi5jaGlsZCE9PWEuY2hpbGQpdGhyb3cgRXJyb3IocCgxNTMpKTtpZihudWxsIT09Yi5jaGlsZCl7YT1iLmNoaWxkO2M9UGcoYSxhLnBlbmRpbmdQcm9wcyk7Yi5jaGlsZD1jO2ZvcihjLnJldHVybj1iO251bGwhPT1hLnNpYmxpbmc7KWE9YS5zaWJsaW5nLGM9Yy5zaWJsaW5nPVBnKGEsYS5wZW5kaW5nUHJvcHMpLGMucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiB5aihhLGIsYyl7c3dpdGNoKGIudGFnKXtjYXNlIDM6a2ooYik7SWcoKTticmVhaztjYXNlIDU6QWgoYik7YnJlYWs7Y2FzZSAxOlpmKGIudHlwZSkmJmNnKGIpO2JyZWFrO2Nhc2UgNDp5aChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIGQ9Yi50eXBlLl9jb250ZXh0LGU9Yi5tZW1vaXplZFByb3BzLnZhbHVlO0coV2csZC5fY3VycmVudFZhbHVlKTtkLl9jdXJyZW50VmFsdWU9ZTticmVhaztjYXNlIDEzOmQ9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kKXtpZihudWxsIT09ZC5kZWh5ZHJhdGVkKXJldHVybiBHKEwsTC5jdXJyZW50JjEpLGIuZmxhZ3N8PTEyOCxudWxsO2lmKDAhPT0oYyZiLmNoaWxkLmNoaWxkTGFuZXMpKXJldHVybiBvaihhLGIsYyk7RyhMLEwuY3VycmVudCYxKTthPVppKGEsYixjKTtyZXR1cm4gbnVsbCE9PWE/YS5zaWJsaW5nOm51bGx9RyhMLEwuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmQ9MCE9PShjJlxuYi5jaGlsZExhbmVzKTtpZigwIT09KGEuZmxhZ3MmMTI4KSl7aWYoZClyZXR1cm4geGooYSxiLGMpO2IuZmxhZ3N8PTEyOH1lPWIubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGUucmVuZGVyaW5nPW51bGwsZS50YWlsPW51bGwsZS5sYXN0RWZmZWN0PW51bGwpO0coTCxMLmN1cnJlbnQpO2lmKGQpYnJlYWs7ZWxzZSByZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGIubGFuZXM9MCxkaihhLGIsYyl9cmV0dXJuIFppKGEsYixjKX12YXIgemosQWosQmosQ2o7XG56aj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iLmNoaWxkO251bGwhPT1jOyl7aWYoNT09PWMudGFnfHw2PT09Yy50YWcpYS5hcHBlbmRDaGlsZChjLnN0YXRlTm9kZSk7ZWxzZSBpZig0IT09Yy50YWcmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX07QWo9ZnVuY3Rpb24oKXt9O1xuQmo9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YS5tZW1vaXplZFByb3BzO2lmKGUhPT1kKXthPWIuc3RhdGVOb2RlO3hoKHVoLmN1cnJlbnQpO3ZhciBmPW51bGw7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOmU9WWEoYSxlKTtkPVlhKGEsZCk7Zj1bXTticmVhaztjYXNlIFwic2VsZWN0XCI6ZT1BKHt9LGUse3ZhbHVlOnZvaWQgMH0pO2Q9QSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtmPVtdO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmU9Z2IoYSxlKTtkPWdiKGEsZCk7Zj1bXTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLm9uQ2xpY2smJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLm9uQ2xpY2smJihhLm9uY2xpY2s9QmYpfXViKGMsZCk7dmFyIGc7Yz1udWxsO2ZvcihsIGluIGUpaWYoIWQuaGFzT3duUHJvcGVydHkobCkmJmUuaGFzT3duUHJvcGVydHkobCkmJm51bGwhPWVbbF0paWYoXCJzdHlsZVwiPT09bCl7dmFyIGg9ZVtsXTtmb3IoZyBpbiBoKWguaGFzT3duUHJvcGVydHkoZykmJlxuKGN8fChjPXt9KSxjW2ddPVwiXCIpfWVsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIhPT1sJiZcImNoaWxkcmVuXCIhPT1sJiZcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJlwiYXV0b0ZvY3VzXCIhPT1sJiYoZWEuaGFzT3duUHJvcGVydHkobCk/Znx8KGY9W10pOihmPWZ8fFtdKS5wdXNoKGwsbnVsbCkpO2ZvcihsIGluIGQpe3ZhciBrPWRbbF07aD1udWxsIT1lP2VbbF06dm9pZCAwO2lmKGQuaGFzT3duUHJvcGVydHkobCkmJmshPT1oJiYobnVsbCE9a3x8bnVsbCE9aCkpaWYoXCJzdHlsZVwiPT09bClpZihoKXtmb3IoZyBpbiBoKSF
25114oLmhhc093blByb3BlcnR5KGcpfHxrJiZrLmhhc093blByb3BlcnR5KGcpfHwoY3x8KGM9e30pLGNbZ109XCJcIik7Zm9yKGcgaW4gaylrLmhhc093blByb3BlcnR5KGcpJiZoW2ddIT09a1tnXSYmKGN8fChjPXt9KSxjW2ddPWtbZ10pfWVsc2UgY3x8KGZ8fChmPVtdKSxmLnB1c2gobCxcbmMpKSxjPWs7ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWw/KGs9az9rLl9faHRtbDp2b2lkIDAsaD1oP2guX19odG1sOnZvaWQgMCxudWxsIT1rJiZoIT09ayYmKGY9Znx8W10pLnB1c2gobCxrKSk6XCJjaGlsZHJlblwiPT09bD9cInN0cmluZ1wiIT09dHlwZW9mIGsmJlwibnVtYmVyXCIhPT10eXBlb2Yga3x8KGY9Znx8W10pLnB1c2gobCxcIlwiK2spOlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmKGVhLmhhc093blByb3BlcnR5KGwpPyhudWxsIT1rJiZcIm9uU2Nyb2xsXCI9PT1sJiZEKFwic2Nyb2xsXCIsYSksZnx8aD09PWt8fChmPVtdKSk6KGY9Znx8W10pLnB1c2gobCxrKSl9YyYmKGY9Znx8W10pLnB1c2goXCJzdHlsZVwiLGMpO3ZhciBsPWY7aWYoYi51cGRhdGVRdWV1ZT1sKWIuZmxhZ3N8PTR9fTtDaj1mdW5jdGlvbihhLGIsYyxkKXtjIT09ZCYmKGIuZmxhZ3N8PTQpfTtcbmZ1bmN0aW9uIERqKGEsYil7aWYoIUkpc3dpdGNoKGEudGFpbE1vZGUpe2Nhc2UgXCJoaWRkZW5cIjpiPWEudGFpbDtmb3IodmFyIGM9bnVsbDtudWxsIT09YjspbnVsbCE9PWIuYWx0ZXJuYXRlJiYoYz1iKSxiPWIuc2libGluZztudWxsPT09Yz9hLnRhaWw9bnVsbDpjLnNpYmxpbmc9bnVsbDticmVhaztjYXNlIFwiY29sbGFwc2VkXCI6Yz1hLnRhaWw7Zm9yKHZhciBkPW51bGw7bnVsbCE9PWM7KW51bGwhPT1jLmFsdGVybmF0ZSYmKGQ9YyksYz1jLnNpYmxpbmc7bnVsbD09PWQ/Ynx8bnVsbD09PWEudGFpbD9hLnRhaWw9bnVsbDphLnRhaWwuc2libGluZz1udWxsOmQuc2libGluZz1udWxsfX1cbmZ1bmN0aW9uIFMoYSl7dmFyIGI9bnVsbCE9PWEuYWx0ZXJuYXRlJiZhLmFsdGVybmF0ZS5jaGlsZD09PWEuY2hpbGQsYz0wLGQ9MDtpZihiKWZvcih2YXIgZT1hLmNoaWxkO251bGwhPT1lOyljfD1lLmxhbmVzfGUuY2hpbGRMYW5lcyxkfD1lLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxkfD1lLmZsYWdzJjE0NjgwMDY0LGUucmV0dXJuPWEsZT1lLnNpYmxpbmc7ZWxzZSBmb3IoZT1hLmNoaWxkO251bGwhPT1lOyljfD1lLmxhbmVzfGUuY2hpbGRMYW5lcyxkfD1lLnN1YnRyZWVGbGFncyxkfD1lLmZsYWdzLGUucmV0dXJuPWEsZT1lLnNpYmxpbmc7YS5zdWJ0cmVlRmxhZ3N8PWQ7YS5jaGlsZExhbmVzPWM7cmV0dXJuIGJ9XG5mdW5jdGlvbiBFaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHM7d2coYik7c3dpdGNoKGIudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gUyhiKSxudWxsO2Nhc2UgMTpyZXR1cm4gWmYoYi50eXBlKSYmJGYoKSxTKGIpLG51bGw7Y2FzZSAzOmQ9Yi5zdGF0ZU5vZGU7emgoKTtFKFdmKTtFKEgpO0VoKCk7ZC5wZW5kaW5nQ29udGV4dCYmKGQuY29udGV4dD1kLnBlbmRpbmdDb250ZXh0LGQucGVuZGluZ0NvbnRleHQ9bnVsbCk7aWYobnVsbD09PWF8fG51bGw9PT1hLmNoaWxkKUdnKGIpP2IuZmxhZ3N8PTQ6bnVsbD09PWF8fGEubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJjA9PT0oYi5mbGFncyYyNTYpfHwoYi5mbGFnc3w9MTAyNCxudWxsIT09emcmJihGaih6Zyksemc9bnVsbCkpO0FqKGEsYik7UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDU6QmgoYik7dmFyIGU9eGgod2guY3VycmVudCk7XG5jPWIudHlwZTtpZihudWxsIT09YSYmbnVsbCE9Yi5zdGF0ZU5vZGUpQmooYSxiLGMsZCxlKSxhLnJlZiE9PWIucmVmJiYoYi5mbGFnc3w9NTEyLGIuZmxhZ3N8PTIwOTcxNTIpO2Vsc2V7aWYoIWQpe2lmKG51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcihwKDE2NikpO1MoYik7cmV0dXJuIG51bGx9YT14aCh1aC5jdXJyZW50KTtpZihHZyhiKSl7ZD1iLnN0YXRlTm9kZTtjPWIudHlwZTt2YXIgZj1iLm1lbW9pemVkUHJvcHM7ZFtPZl09YjtkW1BmXT1mO2E9MCE9PShiLm1vZGUmMSk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpEKFwiY2FuY2VsXCIsZCk7RChcImNsb3NlXCIsZCk7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpEKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihlPTA7ZTxsZi5sZW5ndGg7ZSsrKUQobGZbZV0sZCk7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkQoXCJlcnJvclwiLGQpO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkQoXCJlcnJvclwiLFxuZCk7RChcImxvYWRcIixkKTticmVhaztjYXNlIFwiZGV0YWlsc1wiOkQoXCJ0b2dnbGVcIixkKTticmVhaztjYXNlIFwiaW5wdXRcIjpaYShkLGYpO0QoXCJpbnZhbGlkXCIsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmQuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFmLm11bHRpcGxlfTtEKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGQsZiksRChcImludmFsaWRcIixkKX11YihjLGYpO2U9bnVsbDtmb3IodmFyIGcgaW4gZilpZihmLmhhc093blByb3BlcnR5KGcpKXt2YXIgaD1mW2ddO1wiY2hpbGRyZW5cIj09PWc/XCJzdHJpbmdcIj09PXR5cGVvZiBoP2QudGV4dENvbnRlbnQhPT1oJiYoITAhPT1mLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyYmQWYoZC50ZXh0Q29udGVudCxoLGEpLGU9W1wiY2hpbGRyZW5cIixoXSk6XCJudW1iZXJcIj09PXR5cGVvZiBoJiZkLnRleHRDb250ZW50IT09XCJcIitoJiYoITAhPT1mLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyYmQWYoZC50ZXh0Q29udGVudCxcbmgsYSksZT1bXCJjaGlsZHJlblwiLFwiXCIraF0pOmVhLmhhc093blByb3BlcnR5KGcpJiZudWxsIT1oJiZcIm9uU2Nyb2xsXCI9PT1nJiZEKFwic2Nyb2xsXCIsZCl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGQpO2RiKGQsZiwhMCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VmEoZCk7amIoZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJvcHRpb25cIjpicmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLm9uQ2xpY2smJihkLm9uY2xpY2s9QmYpfWQ9ZTtiLnVwZGF0ZVF1ZXVlPWQ7bnVsbCE9PWQmJihiLmZsYWdzfD00KX1lbHNle2c9OT09PWUubm9kZVR5cGU/ZTplLm93bmVyRG9jdW1lbnQ7XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hJiYoYT1rYihjKSk7XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hP1wic2NyaXB0XCI9PT1jPyhhPWcuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmlubmVySFRNTD1cIjxzY3JpcHQ+XFx4M2Mvc2NyaXB0PlwiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTpcblwic3RyaW5nXCI9PT10eXBlb2YgZC5pcz9hPWcuY3JlYXRlRWxlbWVudChjLHtpczpkLmlzfSk6KGE9Zy5jcmVhdGVFbGVtZW50KGMpLFwic2VsZWN0XCI9PT1jJiYoZz1hLGQubXVsdGlwbGU/Zy5tdWx0aXBsZT0hMDpkLnNpemUmJihnLnNpemU9ZC5zaXpl
25114KSkpOmE9Zy5jcmVhdGVFbGVtZW50TlMoYSxjKTthW09mXT1iO2FbUGZdPWQ7emooYSxiLCExLCExKTtiLnN0YXRlTm9kZT1hO2E6e2c9dmIoYyxkKTtzd2l0Y2goYyl7Y2FzZSBcImRpYWxvZ1wiOkQoXCJjYW5jZWxcIixhKTtEKFwiY2xvc2VcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpEKFwibG9hZFwiLGEpO2U9ZDticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8bGYubGVuZ3RoO2UrKylEKGxmW2VdLGEpO2U9ZDticmVhaztjYXNlIFwic291cmNlXCI6RChcImVycm9yXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkQoXCJlcnJvclwiLFxuYSk7RChcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpEKFwidG9nZ2xlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbnB1dFwiOlphKGEsZCk7ZT1ZYShhLGQpO0QoXCJpbnZhbGlkXCIsYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZDticmVhaztjYXNlIFwic2VsZWN0XCI6YS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWQubXVsdGlwbGV9O2U9QSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGEsZCk7ZT1nYihhLGQpO0QoXCJpbnZhbGlkXCIsYSk7YnJlYWs7ZGVmYXVsdDplPWR9dWIoYyxlKTtoPWU7Zm9yKGYgaW4gaClpZihoLmhhc093blByb3BlcnR5KGYpKXt2YXIgaz1oW2ZdO1wic3R5bGVcIj09PWY/c2IoYSxrKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1mPyhrPWs/ay5fX2h0bWw6dm9pZCAwLG51bGwhPWsmJm5iKGEsaykpOlwiY2hpbGRyZW5cIj09PWY/XCJzdHJpbmdcIj09PXR5cGVvZiBrPyhcInRleHRhcmVhXCIhPT1cbmN8fFwiXCIhPT1rKSYmb2IoYSxrKTpcIm51bWJlclwiPT09dHlwZW9mIGsmJm9iKGEsXCJcIitrKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09ZiYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWYmJlwiYXV0b0ZvY3VzXCIhPT1mJiYoZWEuaGFzT3duUHJvcGVydHkoZik/bnVsbCE9ayYmXCJvblNjcm9sbFwiPT09ZiYmRChcInNjcm9sbFwiLGEpOm51bGwhPWsmJnRhKGEsZixrLGcpKX1zd2l0Y2goYyl7Y2FzZSBcImlucHV0XCI6VmEoYSk7ZGIoYSxkLCExKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpWYShhKTtqYihhKTticmVhaztjYXNlIFwib3B0aW9uXCI6bnVsbCE9ZC52YWx1ZSYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLFwiXCIrU2EoZC52YWx1ZSkpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphLm11bHRpcGxlPSEhZC5tdWx0aXBsZTtmPWQudmFsdWU7bnVsbCE9Zj9mYihhLCEhZC5tdWx0aXBsZSxmLCExKTpudWxsIT1kLmRlZmF1bHRWYWx1ZSYmZmIoYSwhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsXG4hMCk7YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5vbkNsaWNrJiYoYS5vbmNsaWNrPUJmKX1zd2l0Y2goYyl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjpkPSEhZC5hdXRvRm9jdXM7YnJlYWsgYTtjYXNlIFwiaW1nXCI6ZD0hMDticmVhayBhO2RlZmF1bHQ6ZD0hMX19ZCYmKGIuZmxhZ3N8PTQpfW51bGwhPT1iLnJlZiYmKGIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyKX1TKGIpO3JldHVybiBudWxsO2Nhc2UgNjppZihhJiZudWxsIT1iLnN0YXRlTm9kZSlDaihhLGIsYS5tZW1vaXplZFByb3BzLGQpO2Vsc2V7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBkJiZudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IocCgxNjYpKTtjPXhoKHdoLmN1cnJlbnQpO3hoKHVoLmN1cnJlbnQpO2lmKEdnKGIpKXtkPWIuc3RhdGVOb2RlO2M9Yi5tZW1vaXplZFByb3BzO2RbT2ZdPWI7aWYoZj1kLm5vZGVWYWx1ZSE9PWMpaWYoYT1cbnhnLG51bGwhPT1hKXN3aXRjaChhLnRhZyl7Y2FzZSAzOkFmKGQubm9kZVZhbHVlLGMsMCE9PShhLm1vZGUmMSkpO2JyZWFrO2Nhc2UgNTohMCE9PWEubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJkFmKGQubm9kZVZhbHVlLGMsMCE9PShhLm1vZGUmMSkpfWYmJihiLmZsYWdzfD00KX1lbHNlIGQ9KDk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShkKSxkW09mXT1iLGIuc3RhdGVOb2RlPWR9UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDEzOkUoTCk7ZD1iLm1lbW9pemVkU3RhdGU7aWYobnVsbD09PWF8fG51bGwhPT1hLm1lbW9pemVkU3RhdGUmJm51bGwhPT1hLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCl7aWYoSSYmbnVsbCE9PXlnJiYwIT09KGIubW9kZSYxKSYmMD09PShiLmZsYWdzJjEyOCkpSGcoKSxJZygpLGIuZmxhZ3N8PTk4NTYwLGY9ITE7ZWxzZSBpZihmPUdnKGIpLG51bGwhPT1kJiZudWxsIT09ZC5kZWh5ZHJhdGVkKXtpZihudWxsPT09XG5hKXtpZighZil0aHJvdyBFcnJvcihwKDMxOCkpO2Y9Yi5tZW1vaXplZFN0YXRlO2Y9bnVsbCE9PWY/Zi5kZWh5ZHJhdGVkOm51bGw7aWYoIWYpdGhyb3cgRXJyb3IocCgzMTcpKTtmW09mXT1ifWVsc2UgSWcoKSwwPT09KGIuZmxhZ3MmMTI4KSYmKGIubWVtb2l6ZWRTdGF0ZT1udWxsKSxiLmZsYWdzfD00O1MoYik7Zj0hMX1lbHNlIG51bGwhPT16ZyYmKEZqKHpnKSx6Zz1udWxsKSxmPSEwO2lmKCFmKXJldHVybi
25114BiLmZsYWdzJjY1NTM2P2I6bnVsbH1pZigwIT09KGIuZmxhZ3MmMTI4KSlyZXR1cm4gYi5sYW5lcz1jLGI7ZD1udWxsIT09ZDtkIT09KG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlKSYmZCYmKGIuY2hpbGQuZmxhZ3N8PTgxOTIsMCE9PShiLm1vZGUmMSkmJihudWxsPT09YXx8MCE9PShMLmN1cnJlbnQmMSk/MD09PVQmJihUPTMpOnRqKCkpKTtudWxsIT09Yi51cGRhdGVRdWV1ZSYmKGIuZmxhZ3N8PTQpO1MoYik7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiB6aCgpLFxuQWooYSxiKSxudWxsPT09YSYmc2YoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksUyhiKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGFoKGIudHlwZS5fY29udGV4dCksUyhiKSxudWxsO2Nhc2UgMTc6cmV0dXJuIFpmKGIudHlwZSkmJiRmKCksUyhiKSxudWxsO2Nhc2UgMTk6RShMKTtmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZilyZXR1cm4gUyhiKSxudWxsO2Q9MCE9PShiLmZsYWdzJjEyOCk7Zz1mLnJlbmRlcmluZztpZihudWxsPT09ZylpZihkKURqKGYsITEpO2Vsc2V7aWYoMCE9PVR8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmMTI4KSlmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7Zz1DaChhKTtpZihudWxsIT09Zyl7Yi5mbGFnc3w9MTI4O0RqKGYsITEpO2Q9Zy51cGRhdGVRdWV1ZTtudWxsIT09ZCYmKGIudXBkYXRlUXVldWU9ZCxiLmZsYWdzfD00KTtiLnN1YnRyZWVGbGFncz0wO2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTE0NjgwMDY2LFxuZz1mLmFsdGVybmF0ZSxudWxsPT09Zz8oZi5jaGlsZExhbmVzPTAsZi5sYW5lcz1hLGYuY2hpbGQ9bnVsbCxmLnN1YnRyZWVGbGFncz0wLGYubWVtb2l6ZWRQcm9wcz1udWxsLGYubWVtb2l6ZWRTdGF0ZT1udWxsLGYudXBkYXRlUXVldWU9bnVsbCxmLmRlcGVuZGVuY2llcz1udWxsLGYuc3RhdGVOb2RlPW51bGwpOihmLmNoaWxkTGFuZXM9Zy5jaGlsZExhbmVzLGYubGFuZXM9Zy5sYW5lcyxmLmNoaWxkPWcuY2hpbGQsZi5zdWJ0cmVlRmxhZ3M9MCxmLmRlbGV0aW9ucz1udWxsLGYubWVtb2l6ZWRQcm9wcz1nLm1lbW9pemVkUHJvcHMsZi5tZW1vaXplZFN0YXRlPWcubWVtb2l6ZWRTdGF0ZSxmLnVwZGF0ZVF1ZXVlPWcudXBkYXRlUXVldWUsZi50eXBlPWcudHlwZSxhPWcuZGVwZW5kZW5jaWVzLGYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7RyhMLEwuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9XG5hLnNpYmxpbmd9bnVsbCE9PWYudGFpbCYmQigpPkdqJiYoYi5mbGFnc3w9MTI4LGQ9ITAsRGooZiwhMSksYi5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFkKWlmKGE9Q2goZyksbnVsbCE9PWEpe2lmKGIuZmxhZ3N8PTEyOCxkPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxEaihmLCEwKSxudWxsPT09Zi50YWlsJiZcImhpZGRlblwiPT09Zi50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhSSlyZXR1cm4gUyhiKSxudWxsfWVsc2UgMipCKCktZi5yZW5kZXJpbmdTdGFydFRpbWU+R2omJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9MTI4LGQ9ITAsRGooZiwhMSksYi5sYW5lcz00MTk0MzA0KTtmLmlzQmFja3dhcmRzPyhnLnNpYmxpbmc9Yi5jaGlsZCxiLmNoaWxkPWcpOihjPWYubGFzdCxudWxsIT09Yz9jLnNpYmxpbmc9ZzpiLmNoaWxkPWcsZi5sYXN0PWcpfWlmKG51bGwhPT1mLnRhaWwpcmV0dXJuIGI9Zi50YWlsLGYucmVuZGVyaW5nPVxuYixmLnRhaWw9Yi5zaWJsaW5nLGYucmVuZGVyaW5nU3RhcnRUaW1lPUIoKSxiLnNpYmxpbmc9bnVsbCxjPUwuY3VycmVudCxHKEwsZD9jJjF8MjpjJjEpLGI7UyhiKTtyZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIEhqKCksZD1udWxsIT09Yi5tZW1vaXplZFN0YXRlLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09ZCYmKGIuZmxhZ3N8PTgxOTIpLGQmJjAhPT0oYi5tb2RlJjEpPzAhPT0oZmomMTA3Mzc0MTgyNCkmJihTKGIpLGIuc3VidHJlZUZsYWdzJjYmJihiLmZsYWdzfD04MTkyKSk6UyhiKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihwKDE1NixiLnRhZykpO31cbmZ1bmN0aW9uIElqKGEsYil7d2coYik7c3dpdGNoKGIudGFnKXtjYXNlIDE6cmV0dXJuIFpmKGIudHlwZSkmJiRmKCksYT1iLmZsYWdzLGEmNjU1MzY/KGIuZmxhZ3M9YSYtNjU1Mzd8MTI4LGIpOm51bGw7Y2FzZSAzOnJldHVybiB6aCgpLEUoV2YpLEUoSCksRWgoKSxhPWIuZmxhZ3MsMCE9PShhJjY1NTM2KSYmMD09PShhJjEyOCk/KGIuZmxhZ3M9YSYtNjU1Mzd8MTI4LGIpOm51bGw7Y2FzZSA1OnJldHVybiBCaChiKSxudWxsO2Nhc2UgMTM6RShMKTthPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7aWYobnVsbD09PWIuYWx0ZXJuYXRlKXRocm93IEVycm9yKHAoMzQwKSk7SWcoKX1hPWIuZmxhZ3M7cmV0dXJuIGEmNjU1MzY/KGIuZmxhZ3M9YSYtNjU1Mzd8MTI4LGIpOm51bGw7Y2FzZSAxOTpyZXR1cm4gRShMKSxudWxsO2Nhc2UgNDpyZXR1cm4gemgoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGFoKGIudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIEhqKCksXG5udWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIEpqPSExLFU9ITEsS2o9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtTZXQ/V2Vha1NldDpTZXQsVj1udWxsO2Z1bmN0aW9uIExqKGEsYil7dmFyIGM9YS5yZWY7aWYobnVsbCE9PWMpaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGMpdHJ5e2MobnVsbCl9Y2F0Y2goZCl7VyhhLGIsZCl9ZWxzZSBjLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBNaihhLGIsYyl7dHJ5e2MoKX1jYXRjaChkKXtXKGEsYixkKX19dmFyIE5qPSExO1xuZnVuY3Rpb24gT2ooYSxiKXtDZj1kZDthPU1lKCk7aWYoTmUoYSkpe2lmKFwic2VsZWN0aW9uU3RhcnRcImluIGEpdmFyIGM9e3N0YXJ0OmEuc2VsZWN0aW9uU3RhcnQsZW5kOmEuc2VsZWN0aW9uRW5kfTtlbHNlIGE6e2M9KGM9YS5vd25lckRvY3VtZW50KSYmYy5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciBkPWMuZ2V0U2VsZWN0aW9uJiZjLmdldFNlbGVjdGlvbigpO2lmKGQmJjAhPT1kLnJhbmdlQ291bnQpe2M9ZC5hbmNob3JOb2RlO3ZhciBlPWQuYW5jaG9yT2Zmc2V0LGY9ZC5mb2N1c05vZGU7ZD1kLmZvY3VzT2Zmc2V0O3RyeXtjLm5vZGVUeXBlLGYubm9kZVR5cGV9Y2F0Y2goRil7Yz1udWxsO2JyZWFrIGF9dmFyIGc9MCxoPS0xLGs9LTEsbD0wLG09MCxxPWEscj1udWxsO2I6Zm9yKDs7KXtmb3IodmFyIHk7Oyl7cSE9PWN8fDAhPT1lJiYzIT09cS5ub2RlVHlwZXx8KGg9ZytlKTtxIT09Znx8MCE9PWQmJjMhPT1xLm5vZGVUeXBlfHwoaz1nK2QpOzM9PT1xLm5vZGVUeXBlJiYoZys9XG5xLm5vZGVWYWx1ZS
251145sZW5ndGgpO2lmKG51bGw9PT0oeT1xLmZpcnN0Q2hpbGQpKWJyZWFrO3I9cTtxPXl9Zm9yKDs7KXtpZihxPT09YSlicmVhayBiO3I9PT1jJiYrK2w9PT1lJiYoaD1nKTtyPT09ZiYmKyttPT09ZCYmKGs9Zyk7aWYobnVsbCE9PSh5PXEubmV4dFNpYmxpbmcpKWJyZWFrO3E9cjtyPXEucGFyZW50Tm9kZX1xPXl9Yz0tMT09PWh8fC0xPT09az9udWxsOntzdGFydDpoLGVuZDprfX1lbHNlIGM9bnVsbH1jPWN8fHtzdGFydDowLGVuZDowfX1lbHNlIGM9bnVsbDtEZj17Zm9jdXNlZEVsZW06YSxzZWxlY3Rpb25SYW5nZTpjfTtkZD0hMTtmb3IoVj1iO251bGwhPT1WOylpZihiPVYsYT1iLmNoaWxkLDAhPT0oYi5zdWJ0cmVlRmxhZ3MmMTAyOCkmJm51bGwhPT1hKWEucmV0dXJuPWIsVj1hO2Vsc2UgZm9yKDtudWxsIT09Vjspe2I9Vjt0cnl7dmFyIG49Yi5hbHRlcm5hdGU7aWYoMCE9PShiLmZsYWdzJjEwMjQpKXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztcbmNhc2UgMTppZihudWxsIT09bil7dmFyIHQ9bi5tZW1vaXplZFByb3BzLEo9bi5tZW1vaXplZFN0YXRlLHg9Yi5zdGF0ZU5vZGUsdz14LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGIuZWxlbWVudFR5cGU9PT1iLnR5cGU/dDpDaShiLnR5cGUsdCksSik7eC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT13fWJyZWFrO2Nhc2UgMzp2YXIgdT1iLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOzE9PT11Lm5vZGVUeXBlP3UudGV4dENvbnRlbnQ9XCJcIjo5PT09dS5ub2RlVHlwZSYmdS5kb2N1bWVudEVsZW1lbnQmJnUucmVtb3ZlQ2hpbGQodS5kb2N1bWVudEVsZW1lbnQpO2JyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDE2MykpO319Y2F0Y2goRil7VyhiLGIucmV0dXJuLEYpfWE9Yi5zaWJsaW5nO2lmKG51bGwhPT1hKXthLnJldHVybj1iLnJldHVybjtWPWE7YnJlYWt9Vj1iLnJldHVybn1uPU5qO05qPSExO3JldHVybiBufVxuZnVuY3Rpb24gUGooYSxiLGMpe3ZhciBkPWIudXBkYXRlUXVldWU7ZD1udWxsIT09ZD9kLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09ZCl7dmFyIGU9ZD1kLm5leHQ7ZG97aWYoKGUudGFnJmEpPT09YSl7dmFyIGY9ZS5kZXN0cm95O2UuZGVzdHJveT12b2lkIDA7dm9pZCAwIT09ZiYmTWooYixjLGYpfWU9ZS5uZXh0fXdoaWxlKGUhPT1kKX19ZnVuY3Rpb24gUWooYSxiKXtiPWIudXBkYXRlUXVldWU7Yj1udWxsIT09Yj9iLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yil7dmFyIGM9Yj1iLm5leHQ7ZG97aWYoKGMudGFnJmEpPT09YSl7dmFyIGQ9Yy5jcmVhdGU7Yy5kZXN0cm95PWQoKX1jPWMubmV4dH13aGlsZShjIT09Yil9fWZ1bmN0aW9uIFJqKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKXt2YXIgYz1hLnN0YXRlTm9kZTtzd2l0Y2goYS50YWcpe2Nhc2UgNTphPWM7YnJlYWs7ZGVmYXVsdDphPWN9XCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpiLmN1cnJlbnQ9YX19XG5mdW5jdGlvbiBTaihhKXt2YXIgYj1hLmFsdGVybmF0ZTtudWxsIT09YiYmKGEuYWx0ZXJuYXRlPW51bGwsU2ooYikpO2EuY2hpbGQ9bnVsbDthLmRlbGV0aW9ucz1udWxsO2Euc2libGluZz1udWxsOzU9PT1hLnRhZyYmKGI9YS5zdGF0ZU5vZGUsbnVsbCE9PWImJihkZWxldGUgYltPZl0sZGVsZXRlIGJbUGZdLGRlbGV0ZSBiW29mXSxkZWxldGUgYltRZl0sZGVsZXRlIGJbUmZdKSk7YS5zdGF0ZU5vZGU9bnVsbDthLnJldHVybj1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5tZW1vaXplZFN0YXRlPW51bGw7YS5wZW5kaW5nUHJvcHM9bnVsbDthLnN0YXRlTm9kZT1udWxsO2EudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBUaihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31cbmZ1bmN0aW9uIFVqKGEpe2E6Zm9yKDs7KXtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fFRqKGEucmV0dXJuKSlyZXR1cm4gbnVsbDthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47Zm9yKGE9YS5zaWJsaW5nOzUhPT1hLnRhZyYmNiE9PWEudGFnJiYxOCE9PWEudGFnOyl7aWYoYS5mbGFncyYyKWNvbnRpbnVlIGE7aWYobnVsbD09PWEuY2hpbGR8fDQ9PT1hLnRhZyljb250aW51ZSBhO2Vsc2UgYS5jaGlsZC5yZXR1cm49YSxhPWEuY2hpbGR9aWYoIShhLmZsYWdzJjIpKXJldHVybiBhLnN0YXRlTm9kZX19XG5mdW5jdGlvbiBWaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj84PT09Yy5ub2RlVHlwZT9jLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYik6Yy5pbnNlcnRCZWZvcmUoYSxiKTooOD09PWMubm9kZVR5cGU/KGI9Yy5wYXJlbnROb2RlLGIuaW5zZXJ0QmVmb3JlKGEsYykpOihiPWMsYi5hcHBlbmRDaGlsZChhKSksYz1jLl9yZWFjdFJvb3RDb250YWluZXIsbnVsbCE9PWMmJnZvaWQgMCE9PWN8fG51bGwhPT1iLm9uY2xpY2t8fChiLm9uY2xpY2s9QmYpKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoVmooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOylWaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBXaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj9jLmluc2VydEJlZm9yZShhLGIpOmMuYXBwZW5kQ2hpbGQoYSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKFdqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspV2ooYSxiLGMpLGE9YS5zaWJsaW5nfXZhciBYPW51bGwsWGo9ITE7ZnVuY3Rpb24gWWooYSxiLGMpe2ZvcihjPWMuY2hpbGQ7bnVsbCE9PWM7KVpqKGEsYixjKSxjPWMuc2libGluZ31cbmZ1bmN0aW9uIFpqKGEsYixjKXtpZihsYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGxjLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtsYy5vbkNvbW1pdEZpYmVyVW5tb3VudChrYyxjKX1jYXRjaChoKXt9c3dpdGNoKGMudGFnKXtjYXNlIDU6VXx8TGooYyxiKTtjYXNlIDY6dmFyIGQ9WCxlPVhqO1g9bnVsbDtZaihhLGIsYyk7WD1kO1hqPWU7bnVsbCE9PVgmJihYaj8oYT1YLGM9Yy5zdGF0ZU5vZGUsOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOmEucmVtb3ZlQ2hpbGQoYykpOlgucmVtb3ZlQ2hpbGQoYy5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Om51bGwhPT1YJiYoWGo/KGE9WCxjPWMuc3RhdGVOb2RlLDg9PT1hLm5vZGVUeXBlP0tmKGEucGFyZW50Tm9kZSxjKToxPT09YS5ub2RlVHlwZSYmS2YoYSxjKSxiZChhKSk6S2YoWCxjLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpkPVg7ZT1YajtYPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87WGo9ITA7XG5ZaihhLGIsYyk7WD1kO1hqPWU7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFVJiYoZD1jLnVwZGF0ZVF1ZXVlLG51bGwhPT1kJiYoZD1kLmxhc3RFZmZlY3QsbnVsbCE9PWQpKSl7ZT1kPWQubmV4dDtkb3t2YXIgZj1lLGc9Zi5kZXN0cm95O2Y9Zi50YWc7dm9pZCAwIT09ZyYmKDAhPT0oZiYyKT9NaihjLGIsZyk6MCE9PShmJjQpJiZNaihjLGIsZykpO2U9ZS5uZXh0fXdoaWxlKGUhPT1kKX1ZaihhLGIsYyk7YnJlYWs7Y2FzZSAxOmlmKCFVJiYoTGooYyxiKSxkPWMuc3RhdGVOb2RlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudFdpbGxVbm1vdW50KSl0cnl7ZC5wcm9wcz1jLm1lbW9pemVkUHJvcHMsZC5zdGF0ZT1jLm1lbW9pemVkU3RhdGUsZC5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGgpe1coYyxiLGgpfVlqKGEsYixjKTticmVhaztjYXNlIDIxOllqKGEsYixjKTticmVhaztjYXNlIDIyOmMubW9kZSYxPyhVPShkPVUpfHxudWxsIT09XG5jLm1lbW9pemVkU3RhdGUsWWooYSxiLGMpLFU9ZCk6WWooYSxiLGMpO2JyZWFrO2RlZmF1bHQ6WWooYSxiLGMpfX1mdW5jdGlvbiBhayhhKXt2YXIgYj1hLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iKXthLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbD09PWMmJihjPWEuc3RhdGVOb2RlPW5ldyBLaik7Yi5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPWJrLmJpbmQobnVsbCxhLGIpO2MuaGFzKGIpfHwoYy5hZGQoYiksYi50aGVuKGQs
25114ZCkpfSl9fVxuZnVuY3Rpb24gY2soYSxiKXt2YXIgYz1iLmRlbGV0aW9ucztpZihudWxsIT09Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt0cnl7dmFyIGY9YSxnPWIsaD1nO2E6Zm9yKDtudWxsIT09aDspe3N3aXRjaChoLnRhZyl7Y2FzZSA1Olg9aC5zdGF0ZU5vZGU7WGo9ITE7YnJlYWsgYTtjYXNlIDM6WD1oLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1hqPSEwO2JyZWFrIGE7Y2FzZSA0Olg9aC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztYaj0hMDticmVhayBhfWg9aC5yZXR1cm59aWYobnVsbD09PVgpdGhyb3cgRXJyb3IocCgxNjApKTtaaihmLGcsZSk7WD1udWxsO1hqPSExO3ZhciBrPWUuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5yZXR1cm49bnVsbCk7ZS5yZXR1cm49bnVsbH1jYXRjaChsKXtXKGUsYixsKX19aWYoYi5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKGI9Yi5jaGlsZDtudWxsIT09YjspZGsoYixhKSxiPWIuc2libGluZ31cbmZ1bmN0aW9uIGRrKGEsYil7dmFyIGM9YS5hbHRlcm5hdGUsZD1hLmZsYWdzO3N3aXRjaChhLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNrKGIsYSk7ZWsoYSk7aWYoZCY0KXt0cnl7UGooMyxhLGEucmV0dXJuKSxRaigzLGEpfWNhdGNoKHQpe1coYSxhLnJldHVybix0KX10cnl7UGooNSxhLGEucmV0dXJuKX1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgMTpjayhiLGEpO2VrKGEpO2QmNTEyJiZudWxsIT09YyYmTGooYyxjLnJldHVybik7YnJlYWs7Y2FzZSA1OmNrKGIsYSk7ZWsoYSk7ZCY1MTImJm51bGwhPT1jJiZMaihjLGMucmV0dXJuKTtpZihhLmZsYWdzJjMyKXt2YXIgZT1hLnN0YXRlTm9kZTt0cnl7b2IoZSxcIlwiKX1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWlmKGQmNCYmKGU9YS5zdGF0ZU5vZGUsbnVsbCE9ZSkpe3ZhciBmPWEubWVtb2l6ZWRQcm9wcyxnPW51bGwhPT1jP2MubWVtb2l6ZWRQcm9wczpmLGg9YS50eXBlLGs9YS51cGRhdGVRdWV1ZTtcbmEudXBkYXRlUXVldWU9bnVsbDtpZihudWxsIT09ayl0cnl7XCJpbnB1dFwiPT09aCYmXCJyYWRpb1wiPT09Zi50eXBlJiZudWxsIT1mLm5hbWUmJmFiKGUsZik7dmIoaCxnKTt2YXIgbD12YihoLGYpO2ZvcihnPTA7ZzxrLmxlbmd0aDtnKz0yKXt2YXIgbT1rW2ddLHE9a1tnKzFdO1wic3R5bGVcIj09PW0/c2IoZSxxKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1tP25iKGUscSk6XCJjaGlsZHJlblwiPT09bT9vYihlLHEpOnRhKGUsbSxxLGwpfXN3aXRjaChoKXtjYXNlIFwiaW5wdXRcIjpiYihlLGYpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmliKGUsZik7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOnZhciByPWUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFmLm11bHRpcGxlO3ZhciB5PWYudmFsdWU7bnVsbCE9eT9mYihlLCEhZi5tdWx0aXBsZSx5LCExKTpyIT09ISFmLm11bHRpcGxlJiYobnVsbCE9Zi5kZWZh
25114dWx0VmFsdWU/ZmIoZSwhIWYubXVsdGlwbGUsXG5mLmRlZmF1bHRWYWx1ZSwhMCk6ZmIoZSwhIWYubXVsdGlwbGUsZi5tdWx0aXBsZT9bXTpcIlwiLCExKSl9ZVtQZl09Zn1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgNjpjayhiLGEpO2VrKGEpO2lmKGQmNCl7aWYobnVsbD09PWEuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTYyKSk7ZT1hLnN0YXRlTm9kZTtmPWEubWVtb2l6ZWRQcm9wczt0cnl7ZS5ub2RlVmFsdWU9Zn1jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgMzpjayhiLGEpO2VrKGEpO2lmKGQmNCYmbnVsbCE9PWMmJmMubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e2JkKGIuY29udGFpbmVySW5mbyl9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfWJyZWFrO2Nhc2UgNDpjayhiLGEpO2VrKGEpO2JyZWFrO2Nhc2UgMTM6Y2soYixhKTtlayhhKTtlPWEuY2hpbGQ7ZS5mbGFncyY4MTkyJiYoZj1udWxsIT09ZS5tZW1vaXplZFN0YXRlLGUuc3RhdGVOb2RlLmlzSGlkZGVuPWYsIWZ8fFxubnVsbCE9PWUuYWx0ZXJuYXRlJiZudWxsIT09ZS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZXx8KGZrPUIoKSkpO2QmNCYmYWsoYSk7YnJlYWs7Y2FzZSAyMjptPW51bGwhPT1jJiZudWxsIT09Yy5tZW1vaXplZFN0YXRlO2EubW9kZSYxPyhVPShsPVUpfHxtLGNrKGIsYSksVT1sKTpjayhiLGEpO2VrKGEpO2lmKGQmODE5Mil7bD1udWxsIT09YS5tZW1vaXplZFN0YXRlO2lmKChhLnN0YXRlTm9kZS5pc0hpZGRlbj1sKSYmIW0mJjAhPT0oYS5tb2RlJjEpKWZvcihWPWEsbT1hLmNoaWxkO251bGwhPT1tOyl7Zm9yKHE9Vj1tO251bGwhPT1WOyl7cj1WO3k9ci5jaGlsZDtzd2l0Y2goci50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpQaig0LHIsci5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpMaihyLHIucmV0dXJuKTt2YXIgbj1yLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygbi5jb21wb25lbnRXaWxsVW5tb3VudCl7ZD1yO2M9ci5yZXR1cm47dHJ5e2I9ZCxuLnByb3BzPVxuYi5tZW1vaXplZFByb3BzLG4uc3RhdGU9Yi5tZW1vaXplZFN0YXRlLG4uY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaCh0KXtXKGQsYyx0KX19YnJlYWs7Y2FzZSA1OkxqKHIsci5yZXR1cm4pO2JyZWFrO2Nhc2UgMjI6aWYobnVsbCE9PXIubWVtb2l6ZWRTdGF0ZSl7Z2socSk7Y29udGludWV9fW51bGwhPT15Pyh5LnJldHVybj1yLFY9eSk6Z2socSl9bT1tLnNpYmxpbmd9YTpmb3IobT1udWxsLHE9YTs7KXtpZig1PT09cS50YWcpe2lmKG51bGw9PT1tKXttPXE7dHJ5e2U9cS5zdGF0ZU5vZGUsbD8oZj1lLnN0eWxlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLnNldFByb3BlcnR5P2Yuc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsXCJub25lXCIsXCJpbXBvcnRhbnRcIik6Zi5kaXNwbGF5PVwibm9uZVwiKTooaD1xLnN0YXRlTm9kZSxrPXEubWVtb2l6ZWRQcm9wcy5zdHlsZSxnPXZvaWQgMCE9PWsmJm51bGwhPT1rJiZrLmhhc093blByb3BlcnR5KFwiZGlzcGxheVwiKT9rLmRpc3BsYXk6bnVsbCxoLnN0eWxlLmRpc3BsYXk9XG5yYihcImRpc3BsYXlcIixnKSl9Y2F0Y2godCl7VyhhLGEucmV0dXJuLHQpfX19ZWxzZSBpZig2PT09cS50YWcpe2lmKG51bGw9PT1tKXRyeXtxLnN0YXRlTm9kZS5ub2RlVmFsdWU9bD9cIlwiOnEubWVtb2l6ZWRQcm9wc31jYXRjaCh0KXtXKGEsYS5yZXR1cm4sdCl9fWVsc2UgaWYoKDIyIT09cS50YWcmJjIzIT09cS50YWd8fG51bGw9PT1xLm1lbW9pemVkU3RhdGV8fHE9PT1hKSYmbnVsbCE9PXEuY2hpbGQpe3EuY2hpbGQucmV0dXJuPXE7cT1xLmNoaWxkO2NvbnRpbnVlfWlmKHE9PT1hKWJyZWFrIGE7Zm9yKDtudWxsPT09cS5zaWJsaW5nOyl7aWYobnVsbD09PXEucmV0dXJufHxxLnJldHVybj09PWEpYnJlYWsgYTttPT09cSYmKG09bnVsbCk7cT1xLnJldHVybn1tPT09cSYmKG09bnVsbCk7cS5zaWJsaW5nLnJldHVybj1xLnJldHVybjtxPXEuc2libGluZ319YnJlYWs7Y2FzZSAxOTpjayhiLGEpO2VrKGEpO2QmNCYmYWsoYSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmNrKGIsXG5hKSxlayhhKX19ZnVuY3Rpb24gZWsoYSl7dmFyIGI9YS5mbGFncztpZihiJjIpe3RyeXthOntmb3IodmFyIGM9YS5yZXR1cm47bnVsbCE9PWM7KXtpZihUaihjKSl7dmFyIGQ9YzticmVhayBhfWM9Yy5yZXR1cm59dGhyb3cgRXJyb3IocCgxNjApKTt9c3dpdGNoKGQudGFnKXtjYXNlIDU6dmFyIGU9ZC5zdGF0ZU5vZGU7ZC5mbGFncyYzMiYmKG9iKGUsXCJcIiksZC5mbGFncyY9LTMzKTt2YXIgZj1VaihhKTtXaihhLGYsZSk7YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgZz1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGg9VWooYSk7VmooYSxoLGcpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjEpKTt9fWNhdGNoKGspe1coYSxhLnJldHVybixrKX1hLmZsYWdzJj0tM31iJjQwOTYmJihhLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gaGsoYSxiLGMpe1Y9YTtpayhhLGIsYyl9XG5mdW5jdGlvbiBpayhhLGIsYyl7Zm9yKHZhciBkPTAhPT0oYS5tb2RlJjEpO251bGwhPT1WOyl7dmFyIGU9VixmPWUuY2hpbGQ7aWYoMjI9PT1lLnRhZyYmZCl7dmFyIGc9bnVsbCE9PWUubWVtb2l6ZWRTdGF0ZXx8Smo7aWYoIWcpe3ZhciBoPWUuYWx0ZXJuYXRlLGs9bnVsbCE9PWgmJm51bGwhPT1oLm1lbW9pemVkU3RhdGV8fFU7aD1Kajt2YXIgbD1VO0pqPWc7aWYoKFU9aykmJiFsKWZvcihWPWU7bnVsbCE9PVY7KWc9VixrPWcuY2hpbGQsMjI9PT1nLnRhZyYmbnVsbCE9PWcubWVtb2l6ZWRTdGF0ZT9qayhlKTpudWxsIT09az8oay5yZXR1cm49ZyxWPWspOmprKGUpO2Zvcig7bnVsbCE9PWY7KVY9ZixpayhmLGIsYyksZj1mLnNpYmxpbmc7Vj1lO0pqPWg7VT1sfWtrKGEsYixjKX1lbHNlIDAhPT0oZS5zdWJ0cmVlRmxhZ3MmODc3MikmJm51bGwhPT1mPyhmLnJldHVybj1lLFY9Zik6a2soYSxiLGMpfX1cbmZ1bmN0aW9uIGtrKGEpe2Zvcig7bnVsbCE9PVY7KXt2YXIgYj1WO2lmKDAhPT0oYi5mbGFncyY4NzcyKSl7dmFyIGM9Yi5hbHRlcm5hdGU7dHJ5e2lmKDAhPT0oYi5mbGFncyY4NzcyKSlzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6VXx8UWooNSxiKTticmVhaztjYXNlIDE6dmFyIGQ9Yi5zdGF0ZU5vZGU7aWYoYi5mbGFncyY0JiYhVSlpZihudWxsPT09YylkLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgZT1iLmVsZW1lbnRUeXBlPT09Yi50eXBlP2MubWVtb2l6ZWRQcm9wczpDaShiLnR5cGUsYy5tZW1vaXplZFByb3BzKTtkLmNvbXBvbmVudERpZFVwZGF0ZShlLGMubWVtb2l6ZWRTdGF0ZSxkLl9fcmVhY3RJb
25114nRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgZj1iLnVwZGF0ZVF1ZXVlO251bGwhPT1mJiZzaChiLGYsZCk7YnJlYWs7Y2FzZSAzOnZhciBnPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWcpe2M9bnVsbDtpZihudWxsIT09Yi5jaGlsZClzd2l0Y2goYi5jaGlsZC50YWcpe2Nhc2UgNTpjPVxuYi5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOmM9Yi5jaGlsZC5zdGF0ZU5vZGV9c2goYixnLGMpfWJyZWFrO2Nhc2UgNTp2YXIgaD1iLnN0YXRlTm9kZTtpZihudWxsPT09YyYmYi5mbGFncyY0KXtjPWg7dmFyIGs9Yi5tZW1vaXplZFByb3BzO3N3aXRjaChiLnR5cGUpe2Nhc2UgXCJidXR0b25cIjpjYXNlIFwiaW5wdXRcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInRleHRhcmVhXCI6ay5hdXRvRm9jdXMmJmMuZm9jdXMoKTticmVhaztjYXNlIFwiaW1nXCI6ay5zcmMmJihjLnNyYz1rLnNyYyl9fWJyZWFrO2Nhc2UgNjpicmVhaztjYXNlIDQ6YnJlYWs7Y2FzZSAxMjpicmVhaztjYXNlIDEzOmlmKG51bGw9PT1iLm1lbW9pemVkU3RhdGUpe3ZhciBsPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1sKXt2YXIgbT1sLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PW0pe3ZhciBxPW0uZGVoeWRyYXRlZDtudWxsIT09cSYmYmQocSl9fX1icmVhaztjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztcbmRlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjMpKTt9VXx8Yi5mbGFncyY1MTImJlJqKGIpfWNhdGNoKHIpe1coYixiLnJldHVybixyKX19aWYoYj09PWEpe1Y9bnVsbDticmVha31jPWIuc2libGluZztpZihudWxsIT09Yyl7Yy5yZXR1cm49Yi5yZXR1cm47Vj1jO2JyZWFrfVY9Yi5yZXR1cm59fWZ1bmN0aW9uIGdrKGEpe2Zvcig7bnVsbCE9PVY7KXt2YXIgYj1WO2lmKGI9PT1hKXtWPW51bGw7YnJlYWt9dmFyIGM9Yi5zaWJsaW5nO2lmKG51bGwhPT1jKXtjLnJldHVybj1iLnJldHVybjtWPWM7YnJlYWt9Vj1iLnJldHVybn19XG5mdW5jdGlvbiBqayhhKXtmb3IoO251bGwhPT1WOyl7dmFyIGI9Vjt0cnl7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBjPWIucmV0dXJuO3RyeXtRaig0LGIpfWNhdGNoKGspe1coYixjLGspfWJyZWFrO2Nhc2UgMTp2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnREaWRNb3VudCl7dmFyIGU9Yi5yZXR1cm47dHJ5e2QuY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChrKXtXKGIsZSxrKX19dmFyIGY9Yi5yZXR1cm47dHJ5e1JqKGIpfWNhdGNoKGspe1coYixmLGspfWJyZWFrO2Nhc2UgNTp2YXIgZz1iLnJldHVybjt0cnl7UmooYil9Y2F0Y2goayl7VyhiLGcsayl9fX1jYXRjaChrKXtXKGIsYi5yZXR1cm4sayl9aWYoYj09PWEpe1Y9bnVsbDticmVha312YXIgaD1iLnNpYmxpbmc7aWYobnVsbCE9PWgpe2gucmV0dXJuPWIucmV0dXJuO1Y9aDticmVha31WPWIucmV0dXJufX1cbnZhciBsaz1NYXRoLmNlaWwsbWs9dWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixuaz11YS5SZWFjdEN1cnJlbnRPd25lcixvaz11YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxLPTAsUT1udWxsLFk9bnVsbCxaPTAsZmo9MCxlaj1VZigwKSxUPTAscGs9bnVsbCxyaD0wLHFrPTAscms9MCxzaz1udWxsLHRrPW51bGwsZms9MCxHaj1JbmZpbml0eSx1az1udWxsLE9pPSExLFBpPW51bGwsUmk9bnVsbCx2az0hMSx3az1udWxsLHhrPTAseWs9MCx6az1udWxsLEFrPS0xLEJrPTA7ZnVuY3Rpb24gUigpe3JldHVybiAwIT09KEsmNik/QigpOi0xIT09QWs/QWs6QWs9QigpfVxuZnVuY3Rpb24geWkoYSl7aWYoMD09PShhLm1vZGUmMSkpcmV0dXJuIDE7aWYoMCE9PShLJjIpJiYwIT09WilyZXR1cm4gWiYtWjtpZihudWxsIT09S2cudHJhbnNpdGlvbilyZXR1cm4gMD09PUJrJiYoQms9eWMoKSksQms7YT1DO2lmKDAhPT1hKXJldHVybiBhO2E9d2luZG93LmV2ZW50O2E9dm9pZCAwPT09YT8xNjpqZChhLnR5cGUpO3JldHVybiBhfWZ1bmN0aW9uIGdpKGEsYixjLGQpe2lmKDUwPHlrKXRocm93IHlrPTAsems9bnVsbCxFcnJvcihwKDE4NSkpO0FjKGEsYyxkKTtpZigwPT09KEsmMil8fGEhPT1RKWE9PT1RJiYoMD09PShLJjIpJiYocWt8PWMpLDQ9PT1UJiZDayhhLFopKSxEayhhLGQpLDE9PT1jJiYwPT09SyYmMD09PShiLm1vZGUmMSkmJihHaj1CKCkrNTAwLGZnJiZqZygpKX1cbmZ1bmN0aW9uIERrKGEsYil7dmFyIGM9YS5jYWxsYmFja05vZGU7d2MoYSxiKTt2YXIgZD11YyhhLGE9PT1RP1o6MCk7aWYoMD09PWQpbnVsbCE9PWMmJmJjKGMpLGEuY2FsbGJhY2tOb2RlPW51bGwsYS5jYWxsYmFja1ByaW9yaXR5PTA7ZWxzZSBpZihiPWQmLWQsYS5jYWxsYmFja1ByaW9yaXR5IT09Yil7bnVsbCE9YyYmYmMoYyk7aWYoMT09PWIpMD09PWEudGFnP2lnKEVrLmJpbmQobnVsbCxhKSk6aGcoRWsuYmluZChudWxsLGEpKSxKZihmdW5jdGlvbigpezA9PT0oSyY2KSYmamcoKX0pLGM9bnVsbDtlbHNle3N3aXRjaChEYyhkKSl7Y2FzZSAxOmM9ZmM7YnJlYWs7Y2FzZSA0OmM9Z2M7YnJlYWs7Y2FzZSAxNjpjPWhjO2JyZWFrO2Nhc2UgNTM2ODcwOTEyOmM9amM7YnJlYWs7ZGVmYXVsdDpjPWhjfWM9RmsoYyxHay5iaW5kKG51bGwsYSkpfWEuY2FsbGJhY2tQcmlvcml0eT1iO2EuY2FsbGJhY2tOb2RlPWN9fVxuZnVuY3Rpb24gR2soYSxiKXtBaz0tMTtCaz0wO2lmKDAhPT0oSyY2KSl0aHJvdyBFcnJvcihwKDMyNykpO3ZhciBjPWEuY2FsbGJhY2tOb2RlO2lmKEhrKCkmJmEuY2FsbGJhY2tOb2RlIT09YylyZXR1cm4gbnVsbDt2YXIgZD11YyhhLGE9PT1RP1o6MCk7aWYoMD09PWQpcmV0dXJuIG51bGw7aWYoMCE9PShkJjMwKXx8MCE9PShkJmEuZXhwaXJlZExhbmVzKXx8YiliPUlrKGEsZCk7ZWxzZXtiPWQ7dmFyIGU9SztLfD0yO3ZhciBmPUprKCk7aWYoUSE9PWF8fFohPT1iKXVrPW51bGwsR2o9QigpKzUwMCxLayhhLGIpO2RvIHRyeXtMaygpO2JyZWFrfWNhdGNoKGgpe01rKGEsaCl9d2hpbGUoMSk7JGcoKTttay5jdXJyZW50PWY7Sz1lO251bGwhPT1ZP2I9MDooUT1udWxsLFo9MCxiPVQpfWlmKDAhPT1iKXsyPT09YiYmKGU9eGMoYSksMCE9PWUmJihkPWUsYj1OayhhLGUpKSk7aWYoMT09PWIpdGhyb3cgYz1wayxLayhhLDApLENrKGEsZCksRGsoYSxCKCkpLGM7aWYoNj09PWIpQ2soYSxkKTtcbmVsc2V7ZT1hLmN1cnJlbnQuYWx0ZXJuYXRlO2lmKDA9PT0oZCYzMCkmJiFPayhlKSYmKGI9SWsoYSxkKSwyPT09YiYmKGY9eGMoYSksMCE9PWYmJihkPWYsYj1OayhhLGYpKSksMT09PWIpKXRocm93IGM9cGssS2soYSwwKSxDayhhLGQpLERrKGEsQigpKSxjO2EuZmluaXNoZWRXb3JrPWU7YS5maW5pc2hlZExhbmVzPWQ7c3dpdGNoKGIpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IocCgzNDUpKTtjYXNlIDI6UGsoYSx0ayx1ayk7YnJlYWs7Y2FzZSAzOkNrKGEsZCk7aWYoKGQmMTMwMDIzNDI0KT09PWQmJihiPWZrKzUwMC1CKCksMTA8Yikpe2lmKDAhPT11YyhhLDApKWJyZWFrO2U9YS5zdXNwZW5kZWRMYW5lcztpZigoZSZkKSE9PWQpe1IoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmU7YnJlYWt9YS50aW1lb3V0SGFuZGxlPUZmKFBrLmJpbmQobnVsbCxhLHRrLHVrKSxiKTticmVha31QayhhLHRrLHVrKTticmVhaztjYXNlIDQ6Q2soYSxkKTtpZigoZCY0MTk0MjQwKT09PVxuZClicmVhaztiPWEuZXZlbnRUaW1lcztmb3IoZT0tMTswPGQ7KXt2YXIgZz0zMS1vYyhkKTtmPTE8PGc7Zz1iW2ddO2c+ZSYmKGU9Zyk7ZCY9fmZ9ZD1lO2Q9QigpLWQ7ZD0oMTIwPmQ/
25114MTIwOjQ4MD5kPzQ4MDoxMDgwPmQ/MTA4MDoxOTIwPmQ/MTkyMDozRTM+ZD8zRTM6NDMyMD5kPzQzMjA6MTk2MCpsayhkLzE5NjApKS1kO2lmKDEwPGQpe2EudGltZW91dEhhbmRsZT1GZihQay5iaW5kKG51bGwsYSx0ayx1ayksZCk7YnJlYWt9UGsoYSx0ayx1ayk7YnJlYWs7Y2FzZSA1OlBrKGEsdGssdWspO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IocCgzMjkpKTt9fX1EayhhLEIoKSk7cmV0dXJuIGEuY2FsbGJhY2tOb2RlPT09Yz9Hay5iaW5kKG51bGwsYSk6bnVsbH1cbmZ1bmN0aW9uIE5rKGEsYil7dmFyIGM9c2s7YS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYoS2soYSxiKS5mbGFnc3w9MjU2KTthPUlrKGEsYik7MiE9PWEmJihiPXRrLHRrPWMsbnVsbCE9PWImJkZqKGIpKTtyZXR1cm4gYX1mdW5jdGlvbiBGaihhKXtudWxsPT09dGs/dGs9YTp0ay5wdXNoLmFwcGx5KHRrLGEpfVxuZnVuY3Rpb24gT2soYSl7Zm9yKHZhciBiPWE7Oyl7aWYoYi5mbGFncyYxNjM4NCl7dmFyIGM9Yi51cGRhdGVRdWV1ZTtpZihudWxsIT09YyYmKGM9Yy5zdG9yZXMsbnVsbCE9PWMpKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLGY9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e2lmKCFIZShmKCksZSkpcmV0dXJuITF9Y2F0Y2goZyl7cmV0dXJuITF9fX1jPWIuY2hpbGQ7aWYoYi5zdWJ0cmVlRmxhZ3MmMTYzODQmJm51bGwhPT1jKWMucmV0dXJuPWIsYj1jO2Vsc2V7aWYoYj09PWEpYnJlYWs7Zm9yKDtudWxsPT09Yi5zaWJsaW5nOyl7aWYobnVsbD09PWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuITA7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfX1yZXR1cm4hMH1cbmZ1bmN0aW9uIENrKGEsYil7YiY9fnJrO2ImPX5xazthLnN1c3BlbmRlZExhbmVzfD1iO2EucGluZ2VkTGFuZXMmPX5iO2ZvcihhPWEuZXhwaXJhdGlvblRpbWVzOzA8Yjspe3ZhciBjPTMxLW9jKGIpLGQ9MTw8YzthW2NdPS0xO2ImPX5kfX1mdW5jdGlvbiBFayhhKXtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMjcpKTtIaygpO3ZhciBiPXVjKGEsMCk7aWYoMD09PShiJjEpKXJldHVybiBEayhhLEIoKSksbnVsbDt2YXIgYz1JayhhLGIpO2lmKDAhPT1hLnRhZyYmMj09PWMpe3ZhciBkPXhjKGEpOzAhPT1kJiYoYj1kLGM9TmsoYSxkKSl9aWYoMT09PWMpdGhyb3cgYz1wayxLayhhLDApLENrKGEsYiksRGsoYSxCKCkpLGM7aWYoNj09PWMpdGhyb3cgRXJyb3IocCgzNDUpKTthLmZpbmlzaGVkV29yaz1hLmN1cnJlbnQuYWx0ZXJuYXRlO2EuZmluaXNoZWRMYW5lcz1iO1BrKGEsdGssdWspO0RrKGEsQigpKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFFrKGEsYil7dmFyIGM9SztLfD0xO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e0s9YywwPT09SyYmKEdqPUIoKSs1MDAsZmcmJmpnKCkpfX1mdW5jdGlvbiBSayhhKXtudWxsIT09d2smJjA9PT13ay50YWcmJjA9PT0oSyY2KSYmSGsoKTt2YXIgYj1LO0t8PTE7dmFyIGM9b2sudHJhbnNpdGlvbixkPUM7dHJ5e2lmKG9rLnRyYW5zaXRpb249bnVsbCxDPTEsYSlyZXR1cm4gYSgpfWZpbmFsbHl7Qz1kLG9rLnRyYW5zaXRpb249YyxLPWIsMD09PShLJjYpJiZqZygpfX1mdW5jdGlvbiBIaigpe2ZqPWVqLmN1cnJlbnQ7RShlail9XG5mdW5jdGlvbiBLayhhLGIpe2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7dmFyIGM9YS50aW1lb3V0SGFuZGxlOy0xIT09YyYmKGEudGltZW91dEhhbmRsZT0tMSxHZihjKSk7aWYobnVsbCE9PVkpZm9yKGM9WS5yZXR1cm47bnVsbCE9PWM7KXt2YXIgZD1jO3dnKGQpO3N3aXRjaChkLnRhZyl7Y2FzZSAxOmQ9ZC50eXBlLmNoaWxkQ29udGV4dFR5cGVzO251bGwhPT1kJiZ2b2lkIDAhPT1kJiYkZigpO2JyZWFrO2Nhc2UgMzp6aCgpO0UoV2YpO0UoSCk7RWgoKTticmVhaztjYXNlIDU6QmgoZCk7YnJlYWs7Y2FzZSA0OnpoKCk7YnJlYWs7Y2FzZSAxMzpFKEwpO2JyZWFrO2Nhc2UgMTk6RShMKTticmVhaztjYXNlIDEwOmFoKGQudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOkhqKCl9Yz1jLnJldHVybn1RPWE7WT1hPVBnKGEuY3VycmVudCxudWxsKTtaPWZqPWI7VD0wO3BrPW51bGw7cms9cWs9cmg9MDt0az1zaz1udWxsO2lmKG51bGwhPT1maCl7Zm9yKGI9XG4wO2I8ZmgubGVuZ3RoO2IrKylpZihjPWZoW2JdLGQ9Yy5pbnRlcmxlYXZlZCxudWxsIT09ZCl7Yy5pbnRlcmxlYXZlZD1udWxsO3ZhciBlPWQubmV4dCxmPWMucGVuZGluZztpZihudWxsIT09Zil7dmFyIGc9Zi5uZXh0O2YubmV4dD1lO2QubmV4dD1nfWMucGVuZGluZz1kfWZoPW51bGx9cmV0dXJuIGF9XG5mdW5jdGlvbiBNayhhLGIpe2Rve3ZhciBjPVk7dHJ5eyRnKCk7RmguY3VycmVudD1SaDtpZihJaCl7Zm9yKHZhciBkPU0ubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZDspe3ZhciBlPWQucXVldWU7bnVsbCE9PWUmJihlLnBlbmRpbmc9bnVsbCk7ZD1kLm5leHR9SWg9ITF9SGg9MDtPPU49TT1udWxsO0poPSExO0toPTA7bmsuY3VycmVudD1udWxsO2lmKG51bGw9PT1jfHxudWxsPT09Yy5yZXR1cm4pe1Q9MTtwaz1iO1k9bnVsbDticmVha31hOnt2YXIgZj1hLGc9Yy5yZXR1cm4saD1jLGs9YjtiPVo7aC5mbGFnc3w9MzI3Njg7aWYobnVsbCE9PWsmJlwib2JqZWN0XCI9PT10eXBlb2YgayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGsudGhlbil7dmFyIGw9ayxtPWgscT1tLnRhZztpZigwPT09KG0ubW9kZSYxKSYmKDA9PT1xfHwxMT09PXF8fDE1PT09cSkpe3ZhciByPW0uYWx0ZXJuYXRlO3I/KG0udXBkYXRlUXVldWU9ci51cGRhdGVRdWV1ZSxtLm1lbW9pemVkU3RhdGU9ci5tZW1vaXplZFN0YXRlLFxubS5sYW5lcz1yLmxhbmVzKToobS51cGRhdGVRdWV1ZT1udWxsLG0ubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgeT1VaShnKTtpZihudWxsIT09eSl7eS5mbGFncyY9LTI1NztWaSh5LGcsaCxmLGIpO3kubW9kZSYxJiZTaShmLGwsYik7Yj15O2s9bDt2YXIgbj1iLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1uKXt2YXIgdD1uZXcgU2V0O3QuYWRkKGspO2IudXBkYXRlUXVldWU9dH1lbHNlIG4uYWRkKGspO2JyZWFrIGF9ZWxzZXtpZigwPT09KGImMSkpe1NpKGYsbCxiKTt0aigpO2JyZWFrIGF9az1FcnJvcihwKDQyNikpfX1lbHNlIGlmKEkmJmgubW9kZSYxKXt2YXIgSj1VaShnKTtpZihudWxsIT09Sil7MD09PShKLmZsYWdzJjY1NTM2KSYmKEouZmxhZ3N8PTI1Nik7VmkoSixnLGgsZixiKTtKZyhKaShrLGgpKTticmVhayBhfX1mPWs9SmkoayxoKTs0IT09VCYmKFQ9Mik7bnVsbD09PXNrP3NrPVtmXTpzay5wdXNoKGYpO2Y9Zztkb3tzd2l0Y2goZi50YWcpe2Nhc2UgMzpmLmZsYWdzfD02NTUzNjtcbmImPS1iO2YubGFuZXN8PWI7dmFyIHg9TmkoZixrLGIpO3BoKGYseCk7YnJlYWsgYTtjYXNlIDE6aD1rO3ZhciB3PWYudHlwZSx1PWYuc3RhdGVOb2RlO2lmKDA9PT0oZi5mbGFncyYxMjgpJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIHcuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxudWxsIT09dSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHUuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09Uml8fCFSaS5oYXModSkpKSl7Zi5mbGFnc3w9NjU1MzY7YiY9LWI7Zi
251145sYW5lc3w9Yjt2YXIgRj1RaShmLGgsYik7cGgoZixGKTticmVhayBhfX1mPWYucmV0dXJufXdoaWxlKG51bGwhPT1mKX1TayhjKX1jYXRjaChuYSl7Yj1uYTtZPT09YyYmbnVsbCE9PWMmJihZPWM9Yy5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKDEpfWZ1bmN0aW9uIEprKCl7dmFyIGE9bWsuY3VycmVudDttay5jdXJyZW50PVJoO3JldHVybiBudWxsPT09YT9SaDphfVxuZnVuY3Rpb24gdGooKXtpZigwPT09VHx8Mz09PVR8fDI9PT1UKVQ9NDtudWxsPT09UXx8MD09PShyaCYyNjg0MzU0NTUpJiYwPT09KHFrJjI2ODQzNTQ1NSl8fENrKFEsWil9ZnVuY3Rpb24gSWsoYSxiKXt2YXIgYz1LO0t8PTI7dmFyIGQ9SmsoKTtpZihRIT09YXx8WiE9PWIpdWs9bnVsbCxLayhhLGIpO2RvIHRyeXtUaygpO2JyZWFrfWNhdGNoKGUpe01rKGEsZSl9d2hpbGUoMSk7JGcoKTtLPWM7bWsuY3VycmVudD1kO2lmKG51bGwhPT1ZKXRocm93IEVycm9yKHAoMjYxKSk7UT1udWxsO1o9MDtyZXR1cm4gVH1mdW5jdGlvbiBUaygpe2Zvcig7bnVsbCE9PVk7KVVrKFkpfWZ1bmN0aW9uIExrKCl7Zm9yKDtudWxsIT09WSYmIWNjKCk7KVVrKFkpfWZ1bmN0aW9uIFVrKGEpe3ZhciBiPVZrKGEuYWx0ZXJuYXRlLGEsZmopO2EubWVtb2l6ZWRQcm9wcz1hLnBlbmRpbmdQcm9wcztudWxsPT09Yj9TayhhKTpZPWI7bmsuY3VycmVudD1udWxsfVxuZnVuY3Rpb24gU2soYSl7dmFyIGI9YTtkb3t2YXIgYz1iLmFsdGVybmF0ZTthPWIucmV0dXJuO2lmKDA9PT0oYi5mbGFncyYzMjc2OCkpe2lmKGM9RWooYyxiLGZqKSxudWxsIT09Yyl7WT1jO3JldHVybn19ZWxzZXtjPUlqKGMsYik7aWYobnVsbCE9PWMpe2MuZmxhZ3MmPTMyNzY3O1k9YztyZXR1cm59aWYobnVsbCE9PWEpYS5mbGFnc3w9MzI3NjgsYS5zdWJ0cmVlRmxhZ3M9MCxhLmRlbGV0aW9ucz1udWxsO2Vsc2V7VD02O1k9bnVsbDtyZXR1cm59fWI9Yi5zaWJsaW5nO2lmKG51bGwhPT1iKXtZPWI7cmV0dXJufVk9Yj1hfXdoaWxlKG51bGwhPT1iKTswPT09VCYmKFQ9NSl9ZnVuY3Rpb24gUGsoYSxiLGMpe3ZhciBkPUMsZT1vay50cmFuc2l0aW9uO3RyeXtvay50cmFuc2l0aW9uPW51bGwsQz0xLFdrKGEsYixjLGQpfWZpbmFsbHl7b2sudHJhbnNpdGlvbj1lLEM9ZH1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFdrKGEsYixjLGQpe2RvIEhrKCk7d2hpbGUobnVsbCE9PXdrKTtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMjcpKTtjPWEuZmluaXNoZWRXb3JrO3ZhciBlPWEuZmluaXNoZWRMYW5lcztpZihudWxsPT09YylyZXR1cm4gbnVsbDthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRMYW5lcz0wO2lmKGM9PT1hLmN1cnJlbnQpdGhyb3cgRXJyb3IocCgxNzcpKTthLmNhbGxiYWNrTm9kZT1udWxsO2EuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBmPWMubGFuZXN8Yy5jaGlsZExhbmVzO0JjKGEsZik7YT09PVEmJihZPVE9bnVsbCxaPTApOzA9PT0oYy5zdWJ0cmVlRmxhZ3MmMjA2NCkmJjA9PT0oYy5mbGFncyYyMDY0KXx8dmt8fCh2az0hMCxGayhoYyxmdW5jdGlvbigpe0hrKCk7cmV0dXJuIG51bGx9KSk7Zj0wIT09KGMuZmxhZ3MmMTU5OTApO2lmKDAhPT0oYy5zdWJ0cmVlRmxhZ3MmMTU5OTApfHxmKXtmPW9rLnRyYW5zaXRpb247b2sudHJhbnNpdGlvbj1udWxsO1xudmFyIGc9QztDPTE7dmFyIGg9SztLfD00O25rLmN1cnJlbnQ9bnVsbDtPaihhLGMpO2RrKGMsYSk7T2UoRGYpO2RkPSEhQ2Y7RGY9Q2Y9bnVsbDthLmN1cnJlbnQ9YztoayhjLGEsZSk7ZGMoKTtLPWg7Qz1nO29rLnRyYW5zaXRpb249Zn1lbHNlIGEuY3VycmVudD1jO3ZrJiYodms9ITEsd2s9YSx4az1lKTtmPWEucGVuZGluZ0xhbmVzOzA9PT1mJiYoUmk9bnVsbCk7bWMoYy5zdGF0ZU5vZGUsZCk7RGsoYSxCKCkpO2lmKG51bGwhPT1iKWZvcihkPWEub25SZWNvdmVyYWJsZUVycm9yLGM9MDtjPGIubGVuZ3RoO2MrKyllPWJbY10sZChlLnZhbHVlLHtjb21wb25lbnRTdGFjazplLnN0YWNrLGRpZ2VzdDplLmRpZ2VzdH0pO2lmKE9pKXRocm93IE9pPSExLGE9UGksUGk9bnVsbCxhOzAhPT0oeGsmMSkmJjAhPT1hLnRhZyYmSGsoKTtmPWEucGVuZGluZ0xhbmVzOzAhPT0oZiYxKT9hPT09ems/eWsrKzooeWs9MCx6az1hKTp5az0wO2pnKCk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBIaygpe2lmKG51bGwhPT13ayl7dmFyIGE9RGMoeGspLGI9b2sudHJhbnNpdGlvbixjPUM7dHJ5e29rLnRyYW5zaXRpb249bnVsbDtDPTE2PmE/MTY6YTtpZihudWxsPT09d2spdmFyIGQ9ITE7ZWxzZXthPXdrO3drPW51bGw7eGs9MDtpZigwIT09KEsmNikpdGhyb3cgRXJyb3IocCgzMzEpKTt2YXIgZT1LO0t8PTQ7Zm9yKFY9YS5jdXJyZW50O251bGwhPT1WOyl7dmFyIGY9VixnPWYuY2hpbGQ7aWYoMCE9PShWLmZsYWdzJjE2KSl7dmFyIGg9Zi5kZWxldGlvbnM7aWYobnVsbCE9PWgpe2Zvcih2YXIgaz0wO2s8aC5sZW5ndGg7aysrKXt2YXIgbD1oW2tdO2ZvcihWPWw7bnVsbCE9PVY7KXt2YXIgbT1WO3N3aXRjaChtLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpQaig4LG0sZil9dmFyIHE9bS5jaGlsZDtpZihudWxsIT09cSlxLnJldHVybj1tLFY9cTtlbHNlIGZvcig7bnVsbCE9PVY7KXttPVY7dmFyIHI9bS5zaWJsaW5nLHk9bS5yZXR1cm47U2oobSk7aWYobT09PVxubCl7Vj1udWxsO2JyZWFrfWlmKG51bGwhPT1yKXtyLnJldHVybj15O1Y9cjticmVha31WPXl9fX12YXIgbj1mLmFsdGVybmF0ZTtpZihudWxsIT09bil7dmFyIHQ9bi5jaGlsZDtpZihudWxsIT09dCl7bi5jaGlsZD1udWxsO2Rve3ZhciBKPXQuc2libGluZzt0LnNpYmxpbmc9bnVsbDt0PUp9d2hpbGUobnVsbCE9PXQpfX1WPWZ9fWlmKDAhPT0oZi5zdWJ0cmVlRmxhZ3MmMjA2NCkmJm51bGwhPT1nKWcucmV0dXJuPWYsVj1nO2Vsc2UgYjpmb3IoO251bGwhPT1WOyl7Zj1WO2lmKDAhPT0oZi5mbGFncyYyMDQ4KSlzd2l0Y2goZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6UGooOSxmLGYucmV0dXJuKX12YXIgeD1mLnNpYmxpbmc7aWYobnVsbCE9PXgpe3gucmV0dXJuPWYucmV0dXJuO1Y9eDticmVhayBifVY9Zi5yZXR1cm59fXZhciB3PWEuY3VycmVudDtmb3IoVj13O251bGwhPT1WOyl7Zz1WO3ZhciB1PWcuY2hpbGQ7aWYoMCE9PShnLnN1YnRyZWVGbGFncyYyMDY0KSYmbnVsbCE9PVxudSl1LnJldHVybj1nLFY9dTtlbHNlIGI6Zm9yKGc9dztudWxsIT09Vjspe2g9VjtpZigwIT09KGguZmxhZ3MmMjA0OCkpdHJ5e3N3aXRjaC
25114hoLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpRaig5LGgpfX1jYXRjaChuYSl7VyhoLGgucmV0dXJuLG5hKX1pZihoPT09Zyl7Vj1udWxsO2JyZWFrIGJ9dmFyIEY9aC5zaWJsaW5nO2lmKG51bGwhPT1GKXtGLnJldHVybj1oLnJldHVybjtWPUY7YnJlYWsgYn1WPWgucmV0dXJufX1LPWU7amcoKTtpZihsYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGxjLm9uUG9zdENvbW1pdEZpYmVyUm9vdCl0cnl7bGMub25Qb3N0Q29tbWl0RmliZXJSb290KGtjLGEpfWNhdGNoKG5hKXt9ZD0hMH1yZXR1cm4gZH1maW5hbGx5e0M9Yyxvay50cmFuc2l0aW9uPWJ9fXJldHVybiExfWZ1bmN0aW9uIFhrKGEsYixjKXtiPUppKGMsYik7Yj1OaShhLGIsMSk7YT1uaChhLGIsMSk7Yj1SKCk7bnVsbCE9PWEmJihBYyhhLDEsYiksRGsoYSxiKSl9XG5mdW5jdGlvbiBXKGEsYixjKXtpZigzPT09YS50YWcpWGsoYSxhLGMpO2Vsc2UgZm9yKDtudWxsIT09Yjspe2lmKDM9PT1iLnRhZyl7WGsoYixhLGMpO2JyZWFrfWVsc2UgaWYoMT09PWIudGFnKXt2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09Uml8fCFSaS5oYXMoZCkpKXthPUppKGMsYSk7YT1RaShiLGEsMSk7Yj1uaChiLGEsMSk7YT1SKCk7bnVsbCE9PWImJihBYyhiLDEsYSksRGsoYixhKSk7YnJlYWt9fWI9Yi5yZXR1cm59fVxuZnVuY3Rpb24gVGkoYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO251bGwhPT1kJiZkLmRlbGV0ZShiKTtiPVIoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmM7UT09PWEmJihaJmMpPT09YyYmKDQ9PT1UfHwzPT09VCYmKFomMTMwMDIzNDI0KT09PVomJjUwMD5CKCktZms/S2soYSwwKTpya3w9Yyk7RGsoYSxiKX1mdW5jdGlvbiBZayhhLGIpezA9PT1iJiYoMD09PShhLm1vZGUmMSk/Yj0xOihiPXNjLHNjPDw9MSwwPT09KHNjJjEzMDAyMzQyNCkmJihzYz00MTk0MzA0KSkpO3ZhciBjPVIoKTthPWloKGEsYik7bnVsbCE9PWEmJihBYyhhLGIsYyksRGsoYSxjKSl9ZnVuY3Rpb24gdWooYSl7dmFyIGI9YS5tZW1vaXplZFN0YXRlLGM9MDtudWxsIT09YiYmKGM9Yi5yZXRyeUxhbmUpO1lrKGEsYyl9XG5mdW5jdGlvbiBiayhhLGIpe3ZhciBjPTA7c3dpdGNoKGEudGFnKXtjYXNlIDEzOnZhciBkPWEuc3RhdGVOb2RlO3ZhciBlPWEubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGM9ZS5yZXRyeUxhbmUpO2JyZWFrO2Nhc2UgMTk6ZD1hLnN0YXRlTm9kZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMzE0KSk7fW51bGwhPT1kJiZkLmRlbGV0ZShiKTtZayhhLGMpfXZhciBWaztcblZrPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSlpZihhLm1lbW9pemVkUHJvcHMhPT1iLnBlbmRpbmdQcm9wc3x8V2YuY3VycmVudClkaD0hMDtlbHNle2lmKDA9PT0oYS5sYW5lcyZjKSYmMD09PShiLmZsYWdzJjEyOCkpcmV0dXJuIGRoPSExLHlqKGEsYixjKTtkaD0wIT09KGEuZmxhZ3MmMTMxMDcyKT8hMDohMX1lbHNlIGRoPSExLEkmJjAhPT0oYi5mbGFncyYxMDQ4NTc2KSYmdWcoY
25114ixuZyxiLmluZGV4KTtiLmxhbmVzPTA7c3dpdGNoKGIudGFnKXtjYXNlIDI6dmFyIGQ9Yi50eXBlO2lqKGEsYik7YT1iLnBlbmRpbmdQcm9wczt2YXIgZT1ZZihiLEguY3VycmVudCk7Y2goYixjKTtlPU5oKG51bGwsYixkLGEsZSxjKTt2YXIgZj1TaCgpO2IuZmxhZ3N8PTE7XCJvYmplY3RcIj09PXR5cGVvZiBlJiZudWxsIT09ZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGUucmVuZGVyJiZ2b2lkIDA9PT1lLiQkdHlwZW9mPyhiLnRhZz0xLGIubWVtb2l6ZWRTdGF0ZT1udWxsLGIudXBkYXRlUXVldWU9XG5udWxsLFpmKGQpPyhmPSEwLGNnKGIpKTpmPSExLGIubWVtb2l6ZWRTdGF0ZT1udWxsIT09ZS5zdGF0ZSYmdm9pZCAwIT09ZS5zdGF0ZT9lLnN0YXRlOm51bGwsa2goYiksZS51cGRhdGVyPUVpLGIuc3RhdGVOb2RlPWUsZS5fcmVhY3RJbnRlcm5hbHM9YixJaShiLGQsYSxjKSxiPWpqKG51bGwsYixkLCEwLGYsYykpOihiLnRhZz0wLEkmJmYmJnZnKGIpLFhpKG51bGwsYixlLGMpLGI9Yi5jaGlsZCk7cmV0dXJuIGI7Y2FzZSAxNjpkPWIuZWxlbWVudFR5cGU7YTp7aWooYSxiKTthPWIucGVuZGluZ1Byb3BzO2U9ZC5faW5pdDtkPWUoZC5fcGF5bG9hZCk7Yi50eXBlPWQ7ZT1iLnRhZz1aayhkKTthPUNpKGQsYSk7c3dpdGNoKGUpe2Nhc2UgMDpiPWNqKG51bGwsYixkLGEsYyk7YnJlYWsgYTtjYXNlIDE6Yj1oaihudWxsLGIsZCxhLGMpO2JyZWFrIGE7Y2FzZSAxMTpiPVlpKG51bGwsYixkLGEsYyk7YnJlYWsgYTtjYXNlIDE0OmI9JGkobnVsbCxiLGQsQ2koZC50eXBlLGEpLGMpO2JyZWFrIGF9dGhyb3cgRXJyb3IocCgzMDYsXG5kLFwiXCIpKTt9cmV0dXJuIGI7Y2FzZSAwOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpDaShkLGUpLGNqKGEsYixkLGUsYyk7Y2FzZSAxOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpDaShkLGUpLGhqKGEsYixkLGUsYyk7Y2FzZSAzOmE6e2tqKGIpO2lmKG51bGw9PT1hKXRocm93IEVycm9yKHAoMzg3KSk7ZD1iLnBlbmRpbmdQcm9wcztmPWIubWVtb2l6ZWRTdGF0ZTtlPWYuZWxlbWVudDtsaChhLGIpO3FoKGIsZCxudWxsLGMpO3ZhciBnPWIubWVtb2l6ZWRTdGF0ZTtkPWcuZWxlbWVudDtpZihmLmlzRGVoeWRyYXRlZClpZihmPXtlbGVtZW50OmQsaXNEZWh5ZHJhdGVkOiExLGNhY2hlOmcuY2FjaGUscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpnLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsdHJhbnNpdGlvbnM6Zy50cmFuc2l0aW9uc30sYi51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9XG5mLGIubWVtb2l6ZWRTdGF0ZT1mLGIuZmxhZ3MmMjU2KXtlPUppKEVycm9yKHAoNDIzKSksYik7Yj1saihhLGIsZCxjLGUpO2JyZWFrIGF9ZWxzZSBpZihkIT09ZSl7ZT1KaShFcnJvcihwKDQyNCkpLGIpO2I9bGooYSxiLGQsYyxlKTticmVhayBhfWVsc2UgZm9yKHlnPUxmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCkseGc9YixJPSEwLHpnPW51bGwsYz1WZyhiLG51bGwsZCxjKSxiLmNoaWxkPWM7YzspYy5mbGFncz1jLmZsYWdzJi0zfDQwOTYsYz1jLnNpYmxpbmc7ZWxzZXtJZygpO2lmKGQ9PT1lKXtiPVppKGEsYixjKTticmVhayBhfVhpKGEsYixkLGMpfWI9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDU6cmV0dXJuIEFoKGIpLG51bGw9PT1hJiZFZyhiKSxkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGY9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOm51bGwsZz1lLmNoaWxkcmVuLEVmKGQsZSk/Zz1udWxsOm51bGwhPT1mJiZFZihkLGYpJiYoYi5mbGFnc3w9MzIpLFxuZ2ooYSxiKSxYaShhLGIsZyxjKSxiLmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PWEmJkVnKGIpLG51bGw7Y2FzZSAxMzpyZXR1cm4gb2ooYSxiLGMpO2Nhc2UgNDpyZXR1cm4geWgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxkPWIucGVuZGluZ1Byb3BzLG51bGw9PT1hP2IuY2hpbGQ9VWcoYixudWxsLGQsYyk6WGkoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDExOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpDaShkLGUpLFlpKGEsYixkLGUsYyk7Y2FzZSA3OnJldHVybiBYaShhLGIsYi5wZW5kaW5nUHJvcHMsYyksYi5jaGlsZDtjYXNlIDg6cmV0dXJuIFhpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjKSxiLmNoaWxkO2Nhc2UgMTI6cmV0dXJuIFhpKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjKSxiLmNoaWxkO2Nhc2UgMTA6YTp7ZD1iLnR5cGUuX2NvbnRleHQ7ZT1iLnBlbmRpbmdQcm9wcztmPWIubWVtb2l6ZWRQcm9wcztcbmc9ZS52YWx1ZTtHKFdnLGQuX2N1cnJlbnRWYWx1ZSk7ZC5fY3VycmVudFZhbHVlPWc7aWYobnVsbCE9PWYpaWYoSGUoZi52YWx1ZSxnKSl7aWYoZi5jaGlsZHJlbj09PWUuY2hpbGRyZW4mJiFXZi5jdXJyZW50KXtiPVppKGEsYixjKTticmVhayBhfX1lbHNlIGZvcihmPWIuY2hpbGQsbnVsbCE9PWYmJihmLnJldHVybj1iKTtudWxsIT09Zjspe3ZhciBoPWYuZGVwZW5kZW5jaWVzO2lmKG51bGwhPT1oKXtnPWYuY2hpbGQ7Zm9yKHZhciBrPWguZmlyc3RDb250ZXh0O251bGwhPT1rOyl7aWYoay5jb250ZXh0PT09ZCl7aWYoMT09PWYudGFnKXtrPW1oKC0xLGMmLWMpO2sudGFnPTI7dmFyIGw9Zi51cGRhdGVRdWV1ZTtpZihudWxsIT09bCl7bD1sLnNoYXJlZDt2YXIgbT1sLnBlbmRpbmc7bnVsbD09PW0/ay5uZXh0PWs6KGsubmV4dD1tLm5leHQsbS5uZXh0PWspO2wucGVuZGluZz1rfX1mLmxhbmVzfD1jO2s9Zi5hbHRlcm5hdGU7bnVsbCE9PWsmJihrLmxhbmVzfD1jKTtiaChmLnJldHVybixcbmMsYik7aC5sYW5lc3w9YzticmVha31rPWsubmV4dH19ZWxzZSBpZigxMD09PWYudGFnKWc9Zi50eXBlPT09Yi50eXBlP251bGw6Zi5jaGlsZDtlbHNlIGlmKDE4PT09Zi50YWcpe2c9Zi5yZXR1cm47aWYobnVsbD09PWcpdGhyb3cgRXJyb3IocCgzNDEpKTtnLmxhbmVzfD1jO2g9Zy5hbHRlcm5hdGU7bnVsbCE9PWgmJihoLmxhbmVzfD1jKTtiaChnLGMsYik7Zz1mLnNpYmxpbmd9ZWxzZSBnPWYuY2hpbGQ7aWYobnVsbCE9PWcpZy5yZXR1cm49ZjtlbHNlIGZvcihnPWY7bnVsbCE9PWc7KXtp
25114ZihnPT09Yil7Zz1udWxsO2JyZWFrfWY9Zy5zaWJsaW5nO2lmKG51bGwhPT1mKXtmLnJldHVybj1nLnJldHVybjtnPWY7YnJlYWt9Zz1nLnJldHVybn1mPWd9WGkoYSxiLGUuY2hpbGRyZW4sYyk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgOTpyZXR1cm4gZT1iLnR5cGUsZD1iLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjaChiLGMpLGU9ZWgoZSksZD1kKGUpLGIuZmxhZ3N8PTEsWGkoYSxiLGQsYyksXG5iLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIGQ9Yi50eXBlLGU9Q2koZCxiLnBlbmRpbmdQcm9wcyksZT1DaShkLnR5cGUsZSksJGkoYSxiLGQsZSxjKTtjYXNlIDE1OnJldHVybiBiaihhLGIsYi50eXBlLGIucGVuZGluZ1Byb3BzLGMpO2Nhc2UgMTc6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOkNpKGQsZSksaWooYSxiKSxiLnRhZz0xLFpmKGQpPyhhPSEwLGNnKGIpKTphPSExLGNoKGIsYyksR2koYixkLGUpLElpKGIsZCxlLGMpLGpqKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4geGooYSxiLGMpO2Nhc2UgMjI6cmV0dXJuIGRqKGEsYixjKX10aHJvdyBFcnJvcihwKDE1NixiLnRhZykpO307ZnVuY3Rpb24gRmsoYSxiKXtyZXR1cm4gYWMoYSxiKX1cbmZ1bmN0aW9uICRrKGEsYixjLGQpe3RoaXMudGFnPWE7dGhpcy5rZXk9Yzt0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsO3RoaXMuaW5kZXg9MDt0aGlzLnJlZj1udWxsO3RoaXMucGVuZGluZ1Byb3BzPWI7dGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGw7dGhpcy5tb2RlPWQ7dGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wO3RoaXMuZGVsZXRpb25zPW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIEJnKGEsYixjLGQpe3JldHVybiBuZXcgJGsoYSxiLGMsZCl9ZnVuY3Rpb24gYWooYSl7YT1hLnByb3RvdHlwZTtyZXR1cm4hKCFhfHw
25114hYS5pc1JlYWN0Q29tcG9uZW50KX1cbmZ1bmN0aW9uIFprKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBhaihhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09RGEpcmV0dXJuIDExO2lmKGE9PT1HYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiBQZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPUJnKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMuc3VidHJlZUZsYWdzPTAsYy5kZWxldGlvbnM9bnVsbCk7Yy5mbGFncz1hLmZsYWdzJjE0NjgwMDY0O2MuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXM7Yy5sYW5lcz1hLmxhbmVzO2MuY2hpbGQ9YS5jaGlsZDtjLm1lbW9pemVkUHJvcHM9YS5tZW1vaXplZFByb3BzO2MubWVtb2l6ZWRTdGF0ZT1hLm1lbW9pemVkU3RhdGU7Yy51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlO2I9YS5kZXBlbmRlbmNpZXM7Yy5kZXBlbmRlbmNpZXM9bnVsbD09PWI/bnVsbDp7bGFuZXM6Yi5sYW5lcyxmaXJzdENvbnRleHQ6Yi5maXJzdENvbnRleHR9O1xuYy5zaWJsaW5nPWEuc2libGluZztjLmluZGV4PWEuaW5kZXg7Yy5yZWY9YS5yZWY7cmV0dXJuIGN9XG5mdW5jdGlvbiBSZyhhLGIsYyxkLGUsZil7dmFyIGc9MjtkPWE7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpYWooYSkmJihnPTEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWc9NTtlbHNlIGE6c3dpdGNoKGEpe2Nhc2UgeWE6cmV0dXJuIFRnKGMuY2hpbGRyZW4sZSxmLGIpO2Nhc2UgemE6Zz04O2V8PTg7YnJlYWs7Y2FzZSBBYTpyZXR1cm4gYT1CZygxMixjLGIsZXwyKSxhLmVsZW1lbnRUeXBlPUFhLGEubGFuZXM9ZixhO2Nhc2UgRWE6cmV0dXJuIGE9QmcoMTMsYyxiLGUpLGEuZWxlbWVudFR5cGU9RWEsYS5sYW5lcz1mLGE7Y2FzZSBGYTpyZXR1cm4gYT1CZygxOSxjLGIsZSksYS5lbGVtZW50VHlwZT1GYSxhLmxhbmVzPWYsYTtjYXNlIElhOnJldHVybiBwaihjLGUsZixiKTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQmE6Zz0xMDticmVhayBhO2Nhc2UgQ2E6Zz05O2JyZWFrIGE7Y2FzZSBEYTpnPTExO1xuYnJlYWsgYTtjYXNlIEdhOmc9MTQ7YnJlYWsgYTtjYXNlIEhhOmc9MTY7ZD1udWxsO2JyZWFrIGF9dGhyb3cgRXJyb3IocCgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1CZyhnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIFRnKGEsYixjLGQpe2E9QmcoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHBqKGEsYixjLGQpe2E9QmcoMjIsYSxkLGIpO2EuZWxlbWVudFR5cGU9SWE7YS5sYW5lcz1jO2Euc3RhdGVOb2RlPXtpc0hpZGRlbjohMX07cmV0dXJuIGF9ZnVuY3Rpb24gUWcoYSxiLGMpe2E9QmcoNixhLG51bGwsYik7YS5sYW5lcz1jO3JldHVybiBhfVxuZnVuY3Rpb24gU2coYSxiLGMpe2I9QmcoNCxudWxsIT09YS5jaGlsZHJlbj9hLmNoaWxkcmVuOltdLGEua2V5LGIpO2IubGFuZXM9YztiLnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzphLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246YS5pbXBsZW1lbnRhdGlvbn07cmV0dXJuIGJ9XG5mdW5jdGlvbiBhbChhLGIsYyxkLGUpe3RoaXMudGFnPWI7dGhpcy5jb250YWluZXJJbmZvPWE7dGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGw7dGhpcy50aW1lb3V0SGFuZGxlPS0xO3RoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGw7dGhpcy5jYWxsYmFja1ByaW9yaXR5PTA7dGhpcy5ldmVudFRpbWVzPXpjKDApO3RoaXMuZXhwaXJhdGlvblRpbWVzPXpjKC0xKTt0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTA7dGhpcy5lbnRhbmdsZW1lbnRzPXpjKDApO3RoaXMuaWRlbnRpZmllclByZWZpeD1kO3RoaXMub25SZWNvdmVyYWJsZUVycm9yPWU7dGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVxubnVsbH1mdW5jdGlvbiBibChhLGIsYyxkLGUsZixnLGgsayl7YT1uZXcgYWwoYSxiLGMsaCxrKTsxPT09Yj8oYj0xLCEwPT09ZiYmKGJ8PTgpKTpiPTA7Zj1CZygzLG51bGwsbnVsbCxiKTthLmN1cnJlbnQ9ZjtmLnN0YXRlTm9kZT1hO2YubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpkLGlzRGVoeWRyYXRlZDpjLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9O2toKGYpO3JldHVybiBhfWZ1bmN0aW9uIGNsKGEsYixjKXt2YXIgZD0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6d2Esa2V5Om51bGw9PWQ/bnVsbDpcIlwiK2QsY2hpbGRyZW46YSxjb250YWluZXJJbmZvOmIsaW1wbGVtZW50YXRpb246Y319XG5mdW5jdGlvbiBkbChhKXtpZighYSlyZXR1cm4gVmY7YT1hLl9yZWFjdEludGVybmFsczthOntpZihWYihhKSE9PWF8fDEhPT1hLnRhZyl0aHJvdyBFcnJvcihwKDE3MCkpO3ZhciBiPWE7ZG97c3dpdGNoKGIudGFnKXtjYXNlIDM6Yj1iLnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGE7Y2FzZSAxOmlmKFpmKGIudHlwZSkpe2I9Yi5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgYX19Yj1iLnJldHVybn13aGlsZShudWxsIT09Yik7dGhyb3cgRXJyb3IocCgxNzEpKTt9aWYoMT09PWEudGFnKXt2YXIgYz1hLnR5cGU7aWYoWmYoYykpcmV0dXJuIGJnKGEsYyxiKX1yZXR1cm4gYn1cbmZ1bmN0aW9uIGVsKGEsYixjLGQsZSxmLGcsaCxrKXthPWJsKGMsZCwhMCxhLGUsZixnLGgsayk7YS5jb250ZXh0PWRsKG51bGwpO2M9YS5jdXJyZW50O2Q9UigpO2U9eWkoYyk7Zj1taChkLGUpO2YuY2FsbGJhY2s9dm9pZCAwIT09YiYmbnVsbCE9PWI/YjpudWxsO25oKGMsZixlKTthLmN1cnJlbnQubGFuZXM9ZTtBYyhhLGUsZCk7RGsoYSxkKTtyZXR1cm4gYX1mdW5jdGlvbiBmbChhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1SKCksZz15aShlKTtjPWRsKGMpO251bGw9PT1iLmNvbnRleHQ/Yi5jb250ZXh0PWM6Yi5wZW5kaW5nQ29udGV4dD1jO2I9bWgoZixnKTtiLnBheWxvYWQ9e2VsZW1lbnQ6YX07ZD12b2lkIDA9PT1kP251bGw6ZDtudWxsIT09ZCYmKGIuY2FsbGJhY2s9ZCk7YT1uaChlLGIsZyk7bnVsbCE9PWEmJihnaShhLGUsZyxmKSxvaChhLGUsZykpO3JldHVybiBnfVxuZnVuY3Rpb24gZ2woYSl7YT1hLmN1cnJlbnQ7aWYoIWEuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGEuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBobChhLGIpe2E9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiZudWxsIT09YS5kZWh5ZHJhdGVkKXt2YXIgYz1hLnJldHJ5TGFuZTthLnJldHJ5TGFuZT0wIT09YyYmYzxiP2M6Yn19ZnVuY3Rpb24gaWwoYSxiKXtobChhLGIpOyhhPWEuYWx0ZXJuYXRlKSYmaGwoYSxiKX1mdW5jdGlvbiBqbCgpe3JldHVybiBudWxsfXZhciBrbD1cImZ1bmN0aW9uXCI9PT10eXBlb2YgcmVwb3J0RXJyb3I/cmVwb3J0RXJyb3I6ZnVuY3Rpb24oYSl7Y29uc29sZS5lcnJvcihhKX07ZnVuY3Rpb24gbGwoYSl7dGhpcy5faW50ZXJuYWxSb290PWF9XG5tbC5wcm90b3R5cGUucmVuZGVyPWxsLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5faW50ZXJuYWxSb290O2lmKG51bGw9PT1iKXRocm93IEVycm9yKHAoNDA5KSk7ZmwoYSxiLG51bGwsbnVsbCl9O21sLnByb3RvdHlwZS51bm1vdW50PWxsLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faW50ZXJuYWxSb290O2lmKG51bGwhPT1hKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgYj1hLmNvbnRhaW5lckluZm87UmsoZnVuY3Rpb24oKXtmbChudWxsLGEsbnVsbCxudWxsKX0pO2JbdWZdPW51bGx9fTtmdW5jdGlvbiBtbChhKXt0
25114aGlzLl9pbnRlcm5hbFJvb3Q9YX1cbm1sLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1IYygpO2E9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDphLHByaW9yaXR5OmJ9O2Zvcih2YXIgYz0wO2M8UWMubGVuZ3RoJiYwIT09YiYmYjxRY1tjXS5wcmlvcml0eTtjKyspO1FjLnNwbGljZShjLDAsYSk7MD09PWMmJlZjKGEpfX07ZnVuY3Rpb24gbmwoYSl7cmV0dXJuISghYXx8MSE9PWEubm9kZVR5cGUmJjkhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGUpfWZ1bmN0aW9uIG9sKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlJiYoOCE9PWEubm9kZVR5cGV8fFwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlIFwiIT09YS5ub2RlVmFsdWUpKX1mdW5jdGlvbiBwbCgpe31cbmZ1bmN0aW9uIHFsKGEsYixjLGQsZSl7aWYoZSl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBmPWQ7ZD1mdW5jdGlvbigpe3ZhciBhPWdsKGcpO2YuY2FsbChhKX19dmFyIGc9ZWwoYixkLGEsMCxudWxsLCExLCExLFwiXCIscGwpO2EuX3JlYWN0Um9vdENvbnRhaW5lcj1nO2FbdWZdPWcuY3VycmVudDtzZig4PT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YSk7UmsoKTtyZXR1cm4gZ31mb3IoO2U9YS5sYXN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoZSk7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBoPWQ7ZD1mdW5jdGlvbigpe3ZhciBhPWdsKGspO2guY2FsbChhKX19dmFyIGs9YmwoYSwwLCExLG51bGwsbnVsbCwhMSwhMSxcIlwiLHBsKTthLl9yZWFjdFJvb3RDb250YWluZXI9azthW3VmXT1rLmN1cnJlbnQ7c2YoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO1JrKGZ1bmN0aW9uKCl7ZmwoYixrLGMsZCl9KTtyZXR1cm4ga31cbmZ1bmN0aW9uIHJsKGEsYixjLGQsZSl7dmFyIGY9Yy5fcmVhY3RSb290Q29udGFpbmVyO2lmKGYpe3ZhciBnPWY7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBoPWU7ZT1mdW5jdGlvbigpe3ZhciBhPWdsKGcpO2guY2FsbChhKX19ZmwoYixnLGEsZSl9ZWxzZSBnPXFsKGMsYixhLGUsZCk7cmV0dXJuIGdsKGcpfUVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhLnRhZyl7Y2FzZSAzOnZhciBiPWEuc3RhdGVOb2RlO2lmKGIuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIGM9dGMoYi5wZW5kaW5nTGFuZXMpOzAhPT1jJiYoQ2MoYixjfDEpLERrKGIsQigpKSwwPT09KEsmNikmJihHaj1CKCkrNTAwLGpnKCkpKX1icmVhaztjYXNlIDEzOlJrKGZ1bmN0aW9uKCl7dmFyIGI9aWgoYSwxKTtpZihudWxsIT09Yil7dmFyIGM9UigpO2dpKGIsYSwxLGMpfX0pLGlsKGEsMSl9fTtcbkZjPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWloKGEsMTM0MjE3NzI4KTtpZihudWxsIT09Yil7dmFyIGM9UigpO2dpKGIsYSwxMzQyMTc3MjgsYyl9aWwoYSwxMzQyMTc3MjgpfX07R2M9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9eWkoYSksYz1paChhLGIpO2lmKG51bGwhPT1jKXt2YXIgZD1SKCk7Z2koYyxhLGIsZCl9aWwoYSxiKX19O0hjPWZ1bmN0aW9uKCl7cmV0dXJuIEN9O0ljPWZ1bmN0aW9uKGEsYil7dmFyIGM9Qzt0cnl7cmV0dXJuIEM9YSxiKCl9ZmluYWxseXtDPWN9fTtcbnliPWZ1bmN0aW9uKGEsYixjKXtzd2l0Y2goYil7Y2FzZSBcImlucHV0XCI6YmIoYSxjKTtiPWMubmFtZTtpZihcInJhZGlvXCI9PT1jLnR5cGUmJm51bGwhPWIpe2ZvcihjPWE7Yy5wYXJlbnROb2RlOyljPWMucGFyZW50Tm9kZTtjPWMucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9XCIrSlNPTi5zdHJpbmdpZnkoXCJc
25114IitiKSsnXVt0eXBlPVwicmFkaW9cIl0nKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdO2lmKGQhPT1hJiZkLmZvcm09PT1hLmZvcm0pe3ZhciBlPURiKGQpO2lmKCFlKXRocm93IEVycm9yKHAoOTApKTtXYShkKTtiYihkLGUpfX19YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aWIoYSxjKTticmVhaztjYXNlIFwic2VsZWN0XCI6Yj1jLnZhbHVlLG51bGwhPWImJmZiKGEsISFjLm11bHRpcGxlLGIsITEpfX07R2I9UWs7SGI9Ums7XG52YXIgc2w9e3VzaW5nQ2xpZW50RW50cnlQb2ludDohMSxFdmVudHM6W0NiLHVlLERiLEViLEZiLFFrXX0sdGw9e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOldjLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOlwiMTguMy4xXCIscmVuZGVyZXJQYWNrYWdlTmFtZTpcInJlYWN0LWRvbVwifTtcbnZhciB1bD17YnVuZGxlVHlwZTp0bC5idW5kbGVUeXBlLHZlcnNpb246dGwudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOnRsLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6dGwucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6dWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihhKXthPVpiKGEpO3JldHVybiBudWxsPT09YT9udWxsOmEuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp0bC5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8XG5qbCxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsLHJlY29uY2lsZXJWZXJzaW9uOlwiMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNlwifTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyl7dmFyIHZsPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZighdmwuaXNEaXNhYmxlZCYmdmwuc3VwcG9ydHNGaWJlcil0cnl7a2M9dmwuaW5qZWN0KHVsKSxsYz12bH1jYXRjaChhKXt9fWV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9c2w7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO2lmKCFubChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBjbChhLGIsbnVsbCxjKX07ZXhwb3J0cy5jcmVhdGVSb290PWZ1bmN0aW9uKGEsYil7aWYoIW5sKGEpKXRocm93IEVycm9yKHAoMjk5KSk7dmFyIGM9ITEsZD1cIlwiLGU9a2w7bnVsbCE9PWImJnZvaWQgMCE9PWImJighMD09PWIudW5zdGFibGVfc3RyaWN0TW9kZSYmKGM9ITApLHZvaWQgMCE9PWIuaWRlbnRpZmllclByZWZpeCYmKGQ9Yi5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1iLm9uUmVjb3ZlcmFibGVFcnJvciYmKGU9Yi5vblJlY292ZXJhYmxlRXJyb3IpKTtiPWJsKGEsMSwhMSxudWxsLG51bGwsYywhMSxkLGUpO2FbdWZdPWIuY3VycmVudDtzZig4PT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YSk7cmV0dXJuIG5ldyBsbChiKX07XG5leHBvcnRzLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbHM7aWYodm9pZCAwPT09Yil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEucmVuZGVyKXRocm93IEVycm9yKHAoMTg4KSk7YT1PYmplY3Qua2V5cyhhKS5qb2luKFwiLFwiKTt0aHJvdyBFcnJvcihwKDI2OCxhKSk7fWE9WmIoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtleHBvcnRzLmZsdXNoU3luYz1mdW5jdGlvbihhKXtyZXR1cm4gUmsoYSl9O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIW9sKGIpKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHJsKG51bGwsYSxiLCEwLGMpfTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3Q9ZnVuY3Rpb24oYSxiLGMpe2lmKCFubChhKSl0aHJvdyBFcnJvcihwKDQwNSkpO3ZhciBkPW51bGwhPWMmJmMuaHlkcmF0ZWRTb3VyY2VzfHxudWxsLGU9ITEsZj1cIlwiLGc9a2w7bnVsbCE9PWMmJnZvaWQgMCE9PWMmJighMD09PWMudW5zdGFibGVfc3RyaWN0TW9kZSYmKGU9ITApLHZvaWQgMCE9PWMuaWRlbnRpZmllclByZWZpeCYmKGY9Yy5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1jLm9uUmVjb3ZlcmFibGVFcnJvciYmKGc9Yy5vblJlY292ZXJhYmxlRXJyb3IpKTtiPWVsKGIsbnVsbCxhLDEsbnVsbCE9Yz9jOm51bGwsZSwhMSxmLGcpO2FbdWZdPWIuY3VycmVudDtzZihhKTtpZihkKWZvcihhPTA7YTxkLmxlbmd0aDthKyspYz1kW2FdLGU9Yy5fZ2V0VmVyc2lvbixlPWUoYy5fc291cmNlKSxudWxsPT1iLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE/Yi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtjLGVdOmIubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKGMsXG5lKTtyZXR1cm4gbmV3IG1sKGIpfTtleHBvcnRzLnJlbmRlcj1mdW5jdGlvbihhLGIsYyl7aWYoIW9sKGIpKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHJsKG51bGwsYSxiLCExLGMpfTtleHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oYSl7aWYoIW9sKGEpKXRocm93IEVycm9yKHAoNDApKTtyZXR1cm4gYS5fcmVhY3RSb290Q29udGFpbmVyPyhSayhmdW5jdGlvbigpe3JsKG51bGwsbnVsbCxhLCExLGZ1bmN0aW9uKCl7YS5fcmVhY3RSb290Q29udGFpbmVyPW51bGw7YVt1Zl09bnVsbH0pfSksITApOiExfTtleHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPVFrO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihhLGIsYyxkKXtpZighb2woYykpdGhyb3cgRXJyb3IocCgyMDApKTtpZihudWxsPT1hfHx2b2lkIDA9PT1hLl9yZWFjdEludGVybmFscyl0aHJvdyBFcnJvcihwKDM4KSk7cmV0dXJuIHJsKGEsYixjLCExLGQpfTtleHBvcnRzLnZlcnNpb249XCIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2XCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19S
25114RUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiIsIi8vIHNyYy9zdWJzY3JpYmFibGUudHNcbnZhciBTdWJzY3JpYmFibGUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICB0aGlzLnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaWJlLmJpbmQodGhpcyk7XG4gIH1cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICB0aGlzLm9uU3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICB0aGlzLm9uVW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9XG4gIGhhc0xpc3RlbmVycygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuc2l6ZSA+IDA7XG4gIH1cbiAgb25TdWJzY3JpYmUoKSB7XG4gIH1cbiAgb25VbnN1YnNjcmliZSgpIHtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIFN1YnNjcmliYWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnNjcmliYWJsZS5qcy5tYXAiLCIvLyBzcmMvdGltZW91dE1hbmFnZXIudHNcbnZhciBkZWZhdWx0VGltZW91dFByb3ZpZGVyID0ge1xuICAvLyBXZSBuZWVkIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIHN5bnRheCBiZWxvdyBpbnN0ZWFkIG9mIGRpcmVjdCByZWZlcmVuY2VzIHRvXG4gIC8vIGdsb2JhbCBzZXRUaW1lb3V0IGV0Yy5cbiAgLy9cbiAgLy8gQkFEOiBgc2V0VGltZW91dDogc2V0VGltZW91dGBcbiAgLy8gR09PRDogYHNldFRpbWVvdXQ6IChjYiwgZGVsYXkpID0+IHNldFRpbWVvdXQoY2IsIGRlbGF5KWBcbiAgLy9cbiAgLy8gSWYgd2UgdXNlIGRpcmVjdCByZWZlcmVuY2VzIGhlcmUsIHRoZW4gYW55dGhpbmcgdGhhdCB3YW50cyB0byBzcHkgb24gb3JcbiAgLy8gcmVwbGFjZSB0aGUgZ2xvYmFsIHNldFRpbWVvdXQgKGxpa2UgdGVzdHMpIHdvbid0IHdvcmsgc2luY2Ugd2UnbGwgYWxyZWFkeVxuICAvLyBoYXZlIGEgaGFyZCByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGF0IHRoZSB0aW1lIHdoZW4gdGhpc1xuICAvLyBmaWxlIHdhcyBpbXBvcnRlZC5cbiAgc2V0VGltZW91dDogKGNhbGxiYWNrLCBkZWxheSkgPT4gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXkpLFxuICBjbGVhclRpbWVvdXQ6ICh0aW1lb3V0SWQpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0SWQpLFxuICBzZXRJbnRlcnZhbDogKGNhbGxiYWNrLCBkZWxheSkgPT4gc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGRlbGF5KSxcbiAgY2xlYXJJbnRlcnZhbDogKGludGVydmFsSWQpID0+IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZClcbn07XG52YXIgVGltZW91dE1hbmFnZXIgPSBjbGFzcyB7XG4gIC8vIFdlIGNhbm5vdCBoYXZlIFRpbWVvdXRNYW5hZ2VyPFQ+IGFzIHdlIG11c3QgaW5zdGFudGlhdGUgaXQgd2l0aCBhIGNvbmNyZXRlXG4gIC8vIHR5cGUgYXQgYXBwIGJvb3Q7IGFuZCBpZiB3ZSBsZWF2ZSB0aGF0IHR5cGUsIHR
25114oZW4gYW55IG5ldyB0aW1lciBwcm92aWRlclxuICAvLyB3b3VsZCBuZWVkIHRvIHN1cHBvcnQgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4sIHdoaWNoIGlzIGluZmVhc2libGUuXG4gIC8vXG4gIC8vIFdlIHNldHRsZSBmb3IgdHlwZSBzYWZldHkgZm9yIHRoZSBUaW1lb3V0UHJvdmlkZXIgdHlwZSwgYW5kIGFjY2VwdCB0aGF0XG4gIC8vIHRoaXMgY2xhc3MgaXMgdW5zYWZlIGludGVybmFsbHkgdG8gYWxsb3cgZm9yIGV4dGVuc2lvbi5cbiAgI3Byb3ZpZGVyID0gZGVmYXVsdFRpbWVvdXRQcm92aWRlcjtcbiAgI3Byb3ZpZGVyQ2FsbGVkID0gZmFsc2U7XG4gIHNldFRpbWVvdXRQcm92aWRlcihwcm92aWRlcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0aGlzLiNwcm92aWRlckNhbGxlZCAmJiBwcm92aWRlciAhPT0gdGhpcy4jcHJvdmlkZXIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3RpbWVvdXRNYW5hZ2VyXTogU3dpdGNoaW5nIHByb3ZpZGVyIGFmdGVyIGNhbGxzIHRvIHByZXZpb3VzIHByb3ZpZGVyIG1pZ2h0IHJlc3VsdCBpbiB1bmV4cGVjdGVkIGJlaGF2aW9yLmAsXG4gICAgICAgICAgeyBwcmV2aW91czogdGhpcy4jcHJvdmlkZXIsIHByb3ZpZGVyIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jcHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0aGlzLiNwcm92aWRlckNhbGxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuI3Byb3ZpZGVyQ2FsbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI3Byb3ZpZGVyLnNldFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5KTtcbiAgfVxuICBjbGVhclRpbWVvdXQodGltZW91dElkKSB7XG4gICAgdGhpcy4jcHJvdmlkZXIuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbiAgc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGRlbGF5KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgdGhpcy4jcHJvdmlkZXJDYWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jcHJvdmlkZXIuc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIGRlbGF5KTtcbiAgfVxuICBjbGVhckludGVydmFsKGludGVydmFsSWQpIHtcbiAgICB0aGlzLiNwcm92aWRlci5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICB9XG59O1xudmFyIHRpbWVvdXRNYW5hZ2VyID0gbmV3IFRpbWVvdXRNYW5hZ2VyKCk7XG5mdW5jdGlvbiBzeXN0ZW1TZXRUaW1lb3V0WmVybyhjYWxsYmFjaykge1xuICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbn1cbmV4cG9ydCB7XG4gIFRpbWVvdXRNYW5hZ2VyLFxuICBkZWZhdWx0VGltZW91dFByb3ZpZGVyLFxuICBzeXN0ZW1TZXRUaW1lb3V0WmVybyxcbiAgdGltZW91dE1hbmFnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lb3V0TWFuYWdlci5qcy5tYXAiLCIvLyBzcmMvdXRpbHMudHNcbmltcG9ydCB7IHRpbWVvdXRNYW5hZ2VyIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbnZhciBpc1NlcnZlciA9IHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgXCJEZW5vXCIgaW4gZ2xvYmFsVGhpcztcbmZ1bmN0aW9uIG5vb3AoKSB7XG59XG5mdW5jdGlvbiBmdW5jdGlvbmFsVXBkYXRlKHVwZGF0ZXIsIGlucHV0KSB7XG4gIHJldHVybiB0eXBlb2YgdXBkYXRlciA9PT0gXCJmdW5jdGlvblwiID8gdXBkYXRlcihpbnB1dCkgOiB1cGRhdGVyO1xufVxuZnVuY3Rpb24gaXNWYWxpZFRpbWVvdXQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlICE9PSBJbmZpbml0eTtcbn1cbmZ1bmN0aW9uIHRpbWVVbnRpbFN0YWxlKHVwZGF0ZWRBdCwgc3RhbGVUaW1lKSB7XG4gIHJldHVybiBNYXRoLm1heCh1cGRhdGVkQXQgKyAoc3RhbGVUaW1lIHx8IDApIC0gRGF0ZS5ub3coKSwgMCk7XG59XG5mdW5jdGlvbiByZXNvbHZlU3RhbGVUaW
251141lKHN0YWxlVGltZSwgcXVlcnkpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGFsZVRpbWUgPT09IFwiZnVuY3Rpb25cIiA/IHN0YWxlVGltZShxdWVyeSkgOiBzdGFsZVRpbWU7XG59XG5mdW5jdGlvbiByZXNvbHZlRW5hYmxlZChlbmFibGVkLCBxdWVyeSkge1xuICByZXR1cm4gdHlwZW9mIGVuYWJsZWQgPT09IFwiZnVuY3Rpb25cIiA/IGVuYWJsZWQocXVlcnkpIDogZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIG1hdGNoUXVlcnkoZmlsdGVycywgcXVlcnkpIHtcbiAgY29uc3Qge1xuICAgIHR5cGUgPSBcImFsbFwiLFxuICAgIGV4YWN0LFxuICAgIGZldGNoU3RhdHVzLFxuICAgIHByZWRpY2F0ZSxcbiAgICBxdWVyeUtleSxcbiAgICBzdGFsZVxuICB9ID0gZmlsdGVycztcbiAgaWYgKHF1ZXJ5S2V5KSB7XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICBpZiAocXVlcnkucXVlcnlIYXNoICE9PSBoYXNoUXVlcnlLZXlCeU9wdGlvbnMocXVlcnlLZXksIHF1ZXJ5Lm9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFwYXJ0aWFsTWF0Y2hLZXkocXVlcnkucXVlcnlLZXksIHF1ZXJ5S2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZSAhPT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gcXVlcnkuaXNBY3RpdmUoKTtcbiAgICBpZiAodHlwZSA9PT0gXCJhY3RpdmVcIiAmJiAhaXNBY3RpdmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiaW5hY3RpdmVcIiAmJiBpc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIHN0YWxlID09PSBcImJvb2xlYW5cIiAmJiBxdWVyeS5pc1N0YWxlKCkgIT09IHN0YWxlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChmZXRjaFN0YXR1cyAmJiBmZXRjaFN0YXR1cyAhPT0gcXVlcnkuc3RhdGUuZmV0Y2hTdGF0dXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHByZWRpY2F0ZSAmJiAhcHJlZGljYXRlKHF1ZXJ5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG1hdGNoTXV0YXRpb24oZmlsdGVycywgbXV0YXRpb24pIHtcbiAgY29uc3QgeyBleGFjdCwgc3RhdHVzLCBwcmVkaWNhdGUsIG11dGF0aW9uS2V5IH0gPSBmaWx0ZXJzO1xuICBpZiAobXV0YXRpb25LZXkpIHtcbiAgICBpZiAoIW11dGF0aW9uLm9wdGlvbnMubXV0YXRpb25LZXkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICBpZiAoaGFzaEtleShtdXRhdGlvbi5vcHRpb25zLm11dGF0aW9uS2V5KSAhPT0gaGFzaEtleShtdXRhdGlvbktleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXBhcnRpYWxNYXRjaEtleShtdXRhdGlvbi5vcHRpb25zLm11dGF0aW9uS2V5LCBtdXRhdGlvbktleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXR1cyAmJiBtdXRhdGlvbi5zdGF0ZS5zdGF0dXMgIT09IHN0YXR1cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocHJlZGljYXRlICYmICFwcmVkaWNhdGUobXV0YXRpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaGFzaFF1ZXJ5S2V5QnlPcHRpb25zKHF1ZXJ5S2V5LCBvcHRpb25zKSB7XG4gIGNvbnN0IGhhc2hGbiA9IG9wdGlvbnM/LnF1ZXJ5S2V5SGFzaEZuIHx8IGhhc2hLZXk7XG4gIHJldHVybiBoYXNoRm4ocXVlcnlLZXkpO1xufVxuZnVuY3Rpb24gaGFzaEtleShxdWVyeUtleSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG4gICAgcXVlcnlLZXksXG4gICAgKF8sIHZhbCkgPT4gaXNQbGFpbk9iamVjdCh2YWwpID8gT2JqZWN0LmtleXModmFsKS5zb3J0KCkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWxba2V5XTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwge30pIDogdmFsXG4gICk7XG59XG5mdW5jdGlvbiBwYXJ0aWFsTWF0Y2hLZXkoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhiKS5ldmVyeSgoa2V5KSA9PiBwYXJ0aWFsTWF0Y2hLZXkoYVtrZXldLCBiW2tleV0pKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHJlcGxhY2VFcXVhbERlZXAoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiBhO1xuICB9XG4gIGNvbnN0IGFycmF5ID0gaXNQbGFpbkFycmF5KGEpICYmIGlzUGxhaW5BcnJheShiKTtcbiAgaWYgKCFhcnJheSAmJiAhKGlzUGxhaW5PYmplY3QoYSkgJiYgaXNQbGFpbk9iamVjdChiKSkpIHJldHVybiBiO1xuICBjb25zdCBhSXRlbXMgPSBhcnJheSA/IGEgOiBPYmplY3Qua2V5cyhhKTtcbiAgY29uc3QgYVNpemUgPSBhSXRlbXMubGVuZ3RoO1xuICBjb25zdCBiSXRlbXMgPSBhcnJheSA/IGIgOiBPYmplY3Qua2V5cyhiKTtcbiAgY29uc3QgYlNpemUgPSBiSXRlbXMubGVuZ3RoO1xuICBjb25zdCBjb3B5ID0gYXJyYXkgPyBuZXcgQXJyYXkoYlNpemUpIDoge307XG4gIGxldCBlcXVhbEl0ZW1zID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiU2l6ZTsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gYXJyYXkgPyBpIDogYkl0ZW1zW2ldO1xuICAgIGNvbnN0IGFJdGVtID0gYVtrZXldO1xuICAgIGNvbnN0IGJJdGVtID0gYltrZXldO1xuICAgIGlmIChhSXRlbSA9PT0gYkl0ZW0pIHtcbiAgICAgIGNvcHlba2V5XSA9IGFJdGVtO1xuICAgICAgaWYgKGFycmF5ID8gaSA8IGFTaXplIDogaGFzT3duLmNhbGwoYSwga2V5KSkgZXF1YWxJdGVtcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhSXRlbSA9PT0gbnVsbCB8fCBiSXRlbSA9PT0gbnVsbCB8fCB0eXBlb2YgYUl0ZW0gIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGJJdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb3B5W2tleV0gPSBiSXRlbTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ID0gcmVwbGFjZUVxdWFsRGVlcChhSXRlbSwgYkl0ZW0pO1xuICAgIGNvcHlba2V5XSA9IHY7XG4gICAgaWYgKHYgPT09IGFJdGVtKSBlcXVhbEl0ZW1zKys7XG4gIH1cbiAgcmV0dXJuIGFTaXplID09PSBiU2l6ZSAmJiBlcXVhbEl0ZW1zID09PSBhU2l6ZSA/IGEgOiBjb3B5O1xufVxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsT2JqZWN0cyhhLCBiKSB7XG4gIGlmICghYiB8fCBPYmplY3Qua2V5cyhhKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkge1xuICAgIHJldHVybi
25114BmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgaWYgKGFba2V5XSAhPT0gYltrZXldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaXNQbGFpbkFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG59XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG8pIHtcbiAgaWYgKCFoYXNPYmplY3RQcm90b3R5cGUobykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gIGlmIChjdG9yID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBwcm90ID0gY3Rvci5wcm90b3R5cGU7XG4gIGlmICghaGFzT2JqZWN0UHJvdG90eXBlKHByb3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghcHJvdC5oYXNPd25Qcm9wZXJ0eShcImlzUHJvdG90eXBlT2ZcIikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvKSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGhhc09iamVjdFByb3RvdHlwZShvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG5mdW5jdGlvbiBzbGVlcCh0aW1lb3V0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHRpbWVvdXRNYW5hZ2VyLnNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVwbGFjZURhdGEocHJldkRhdGEsIGRhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnN0cnVjdHVyYWxTaGFyaW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHJ1Y3R1cmFsU2hhcmluZyhwcmV2RGF0YSwgZGF0YSk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5zdHJ1Y3R1cmFsU2hhcmluZyAhPT0gZmFsc2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVwbGFjZUVxdWFsRGVlcChwcmV2RGF0YSwgZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBTdHJ1Y3R1cmFsIHNoYXJpbmcgcmVxdWlyZXMgZGF0YSB0byBiZSBKU09OIHNlcmlhbGl6YWJsZS4gVG8gZml4IHRoaXMsIHR1cm4gb2ZmIHN0cnVjdHVyYWxTaGFyaW5nIG9yIHJldHVybiBKU09OLXNlcmlhbGl6YWJsZSBkYXRhIGZyb20geW91ciBxdWVyeUZuLiBbJHtvcHRpb25zLnF1ZXJ5SGFzaH1dOiAke2Vycm9yfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXBsYWNlRXF1YWxEZWVwKHByZXZEYXRhLCBkYXRhKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIGtlZXBQcmV2aW91c0RhdGEocHJldmlvdXNEYXRhKSB7XG4gIHJldHVybiBwcmV2aW91c0RhdGE7XG59XG5mdW5jdGlvbiBhZGRUb0VuZChpdGVtcywgaXRlbSwgbWF4ID0gMCkge1xuICBjb25zdCBuZXdJdGVtcyA9IFsuLi5pdGVtcywgaXRlbV07XG4gIHJldHVybiBtYXggJiYgbmV3SXRlbXMubGVuZ3RoID4gbWF4ID8gbmV3SXRlbXMuc2xpY2UoMSkgOiBuZXdJdGVtcztcbn1cbmZ1bmN0aW9uIGFkZFRvU3RhcnQoaXRlbXMsIGl0ZW0sIG1heCA9IDApIHtcbiAgY29uc3QgbmV3SXRlbXMgPSBbaXRlbSwgLi4uaXRlbXNdO1xuICByZXR1cm4gbWF4ICYmIG5ld0l0ZW1zLmxlbmd0aCA+IG1heCA/IG5ld0l0ZW1zLnNsaWNlKDAsIC0xKSA6IG5ld0l0ZW1zO1xufVxudmFyIHNraXBUb2tlbiA9IFN5bWJvbCgpO1xuZnVuY3Rpb24gZW5zdXJlUXVlcnlGbihvcHRpb25zLCBmZXRjaE9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChvcHRpb25zLnF1ZXJ5Rm4gPT09IHNraXBUb2tlbikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEF0dGVtcHRlZCB0byBpbnZva2UgcXVlcnlGbiB3aGVuIHNldCB0byBza2lwVG9rZW4uIFRoaXMgaXMgbGlrZWx5IGEgY29uZmlndXJhdGlvbiBlcnJvci4gUXVlcnkgaGFzaDogJyR7b3B0aW9ucy5xdWVyeUhhc2h9J2BcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucy5xdWVyeUZuICYmIGZldGNoT3B0aW9ucz8uaW5pdGlhbFByb21pc2UpIHtcbiAgICByZXR1cm4gKCkgPT4gZmV0Y2hPcHRpb25zLmluaXRpYWxQcm9taXNlO1xuICB9XG4gIGlmICghb3B0aW9ucy5xdWVyeUZuIHx8IG9wdGlvbnMucXVlcnlGbiA9PT0gc2tpcFRva2VuKSB7XG4gICAgcmV0dXJuICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBxdWVyeUZuOiAnJHtvcHRpb25zLnF1ZXJ5SGFzaH0nYCkpO1xuICB9XG4gIHJldHVybiBvcHRpb25zLnF1ZXJ5Rm47XG59XG5mdW5jdGlvbiBzaG91bGRUaHJvd0Vycm9yKHRocm93T25FcnJvciwgcGFyYW1zKSB7XG4gIGlmICh0eXBlb2YgdGhyb3dPbkVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdGhyb3dPbkVycm9yKC4uLnBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuICEhdGhyb3dPbkVycm9yO1xufVxuZXhwb3J0IHtcbiAgYWRkVG9FbmQsXG4gIGFkZFRvU3RhcnQsXG4gIGVuc3VyZVF1ZXJ5Rm4sXG4gIGZ1bmN0aW9uYWxVcGRhdGUsXG4gIGhhc2hLZXksXG4gIGhhc2hRdWVyeUtleUJ5T3B0aW9ucyxcbiAgaXNQbGFpbkFycmF5LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1NlcnZlcixcbiAgaXNWYWxpZFRpbWVvdXQsXG4gIGtlZXBQcmV2aW91c0RhdGEsXG4gIG1hdGNoTXV0YXRpb24sXG4gIG1hdGNoUXVlcnksXG4gIG5vb3AsXG4gIHBhcnRpYWxNYXRjaEtleSxcbiAgcmVwbGFjZURhdGEsXG4gIHJlcGxhY2VFcXVhbERlZXAsXG4gIHJlc29sdmVFbmFibGVkLFxuICByZXNvbHZlU3RhbGVUaW
251141lLFxuICBzaGFsbG93RXF1YWxPYmplY3RzLFxuICBzaG91bGRUaHJvd0Vycm9yLFxuICBza2lwVG9rZW4sXG4gIHNsZWVwLFxuICB0aW1lVW50aWxTdGFsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8vIHNyYy9mb2N1c01hbmFnZXIudHNcbmltcG9ydCB7IFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL3N1YnNjcmliYWJsZS5qc1wiO1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xudmFyIEZvY3VzTWFuYWdlciA9IGNsYXNzIGV4dGVuZHMgU3Vic2NyaWJhYmxlIHtcbiAgI2ZvY3VzZWQ7XG4gICNjbGVhbnVwO1xuICAjc2V0dXA7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jc2V0dXAgPSAob25Gb2N1cykgPT4ge1xuICAgICAgaWYgKCFpc1NlcnZlciAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICgpID0+IG9uRm9jdXMoKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9O1xuICB9XG4gIG9uU3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy4jY2xlYW51cCkge1xuICAgICAgdGhpcy5zZXRFdmVudExpc3RlbmVyKHRoaXMuI3NldHVwKTtcbiAgICB9XG4gIH1cbiAgb25VbnN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgIHRoaXMuI2NsZWFudXA/LigpO1xuICAgICAgdGhpcy4jY2xlYW51cCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc2V0RXZlbnRMaXN0ZW5lcihzZXR1cCkge1xuICAgIHRoaXMuI3NldHVwID0gc2V0dXA7XG4gICAgdGhpcy4jY2xlYW51cD8uKCk7XG4gICAgdGhpcy4jY2xlYW51cCA9IHNldHVwKChmb2N1c2VkKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGZvY3VzZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNlZChmb2N1c2VkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25Gb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNldEZvY3VzZWQoZm9jdXNlZCkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLiNmb2N1c2VkICE9PSBmb2N1c2VkO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLiNmb2N1c2VkID0gZm9jdXNlZDtcbiAgICAgIHRoaXMub25Gb2N1cygpO1xuICAgIH1cbiAgfVxuICBvbkZvY3VzKCkge1xuICAgIGNvbnN0IGlzRm9jdXNlZCA9IHRoaXMuaXNGb2N1c2VkKCk7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgIGxpc3RlbmVyKGlzRm9jdXNlZCk7XG4gICAgfSk7XG4gIH1cbiAgaXNGb2N1c2VkKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy4jZm9jdXNlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLiNmb2N1c2VkO1xuICAgIH1cbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5kb2N1bWVudD8udmlzaWJpbGl0eVN0YXRlICE9PSBcImhpZGRlblwiO1xuICB9XG59O1xudmFyIGZvY3VzTWFuYWdlciA9IG5ldyBGb2N1c01hbmFnZXIoKTtcbmV4cG9ydCB7XG4gIEZvY3VzTWFuYWdlcixcbiAgZm9jdXNNYW5hZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9jdXNNYW5hZ2VyLmpzLm1hcCIsIi8vIHNyYy90aGVuYWJsZS50c1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5mdW5jdGlvbiBwZW5kaW5nVGhlbmFibGUoKSB7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuICBjb25zdCB0aGVuYWJsZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgdGhlbmFibGUuc3RhdHVzID0gXCJwZW5kaW5nXCI7XG4gIHRoZW5hYmxlLmNhdGNoKCgpID0+IHtcbiAgfSk7XG4gIGZ1bmN0aW9uIGZpbmFsaXplKGRhdGEpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoZW5hYmxlLCBkYXRhKTtcbiAgICBkZWxldGUgdGhlbmFibGUucmVzb2x2ZTtcbiAgICBkZWxldGUgdGhlbmFibGUucmVqZWN0O1xuICB9XG4gIHRoZW5hYmxlLnJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICBmaW5hbGl6ZSh7XG4gICAgICBzdGF0dXM6IFwiZnVsZmlsbGVkXCIsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9O1xuICB0aGVuYWJsZS5yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgZmluYWxpemUoe1xuICAgICAgc3RhdHVzOiBcInJlamVjdGVkXCIsXG4gICAgICByZWFzb25cbiAgICB9KTtcbiAgICByZWplY3QocmVhc29uKTtcbiAgfTtcbiAgcmV0dXJuIHRoZW5hYmxlO1xufVxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVN5bmMocHJvbWlzZSkge1xuICBsZXQgZGF0YTtcbiAgcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHtcbiAgICBkYXRhID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIG5vb3ApPy5jYXRjaChub29wKTtcbiAgaWYgKGRhdGEgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB7IGRhdGEgfTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZXhwb3J0IHtcbiAgcGVuZGluZ1RoZW5hYmxlLFxuICB0cnlSZXNvbHZlU3luY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRoZW5hYmxlLmpzLm1hcCIsIi8vIHNyYy9oeWRyYXRpb24udHNcbmltcG9ydCB7IHRyeVJlc29sdmVTeW5jIH0gZnJvbSBcIi4vdGhlbmFibGUuanNcIjtcbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm1lckZuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBkZWh5ZHJhdGVNdXRhdGlvbihtdXRhdGlvbikge1xuICByZXR1cm4ge1xuICAgIG11dGF0aW9uS2V5OiBtdXRhdGlvbi5vcHRpb25zLm11dGF0aW9uS2V5LFxuICAgIHN0YXRlOiBtdXRhdGlvbi5zdGF0ZSxcbiAgICAuLi5tdXRhdGlvbi5vcHRpb25zLnNjb3BlICYmIHsgc2NvcGU6IG11dGF0aW9uLm9wdGlvbnMuc2NvcGUgfSxcbiAgICAuLi5tdXRhdGlvbi5tZXRhICYmIHsgbWV0YTogbXV0YXRpb24ubWV0YSB9XG4gIH07XG59XG5mdW5jdGlvbiBkZWh5ZHJhdGVRdWVyeShxdWVyeSwgc2VyaWFsaXplRGF0YSwgc2hvdWxkUmVkYWN0RXJyb3JzKSB7XG4gIHJldHVybi
25114B7XG4gICAgZGVoeWRyYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIHN0YXRlOiB7XG4gICAgICAuLi5xdWVyeS5zdGF0ZSxcbiAgICAgIC4uLnF1ZXJ5LnN0YXRlLmRhdGEgIT09IHZvaWQgMCAmJiB7XG4gICAgICAgIGRhdGE6IHNlcmlhbGl6ZURhdGEocXVlcnkuc3RhdGUuZGF0YSlcbiAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXJ5S2V5OiBxdWVyeS5xdWVyeUtleSxcbiAgICBxdWVyeUhhc2g6IHF1ZXJ5LnF1ZXJ5SGFzaCxcbiAgICAuLi5xdWVyeS5zdGF0ZS5zdGF0dXMgPT09IFwicGVuZGluZ1wiICYmIHtcbiAgICAgIHByb21pc2U6IHF1ZXJ5LnByb21pc2U/LnRoZW4oc2VyaWFsaXplRGF0YSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGlmICghc2hvdWxkUmVkYWN0RXJyb3JzKGVycm9yKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgQSBxdWVyeSB0aGF0IHdhcyBkZWh5ZHJhdGVkIGFzIHBlbmRpbmcgZW5kZWQgdXAgcmVqZWN0aW5nLiBbJHtxdWVyeS5xdWVyeUhhc2h9XTogJHtlcnJvcn07IFRoZSBlcnJvciB3aWxsIGJlIHJlZGFjdGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInJlZGFjdGVkXCIpKTtcbiAgICAgIH0pXG4gICAgfSxcbiAgICAuLi5xdWVyeS5tZXRhICYmIHsgbWV0YTogcXVlcnkubWV0YSB9XG4gIH07XG59XG5mdW5jdGlvbiBkZWZhdWx0U2hvdWxkRGVoeWRyYXRlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgcmV0dXJuIG11dGF0aW9uLnN0YXRlLmlzUGF1c2VkO1xufVxuZnVuY3Rpb24gZGVmYXVsdFNob3VsZERlaHlkcmF0ZVF1ZXJ5KHF1ZXJ5KSB7XG4gIHJldHVybiBxdWVyeS5zdGF0ZS5zdGF0dXMgPT09IFwic3VjY2Vzc1wiO1xufVxuZnVuY3Rpb24gZGVmYXVsdFNob3VsZFJlZGFjdEVycm9ycyhfKSB7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZGVoeWRyYXRlKGNsaWVudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGZpbHRlck11dGF0aW9uID0gb3B0aW9ucy5zaG91bGREZWh5ZHJhdGVNdXRhdGlvbiA/PyBjbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5kZWh5ZHJhdGU/LnNob3VsZERlaHlkcmF0ZU11dGF0aW9uID8/IGRlZmF1bHRTaG91bGREZWh5ZHJhdGVNdXRhdGlvbjtcbiAgY29uc3QgbXV0YXRpb25zID0gY2xpZW50LmdldE11dGF0aW9uQ2FjaGUoKS5nZXRBbGwoKS5mbGF0TWFwKFxuICAgIChtdXRhdGlvbikgPT4gZmlsdGVyTXV0YXRpb24obXV0YXRpb24pID8gW2RlaHlkcmF0ZU11dGF0aW9uKG11dGF0aW9uKV0gOiBbXVxuICApO1xuICBjb25zdCBmaWx0ZXJRdWVyeSA9IG9wdGlvbnMuc2hvdWxkRGVoeWRyYXRlUXVlcnkgPz8gY2xpZW50LmdldERlZmF1bHRPcHRpb25zKCkuZGVoeWRyYXRlPy5zaG91bGREZWh5ZHJhdGVRdWVyeSA/PyBkZWZhdWx0U2hvdWxkRGVoeWRyYXRlUXVlcnk7XG4gIGNvbnN0IHNob3VsZFJlZGFjdEVycm9ycyA9IG9wdGlvbnMuc2hvdWxkUmVkYWN0RXJyb3JzID8/IGNsaWVudC5nZXREZWZhdWx0T3B0aW9ucygpLmRlaHlkcmF0ZT8uc2hvdWxkUmVkYWN0RXJyb3JzID8/IGRlZmF1bHRTaG91bGRSZWRhY3RFcnJvcnM7XG4gIGNvbnN0IHNlcmlhbGl6ZURhdGEgPSBvcHRpb25zLnNlcmlhbGl6ZURhdGEgPz8gY2xpZW50LmdldERlZmF1bHRPcHRpb25zKCkuZGVoeWRyYXRlPy5zZXJpYWxpemVEYXRhID8/IGRlZmF1bHRUcmFuc2Zvcm1lckZuO1xuICBjb25zdCBxdWVyaWVzID0gY2xpZW50LmdldFF1ZXJ5Q2FjaGUoKS5nZXRBbGwoKS5mbGF0TWFwKFxuICAgIChxdWVyeSkgPT4gZmlsdGVyUXVlcnkocXVlcnkpID8gW2RlaHlkcmF0ZVF1ZXJ5KHF1ZXJ5LCBzZXJpYWxpemVEYXRhLCBzaG91bGRSZWRhY3RFcnJvcnMpXSA6IFtdXG4gICk7XG4gIHJldHVybiB7IG11dGF0aW9ucywgcXVlcmllcyB9O1xufVxuZnVuY3Rpb24gaHlkcmF0ZShjbGllbnQsIGRlaHlkcmF0ZWRTdGF0ZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRlaHlkcmF0ZWRTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fCBkZWh5ZHJhdGVkU3RhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbXV0YXRpb25DYWNoZSA9IGNsaWVudC5nZXRNdXRhdGlvbkNhY2hlKCk7XG4gIGNvbnN0IHF1ZXJ5Q2FjaGUgPSBjbGllbnQuZ2V0UXVlcnlDYWNoZSgpO1xuICBjb25zdCBkZXNlcmlhbGl6ZURhdGEgPSBvcHRpb25zPy5kZWZhdWx0T3B0aW9ucz8uZGVzZXJpYWxpemVEYXRhID8/IGNsaWVudC5nZXREZWZhdWx0T3B0aW9ucygpLmh5ZHJhdGU/LmRlc2VyaWFsaXplRGF0YSA/PyBkZWZhdWx0VHJhbnNmb3JtZXJGbjtcbiAgY29uc3QgbXV0YXRpb25zID0gZGVoeWRyYXRlZFN0YXRlLm11dGF0aW9ucyB8fCBbXTtcbiAgY29uc3QgcXVlcmllcyA9IGRlaHlkcmF0ZWRTdGF0ZS5xdWVyaWVzIHx8IFtdO1xuICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBzdGF0ZSwgLi4ubXV0YXRpb25PcHRpb25zIH0pID0+IHtcbiAgICBtdXRhdGlvbkNhY2hlLmJ1aWxkKFxuICAgICAgY2xpZW50LFxuICAgICAge1xuICAgICAgICAuLi5jbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5oeWRyYXRlPy5tdXRhdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnM/LmRlZmF1bHRPcHRpb25zPy5tdXRhdGlvbnMsXG4gICAgICAgIC4uLm11dGF0aW9uT3B0aW9uc1xuICAgICAgfSxcbiAgICAgIHN0YXRlXG4gICAgKTtcbiAgfSk7XG4gIHF1ZXJpZXMuZm9yRWFjaChcbiAgICAoeyBxdWVyeUtleSwgc3RhdGUsIHF1ZXJ5SGFzaCwgbWV0YSwgcHJvbWlzZSwgZGVoeWRyYXRlZEF0IH0pID0+IHtcbiAgICAgIGNvbnN0IHN5bmNEYXRhID0gcHJvbWlzZSA/IHRyeVJlc29sdmVTeW5jKHByb21pc2UpIDogdm9pZCAwO1xuICAgICAgY29uc3QgcmF3RGF0YSA9IHN0YXRlLmRhdGEgPT09IHZvaWQgMCA/IHN5bmNEYXRhPy5kYXRhIDogc3RhdGUuZGF0YTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdEYXRhID09PSB2b2lkIDAgPyByYXdEYXRhIDogZGVzZXJpYWxpemVEYXRhKHJhd0RhdGEpO1xuICAgICAgbGV0IHF1ZXJ5ID0gcXVlcnlDYWNoZS5nZXQocXVlcnlIYXNoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUXVlcnlJc1BlbmRpbmcgPSBxdWVyeT8uc3RhdGUuc3RhdHVzID09PSBcInBlbmRpbmdcIjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUXVlcnlJc0ZldGNoaW5nID0gcXVlcnk/LnN0YXRlLmZldGNoU3RhdHVzID09PSBcImZldGNoaW5nXCI7XG4gICAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgY29uc3QgaGFzTmV3ZXJTeW5jRGF0YSA9IHN5bmNEYXRhICYmIC8vIFdlIG9ubHkgbmVlZCB0aGlzIHVuZGVmaW5lZCBjaGVjayB0byBoYW5kbGUgb2xkZXIgZGVoeWRyYXRpb25cbiAgICAgICAgLy8gcGF5bG9hZHMgdGh
25114hdCBtaWdodCBub3QgaGF2ZSBkZWh5ZHJhdGVkQXRcbiAgICAgICAgZGVoeWRyYXRlZEF0ICE9PSB2b2lkIDAgJiYgZGVoeWRyYXRlZEF0ID4gcXVlcnkuc3RhdGUuZGF0YVVwZGF0ZWRBdDtcbiAgICAgICAgaWYgKHN0YXRlLmRhdGFVcGRhdGVkQXQgPiBxdWVyeS5zdGF0ZS5kYXRhVXBkYXRlZEF0IHx8IGhhc05ld2VyU3luY0RhdGEpIHtcbiAgICAgICAgICBjb25zdCB7IGZldGNoU3RhdHVzOiBfaWdub3JlZCwgLi4uc2VyaWFsaXplZFN0YXRlIH0gPSBzdGF0ZTtcbiAgICAgICAgICBxdWVyeS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi5zZXJpYWxpemVkU3RhdGUsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnlDYWNoZS5idWlsZChcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY2xpZW50LmdldERlZmF1bHRPcHRpb25zKCkuaHlkcmF0ZT8ucXVlcmllcyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnM/LmRlZmF1bHRPcHRpb25zPy5xdWVyaWVzLFxuICAgICAgICAgICAgcXVlcnlLZXksXG4gICAgICAgICAgICBxdWVyeUhhc2gsXG4gICAgICAgICAgICBtZXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBSZXNldCBmZXRjaCBzdGF0dXMgdG8gaWRsZSB0byBhdm9pZFxuICAgICAgICAgIC8vIHF1ZXJ5IGJlaW5nIHN0dWNrIGluIGZldGNoaW5nIHN0YXRlIHVwb24gaHlkcmF0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZmV0Y2hTdGF0dXM6IFwiaWRsZVwiLFxuICAgICAgICAgICAgc3RhdHVzOiBkYXRhICE9PSB2b2lkIDAgPyBcInN1Y2Nlc3NcIiA6IHN0YXRlLnN0YXR1c1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9taXNlICYmICFleGlzdGluZ1F1ZXJ5SXNQZW5kaW5nICYmICFleGlzdGluZ1F1ZXJ5SXNGZXRjaGluZyAmJiAvLyBPbmx5IGh5ZHJhdGUgaWYgZGVoeWRyYXRpb24gaXMgbmV3ZXIgdGhhbiBhbnkgZXhpc3RpbmcgZGF0YSxcbiAgICAgIC8vIHRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIG5ldyBxdWVyaWVzXG4gICAgICAoZGVoeWRyYXRlZEF0ID09PSB2b2lkIDAgfHwgZGVoeWRyYXRlZEF0ID4gcXVlcnkuc3RhdGUuZGF0YVVwZGF0ZWRBdCkpIHtcbiAgICAgICAgdm9pZCBxdWVyeS5mZXRjaCh2b2lkIDAsIHtcbiAgICAgICAgICAvLyBSU0MgdHJhbnNmb3JtZWQgcHJvbWlzZXMgYXJlIG5vdCB0aGVuYWJsZVxuICAgICAgICAgIGluaXRpYWxQcm9taXNlOiBQcm9taXNlLnJlc29sdmUocHJvbWlzZSkudGhlbihkZXNlcmlhbGl6ZURhdGEpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cbmV4cG9ydCB7XG4gIGRlZmF1bHRTaG91bGREZWh5ZHJhdGVNdXRhdGlvbixcbiAgZGVmYXVsdFNob3VsZERlaHlkcmF0ZVF1ZXJ5LFxuICBkZWh5ZHJhdGUsXG4gIGh5ZHJhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oeWRyYXRpb24uanMubWFwIiwiLy8gc3JjL25vdGlmeU1hbmFnZXIudHNcbmltcG9ydCB7IHN5c3RlbVNldFRpbWVvdXRaZXJvIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbnZhciBkZWZhdWx0U2NoZWR1bGVyID0gc3lzdGVtU2V0VGltZW91dFplcm87XG5mdW5jdGlvbiBjcmVhdGVOb3RpZnlNYW5hZ2VyKCkge1xuICBsZXQgcXVldWUgPSBbXTtcbiAgbGV0IHRyYW5zYWN0aW9ucyA9IDA7XG4gIGxldCBub3RpZnlGbiA9IChjYWxsYmFjaykgPT4ge1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG4gIGxldCBiYXRjaE5vdGlmeUZuID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcbiAgbGV0IHNjaGVkdWxlRm4gPSBkZWZhdWx0U2NoZWR1bGVyO1xuICBjb25zdCBzY2hlZHVsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgIGlmICh0cmFuc2FjdGlvbnMpIHtcbiAgICAgIHF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZUZuKCgpID0+IHtcbiAgICAgICAgbm90aWZ5Rm4oY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcbiAgICBpZiAob3JpZ2luYWxRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHNjaGVkdWxlRm4oKCkgPT4ge1xuICAgICAgICBiYXRjaE5vdGlmeUZuKCgpID0+IHtcbiAgICAgICAgICBvcmlnaW5hbFF1ZXVlLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICBub3RpZnlGbihjYWxsYmFjayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIGJhdGNoOiAoY2FsbGJhY2spID0+IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cmFuc2FjdGlvbnMrKztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cmFuc2FjdGlvbnMtLTtcbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWxsIGNhbGxzIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIHdpbGwgYmUgYmF0Y2hlZC5cbiAgICAgKi9cbiAgICBiYXRjaENhbGxzOiAoY2FsbGJhY2spID0+IHtcbiAgICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBzY2hlZHVsZSgoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuICAgIHNjaGVkdWxlLFxuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBzZXQgYSBjdXN0b20gbm90aWZ5IGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZm9yIGV4YW1wbGUgd3JhcCBub3RpZmljYXRpb25zIHdpdGggYFJlYWN0LmFjdGAgd2hpbGUgcnVubmluZyB0ZXN0cy5cbiAgICAgKi9cbiAgICBzZXROb3RpZnlGdW5jdGlvbjogKGZuKSA9PiB7XG4gICAgICBub3RpZnlGbiA9IGZuO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHNldCBhIGN1c3RvbSBmdW5jdGlvbiB0byBiYXRjaCBub3RpZmljYXRpb25zIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgdGljay5cbiAgICAgKiBCeSBkZWZh
25114dWx0IFJlYWN0IFF1ZXJ5IHdpbGwgdXNlIHRoZSBiYXRjaCBmdW5jdGlvbiBwcm92aWRlZCBieSBSZWFjdERPTSBvciBSZWFjdCBOYXRpdmUuXG4gICAgICovXG4gICAgc2V0QmF0Y2hOb3RpZnlGdW5jdGlvbjogKGZuKSA9PiB7XG4gICAgICBiYXRjaE5vdGlmeUZuID0gZm47XG4gICAgfSxcbiAgICBzZXRTY2hlZHVsZXI6IChmbikgPT4ge1xuICAgICAgc2NoZWR1bGVGbiA9IGZuO1xuICAgIH1cbiAgfTtcbn1cbnZhciBub3RpZnlNYW5hZ2VyID0gY3JlYXRlTm90aWZ5TWFuYWdlcigpO1xuZXhwb3J0IHtcbiAgY3JlYXRlTm90aWZ5TWFuYWdlcixcbiAgZGVmYXVsdFNjaGVkdWxlcixcbiAgbm90aWZ5TWFuYWdlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdGlmeU1hbmFnZXIuanMubWFwIiwiLy8gc3JjL29ubGluZU1hbmFnZXIudHNcbmltcG9ydCB7IFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL3N1YnNjcmliYWJsZS5qc1wiO1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xudmFyIE9ubGluZU1hbmFnZXIgPSBjbGFzcyBleHRlbmRzIFN1YnNjcmliYWJsZSB7XG4gICNvbmxpbmUgPSB0cnVlO1xuICAjY2xlYW51cDtcbiAgI3NldHVwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI3NldHVwID0gKG9uT25saW5lKSA9PiB7XG4gICAgICBpZiAoIWlzU2VydmVyICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IG9ubGluZUxpc3RlbmVyID0gKCkgPT4gb25PbmxpbmUodHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9mZmxpbmVMaXN0ZW5lciA9ICgpID0+IG9uT25saW5lKGZhbHNlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgb25saW5lTGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIG9mZmxpbmVMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIG9ubGluZUxpc3RlbmVyKTtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgb2ZmbGluZUxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9O1xuICB9XG4gIG9uU3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy4jY2xlYW51cCkge1xuICAgICAgdGhpcy5zZXRFdmVudExpc3RlbmVyKHRoaXMuI3NldHVwKTtcbiAgICB9XG4gIH1cbiAgb25VbnN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgIHRoaXMuI2NsZWFudXA/LigpO1xuICAgICAgdGhpcy4jY2xlYW51cCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc2V0RXZlbnRMaXN0ZW5lcihzZXR1cCkge1xuICAgIHRoaXMuI3NldHVwID0gc2V0dXA7XG4gICAgdGhpcy4jY2xlYW51cD8uKCk7XG4gICAgdGhpcy4jY2xlYW51cCA9IHNldHVwKHRoaXMuc2V0T25saW5lLmJpbmQodGhpcykpO1xuICB9XG4gIHNldE9ubGluZShvbmxpbmUpIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy4jb25saW5lICE9PSBvbmxpbmU7XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuI29ubGluZSA9IG9ubGluZTtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyKG9ubGluZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaXNPbmxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI29ubGluZTtcbiAgfVxufTtcbnZhciBvbmxpbmVNYW5hZ2VyID0gbmV3IE9ubGluZU1hbmFnZXIoKTtcbmV4cG9ydCB7XG4gIE9ubGluZU1hbmFnZXIsXG4gIG9ubGluZU1hbmFnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbmxpbmVNYW5hZ2VyLmpzLm1hcCIsIi8vIHNyYy9yZXRyeWVyLnRzXG5pbXBvcnQgeyBmb2N1c01hbmFnZXIgfSBmcm9tIFwiLi9mb2N1c01hbmFnZXIuanNcIjtcbmltcG9ydCB7IG9ubGluZU1hbmFnZXIgfSBmcm9tIFwiLi9vbmxpbmVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBwZW5kaW5nVGhlbmFibGUgfSBmcm9tIFwiLi90aGVuYWJsZS5qc1wiO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHNsZWVwIH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmZ1bmN0aW9uIGRlZmF1bHRSZXRyeURlbGF5KGZhaWx1cmVDb3VudCkge1xuICByZXR1cm4gTWF0aC5taW4oMWUzICogMiAqKiBmYWlsdXJlQ291bnQsIDNlNCk7XG59XG5mdW5jdGlvbiBjYW5GZXRjaChuZXR3b3JrTW9kZSkge1xuICByZXR1cm4gKG5ldHdvcmtNb2RlID8/IFwib25saW5lXCIpID09PSBcIm9ubGluZVwiID8gb25saW5lTWFuYWdlci5pc09ubGluZSgpIDogdHJ1ZTtcbn1cbnZhciBDYW5jZWxsZWRFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIoXCJDYW5jZWxsZWRFcnJvclwiKTtcbiAgICB0aGlzLnJldmVydCA9IG9wdGlvbnM/LnJldmVydDtcbiAgICB0aGlzLnNpbGVudCA9IG9wdGlvbnM/LnNpbGVudDtcbiAgfVxufTtcbmZ1bmN0aW9uIGlzQ2FuY2VsbGVkRXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3I7XG59XG5mdW5jdGlvbiBjcmVhdGVSZXRyeWVyKGNvbmZpZykge1xuICBsZXQgaXNSZXRyeUNhbmNlbGxlZCA9IGZhbHNlO1xuICBsZXQgZmFpbHVyZUNvdW50ID0gMDtcbiAgbGV0IGNvbnRpbnVlRm47XG4gIGNvbnN0IHRoZW5hYmxlID0gcGVuZGluZ1RoZW5hYmxlKCk7XG4gIGNvbnN0IGlzUmVzb2x2ZWQgPSAoKSA9PiB0aGVuYWJsZS5zdGF0dXMgIT09IFwicGVuZGluZ1wiO1xuICBjb25zdCBjYW5jZWwgPSAoY2FuY2VsT3B0aW9ucykgPT4ge1xuICAgIGlmICghaXNSZXNvbHZlZCgpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDYW5jZWxsZWRFcnJvcihjYW5jZWxPcHRpb25zKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICBjb25maWcub25DYW5jZWw/LihlcnJvcik7XG4gICAgfVxuICB9O1xuICBjb25zdCBjYW5jZWxS
25114ZXRyeSA9ICgpID0+IHtcbiAgICBpc1JldHJ5Q2FuY2VsbGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgY29udGludWVSZXRyeSA9ICgpID0+IHtcbiAgICBpc1JldHJ5Q2FuY2VsbGVkID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IGNhbkNvbnRpbnVlID0gKCkgPT4gZm9jdXNNYW5hZ2VyLmlzRm9jdXNlZCgpICYmIChjb25maWcubmV0d29ya01vZGUgPT09IFwiYWx3YXlzXCIgfHwgb25saW5lTWFuYWdlci5pc09ubGluZSgpKSAmJiBjb25maWcuY2FuUnVuKCk7XG4gIGNvbnN0IGNhblN0YXJ0ID0gKCkgPT4gY2FuRmV0Y2goY29uZmlnLm5ldHdvcmtNb2RlKSAmJiBjb25maWcuY2FuUnVuKCk7XG4gIGNvbnN0IHJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIWlzUmVzb2x2ZWQoKSkge1xuICAgICAgY29udGludWVGbj8uKCk7XG4gICAgICB0aGVuYWJsZS5yZXNvbHZlKHZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlamVjdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghaXNSZXNvbHZlZCgpKSB7XG4gICAgICBjb250aW51ZUZuPy4oKTtcbiAgICAgIHRoZW5hYmxlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXVzZSA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKGNvbnRpbnVlUmVzb2x2ZSkgPT4ge1xuICAgICAgY29udGludWVGbiA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNSZXNvbHZlZCgpIHx8IGNhbkNvbnRpbnVlKCkpIHtcbiAgICAgICAgICBjb250aW51ZVJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uZmlnLm9uUGF1c2U/LigpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgY29udGludWVGbiA9IHZvaWQgMDtcbiAgICAgIGlmICghaXNSZXNvbHZlZCgpKSB7XG4gICAgICAgIGNvbmZpZy5vbkNvbnRpbnVlPy4oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgIGlmIChpc1Jlc29sdmVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHByb21pc2VPclZhbHVlO1xuICAgIGNvbnN0IGluaXRpYWxQcm9taXNlID0gZmFpbHVyZUNvdW50ID09PSAwID8gY29uZmlnLmluaXRpYWxQcm9taXNlIDogdm9pZCAwO1xuICAgIHRyeSB7XG4gICAgICBwcm9taXNlT3JWYWx1ZSA9IGluaXRpYWxQcm9taXNlID8/IGNvbmZpZy5mbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwcm9taXNlT3JWYWx1ZSA9IFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgUHJvbWlzZS5yZXNvbHZlKHByb21pc2VPclZhbHVlKS50aGVuKHJlc29sdmUpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZXRyeSA9IGNvbmZpZy5yZXRyeSA/PyAoaXNTZXJ2ZXIgPyAwIDogMyk7XG4gICAgICBjb25zdCByZXRyeURlbGF5ID0gY29uZmlnLnJldHJ5RGVsYXkgPz8gZGVmYXVsdFJldHJ5RGVsYXk7XG4gICAgICBjb25zdCBkZWxheSA9IHR5cGVvZiByZXRyeURlbGF5ID09PSBcImZ1bmN0aW9uXCIgPyByZXRyeURlbGF5KGZhaWx1cmVDb3VudCwgZXJyb3IpIDogcmV0cnlEZWxheTtcbiAgICAgIGNvbnN0IHNob3VsZFJldHJ5ID0gcmV0cnkgPT09IHRydWUgfHwgdHlwZW9mIHJldHJ5ID09PSBcIm51bWJlclwiICYmIGZhaWx1cmVDb3VudCA8IHJldHJ5IHx8IHR5cGVvZiByZXRyeSA9PT0gXCJmdW5jdGlvblwiICYmIHJldHJ5KGZhaWx1cmVDb3VudCwgZXJyb3IpO1xuICAgICAgaWYgKGlzUmV0cnlDYW5jZWxsZWQgfHwgIXNob3VsZFJldHJ5KSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZhaWx1cmVDb3VudCsrO1xuICAgICAgY29uZmlnLm9uRmFpbD8uKGZhaWx1cmVDb3VudCwgZXJyb3IpO1xuICAgICAgc2xlZXAoZGVsYXkpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gY2FuQ29udGludWUoKSA/IHZvaWQgMCA6IHBhdXNlKCk7XG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKGlzUmV0cnlDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJ1bigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBwcm9taXNlOiB0aGVuYWJsZSxcbiAgICBzdGF0dXM6ICgpID0+IHRoZW5hYmxlLnN0YXR1cyxcbiAgICBjYW5jZWwsXG4gICAgY29udGludWU6ICgpID0+IHtcbiAgICAgIGNvbnRpbnVlRm4/LigpO1xuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0sXG4gICAgY2FuY2VsUmV0cnksXG4gICAgY29udGludWVSZXRyeSxcbiAgICBjYW5TdGFydCxcbiAgICBzdGFydDogKCkgPT4ge1xuICAgICAgaWYgKGNhblN0YXJ0KCkpIHtcbiAgICAgICAgcnVuKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXVzZSgpLnRoZW4ocnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGVuYWJsZTtcbiAgICB9XG4gIH07XG59XG5leHBvcnQge1xuICBDYW5jZWxsZWRFcnJvcixcbiAgY2FuRmV0Y2gsXG4gIGNyZWF0ZVJldHJ5ZXIsXG4gIGlzQ2FuY2VsbGVkRXJyb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXRyeWVyLmpzLm1hcCIsIi8vIHNyYy9yZW1vdmFibGUudHNcbmltcG9ydCB7IHRpbWVvdXRNYW5hZ2VyIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGlzU2VydmVyLCBpc1ZhbGlkVGltZW91dCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG52YXIgUmVtb3ZhYmxlID0gY2xhc3Mge1xuICAjZ2NUaW1lb3V0O1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY2xlYXJHY1RpbWVvdXQoKTtcbiAgfVxuICBzY2hlZHVsZUdjKCkge1xuICAgIHRoaXMuY2xlYXJHY1RpbWVvdXQoKTtcbiAgICBpZiAoaXNWYWxpZFRpbWVvdXQodGhpcy5nY1RpbWUpKSB7XG4gICAgICB0aGlzLiNnY1RpbWVvdXQgPSB0aW1lb3V0TWFuYWdlci5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25hbFJlbW92ZSgpO1xuICAgICAgfSwgdGhpcy5nY1RpbWUpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVHY1RpbWUobmV3R2NUaW1lKSB7XG4gICAgdGhpcy5nY1RpbWUgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZ2NUaW1lIHx8IDAsXG4gICAgICBuZXdHY1RpbWUgPz8gKGlzU2VydmVyID8gSW5maW5pdHkgOiA1ICogNjAgKiAxZTMpXG4gICAgKTtcbiAgfVxuICBjbGVhckdjVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy4jZ2NUaW1lb3V0KSB7XG4gICAgICB0aW1lb3V0TWFuYWdlci5jbGVhclRpbWVvdXQodGhpcy4jZ2NUaW1lb3V0KTtcbiAgICAgIHRoaXMuI2djVGltZW91dCA9IHZvaWQgMDtcbiAgICB9XG4gI
25114H1cbn07XG5leHBvcnQge1xuICBSZW1vdmFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZW1vdmFibGUuanMubWFwIiwiLy8gc3JjL3F1ZXJ5LnRzXG5pbXBvcnQge1xuICBlbnN1cmVRdWVyeUZuLFxuICBub29wLFxuICByZXBsYWNlRGF0YSxcbiAgcmVzb2x2ZUVuYWJsZWQsXG4gIHJlc29sdmVTdGFsZVRpbWUsXG4gIHNraXBUb2tlbixcbiAgdGltZVVudGlsU3RhbGVcbn0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IG5vdGlmeU1hbmFnZXIgfSBmcm9tIFwiLi9ub3RpZnlNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBDYW5jZWxsZWRFcnJvciwgY2FuRmV0Y2gsIGNyZWF0ZVJldHJ5ZXIgfSBmcm9tIFwiLi9yZXRyeWVyLmpzXCI7XG5pbXBvcnQgeyBSZW1vdmFibGUgfSBmcm9tIFwiLi9yZW1vdmFibGUuanNcIjtcbnZhciBRdWVyeSA9IGNsYXNzIGV4dGVuZHMgUmVtb3ZhYmxlIHtcbiAgI2luaXRpYWxTdGF0ZTtcbiAgI3JldmVydFN0YXRlO1xuICAjY2FjaGU7XG4gICNjbGllbnQ7XG4gICNyZXRyeWVyO1xuICAjZGVmYXVsdE9wdGlvbnM7XG4gICNhYm9ydFNpZ25hbENvbnN1bWVkO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2Fib3J0U2lnbmFsQ29uc3VtZWQgPSBmYWxzZTtcbiAgICB0aGlzLiNkZWZhdWx0T3B0aW9ucyA9IGNvbmZpZy5kZWZhdWx0T3B0aW9ucztcbiAgICB0aGlzLnNldE9wdGlvbnMoY29uZmlnLm9wdGlvbnMpO1xuICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgdGhpcy4jY2xpZW50ID0gY29uZmlnLmNsaWVudDtcbiAgICB0aGlzLiNjYWNoZSA9IHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCk7XG4gICAgdGhpcy5xdWVyeUtleSA9IGNvbmZpZy5xdWVyeUtleTtcbiAgICB0aGlzLnF1ZXJ5SGFzaCA9IGNvbmZpZy5xdWVyeUhhc2g7XG4gICAgdGhpcy4jaW5pdGlhbFN0YXRlID0gZ2V0RGVmYXVsdFN0YXRl
25114KHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5zdGF0ZSA9IGNvbmZpZy5zdGF0ZSA/PyB0aGlzLiNpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5zY2hlZHVsZUdjKCk7XG4gIH1cbiAgZ2V0IG1ldGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLiNyZXRyeWVyPy5wcm9taXNlO1xuICB9XG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4udGhpcy4jZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLnVwZGF0ZUdjVGltZSh0aGlzLm9wdGlvbnMuZ2NUaW1lKTtcbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLmRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgZGVmYXVsdFN0YXRlID0gZ2V0RGVmYXVsdFN0YXRlKHRoaXMub3B0aW9ucyk7XG4gICAgICBpZiAoZGVmYXVsdFN0YXRlLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgICB0aGlzLnNldERhdGEoZGVmYXVsdFN0YXRlLmRhdGEsIHtcbiAgICAgICAgICB1cGRhdGVkQXQ6IGRlZmF1bHRTdGF0ZS5kYXRhVXBkYXRlZEF0LFxuICAgICAgICAgIG1hbnVhbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jaW5pdGlhbFN0YXRlID0gZGVmYXVsdFN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvcHRpb25hbFJlbW92ZSgpIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzLmxlbmd0aCAmJiB0aGlzLnN0YXRlLmZldGNoU3RhdHVzID09PSBcImlkbGVcIikge1xuICAgICAgdGhpcy4jY2FjaGUucmVtb3ZlKHRoaXMpO1xuICAgIH1cbiAgfVxuICBzZXREYXRhKG5ld0RhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXRhID0gcmVwbGFjZURhdGEodGhpcy5zdGF0ZS5kYXRhLCBuZXdEYXRhLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuI2Rpc3BhdGNoKHtcbiAgICAgIGRhdGEsXG4gICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgIGRhdGFVcGRhdGVkQXQ6IG9wdGlvbnM/LnVwZGF0ZWRBdCxcbiAgICAgIG1hbnVhbDogb3B0aW9ucz8ubWFudWFsXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgc2V0U3RhdGUoc3RhdGUsIHNldFN0YXRlT3B0aW9ucykge1xuICAgIHRoaXMuI2Rpc3BhdGNoKHsgdHlwZTogXCJzZXRTdGF0ZVwiLCBzdGF0ZSwgc2V0U3RhdGVPcHRpb25zIH0pO1xuICB9XG4gIGNhbmNlbChvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuI3JldHJ5ZXI/LnByb21pc2U7XG4gICAgdGhpcy4jcmV0cnllcj8uY2FuY2VsKG9wdGlvbnMpO1xuICAgIHJldHVybiBwcm9taXNlID8gcHJvbWlzZS50aGVuKG5vb3ApLmNhdGNoKG5vb3ApIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5jYW5jZWwoeyBzaWxlbnQ6IHRydWUgfSk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh0aGlzLiNpbml0aWFsU3RhdGUpO1xuICB9XG4gIGlzQWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5zb21lKFxuICAgICAgKG9ic2VydmVyKSA9PiByZXNvbHZlRW5hYmxlZChvYnNlcnZlci5vcHRpb25zLmVuYWJsZWQsIHRoaXMpICE9PSBmYWxzZVxuICAgICk7XG4gIH1cbiAgaXNEaXNhYmxlZCgpIHtcbiAgICBpZiAodGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpID4gMCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzQWN0aXZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlGbiA9PT0gc2tpcFRva2VuIHx8IHRoaXMuc3RhdGUuZGF0YVVwZGF0ZUNvdW50ICsgdGh
25114pcy5zdGF0ZS5lcnJvclVwZGF0ZUNvdW50ID09PSAwO1xuICB9XG4gIGlzU3RhdGljKCkge1xuICAgIGlmICh0aGlzLmdldE9ic2VydmVyc0NvdW50KCkgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuc29tZShcbiAgICAgICAgKG9ic2VydmVyKSA9PiByZXNvbHZlU3RhbGVUaW1lKG9ic2VydmVyLm9wdGlvbnMuc3RhbGVUaW1lLCB0aGlzKSA9PT0gXCJzdGF0aWNcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzU3RhbGUoKSB7XG4gICAgaWYgKHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5zb21lKFxuICAgICAgICAob2JzZXJ2ZXIpID0+IG9ic2VydmVyLmdldEN1cnJlbnRSZXN1bHQoKS5pc1N0YWxlXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kYXRhID09PSB2b2lkIDAgfHwgdGhpcy5zdGF0ZS5pc0ludmFsaWRhdGVkO1xuICB9XG4gIGlzU3RhbGVCeVRpbWUoc3RhbGVUaW1lID0gMCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGFsZVRpbWUgPT09IFwic3RhdGljXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUuaXNJbnZhbGlkYXRlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhdGltZVVudGlsU3RhbGUodGhpcy5zdGF0ZS5kYXRhVXBkYXRlZEF0LCBzdGFsZVRpbWUpO1xuICB9XG4gIG9uRm9jdXMoKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVycy5maW5kKCh4KSA9PiB4LnNob3VsZEZldGNoT25XaW5kb3dGb2N1cygpKTtcbiAgICBvYnNlcnZlcj8ucmVmZXRjaCh7IGNhbmNlbFJlZmV0Y2g6IGZhbHNlIH0pO1xuICAgIHRoaXMuI3JldHJ5ZXI/LmNvbnRpbnVlKCk7XG4gIH1cbiAgb25PbmxpbmUoKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVycy5maW5kKCh4KSA9PiB4LnNob3VsZEZldGNoT25SZWNvbm5lY3QoKSk7XG4gICAgb2JzZXJ2ZXI/LnJlZmV0Y2goeyBjYW5jZWxSZWZldGNoOiBmYWxzZSB9KTtcbiAgICB0aGlzLiNyZXRyeWVyPy5jb250aW51ZSgpO1xuICB9XG4gIGFkZE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVycy5pbmNsdWRlcyhvYnNlcnZlcikpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgdGhpcy5jbGVhckdjVGltZW91dCgpO1xuICAgICAgdGhpcy4jY2FjaGUubm90aWZ5KHsgdHlwZTogXCJvYnNlcnZlckFkZGVkXCIsIHF1ZXJ5OiB0aGlzLCBvYnNlcnZlciB9KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcnMuaW5jbHVkZXMob2JzZXJ2ZXIpKSB7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzLmZpbHRlcigoeCkgPT4geCAhPT0gb2JzZXJ2ZXIpO1xuICAgICAgaWYgKCF0aGlzLm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3JldHJ5ZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy4jYWJvcnRTaWduYWxDb25zdW1lZCkge1xuICAgICAgICAgICAgdGhpcy4jcmV0cnllci5jYW5jZWwoeyByZXZlcnQ6IHRydWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI3JldHJ5ZXIuY2FuY2VsUmV0cnkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZUdjKCk7XG4gICAgICB9XG4gICAgICB0aGlzLiNjYWNoZS5ub3RpZnkoeyB0eXBlOiBcIm9ic2VydmVyUmVtb3ZlZFwiLCBxdWVyeTogdGhpcywgb2JzZXJ2ZXIgfSk7XG4gICAgfVxuICB9XG4gIGdldE9ic2VydmVyc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gIH1cbiAgaW52YWxpZGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNJbnZhbGlkYXRlZCkge1xuICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcImludmFsaWRhdGVcIiB9KTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgZmV0Y2gob3B0aW9ucywgZmV0Y2hPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZmV0Y2hTdGF0dXMgIT09IFwiaWRsZVwiICYmIC8vIElmIHRoZSBwcm9taXNlIGluIHRoZSByZXR5ZXIgaXMgYWxyZWFkeSByZWplY3RlZCwgd2UgaGF2ZSB0byBkZWZpbml0ZWx5XG4gICAgLy8gcmUtc3RhcnQgdGhlIGZldGNoOyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHRoZSBxdWVyeSBpcyBzdGlsbCBpbiBhXG4gICAgLy8gcGVuZGluZyBzdGF0ZSB3aGVuIHRoYXQgaGFwcGVuc1xuICAgIHRoaXMuI3JldHJ5ZXI/LnN0YXR1cygpICE9PSBcInJlamVjdGVkXCIpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmRhdGEgIT09IHZvaWQgMCAmJiBmZXRjaE9wdGlvbnM/LmNhbmNlbFJlZmV0Y2gpIHtcbiAgICAgICAgdGhpcy5jYW5jZWwoeyBzaWxlbnQ6IHRydWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3JldHJ5ZXIpIHtcbiAgICAgICAgdGhpcy4jcmV0cnllci5jb250aW51ZVJldHJ5KCk7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXRyeWVyLnByb21pc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5vcHRpb25zLnF1ZXJ5Rm4pIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyID0gdGhpcy5vYnNlcnZlcnMuZmluZCgoeCkgPT4geC5vcHRpb25zLnF1ZXJ5Rm4pO1xuICAgICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhvYnNlcnZlci5vcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5xdWVyeUtleSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgQXMgb2YgdjQsIHF1ZXJ5S2V5IG5lZWRzIHRvIGJlIGFuIEFycmF5LiBJZiB5b3UgYXJlIHVzaW5nIGEgc3RyaW5nIGxpa2UgJ3JlcG9EYXRhJywgcGxlYXNlIGNoYW5nZSBpdCB0byBhbiBBcnJheSwgZS5nLiBbJ3JlcG9EYXRhJ11gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhZGRTaWduYWxQcm9wZXJ0eSA9IChvYmplY3QpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIFwic2lnbmFsXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jYWJvcnRTaWduYWxDb25zdW1lZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgI
25114H1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgZmV0Y2hGbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5Rm4gPSBlbnN1cmVRdWVyeUZuKHRoaXMub3B0aW9ucywgZmV0Y2hPcHRpb25zKTtcbiAgICAgIGNvbnN0IGNyZWF0ZVF1ZXJ5Rm5Db250ZXh0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeUZuQ29udGV4dDIgPSB7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLiNjbGllbnQsXG4gICAgICAgICAgcXVlcnlLZXk6IHRoaXMucXVlcnlLZXksXG4gICAgICAgICAgbWV0YTogdGhpcy5tZXRhXG4gICAgICAgIH07XG4gICAgICAgIGFkZFNpZ25hbFByb3BlcnR5KHF1ZXJ5Rm5Db250ZXh0Mik7XG4gICAgICAgIHJldHVybiBxdWVyeUZuQ29udGV4dDI7XG4gICAgICB9O1xuICAgICAgY29uc3QgcXVlcnlGbkNvbnRleHQgPSBjcmVhdGVRdWVyeUZuQ29udGV4dCgpO1xuICAgICAgdGhpcy4jYWJvcnRTaWduYWxDb25zdW1lZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZXJzaXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wZXJzaXN0ZXIoXG4gICAgICAgICAgcXVlcnlGbixcbiAgICAgICAgICBxdWVyeUZuQ29udGV4dCxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlcnlGbihxdWVyeUZuQ29udGV4dCk7XG4gICAgfTtcbiAgICBjb25zdCBjcmVhdGVGZXRjaENvbnRleHQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0MiA9IHtcbiAgICAgICAgZmV0Y2hPcHRpb25zLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHF1ZXJ5S2V5OiB0aGlzLnF1ZXJ5S2V5LFxuICAgICAgICBjbGllbnQ6IHRoaXMuI2NsaWVudCxcbiAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIGZldGNoRm5cbiAgICAgIH07XG4gICAgICBhZGRTaWduYWxQcm9wZXJ0eShjb250ZXh0Mik7XG4gICAgICByZXR1cm4gY29udGV4dDI7XG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlRmV0Y2hDb250ZXh0KCk7XG4gICAgdGhpcy5vcHRpb25zLmJlaGF2aW9yPy5vbkZldGNoKGNvbnRleHQsIHRoaXMpO1xuICAgIHRoaXMuI3JldmVydFN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAodGhpcy5zdGF0ZS5mZXRjaFN0YXR1cyA9PT0gXCJpZGxlXCIgfHwgdGhpcy5zdGF0ZS5mZXRjaE1ldGEgIT09IGNvbnRleHQuZmV0Y2hPcHRpb25zPy5tZXRhKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwiZmV0Y2hcIiwgbWV0YTogY29udGV4dC5mZXRjaE9wdGlvbnM/Lm1ldGEgfSk7XG4gICAgfVxuICAgIHRoaXMuI3JldHJ5ZXIgPSBjcmVhdGVSZXRyeWVyKHtcbiAgICAgIGluaXRpYWxQcm9taXNlOiBmZXRjaE9wdGlvbnM/LmluaXRpYWxQcm9taXNlLFxuICAgICAgZm46IGNvbnRleHQuZmV0Y2hGbixcbiAgICAgIG9uQ2FuY2VsOiAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3IgJiYgZXJyb3IucmV2ZXJ0KSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLiNyZXZlcnRTdGF0ZSxcbiAgICAgICAgICAgIGZldGNoU3RhdHVzOiBcImlkbGVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSxcbiAgICAgIG9uRmFpbDogKGZhaWx1cmVDb3VudCwgZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcImZhaWxlZFwiLCBmYWlsdXJlQ291bnQsIGVycm9yIH0pO1xuICAgICAgfSxcbiAgICAgIG9uUGF1c2U6ICgpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcInBhdXNlXCIgfSk7XG4gICAgICB9LFxuICAgICAgb25Db250aW51ZTogKCkgPT4ge1xuICAgICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwiY29udGludWVcIiB9KTtcbiAgICAgIH0sXG4gICAgICByZXRyeTogY29udGV4dC5vcHRpb25zLnJldHJ5LFxuICAgICAgcmV0cnlEZWxheTogY29udGV4dC5vcHRpb25zLnJldHJ5RGVsYXksXG4gICAgICBuZXR3b3JrTW9kZTogY29udGV4dC5vcHRpb25zLm5ldHdvcmtNb2RlLFxuICAgICAgY2FuUnVuOiAoKSA9PiB0cnVlXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLiNyZXRyeWVyLnN0YXJ0KCk7XG4gICAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFF1ZXJ5IGRhdGEgY2Fubm90IGJlIHVuZGVmaW5lZC4gUGxlYXNlIG1ha2Ugc3VyZSB0byByZXR1cm4gYSB2YWx1ZSBvdGhlciB0aGFuIHVuZGVmaW5lZCBmcm9tIHlvdXIgcXVlcnkgZnVuY3Rpb24uIEFmZmVjdGVkIHF1ZXJ5IGtleTogJHt0aGlzLnF1ZXJ5SGFzaH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5xdWVyeUhhc2h9IGRhdGEgaXMgdW5kZWZpbmVkYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldERhdGEoZGF0YSk7XG4gICAgICB0aGlzLiNjYWNoZS5jb25maWcub25TdWNjZXNzPy4oZGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLiNjYWNoZS5jb25maWcub25TZXR0bGVkPy4oXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHRoaXMuc3RhdGUuZXJyb3IsXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLnNpbGVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLiNyZXRyeWVyLnByb21pc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmV2ZXJ0KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4jZGlzcGF0Y2goe1xuICAgICAgICB0eX
25114BlOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICAgIHRoaXMuI2NhY2hlLmNvbmZpZy5vbkVycm9yPy4oXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgICAgdGhpcy4jY2FjaGUuY29uZmlnLm9uU2V0dGxlZD8uKFxuICAgICAgICB0aGlzLnN0YXRlLmRhdGEsXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVHYygpO1xuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgY29uc3QgcmVkdWNlciA9IChzdGF0ZSkgPT4ge1xuICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgZmV0Y2hGYWlsdXJlQ291bnQ6IGFjdGlvbi5mYWlsdXJlQ291bnQsXG4gICAgICAgICAgICBmZXRjaEZhaWx1cmVSZWFzb246IGFjdGlvbi5lcnJvclxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJwYXVzZVwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGZldGNoU3RhdHVzOiBcInBhdXNlZFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImNvbnRpbnVlXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgZmV0Y2hTdGF0dXM6IFwiZmV0Y2hpbmdcIlxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJmZXRjaFwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIC4uLmZldGNoU3RhdGUoc3RhdGUuZGF0YSwgdGhpcy5vcHRpb25zKSxcbiAgICAgICAgICAgIGZldGNoTWV0YTogYWN0aW9uLm1ldGEgPz8gbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJzdWNjZXNzXCI6XG4gICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGRhdGE6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgICAgZGF0YVVwZGF0ZUNvdW50OiBzdGF0ZS5kYXRhVXBkYXRlQ291bnQgKyAxLFxuICAgICAgICAgICAgZGF0YVVwZGF0ZWRBdDogYWN0aW9uLmRhdGFVcGRhdGVkQXQgPz8gRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgaXNJbnZhbGlkYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgLi4uIWFjdGlvbi5tYW51YWwgJiYge1xuICAgICAgICAgICAgICBmZXRjaFN0YXR1czogXCJpZGxlXCIsXG4gICAgICAgICAgICAgIGZldGNoRmFpbHVyZUNvdW50OiAwLFxuICAgICAgICAgICAgICBmZXRjaEZhaWx1cmVSZWFzb246IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuI3JldmVydFN0YXRlID0gYWN0aW9uLm1hbnVhbCA/IG5ld1N0YXRlIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBhY3Rpb24uZXJyb3I7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBlcnJvclVwZGF0ZUNvdW50OiBzdGF0ZS5lcnJvclVwZGF0ZUNvdW50ICsgMSxcbiAgICAgICAgICAgIGVycm9yVXBkYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZmV0Y2hGYWlsdXJlQ291bnQ6IHN0YXRlLmZldGNoRmFpbHVyZUNvdW50ICsgMSxcbiAgICAgICAgICAgIGZldGNoRmFpbHVyZVJlYXNvbjogZXJyb3IsXG4gICAgICAgICAgICBmZXRjaFN0YXR1czogXCJpZGxlXCIsXG4gICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJpbnZhbGlkYXRlXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgaXNJbnZhbGlkYXRlZDogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJzZXRTdGF0ZVwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIC4uLmFjdGlvbi5zdGF0ZVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gcmVkdWNlcih0aGlzLnN0YXRlKTtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLmZvckVhY2goKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm9uUXVlcnlVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jY2FjaGUubm90aWZ5KHsgcXVlcnk6IHRoaXMsIHR5cGU6IFwidXBkYXRlZFwiLCBhY3Rpb24gfSk7XG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBmZXRjaFN0YXRlKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBmZXRjaEZhaWx1cmVDb3VudDogMCxcbiAgICBmZXRjaEZhaWx1cmVSZWFzb246IG51bGwsXG4gICAgZmV0Y2hTdGF0dXM6IGNhbkZldGNoKG9wdGlvbnMubmV0d29ya01vZGUpID8gXCJmZXRjaGluZ1wiIDogXCJwYXVzZWRcIixcbiAgICAuLi5kYXRhID09PSB2b2lkIDAgJiYge1xuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBzdGF0dXM6IFwicGVuZGluZ1wiXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdFN0YXRl
25114KG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0YSA9IHR5cGVvZiBvcHRpb25zLmluaXRpYWxEYXRhID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmluaXRpYWxEYXRhKCkgOiBvcHRpb25zLmluaXRpYWxEYXRhO1xuICBjb25zdCBoYXNEYXRhID0gZGF0YSAhPT0gdm9pZCAwO1xuICBjb25zdCBpbml0aWFsRGF0YVVwZGF0ZWRBdCA9IGhhc0RhdGEgPyB0eXBlb2Ygb3B0aW9ucy5pbml0aWFsRGF0YVVwZGF0ZWRBdCA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy5pbml0aWFsRGF0YVVwZGF0ZWRBdCgpIDogb3B0aW9ucy5pbml0aWFsRGF0YVVwZGF0ZWRBdCA6IDA7XG4gIHJldHVybiB7XG4gICAgZGF0YSxcbiAgICBkYXRhVXBkYXRlQ291bnQ6IDAsXG4gICAgZGF0YVVwZGF0ZWRBdDogaGFzRGF0YSA/IGluaXRpYWxEYXRhVXBkYXRlZEF0ID8/IERhdGUubm93KCkgOiAwLFxuICAgIGVycm9yOiBudWxsLFxuICAgIGVycm9yVXBkYXRlQ291bnQ6IDAsXG4gICAgZXJyb3JVcGRhdGVkQXQ6IDAsXG4gICAgZmV0Y2hGYWlsdXJlQ291bnQ6IDAsXG4gICAgZmV0Y2hGYWlsdXJlUmVhc29uOiBudWxsLFxuICAgIGZldGNoTWV0YTogbnVsbCxcbiAgICBpc0ludmFsaWRhdGVkOiBmYWxzZSxcbiAgICBzdGF0dXM6IGhhc0RhdGEgPyBcInN1Y2Nlc3NcIiA6IFwicGVuZGluZ1wiLFxuICAgIGZldGNoU3RhdHVzOiBcImlkbGVcIlxuICB9O1xufVxuZXhwb3J0IHtcbiAgUXVlcnksXG4gIGZldGNoU3RhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS5qcy5tYXAiLCIvLyBzcmMvcXVlcnlPYnNlcnZlci50c1xuaW1wb3J0IHsgZm9jdXNNYW5hZ2VyIH0gZnJvbSBcIi4vZm9jdXNNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBub3RpZnlNYW5hZ2VyIH0gZnJvbSBcIi4vbm90aWZ5TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZSB9IGZyb20gXCIuL3F1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTdWJzY3JpYmFibGUgfSBmcm9tIFwiLi9zdWJzY3JpYmFibGUuanNcIjtcbmltcG9ydCB7IHBlbmRpbmdUaGVuYWJsZSB9IGZyb20gXCIuL3RoZW5hYmxlLmpzXCI7XG5pbXBvcnQge1xuICBpc1NlcnZlcixcbiAgaXNWYWxpZFRpbWVvdXQsXG4gIG5vb3AsXG4gIHJlcGxhY2VEYXRhLFxuICByZXNvbHZlRW5hYmxlZCxcbiAgcmVzb2x2ZVN0YWxlVGltZSxcbiAgc2hhbGxvd0VxdWFsT2JqZWN0cyxcbiAgdGltZVVudGlsU3RhbGVcbn0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IHRpbWVvdXRNYW5hZ2VyIH0gZnJvbSBcIi4vdGltZW91dE1hbmFnZXIuanNcIjtcbnZhciBRdWVyeU9ic2VydmVyID0gY2xhc3MgZXh0ZW5kcyBTdWJzY3JpYmFibGUge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuI3NlbGVjdEVycm9yID0gbnVsbDtcbiAgICB0aGlzLiNjdXJyZW50VGhlbmFibGUgPSBwZW5kaW5nVGhlbmFibGUoKTtcbiAgICB0aGlzLmJpbmRNZXRob2RzKCk7XG4gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gICNjbGllbnQ7XG4gICNjdXJyZW50UXVlcnkgPSB2b2lkIDA7XG4gICNjdXJyZW50UXVlcnlJbml0aWFsU3RhdGUgPSB2b2lkIDA7XG4gICNjdXJyZW50UmVzdWx0ID0gdm9pZCAwO1xuICAjY3VycmVudFJlc3VsdFN0YXRlO1xuICAjY3VycmVudFJlc3VsdE9wdGlvbnM7XG4gICNjdXJyZW50VGhlbmFibGU7XG4gICNzZWxlY3RFcnJvcjtcbiAgI3NlbGVjdEZuO1xuICAjc2VsZWN0UmVzdWx0O1xuICAvLyBUaGlzIHByb3BlcnR5IGtlZXBzIHRyYWNrIG9mIHRoZSBsYXN0IHF1ZXJ5IHdpdGggZGVmaW5lZCBkYXRhLlxuICAvLyBJdCB3aWxsIGJlIHVzZWQgdG8gcGFzcyB0aGUgcHJldmlvdXMgZGF0YSBhbmQgcXVlcnkgdG8gdGhlIHBsYWNlaG9sZGVyIGZ1bmN0aW9uIGJldHdlZW4gcmVuZGVycy5cbiAgI2xhc3RRdWVyeVdpdGhEZWZpbmVkRGF0YTtcbiAgI3N0YWxlVGltZW91dElkO1xuICAjcmVmZXRjaEludGVydmFsSWQ7XG4gICNjdXJyZW50UmVmZXRjaEludGVydmFsO1xuICAjdHJhY2tlZFByb3BzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgYmluZE1ldGhvZHMoKSB7XG4gICAgdGhpcy5yZWZldGNoID0gdGhpcy5yZWZldGNoLmJpbmQodGhpcyk7XG4gIH1cbiAgb25TdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDEpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRRdWVyeS5hZGRPYnNlcnZlcih0aGlzKTtcbiAgICAgIGlmIChzaG91bGRGZXRjaE9uTW91bnQodGhpcy4jY3VycmVudFF1ZXJ5LCB0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgIHRoaXMuI2V4ZWN1dGVGZXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVSZXN1bHQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3VwZGF0ZVRpbWVycygpO1xuICAgIH1cbiAgfVxuICBvblVuc3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy5oYXNMaXN0ZW5lcnMoKSkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG4gIHNob3VsZEZldGNoT25SZWNvbm5lY3QoKSB7XG4gICAgcmV0dXJuIHNob3VsZEZldGNoT24oXG4gICAgICB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMucmVmZXRjaE9uUmVjb25uZWN0XG4gICAgKTtcbiAgfVxuICBzaG91bGRGZXRjaE9uV2luZG93Rm9jdXMoKSB7XG4gICAgcmV0dXJuIHNob3VsZEZldGNoT24oXG4gICAgICB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMucmVmZXRjaE9uV2luZG93Rm9jdXNcbiAgICApO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIHRoaXMuI2NsZWFyU3RhbGVUaW1lb3V0KCk7XG4gICAgdGhpcy4jY2xlYXJSZWZldGNoSW50ZXJ2YWwoKTtcbiAgICB0aGlzLiNjdXJyZW50UXVlcnkucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XG4gIH1cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgY29uc3QgcHJldk9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcHJldlF1ZXJ5ID0gdGhpcy4jY3VycmVudFF1ZXJ5O1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuI2NsaWVudC5kZWZhdWx0UXVlcnlPcHRpb25zKG9wdGlvbnMpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlZCAhPT0gdm9pZCAwICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMuZW5hYmxlZCAhPT0gXCJib29sZWFuXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5lbmFibGVkICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHJlc29sdmVFbmFibGVkKHRoaXMub3B0aW9ucy5lbmFibGVkLCB0aGlzLiNjdXJyZW50UXVlcnkpICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkV4cGVjdGVkIGVuYWJsZWQgdG8gYmUgYSBib29sZWFuIG9yIGEgY2FsbGJhY2sgdGhhdCByZXR1cm5zIGEgYm9vbGVhblwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLiN1cGRhdGV
25114RdWVyeSgpO1xuICAgIHRoaXMuI2N1cnJlbnRRdWVyeS5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgaWYgKHByZXZPcHRpb25zLl9kZWZhdWx0ZWQgJiYgIXNoYWxsb3dFcXVhbE9iamVjdHModGhpcy5vcHRpb25zLCBwcmV2T3B0aW9ucykpIHtcbiAgICAgIHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCkubm90aWZ5KHtcbiAgICAgICAgdHlwZTogXCJvYnNlcnZlck9wdGlvbnNVcGRhdGVkXCIsXG4gICAgICAgIHF1ZXJ5OiB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICAgIG9ic2VydmVyOiB0aGlzXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbW91bnRlZCA9IHRoaXMuaGFzTGlzdGVuZXJzKCk7XG4gICAgaWYgKG1vdW50ZWQgJiYgc2hvdWxkRmV0Y2hPcHRpb25hbGx5KFxuICAgICAgdGhpcy4jY3VycmVudFF1ZXJ5LFxuICAgICAgcHJldlF1ZXJ5LFxuICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgcHJldk9wdGlvbnNcbiAgICApKSB7XG4gICAgICB0aGlzLiNleGVjdXRlRmV0Y2goKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZXN1bHQoKTtcbiAgICBpZiAobW91bnRlZCAmJiAodGhpcy4jY3VycmVudFF1ZXJ5ICE9PSBwcmV2UXVlcnkgfHwgcmVzb2x2ZUVuYWJsZWQodGhpcy5vcHRpb25zLmVuYWJsZWQsIHRoaXMuI2N1cnJlbnRRdWVyeSkgIT09IHJlc29sdmVFbmFibGVkKHByZXZPcHRpb25zLmVuYWJsZWQsIHRoaXMuI2N1cnJlbnRRdWVyeSkgfHwgcmVzb2x2ZVN0YWxlVGltZSh0aGlzLm9wdGlvbnMuc3RhbGVUaW1lLCB0aGlzLiNjdXJyZW50UXVlcnkpICE9PSByZXNvbHZlU3RhbGVUaW
251141lKHByZXZPcHRpb25zLnN0YWxlVGltZSwgdGhpcy4jY3VycmVudFF1ZXJ5KSkpIHtcbiAgICAgIHRoaXMuI3VwZGF0ZVN0YWxlVGltZW91dCgpO1xuICAgIH1cbiAgICBjb25zdCBuZXh0UmVmZXRjaEludGVydmFsID0gdGhpcy4jY29tcHV0ZVJlZmV0Y2hJbnRlcnZhbCgpO1xuICAgIGlmIChtb3VudGVkICYmICh0aGlzLiNjdXJyZW50UXVlcnkgIT09IHByZXZRdWVyeSB8fCByZXNvbHZlRW5hYmxlZCh0aGlzLm9wdGlvbnMuZW5hYmxlZCwgdGhpcy4jY3VycmVudFF1ZXJ5KSAhPT0gcmVzb2x2ZUVuYWJsZWQocHJldk9wdGlvbnMuZW5hYmxlZCwgdGhpcy4jY3VycmVudFF1ZXJ5KSB8fCBuZXh0UmVmZXRjaEludGVydmFsICE9PSB0aGlzLiNjdXJyZW50UmVmZXRjaEludGVydmFsKSkge1xuICAgICAgdGhpcy4jdXBkYXRlUmVmZXRjaEludGVydmFsKG5leHRSZWZldGNoSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuICBnZXRPcHRpbWlzdGljUmVzdWx0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCkuYnVpbGQodGhpcy4jY2xpZW50LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNyZWF0ZVJlc3VsdChxdWVyeSwgb3B0aW9ucyk7XG4gICAgaWYgKHNob3VsZEFzc2lnbk9ic2VydmVyQ3VycmVudFByb3BlcnRpZXModGhpcywgcmVzdWx0KSkge1xuICAgICAgdGhpcy4jY3VycmVudFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIHRoaXMuI2N1cnJlbnRSZXN1bHRPcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdGhpcy4jY3VycmVudFJlc3VsdFN0YXRlID0gdGhpcy4jY3VycmVudFF1ZXJ5LnN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGdldEN1cnJlbnRSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSZXN1bHQ7XG4gIH1cbiAgdHJhY2tSZXN1bHQocmVzdWx0LCBvblByb3BUcmFja2VkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShyZXN1bHQsIHtcbiAgICAgIGdldDogKHRhcmdldCwga2V5KSA9PiB7XG4gICAgICAgIHRoaXMudHJhY2tQcm9wKGtleSk7XG4gICAgICAgIG9uUHJvcFRyYWNrZWQ/LihrZXkpO1xuICAgICAgICBpZiAoa2V5ID09PSBcInByb21pc2VcIiAmJiAhdGhpcy5vcHRpb25zLmV4cGVyaW1lbnRhbF9wcmVmZXRjaEluUmVuZGVyICYmIHRoaXMuI2N1cnJlbnRUaGVuYWJsZS5zdGF0dXMgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgICAgdGhpcy4jY3VycmVudFRoZW5hYmxlLnJlamVjdChcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJleHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlciBmZWF0dXJlIGZsYWcgaXMgbm90IGVuYWJsZWRcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB0cmFja1Byb3Aoa2V5KSB7XG4gICAgdGhpcy4jdHJhY2tlZFByb3BzLmFkZChrZXkpO1xuICB9XG4gIGdldEN1cnJlbnRRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudFF1ZXJ5O1xuICB9XG4gIHJlZmV0Y2goeyAuLi5vcHRpb25zIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmZldGNoKHtcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBmZXRjaE9wdGltaXN0aWMob3B0aW9ucykge1xuICAgIGNvbnN0IGRlZmF1bHRlZE9wdGlvbnMgPSB0aGlzLiNjbGllbnQuZGVmYXVsdFF1ZXJ5T3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI2NsaWVudC5nZXRRdWVyeUNhY2hlKCkuYnVpbGQodGhpcy4jY2xpZW50LCBkZWZhdWx0ZWRPcHRpb25zKTtcbiAgICByZXR1cm4gcXVlcnkuZmV0Y2goKS50aGVuKCgpID0+IHRoaXMuY3JlYXRlUmVzdWx0KHF1ZXJ5LCBkZWZhdWx0ZWRPcHRpb25zKSk7XG4gIH1cbiAgZmV0Y2goZmV0Y2hPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuI2V4ZWN1dGVGZXRjaCh7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBjYW5jZWxSZWZldGNoOiBmZXRjaE9wdGlvbnMuY2FuY2VsUmVmZXRjaCA/PyB0cnVlXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVJlc3VsdCgpO1xuICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSZXN1bHQ7XG4gICAgfSk7XG4gIH1cbiAgI2V4ZWN1dGVGZXRjaChmZXRjaE9wdGlvbnMpIHtcbiAgICB0aGlzLiN1cGRhdGVRdWVyeSgpO1xuICAgIGxldCBwcm9taXNlID0gdGhpcy4jY3VycmVudFF1ZXJ5LmZldGNoKFxuICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgZmV0Y2hPcHRpb25zXG4gICAgKTtcbiAgICBpZiAoIWZldGNoT3B0aW9ucz8udGhyb3dPbkVycm9yKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS5jYXRjaChub29wKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgI3VwZGF0ZVN0YWxlVGltZW91dCgpIHtcbiAgICB0aGlzLiNjbGVhclN0YWxlVGltZW91dCgpO1xuICAgIGNvbnN0IHN0YWxlVGltZSA9IHJlc29sdmVTdGFsZVRpbWUoXG4gICAgICB0aGlzLm9wdGlvbnMuc3RhbGVUaW1lLFxuICAgICAgdGhpcy4jY3VycmVudFF1ZXJ5XG4gICAgKTtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgdGhpcy4jY3VycmVudFJlc3VsdC5pc1N0YWxlIHx8ICFpc1ZhbGlkVGltZW91dChzdGFsZVRpbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpbWUgPSB0aW1lVW50aWxTdGFsZSh0aGlzLiNjdXJyZW50UmVzdWx0LmRhdGFVcGRhdGVkQXQsIHN0YWxlVGltZSk7XG4gICAgY29uc3QgdGltZW91dCA9IHRpbWUgKyAxO1xuICAgIHRoaXMuI3N0YWxlVGltZW91dElkID0gdGltZW91dE1hbmFnZXIuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI2N1cnJlbnRSZXN1bHQuaXNTdGFsZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdCgpO1xuICAgICAgfVxuICAgIH0sIHRpbWVvdXQpO1xuICB9XG4gICNjb21wdXRlUmVmZXRjaEludGVydmFsKCkge1xuICAgIHJldHVybiAodHlwZW9mIHRoaXMub3B0aW9ucy5yZWZldGNoSW50ZXJ2YWwgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMub3B0aW9ucy5yZWZldGNoSW50ZXJ2YWwodGhpcy4jY3VycmVudFF1ZXJ5KSA6IHRoaXMub3B0aW9ucy5yZWZldGNoSW50ZXJ2YWwpID8/IGZhbHNlO1xuICB9XG4gICN1cGRhdGVSZWZldGNoSW50ZXJ2YWwobmV4dEludGVydmFsKSB7XG4gICAgdGhpcy4jY2xlYXJSZWZldGNoSW50ZXJ2YWwoKTtcbiAgICB0aGlzLiNjdXJyZW50UmVmZXRjaEludGVydmFsID0gbmV4dEludGVydmFsO1xuICAgIGlmIChpc1NlcnZlciB8fCByZXNvbHZlRW5hYmxlZCh0aGlzLm9wdGlvbnMuZW5hYmxlZCwgdGhpcy4jY3VycmVudFF1ZXJ5KSA9PT0gZmFsc2UgfHwgIWlzVmFsaWRUaW1lb3V0KHRoaXMuI2N1cnJlbnRSZWZldGNoSW50ZXJ2YWwpIHx8IHRoaXMuI2N1cnJlbnRSZWZldGNoSW50ZXJ2YWwgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jcmVmZXRjaEludGVydmFsSWQgPSB0aW1lb3V0TWFuYWdlci5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJlZmV0Y2hJbnRlcnZhbEluQmFja2dyb3VuZCB8fCBmb2N1c01hbmFnZXIuaXNGb2N1c2VkKCkpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0ZUZldGNoKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy4jY3VycmVudFJlZmV0Y2hJbnRlcnZhbCk7XG4gIH1cbiAgI3VwZGF0ZVRpbWVycygpIHtcbiAgICB0aGlzLiN1cGRhdGVTdGFsZVRpbWVvdXQoKTtcbiAgICB0aGlzLiN1cGRhdGVSZWZldGNoSW50ZXJ2YWwodGhpcy4jY29tcHV0ZVJlZmV0Y2hJbnRlcnZhbCgpKTtcbiAgfVxuICAjY2xlYXJTdGFsZVRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMuI3N0YWxlVGltZW91dElkKSB7XG4gICAgICB0aW1lb3V0TWFuYWdlci5jbGVhclRpbWVvdXQodGhpcy4jc3RhbGVUaW
251141lb3V0SWQpO1xuICAgICAgdGhpcy4jc3RhbGVUaW1lb3V0SWQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gICNjbGVhclJlZmV0Y2hJbnRlcnZhbCgpIHtcbiAgICBpZiAodGhpcy4jcmVmZXRjaEludGVydmFsSWQpIHtcbiAgICAgIHRpbWVvdXRNYW5hZ2VyLmNsZWFySW50ZXJ2YWwodGhpcy4jcmVmZXRjaEludGVydmFsSWQpO1xuICAgICAgdGhpcy4jcmVmZXRjaEludGVydmFsSWQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGNyZWF0ZVJlc3VsdChxdWVyeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByZXZRdWVyeSA9IHRoaXMuI2N1cnJlbnRRdWVyeTtcbiAgICBjb25zdCBwcmV2T3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBwcmV2UmVzdWx0ID0gdGhpcy4jY3VycmVudFJlc3VsdDtcbiAgICBjb25zdCBwcmV2UmVzdWx0U3RhdGUgPSB0aGlzLiNjdXJyZW50UmVzdWx0U3RhdGU7XG4gICAgY29uc3QgcHJldlJlc3VsdE9wdGlvbnMgPSB0aGlzLiNjdXJyZW50UmVzdWx0T3B0aW9ucztcbiAgICBjb25zdCBxdWVyeUNoYW5nZSA9IHF1ZXJ5ICE9PSBwcmV2UXVlcnk7XG4gICAgY29uc3QgcXVlcnlJbml0aWFsU3RhdGUgPSBxdWVyeUNoYW5nZSA/IHF1ZXJ5LnN0YXRlIDogdGhpcy4jY3VycmVudFF1ZXJ5SW5pdGlhbFN0YXRlO1xuICAgIGNvbnN0IHsgc3RhdGUgfSA9IHF1ZXJ5O1xuICAgIGxldCBuZXdTdGF0ZSA9IHsgLi4uc3RhdGUgfTtcbiAgICBsZXQgaXNQbGFjZWhvbGRlckRhdGEgPSBmYWxzZTtcbiAgICBsZXQgZGF0YTtcbiAgICBpZiAob3B0aW9ucy5fb3B0aW1pc3RpY1Jlc3VsdHMpIHtcbiAgICAgIGNvbnN0IG1vdW50ZWQgPSB0aGlzLmhhc0xpc3RlbmVycygpO1xuICAgICAgY29uc3QgZmV0Y2hPbk1vdW50ID0gIW1vdW50ZWQgJiYgc2hvdWxkRmV0Y2hPbk1vdW50KHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IGZldGNoT3B0aW9uYWxseSA9IG1vdW50ZWQgJiYgc2hvdWxkRmV0Y2hPcHRpb25hbGx5KHF1ZXJ5LCBwcmV2UXVlcnksIG9wdGlvbnMsIHByZXZPcHRpb25zKTtcbiAgICAgIGlmIChmZXRjaE9uTW91bnQgfHwgZmV0Y2hPcHRpb25hbGx5KSB7XG4gICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgIC4uLmZldGNoU3RhdGUoc3RhdGUuZGF0YSwgcXVlcnkub3B0aW9ucylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLl9vcHRpbWlzdGljUmVzdWx0cyA9PT0gXCJpc1Jlc3RvcmluZ1wiKSB7XG4gICAgICAgIG5ld1N0YXRlLmZldGNoU3RhdHVzID0gXCJpZGxlXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCB7IGVycm9yLCBlcnJvclVwZGF0ZWRBdCwgc3RhdHVzIH0gPSBuZXdTdGF0ZTtcbiAgICBkYXRhID0gbmV3U3RhdGUuZGF0YTtcbiAgICBsZXQgc2tpcFNlbGVjdCA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyRGF0YSAhPT0gdm9pZCAwICYmIGRhdGEgPT09IHZvaWQgMCAmJiBzdGF0dXMgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICBsZXQgcGxhY2Vob2xkZXJEYXRhO1xuICAgICAgaWYgKHByZXZSZXN1bHQ/LmlzUGxhY2Vob2xkZXJEYXRhICYmIG9wdGlvbnMucGxhY2Vob2xkZXJEYXRhID09PSBwcmV2UmVzdWx0T3B0aW9ucz8ucGxhY2Vob2xkZXJEYXRhKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyRGF0YSA9IHByZXZSZXN1bHQuZGF0YTtcbiAgICAgICAgc2tpcFNlbGVjdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwbGFjZWhvbGRlckRhdGEgPSB0eXBlb2Ygb3B0aW9ucy5wbGFjZWhvbGRlckRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMucGxhY2Vob2xkZXJEYXRhKFxuICAgICAgICAgIHRoaXMuI2xhc3RRdWVyeVdpdGhEZWZpbmVkRGF0YT8uc3RhdGUuZGF0YSxcbiAgICAgICAgICB0aGlzLiNsYXN0UXVlcnlXaXRoRGVmaW5lZERhdGFcbiAgICAgICAgKSA6IG9wdGlvbnMucGxhY2Vob2xkZXJEYXRhO1xuICAgICAgfVxuICAgICAgaWYgKHBsYWNlaG9sZGVyRGF0YSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN0YXR1cyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICBkYXRhID0gcmVwbGFjZURhdGEoXG4gICAgICAgICAgcHJldlJlc3VsdD8uZGF0YSxcbiAgICAgICAgICBwbGFjZWhvbGRlckRhdGEsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpc1BsYWNlaG9sZGVyRGF0YSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNlbGVjdCAmJiBkYXRhICE9PSB2b2lkIDAgJiYgIXNraXBTZWxlY3QpIHtcbiAgICAgIGlmIChwcmV2UmVzdWx0ICYmIGRhdGEgPT09IHByZXZSZXN1bHRTdGF0ZT8uZGF0YSAmJiBvcHRpb25zLnNlbGVjdCA9PT0gdGhpcy4jc2VsZWN0Rm4pIHtcbiAgICAgICAgZGF0YSA9IHRoaXMuI3NlbGVjdFJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0Rm4gPSBvcHRpb25zLnNlbGVjdDtcbiAgICAgICAgICBkYXRhID0gb3B0aW9ucy5zZWxlY3QoZGF0YSk7XG4gICAgICAgICAgZGF0YSA9IHJlcGxhY2VEYXRhKHByZXZSZXN1bHQ/LmRhdGEsIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgICAgIHRoaXMuI3NlbGVjdFJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0RXJyb3IgPSBudWxsO1xuICAgICAgICB9IGNhdGNoIChzZWxlY3RFcnJvcikge1xuICAgICAgICAgIHRoaXMuI3NlbGVjdEVycm9yID0gc2VsZWN0RXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuI3NlbGVjdEVycm9yKSB7XG4gICAgICBlcnJvciA9IHRoaXMuI3NlbGVjdEVycm9yO1xuICAgICAgZGF0YSA9IHRoaXMuI3NlbGVjdFJlc3VsdDtcbiAgICAgIGVycm9yVXBkYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXR1cyA9IFwiZXJyb3JcIjtcbiAgICB9XG4gICAgY29uc3QgaXNGZXRjaGluZyA9IG5ld1N0YXRlLmZldGNoU3RhdHVzID09PSBcImZldGNoaW5nXCI7XG4gICAgY29uc3QgaXNQZW5kaW5nID0gc3RhdHVzID09PSBcInBlbmRpbmdcIjtcbiAgICBjb25zdCBpc0Vycm9yID0gc3RhdHVzID09PSBcImVycm9yXCI7XG4gICAgY29uc3QgaXNMb2FkaW5nID0gaXNQZW5kaW5nICYmIGlzRmV0Y2hpbmc7XG4gICAgY29uc3QgaGFzRGF0YSA9IGRhdGEgIT09IHZvaWQgMDtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzdGF0dXMsXG4gICAgICBmZXRjaFN0YXR1czogbmV3U3RhdGUuZmV0Y2hTdGF0dXMsXG4gICAgICBpc1BlbmRpbmcsXG4gICAgICBpc1N1Y2Nlc3M6IHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaXNJbml0aWFsTG9hZGluZzogaXNMb2FkaW5nLFxuICAgICAgaXNMb2FkaW5nLFxuICAgICAgZGF0YSxcbiAgICAgIGRhdGFVcGRhdGVkQXQ6IG5ld1N0YXRlLmRhdGFVcGRhdGVkQXQsXG4gICAgICBlcnJvcixcbiAgICAgIGVycm9yVXBkYXRlZEF0LFxuICAgICAgZmFpbHVy
25114ZUNvdW50OiBuZXdTdGF0ZS5mZXRjaEZhaWx1cmVDb3VudCxcbiAgICAgIGZhaWx1cmVSZWFzb246IG5ld1N0YXRlLmZldGNoRmFpbHVyZVJlYXNvbixcbiAgICAgIGVycm9yVXBkYXRlQ291bnQ6IG5ld1N0YXRlLmVycm9yVXBkYXRlQ291bnQsXG4gICAgICBpc0ZldGNoZWQ6IG5ld1N0YXRlLmRhdGFVcGRhdGVDb3VudCA+IDAgfHwgbmV3U3RhdGUuZXJyb3JVcGRhdGVDb3VudCA+IDAsXG4gICAgICBpc0ZldGNoZWRBZnRlck1vdW50OiBuZXdTdGF0ZS5kYXRhVXBkYXRlQ291bnQgPiBxdWVyeUluaXRpYWxTdGF0ZS5kYXRhVXBkYXRlQ291bnQgfHwgbmV3U3RhdGUuZXJyb3JVcGRhdGVDb3VudCA+IHF1ZXJ5SW5pdGlhbFN0YXRlLmVycm9yVXBkYXRlQ291bnQsXG4gICAgICBpc0ZldGNoaW5nLFxuICAgICAgaXNSZWZldGNoaW5nOiBpc0ZldGNoaW5nICYmICFpc1BlbmRpbmcsXG4gICAgICBpc0xvYWRpbmdFcnJvcjogaXNFcnJvciAmJiAhaGFzRGF0YSxcbiAgICAgIGlzUGF1c2VkOiBuZXdTdGF0ZS5mZXRjaFN0YXR1cyA9PT0gXCJwYXVzZWRcIixcbiAgICAgIGlzUGxhY2Vob2xkZXJEYXRhLFxuICAgICAgaXNSZWZldGNoRXJyb3I6IGlzRXJyb3IgJiYgaGFzRGF0YSxcbiAgICAgIGlzU3RhbGU6IGlzU3RhbGUocXVlcnksIG9wdGlvbnMpLFxuICAgICAgcmVmZXRjaDogdGhpcy5yZWZldGNoLFxuICAgICAgcHJvbWlzZTogdGhpcy4jY3VycmVudFRoZW5hYmxlLFxuICAgICAgaXNFbmFibGVkOiByZXNvbHZlRW5hYmxlZChvcHRpb25zLmVuYWJsZWQsIHF1ZXJ5KSAhPT0gZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0IG5leHRSZXN1bHQgPSByZXN1bHQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlcikge1xuICAgICAgY29uc3QgZmluYWxpemVUaGVuYWJsZUlmUG9zc2libGUgPSAodGhlbmFibGUpID0+IHtcbiAgICAgICAgaWYgKG5leHRSZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICB0aGVuYWJsZS5yZWplY3QobmV4dFJlc3VsdC5lcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAobmV4dFJlc3VsdC5kYXRhICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB0aGVuYWJsZS5yZXNvbHZlKG5leHRSZXN1bHQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCByZWNyZWF0ZVRoZW5hYmxlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy4jY3VycmVudFRoZW5hYmxlID0gbmV4dFJlc3VsdC5wcm9taXNlID0gcGVuZGluZ1RoZW5hYmxlKCk7XG4gICAgICAgIGZpbmFsaXplVGhlbmFibGVJZlBvc3NpYmxlKHBlbmRpbmcpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHByZXZUaGVuYWJsZSA9IHRoaXMuI2N1cnJlbnRUaGVuYWJsZTtcbiAgICAgIHN3aXRjaCAocHJldlRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgICAgIGlmIChxdWVyeS5xdWVyeUhhc2ggPT09IHByZXZRdWVyeS5xdWVyeUhhc2gpIHtcbiAgICAgICAgICAgIGZpbmFsaXplVGhlbmFibGVJZlBvc3NpYmxlKHByZXZUaGVuYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgaWYgKG5leHRSZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIgfHwgbmV4dFJlc3VsdC5kYXRhICE9PSBwcmV2VGhlbmFibGUudmFsdWUpIHtcbiAgICAgICAgICAgIHJlY3JlYXRlVGhlbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgIGlmIChuZXh0UmVzdWx0LnN0YXR1cyAhPT0gXCJlcnJvclwiIHx8IG5leHRSZXN1bHQuZXJyb3IgIT09IHByZXZUaGVuYWJsZS5yZWFzb24pIHtcbiAgICAgICAgICAgIHJlY3JlYXRlVGhlbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICB9XG4gIHVwZGF0ZVJlc3VsdCgpIHtcbiAgICBjb25zdCBwcmV2UmVzdWx0ID0gdGhpcy4jY3VycmVudFJlc3VsdDtcbiAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5jcmVhdGVSZXN1bHQodGhpcy4jY3VycmVudFF1ZXJ5LCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuI2N1cnJlbnRSZXN1bHRTdGF0ZSA9IHRoaXMuI2N1cnJlbnRRdWVyeS5zdGF0ZTtcbiAgICB0aGlzLiNjdXJyZW50UmVzdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodGhpcy4jY3VycmVudFJlc3VsdFN0YXRlLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgdGhpcy4jbGFzdFF1ZXJ5V2l0aERlZmluZWREYXRhID0gdGhpcy4jY3VycmVudFF1ZXJ5O1xuICAgIH1cbiAgICBpZiAoc2hhbGxvd0VxdWFsT2JqZWN0cyhuZXh0UmVzdWx0LCBwcmV2UmVzdWx0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjdXJyZW50UmVzdWx0ID0gbmV4dFJlc3VsdDtcbiAgICBjb25zdCBzaG91bGROb3RpZnlMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXByZXZSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IG5vdGlmeU9uQ2hhbmdlUHJvcHMgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgIGNvbnN0IG5vdGlmeU9uQ2hhbmdlUHJvcHNWYWx1ZSA9IHR5cGVvZiBub3RpZnlPbkNoYW5nZVByb3BzID09PSBcImZ1bmN0aW9uXCIgPyBub3RpZnlPbkNoYW5nZVByb3BzKCkgOiBub3RpZnlPbkNoYW5nZVByb3BzO1xuICAgICAgaWYgKG5vdGlmeU9uQ2hhbmdlUHJvcHNWYWx1ZSA9PT0gXCJhbGxcIiB8fCAhbm90aWZ5T25DaGFuZ2VQcm9wc1ZhbHVlICYmICF0aGlzLiN0cmFja2VkUHJvcHMuc2l6ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY2x1ZGVkUHJvcHMgPSBuZXcgU2V0KFxuICAgICAgICBub3RpZnlPbkNoYW5nZVByb3BzVmFsdWUgPz8gdGhpcy4jdHJhY2tlZFByb3BzXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgICAgaW5jbHVkZWRQcm9wcy5hZGQoXCJlcnJvclwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybi
25114BPYmplY3Qua2V5cyh0aGlzLiNjdXJyZW50UmVzdWx0KS5zb21lKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLiNjdXJyZW50UmVzdWx0W3R5cGVkS2V5XSAhPT0gcHJldlJlc3VsdFt0eXBlZEtleV07XG4gICAgICAgIHJldHVybiBjaGFuZ2VkICYmIGluY2x1ZGVkUHJvcHMuaGFzKHR5cGVkS2V5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy4jbm90aWZ5KHsgbGlzdGVuZXJzOiBzaG91bGROb3RpZnlMaXN0ZW5lcnMoKSB9KTtcbiAgfVxuICAjdXBkYXRlUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLiNjbGllbnQuZ2V0UXVlcnlDYWNoZSgpLmJ1aWxkKHRoaXMuI2NsaWVudCwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAocXVlcnkgPT09IHRoaXMuI2N1cnJlbnRRdWVyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2UXVlcnkgPSB0aGlzLiNjdXJyZW50UXVlcnk7XG4gICAgdGhpcy4jY3VycmVudFF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy4jY3VycmVudFF1ZXJ5SW5pdGlhbFN0YXRlID0gcXVlcnkuc3RhdGU7XG4gICAgaWYgKHRoaXMuaGFzTGlzdGVuZXJzKCkpIHtcbiAgICAgIHByZXZRdWVyeT8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyk7XG4gICAgICBxdWVyeS5hZGRPYnNlcnZlcih0aGlzKTtcbiAgICB9XG4gIH1cbiAgb25RdWVyeVVwZGF0ZSgpIHtcbiAgICB0aGlzLnVwZGF0ZVJlc3VsdCgpO1xuICAgIGlmICh0aGlzLmhhc0xpc3RlbmVycygpKSB7XG4gICAgICB0aGlzLiN1cGRhdGVUaW1lcnMoKTtcbiAgICB9XG4gIH1cbiAgI25vdGlmeShub3RpZnlPcHRpb25zKSB7XG4gICAgbm90aWZ5TWFuYWdlci5iYXRjaCgoKSA9PiB7XG4gICAgICBpZiAobm90aWZ5T3B0aW9ucy5saXN0ZW5lcnMpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lcih0aGlzLiNjdXJyZW50UmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLiNjbGllbnQuZ2V0UXVlcnlDYWNoZSgpLm5vdGlmeSh7XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiNjdXJyZW50UXVlcnksXG4gICAgICAgIHR5cGU6IFwib2JzZXJ2ZXJSZXN1bHRzVXBkYXRlZFwiXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNob3VsZExvYWRPbk1vdW50KHF1ZXJ5LCBvcHRpb25zKSB7XG4gIHJldHVybiByZXNvbHZlRW5hYmxlZChvcHRpb25zLmVuYWJsZWQsIHF1ZXJ5KSAhPT0gZmFsc2UgJiYgcXVlcnkuc3RhdGUuZGF0YSA9PT0gdm9pZCAwICYmICEocXVlcnkuc3RhdGUuc3RhdHVzID09PSBcImVycm9yXCIgJiYgb3B0aW9ucy5yZXRyeU9uTW91bnQgPT09IGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNob3VsZEZldGNoT25Nb3VudChxdWVyeSwgb3B0aW9ucykge1xuICByZXR1cm4gc2hvdWxkTG9hZE9uTW91bnQocXVlcnksIG9wdGlvbnMpIHx8IHF1ZXJ5LnN0YXRlLmRhdGEgIT09IHZvaWQgMCAmJiBzaG91bGRGZXRjaE9uKHF1ZXJ5LCBvcHRpb25zLCBvcHRpb25zLnJlZmV0Y2hPbk1vdW50KTtcbn1cbmZ1bmN0aW9uIHNob3VsZEZldGNoT24ocXVlcnksIG9wdGlvbnMsIGZpZWxkKSB7XG4gIGlmIChyZXNvbHZlRW5hYmxlZChvcHRpb25zLmVuYWJsZWQsIHF1ZXJ5KSAhPT0gZmFsc2UgJiYgcmVzb2x2ZVN0YWxlVGltZShvcHRpb25zLnN0YWxlVGltZSwgcXVlcnkpICE9PSBcInN0YXRpY1wiKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZmllbGQgPT09IFwiZnVuY3Rpb25cIiA/IGZpZWxkKHF1ZXJ5KSA6IGZpZWxkO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gXCJhbHdheXNcIiB8fCB2YWx1ZSAhPT0gZmFsc2UgJiYgaXNTdGFsZShxdWVyeSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkRmV0Y2hPcHRpb25hbGx5KHF1ZXJ5LCBwcmV2UXVlcnksIG9wdGlvbnMsIHByZXZPcHRpb25zKSB7XG4gIHJldHVybiAocXVlcnkgIT09IHByZXZRdWVyeSB8fCByZXNvbHZlRW5hYmxlZChwcmV2T3B0aW9ucy5lbmFibGVkLCBxdWVyeSkgPT09IGZhbHNlKSAmJiAoIW9wdGlvbnMuc3VzcGVuc2UgfHwgcXVlcnkuc3RhdGUuc3RhdHVzICE9PSBcImVycm9yXCIpICYmIGlzU3RhbGUocXVlcnksIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaXNTdGFsZShxdWVyeSwgb3B0aW9ucykge1xuICByZXR1cm4gcmVzb2x2ZUVuYWJsZWQob3B0aW9ucy5lbmFibGVkLCBxdWVyeSkgIT09IGZhbHNlICYmIHF1ZXJ5LmlzU3RhbGVCeVRpbWUocmVzb2x2ZVN0YWxlVGltZShvcHRpb25zLnN0YWxlVGltZSwgcXVlcnkpKTtcbn1cbmZ1bmN0aW9uIHNob3VsZEFzc2lnbk9ic2VydmVyQ3VycmVudFByb3BlcnRpZXMob2JzZXJ2ZXIsIG9wdGltaXN0aWNSZXN1bHQpIHtcbiAgaWYgKCFzaGFsbG93RXF1YWxPYmplY3RzKG9ic2VydmVyLmdldEN1cnJlbnRSZXN1bHQoKSwgb3B0aW1pc3RpY1Jlc3VsdCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQge1xuICBRdWVyeU9ic2VydmVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlPYnNlcnZlci5qcy5tYXAiLCIvLyBzcmMvaW5maW5pdGVRdWVyeUJlaGF2aW9yLnRzXG5pbXBvcnQgeyBhZGRUb0VuZCwgYWRkVG9TdGFydCwgZW5zdXJlUXVlcnlGbiB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5mdW5jdGlvbiBpbmZpbml0ZVF1ZXJ5QmVoYXZpb3IocGFnZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBvbkZldGNoOiAoY29udGV4dCwgcXVlcnkpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBjb250ZXh0LmZldGNoT3B0aW9ucz8ubWV0YT8uZmV0Y2hNb3JlPy5kaXJlY3Rpb247XG4gICAgICBjb25zdCBvbGRQYWdlcyA9IGNvbnRleHQuc3RhdGUuZGF0YT8ucGFnZXMgfHwgW107XG4gICAgICBjb25zdCBvbGRQYWdlUGFyYW1zID0gY29udGV4dC5zdGF0ZS5kYXRhPy5wYWdlUGFyYW1zIHx8IFtdO1xuICAgICAgbGV0IHJlc3VsdCA9IHsgcGFnZXM6IFtdLCBwYWdlUGFyYW1zOiBbXSB9O1xuICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMDtcbiAgICAgIGNvbnN0IGZldGNoRm4gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgYWRkU2lnbmFsUHJvcGVydHkgPSAob2JqZWN0KSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgXCJzaWduYWxcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udGV4dC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgI
25114H0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuc2lnbmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBxdWVyeUZuID0gZW5zdXJlUXVlcnlGbihjb250ZXh0Lm9wdGlvbnMsIGNvbnRleHQuZmV0Y2hPcHRpb25zKTtcbiAgICAgICAgY29uc3QgZmV0Y2hQYWdlID0gYXN5bmMgKGRhdGEsIHBhcmFtLCBwcmV2aW91cykgPT4ge1xuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCAmJiBkYXRhLnBhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3JlYXRlUXVlcnlGbkNvbnRleHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUZuQ29udGV4dDIgPSB7XG4gICAgICAgICAgICAgIGNsaWVudDogY29udGV4dC5jbGllbnQsXG4gICAgICAgICAgICAgIHF1ZXJ5S2V5OiBjb250ZXh0LnF1ZXJ5S2V5LFxuICAgICAgICAgICAgICBwYWdlUGFyYW06IHBhcmFtLFxuICAgICAgICAgICAgICBkaXJlY3Rpb246IHByZXZpb3VzID8gXCJiYWNrd2FyZFwiIDogXCJmb3J3YXJkXCIsXG4gICAgICAgICAgICAgIG1ldGE6IGNvbnRleHQub3B0aW9ucy5tZXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWRkU2lnbmFsUHJvcGVydHkocXVlcnlGbkNvbnRleHQyKTtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeUZuQ29udGV4dDI7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBxdWVyeUZuQ29udGV4dCA9IGNyZWF0ZVF1ZXJ5Rm5Db250ZXh0KCk7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHF1ZXJ5Rm4ocXVlcnlGbkNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IHsgbWF4UGFnZXMgfSA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgICBjb25zdCBhZGRUbyA9IHByZXZpb3VzID8gYWRkVG9TdGFydCA6IGFkZFRvRW5kO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWdlczogYWRkVG8oZGF0YS5wYWdlcywgcGFnZSwgbWF4UGFnZXMpLFxuICAgICAgICAgICAgcGFnZVBhcmFtczogYWRkVG8oZGF0YS5wYWdlUGFyYW1zLCBwYXJhbSwgbWF4UGFnZXMpXG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmJiBvbGRQYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiO1xuICAgICAgICAgIGNvbnN0IHBhZ2VQYXJhbUZuID0gcHJldmlvdXMgPyBnZXRQcmV2aW91c1BhZ2VQYXJhbSA6IGdldE5leHRQYWdlUGFyYW07XG4gICAgICAgICAgY29uc3Qgb2xkRGF0YSA9IHtcbiAgICAgICAgICAgIHBhZ2VzOiBvbGRQYWdlcyxcbiAgICAgICAgICAgIHBhZ2VQYXJhbXM6IG9sZFBhZ2VQYXJhbXNcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHBhcmFtID0gcGFnZVBhcmFtRm4ob3B0aW9ucywgb2xkRGF0YSk7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmV0Y2hQYWdlKG9sZERhdGEsIHBhcmFtLCBwcmV2aW91cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nUGFnZXMgPSBwYWdlcyA/PyBvbGRQYWdlcy5sZW5ndGg7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW0gPSBjdXJyZW50UGFnZSA9PT0gMCA/IG9sZFBhZ2VQYXJhbXNbMF0gPz8gb3B0aW9ucy5pbml0aWFsUGFnZVBhcmFtIDogZ2V0TmV4dFBhZ2VQYXJhbShvcHRpb25zLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlID4gMCAmJiBwYXJhbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmV0Y2hQYWdlKHJlc3VsdCwgcGFyYW0pO1xuICAgICAgICAgICAgY3VycmVudFBhZ2UrKztcbiAgICAgICAgICB9IHdoaWxlIChjdXJyZW50UGFnZSA8IHJlbWFpbmluZ1BhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIGlmIChjb250ZXh0Lm9wdGlvbnMucGVyc2lzdGVyKSB7XG4gICAgICAgIGNvbnRleHQuZmV0Y2hGbiA9ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5vcHRpb25zLnBlcnNpc3Rlcj8uKFxuICAgICAgICAgICAgZmV0Y2hGbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xpZW50OiBjb250ZXh0LmNsaWVudCxcbiAgICAgICAgICAgICAgcXVlcnlLZXk6IGNvbnRleHQucXVlcnlLZXksXG4gICAgICAgICAgICAgIG1ldGE6IGNvbnRleHQub3B0aW9ucy5tZXRhLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRleHQuc2lnbmFsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcXVlcnlcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5mZXRjaEZuID0gZmV0Y2hGbjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBnZXROZXh0UGFnZVBhcmFtKG9wdGlvbnMsIHsgcGFnZXMsIHBhZ2VQYXJhbXMgfSkge1xuICBjb25zdCBsYXN0SW5kZXggPSBwYWdlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gcGFnZXMubGVuZ3RoID4gMCA/IG9wdGlvbnMuZ2V0TmV4dFBhZ2VQYXJhbShcbiAgICBwYWdlc1tsYXN0SW5kZXhdLFxuICAgIHBhZ2VzLFxuICAgIHBhZ2VQYXJhbXNbbGFzdEluZGV4XSxcbiAgICBwYWdlUGFyYW1zXG4gICkgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBnZXRQcmV2aW91c1BhZ2VQYXJhbShvcHRpb25zLCB7IHBhZ2VzLCBwYWdlUGFyYW1zIH0pIHtcbiAgcmV0dXJuIHBhZ2VzLmxlbmd0aCA+IDAgPyBvcHRpb25zLmdldFByZXZpb3VzUGFnZVBhcmFtPy4ocGFnZXNbMF0sIHBhZ2VzLCBwYWdlUGFyYW1zWzBdLCBwYWdlUGFyYW1zKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGhhc05leHRQYWdlKG9wdGlvbnMsIGRhdGEpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybi
25114BnZXROZXh0UGFnZVBhcmFtKG9wdGlvbnMsIGRhdGEpICE9IG51bGw7XG59XG5mdW5jdGlvbiBoYXNQcmV2aW91c1BhZ2Uob3B0aW9ucywgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIW9wdGlvbnMuZ2V0UHJldmlvdXNQYWdlUGFyYW0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGdldFByZXZpb3VzUGFnZVBhcmFtKG9wdGlvbnMsIGRhdGEpICE9IG51bGw7XG59XG5leHBvcnQge1xuICBoYXNOZXh0UGFnZSxcbiAgaGFzUHJldmlvdXNQYWdlLFxuICBpbmZpbml0ZVF1ZXJ5QmVoYXZpb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmZpbml0ZVF1ZXJ5QmVoYXZpb3IuanMubWFwIiwiLy8gc3JjL211dGF0aW9uLnRzXG5pbXBvcnQgeyBub3RpZnlNYW5hZ2VyIH0gZnJvbSBcIi4vbm90aWZ5TWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgUmVtb3ZhYmxlIH0gZnJvbSBcIi4vcmVtb3ZhYmxlLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXRyeWVyIH0gZnJvbSBcIi4vcmV0cnllci5qc1wiO1xudmFyIE11dGF0aW9uID0gY2xhc3MgZXh0ZW5kcyBSZW1vdmFibGUge1xuICAjY2xpZW50O1xuICAjb2JzZXJ2ZXJzO1xuICAjbXV0YXRpb25DYWNoZTtcbiAgI3JldHJ5ZXI7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jY2xpZW50ID0gY29uZmlnLmNsaWVudDtcbiAgICB0aGlzLm11dGF0aW9uSWQgPSBjb25maWcubXV0YXRpb25JZDtcbiAgICB0aGlzLiNtdXRhdGlvbkNhY2hlID0gY29uZmlnLm11dGF0aW9uQ2FjaGU7XG4gICAgdGhpcy4jb2JzZXJ2ZXJzID0gW107XG4gICAgdGhpcy5zdGF0ZSA9IGNvbmZpZy5zdGF0ZSB8fCBnZXREZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLnNldE9wdGlvbnMoY29uZmlnLm9wdGlvbnMpO1xuICAgIHRoaXMuc2NoZWR1bGVHYygpO1xuICB9XG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy51cGRhdGVHY1RpbWUodGhpcy5vcHRpb25zLmdjVGltZSk7XG4gIH1cbiAgZ2V0IG1ldGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhO1xuICB9XG4gIGFkZE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgaWYgKCF0aGlzLiNvYnNlcnZlcnMuaW5jbHVkZXMob2JzZXJ2ZXIpKSB7XG4gICAgICB0aGlzLiNvYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgICB0aGlzLmNsZWFyR2NUaW1lb3V0KCk7XG4gICAgICB0aGlzLiNtdXRhdGlvbkNhY2hlLm5vdGlmeSh7XG4gICAgICAgIHR5cGU6IFwib2JzZXJ2ZXJBZGRlZFwiLFxuICAgICAgICBtdXRhdGlvbjogdGhpcyxcbiAgICAgICAgb2JzZXJ2ZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZW1vdmVPYnNlcnZlcihvYnNlcnZlcikge1xuICAgIHRoaXMuI29ic2VydmVycyA9IHRoaXMuI29ic2VydmVycy5maWx0ZXIoKHgpID0+IHggIT09IG9ic2VydmVyKTtcbiAgICB0aGlzLnNjaGVkdWxlR2MoKTtcbiAgICB0aGlzLiNtdXRhdGlvbkNhY2hlLm5vdGlmeSh7XG4gICAgICB0eXBlOiBcIm9ic2VydmVyUmVtb3ZlZFwiLFxuICAgICAgbXV0YXRpb246IHRoaXMsXG4gICAgICBvYnNlcnZlclxuICAgIH0pO1xuICB9XG4gIG9wdGlvbmFsUmVtb3ZlKCkge1xuICAgIGlmICghdGhpcy4jb2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RhdHVzID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICB0aGlzLnNjaGVkdWxlR2MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI211dGF0aW9uQ2FjaGUucmVtb3ZlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb250aW51ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmV0cnllcj8uY29udGludWUoKSA/PyAvLyBjb250aW51aW5nIGEgbXV0YXRpb24gYXNzdW1lcyB0aGF0IHZhcmlhYmxlcyBhcmUgc2V0LCBtdXRhdGlvbiBtdXN0IGhhdmUgYmVlbiBkZWh5ZHJhdGVkIGJlZm9yZVxuICAgIHRoaXMuZXhlY3V0ZSh0aGlzLnN0YXRlLnZhcmlhYmxlcyk7XG4gIH1cbiAgYXN5bmMgZXhlY3V0ZSh2YXJpYWJsZXMpIHtcbiAgICBjb25zdCBvbkNvbnRpbnVlID0gKCkgPT4ge1xuICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcImNvbnRpbnVlXCIgfSk7XG4gICAgfTtcbiAgICBjb25zdCBtdXRhdGlvbkZuQ29udGV4dCA9IHtcbiAgICAgIGNsaWVudDogdGhpcy4jY2xpZW50LFxuICAgICAgbWV0YTogdGhpcy5vcHRpb25zLm1ldGEsXG4gICAgICBtdXRhdGlvbktleTogdGhpcy5vcHRpb25zLm11dGF0aW9uS2V5XG4gICAgfTtcbiAgICB0aGlzLiNyZXRyeWVyID0gY3JlYXRlUmV0cnllcih7XG4gICAgICBmbjogKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdXRhdGlvbkZuKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIG11dGF0aW9uRm4gZm91bmRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubXV0YXRpb25Gbih2YXJpYWJsZXMsIG11dGF0aW9uRm5Db250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWw6IChmYWlsdXJlQ291bnQsIGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoKHsgdHlwZTogXCJmYWlsZWRcIiwgZmFpbHVyZUNvdW50LCBlcnJvciB9KTtcbiAgICAgIH0sXG4gICAgICBvblBhdXNlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoKHsgdHlwZTogXCJwYXVzZVwiIH0pO1xuICAgICAgfSxcbiAgICAgIG9uQ29udGludWUsXG4gICAgICByZXRyeTogdGhpcy5vcHRpb25zLnJldHJ5ID8/IDAsXG4gICAgICByZXRyeURlbGF5OiB0aGlzLm9wdGlvbnMucmV0cnlEZWxheSxcbiAgICAgIG5ldHdvcmtNb2RlOiB0aGlzLm9wdGlvbnMubmV0d29ya01vZGUsXG4gICAgICBjYW5SdW46ICgpID0+IHRoaXMuI211dGF0aW9uQ2FjaGUuY2FuUnVuKHRoaXMpXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSB0aGlzLnN0YXRlLnN0YXR1cyA9PT0gXCJwZW5kaW5nXCI7XG4gICAgY29uc3QgaXNQYXVzZWQgPSAhdGhpcy4jcmV0cnllci5jYW5TdGFydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVzdG9yZWQpIHtcbiAgICAgICAgb25Db250aW51ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2goeyB0eXBlOiBcInBlbmRpbmdcIiwgdmFyaWFibGVzLCBpc1BhdXNlZCB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy4jbXV0YXRpb25DYWNoZS5jb25maWcub25NdXRhdGU/LihcbiAgICAgICAgICB2Y
25114XJpYWJsZXMsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBtdXRhdGlvbkZuQ29udGV4dFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5vcHRpb25zLm9uTXV0YXRlPy4oXG4gICAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGlmIChjb250ZXh0ICE9PSB0aGlzLnN0YXRlLmNvbnRleHQpIHtcbiAgICAgICAgICB0aGlzLiNkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgICBpc1BhdXNlZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy4jcmV0cnllci5zdGFydCgpO1xuICAgICAgYXdhaXQgdGhpcy4jbXV0YXRpb25DYWNoZS5jb25maWcub25TdWNjZXNzPy4oXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICB0aGlzLFxuICAgICAgICBtdXRhdGlvbkZuQ29udGV4dFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5vblN1Y2Nlc3M/LihcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy4jbXV0YXRpb25DYWNoZS5jb25maWcub25TZXR0bGVkPy4oXG4gICAgICAgIGRhdGEsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuc3RhdGUudmFyaWFibGVzLFxuICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLm9uU2V0dGxlZD8uKFxuICAgICAgICBkYXRhLFxuICAgICAgICBudWxsLFxuICAgICAgICB2Y
25114XJpYWJsZXMsXG4gICAgICAgIHRoaXMuc3RhdGUuY29udGV4dCxcbiAgICAgICAgbXV0YXRpb25GbkNvbnRleHRcbiAgICAgICk7XG4gICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwic3VjY2Vzc1wiLCBkYXRhIH0pO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI211dGF0aW9uQ2FjaGUuY29uZmlnLm9uRXJyb3I/LihcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbXV0YXRpb25GbkNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLm9uRXJyb3I/LihcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgICAgIG11dGF0aW9uRm5Db250ZXh0XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuI211dGF0aW9uQ2FjaGUuY29uZmlnLm9uU2V0dGxlZD8uKFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB0aGlzLnN0YXRlLnZhcmlhYmxlcyxcbiAgICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBtdXRhdGlvbkZuQ29udGV4dFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMub25TZXR0bGVkPy4oXG4gICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgICB0aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAgICAgbXV0YXRpb25GbkNvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLiNkaXNwYXRjaCh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuI211dGF0aW9uQ2FjaGUucnVuTmV4dCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgI2Rpc3BhdGNoKGFjdGlvbikge1xuICAgIGNvbnN0IHJlZHVjZXIgPSAoc3RhdGUpID0+IHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGZhaWx1cmVDb3VudDogYWN0aW9uLmZhaWx1cmVDb3VudCxcbiAgICAgICAgICAgIGZhaWx1cmVSZWFzb246IGFjdGlvbi5lcnJvclxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJwYXVzZVwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGlzUGF1c2VkOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImNvbnRpbnVlXCI6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgaXNQYXVzZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcInBlbmRpbmdcIjpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBjb250ZXh0OiBhY3Rpb24uY29udGV4dCxcbiAgICAgICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgIGZhaWx1cmVDb3VudDogMCxcbiAgICAgICAgICAgIGZhaWx1cmVSZWFzb246IG51bGwsXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIGlzUGF1c2VkOiBhY3Rpb24uaXNQYXVzZWQsXG4gICAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgICAgICAgdmFyaWFibGVzOiBhY3Rpb24udmFyaWFibGVzLFxuICAgICAgICAgICAgc3VibWl0dGVkQXQ6IERhdGUubm93KClcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFwic3VjY2Vzc1wiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGRhdGE6IGFjdGlvbi5kYXRhLFxuICAgICAgICAgICAgZmFpbHVyZUNvdW50OiAwLFxuICAgICAgICAgICAgZmFpbHVyZVJlYXNvbjogbnVsbCxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgIGlzUGF1c2VkOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgIGVycm9yOiBhY3Rpb24uZXJyb3IsXG4gICAgICAgICAgICBmYWlsdXJlQ291bnQ6IHN0YXRlLmZhaWx1cmVDb3VudCArIDEsXG4gICAgICAgICAgICBmYWlsdXJlUmVhc29uOiBhY3Rpb24uZXJyb3IsXG4gICAgICAgICAgICBpc1BhdXNlZDogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gcmVkdWNlcih0aGlzLnN0YXRlKTtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuI29ic2VydmVycy5mb3JFYWNoKChvYnNlcnZlcikgPT4ge1xuICAgICAgICBvYnNlcnZlci5vbk11dGF0aW9uVXBkYXRlKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuI211dGF0aW9uQ2FjaGUubm90aWZ5KHtcbiAgICAgICAgbXV0YXRpb246IHRoaXMsXG4gICAgICAgIHR5cGU6IFwidXBkYXRlZFwiLFxuICAgICAgICBhY3Rpb25cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFN0YXRl
25114KCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRleHQ6IHZvaWQgMCxcbiAgICBkYXRhOiB2b2lkIDAsXG4gICAgZXJyb3I6IG51bGwsXG4gICAgZmFpbHVyZUNvdW50OiAwLFxuICAgIGZhaWx1cmVSZWFzb246IG51bGwsXG4gICAgaXNQYXVzZWQ6IGZhbHNlLFxuICAgIHN0YXR1czogXCJpZGxlXCIsXG4gICAgdmFyaWFibGVzOiB2b2lkIDAsXG4gICAgc3VibWl0dGVkQXQ6IDBcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIE11dGF0aW9uLFxuICBnZXREZWZhdWx0U3RhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdXRhdGlvbi5qcy5tYXAiLCIvLyBzcmMvbXV0YXRpb25DYWNoZS50c1xuaW1wb3J0IHsgbm90aWZ5TWFuYWdlciB9IGZyb20gXCIuL25vdGlmeU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IE11dGF0aW9uIH0gZnJvbSBcIi4vbXV0YXRpb24uanNcIjtcbmltcG9ydCB7IG1hdGNoTXV0YXRpb24sIG5vb3AgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU3Vic2NyaWJhYmxlIH0gZnJvbSBcIi4vc3Vic2NyaWJhYmxlLmpzXCI7XG52YXIgTXV0YXRpb25DYWNoZSA9IGNsYXNzIGV4dGVuZHMgU3Vic2NyaWJhYmxlIHtcbiAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuI211dGF0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgdGhpcy4jc2NvcGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLiNtdXRhdGlvbklkID0gMDtcbiAgfVxuICAjbXV0YXRpb25zO1xuICAjc2NvcGVzO1xuICAjbXV0YXRpb25JZDtcbiAgYnVpbGQoY2xpZW50LCBvcHRpb25zLCBzdGF0ZSkge1xuICAgIGNvbnN0IG11dGF0aW9uID0gbmV3IE11dGF0aW9uKHtcbiAgICAgIGNsaWVudCxcbiAgICAgIG11dGF0aW9uQ2FjaGU6IHRoaXMsXG4gICAgICBtdXRhdGlvbklkOiArK3RoaXMuI211dGF0aW9uSWQsXG4gICAgICBvcHRpb25zOiBjbGllbnQuZGVmYXVsdE11dGF0aW9uT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgIHN0YXRlXG4gICAgfSk7XG4gICAgdGhpcy5hZGQobXV0YXRpb24pO1xuICAgIHJldHVybiBtdXRhdGlvbjtcbiAgfVxuICBhZGQobXV0YXRpb24pIHtcbiAgICB0aGlzLiNtdXRhdGlvbnMuYWRkKG11dGF0aW9uKTtcbiAgICBjb25zdCBzY29wZSA9IHNjb3BlRm9yKG11dGF0aW9uKTtcbiAgICBpZiAodHlwZW9mIHNjb3BlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBzY29wZWRNdXRhdGlvbnMgPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKTtcbiAgICAgIGlmIChzY29wZWRNdXRhdGlvbnMpIHtcbiAgICAgICAgc2NvcGVkTXV0YXRpb25zLnB1c2gobXV0YXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jc2NvcGVzLnNldChzY29wZSwgW211dGF0aW9uXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm90aWZ5KHsgdHlwZTogXCJhZGRlZFwiLCBtdXRhdGlvbiB9KTtcbiAgfVxuICByZW1vdmUobXV0YXRpb24pIHtcbiAgICBpZiAodGhpcy4jbXV0YXRpb25zLmRlbGV0ZShtdXRhdGlvbikpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gc2NvcGVGb3IobXV0YXRpb24pO1xuICAgICAgaWYgKHR5cGVvZiBzY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBzY29wZWRNdXRhdGlvbnMgPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKTtcbiAgICAgICAgaWYgKHNjb3BlZE11dGF0aW9ucykge1xuICAgICAgICAgIGlmIChzY29wZWRNdXRhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzY29wZWRNdXRhdGlvbnMuaW5kZXhPZihtdXRhdGlvbik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHNjb3BlZE11dGF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGVkTXV0YXRpb25zWzBdID09PSBtdXRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy4jc2NvcGVzLmRlbGV0ZShzY29wZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm90aWZ5KHsgdHlwZTogXCJyZW1vdmVkXCIsIG11dGF0aW9uIH0pO1xuICB9XG4gIGNhblJ1bihtdXRhdGlvbikge1xuICAgIGNvbnN0IHNjb3BlID0gc2NvcGVGb3IobXV0YXRpb24pO1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IG11dGF0aW9uc1dpdGhTYW1lU2NvcGUgPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKTtcbiAgICAgIGNvbnN0IGZpcnN0UGVuZGluZ011dGF0aW9uID0gbXV0YXRpb25zV2l0aFNhbWVTY29wZT8uZmluZChcbiAgICAgICAgKG0pID0+IG0uc3RhdGUuc3RhdHVzID09PSBcInBlbmRpbmdcIlxuICAgICAgKTtcbiAgICAgIHJldHVybiAhZmlyc3RQZW5kaW5nTXV0YXRpb24gfHwgZmlyc3RQZW5kaW5nTXV0YXRpb24gPT09IG11dGF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcnVuTmV4dChtdXRhdGlvbikge1xuICAgIGNvbnN0IHNjb3BlID0gc2NvcGVGb3IobXV0YXRpb24pO1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGZvdW5kTXV0YXRpb24gPSB0aGlzLiNzY29wZXMuZ2V0KHNjb3BlKT8uZmluZCgobSkgPT4gbSAhPT0gbXV0YXRpb24gJiYgbS5zdGF0ZS5pc1BhdXNlZCk7XG4gICAgICByZXR1cm4gZm91bmRNdXRhdGlvbj8uY29udGludWUoKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgfVxuICBjbGVhcigpIHtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuI211dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm5vdGlmeSh7IHR5cGU6IFwicmVtb3ZlZFwiLCBtdXRhdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jbXV0YXRpb25zLmNsZWFyKCk7XG4gICAgICB0aGlzLiNzY29wZXMuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRBbGwoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jbXV0YXRpb25zKTtcbiAgfVxuICBmaW5kKGZpbHRlcnMpIHtcbiAgICBjb25zdCBkZWZhdWx0ZWRGaWx0ZXJzID0geyBleGFjdDogdHJ1ZSwgLi4uZmlsdGVycyB9O1xuICAgIHJldHVybi
25114B0aGlzLmdldEFsbCgpLmZpbmQoXG4gICAgICAobXV0YXRpb24pID0+IG1hdGNoTXV0YXRpb24oZGVmYXVsdGVkRmlsdGVycywgbXV0YXRpb24pXG4gICAgKTtcbiAgfVxuICBmaW5kQWxsKGZpbHRlcnMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEFsbCgpLmZpbHRlcigobXV0YXRpb24pID0+IG1hdGNoTXV0YXRpb24oZmlsdGVycywgbXV0YXRpb24pKTtcbiAgfVxuICBub3RpZnkoZXZlbnQpIHtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJlc3VtZVBhdXNlZE11dGF0aW9ucygpIHtcbiAgICBjb25zdCBwYXVzZWRNdXRhdGlvbnMgPSB0aGlzLmdldEFsbCgpLmZpbHRlcigoeCkgPT4geC5zdGF0ZS5pc1BhdXNlZCk7XG4gICAgcmV0dXJuIG5vdGlmeU1hbmFnZXIuYmF0Y2goXG4gICAgICAoKSA9PiBQcm9taXNlLmFsbChcbiAgICAgICAgcGF1c2VkTXV0YXRpb25zLm1hcCgobXV0YXRpb24pID0+IG11dGF0aW9uLmNvbnRpbnVlKCkuY2F0Y2gobm9vcCkpXG4gICAgICApXG4gICAgKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNjb3BlRm9yKG11dGF0aW9uKSB7XG4gIHJldHVybiBtdXRhdGlvbi5vcHRpb25zLnNjb3BlPy5pZDtcbn1cbmV4cG9ydCB7XG4gIE11dGF0aW9uQ2FjaGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdXRhdGlvbkNhY2hlLmpzLm1hcCIsIi8vIHNyYy9xdWVyeUNhY2hlLnRzXG5pbXBvcnQgeyBoYXNoUXVlcnlLZXlCeU9wdGlvbnMsIG1hdGNoUXVlcnkgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi9xdWVyeS5qc1wiO1xuaW1wb3J0IHsgbm90aWZ5TWFuYWdlciB9IGZyb20gXCIuL25vdGlmeU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL3N1YnNjcmliYWJsZS5qc1wiO1xudmFyIFF1ZXJ5Q2FjaGUgPSBjbGFzcyBleHRlbmRzIFN1YnNjcmliYWJsZSB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLiNxdWVyaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICAjcXVlcmllcztcbiAgYnVpbGQoY2xpZW50LCBvcHRpb25zLCBzdGF0ZSkge1xuICAgIGNvbnN0IHF1ZXJ5S2V5ID0gb3B0aW9ucy5xdWVyeUtleTtcbiAgICBjb25zdCBxdWVyeUhhc2ggPSBvcHRpb25zLnF1ZXJ5SGFzaCA/PyBoYXNoUXVlcnlLZXlCeU9wdGlvbnMocXVlcnlLZXksIG9wdGlvbnMpO1xuICAgIGxldCBxdWVyeSA9IHRoaXMuZ2V0KHF1ZXJ5SGFzaCk7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgcXVlcnkgPSBuZXcgUXVlcnkoe1xuICAgICAgICBjbGllbnQsXG4gICAgICAgIHF1ZXJ5S2V5LFxuICAgICAgICBxdWVyeUhhc2gsXG4gICAgICAgIG9wdGlvbnM6IGNsaWVudC5kZWZhdWx0UXVlcnlPcHRpb25zKG9wdGlvbnMpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZGVmYXVsdE9wdGlvbnM6IGNsaWVudC5nZXRRdWVyeURlZmF1bHRzKHF1ZXJ5S2V5KVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZChxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuICBhZGQocXVlcnkpIHtcbiAgICBpZiAoIXRoaXMuI3F1ZXJpZXMuaGFzKHF1ZXJ5LnF1ZXJ5SGFzaCkpIHtcbiAgICAgIHRoaXMuI3F1ZXJpZXMuc2V0KHF1ZXJ5LnF1ZXJ5SGFzaCwgcXVlcnkpO1xuICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICB0eXBlOiBcImFkZGVkXCIsXG4gICAgICAgIHF1ZXJ5XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlKHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlJbk1hcCA9IHRoaXMuI3F1ZXJpZXMuZ2V0KHF1ZXJ5LnF1ZXJ5SGFzaCk7XG4gICAgaWYgKHF1ZXJ5SW5NYXApIHtcbiAgICAgIHF1ZXJ5LmRlc3Ryb3koKTtcbiAgICAgIGlmIChxdWVyeUluTWFwID09PSBxdWVyeSkge1xuICAgICAgICB0aGlzLiNxdWVyaWVzLmRlbGV0ZShxdWVyeS5xdWVyeUhhc2gpO1xuICAgICAgfVxuICAgICAgdGhpcy5ub3RpZnkoeyB0eXBlOiBcInJlbW92ZWRcIiwgcXVlcnkgfSk7XG4gICAgfVxuICB9XG4gIGNsZWFyKCkge1xuICAgIG5vdGlmeU1hbmFnZXIuYmF0Y2goKCkgPT4ge1xuICAgICAgdGhpcy5nZXRBbGwoKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZShxdWVyeSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBnZXQocXVlcnlIYXNoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJpZXMuZ2V0KHF1ZXJ5SGFzaCk7XG4gIH1cbiAgZ2V0QWxsKCkge1xuICAgIHJldHVybiBbLi4udGhpcy4jcXVlcmllcy52YWx1ZXMoKV07XG4gIH1cbiAgZmluZChmaWx0ZXJzKSB7XG4gICAgY29uc3QgZGVmYXVsdGVkRmlsdGVycyA9IHsgZXhhY3Q6IHRydWUsIC4uLmZpbHRlcnMgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKS5maW5kKFxuICAgICAgKHF1ZXJ5KSA9PiBtYXRjaFF1ZXJ5KGRlZmF1bHRlZEZpbHRlcnMsIHF1ZXJ5KVxuICAgICk7XG4gIH1cbiAgZmluZEFsbChmaWx0ZXJzID0ge30pIHtcbiAgICBjb25zdCBxdWVyaWVzID0gdGhpcy5nZXRBbGwoKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZmlsdGVycykubGVuZ3RoID4gMCA/IHF1ZXJpZXMuZmlsdGVyKChxdWVyeSkgPT4gbWF0Y2hRdWVyeShmaWx0ZXJzLCBxdWVyeSkpIDogcXVlcmllcztcbiAgfVxuICBub3RpZnkoZXZlbnQpIHtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG9uRm9jdXMoKSB7XG4gICAgbm90aWZ5TWFuYWdlci5iYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmdldEFsbCgpLmZvckVhY2goKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHF1ZXJ5Lm9uRm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG9uT25saW5lKCkge1xuICAgIG5vdGlmeU1hbmFnZXIuYmF0Y2goKCkgPT4ge1xuICAgICAgdGhpcy5nZXRBbGwoKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeS5vbk9ubGluZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn07XG5leHBvcnQge1xuICBRdWVyeUNhY2hlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlDYWNoZS5qcy5tYXAiLCIvLyBzcmMvcXVlcnlDbGllbnQudHNcbmltcG9ydCB7XG4gIGZ1bmN0aW9uYWxVcGRhdGUsXG4gIGhhc2hL
25114ZXksXG4gIGhhc2hRdWVyeUtleUJ5T3B0aW9ucyxcbiAgbm9vcCxcbiAgcGFydGlhbE1hdGNoS2V5LFxuICByZXNvbHZlU3RhbGVUaW1lLFxuICBza2lwVG9rZW5cbn0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tIFwiLi9xdWVyeUNhY2hlLmpzXCI7XG5pbXBvcnQgeyBNdXRhdGlvbkNhY2hlIH0gZnJvbSBcIi4vbXV0YXRpb25DYWNoZS5qc1wiO1xuaW1wb3J0IHsgZm9jdXNNYW5hZ2VyIH0gZnJvbSBcIi4vZm9jdXNNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBvbmxpbmVNYW5hZ2VyIH0gZnJvbSBcIi4vb25saW5lTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgbm90aWZ5TWFuYWdlciB9IGZyb20gXCIuL25vdGlmeU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGluZmluaXRlUXVlcnlCZWhhdmlvciB9IGZyb20gXCIuL2luZmluaXRlUXVlcnlCZWhhdmlvci5qc1wiO1xudmFyIFF1ZXJ5Q2xpZW50ID0gY2xhc3Mge1xuICAjcXVlcnlDYWNoZTtcbiAgI211dGF0aW9uQ2FjaGU7XG4gICNkZWZhdWx0T3B0aW9ucztcbiAgI3F1ZXJ5RGVmYXVsdHM7XG4gICNtdXRhdGlvbkRlZmF1bHRzO1xuICAjbW91bnRDb3VudDtcbiAgI3Vuc3Vic2NyaWJlRm9jdXM7XG4gICN1bnN1YnNjcmliZU9ubGluZTtcbiAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICB0aGlzLiNxdWVyeUNhY2hlID0gY29uZmlnLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUoKTtcbiAgICB0aGlzLiNtdXRhdGlvbkNhY2hlID0gY29uZmlnLm11dGF0aW9uQ2FjaGUgfHwgbmV3IE11dGF0aW9uQ2FjaGUoKTtcbiAgICB0aGlzLiNkZWZhdWx0T3B0aW9ucyA9IGNvbmZpZy5kZWZhdWx0T3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLiNxdWVyeURlZmF1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLiNtdXRhdGlvbkRlZmF1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB0aGlzLiNtb3VudENvdW50ID0gMDtcbiAgfVxuICBtb3VudCgpIHtcbiAgICB0aGlzLiNtb3VudENvdW50Kys7XG4gICAgaWYgKHRoaXMuI21vdW50Q291bnQgIT09IDEpIHJldHVybjtcbiAgICB0aGlzLiN1bnN1YnNjcmliZUZvY3VzID0gZm9jdXNNYW5hZ2VyLnN1YnNjcmliZShhc3luYyAoZm9jdXNlZCkgPT4ge1xuICAgICAgaWYgKGZvY3VzZWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWVQYXVzZWRNdXRhdGlvbnMoKTtcbiAgICAgICAgdGhpcy4jcXVlcnlDYWNoZS5vbkZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy4jdW5zdWJzY3JpYmVPbmxpbmUgPSBvbmxpbmVNYW5hZ2VyLnN1YnNjcmliZShhc3luYyAob25saW5lKSA9PiB7XG4gICAgICBpZiAob25saW5lKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lUGF1c2VkTXV0YXRpb25zKCk7XG4gICAgICAgIHRoaXMuI3F1ZXJ5Q2FjaGUub25PbmxpbmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB1bm1vdW50KCkge1xuICAgIHRoaXMuI21vdW50Q291bnQtLTtcbiAgICBpZiAodGhpcy4jbW91bnRDb3VudCAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlRm9jdXM/LigpO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlRm9jdXMgPSB2b2lkIDA7XG4gICAgdGhpcy4jdW5zdWJzY3JpYmVPbmxpbmU/LigpO1xuICAgIHRoaXMuI3Vuc3Vic2NyaWJlT25saW5lID0gdm9pZCAwO1xuICB9XG4gIGlzRmV0Y2hpbmcoZmlsdGVycykge1xuICAgIHJldHVybiB0aGlzLiNxdWVyeUNhY2hlLmZpbmRBbGwoeyAuLi5maWx0ZXJzLCBmZXRjaFN0YXR1czogXCJmZXRjaGluZ1wiIH0pLmxlbmd0aDtcbiAgfVxuICBpc011dGF0aW5nKGZpbHRlcnMpIHtcbiAgICByZXR1cm4gdGhpcy4jbXV0YXRpb25DYWNoZS5maW5kQWxsKHsgLi4uZmlsdGVycywgc3RhdHVzOiBcInBlbmRpbmdcIiB9KS5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIEltcGVyYXRpdmUgKG5vbi1yZWFjdGl2ZSkgd2F5IHRvIHJldHJpZXZlIGRhdGEgZm9yIGEgUXVlcnlLZXkuXG4gICAqIFNob3VsZCBvbmx5IGJlIHVzZWQgaW4gY2FsbGJhY2tzIG9yIGZ1bmN0aW9ucyB3aGVyZSByZWFkaW5nIHRoZSBsYXRlc3QgZGF0YSBpcyBuZWNlc3NhcnksIGUuZy4gZm9yIG9wdGltaXN0aWMgdXBkYXRlcy5cbiAgICpcbiAgICogSGludDogRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIGluc2lkZSBhIGNvbXBvbmVudCwgYmVjYXVzZSBpdCB3b24ndCByZWNlaXZlIHVwZGF0ZXMuXG4gICAqIFVzZSBgdXNlUXVlcnlgIHRvIGNyZWF0ZSBhIGBRdWVyeU9ic2VydmVyYCB0aGF0IHN1YnNjcmliZXMgdG8gY2hhbmdlcy5cbiAgICovXG4gIGdldFF1ZXJ5RGF0YShxdWVyeUtleSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRlZmF1bHRRdWVyeU9wdGlvbnMoeyBxdWVyeUtleSB9KTtcbiAgICByZXR1cm4gdGhpcy4jcXVlcnlDYWNoZS5nZXQob3B0aW9ucy5xdWVyeUhhc2gpPy5zdGF0ZS5kYXRhO1xuICB9XG4gIGVuc3VyZVF1ZXJ5RGF0YShvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdGVkT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFF1ZXJ5T3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI3F1ZXJ5Q2FjaGUuYnVpbGQodGhpcywgZGVmYXVsdGVkT3B0aW9ucyk7XG4gICAgY29uc3QgY2FjaGVkRGF0YSA9IHF1ZXJ5LnN0YXRlLmRhdGE7XG4gICAgaWYgKGNhY2hlZERhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hRdWVyeShvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucmV2YWxpZGF0ZUlmU3RhbGUgJiYgcXVlcnkuaXNTdGFsZUJ5VGltZShyZXNvbHZlU3RhbGVUaW
251141lKGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lLCBxdWVyeSkpKSB7XG4gICAgICB2b2lkIHRoaXMucHJlZmV0Y2hRdWVyeShkZWZhdWx0ZWRPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWNoZWREYXRhKTtcbiAgfVxuICBnZXRRdWVyaWVzRGF0YShmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5tYXAoKHsgcXVlcnlLZXksIHN0YXRlIH0pID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBzdGF0ZS5kYXRhO1xuICAgICAgcmV0dXJuIFtxdWVyeUtleSwgZGF0YV07XG4gICAgfSk7XG4gIH1cbiAgc2V0UXVlcnlEYXRhKHF1ZXJ5S2V5LCB1cGRhdGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdGVkT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFF1ZXJ5T3B0aW9ucyh7IHF1ZXJ5S2V5IH0pO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy4jcXVlcnlDYWNoZS5nZXQoXG4gICAgICBkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaFxuICAgICk7XG4gICAgY29uc3QgcHJldkRhdGEgPSBxdWVyeT8uc3RhdGUuZGF0YTtcbiAgICBjb25zdCBkYXRhID0gZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCBwcmV2RGF0YSk7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGUuYnVpbGQodGhpcywgZGVmYXVsdGVkT3B0aW9ucykuc2V0RGF0YShkYXRhLCB7IC4uLm9wdGlvbnMsIG1hbnVhbDogdHJ1ZSB9KTtcbiAgfVxuICBzZXRRdWVyaWVzRGF0YShmaWx0ZXJzLCB1cGRhdGVyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5vdGlmeU1hbmFnZXIuYmF0Y2goXG4gICAgICAoKSA9PiB0aGlzLiNxdWVyeUNhY2hlLmZpbmRBbGwoZmlsdGVycykubWFwKCh7IHF1ZXJ5S2V5IH0pID0+IFtcbiAgICAgICAgcXVlcnlLZXksXG4gICAgICAgIHRoaXMuc2V0UXVlcnlEYXRhKHF1ZXJ5S2V5LCB1cGRhdGVyLCBvcHRpb25zKVxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGdldFF1ZXJ5U3RhdGUocXVlcnlLZXkpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kZWZhdWx0UXVlcnlPcHRpb25zKHsgcXVlcnlLZXkgfSk7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGUuZ2V0KFxuICAgICAgb3B0aW9ucy5xdWVyeUhhc2hcbiAgICApPy5zdGF0ZTtcbiAgfVxuICByZW1vdmVRdWVyaWVzKGZpbHRlcnMpIHtcbiAgICBjb25zdCBxdWVyeUNhY2hlID0gdGhpcy4jcXVlcnlDYWNoZTtcbiAgICBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHF1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeUNhY2hlLnJlbW92ZShxdWVyeSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXNldFF1ZXJpZXMoZmlsdGVycywgb3B0aW9ucykge1xuICAgIGNvbnN0IHF1ZXJ5Q2FjaGUgPSB0aGlzLiNxdWVyeUNhY2hlO1xuICAgIHJldHVybiBub3RpZnlNYW5hZ2VyLmJhdGNoKCgpID0+IHtcbiAgICAgIHF1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeS5yZXNldCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5yZWZldGNoUXVlcmllcyhcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiYWN0aXZlXCIsXG4gICAgICAgICAgLi4uZmlsdGVyc1xuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGNhbmNlbFF1ZXJpZXMoZmlsdGVycywgY2FuY2VsT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdGVkQ2FuY2VsT3B0aW9ucyA9IHsgcmV2ZXJ0OiB0cnVlLCAuLi5jYW5jZWxPcHRpb25zIH07XG4gICAgY29uc3QgcHJvbWlzZXMgPSBub3RpZnlNYW5hZ2VyLmJhdGNoKFxuICAgICAgKCkgPT4gdGhpcy4jcXVlcnlDYWNoZS5maW5kQWxsKGZpbHRlcnMpLm1hcCgocXVlcnkpID0+IHF1ZXJ5LmNhbmNlbChkZWZhdWx0ZWRDYW5jZWxPcHRpb25zKSlcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihub29wKS5jYXRjaChub29wKTtcbiAgfVxuICBpbnZhbGlkYXRlUXVlcmllcyhmaWx0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbm90aWZ5TWFuYWdlci5iYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLiNxdWVyeUNhY2hlLmZpbmRBbGwoZmlsdGVycykuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgICAgcXVlcnkuaW52YWxpZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmlsdGVycz8ucmVmZXRjaFR5cGUgPT09IFwibm9uZVwiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlZmV0Y2hRdWVyaWVzKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICB0eXBlOiBmaWx0ZXJzPy5yZWZldGNoVHlwZSA/PyBmaWx0ZXJzPy50eXBlID8/IFwiYWN0aXZlXCJcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZWZldGNoUXVlcmllcyhmaWx0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2FuY2VsUmVmZXRjaDogb3B0aW9ucy5jYW5jZWxSZWZldGNoID8/IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHByb21pc2VzID0gbm90aWZ5TWFuYWdlci5iYXRjaChcbiAgICAgICgpID0+IHRoaXMuI3F1ZXJ5Q2FjaGUuZmluZEFsbChmaWx0ZXJzKS5maWx0ZXIoKHF1ZXJ5KSA9PiAhcXVlcnkuaXNEaXNhYmxlZCgpICYmICFxdWVyeS5pc1N0YXRpYygpKS5tYXAoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGxldCBwcm9taXNlID0gcXVlcnkuZmV0Y2godm9pZCAwLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICBpZiAoIWZldGNoT3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS5jYXRjaChub29wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlcnkuc3RhdGUuZmV0Y2hTdGF0dXMgPT09IFwicGF1c2VkXCIgPyBQcm9taXNlLnJlc29sdmUoKSA6IHByb21pc2U7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKG5vb3ApO1xuICB9XG4gIGZldGNoUXVlcnkob3B0aW9ucykge1xuICAgIGNvbnN0IGRlZmF1bHRlZE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRRdWVyeU9
25114wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKGRlZmF1bHRlZE9wdGlvbnMucmV0cnkgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdGVkT3B0aW9ucy5yZXRyeSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuI3F1ZXJ5Q2FjaGUuYnVpbGQodGhpcywgZGVmYXVsdGVkT3B0aW9ucyk7XG4gICAgcmV0dXJuIHF1ZXJ5LmlzU3RhbGVCeVRpbWUoXG4gICAgICByZXNvbHZlU3RhbGVUaW1lKGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lLCBxdWVyeSlcbiAgICApID8gcXVlcnkuZmV0Y2goZGVmYXVsdGVkT3B0aW9ucykgOiBQcm9taXNlLnJlc29sdmUocXVlcnkuc3RhdGUuZGF0YSk7XG4gIH1cbiAgcHJlZmV0Y2hRdWVyeShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hRdWVyeShvcHRpb25zKS50aGVuKG5vb3ApLmNhdGNoKG5vb3ApO1xuICB9XG4gIGZldGNoSW5maW5pdGVRdWVyeShvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5iZWhhdmlvciA9IGluZmluaXRlUXVlcnlCZWhhdmlvcihvcHRpb25zLnBhZ2VzKTtcbiAgICByZXR1cm4gdGhpcy5mZXRjaFF1ZXJ5KG9wdGlvbnMpO1xuICB9XG4gIHByZWZldGNoSW5maW5pdGVRdWVyeShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hJbmZpbml0ZVF1ZXJ5KG9wdGlvbnMpLnRoZW4obm9vcCkuY2F0Y2gobm9vcCk7XG4gIH1cbiAgZW5zdXJlSW5maW5pdGVRdWVyeURhdGEob3B0aW9ucykge1xuICAgIG9wdGlvbnMuYmVoYXZpb3IgPSBpbmZpbml0ZVF1ZXJ5QmVoYXZpb3Iob3B0aW9ucy5wYWdlcyk7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlUXVlcnlEYXRhKG9wdGlvbnMpO1xuICB9XG4gIHJlc3VtZVBhdXNlZE11dGF0aW9ucygpIHtcbiAgICBpZiAob25saW5lTWFuYWdlci5pc09ubGluZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbXV0YXRpb25DYWNoZS5yZXN1bWVQYXVzZWRNdXRhdGlvbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIGdldFF1ZXJ5Q2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3F1ZXJ5Q2FjaGU7XG4gIH1cbiAgZ2V0TXV0YXRpb25DYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbXV0YXRpb25DYWNoZTtcbiAgfVxuICBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVmYXVsdE9wdGlvbnM7XG4gIH1cbiAgc2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuI2RlZmF1bHRPcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBzZXRRdWVyeURlZmF1bHRzKHF1ZXJ5S2V5LCBvcHRpb25zKSB7XG4gICAgdGhpcy4jcXVlcnlEZWZhdWx0cy5zZXQoaGFzaEtleShxdWVyeUtleSksIHtcbiAgICAgIHF1ZXJ5S2V5LFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IG9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBnZXRRdWVyeURlZmF1bHRzKHF1ZXJ5S2V5KSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBbLi4udGhpcy4jcXVlcnlEZWZhdWx0cy52YWx1ZXMoKV07XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZGVmYXVsdHMuZm9yRWFjaCgocXVlcnlEZWZhdWx0KSA9PiB7XG4gICAgICBpZiAocGFydGlhbE1hdGNoS2V5KHF1ZXJ5S2V5LCBxdWVyeURlZmF1bHQucXVlcnlLZXkpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBxdWVyeURlZmF1bHQuZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2V0TXV0YXRpb25EZWZhdWx0cyhtdXRhdGlvbktleSwgb3B0aW9ucykge1xuICAgIHRoaXMuI211dGF0aW9uRGVmYXVsdHMuc2V0KGhhc2hLZXkobXV0YXRpb25LZXkpLCB7XG4gICAgICBtdXRhdGlvbktleSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiBvcHRpb25zXG4gICAgfSk7XG4gIH1cbiAgZ2V0TXV0YXRpb25EZWZhdWx0cyhtdXRhdGlvbktleSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gWy4uLnRoaXMuI211dGF0aW9uRGVmYXVsdHMudmFsdWVzKCldO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGRlZmF1bHRzLmZvckVhY2goKHF1ZXJ5RGVmYXVsdCkgPT4ge1xuICAgICAgaWYgKHBhcnRpYWxNYXRjaEtleShtdXRhdGlvbktleSwgcXVlcnlEZWZhdWx0Lm11dGF0aW9uS2V5KSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgcXVlcnlEZWZhdWx0LmRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlZmF1bHRRdWVyeU9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLl9kZWZhdWx0ZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0ZWRPcHRpb25zID0ge1xuICAgICAgLi4udGhpcy4jZGVmYXVsdE9wdGlvbnMucXVlcmllcyxcbiAgICAgIC4uLnRoaXMuZ2V0UXVlcnlEZWZhdWx0cyhvcHRpb25zLnF1ZXJ5S2V5KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBfZGVmYXVsdGVkOiB0cnVlXG4gICAgfTtcbiAgICBpZiAoIWRlZmF1bHRlZE9wdGlvbnMucXVlcnlIYXNoKSB7XG4gICAgICBkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaCA9IGhhc2hRdWVyeUtleUJ5T3B0aW9ucyhcbiAgICAgICAgZGVmYXVsdGVkT3B0aW9ucy5xdWVyeUtleSxcbiAgICAgICAgZGVmYXVsdGVkT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRlZE9wdGlvbnMucmVmZXRjaE9uUmVjb25uZWN0ID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMucmVmZXRjaE9uUmVjb25uZWN0ID0gZGVmYXVsdGVkT3B0aW9ucy5uZXR3b3JrTW9kZSAhPT0gXCJhbHdheXNcIjtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRlZE9wdGlvbnMudGhyb3dPbkVycm9yID09PSB2b2lkIDApIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMudGhyb3dPbkVycm9yID0gISFkZWZhdWx0ZWRPcHRpb25zLnN1c3BlbnNlO1xuICAgIH1cbiAgICBpZiAoIWRlZmF1bHRlZE9wdGlvbnMubmV0d29ya01vZGUgJiYgZGVmYXVsdGVkT3B0aW9ucy5wZXJzaXN0ZXIpIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMubmV0d29ya01vZGUgPSBcIm9mZmxpbmVGaXJzdFwiO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdGVkT3B0aW9ucy5xdWVyeUZuID09PSBza2lwVG9rZW4pIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdGVkT3B0aW9ucztcbiAgfVxuICBkZWZhdWx0TXV0YXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uX2RlZmF1bHRlZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybi
25114B7XG4gICAgICAuLi50aGlzLiNkZWZhdWx0T3B0aW9ucy5tdXRhdGlvbnMsXG4gICAgICAuLi5vcHRpb25zPy5tdXRhdGlvbktleSAmJiB0aGlzLmdldE11dGF0aW9uRGVmYXVsdHMob3B0aW9ucy5tdXRhdGlvbktleSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgX2RlZmF1bHRlZDogdHJ1ZVxuICAgIH07XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jcXVlcnlDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuI211dGF0aW9uQ2FjaGUuY2xlYXIoKTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIFF1ZXJ5Q2xpZW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlDbGllbnQuanMubWFwIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHNyYy9RdWVyeUNsaWVudFByb3ZpZGVyLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBRdWVyeUNsaWVudENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KFxuICB2b2lkIDBcbik7XG52YXIgdXNlUXVlcnlDbGllbnQgPSAocXVlcnlDbGllbnQpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gUmVhY3QudXNlQ29udGV4dChRdWVyeUNsaWVudENvbnRleHQpO1xuICBpZiAocXVlcnlDbGllbnQpIHtcbiAgICByZXR1cm4gcXVlcnlDbGllbnQ7XG4gIH1cbiAgaWYgKCFjbGllbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBRdWVyeUNsaWVudCBzZXQsIHVzZSBRdWVyeUNsaWVudFByb3ZpZGVyIHRvIHNldCBvbmVcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG52YXIgUXVlcnlDbGllbnRQcm92aWRlciA9ICh7XG4gIGNsaWVudCxcbiAgY2hpbGRyZW5cbn0pID0+IHtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjbGllbnQubW91bnQoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xpZW50LnVubW91bnQoKTtcbiAgICB9O1xuICB9LCBbY2xpZW50XSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFF1ZXJ5Q2xpZW50Q29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY2xpZW50LCBjaGlsZHJlbiB9KTtcbn07XG5leHBvcnQge1xuICBRdWVyeUNsaWVudENvbnRleHQsXG4gIFF1ZXJ5Q2xpZW50UHJvdmlkZXIsXG4gIHVzZVF1ZXJ5Q2xpZW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UXVlcnlDbGllbnRQcm92aWRlci5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL0lzUmVzdG9yaW5nUHJvdmlkZXIudHNcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIElzUmVzdG9yaW5nQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZmFsc2UpO1xudmFyIHVzZUlzUmVzdG9yaW5nID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChJc1Jlc3RvcmluZ0NvbnRleHQpO1xudmFyIElzUmVzdG9yaW5nUHJvdmlkZXIgPSBJc1Jlc3RvcmluZ0NvbnRleHQuUHJvdmlkZXI7XG5leHBvcnQge1xuICBJc1Jlc3RvcmluZ1Byb3ZpZGVyLFxuICB1c2VJc1Jlc3RvcmluZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzUmVzdG9yaW5nUHJvdmlkZXIuanMubWFwIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHNyYy9RdWVyeUVycm9yUmVzZXRCb3VuZGFyeS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYW
25114N0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVWYWx1ZSgpIHtcbiAgbGV0IGlzUmVzZXQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBjbGVhclJlc2V0OiAoKSA9PiB7XG4gICAgICBpc1Jlc2V0ID0gZmFsc2U7XG4gICAgfSxcbiAgICByZXNldDogKCkgPT4ge1xuICAgICAgaXNSZXNldCA9IHRydWU7XG4gICAgfSxcbiAgICBpc1Jlc2V0OiAoKSA9PiB7XG4gICAgICByZXR1cm4gaXNSZXNldDtcbiAgICB9XG4gIH07XG59XG52YXIgUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChjcmVhdGVWYWx1ZSgpKTtcbnZhciB1c2VRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSA9ICgpID0+IFJlYWN0LnVzZUNvbnRleHQoUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlDb250ZXh0KTtcbnZhciBRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSA9ICh7XG4gIGNoaWxkcmVuXG59KSA9PiB7XG4gIGNvbnN0IFt2YWx1ZV0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjcmVhdGVWYWx1ZSgpKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbjogdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBjaGlsZHJlbih2YWx1ZSkgOiBjaGlsZHJlbiB9KTtcbn07XG5leHBvcnQge1xuICBRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSxcbiAgdXNlUXVlcnlFcnJvclJlc2V0Qm91bmRhcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUVycm9yUmVzZXRCb3VuZGFyeS5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL2Vycm9yQm91bmRhcnlVdGlscy50c1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYW
25114N0XCI7XG5pbXBvcnQgeyBzaG91bGRUaHJvd0Vycm9yIH0gZnJvbSBcIkB0YW5zdGFjay9xdWVyeS1jb3JlXCI7XG52YXIgZW5zdXJlUHJldmVudEVycm9yQm91bmRhcnlSZXRyeSA9IChvcHRpb25zLCBlcnJvclJlc2V0Qm91bmRhcnkpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3VzcGVuc2UgfHwgb3B0aW9ucy50aHJvd09uRXJyb3IgfHwgb3B0aW9ucy5leHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlcikge1xuICAgIGlmICghZXJyb3JSZXNldEJvdW5kYXJ5LmlzUmVzZXQoKSkge1xuICAgICAgb3B0aW9ucy5yZXRyeU9uTW91bnQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG52YXIgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnkgPSAoZXJyb3JSZXNldEJvdW5kYXJ5KSA9PiB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZXJyb3JSZXNldEJvdW5kYXJ5LmNsZWFyUmVzZXQoKTtcbiAgfSwgW2Vycm9yUmVzZXRCb3VuZGFyeV0pO1xufTtcbnZhciBnZXRIYXNFcnJvciA9ICh7XG4gIHJlc3VsdCxcbiAgZXJyb3JSZXNldEJvdW5kYXJ5LFxuICB0aHJvd09uRXJyb3IsXG4gIHF1ZXJ5LFxuICBzdXNwZW5zZVxufSkgPT4ge1xuICByZXR1cm4gcmVzdWx0LmlzRXJyb3IgJiYgIWVycm9yUmVzZXRCb3VuZGFyeS5pc1Jlc2V0KCkgJiYgIXJlc3VsdC5pc0ZldGNoaW5nICYmIHF1ZXJ5ICYmIChzdXNwZW5zZSAmJiByZXN1bHQuZGF0YSA9PT0gdm9pZCAwIHx8IHNob3VsZFRocm93RXJyb3IodGhyb3dPbkVycm9yLCBbcmVzdWx0LmVycm9yLCBxdWVyeV0pKTtcbn07XG5leHBvcnQge1xuICBlbnN1cmVQcmV2ZW50RXJyb3JCb3VuZGFyeVJldHJ5LFxuICBnZXRIYXNFcnJvcixcbiAgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvckJvdW5kYXJ5VXRpbHMuanMubWFwIiwiLy8gc3JjL3N1c3BlbnNlLnRzXG52YXIgZGVmYXVsdFRocm93T25FcnJvciA9IChfZXJyb3IsIHF1ZXJ5KSA9PiBxdWVyeS5zdGF0ZS5kYXRhID09PSB2b2lkIDA7XG52YXIgZW5zdXJlU3VzcGVuc2VUaW1lcnMgPSAoZGVmYXVsdGVkT3B0aW9ucykgPT4ge1xuICBpZiAoZGVmYXVsdGVkT3B0aW9ucy5zdXNwZW5zZSkge1xuICAgIGNvbnN0IE1JTl9TVVNQRU5TRV9USU1FX01TID0gMWUzO1xuICAgIGNvbnN0IGNsYW1wID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gXCJzdGF0aWNcIiA/IHZhbHVlIDogTWF0aC5tYXgodmFsdWUgPz8gTUlOX1NVU1BFTlNFX1RJTUVfTVMsIE1JTl9TVVNQRU5TRV9USU1FX01TKTtcbiAgICBjb25zdCBvcmlnaW5hbFN0YWxlVGltZSA9IGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lO1xuICAgIGRlZmF1bHRlZE9wdGlvbnMuc3RhbGVUaW1lID0gdHlwZW9mIG9yaWdpbmFsU3RhbGVUaW1lID09PSBcImZ1bmN0aW9uXCIgPyAoLi4uYXJncykgPT4gY2xhbXAob3JpZ2luYWxTdGFsZVRpbWUoLi4uYXJncykpIDogY2xhbXAob3JpZ2luYWxTdGFsZVRpbWUpO1xuICAgIGlmICh0eXBlb2YgZGVmYXVsdGVkT3B0aW9ucy5nY1RpbWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnMuZ2NUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgIGRlZmF1bHRlZE9wdGlvbnMuZ2NUaW1lLFxuICAgICAgICBNSU5fU1VTUEVOU0VfVElNRV9NU1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG52YXIgd2lsbEZldGNoID0gKHJlc3VsdCwgaXNSZXN0b3JpbmcpID0+IHJlc3VsdC5pc0xvYWRpbmcgJiYgcmVzdWx0LmlzRmV0Y2hpbmcgJiYgIWlzUmVzdG9yaW5nO1xudmFyIHNob3VsZFN1c3BlbmQgPSAoZGVmYXVsdGVkT3B0aW9ucywgcmVzdWx0KSA9PiBkZWZhdWx0ZWRPcHRpb25zPy5zdXNwZW5zZSAmJiByZXN1bHQuaXNQZW5kaW5nO1xudmFyIGZldGNoT3B0aW1pc3RpYyA9IChkZWZhdWx0ZWRPcHRpb25zLCBvYnNlcnZlciwgZXJyb3JSZXNldEJvdW5kYXJ5KSA9PiBvYnNlcnZlci5mZXRjaE9wdGltaXN0aWMoZGVmYXVsdGVkT3B0aW9ucykuY2F0Y2goKCkgPT4ge1xuICBlcnJvclJlc2V0Qm91bmRhcnkuY2xlYXJSZXNldCgpO1xufSk7XG5leHBvcnQge1xuICBkZWZhdWx0VGhyb3dPbkVycm9yLFxuICBlbnN1cmVTdXNwZW5zZVRpbWVycyxcbiAgZmV0Y2hPcHRpbWlzdGljLFxuICBzaG91bGRTdXNwZW5kLFxuICB3aWxsRmV0Y2hcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdXNwZW5zZS5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL3VzZUJhc2VRdWVyeS50c1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYW
25114N0XCI7XG5pbXBvcnQgeyBpc1NlcnZlciwgbm9vcCwgbm90aWZ5TWFuYWdlciB9IGZyb20gXCJAdGFuc3RhY2svcXVlcnktY29yZVwiO1xuaW1wb3J0IHsgdXNlUXVlcnlDbGllbnQgfSBmcm9tIFwiLi9RdWVyeUNsaWVudFByb3ZpZGVyLmpzXCI7XG5pbXBvcnQgeyB1c2VRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSB9IGZyb20gXCIuL1F1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5LmpzXCI7XG5pbXBvcnQge1xuICBlbnN1cmVQcmV2ZW50RXJyb3JCb3VuZGFyeVJldHJ5LFxuICBnZXRIYXNFcnJvcixcbiAgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnlcbn0gZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVV0aWxzLmpzXCI7XG5pbXBvcnQgeyB1c2VJc1Jlc3RvcmluZyB9IGZyb20gXCIuL0lzUmVzdG9yaW5nUHJvdmlkZXIuanNcIjtcbmltcG9ydCB7XG4gIGVuc3VyZVN1c3BlbnNlVGltZXJzLFxuICBmZXRjaE9wdGltaXN0aWMsXG4gIHNob3VsZFN1c3BlbmQsXG4gIHdpbGxGZXRjaFxufSBmcm9tIFwiLi9zdXNwZW5zZS5qc1wiO1xuZnVuY3Rpb24gdXNlQmFzZVF1ZXJ5KG9wdGlvbnMsIE9ic2VydmVyLCBxdWVyeUNsaWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0JhZCBhcmd1bWVudCB0eXBlLiBTdGFydGluZyB3aXRoIHY1LCBvbmx5IHRoZSBcIk9iamVjdFwiIGZvcm0gaXMgYWxsb3dlZCB3aGVuIGNhbGxpbmcgcXVlcnkgcmVsYXRlZCBmdW5jdGlvbnMuIFBsZWFzZSB1c2UgdGhlIGVycm9yIHN0YWNrIHRvIGZpbmQgdGhlIGN1bHByaXQgY2FsbC4gTW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vdGFuc3RhY2suY29tL3F1ZXJ5L2xhdGVzdC9kb2NzL3JlYWN0L2d1aWRlcy9taWdyYXRpbmctdG8tdjUjc3VwcG9ydHMtYS1zaW5nbGUtc2lnbmF0dXJlLW9uZS1vYmplY3QnXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCBpc1Jlc3RvcmluZyA9IHVzZUlzUmVzdG9yaW5nKCk7XG4gIGNvbnN0IGVycm9yUmVzZXRCb3VuZGFyeSA9IHVzZVF1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5KCk7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KHF1ZXJ5Q2xpZW50KTtcbiAgY29uc3QgZGVmYXVsdGVkT3B0aW9ucyA9IGNsaWVudC5kZWZhdWx0UXVlcnlPcHRpb25zKG9wdGlvbnMpO1xuICBjbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5xdWVyaWVzPy5fZXhwZXJpbWVudGFsX2JlZm9yZVF1ZXJ5Py4oXG4gICAgZGVmYXVsdGVkT3B0aW9uc1xuICApO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKCFkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5Rm4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbJHtkZWZhdWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaH1dOiBObyBxdWVyeUZuIHdhcyBwYXNzZWQgYXMgYW4gb3B0aW9uLCBhbmQgbm8gZGVmYXVsdCBxdWVyeUZuIHdhcyBmb3VuZC4gVGhlIHF1ZXJ5Rm4gcGFyYW1ldGVyIGlzIG9ubHkgb3B0aW9uYWwgd2hlbiB1c2luZyBhIGRlZmF1bHQgcXVlcnlGbi4gTW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vdGFuc3RhY2suY29tL3F1ZXJ5L2xhdGVzdC9kb2NzL2ZyYW1ld29yay9yZWFjdC9ndWlkZXMvZGVmYXVsdC1xdWVyeS1mdW5jdGlvbmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGRlZmF1bHRlZE9wdGlvbnMuX29wdGltaXN0aWNSZXN1bHRzID0gaXNSZXN0b3JpbmcgPyBcImlzUmVzdG9yaW5nXCIgOiBcIm9wdGltaXN0aWNcIjtcbiAgZW5zdXJlU3VzcGVuc2VUaW1lcnMoZGVmYXVsdGVkT3B0aW9ucyk7XG4gIGVuc3VyZVByZXZlbnRFcnJvckJvdW5kYXJ5UmV0cnkoZGVmYXVsdGVkT3B0aW9ucywgZXJyb3JSZXNldEJvdW5kYXJ5KTtcbiAgdXNlQ2xlYXJSZXNldEVycm9yQm91bmRhcnkoZXJyb3JSZXNldEJvdW5kYXJ5KTtcbiAgY29uc3QgaXNOZXdDYWNoZUVudHJ5ID0gIWNsaWVudC5nZXRRdWVyeUNhY2hlKCkuZ2V0KGRlZmF1bHRlZE9wdGlvbnMucXVlcnlIYXNoKTtcbiAgY29uc3QgW29ic2VydmVyXSA9IFJlYWN0LnVzZVN0YXRlKFxuICAgICgpID0+IG5ldyBPYnNlcnZlcihcbiAgICAgIGNsaWVudCxcbiAgICAgIGRlZmF1bHRlZE9wdGlvbnNcbiAgICApXG4gICk7XG4gIGNvbnN0IHJlc3VsdCA9IG9ic2VydmVyLmdldE9wdGltaXN0aWNSZXN1bHQoZGVmYXVsdGVkT3B0aW9ucyk7XG4gIGNvbnN0IHNob3VsZFN1YnNjcmliZSA9ICFpc1Jlc3RvcmluZyAmJiBvcHRpb25zLnN1YnNjcmliZWQgIT09IGZhbHNlO1xuICBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgIChvblN0b3JlQ2hhbmdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc2hvdWxkU3Vic2NyaWJlID8gb2JzZXJ2ZXIuc3Vic2NyaWJlKG5vdGlmeU1hbmFnZXIuYmF0Y2hDYWxscyhvblN0b3JlQ2hhbmdlKSkgOiBub29wO1xuICAgICAgICBvYnNlcnZlci51cGRhdGVSZXN1bHQoKTtcbiAgICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgICAgfSxcbiAgICAgIFtvYnNlcnZlciwgc2hvdWxkU3Vic2NyaWJlXVxuICAgICksXG4gICAgKCkgPT4gb2JzZXJ2ZXIuZ2V0Q3VycmVudFJlc3VsdCgpLFxuICAgICgpID0+IG9ic2VydmVyLmdldEN1cnJlbnRSZXN1bHQoKVxuICApO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9ic2VydmVyLnNldE9wdGlvbnMoZGVmYXVsdGVkT3B0aW9ucyk7XG4gIH0sIFtkZWZhdWx0ZWRPcHRpb25zLCBvYnNlcnZlcl0pO1xuICBpZiAoc2hvdWxkU3VzcGVuZChkZWZhdWx0ZWRPcHRpb25zLCByZXN1bHQpKSB7XG4gICAgdGhyb3cgZmV0Y2hPcHRpbWlzdGljKGRlZmF1bHRlZE9wdGlvbnMsIG9ic2VydmVyLCBlcnJvclJlc2V0Qm91bmRhcnkpO1xuICB9XG4gIGlmIChnZXRIYXNFcnJvcih7XG4gICAgcmVzdWx0LFxuICAgIGVycm9yUmVzZXRCb3VuZGFyeSxcbiAgICB0aHJvd09uRXJyb3I6IGRlZmF1bHRlZE9wdGlvbnMudGhyb3dPbkVycm9yLFxuICAgIHF1ZXJ5OiBjbGllbnQuZ2V0UXVlcnlDYWNoZSgpLmdldChkZWZh
25114dWx0ZWRPcHRpb25zLnF1ZXJ5SGFzaCksXG4gICAgc3VzcGVuc2U6IGRlZmF1bHRlZE9wdGlvbnMuc3VzcGVuc2VcbiAgfSkpIHtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gIH1cbiAgO1xuICBjbGllbnQuZ2V0RGVmYXVsdE9wdGlvbnMoKS5xdWVyaWVzPy5fZXhwZXJpbWVudGFsX2FmdGVyUXVlcnk/LihcbiAgICBkZWZhdWx0ZWRPcHRpb25zLFxuICAgIHJlc3VsdFxuICApO1xuICBpZiAoZGVmYXVsdGVkT3B0aW9ucy5leHBlcmltZW50YWxfcHJlZmV0Y2hJblJlbmRlciAmJiAhaXNTZXJ2ZXIgJiYgd2lsbEZldGNoKHJlc3VsdCwgaXNSZXN0b3JpbmcpKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IGlzTmV3Q2FjaGVFbnRyeSA/IChcbiAgICAgIC8vIEZldGNoIGltbWVkaWF0ZWx5IG9uIHJlbmRlciBpbiBvcmRlciB0byBlbnN1cmUgYC5wcm9taXNlYCBpcyByZXNvbHZlZCBldmVuIGlmIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkXG4gICAgICBmZXRjaE9wdGltaXN0aWMoZGVmYXVsdGVkT3B0aW9ucywgb2JzZXJ2ZXIsIGVycm9yUmVzZXRCb3VuZGFyeSlcbiAgICApIDogKFxuICAgICAgLy8gc3Vic2NyaWJlIHRvIHRoZSBcImNhY2hlIHByb21pc2VcIiBzbyB0aGF0IHdlIGNhbiBmaW5hbGl6ZSB0aGUgY3VycmVudFRoZW5hYmxlIG9uY2UgZGF0YSBjb21lcyBpblxuICAgICAgY2xpZW50LmdldFF1ZXJ5Q2FjaGUoKS5nZXQoZGVmYXVsdGVkT3B0aW9ucy5xdWVyeUhhc2gpPy5wcm9taXNlXG4gICAgKTtcbiAgICBwcm9taXNlPy5jYXRjaChub29wKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIG9ic2VydmVyLnVwZGF0ZVJlc3VsdCgpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiAhZGVmYXVsdGVkT3B0aW9ucy5ub3RpZnlPbkNoYW5nZVByb3BzID8gb2JzZXJ2ZXIudHJhY2tSZXN1bHQocmVzdWx0KSA6IHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIHVzZUJhc2VRdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZUJhc2VRdWVyeS5qcy5tYXAiLCJcInVzZSBjbGllbnRcIjtcblxuLy8gc3JjL3VzZVF1ZXJ5LnRzXG5pbXBvcnQgeyBRdWVyeU9ic2VydmVyIH0gZnJvbSBcIkB0YW5zdGFjay9xdWVyeS1jb3JlXCI7XG5pbXBvcnQgeyB1c2VCYXNlUXVlcnkgfSBmcm9tIFwiLi91c2VCYXNlUXVlcnkuanNcIjtcbmZ1bmN0aW9uIHVzZVF1ZXJ5KG9wdGlvbnMsIHF1ZXJ5Q2xpZW50KSB7XG4gIHJldHVybiB1c2VCYXNlUXVlcnkob3B0aW9ucywgUXVlcnlPYnNlcnZlciwgcXVlcnlDbGllbnQpO1xufVxuZXhwb3J0IHtcbiAgdXNlUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VRdWVyeS5qcy5tYXAiLCIvKipcbiAqIHJlYWN0LXJvdXRlciB2Ny45LjNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xudmFyIF9fdHlwZUVycm9yID0gKG1zZykgPT4ge1xuICB0aHJvdyBUeXBlRXJyb3IobXNnKTtcbn07XG52YXIgX19hY2Nlc3NDaGVjayA9IChvYmosIG1lbWJlciwgbXNnKSA9PiBtZW1iZXIuaGFzKG9iaikgfHwgX190eXBlRXJyb3IoXCJDYW5ub3QgXCIgKyBtc2cpO1xudmFyIF9fcHJpdmF0ZUdldCA9IChvYmosIG1lbWJlciwgZ2V0dGVyKSA9PiAoX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgXCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZFwiKSwgZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IG1lbWJlci5nZXQob2JqKSk7XG52YXIgX19wcml2YXRlQWRkID0gKG9iaiwgbWVtYmVyLCB2YWx1ZSkgPT4gbWVtYmVyLmhhcyhvYmopID8gX190eXBlRXJyb3IoXCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlXCIpIDogbWVtYmVyIGluc3RhbmNlb2YgV2Vha1NldCA/IG1lbWJlci5hZGQob2JqKSA6IG1lbWJlci5zZXQob2JqLCB2YWx1ZSk7XG5cbi8vIGxpYi9yb3V0ZXIvaGlzdG9yeS50c1xudmFyIEFjdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyAoKEFjdGlvbjIpID0+IHtcbiAgQWN0aW9uMltcIlBvcFwiXSA9IFwiUE9QXCI7XG4gIEFjdGlvbjJbXCJQdXNoXCJdID0gXCJQVVNIXCI7XG4gIEFjdGlvbjJbXCJSZXBsYWNlXCJdID0gXCJSRVBMQUNFXCI7XG4gIHJldHVybiBBY3Rpb24yO1xufSkoQWN0aW9uIHx8IHt9KTtcbnZhciBQb3BTdGF0ZUV2ZW50VHlwZSA9IFwicG9wc3RhdGVcIjtcbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3Rvcnkob3B0aW9ucyA9IHt9KSB7XG4gIGxldCB7IGluaXRpYWxFbnRyaWVzID0gW1wiL1wiXSwgaW5pdGlhbEluZGV4LCB2NUNvbXBhdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICBsZXQgZW50cmllcztcbiAgZW50cmllcyA9IGluaXRpYWxFbnRyaWVzLm1hcChcbiAgICAoZW50cnksIGluZGV4MikgPT4gY3JlYXRlTWVtb3J5TG9jYXRpb24oXG4gICAgICBlbnRyeSxcbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiA/IG51bGwgOiBlbnRyeS5zdGF0ZSxcbiAgICAgIGluZGV4MiA9PT0gMCA/IFwiZGVmYXVsdFwiIDogdm9pZCAwXG4gICAgKVxuICApO1xuICBsZXQgaW5kZXggPSBjbGFtcEluZGV4KFxuICAgIGluaXRpYWxJbmRleCA9PSBudWxsID8gZW50cmllcy5sZW5ndGggLSAxIDogaW5pdGlhbEluZGV4XG4gICk7XG4gIGxldCBhY3Rpb24gPSBcIlBPUFwiIC8qIFBvcCAqLztcbiAgbGV0IGxpc3RlbmVyID0gbnVsbDtcbiAgZnVuY3Rpb24gY2xhbXBJbmRleChuKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG4sIDApLCBlbnRyaWVzLmxlbmd0aCAtIDEpO1xuICB9XG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gZW50cmllc1tpbmRleF07XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlTWVtb3J5TG9jYXRpb24odG8sIHN0YXRlID0gbnVsbCwga2V5KSB7XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oXG4gICAgICBlbnRyaWVzID8gZ2V0Q3VycmVudExvY2F0aW9uKCkucGF0aG5hbWUgOiBcIi9cIixcbiAgICAgIHRvLFxuICAgICAgc3RhdGUsXG4gICAgICBrZXlcbiAgICApO
251141xuICAgIHdhcm5pbmcoXG4gICAgICBsb2NhdGlvbi5wYXRobmFtZS5jaGFyQXQoMCkgPT09IFwiL1wiLFxuICAgICAgYHJlbGF0aXZlIHBhdGhuYW1lcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBtZW1vcnkgaGlzdG9yeTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgdG9cbiAgICAgICl9YFxuICAgICk7XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUhyZWYyKHRvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSB7XG4gICAgZ2V0IGluZGV4KCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG4gICAgZ2V0IGFjdGlvbigpIHtcbiAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfSxcbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgfSxcbiAgICBjcmVhdGVIcmVmOiBjcmVhdGVIcmVmMixcbiAgICBjcmVhdGVVUkwodG8pIHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGNyZWF0ZUhyZWYyKHRvKSwgXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuICAgIH0sXG4gICAgZW5jb2RlTG9jYXRpb24odG8pIHtcbiAgICAgIGxldCBwYXRoID0gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHRvKSA6IHRvO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aG5hbWU6IHBhdGgucGF0aG5hbWUgfHwgXCJcIixcbiAgICAgICAgc2VhcmNoOiBwYXRoLnNlYXJjaCB8fCBcIlwiLFxuICAgICAgICBoYXNoOiBwYXRoLmhhc2ggfHwgXCJcIlxuICAgICAgfTtcbiAgICB9LFxuICAgIHB1c2godG8sIHN0YXRl
25114KSB7XG4gICAgICBhY3Rpb24gPSBcIlBVU0hcIiAvKiBQdXNoICovO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKHRvLCBzdGF0ZSk7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIGVudHJpZXMubGVuZ3RoLCBuZXh0TG9jYXRpb24pO1xuICAgICAgaWYgKHY1Q29tcGF0ICYmIGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVyKHsgYWN0aW9uLCBsb2NhdGlvbjogbmV4dExvY2F0aW9uLCBkZWx0YTogMSB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlcGxhY2UodG8sIHN0YXRlKSB7XG4gICAgICBhY3Rpb24gPSBcIlJFUExBQ0VcIiAvKiBSZXBsYWNlICovO1xuICAgICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZU1lbW9yeUxvY2F0aW9uKHRvLCBzdGF0ZSk7XG4gICAgICBlbnRyaWVzW2luZGV4XSA9IG5leHRMb2NhdGlvbjtcbiAgICAgIGlmICh2NUNvbXBhdCAmJiBsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcih7IGFjdGlvbiwgbG9jYXRpb246IG5leHRMb2NhdGlvbiwgZGVsdGE6IDAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnbyhkZWx0YSkge1xuICAgICAgYWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gICAgICBsZXQgbmV4dEluZGV4ID0gY2xhbXBJbmRleChpbmRleCArIGRlbHRhKTtcbiAgICAgIGxldCBuZXh0TG9jYXRpb24gPSBlbnRyaWVzW25leHRJbmRleF07XG4gICAgICBpbmRleCA9IG5leHRJbmRleDtcbiAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcih7IGFjdGlvbiwgbG9jYXRpb246IG5leHRMb2NhdGlvbiwgZGVsdGEgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsaXN0ZW4oZm4pIHtcbiAgICAgIGxpc3RlbmVyID0gZm47XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsaXN0ZW5lciA9IG51bGw7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhpc3Rvcnk7XG59XG5mdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeShvcHRpb25zID0ge30pIHtcbiAgZnVuY3Rpb24gY3JlYXRlQnJvd3NlckxvY2F0aW9uKHdpbmRvdzIsIGdsb2JhbEhpc3RvcnkpIHtcbiAgICBsZXQgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0gPSB3aW5kb3cyLmxvY2F0aW9uO1xuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbihcbiAgICAgIFwiXCIsXG4gICAgICB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2ggfSxcbiAgICAgIC8vIHN0YXRlIGRlZmF1bHRzIHRvIGBudWxsYCBiZWNhdXNlIGB3aW5kb3cuaGlzdG9yeS5zdGF0ZWAgZG9lc1xuICAgICAgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLnVzciB8fCBudWxsLFxuICAgICAgZ2xvYmFsSGlzdG9yeS5zdGF0ZSAmJiBnbG9iYWxIaXN0b3J5LnN0YXRlLmtleSB8fCBcImRlZmF1bHRcIlxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlQnJvd3NlckhyZWYod2luZG93MiwgdG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gdG8gOiBjcmVhdGVQYXRoKHRvKTtcbiAgfVxuICByZXR1cm4gZ2V0VXJsQmFzZWRIaXN0b3J5KFxuICAgIGNyZWF0ZUJyb3dzZXJMb2NhdGlvbixcbiAgICBjcmVhdGVCcm93c2VySHJlZixcbiAgICBudWxsLFxuICAgIG9wdGlvbnNcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhhc2hIaXN0b3J5KG9wdGlvbnMgPSB7fSkge1xuICBmdW5jdGlvbiBjcmVhdGVIYXNoTG9jYXRpb24od2luZG93MiwgZ2xvYmFsSGlzdG9yeSkge1xuICAgIGxldCB7XG4gICAgICBwYXRobmFtZSA9IFwiL1wiLFxuICAgICAgc2VhcmNoID0gXCJcIixcbiAgICAgIGhhc2ggPSBcIlwiXG4gICAgfSA9IHBhcnNlUGF0aCh3aW5kb3cyLmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTtcbiAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmICFwYXRobmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgcGF0aG5hbWUgPSBcIi9cIiArIHBhdGhuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTG9jYXRpb24oXG4gICAgICBcIlwiLFxuICAgICAgeyBwYXRobmFtZSwgc2VhcmNoLCBoYXNoIH0sXG4gICAgICAvLyBzdGF0ZSBkZWZhdWx0cyB0byBgbnVsbGAgYmVjYXVzZSBgd2luZG93Lmhpc3Rvcnkuc3RhdGVgIGRvZXNcbiAgICAgIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS51c3IgfHwgbnVsbCxcbiAgICAgIGdsb2JhbEhpc3Rvcnkuc3RhdGUgJiYgZ2xvYmFsSGlzdG9yeS5zdGF0ZS5rZXkgfHwgXCJkZWZhdWx0XCJcbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUhhc2hIcmVmKHdpbmRvdzIsIHRvKSB7XG4gICAgbGV0IGJhc2UgPSB3aW5kb3cyLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJiYXNlXCIpO1xuICAgIGxldCBocmVmID0gXCJcIjtcbiAgICBpZiAoYmFzZSAmJiBiYXNlLmdldEF0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgIGxldCB1cmwgPSB3aW5kb3cyLmxvY2F0aW9uLmhyZWY7XG4gICAgICBsZXQgaGFzaEluZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuICAgICAgaHJlZiA9IGhhc2hJbmRleCA9PT0gLTEgPyB1cmwgOiB1cmwuc2xpY2UoMCwgaGFzaEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGhyZWYgKyBcIiNcIiArICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyB0byA6IGNyZWF0ZVBhdGgodG8pKTtcbiAgfVxuICBmdW5jdGlvbiB2YWxpZGF0ZUhhc2hMb2NhdGlvbihsb2NhdGlvbiwgdG8pIHtcbiAgICB3YXJuaW5nKFxuICAgICAgbG9jYXRpb24ucGF0aG5hbWUuY2hhckF0KDApID09PSBcIi9cIixcbiAgICAgIGByZWxhdGl2ZSBwYXRobmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gaGFzaCBoaXN0b3J5LnB1c2goJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgdG9cbiAgICAgICl9KWBcbiAgICApO1xuICB9XG4gIHJldHVybiBnZXRVcmxCYXNlZEhpc3RvcnkoXG4gICAgY3JlYXRlSGFzaExvY2F0aW9uLFxuICAgIGNyZWF0ZUhhc2hIcmVmLFxuICAgIHZhbGlkYXRlSGFzaExvY2F0aW9uLFxuICAgIG9wdGlvbnNcbiAgKTtcbn1cbmZ1bmN0aW9uIGludmFyaWFudCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybmluZyhjb25kLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZCkge1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDEwKTtcbn1cbmZ1bmN0aW9uIGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpIHtcbiAgcmV0dXJuIHtcbiAgICB1c3I6IGxvY2F0aW9uLnN0YXRlLFxuICAgIGtleTogbG9jYXRpb24ua2V5LFxuICAgIGl
25114keDogaW5kZXhcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxvY2F0aW9uKGN1cnJlbnQsIHRvLCBzdGF0ZSA9IG51bGwsIGtleSkge1xuICBsZXQgbG9jYXRpb24gPSB7XG4gICAgcGF0aG5hbWU6IHR5cGVvZiBjdXJyZW50ID09PSBcInN0cmluZ1wiID8gY3VycmVudCA6IGN1cnJlbnQucGF0aG5hbWUsXG4gICAgc2VhcmNoOiBcIlwiLFxuICAgIGhhc2g6IFwiXCIsXG4gICAgLi4udHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHRvKSA6IHRvLFxuICAgIHN0YXRlLFxuICAgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgY2xlYW5lZCB1cC4gIHB1c2gvcmVwbGFjZSBzaG91bGQgcHJvYmFibHkganVzdCB0YWtlXG4gICAgLy8gZnVsbCBMb2NhdGlvbnMgbm93IGFuZCBhdm9pZCB0aGUgbmVlZCB0byBydW4gdGhyb3VnaCB0aGlzIGZsb3cgYXQgYWxsXG4gICAgLy8gQnV0IHRoYXQncyBhIHByZXR0eSBiaWcgcmVmYWN0b3IgdG8gdGhlIGN1cnJlbnQgdGVzdCBzdWl0ZSBzbyBnb2luZyB0b1xuICAgIC8vIGtlZXAgYXMgaXMgZm9yIHRoZSB0aW1lIGJlaW5nIGFuZCBqdXN0IGxldCBhbnkgaW5jb21pbmcga2V5cyB0YWtlIHByZWNlZGVuY2VcbiAgICBrZXk6IHRvICYmIHRvLmtleSB8fCBrZXkgfHwgY3JlYXRlS2V5KClcbiAgfTtcbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aCh7XG4gIHBhdGhuYW1lID0gXCIvXCIsXG4gIHNlYXJjaCA9IFwiXCIsXG4gIGhhc2ggPSBcIlwiXG59KSB7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoICE9PSBcIj9cIilcbiAgICBwYXRobmFtZSArPSBzZWFyY2guY2hhckF0KDApID09PSBcIj9cIiA/IHNlYXJjaCA6IFwiP1wiICsgc2VhcmNoO1xuICBpZiAoaGFzaCAmJiBoYXNoICE9PSBcIiNcIilcbiAgICBwYXRobmFtZSArPSBoYXNoLmNoYXJBdCgwKSA9PT0gXCIjXCIgPyBoYXNoIDogXCIjXCIgKyBoYXNoO1xuICByZXR1cm4gcGF0aG5hbWU7XG59XG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aCkge1xuICBsZXQgcGFyc2VkUGF0aCA9IHt9O1xuICBpZiAocGF0aCkge1xuICAgIGxldCBoYXNoSW5kZXggPSBwYXRoLmluZGV4T2YoXCIjXCIpO1xuICAgIGlmIChoYXNoSW5kZXggPj0gMCkge1xuICAgICAgcGFyc2VkUGF0aC5oYXNoID0gcGF0aC5zdWJzdHJpbmcoaGFzaEluZGV4KTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBoYXNoSW5kZXgpO1xuICAgIH1cbiAgICBsZXQgc2VhcmNoSW5kZXggPSBwYXRoLmluZGV4T2YoXCI/XCIpO1xuICAgIGlmIChzZWFyY2hJbmRleCA+PSAwKSB7XG4gICAgICBwYXJzZWRQYXRoLnNlYXJjaCA9IHBhdGguc3Vic3RyaW5nKHNlYXJjaEluZGV4KTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzZWFyY2hJbmRleCk7XG4gICAgfVxuICAgIGlmIChwYXRoKSB7XG4gICAgICBwYXJzZWRQYXRoLnBhdGhuYW1lID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFBhdGg7XG59XG5mdW5jdGlvbiBnZXRVcmxCYXNlZEhpc3RvcnkoZ2V0TG9jYXRpb24sIGNyZWF0ZUhyZWYyLCB2YWxpZGF0ZUxvY2F0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IHsgd2luZG93OiB3aW5kb3cyID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcsIHY1Q29tcGF0ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gIGxldCBnbG9iYWxIaXN0b3J5ID0gd2luZG93Mi5oaXN0b3J5O1xuICBsZXQgYWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gIGxldCBsaXN0ZW5lciA9IG51bGw7XG4gIGxldCBpbmRleCA9IGdldEluZGV4KCk7XG4gIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgaW5kZXggPSAwO1xuICAgIGdsb2JhbEhpc3RvcnkucmVwbGFjZVN0YXRlKHsgLi4uZ2xvYmFsSGlzdG9yeS5zdGF0ZSwgaWR4OiBpbmRleCB9LCBcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRJbmRleCgpIHtcbiAgICBsZXQgc3RhdGUgPSBnbG9iYWxIaXN0b3J5LnN0YXRlIHx8IHsgaWR4OiBudWxsIH07XG4gICAgcmV0dXJuIHN0YXRlLmlkeDtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVQb3AoKSB7XG4gICAgYWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gICAgbGV0IG5leHRJbmRleCA9IGdldEluZGV4KCk7XG4gICAgbGV0IGRlbHRhID0gbmV4dEluZGV4ID09IG51bGwgPyBudWxsIDogbmV4dEluZGV4IC0gaW5kZXg7XG4gICAgaW5kZXggPSBuZXh0SW5kZXg7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lcih7IGFjdGlvbiwgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sIGRlbHRhIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwdXNoKHRvLCBzdGF0ZSkge1xuICAgIGFjdGlvbiA9IFwiUFVTSFwiIC8qIFB1c2ggKi87XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRlKTtcbiAgICBpZiAodmFsaWRhdGVMb2NhdGlvbikgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgdG8pO1xuICAgIGluZGV4ID0gZ2V0SW5kZXgoKSArIDE7XG4gICAgbGV0IGhpc3RvcnlTdGF0ZSA9IGdldEhpc3RvcnlTdGF0ZShsb2NhdGlvbiwgaW5kZXgpO1xuICAgIGxldCB1cmwgPSBoaXN0b3J5LmNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgIHRyeSB7XG4gICAgICBnbG9iYWxIaXN0b3J5LnB1c2hTdGF0ZShoaXN0b3J5U3RhdGUsIFwiXCIsIHVybCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnJvci5uYW1lID09PSBcIkRhdGFDbG9uZUVycm9yXCIpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB3aW5kb3cyLmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cbiAgICBpZiAodjVDb21wYXQgJiYgbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyKHsgYWN0aW9uLCBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbiwgZGVsdGE6IDEgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlcGxhY2UyKHRvLCBzdGF0ZSkge1xuICAgIGFjdGlvbiA9IFwiUkVQTEFDRVwiIC8qIFJlcGxhY2UgKi87XG4gICAgbGV0IGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiwgdG8sIHN0YXRl
25114KTtcbiAgICBpZiAodmFsaWRhdGVMb2NhdGlvbikgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbiwgdG8pO1xuICAgIGluZGV4ID0gZ2V0SW5kZXgoKTtcbiAgICBsZXQgaGlzdG9yeVN0YXRlID0gZ2V0SGlzdG9yeVN0YXRlKGxvY2F0aW9uLCBpbmRleCk7XG4gICAgbGV0IHVybCA9IGhpc3RvcnkuY3JlYXRlSHJlZihsb2NhdGlvbik7XG4gICAgZ2xvYmFsSGlzdG9yeS5yZXBsYWNlU3RhdGUoaGlzdG9yeVN0YXRlLCBcIlwiLCB1cmwpO1xuICAgIGlmICh2NUNvbXBhdCAmJiBsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIoeyBhY3Rpb24sIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLCBkZWx0YTogMCB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlVVJMKHRvKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJyb3dzZXJVUkxJbXBsKHRvKTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IHtcbiAgICBnZXQgYWN0aW9uKCkge1xuICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9LFxuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBnZXRMb2NhdGlvbih3aW5kb3cyLCBnbG9iYWxIaXN0b3J5KTtcbiAgICB9LFxuICAgIGxpc3Rlbihmbikge1xuICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lclwiKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdzIuYWRkRXZlbnRMaXN0ZW5lcihQb3BTdGF0ZUV2ZW50VHlwZSwgaGFuZGxlUG9wKTtcbiAgICAgIGxpc3RlbmVyID0gZm47XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cyLnJlbW92ZUV2ZW50TGlzdGVuZXIoUG9wU3RhdGVFdmVudFR5cGUsIGhhbmRsZVBvcCk7XG4gICAgICAgIGxpc3RlbmVyID0gbnVsbDtcbiAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVIcmVmKHRvKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSHJlZjIod2luZG93MiwgdG8pO1xuICAgIH0sXG4gICAgY3JlYXRlVVJMLFxuICAgIGVuY29kZUxvY2F0aW9uKHRvKSB7XG4gICAgICBsZXQgdXJsID0gY3JlYXRlVVJMKHRvKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICAgICAgaGFzaDogdXJsLmhhc2hcbiAgICAgIH07XG4gICAgfSxcbiAgICBwdXNoLFxuICAgIHJlcGxhY2U6IHJlcGxhY2UyLFxuICAgIGdvKG4pIHtcbiAgICAgIHJldHVybiBnbG9iYWxIaXN0b3J5LmdvKG4pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhpc3Rvcnk7XG59XG5mdW5jdGlvbiBjcmVhdGVCcm93c2VyVVJMSW1wbCh0bywgaXNBYnNvbHV0ZSA9IGZhbHNlKSB7XG4gIGxldCBiYXNlID0gXCJodHRwOi8vbG9jYWxob3N0XCI7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gIT09IFwibnVsbFwiID8gd2luZG93LmxvY2F0aW9uLm9yaWdpbiA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB9XG4gIGludmFyaWFudChiYXNlLCBcIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMXCIpO1xuICBsZXQgaHJlZiA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHRvIDogY3JlYXRlUGF0aCh0byk7XG4gIGhyZWYgPSBocmVmLnJlcGxhY2UoLyAkLywgXCIlMjBcIik7XG4gIGlmICghaXNBYnNvbHV0ZSAmJiBocmVmLnN0YXJ0c1dpdGgoXCIvL1wiKSkge1xuICAgIGhyZWYgPSBiYXNlICsgaHJlZjtcbiAgfVxuICByZXR1cm4gbmV3IFVSTChocmVmLCBiYXNlKTtcbn1cblxuLy8gbGliL3JvdXRlci91dGlscy50c1xuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHsgZGVmYXVsdFZhbHVlIH07XG59XG52YXIgX21hcDtcbnZhciBSb3V0ZXJDb250ZXh0UHJvdmlkZXIgPSBjbGFzcyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYFJvdXRlckNvbnRleHRQcm92aWRlcmAgaW5zdGFuY2VcbiAgICogQHBhcmFtIGluaXQgQW4gb3B0aW9uYWwgaW5pdGlhbCBjb250ZXh0IG1hcCB0byBwb3B1bGF0ZSB0aGUgcHJvdmlkZXIgd2l0aFxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdCkge1xuICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbWFwLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgZm9yIChsZXQgW2NvbnRleHQsIHZhbHVlXSBvZiBpbml0KSB7XG4gICAgICAgIHRoaXMuc2V0KGNvbnRleHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFjY2VzcyBhIHZhbHVlIGZyb20gdGhlIGNvbnRleHQuIElmIG5vIHZhbHVlIGhhcyBiZWVuIHNldCBmb3IgdGhlIGNvbnRleHQsXG4gICAqIGl0IHdpbGwgcmV0dXJuIHRoZSBjb250ZXh0J3MgYGRlZmF1bHRWYWx1ZWAgaWYgcHJvdmlkZWQsIG9yIHRocm93IGFuIGVycm9yXG4gICAqIGlmIG5vIGBkZWZhdWx0VmFsdWVgIHdhcyBzZXQuXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZm9yXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmb3IgdGhlIGNvbnRleHQsIG9yIHRoZSBjb250ZXh0J3MgYGRlZmF1bHRWYWx1ZWAgaWYgbm9cbiAgICogdmFsdWUgd2FzIHNldFxuICAgKi9cbiAgZ2V0KGNvbnRleHQpIHtcbiAgICBpZiAoX19wcml2YXRlR2V0KHRoaXMsIF9tYXApLmhhcyhjb250ZXh0KSkge1xuICAgICAgcmV0dXJuIF9fcHJpdmF0ZUdldCh0aGlzLCBfbWFwKS5nZXQoY29udGV4dCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmRlZmF1bHRWYWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gY29udGV4dC5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHZhbHVlIGZvdW5kIGZvciBjb250ZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBmb3IgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGFscmVhZHkgaGFzIGEgdmFsdWUgc2V0LCB0aGlzXG4gICAqIHdpbGwgb3ZlcndyaXRlIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBzZXQgdGhlIHZhbHVlIGZvclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGNvbnRleHRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXQoY29udGV4dCwgdmFsdWUpIHtcbiAgICBfX3ByaXZhdGVHZXQodGhpcywgX21hcCkuc2V0KGNvbnRleHQsIHZhbHVlKTtcbiAgfVxufTtcbl9tYXAgPSBuZXcgV2Vha01hcCgpO1xudmFyIHVuc3VwcG9ydGVkTGF6eVJvdXRlT2JqZWN0S2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJsYXp5XCIsXG4gIFwiY2FzZVNlbnNpdGl2ZVwiLFxuICBcInBhdGhcIixcbiAgXCJpZFwiLFxuICBcImluZGV4XCIsXG4gIFwiY2hpbGRyZW5cIlxuXSk7XG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTGF6eVJvdXRlT2JqZWN0S2V5KGtleSkge1xuICByZXR1cm4gdW5zdXBwb3J0ZWRMYXp5Um91dGVPYmplY3RLZXlzLmhhcyhcbiAgICBrZXlcbiAgKTtcbn1cbnZhciB1bnN1cHBvcnRlZExhenlSb3V0ZUZ1bmN0aW9uS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJsYXp5XCIsXG4gIFwiY2FzZVNlbnNpdGl2ZVwiLFxuICBcInBhdGhcIixcbiAgXCJpZFwiLFxuICBcImluZGV4XCIsXG4gIFwibWlkZGxld2FyZVwiLFxuICBcImNoaWxkcmVuXCJcbl0pO1xuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZExhenlSb3V0ZUZ1bmN0aW9uS2V5KGtleSkge1xuICByZXR1cm4gdW5zdXBwb3J0ZWRMYXp5Um91dGVGdW5jdGlvbktleXMuaGFzKFxuICAgIGtleVxuICApO1xufVxuZnVuY3Rpb24gaXNJbmRleFJvdXRlKHJvdXRlKSB7XG4gIHJldHVybi
25114Byb3V0ZS5pbmRleCA9PT0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMocm91dGVzLCBtYXBSb3V0ZVByb3BlcnRpZXMyLCBwYXJlbnRQYXRoID0gW10sIG1hbmlmZXN0ID0ge30sIGFsbG93SW5QbGFjZU11dGF0aW9ucyA9IGZhbHNlKSB7XG4gIHJldHVybiByb3V0ZXMubWFwKChyb3V0ZSwgaW5kZXgpID0+IHtcbiAgICBsZXQgdHJlZVBhdGggPSBbLi4ucGFyZW50UGF0aCwgU3RyaW5nKGluZGV4KV07XG4gICAgbGV0IGlkID0gdHlwZW9mIHJvdXRlLmlkID09PSBcInN0cmluZ1wiID8gcm91dGUuaWQgOiB0cmVlUGF0aC5qb2luKFwiLVwiKTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICByb3V0ZS5pbmRleCAhPT0gdHJ1ZSB8fCAhcm91dGUuY2hpbGRyZW4sXG4gICAgICBgQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGVgXG4gICAgKTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICBhbGxvd0luUGxhY2VNdXRhdGlvbnMgfHwgIW1hbmlmZXN0W2lkXSxcbiAgICAgIGBGb3VuZCBhIHJvdXRlIGlkIGNvbGxpc2lvbiBvbiBpZCBcIiR7aWR9XCIuICBSb3V0ZSBpZCdzIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBEYXRhIFJvdXRlciB1c2FnZXNgXG4gICAgKTtcbiAgICBpZiAoaXNJbmRleFJvdXRlKHJvdXRlKSkge1xuICAgICAgbGV0IGluZGV4Um91dGUgPSB7XG4gICAgICAgIC4uLnJvdXRlLFxuICAgICAgICAuLi5tYXBSb3V0ZVByb3BlcnRpZXMyKHJvdXRlKSxcbiAgICAgICAgaWRcbiAgICAgIH07XG4gICAgICBtYW5pZmVzdFtpZF0gPSBpbmRleFJvdXRlO1xuICAgICAgcmV0dXJuIGluZGV4Um91dGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXRoT3JMYXlvdXRSb3V0ZSA9IHtcbiAgICAgICAgLi4ucm91dGUsXG4gICAgICAgIC4uLm1hcFJvdXRlUHJvcGVydGllczIocm91dGUpLFxuICAgICAgICBpZCxcbiAgICAgICAgY2hpbGRyZW46IHZvaWQgMFxuICAgICAgfTtcbiAgICAgIG1hbmlmZXN0W2lkXSA9IHBhdGhPckxheW91dFJvdXRlO1xuICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgIHBhdGhPckxheW91dFJvdXRlLmNoaWxkcmVuID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhcbiAgICAgICAgICByb3V0ZS5jaGlsZHJlbixcbiAgICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICAgIHRyZWVQYXRoLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICAgIGFsbG93SW5QbGFjZU11dGF0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhPckxheW91dFJvdXRlO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBtYXRjaFJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSA9IFwiL1wiKSB7XG4gIHJldHVybiBtYXRjaFJvdXRlc0ltcGwocm91dGVzLCBsb2NhdGlvbkFyZywgYmFzZW5hbWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIG1hdGNoUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnLCBiYXNlbmFtZSwgYWxsb3dQYXJ0aWFsKSB7XG4gIGxldCBsb2NhdGlvbiA9IHR5cGVvZiBsb2NhdGlvbkFyZyA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aChsb2NhdGlvbkFyZykgOiBsb2NhdGlvbkFyZztcbiAgbGV0IHBhdGhuYW1lID0gc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSB8fCBcIi9cIiwgYmFzZW5hbWUpO1xuICBpZiAocGF0aG5hbWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCBicmFuY2hlcyA9IGZsYXR0ZW5Sb3V0ZXMocm91dGVzKTtcbiAgcmFua1JvdXRlQnJhbmNoZXMoYnJhbmNoZXMpO1xuICBsZXQgbWF0Y2hlcyA9IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBtYXRjaGVzID09IG51bGwgJiYgaSA8IGJyYW5jaGVzLmxlbmd0aDsgKytpKSB7XG4gICAgbGV0IGRlY29kZWQgPSBkZWNvZGVQYXRoKHBhdGhuYW1lKTtcbiAgICBtYXRjaGVzID0gbWF0Y2hSb3V0ZUJyYW5jaChcbiAgICAgIGJyYW5jaGVzW2ldLFxuICAgICAgZGVjb2RlZCxcbiAgICAgIGFsbG93UGFydGlhbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59XG5mdW5jdGlvbiBjb252ZXJ0Um91dGVNYXRjaFRvVWlNYXRjaChtYXRjaCwgbG9hZGVyRGF0YSkge1xuICBsZXQgeyByb3V0ZSwgcGF0aG5hbWUsIHBhcmFtcyB9ID0gbWF0Y2g7XG4gIHJldHVybiB7XG4gICAgaWQ6IHJvdXRlLmlkLFxuICAgIHBhdGhuYW1lLFxuICAgIHBhcmFtcyxcbiAgICBkYXRhOiBsb2FkZXJEYXRhW3JvdXRlLmlkXSxcbiAgICBsb2FkZXJEYXRhOiBsb2FkZXJEYXRhW3JvdXRlLmlkXSxcbiAgICBoYW5kbGU6IHJvdXRlLmhhbmRsZVxuICB9O1xufVxuZnVuY3Rpb24gZmxhdHRlblJvdXRlcyhyb3V0ZXMsIGJyYW5jaGVzID0gW10sIHBhcmVudHNNZXRhID0gW10sIHBhcmVudFBhdGggPSBcIlwiLCBfaGFzUGFyZW50T3B0aW9uYWxTZWdtZW50cyA9IGZhbHNlKSB7XG4gIGxldCBmbGF0dGVuUm91dGUgPSAocm91dGUsIGluZGV4LCBoYXNQYXJlbnRPcHRpb25hbFNlZ21lbnRzID0gX2hhc1BhcmVudE9wdGlvbmFsU2VnbWVudHMsIHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgIGxldCBtZXRhID0ge1xuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGggPT09IHZvaWQgMCA/IHJvdXRlLnBhdGggfHwgXCJcIiA6IHJlbGF0aXZlUGF0aCxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHJvdXRlLmNhc2VTZW5zaXRpdmUgPT09IHRydWUsXG4gICAgICBjaGlsZHJlbkluZGV4OiBpbmRleCxcbiAgICAgIHJvdXRlXG4gICAgfTtcbiAgICBpZiAobWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIGlmICghbWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChwYXJlbnRQYXRoKSAmJiBoYXNQYXJlbnRPcHRpb25hbFNlZ21lbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGludmFyaWFudChcbiAgICAgICAgbWV0YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChwYXJlbnRQYXRoKSxcbiAgICAgICAgYEFic29sdXRlIHJvdXRlIHBhdGggXCIke21ldGEucmVsYXRpdmVQYXRofVwiIG5lc3RlZCB1bmRlciBwYXRoIFwiJHtwYXJlbnRQYXRofVwiIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCBtdXN0IHN0YXJ0IHdpdGggdGhlIGNvbWJpbmVkIHBhdGggb2YgYWxsIGl0cyBwYXJlbnQgcm91dGVzLmBcbiAgICAgICk7XG4gICAgICBtZXRhLnJlbGF0aXZlUGF0aCA9IG1ldGEucmVsYXRpdmVQYXRoLnNsaWNlKHBhcmVudFBhdGgubGVuZ3RoKTtcbiAgICB9XG4gICAgbGV0IHBhdGggPSBqb2luUGF0aHMoW3BhcmVudFBhdGgsIG1ldGEucmVsYXRpdmVQYXRoXSk7XG4gICAgbGV0IHJvdXRlc01ldGEgPSBwYXJlbnRzTWV0YS5jb25jYXQobWV0YSk7XG4gICAgaWYgKHJvdXRlLmNoaWxkcmVuICYmIHJvdXRlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGludmFyaWFudChcbiAgICAgICAgLy8gT3VyIHR5cGVzIGtub3cgYmV0dGVyLCBidXQgcnVudGltZSBKUyBtYXkgbm90IVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgI
25114HJvdXRlLmluZGV4ICE9PSB0cnVlLFxuICAgICAgICBgSW5kZXggcm91dGVzIG11c3Qgbm90IGhhdmUgY2hpbGQgcm91dGVzLiBQbGVhc2UgcmVtb3ZlIGFsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoIFwiJHtwYXRofVwiLmBcbiAgICAgICk7XG4gICAgICBmbGF0dGVuUm91dGVzKFxuICAgICAgICByb3V0ZS5jaGlsZHJlbixcbiAgICAgICAgYnJhbmNoZXMsXG4gICAgICAgIHJvdXRlc01ldGEsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGhhc1BhcmVudE9wdGlvbmFsU2VnbWVudHNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5wYXRoID09IG51bGwgJiYgIXJvdXRlLmluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGJyYW5jaGVzLnB1c2goe1xuICAgICAgcGF0aCxcbiAgICAgIHNjb3JlOiBjb21wdXRlU2NvcmUocGF0aCwgcm91dGUuaW5kZXgpLFxuICAgICAgcm91dGVzTWV0YVxuICAgIH0pO1xuICB9O1xuICByb3V0ZXMuZm9yRWFjaCgocm91dGUsIGluZGV4KSA9PiB7XG4gICAgaWYgKHJvdXRlLnBhdGggPT09IFwiXCIgfHwgIXJvdXRlLnBhdGg/LmluY2x1ZGVzKFwiP1wiKSkge1xuICAgICAgZmxhdHRlblJvdXRlKHJvdXRlLCBpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGV4cGxvZGVkIG9mIGV4cGxvZGVPcHRpb25hbFNlZ21lbnRzKHJvdXRlLnBhdGgpKSB7XG4gICAgICAgIGZsYXR0ZW5Sb3V0ZShyb3V0ZSwgaW5kZXgsIHRydWUsIGV4cGxvZGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYnJhbmNoZXM7XG59XG5mdW5jdGlvbiBleHBsb2RlT3B0aW9uYWxTZWdtZW50cyhwYXRoKSB7XG4gIGxldCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGxldCBbZmlyc3QsIC4uLnJlc3RdID0gc2VnbWVudHM7XG4gIGxldCBpc09wdGlvbmFsID0gZmlyc3QuZW5kc1dpdGgoXCI/XCIpO1xuICBsZXQgcmVxdWlyZWQgPSBmaXJzdC5yZXBsYWNlKC9cXD8kLywgXCJcIik7XG4gIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpc09wdGlvbmFsID8gW3JlcXVpcmVkLCBcIlwiXSA6IFtyZXF1aXJlZF07XG4gIH1cbiAgbGV0IHJlc3RFeHBsb2RlZCA9IGV4cGxvZGVPcHRpb25hbFNlZ21lbnRzKHJlc3Quam9pbihcIi9cIikpO1xuICBsZXQgcmVzdWx0ID0gW107XG4gIHJlc3VsdC5wdXNoKFxuICAgIC4uLnJlc3RFeHBsb2RlZC5tYXAoXG4gICAgICAoc3VicGF0aCkgPT4gc3VicGF0aCA9PT0gXCJcIiA/IHJlcXVpcmVkIDogW3JlcXVpcmVkLCBzdWJwYXRoXS5qb2luKFwiL1wiKVxuICAgIClcbiAgKTtcbiAgaWYgKGlzT3B0aW9uYWwpIHtcbiAgICByZXN1bHQucHVzaCguLi5yZXN0RXhwbG9kZWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQubWFwKFxuICAgIChleHBsb2RlZCkgPT4gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSAmJiBleHBsb2RlZCA9PT0gXCJcIiA/IFwiL1wiIDogZXhwbG9kZWRcbiAgKTtcbn1cbmZ1bmN0aW9uIHJhbmtSb3V0ZUJyYW5jaGVzKGJyYW5jaGVzKSB7XG4gIGJyYW5jaGVzLnNvcnQoXG4gICAgKGEsIGIpID0+IGEuc2NvcmUgIT09IGIuc2NvcmUgPyBiLnNjb3JlIC0gYS5zY29yZSA6IGNvbXBhcmVJbmRleGVzKFxuICAgICAgYS5yb3V0ZXNNZXRhLm1hcCgobWV0YSkgPT4gbWV0YS5jaGlsZHJlbkluZGV4KSxcbiAgICAgIGIucm91dGVzTWV0YS5tYXAoKG1ldGEpID0+IG1ldGEuY2hpbGRyZW5JbmRleClcbiAgICApXG4gICk7XG59XG52YXIgcGFyYW1SZSA9IC9eOltcXHctXSskLztcbnZhciBkeW5hbWljU2VnbWVudFZhbHVlID0gMztcbnZhciBpbmRleFJvdXRlVmFsdWUgPSAyO1xudmFyIGVtcHR5U2VnbWVudFZhbHVlID0gMTtcbnZhciBzdGF0aWNTZWdtZW50VmFsdWUgPSAxMDtcbnZhciBzcGxhdFBlbmFsdHkgPSAtMjtcbnZhciBpc1NwbGF0ID0gKHMpID0+IHMgPT09IFwiKlwiO1xuZnVuY3Rpb24gY29tcHV0ZVNjb3JlKHBhdGgsIGluZGV4KSB7XG4gIGxldCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBsZXQgaW5pdGlhbFNjb3JlID0gc2VnbWVudHMubGVuZ3RoO1xuICBpZiAoc2VnbWVudHMuc29tZShpc1NwbGF0KSkge1xuICAgIGluaXRpYWxTY29yZSArPSBzcGxhdFBlbmFsdHk7XG4gIH1cbiAgaWYgKGluZGV4KSB7XG4gICAgaW5pdGlhbFNjb3JlICs9IGluZGV4Um91dGVWYWx1ZTtcbiAgfVxuICByZXR1cm4gc2VnbWVudHMuZmlsdGVyKChzKSA9PiAhaXNTcGxhdChzKSkucmVkdWNlKFxuICAgIChzY29yZSwgc2VnbWVudCkgPT4gc2NvcmUgKyAocGFyYW1SZS50ZXN0KHNlZ21lbnQpID8gZHluYW1pY1NlZ21lbnRWYWx1ZSA6IHNlZ21lbnQgPT09IFwiXCIgPyBlbXB0eVNlZ21lbnRWYWx1ZSA6IHN0YXRpY1NlZ21lbnRWYWx1ZSksXG4gICAgaW5pdGlhbFNjb3JlXG4gICk7XG59XG5mdW5jdGlvbiBjb21wYXJlSW5kZXhlcyhhLCBiKSB7XG4gIGxldCBzaWJsaW5ncyA9IGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLnNsaWNlKDAsIC0xKS5ldmVyeSgobiwgaSkgPT4gbiA9PT0gYltpXSk7XG4gIHJldHVybiBzaWJsaW5ncyA/IChcbiAgICAvLyBJZiB0d28gcm91dGVzIGFyZSBzaWJsaW5ncywgd2Ugc2hvdWxkIHRyeSB0byBtYXRjaCB0aGUgZWFybGllciBzaWJsaW5nXG4gICAgLy8gZmlyc3QuIFRoaXMgYWxsb3dzIHBlb3BsZSB0byBoYXZlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIG1hdGNoaW5nXG4gICAgLy8gYmVoYXZpb3IgYnkgc2ltcGx5IHB1dHRpbmcgcm91dGVzIHdpdGggaWRlbnRpY2FsIHBhdGhzIGluIHRoZSBvcmRlciB0aGV5XG4gICAgLy8gd2FudCB0aGVtIHRyaWVkLlxuICAgIGFbYS5sZW5ndGggLSAxXSAtIGJbYi5sZW5ndGggLSAxXVxuICApIDogKFxuICAgIC8vIE90aGVyd2lzZSwgaXQgZG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSB0byByYW5rIG5vbi1zaWJsaW5ncyBieSBpbmRleCxcbiAgICAvLyBzbyB0aGV5IHNvcnQgZXF1YWxseS5cbiAgICAwXG4gICk7XG59XG5mdW5jdGlvbiBtYXRjaFJvdXRlQnJhbmNoKGJyYW5jaCwgcGF0aG5hbWUsIGFsbG93UGFydGlhbCA9IGZ
25114hbHNlKSB7XG4gIGxldCB7IHJvdXRlc01ldGEgfSA9IGJyYW5jaDtcbiAgbGV0IG1hdGNoZWRQYXJhbXMgPSB7fTtcbiAgbGV0IG1hdGNoZWRQYXRobmFtZSA9IFwiL1wiO1xuICBsZXQgbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlc01ldGEubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgbWV0YSA9IHJvdXRlc01ldGFbaV07XG4gICAgbGV0IGVuZCA9IGkgPT09IHJvdXRlc01ldGEubGVuZ3RoIC0gMTtcbiAgICBsZXQgcmVtYWluaW5nUGF0aG5hbWUgPSBtYXRjaGVkUGF0aG5hbWUgPT09IFwiL1wiID8gcGF0aG5hbWUgOiBwYXRobmFtZS5zbGljZShtYXRjaGVkUGF0aG5hbWUubGVuZ3RoKSB8fCBcIi9cIjtcbiAgICBsZXQgbWF0Y2ggPSBtYXRjaFBhdGgoXG4gICAgICB7IHBhdGg6IG1ldGEucmVsYXRpdmVQYXRoLCBjYXNlU2Vuc2l0aXZlOiBtZXRhLmNhc2VTZW5zaXRpdmUsIGVuZCB9LFxuICAgICAgcmVtYWluaW5nUGF0aG5hbWVcbiAgICApO1xuICAgIGxldCByb3V0ZSA9IG1ldGEucm91dGU7XG4gICAgaWYgKCFtYXRjaCAmJiBlbmQgJiYgYWxsb3dQYXJ0aWFsICYmICFyb3V0ZXNNZXRhW3JvdXRlc01ldGEubGVuZ3RoIC0gMV0ucm91dGUuaW5kZXgpIHtcbiAgICAgIG1hdGNoID0gbWF0Y2hQYXRoKFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogbWV0YS5yZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgY2FzZVNlbnNpdGl2ZTogbWV0YS5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICAgIGVuZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgcmVtYWluaW5nUGF0aG5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKG1hdGNoZWRQYXJhbXMsIG1hdGNoLnBhcmFtcyk7XG4gICAgbWF0Y2hlcy5wdXNoKHtcbiAgICAgIC8vIFRPRE86IENhbiB0aGlzIGFzIGJlIGF2b2lkZWQ/XG4gICAgICBwYXJhbXM6IG1hdGNoZWRQYXJhbXMsXG4gICAgICBwYXRobmFtZTogam9pblBhdGhzKFttYXRjaGVkUGF0aG5hbWUsIG1hdGNoLnBhdGhuYW1lXSksXG4gICAgICBwYXRobmFtZUJhc2U6IG5vcm1hbGl6ZVBhdGhuYW1lKFxuICAgICAgICBqb2luUGF0aHMoW21hdGNoZWRQYXRobmFtZSwgbWF0Y2gucGF0aG5hbWVCYXNlXSlcbiAgICAgICksXG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGlmIChtYXRjaC5wYXRobmFtZUJhc2UgIT09IFwiL1wiKSB7XG4gICAgICBtYXRjaGVkUGF0aG5hbWUgPSBqb2luUGF0aHMoW21hdGNoZWRQYXRobmFtZSwgbWF0Y2gucGF0aG5hbWVCYXNlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVQYXRoKG9yaWdpbmFsUGF0aCwgcGFyYW1zID0ge30pIHtcbiAgbGV0IHBhdGggPSBvcmlnaW5hbFBhdGg7XG4gIGlmIChwYXRoLmVuZHNXaXRoKFwiKlwiKSAmJiBwYXRoICE9PSBcIipcIiAmJiAhcGF0aC5lbmRzV2l0aChcIi8qXCIpKSB7XG4gICAgd2FybmluZyhcbiAgICAgIGZhbHNlLFxuICAgICAgYFJvdXRlIHBhdGggXCIke3BhdGh9XCIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIgYmVjYXVzZSB0aGUgXFxgKlxcYCBjaGFyYWN0ZXIgbXVzdCBhbHdheXMgZm9sbG93IGEgXFxgL1xcYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIHBsZWFzZSBjaGFuZ2UgdGhlIHJvdXRlIHBhdGggdG8gXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIuYFxuICAgICk7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIik7XG4gIH1cbiAgY29uc3QgcHJlZml4ID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IFwiL1wiIDogXCJcIjtcbiAgY29uc3Qgc3RyaW5naWZ5MiA9IChwKSA9PiBwID09IG51bGwgPyBcIlwiIDogdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgPyBwIDogU3RyaW5nKHApO1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoL1xcLysvKS5tYXAoKHNlZ21lbnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgIGNvbnN0IGlzTGFzdFNlZ21lbnQgPSBpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICBpZiAoaXNMYXN0U2VnbWVudCAmJiBzZWdtZW50ID09PSBcIipcIikge1xuICAgICAgY29uc3Qgc3RhciA9IFwiKlwiO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeTIocGFyYW1zW3N0YXJdKTtcbiAgICB9XG4gICAgY29uc3Qga2V5TWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC9eOihbXFx3LV0rKShcXD8/KSQvKTtcbiAgICBpZiAoa2V5TWF0Y2gpIHtcbiAgICAgIGNvbnN0IFssIGtleSwgb3B0aW9uYWxdID0ga2V5TWF0Y2g7XG4gICAgICBsZXQgcGFyYW0gPSBwYXJhbXNba2V5XTtcbiAgICAgIGludmFyaWFudChvcHRpb25hbCA9PT0gXCI/XCIgfHwgcGFyYW0gIT0gbnVsbCwgYE1pc3NpbmcgXCI6JHtrZXl9XCIgcGFyYW1gKTtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5MihwYXJhbSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudC5yZXBsYWNlKC9cXD8kL2csIFwiXCIpO1xuICB9KS5maWx0ZXIoKHNlZ21lbnQpID0+ICEhc2VnbWVudCk7XG4gIHJldHVybiBwcmVmaXggKyBzZWdtZW50cy5qb2luKFwiL1wiKTtcbn1cbmZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuLCBwYXRobmFtZSkge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwic3RyaW5nXCIpIHtcbiAgICBwYXR0ZXJuID0geyBwYXRoOiBwYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlOiBmYWxzZSwgZW5kOiB0cnVlIH07XG4gIH1cbiAgbGV0IFttYXRjaGVyLCBjb21waWxlZFBhcmFtc10gPSBjb21waWxlUGF0aChcbiAgICBwYXR0ZXJuLnBhdGgsXG4gICAgcGF0dGVybi5jYXNlU2Vuc2l0aXZlLFxuICAgIHBhdHRlcm4uZW5kXG4gICk7XG4gIGxldCBtYXRjaCA9IHBhdGhuYW1lLm1hdGNoKG1hdGNoZXIpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgbGV0IG1hdGNoZWRQYXRobmFtZSA9IG1hdGNoWzBdO1xuICBsZXQgcGF0aG5hbWVCYXNlID0gbWF0Y2hlZFBhdGhuYW1lLnJlcGxhY2UoLyguKVxcLyskLywgXCIkMVwiKTtcbiAgbGV0IGNhcHR1cmVHcm91cHMgPSBtYXRjaC5zbGljZSgxKTtcbiAgbGV0IHBhcmFtcyA9IGNvbXBpbGVkUGFyYW1zLnJlZHVjZShcbiAgICAobWVtbzIsIHsgcGFyYW1OYW1lLCBpc09wdGlvbmFsIH0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAocGFyYW1OYW1lID09PSBcIipcIikge1xuICAgICAgICBsZXQgc3BsYXRWYWx1ZSA9IGNhcHR1cmVHcm91cHNbaW5kZXhdIHx8IFwiXCI7XG4gICAgICAgI
25114HBhdGhuYW1lQmFzZSA9IG1hdGNoZWRQYXRobmFtZS5zbGljZSgwLCBtYXRjaGVkUGF0aG5hbWUubGVuZ3RoIC0gc3BsYXRWYWx1ZS5sZW5ndGgpLnJlcGxhY2UoLyguKVxcLyskLywgXCIkMVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gY2FwdHVyZUdyb3Vwc1tpbmRleF07XG4gICAgICBpZiAoaXNPcHRpb25hbCAmJiAhdmFsdWUpIHtcbiAgICAgICAgbWVtbzJbcGFyYW1OYW1lXSA9IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW8yW3BhcmFtTmFtZV0gPSAodmFsdWUgfHwgXCJcIikucmVwbGFjZSgvJTJGL2csIFwiL1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vMjtcbiAgICB9LFxuICAgIHt9XG4gICk7XG4gIHJldHVybiB7XG4gICAgcGFyYW1zLFxuICAgIHBhdGhuYW1lOiBtYXRjaGVkUGF0aG5hbWUsXG4gICAgcGF0aG5hbWVCYXNlLFxuICAgIHBhdHRlcm5cbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVQYXRoKHBhdGgsIGNhc2VTZW5zaXRpdmUgPSBmYWxzZSwgZW5kID0gdHJ1ZSkge1xuICB3YXJuaW5nKFxuICAgIHBhdGggPT09IFwiKlwiIHx8ICFwYXRoLmVuZHNXaXRoKFwiKlwiKSB8fCBwYXRoLmVuZHNXaXRoKFwiLypcIiksXG4gICAgYFJvdXRlIHBhdGggXCIke3BhdGh9XCIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIgYmVjYXVzZSB0aGUgXFxgKlxcYCBjaGFyYWN0ZXIgbXVzdCBhbHdheXMgZm9sbG93IGEgXFxgL1xcYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIHBsZWFzZSBjaGFuZ2UgdGhlIHJvdXRlIHBhdGggdG8gXCIke3BhdGgucmVwbGFjZSgvXFwqJC8sIFwiLypcIil9XCIuYFxuICApO1xuICBsZXQgcGFyYW1zID0gW107XG4gIGxldCByZWdleHBTb3VyY2UgPSBcIl5cIiArIHBhdGgucmVwbGFjZSgvXFwvKlxcKj8kLywgXCJcIikucmVwbGFjZSgvXlxcLyovLCBcIi9cIikucmVwbGFjZSgvW1xcXFwuKiteJHt9fCgpW1xcXV0vZywgXCJcXFxcJCZcIikucmVwbGFjZShcbiAgICAvXFwvOihbXFx3LV0rKShcXD8pPy9nLFxuICAgIChfLCBwYXJhbU5hbWUsIGlzT3B0aW9uYWwpID0+IHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgcGFyYW1OYW1lLCBpc09wdGlvbmFsOiBpc09wdGlvbmFsICE9IG51bGwgfSk7XG4gICAgICByZXR1cm4gaXNPcHRpb25hbCA/IFwiLz8oW15cXFxcL10rKT9cIiA6IFwiLyhbXlxcXFwvXSspXCI7XG4gICAgfVxuICApLnJlcGxhY2UoL1xcLyhbXFx3LV0rKVxcPyhcXC98JCkvZywgXCIoLyQxKT8kMlwiKTtcbiAgaWYgKHBhdGguZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgcGFyYW1zLnB1c2goeyBwYXJhbU5hbWU6IFwiKlwiIH0pO1xuICAgIHJlZ2V4cFNvdXJjZSArPSBwYXRoID09PSBcIipcIiB8fCBwYXRoID09PSBcIi8qXCIgPyBcIiguKikkXCIgOiBcIig/OlxcXFwvKC4rKXxcXFxcLyopJFwiO1xuICB9IGVsc2UgaWYgKGVuZCkge1xuICAgIHJlZ2V4cFNvdXJjZSArPSBcIlxcXFwvKiRcIjtcbiAgfSBlbHNlIGlmIChwYXRoICE9PSBcIlwiICYmIHBhdGggIT09IFwiL1wiKSB7XG4gICAgcmVnZXhwU291cmNlICs9IFwiKD86KD89XFxcXC98JCkpXCI7XG4gIH0gZWxzZSB7XG4gIH1cbiAgbGV0IG1hdGNoZXIgPSBuZXcgUmVnRXhwKHJlZ2V4cFNvdXJjZSwgY2FzZVNlbnNpdGl2ZSA/IHZvaWQgMCA6IFwiaVwiKTtcbiAgcmV0dXJuIFttYXRjaGVyLCBwYXJhbXNdO1xufVxuZnVuY3Rpb24gZGVjb2RlUGF0aCh2YWx1ZSkge1xuICB0cnkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIi9cIikubWFwKCh2KSA9PiBkZWNvZGVVUklDb21wb25lbnQodikucmVwbGFjZSgvXFwvL2csIFwiJTJGXCIpKS5qb2luKFwiL1wiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3YXJuaW5nKFxuICAgICAgZmFsc2UsXG4gICAgICBgVGhlIFVSTCBwYXRoIFwiJHt2YWx1ZX1cIiBjb3VsZCBub3QgYmUgZGVjb2RlZCBiZWNhdXNlIGl0IGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byBhIGJhZCBwZXJjZW50IGVuY29kaW5nICgke2Vycm9yfSkuYFxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGhuYW1lLCBiYXNlbmFtZSkge1xuICBpZiAoYmFzZW5hbWUgPT09IFwiL1wiKSByZXR1cm4gcGF0aG5hbWU7XG4gIGlmICghcGF0aG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGJhc2VuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbGV0IHN0YXJ0SW5kZXggPSBiYXNlbmFtZS5lbmRzV2l0aChcIi9cIikgPyBiYXNlbmFtZS5sZW5ndGggLSAxIDogYmFzZW5hbWUubGVuZ3RoO1xuICBsZXQgbmV4dENoYXIgPSBwYXRobmFtZS5jaGFyQXQoc3RhcnRJbmRleCk7XG4gIGlmIChuZXh0Q2hhciAmJiBuZXh0Q2hhciAhPT0gXCIvXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcGF0aG5hbWUuc2xpY2Uoc3RhcnRJbmRleCkgfHwgXCIvXCI7XG59XG5mdW5jdGlvbiBwcmVwZW5kQmFzZW5hbWUoe1xuICBiYXNlbmFtZSxcbiAgcGF0aG5hbWVcbn0pIHtcbiAgcmV0dXJuIHBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aG5hbWVdKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQYXRoKHRvLCBmcm9tUGF0aG5hbWUgPSBcIi9cIikge1xuICBsZXQge1xuICAgIHBhdGhuYW1lOiB0b1BhdGhuYW1lLFxuICAgIHNlYXJjaCA9IFwiXCIsXG4gICAgaGFzaCA9IFwiXCJcbiAgfSA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlUGF0aCh0bykgOiB0bztcbiAgbGV0IHBhdGhuYW1lID0gdG9QYXRobmFtZSA/IHRvUGF0aG5hbWUuc3RhcnRzV2l0aChcIi9cIikgPyB0b1BhdGhuYW1lIDogcmVzb2x2ZVBhdGhuYW1lKHRvUGF0aG5hbWUsIGZyb21QYXRobmFtZSkgOiBmcm9tUGF0aG5hbWU7XG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBub3JtYWxpemVTZWFyY2goc2VhcmNoKSxcbiAgICBoYXNoOiBub3JtYWxpem
25114VIYXNoKGhhc2gpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlUGF0aG5hbWUocmVsYXRpdmVQYXRoLCBmcm9tUGF0aG5hbWUpIHtcbiAgbGV0IHNlZ21lbnRzID0gZnJvbVBhdGhuYW1lLnJlcGxhY2UoL1xcLyskLywgXCJcIikuc3BsaXQoXCIvXCIpO1xuICBsZXQgcmVsYXRpdmVTZWdtZW50cyA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIik7XG4gIHJlbGF0aXZlU2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgIGlmIChzZWdtZW50ID09PSBcIi4uXCIpIHtcbiAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSBzZWdtZW50cy5wb3AoKTtcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgIT09IFwiLlwiKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAxID8gc2VnbWVudHMuam9pbihcIi9cIikgOiBcIi9cIjtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRQYXRoRXJyb3IoY2hhciwgZmllbGQsIGRlc3QsIHBhdGgpIHtcbiAgcmV0dXJuIGBDYW5ub3QgaW5jbHVkZSBhICcke2NoYXJ9JyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgXFxgdG8uJHtmaWVsZH1cXGAgZmllbGQgWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgcGF0aFxuICApfV0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSBcXGB0by4ke2Rlc3R9XFxgIGZpZWxkLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIGFzIGEgc3RyaW5nIGluIDxMaW5rIHRvPVwiLi4uXCI+IGFuZCB0aGUgcm91dGVyIHdpbGwgcGFyc2UgaXQgZm9yIHlvdS5gO1xufVxuZnVuY3Rpb24gZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcykge1xuICByZXR1cm4gbWF0Y2hlcy5maWx0ZXIoXG4gICAgKG1hdGNoLCBpbmRleCkgPT4gaW5kZXggPT09IDAgfHwgbWF0Y2gucm91dGUucGF0aCAmJiBtYXRjaC5yb3V0ZS5wYXRoLmxlbmd0aCA+IDBcbiAgKTtcbn1cbmZ1bmN0aW9uIGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcykge1xuICBsZXQgcGF0aE1hdGNoZXMgPSBnZXRQYXRoQ29udHJpYnV0aW5nTWF0Y2hlcyhtYXRjaGVzKTtcbiAgcmV0dXJuIHBhdGhNYXRjaGVzLm1hcChcbiAgICAobWF0Y2gsIGlkeCkgPT4gaWR4ID09PSBwYXRoTWF0Y2hlcy5sZW5ndGggLSAxID8gbWF0Y2gucGF0aG5hbWUgOiBtYXRjaC5wYXRobmFtZUJhc2VcbiAgKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUbyh0b0FyZywgcm91dGVQYXRobmFtZXMsIGxvY2F0aW9uUGF0aG5hbWUsIGlzUGF0aFJlbGF0aXZlID0gZmFsc2UpIHtcbiAgbGV0IHRvO1xuICBpZiAodHlwZW9mIHRvQXJnID09PSBcInN0cmluZ1wiKSB7XG4gICAgdG8gPSBwYXJzZVBhdGgodG9BcmcpO1xuICB9IGVsc2Uge1xuICAgIHRvID0geyAuLi50b0FyZyB9O1xuICAgIGludmFyaWFudChcbiAgICAgICF0by5wYXRobmFtZSB8fCAhdG8ucGF0aG5hbWUuaW5jbHVkZXMoXCI/XCIpLFxuICAgICAgZ2V0SW52YWxpZFBhdGhFcnJvcihcIj9cIiwgXCJwYXRobmFtZVwiLCBcInNlYXJjaFwiLCB0bylcbiAgICApO1xuICAgIGludmFyaWFudChcbiAgICAgICF0by5wYXRobmFtZSB8fCAhdG8ucGF0aG5hbWUuaW5jbHVkZXMoXCIjXCIpLFxuICAgICAgZ2V0SW52YWxpZFBhdGhFcnJvcihcIiNcIiwgXCJwYXRobmFtZVwiLCBcImhhc2hcIiwgdG8pXG4gICAgKTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICAhdG8uc2VhcmNoIHx8ICF0by5zZWFyY2guaW5jbHVkZXMoXCIjXCIpLFxuICAgICAgZ2V0SW52YWxpZFBhdGhFcnJvcihcIiNcIiwgXCJzZWFyY2hcIiwgXCJoYXNoXCIsIHRvKVxuICAgICk7XG4gIH1cbiAgbGV0IGlzRW1wdHlQYXRoID0gdG9BcmcgPT09IFwiXCIgfHwgdG8ucGF0aG5hbWUgPT09IFwiXCI7XG4gIGxldCB0b1BhdGhuYW1lID0gaXNFbXB0eVBhdGggPyBcIi9cIiA6IHRvLnBhdGhuYW1lO1xuICBsZXQgZnJvbTtcbiAgaWYgKHRvUGF0aG5hbWUgPT0gbnVsbCkge1xuICAgIGZyb20gPSBsb2NhdGlvblBhdGhuYW1lO1xuICB9IGVsc2Uge1xuICAgIGxldCByb3V0ZVBhdGhuYW1lSW5kZXggPSByb3V0ZVBhdGhuYW1lcy5sZW5ndGggLSAxO1xuICAgIGlmICghaXNQYXRoUmVsYXRpdmUgJiYgdG9QYXRobmFtZS5zdGFydHNXaXRoKFwiLi5cIikpIHtcbiAgICAgIGxldCB0b1NlZ21lbnRzID0gdG9QYXRobmFtZS5zcGxpdChcIi9cIik7XG4gICAgICB3aGlsZSAodG9TZWdtZW50c1swXSA9PT0gXCIuLlwiKSB7XG4gICAgICAgIHRvU2VnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgcm91dGVQYXRobmFtZUluZGV4IC09IDE7XG4gICAgICB9XG4gICAgICB0by5wYXRobmFtZSA9IHRvU2VnbWVudHMuam9pbihcIi9cIik7XG4gICAgfVxuICAgIGZyb20gPSByb3V0ZVBhdGhuYW1lSW5kZXggPj0gMCA/IHJvdXRlUGF0aG5hbWVzW3JvdXRlUGF0aG5hbWVJbmRleF0gOiBcIi9cIjtcbiAgfVxuICBsZXQgcGF0aCA9IHJlc29sdmVQYXRoKHRvLCBmcm9tKTtcbiAgbGV0IGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCA9IHRvUGF0aG5hbWUgJiYgdG9QYXRobmFtZSAhPT0gXCIvXCIgJiYgdG9QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIGxldCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCA9IChpc0VtcHR5UGF0aCB8fCB0b1BhdGhuYW1lID09PSBcIi5cIikgJiYgbG9jYXRpb25QYXRobmFtZS5lbmRzV2l0aChcIi9cIik7XG4gIGlmICghcGF0aC5wYXRobmFtZS5lbmRzV2l0aChcIi9cIikgJiYgKGhhc0V4cGxpY2l0VHJhaWxpbmdTbGFzaCB8fCBoYXNDdXJyZW50VHJhaWxpbmdTbGFzaCkpIHtcbiAgICBwYXRoLnBhdGhuYW1lICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxudmFyIGpvaW5QYXRocyA9IChwYXRocykgPT4gcGF0aHMuam9pbihcIi9cIikucmVwbGFjZSgvXFwvXFwvKy9nLCBcIi9cIik7XG52YXIgbm9ybWFsaXplUGF0aG5hbWUgPSAocGF0aG5hbWUpID0+IHBhdGhuYW1lLnJlcGxhY2UoL1xcLyskLywgXCJcIikucmVwbGFjZSgvXlxcLyovLCBcIi9cIik7XG52YXIgbm9ybWFsaXplU2VhcmNoID0gKHNlYXJjaCkgPT4gIXNlYXJjaCB8fCBzZWFyY2ggPT
2511409IFwiP1wiID8gXCJcIiA6IHNlYXJjaC5zdGFydHNXaXRoKFwiP1wiKSA/IHNlYXJjaCA6IFwiP1wiICsgc2VhcmNoO1xudmFyIG5vcm1hbGl6ZUhhc2ggPSAoaGFzaCkgPT4gIWhhc2ggfHwgaGFzaCA9PT0gXCIjXCIgPyBcIlwiIDogaGFzaC5zdGFydHNXaXRoKFwiI1wiKSA/IGhhc2ggOiBcIiNcIiArIGhhc2g7XG52YXIgRGF0YVdpdGhSZXNwb25zZUluaXQgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGRhdGEyLCBpbml0KSB7XG4gICAgdGhpcy50eXBlID0gXCJEYXRhV2l0aFJlc3BvbnNlSW5pdFwiO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEyO1xuICAgIHRoaXMuaW5pdCA9IGluaXQgfHwgbnVsbDtcbiAgfVxufTtcbmZ1bmN0aW9uIGRhdGEoZGF0YTIsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBEYXRhV2l0aFJlc3BvbnNlSW5pdChcbiAgICBkYXRhMixcbiAgICB0eXBlb2YgaW5pdCA9PT0gXCJudW1iZXJcIiA/IHsgc3RhdHVzOiBpbml0IH0gOiBpbml0XG4gICk7XG59XG52YXIgcmVkaXJlY3QgPSAodXJsLCBpbml0ID0gMzAyKSA9PiB7XG4gIGxldCByZXNwb25zZUluaXQgPSBpbml0O1xuICBpZiAodHlwZW9mIHJlc3BvbnNlSW5pdCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJlc3BvbnNlSW5pdCA9IHsgc3RhdHVzOiByZXNwb25zZUluaXQgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmVzcG9uc2VJbml0LnN0YXR1cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJlc3BvbnNlSW5pdC5zdGF0dXMgPSAzMDI7XG4gIH1cbiAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXNwb25zZUluaXQuaGVhZGVycyk7XG4gIGhlYWRlcnMuc2V0KFwiTG9jYXRpb25cIiwgdXJsKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IC4uLnJlc3BvbnNlSW5pdCwgaGVhZGVycyB9KTtcbn07XG52YXIgcmVkaXJlY3REb2N1bWVudCA9ICh1cmwsIGluaXQpID0+IHtcbiAgbGV0IHJlc3BvbnNlID0gcmVkaXJlY3QodXJsLCBpbml0KTtcbiAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJYLVJlbWl4LVJlbG9hZC1Eb2N1bWVudFwiLCBcInRydWVcIik7XG4gIHJldHVybiByZXNwb25zZTtcbn07XG52YXIgcmVwbGFjZSA9ICh1cmwsIGluaXQpID0+IHtcbiAgbGV0IHJlc3BvbnNlID0gcmVkaXJlY3QodXJsLCBpbml0KTtcbiAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJYLVJlbWl4LVJlcGxhY2VcIiwgXCJ0cnVlXCIpO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xudmFyIEVycm9yUmVzcG9uc2VJbXBsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihzdGF0dXMsIHN0YXR1c1RleHQsIGRhdGEyLCBpbnRlcm5hbCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCBcIlwiO1xuICAgIHRoaXMuaW50ZXJuYWwgPSBpbnRlcm5hbDtcbiAgICBpZiAoZGF0YTIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YTIudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMuZXJyb3IgPSBkYXRhMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YTI7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZXJyb3Iuc3RhdHVzVGV4dCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZXJyb3IuaW50ZXJuYWwgPT09IFwiYm9vbGVhblwiICYmIFwiZGF0YVwiIGluIGVycm9yO1xufVxuXG4vLyBsaWIvcm91dGVyL3JvdXRlci50c1xudmFyIHZhbGlkTXV0YXRpb25NZXRob2RzQXJyID0gW1xuICBcIlBPU1RcIixcbiAgXCJQVVRcIixcbiAgXCJQQVRDSFwiLFxuICBcIkRFTEVURVwiXG5dO1xudmFyIHZhbGlkTXV0YXRpb25NZXRob2RzID0gbmV3IFNldChcbiAgdmFsaWRNdXRhdGlvbk1ldGhvZHNBcnJcbik7XG52YXIgdmFsaWRSZXF1ZXN0TWV0aG9kc0FyciA9IFtcbiAgXCJHRVRcIixcbiAgLi4udmFsaWRNdXRhdGlvbk1ldGhvZHNBcnJcbl07XG52YXIgdmFsaWRSZXF1ZXN0TWV0aG9kcyA9IG5ldyBTZXQodmFsaWRSZXF1ZXN0TWV0aG9kc0Fycik7XG52YXIgcmVkaXJlY3RTdGF0dXNDb2RlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0pO1xudmFyIHJlZGlyZWN0UHJlc2VydmVNZXRob2RTdGF0dXNDb2RlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFszMDcsIDMwOF0pO1xudmFyIElETEVfTkFWSUdBVElPTiA9IHtcbiAgc3RhdGU6IFwiaWRsZVwiLFxuICBsb2NhdGlvbjogdm9pZCAwLFxuICBmb3JtTWV0aG9kOiB2b2lkIDAsXG4gIGZvcm1BY3Rpb246IHZvaWQgMCxcbiAgZm9ybUVuY1R5cGU6IHZvaWQgMCxcbiAgZm9ybURhdGE6IHZvaWQgMCxcbiAganNvbjogdm9pZCAwLFxuICB0ZXh0OiB2b2lkIDBcbn07XG52YXIgSURMRV9GRVRDSEVSID0ge1xuICBzdGF0ZTogXCJpZGxlXCIsXG4gIGRhdGE6IHZvaWQgMCxcbiAgZm9ybU1ldGhvZDogdm9pZCAwLFxuICBmb3JtQWN0aW9uOiB2b2lkIDAsXG4gIGZvcm1FbmNUeXBlOiB2b2lkIDAsXG4gIGZvcm1EYXRhOiB2b2lkIDAsXG4gIGpzb246IHZvaWQgMCxcbiAgdGV4dDogdm9pZCAwXG59O1xudmFyIElETEVfQkxPQ0tFUiA9IHtcbiAgc3RhdGU6IFwidW5ibG9ja2VkXCIsXG4gIHByb2NlZWQ6IHZvaWQgMCxcbiAgcmVzZXQ6IHZvaWQgMCxcbiAgbG9jYXRpb246IHZvaWQgMFxufTtcbnZhciBBQlNPTFVURV9VUkxfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOnxcXC9cXC8pL2k7XG52YXIgaXNBYnNvbHV0ZVVybCA9ICh1cmwpID0+IEFCU09MVVRFX1VSTF9SRUdFWC50ZXN0KHVybCk7XG52YXIgZGVmYXVsdE1hcFJvdXRlUHJvcGVydGllcyA9IChyb3V0ZSkgPT4gKHtcbiAgaGFzRXJyb3JCb3VuZGFyeTogQm9vbGVhbihyb3V0ZS5oYXNFcnJvckJvdW5kYXJ5KVxufSk7XG52YXIgVFJBTlNJVElPTlNfU1RPUkFHRV9LRVkgPSBcInJlbWl4LXJvdXRlci10cmFuc2l0aW9uc1wiO1xudmFyIFJlc2V0TG9hZGVyRGF0YVN5bWJvbCA9IFN5bWJvbChcIlJlc2V0TG9hZGVyRGF0YVwiKTtcbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihpbml0KSB7XG4gIGNvbnN0IHJvdXRlcldpbmRvdyA9IGluaXQud2luZG93ID8gaW5pdC53aW5kb3cgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdm9pZCAwO1xuICBjb25zdCBpc0Jyb3dzZXIyID0gdHlwZW9mIHJvdXRlcldpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygcm91dGVyV2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiByb3V0ZXJXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaW52YXJpYW50KFxuICAgIGluaXQucm91dGVzLmxlbmd0aCA+IDAsXG4gICAgXCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXJcIlxuICApO
251141xuICBsZXQgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzMiA9IGluaXQuaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzIHx8IFtdO1xuICBsZXQgbWFwUm91dGVQcm9wZXJ0aWVzMiA9IGluaXQubWFwUm91dGVQcm9wZXJ0aWVzIHx8IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXM7XG4gIGxldCBtYW5pZmVzdCA9IHt9O1xuICBsZXQgZGF0YVJvdXRlcyA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMoXG4gICAgaW5pdC5yb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICB2b2lkIDAsXG4gICAgbWFuaWZlc3RcbiAgKTtcbiAgbGV0IGluRmxpZ2h0RGF0YVJvdXRlcztcbiAgbGV0IGJhc2VuYW1lID0gaW5pdC5iYXNlbmFtZSB8fCBcIi9cIjtcbiAgaWYgKCFiYXNlbmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGJhc2VuYW1lID0gYC8ke2Jhc2VuYW1lfWA7XG4gIH1cbiAgbGV0IGRhdGFTdHJhdGVneUltcGwgPSBpbml0LmRhdGFTdHJhdGVneSB8fCBkZWZhdWx0RGF0YVN0cmF0ZWd5V2l0aE1pZGRsZXdhcmU7XG4gIGxldCBmdXR1cmUgPSB7XG4gICAgLi4uaW5pdC5mdXR1cmVcbiAgfTtcbiAgbGV0IHVubGlzdGVuSGlzdG9yeSA9IG51bGw7XG4gIGxldCBzdWJzY3JpYmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzYXZlZFNjcm9sbFBvc2l0aW9uczIgPSBudWxsO1xuICBsZXQgZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkyID0gbnVsbDtcbiAgbGV0IGdldFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgbGV0IGluaXRpYWxTY3JvbGxSZXN0b3JlZCA9IGluaXQuaHlkcmF0aW9uRGF0YSAhPSBudWxsO1xuICBsZXQgaW5pdGlhbE1hdGNoZXMgPSBtYXRjaFJvdXRlcyhkYXRhUm91dGVzLCBpbml0Lmhpc3RvcnkubG9jYXRpb24sIGJhc2VuYW1lKTtcbiAgbGV0IGluaXRpYWxNYXRjaGVzSXNGT1cgPSBmYWxzZTtcbiAgbGV0IGluaXRpYWxFcnJvcnMgPSBudWxsO1xuICBsZXQgaW5pdGlhbGl6ZWQ7XG4gIGlmIChpbml0aWFsTWF0Y2hlcyA9PSBudWxsICYmICFpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uKSB7XG4gICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHtcbiAgICAgIHBhdGhuYW1lOiBpbml0Lmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWVcbiAgICB9KTtcbiAgICBsZXQgeyBtYXRjaGVzLCByb3V0ZSB9ID0gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhkYXRhUm91dGVzKTtcbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgaW5pdGlhbE1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGluaXRpYWxFcnJvcnMgPSB7IFtyb3V0ZS5pZF06IGVycm9yIH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKGluaXRpYWxNYXRjaGVzICYmICFpbml0Lmh5ZHJhdGlvbkRhdGEpIHtcbiAgICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIoXG4gICAgICAgIGluaXRpYWxNYXRjaGVzLFxuICAgICAgICBkYXRhUm91dGVzLFxuICAgICAgICBpbml0Lmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlKSB7XG4gICAgICAgIGluaXRpYWxNYXRjaGVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbml0aWFsTWF0Y2hlcykge1xuICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIGluaXRpYWxNYXRjaGVzID0gW107XG4gICAgICBsZXQgZm9nT2ZXYXIgPSBjaGVja0ZvZ09mV2FyKFxuICAgICAgICBudWxsLFxuICAgICAgICBkYXRhUm91dGVzLFxuICAgICAgICBpbml0Lmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgICAgaW5pdGlhbE1hdGNoZXNJc0ZPVyA9IHRydWU7XG4gICAgICAgIGluaXRpYWxNYXRjaGVzID0gZm9nT2ZXYXIubWF0Y2hlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluaXRpYWxNYXRjaGVzLnNvbWUoKG0pID0+IG0ucm91dGUubGF6eSkpIHtcbiAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghaW5pdGlhbE1hdGNoZXMuc29tZSgobSkgPT4gcm91dGVIYXNMb2FkZXJPck1pZGRsZXdhcmUobS5yb3V0ZSkpKSB7XG4gICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBsb2FkZXJEYXRhID0gaW5pdC5oeWRyYXRpb25EYXRhID8gaW5pdC5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGEgOiBudWxsO1xuICAgICAgbGV0IGVycm9ycyA9IGluaXQuaHlkcmF0aW9uRGF0YSA/IGluaXQuaHlkcmF0aW9uRGF0YS5lcnJvcnMgOiBudWxsO1xuICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICBsZXQgaWR4ID0gaW5pdGlhbE1hdGNoZXMuZmluZEluZGV4KFxuICAgICAgICAgIChtKSA9PiBlcnJvcnNbbS5yb3V0ZS5pZF0gIT09IHZvaWQgMFxuICAgICAgICApO1xuICAgICAgICBpbml0aWFsaXplZCA9IGluaXRpYWxNYXRjaGVzLnNsaWNlKDAsIGlkeCArIDEpLmV2ZXJ5KFxuICAgICAgICAgIChtKSA9PiAhc2hvdWxkTG9hZFJvdXRlT25IeWRyYXRpb24obS5yb3V0ZSwgbG9hZGVyRGF0YSwgZXJyb3JzKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbGl6ZWQgPSBpbml0aWFsTWF0Y2hlcy5ldmVyeShcbiAgICAgICAgICAobSkgPT4gIXNob3VsZExvYWRSb3V0ZU9uSHlkcmF0aW9uKG0ucm91dGUsIGxvYWRlckRhdGEsIGVycm9ycylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IHJvdXRlcjtcbiAgbGV0IHN0YXRlID0ge1xuICAgIGhpc3RvcnlBY3Rpb246IGluaXQuaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGluaXQuaGlzdG9yeS5sb2NhdGlvbixcbiAgICBtYXRjaGVzOiBpbml0aWFsTWF0Y2hlcyxcbiAgICBpbml0aWFsaXplZCxcbiAgICBuYXZpZ2F0aW9uOiBJRExFX05BVklHQVRJT04sXG4gICAgLy8gRG9uJ3QgcmVzdG9yZSBvbiBpbml0aWFsIHVwZGF0ZVN0YXRlKCkgaWYgd2Ugd2VyZSBTU1InZFxuICAgIHJlc3RvcmVTY3JvbGxQb3NpdGlvbjogaW5pdC5oeWRyYXRpb25EYXRhICE9IG51bGwgPyBmYWxzZSA6IG51bGwsXG4gICAgcHJldmVudFNjcm9sbFJlc2V0OiBmYWxzZSxcbiAgICByZXZhbGlkYXRpb246IFwiaWRsZVwiLFxuICAgIGxvYWRlckRhdGE6IGluaXQuaHlkcmF0aW9uRGF0YSAmJiBpbml0Lmh5ZHJhdGlvbkRhdGEubG9hZGVyRGF0YSB8fCB7fSxcbiAgICBhY3Rpb25EYXRhOiBpbml0Lmh5ZHJhdGlvbkRhdGEgJiYgaW5pdC5oeWRyYXRpb25EYXRhLmFjdGlvbkRhdGEgfHwgbnVsbCxcbiAgICBlcnJvcnM6IGluaXQuaHlkcmF0aW9uRGF0YSAmJiBpbml0Lmh5ZHJhdGlvbkRhdGEuZXJyb3JzIHx8IGluaXRpYWxFcnJvcnMsXG4gICAgZmV0Y2hlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgYmxvY2tlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbiAgfTtcbiAgbGV0IHBlbmRpbmdBY3Rpb24gPSBcIlBPUFwiIC8qIFBvcCAqLztcbiAgbGV0IHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgP
25114SBmYWxzZTtcbiAgbGV0IHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlcjtcbiAgbGV0IHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgbGV0IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgcmVtb3ZlUGFnZUhpZGVFdmVudExpc3RlbmVyID0gbnVsbDtcbiAgbGV0IGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IGZhbHNlO1xuICBsZXQgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICBsZXQgY2FuY2VsbGVkRmV0Y2hlckxvYWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGZldGNoQ29udHJvbGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgaW5jcmVtZW50aW5nTG9hZElkID0gMDtcbiAgbGV0IHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkID0gLTE7XG4gIGxldCBmZXRjaFJlbG9hZElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBmZXRjaFJlZGlyZWN0SWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGZldGNoTG9hZE1hdGNoZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgYWN0aXZlRmV0Y2hlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBibG9ja2VyRnVuY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IHVuYmxvY2tCbG9ja2VySGlzdG9yeVVwZGF0ZSA9IHZvaWQgMDtcbiAgbGV0IHBlbmRpbmdSZXZhbGlkYXRpb25EZmQgPSBudWxsO1xuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIHVubGlzdGVuSGlzdG9yeSA9IGluaXQuaGlzdG9yeS5saXN0ZW4oXG4gICAgICAoeyBhY3Rpb246IGhpc3RvcnlBY3Rpb24sIGxvY2F0aW9uLCBkZWx0YSB9KSA9PiB7XG4gICAgICAgIGlmICh1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUpIHtcbiAgICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUoKTtcbiAgICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUgPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgYmxvY2tlckZ1bmN0aW9ucy5zaXplID09PSAwIHx8IGRlbHRhICE9IG51bGwsXG4gICAgICAgICAgXCJZb3UgYXJlIHRyeWluZyB0byB1c2UgYSBibG9ja2VyIG9uIGEgUE9QIG5hdmlnYXRpb24gdG8gYSBsb2NhdGlvbiB0aGF0IHdhcyBub3QgY3JlYXRlZCBieSBAcmVtaXgtcnVuL3JvdXRlci4gVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaW4gcHJvZHVjdGlvbi4gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBhcmUgbmF2aWdhdGluZyBvdXRzaWRlIHRoZSByb3V0ZXIgdmlhIGB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGVgL2B3aW5kb3cubG9jYXRpb24uaGFzaGAgaW5zdGVhZCBvZiB1c2luZyByb3V0ZXIgbmF2aWdhdGlvbiBBUElzLiAgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBjcmVhdGVIYXNoUm91dGVyIGFuZCB0aGUgdXNlciBtYW51YWxseSBjaGFuZ2VzIHRoZSBVUkwuXCJcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGJsb2NrZXJLZXkgPSBzaG91bGRCbG9ja05hdmlnYXRpb24oe1xuICAgICAgICAgIGN1cnJlbnRMb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgICAgICAgbmV4dExvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBoaXN0b3J5QWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYmxvY2tlcktleSAmJiBkZWx0YSAhPSBudWxsKSB7XG4gICAgICAgICAgbGV0IG5leHRIaXN0b3J5VXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB1bmJsb2NrQmxvY2tlckhpc3RvcnlVcGRhdGUgPSByZXNvbHZlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluaXQuaGlzdG9yeS5nbyhkZWx0YSAqIC0xKTtcbiAgICAgICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgICAgIHN0YXRlOiBcImJsb2NrZWRcIixcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcHJvY2VlZCgpIHtcbiAgICAgICAgICAgICAgdXBkYXRlQmxvY2tlcihibG9ja2VyS2V5LCB7XG4gICAgICAgICAgICAgICAgc3RhdGU6IFwicHJvY2VlZGluZ1wiLFxuICAgICAgICAgICAgICAgIHByb2NlZWQ6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICByZXNldDogdm9pZCAwLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZXh0SGlzdG9yeVVwZGF0ZVByb21pc2UudGhlbigoKSA9PiBpbml0Lmhpc3RvcnkuZ28oZGVsdGEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNldCgpIHtcbiAgICAgICAgICAgICAgbGV0IGJsb2NrZXJzID0gbmV3IE1hcChzdGF0ZS5ibG9ja2Vycyk7XG4gICAgICAgICAgICAgIGJsb2NrZXJzLnNldChibG9ja2VyS2V5LCBJRExFX0JMT0NLRVIpO1xuICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGJsb2NrZXJzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnROYXZpZ2F0aW9uKGhpc3RvcnlBY3Rpb24sIGxvY2F0aW9uKTtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChpc0Jyb3dzZXIyKSB7XG4gICAgICByZXN0b3JlQXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICBsZXQgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMgPSAoKSA9PiBwZXJzaXN0QXBwbGllZFRyYW5zaXRpb25zKHJvdXRlcldpbmRvdywgYXBwbGllZFZpZXdUcmFuc2l0aW9ucyk7XG4gICAgICByb3V0ZXJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9zYXZlQXBwbGllZFRyYW5zaXRpb25zKTtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lciA9ICgpID0+IHJvdXRlcldpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgX3NhdmVBcHBsaWVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgICBzdGFydE5hdmlnYXRpb24oXCJQT1BcIiAvKiBQb3AgKi8sIHN0YXRlLmxvY2F0aW9uLCB7XG4gICAgICAgIGluaXRpYWxIeWRyYXRpb246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGVyO1xuICB9XG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHVubGlzdGVuSGlzdG9yeSkge1xuICAgICAgdW5saXN0ZW5IaXN0b3J5KCk7XG4gICAgfVxuICAgIGlmIChyZW1vdmVQYWdlSGlkZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHJlbW92ZVBhZ2VIaWRlRXZlbnRMaXN0ZW5lcigpO1xuICAgIH1cbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBzdGF0ZS5mZXRjaGVycy5mb3JFYWNoKChfLCBrZXkpID0+IGRlbGV0ZUZldGNoZXIoa2V5KSk7XG4gICAgc3RhdGUuYmxvY2tlcnMuZm9yRWFjaCgoXywga2V5KSA9PiBkZWxldGVCbG9ja2VyKGtleSkpO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnNjcmliZShmbikge1xuICAgIHN1YnNjcmliZXJzLmFkZChmbik7XG4gICAgcmV0dXJuICgpID0+IHN1YnNjcmliZXJzLmRlbGV0ZShmb
25114ik7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdGUobmV3U3RhdGUsIG9wdHMgPSB7fSkge1xuICAgIGlmIChuZXdTdGF0ZS5tYXRjaGVzKSB7XG4gICAgICBuZXdTdGF0ZS5tYXRjaGVzID0gbmV3U3RhdGUubWF0Y2hlcy5tYXAoKG0pID0+IHtcbiAgICAgICAgbGV0IHJvdXRlID0gbWFuaWZlc3RbbS5yb3V0ZS5pZF07XG4gICAgICAgIGxldCBtYXRjaFJvdXRlID0gbS5yb3V0ZTtcbiAgICAgICAgaWYgKG1hdGNoUm91dGUuZWxlbWVudCAhPT0gcm91dGUuZWxlbWVudCB8fCBtYXRjaFJvdXRlLmVycm9yRWxlbWVudCAhPT0gcm91dGUuZXJyb3JFbGVtZW50IHx8IG1hdGNoUm91dGUuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCAhPT0gcm91dGUuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgcm91dGVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICAuLi5uZXdTdGF0ZVxuICAgIH07XG4gICAgbGV0IHVubW91bnRlZEZldGNoZXJzID0gW107XG4gICAgbGV0IG1vdW50ZWRGZXRjaGVycyA9IFtdO1xuICAgIHN0YXRlLmZldGNoZXJzLmZvckVhY2goKGZldGNoZXIsIGtleSkgPT4ge1xuICAgICAgaWYgKGZldGNoZXIuc3RhdGUgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgIGlmIChmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdW5tb3VudGVkRmV0Y2hlcnMucHVzaChrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1vdW50ZWRGZXRjaGVycy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKCFzdGF0ZS5mZXRjaGVycy5oYXMoa2V5KSAmJiAhZmV0Y2hDb250cm9sbGVycy5oYXMoa2V5KSkge1xuICAgICAgICB1bm1vdW50ZWRGZXRjaGVycy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgWy4uLnN1YnNjcmliZXJzXS5mb3JFYWNoKFxuICAgICAgKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoc3RhdGUsIHtcbiAgICAgICAgZGVsZXRlZEZldGNoZXJzOiB1bm1vdW50ZWRGZXRjaGVycyxcbiAgICAgICAgdmlld1RyYW5zaXRpb25PcHRzOiBvcHRzLnZpZXdUcmFuc2l0aW9uT3B0cyxcbiAgICAgICAgZmx1c2hTeW5jOiBvcHRzLmZsdXNoU3luYyA9PT0gdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICAgIHVubW91bnRlZEZldGNoZXJzLmZvckVhY2goKGtleSkgPT4gZGVsZXRlRmV0Y2hlcihrZXkpKTtcbiAgICBtb3VudGVkRmV0Y2hlcnMuZm9yRWFjaCgoa2V5KSA9PiBzdGF0ZS5mZXRjaGVycy5kZWxldGUoa2V5KSk7XG4gIH1cbiAgZnVuY3Rpb24gY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCBuZXdTdGF0ZSwgeyBmbHVzaFN5bmMgfSA9IHt9KSB7XG4gICAgbGV0IGlzQWN0aW9uUmVsb2FkID0gc3RhdGUuYWN0aW9uRGF0YSAhPSBudWxsICYmIHN0YXRlLm5hdmlnYXRpb24uZm9ybU1ldGhvZCAhPSBudWxsICYmIGlzTXV0YXRpb25NZXRob2Qoc3RhdGUubmF2aWdhdGlvbi5mb3JtTWV0aG9kKSAmJiBzdGF0ZS5uYXZpZ2F0aW9uLnN0YXRlID09PSBcImxvYWRpbmdcIiAmJiBsb2NhdGlvbi5zdGF0ZT8uX2lzUmVkaXJlY3QgIT09IHRydWU7XG4gICAgbGV0IGFjdGlvbkRhdGE7XG4gICAgaWYgKG5ld1N0YXRlLmFjdGlvbkRhdGEpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhuZXdTdGF0ZS5hY3Rpb25EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFjdGlvbkRhdGEgPSBuZXdTdGF0ZS5hY3Rpb25EYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FjdGlvblJlbG9hZCkge1xuICAgICAgYWN0aW9uRGF0YSA9IHN0YXRlLmFjdGlvbkRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbkRhdGEgPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbG9hZGVyRGF0YSA9IG5ld1N0YXRlLmxvYWRlckRhdGEgPyBtZXJnZUxvYWRlckRhdGEoXG4gICAgICBzdGF0ZS5sb2FkZXJEYXRhLFxuICAgICAgbmV3U3RhdGUubG9hZGVyRGF0YSxcbiAgICAgIG5ld1N0YXRlLm1hdGNoZXMgfHwgW10sXG4gICAgICBuZXdTdGF0ZS5lcnJvcnNcbiAgICApIDogc3RhdGUubG9hZGVyRGF0YTtcbiAgICBsZXQgYmxvY2tlcnMgPSBzdGF0ZS5ibG9ja2VycztcbiAgICBpZiAoYmxvY2tlcnMuc2l6ZSA+IDApIHtcbiAgICAgIGJsb2NrZXJzID0gbmV3IE1hcChibG9ja2Vycyk7XG4gICAgICBibG9ja2Vycy5mb3JFYWNoKChfLCBrKSA9PiBibG9ja2Vycy5zZXQoaywgSURMRV9CTE9DS0VSKSk7XG4gICAgfVxuICAgIGxldCByZXN0b3JlU2Nyb2xsUG9zaXRpb24gPSBpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gPyBmYWxzZSA6IGdldFNhdmVkU2Nyb2xsUG9zaXRpb24obG9jYXRpb24sIG5ld1N0YXRlLm1hdGNoZXMgfHwgc3RhdGUubWF0Y2hlcyk7XG4gICAgbGV0IHByZXZlbnRTY3JvbGxSZXNldCA9IHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgPT09IHRydWUgfHwgc3RhdGUubmF2aWdhdGlvbi5mb3JtTWV0aG9kICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdGF0ZS5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpICYmIGxvY2F0aW9uLnN0YXRlPy5faXNSZWRpcmVjdCAhPT0gdHJ1ZTtcbiAgICBpZiAoaW5GbGlnaHREYXRhUm91dGVzKSB7XG4gICAgICBkYXRhUm91dGVzID0gaW5GbGlnaHREYXRhUm91dGVzO1xuICAgICAgaW5GbGlnaHREYXRhUm91dGVzID0gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoaXNVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKSB7XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nQWN0aW9uID09PSBcIlBPUFwiIC8qIFBvcCAqLykge1xuICAgIH0gZWxzZSBpZiAocGVuZGluZ0FjdGlvbiA9PT0gXCJQVVNIXCIgLyogUHVzaCAqLykge1xuICAgICAgaW5pdC5oaXN0b3J5LnB1c2gobG9jYXRpb24sIGxvY2F0aW9uLnN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdBY3Rpb24gPT09IFwiUkVQTEFDRVwiIC8qIFJlcGxhY2UgKi8pIHtcbiAgICAgIGluaXQuaGlzdG9yeS5yZXBsYWNlKGxvY2F0aW9uLCBsb2NhdGlvbi5zdGF0ZSk7XG4gICAgfVxuICAgIGxldCB2aWV3VHJhbnNpdGlvbk9wdHM7XG4gICAgaWYgKHBlbmRpbmdBY3Rpb24gPT09IFwiUE9QXCIgLyogUG9wICovKSB7XG4gICAgICBsZXQgcHJpb3JQYXRocyA9IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuZ2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGlmIChwcmlvclBhdGhzICYmIHByaW9yUGF0aHMuaGFzKGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMgP
25114SB7XG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgICAgICBuZXh0TG9jYXRpb246IGxvY2F0aW9uXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuaGFzKGxvY2F0aW9uLnBhdGhuYW1lKSkge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMgPSB7XG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgICAgICBuZXh0TG9jYXRpb246IHN0YXRlLmxvY2F0aW9uXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nVmlld1RyYW5zaXRpb25FbmFibGVkKSB7XG4gICAgICBsZXQgdG9QYXRocyA9IGFwcGxpZWRWaWV3VHJhbnNpdGlvbnMuZ2V0KHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIGlmICh0b1BhdGhzKSB7XG4gICAgICAgIHRvUGF0aHMuYWRkKGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvUGF0aHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbbG9jYXRpb24ucGF0aG5hbWVdKTtcbiAgICAgICAgYXBwbGllZFZpZXdUcmFuc2l0aW9ucy5zZXQoc3RhdGUubG9jYXRpb24ucGF0aG5hbWUsIHRvUGF0aHMpO1xuICAgICAgfVxuICAgICAgdmlld1RyYW5zaXRpb25PcHRzID0ge1xuICAgICAgICBjdXJyZW50TG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgICBuZXh0TG9jYXRpb246IGxvY2F0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICAgIC8vIG1hdGNoZXMsIGVycm9ycywgZmV0Y2hlcnMgZ28gdGhyb3VnaCBhcy1pc1xuICAgICAgICBhY3Rpb25EYXRhLFxuICAgICAgICBsb2FkZXJEYXRhLFxuICAgICAgICBoaXN0b3J5QWN0aW9uOiBwZW5kaW5nQWN0aW9uLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgaW5pdGlhbGl6ZWQ6IHRydWUsXG4gICAgICAgIG5hdmlnYXRpb246IElETEVfTkFWSUdBVElPTixcbiAgICAgICAgcmV2YWxpZGF0aW9uOiBcImlkbGVcIixcbiAgICAgICAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgIGJsb2NrZXJzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2aWV3VHJhbnNpdGlvbk9wdHMsXG4gICAgICAgIGZsdXNoU3luYzogZmx1c2hTeW5jID09PSB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgICBwZW5kaW5nQWN0aW9uID0gXCJQT1BcIiAvKiBQb3AgKi87XG4gICAgcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCA9IGZhbHNlO1xuICAgIHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICBpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gZmFsc2U7XG4gICAgcGVuZGluZ1JldmFsaWRhdGlvbkRmZD8ucmVzb2x2ZSgpO1xuICAgIHBlbmRpbmdSZXZhbGlkYXRpb25EZmQgPSBudWxsO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKHRvLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB0byA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaW5pdC5oaXN0b3J5LmdvKHRvKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplVG8oXG4gICAgICBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIHN0YXRlLm1hdGNoZXMsXG4gICAgICBiYXNlbmFtZSxcbiAgICAgIHRvLFxuICAgICAgb3B0cz8uZnJvbVJvdXRlSWQsXG4gICAgICBvcHRzPy5yZWxhdGl2ZVxuICAgICk7XG4gICAgbGV0IHsgcGF0aCwgc3VibWlzc2lvbiwgZXJyb3IgfSA9IG5vcm1hbGl6ZU5hdmlnYXRlT3B0aW9ucyhcbiAgICAgIGZhbHNlLFxuICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICBvcHRzXG4gICAgKTtcbiAgICBsZXQgY3VycmVudExvY2F0aW9uID0gc3RhdGUubG9jYXRpb247XG4gICAgbGV0IG5leHRMb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHN0YXRlLmxvY2F0aW9uLCBwYXRoLCBvcHRzICYmIG9wdHMuc3RhdGUpO1xuICAgIG5leHRMb2NhdGlvbiA9IHtcbiAgICAgIC4uLm5leHRMb2NhdGlvbixcbiAgICAgIC4uLmluaXQuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihuZXh0TG9jYXRpb24pXG4gICAgfTtcbiAgICBsZXQgdXNlclJlcGxhY2UgPSBvcHRzICYmIG9wdHMucmVwbGFjZSAhPSBudWxsID8gb3B0cy5yZXBsYWNlIDogdm9pZCAwO1xuICAgIGxldCBoaXN0b3J5QWN0aW9uID0gXCJQVVNIXCIgLyogUHVzaCAqLztcbiAgICBpZiAodXNlclJlcGxhY2UgPT09IHRydWUpIHtcbiAgICAgIGhpc3RvcnlBY3Rpb24gPSBcIlJFUExBQ0VcIiAvKiBSZXBsYWNlICovO1xuICAgIH0gZWxzZSBpZiAodXNlclJlcGxhY2UgPT09IGZhbHNlKSB7XG4gICAgfSBlbHNlIGlmIChzdWJtaXNzaW9uICE9IG51bGwgJiYgaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpICYmIHN1Ym1pc3Npb24uZm9ybUFjdGlvbiA9PT0gc3RhdGUubG9jYXRpb24ucGF0aG5hbWUgKyBzdGF0ZS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIGhpc3RvcnlBY3Rpb24gPSBcIlJFUExBQ0VcIiAvKiBSZXBsYWNlICovO1xuICAgIH1cbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gb3B0cyAmJiBcInByZXZlbnRTY3JvbGxSZXNldFwiIGluIG9wdHMgPyBvcHRzLnByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSA6IHZvaWQgMDtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCBibG9ja2VyS2V5ID0gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICAgIGN1cnJlbnRMb2NhdGlvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGhpc3RvcnlBY3Rpb25cbiAgICB9KTtcbiAgICBpZiAoYmxvY2tlcktleSkge1xuICAgICAgdXBkYXRlQmxvY2tlcihibG9ja2VyS2V5LCB7XG4gICAgICAgIHN0YXRlOiBcImJsb2NrZWRcIixcbiAgICAgICAgbG9jYXRpb246IG5leHRMb2NhdGlvbixcbiAgICAgICAgcHJvY2VlZCgpIHtcbiAgICAgICAgICB1cGRhdGVCbG9ja2VyKGJsb2NrZXJLZXksIHtcbiAgICAgICAgICAgI
25114HN0YXRlOiBcInByb2NlZWRpbmdcIixcbiAgICAgICAgICAgIHByb2NlZWQ6IHZvaWQgMCxcbiAgICAgICAgICAgIHJlc2V0OiB2b2lkIDAsXG4gICAgICAgICAgICBsb2NhdGlvbjogbmV4dExvY2F0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbmF2aWdhdGUodG8sIG9wdHMpO1xuICAgICAgICB9LFxuICAgICAgICByZXNldCgpIHtcbiAgICAgICAgICBsZXQgYmxvY2tlcnMgPSBuZXcgTWFwKHN0YXRlLmJsb2NrZXJzKTtcbiAgICAgICAgICBibG9ja2Vycy5zZXQoYmxvY2tlcktleSwgSURMRV9CTE9DS0VSKTtcbiAgICAgICAgICB1cGRhdGVTdGF0ZSh7IGJsb2NrZXJzIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgc3RhcnROYXZpZ2F0aW9uKGhpc3RvcnlBY3Rpb24sIG5leHRMb2NhdGlvbiwge1xuICAgICAgc3VibWlzc2lvbixcbiAgICAgIC8vIFNlbmQgdGhyb3VnaCB0aGUgZm9ybURhdGEgc2VyaWFsaXphdGlvbiBlcnJvciBpZiB3ZSBoYXZlIG9uZSBzbyB3ZSBjYW5cbiAgICAgIC8vIHJlbmRlciBhdCB0aGUgcmlnaHQgZXJyb3IgYm91bmRhcnkgYWZ0ZXIgd2UgbWF0Y2ggcm91dGVzXG4gICAgICBwZW5kaW5nRXJyb3I6IGVycm9yLFxuICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgcmVwbGFjZTogb3B0cyAmJiBvcHRzLnJlcGxhY2UsXG4gICAgICBlbmFibGVWaWV3VHJhbnNpdGlvbjogb3B0cyAmJiBvcHRzLnZpZXdUcmFuc2l0aW9uLFxuICAgICAgZmx1c2hTeW5jXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gcmV2YWxpZGF0ZSgpIHtcbiAgICBpZiAoIXBlbmRpbmdSZXZhbGlkYXRpb25EZmQpIHtcbiAgICAgIHBlbmRpbmdSZXZhbGlkYXRpb25EZmQgPSBjcmVhdGVEZWZlcnJlZCgpO1xuICAgIH1cbiAgICBpbnRlcnJ1cHRBY3RpdmVMb2FkcygpO1xuICAgIHVwZGF0ZVN0YXRlKHsgcmV2YWxpZGF0aW9uOiBcImxvYWRpbmdcIiB9KTtcbiAgICBsZXQgcHJvbWlzZSA9IHBlbmRpbmdSZXZhbGlkYXRpb25EZmQucHJvbWlzZTtcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJzdWJtaXR0aW5nXCIpIHtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHN0YXJ0TmF2aWdhdGlvbihzdGF0ZS5oaXN0b3J5QWN0aW9uLCBzdGF0ZS5sb2NhdGlvbiwge1xuICAgICAgICBzdGFydFVuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb246IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHN0YXJ0TmF2aWdhdGlvbihcbiAgICAgIHBlbmRpbmdBY3Rpb24gfHwgc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICAgIHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sXG4gICAgICB7XG4gICAgICAgIG92ZXJyaWRlTmF2aWdhdGlvbjogc3RhdGUubmF2aWdhdGlvbixcbiAgICAgICAgLy8gUHJveHkgdGhyb3VnaCBhbnkgcmVuZGluZyB2aWV3IHRyYW5zaXRpb25cbiAgICAgICAgZW5hYmxlVmlld1RyYW5zaXRpb246IHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgPT09IHRydWVcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TmF2aWdhdGlvbihoaXN0b3J5QWN0aW9uLCBsb2NhdGlvbiwgb3B0cykge1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlciAmJiBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIHBlbmRpbmdBY3Rpb24gPSBoaXN0b3J5QWN0aW9uO1xuICAgIGlzVW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbiA9IChvcHRzICYmIG9wdHMuc3RhcnRVbmludGVycnVwdGVkUmV2YWxpZGF0aW9uKSA9PT0gdHJ1ZTtcbiAgICBzYXZlU2Nyb2xsUG9zaXRpb24oc3RhdGUubG9jYXRpb24sIHN0YXRlLm1hdGNoZXMpO1xuICAgIHBlbmRpbmdQcmV2ZW50U2Nyb2xsUmVzZXQgPSAob3B0cyAmJiBvcHRzLnByZXZlbnRTY3JvbGxSZXNldCkgPT09IHRydWU7XG4gICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA9IChvcHRzICYmIG9wdHMuZW5hYmxlVmlld1RyYW5zaXRpb24pID09PSB0cnVlO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCBsb2FkaW5nTmF2aWdhdGlvbiA9IG9wdHMgJiYgb3B0cy5vdmVycmlkZU5hdmlnYXRpb247XG4gICAgbGV0IG1hdGNoZXMgPSBvcHRzPy5pbml0aWFsSHlkcmF0aW9uICYmIHN0YXRlLm1hdGNoZXMgJiYgc3RhdGUubWF0Y2hlcy5sZW5ndGggPiAwICYmICFpbml0aWFsTWF0Y2hlc0lzRk9XID8gKFxuICAgICAgLy8gYG1hdGNoUm91dGVzKClgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIHdlJ3JlIGluIGhlcmUgdmlhIGByb3V0ZXIuaW5pdGlhbGl6ZSgpYFxuICAgICAgc3RhdGUubWF0Y2hlc1xuICAgICkgOiBtYXRjaFJvdXRlcyhyb3V0ZXNUb1VzZSwgbG9jYXRpb24sIGJhc2VuYW1lKTtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGlmIChtYXRjaGVzICYmIHN0YXRlLmluaXRpYWxpemVkICYmICFpc1JldmFsaWRhdGlvblJlcXVpcmVkICYmIGlzSGFzaENoYW5nZU9ubHkoc3RhdGUubG9jYXRpb24sIGxvY2F0aW9uKSAmJiAhKG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qob3B0cy5zdWJtaXNzaW9uLmZvcm1NZXRob2QpKSkge1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKGxvY2F0aW9uLCB7IG1hdGNoZXMgfSwgeyBmbHVzaFN5bmMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIobWF0Y2hlcywgcm91dGVzVG9Vc2UsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMgPSBmb2dPZldhci5tYXRjaGVzO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGxldCB7IGVycm9yLCBub3RGb3VuZE1hdGNoZXMsIHJvdXRlIH0gPSBoYW5kbGVOYXZpZ2F0aW9uYWw0MDQoXG4gICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICApO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAge1xuICAgICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgIFtyb3V0ZS5pZF06IGVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IGZsdXNoU3luYyB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGV0IHJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChcbiAgICAgIGluaXQuaGlzdG9yeSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyLnNpZ25hbCxcbiAgICAgIG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uXG4gICAgKTtcbiAgICBsZXQgc2NvcGVkQ29udGV4dCA9IGluaXQuZ2V0Q29udGV4dCA/IGF3YWl0IGluaXQuZ2V0Q29udGV4dCgpIDogbmV3IFJvdXRlckNvbnRleHRQcm92aWRlcigpO1xuICAgIGxldCBwZW5kaW5nQWN0aW9uUmVzdWx0O1xuICAgIGlmIChvcHRzICYmIG9wdHMucGVuZGluZ0Vycm9yKSB7XG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0ID0gW1xuICAgICAgICBmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMpLnJvdXRlLmlkLFxuICAgICAgICB7IHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLywgZXJyb3I6IG9wdHMucGVuZGluZ0Vycm9yIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIGlmIChvcHRzICYmIG9wdHMuc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKG9wdHMuc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgbGV0IGFjdGlvblJlc3VsdCA9IGF3YWl0IGhhbmRsZUFjdGlvbihcbiAgICAgICAgcmVxdW
25114VzdCxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIG9wdHMuc3VibWlzc2lvbixcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgICAgZm9nT2ZXYXIuYWN0aXZlLFxuICAgICAgICBvcHRzICYmIG9wdHMuaW5pdGlhbEh5ZHJhdGlvbiA9PT0gdHJ1ZSxcbiAgICAgICAgeyByZXBsYWNlOiBvcHRzLnJlcGxhY2UsIGZsdXNoU3luYyB9XG4gICAgICApO1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5zaG9ydENpcmN1aXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LnBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgICAgICAgbGV0IFtyb3V0ZUlkLCByZXN1bHRdID0gYWN0aW9uUmVzdWx0LnBlbmRpbmdBY3Rpb25SZXN1bHQ7XG4gICAgICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkgJiYgaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LmVycm9yKSAmJiByZXN1bHQuZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICAgIGNvbXBsZXRlTmF2aWdhdGlvbihsb2NhdGlvbiwge1xuICAgICAgICAgICAgbWF0Y2hlczogYWN0aW9uUmVzdWx0Lm1hdGNoZXMsXG4gICAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgICBbcm91dGVJZF06IHJlc3VsdC5lcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF0Y2hlcyA9IGFjdGlvblJlc3VsdC5tYXRjaGVzIHx8IG1hdGNoZXM7XG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0ID0gYWN0aW9uUmVzdWx0LnBlbmRpbmdBY3Rpb25SZXN1bHQ7XG4gICAgICBsb2FkaW5nTmF2aWdhdGlvbiA9IGdldExvYWRpbmdOYXZpZ2F0aW9uKGxvY2F0aW9uLCBvcHRzLnN1Ym1pc3Npb24pO1xuICAgICAgZmx1c2hTeW5jID0gZmFsc2U7XG4gICAgICBmb2dPZldhci5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChcbiAgICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgcmVxdWVzdC5zaWduYWxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCB7XG4gICAgICBzaG9ydENpcmN1aXRlZCxcbiAgICAgIG1hdGNoZXM6IHVwZGF0ZWRNYXRjaGVzLFxuICAgICAgbG9hZGVyRGF0YSxcbiAgICAgIGVycm9yc1xuICAgIH0gPSBhd2FpdCBoYW5kbGVMb2FkZXJzKFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICBmb2dPZldhci5hY3RpdmUsXG4gICAgICBsb2FkaW5nTmF2aWdhdGlvbixcbiAgICAgIG9wdHMgJiYgb3B0cy5zdWJtaXNzaW9uLFxuICAgICAgb3B0cyAmJiBvcHRzLmZldGNoZXJTdWJtaXNzaW9uLFxuICAgICAgb3B0cyAmJiBvcHRzLnJlcGxhY2UsXG4gICAgICBvcHRzICYmIG9wdHMuaW5pdGlhbEh5ZHJhdGlvbiA9PT0gdHJ1ZSxcbiAgICAgIGZsdXNoU3luYyxcbiAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHRcbiAgICApO1xuICAgIGlmIChzaG9ydENpcmN1aXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIGNvbXBsZXRlTmF2aWdhdGlvbihsb2NhdGlvbiwge1xuICAgICAgbWF0Y2hlczogdXBkYXRlZE1hdGNoZXMgfHwgbWF0Y2hlcyxcbiAgICAgIC4uLmdldEFjdGlvbkRhdGFGb3JDb21taXQocGVuZGluZ0FjdGlvblJlc3VsdCksXG4gICAgICBsb2FkZXJEYXRhLFxuICAgICAgZXJyb3JzXG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQWN0aW9uKHJlcXVlc3QsIGxvY2F0aW9uLCBzdWJtaXNzaW9uLCBtYXRjaGVzLCBzY29wZWRDb250ZXh0LCBpc0ZvZ09mV2FyLCBpbml0aWFsSHlkcmF0aW9uLCBvcHRzID0ge30pIHtcbiAgICBpbnRlcnJ1cHRBY3RpdmVMb2FkcygpO1xuICAgIGxldCBuYXZpZ2F0aW9uID0gZ2V0U3VibWl0dGluZ05hdmlnYXRpb24obG9jYXRpb24sIHN1Ym1pc3Npb24pO1xuICAgIHVwZGF0ZVN0YXRlKHsgbmF2aWdhdGlvbiB9LCB7IGZsdXNoU3luYzogb3B0cy5mbHVzaFN5bmMgPT09IHRydWUgfSk7XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGxldCBkaXNjb3ZlclJlc3VsdCA9IGF3YWl0IGRpc2NvdmVyUm91dGVzKFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgcmVxdWVzdC5zaWduYWxcbiAgICAgICk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvcnRDaXJjdWl0ZWQ6IHRydWUgfTtcbiAgICAgIH0gZWxzZSBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGlmIChkaXNjb3ZlclJlc3VsdC5wYXJ0aWFsTWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsZXQgeyBtYXRjaGVzOiBtYXRjaGVzMiwgcm91dGUgfSA9IGdldFNob3J0Q2lyY3VpdE1hdGNoZXMoZGF0YVJvdXRlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoZXM6IG1hdGNoZXMyLFxuICAgICAgICAgICAgcGVuZGluZ0FjdGlvblJlc3VsdDogW1xuICAgICAgICAgICAgICByb3V0ZS5pZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgICAgICAgICBlcnJvcjogZGlzY292ZXJSZXN1bHQuZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvdW5kYXJ5SWQgPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KGRpc2NvdmVyUmVzdWx0LnBhcnRpYWxNYXRjaGVzKS5yb3V0ZS5pZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXRjaGVzOiBkaXNjb3ZlclJlc3VsdC5wYXJ0aWFsTWF0Y2hlcyxcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbXG4gICAgICAgICAgICBib3VuZGFyeUlkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eX
25114BlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgICAgICAgIGVycm9yOiBkaXNjb3ZlclJlc3VsdC5lcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgbGV0IHsgbm90Rm91bmRNYXRjaGVzLCBlcnJvciwgcm91dGUgfSA9IGhhbmRsZU5hdmlnYXRpb25hbDQwNChcbiAgICAgICAgICBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0OiBbXG4gICAgICAgICAgICByb3V0ZS5pZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLFxuICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXMgPSBkaXNjb3ZlclJlc3VsdC5tYXRjaGVzO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmVzdWx0O1xuICAgIGxldCBhY3Rpb25NYXRjaCA9IGdldFRhcmdldE1hdGNoKG1hdGNoZXMsIGxvY2F0aW9uKTtcbiAgICBpZiAoIWFjdGlvbk1hdGNoLnJvdXRlLmFjdGlvbiAmJiAhYWN0aW9uTWF0Y2gucm91dGUubGF6eSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgIGVycm9yOiBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHJvdXRlSWQ6IGFjdGlvbk1hdGNoLnJvdXRlLmlkXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHNNYXRjaGVzID0gZ2V0VGFyZ2V0ZWREYXRhU3RyYXRlZ3lNYXRjaGVzKFxuICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgYWN0aW9uTWF0Y2gsXG4gICAgICAgIGluaXRpYWxIeWRyYXRpb24gPyBbXSA6IGh5ZHJhdGlvblJvdXRlUHJvcGVydGllczIsXG4gICAgICAgIHNjb3BlZENvbnRleHRcbiAgICAgICk7XG4gICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRzTWF0Y2hlcyxcbiAgICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdHNbYWN0aW9uTWF0Y2gucm91dGUuaWRdO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgIGlmIChyZXN1bHRzW21hdGNoLnJvdXRlLmlkXSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1JlZGlyZWN0UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIGxldCByZXBsYWNlMjtcbiAgICAgIGlmIChvcHRzICYmIG9wdHMucmVwbGFjZSAhPSBudWxsKSB7XG4gICAgICAgIHJlcGxhY2UyID0gb3B0cy5yZXBsYWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGxvY2F0aW9uMiA9IG5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb24oXG4gICAgICAgICAgcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIiksXG4gICAgICAgICAgbmV3IFVSTChyZXF1ZXN0LnVybCksXG4gICAgICAgICAgYmFzZW5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgcmVwbGFjZTIgPSBsb2NhdGlvbjIgPT09IHN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lICsgc3RhdGUubG9jYXRpb24uc2VhcmNoO1xuICAgICAgfVxuICAgICAgYXdhaXQgc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24ocmVxdWVzdCwgcmVzdWx0LCB0cnVlLCB7XG4gICAgICAgIHN1Ym1pc3Npb24sXG4gICAgICAgIHJlcGxhY2U6IHJlcGxhY2UyXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBhY3Rpb25NYXRjaC5yb3V0ZS5pZCk7XG4gICAgICBpZiAoKG9wdHMgJiYgb3B0cy5yZXBsYWNlKSAhPT0gdHJ1ZSkge1xuICAgICAgICBwZW5kaW5nQWN0aW9uID0gXCJQVVNIXCIgLyogUHVzaCAqLztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHQ6IFtcbiAgICAgICAgICBib3VuZGFyeU1hdGNoLnJvdXRlLmlkLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBhY3Rpb25NYXRjaC5yb3V0ZS5pZFxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbWF0Y2hlcyxcbiAgICAgIHBlbmRpbmdBY3Rpb25SZXN1bHQ6IFthY3Rpb25NYXRjaC5yb3V0ZS5pZCwgcmVzdWx0XVxuICAgIH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlTG9hZGVycyhyZXF1ZXN0LCBsb2NhdGlvbiwgbWF0Y2hlcywgc2NvcGVkQ29udGV4dCwgaXNGb2dPZldhciwgb3ZlcnJpZGVOYXZpZ2F0aW9uLCBzdWJtaXNzaW9uLCBmZXRjaGVyU3VibWlzc2lvbiwgcmVwbGFjZTIsIGluaXRpYWxIeWRyYXRpb24sIGZsdXNoU3luYywgcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIGxldCBsb2FkaW5nTmF2aWdhdGlvbiA9IG92ZXJyaWRlTmF2aWdhdGlvbiB8fCBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbik7XG4gICAgbGV0IGFjdGl2ZVN1Ym1pc3Npb24gPSBzdWJtaXNzaW9uIHx8IGZldGNoZXJTdWJtaXNzaW9uIHx8IGdldFN1Ym1pc3Npb25Gcm9tTmF2aWdhdGlvbihsb2FkaW5nTmF2aWdhdGlvbik7XG4gICAgbGV0IHNob3VsZFVwZGF0ZU5hdmlnYXRpb25TdGF0ZSA9ICFpc1VuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24gJiYgIWluaXRpYWxIeWRyYXRpb247XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVOYXZpZ2F0aW9uU3RhdGUpIHtcbiAgICAgICAgbGV0IGFjdGlvbkRhdGEgPSBnZXRVcGRhdGVkQWN0aW9uRGF0YShwZW5kaW5nQWN0aW9uUmVzdWx0KTtcbiAgICAgICAgdXBkYXRlU3RhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmF2aWdhdGlvbjogbG9hZGluZ05hdmlnYXRpb24sXG4gICAgICAgICAgICAuLi5hY3Rpb25EYXRhICE9PSB2b2lkIDAgPyB7IGFjdGlvbkRhdGEgfSA6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmbHVzaFN5bmNcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgZGlzY292ZXJSZXN1bHQgPSBhd2FpdCBkaXNjb3ZlclJvdXRlcyhcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgI
25114HJlcXVlc3Quc2lnbmFsXG4gICAgICApO1xuICAgICAgaWYgKGRpc2NvdmVyUmVzdWx0LnR5cGUgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgICB9IGVsc2UgaWYgKGRpc2NvdmVyUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICBpZiAoZGlzY292ZXJSZXN1bHQucGFydGlhbE1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbGV0IHsgbWF0Y2hlczogbWF0Y2hlczIsIHJvdXRlIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKGRhdGFSb3V0ZXMpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzMixcbiAgICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgICAgZXJyb3JzOiB7XG4gICAgICAgICAgICAgIFtyb3V0ZS5pZF06IGRpc2NvdmVyUmVzdWx0LmVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYm91bmRhcnlJZCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoZGlzY292ZXJSZXN1bHQucGFydGlhbE1hdGNoZXMpLnJvdXRlLmlkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IGRpc2NvdmVyUmVzdWx0LnBhcnRpYWxNYXRjaGVzLFxuICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgW2JvdW5kYXJ5SWRdOiBkaXNjb3ZlclJlc3VsdC5lcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoIWRpc2NvdmVyUmVzdWx0Lm1hdGNoZXMpIHtcbiAgICAgICAgbGV0IHsgZXJyb3IsIG5vdEZvdW5kTWF0Y2hlcywgcm91dGUgfSA9IGhhbmRsZU5hdmlnYXRpb25hbDQwNChcbiAgICAgICAgICBsb2NhdGlvbi5wYXRobmFtZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgIFtyb3V0ZS5pZF06IGVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF0Y2hlcyA9IGRpc2NvdmVyUmVzdWx0Lm1hdGNoZXM7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCB7IGRzTWF0Y2hlcywgcmV2YWxpZGF0aW5nRmV0Y2hlcnMgfSA9IGdldE1hdGNoZXNUb0xvYWQoXG4gICAgICByZXF1ZXN0LFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIGluaXQuaGlzdG9yeSxcbiAgICAgIHN0YXRlLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIGFjdGl2ZVN1Ym1pc3Npb24sXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGluaXRpYWxIeWRyYXRpb24gPyBbXSA6IGh5ZHJhdGlvblJvdXRlUHJvcGVydGllczIsXG4gICAgICBpbml0aWFsSHlkcmF0aW9uID09PSB0cnVlLFxuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCxcbiAgICAgIGNhbmNlbGxlZEZldGNoZXJMb2FkcyxcbiAgICAgIGZldGNoZXJzUXVldWVkRm9yRGVsZXRpb24sXG4gICAgICBmZXRjaExvYWRNYXRjaGVzLFxuICAgICAgZmV0Y2hSZWRpcmVjdElkcyxcbiAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICBpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uICE9IG51bGwsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0XG4gICAgKTtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCA9ICsraW5jcmVtZW50aW5nTG9hZElkO1xuICAgIGlmICghaW5pdC5kYXRhU3RyYXRlZ3kgJiYgIWRzTWF0Y2hlcy5zb21lKChtKSA9PiBtLnNob3VsZExvYWQpICYmICFkc01hdGNoZXMuc29tZShcbiAgICAgIChtKSA9PiBtLnJvdXRlLm1pZGRsZXdhcmUgJiYgbS5yb3V0ZS5taWRkbGV3YXJlLmxlbmd0aCA+IDBcbiAgICApICYmIHJldmFsaWRhdGluZ0ZldGNoZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbGV0IHVwZGF0ZWRGZXRjaGVyczIgPSBtYXJrRmV0Y2hSZWRpcmVjdHNEb25lKCk7XG4gICAgICBjb21wbGV0ZU5hdmlnYXRpb24oXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICAvLyBDb21taXQgcGVuZGluZyBlcnJvciBpZiB3ZSdyZSBzaG9ydCBjaXJjdWl0aW5nXG4gICAgICAgICAgZXJyb3JzOiBwZW5kaW5nQWN0aW9uUmVzdWx0ICYmIGlzRXJyb3JSZXN1bHQocGVuZGluZ0FjdGlvblJlc3VsdFsxXSkgPyB7IFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvciB9IDogbnVsbCxcbiAgICAgICAgICAuLi5nZXRBY3Rpb25EYXRhRm9yQ29tbWl0KHBlbmRpbmdBY3Rpb25SZXN1bHQpLFxuICAgICAgICAgIC4uLnVwZGF0ZWRGZXRjaGVyczIgPyB7IGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKSB9IDoge31cbiAgICAgICAgfSxcbiAgICAgICAgeyBmbHVzaFN5bmMgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChzaG91bGRVcGRhdGVOYXZpZ2F0aW9uU3RhdGUpIHtcbiAgICAgIGxldCB1cGRhdGVzID0ge307XG4gICAgICBpZiAoIWlzRm9nT2ZXYXIpIHtcbiAgICAgICAgdXBkYXRlcy5uYXZpZ2F0aW9uID0gbG9hZGluZ05hdmlnYXRpb247XG4gICAgICAgIGxldCBhY3Rpb25EYXRhID0gZ2V0VXBkYXRlZEFjdGlvbkRhdGEocGVuZGluZ0FjdGlvblJlc3VsdCk7XG4gICAgICAgIGlmIChhY3Rpb25EYXRhICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB1cGRhdGVzLmFjdGlvbkRhdGEgPSBhY3Rpb25EYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmV2YWxpZGF0aW5nRmV0Y2hlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB1cGRhdGVzLmZldGNoZXJzID0gZ2V0VXBkYXRlZFJldmFsaWRhdGluZ0ZldGNoZXJzKHJldmFsaWRhdGluZ0ZldGNoZXJzKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVN0YXRlKHVwZGF0ZXMsIHsgZmx1c2hTeW5jIH0pO1xuICAgIH1cbiAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKChyZikgPT4ge1xuICAgICAgYWJvcnRGZXRjaGVyKHJmLmtleSk7XG4gICAgICBpZiAocmYuY29udHJvbGxlcikge1xuICAgICAgICBmZXRjaENvbnRyb2xsZXJzLnNldChyZi5rZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMgPSAoKSA9PiByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKChmKSA9PiBhYm9ydEZldGNoZXIoZi
251145rZXkpKTtcbiAgICBpZiAocGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyKSB7XG4gICAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgYWJvcnRQZW5kaW5nRmV0Y2hSZXZhbGlkYXRpb25zXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgeyBsb2FkZXJSZXN1bHRzLCBmZXRjaGVyUmVzdWx0cyB9ID0gYXdhaXQgY2FsbExvYWRlcnNBbmRNYXliZVJlc29sdmVEYXRhKFxuICAgICAgZHNNYXRjaGVzLFxuICAgICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsXG4gICAgICByZXF1ZXN0LFxuICAgICAgc2NvcGVkQ29udGV4dFxuICAgICk7XG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiB7IHNob3J0Q2lyY3VpdGVkOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIpIHtcbiAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goKHJmKSA9PiBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShyZi5rZXkpKTtcbiAgICBsZXQgcmVkaXJlY3QyID0gZmluZFJlZGlyZWN0KGxvYWRlclJlc3VsdHMpO1xuICAgIGlmIChyZWRpcmVjdDIpIHtcbiAgICAgIGF3YWl0IHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHJlcXVlc3QsIHJlZGlyZWN0Mi5yZXN1bHQsIHRydWUsIHtcbiAgICAgICAgcmVwbGFjZTogcmVwbGFjZTJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgc2hvcnRDaXJjdWl0ZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgcmVkaXJlY3QyID0gZmluZFJlZGlyZWN0KGZldGNoZXJSZXN1bHRzKTtcbiAgICBpZiAocmVkaXJlY3QyKSB7XG4gICAgICBmZXRjaFJlZGlyZWN0SWRzLmFkZChyZWRpcmVjdDIua2V5KTtcbiAgICAgIGF3YWl0IHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKHJlcXVlc3QsIHJlZGlyZWN0Mi5yZXN1bHQsIHRydWUsIHtcbiAgICAgICAgcmVwbGFjZTogcmVwbGFjZTJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgc2hvcnRDaXJjdWl0ZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgbGV0IHsgbG9hZGVyRGF0YSwgZXJyb3JzIH0gPSBwcm9jZXNzTG9hZGVyRGF0YShcbiAgICAgIHN0YXRlLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIGxvYWRlclJlc3VsdHMsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0LFxuICAgICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsXG4gICAgICBmZXRjaGVyUmVzdWx0c1xuICAgICk7XG4gICAgaWYgKGluaXRpYWxIeWRyYXRpb24gJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgICBlcnJvcnMgPSB7IC4uLnN0YXRlLmVycm9ycywgLi4uZXJyb3JzIH07XG4gICAgfVxuICAgIGxldCB1cGRhdGVkRmV0Y2hlcnMgPSBtYXJrRmV0Y2hSZWRpcmVjdHNEb25lKCk7XG4gICAgbGV0IGRpZEFib3J0RmV0Y2hMb2FkcyA9IGFib3J0U3RhbGVGZXRjaExvYWRzKHBlbmRpbmdOYXZpZ2F0aW9uTG9hZElkKTtcbiAgICBsZXQgc2hvdWxkVXBkYXRlRmV0Y2hlcnMgPSB1cGRhdGVkRmV0Y2hlcnMgfHwgZGlkQWJvcnRGZXRjaExvYWRzIHx8IHJldmFsaWRhdGluZ0ZldGNoZXJzLmxlbmd0aCA+IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoZXMsXG4gICAgICBsb2FkZXJEYXRhLFxuICAgICAgZXJyb3JzLFxuICAgICAgLi4uc2hvdWxkVXBkYXRlRmV0Y2hlcnMgPyB7IGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKSB9IDoge31cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGdldFVwZGF0ZWRBY3Rpb25EYXRhKHBlbmRpbmdBY3Rpb25SZXN1bHQpIHtcbiAgICBpZiAocGVuZGluZ0FjdGlvblJlc3VsdCAmJiAhaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW3BlbmRpbmdBY3Rpb25SZXN1bHRbMF1dOiBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmRhdGFcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hY3Rpb25EYXRhKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RhdGUuYWN0aW9uRGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmFjdGlvbkRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldFVwZGF0ZWRSZXZhbGlkYXRpbmdGZXRjaGVycyhyZXZhbGlkYXRpbmdGZXRjaGVycykge1xuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goKHJmKSA9PiB7XG4gICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChyZi5rZXkpO1xuICAgICAgbGV0IHJldmFsaWRhdGluZ0ZldGNoZXIgPSBnZXRMb2FkaW5nRmV0Y2hlcihcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBmZXRjaGVyID8gZmV0Y2hlci5kYXRhIDogdm9pZCAwXG4gICAgICApO1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuc2V0KHJmLmtleSwgcmV2YWxpZGF0aW5nRmV0Y2hlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoMihrZXksIHJvdXRlSWQsIGhyZWYsIG9wdHMpIHtcbiAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICBsZXQgZmx1c2hTeW5jID0gKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVRvKFxuICAgICAgc3RhdGUubG9jYXRpb24sXG4gICAgICBzdGF0ZS5tYXRjaGVzLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICBocmVmLFxuICAgICAgcm91dGVJZCxcbiAgICAgIG9wdHM/LnJlbGF0aXZlXG4gICAgKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlc1RvVXNlLCBub3JtYWxpem
25114VkUGF0aCwgYmFzZW5hbWUpO1xuICAgIGxldCBmb2dPZldhciA9IGNoZWNrRm9nT2ZXYXIobWF0Y2hlcywgcm91dGVzVG9Vc2UsIG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBpZiAoZm9nT2ZXYXIuYWN0aXZlICYmIGZvZ09mV2FyLm1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMgPSBmb2dPZldhci5tYXRjaGVzO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihcbiAgICAgICAga2V5LFxuICAgICAgICByb3V0ZUlkLFxuICAgICAgICBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwgeyBwYXRobmFtZTogbm9ybWFsaXplZFBhdGggfSksXG4gICAgICAgIHsgZmx1c2hTeW5jIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB7IHBhdGgsIHN1Ym1pc3Npb24sIGVycm9yIH0gPSBub3JtYWxpemVOYXZpZ2F0ZU9wdGlvbnMoXG4gICAgICB0cnVlLFxuICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICBvcHRzXG4gICAgKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGVycm9yLCB7IGZsdXNoU3luYyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNjb3BlZENvbnRleHQgPSBpbml0LmdldENvbnRleHQgPyBhd2FpdCBpbml0LmdldENvbnRleHQoKSA6IG5ldyBSb3V0ZXJDb250ZXh0UHJvdmlkZXIoKTtcbiAgICBsZXQgcHJldmVudFNjcm9sbFJlc2V0ID0gKG9wdHMgJiYgb3B0cy5wcmV2ZW50U2Nyb2xsUmVzZXQpID09PSB0cnVlO1xuICAgIGlmIChzdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2Qoc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgYXdhaXQgaGFuZGxlRmV0Y2hlckFjdGlvbihcbiAgICAgICAga2V5LFxuICAgICAgICByb3V0ZUlkLFxuICAgICAgICBwYXRoLFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgICBmb2dPZldhci5hY3RpdmUsXG4gICAgICAgIGZsdXNoU3luYyxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmZXRjaExvYWRNYXRjaGVzLnNldChrZXksIHsgcm91dGVJZCwgcGF0aCB9KTtcbiAgICBhd2FpdCBoYW5kbGVGZXRjaGVyTG9hZGVyKFxuICAgICAga2V5LFxuICAgICAgcm91dGVJZCxcbiAgICAgIHBhdGgsXG4gICAgICBtYXRjaGVzLFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIGZvZ09mV2FyLmFjdGl2ZSxcbiAgICAgIGZsdXNoU3luYyxcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgIHN1Ym1pc3Npb25cbiAgICApO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZldGNoZXJBY3Rpb24oa2V5LCByb3V0ZUlkLCBwYXRoLCByZXF1ZXN0TWF0Y2hlcywgc2NvcGVkQ29udGV4dCwgaXNGb2dPZldhciwgZmx1c2hTeW5jLCBwcmV2ZW50U2Nyb2xsUmVzZXQsIHN1Ym1pc3Npb24pIHtcbiAgICBpbnRlcnJ1cHRBY3RpdmVMb2FkcygpO1xuICAgIGZldGNoTG9hZE1hdGNoZXMuZGVsZXRlKGtleSk7XG4gICAgbGV0IGV4aXN0aW5nRmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldFN1Ym1pdHRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGV4aXN0aW5nRmV0Y2hlciksIHtcbiAgICAgIGZsdXNoU3luY1xuICAgIH0pO1xuICAgIGxldCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGV0IGZldGNoUmVxdWVzdCA9IGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KFxuICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgcGF0aCxcbiAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICBzdWJtaXNzaW9uXG4gICAgKTtcbiAgICBpZiAoaXNGb2dPZldhcikge1xuICAgICAgbGV0IGRpc2NvdmVyUmVzdWx0ID0gYXdhaXQgZGlzY292ZXJSb3V0ZXMoXG4gICAgICAgIHJlcXVlc3RNYXRjaGVzLFxuICAgICAgICBuZXcgVVJMKGZldGNoUmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICBmZXRjaFJlcXVlc3Quc2lnbmFsLFxuICAgICAgICBrZXlcbiAgICAgICk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZGlzY292ZXJSZXN1bHQuZXJyb3IsIHsgZmx1c2hTeW5jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCFkaXNjb3ZlclJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgIHNldEZldGNoZXJFcnJvcihcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcm91dGVJZCxcbiAgICAgICAgICBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwgeyBwYXRobmFtZTogcGF0aCB9KSxcbiAgICAgICAgICB7IGZsdXNoU3luYyB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RNYXRjaGVzID0gZGlzY292ZXJSZXN1bHQubWF0Y2hlcztcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1hdGNoID0gZ2V0VGFyZ2V0TWF0Y2gocmVxdWVzdE1hdGNoZXMsIHBhdGgpO1xuICAgIGlmICghbWF0Y2gucm91dGUuYWN0aW9uICYmICFtYXRjaC5yb3V0ZS5sYXp5KSB7XG4gICAgICBsZXQgZXJyb3IgPSBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwge1xuICAgICAgICBtZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IHBhdGgsXG4gICAgICAgIHJvdXRlSWRcbiAgICAgIH0pO1xuICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZXJyb3IsIHsgZmx1c2hTeW5jIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmZXRjaENvbnRyb2xsZXJzLnNldChrZXksIGFib3J0Q29udHJvbGxlcik7XG4gICAgbGV0IG9yaWdpbmF0aW5nTG9hZElkID0gaW5jcmVtZW50aW5nTG9hZElkO1xuICAgIGxldCBmZXRjaE1hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBmZXRjaFJlcXVlc3QsXG4gICAgICByZXF1ZXN0TWF0Y2hlcyxcbiAgICAgIG1hdGNoLFxuICAgICAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgIHNjb3BlZENvbnRleHRcbiAgICApO
251141xuICAgIGxldCBhY3Rpb25SZXN1bHRzID0gYXdhaXQgY2FsbERhdGFTdHJhdGVneShcbiAgICAgIGZldGNoUmVxdWVzdCxcbiAgICAgIGZldGNoTWF0Y2hlcyxcbiAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICBrZXlcbiAgICApO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBhY3Rpb25SZXN1bHRzW21hdGNoLnJvdXRlLmlkXTtcbiAgICBpZiAoZmV0Y2hSZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5nZXQoa2V5KSA9PT0gYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmhhcyhrZXkpKSB7XG4gICAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChhY3Rpb25SZXN1bHQpIHx8IGlzRXJyb3JSZXN1bHQoYWN0aW9uUmVzdWx0KSkge1xuICAgICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih2b2lkIDApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChhY3Rpb25SZXN1bHQpKSB7XG4gICAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbkxvYWRJZCA+IG9yaWdpbmF0aW5nTG9hZElkKSB7XG4gICAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0RG9uZUZldGNoZXIodm9pZCAwKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZldGNoUmVkaXJlY3RJZHMuYWRkKGtleSk7XG4gICAgICAgICAgdXBkYXRlRmV0Y2hlclN0YXRlKGtleSwgZ2V0TG9hZGluZ0ZldGNoZXIoc3VibWlzc2lvbikpO1xuICAgICAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihmZXRjaFJlcXVlc3QsIGFjdGlvblJlc3VsdCwgZmFsc2UsIHtcbiAgICAgICAgICAgIGZldGNoZXJTdWJtaXNzaW9uOiBzdWJtaXNzaW9uLFxuICAgICAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yUmVzdWx0KGFjdGlvblJlc3VsdCkpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgYWN0aW9uUmVzdWx0LmVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbmV4dExvY2F0aW9uID0gc3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbiB8fCBzdGF0ZS5sb2NhdGlvbjtcbiAgICBsZXQgcmV2YWxpZGF0aW9uUmVxdWVzdCA9IGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KFxuICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgbmV4dExvY2F0aW9uLFxuICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICk7XG4gICAgbGV0IHJvdXRlc1RvVXNlID0gaW5GbGlnaHREYXRhUm91dGVzIHx8IGRhdGFSb3V0ZXM7XG4gICAgbGV0IG1hdGNoZXMgPSBzdGF0ZS5uYXZpZ2F0aW9uLnN0YXRlICE9PSBcImlkbGVcIiA/IG1hdGNoUm91dGVzKHJvdXRlc1RvVXNlLCBzdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uLCBiYXNlbmFtZSkgOiBzdGF0ZS5tYXRjaGVzO1xuICAgIGludmFyaWFudChtYXRjaGVzLCBcIkRpZG4ndCBmaW5kIGFueSBtYXRjaGVzIGFmdGVyIGZldGNoZXIgYWN0aW9uXCIpO1xuICAgIGxldCBsb2FkSWQgPSArK2luY3JlbWVudGluZ0xvYWRJZDtcbiAgICBmZXRjaFJlbG9hZElkcy5zZXQoa2V5LCBsb2FkSWQpO1xuICAgIGxldCBsb2FkRmV0Y2hlciA9IGdldExvYWRpbmdGZXRjaGVyKHN1Ym1pc3Npb24sIGFjdGlvblJlc3VsdC5kYXRhKTtcbiAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBsb2FkRmV0Y2hlcik7XG4gICAgbGV0IHsgZHNNYXRjaGVzLCByZXZhbGlkYXRpbmdGZXRjaGVycyB9ID0gZ2V0TWF0Y2hlc1RvTG9hZChcbiAgICAgIHJldmFsaWRhdGlvblJlcXVlc3QsXG4gICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgaW5pdC5oaXN0b3J5LFxuICAgICAgc3RhdGUsXG4gICAgICBtYXRjaGVzLFxuICAgICAgc3VibWlzc2lvbixcbiAgICAgIG5leHRMb2NhdGlvbixcbiAgICAgIGh5ZHJhdGlvblJvdXRlUHJvcGVydGllczIsXG4gICAgICBmYWxzZSxcbiAgICAgIGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQsXG4gICAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMsXG4gICAgICBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLFxuICAgICAgZmV0Y2hMb2FkTWF0Y2hlcyxcbiAgICAgIGZldGNoUmVkaXJlY3RJZHMsXG4gICAgICByb3V0ZXNUb1VzZSxcbiAgICAgIGJhc2VuYW1lLFxuICAgICAgaW5pdC5wYXRjaFJvdXRlc09uTmF2aWdhdGlvbiAhPSBudWxsLFxuICAgICAgW21hdGNoLnJvdXRlLmlkLCBhY3Rpb25SZXN1bHRdXG4gICAgKTtcbiAgICByZXZhbGlkYXRpbmdGZXRjaGVycy5maWx0ZXIoKHJmKSA9PiByZi5rZXkgIT09IGtleSkuZm9yRWFjaCgocmYpID0+IHtcbiAgICAgIGxldCBzdGFsZUtleSA9IHJmLmtleTtcbiAgICAgIGxldCBleGlzdGluZ0ZldGNoZXIyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KHN0YWxlS2V5KTtcbiAgICAgIGxldCByZXZhbGlkYXRpbmdGZXRjaGVyID0gZ2V0TG9hZGluZ0ZldGNoZXIoXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgZXhpc3RpbmdGZXRjaGVyMiA/IGV4aXN0aW5nRmV0Y2hlcjIuZGF0YSA6IHZvaWQgMFxuICAgICAgKTtcbiAgICAgIHN0YXRlLmZldGNoZXJzLnNldChzdGFsZUtleSwgcmV2YWxpZGF0aW5nRmV0Y2hlcik7XG4gICAgICBhYm9ydEZldGNoZXIoc3RhbGVLZXkpO1xuICAgICAgaWYgKHJmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgZmV0Y2hDb250cm9sbGVycy5zZXQoc3RhbGVLZXksIHJmLmNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZVN0YXRlKHsgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpIH0pO1xuICAgIGxldCBhYm9ydFBlbmRpbmdGZXRjaFJldmFsaWRhdGlvbnMgPSAoKSA9PiByZXZhbGlkYXRpbmdGZXRjaGVycy5mb3JFYWNoKChyZikgPT4gYWJvcnRGZXRjaGVyKHJmLmtleSkpO1xuICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwiYWJvcnRcIixcbiAgICAgIGFib3J0UGVuZGluZ0ZldGNoUmV2YWxpZGF0aW9uc1xuICAgICk7XG4gICAgbGV0IHsgbG9hZGVyUmVzdWx0cywgZmV0Y2hlclJlc3VsdHMgfSA9IGF3YWl0IGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShcbiAgICAgIGRzTWF0Y2hlcyxcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLF
25114xuICAgICAgcmV2YWxpZGF0aW9uUmVxdWVzdCxcbiAgICAgIHNjb3BlZENvbnRleHRcbiAgICApO1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJhYm9ydFwiLFxuICAgICAgYWJvcnRQZW5kaW5nRmV0Y2hSZXZhbGlkYXRpb25zXG4gICAgKTtcbiAgICBmZXRjaFJlbG9hZElkcy5kZWxldGUoa2V5KTtcbiAgICBmZXRjaENvbnRyb2xsZXJzLmRlbGV0ZShrZXkpO1xuICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZvckVhY2goKHIpID0+IGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKHIua2V5KSk7XG4gICAgaWYgKHN0YXRlLmZldGNoZXJzLmhhcyhrZXkpKSB7XG4gICAgICBsZXQgZG9uZUZldGNoZXIgPSBnZXREb25lRmV0Y2hlcihhY3Rpb25SZXN1bHQuZGF0YSk7XG4gICAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBkb25lRmV0Y2hlcik7XG4gICAgfVxuICAgIGxldCByZWRpcmVjdDIgPSBmaW5kUmVkaXJlY3QobG9hZGVyUmVzdWx0cyk7XG4gICAgaWYgKHJlZGlyZWN0Mikge1xuICAgICAgcmV0dXJuIHN0YXJ0UmVkaXJlY3ROYXZpZ2F0aW9uKFxuICAgICAgICByZXZhbGlkYXRpb25SZXF1ZXN0LFxuICAgICAgICByZWRpcmVjdDIucmVzdWx0LFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgeyBwcmV2ZW50U2Nyb2xsUmVzZXQgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmVkaXJlY3QyID0gZmluZFJlZGlyZWN0KGZldGNoZXJSZXN1bHRzKTtcbiAgICBpZiAocmVkaXJlY3QyKSB7XG4gICAgICBmZXRjaFJlZGlyZWN0SWRzLmFkZChyZWRpcmVjdDIua2V5KTtcbiAgICAgIHJldHVybiBzdGFydFJlZGlyZWN0TmF2aWdhdGlvbihcbiAgICAgICAgcmV2YWxpZGF0aW9uUmVxdWVzdCxcbiAgICAgICAgcmVkaXJlY3QyLnJlc3VsdCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHsgcHJldmVudFNjcm9sbFJlc2V0IH1cbiAgICAgICk7XG4gICAgfVxuICAgIGxldCB7IGxvYWRlckRhdGEsIGVycm9ycyB9ID0gcHJvY2Vzc0xvYWRlckRhdGEoXG4gICAgICBzdGF0ZSxcbiAgICAgIG1hdGNoZXMsXG4gICAgICBsb2FkZXJSZXN1bHRzLFxuICAgICAgdm9pZCAwLFxuICAgICAgcmV2YWxpZGF0aW5nRmV0Y2hlcnMsXG4gICAgICBmZXRjaGVyUmVzdWx0c1xuICAgICk7XG4gICAgYWJvcnRTdGFsZUZldGNoTG9hZHMobG9hZElkKTtcbiAgICBpZiAoc3RhdGUubmF2aWdhdGlvbi5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIgJiYgbG9hZElkID4gcGVuZGluZ05hdmlnYXRpb25Mb2FkSWQpIHtcbiAgICAgIGludmFyaWFudChwZW5kaW5nQWN0aW9uLCBcIkV4cGVjdGVkIHBlbmRpbmcgYWN0aW9uXCIpO1xuICAgICAgcGVuZGluZ05hdmlnYXRpb25Db250cm9sbGVyICYmIHBlbmRpbmdOYXZpZ2F0aW9uQ29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgY29tcGxldGVOYXZpZ2F0aW9uKHN0YXRlLm5hdmlnYXRpb24ubG9jYXRpb24sIHtcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YSxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgbG9hZGVyRGF0YTogbWVyZ2VMb2FkZXJEYXRhKFxuICAgICAgICAgIHN0YXRlLmxvYWRlckRhdGEsXG4gICAgICAgICAgbG9hZGVyRGF0YSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIGVycm9yc1xuICAgICAgICApLFxuICAgICAgICBmZXRjaGVyczogbmV3IE1hcChzdGF0ZS5mZXRjaGVycylcbiAgICAgIH0pO1xuICAgICAgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVGZXRjaGVyTG9hZGVyKGtleSwgcm91dGVJZCwgcGF0aCwgbWF0Y2hlcywgc2NvcGVkQ29udGV4dCwgaXNGb2dPZldhciwgZmx1c2hTeW5jLCBwcmV2ZW50U2Nyb2xsUmVzZXQsIHN1Ym1pc3Npb24pIHtcbiAgICBsZXQgZXhpc3RpbmdGZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgdXBkYXRlRmV0Y2hlclN0YXRlKFxuICAgICAga2V5LFxuICAgICAgZ2V0TG9hZGluZ0ZldGNoZXIoXG4gICAgICAgIHN1Ym1pc3Npb24sXG4gICAgICAgIGV4aXN0aW5nRmV0Y2hlciA/IGV4aXN0aW5nRmV0Y2hlci5kYXRhIDogdm9pZCAwXG4gICAgICApLFxuICAgICAgeyBmbHVzaFN5bmMgfVxuICAgICk7XG4gICAgbGV0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsZXQgZmV0Y2hSZXF1ZXN0ID0gY3JlYXRlQ2xpZW50U2lkZVJlcXVlc3QoXG4gICAgICBpbml0Lmhpc3RvcnksXG4gICAgICBwYXRoLFxuICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICk7XG4gICAgaWYgKGlzRm9nT2ZXYXIpIHtcbiAgICAgIGxldCBkaXNjb3ZlclJlc3VsdCA9IGF3YWl0IGRpc2NvdmVyUm91dGVzKFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBuZXcgVVJMKGZldGNoUmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICBmZXRjaFJlcXVlc3Quc2lnbmFsLFxuICAgICAgICBrZXlcbiAgICAgICk7XG4gICAgICBpZiAoZGlzY292ZXJSZXN1bHQudHlwZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChkaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgc2V0RmV0Y2hlckVycm9yKGtleSwgcm91dGVJZCwgZGlzY292ZXJSZXN1bHQuZXJyb3IsIHsgZmx1c2hTeW5jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCFkaXNjb3ZlclJlc3VsdC5tYXRjaGVzKSB7XG4gICAgICAgIHNldEZldGNoZXJFcnJvcihcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcm91dGVJZCxcbiAgICAgICAgICBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwgeyBwYXRobmFtZTogcGF0aCB9KSxcbiAgICAgICAgICB7IGZsdXNoU3luYyB9XG4gICAgICAgICk7XG4gICAgICAgI
25114HJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXMgPSBkaXNjb3ZlclJlc3VsdC5tYXRjaGVzO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBwYXRoKTtcbiAgICBmZXRjaENvbnRyb2xsZXJzLnNldChrZXksIGFib3J0Q29udHJvbGxlcik7XG4gICAgbGV0IG9yaWdpbmF0aW5nTG9hZElkID0gaW5jcmVtZW50aW5nTG9hZElkO1xuICAgIGxldCBkc01hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBmZXRjaFJlcXVlc3QsXG4gICAgICBtYXRjaGVzLFxuICAgICAgbWF0Y2gsXG4gICAgICBoeWRyYXRpb25Sb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgc2NvcGVkQ29udGV4dFxuICAgICk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFxuICAgICAgZmV0Y2hSZXF1ZXN0LFxuICAgICAgZHNNYXRjaGVzLFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIGtleVxuICAgICk7XG4gICAgbGV0IHJlc3VsdCA9IHJlc3VsdHNbbWF0Y2gucm91dGUuaWRdO1xuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmdldChrZXkpID09PSBhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGZldGNoQ29udHJvbGxlcnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmIChmZXRjaFJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZldGNoZXJzUXVldWVkRm9yRGVsZXRpb24uaGFzKGtleSkpIHtcbiAgICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldERvbmVGZXRjaGVyKHZvaWQgMCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICBpZiAocGVuZGluZ05hdmlnYXRpb25Mb2FkSWQgPiBvcmlnaW5hdGluZ0xvYWRJZCkge1xuICAgICAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcih2b2lkIDApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hSZWRpcmVjdElkcy5hZGQoa2V5KTtcbiAgICAgICAgYXdhaXQgc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24oZmV0Y2hSZXF1ZXN0LCByZXN1bHQsIGZhbHNlLCB7XG4gICAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yUmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIHJlc3VsdC5lcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwZGF0ZUZldGNoZXJTdGF0ZShrZXksIGdldERvbmVGZXRjaGVyKHJlc3VsdC5kYXRhKSk7XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnRSZWRpcmVjdE5hdmlnYXRpb24ocmVxdWVzdCwgcmVkaXJlY3QyLCBpc05hdmlnYXRpb24sIHtcbiAgICBzdWJtaXNzaW9uLFxuICAgIGZldGNoZXJTdWJtaXNzaW9uLFxuICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICByZXBsYWNlOiByZXBsYWNlMlxuICB9ID0ge30pIHtcbiAgICBpZiAocmVkaXJlY3QyLnJlc3BvbnNlLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZXZhbGlkYXRlXCIpKSB7XG4gICAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGxvY2F0aW9uID0gcmVkaXJlY3QyLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIik7XG4gICAgaW52YXJpYW50KGxvY2F0aW9uLCBcIkV4cGVjdGVkIGEgTG9jYXRpb24gaGVhZGVyIG9uIHRoZSByZWRpcmVjdCBSZXNwb25zZVwiKTtcbiAgICBsb2NhdGlvbiA9IG5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb24oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG5ldyBVUkwocmVxdWVzdC51cmwpLFxuICAgICAgYmFzZW5hbWVcbiAgICApO1xuICAgIGxldCByZWRpcmVjdExvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24oc3RhdGUubG9jYXRpb24sIGxvY2F0aW9uLCB7XG4gICAgICBfaXNSZWRpcmVjdDogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChpc0Jyb3dzZXIyKSB7XG4gICAgICBsZXQgaXNEb2N1bWVudFJlbG9hZCA9IGZhbHNlO1xuICAgICAgaWYgKHJlZGlyZWN0Mi5yZXNwb25zZS5oZWFkZXJzLmhhcyhcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIpKSB7XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc0Fic29sdXRlVXJsKGxvY2F0aW9uKSkge1xuICAgICAgICBjb25zdCB1cmwgPSBjcmVhdGVCcm93c2VyVVJMSW1wbChsb2NhdGlvbiwgdHJ1ZSk7XG4gICAgICAgIGlzRG9jdW1lbnRSZWxvYWQgPSAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0byBhIG5ldyBvcmlnaW5cbiAgICAgICAgdXJsLm9yaWdpbiAhPT0gcm91dGVyV2luZG93LmxvY2F0aW9uLm9yaWdpbiB8fCAvLyBIYXJkIHJlbG9hZCBpZiBpdCdzIGFuIGFic29sdXRlIFVSTCB0aGF0IGRvZXMgbm90IG1hdGNoIG91ciBiYXNlbmFtZVxuICAgICAgICBzdHJpcEJhc2VuYW1lKHVybC5wYXRobmFtZSwgYmFzZW5hbWUpID09IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNEb2N1bWVudFJlbG9hZCkge1xuICAgICAgICBpZiAocmVwbGFjZTIpIHtcbiAgICAgICAgICByb3V0ZXJXaW5kb3cubG9jYXRpb24ucmVwbGFjZShsb2NhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm91dGVyV2luZG93LmxvY2F0aW9uLmFzc2lnbihsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nTmF2aWdhdGlvbkNvbnRyb2xsZXIgPSBudWxsO1xuICAgIGxldCByZWRpcmVjdE5hdmlnYXRpb25UeXBlID0gcmVwbGFjZTIgPT09IHRydWUgfHwgcmVkaXJlY3QyLnJlc3BvbnNlLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZXBsYWNlXCIpID8gXCJSRVBMQUNFXCIgLyogUmVwbGFjZSAqLyA6IFwiUFVTSFwiIC8qIFB1c2ggKi87XG4gICAgbGV0IHsgZm9ybU1ldGhvZCwgZm9ybUFjdGlvbiwgZm9ybUVuY1R5cGUgfSA9IHN0YXRlLm5hdmlnYXRpb247XG4gICAgaWYgKCFzdWJtaXNzaW9uICYmICFmZXRjaGVyU3VibWlzc2lvbiAmJiBmb3JtTWV0aG9kICYmIGZvcm1BY3Rpb24gJiYgZm9ybUVuY1R5cGUpIHtcbiAgICAgIHN1Ym1pc3Npb24gPSBnZXRTdWJtaXNzaW9uRnJvbU5hdmlnYXRpb24oc3RhdGUubmF2aWdhdGlvbik7XG4gICAgfVxuICAgIGxldCBhY3RpdmVTdWJtaXNzaW9uID0gc3VibWlzc2lvbiB8fCBmZXRjaGVyU3VibWlzc2lvbjtcbiAgICBpZiAocmVkaXJlY3RQcmVzZXJ2ZU1ldGhvZFN0YXR1c0NvZGVzLmhhcyhyZWRpcmVjdDIucmVzcG9uc2Uuc3RhdHVzKSAmJiBhY3RpdmVTdWJtaXNzaW9uICYmIGlzTXV0YXRpb25NZXRob2QoYWN0aXZlU3VibWlzc2lvbi5mb3JtTWV0aG9kKSkge1xuICAgICAgYXdhaXQgc3RhcnROYXZpZ2F0aW9uKHJlZGlyZWN0TmF2aWdhdGlvblR5cGUsIHJlZGlyZWN0TG9jYXRpb24sIHtcbiAgICAgICAgc3VibWlzc2lvbjoge1xuICAgICAgICAgIC4uLmFjdGl2ZVN1Ym1pc3Npb24sXG4gICAgICAgICAgZm9ybUFjdGlvbj
25114ogbG9jYXRpb25cbiAgICAgICAgfSxcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlc2UgZmxhZ3MgYWNyb3NzIHJlZGlyZWN0c1xuICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IHByZXZlbnRTY3JvbGxSZXNldCB8fCBwZW5kaW5nUHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICBlbmFibGVWaWV3VHJhbnNpdGlvbjogaXNOYXZpZ2F0aW9uID8gcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRW5hYmxlZCA6IHZvaWQgMFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBvdmVycmlkZU5hdmlnYXRpb24gPSBnZXRMb2FkaW5nTmF2aWdhdGlvbihcbiAgICAgICAgcmVkaXJlY3RMb2NhdGlvbixcbiAgICAgICAgc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIGF3YWl0IHN0YXJ0TmF2aWdhdGlvbihyZWRpcmVjdE5hdmlnYXRpb25UeXBlLCByZWRpcmVjdExvY2F0aW9uLCB7XG4gICAgICAgIG92ZXJyaWRlTmF2aWdhdGlvbixcbiAgICAgICAgLy8gU2VuZCBmZXRjaGVyIHN1Ym1pc3Npb25zIHRocm91Z2ggZm9yIHNob3VsZFJldmFsaWRhdGVcbiAgICAgICAgZmV0Y2hlclN1Ym1pc3Npb24sXG4gICAgICAgIC8vIFByZXNlcnZlIHRoZXNlIGZsYWdzIGFjcm9zcyByZWRpcmVjdHNcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBwcmV2ZW50U2Nyb2xsUmVzZXQgfHwgcGVuZGluZ1ByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgICAgZW5hYmxlVmlld1RyYW5zaXRpb246IGlzTmF2aWdhdGlvbiA/IHBlbmRpbmdWaWV3VHJhbnNpdGlvbkVuYWJsZWQgOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5KHJlcXVlc3QsIG1hdGNoZXMsIHNjb3BlZENvbnRleHQsIGZldGNoZXJLZXkpIHtcbiAgICBsZXQgcmVzdWx0cztcbiAgICBsZXQgZGF0YVJlc3VsdHMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3lJbXBsKFxuICAgICAgICBkYXRhU3RyYXRlZ3lJbXBsLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBmZXRjaGVyS2V5LFxuICAgICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBtYXRjaGVzLmZpbHRlcigobSkgPT4gbS5zaG91bGRMb2FkKS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgIGRhdGFSZXN1bHRzW20ucm91dGUuaWRdID0ge1xuICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgICBlcnJvcjogZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGF0YVJlc3VsdHM7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gZGF0YVJlc3VsdHM7XG4gICAgfVxuICAgIGZvciAobGV0IFtyb3V0ZUlkLCByZXN1bHRdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdHMpKSB7XG4gICAgICBpZiAoaXNSZWRpcmVjdERhdGFTdHJhdGVneVJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgIGRhdGFSZXN1bHRzW3JvdXRlSWRdID0ge1xuICAgICAgICAgIHR5cGU6IFwicmVkaXJlY3RcIiAvKiByZWRpcmVjdCAqLyxcbiAgICAgICAgICByZXNwb25zZTogbm9ybWFsaXplUmVsYXRpdmVSb3V0aW5nUmVkaXJlY3RSZXNwb25zZShcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJvdXRlSWQsXG4gICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgYmFzZW5hbWVcbiAgICAgICAgICApXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhUmVzdWx0c1tyb3V0ZUlkXSA9IGF3YWl0IGNvbnZlcnREYXRhU3RyYXRlZ3lSZXN1bHRUb0RhdGFSZXN1bHQocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFSZXN1bHRzO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGNhbGxMb2FkZXJzQW5kTWF5YmVSZXNvbHZlRGF0YShtYXRjaGVzLCBmZXRjaGVyc1RvTG9hZCwgcmVxdWVzdCwgc2NvcGVkQ29udGV4dCkge1xuICAgIGxldCBsb2FkZXJSZXN1bHRzUHJvbWlzZSA9IGNhbGxEYXRhU3RyYXRlZ3koXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICBudWxsXG4gICAgKTtcbiAgICBsZXQgZmV0Y2hlclJlc3VsdHNQcm9taXNlID0gUHJvbWlzZS5hbGwoXG4gICAgICBmZXRjaGVyc1RvTG9hZC5tYXAoYXN5bmMgKGYpID0+IHtcbiAgICAgICAgaWYgKGYubWF0Y2hlcyAmJiBmLm1hdGNoICYmIGYucmVxdWVzdCAmJiBmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGNhbGxEYXRhU3RyYXRlZ3koXG4gICAgICAgICAgICBmLnJlcXVlc3QsXG4gICAgICAgICAgICBmLm1hdGNoZXMsXG4gICAgICAgICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgICAgICAgZi5rZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2YubWF0Y2gucm91dGUuaWRdO1xuICAgICAgICAgIHJldHVybiB7IFtmLmtleV06IHJlc3VsdCB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgW2Yua2V5XToge1xuICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgICAgICAgIGVycm9yOiBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBmLnBhdGhcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIGxldCBsb2FkZXJSZXN1bHRzID0gYXdhaXQgbG9hZGVyUmVzdWx0c1Byb21pc2U7XG4gICAgbGV0IGZldGNoZXJSZXN1bHRzID0gKGF3YWl0IGZldGNoZXJSZXN1bHRzUHJvbWlzZSkucmVkdWNlKFxuICAgICAgKGFjYywgcikgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHIpLFxuICAgICAge31cbiAgICApO
251141xuICAgIHJldHVybiB7XG4gICAgICBsb2FkZXJSZXN1bHRzLFxuICAgICAgZmV0Y2hlclJlc3VsdHNcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGludGVycnVwdEFjdGl2ZUxvYWRzKCkge1xuICAgIGlzUmV2YWxpZGF0aW9uUmVxdWlyZWQgPSB0cnVlO1xuICAgIGZldGNoTG9hZE1hdGNoZXMuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICBpZiAoZmV0Y2hDb250cm9sbGVycy5oYXMoa2V5KSkge1xuICAgICAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBmZXRjaGVyLCBvcHRzID0ge30pIHtcbiAgICBzdGF0ZS5mZXRjaGVycy5zZXQoa2V5LCBmZXRjaGVyKTtcbiAgICB1cGRhdGVTdGF0ZShcbiAgICAgIHsgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpIH0sXG4gICAgICB7IGZsdXNoU3luYzogKG9wdHMgJiYgb3B0cy5mbHVzaFN5bmMpID09PSB0cnVlIH1cbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIHNldEZldGNoZXJFcnJvcihrZXksIHJvdXRlSWQsIGVycm9yLCBvcHRzID0ge30pIHtcbiAgICBsZXQgYm91bmRhcnlNYXRjaCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoc3RhdGUubWF0Y2hlcywgcm91dGVJZCk7XG4gICAgZGVsZXRlRmV0Y2hlcihrZXkpO1xuICAgIHVwZGF0ZVN0YXRlKFxuICAgICAge1xuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbYm91bmRhcnlNYXRjaC5yb3V0ZS5pZF06IGVycm9yXG4gICAgICAgIH0sXG4gICAgICAgIGZldGNoZXJzOiBuZXcgTWFwKHN0YXRlLmZldGNoZXJzKVxuICAgICAgfSxcbiAgICAgIHsgZmx1c2hTeW5jOiAob3B0cyAmJiBvcHRzLmZsdXNoU3luYykgPT09IHRydWUgfVxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RmV0Y2hlcihrZXkpIHtcbiAgICBhY3RpdmVGZXRjaGVycy5zZXQoa2V5LCAoYWN0aXZlRmV0Y2hlcnMuZ2V0KGtleSkgfHwgMCkgKyAxKTtcbiAgICBpZiAoZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbi5oYXMoa2V5KSkge1xuICAgICAgZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbi5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmZldGNoZXJzLmdldChrZXkpIHx8IElETEVfRkVUQ0hFUjtcbiAgfVxuICBmdW5jdGlvbiByZXNldEZldGNoZXIoa2V5LCBvcHRzKSB7XG4gICAgYWJvcnRGZXRjaGVyKGtleSwgb3B0cz8ucmVhc29uKTtcbiAgICB1cGRhdGVGZXRjaGVyU3RhdGUoa2V5LCBnZXREb25lRmV0Y2hlcihudWxsKSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlRmV0Y2hlcihrZXkpIHtcbiAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgIGlmIChmZXRjaENvbnRyb2xsZXJzLmhhcyhrZXkpICYmICEoZmV0Y2hlciAmJiBmZXRjaGVyLnN0YXRlID09PSBcImxvYWRpbmdcIiAmJiBmZXRjaFJlbG9hZElkcy5oYXMoa2V5KSkpIHtcbiAgICAgIGFib3J0RmV0Y2hlcihrZXkpO1xuICAgIH1cbiAgICBmZXRjaExvYWRNYXRjaGVzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoUmVsb2FkSWRzLmRlbGV0ZShrZXkpO1xuICAgIGZldGNoUmVkaXJlY3RJZHMuZGVsZXRlKGtleSk7XG4gICAgZmV0Y2hlcnNRdWV1ZWRGb3JEZWxldGlvbi5kZWxldGUoa2V5KTtcbiAgICBjYW5jZWxsZWRGZXRjaGVyTG9hZHMuZGVsZXRlKGtleSk7XG4gICAgc3RhdGUuZmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gIH1cbiAgZnVuY3Rpb24gcXVldWVGZXRjaGVyRm9yRGVsZXRpb24oa2V5KSB7XG4gICAgbGV0IGNvdW50ID0gKGFjdGl2ZUZldGNoZXJzLmdldChrZXkpIHx8IDApIC0gMTtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgYWN0aXZlRmV0Y2hlcnMuZGVsZXRlKGtleSk7XG4gICAgICBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLmFkZChrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmVGZXRjaGVycy5zZXQoa2V5LCBjb3VudCk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlKHsgZmV0Y2hlcnM6IG5ldyBNYXAoc3RhdGUuZmV0Y2hlcnMpIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGFib3J0RmV0Y2hlcihrZXksIHJlYXNvbikge1xuICAgIGxldCBjb250cm9sbGVyID0gZmV0Y2hDb250cm9sbGVycy5nZXQoa2V5KTtcbiAgICBpZiAoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5hYm9ydChyZWFzb24pO1xuICAgICAgZmV0Y2hDb250cm9sbGVycy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWFya0ZldGNoZXJzRG9uZShrZXlzKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgIGxldCBmZXRjaGVyID0gZ2V0RmV0Y2hlcihrZXkpO1xuICAgICAgbGV0IGRvbmVGZXRjaGVyID0gZ2V0RG9uZUZldGNoZXIoZmV0Y2hlci5kYXRhKTtcbiAgICAgIHN0YXRlLmZldGNoZXJzLnNldChrZXksIGRvbmVGZXRjaGVyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gbWFya0ZldGNoUmVkaXJlY3RzRG9uZSgpIHtcbiAgICBsZXQgZG9uZUtleXMgPSBbXTtcbiAgICBsZXQgdXBkYXRlZEZldGNoZXJzID0gZmFsc2U7XG4gICAgZm9yIChsZXQga2V5IG9mIGZldGNoUmVkaXJlY3RJZHMpIHtcbiAgICAgIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGtleSk7XG4gICAgICBpbnZhcmlhbnQoZmV0Y2hlciwgYEV4cGVjdGVkIGZldGNoZXI6ICR7a2V5fWApO1xuICAgICAgaWYgKGZldGNoZXIuc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgIGZldGNoUmVkaXJlY3RJZHMuZGVsZXRlKGtleSk7XG4gICAgICAgIGRvbmVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdXBkYXRlZEZldGNoZXJzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFya0ZldGNoZXJzRG9uZShkb25lS2V5cyk7XG4gICAgcmV0dXJuIHVwZGF0ZWRGZXRjaGVycztcbiAgfVxuICBmdW5jdGlvbiBhYm9ydFN0YWxlRmV0Y2hMb2FkcyhsYW5kZWRJZCkge1xuICAgIGxldCB5ZWV0ZWRLZXlzID0gW107XG4gICAgZm9yIChsZXQgW2tleSwgaWRdIG9mIGZldGNoUmVsb2FkSWRzKSB7XG4gICAgICBpZiAoaWQgPCBsYW5kZWRJZCkge1xuICAgICAgICBsZXQgZmV0Y2hlciA9IHN0YXRlLmZldGNoZXJzLmdldChrZXkpO1xuICAgICAgICBpbnZhcmlhbnQoZmV0Y2hlciwgYEV4cGVjdGVkIGZldGNoZXI6ICR7a2V5fWApO1xuICAgICAgICBpZiAoZmV0Y2hlci5zdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgICAgICBhYm9ydEZldGNoZXIoa2V5KTtcbiAgICAgICAgICBmZXRjaFJlbG9hZElkcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICB5ZWV0ZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBtYXJrRmV0Y2hlcnNEb25lKHllZXRlZEtleXMpO1xuICAgIHJldHVybi
25114B5ZWV0ZWRLZXlzLmxlbmd0aCA+IDA7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QmxvY2tlcihrZXksIGZuKSB7XG4gICAgbGV0IGJsb2NrZXIgPSBzdGF0ZS5ibG9ja2Vycy5nZXQoa2V5KSB8fCBJRExFX0JMT0NLRVI7XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuZ2V0KGtleSkgIT09IGZuKSB7XG4gICAgICBibG9ja2VyRnVuY3Rpb25zLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGJsb2NrZXI7XG4gIH1cbiAgZnVuY3Rpb24gZGVsZXRlQmxvY2tlcihrZXkpIHtcbiAgICBzdGF0ZS5ibG9ja2Vycy5kZWxldGUoa2V5KTtcbiAgICBibG9ja2VyRnVuY3Rpb25zLmRlbGV0ZShrZXkpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZUJsb2NrZXIoa2V5LCBuZXdCbG9ja2VyKSB7XG4gICAgbGV0IGJsb2NrZXIgPSBzdGF0ZS5ibG9ja2Vycy5nZXQoa2V5KSB8fCBJRExFX0JMT0NLRVI7XG4gICAgaW52YXJpYW50KFxuICAgICAgYmxvY2tlci5zdGF0ZSA9PT0gXCJ1bmJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcInByb2NlZWRpbmdcIiB8fCBibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIiAmJiBuZXdCbG9ja2VyLnN0YXRlID09PSBcInVuYmxvY2tlZFwiIHx8IGJsb2NrZXIuc3RhdGUgPT09IFwicHJvY2VlZGluZ1wiICYmIG5ld0Jsb2NrZXIuc3RhdGUgPT09IFwidW5ibG9ja2VkXCIsXG4gICAgICBgSW52YWxpZCBibG9ja2VyIHN0YXRlIHRyYW5zaXRpb246ICR7YmxvY2tlci5zdGF0ZX0gLT4gJHtuZXdCbG9ja2VyLnN0YXRlfWBcbiAgICApO1xuICAgIGxldCBibG9ja2VycyA9IG5ldyBNYXAoc3RhdGUuYmxvY2tlcnMpO1xuICAgIGJsb2NrZXJzLnNldChrZXksIG5ld0Jsb2NrZXIpO1xuICAgIHVwZGF0ZVN0YXRlKHsgYmxvY2tlcnMgfSk7XG4gIH1cbiAgZnVuY3Rpb24gc2hvdWxkQmxvY2tOYXZpZ2F0aW9uKHtcbiAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgbmV4dExvY2F0aW9uLFxuICAgIGhpc3RvcnlBY3Rpb25cbiAgfSkge1xuICAgIGlmIChibG9ja2VyRnVuY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJsb2NrZXJGdW5jdGlvbnMuc2l6ZSA+IDEpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiQSByb3V0ZXIgb25seSBzdXBwb3J0cyBvbmUgYmxvY2tlciBhdCBhIHRpbWVcIik7XG4gICAgfVxuICAgIGxldCBlbnRyaWVzID0gQXJyYXkuZnJvbShibG9ja2VyRnVuY3Rpb25zLmVudHJpZXMoKSk7XG4gICAgbGV0IFtibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dID0gZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdO1xuICAgIGxldCBibG9ja2VyID0gc3RhdGUuYmxvY2tlcnMuZ2V0KGJsb2NrZXJLZXkpO1xuICAgIGlmIChibG9ja2VyICYmIGJsb2NrZXIuc3RhdGUgPT09IFwicHJvY2VlZGluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChibG9ja2VyRnVuY3Rpb24oeyBjdXJyZW50TG9jYXRpb24sIG5leHRMb2NhdGlvbiwgaGlzdG9yeUFjdGlvbiB9KSkge1xuICAgICAgcmV0dXJuIGJsb2NrZXJLZXk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5hdmlnYXRpb25hbDQwNChwYXRobmFtZSkge1xuICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7IHBhdGhuYW1lIH0pO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIGxldCB7IG1hdGNoZXMsIHJvdXRlIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKHJvdXRlc1RvVXNlKTtcbiAgICByZXR1cm4geyBub3RGb3VuZE1hdGNoZXM6IG1hdGNoZXMsIHJvdXRlLCBlcnJvciB9O1xuICB9XG4gIGZ1bmN0aW9uIGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uKHBvc2l0aW9ucywgZ2V0UG9zaXRpb24sIGdldEtleSkge1xuICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zMiA9IHBvc2l0aW9ucztcbiAgICBnZXRTY3JvbGxQb3NpdGlvbiA9IGdldFBvc2l0aW9uO1xuICAgIGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5MiA9IGdldEtleSB8fCBudWxsO1xuICAgIGlmICghaW5pdGlhbFNjcm9sbFJlc3RvcmVkICYmIHN0YXRlLm5hdmlnYXRpb24gPT09IElETEVfTkFWSUdBVElPTikge1xuICAgICAgaW5pdGlhbFNjcm9sbFJlc3RvcmVkID0gdHJ1ZTtcbiAgICAgIGxldCB5ID0gZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbihzdGF0ZS5sb2NhdGlvbiwgc3RhdGUubWF0Y2hlcyk7XG4gICAgICBpZiAoeSAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZVN0YXRlKHsgcmVzdG9yZVNjcm9sbFBvc2l0aW9uOiB5IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc2F2ZWRTY3JvbGxQb3NpdGlvbnMyID0gbnVsbDtcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgIGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5MiA9IG51bGw7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRTY3JvbGxLZXkobG9jYXRpb24sIG1hdGNoZXMpIHtcbiAgICBpZiAoZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkyKSB7XG4gICAgICBsZXQga2V5ID0gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkyKFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlcy5tYXAoKG0pID0+IGNvbnZlcnRSb3V0ZU1hdGNoVG9VaU1hdGNoKG0sIHN0YXRlLmxvYWRlckRhdGEpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBrZXkgfHwgbG9jYXRpb24ua2V5O1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb24ua2V5O1xuICB9XG4gIGZ1bmN0aW9uIHNhdmVTY3JvbGxQb3NpdGlvbihsb2NhdGlvbiwgbWF0Y2hlcykge1xuICAgIGlmIChzYXZlZFNjcm9sbFBvc2l0aW9uczIgJiYgZ2V0U2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgIGxldCBrZXkgPSBnZXRTY3JvbGxLZXkobG9jYXRpb24sIG1hdGNoZXMpO1xuICAgICAgc2F2ZWRTY3JvbGxQb3NpdGlvbnMyW2tleV0gPSBnZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRTYXZlZFNjcm9sbFBvc2l0aW9uKGxvY2F0aW9uLCBtYXRjaGVzKSB7XG4gICAgaWYgKHNhdmVkU2Nyb2xsUG9zaXRpb25zMikge1xuICAgICAgbGV0IGtleSA9IGdldFNjcm9sbEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgICBsZXQgeSA9IHNhdmVkU2Nyb2xsUG9zaXRpb25zMltrZXldO1xuICAgICAgaWYgKHR5cGVvZiB5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgI
25114HJldHVybiB5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBjaGVja0ZvZ09mV2FyKG1hdGNoZXMsIHJvdXRlc1RvVXNlLCBwYXRobmFtZSkge1xuICAgIGlmIChpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uKSB7XG4gICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgbGV0IGZvZ01hdGNoZXMgPSBtYXRjaFJvdXRlc0ltcGwoXG4gICAgICAgICAgcm91dGVzVG9Vc2UsXG4gICAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBhY3RpdmU6IHRydWUsIG1hdGNoZXM6IGZvZ01hdGNoZXMgfHwgW10gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXRjaGVzWzBdLnBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxldCBwYXJ0aWFsTWF0Y2hlcyA9IG1hdGNoUm91dGVzSW1wbChcbiAgICAgICAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IGFjdGl2ZTogdHJ1ZSwgbWF0Y2hlczogcGFydGlhbE1hdGNoZXMgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBtYXRjaGVzOiBudWxsIH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJSb3V0ZXMobWF0Y2hlcywgcGF0aG5hbWUsIHNpZ25hbCwgZmV0Y2hlcktleSkge1xuICAgIGlmICghaW5pdC5wYXRjaFJvdXRlc09uTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJzdWNjZXNzXCIsIG1hdGNoZXMgfTtcbiAgICB9XG4gICAgbGV0IHBhcnRpYWxNYXRjaGVzID0gbWF0Y2hlcztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IGlzTm9uSE1SID0gaW5GbGlnaHREYXRhUm91dGVzID09IG51bGw7XG4gICAgICBsZXQgcm91dGVzVG9Vc2UgPSBpbkZsaWdodERhdGFSb3V0ZXMgfHwgZGF0YVJvdXRlcztcbiAgICAgIGxldCBsb2NhbE1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBpbml0LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uKHtcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgcGF0aDogcGF0aG5hbWUsXG4gICAgICAgICAgbWF0Y2hlczogcGFydGlhbE1hdGNoZXMsXG4gICAgICAgICAgZmV0Y2hlcktleSxcbiAgICAgICAgICBwYXRjaDogKHJvdXRlSWQsIGNoaWxkcmVuKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHBhdGNoUm91dGVzSW1wbChcbiAgICAgICAgICAgICAgcm91dGVJZCxcbiAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgICAgICAgICBsb2NhbE1hbmlmZXN0LFxuICAgICAgICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImVycm9yXCIsIGVycm9yOiBlLCBwYXJ0aWFsTWF0Y2hlcyB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGlzTm9uSE1SICYmICFzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGRhdGFSb3V0ZXMgPSBbLi4uZGF0YVJvdXRlc107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImFib3J0ZWRcIiB9O1xuICAgICAgfVxuICAgICAgbGV0IG5ld01hdGNoZXMgPSBtYXRjaFJvdXRlcyhyb3V0ZXNUb1VzZSwgcGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICAgIGlmIChuZXdNYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwic3VjY2Vzc1wiLCBtYXRjaGVzOiBuZXdNYXRjaGVzIH07XG4gICAgICB9XG4gICAgICBsZXQgbmV3UGFydGlhbE1hdGNoZXMgPSBtYXRjaFJvdXRlc0ltcGwoXG4gICAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpZiAoIW5ld1BhcnRpYWxNYXRjaGVzIHx8IHBhcnRpYWxNYXRjaGVzLmxlbmd0aCA9PT0gbmV3UGFydGlhbE1hdGNoZXMubGVuZ3RoICYmIHBhcnRpYWxNYXRjaGVzLmV2ZXJ5KFxuICAgICAgICAobSwgaSkgPT4gbS5yb3V0ZS5pZCA9PT0gbmV3UGFydGlhbE1hdGNoZXNbaV0ucm91dGUuaWRcbiAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJzdWNjZXNzXCIsIG1hdGNoZXM6IG51bGwgfTtcbiAgICAgIH1cbiAgICAgIHBhcnRpYWxNYXRjaGVzID0gbmV3UGFydGlhbE1hdGNoZXM7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9pbnRlcm5hbFNldFJvdXRlcyhuZXdSb3V0ZXMpIHtcbiAgICBtYW5pZmVzdCA9IHt9O1xuICAgIGluRmxpZ2h0RGF0YVJvdXRlcyA9IGNvbnZlcnRSb3V0ZXNUb0RhdGFSb3V0ZXMoXG4gICAgICBuZXdSb3V0ZXMsXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgdm9pZCAwLFxuICAgICAgbWFuaWZlc3RcbiAgICApO1xuICB9XG4gIGZ1bmN0aW9uIHBhdGNoUm91dGVzKHJvdXRlSWQsIGNoaWxkcmVuLCB1bnN0YWJsZV9hbGxvd0VsZW1lbnRNdXRhdGlvbnMgPSBmYWxzZSkge1xuICAgIGxldCBpc05vbkhNUiA9IGluRmxpZ2h0RGF0YVJvdXRlcyA9PSBudWxsO1xuICAgIGxldCByb3V0ZXNUb1VzZSA9IGluRmxpZ2h0RGF0YVJvdXRlcyB8fCBkYXRhUm91dGVzO1xuICAgIHBhdGNoUm91dGVzSW1wbChcbiAgICAgIHJvdXRlSWQsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHJvdXRlc1RvVXNlLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgdW5zdGFibGVfYWxsb3dFbGVtZW50TXV0YXRpb25zXG4gICAgKTtcbiAgICBpZiAoaXNOb25ITVIpIHtcbiAgICAgIGRhdGFSb3V0ZXMgPSBbLi4uZGF0YVJvdXRlc107XG4gICAgICB1cGRhdGVTdGF0ZSh7fSk7XG4gICAgfVxuICB9XG4gI
25114HJvdXRlciA9IHtcbiAgICBnZXQgYmFzZW5hbWUoKSB7XG4gICAgICByZXR1cm4gYmFzZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgZnV0dXJlKCkge1xuICAgICAgcmV0dXJuIGZ1dHVyZTtcbiAgICB9LFxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9LFxuICAgIGdldCByb3V0ZXMoKSB7XG4gICAgICByZXR1cm4gZGF0YVJvdXRlcztcbiAgICB9LFxuICAgIGdldCB3aW5kb3coKSB7XG4gICAgICByZXR1cm4gcm91dGVyV2luZG93O1xuICAgIH0sXG4gICAgaW5pdGlhbGl6ZSxcbiAgICBzdWJzY3JpYmUsXG4gICAgZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb24sXG4gICAgbmF2aWdhdGUsXG4gICAgZmV0Y2g6IGZldGNoMixcbiAgICByZXZhbGlkYXRlLFxuICAgIC8vIFBhc3N0aHJvdWdoIHRvIGhpc3RvcnktYXdhcmUgY3JlYXRlSHJlZiB1c2VkIGJ5IHVzZUhyZWYgc28gd2UgZ2V0IHByb3BlclxuICAgIC8vIGhhc2gtYXdhcmUgVVJMcyBpbiBET00gcGF0aHNcbiAgICBjcmVhdGVIcmVmOiAodG8pID0+IGluaXQuaGlzdG9yeS5jcmVhdGVIcmVmKHRvKSxcbiAgICBlbmNvZGVMb2NhdGlvbjogKHRvKSA9PiBpbml0Lmhpc3RvcnkuZW5jb2RlTG9jYXRpb24odG8pLFxuICAgIGdldEZldGNoZXIsXG4gICAgcmVzZXRGZXRjaGVyLFxuICAgIGRlbGV0ZUZldGNoZXI6IHF1ZXVlRmV0Y2hlckZvckRlbGV0aW9uLFxuICAgIGRpc3Bvc2UsXG4gICAgZ2V0QmxvY2tlcixcbiAgICBkZWxldGVCbG9ja2VyLFxuICAgIHBhdGNoUm91dGVzLFxuICAgIF9pbnRlcm5hbEZldGNoQ29udHJvbGxlcnM6IGZldGNoQ29udHJvbGxlcnMsXG4gICAgLy8gVE9ETzogUmVtb3ZlIHNldFJvdXRlcywgaXQncyB0ZW1wb3JhcnkgdG8gYXZvaWQgZGVhbGluZyB3aXRoXG4gICAgLy8gdXBkYXRpbmcgdGhlIHRyZWUgd2hpbGUgdmFsaWRhdGluZyB0aGUgdXBkYXRlIGFsZ29yaXRobS5cbiAgICBfaW50ZXJuYWxTZXRSb3V0ZXMsXG4gICAgX2ludGVybmFsU2V0U3RhdGVEb05vdFVzZU9yWW91V2lsbEJyZWFrWW91ckFwcChuZXdTdGF0ZSkge1xuICAgICAgdXBkYXRlU3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJvdXRlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0hhbmRsZXIocm91dGVzLCBvcHRzKSB7XG4gIGludmFyaWFudChcbiAgICByb3V0ZXMubGVuZ3RoID4gMCxcbiAgICBcIllvdSBtdXN0IHByb3ZpZGUgYSBub24tZW1wdHkgcm91dGVzIGFycmF5IHRvIGNyZWF0ZVN0YXRpY0hhbmRsZXJcIlxuICApO1xuICBsZXQgbWFuaWZlc3QgPSB7fTtcbiAgbGV0IGJhc2VuYW1lID0gKG9wdHMgPyBvcHRzLmJhc2VuYW1lIDogbnVsbCkgfHwgXCIvXCI7XG4gIGxldCBtYXBSb3V0ZVByb3BlcnRpZXMyID0gb3B0cz8ubWFwUm91dGVQcm9wZXJ0aWVzIHx8IGRlZmF1bHRNYXBSb3V0ZVByb3BlcnRpZXM7XG4gIGxldCBkYXRhUm91dGVzID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICB2b2lkIDAsXG4gICAgbWFuaWZlc3RcbiAgKTtcbiAgYXN5bmMgZnVuY3Rpb24gcXVlcnkocmVxdWVzdCwge1xuICAgIHJlcXVlc3RDb250ZXh0LFxuICAgIGZpbHRlck1hdGNoZXNUb0xvYWQsXG4gICAgc2tpcExvYWRlckVycm9yQnViYmxpbmcsXG4gICAgc2tpcFJldmFsaWRhdGlvbixcbiAgICBkYXRhU3RyYXRlZ3ksXG4gICAgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2VcbiAgfSA9IHt9KSB7XG4gICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgIGxldCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihcIlwiLCBjcmVhdGVQYXRoKHVybCksIG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKGRhdGFSb3V0ZXMsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dCAhPSBudWxsID8gcmVxdWVzdENvbnRleHQgOiBuZXcgUm91dGVyQ29udGV4dFByb3ZpZGVyKCk7XG4gICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkgJiYgbWV0aG9kICE9PSBcIkhFQURcIikge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHsgbWV0aG9kIH0pO1xuICAgICAgbGV0IHsgbWF0Y2hlczogbWV0aG9kTm90QWxsb3dlZE1hdGNoZXMsIHJvdXRlIH0gPSBnZXRTaG9ydENpcmN1aXRNYXRjaGVzKGRhdGFSb3V0ZXMpO1xuICAgICAgbGV0IHN0YXRpY0NvbnRleHQgPSB7XG4gICAgICAgIGJhc2VuYW1lLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlczogbWV0aG9kTm90QWxsb3dlZE1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbcm91dGUuaWRdOiBlcnJvclxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMsXG4gICAgICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICAgIHJldHVybiBnZW5lcmF0ZU1pZGRsZXdhcmVSZXNwb25zZSA/IGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKCgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KSkgOiBzdGF0aWNDb250ZXh0O1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGxldCBlcnJvciA9IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7IHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICAgIGxldCB7IG1hdGNoZXM6IG5vdEZvdW5kTWF0Y2hlcywgcm91dGUgfSA9IGdldFNob3J0Q2lyY3VpdE1hdGNoZXMoZGF0YVJvdXRlcyk7XG4gICAgICBsZXQgc3RhdGljQ29udGV4dCA9IHtcbiAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICBtYXRjaGVzOiBub3RGb3VuZE1hdGNoZXMsXG4gICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICBbcm91dGUuaWRdOiBlcnJvclxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMsXG4gICAgICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICAgIHJldHVybi
25114BnZW5lcmF0ZU1pZGRsZXdhcmVSZXNwb25zZSA/IGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKCgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KSkgOiBzdGF0aWNDb250ZXh0O1xuICAgIH1cbiAgICBpZiAoZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2UpIHtcbiAgICAgIGludmFyaWFudChcbiAgICAgICAgcmVxdWVzdENvbnRleHQgaW5zdGFuY2VvZiBSb3V0ZXJDb250ZXh0UHJvdmlkZXIsXG4gICAgICAgIFwiV2hlbiB1c2luZyBtaWRkbGV3YXJlIGluIGBzdGF0aWNIYW5kbGVyLnF1ZXJ5KClgLCBhbnkgcHJvdmlkZWQgYHJlcXVlc3RDb250ZXh0YCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBSb3V0ZXJDb250ZXh0UHJvdmlkZXJgXCJcbiAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBsb2FkTGF6eU1pZGRsZXdhcmVGb3JNYXRjaGVzKFxuICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMlxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVuZGVyZWRTdGF0aWNDb250ZXh0O1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBydW5TZXJ2ZXJNaWRkbGV3YXJlUGlwZWxpbmUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBwYXJhbXM6IG1hdGNoZXNbMF0ucGFyYW1zLFxuICAgICAgICAgICAgLy8gSWYgd2UncmUgY2FsbGluZyBtaWRkbGV3YXJlIHRoZW4gaXQgbXVzdCBiZSBlbmFibGVkIHNvIHdlIGNhbiBjYXN0XG4gICAgICAgICAgICAvLyB0aGlzIHRvIHRoZSBwcm9wZXIgdHlwZSBrbm93aW5nIGl0J3Mgbm90IGFuIGBBcHBMb2FkQ29udGV4dGBcbiAgICAgICAgICAgIGNvbnRleHQ6IHJlcXVlc3RDb250ZXh0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGFzeW5jIChyZXZhbGlkYXRpb25SZXF1ZXN0LCBvcHRzMiA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDIgPSBhd2FpdCBxdWVyeUltcGwoXG4gICAgICAgICAgICAgICAgICByZXZhbGlkYXRpb25SZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICAgICAgICBkYXRhU3RyYXRlZ3kgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID09PSB0cnVlLFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIFwiZmlsdGVyTWF0Y2hlc1RvTG9hZFwiIGluIG9wdHMyID8gb3B0czIuZmlsdGVyTWF0Y2hlc1RvTG9hZCA/PyBudWxsIDogZmlsdGVyTWF0Y2hlc1RvTG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgc2tpcFJldmFsaWRhdGlvbiA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0MikpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZW5kZXJlZFN0YXRpY0NvbnRleHQgPSB7IGxvY2F0aW9uLCBiYXNlbmFtZSwgLi4ucmVzdWx0MiB9O1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXJlZFN0YXRpY0NvbnRleHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgKGVycm9yLCByb3V0ZUlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNSZWRpcmVjdFJlc3BvbnNlKGVycm9yKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNSZXNwb25zZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvclJlc3BvbnNlSW1wbChcbiAgICAgICAgICAgICAgICAgIGVycm9yLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIGVycm9yLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBwYXJzZVJlc3BvbnNlQm9keShlcnJvcilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChlcnJvcikpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSBkYXRhV2l0aFJlc3BvbnNlSW5pdFRvRXJyb3JSZXNwb25zZShlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVuZGVyZWRTdGF0aWNDb250ZXh0KSB7XG4gICAgICAgICAgICAgIGlmIChyb3V0ZUlkIGluIHJlbmRlcmVkU3RhdGljQ29udGV4dC5sb2FkZXJEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRTdGF0aWNDb250ZXh0LmxvYWRlckRhdGFbcm91dGVJZF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IHN0YXRpY0NvbnRleHQgPSBnZXRTdGF0aWNDb250ZXh0RnJvbUVycm9yKFxuICAgICAgICAgICAgICAgIGRhdGFSb3V0ZXMsXG4gICAgICAgICAgICAgICAgcmVuZGVyZWRTdGF0aWNDb250ZXh0LFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID8gcm91dGVJZCA6IGZpbmROZWFyZXN0Qm91bmRhcnkobWF0Y2hlcywgcm91dGVJZCkucm91dGUuaWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGV0IGJvdW5kYXJ5Um91dGVJZCA9IHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID8gcm91dGVJZCA6IGZpbmROZWFyZXN0Qm91bmRhcnkoXG4gICAgICAgICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICAgICAgICBtYXRjaGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAobSkgPT4gbS5yb3V0ZS5pZCA9PT0gcm91dGVJZCB8fCBtLnJvdXRlLmxvYWRlclxuICAgICAgICAgICAgICAgICk/LnJvdXRlLmlkIHx8IHJvdXRlSWRcbiAgICAgICAgICAgICAgKS5yb3V0ZS5pZDtcbiAgICAgICAgICAgICAgbGV0IHN0YXRpY0NvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yczoge1xuICAgICAgICAgICAgICAgICAgW2JvdW5kYXJ5Um91dGVJZF06IGVycm9yXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBpc1JvdXRlRXJyb3JSZXNwb25zZShlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDAsXG4gICAgICAgICAgICAgICAgYWN0aW9uSGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgbG9hZGVySGVhZGVyczoge31cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICgpID0+IFByb21pc2UucmVzb2x2ZShzdGF0aWNDb250ZXh0KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgI
25114H1cbiAgICAgICAgKTtcbiAgICAgICAgaW52YXJpYW50KGlzUmVzcG9uc2UocmVzcG9uc2UpLCBcIkV4cGVjdGVkIGEgcmVzcG9uc2UgaW4gcXVlcnkoKVwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNSZXNwb25zZShlKSkge1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBhd2FpdCBxdWVyeUltcGwoXG4gICAgICByZXF1ZXN0LFxuICAgICAgbG9jYXRpb24sXG4gICAgICBtYXRjaGVzLFxuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICBkYXRhU3RyYXRlZ3kgfHwgbnVsbCxcbiAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID09PSB0cnVlLFxuICAgICAgbnVsbCxcbiAgICAgIGZpbHRlck1hdGNoZXNUb0xvYWQgfHwgbnVsbCxcbiAgICAgIHNraXBSZXZhbGlkYXRpb24gPT09IHRydWVcbiAgICApO1xuICAgIGlmIChpc1Jlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB7IGxvY2F0aW9uLCBiYXNlbmFtZSwgLi4ucmVzdWx0IH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlSb3V0ZShyZXF1ZXN0LCB7XG4gICAgcm91dGVJZCxcbiAgICByZXF1ZXN0Q29udGV4dCxcbiAgICBkYXRhU3RyYXRlZ3ksXG4gICAgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2VcbiAgfSA9IHt9KSB7XG4gICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgIGxldCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcbiAgICBsZXQgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihcIlwiLCBjcmVhdGVQYXRoKHVybCksIG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKGRhdGFSb3V0ZXMsIGxvY2F0aW9uLCBiYXNlbmFtZSk7XG4gICAgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dCAhPSBudWxsID8gcmVxdWVzdENvbnRleHQgOiBuZXcgUm91dGVyQ29udGV4dFByb3ZpZGVyKCk7XG4gICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkgJiYgbWV0aG9kICE9PSBcIkhFQURcIiAmJiBtZXRob2QgIT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNSwgeyBtZXRob2QgfSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2hlcykge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDQsIHsgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lIH0pO1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSByb3V0ZUlkID8gbWF0Y2hlcy5maW5kKChtKSA9PiBtLnJvdXRlLmlkID09PSByb3V0ZUlkKSA6IGdldFRhcmdldE1hdGNoKG1hdGNoZXMsIGxvY2F0aW9uKTtcbiAgICBpZiAocm91dGVJZCAmJiAhbWF0Y2gpIHtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDAzLCB7XG4gICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgcm91dGVJZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA0LCB7IHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKGdlbmVyYXRlTWlkZGxld2FyZVJlc3BvbnNlKSB7XG4gICAgICBpbnZhcmlhbnQoXG4gICAgICAgIHJlcXVlc3RDb250ZXh0IGluc3RhbmNlb2YgUm91dGVyQ29udGV4dFByb3ZpZGVyLFxuICAgICAgICBcIldoZW4gdXNpbmcgbWlkZGxld2FyZSBpbiBgc3RhdGljSGFuZGxlci5xdWVyeVJvdXRlKClgLCBhbnkgcHJvdmlkZWQgYHJlcXVlc3RDb250ZXh0YCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBSb3V0ZXJDb250ZXh0UHJvdmlkZXJgXCJcbiAgICAgICk7XG4gICAgICBhd2FpdCBsb2FkTGF6eU1pZGRsZXdhcmVGb3JNYXRjaGVzKG1hdGNoZXMsIG1hbmlmZXN0LCBtYXBSb3V0ZVByb3BlcnRpZXMyKTtcbiAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJ1blNlcnZlck1pZGRsZXdhcmVQaXBlbGluZShcbiAgICAgICAge1xuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBwYXJhbXM6IG1hdGNoZXNbMF0ucGFyYW1zLFxuICAgICAgICAgIC8vIElmIHdlJ3JlIGNhbGxpbmcgbWlkZGxld2FyZSB0aGVuIGl0IG11c3QgYmUgZW5hYmxlZCBzbyB3ZSBjYW4gY2FzdFxuICAgICAgICAgIC8vIHRoaXMgdG8gdGhlIHByb3BlciB0eXBlIGtub3dpbmcgaXQncyBub3QgYW4gYEFwcExvYWRDb250ZXh0YFxuICAgICAgICAgIGNvbnRleHQ6IHJlcXVlc3RDb250ZXh0XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgZ2VuZXJhdGVNaWRkbGV3YXJlUmVzcG9uc2UoXG4gICAgICAgICAgICBhc3luYyAoaW5uZXJSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQyID0gYXdhaXQgcXVlcnlJbXBsKFxuICAgICAgICAgICAgICAgIGlubmVyUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgICAgICAgIGRhdGFTdHJhdGVneSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgbGV0IHByb2Nlc3NlZCA9IGhhbmRsZVF1ZXJ5UmVzdWx0KHJlc3VsdDIpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNSZXNwb25zZShwcm9jZXNzZWQpID8gcHJvY2Vzc2VkIDogdHlwZW9mIHByb2Nlc3NlZCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZXNwb25zZShwcm9jZXNzZWQpIDogUmVzcG9uc2UuanNvbihwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGlzRGF0YVdpdGhSZXNwb25zZUluaXQoZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShlcnJvcikpO1xuICAgICAgICAgI
25114H1cbiAgICAgICAgICBpZiAoaXNSZXNwb25zZShlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5SW1wbChcbiAgICAgIHJlcXVlc3QsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIG1hdGNoZXMsXG4gICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgIGRhdGFTdHJhdGVneSB8fCBudWxsLFxuICAgICAgZmFsc2UsXG4gICAgICBtYXRjaCxcbiAgICAgIG51bGwsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgcmV0dXJuIGhhbmRsZVF1ZXJ5UmVzdWx0KHJlc3VsdCk7XG4gICAgZnVuY3Rpb24gaGFuZGxlUXVlcnlSZXN1bHQocmVzdWx0Mikge1xuICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0MikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgICB9XG4gICAgICBsZXQgZXJyb3IgPSByZXN1bHQyLmVycm9ycyA/IE9iamVjdC52YWx1ZXMocmVzdWx0Mi5lcnJvcnMpWzBdIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Mi5hY3Rpb25EYXRhKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdDIuYWN0aW9uRGF0YSlbMF07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0Mi5sb2FkZXJEYXRhKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc3VsdDIubG9hZGVyRGF0YSlbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBhc3luYyBmdW5jdGlvbiBxdWVyeUltcGwocmVxdWVzdCwgbG9jYXRpb24sIG1hdGNoZXMsIHJlcXVlc3RDb250ZXh0LCBkYXRhU3RyYXRlZ3ksIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLCByb3V0ZU1hdGNoLCBmaWx0ZXJNYXRjaGVzVG9Mb2FkLCBza2lwUmV2YWxpZGF0aW9uKSB7XG4gICAgaW52YXJpYW50KFxuICAgICAgcmVxdWVzdC5zaWduYWwsXG4gICAgICBcInF1ZXJ5KCkvcXVlcnlSb3V0ZSgpIHJlcXVlc3RzIG11c3QgY29udGFpbiBhbiBBYm9ydENvbnRyb2xsZXIgc2lnbmFsXCJcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgbGV0IHJlc3VsdDIgPSBhd2FpdCBzdWJtaXQoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIHJvdXRlTWF0Y2ggfHwgZ2V0VGFyZ2V0TWF0Y2gobWF0Y2hlcywgbG9jYXRpb24pLFxuICAgICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgIGRhdGFTdHJhdGVneSxcbiAgICAgICAgICBza2lwTG9hZGVyRXJyb3JCdWJibGluZyxcbiAgICAgICAgICByb3V0ZU1hdGNoICE9IG51bGwsXG4gICAgICAgICAgZmlsdGVyTWF0Y2hlc1RvTG9hZCxcbiAgICAgICAgICBza2lwUmV2YWxpZGF0aW9uXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQyO1xuICAgICAgfVxuICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGxvYWRSb3V0ZURhdGEoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICBkYXRhU3RyYXRlZ3ksXG4gICAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nLFxuICAgICAgICByb3V0ZU1hdGNoLFxuICAgICAgICBmaWx0ZXJNYXRjaGVzVG9Mb2FkXG4gICAgICApO1xuICAgICAgcmV0dXJuIGlzUmVzcG9uc2UocmVzdWx0KSA/IHJlc3VsdCA6IHtcbiAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICBhY3Rpb25EYXRhOiBudWxsLFxuICAgICAgICBhY3Rpb25IZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNEYXRhU3RyYXRlZ3lSZXN1bHQoZSkgJiYgaXNSZXNwb25zZShlLnJlc3VsdCkpIHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJlcnJvclwiIC8qIGVycm9yICovKSB7XG4gICAgICAgICAgdGhyb3cgZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGUucmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVkaXJlY3RSZXNwb25zZShlKSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdChyZXF1ZXN0LCBtYXRjaGVzLCBhY3Rpb25NYXRjaCwgcmVxdWVzdENvbnRleHQsIGRhdGFTdHJhdGVneSwgc2tpcExvYWRlckVycm9yQnViYmxpbmcsIGlzUm91dGVSZXF1ZXN0LCBmaWx0ZXJNYXRjaGVzVG9Mb2FkLCBza2lwUmV2YWxpZGF0aW9uKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoIWFjdGlvbk1hdGNoLnJvdXRlLmFjdGlvbiAmJiAhYWN0aW9uTWF0Y2gucm91dGUubGF6eSkge1xuICAgICAgbGV0IGVycm9yID0gZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1
25114ZXN0Lm1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICByb3V0ZUlkOiBhY3Rpb25NYXRjaC5yb3V0ZS5pZFxuICAgICAgfSk7XG4gICAgICBpZiAoaXNSb3V0ZVJlcXVlc3QpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgZXJyb3JcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkc01hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBhY3Rpb25NYXRjaCxcbiAgICAgICAgW10sXG4gICAgICAgIHJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBkc01hdGNoZXMsXG4gICAgICAgIGlzUm91dGVSZXF1ZXN0LFxuICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgZGF0YVN0cmF0ZWd5XG4gICAgICApO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0c1thY3Rpb25NYXRjaC5yb3V0ZS5pZF07XG4gICAgICBpZiAocmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB0aHJvd1N0YXRpY0hhbmRsZXJBYm9ydGVkRXJyb3IocmVxdWVzdCwgaXNSb3V0ZVJlcXVlc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICBzdGF0dXM6IHJlc3VsdC5yZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBMb2NhdGlvbjogcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIilcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc1JvdXRlUmVxdWVzdCkge1xuICAgICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXRjaGVzOiBbYWN0aW9uTWF0Y2hdLFxuICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgYWN0aW9uRGF0YTogeyBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YSB9LFxuICAgICAgICBlcnJvcnM6IG51bGwsXG4gICAgICAgIC8vIE5vdGU6IHN0YXR1c0NvZGUgKyBoZWFkZXJzIGFyZSB1bnVzZWQgaGVyZSBzaW5jZSBxdWVyeVJvdXRlIHdpbGxcbiAgICAgICAgLy8gcmV0dXJuIHRoZSByYXcgUmVzcG9uc2Ugb3IgdmFsdWVcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fSxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge31cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChza2lwUmV2YWxpZGF0aW9uKSB7XG4gICAgICBpZiAoaXNFcnJvclJlc3VsdChyZXN1bHQpKSB7XG4gICAgICAgIGxldCBib3VuZGFyeU1hdGNoID0gc2tpcExvYWRlckVycm9yQnViYmxpbmcgPyBhY3Rpb25NYXRjaCA6IGZpbmROZWFyZXN0Qm91bmRhcnkobWF0Y2hlcywgYWN0aW9uTWF0Y2gucm91dGUuaWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdC5lcnJvcikgPyByZXN1bHQuZXJyb3Iuc3RhdHVzIDogcmVzdWx0LnN0YXR1c0NvZGUgIT0gbnVsbCA/IHJlc3VsdC5zdGF0dXNDb2RlIDogNTAwLFxuICAgICAgICAgIGFjdGlvbkRhdGE6IG51bGwsXG4gICAgICAgICAgYWN0aW9uSGVhZGVyczoge1xuICAgICAgICAgICAgLi4ucmVzdWx0LmhlYWRlcnMgPyB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzIH0gOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICBsb2FkZXJEYXRhOiB7fSxcbiAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmVycm9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3Rpb25EYXRhOiB7XG4gICAgICAgICAgICBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuZGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWN0aW9uSGVhZGVyczogcmVzdWx0LmhlYWRlcnMgPyB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzIH0gOiB7fSxcbiAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgIGxvYWRlckRhdGE6IHt9LFxuICAgICAgICAgIGVycm9yczogbnVsbCxcbiAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSB8fCAyMDAsXG4gICAgICAgICAgbG9hZGVySGVhZGVyczoge31cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGxvYWRlclJlcXVlc3QgPSBuZXcgUmVxdWVzdChyZXF1ZXN0LnVybCwge1xuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBza2lwTG9hZGVyRXJyb3JCdWJibGluZyA/IGFjdGlvbk1hdGNoIDogZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCBhY3Rpb25NYXRjaC5yb3V0ZS5pZCk7XG4gICAgICBsZXQgaGFuZGxlckNvbnRleHQyID0gYXdhaXQgbG9hZFJvdXRlRGF0YShcbiAgICAgICAgbG9hZGVyUmVxdWVzdCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgIGRhdGFTdHJhdGVneSxcbiAgICAgICAgc2tpcExvYWRlckVycm9yQnViYmxpbmcsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGZpbHRlck1hdGNoZXNUb0xvYWQsXG4gICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkLCByZXN1bHRdXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaGFuZGxlckNvbnRleHQyLFxuICAgICAgICBzdGF0dXNDb2RlOiBpc1JvdXRlRXJyb3JSZXNwb25zZShyZXN1bHQuZXJyb3IpID8gcmVzdWx0LmVycm9yLnN0YXR1cyA6IHJlc3VsdC5zdGF0dXNDb2RlICE9IG51bGwgPyByZXN1bHQuc3RhdHVzQ29kZSA6IDUwMCxcbiAgICAgICAgYWN0aW9uRGF0YTogbnVsbCxcbiAgICAgICAgYWN0aW9uSGVhZGVyczoge1xuICAgICAgICAgIC4uLnJlc3VsdC5oZWFkZXJzID8geyBbYWN0aW9uTWF0Y2gucm91dGUuaWRdOiByZXN1bHQuaGVhZGVycyB9IDoge31cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IGhhbmRsZXJDb250ZXh0ID0gYXdhaXQgbG9hZFJvdXRlRGF0YShcbiAgICAgIGxvYWRlclJlcXVlc3QsXG4gICAgICBtYXRjaGVzLFxuICAgICAgcmVxdW
25114VzdENvbnRleHQsXG4gICAgICBkYXRhU3RyYXRlZ3ksXG4gICAgICBza2lwTG9hZGVyRXJyb3JCdWJibGluZyxcbiAgICAgIG51bGwsXG4gICAgICBmaWx0ZXJNYXRjaGVzVG9Mb2FkXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaGFuZGxlckNvbnRleHQsXG4gICAgICBhY3Rpb25EYXRhOiB7XG4gICAgICAgIFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5kYXRhXG4gICAgICB9LFxuICAgICAgLy8gYWN0aW9uIHN0YXR1cyBjb2RlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBsb2FkZXIgc3RhdHVzIGNvZGVzXG4gICAgICAuLi5yZXN1bHQuc3RhdHVzQ29kZSA/IHsgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1c0NvZGUgfSA6IHt9LFxuICAgICAgYWN0aW9uSGVhZGVyczogcmVzdWx0LmhlYWRlcnMgPyB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdC5oZWFkZXJzIH0gOiB7fVxuICAgIH07XG4gIH1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFJvdXRlRGF0YShyZXF1ZXN0LCBtYXRjaGVzLCByZXF1ZXN0Q29udGV4dCwgZGF0YVN0cmF0ZWd5LCBza2lwTG9hZGVyRXJyb3JCdWJibGluZywgcm91dGVNYXRjaCwgZmlsdGVyTWF0Y2hlc1RvTG9hZCwgcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIGxldCBpc1JvdXRlUmVxdWVzdCA9IHJvdXRlTWF0Y2ggIT0gbnVsbDtcbiAgICBpZiAoaXNSb3V0ZVJlcXVlc3QgJiYgIXJvdXRlTWF0Y2g/LnJvdXRlLmxvYWRlciAmJiAhcm91dGVNYXRjaD8ucm91dGUubGF6eSkge1xuICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1
25114ZXN0Lm1ldGhvZCxcbiAgICAgICAgcGF0aG5hbWU6IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lLFxuICAgICAgICByb3V0ZUlkOiByb3V0ZU1hdGNoPy5yb3V0ZS5pZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBkc01hdGNoZXM7XG4gICAgaWYgKHJvdXRlTWF0Y2gpIHtcbiAgICAgIGRzTWF0Y2hlcyA9IGdldFRhcmdldGVkRGF0YVN0cmF0ZWd5TWF0Y2hlcyhcbiAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHJvdXRlTWF0Y2gsXG4gICAgICAgIFtdLFxuICAgICAgICByZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1heElkeCA9IHBlbmRpbmdBY3Rpb25SZXN1bHQgJiYgaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IChcbiAgICAgICAgLy8gVXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGJvdW5kYXJ5XG4gICAgICAgIG1hdGNoZXMuZmluZEluZGV4KChtKSA9PiBtLnJvdXRlLmlkID09PSBwZW5kaW5nQWN0aW9uUmVzdWx0WzBdKSAtIDFcbiAgICAgICkgOiB2b2lkIDA7XG4gICAgICBkc01hdGNoZXMgPSBtYXRjaGVzLm1hcCgobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChtYXhJZHggIT0gbnVsbCAmJiBpbmRleCA+IG1heElkeCkge1xuICAgICAgICAgIHJldHVybiBnZXREYXRhU3RyYXRlZ3lNYXRjaChcbiAgICAgICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldERhdGFTdHJhdGVneU1hdGNoKFxuICAgICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICAobWF0Y2gucm91dGUubG9hZGVyIHx8IG1hdGNoLnJvdXRlLmxhenkpICE9IG51bGwgJiYgKCFmaWx0ZXJNYXRjaGVzVG9Mb2FkIHx8IGZpbHRlck1hdGNoZXNUb0xvYWQobWF0Y2gpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZGF0YVN0cmF0ZWd5ICYmICFkc01hdGNoZXMuc29tZSgobSkgPT4gbS5zaG91bGRMb2FkKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YToge30sXG4gICAgICAgIGVycm9yczogcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8ge1xuICAgICAgICAgIFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvclxuICAgICAgICB9IDogbnVsbCxcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBsb2FkZXJIZWFkZXJzOiB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGRzTWF0Y2hlcyxcbiAgICAgIGlzUm91dGVSZXF1ZXN0LFxuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICBkYXRhU3RyYXRlZ3lcbiAgICApO
251141xuICAgIGlmIChyZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB0aHJvd1N0YXRpY0hhbmRsZXJBYm9ydGVkRXJyb3IocmVxdWVzdCwgaXNSb3V0ZVJlcXVlc3QpO1xuICAgIH1cbiAgICBsZXQgaGFuZGxlckNvbnRleHQgPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIHJlc3VsdHMsXG4gICAgICBwZW5kaW5nQWN0aW9uUmVzdWx0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaGFuZGxlckNvbnRleHQsXG4gICAgICBtYXRjaGVzXG4gICAgfTtcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5KHJlcXVlc3QsIG1hdGNoZXMsIGlzUm91dGVSZXF1ZXN0LCByZXF1ZXN0Q29udGV4dCwgZGF0YVN0cmF0ZWd5KSB7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWxsRGF0YVN0cmF0ZWd5SW1wbChcbiAgICAgIGRhdGFTdHJhdGVneSB8fCBkZWZhdWx0RGF0YVN0cmF0ZWd5LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIG1hdGNoZXMsXG4gICAgICBudWxsLFxuICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsZXQgZGF0YVJlc3VsdHMgPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hdGNoZXMubWFwKGFzeW5jIChtYXRjaCkgPT4ge1xuICAgICAgICBpZiAoIShtYXRjaC5yb3V0ZS5pZCBpbiByZXN1bHRzKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzdWx0c1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgICAgIGlmIChpc1JlZGlyZWN0RGF0YVN0cmF0ZWd5UmVzdWx0KHJlc3VsdCkpIHtcbiAgICAgICAgICBsZXQgcmVzcG9uc2UgPSByZXN1bHQucmVzdWx0O1xuICAgICAgICAgIHRocm93IG5vcm1hbGl6ZVJlbGF0aXZlUm91dGluZ1JlZGlyZWN0UmVzcG9uc2UoXG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBtYXRjaC5yb3V0ZS5pZCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBiYXNlbmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUm91dGVSZXF1ZXN0KSB7XG4gICAgICAgICAgaWYgKGlzUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRGF0YVdpdGhSZXNwb25zZUluaXQocmVzdWx0LnJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShyZXN1bHQucmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVJlc3VsdHNbbWF0Y2gucm91dGUuaWRdID0gYXdhaXQgY29udmVydERhdGFTdHJhdGVneVJlc3VsdFRvRGF0YVJlc3VsdChyZXN1bHQpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBkYXRhUmVzdWx0cztcbiAgfVxuICByZXR1cm4ge1xuICAgIGRhdGFSb3V0ZXMsXG4gICAgcXVlcnksXG4gICAgcXVlcnlSb3V0ZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U3RhdGljQ29udGV4dEZyb21FcnJvcihyb3V0ZXMsIGhhbmRsZXJDb250ZXh0LCBlcnJvciwgYm91bmRhcnlJZCkge1xuICBsZXQgZXJyb3JCb3VuZGFyeUlkID0gYm91bmRhcnlJZCB8fCBoYW5kbGVyQ29udGV4dC5fZGVlcGVzdFJlbmRlcmVkQm91bmRhcnlJZCB8fCByb3V0ZXNbMF0uaWQ7XG4gIHJldHVybiB7XG4gICAgLi4uaGFuZGxlckNvbnRleHQsXG4gICAgc3RhdHVzQ29kZTogaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwLFxuICAgIGVycm9yczoge1xuICAgICAgW2Vycm9yQm91bmRhcnlJZF06IGVycm9yXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdGhyb3dTdGF0aWNIYW5kbGVyQWJvcnRlZEVycm9yKHJlcXVlc3QsIGlzUm91dGVSZXF1ZXN0KSB7XG4gIGlmIChyZXF1ZXN0LnNpZ25hbC5yZWFzb24gIT09IHZvaWQgMCkge1xuICAgIHRocm93IHJlcXVlc3Quc2lnbmFsLnJlYXNvbjtcbiAgfVxuICBsZXQgbWV0aG9kID0gaXNSb3V0ZVJlcXVlc3QgPyBcInF1ZXJ5Um91dGVcIiA6IFwicXVlcnlcIjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGAke21ldGhvZH0oKSBjYWxsIGFib3J0ZWQgd2l0aG91dCBhbiBcXGBBYm9ydFNpZ25hbC5yZWFzb25cXGA6ICR7cmVxdWVzdC5tZXRob2R9ICR7cmVxdWVzdC51cmx9YFxuICApO1xufVxuZnVuY3Rpb24gaXNTdWJtaXNzaW9uTmF2aWdhdGlvbihvcHRzKSB7XG4gIHJldHVybiBvcHRzICE9IG51bGwgJiYgKFwiZm9ybURhdGFcIiBpbiBvcHRzICYmIG9wdHMuZm9ybURhdGEgIT0gbnVsbCB8fCBcImJvZHlcIiBpbiBvcHRzICYmIG9wdHMuYm9keSAhPT0gdm9pZCAwKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRvKGxvY2F0aW9uLCBtYXRjaGVzLCBiYXNlbmFtZSwgdG8sIGZyb21Sb3V0ZUlkLCByZWxhdGl2ZSkge1xuICBsZXQgY29udGV4dHVhbE1hdGNoZXM7XG4gIGxldCBhY3RpdmVSb3V0ZU1hdGNoO1xuICBpZiAoZnJvbVJvdXRlSWQpIHtcbiAgICBjb250ZXh0dWFsTWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGNvbnRleHR1YWxNYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgICAgaWYgKG1hdGNoLnJvdXRlLmlkID09PSBmcm9tUm91dGVJZCkge1xuICAgICAgICBhY3RpdmVSb3V0ZU1hdGNoID0gbWF0Y2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0dWFsTWF0Y2hlcyA9IG1hdGNoZXM7XG4gICAgYWN0aXZlUm91dGVNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgfVxuICBsZXQgcGF0aCA9IHJlc29sdmVUbyhcbiAgICB0byA/IHRvIDogXCIuXCIsXG4gICAgZ2V0UmVzb2x2ZVRvTWF0Y2hlcyhjb250ZXh0dWFsTWF0Y2hlcyksXG4gICAgc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgIHJlbGF0aXZlID09PSBcInBhdGhcIlxuICApO
251141xuICBpZiAodG8gPT0gbnVsbCkge1xuICAgIHBhdGguc2VhcmNoID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIHBhdGguaGFzaCA9IGxvY2F0aW9uLmhhc2g7XG4gIH1cbiAgaWYgKCh0byA9PSBudWxsIHx8IHRvID09PSBcIlwiIHx8IHRvID09PSBcIi5cIikgJiYgYWN0aXZlUm91dGVNYXRjaCkge1xuICAgIGxldCBuYWtlZEluZGV4ID0gaGFzTmFrZWRJbmRleFF1ZXJ5KHBhdGguc2VhcmNoKTtcbiAgICBpZiAoYWN0aXZlUm91dGVNYXRjaC5yb3V0ZS5pbmRleCAmJiAhbmFrZWRJbmRleCkge1xuICAgICAgcGF0aC5zZWFyY2ggPSBwYXRoLnNlYXJjaCA/IHBhdGguc2VhcmNoLnJlcGxhY2UoL15cXD8vLCBcIj9pbmRleCZcIikgOiBcIj9pbmRleFwiO1xuICAgIH0gZWxzZSBpZiAoIWFjdGl2ZVJvdXRlTWF0Y2gucm91dGUuaW5kZXggJiYgbmFrZWRJbmRleCkge1xuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGF0aC5zZWFyY2gpO1xuICAgICAgbGV0IGluZGV4VmFsdWVzID0gcGFyYW1zLmdldEFsbChcImluZGV4XCIpO1xuICAgICAgcGFyYW1zLmRlbGV0ZShcImluZGV4XCIpO1xuICAgICAgaW5kZXhWYWx1ZXMuZmlsdGVyKCh2KSA9PiB2KS5mb3JFYWNoKCh2KSA9PiBwYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgdikpO1xuICAgICAgbGV0IHFzID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICBwYXRoLnNlYXJjaCA9IHFzID8gYD8ke3FzfWAgOiBcIlwiO1xuICAgIH1cbiAgfVxuICBpZiAoYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgcGF0aC5wYXRobmFtZSA9IHByZXBlbmRCYXNlbmFtZSh7IGJhc2VuYW1lLCBwYXRobmFtZTogcGF0aC5wYXRobmFtZSB9KTtcbiAgfVxuICByZXR1cm4gY3JlYXRlUGF0aChwYXRoKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hdmlnYXRlT3B0aW9ucyhpc0ZldGNoZXIsIHBhdGgsIG9wdHMpIHtcbiAgaWYgKCFvcHRzIHx8ICFpc1N1Ym1pc3Npb25OYXZpZ2F0aW9uKG9wdHMpKSB7XG4gICAgcmV0dXJuIHsgcGF0aCB9O1xuICB9XG4gIGlmIChvcHRzLmZvcm1NZXRob2QgJiYgIWlzVmFsaWRNZXRob2Qob3B0cy5mb3JtTWV0aG9kKSkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZXJyb3I6IGdldEludGVybmFsUm91dGVyRXJyb3IoNDA1LCB7IG1ldGhvZDogb3B0cy5mb3JtTWV0aG9kIH0pXG4gICAgfTtcbiAgfVxuICBsZXQgZ2V0SW52YWxpZEJvZHlFcnJvciA9ICgpID0+ICh7XG4gICAgcGF0aCxcbiAgICBlcnJvcjogZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDAsIHsgdHlwZTogXCJpbnZhbGlkLWJvZHlcIiB9KVxuICB9KTtcbiAgbGV0IHJhd0Zvcm1NZXRob2QgPSBvcHRzLmZvcm1NZXRob2QgfHwgXCJnZXRcIjtcbiAgbGV0IGZvcm1NZXRob2QgPSByYXdGb3JtTWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGxldCBmb3JtQWN0aW9uID0gc3RyaXBIYXNoRnJvbVBhdGgocGF0aCk7XG4gIGlmIChvcHRzLmJvZHkgIT09IHZvaWQgMCkge1xuICAgIGlmIChvcHRzLmZvcm1FbmNUeXBlID09PSBcInRleHQvcGxhaW5cIikge1xuICAgICAgaWYgKCFpc011dGF0aW9uTWV0aG9kKGZvcm1NZXRob2QpKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgICB9XG4gICAgICBsZXQgdGV4dCA9IHR5cGVvZiBvcHRzLmJvZHkgPT09IFwic3RyaW5nXCIgPyBvcHRzLmJvZHkgOiBvcHRzLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fCBvcHRzLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgPyAoXG4gICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI3BsYWluLXRleHQtZm9ybS1kYXRhXG4gICAgICAgIEFycmF5LmZyb20ob3B0cy5ib2R5LmVudHJpZXMoKSkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIFtuYW1lLCB2YWx1ZV0pID0+IGAke2FjY30ke25hbWV9PSR7dmFsdWV9XG5gLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKVxuICAgICAgKSA6IFN0cmluZyhvcHRzLmJvZHkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc3VibWlzc2lvbjoge1xuICAgICAgICAgIGZvcm1NZXRob2QsXG4gICAgICAgICAgZm9ybUFjdGlvbixcbiAgICAgICAgICBmb3JtRW5jVHlwZTogb3B0cy5mb3JtRW5jVHlwZSxcbiAgICAgICAgICBmb3JtRGF0YTogdm9pZCAwLFxuICAgICAgICAgIGpzb246IHZvaWQgMCxcbiAgICAgICAgICB0ZXh0XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvcHRzLmZvcm1FbmNUeXBlID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgaWYgKCFpc011dGF0aW9uTWV0aG9kKGZvcm1NZXRob2QpKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBsZXQganNvbiA9IHR5cGVvZiBvcHRzLmJvZHkgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKG9wdHMuYm9keSkgOiBvcHRzLmJvZHk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzdWJtaXNzaW9uOiB7XG4gICAgICAgICAgICBmb3JtTWV0aG9kLFxuICAgICAgICAgICAgZm9ybUFjdGlvbixcbiAgICAgICAgICAgIGZvcm1FbmNUeXBlOiBvcHRzLmZvcm1FbmNUeXBlLFxuICAgICAgICAgICAgZm9ybURhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgIGpzb24sXG4gICAgICAgICAgICB0ZXh0OiB2b2lkIDBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGludmFyaWFudChcbiAgICB0eXBlb2YgRm9ybURhdGEgPT09IFwiZnVuY3Rpb25cIixcbiAgICBcIkZvcm1EYXRhIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudFwiXG4gICk7XG4gIGxldCBzZWFyY2hQYXJhbXM7XG4gIGxldCBmb3JtRGF0YTtcbiAgaWYgKG9wdHMuZm9ybURhdGEpIHtcbiAgICBzZWFyY2hQYXJhbXMgPSBjb252ZXJ0Rm9ybURhdGFUb1NlYXJjaFBhcmFtcyhvcHRzLmZvcm1EYXRhKTtcbiAgICBmb3JtRGF0YSA9IG9wdHMuZm9ybURhdGE7XG4gIH0gZWxzZSBpZiAob3B0cy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICBzZWFyY2hQYXJhbXMgPSBjb252ZXJ0Rm9ybURhdGFUb1NlYXJjaFBhcmFtcyhvcHRzLmJvZHkpO1xuICAgIGZvcm1EYXRhID0gb3B0cy5ib2R5O1xuICB9IGVsc2UgaWYgKG9wdHMuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgIHNlYXJjaFBhcmFtcyA9IG9wdHMuYm9keTtcbiAgICBmb3JtRGF0YSA9IGNvbnZlcnRTZWFyY2hQYXJhbXNUb0Zvcm1EYXRhKHNlYXJjaFBhcmFtcyk7XG4gIH0gZWxzZSBpZiAob3B0cy5ib2R5ID09IG51bGwpIHtcbiAgICBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRzLmJvZHkpO1xuICAgICAgZm9ybURhdGEgPSBjb252ZXJ0U2VhcmNoUGFyYW1zVG9Gb3JtRGF0YShzZWFyY2hQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybi
25114BnZXRJbnZhbGlkQm9keUVycm9yKCk7XG4gICAgfVxuICB9XG4gIGxldCBzdWJtaXNzaW9uID0ge1xuICAgIGZvcm1NZXRob2QsXG4gICAgZm9ybUFjdGlvbixcbiAgICBmb3JtRW5jVHlwZTogb3B0cyAmJiBvcHRzLmZvcm1FbmNUeXBlIHx8IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG4gICAgZm9ybURhdGEsXG4gICAganNvbjogdm9pZCAwLFxuICAgIHRleHQ6IHZvaWQgMFxuICB9O1xuICBpZiAoaXNNdXRhdGlvbk1ldGhvZChzdWJtaXNzaW9uLmZvcm1NZXRob2QpKSB7XG4gICAgcmV0dXJuIHsgcGF0aCwgc3VibWlzc2lvbiB9O1xuICB9XG4gIGxldCBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKHBhdGgpO1xuICBpZiAoaXNGZXRjaGVyICYmIHBhcnNlZFBhdGguc2VhcmNoICYmIGhhc05ha2VkSW5kZXhRdWVyeShwYXJzZWRQYXRoLnNlYXJjaCkpIHtcbiAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgXCJcIik7XG4gIH1cbiAgcGFyc2VkUGF0aC5zZWFyY2ggPSBgPyR7c2VhcmNoUGFyYW1zfWA7XG4gIHJldHVybiB7IHBhdGg6IGNyZWF0ZVBhdGgocGFyc2VkUGF0aCksIHN1Ym1pc3Npb24gfTtcbn1cbmZ1bmN0aW9uIGdldE1hdGNoZXNUb0xvYWQocmVxdWVzdCwgc2NvcGVkQ29udGV4dCwgbWFwUm91dGVQcm9wZXJ0aWVzMiwgbWFuaWZlc3QsIGhpc3RvcnksIHN0YXRlLCBtYXRjaGVzLCBzdWJtaXNzaW9uLCBsb2NhdGlvbiwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCwgaW5pdGlhbEh5ZHJhdGlvbiwgaXNSZXZhbGlkYXRpb25SZXF1aXJlZCwgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLCBmZXRjaGVyc1F1ZXVlZEZvckRlbGV0aW9uLCBmZXRjaExvYWRNYXRjaGVzLCBmZXRjaFJlZGlyZWN0SWRzLCByb3V0ZXNUb1VzZSwgYmFzZW5hbWUsIGhhc1BhdGNoUm91dGVzT25OYXZpZ2F0aW9uLCBwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gIGxldCBhY3Rpb25SZXN1bHQgPSBwZW5kaW5nQWN0aW9uUmVzdWx0ID8gaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0uZXJyb3IgOiBwZW5kaW5nQWN0aW9uUmVzdWx0WzFdLmRhdGEgOiB2b2lkIDA7XG4gIGxldCBjdXJyZW50VXJsID0gaGlzdG9yeS5jcmVhdGVVUkwoc3RhdGUubG9jYXRpb24pO1xuICBsZXQgbmV4dFVybCA9IGhpc3RvcnkuY3JlYXRlVVJMKGxvY2F0aW9uKTtcbiAgbGV0IG1heElkeDtcbiAgaWYgKGluaXRpYWxIeWRyYXRpb24gJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgbGV0IGJvdW5kYXJ5SWQgPSBPYmplY3Qua2V5cyhzdGF0ZS5lcnJvcnMpWzBdO1xuICAgIG1heElkeCA9IG1hdGNoZXMuZmluZEluZGV4KChtKSA9PiBtLnJvdXRlLmlkID09PSBib3VuZGFyeUlkKTtcbiAgfSBlbHNlIGlmIChwZW5kaW5nQWN0aW9uUmVzdWx0ICYmIGlzRXJyb3JSZXN1bHQocGVuZGluZ0FjdGlvblJlc3VsdFsxXSkpIHtcbiAgICBsZXQgYm91bmRhcnlJZCA9IHBlbmRpbmdBY3Rpb25SZXN1bHRbMF07XG4gICAgbWF4SWR4ID0gbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0ucm91dGUuaWQgPT09IGJvdW5kYXJ5SWQpIC0gMTtcbiAgfVxuICBsZXQgYWN0aW9uU3RhdHVzID0gcGVuZGluZ0FjdGlvblJlc3VsdCA/IHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0uc3RhdHVzQ29kZSA6IHZvaWQgMDtcbiAgbGV0IHNob3VsZFNraXBSZXZhbGlkYXRpb24gPSBhY3Rpb25TdGF0dXMgJiYgYWN0aW9uU3RhdHVzID49IDQwMDtcbiAgbGV0IGJhc2VTaG91bGRSZXZhbGlkYXRlQXJncyA9IHtcbiAgICBjdXJyZW50VXJsLFxuICAgIGN1cnJlbnRQYXJhbXM6IHN0YXRlLm1hdGNoZXNbMF0/LnBhcmFtcyB8fCB7fSxcbiAgICBuZXh0VXJsLFxuICAgIG5leHRQYXJhbXM6IG1hdGNoZXNbMF0ucGFyYW1zLFxuICAgIC4uLnN1Ym1pc3Npb24sXG4gICAgYWN0aW9uUmVzdWx0LFxuICAgIGFjdGlvblN0YXR1c1xuICB9O1xuICBsZXQgZHNNYXRjaGVzID0gbWF0Y2hlcy5tYXAoKG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIGxldCB7IHJvdXRlIH0gPSBtYXRjaDtcbiAgICBsZXQgZm9yY2VTaG91bGRMb2FkID0gbnVsbDtcbiAgICBpZiAobWF4SWR4ICE9IG51bGwgJiYgaW5kZXggPiBtYXhJZHgpIHtcbiAgICAgIGZvcmNlU2hvdWxkTG9hZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocm91dGUubGF6eSkge1xuICAgICAgZm9yY2VTaG91bGRMb2FkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFyb3V0ZUhhc0xvYWRlck9yTWlkZGxld2FyZShyb3V0ZSkpIHtcbiAgICAgIGZvcmNlU2hvdWxkTG9hZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaW5pdGlhbEh5ZHJhdGlvbikge1xuICAgICAgZm9yY2VTaG91bGRMb2FkID0gc2hvdWxkTG9hZFJvdXRlT25IeWRyYXRpb24oXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBzdGF0ZS5sb2FkZXJEYXRhLFxuICAgICAgICBzdGF0ZS5lcnJvcnNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc05ld0xvYWRlcihzdGF0ZS5sb2FkZXJEYXRhLCBzdGF0ZS5tYXRjaGVzW2luZGV4XSwgbWF0Y2gpKSB7XG4gICAgICBmb3JjZVNob3VsZExvYWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZm9yY2VTaG91bGRMb2FkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0RGF0YVN0cmF0ZWd5TWF0Y2goXG4gICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBtYXRjaCxcbiAgICAgICAgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCxcbiAgICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgICAgZm9yY2VTaG91bGRMb2FkXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgZGVmYXVsdFNob3VsZFJldmFsaWRhdGUgPSBzaG91bGRTa2lwUmV2YWxpZGF0aW9uID8gZmFsc2UgOiAoXG4gICAgICAvLyBGb3JjZWQgcmV2YWxpZGF0aW9uIGR1ZSB0byBzdWJtaXNzaW9uLCB1c2VSZXZhbGlkYXRvciwgb3IgWC1SZW1peC1SZXZhbGlkYXRlXG4gICAgICBpc1JldmFsaWRhdGlvblJlcXVpcmVkIHx8IGN1cnJlbnRVcmwucGF0aG5hbWUgKyBjdXJyZW50VXJsLnNlYXJjaCA9PT0gbmV4dFVybC5wYXRobmFtZSArIG5leHRVcmwuc2VhcmNoIHx8IC8vIFNlYXJjaCBwYXJhbXMgYWZmZWN0IGFsbCBsb2FkZXJzXG4gICAgICBjdXJyZW50VXJsLnNlYXJjaCAhPT0gbm
25114V4dFVybC5zZWFyY2ggfHwgaXNOZXdSb3V0ZUluc3RhbmNlKHN0YXRlLm1hdGNoZXNbaW5kZXhdLCBtYXRjaClcbiAgICApO1xuICAgIGxldCBzaG91bGRSZXZhbGlkYXRlQXJncyA9IHtcbiAgICAgIC4uLmJhc2VTaG91bGRSZXZhbGlkYXRlQXJncyxcbiAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlXG4gICAgfTtcbiAgICBsZXQgc2hvdWxkTG9hZCA9IHNob3VsZFJldmFsaWRhdGVMb2FkZXIobWF0Y2gsIHNob3VsZFJldmFsaWRhdGVBcmdzKTtcbiAgICByZXR1cm4gZ2V0RGF0YVN0cmF0ZWd5TWF0Y2goXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWF0Y2gsXG4gICAgICBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwLFxuICAgICAgc2NvcGVkQ29udGV4dCxcbiAgICAgIHNob3VsZExvYWQsXG4gICAgICBzaG91bGRSZXZhbGlkYXRlQXJnc1xuICAgICk7XG4gIH0pO1xuICBsZXQgcmV2YWxpZGF0aW5nRmV0Y2hlcnMgPSBbXTtcbiAgZmV0Y2hMb2FkTWF0Y2hlcy5mb3JFYWNoKChmLCBrZXkpID0+IHtcbiAgICBpZiAoaW5pdGlhbEh5ZHJhdGlvbiB8fCAhbWF0Y2hlcy5zb21lKChtKSA9PiBtLnJvdXRlLmlkID09PSBmLnJvdXRlSWQpIHx8IGZldGNoZXJzUXVldWVkRm9yRGVsZXRpb24uaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGZldGNoZXIgPSBzdGF0ZS5mZXRjaGVycy5nZXQoa2V5KTtcbiAgICBsZXQgaXNNaWRJbml0aWFsTG9hZCA9IGZldGNoZXIgJiYgZmV0Y2hlci5zdGF0ZSAhPT0gXCJpZGxlXCIgJiYgZmV0Y2hlci5kYXRhID09PSB2b2lkIDA7XG4gICAgbGV0IGZldGNoZXJNYXRjaGVzID0gbWF0Y2hSb3V0ZXMocm91dGVzVG9Vc2UsIGYucGF0aCwgYmFzZW5hbWUpO1xuICAgIGlmICghZmV0Y2hlck1hdGNoZXMpIHtcbiAgICAgIGlmIChoYXNQYXRjaFJvdXRlc09uTmF2aWdhdGlvbiAmJiBpc01pZEluaXRpYWxMb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBudWxsLFxuICAgICAgICBtYXRjaDogbnVsbCxcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgY29udHJvbGxlcjogbnVsbFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmZXRjaFJlZGlyZWN0SWRzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBmZXRjaGVyTWF0Y2ggPSBnZXRUYXJnZXRNYXRjaChmZXRjaGVyTWF0Y2hlcywgZi5wYXRoKTtcbiAgICBsZXQgZmV0Y2hDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxldCBmZXRjaFJlcXVlc3QgPSBjcmVhdGVDbGllbnRTaWRlUmVxdWVzdChcbiAgICAgIGhpc3RvcnksXG4gICAgICBmLnBhdGgsXG4gICAgICBmZXRjaENvbnRyb2xsZXIuc2lnbmFsXG4gICAgKTtcbiAgICBsZXQgZmV0Y2hlckRzTWF0Y2hlcyA9IG51bGw7XG4gICAgaWYgKGNhbmNlbGxlZEZldGNoZXJMb2Fkcy5oYXMoa2V5KSkge1xuICAgICAgY2FuY2VsbGVkRmV0Y2hlckxvYWRzLmRlbGV0ZShrZXkpO1xuICAgICAgZmV0Y2hlckRzTWF0Y2hlcyA9IGdldFRhcmdldGVkRGF0YVN0cmF0ZWd5TWF0Y2hlcyhcbiAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIGZldGNoUmVxdWVzdCxcbiAgICAgICAgZmV0Y2hlck1hdGNoZXMsXG4gICAgICAgIGZldGNoZXJNYXRjaCxcbiAgICAgICAgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCxcbiAgICAgICAgc2NvcGVkQ29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzTWlkSW5pdGlhbExvYWQpIHtcbiAgICAgIGlmIChpc1JldmFsaWRhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgIGZldGNoZXJEc01hdGNoZXMgPSBnZXRUYXJnZXRlZERhdGFTdHJhdGVneU1hdGNoZXMoXG4gICAgICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzMixcbiAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgICBmZXRjaFJlcXVlc3QsXG4gICAgICAgICAgZmV0Y2hlck1hdGNoZXMsXG4gICAgICAgICAgZmV0Y2hlck1hdGNoLFxuICAgICAgICAgIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXAsXG4gICAgICAgICAgc2NvcGVkQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc2hvdWxkUmV2YWxpZGF0ZUFyZ3MgPSB7XG4gICAgICAgIC4uLmJhc2VTaG91bGRSZXZhbGlkYXRlQXJncyxcbiAgICAgICAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHNob3VsZFNraXBSZXZhbGlkYXRpb24gPyBmYWxzZSA6IGlzUmV2YWxpZGF0aW9uUmVxdWlyZWRcbiAgICAgIH07XG4gICAgICBpZiAoc2hvdWxkUmV2YWxpZGF0ZUxvYWRlcihmZXRjaGVyTWF0Y2gsIHNob3VsZFJldmFsaWRhdGVBcmdzKSkge1xuICAgICAgICBmZXRjaGVyRHNNYXRjaGVzID0gZ2V0VGFyZ2V0ZWREYXRhU3RyYXRlZ3lNYXRjaGVzKFxuICAgICAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgZmV0Y2hSZXF1ZXN0LFxuICAgICAgICAgIGZldGNoZXJNYXRjaGVzLFxuICAgICAgICAgIGZldGNoZXJNYXRjaCxcbiAgICAgICAgICBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwLFxuICAgICAgICAgIHNjb3BlZENvbnRleHQsXG4gICAgICAgICAgc2hvdWxkUmV2YWxpZGF0ZUFyZ3NcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZldGNoZXJEc01hdGNoZXMpIHtcbiAgICAgIHJldmFsaWRhdGluZ0ZldGNoZXJzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHJvdXRlSWQ6IGYucm91dGVJZCxcbiAgICAgICAgcGF0aDogZi5wYXRoLFxuICAgICAgICBtYXRjaGVzOiBmZXRjaGVyRHNNYXRjaGVzLFxuICAgICAgICBtYXRjaDogZmV0Y2hlck1hdGNoLFxuICAgICAgICByZXF1ZXN0OiBmZXRjaFJlcXVlc3QsXG4gICAgICAgIGNvbnRyb2xsZXI6IGZldGNoQ29udHJvbGxlclxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHsgZHNNYXRjaGVzLCByZXZhbGlkYXRpbmdGZXRjaGVycyB9O1xufVxuZnVuY3Rpb24gcm91dGVIYXNMb2FkZXJPck1pZGRsZXdhcmUocm91dGUpIHtcbiAgcmV0dXJuIHJvdXRlLmxvYWRlciAhPSBudWxsIHx8IHJvdXRlLm1pZGRsZXdhcmUgIT0gbnVsbCAmJiByb3V0ZS5taWRkbGV3YXJlLmxlbmd0aCA+IDA7XG59XG5mdW5jdGlvbiBzaG91bGRMb2FkUm91dGVPbkh5ZHJhdGlvbihyb3V0ZSwgbG9hZGVyRGF0YSwgZXJyb3JzKSB7XG4gIGlmIChyb3V0ZS5sYXp5KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFyb3V0ZUhhc0xvYWRlck9yTWlkZGxld2FyZShyb3V0ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGhhc0RhdGEgPSBsb2FkZXJEYXRhICE9IG51bGwgJiYgcm91dGUuaWQgaW4gbG9hZGVyRGF0YTtcbiAgbGV0IGhhc0Vycm9yID0gZXJyb3JzICE9IG51bGwgJiYgZXJyb3JzW3JvdXRlLmlkXSAhPT0gdm9pZCAwO1xuICBpZiAoIWhhc0RhdGEgJiYgaGFzRXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiByb3V0ZS5sb2FkZXIgPT09IFwiZnVuY3Rpb25cIiAmJiByb3V0ZS5sb2FkZXIuaHlkcmF0ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybi
25114B0cnVlO1xuICB9XG4gIHJldHVybiAhaGFzRGF0YSAmJiAhaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBpc05ld0xvYWRlcihjdXJyZW50TG9hZGVyRGF0YSwgY3VycmVudE1hdGNoLCBtYXRjaCkge1xuICBsZXQgaXNOZXcgPSAoXG4gICAgLy8gW2FdIC0+IFthLCBiXVxuICAgICFjdXJyZW50TWF0Y2ggfHwgLy8gW2EsIGJdIC0+IFthLCBjXVxuICAgIG1hdGNoLnJvdXRlLmlkICE9PSBjdXJyZW50TWF0Y2gucm91dGUuaWRcbiAgKTtcbiAgbGV0IGlzTWlzc2luZ0RhdGEgPSAhY3VycmVudExvYWRlckRhdGEuaGFzT3duUHJvcGVydHkobWF0Y2gucm91dGUuaWQpO1xuICByZXR1cm4gaXNOZXcgfHwgaXNNaXNzaW5nRGF0YTtcbn1cbmZ1bmN0aW9uIGlzTmV3Um91dGVJbnN0YW5jZShjdXJyZW50TWF0Y2gsIG1hdGNoKSB7XG4gIGxldCBjdXJyZW50UGF0aCA9IGN1cnJlbnRNYXRjaC5yb3V0ZS5wYXRoO1xuICByZXR1cm4gKFxuICAgIC8vIHBhcmFtIGNoYW5nZSBmb3IgdGhpcyBtYXRjaCwgL3VzZXJzLzEyMyAtPiAvdXNlcnMvNDU2XG4gICAgY3VycmVudE1hdGNoLnBhdGhuYW1lICE9PSBtYXRjaC5wYXRobmFtZSB8fCAvLyBzcGxhdCBwYXJhbSBjaGFuZ2VkLCB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBtYXRjaC5wYXRoXG4gICAgLy8gZS5nLiAvZmlsZXMvaW1hZ2VzL2F2YXRhci5qcGcgLT4gZmlsZXMvZmluYW5jZXMueGxzXG4gICAgY3VycmVudFBhdGggIT0gbnVsbCAmJiBjdXJyZW50UGF0aC5lbmRzV2l0aChcIipcIikgJiYgY3VycmVudE1hdGNoLnBhcmFtc1tcIipcIl0gIT09IG1hdGNoLnBhcmFtc1tcIipcIl1cbiAgKTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJldmFsaWRhdGVMb2FkZXIobG9hZGVyTWF0Y2gsIGFyZykge1xuICBpZiAobG9hZGVyTWF0Y2gucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSkge1xuICAgIGxldCByb3V0ZUNob2ljZSA9IGxvYWRlck1hdGNoLnJvdXRlLnNob3VsZFJldmFsaWRhdGUoYXJnKTtcbiAgICBpZiAodHlwZW9mIHJvdXRlQ2hvaWNlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIHJvdXRlQ2hvaWNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJnLmRlZmF1bHRTaG91bGRSZXZhbGlkYXRlO1xufVxuZnVuY3Rpb24gcGF0Y2hSb3V0ZXNJbXBsKHJvdXRlSWQsIGNoaWxkcmVuLCByb3V0ZXNUb1VzZSwgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllczIsIGFsbG93RWxlbWVudE11dGF0aW9ucykge1xuICBsZXQgY2hpbGRyZW5Ub1BhdGNoO1xuICBpZiAocm91dGVJZCkge1xuICAgIGxldCByb3V0ZSA9IG1hbmlmZXN0W3JvdXRlSWRdO1xuICAgIGludmFyaWFudChcbiAgICAgIHJvdXRlLFxuICAgICAgYE5vIHJvdXRlIGZvdW5kIHRvIHBhdGNoIGNoaWxkcmVuIGludG86IHJvdXRlSWQgPSAke3JvdXRlSWR9YFxuICAgICk7XG4gICAgaWYgKCFyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgcm91dGUuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY2hpbGRyZW5Ub1BhdGNoID0gcm91dGUuY2hpbGRyZW47XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW5Ub1BhdGNoID0gcm91dGVzVG9Vc2U7XG4gIH1cbiAgbGV0IHVuaXF1ZUNoaWxkcmVuID0gW107XG4gIGxldCBleGlzdGluZ0NoaWxkcmVuID0gW107XG4gIGNoaWxkcmVuLmZvckVhY2goKG5ld1JvdXRlKSA9PiB7XG4gICAgbGV0IGV4aXN0aW5nUm91dGUgPSBjaGlsZHJlblRvUGF0Y2guZmluZChcbiAgICAgIChleGlzdGluZ1JvdXRlMikgPT4gaXNTYW1lUm91dGUobmV3Um91dGUsIGV4aXN0aW5nUm91dGUyKVxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nUm91dGUpIHtcbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4ucHVzaCh7IGV4aXN0aW5nUm91dGUsIG5ld1JvdXRlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmlxdWVDaGlsZHJlbi5wdXNoKG5ld1JvdXRlKTtcbiAgICB9XG4gIH0pO1xuICBpZiAodW5pcXVlQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgIGxldCBuZXdSb3V0ZXMgPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKFxuICAgICAgdW5pcXVlQ2hpbGRyZW4sXG4gICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgW3JvdXRlSWQgfHwgXCJfXCIsIFwicGF0Y2hcIiwgU3RyaW5nKGNoaWxkcmVuVG9QYXRjaD8ubGVuZ3RoIHx8IFwiMFwiKV0sXG4gICAgICBtYW5pZmVzdFxuICAgICk7XG4gICAgY2hpbGRyZW5Ub1BhdGNoLnB1c2goLi4ubmV3Um91dGVzKTtcbiAgfVxuICBpZiAoYWxsb3dFbGVtZW50TXV0YXRpb25zICYmIGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHsgZXhpc3RpbmdSb3V0ZSwgbmV3Um91dGUgfSA9IGV4aXN0aW5nQ2hpbGRyZW5baV07XG4gICAgICBsZXQgZXhpc3RpbmdSb3V0ZVR5cGVkID0gZXhpc3RpbmdSb3V0ZTtcbiAgICAgIGxldCBbbmV3Um91dGVUeXBlZF0gPSBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzKFxuICAgICAgICBbbmV3Um91dGVdLFxuICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICBbXSxcbiAgICAgICAgLy8gRG9lc24ndCBtYXR0ZXIgZm9yIG11dGF0ZWQgcm91dGVzIHNpbmNlIHRoZXkgYWxyZWFkeSBoYXZlIGFuIGlkXG4gICAgICAgIHt9LFxuICAgICAgICAvLyBEb24ndCB0b3VjaCB0aGUgbWFuaWZlc3QgaGVyZSBzaW5jZSB3ZSdyZSB1cGRhdGluZyBpbiBwbGFjZVxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihleGlzdGluZ1JvdXRlVHlwZWQsIHtcbiAgICAgICAgZWxlbWVudDogbmV3Um91dGVUeXBlZC5lbGVtZW50ID8gbmV3Um91dGVUeXBlZC5lbGVtZW50IDogZXhpc3RpbmdSb3V0ZVR5cGVkLmVsZW1lbnQsXG4gICAgICAgIGVycm9yRWxlbWVudDogbmV3Um91dGVUeXBlZC5lcnJvckVsZW1lbnQgPyBuZXdSb3V0ZVR5cGVkLmVycm9yRWxlbWVudCA6IGV4aXN0aW5nUm91dGVUeXBlZC5lcnJvckVsZW1lbnQsXG4gICAgICAgIGh5ZHJhdGVGYWxsYmFja0VsZW1lbnQ6IG5ld1JvdXRlVHlwZWQuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA/IG5ld1JvdXRlVHlwZWQuaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA6IGV4aXN0aW5nUm91dGVUeXBlZC5oeWRyYXRlRmFsbGJhY2tFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gI
25114H1cbn1cbmZ1bmN0aW9uIGlzU2FtZVJvdXRlKG5ld1JvdXRlLCBleGlzdGluZ1JvdXRlKSB7XG4gIGlmIChcImlkXCIgaW4gbmV3Um91dGUgJiYgXCJpZFwiIGluIGV4aXN0aW5nUm91dGUgJiYgbmV3Um91dGUuaWQgPT09IGV4aXN0aW5nUm91dGUuaWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIShuZXdSb3V0ZS5pbmRleCA9PT0gZXhpc3RpbmdSb3V0ZS5pbmRleCAmJiBuZXdSb3V0ZS5wYXRoID09PSBleGlzdGluZ1JvdXRlLnBhdGggJiYgbmV3Um91dGUuY2FzZVNlbnNpdGl2ZSA9PT0gZXhpc3RpbmdSb3V0ZS5jYXNlU2Vuc2l0aXZlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKCFuZXdSb3V0ZS5jaGlsZHJlbiB8fCBuZXdSb3V0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDApICYmICghZXhpc3RpbmdSb3V0ZS5jaGlsZHJlbiB8fCBleGlzdGluZ1JvdXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbmV3Um91dGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgKGFDaGlsZCwgaSkgPT4gZXhpc3RpbmdSb3V0ZS5jaGlsZHJlbj8uc29tZSgoYkNoaWxkKSA9PiBpc1NhbWVSb3V0ZShhQ2hpbGQsIGJDaGlsZCkpXG4gICk7XG59XG52YXIgbGF6eVJvdXRlUHJvcGVydHlDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xudmFyIGxvYWRMYXp5Um91dGVQcm9wZXJ0eSA9ICh7XG4gIGtleSxcbiAgcm91dGUsXG4gIG1hbmlmZXN0LFxuICBtYXBSb3V0ZVByb3BlcnRpZXM6IG1hcFJvdXRlUHJvcGVydGllczJcbn0pID0+IHtcbiAgbGV0IHJvdXRlVG9VcGRhdGUgPSBtYW5pZmVzdFtyb3V0ZS5pZF07XG4gIGludmFyaWFudChyb3V0ZVRvVXBkYXRlLCBcIk5vIHJvdXRlIGZvdW5kIGluIG1hbmlmZXN0XCIpO1xuICBpZiAoIXJvdXRlVG9VcGRhdGUubGF6eSB8fCB0eXBlb2Ygcm91dGVUb1VwZGF0ZS5sYXp5ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBsYXp5Rm4gPSByb3V0ZVRvVXBkYXRlLmxhenlba2V5XTtcbiAgaWYgKCFsYXp5Rm4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGNhY2hlID0gbGF6eVJvdXRlUHJvcGVydHlDYWNoZS5nZXQocm91dGVUb1VwZGF0ZSk7XG4gIGlmICghY2FjaGUpIHtcbiAgICBjYWNoZSA9IHt9O1xuICAgIGxhenlSb3V0ZVByb3BlcnR5Q2FjaGUuc2V0KHJvdXRlVG9VcGRhdGUsIGNhY2hlKTtcbiAgfVxuICBsZXQgY2FjaGVkUHJvbWlzZSA9IGNhY2hlW2tleV07XG4gIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gIH1cbiAgbGV0IHByb3BlcnR5UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkTGF6eVJvdXRlT2JqZWN0S2V5KGtleSk7XG4gICAgbGV0IHN0YXRpY1JvdXRlVmFsdWUgPSByb3V0ZVRvVXBkYXRlW2tleV07XG4gICAgbGV0IGlzU3RhdGljYWxseURlZmluZWQgPSBzdGF0aWNSb3V0ZVZhbHVlICE9PSB2b2lkIDAgJiYga2V5ICE9PSBcImhhc0Vycm9yQm91bmRhcnlcIjtcbiAgICBpZiAoaXNVbnN1cHBvcnRlZCkge1xuICAgICAgd2FybmluZyhcbiAgICAgICAgIWlzVW5zdXBwb3J0ZWQsXG4gICAgICAgIFwiUm91dGUgcHJvcGVydHkgXCIgKyBrZXkgKyBcIiBpcyBub3QgYSBzdXBwb3J0ZWQgbGF6eSByb3V0ZSBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuXCJcbiAgICAgICk7XG4gICAgICBjYWNoZVtrZXldID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY2FsbHlEZWZpbmVkKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYFJvdXRlIFwiJHtyb3V0ZVRvVXBkYXRlLmlkfVwiIGhhcyBhIHN0YXRpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiIGRlZmluZWQuIFRoZSBsYXp5IHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC5gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdmFsdWUgPSBhd2FpdCBsYXp5Rm4oKTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgeyBba2V5XTogdmFsdWUgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgbWFwUm91dGVQcm9wZXJ0aWVzMihyb3V0ZVRvVXBkYXRlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm91dGVUb1VwZGF0ZS5sYXp5ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByb3V0ZVRvVXBkYXRlLmxhenlba2V5XSA9IHZvaWQgMDtcbiAgICAgIGlmIChPYmplY3QudmFsdWVzKHJvdXRlVG9VcGRhdGUubGF6eSkuZXZlcnkoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdm9pZCAwKSkge1xuICAgICAgICByb3V0ZVRvVXBkYXRlLmxhenkgPSB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICBjYWNoZVtrZXldID0gcHJvcGVydHlQcm9taXNlO1xuICByZXR1cm4gcHJvcGVydHlQcm9taXNlO1xufTtcbnZhciBsYXp5Um91dGVGdW5jdGlvbkNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBsb2FkTGF6eVJvdXRlKHJvdXRlLCB0eXBlLCBtYW5pZmVzdCwgbWFwUm91dGVQcm9wZXJ0aWVzMiwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCkge1xuICBsZXQgcm91dGVUb1VwZGF0ZSA9IG1hbmlmZXN0W3JvdXRlLmlkXTtcbiAgaW52YXJpYW50KHJvdXRlVG9VcGRhdGUsIFwiTm8gcm91dGUgZm91bmQgaW4gbWFuaWZlc3RcIik7XG4gIGlmICghcm91dGUubGF6eSkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXp5Um91dGVQcm9taXNlOiB2b2lkIDAsXG4gICAgICBsYXp5SGFuZGxlclByb21pc2U6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiByb3V0ZS5sYXp5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgY2FjaGVkUHJvbWlzZSA9IGxhenlSb3V0ZUZ1bmN0aW9uQ2FjaGUuZ2V0KHJvdXRlVG9VcGRhdGUpO1xuICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXp5Um91dGVQcm9taXNlOiBjYWNoZWRQcm9taXNlLFxuICAgICAgICBsYXp5SGFuZGxlclByb21pc2U6IGNhY2hlZFByb21pc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBsYXp5Um91dGVQcm9taXNlMiA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpbnZhcmlhbnQoXG4gICAgICAgI
25114HR5cGVvZiByb3V0ZS5sYXp5ID09PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIFwiTm8gbGF6eSByb3V0ZSBmdW5jdGlvbiBmb3VuZFwiXG4gICAgICApO1xuICAgICAgbGV0IGxhenlSb3V0ZSA9IGF3YWl0IHJvdXRlLmxhenkoKTtcbiAgICAgIGxldCByb3V0ZVVwZGF0ZXMgPSB7fTtcbiAgICAgIGZvciAobGV0IGxhenlSb3V0ZVByb3BlcnR5IGluIGxhenlSb3V0ZSkge1xuICAgICAgICBsZXQgbGF6eVZhbHVlID0gbGF6eVJvdXRlW2xhenlSb3V0ZVByb3BlcnR5XTtcbiAgICAgICAgaWYgKGxhenlWYWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkTGF6eVJvdXRlRnVuY3Rpb25LZXkobGF6eVJvdXRlUHJvcGVydHkpO1xuICAgICAgICBsZXQgc3RhdGljUm91dGVWYWx1ZSA9IHJvdXRlVG9VcGRhdGVbbGF6eVJvdXRlUHJvcGVydHldO1xuICAgICAgICBsZXQgaXNTdGF0aWNhbGx5RGVmaW5lZCA9IHN0YXRpY1JvdXRlVmFsdWUgIT09IHZvaWQgMCAmJiAvLyBUaGlzIHByb3BlcnR5IGlzbid0IHN0YXRpYyBzaW5jZSBpdCBzaG91bGQgYWx3YXlzIGJlIHVwZGF0ZWQgYmFzZWRcbiAgICAgICAgLy8gb24gdGhlIHJvdXRlIHVwZGF0ZXNcbiAgICAgICAgbGF6eVJvdXRlUHJvcGVydHkgIT09IFwiaGFzRXJyb3JCb3VuZGFyeVwiO1xuICAgICAgICBpZiAoaXNVbnN1cHBvcnRlZCkge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAhaXNVbnN1cHBvcnRlZCxcbiAgICAgICAgICAgIFwiUm91dGUgcHJvcGVydHkgXCIgKyBsYXp5Um91dGVQcm9wZXJ0eSArIFwiIGlzIG5vdCBhIHN1cHBvcnRlZCBwcm9wZXJ0eSB0byBiZSByZXR1cm5lZCBmcm9tIGEgbGF6eSByb3V0ZSBmdW5jdGlvbi4gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGlzU3RhdGljYWxseURlZmluZWQpIHtcbiAgICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgICAgIWlzU3RhdGljYWxseURlZmluZWQsXG4gICAgICAgICAgICBgUm91dGUgXCIke3JvdXRlVG9VcGRhdGUuaWR9XCIgaGFzIGEgc3RhdGljIHByb3BlcnR5IFwiJHtsYXp5Um91dGVQcm9wZXJ0eX1cIiBkZWZpbmVkIGJ1dCBpdHMgbGF6eSBmdW5jdGlvbiBpcyBhbHNvIHJldHVybmluZyBhIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LiBUaGUgbGF6eSByb3V0ZSBwcm9wZXJ0eSBcIiR7bGF6eVJvdXRlUHJvcGVydHl9XCIgd2lsbCBiZSBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvdXRlVXBkYXRlc1tsYXp5Um91dGVQcm9wZXJ0eV0gPSBsYXp5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwgcm91dGVVcGRhdGVzKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGVUb1VwZGF0ZSwge1xuICAgICAgICAvLyBUbyBrZWVwIHRoaW5ncyBmcmFtZXdvcmsgYWdub3N0aWMsIHdlIHVzZSB0aGUgcHJvdmlkZWQgYG1hcFJvdXRlUHJvcGVydGllc2BcbiAgICAgICAgLy8gZnVuY3Rpb24gdG8gc2V0IHRoZSBmcmFtZXdvcmstYXdhcmUgcHJvcGVydGllcyAoYGVsZW1lbnRgL2BoYXNFcnJvckJvdW5kYXJ5YClcbiAgICAgICAgLy8gc2luY2UgdGhlIGxvZ2ljIHdpbGwgZGlmZmVyIGJldHdlZW4gZnJhbWV3b3Jrcy5cbiAgICAgICAgLi4ubWFwUm91dGVQcm9wZXJ0aWVzMihyb3V0ZVRvVXBkYXRlKSxcbiAgICAgICAgbGF6eTogdm9pZCAwXG4gICAgICB9KTtcbiAgICB9KSgpO1xuICAgIGxhenlSb3V0ZUZ1bmN0aW9uQ2FjaGUuc2V0KHJvdXRlVG9VcGRhdGUsIGxhenlSb3V0ZVByb21pc2UyKTtcbiAgICBsYXp5Um91dGVQcm9taXNlMi5jYXRjaCgoKSA9PiB7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhenlSb3V0ZVByb21pc2U6IGxhenlSb3V0ZVByb21pc2UyLFxuICAgICAgbGF6eUhhbmRsZXJQcm9taXNlOiBsYXp5Um91dGVQcm9taXNlMlxuICAgIH07XG4gIH1cbiAgbGV0IGxhenlLZXlzID0gT2JqZWN0LmtleXMocm91dGUubGF6eSk7XG4gIGxldCBsYXp5UHJvcGVydHlQcm9taXNlcyA9IFtdO1xuICBsZXQgbGF6eUhhbmRsZXJQcm9taXNlID0gdm9pZCAwO1xuICBmb3IgKGxldCBrZXkgb2YgbGF6eUtleXMpIHtcbiAgICBpZiAobGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCAmJiBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgcHJvbWlzZSA9IGxvYWRMYXp5Um91dGVQcm9wZXJ0eSh7XG4gICAgICBrZXksXG4gICAgICByb3V0ZSxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzOiBtYXBSb3V0ZVByb3BlcnRpZXMyXG4gICAgfSk7XG4gICAgaWYgKHByb21pc2UpIHtcbiAgICAgIGxhenlQcm9wZXJ0eVByb21pc2VzLnB1c2gocHJvbWlzZSk7XG4gICAgICBpZiAoa2V5ID09PSB0eXBlKSB7XG4gICAgICAgIGxhenlIYW5kbGVyUHJvbWlzZSA9IHByb21pc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCBsYXp5Um91dGVQcm9taXNlID0gbGF6eVByb3BlcnR5UHJvbWlzZXMubGVuZ3RoID4gMCA/IFByb21pc2UuYWxsKGxhenlQcm9wZXJ0eVByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgfSkgOiB2b2lkIDA7XG4gIGxhenlSb3V0ZVByb21pc2U/LmNhdGNoKCgpID0+IHtcbiAgfSk7XG4gIGxhenlIYW5kbGVyUHJvbWlzZT8uY2F0Y2goKCkgPT4ge1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBsYXp5Um91dGVQcm9taXNlLFxuICAgIGxhenlIYW5kbGVyUHJvbWlzZVxuICB9O1xufVxuZnVuY3Rpb24gaXNOb25OdWxsYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGxvYWRMYXp5TWlkZGxld2FyZUZvck1hdGNoZXMobWF0Y2hlcywgbWFuaWZlc3QsIG1hcFJvdXRlUHJvcGVydGllczIpIHtcbiAgbGV0IHByb21pc2VzID0gbWF0Y2hlcy5tYXAoKHsgcm91dGUgfSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygcm91dGUubGF6eSAhPT0gXCJvYmplY3RcIiB8fCAhcm91dGUubGF6eS5taWRkbGV3YXJlKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZExhenlSb3V0ZVByb3BlcnR5KHtcbiAgICAgIGtleTogXCJtaWRkbGV3YXJlXCIsXG4gICAgICByb3V0ZSxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgbWFwUm91dGVQcm9wZXJ0aWVzOiBtYXBSb3V0ZVByb3BlcnRpZXMyXG4gICAgfSk7XG4gIH0pLmZpbHRlcihpc05vbk51bGxhYmxlKTtcbiAgcmV0dXJuIHByb21pc2VzLmxlbmd0aCA+IDAgPyBQcm9taXNlLmFsbChwcm9taXNlcykgOiB2b2lkIDA7XG59XG5hc3luYyBmdW5jdGlvbiBkZWZh
25114dWx0RGF0YVN0cmF0ZWd5KGFyZ3MpIHtcbiAgbGV0IG1hdGNoZXNUb0xvYWQgPSBhcmdzLm1hdGNoZXMuZmlsdGVyKChtKSA9PiBtLnNob3VsZExvYWQpO1xuICBsZXQga2V5ZWRSZXN1bHRzID0ge307XG4gIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwobWF0Y2hlc1RvTG9hZC5tYXAoKG0pID0+IG0ucmVzb2x2ZSgpKSk7XG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAga2V5ZWRSZXN1bHRzW21hdGNoZXNUb0xvYWRbaV0ucm91dGUuaWRdID0gcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuIGtleWVkUmVzdWx0cztcbn1cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHREYXRhU3RyYXRlZ3lXaXRoTWlkZGxld2FyZShhcmdzKSB7XG4gIGlmICghYXJncy5tYXRjaGVzLnNvbWUoKG0pID0+IG0ucm91dGUubWlkZGxld2FyZSkpIHtcbiAgICByZXR1cm4gZGVmYXVsdERhdGFTdHJhdGVneShhcmdzKTtcbiAgfVxuICByZXR1cm4gcnVuQ2xpZW50TWlkZGxld2FyZVBpcGVsaW5lKGFyZ3MsICgpID0+IGRlZmF1bHREYXRhU3RyYXRlZ3koYXJncykpO1xufVxuZnVuY3Rpb24gcnVuU2VydmVyTWlkZGxld2FyZVBpcGVsaW5lKGFyZ3MsIGhhbmRsZXIsIGVycm9ySGFuZGxlcikge1xuICByZXR1cm4gcnVuTWlkZGxld2FyZVBpcGVsaW5lKFxuICAgIGFyZ3MsXG4gICAgaGFuZGxlcixcbiAgICBwcm9jZXNzUmVzdWx0LFxuICAgIGlzUmVzcG9uc2UsXG4gICAgZXJyb3JIYW5kbGVyXG4gICk7XG4gIGZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0KSB7XG4gICAgcmV0dXJuIGlzRGF0YVdpdGhSZXNwb25zZUluaXQocmVzdWx0KSA/IGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShyZXN1bHQpIDogcmVzdWx0O1xuICB9XG59XG5mdW5jdGlvbiBydW5DbGllbnRNaWRkbGV3YXJlUGlwZWxpbmUoYXJncywgaGFuZGxlcikge1xuICByZXR1cm4gcnVuTWlkZGxld2FyZVBpcGVsaW5lKFxuICAgIGFyZ3MsXG4gICAgaGFuZGxlcixcbiAgICAocikgPT4gcixcbiAgICAvLyBObyBwb3N0LXByb2Nlc3NpbmcgbmVlZGVkIG9uIHRoZSBjbGllbnRcbiAgICBpc0RhdGFTdHJhdGVneVJlc3VsdHMsXG4gICAgZXJyb3JIYW5kbGVyXG4gICk7XG4gIGZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvciwgcm91dGVJZCwgbmV4dFJlc3VsdCkge1xuICAgIGlmIChuZXh0UmVzdWx0KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBPYmplY3QuYXNzaWduKG5leHRSZXN1bHQudmFsdWUsIHtcbiAgICAgICAgICBbcm91dGVJZF06IHsgdHlwZTogXCJlcnJvclwiLCByZXN1bHQ6IGVycm9yIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG1hdGNoZXMgfSA9IGFyZ3M7XG4gICAgICBsZXQgbWF4Qm91bmRhcnlJZHggPSBNYXRoLm1pbihcbiAgICAgICAgLy8gVGhyb3dpbmcgcm91dGVcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0ucm91dGUuaWQgPT09IHJvdXRlSWQpLFxuICAgICAgICAgIDBcbiAgICAgICAgKSxcbiAgICAgICAgLy8gb3IgdGhlIHNoYWxsb3dlc3Qgcm91dGUgdGhhdCBuZWVkcyB0byBsb2FkIGRhdGFcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0udW5zdGFibGVfc2hvdWxkQ2FsbEhhbmRsZXIoKSksXG4gICAgICAgICAgMFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgbGV0IGJvdW5kYXJ5Um91dGVJZCA9IGZpbmROZWFyZXN0Qm91bmRhcnkoXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIG1hdGNoZXNbbWF4Qm91bmRhcnlJZHhdLnJvdXRlLmlkXG4gICAgICApLnJvdXRlLmlkO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFtib3VuZGFyeVJvdXRlSWRdOiB7IHR5cGU6IFwiZXJyb3JcIiwgcmVzdWx0OiBlcnJvciB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJ1bk1pZGRsZXdhcmVQaXBlbGluZShhcmdzLCBoYW5kbGVyLCBwcm9jZXNzUmVzdWx0LCBpc1Jlc3VsdCwgZXJyb3JIYW5kbGVyKSB7XG4gIGxldCB7IG1hdGNoZXMsIHJlcXVlc3QsIHBhcmFtcywgY29udGV4dCB9ID0gYXJncztcbiAgbGV0IHR1cGxlcyA9IG1hdGNoZXMuZmxhdE1hcChcbiAgICAobSkgPT4gbS5yb3V0ZS5taWRkbGV3YXJlID8gbS5yb3V0ZS5taWRkbGV3YXJlLm1hcCgoZm4pID0+IFttLnJvdXRlLmlkLCBmbl0pIDogW11cbiAgKTtcbiAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxSb3V0ZU1pZGRsZXdhcmUoXG4gICAgeyByZXF1ZXN0LCBwYXJhbXMsIGNvbnRleHQgfSxcbiAgICB0dXBsZXMsXG4gICAgaGFuZGxlcixcbiAgICBwcm9jZXNzUmVzdWx0LFxuICAgIGlzUmVzdWx0LFxuICAgIGVycm9ySGFuZGxlclxuICApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbFJvdXRlTWlkZGxld2FyZShhcmdzLCBtaWRkbGV3YXJlcywgaGFuZGxlciwgcHJvY2Vzc1Jlc3VsdCwgaXNSZXN1bHQsIGVycm9ySGFuZGxlciwgaWR4ID0gMCkge1xuICBsZXQgeyByZXF1ZXN0IH0gPSBhcmdzO1xuICBpZiAocmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IHJlcXVlc3Quc2lnbmFsLnJlYXNvbiA/PyBuZXcgRXJyb3IoYFJlcXVlc3QgYWJvcnRlZDogJHtyZXF1ZXN0Lm1ldGhvZH0gJHtyZXF1ZXN0LnVybH1gKTtcbiAgfVxuICBsZXQgdHVwbGUgPSBtaWRkbGV3YXJlc1tpZHhdO1xuICBpZiAoIXR1cGxlKSB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxldCBbcm91dGVJZCwgbWlkZGxld2FyZV0gPSB0dXBsZTtcbiAgbGV0IG5leHRSZXN1bHQ7XG4gIGxldCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChuZXh0UmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbWF5IG9ubHkgY2FsbCBgbmV4dCgpYCBvbmNlIHBlciBtaWRkbGV3YXJlXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxSb3V0ZU1pZGRsZXdhcmUoXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBwcm9jZXNzUmVzdWx0LFxuICAgICAgICBpc1Jlc3VsdCxcbiAgICAgICAgZXJyb3JIYW5kbGVyLFxuICAgICAgICBpZHggKyAxXG4gICAgICApO1xuICAgICAgbmV4dFJlc3VsdCA9IHsgdmFsdWU6IHJlc3VsdCB9O1xuICAgICAgcmV0dXJuIG5leHRSZXN1bHQudmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG5leHRSZXN1bHQgPSB7IHZhbHVlOiBhd2FpdCBlcnJvckhhbmRsZXIoZXJyb3IsIHJvdXRlSWQsIG5leHRSZXN1bHQpIH07XG4gICAgICByZXR1cm4gbmV4dFJlc3VsdC52YWx1ZTtcbiAgICB9XG4gI
25114H07XG4gIHRyeSB7XG4gICAgbGV0IHZhbHVlID0gYXdhaXQgbWlkZGxld2FyZShhcmdzLCBuZXh0KTtcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWUgIT0gbnVsbCA/IHByb2Nlc3NSZXN1bHQodmFsdWUpIDogdm9pZCAwO1xuICAgIGlmIChpc1Jlc3VsdChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSBpZiAobmV4dFJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCA/PyBuZXh0UmVzdWx0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0UmVzdWx0ID0geyB2YWx1ZTogYXdhaXQgbmV4dCgpIH07XG4gICAgICByZXR1cm4gbmV4dFJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZXJyb3JIYW5kbGVyKGVycm9yLCByb3V0ZUlkLCBuZXh0UmVzdWx0KTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldERhdGFTdHJhdGVneU1hdGNoTGF6eVByb21pc2VzKG1hcFJvdXRlUHJvcGVydGllczIsIG1hbmlmZXN0LCByZXF1ZXN0LCBtYXRjaCwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCkge1xuICBsZXQgbGF6eU1pZGRsZXdhcmVQcm9taXNlID0gbG9hZExhenlSb3V0ZVByb3BlcnR5KHtcbiAgICBrZXk6IFwibWlkZGxld2FyZVwiLFxuICAgIHJvdXRlOiBtYXRjaC5yb3V0ZSxcbiAgICBtYW5pZmVzdCxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXM6IG1hcFJvdXRlUHJvcGVydGllczJcbiAgfSk7XG4gIGxldCBsYXp5Um91dGVQcm9taXNlcyA9IGxvYWRMYXp5Um91dGUoXG4gICAgbWF0Y2gucm91dGUsXG4gICAgaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCkgPyBcImFjdGlvblwiIDogXCJsb2FkZXJcIixcbiAgICBtYW5pZmVzdCxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXBcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlOiBsYXp5TWlkZGxld2FyZVByb21pc2UsXG4gICAgcm91dGU6IGxhenlSb3V0ZVByb21pc2VzLmxhenlSb3V0ZVByb21pc2UsXG4gICAgaGFuZGxlcjogbGF6eVJvdXRlUHJvbWlzZXMubGF6eUhhbmRsZXJQcm9taXNlXG4gIH07XG59XG5mdW5jdGlvbiBnZXREYXRhU3RyYXRlZ3lNYXRjaChtYXBSb3V0ZVByb3BlcnRpZXMyLCBtYW5pZmVzdCwgcmVxdWVzdCwgbWF0Y2gsIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXAsIHNjb3BlZENvbnRleHQsIHNob3VsZExvYWQsIHVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzID0gbnVsbCkge1xuICBsZXQgaXNVc2luZ05ld0FwaSA9IGZhbHNlO1xuICBsZXQgX2xhenlQcm9taXNlcyA9IGdldERhdGFTdHJhdGVneU1hdGNoTGF6eVByb21pc2VzKFxuICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgbWFuaWZlc3QsXG4gICAgcmVxdWVzdCxcbiAgICBtYXRjaCxcbiAgICBsYXp5Um91dGVQcm9wZXJ0aWVzVG9Ta2lwXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4ubWF0Y2gsXG4gICAgX2xhenlQcm9taXNlcyxcbiAgICBzaG91bGRMb2FkLFxuICAgIHVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzLFxuICAgIHVuc3RhYmxlX3Nob3VsZENhbGxIYW5kbGVyKGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlKSB7XG4gICAgICBpc1VzaW5nTmV3QXBpID0gdHJ1ZTtcbiAgICAgIGlmICghdW5zdGFibGVfc2hvdWxkUmV2YWxpZGF0ZUFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHNob3VsZExvYWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gc2hvdWxkUmV2YWxpZGF0ZUxvYWRlcihtYXRjaCwge1xuICAgICAgICAgIC4uLnVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzLFxuICAgICAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNob3VsZFJldmFsaWRhdGVMb2FkZXIobWF0Y2gsIHVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzKTtcbiAgICB9LFxuICAgIHJlc29sdmUoaGFuZGxlck92ZXJyaWRlKSB7XG4gICAgICBsZXQgeyBsYXp5LCBsb2FkZXIsIG1pZGRsZXdhcmUgfSA9IG1hdGNoLnJvdXRlO1xuICAgICAgbGV0IGNhbGxIYW5kbGVyID0gaXNVc2luZ05ld0FwaSB8fCBzaG91bGRMb2FkIHx8IGhhbmRsZXJPdmVycmlkZSAmJiAhaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCkgJiYgKGxhenkgfHwgbG9hZGVyKTtcbiAgICAgIGxldCBpc01pZGRsZXdhcmVPbmx5Um91dGUgPSBtaWRkbGV3YXJlICYmIG1pZGRsZXdhcmUubGVuZ3RoID4gMCAmJiAhbG9hZGVyICYmICFsYXp5O1xuICAgICAgaWYgKGNhbGxIYW5kbGVyICYmICFpc01pZGRsZXdhcmVPbmx5Um91dGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxMb2FkZXJPckFjdGlvbih7XG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICBsYXp5SGFuZGxlclByb21pc2U6IF9sYXp5UHJvbWlzZXM/LmhhbmRsZXIsXG4gICAgICAgICAgbGF6eVJvdXRlUHJvbWlzZTogX2xhenlQcm9taXNlcz8ucm91dGUsXG4gICAgICAgICAgaGFuZGxlck92ZXJyaWRlLFxuICAgICAgICAgIHNjb3BlZENvbnRleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdHlwZTogXCJkYXRhXCIgLyogZGF0YSAqLywgcmVzdWx0OiB2b2lkIDAgfSk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0ZWREYXRhU3RyYXRlZ3lNYXRjaGVzKG1hcFJvdXRlUHJvcGVydGllczIsIG1hbmlmZXN0LCByZXF1ZXN0LCBtYXRjaGVzLCB0YXJnZXRNYXRjaCwgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcCwgc2NvcGVkQ29udGV4dCwgc2hvdWxkUmV2YWxpZGF0ZUFyZ3MgPSBudWxsKSB7XG4gIHJldHVybiBtYXRjaGVzLm1hcCgobWF0Y2gpID0+IHtcbiAgICBpZiAobWF0Y2gucm91dGUuaWQgIT09IHRhcmdldE1hdGNoLnJvdXRlLmlkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5tYXRjaCxcbiAgICAgICAgc2hvdWxkTG9hZDogZmFsc2UsXG4gICAgICAgI
25114HVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzOiBzaG91bGRSZXZhbGlkYXRlQXJncyxcbiAgICAgICAgdW5zdGFibGVfc2hvdWxkQ2FsbEhhbmRsZXI6ICgpID0+IGZhbHNlLFxuICAgICAgICBfbGF6eVByb21pc2VzOiBnZXREYXRhU3RyYXRlZ3lNYXRjaExhenlQcm9taXNlcyhcbiAgICAgICAgICBtYXBSb3V0ZVByb3BlcnRpZXMyLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgbGF6eVJvdXRlUHJvcGVydGllc1RvU2tpcFxuICAgICAgICApLFxuICAgICAgICByZXNvbHZlOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyB0eXBlOiBcImRhdGFcIiwgcmVzdWx0OiB2b2lkIDAgfSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBnZXREYXRhU3RyYXRlZ3lNYXRjaChcbiAgICAgIG1hcFJvdXRlUHJvcGVydGllczIsXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBtYXRjaCxcbiAgICAgIGxhenlSb3V0ZVByb3BlcnRpZXNUb1NraXAsXG4gICAgICBzY29wZWRDb250ZXh0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHNob3VsZFJldmFsaWRhdGVBcmdzXG4gICAgKTtcbiAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBjYWxsRGF0YVN0cmF0ZWd5SW1wbChkYXRhU3RyYXRlZ3lJbXBsLCByZXF1ZXN0LCBtYXRjaGVzLCBmZXRjaGVyS2V5LCBzY29wZWRDb250ZXh0LCBpc1N0YXRpY0hhbmRsZXIpIHtcbiAgaWYgKG1hdGNoZXMuc29tZSgobSkgPT4gbS5fbGF6eVByb21pc2VzPy5taWRkbGV3YXJlKSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG1hdGNoZXMubWFwKChtKSA9PiBtLl9sYXp5UHJvbWlzZXM/Lm1pZGRsZXdhcmUpKTtcbiAgfVxuICBsZXQgZGF0YVN0cmF0ZWd5QXJncyA9IHtcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogbWF0Y2hlc1swXS5wYXJhbXMsXG4gICAgY29udGV4dDogc2NvcGVkQ29udGV4dCxcbiAgICBtYXRjaGVzXG4gIH07XG4gIGxldCBydW5DbGllbnRNaWRkbGV3YXJlID0gaXNTdGF0aWNIYW5kbGVyID8gKCkgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiWW91IGNhbm5vdCBjYWxsIGBydW5DbGllbnRNaWRkbGV3YXJlKClgIGZyb20gYSBzdGF0aWMgaGFuZGxlciBgZGF0YVN0cmF0ZWd5YC4gTWlkZGxld2FyZSBpcyBydW4gb3V0c2lkZSBvZiBgZGF0YVN0cmF0ZWd5YCBkdXJpbmcgU1NSIGluIG9yZGVyIHRvIGJ1YmJsZSB1cCB0aGUgUmVzcG9uc2UuICBZb3UgY2FuIGVuYWJsZSBtaWRkbGV3YXJlIHZpYSB0aGUgYHJlc3BvbmRgIEFQSSBpbiBgcXVlcnlgL2BxdWVyeVJvdXRlYFwiXG4gICAgKTtcbiAgfSA6IChjYikgPT4ge1xuICAgIGxldCB0eXBlZERhdGFTdHJhdGVneUFyZ3MgPSBkYXRhU3RyYXRlZ3lBcmdzO1xuICAgIHJldHVybiBydW5DbGllbnRNaWRkbGV3YXJlUGlwZWxpbmUodHlwZWREYXRhU3RyYXRlZ3lBcmdzLCAoKSA9PiB7XG4gICAgICByZXR1cm4gY2Ioe1xuICAgICAgICAuLi50eXBlZERhdGFTdHJhdGVneUFyZ3MsXG4gICAgICAgIGZldGNoZXJLZXksXG4gICAgICAgIHJ1bkNsaWVudE1pZGRsZXdhcmU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBjYWxsIGBydW5DbGllbnRNaWRkbGV3YXJlKClgIGZyb20gd2l0aGluIGFuIGBydW5DbGllbnRNaWRkbGV3YXJlYCBoYW5kbGVyXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHJlc3VsdHMgPSBhd2FpdCBkYXRhU3RyYXRlZ3lJbXBsKHtcbiAgICAuLi5kYXRhU3RyYXRlZ3lBcmdzLFxuICAgIGZldGNoZXJLZXksXG4gICAgcnVuQ2xpZW50TWlkZGxld2FyZVxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hdGNoZXMuZmxhdE1hcCgobSkgPT4gW1xuICAgICAgICBtLl9sYXp5UHJvbWlzZXM/LmhhbmRsZXIsXG4gICAgICAgIG0uX2xhenlQcm9taXNlcz8ucm91dGVcbiAgICAgIF0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbExvYWRlck9yQWN0aW9uKHtcbiAgcmVxdWVzdCxcbiAgbWF0Y2gsXG4gIGxhenlIYW5kbGVyUHJvbWlzZSxcbiAgbGF6eVJvdXRlUHJvbWlzZSxcbiAgaGFuZGxlck92ZXJyaWRlLFxuICBzY29wZWRDb250ZXh0XG59KSB7XG4gIGxldCByZXN1bHQ7XG4gIGxldCBvblJlamVjdDtcbiAgbGV0IGlzQWN0aW9uID0gaXNNdXRhdGlvbk1ldGhvZChyZXF1ZXN0Lm1ldGhvZCk7XG4gIGxldCB0eXBlID0gaXNBY3Rpb24gPyBcImFjdGlvblwiIDogXCJsb2FkZXJcIjtcbiAgbGV0IHJ1bkhhbmRsZXIgPSAoaGFuZGxlcikgPT4ge1xuICAgIGxldCByZWplY3Q7XG4gICAgbGV0IGFib3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByKSA9PiByZWplY3QgPSByKTtcbiAgICBvblJlamVjdCA9ICgpID0+IHJlamVjdCgpO1xuICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvblJlamVjdCk7XG4gICAgbGV0IGFjdHVhbEhhbmRsZXIgPSAoY3R4KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFlvdSBjYW5ub3QgY2FsbCB0aGUgaGFuZGxlciBmb3IgYSByb3V0ZSB3aGljaCBkZWZpbmVzIGEgYm9vbGVhbiBcIiR7dHlwZX1cIiBbcm91dGVJZDogJHttYXRjaC5yb3V0ZS5pZH1dYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyKFxuICAgICAgICB7XG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBwYXJhbXM6IG1hdGNoLnBhcmFtcyxcbiAgICAgICAgICBjb250ZXh0OiBzY29wZWRDb250ZXh0XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmN0eCAhPT0gdm9pZCAwID8gW2N0eF0gOiBbXVxuICAgICAgKTtcbiAgICB9O1xuICAgIGxldCBoYW5kbGVyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdmFsID0gYXdhaXQgKGhhbmRsZXJPdmVycmlkZSA/IGhhbmRsZXJPdmVycmlkZSgoY3R4KSA9PiBhY3R1YWxIYW5kbGVyKGN0eCkpIDogYW
25114N0dWFsSGFuZGxlcigpKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJkYXRhXCIsIHJlc3VsdDogdmFsIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiZXJyb3JcIiwgcmVzdWx0OiBlIH07XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtoYW5kbGVyUHJvbWlzZSwgYWJvcnRQcm9taXNlXSk7XG4gIH07XG4gIHRyeSB7XG4gICAgbGV0IGhhbmRsZXIgPSBpc0FjdGlvbiA/IG1hdGNoLnJvdXRlLmFjdGlvbiA6IG1hdGNoLnJvdXRlLmxvYWRlcjtcbiAgICBpZiAobGF6eUhhbmRsZXJQcm9taXNlIHx8IGxhenlSb3V0ZVByb21pc2UpIHtcbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIGxldCBoYW5kbGVyRXJyb3I7XG4gICAgICAgIGxldCBbdmFsdWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIC8vIElmIHRoZSBoYW5kbGVyIHRocm93cywgZG9uJ3QgbGV0IGl0IGltbWVkaWF0ZWx5IGJ1YmJsZSBvdXQsXG4gICAgICAgICAgLy8gc2luY2Ugd2UgbmVlZCB0byBsZXQgdGhlIGxhenkoKSBleGVjdXRpb24gZmluaXNoIHNvIHdlIGtub3cgaWYgdGhpc1xuICAgICAgICAgIC8vIHJvdXRlIGhhcyBhIGJvdW5kYXJ5IHRoYXQgY2FuIGhhbmRsZSB0aGUgZXJyb3JcbiAgICAgICAgICBydW5IYW5kbGVyKGhhbmRsZXIpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVyRXJyb3IgPSBlO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIEVuc3VyZSBhbGwgbGF6eSByb3V0ZSBwcm9taXNlcyBhcmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgICAgICBsYXp5SGFuZGxlclByb21pc2UsXG4gICAgICAgICAgbGF6eVJvdXRlUHJvbWlzZVxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGhhbmRsZXJFcnJvciAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgdGhyb3cgaGFuZGxlckVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgbGF6eUhhbmRsZXJQcm9taXNlO1xuICAgICAgICBsZXQgaGFuZGxlcjIgPSBpc0FjdGlvbiA/IG1hdGNoLnJvdXRlLmFjdGlvbiA6IG1hdGNoLnJvdXRlLmxvYWRlcjtcbiAgICAgICAgaWYgKGhhbmRsZXIyKSB7XG4gICAgICAgICAgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbcnVuSGFuZGxlcihoYW5kbGVyMiksIGxhenlSb3V0ZVByb21pc2VdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImFjdGlvblwiKSB7XG4gICAgICAgICAgbGV0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgICAgICAgIGxldCBwYXRobmFtZSA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2g7XG4gICAgICAgICAgdGhyb3cgZ2V0SW50ZXJuYWxSb3V0ZXJFcnJvcig0MDUsIHtcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgICAgIHJvdXRlSWQ6IG1hdGNoLnJvdXRlLmlkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJkYXRhXCIgLyogZGF0YSAqLywgcmVzdWx0OiB2b2lkIDAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIGxldCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgICAgIGxldCBwYXRobmFtZSA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2g7XG4gICAgICB0aHJvdyBnZXRJbnRlcm5hbFJvdXRlckVycm9yKDQwNCwge1xuICAgICAgICBwYXRobmFtZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkhhbmRsZXIoaGFuZGxlcik7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLCByZXN1bHQ6IGUgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob25SZWplY3QpIHtcbiAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvblJlamVjdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5hc3luYyBmdW5jdGlvbiBwYXJzZVJlc3BvbnNlQm9keShyZXNwb25zZSkge1xuICBsZXQgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcbiAgaWYgKGNvbnRlbnRUeXBlICYmIC9cXGJhcHBsaWNhdGlvblxcL2pzb25cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkgPT0gbnVsbCA/IG51bGwgOiByZXNwb25zZS5qc29uKCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnREYXRhU3RyYXRlZ3lSZXN1bHRUb0RhdGFSZXN1bHQoZGF0YVN0cmF0ZWd5UmVzdWx0KSB7XG4gIGxldCB7IHJlc3VsdCwgdHlwZSB9ID0gZGF0YVN0cmF0ZWd5UmVzdWx0O1xuICBpZiAoaXNSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgbGV0IGRhdGEyO1xuICAgIHRyeSB7XG4gICAgICBkYXRhMiA9IGF3YWl0IHBhcnNlUmVzcG9uc2VCb2R5KHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLCBlcnJvcjogZSB9O1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJlcnJvclwiIC8qIGVycm9yICovKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3JSZXNwb25zZUltcGwocmVzdWx0LnN0YXR1cywgcmVzdWx0LnN0YXR1c1RleHQsIGRhdGEyKSxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImRhdGFcIiAvKiBkYXRhICovLFxuICAgICAgZGF0YTogZGF0YTIsXG4gICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzLFxuICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnNcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcImVycm9yXCIgLyogZXJyb3IgKi8pIHtcbiAgICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQpKSB7XG4gICAgICBpZiAocmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgI
25114HR5cGU6IFwiZXJyb3JcIiAvKiBlcnJvciAqLyxcbiAgICAgICAgICBlcnJvcjogcmVzdWx0LmRhdGEsXG4gICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LmluaXQ/LnN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzOiByZXN1bHQuaW5pdD8uaGVhZGVycyA/IG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpIDogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImVycm9yXCIgLyogZXJyb3IgKi8sXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3JSZXNwb25zZUltcGwoXG4gICAgICAgICAgcmVzdWx0LmluaXQ/LnN0YXR1cyB8fCA1MDAsXG4gICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgIHJlc3VsdC5kYXRhXG4gICAgICAgICksXG4gICAgICAgIHN0YXR1c0NvZGU6IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdCkgPyByZXN1bHQuc3RhdHVzIDogdm9pZCAwLFxuICAgICAgICBoZWFkZXJzOiByZXN1bHQuaW5pdD8uaGVhZGVycyA/IG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpIDogdm9pZCAwXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlcnJvclwiIC8qIGVycm9yICovLFxuICAgICAgZXJyb3I6IHJlc3VsdCxcbiAgICAgIHN0YXR1c0NvZGU6IGlzUm91dGVFcnJvclJlc3BvbnNlKHJlc3VsdCkgPyByZXN1bHQuc3RhdHVzIDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICBpZiAoaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZGF0YVwiIC8qIGRhdGEgKi8sXG4gICAgICBkYXRhOiByZXN1bHQuZGF0YSxcbiAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5pbml0Py5zdGF0dXMsXG4gICAgICBoZWFkZXJzOiByZXN1bHQuaW5pdD8uaGVhZGVycyA/IG5ldyBIZWFkZXJzKHJlc3VsdC5pbml0LmhlYWRlcnMpIDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyB0eXBlOiBcImRhdGFcIiAvKiBkYXRhICovLCBkYXRhOiByZXN1bHQgfTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aXZlUm91dGluZ1JlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2UsIHJlcXVlc3QsIHJvdXRlSWQsIG1hdGNoZXMsIGJhc2VuYW1lKSB7XG4gIGxldCBsb2NhdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiTG9jYXRpb25cIik7XG4gIGludmFyaWFudChcbiAgICBsb2NhdGlvbixcbiAgICBcIlJlZGlyZWN0cyByZXR1cm5lZC90aHJvd24gZnJvbSBsb2FkZXJzL2FjdGlvbnMgbXVzdCBoYXZlIGEgTG9jYXRpb24gaGVhZGVyXCJcbiAgKTtcbiAgaWYgKCFpc0Fic29sdXRlVXJsKGxvY2F0aW9uKSkge1xuICAgIGxldCB0cmltbWVkTWF0Y2hlcyA9IG1hdGNoZXMuc2xpY2UoXG4gICAgICAwLFxuICAgICAgbWF0Y2hlcy5maW5kSW5kZXgoKG0pID0+IG0ucm91dGUuaWQgPT09IHJvdXRlSWQpICsgMVxuICAgICk7XG4gICAgbG9jYXRpb24gPSBub3JtYWxpemVUbyhcbiAgICAgIG5ldyBVUkwocmVxdWVzdC51cmwpLFxuICAgICAgdHJpbW1lZE1hdGNoZXMsXG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGxvY2F0aW9uXG4gICAgKTtcbiAgICByZXNwb25zZS5oZWFkZXJzLnNldChcIkxvY2F0aW9uXCIsIGxvY2F0aW9uKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5mdW5jdGlvbiBub3JtYWxpemVSZWRpcmVjdExvY2F0aW9uKGxvY2F0aW9uLCBjdXJyZW50VXJsLCBiYXNlbmFtZSkge1xuICBpZiAoaXNBYnNvbHV0ZVVybChsb2NhdGlvbikpIHtcbiAgICBsZXQgbm9ybWFsaXplZExvY2F0aW9uID0gbG9jYXRpb247XG4gICAgbGV0IHVybCA9IG5vcm1hbGl6ZWRMb2NhdGlvbi5zdGFydHNXaXRoKFwiLy9cIikgPyBuZXcgVVJMKGN1cnJlbnRVcmwucHJvdG9jb2wgKyBub3JtYWxpemVkTG9jYXRpb24pIDogbmV3IFVSTChub3JtYWxpemVkTG9jYXRpb24pO1xuICAgIGxldCBpc1NhbWVCYXNlbmFtZSA9IHN0cmlwQmFzZW5hbWUodXJsLnBhdGhuYW1lLCBiYXNlbmFtZSkgIT0gbnVsbDtcbiAgICBpZiAodXJsLm9yaWdpbiA9PT0gY3VycmVudFVybC5vcmlnaW4gJiYgaXNTYW1lQmFzZW5hbWUpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoICsgdXJsLmhhc2g7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb2NhdGlvbjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudFNpZGVSZXF1ZXN0KGhpc3RvcnksIGxvY2F0aW9uLCBzaWduYWwsIHN1Ym1pc3Npb24pIHtcbiAgbGV0IHVybCA9IGhpc3RvcnkuY3JlYXRlVVJMKHN0cmlwSGFzaEZyb21QYXRoKGxvY2F0aW9uKSkudG9TdHJpbmcoKTtcbiAgbGV0IGluaXQgPSB7IHNpZ25hbCB9O1xuICBpZiAoc3VibWlzc2lvbiAmJiBpc011dGF0aW9uTWV0aG9kKHN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpIHtcbiAgICBsZXQgeyBmb3JtTWV0aG9kLCBmb3JtRW5jVHlwZSB9ID0gc3VibWlzc2lvbjtcbiAgICBpbml0Lm1ldGhvZCA9IGZvcm1NZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICBpbml0LmhlYWRlcnMgPSBuZXcgSGVhZGVycyh7IFwiQ29udGVudC1UeXBlXCI6IGZvcm1FbmNUeXBlIH0pO1xuICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoc3VibWlzc2lvbi5qc29uKTtcbiAgICB9IGVsc2UgaWYgKGZvcm1FbmNUeXBlID09PSBcInRleHQvcGxhaW5cIikge1xuICAgICAgaW5pdC5ib2R5ID0gc3VibWlzc2lvbi50ZXh0O1xuICAgIH0gZWxzZSBpZiAoZm9ybUVuY1R5cGUgPT09IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgJiYgc3VibWlzc2lvbi5mb3JtRGF0YSkge1xuICAgICAgaW5pdC5ib2R5ID0gY29udmVydEZvcm1EYXRhVG9TZWFyY2hQYXJhbXMoc3VibWlzc2lvbi5mb3JtRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXQuYm9keSA9IHN1Ym1pc3Npb24uZm9ybURhdGE7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUmVxdWVzdCh1cmwsIGluaXQpO1xufVxuZnVuY3Rpb24gY29udmVydEZvcm1EYXRhVG9TZWFyY2hQYXJhbXMoZm9ybURhdGEpIHtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSkge1xuICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLm5hbWUpO1xuICB9XG4gI
25114HJldHVybiBzZWFyY2hQYXJhbXM7XG59XG5mdW5jdGlvbiBjb252ZXJ0U2VhcmNoUGFyYW1zVG9Gb3JtRGF0YShzZWFyY2hQYXJhbXMpIHtcbiAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmb3JtRGF0YTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NSb3V0ZUxvYWRlckRhdGEobWF0Y2hlcywgcmVzdWx0cywgcGVuZGluZ0FjdGlvblJlc3VsdCwgaXNTdGF0aWNIYW5kbGVyID0gZmFsc2UsIHNraXBMb2FkZXJFcnJvckJ1YmJsaW5nID0gZmFsc2UpIHtcbiAgbGV0IGxvYWRlckRhdGEgPSB7fTtcbiAgbGV0IGVycm9ycyA9IG51bGw7XG4gIGxldCBzdGF0dXNDb2RlO1xuICBsZXQgZm91bmRFcnJvciA9IGZhbHNlO1xuICBsZXQgbG9hZGVySGVhZGVycyA9IHt9O1xuICBsZXQgcGVuZGluZ0Vycm9yID0gcGVuZGluZ0FjdGlvblJlc3VsdCAmJiBpc0Vycm9yUmVzdWx0KHBlbmRpbmdBY3Rpb25SZXN1bHRbMV0pID8gcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5lcnJvciA6IHZvaWQgMDtcbiAgbWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgIGlmICghKG1hdGNoLnJvdXRlLmlkIGluIHJlc3VsdHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBpZCA9IG1hdGNoLnJvdXRlLmlkO1xuICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2lkXTtcbiAgICBpbnZhcmlhbnQoXG4gICAgICAhaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpLFxuICAgICAgXCJDYW5ub3QgaGFuZGxlIHJlZGlyZWN0IHJlc3VsdHMgaW4gcHJvY2Vzc0xvYWRlckRhdGFcIlxuICAgICk7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgaWYgKHBlbmRpbmdFcnJvciAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGVycm9yID0gcGVuZGluZ0Vycm9yO1xuICAgICAgICBwZW5kaW5nRXJyb3IgPSB2b2lkIDA7XG4gICAgICB9XG4gICAgICBlcnJvcnMgPSBlcnJvcnMgfHwge307XG4gICAgICBpZiAoc2tpcExvYWRlckVycm9yQnViYmxpbmcpIHtcbiAgICAgICAgZXJyb3JzW2lkXSA9IGVycm9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KG1hdGNoZXMsIGlkKTtcbiAgICAgICAgaWYgKGVycm9yc1tib3VuZGFyeU1hdGNoLnJvdXRlLmlkXSA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3JzW2JvdW5kYXJ5TWF0Y2gucm91dGUuaWRdID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTdGF0aWNIYW5kbGVyKSB7XG4gICAgICAgIGxvYWRlckRhdGFbaWRdID0gUmVzZXRMb2FkZXJEYXRhU3ltYm9sO1xuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZEVycm9yKSB7XG4gICAgICAgIGZvdW5kRXJyb3IgPSB0cnVlO1xuICAgICAgICBzdGF0dXNDb2RlID0gaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LmVycm9yKSA/IHJlc3VsdC5lcnJvci5zdGF0dXMgOiA1MDA7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgbG9hZGVySGVhZGVyc1tpZF0gPSByZXN1bHQuaGVhZGVycztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZGVyRGF0YVtpZF0gPSByZXN1bHQuZGF0YTtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzQ29kZSAmJiByZXN1bHQuc3RhdHVzQ29kZSAhPT0gMjAwICYmICFmb3VuZEVycm9yKSB7XG4gICAgICAgIHN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzQ29kZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuaGVhZGVycykge1xuICAgICAgICBsb2FkZXJIZWFkZXJzW2lkXSA9IHJlc3VsdC5oZWFkZXJzO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChwZW5kaW5nRXJyb3IgIT09IHZvaWQgMCAmJiBwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gICAgZXJyb3JzID0geyBbcGVuZGluZ0FjdGlvblJlc3VsdFswXV06IHBlbmRpbmdFcnJvciB9O1xuICAgIGlmIChwZW5kaW5nQWN0aW9uUmVzdWx0WzJdKSB7XG4gICAgICBsb2FkZXJEYXRhW3BlbmRpbmdBY3Rpb25SZXN1bHRbMl1dID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGxvYWRlckRhdGEsXG4gICAgZXJyb3JzLFxuICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUgfHwgMjAwLFxuICAgIGxvYWRlckhlYWRlcnNcbiAgfTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NMb2FkZXJEYXRhKHN0YXRlLCBtYXRjaGVzLCByZXN1bHRzLCBwZW5kaW5nQWN0aW9uUmVzdWx0LCByZXZhbGlkYXRpbmdGZXRjaGVycywgZmV0Y2hlclJlc3VsdHMpIHtcbiAgbGV0IHsgbG9hZGVyRGF0YSwgZXJyb3JzIH0gPSBwcm9jZXNzUm91dGVMb2FkZXJEYXRhKFxuICAgIG1hdGNoZXMsXG4gICAgcmVzdWx0cyxcbiAgICBwZW5kaW5nQWN0aW9uUmVzdWx0XG4gICk7XG4gIHJldmFsaWRhdGluZ0ZldGNoZXJzLmZpbHRlcigoZikgPT4gIWYubWF0Y2hlcyB8fCBmLm1hdGNoZXMuc29tZSgobSkgPT4gbS5zaG91bGRMb2FkKSkuZm9yRWFjaCgocmYpID0+IHtcbiAgICBsZXQgeyBrZXksIG1hdGNoLCBjb250cm9sbGVyIH0gPSByZjtcbiAgICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBmZXRjaGVyUmVzdWx0c1trZXldO1xuICAgIGludmFyaWFudChyZXN1bHQsIFwiRGlkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgZmV0Y2hlciByZXN1bHRcIik7XG4gICAgaWYgKGlzRXJyb3JSZXN1bHQocmVzdWx0KSkge1xuICAgICAgbGV0IGJvdW5kYXJ5TWF0Y2ggPSBmaW5kTmVhcmVzdEJvdW5kYXJ5KHN0YXRlLm1hdGNoZXMsIG1hdGNoPy5yb3V0ZS5pZCk7XG4gICAgICBpZiAoIShlcnJvcnMgJiYgZXJyb3JzW2JvdW5kYXJ5TWF0Y2gucm91dGUuaWRdKSkge1xuICAgICAgICBlcnJvcnMgPSB7XG4gICAgICAgICAgLi4uZXJyb3JzLFxuICAgICAgICAgIFtib3VuZGFyeU1hdGNoLnJvdXRlLmlkXTogcmVzdWx0LmVycm9yXG4gICAgICAgI
25114H07XG4gICAgICB9XG4gICAgICBzdGF0ZS5mZXRjaGVycy5kZWxldGUoa2V5KTtcbiAgICB9IGVsc2UgaWYgKGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSkge1xuICAgICAgaW52YXJpYW50KGZhbHNlLCBcIlVuaGFuZGxlZCBmZXRjaGVyIHJldmFsaWRhdGlvbiByZWRpcmVjdFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRvbmVGZXRjaGVyID0gZ2V0RG9uZUZldGNoZXIocmVzdWx0LmRhdGEpO1xuICAgICAgc3RhdGUuZmV0Y2hlcnMuc2V0KGtleSwgZG9uZUZldGNoZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7IGxvYWRlckRhdGEsIGVycm9ycyB9O1xufVxuZnVuY3Rpb24gbWVyZ2VMb2FkZXJEYXRhKGxvYWRlckRhdGEsIG5ld0xvYWRlckRhdGEsIG1hdGNoZXMsIGVycm9ycykge1xuICBsZXQgbWVyZ2VkTG9hZGVyRGF0YSA9IE9iamVjdC5lbnRyaWVzKG5ld0xvYWRlckRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IFJlc2V0TG9hZGVyRGF0YVN5bWJvbCkucmVkdWNlKChtZXJnZWQsIFtrLCB2XSkgPT4ge1xuICAgIG1lcmdlZFtrXSA9IHY7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pO1xuICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgbGV0IGlkID0gbWF0Y2gucm91dGUuaWQ7XG4gICAgaWYgKCFuZXdMb2FkZXJEYXRhLmhhc093blByb3BlcnR5KGlkKSAmJiBsb2FkZXJEYXRhLmhhc093blByb3BlcnR5KGlkKSAmJiBtYXRjaC5yb3V0ZS5sb2FkZXIpIHtcbiAgICAgIG1lcmdlZExvYWRlckRhdGFbaWRdID0gbG9hZGVyRGF0YVtpZF07XG4gICAgfVxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWRMb2FkZXJEYXRhO1xufVxuZnVuY3Rpb24gZ2V0QWN0aW9uRGF0YUZvckNvbW1pdChwZW5kaW5nQWN0aW9uUmVzdWx0KSB7XG4gIGlmICghcGVuZGluZ0FjdGlvblJlc3VsdCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gaXNFcnJvclJlc3VsdChwZW5kaW5nQWN0aW9uUmVzdWx0WzFdKSA/IHtcbiAgICAvLyBDbGVhciBvdXQgcHJpb3IgYWN0aW9uRGF0YSBvbiBlcnJvcnNcbiAgICBhY3Rpb25EYXRhOiB7fVxuICB9IDoge1xuICAgIGFjdGlvbkRhdGE6IHtcbiAgICAgIFtwZW5kaW5nQWN0aW9uUmVzdWx0WzBdXTogcGVuZGluZ0FjdGlvblJlc3VsdFsxXS5kYXRhXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZmluZE5lYXJlc3RCb3VuZGFyeShtYXRjaGVzLCByb3V0ZUlkKSB7XG4gIGxldCBlbGlnaWJsZU1hdGNoZXMgPSByb3V0ZUlkID8gbWF0Y2hlcy5zbGljZSgwLCBtYXRjaGVzLmZpbmRJbmRleCgobSkgPT4gbS5yb3V0ZS5pZCA9PT0gcm91dGVJZCkgKyAxKSA6IFsuLi5tYXRjaGVzXTtcbiAgcmV0dXJuIGVsaWdpYmxlTWF0Y2hlcy5yZXZlcnNlKCkuZmluZCgobSkgPT4gbS5yb3V0ZS5oYXNFcnJvckJvdW5kYXJ5ID09PSB0cnVlKSB8fCBtYXRjaGVzWzBdO1xufVxuZnVuY3Rpb24gZ2V0U2hvcnRDaXJjdWl0TWF0Y2hlcyhyb3V0ZXMpIHtcbiAgbGV0IHJvdXRlID0gcm91dGVzLmxlbmd0aCA9PT0gMSA/IHJvdXRlc1swXSA6IHJvdXRlcy5maW5kKChyKSA9PiByLmluZGV4IHx8ICFyLnBhdGggfHwgci5wYXRoID09PSBcIi9cIikgfHwge1xuICAgIGlkOiBgX19zaGltLWVycm9yLXJvdXRlX19gXG4gIH07XG4gIHJldHVybiB7XG4gICAgbWF0Y2hlczogW1xuICAgICAge1xuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICBwYXRobmFtZTogXCJcIixcbiAgICAgICAgcGF0aG5hbWVCYXNlOiBcIlwiLFxuICAgICAgICByb3V0ZVxuICAgICAgfVxuICAgIF0sXG4gICAgcm91dGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEludGVybmFsUm91dGVyRXJyb3Ioc3RhdHVzLCB7XG4gIHBhdGhuYW1lLFxuICByb3V0ZUlkLFxuICBtZXRob2QsXG4gIHR5cGUsXG4gIG1lc3NhZ2Vcbn0gPSB7fSkge1xuICBsZXQgc3RhdHVzVGV4dCA9IFwiVW5rbm93biBTZXJ2ZXIgRXJyb3JcIjtcbiAgbGV0IGVycm9yTWVzc2FnZSA9IFwiVW5rbm93biBAcmVtaXgtcnVuL3JvdXRlciBlcnJvclwiO1xuICBpZiAoc3RhdHVzID09PSA0MDApIHtcbiAgICBzdGF0dXNUZXh0ID0gXCJCYWQgUmVxdWVzdFwiO1xuICAgIGlmIChtZXRob2QgJiYgcGF0aG5hbWUgJiYgcm91dGVJZCkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gYFlvdSBtYWRlIGEgJHttZXRob2R9IHJlcXVlc3QgdG8gXCIke3BhdGhuYW1lfVwiIGJ1dCBkaWQgbm90IHByb3ZpZGUgYSBcXGBsb2FkZXJcXGAgZm9yIHJvdXRlIFwiJHtyb3V0ZUlkfVwiLCBzbyB0aGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LmA7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImludmFsaWQtYm9keVwiKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIlVuYWJsZSB0byBlbmNvZGUgc3VibWlzc2lvbiBib2R5XCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiRm9yYmlkZGVuXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gYFJvdXRlIFwiJHtyb3V0ZUlkfVwiIGRvZXMgbm90IG1hdGNoIFVSTCBcIiR7cGF0aG5hbWV9XCJgO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgc3RhdHVzVGV4dCA9IFwiTm90IEZvdW5kXCI7XG4gICAgZXJyb3JNZXNzYWdlID0gYE5vIHJvdXRlIG1hdGNoZXMgVVJMIFwiJHtwYXRobmFtZX1cImA7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDUpIHtcbiAgICBzdGF0dXNUZXh0ID0gXCJNZXRob2QgTm90IEFsbG93ZWRcIjtcbiAgICBpZiAobWV0aG9kICYmIHBhdGhuYW1lICYmIHJvdXRlSWQpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGBZb3UgbWFkZSBhICR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9IHJlcXVlc3QgdG8gXCIke3BhdGhuYW1lfVwiIGJ1dCBkaWQgbm90IHByb3ZpZGUgYW4gXFxgYWN0aW9uXFxgIGZvciByb3V0ZSBcIiR7cm91dGVJZH1cIiwgc28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC5gO1xuICAgIH0gZWxzZSBpZiAobWV0aG9kKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBgSW52YWxpZCByZXF1ZXN0IG1ldGhvZCBcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCJgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IEVycm9yUmVzcG9uc2VJbXBsKFxuICAgIHN0YXR1cyB8fCA1MDAsXG4gICAgc3RhdHVzVGV4dCxcbiAgICBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSxcbiAgICB0cnVlXG4gICk7XG59XG5mdW5jdGlvbiBmaW5kUmVkaXJlY3QocmVzdWx0cykge1xuICBsZXQgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHJlc3VsdHMpO1xuICBmb3IgKGxldCBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxldCBba2V5LCByZXN1bHRdID0gZW50cmllc1tpXTtcbiAgICBpZiAoaXNSZWRpcmVjdFJlc3VsdChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHJlc3VsdCB9O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc3RyaXBIYXNoRnJvbVBhdGgocGF0aCkge1xuICBsZXQgcGFyc2VkUGF0aCA9IHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKHBhdGgpIDogcGF0aDtcbiAgcmV0dXJuIGNyZWF0ZVBhdGgoeyAuLi5wYXJzZWRQYXRoLCBoYXNoOiBcIlwiIH0pO1xufVxuZnVuY3Rpb24gaXNIYXNoQ2hhbmdlT25seShhLCBiKSB7XG4gIGlmIChhLnBhdGhuYW1lICE9PSBiLnBhdGhuYW1lIHx8IGEuc2VhcmNoICE9PSBiLnNlYXJjaCkge1xuICAgIHJldHVybi
25114BmYWxzZTtcbiAgfVxuICBpZiAoYS5oYXNoID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGIuaGFzaCAhPT0gXCJcIjtcbiAgfSBlbHNlIGlmIChhLmhhc2ggPT09IGIuaGFzaCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGIuaGFzaCAhPT0gXCJcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRhdGFXaXRoUmVzcG9uc2VJbml0VG9SZXNwb25zZShkYXRhMikge1xuICByZXR1cm4gUmVzcG9uc2UuanNvbihkYXRhMi5kYXRhLCBkYXRhMi5pbml0ID8/IHZvaWQgMCk7XG59XG5mdW5jdGlvbiBkYXRhV2l0aFJlc3BvbnNlSW5pdFRvRXJyb3JSZXNwb25zZShkYXRhMikge1xuICByZXR1cm4gbmV3IEVycm9yUmVzcG9uc2VJbXBsKFxuICAgIGRhdGEyLmluaXQ/LnN0YXR1cyA/PyA1MDAsXG4gICAgZGF0YTIuaW5pdD8uc3RhdHVzVGV4dCA/PyBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIGRhdGEyLmRhdGFcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzRGF0YVN0cmF0ZWd5UmVzdWx0cyhyZXN1bHQpIHtcbiAgcmV0dXJuIHJlc3VsdCAhPSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmVudHJpZXMocmVzdWx0KS5ldmVyeShcbiAgICAoW2tleSwgdmFsdWVdKSA9PiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGlzRGF0YVN0cmF0ZWd5UmVzdWx0KHZhbHVlKVxuICApO1xufVxuZnVuY3Rpb24gaXNEYXRhU3RyYXRlZ3lSZXN1bHQocmVzdWx0KSB7XG4gIHJldHVybiByZXN1bHQgIT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIFwidHlwZVwiIGluIHJlc3VsdCAmJiBcInJlc3VsdFwiIGluIHJlc3VsdCAmJiAocmVzdWx0LnR5cGUgPT09IFwiZGF0YVwiIC8qIGRhdGEgKi8gfHwgcmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIiAvKiBlcnJvciAqLyk7XG59XG5mdW5jdGlvbiBpc1JlZGlyZWN0RGF0YVN0cmF0ZWd5UmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gaXNSZXNwb25zZShyZXN1bHQucmVzdWx0KSAmJiByZWRpcmVjdFN0YXR1c0NvZGVzLmhhcyhyZXN1bHQucmVzdWx0LnN0YXR1cyk7XG59XG5mdW5jdGlvbiBpc0Vycm9yUmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gcmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIiAvKiBlcnJvciAqLztcbn1cbmZ1bmN0aW9uIGlzUmVkaXJlY3RSZXN1bHQocmVzdWx0KSB7XG4gIHJldHVybiAocmVzdWx0ICYmIHJlc3VsdC50eXBlKSA9PT0gXCJyZWRpcmVjdFwiIC8qIHJlZGlyZWN0ICovO1xufVxuZnVuY3Rpb24gaXNEYXRhV2l0aFJlc3BvbnNlSW5pdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgXCJ0eXBlXCIgaW4gdmFsdWUgJiYgXCJkYXRhXCIgaW4gdmFsdWUgJiYgXCJpbml0XCIgaW4gdmFsdWUgJiYgdmFsdWUudHlwZSA9PT0gXCJ
25114EYXRhV2l0aFJlc3BvbnNlSW5pdFwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUuc3RhdHVzID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZS5zdGF0dXNUZXh0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5oZWFkZXJzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS5ib2R5ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuZnVuY3Rpb24gaXNSZWRpcmVjdFN0YXR1c0NvZGUoc3RhdHVzQ29kZSkge1xuICByZXR1cm4gcmVkaXJlY3RTdGF0dXNDb2Rlcy5oYXMoc3RhdHVzQ29kZSk7XG59XG5mdW5jdGlvbiBpc1JlZGlyZWN0UmVzcG9uc2UocmVzdWx0KSB7XG4gIHJldHVybiBpc1Jlc3BvbnNlKHJlc3VsdCkgJiYgaXNSZWRpcmVjdFN0YXR1c0NvZGUocmVzdWx0LnN0YXR1cykgJiYgcmVzdWx0LmhlYWRlcnMuaGFzKFwiTG9jYXRpb25cIik7XG59XG5mdW5jdGlvbiBpc1ZhbGlkTWV0aG9kKG1ldGhvZCkge1xuICByZXR1cm4gdmFsaWRSZXF1ZXN0TWV0aG9kcy5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpO1xufVxuZnVuY3Rpb24gaXNNdXRhdGlvbk1ldGhvZChtZXRob2QpIHtcbiAgcmV0dXJuIHZhbGlkTXV0YXRpb25NZXRob2RzLmhhcyhtZXRob2QudG9VcHBlckNhc2UoKSk7XG59XG5mdW5jdGlvbiBoYXNOYWtlZEluZGV4UXVlcnkoc2VhcmNoKSB7XG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCkuZ2V0QWxsKFwiaW5kZXhcIikuc29tZSgodikgPT4gdiA9PT0gXCJcIik7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRNYXRjaChtYXRjaGVzLCBsb2NhdGlvbikge1xuICBsZXQgc2VhcmNoID0gdHlwZW9mIGxvY2F0aW9uID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKGxvY2F0aW9uKS5zZWFyY2ggOiBsb2NhdGlvbi5zZWFyY2g7XG4gIGlmIChtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucm91dGUuaW5kZXggJiYgaGFzTmFrZWRJbmRleFF1ZXJ5KHNlYXJjaCB8fCBcIlwiKSkge1xuICAgIHJldHVybiBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07XG4gIH1cbiAgbGV0IHBhdGhNYXRjaGVzID0gZ2V0UGF0aENvbnRyaWJ1dGluZ01hdGNoZXMobWF0Y2hlcyk7XG4gIHJldHVybiBwYXRoTWF0Y2hlc1twYXRoTWF0Y2hlcy5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIGdldFN1Ym1pc3Npb25Gcm9tTmF2aWdhdGlvbihuYXZpZ2F0aW9uKSB7XG4gIGxldCB7IGZvcm1NZXRob2QsIGZvcm1BY3Rpb24sIGZvcm1FbmNUeXBlLCB0ZXh0LCBmb3JtRGF0YSwganNvbiB9ID0gbmF2aWdhdGlvbjtcbiAgaWYgKCFmb3JtTWV0aG9kIHx8ICFmb3JtQWN0aW9uIHx8ICFmb3JtRW5jVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uLFxuICAgICAgZm9ybUVuY1R5cGUsXG4gICAgICBmb3JtRGF0YTogdm9pZCAwLFxuICAgICAganNvbjogdm9pZCAwLFxuICAgICAgdGV4dFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZm9ybURhdGEgIT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBqc29uOiB2b2lkIDAsXG4gICAgICB0ZXh0OiB2b2lkIDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKGpzb24gIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtTWV0aG9kLFxuICAgICAgZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGE6IHZvaWQgMCxcbiAgICAgIGpzb24sXG4gICAgICB0ZXh0OiB2b2lkIDBcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRMb2FkaW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbikge1xuICBpZiAoc3VibWlzc2lvbikge1xuICAgIGxldCBuYXZpZ2F0aW9uID0ge1xuICAgICAgc3RhdGU6IFwibG9hZGluZ1wiLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgICBmb3JtQWN0aW9uOiBzdWJtaXNzaW9uLmZvcm1BY3Rpb24sXG4gICAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgICAganNvbjogc3VibWlzc2lvbi5qc29uLFxuICAgICAgdGV4dDogc3VibWlzc2lvbi50ZXh0XG4gICAgfTtcbiAgICByZXR1cm4gbmF2aWdhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgbmF2aWdhdGlvbiA9IHtcbiAgICAgIHN0YXRlOiBcImxvYWRpbmdcIixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgZm9ybU1ldGhvZDogdm9pZCAwLFxuICAgICAgZm9ybUFjdGlvbjogdm9pZCAwLFxuICAgICAgZm9ybUVuY1R5cGU6IHZvaWQgMCxcbiAgICAgIGZvcm1EYXRhOiB2b2lkIDAsXG4gICAgICBqc29uOiB2b2lkIDAsXG4gICAgICB0ZXh0OiB2b2lkIDBcbiAgICB9O1xuICAgIHJldHVybiBuYXZpZ2F0aW9uO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdWJtaXR0aW5nTmF2aWdhdGlvbihsb2NhdGlvbiwgc3VibWlzc2lvbikge1xuICBsZXQgbmF2aWdhdGlvbiA9IHtcbiAgICBzdGF0ZTogXCJzdWJtaXR0aW5nXCIsXG4gICAgbG9jYXRpb24sXG4gICAgZm9ybU1ldGhvZDogc3VibWlzc2lvbi5mb3JtTWV0aG9kLFxuICAgIGZvcm1BY3Rpb246IHN1Ym1pc3Npb24uZm9ybUFjdGlvbixcbiAgICBmb3JtRW5jVHlwZTogc3VibWlzc2lvbi5mb3JtRW5jVHlwZSxcbiAgICBmb3JtRGF0YTogc3VibWlzc2lvbi5mb3JtRGF0YSxcbiAgICBqc29uOiBzdWJtaXNzaW9uLmpzb24sXG4gICAgdGV4dDogc3VibWlzc2lvbi50ZXh0XG4gIH07XG4gIHJldHVybiBuYXZpZ2F0aW9uO1xufVxuZnVuY3Rpb24gZ2V0TG9hZGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZGF0YTIpIHtcbiAgaWYgKHN1Ym1pc3Npb24pIHtcbiAgICBsZXQgZmV0Y2hlciA9IHtcbiAgICAgIHN0YXRlOiBcImxvYWRpbmdcIixcbiAgICAgIGZvcm1NZXRob2Q6IHN1Ym1pc3Npb24uZm9ybU1ldGhvZCxcbiAgICAgIGZvcm1BY3Rpb246IHN1Ym1pc3Npb24uZm9ybUFjdGlvbixcbiAgICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgICAgZm9ybURhdGE6IHN1Ym1pc3Npb24uZm9ybURhdGEsXG4gICAgICBqc29uOiBzdWJtaXNzaW9uLmpzb24sXG4gICAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHQsXG4gICAgICBkYXRhOiBkYXRhMlxuICAgIH07XG4gICAgcmV0dXJuIGZldGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZldGNoZXIgPSB7XG4gICAgICBzdGF0ZTogXCJsb2FkaW5nXCIsXG4gICAgICBmb3JtTWV0aG9kOiB2b2lkIDAsXG4gICAgICBmb3JtQWN0aW9uOiB2b2lkIDAsXG4gICAgICBmb3JtRW5jVHlwZTogdm9pZCAwLFxuICAgICAgZm9ybURhdGE6IHZvaWQgMCxcbiAgICAgIGpzb246IHZvaWQgMCxcbiAgICAgIHRleHQ6IHZvaWQgMCxcbiAgICAgIGRhdGE6IGRhdGEyXG4gICAgfTtcbiAgICByZXR1cm4gZmV0Y2hlcjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VibWl0dGluZ0ZldGNoZXIoc3VibWlzc2lvbiwgZXhpc3RpbmdGZXRjaGVyKSB7XG4gIGxldCBmZXRjaGVyID0ge1xuICAgIHN0YXRlOiBcInN1Ym1pdHRpbmdcIixcbiAgICBmb3JtTWV0aG9kOiBzdWJtaXNzaW9uLmZvcm1NZXRob2QsXG4gICAgZm9ybUFjdGlvbj
25114ogc3VibWlzc2lvbi5mb3JtQWN0aW9uLFxuICAgIGZvcm1FbmNUeXBlOiBzdWJtaXNzaW9uLmZvcm1FbmNUeXBlLFxuICAgIGZvcm1EYXRhOiBzdWJtaXNzaW9uLmZvcm1EYXRhLFxuICAgIGpzb246IHN1Ym1pc3Npb24uanNvbixcbiAgICB0ZXh0OiBzdWJtaXNzaW9uLnRleHQsXG4gICAgZGF0YTogZXhpc3RpbmdGZXRjaGVyID8gZXhpc3RpbmdGZXRjaGVyLmRhdGEgOiB2b2lkIDBcbiAgfTtcbiAgcmV0dXJuIGZldGNoZXI7XG59XG5mdW5jdGlvbiBnZXREb25lRmV0Y2hlcihkYXRhMikge1xuICBsZXQgZmV0Y2hlciA9IHtcbiAgICBzdGF0ZTogXCJpZGxlXCIsXG4gICAgZm9ybU1ldGhvZDogdm9pZCAwLFxuICAgIGZvcm1BY3Rpb246IHZvaWQgMCxcbiAgICBmb3JtRW5jVHlwZTogdm9pZCAwLFxuICAgIGZvcm1EYXRhOiB2b2lkIDAsXG4gICAganNvbjogdm9pZCAwLFxuICAgIHRleHQ6IHZvaWQgMCxcbiAgICBkYXRhOiBkYXRhMlxuICB9O1xuICByZXR1cm4gZmV0Y2hlcjtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVBcHBsaWVkVHJhbnNpdGlvbnMoX3dpbmRvdywgdHJhbnNpdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBsZXQgc2Vzc2lvblBvc2l0aW9ucyA9IF93aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIFRSQU5TSVRJT05TX1NUT1JBR0VfS0VZXG4gICAgKTtcbiAgICBpZiAoc2Vzc2lvblBvc2l0aW9ucykge1xuICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25Qb3NpdGlvbnMpO1xuICAgICAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGpzb24gfHwge30pKSB7XG4gICAgICAgIGlmICh2ICYmIEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICB0cmFuc2l0aW9ucy5zZXQoaywgbmV3IFNldCh2IHx8IFtdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuZnVuY3Rpb24gcGVyc2lzdEFwcGxpZWRUcmFuc2l0aW9ucyhfd2luZG93LCB0cmFuc2l0aW9ucykge1xuICBpZiAodHJhbnNpdGlvbnMuc2l6ZSA+IDApIHtcbiAgICBsZXQganNvbiA9IHt9O1xuICAgIGZvciAobGV0IFtrLCB2XSBvZiB0cmFuc2l0aW9ucykge1xuICAgICAganNvbltrXSA9IFsuLi52XTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIF93aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgVFJBTlNJVElPTlNfU1RPUkFHRV9LRVksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGpzb24pXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYEZhaWxlZCB0byBzYXZlIGFwcGxpZWQgdmlldyB0cmFuc2l0aW9ucyBpbiBzZXNzaW9uU3RvcmFnZSAoJHtlcnJvcn0pLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEZWZlcnJlZCgpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IGFzeW5jICh2YWwpID0+IHtcbiAgICAgIHJlcyh2YWwpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlamVjdCA9IGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgcmVqKGVycm9yKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZSxcbiAgICAvL0B0cy1pZ25vcmVcbiAgICByZXNvbHZlLFxuICAgIC8vQHRzLWlnbm9yZVxuICAgIHJlamVjdFxuICB9O1xufVxuXG4vLyBsaWIvY29udGV4dC50c1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYW
25114N0XCI7XG52YXIgRGF0YVJvdXRlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuRGF0YVJvdXRlckNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJcIjtcbnZhciBEYXRhUm91dGVyU3RhdGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbkRhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkRhdGFSb3V0ZXJTdGF0ZVwiO1xudmFyIFJTQ1JvdXRlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmZ1bmN0aW9uIHVzZUlzUlNDUm91dGVyQ29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoUlNDUm91dGVyQ29udGV4dCk7XG59XG52YXIgVmlld1RyYW5zaXRpb25Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGlzVHJhbnNpdGlvbmluZzogZmFsc2Vcbn0pO1xuVmlld1RyYW5zaXRpb25Db250ZXh0LmRpc3BsYXlOYW1lID0gXCJWaWV3VHJhbnNpdGlvblwiO1xudmFyIEZldGNoZXJzQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gIC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbik7XG5GZXRjaGVyc0NvbnRleHQuZGlzcGxheU5hbWUgPSBcIkZldGNoZXJzXCI7XG52YXIgQXdhaXRDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbkF3YWl0Q29udGV4dC5kaXNwbGF5TmFtZSA9IFwiQXdhaXRcIjtcbnZhciBBd2FpdENvbnRleHRQcm92aWRlciA9IChwcm9wcykgPT4gUmVhY3QuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHByb3BzKTtcbnZhciBOYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gIG51bGxcbik7XG5OYXZpZ2F0aW9uQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiTmF2aWdhdGlvblwiO1xudmFyIExvY2F0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gIG51bGxcbik7XG5Mb2NhdGlvbkNvbnRleHQuZGlzcGxheU5hbWUgPSBcIkxvY2F0aW9uXCI7XG52YXIgUm91dGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIG91dGxldDogbnVsbCxcbiAgbWF0Y2hlczogW10sXG4gIGlzRGF0YVJvdXRlOiBmYWxzZVxufSk7XG5Sb3V0ZUNvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJvdXRlXCI7XG52YXIgUm91dGVFcnJvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuUm91dGVFcnJvckNvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJvdXRlRXJyb3JcIjtcbnZhciBFTkFCTEVfREVWX1dBUk5JTkdTID0gdHJ1ZTtcblxuLy8gbGliL2hvb2tzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QyIGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gdXNlSHJlZih0bywgeyByZWxhdGl2ZSB9ID0ge30pIHtcbiAgaW52YXJpYW50KFxuICAgIHVzZUluUm91dGVyQ29udGV4dCgpLFxuICAgIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAgIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgICBgdXNlSHJlZigpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuYFxuICApO1xuICBsZXQgeyBiYXNlbmFtZSwgbmF2aWdhdG9yIH0gPSBSZWFjdDIudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCB7IGhhc2gsIHBhdGhuYW1lLCBzZWFyY2ggfSA9IHVzZVJlc29sdmVkUGF0aCh0bywgeyByZWxhdGl2ZSB9KTtcbiAgbGV0IGpvaW5lZFBhdGhuYW1lID0gcGF0aG5hbWU7XG4gIGlmIChiYXNlbmFtZSAhPT0gXCIvXCIpIHtcbiAgICBqb2luZWRQYXRobmFtZSA9IHBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aG5hbWVdKTtcbiAgfVxuICByZXR1cm4gbmF2aWdhdG9yLmNyZWF0ZUhyZWYoeyBwYXRobmFtZTogam9pbmVkUGF0aG5hbWUsIHNlYXJjaCwgaGFzaCB9KTtcbn1cbmZ1bmN0aW9uIHVzZUluUm91dGVyQ29udGV4dCgpIHtcbiAgcmV0dXJuIFJlYWN0Mi51c2VDb250ZXh0KExvY2F0aW9uQ29udGV4dCkgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICBpbnZhcmlhbnQoXG4gICAgdXNlSW5Sb3V0ZXJDb250ZXh0KCksXG4gICAgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gICAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICAgIGB1c2VMb2NhdGlvbigpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuYFxuICApO1xuICByZXR1cm4gUmVhY3QyLnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5sb2NhdGlvbjtcbn1cbmZ1bmN0aW9uIHVzZU5hdmlnYXRpb25UeXBlKCkge1xuICByZXR1cm4gUmVhY3QyLnVzZUNvbnRleHQoTG9jYXRpb25Db250ZXh0KS5uYXZpZ2F0aW9uVHlwZTtcbn1cbmZ1bmN0aW9uIHVzZU1hdGNoKHBhdHRlcm4pIHtcbiAgaW52YXJpYW50KFxuICAgIHVzZUluUm91dGVyQ29udGV4dCgpLFxuICAgIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAgIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgICBgdXNlTWF0Y2goKSBtYXkgYmUgdXNlZCBvbmx5IGluIHRoZSBjb250ZXh0IG9mIGEgPFJvdXRlcj4gY29tcG9uZW50LmBcbiAgKTtcbiAgbGV0IHsgcGF0aG5hbWUgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIHJldHVybiBSZWFjdDIudXNlTWVtbyhcbiAgICAoKSA9PiBtYXRjaFBhdGgocGF0dGVybiwgZGVjb2RlUGF0aChwYXRobmFtZSkpLFxuICAgIFtwYXRobmFtZSwgcGF0dGVybl1cbiAgKTtcbn1cbnZhciBuYXZpZ2F0ZUVmZmVjdFdhcm5pbmcgPSBgWW91IHNob3VsZCBjYWxsIG5hdmlnYXRlKCkgaW4gYSBSZWFjdC51c2VFZmZlY3QoKSwgbm90IHdoZW4geW91ciBjb21wb25lbnQgaXMgZmlyc3QgcmVuZGVyZWQuYDtcbmZ1bmN0aW9uIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoY2IpIHtcbiAgbGV0IGlzU3RhdGljID0gUmVhY3QyLnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpLnN0YXRpYztcbiAgaWYgKCFpc1N0YXRpYykge1xuICAgIFJlYWN0Mi51c2VMYXlvdXRFZmZlY3QoY2IpO1xuICB9XG59XG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZSgpIHtcbiAgbGV0IHsgaXNEYXRhUm91dGUgfSA9IFJlYWN0Mi51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIHJldHVybi
25114Bpc0RhdGFSb3V0ZSA/IHVzZU5hdmlnYXRlU3RhYmxlKCkgOiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCk7XG59XG5mdW5jdGlvbiB1c2VOYXZpZ2F0ZVVuc3RhYmxlKCkge1xuICBpbnZhcmlhbnQoXG4gICAgdXNlSW5Sb3V0ZXJDb250ZXh0KCksXG4gICAgLy8gVE9ETzogVGhpcyBlcnJvciBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZXkgc29tZWhvdyBoYXZlIDIgdmVyc2lvbnMgb2YgdGhlXG4gICAgLy8gcm91dGVyIGxvYWRlZC4gV2UgY2FuIGhlbHAgdGhlbSB1bmRlcnN0YW5kIGhvdyB0byBhdm9pZCB0aGF0LlxuICAgIGB1c2VOYXZpZ2F0ZSgpIG1heSBiZSB1c2VkIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYSA8Um91dGVyPiBjb21wb25lbnQuYFxuICApO1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSBSZWFjdDIudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gIGxldCB7IGJhc2VuYW1lLCBuYXZpZ2F0b3IgfSA9IFJlYWN0Mi51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHsgbWF0Y2hlcyB9ID0gUmVhY3QyLnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHsgcGF0aG5hbWU6IGxvY2F0aW9uUGF0aG5hbWUgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCByb3V0ZVBhdGhuYW1lc0pzb24gPSBKU09OLnN0cmluZ2lmeShnZXRSZXNvbHZlVG9NYXRjaGVzKG1hdGNoZXMpKTtcbiAgbGV0IGFjdGl2ZVJlZiA9IFJlYWN0Mi51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdDIudXNlQ2FsbGJhY2soXG4gICAgKHRvLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgIHdhcm5pbmcoYWN0aXZlUmVmLmN1cnJlbnQsIG5hdmlnYXRlRWZmZWN0V2FybmluZyk7XG4gICAgICBpZiAoIWFjdGl2ZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIG5hdmlnYXRvci5nbyh0byk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRoID0gcmVzb2x2ZVRvKFxuICAgICAgICB0byxcbiAgICAgICAgSlNPTi5wYXJzZShyb3V0ZVBhdGhuYW1lc0pzb24pLFxuICAgICAgICBsb2NhdGlvblBhdGhuYW1lLFxuICAgICAgICBvcHRpb25zLnJlbGF0aXZlID09PSBcInBhdGhcIlxuICAgICAgKTtcbiAgICAgIGlmIChkYXRhUm91dGVyQ29udGV4dCA9PSBudWxsICYmIGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgICAgICBwYXRoLnBhdGhuYW1lID0gcGF0aC5wYXRobmFtZSA9PT0gXCIvXCIgPyBiYXNlbmFtZSA6IGpvaW5QYXRocyhbYmFzZW5hbWUsIHBhdGgucGF0aG5hbWVdKTtcbiAgICAgIH1cbiAgICAgICghIW9wdGlvbnMucmVwbGFjZSA/IG5hdmlnYXRvci5yZXBsYWNlIDogbmF2aWdhdG9yLnB1c2gpKFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLnN0YXRlLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH0sXG4gICAgW1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBuYXZpZ2F0b3IsXG4gICAgICByb3V0ZVBhdGhuYW1lc0pzb24sXG4gICAgICBsb2NhdGlvblBhdGhuYW1lLFxuICAgICAgZGF0YVJvdXRlckNvbnRleHRcbiAgICBdXG4gICk7XG4gIHJldHVybiBuYXZpZ2F0ZTtcbn1cbnZhciBPdXRsZXRDb250ZXh0ID0gUmVhY3QyLmNyZWF0ZUNvbnRleHQobnVsbCk7XG5mdW5jdGlvbiB1c2VPdXRsZXRDb250ZXh0KCkge1xuICByZXR1cm4gUmVhY3QyLnVzZUNvbnRleHQoT3V0bGV0Q29udGV4dCk7XG59XG5mdW5jdGlvbiB1c2VPdXRsZXQoY29udGV4dCkge1xuICBsZXQgb3V0bGV0ID0gUmVhY3QyLnVzZUNvbnRleHQoUm91dGVDb250ZXh0KS5vdXRsZXQ7XG4gIHJldHVybiBSZWFjdDIudXNlTWVtbyhcbiAgICAoKSA9PiBvdXRsZXQgJiYgLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KE91dGxldENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHQgfSwgb3V0bGV0KSxcbiAgICBbb3V0bGV0LCBjb250ZXh0XVxuICApO1xufVxuZnVuY3Rpb24gdXNlUGFyYW1zKCkge1xuICBsZXQgeyBtYXRjaGVzIH0gPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQgcm91dGVNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhcmFtcyA6IHt9O1xufVxuZnVuY3Rpb24gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7IHJlbGF0aXZlIH0gPSB7fSkge1xuICBsZXQgeyBtYXRjaGVzIH0gPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQgeyBwYXRobmFtZTogbG9jYXRpb25QYXRobmFtZSB9ID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHJvdXRlUGF0aG5hbWVzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcykpO1xuICByZXR1cm4gUmVhY3QyLnVzZU1lbW8oXG4gICAgKCkgPT4gcmVzb2x2ZVRvKFxuICAgICAgdG8sXG4gICAgICBKU09OLnBhcnNlKHJvdXRlUGF0aG5hbWVzSnNvbiksXG4gICAgICBsb2NhdGlvblBhdGhuYW1lLFxuICAgICAgcmVsYXRpdmUgPT09IFwicGF0aFwiXG4gICAgKSxcbiAgICBbdG8sIHJvdXRlUGF0aG5hbWVzSnNvbiwgbG9jYXRpb25QYXRobmFtZSwgcmVsYXRpdmVdXG4gICk7XG59XG5mdW5jdGlvbiB1c2VSb3V0ZXMocm91dGVzLCBsb2NhdGlvbkFyZykge1xuICByZXR1cm4gdXNlUm91dGVzSW1wbChyb3V0ZXMsIGxvY2F0aW9uQXJnKTtcbn1cbmZ1bmN0aW9uIHVzZVJvdXRlc0ltcGwocm91dGVzLCBsb2NhdGlvbkFyZywgZGF0YVJvdXRlclN0YXRlLCB1bnN0YWJsZV9vbkVycm9yLCBmdXR1cmUpIHtcbiAgaW52YXJpYW50KFxuICAgIHVzZUluUm91dGVyQ29udGV4dCgpLFxuICAgIC8vIFRPRE86IFRoaXMgZXJyb3IgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHNvbWVob3cgaGF2ZSAyIHZlcnNpb25zIG9mIHRoZVxuICAgIC8vIHJvdXRlciBsb2FkZWQuIFdlIGNhbiBoZWxwIHRoZW0gdW5kZXJzdGFuZCBob3cgdG8gYXZvaWQgdGhhdC5cbiAgICBgdXNlUm91dGVzKCkgbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5gXG4gICk7XG4gIGxldCB7IG5hdmlnYXRvciB9ID0gUmVhY3QyLnVzZUNvbnRleHQoTmF2aWdhdGlvbkNvbnRleHQpO1xuICBsZXQgeyBtYXRjaGVzOiBwYXJlbnRNYXRjaGVzIH0gPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBsZXQgcm91dGVNYXRjaCA9IHBhcmVudE1hdGNoZXNbcGFyZW50TWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgbGV0IHBhcmVudFBhcmFtcyA9IHJvdXRlTWF0Y2ggPyByb3V0ZU1hdGNoLnBhcmFtcyA6IHt9O1xuICBsZXQgcGFyZW50UGF0aG5hbWUgPSByb3V0ZU1hdGNoID8gcm91dGVNYXRjaC5wYXRobmFtZSA6IFwiL1wiO1xuICBsZXQgcGFyZW50UGF0aG5hbWVCYXNlID0gcm91dGVNYXRjaCA/IHJvdXRlTWF0Y2gucGF0aG5hbWVCYXNlIDogXCIvXCI7XG4gIGxldCBwYXJlbnRSb3V0ZSA9IHJvdXRlTWF0Y2ggJiYgcm91dGVNYXRjaC5yb3V0ZTtcbiAgaWYgKEVOQUJMRV9ERVZfV0FSTklOR1MpIHtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhcmVudFJvdXRlICYmIHBhcmVudFJvdXRlLnBhdGggfHwgXCJcIjtcbiAgICB3YXJuaW5nT25jZShcbiAgICAgIHBhcmVudFBhdGhuYW1lLFxuICAgICAgIXBhcmVudFJvdXRlIHx8IHBhcmVudFBhdGguZW5kc1dpdGgoXCIqXCIpIHx8IHBhcmVudFBhdGguZW5kc1dpdGgoXCIqP1wiKSxcbiAgICAgIGBZb3UgcmVuZGVyZWQgZGVzY2VuZGFudCA8Um91dGVzPiAob3IgY2FsbGVkIFxcYHVzZVJvdXRlcygpXFxgKSBhdCBcIiR7cGFyZW50UGF0aG5hbWV9XCIgKHVuZGVyIDxSb3V0ZSBwYXRoPVwiJHtwYXJlbnRQYXRofVwiPikgYnV0IHRoZSBwYXJlbnQgcm91dGUgcGF0aCBoYXMgbm8gdHJhaWxpbmcgXCIqXCIuIFRoaXMgbWVhbnMgaWYgeW91IG5hdmlnYXRlIGRlZXBlciwgdGhlI
25114HBhcmVudCB3b24ndCBtYXRjaCBhbnltb3JlIGFuZCB0aGVyZWZvcmUgdGhlIGNoaWxkIHJvdXRlcyB3aWxsIG5ldmVyIHJlbmRlci5cblxuUGxlYXNlIGNoYW5nZSB0aGUgcGFyZW50IDxSb3V0ZSBwYXRoPVwiJHtwYXJlbnRQYXRofVwiPiB0byA8Um91dGUgcGF0aD1cIiR7cGFyZW50UGF0aCA9PT0gXCIvXCIgPyBcIipcIiA6IGAke3BhcmVudFBhdGh9LypgfVwiPi5gXG4gICAgKTtcbiAgfVxuICBsZXQgbG9jYXRpb25Gcm9tQ29udGV4dCA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBsb2NhdGlvbjtcbiAgaWYgKGxvY2F0aW9uQXJnKSB7XG4gICAgbGV0IHBhcnNlZExvY2F0aW9uQXJnID0gdHlwZW9mIGxvY2F0aW9uQXJnID09PSBcInN0cmluZ1wiID8gcGFyc2VQYXRoKGxvY2F0aW9uQXJnKSA6IGxvY2F0aW9uQXJnO1xuICAgIGludmFyaWFudChcbiAgICAgIHBhcmVudFBhdGhuYW1lQmFzZSA9PT0gXCIvXCIgfHwgcGFyc2VkTG9jYXRpb25BcmcucGF0aG5hbWU/LnN0YXJ0c1dpdGgocGFyZW50UGF0aG5hbWVCYXNlKSxcbiAgICAgIGBXaGVuIG92ZXJyaWRpbmcgdGhlIGxvY2F0aW9uIHVzaW5nIFxcYDxSb3V0ZXMgbG9jYXRpb24+XFxgIG9yIFxcYHVzZVJvdXRlcyhyb3V0ZXMsIGxvY2F0aW9uKVxcYCwgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIG11c3QgYmVnaW4gd2l0aCB0aGUgcG9ydGlvbiBvZiB0aGUgVVJMIHBhdGhuYW1lIHRoYXQgd2FzIG1hdGNoZWQgYnkgYWxsIHBhcmVudCByb3V0ZXMuIFRoZSBjdXJyZW50IHBhdGhuYW1lIGJhc2UgaXMgXCIke3BhcmVudFBhdGhuYW1lQmFzZX1cIiBidXQgcGF0aG5hbWUgXCIke3BhcnNlZExvY2F0aW9uQXJnLnBhdGhuYW1lfVwiIHdhcyBnaXZlbiBpbiB0aGUgXFxgbG9jYXRpb25cXGAgcHJvcC5gXG4gICAgKTtcbiAgICBsb2NhdGlvbiA9IHBhcnNlZExvY2F0aW9uQXJnO1xuICB9IGVsc2Uge1xuICAgIGxvY2F0aW9uID0gbG9jYXRpb25Gcm9tQ29udGV4dDtcbiAgfVxuICBsZXQgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSB8fCBcIi9cIjtcbiAgbGV0IHJlbWFpbmluZ1BhdGhuYW1lID0gcGF0aG5hbWU7XG4gIGlmIChwYXJlbnRQYXRobmFtZUJhc2UgIT09IFwiL1wiKSB7XG4gICAgbGV0IHBhcmVudFNlZ21lbnRzID0gcGFyZW50UGF0aG5hbWVCYXNlLnJlcGxhY2UoL15cXC8vLCBcIlwiKS5zcGxpdChcIi9cIik7XG4gICAgbGV0IHNlZ21lbnRzID0gcGF0aG5hbWUucmVwbGFjZSgvXlxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKTtcbiAgICByZW1haW5pbmdQYXRobmFtZSA9IFwiL1wiICsgc2VnbWVudHMuc2xpY2UocGFyZW50U2VnbWVudHMubGVuZ3RoKS5qb2luKFwiL1wiKTtcbiAgfVxuICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlcywgeyBwYXRobmFtZTogcmVtYWluaW5nUGF0aG5hbWUgfSk7XG4gIGlmIChFTkFCTEVfREVWX1dBUk5JTkdTKSB7XG4gICAgd2FybmluZyhcbiAgICAgIHBhcmVudFJvdXRlIHx8IG1hdGNoZXMgIT0gbnVsbCxcbiAgICAgIGBObyByb3V0ZXMgbWF0Y2hlZCBsb2NhdGlvbiBcIiR7bG9jYXRpb24ucGF0aG5hbWV9JHtsb2NhdGlvbi5zZWFyY2h9JHtsb2NhdGlvbi5oYXNofVwiIGBcbiAgICApO1xuICAgIHdhcm5pbmcoXG4gICAgICBtYXRjaGVzID09IG51bGwgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmVsZW1lbnQgIT09IHZvaWQgMCB8fCBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0ucm91dGUuQ29tcG9uZW50ICE9PSB2b2lkIDAgfHwgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmxhenkgIT09IHZvaWQgMCxcbiAgICAgIGBNYXRjaGVkIGxlYWYgcm91dGUgYXQgbG9jYXRpb24gXCIke2xvY2F0aW9uLnBhdGhuYW1lfSR7bG9jYXRpb24uc2VhcmNofSR7bG9jYXRpb24uaGFzaH1cIiBkb2VzIG5vdCBoYXZlIGFuIGVsZW1lbnQgb3IgQ29tcG9uZW50LiBUaGlzIG1lYW5zIGl0IHdpbGwgcmVuZGVyIGFuIDxPdXRsZXQgLz4gd2l0aCBhIG51bGwgdmFsdWUgYnkgZGVmYXVsdCByZXN1bHRpbmcgaW4gYW4gXCJlbXB0eVwiIHBhZ2UuYFxuICAgICk7XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IF9yZW5kZXJNYXRjaGVzKFxuICAgIG1hdGNoZXMgJiYgbWF0Y2hlcy5tYXAoXG4gICAgICAobWF0Y2gpID0+IE9iamVjdC5hc3NpZ24oe30sIG1hdGNoLCB7XG4gICAgICAgIHBhcmFtczogT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50UGFyYW1zLCBtYXRjaC5wYXJhbXMpLFxuICAgICAgICBwYXRobmFtZTogam9pblBhdGhzKFtcbiAgICAgICAgICBwYXJlbnRQYXRobmFtZUJhc2UsXG4gICAgICAgICAgLy8gUmUtZW5jb2RlIHBhdGhuYW1lcyB0aGF0IHdlcmUgZGVjb2RlZCBpbnNpZGUgbWF0Y2hSb3V0ZXMuXG4gICAgICAgICAgLy8gUHJlLWVuY29kZSBgP2AgYW5kIGAjYCBhaGVhZCBvZiBgZW5jb2RlTG9jYXRpb25gIGJlY2F1c2UgaXQgdXNlc1xuICAgICAgICAgIC8vIGBuZXcgVVJMKClgIGludGVybmFsbHkgYW5kIHdlIG5lZWQgdG8gcHJldmVudCBpdCBmcm9tIHRyZWF0aW5nXG4gICAgICAgICAgLy8gdGhlbSBhcyBzZXBhcmF0b3JzXG4gICAgICAgICAgbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uID8gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uKFxuICAgICAgICAgICAgbWF0Y2gucGF0aG5hbWUucmVwbGFjZSgvXFw/L2csIFwiJTNGXCIpLnJlcGxhY2UoLyMvZywgXCIlMjNcIilcbiAgICAgICAgICApLnBhdGhuYW1lIDogbWF0Y2gucGF0aG5hbWVcbiAgICAgICAgXSksXG4gICAgICAgIHBhdGhuYW1lQmFzZTogbWF0Y2gucGF0aG5hbWVCYXNlID09PSBcIi9cIiA/IHBhcmVudFBhdGhuYW1lQmFzZSA6IGpvaW5QYXRocyhbXG4gICAgICAgICAgcGFyZW50UGF0aG5hbWVCYXNlLFxuICAgICAgICAgIC8vIFJlLWVuY29kZSBwYXRobmFtZXMgdGhhdCB3ZXJlIGRlY29kZWQgaW5zaWRlIG1hdGNoUm91dGVzXG4gICAgICAgICAgLy8gUHJlLWVuY29kZSBgP2AgYW5kIGAjYCBhaGVhZCBvZiBgZW5jb2RlTG9jYXRpb25gIGJlY2F1c2UgaXQgdXNlc1xuICAgICAgICAgIC8vIGBuZXcgVVJMKClgIGludGVybmFsbHkgYW5kIHdlIG5lZWQgdG8gcHJldmVudCBpdCBmcm9tIHRyZWF0aW5nXG4gICAgICAgICAgLy8gdGhlbSBhcyBzZXBhcmF0b3JzXG4gICAgICAgICAgbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uID8gbmF2aWdhdG9yLmVuY29kZUxvY2F0aW9uKFxuICAgICAgICAgICAgbWF0Y2gucGF0aG5hbWVCYXNlLnJlcGxhY2UoL1xcPy9nLCBcIiUzRlwiKS5yZXBsYWNlKC8jL2csIFwiJTIzXCIpXG4gICAgICAgICAgKS5wYXRobmFtZSA6IG1hdGNoLnBhdGhuYW1lQmFzZVxuICAgICAgICBdKVxuICAgICAgfSlcbiAgICApLFxuICAgIHBhcmVudE1hdGNoZXMsXG4gICAgZGF0YVJvdXRlclN0YXRlLFxuICAgIHVuc3RhYmxlX29uRXJyb3IsXG4gICAgZnV0dXJlXG4gICk7XG4gIGlmIChsb2NhdGlvbkFyZyAmJiByZW5kZXJlZE1hdGNoZXMpIHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFxuICAgICAgTG9jYXRpb25Db250ZXh0LlByb3ZpZGVyLFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICBwYXRobmFtZTogXCIvXCIsXG4gICAgICAgICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICAgICAgICBoYXNoOiBcIlwiLFxuICAgICAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgICAgICBrZXk6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgLi4ubG9jYXRpb25cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hdmlnYXRpb25UeXBlOiBcIlBPUFwiIC8qIFBvcCAqL1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVuZGVyZWRNYXRjaGVzXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyZWRNYXRjaGVzO1xufVxuZnVuY3Rpb24gRGVmYXVsdEVycm9yQ29tcG9uZW50KCkge1xuICBsZXQgZXJyb3IgPSB1c2VSb3V0ZUVycm9yKCk7XG4gIGxldCBtZXNzYWdlID0gaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpID8gYCR7ZXJyb3Iuc3RhdHVzfSAke2Vycm9yLnN0YXR1c1RleHR9YCA6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICBsZXQgc3RhY2sgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBudWxsO1xuICBsZXQgbGlnaHRncmV5ID0gXCJyZ2JhKDIwMCwyMDAsMjAwLCAwLjUpXCI7XG4gIGxldCBwcmVTdHlsZXMgPSB7IHBhZGRpbmc6IFwiMC41cmVtXCIsIGJhY2tncm91bmRDb2xvcjogbGlnaHRncmV5IH07XG4gIGxldCBjb2RlU3R5bGVzID0geyBwYWRkaW5nOiBcIjJweCA0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBsaWdodGdyZXkgfTtcbiAgbGV0IGRldkluZm8gPSBudWxsO1xuICBpZiAoRU5BQkxFX0RFVl9XQVJOSU5HUykge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkVycm9yIGhhbmRsZWQgYnkgUmVhY3QgUm91dGVyIGRlZmF1bHQgRXJyb3JCb3VuZGFyeTpcIixcbiAgICAgIGVycm9yXG4gICAgKTtcbiAgICBkZXZJbmZvID0gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFJlYWN0Mi5GcmFnbWVudCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFwicFwiLCBudWxsLCBcIlxcdXsxRjRCRn0gSGV5IGRldmVsb3BlciBcXHV7MUY0NEJ9XCIpLCAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoXCJwXCIsIG51bGwsIFwiWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgd2hlbiB5b3VyIGFwcCB0aHJvd3MgZXJyb3JzIGJ5IHByb3ZpZGluZyB5b3VyIG93biBcIiwgLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7IHN0eWxlOiBjb2RlU3R5bGVzIH0sIFwiRXJyb3JCb3VuZGFyeVwiKSwgXCIgb3JcIiwgXCIgXCIsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcImNvZGVcIiwgeyBzdHlsZTogY29kZVN0eWxlcyB9LCBcImVycm9yRWxlbWVudFwiKSwgXCIg
25114cHJvcCBvbiB5b3VyIHJvdXRlLlwiKSk7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChSZWFjdDIuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcImgyXCIsIG51bGwsIFwiVW5leHBlY3RlZCBBcHBsaWNhdGlvbiBFcnJvciFcIiksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcImgzXCIsIHsgc3R5bGU6IHsgZm9udFN0eWxlOiBcIml0YWxpY1wiIH0gfSwgbWVzc2FnZSksIHN0YWNrID8gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFwicHJlXCIsIHsgc3R5bGU6IHByZVN0eWxlcyB9LCBzdGFjaykgOiBudWxsLCBkZXZJbmZvKTtcbn1cbnZhciBkZWZhdWx0RXJyb3JFbGVtZW50ID0gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KERlZmF1bHRFcnJvckNvbXBvbmVudCwgbnVsbCk7XG52YXIgUmVuZGVyRXJyb3JCb3VuZGFyeSA9IGNsYXNzIGV4dGVuZHMgUmVhY3QyLkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24sXG4gICAgICByZXZhbGlkYXRpb246IHByb3BzLnJldmFsaWRhdGlvbixcbiAgICAgIGVycm9yOiBwcm9wcy5lcnJvclxuICAgIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUubG9jYXRpb24gIT09IHByb3BzLmxvY2F0aW9uIHx8IHN0YXRlLnJldmFsaWRhdGlvbiAhPT0gXCJpZGxlXCIgJiYgcHJvcHMucmV2YWxpZGF0aW9uID09PSBcImlkbGVcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IHByb3BzLmVycm9yLFxuICAgICAgICBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24sXG4gICAgICAgIHJldmFsaWRhdGlvbjogcHJvcHMucmV2YWxpZGF0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHByb3BzLmVycm9yICE9PSB2b2lkIDAgPyBwcm9wcy5lcnJvciA6IHN0YXRlLmVycm9yLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgcmV2YWxpZGF0aW9uOiBwcm9wcy5yZXZhbGlkYXRpb24gfHwgc3RhdGUucmV2YWxpZGF0aW9uXG4gICAgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgZXJyb3JJbmZvKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudW5zdGFibGVfb25FcnJvcikge1xuICAgICAgdGhpcy5wcm9wcy51bnN0YWJsZV9vbkVycm9yKGVycm9yLCBlcnJvckluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlJlYWN0IFJvdXRlciBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyXCIsXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZXJyb3IgIT09IHZvaWQgMCA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChSb3V0ZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHRoaXMucHJvcHMucm91dGVDb250ZXh0IH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcbiAgICAgIFJvdXRlRXJyb3JDb250ZXh0LlByb3ZpZGVyLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZS5lcnJvcixcbiAgICAgICAgY2hpbGRyZW46IHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICB9XG4gICAgKSkgOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9XG59O1xuZnVuY3Rpb24gUmVuZGVyZWRSb3V0ZSh7IHJvdXRlQ29udGV4dCwgbWF0Y2gsIGNoaWxkcmVuIH0pIHtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QyLnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuICBpZiAoZGF0YVJvdXRlckNvbnRleHQgJiYgZGF0YVJvdXRlckNvbnRleHQuc3RhdGljICYmIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpY0NvbnRleHQgJiYgKG1hdGNoLnJvdXRlLmVycm9yRWxlbWVudCB8fCBtYXRjaC5yb3V0ZS5FcnJvckJvdW5kYXJ5KSkge1xuICAgIGRhdGFSb3V0ZXJDb250ZXh0LnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQgPSBtYXRjaC5yb3V0ZS5pZDtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0Mi5jcmVhdGVFbGVtZW50KFJvdXRlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogcm91dGVDb250ZXh0IH0sIGNoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMsIHBhcmVudE1hdGNoZXMgPSBbXSwgZGF0YVJvdXRlclN0YXRlID0gbnVsbCwgdW5zdGFibGVfb25FcnJvciA9IG51bGwsIGZ1dHVyZSA9IG51bGwpIHtcbiAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgIGlmICghZGF0YVJvdXRlclN0YXRlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGFSb3V0ZXJTdGF0ZS5lcnJvcnMpIHtcbiAgICAgIG1hdGNoZXMgPSBkYXRhUm91dGVyU3RhdGUubWF0Y2hlcztcbiAgICB9IGVsc2UgaWYgKHBhcmVudE1hdGNoZXMubGVuZ3RoID09PSAwICYmICFkYXRhUm91dGVyU3RhdGUuaW5pdGlhbGl6ZWQgJiYgZGF0YVJvdXRlclN0YXRlLm1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWF0Y2hlcyA9IGRhdGFSb3V0ZXJTdGF0ZS5tYXRjaGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgbGV0IHJlbmRlcmVkTWF0Y2hlcyA9IG1hdGNoZXM7XG4gIGxldCBlcnJvcnMgPSBkYXRhUm91dGVyU3RhdGU/LmVycm9ycztcbiAgaWYgKGVycm9ycyAhPSBudWxsKSB7XG4gICAgbGV0IGVycm9ySW5kZXggPSByZW5kZXJlZE1hdGNoZXMuZmluZEluZGV4KFxuICAgICAgKG0pID0+IG0ucm91dGUuaWQgJiYgZXJyb3JzPy5bbS5yb3V0ZS5pZF0gIT09IHZvaWQgMFxuICAgICk7XG4gICAgaW52YXJpYW50KFxuICAgICAgZXJyb3JJbmRleCA+PSAwLFxuICAgICAgYENvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgcm91dGUgZm9yIGVycm9ycyBvb
25114iByb3V0ZSBJRHM6ICR7T2JqZWN0LmtleXMoXG4gICAgICAgIGVycm9yc1xuICAgICAgKS5qb2luKFwiLFwiKX1gXG4gICAgKTtcbiAgICByZW5kZXJlZE1hdGNoZXMgPSByZW5kZXJlZE1hdGNoZXMuc2xpY2UoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4ocmVuZGVyZWRNYXRjaGVzLmxlbmd0aCwgZXJyb3JJbmRleCArIDEpXG4gICAgKTtcbiAgfVxuICBsZXQgcmVuZGVyRmFsbGJhY2sgPSBmYWxzZTtcbiAgbGV0IGZhbGxiYWNrSW5kZXggPSAtMTtcbiAgaWYgKGRhdGFSb3V0ZXJTdGF0ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRNYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbWF0Y2ggPSByZW5kZXJlZE1hdGNoZXNbaV07XG4gICAgICBpZiAobWF0Y2gucm91dGUuSHlkcmF0ZUZhbGxiYWNrIHx8IG1hdGNoLnJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQpIHtcbiAgICAgICAgZmFsbGJhY2tJbmRleCA9IGk7XG4gICAgICB9XG4gICAgICBpZiAobWF0Y2gucm91dGUuaWQpIHtcbiAgICAgICAgbGV0IHsgbG9hZGVyRGF0YSwgZXJyb3JzOiBlcnJvcnMyIH0gPSBkYXRhUm91dGVyU3RhdGU7XG4gICAgICAgIGxldCBuZWVkc1RvUnVuTG9hZGVyID0gbWF0Y2gucm91dGUubG9hZGVyICYmICFsb2FkZXJEYXRhLmhhc093blByb3BlcnR5KG1hdGNoLnJvdXRlLmlkKSAmJiAoIWVycm9yczIgfHwgZXJyb3JzMlttYXRjaC5yb3V0ZS5pZF0gPT09IHZvaWQgMCk7XG4gICAgICAgIGlmIChtYXRjaC5yb3V0ZS5sYXp5IHx8IG5lZWRzVG9SdW5Mb2FkZXIpIHtcbiAgICAgICAgICByZW5kZXJGYWxsYmFjayA9IHRydWU7XG4gICAgICAgICAgaWYgKGZhbGxiYWNrSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgcmVuZGVyZWRNYXRjaGVzID0gcmVuZGVyZWRNYXRjaGVzLnNsaWNlKDAsIGZhbGxiYWNrSW5kZXggKyAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyZWRNYXRjaGVzID0gW3JlbmRlcmVkTWF0Y2hlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZW5kZXJlZE1hdGNoZXMucmVkdWNlUmlnaHQoXG4gICAgKG91dGxldCwgbWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgZXJyb3I7XG4gICAgICBsZXQgc2hvdWxkUmVuZGVySHlkcmF0ZUZhbGxiYWNrID0gZmFsc2U7XG4gICAgICBsZXQgZXJyb3JFbGVtZW50ID0gbnVsbDtcbiAgICAgIGxldCBoeWRyYXRlRmFsbGJhY2tFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmIChkYXRhUm91dGVyU3RhdGUpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvcnMgJiYgbWF0Y2gucm91dGUuaWQgPyBlcnJvcnNbbWF0Y2gucm91dGUuaWRdIDogdm9pZCAwO1xuICAgICAgICBlcnJvckVsZW1lbnQgPSBtYXRjaC5yb3V0ZS5lcnJvckVsZW1lbnQgfHwgZGVmYXVsdEVycm9yRWxlbWVudDtcbiAgICAgICAgaWYgKHJlbmRlckZhbGxiYWNrKSB7XG4gICAgICAgICAgaWYgKGZhbGxiYWNrSW5kZXggPCAwICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB3YXJuaW5nT25jZShcbiAgICAgICAgICAgICAgXCJyb3V0ZS1mYWxsYmFja1wiLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgXCJObyBgSHlkcmF0ZUZhbGxiYWNrYCBlbGVtZW50IHByb3ZpZGVkIHRvIHJlbmRlciBkdXJpbmcgaW5pdGlhbCBoeWRyYXRpb25cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNob3VsZFJlbmRlckh5ZHJhdGVGYWxsYmFjayA9IHRydWU7XG4gICAgICAgICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZhbGxiYWNrSW5kZXggPT09IGluZGV4KSB7XG4gICAgICAgICAgICBzaG91bGRSZW5kZXJIeWRyYXRlRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudCA9IG1hdGNoLnJvdXRlLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQgfHwgbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaGVzMiA9IHBhcmVudE1hdGNoZXMuY29uY2F0KHJlbmRlcmVkTWF0Y2hlcy5zbGljZSgwLCBpbmRleCArIDEpKTtcbiAgICAgIGxldCBnZXRDaGlsZHJlbiA9ICgpID0+IHtcbiAgICAgICAgbGV0IGNoaWxkcmVuO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjaGlsZHJlbiA9IGVycm9yRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZW5kZXJIeWRyYXRlRmFsbGJhY2spIHtcbiAgICAgICAgICBjaGlsZHJlbiA9IGh5ZHJhdGVGYWxsYmFja0VsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2gucm91dGUuQ29tcG9uZW50KSB7XG4gICAgICAgICAgY2hpbGRyZW4gPSAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQobWF0Y2gucm91dGUuQ29tcG9uZW50LCBudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5yb3V0ZS5lbGVtZW50KSB7XG4gICAgICAgICAgY2hpbGRyZW4gPSBtYXRjaC5yb3V0ZS5lbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkcmVuID0gb3V0bGV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgUmVuZGVyZWRSb3V0ZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgIHJvdXRlQ29udGV4dDoge1xuICAgICAgICAgICAgICBvdXRsZXQsXG4gICAgICAgICAgICAgIG1hdGNoZXM6IG1hdGNoZXMyLFxuICAgICAgICAgICAgICBpc0RhdGFSb3V0ZTogZGF0YVJvdXRlclN0YXRlICE9IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlblxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZGF0YVJvdXRlclN0YXRlICYmIChtYXRjaC5yb3V0ZS5FcnJvckJvdW5kYXJ5IHx8IG1hdGNoLnJvdXRlLmVycm9yRWxlbWVudCB8fCBpbmRleCA9PT0gMCkgPyAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFJlbmRlckVycm9yQm91bmRhcnksXG4gICAgICAgI
25114HtcbiAgICAgICAgICBsb2NhdGlvbjogZGF0YVJvdXRlclN0YXRlLmxvY2F0aW9uLFxuICAgICAgICAgIHJldmFsaWRhdGlvbjogZGF0YVJvdXRlclN0YXRlLnJldmFsaWRhdGlvbixcbiAgICAgICAgICBjb21wb25lbnQ6IGVycm9yRWxlbWVudCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBjaGlsZHJlbjogZ2V0Q2hpbGRyZW4oKSxcbiAgICAgICAgICByb3V0ZUNvbnRleHQ6IHsgb3V0bGV0OiBudWxsLCBtYXRjaGVzOiBtYXRjaGVzMiwgaXNEYXRhUm91dGU6IHRydWUgfSxcbiAgICAgICAgICB1bnN0YWJsZV9vbkVycm9yXG4gICAgICAgIH1cbiAgICAgICkgOiBnZXRDaGlsZHJlbigpO1xuICAgIH0sXG4gICAgbnVsbFxuICApO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkge1xuICByZXR1cm4gYCR7aG9va05hbWV9IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBkYXRhIHJvdXRlci4gIFNlZSBodHRwczovL3JlYWN0cm91dGVyLmNvbS9lbi9tYWluL3JvdXRlcnMvcGlja2luZy1hLXJvdXRlci5gO1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlckNvbnRleHQoaG9va05hbWUpIHtcbiAgbGV0IGN0eCA9IFJlYWN0Mi51c2VDb250ZXh0KERhdGFSb3V0ZXJDb250ZXh0KTtcbiAgaW52YXJpYW50KGN0eCwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpO1xuICByZXR1cm4gY3R4O1xufVxuZnVuY3Rpb24gdXNlRGF0YVJvdXRlclN0YXRlKGhvb2tOYW1lKSB7XG4gIGxldCBzdGF0ZSA9IFJlYWN0Mi51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQoc3RhdGUsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IoaG9va05hbWUpKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gdXNlUm91dGVDb250ZXh0KGhvb2tOYW1lKSB7XG4gIGxldCByb3V0ZSA9IFJlYWN0Mi51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGludmFyaWFudChyb3V0ZSwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcihob29rTmFtZSkpO1xuICByZXR1cm4gcm91dGU7XG59XG5mdW5jdGlvbiB1c2VDdXJyZW50Um91dGVJZChob29rTmFtZSkge1xuICBsZXQgcm91dGUgPSB1c2VSb3V0ZUNvbnRleHQoaG9va05hbWUpO1xuICBsZXQgdGhpc1JvdXRlID0gcm91dGUubWF0Y2hlc1tyb3V0ZS5tYXRjaGVzLmxlbmd0aCAtIDFdO1xuICBpbnZhcmlhbnQoXG4gICAgdGhpc1JvdXRlLnJvdXRlLmlkLFxuICAgIGAke2hvb2tOYW1lfSBjYW4gb25seSBiZSB1c2VkIG9uIHJvdXRlcyB0aGF0IGNvbnRhaW4gYSB1bmlxdWUgXCJpZFwiYFxuICApO1xuICByZXR1cm4gdGhpc1JvdXRlLnJvdXRlLmlkO1xufVxuZnVuY3Rpb24gdXNlUm91dGVJZCgpIHtcbiAgcmV0dXJuIHVzZUN1cnJlbnRSb3V0ZUlkKFwidXNlUm91dGVJZFwiIC8qIFVzZVJvdXRlSWQgKi8pO1xufVxuZnVuY3Rpb24gdXNlTmF2aWdhdGlvbigpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKFwidXNlTmF2aWdhdGlvblwiIC8qIFVzZU5hdmlnYXRpb24gKi8pO1xuICByZXR1cm4gc3RhdGUubmF2aWdhdGlvbjtcbn1cbmZ1bmN0aW9uIHVzZVJldmFsaWRhdG9yKCkge1xuICBsZXQgZGF0YVJvdXRlckNvbnRleHQgPSB1c2VEYXRhUm91dGVyQ29udGV4dChcInVzZVJldmFsaWRhdG9yXCIgLyogVXNlUmV2YWxpZGF0b3IgKi8pO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoXCJ1c2VSZXZhbGlkYXRvclwiIC8qIFVzZVJldmFsaWRhdG9yICovKTtcbiAgbGV0IHJldmFsaWRhdGUgPSBSZWFjdDIudXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRhdGFSb3V0ZXJDb250ZXh0LnJvdXRlci5yZXZhbGlkYXRlKCk7XG4gIH0sIFtkYXRhUm91dGVyQ29udGV4dC5yb3V0ZXJdKTtcbiAgcmV0dXJuIFJlYWN0Mi51c2VNZW1vKFxuICAgICgpID0+ICh7IHJldmFsaWRhdGUsIHN0YXRlOiBzdGF0ZS5yZXZhbGlkYXRpb24gfSksXG4gICAgW3JldmFsaWRhdGUsIHN0YXRlLnJldmFsaWRhdGlvbl1cbiAgKTtcbn1cbmZ1bmN0aW9uIHVzZU1hdGNoZXMoKSB7XG4gIGxldCB7IG1hdGNoZXMsIGxvYWRlckRhdGEgfSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShcbiAgICBcInVzZU1hdGNoZXNcIiAvKiBVc2VNYXRjaGVzICovXG4gICk7XG4gIHJldHVybiBSZWFjdDIudXNlTWVtbyhcbiAgICAoKSA9PiBtYXRjaGVzLm1hcCgobSkgPT4gY29udmVydFJvdXRlTWF0Y2hUb1VpTWF0Y2gobSwgbG9hZGVyRGF0YSkpLFxuICAgIFttYXRjaGVzLCBsb2FkZXJEYXRhXVxuICApO1xufVxuZnVuY3Rpb24gdXNlTG9hZGVyRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKFwidXNlTG9hZGVyRGF0YVwiIC8qIFVzZUxvYWRlckRhdGEgKi8pO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKFwidXNlTG9hZGVyRGF0YVwiIC8qIFVzZUxvYWRlckRhdGEgKi8pO1xuICByZXR1cm4gc3RhdGUubG9hZGVyRGF0YVtyb3V0ZUlkXTtcbn1cbmZ1bmN0aW9uIHVzZVJvdXRlTG9hZGVyRGF0YShyb3V0ZUlkKSB7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShcInVzZVJvdXRlTG9hZGVyRGF0YVwiIC8qIFVzZVJvdXRlTG9hZGVyRGF0YSAqLyk7XG4gIHJldHVybiBzdGF0ZS5sb2FkZXJEYXRhW3JvdXRlSWRdO1xufVxuZnVuY3Rpb24gdXNlQWN0aW9uRGF0YSgpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlKFwidXNlQWN0aW9uRGF0YVwiIC8qIFVzZUFjdGlvbkRhdGEgKi8pO1xuICBsZXQgcm91dGVJZCA9IHVzZUN1cnJlbnRSb3V0ZUlkKFwidXNlTG9hZGVyRGF0YVwiIC8qIFVzZUxvYWRlckRhdGEgKi8pO1xuICByZXR1cm4gc3RhdGUuYWN0aW9uRGF0YSA/IHN0YXRlLmFjdGlvbkRhdGFbcm91dGVJZF0gOiB2b2lkIDA7XG59XG5mdW5jdGlvbiB1c2VSb3V0ZUVycm9yKCkge1xuICBsZXQgZXJyb3IgPSBSZWFjdDIudXNlQ29udGV4dChSb3V0ZUVycm9yQ29udGV4dCk7XG4gIGxldCBzdGF0ZSA9IHVzZURhdGFSb3V0ZXJTdGF0ZShcInVzZVJvdXRlRXJyb3JcIiAvKiBVc2VSb3V0ZUVycm9yICovKTtcbiAgbGV0IHJvdXRlSWQgPSB1c2VDdXJyZW50Um91dGVJZChcInVzZVJvdXRlRXJyb3JcIiAvKiBVc2VSb3V0ZUVycm9yICovKTtcbiAgaWYgKGVycm9yICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmVycm9ycz8uW3JvdXRlSWRdO1xufVxuZnVuY3Rpb24gdXNlQXN5bmNWYWx1ZSgpIHtcbiAgbGV0IHZhbHVlID0gUmVhY3QyLnVzZUNvbnRleHQoQXdhaXRDb250ZXh0KTtcbiAgcmV0dXJuIHZhbHVlPy5fZGF0YTtcbn1cbmZ1bmN0aW9uIHVzZUFzeW5jRXJyb3IoKSB7XG4gIGxldCB2YWx1ZSA9IFJlYWN0Mi51c2VDb250ZXh0KEF3YWl0Q29udGV4dCk7XG4gIHJldHVybi
25114B2YWx1ZT8uX2Vycm9yO1xufVxudmFyIGJsb2NrZXJJZCA9IDA7XG5mdW5jdGlvbiB1c2VCbG9ja2VyKHNob3VsZEJsb2NrKSB7XG4gIGxldCB7IHJvdXRlciwgYmFzZW5hbWUgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0KFwidXNlQmxvY2tlclwiIC8qIFVzZUJsb2NrZXIgKi8pO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUoXCJ1c2VCbG9ja2VyXCIgLyogVXNlQmxvY2tlciAqLyk7XG4gIGxldCBbYmxvY2tlcktleSwgc2V0QmxvY2tlcktleV0gPSBSZWFjdDIudXNlU3RhdGUoXCJcIik7XG4gIGxldCBibG9ja2VyRnVuY3Rpb24gPSBSZWFjdDIudXNlQ2FsbGJhY2soXG4gICAgKGFyZykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzaG91bGRCbG9jayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiAhIXNob3VsZEJsb2NrO1xuICAgICAgfVxuICAgICAgaWYgKGJhc2VuYW1lID09PSBcIi9cIikge1xuICAgICAgICByZXR1cm4gc2hvdWxkQmxvY2soYXJnKTtcbiAgICAgIH1cbiAgICAgIGxldCB7IGN1cnJlbnRMb2NhdGlvbiwgbmV4dExvY2F0aW9uLCBoaXN0b3J5QWN0aW9uIH0gPSBhcmc7XG4gICAgICByZXR1cm4gc2hvdWxkQmxvY2soe1xuICAgICAgICBjdXJyZW50TG9jYXRpb246IHtcbiAgICAgICAgICAuLi5jdXJyZW50TG9jYXRpb24sXG4gICAgICAgICAgcGF0aG5hbWU6IHN0cmlwQmFzZW5hbWUoY3VycmVudExvY2F0aW9uLnBhdGhuYW1lLCBiYXNlbmFtZSkgfHwgY3VycmVudExvY2F0aW9uLnBhdGhuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRMb2NhdGlvbjoge1xuICAgICAgICAgIC4uLm5leHRMb2NhdGlvbixcbiAgICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShuZXh0TG9jYXRpb24ucGF0aG5hbWUsIGJhc2VuYW1lKSB8fCBuZXh0TG9jYXRpb24ucGF0aG5hbWVcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeUFjdGlvblxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbYmFzZW5hbWUsIHNob3VsZEJsb2NrXVxuICApO1xuICBSZWFjdDIudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQga2V5ID0gU3RyaW5nKCsrYmxvY2tlcklkKTtcbiAgICBzZXRCbG9ja2VyS2V5KGtleSk7XG4gICAgcmV0dXJuICgpID0+IHJvdXRlci5kZWxldGVCbG9ja2VyKGtleSk7XG4gIH0sIFtyb3V0ZXJdKTtcbiAgUmVhY3QyLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGJsb2NrZXJLZXkgIT09IFwiXCIpIHtcbiAgICAgIHJvdXRlci5nZXRCbG9ja2VyKGJsb2NrZXJLZXksIGJsb2NrZXJGdW5jdGlvbik7XG4gICAgfVxuICB9LCBbcm91dGVyLCBibG9ja2VyS2V5LCBibG9ja2VyRnVuY3Rpb25dKTtcbiAgcmV0dXJuIGJsb2NrZXJLZXkgJiYgc3RhdGUuYmxvY2tlcnMuaGFzKGJsb2NrZXJLZXkpID8gc3RhdGUuYmxvY2tlcnMuZ2V0KGJsb2NrZXJLZXkpIDogSURMRV9CTE9DS0VSO1xufVxuZnVuY3Rpb24gdXNlTmF2aWdhdGVTdGFibGUoKSB7XG4gIGxldCB7IHJvdXRlciB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQoXCJ1c2VOYXZpZ2F0ZVwiIC8qIFVzZU5hdmlnYXRlU3RhYmxlICovKTtcbiAgbGV0IGlkID0gdXNlQ3VycmVudFJvdXRlSWQoXCJ1c2VOYXZpZ2F0ZVwiIC8qIFVzZU5hdmlnYXRlU3RhYmxlICovKTtcbiAgbGV0IGFjdGl2ZVJlZiA9IFJlYWN0Mi51c2VSZWYoZmFsc2UpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVSZWYuY3VycmVudCA9IHRydWU7XG4gIH0pO1xuICBsZXQgbmF2aWdhdGUgPSBSZWFjdDIudXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHRvLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgIHdhcm5pbmcoYWN0aXZlUmVmLmN1cnJlbnQsIG5hdmlnYXRlRWZmZWN0V2FybmluZyk7XG4gICAgICBpZiAoIWFjdGl2ZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBpZiAodHlwZW9mIHRvID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJvdXRlci5uYXZpZ2F0ZSh0byk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGUodG8sIHsgZnJvbVJvdXRlSWQ6IGlkLCAuLi5vcHRpb25zIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3JvdXRlciwgaWRdXG4gICk7XG4gIHJldHVybiBuYXZpZ2F0ZTtcbn1cbnZhciBhbHJlYWR5V2FybmVkID0ge307XG5mdW5jdGlvbiB3YXJuaW5nT25jZShrZXksIGNvbmQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kICYmICFhbHJlYWR5V2FybmVkW2tleV0pIHtcbiAgICBhbHJlYWR5V2FybmVkW2tleV0gPSB0cnVlO1xuICAgIHdhcm5pbmcoZmFsc2UsIG1lc3NhZ2UpO1xuICB9XG59XG5cbi8vIGxpYi9jb21wb25lbnRzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QzIGZyb20gXCJyZWFjdFwiO1xuXG4vLyBsaWIvc2VydmVyLXJ1bnRpbWUvd2FybmluZ3MudHNcbnZhciBhbHJlYWR5V2FybmVkMiA9IHt9O1xuZnVuY3Rpb24gd2Fybk9uY2UoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZGl0aW9uICYmICFhbHJlYWR5V2FybmVkMlttZXNzYWdlXSkge1xuICAgIGFscmVhZHlXYXJuZWQyW21lc3NhZ2VdID0gdHJ1ZTtcbiAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gIH1cbn1cblxuLy8gbGliL2NvbXBvbmVudHMudHN4XG5mdW5jdGlvbiBtYXBSb3V0ZVByb3BlcnRpZXMocm91dGUpIHtcbiAgbGV0IHVwZGF0ZXMgPSB7XG4gICAgLy8gTm90ZTogdGhpcyBjaGVjayBhbHNvIG9jY3VycyBpbiBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4gc28gdXBkYXRlXG4gICAgLy8gdGhlcmUgaWYgeW91IGNoYW5nZSB0aGlzIC0tIHBsZWFzZSBhbmQgdGhhbmsgeW91IVxuICAgIGhhc0Vycm9yQm91bmRhcnk6IHJvdXRlLmhhc0Vycm9yQm91bmRhcnkgfHwgcm91dGUuRXJyb3JCb3VuZGFyeSAhPSBudWxsIHx8IHJvdXRlLmVycm9yRWxlbWVudCAhPSBudWxsXG4gIH07XG4gIGlmIChyb3V0ZS5Db21wb25lbnQpIHtcbiAgICBpZiAoRU5BQkxFX0RFVl9XQVJOSU5HUykge1xuICAgICAgaWYgKHJvdXRlLmVsZW1lbnQpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBcIllvdSBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBgQ29tcG9uZW50YCBhbmQgYGVsZW1lbnRgIG9uIHlvdXIgcm91dGUgLSBgQ29tcG9uZW50YCB3aWxsIGJlIHVzZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlbGVtZW50OiBSZWFjdDMuY3JlYXRlRWxlbWVudChyb3V0ZS5Db21wb25lbnQpLFxuICAgICAgQ29tcG9uZW50OiB2b2lkIDBcbiAgICB9KTtcbiAgfVxuICBpZiAocm91dGUuSHlkcmF0ZUZhbGxiYWNrKSB7XG4gICAgaWYgKEVOQUJMRV9ERVZfV0FSTklOR1MpIHtcbiAgICAgIGlmIChyb3V0ZS5oeWRyYXRlRmFsbGJhY2tFbGVtZW50KSB7XG4gICAgICAgI
25114Hdhcm5pbmcoXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIG5vdCBpbmNsdWRlIGJvdGggYEh5ZHJhdGVGYWxsYmFja2AgYW5kIGBoeWRyYXRlRmFsbGJhY2tFbGVtZW50YCBvbiB5b3VyIHJvdXRlIC0gYEh5ZHJhdGVGYWxsYmFja2Agd2lsbCBiZSB1c2VkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odXBkYXRlcywge1xuICAgICAgaHlkcmF0ZUZhbGxiYWNrRWxlbWVudDogUmVhY3QzLmNyZWF0ZUVsZW1lbnQocm91dGUuSHlkcmF0ZUZhbGxiYWNrKSxcbiAgICAgIEh5ZHJhdGVGYWxsYmFjazogdm9pZCAwXG4gICAgfSk7XG4gIH1cbiAgaWYgKHJvdXRlLkVycm9yQm91bmRhcnkpIHtcbiAgICBpZiAoRU5BQkxFX0RFVl9XQVJOSU5HUykge1xuICAgICAgaWYgKHJvdXRlLmVycm9yRWxlbWVudCkge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwiWW91IHNob3VsZCBub3QgaW5jbHVkZSBib3RoIGBFcnJvckJvdW5kYXJ5YCBhbmQgYGVycm9yRWxlbWVudGAgb24geW91ciByb3V0ZSAtIGBFcnJvckJvdW5kYXJ5YCB3aWxsIGJlIHVzZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih1cGRhdGVzLCB7XG4gICAgICBlcnJvckVsZW1lbnQ6IFJlYWN0My5jcmVhdGVFbGVtZW50KHJvdXRlLkVycm9yQm91bmRhcnkpLFxuICAgICAgRXJyb3JCb3VuZGFyeTogdm9pZCAwXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZXM7XG59XG52YXIgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzID0gW1xuICBcIkh5ZHJhdGVGYWxsYmFja1wiLFxuICBcImh5ZHJhdGVGYWxsYmFja0VsZW1lbnRcIlxuXTtcbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHM/LmJhc2VuYW1lLFxuICAgIGdldENvbnRleHQ6IG9wdHM/LmdldENvbnRleHQsXG4gICAgZnV0dXJlOiBvcHRzPy5mdXR1cmUsXG4gICAgaGlzdG9yeTogY3JlYXRlTWVtb3J5SGlzdG9yeSh7XG4gICAgICBpbml0aWFsRW50cmllczogb3B0cz8uaW5pdGlhbEVudHJpZXMsXG4gICAgICBpbml0aWFsSW5kZXg6IG9wdHM/LmluaXRpYWxJbmRleFxuICAgIH0pLFxuICAgIGh5ZHJhdGlvbkRhdGE6IG9wdHM/Lmh5ZHJhdGlvbkRhdGEsXG4gICAgcm91dGVzLFxuICAgIGh5ZHJhdGlvblJvdXRlUHJvcGVydGllcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMsXG4gICAgZGF0YVN0cmF0ZWd5OiBvcHRzPy5kYXRhU3RyYXRlZ3ksXG4gICAgcGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb246IG9wdHM/LnBhdGNoUm91dGVzT25OYXZpZ2F0aW9uXG4gIH0pLmluaXRpYWxpemUoKTtcbn1cbnZhciBEZWZlcnJlZCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBcInBlbmRpbmdcIjtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gXCJyZXNvbHZlZFwiO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNoYWxsb3dEaWZmKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gIGxldCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoYVtrZXldICE9PSBiW2tleV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBVTlNUQUJMRV9UcmFuc2l0aW9uRW5hYmxlZFJvdXRlclByb3ZpZGVyKHtcbiAgcm91dGVyLFxuICBmbHVzaFN5bmM6IHJlYWN0RG9tRmx1c2hTeW5jSW1wbCxcbiAgdW5zdGFibGVfb25FcnJvclxufSkge1xuICBsZXQgZmV0Y2hlckRhdGEgPSBSZWFjdDMudXNlUmVmKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuICBsZXQgW3JldmFsaWRhdGluZywgc3RhcnRSZX
25114ZhbGlkYXRpb25dID0gUmVhY3QzLnVzZVRyYW5zaXRpb24oKTtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVdID0gUmVhY3QzLnVzZVN0YXRlKHJvdXRlci5zdGF0ZSk7XG4gIHJvdXRlci5fX3NldFBlbmRpbmdSZXJlbmRlciA9IChwcm9taXNlKSA9PiBzdGFydFJldmFsaWRhdGlvbihcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbmVlZCByZWFjdCAxOSB0eXBlcyBmb3IgdGhpcyB0byBiZSBhc3luY1xuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcmVuZGVyID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgIHN0YXJ0UmV2YWxpZGF0aW9uKCgpID0+IHtcbiAgICAgICAgcmVyZW5kZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcbiAgbGV0IG5hdmlnYXRvciA9IFJlYWN0My51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JlYXRlSHJlZjogcm91dGVyLmNyZWF0ZUhyZWYsXG4gICAgICBlbmNvZGVMb2NhdGlvbjogcm91dGVyLmVuY29kZUxvY2F0aW9uLFxuICAgICAgZ286IChuKSA9PiByb3V0ZXIubmF2aWdhdGUobiksXG4gICAgICBwdXNoOiAodG8sIHN0YXRlMiwgb3B0cykgPT4gcm91dGVyLm5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHN0YXRlOiBzdGF0ZTIsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cz8ucHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KSxcbiAgICAgIHJlcGxhY2U6ICh0bywgc3RhdGUyLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgc3RhdGU6IHN0YXRlMixcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzPy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW3JvdXRlcl0pO1xuICBsZXQgYmFzZW5hbWUgPSByb3V0ZXIuYmFzZW5hbWUgfHwgXCIvXCI7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICByb3V0ZXIsXG4gICAgICBuYXZpZ2F0b3IsXG4gICAgICBzdGF0aWM6IGZhbHNlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICB1bnN0YWJsZV9vbkVycm9yXG4gICAgfSksXG4gICAgW3JvdXRlciwgbmF2aWdhdG9yLCBiYXNlbmFtZSwgdW5zdGFibGVfb25FcnJvcl1cbiAgKTtcbiAgUmVhY3QzLnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuIHJvdXRlci5zdWJzY3JpYmUoXG4gICAgICAobmV3U3RhdGUsIHsgZGVsZXRlZEZldGNoZXJzLCBmbHVzaFN5bmMsIHZpZXdUcmFuc2l0aW9uT3B0cyB9KSA9PiB7XG4gICAgICAgIG5ld1N0YXRlLmZldGNoZXJzLmZvckVhY2goKGZldGNoZXIsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChmZXRjaGVyLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZmV0Y2hlckRhdGEuY3VycmVudC5zZXQoa2V5LCBmZXRjaGVyLmRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZWRGZXRjaGVycy5mb3JFYWNoKChrZXkpID0+IGZldGNoZXJEYXRhLmN1cnJlbnQuZGVsZXRlKGtleSkpO1xuICAgICAgICBjb25zdCBkaWZmID0gc2hhbGxvd0RpZmYoc3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgICAgaWYgKCFkaWZmKSByZXR1cm47XG4gICAgICAgIGlmIChmbHVzaFN5bmMpIHtcbiAgICAgICAgICBpZiAocmVhY3REb21GbHVzaFN5bmNJbXBsKSB7XG4gICAgICAgICAgICByZWFjdERvbUZsdXNoU3luY0ltcGwoKCkgPT4gc2V0U3RhdGUobmV3U3RhdGUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBSZWFjdDMuc3RhcnRUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0sIFtyb3V0ZXIsIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCwgc3RhdGVdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChSZWFjdDMuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChEYXRhUm91dGVyQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGF0YVJvdXRlckNvbnRleHQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgIERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuUHJvdmlkZXIsXG4gICAge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHJldmFsaWRhdGlvbjogcmV2YWxpZGF0aW5nID8gXCJsb2FkaW5nXCIgOiBzdGF0ZS5yZXZhbGlkYXRpb25cbiAgICAgIH1cbiAgICB9LFxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChGZXRjaGVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGZldGNoZXJEYXRhLmN1cnJlbnQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgICAgUm91dGVyLFxuICAgICAge1xuICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICAgICAgbmF2aWdhdG9yXG4gICAgICB9LFxuICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgICAgICBNZW1vaXplZERhdGFSb3V0ZXMsXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZXM6IHJvdXRlci5yb3V0ZXMsXG4gICAgICAgICAgZnV0dXJlOiByb3V0ZXIuZnV0dXJlLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHVuc3RhYmxlX29uRXJyb3JcbiAgICAgICAgfVxuICAgICAgKVxuICAgICkpXG4gICkpLCBudWxsKTtcbn1cbmZ1bmN0aW9uIFJvdXRlclByb3ZpZGVyKHtcbiAgcm91dGVyLFxuICBmbHVzaFN5bmM6IHJlYWN0RG9tRmx1c2hTeW5jSW1wbCxcbiAgdW5zdGFibGVfb25FcnJvclxufSkge1xuICBsZXQgW3N0YXRlLCBzZXRTdGF0ZUltcGxdID0gUmVhY3QzLnVzZVN0YXRlKHJvdXRlci5zdGF0ZSk7XG4gIGxldCBbcGVuZGluZ1N0YXRlLCBzZXRQZW5kaW5nU3RhdGVdID0gUmVhY3QzLnVzZVN0YXRlKCk7XG4gIGxldCBbdnRDb250ZXh0LCBzZXRWdENvbnRleHRdID0gUmVhY3QzLnVzZVN0YXRlKHtcbiAgICBpc1RyYW5zaXRpb25pbmc6IGZhbHNlXG4gI
25114H0pO1xuICBsZXQgW3JlbmRlckRmZCwgc2V0UmVuZGVyRGZkXSA9IFJlYWN0My51c2VTdGF0ZSgpO1xuICBsZXQgW3RyYW5zaXRpb24sIHNldFRyYW5zaXRpb25dID0gUmVhY3QzLnVzZVN0YXRlKCk7XG4gIGxldCBbaW50ZXJydXB0aW9uLCBzZXRJbnRlcnJ1cHRpb25dID0gUmVhY3QzLnVzZVN0YXRlKCk7XG4gIGxldCBmZXRjaGVyRGF0YSA9IFJlYWN0My51c2VSZWYoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gIGxldCBsb2dFcnJvcnNBbmRTZXRTdGF0ZSA9IFJlYWN0My51c2VDYWxsYmFjayhcbiAgICAobmV3U3RhdGUpID0+IHtcbiAgICAgIHNldFN0YXRlSW1wbCgocHJldlN0YXRlKSA9PiB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5lcnJvcnMgJiYgdW5zdGFibGVfb25FcnJvcikge1xuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG5ld1N0YXRlLmVycm9ycykuZm9yRWFjaCgoW3JvdXRlSWQsIGVycm9yXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZXZTdGF0ZS5lcnJvcnM/Lltyb3V0ZUlkXSAhPT0gZXJyb3IpIHtcbiAgICAgICAgICAgICAgdW5zdGFibGVfb25FcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdW5zdGFibGVfb25FcnJvcl1cbiAgKTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QzLnVzZUNhbGxiYWNrKFxuICAgIChuZXdTdGF0ZSwgeyBkZWxldGVkRmV0Y2hlcnMsIGZsdXNoU3luYywgdmlld1RyYW5zaXRpb25PcHRzIH0pID0+IHtcbiAgICAgIG5ld1N0YXRlLmZldGNoZXJzLmZvckVhY2goKGZldGNoZXIsIGtleSkgPT4ge1xuICAgICAgICBpZiAoZmV0Y2hlci5kYXRhICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBmZXRjaGVyRGF0YS5jdXJyZW50LnNldChrZXksIGZldGNoZXIuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGVsZXRlZEZldGNoZXJzLmZvckVhY2goKGtleSkgPT4gZmV0Y2hlckRhdGEuY3VycmVudC5kZWxldGUoa2V5KSk7XG4gICAgICB3YXJuT25jZShcbiAgICAgICAgZmx1c2hTeW5jID09PSBmYWxzZSB8fCByZWFjdERvbUZsdXNoU3luY0ltcGwgIT0gbnVsbCxcbiAgICAgICAgJ1lvdSBwcm92aWRlZCB0aGUgYGZsdXNoU3luY2Agb3B0aW9uIHRvIGEgcm91dGVyIHVwZGF0ZSwgYnV0IHlvdSBhcmUgbm90IHVzaW5nIHRoZSBgPFJvdXRlclByb3ZpZGVyPmAgZnJvbSBgcmVhY3Qtcm91dGVyL2RvbWAgc28gYFJlYWN0RE9NLmZsdXNoU3luYygpYCBpcyB1bmF2YWlsYWJsZS4gIFBsZWFzZSB1cGRhdGUgeW91ciBhcHAgdG8gYGltcG9ydCB7IFJvdXRlclByb3ZpZGVyIH0gZnJvbSBcInJlYW
25114N0LXJvdXRlci9kb21cImAgYW5kIGVuc3VyZSB5b3UgaGF2ZSBgcmVhY3QtZG9tYCBpbnN0YWxsZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHVzZSB0aGUgYGZsdXNoU3luY2Agb3B0aW9uLidcbiAgICAgICk7XG4gICAgICBsZXQgaXNWaWV3VHJhbnNpdGlvbkF2YWlsYWJsZSA9IHJvdXRlci53aW5kb3cgIT0gbnVsbCAmJiByb3V0ZXIud2luZG93LmRvY3VtZW50ICE9IG51bGwgJiYgdHlwZW9mIHJvdXRlci53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgd2Fybk9uY2UoXG4gICAgICAgIHZpZXdUcmFuc2l0aW9uT3B0cyA9PSBudWxsIHx8IGlzVmlld1RyYW5zaXRpb25BdmFpbGFibGUsXG4gICAgICAgIFwiWW91IHByb3ZpZGVkIHRoZSBgdmlld1RyYW5zaXRpb25gIG9wdGlvbiB0byBhIHJvdXRlciB1cGRhdGUsIGJ1dCB5b3UgZG8gbm90IGFwcGVhciB0byBiZSBydW5uaW5nIGluIGEgRE9NIGVudmlyb25tZW50IGFzIGB3aW5kb3cuc3RhcnRWaWV3VHJhbnNpdGlvbmAgaXMgbm90IGF2YWlsYWJsZS5cIlxuICAgICAgKTtcbiAgICAgIGlmICghdmlld1RyYW5zaXRpb25PcHRzIHx8ICFpc1ZpZXdUcmFuc2l0aW9uQXZhaWxhYmxlKSB7XG4gICAgICAgIGlmIChyZWFjdERvbUZsdXNoU3luY0ltcGwgJiYgZmx1c2hTeW5jKSB7XG4gICAgICAgICAgcmVhY3REb21GbHVzaFN5bmNJbXBsKCgpID0+IGxvZ0Vycm9yc0FuZFNldFN0YXRlKG5ld1N0YXRlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgUmVhY3QzLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBsb2dFcnJvcnNBbmRTZXRTdGF0ZShuZXdTdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFjdERvbUZsdXNoU3luY0ltcGwgJiYgZmx1c2hTeW5jKSB7XG4gICAgICAgIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHJlbmRlckRmZCAmJiByZW5kZXJEZmQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgdHJhbnNpdGlvbi5za2lwVHJhbnNpdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRWdENvbnRleHQoe1xuICAgICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICAgICAgZmx1c2hTeW5jOiB0cnVlLFxuICAgICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgICAgbmV4dExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMubmV4dExvY2F0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdCA9IHJvdXRlci53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgICAgcmVhY3REb21GbHVzaFN5bmNJbXBsKCgpID0+IGxvZ0Vycm9yc0FuZFNldFN0YXRlKG5ld1N0YXRlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0LmZpbmlzaGVkLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCgoKSA9PiB7XG4gICAgICAgICAgICBzZXRSZW5kZXJEZmQodm9pZCAwKTtcbiAgICAgICAgICAgIHNldFRyYW5zaXRpb24odm9pZCAwKTtcbiAgICAgICAgICAgIHNldFBlbmRpbmdTdGF0ZSh2b2lkIDApO1xuICAgICAgICAgICAgc2V0VnRDb250ZXh0KHsgaXNUcmFuc2l0aW9uaW5nOiBmYWxzZSB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWN0RG9tRmx1c2hTeW5jSW1wbCgoKSA9PiBzZXRUcmFuc2l0aW9uKHQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgcmVuZGVyRGZkICYmIHJlbmRlckRmZC5yZXNvbHZlKCk7XG4gICAgICAgIHRyYW5zaXRpb24uc2tpcFRyYW5zaXRpb24oKTtcbiAgICAgICAgc2V0SW50ZXJydXB0aW9uKHtcbiAgICAgICAgICBzdGF0ZTogbmV3U3RhdGUsXG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLm5leHRMb2NhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFBlbmRpbmdTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgIHNldFZ0Q29udGV4dCh7XG4gICAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICAgIGZsdXNoU3luYzogZmFsc2UsXG4gICAgICAgICAgY3VycmVudExvY2F0aW9uOiB2aWV3VHJhbnNpdGlvbk9wdHMuY3VycmVudExvY2F0aW9uLFxuICAgICAgICAgIG5leHRMb2NhdGlvbjogdmlld1RyYW5zaXRpb25PcHRzLm5leHRMb2NhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHJvdXRlci53aW5kb3csXG4gICAgICByZWFjdERvbUZsdXNoU3luY0ltcGwsXG4gICAgICB0cmFuc2l0aW9uLFxuICAgICAgcmVuZGVyRGZkLFxuICAgICAgbG9nRXJyb3JzQW5kU2V0U3RhdGVcbiAgICBdXG4gICk7XG4gIFJlYWN0My51c2VMYXlvdXRFZmZlY3QoKCkgPT4gcm91dGVyLnN1YnNjcmliZShzZXRTdGF0ZSksIFtyb3V0ZXIsIHNldFN0YXRlXSk7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nICYmICF2dENvbnRleHQuZmx1c2hTeW5jKSB7XG4gICAgICBzZXRSZW5kZXJEZmQobmV3IERlZmVycmVkKCkpO1xuICAgIH1cbiAgfSwgW3Z0Q29udGV4dF0pO1xuICBSZWFjdDMudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocmVuZGVyRGZkICYmIHBlbmRpbmdTdGF0ZSAmJiByb3V0ZXIud2luZG93KSB7XG4gICAgICBsZXQgbmV3U3RhdGUgPSBwZW5kaW5nU3RhdGU7XG4gICAgICBsZXQgcmVuZGVyUHJvbWlzZSA9IHJlbmRlckRmZC5wcm9taXNlO1xuICAgICAgbGV0IHRyYW5zaXRpb24yID0gcm91dGVyLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgUmVhY3QzLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBsb2dFcnJvcnNBbmRTZXRTdGF0ZShuZXdTdGF0ZSkpO1xuICAgICAgICBhd2FpdCByZW5kZXJQcm9taXNlO1xuICAgICAgfSk7XG4gICAgICB0cmFuc2l0aW9uMi5maW5pc2hlZC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgc2V0UmVuZGVyRGZkKHZvaWQgMCk7XG4gICAgICAgI
25114HNldFRyYW5zaXRpb24odm9pZCAwKTtcbiAgICAgICAgc2V0UGVuZGluZ1N0YXRlKHZvaWQgMCk7XG4gICAgICAgIHNldFZ0Q29udGV4dCh7IGlzVHJhbnNpdGlvbmluZzogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICAgIHNldFRyYW5zaXRpb24odHJhbnNpdGlvbjIpO1xuICAgIH1cbiAgfSwgW3BlbmRpbmdTdGF0ZSwgcmVuZGVyRGZkLCByb3V0ZXIud2luZG93LCBsb2dFcnJvcnNBbmRTZXRTdGF0ZV0pO1xuICBSZWFjdDMudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocmVuZGVyRGZkICYmIHBlbmRpbmdTdGF0ZSAmJiBzdGF0ZS5sb2NhdGlvbi5rZXkgPT09IHBlbmRpbmdTdGF0ZS5sb2NhdGlvbi5rZXkpIHtcbiAgICAgIHJlbmRlckRmZC5yZXNvbHZlKCk7XG4gICAgfVxuICB9LCBbcmVuZGVyRGZkLCB0cmFuc2l0aW9uLCBzdGF0ZS5sb2NhdGlvbiwgcGVuZGluZ1N0YXRlXSk7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdnRDb250ZXh0LmlzVHJhbnNpdGlvbmluZyAmJiBpbnRlcnJ1cHRpb24pIHtcbiAgICAgIHNldFBlbmRpbmdTdGF0ZShpbnRlcnJ1cHRpb24uc3RhdGUpO1xuICAgICAgc2V0VnRDb250ZXh0KHtcbiAgICAgICAgaXNUcmFuc2l0aW9uaW5nOiB0cnVlLFxuICAgICAgICBmbHVzaFN5bmM6IGZhbHNlLFxuICAgICAgICBjdXJyZW50TG9jYXRpb246IGludGVycnVwdGlvbi5jdXJyZW50TG9jYXRpb24sXG4gICAgICAgIG5leHRMb2NhdGlvbjogaW50ZXJydXB0aW9uLm5leHRMb2NhdGlvblxuICAgICAgfSk7XG4gICAgICBzZXRJbnRlcnJ1cHRpb24odm9pZCAwKTtcbiAgICB9XG4gIH0sIFt2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nLCBpbnRlcnJ1cHRpb25dKTtcbiAgbGV0IG5hdmlnYXRvciA9IFJlYWN0My51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JlYXRlSHJlZjogcm91dGVyLmNyZWF0ZUhyZWYsXG4gICAgICBlbmNvZGVMb2NhdGlvbjogcm91dGVyLmVuY29kZUxvY2F0aW9uLFxuICAgICAgZ286IChuKSA9PiByb3V0ZXIubmF2aWdhdGUobiksXG4gICAgICBwdXNoOiAodG8sIHN0YXRlMiwgb3B0cykgPT4gcm91dGVyLm5hdmlnYXRlKHRvLCB7XG4gICAgICAgIHN0YXRlOiBzdGF0ZTIsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0cz8ucHJldmVudFNjcm9sbFJlc2V0XG4gICAgICB9KSxcbiAgICAgIHJlcGxhY2U6ICh0bywgc3RhdGUyLCBvcHRzKSA9PiByb3V0ZXIubmF2aWdhdGUodG8sIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgc3RhdGU6IHN0YXRlMixcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBvcHRzPy5wcmV2ZW50U2Nyb2xsUmVzZXRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW3JvdXRlcl0pO1xuICBsZXQgYmFzZW5hbWUgPSByb3V0ZXIuYmFzZW5hbWUgfHwgXCIvXCI7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICByb3V0ZXIsXG4gICAgICBuYXZpZ2F0b3IsXG4gICAgICBzdGF0aWM6IGZhbHNlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICB1bnN0YWJsZV9vbkVycm9yXG4gICAgfSksXG4gICAgW3JvdXRlciwgbmF2aWdhdG9yLCBiYXNlbmFtZSwgdW5zdGFibGVfb25FcnJvcl1cbiAgKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChSZWFjdDMuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChEYXRhUm91dGVyQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGF0YVJvdXRlckNvbnRleHQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHN0YXRlIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChGZXRjaGVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGZldGNoZXJEYXRhLmN1cnJlbnQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFZpZXdUcmFuc2l0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogdnRDb250ZXh0IH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24sXG4gICAgICBuYXZpZ2F0aW9uVHlwZTogc3RhdGUuaGlzdG9yeUFjdGlvbixcbiAgICAgIG5hdmlnYXRvclxuICAgIH0sXG4gICAgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgICAgTWVtb2l6ZWREYXRhUm91dGVzLFxuICAgICAge1xuICAgICAgICByb3V0ZXM6IHJvdXRlci5yb3V0ZXMsXG4gICAgICAgIGZ1dHVyZTogcm91dGVyLmZ1dHVyZSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHVuc3RhYmxlX29uRXJyb3JcbiAgICAgIH1cbiAgICApXG4gICkpKSkpLCBudWxsKTtcbn1cbnZhciBNZW1vaXplZERhdGFSb3V0ZXMgPSBSZWFjdDMubWVtbyhEYXRhUm91dGVzKTtcbmZ1bmN0aW9uIERhdGFSb3V0ZXMoe1xuICByb3V0ZXMsXG4gIGZ1dHVyZSxcbiAgc3RhdGUsXG4gIHVuc3RhYmxlX29uRXJyb3Jcbn0pIHtcbiAgcmV0dXJuIHVzZVJvdXRlc0ltcGwocm91dGVzLCB2b2lkIDAsIHN0YXRlLCB1bnN0YWJsZV9vbkVycm9yLCBmdXR1cmUpO1xufVxuZnVuY3Rpb24gTWVtb3J5Um91dGVyKHtcbiAgYmFzZW5hbWUsXG4gIGNoaWxkcmVuLFxuICBpbml0aWFsRW50cmllcyxcbiAgaW5pdGlhbEluZGV4XG59KSB7XG4gIGxldCBoaXN0b3J5UmVmID0gUmVhY3QzLnVzZVJlZigpO1xuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09IG51bGwpIHtcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVNZW1vcnlIaXN0b3J5KHtcbiAgICAgIGluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEluZGV4LFxuICAgICAgdjVDb21wYXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0My51c2VTdGF0ZSh7XG4gICAgYWN0aW9uOiBoaXN0b3J5LmFjdGlvbixcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvblxuICB9KTtcbiAgbGV0IHNldFN0YXRlID0gUmVhY3QzLnVzZUNhbGxiYWNrKFxuICAgIChuZXdTdGF0ZSkgPT4ge1xuICAgICAgUmVhY3QzLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9LFxuICAgIFtzZXRTdGF0ZUltcGxdXG4gICk7XG4gIFJlYWN0My51c2VMYXlvdXRFZmZlY3QoKCkgPT4gaGlzdG9yeS5saXN0ZW4oc2V0U3RhdGUpLCBbaGlzdG9yeSwgc2V0U3RhdGVdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBOYXZpZ2F0ZSh7XG4gIHRvLFxuICByZXBsYWNlOiByZXBsYWNlMixcbiAgc3RhdGUsXG4gIHJlbGF0aXZlXG59KSB7XG4gIGludmFyaWFudChcbiAgICB1c2VJblJvdXRlckNvbnRleHQoKSxcbiAgICAvLyBUT0RPOiBUaGlzIGVycm9yIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhleSBzb21laG93IGhhdmUgMiB2ZXJzaW9ucyBvZlxuICAgIC8vIHRoZSByb3V0ZXIgbG9hZGVkLiBXZSBjYW4gaGVscCB0aGVtIHVuZGVyc3RhbmQgaG93IHRvIGF2b2lkIHRoYXQuXG4gICAgYDxOYXZpZ2F0ZT4gbWF5IGJlIHVzZWQgb25seSBpbiB0aGUgY29udGV4dCBvZiBhIDxSb3V0ZXI+IGNvbXBvbmVudC5gXG4gICk7XG4gIGxldCB7IHN0YXRpYzogaXNTdGF0aWMgfSA9IFJlYWN0My51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgd2FybmluZyhcbiAgICAhaXNTdGF0aWMsXG4gICAgYDxOYXZpZ2F0ZT4gbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgaW4gYSA8U3RhdGljUm91dGVyPi4gVGhpcyBpcyBh
25114IG5vLW9wLCBidXQgeW91IHNob3VsZCBtb2RpZnkgeW91ciBjb2RlIHNvIHRoZSA8TmF2aWdhdGU+IGlzIG9ubHkgZXZlciByZW5kZXJlZCBpbiByZXNwb25zZSB0byBzb21lIHVzZXIgaW50ZXJhY3Rpb24gb3Igc3RhdGUgY2hhbmdlLmBcbiAgKTtcbiAgbGV0IHsgbWF0Y2hlcyB9ID0gUmVhY3QzLnVzZUNvbnRleHQoUm91dGVDb250ZXh0KTtcbiAgbGV0IHsgcGF0aG5hbWU6IGxvY2F0aW9uUGF0aG5hbWUgfSA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XG4gIGxldCBwYXRoID0gcmVzb2x2ZVRvKFxuICAgIHRvLFxuICAgIGdldFJlc29sdmVUb01hdGNoZXMobWF0Y2hlcyksXG4gICAgbG9jYXRpb25QYXRobmFtZSxcbiAgICByZWxhdGl2ZSA9PT0gXCJwYXRoXCJcbiAgKTtcbiAgbGV0IGpzb25QYXRoID0gSlNPTi5zdHJpbmdpZnkocGF0aCk7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIG5hdmlnYXRlKEpTT04ucGFyc2UoanNvblBhdGgpLCB7IHJlcGxhY2U6IHJlcGxhY2UyLCBzdGF0ZSwgcmVsYXRpdmUgfSk7XG4gIH0sIFtuYXZpZ2F0ZSwganNvblBhdGgsIHJlbGF0aXZlLCByZXBsYWNlMiwgc3RhdGVdKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBPdXRsZXQocHJvcHMpIHtcbiAgcmV0dXJuIHVzZU91dGxldChwcm9wcy5jb250ZXh0KTtcbn1cbmZ1bmN0aW9uIFJvdXRlKHByb3BzKSB7XG4gIGludmFyaWFudChcbiAgICBmYWxzZSxcbiAgICBgQSA8Um91dGU+IGlzIG9ubHkgZXZlciB0byBiZSB1c2VkIGFzIHRoZSBjaGlsZCBvZiA8Um91dGVzPiBlbGVtZW50LCBuZXZlciByZW5kZXJlZCBkaXJlY3RseS4gUGxlYXNlIHdyYXAgeW91ciA8Um91dGU+IGluIGEgPFJvdXRlcz4uYFxuICApO1xufVxuZnVuY3Rpb24gUm91dGVyKHtcbiAgYmFzZW5hbWU6IGJhc2VuYW1lUHJvcCA9IFwiL1wiLFxuICBjaGlsZHJlbiA9IG51bGwsXG4gIGxvY2F0aW9uOiBsb2NhdGlvblByb3AsXG4gIG5hdmlnYXRpb25UeXBlID0gXCJQT1BcIiAvKiBQb3AgKi8sXG4gIG5hdmlnYXRvcixcbiAgc3RhdGljOiBzdGF0aWNQcm9wID0gZmFsc2Vcbn0pIHtcbiAgaW52YXJpYW50KFxuICAgICF1c2VJblJvdXRlckNvbnRleHQoKSxcbiAgICBgWW91IGNhbm5vdCByZW5kZXIgYSA8Um91dGVyPiBpbnNpZGUgYW5vdGhlciA8Um91dGVyPi4gWW91IHNob3VsZCBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgaW4geW91ciBhcHAuYFxuICApO1xuICBsZXQgYmFzZW5hbWUgPSBiYXNlbmFtZVByb3AucmVwbGFjZSgvXlxcLyovLCBcIi9cIik7XG4gIGxldCBuYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIG5hdmlnYXRvcixcbiAgICAgIHN0YXRpYzogc3RhdGljUHJvcCxcbiAgICAgIGZ1dHVyZToge31cbiAgICB9KSxcbiAgICBbYmFzZW5hbWUsIG5hdmlnYXRvciwgc3RhdGljUHJvcF1cbiAgKTtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvblByb3AgPT09IFwic3RyaW5nXCIpIHtcbiAgICBsb2NhdGlvblByb3AgPSBwYXJzZVBhdGgobG9jYXRpb25Qcm9wKTtcbiAgfVxuICBsZXQge1xuICAgIHBhdGhuYW1lID0gXCIvXCIsXG4gICAgc2VhcmNoID0gXCJcIixcbiAgICBoYXNoID0gXCJcIixcbiAgICBzdGF0ZSA9IG51bGwsXG4gICAga2V5ID0gXCJkZWZhdWx0XCJcbiAgfSA9IGxvY2F0aW9uUHJvcDtcbiAgbGV0IGxvY2F0aW9uQ29udGV4dCA9IFJlYWN0My51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgdHJhaWxpbmdQYXRobmFtZSA9IHN0cmlwQmFzZW5hbWUocGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICBpZiAodHJhaWxpbmdQYXRobmFtZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHBhdGhuYW1lOiB0cmFpbGluZ1BhdGhuYW1lLFxuICAgICAgICBzZWFyY2gsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBrZXlcbiAgICAgIH0sXG4gICAgICBuYXZpZ2F0aW9uVHlwZVxuICAgIH07XG4gIH0sIFtiYXNlbmFtZSwgcGF0aG5hbWUsIHNlYXJjaCwgaGFzaCwgc3RhdGUsIGtleSwgbmF2aWdhdGlvblR5cGVdKTtcbiAgd2FybmluZyhcbiAgICBsb2NhdGlvbkNvbnRleHQgIT0gbnVsbCxcbiAgICBgPFJvdXRlciBiYXNlbmFtZT1cIiR7YmFzZW5hbWV9XCI+IGlzIG5vdCBhYmxlIHRvIG1hdGNoIHRoZSBVUkwgXCIke3BhdGhuYW1lfSR7c2VhcmNofSR7aGFzaH1cIiBiZWNhdXNlIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGJhc2VuYW1lLCBzbyB0aGUgPFJvdXRlcj4gd29uJ3QgcmVuZGVyIGFueXRoaW5nLmBcbiAgKTtcbiAgaWYgKGxvY2F0aW9uQ29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogbmF2aWdhdGlvbkNvbnRleHQgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KExvY2F0aW9uQ29udGV4dC5Qcm92aWRlciwgeyBjaGlsZHJlbiwgdmFsdWU6IGxvY2F0aW9uQ29udGV4dCB9KSk7XG59XG5mdW5jdGlvbiBSb3V0ZXMoe1xuICBjaGlsZHJlbixcbiAgbG9jYXRpb25cbn0pIHtcbiAgcmV0dXJuIHVzZVJvdXRlcyhjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4pLCBsb2NhdGlvbik7XG59XG5mdW5jdGlvbiBBd2FpdCh7XG4gIGNoaWxkcmVuLFxuICBlcnJvckVsZW1lbnQsXG4gIHJlc29sdmVcbn0pIHtcbiAgbGV0IGRhdGFSb3V0ZXJDb250ZXh0ID0gUmVhY3QzLnVzZUNvbnRleHQoRGF0YVJvdXRlckNvbnRleHQpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFxuICAgIEF3YWl0RXJyb3JCb3VuZGFyeSxcbiAgICB7XG4gICAgICByZXNvbHZlLFxuICAgICAgZXJyb3JFbGVtZW50LFxuICAgICAgdW5zdGFibGVfb25FcnJvcjogZGF0YVJvdXRlckNvbnRleHQ/LnVuc3RhYmxlX29uRXJyb3JcbiAgICB9LFxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChSZXNvbHZlQXdhaXQsIG51bGwsIGNoaWxkcmVuKVxuICApO1xufVxudmFyIEF3YWl0RXJyb3JCb3VuZGFyeSA9IGNsYXNzIGV4dGVuZHMgUmVhY3QzLkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGVycm9yOi
25114BudWxsIH07XG4gIH1cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yIH07XG4gIH1cbiAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbykge1xuICAgIGlmICh0aGlzLnByb3BzLnVuc3RhYmxlX29uRXJyb3IpIHtcbiAgICAgIHRoaXMucHJvcHMudW5zdGFibGVfb25FcnJvcihlcnJvciwgZXJyb3JJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCI8QXdhaXQ+IGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXJcIixcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGVycm9ySW5mb1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGxldCB7IGNoaWxkcmVuLCBlcnJvckVsZW1lbnQsIHJlc29sdmUgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHByb21pc2UgPSBudWxsO1xuICAgIGxldCBzdGF0dXMgPSAwIC8qIHBlbmRpbmcgKi87XG4gICAgaWYgKCEocmVzb2x2ZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICBzdGF0dXMgPSAxIC8qIHN1Y2Nlc3MgKi87XG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzZSwgXCJfdHJhY2tlZFwiLCB7IGdldDogKCkgPT4gdHJ1ZSB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl9kYXRhXCIsIHsgZ2V0OiAoKSA9PiByZXNvbHZlIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgc3RhdHVzID0gMiAvKiBlcnJvciAqLztcbiAgICAgIGxldCByZW5kZXJFcnJvciA9IHRoaXMuc3RhdGUuZXJyb3I7XG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoKS5jYXRjaCgoKSA9PiB7XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9taXNlLCBcIl90cmFja2VkXCIsIHsgZ2V0OiAoKSA9PiB0cnVlIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsIFwiX2Vycm9yXCIsIHsgZ2V0OiAoKSA9PiByZW5kZXJFcnJvciB9KTtcbiAgICB9IGVsc2UgaWYgKHJlc29sdmUuX3RyYWNrZWQpIHtcbiAgICAgIHByb21pc2UgPSByZXNvbHZlO1xuICAgICAgc3RhdHVzID0gXCJfZXJyb3JcIiBpbiBwcm9taXNlID8gMiAvKiBlcnJvciAqLyA6IFwiX2RhdGFcIiBpbiBwcm9taXNlID8gMSAvKiBzdWNjZXNzICovIDogMCAvKiBwZW5kaW5nICovO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgPSAwIC8qIHBlbmRpbmcgKi87XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzb2x2ZSwgXCJfdHJhY2tlZFwiLCB7IGdldDogKCkgPT4gdHJ1ZSB9KTtcbiAgICAgIHByb21pc2UgPSByZXNvbHZlLnRoZW4oXG4gICAgICAgIChkYXRhMikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX2RhdGFcIiwgeyBnZXQ6ICgpID0+IGRhdGEyIH0pLFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnByb3BzLnVuc3RhYmxlX29uRXJyb3I/LihlcnJvcik7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc29sdmUsIFwiX2Vycm9yXCIsIHsgZ2V0OiAoKSA9PiBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMiAvKiBlcnJvciAqLyAmJiAhZXJyb3JFbGVtZW50KSB7XG4gICAgICB0aHJvdyBwcm9taXNlLl9lcnJvcjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMiAvKiBlcnJvciAqLykge1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHByb21pc2UsIGNoaWxkcmVuOiBlcnJvckVsZW1lbnQgfSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDEgLyogc3VjY2VzcyAqLykge1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDMuY3JlYXRlRWxlbWVudChBd2FpdENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHByb21pc2UsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICB0aHJvdyBwcm9taXNlO1xuICB9XG59O1xuZnVuY3Rpb24gUmVzb2x2ZUF3YWl0KHtcbiAgY2hpbGRyZW5cbn0pIHtcbiAgbGV0IGRhdGEyID0gdXNlQXN5bmNWYWx1ZSgpO1xuICBsZXQgdG9SZW5kZXIgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKGRhdGEyKSA6IGNoaWxkcmVuO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0My5jcmVhdGVFbGVtZW50KFJlYWN0My5GcmFnbWVudCwgbnVsbCwgdG9SZW5kZXIpO1xufVxuZnVuY3Rpb24gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCBwYXJlbnRQYXRoID0gW10pIHtcbiAgbGV0IHJvdXRlcyA9IFtdO1xuICBSZWFjdDMuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFSZWFjdDMuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRyZWVQYXRoID0gWy4uLnBhcmVudFBhdGgsIGluZGV4XTtcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSZWFjdDMuRnJhZ21lbnQpIHtcbiAgICAgIHJvdXRlcy5wdXNoLmFwcGx5KFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGNyZWF0ZVJvdXRlc0Zyb21DaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuLCB0cmVlUGF0aClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGludmFyaWFudChcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gUm91dGUsXG4gICAgICBgWyR7dHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gXCJzdHJpbmdcIiA/IGVsZW1lbnQudHlwZSA6IGVsZW1lbnQudHlwZS5uYW1lfV0gaXMgbm90IGEgPFJvdXRlPiBjb21wb25lbnQuIEFsbCBjb21wb25lbnQgY2hpbGRyZW4gb2YgPFJvdXRlcz4gbXVzdCBiZSBhIDxSb3V0ZT4gb3IgPFJlYWN0LkZyYWdtZW50PmBcbiAgICApO1xuICAgIGludmFyaWFudChcbiAgICAgICFlbGVtZW50LnByb3BzLmluZGV4IHx8ICFlbGVtZW50LnByb3BzLmNoaWxkcmVuLFxuICAgICAgXCJBbiBpbmRleCByb3V0ZSBjYW5ub3QgaGF2ZSBjaGlsZCByb3V0ZXMuXCJcbiAgICApO
251141xuICAgIGxldCByb3V0ZSA9IHtcbiAgICAgIGlkOiBlbGVtZW50LnByb3BzLmlkIHx8IHRyZWVQYXRoLmpvaW4oXCItXCIpLFxuICAgICAgY2FzZVNlbnNpdGl2ZTogZWxlbWVudC5wcm9wcy5jYXNlU2Vuc2l0aXZlLFxuICAgICAgZWxlbWVudDogZWxlbWVudC5wcm9wcy5lbGVtZW50LFxuICAgICAgQ29tcG9uZW50OiBlbGVtZW50LnByb3BzLkNvbXBvbmVudCxcbiAgICAgIGluZGV4OiBlbGVtZW50LnByb3BzLmluZGV4LFxuICAgICAgcGF0aDogZWxlbWVudC5wcm9wcy5wYXRoLFxuICAgICAgbWlkZGxld2FyZTogZWxlbWVudC5wcm9wcy5taWRkbGV3YXJlLFxuICAgICAgbG9hZGVyOiBlbGVtZW50LnByb3BzLmxvYWRlcixcbiAgICAgIGFjdGlvbjogZWxlbWVudC5wcm9wcy5hY3Rpb24sXG4gICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50OiBlbGVtZW50LnByb3BzLmh5ZHJhdGVGYWxsYmFja0VsZW1lbnQsXG4gICAgICBIeWRyYXRlRmFsbGJhY2s6IGVsZW1lbnQucHJvcHMuSHlkcmF0ZUZhbGxiYWNrLFxuICAgICAgZXJyb3JFbGVtZW50OiBlbGVtZW50LnByb3BzLmVycm9yRWxlbWVudCxcbiAgICAgIEVycm9yQm91bmRhcnk6IGVsZW1lbnQucHJvcHMuRXJyb3JCb3VuZGFyeSxcbiAgICAgIGhhc0Vycm9yQm91bmRhcnk6IGVsZW1lbnQucHJvcHMuaGFzRXJyb3JCb3VuZGFyeSA9PT0gdHJ1ZSB8fCBlbGVtZW50LnByb3BzLkVycm9yQm91bmRhcnkgIT0gbnVsbCB8fCBlbGVtZW50LnByb3BzLmVycm9yRWxlbWVudCAhPSBudWxsLFxuICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogZWxlbWVudC5wcm9wcy5zaG91bGRSZXZhbGlkYXRlLFxuICAgICAgaGFuZGxlOiBlbGVtZW50LnByb3BzLmhhbmRsZSxcbiAgICAgIGxhenk6IGVsZW1lbnQucHJvcHMubGF6eVxuICAgIH07XG4gICAgaWYgKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgIHJvdXRlLmNoaWxkcmVuID0gY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuKFxuICAgICAgICBlbGVtZW50LnByb3BzLmNoaWxkcmVuLFxuICAgICAgICB0cmVlUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgcm91dGVzLnB1c2gocm91dGUpO1xuICB9KTtcbiAgcmV0dXJuIHJvdXRlcztcbn1cbnZhciBjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMgPSBjcmVhdGVSb3V0ZXNGcm9tQ2hpbGRyZW47XG5mdW5jdGlvbiByZW5kZXJNYXRjaGVzKG1hdGNoZXMpIHtcbiAgcmV0dXJuIF9yZW5kZXJNYXRjaGVzKG1hdGNoZXMpO1xufVxuZnVuY3Rpb24gdXNlUm91dGVDb21wb25lbnRQcm9wcygpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJhbXM6IHVzZVBhcmFtcygpLFxuICAgIGxvYWRlckRhdGE6IHVzZUxvYWRlckRhdGEoKSxcbiAgICBhY3Rpb25EYXRhOiB1c2VBY3Rpb25EYXRhKCksXG4gICAgbWF0Y2hlczogdXNlTWF0Y2hlcygpXG4gIH07XG59XG5mdW5jdGlvbiBXaXRoQ29tcG9uZW50UHJvcHMoe1xuICBjaGlsZHJlblxufSkge1xuICBjb25zdCBwcm9wcyA9IHVzZVJvdXRlQ29tcG9uZW50UHJvcHMoKTtcbiAgcmV0dXJuIFJlYWN0My5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHByb3BzKTtcbn1cbmZ1bmN0aW9uIHdpdGhDb21wb25lbnRQcm9wcyhDb21wb25lbnQ0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXaXRoQ29tcG9uZW50UHJvcHMyKCkge1xuICAgIGNvbnN0IHByb3BzID0gdXNlUm91dGVDb21wb25lbnRQcm9wcygpO1xuICAgIHJldHVybiBSZWFjdDMuY3JlYXRlRWxlbWVudChDb21wb25lbnQ0LCBwcm9wcyk7XG4gIH07XG59XG5mdW5jdGlvbiB1c2VIeWRyYXRlRmFsbGJhY2tQcm9wcygpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJhbXM6IHVzZVBhcmFtcygpLFxuICAgIGxvYWRlckRhdGE6IHVzZUxvYWRlckRhdGEoKSxcbiAgICBhY3Rpb25EYXRhOiB1c2VBY3Rpb25EYXRhKClcbiAgfTtcbn1cbmZ1bmN0aW9uIFdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wcyh7XG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHByb3BzID0gdXNlSHlkcmF0ZUZhbGxiYWNrUHJvcHMoKTtcbiAgcmV0dXJuIFJlYWN0My5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHByb3BzKTtcbn1cbmZ1bmN0aW9uIHdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wcyhIeWRyYXRlRmFsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wczIoKSB7XG4gICAgY29uc3QgcHJvcHMgPSB1c2VIeWRyYXRlRmFsbGJhY2tQcm9wcygpO1xuICAgIHJldHVybiBSZWFjdDMuY3JlYXRlRWxlbWVudChIeWRyYXRlRmFsbGJhY2ssIHByb3BzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZUVycm9yQm91bmRhcnlQcm9wcygpIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJhbXM6IHVzZVBhcmFtcygpLFxuICAgIGxvYWRlckRhdGE6IHVzZUxvYWRlckRhdGEoKSxcbiAgICBhY3Rpb25EYXRhOiB1c2VBY3Rpb25EYXRhKCksXG4gICAgZXJyb3I6IHVzZVJvdXRlRXJyb3IoKVxuICB9O1xufVxuZnVuY3Rpb24gV2l0aEVycm9yQm91bmRhcnlQcm9wcyh7XG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHByb3BzID0gdXNlRXJyb3JCb3VuZGFyeVByb3BzKCk7XG4gIHJldHVybiBSZWFjdDMuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBwcm9wcyk7XG59XG5mdW5jdGlvbiB3aXRoRXJyb3JCb3VuZGFyeVByb3BzKEVycm9yQm91bmRhcnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdpdGhFcnJvckJvdW5kYXJ5UHJvcHMyKCkge1xuICAgIGNvbnN0IHByb3BzID0gdXNlRXJyb3JCb3VuZGFyeVByb3BzKCk7XG4gICAgcmV0dXJuIFJlYWN0My5jcmVhdGVFbGVtZW50KEVycm9yQm91bmRhcnksIHByb3BzKTtcbiAgfTtcbn1cblxuLy8gbGliL2RvbS9kb20udHNcbnZhciBkZWZhdWx0TWV0aG9kID0gXCJnZXRcIjtcbnZhciBkZWZhdWx0RW5jVHlwZSA9IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCI7XG5mdW5jdGlvbiBpc0h0bWxFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgdHlwZW9mIG9iamVjdC50YWdOYW1lID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gaXNCdXR0b25FbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gaXNIdG1sRWxlbWVudChvYmplY3QpICYmIG9iamVjdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYnV0dG9uXCI7XG59XG5mdW5jdGlvbiBpc0Zvcm1FbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gaXNIdG1sRWxlbWVudChvYmplY3QpICYmIG9iamVjdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZm9ybVwiO1xufVxuZnVuY3Rpb24gaXNJbnB1dEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybi
25114Bpc0h0bWxFbGVtZW50KG9iamVjdCkgJiYgb2JqZWN0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiO1xufVxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cbmZ1bmN0aW9uIHNob3VsZFByb2Nlc3NMaW5rQ2xpY2soZXZlbnQsIHRhcmdldCkge1xuICByZXR1cm4gZXZlbnQuYnV0dG9uID09PSAwICYmIC8vIElnbm9yZSBldmVyeXRoaW5nIGJ1dCBsZWZ0IGNsaWNrc1xuICAoIXRhcmdldCB8fCB0YXJnZXQgPT09IFwiX3NlbGZcIikgJiYgLy8gTGV0IGJyb3dzZXIgaGFuZGxlIFwidGFyZ2V0PV9ibGFua1wiIGV0Yy5cbiAgIWlzTW9kaWZpZWRFdmVudChldmVudCk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZWFyY2hQYXJhbXMoaW5pdCA9IFwiXCIpIHtcbiAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoXG4gICAgdHlwZW9mIGluaXQgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShpbml0KSB8fCBpbml0IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zID8gaW5pdCA6IE9iamVjdC5rZXlzKGluaXQpLnJlZHVjZSgobWVtbzIsIGtleSkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gaW5pdFtrZXldO1xuICAgICAgcmV0dXJuIG1lbW8yLmNvbmNhdChcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IFtrZXksIHZdKSA6IFtba2V5LCB2YWx1ZV1dXG4gICAgICApO1xuICAgIH0sIFtdKVxuICApO1xufVxuZnVuY3Rpb24gZ2V0U2VhcmNoUGFyYW1zRm9yTG9jYXRpb24obG9jYXRpb25TZWFyY2gsIGRlZmF1bHRTZWFyY2hQYXJhbXMpIHtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IGNyZWF0ZVNlYXJjaFBhcmFtcyhsb2NhdGlvblNlYXJjaCk7XG4gIGlmIChkZWZhdWx0U2VhcmNoUGFyYW1zKSB7XG4gICAgZGVmYXVsdFNlYXJjaFBhcmFtcy5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGlmICghc2VhcmNoUGFyYW1zLmhhcyhrZXkpKSB7XG4gICAgICAgIGRlZmF1bHRTZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSkuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc2VhcmNoUGFyYW1zO1xufVxudmFyIF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID0gbnVsbDtcbmZ1bmN0aW9uIGlzRm9ybURhdGFTdWJtaXR0ZXJTdXBwb3J0ZWQoKSB7XG4gIGlmIChfZm9ybURhdGFTdXBwb3J0c1N1Ym1pdHRlciA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgRm9ybURhdGEoXG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlmIEZvcm1EYXRhIHN1cHBvcnRzIHRoZSBzdWJtaXR0ZXIgcGFyYW1ldGVyLCB0aGlzIHdpbGwgdGhyb3dcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIF9mb3JtRGF0YVN1cHBvcnRzU3VibWl0dGVyID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2Zvcm1EYXRhU3VwcG9ydHNTdWJtaXR0ZXI7XG59XG52YXIgc3VwcG9ydGVkRm9ybUVuY1R5cGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuICBcIm11bHRpcGFydC9mb3JtLWRhdGFcIixcbiAgXCJ0ZXh0L3BsYWluXCJcbl0pO1xuZnVuY3Rpb24gZ2V0Rm9ybUVuY1R5cGUoZW5jVHlwZSkge1xuICBpZiAoZW5jVHlwZSAhPSBudWxsICYmICFzdXBwb3J0ZWRGb3JtRW5jVHlwZXMuaGFzKGVuY1R5cGUpKSB7XG4gICAgd2FybmluZyhcbiAgICAgIGZhbHNlLFxuICAgICAgYFwiJHtlbmNUeXBlfVwiIGlzIG5vdCBhIHZhbGlkIFxcYGVuY1R5cGVcXGAgZm9yIFxcYDxGb3JtPlxcYC9cXGA8ZmV0Y2hlci5Gb3JtPlxcYCBhbmQgd2lsbCBkZWZhdWx0IHRvIFwiJHtkZWZhdWx0RW5jVHlwZX1cImBcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBlbmNUeXBlO1xufVxuZnVuY3Rpb24gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKHRhcmdldCwgYmFzZW5hbWUpIHtcbiAgbGV0IG1ldGhvZDtcbiAgbGV0IGFjdGlvbjtcbiAgbGV0IGVuY1R5cGU7XG4gIGxldCBmb3JtRGF0YTtcbiAgbGV0IGJvZHk7XG4gIGlmIChpc0Zvcm1FbGVtZW50KHRhcmdldCkpIHtcbiAgICBsZXQgYXR0ciA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIik7XG4gICAgYWN0aW9uID0gYXR0ciA/IHN0cmlwQmFzZW5hbWUoYXR0ciwgYmFzZW5hbWUpIDogbnVsbDtcbiAgICBtZXRob2QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwibWV0aG9kXCIpIHx8IGRlZmF1bHRNZXRob2Q7XG4gICAgZW5jVHlwZSA9IGdldEZvcm1FbmNUeXBlKHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJlbmN0eXBlXCIpKSB8fCBkZWZhdWx0RW5jVHlwZTtcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSh0YXJnZXQpO1xuICB9IGVsc2UgaWYgKGlzQnV0dG9uRWxlbWVudCh0YXJnZXQpIHx8IGlzSW5wdXRFbGVtZW50KHRhcmdldCkgJiYgKHRhcmdldC50eXBlID09PSBcInN1Ym1pdFwiIHx8IHRhcmdldC50eXBlID09PSBcImltYWdlXCIpKSB7XG4gICAgbGV0IGZvcm0gPSB0YXJnZXQuZm9ybTtcbiAgICBpZiAoZm9ybSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc3VibWl0IGEgPGJ1dHRvbj4gb3IgPGlucHV0IHR5cGU9XCJzdWJtaXRcIj4gd2l0aG91dCBhIDxmb3JtPmBcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBhdHRyID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImZvcm1hY3Rpb25cIikgfHwgZm9ybS5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIik7XG4gICAgYWN0aW9uID0gYXR0ciA/IHN0cmlwQmFzZW5hbWUoYXR0ciwgYmFzZW5hbWUpIDogbnVsbDtcbiAgICBtZXRob2QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSB8fCBmb3JtLmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSB8fCBkZWZhdWx0TWV0aG9kO1xuICAgIGVuY1R5cGUgPSBnZXRGb3JtRW5jVHlwZSh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZm9ybWVuY3R5cGVcIikpIHx8IGdldEZvcm1FbmNUeXBlKGZvcm0uZ2V0QXR0cmlidXRlKFwiZW5jdHlwZVwiKSkgfHwgZGVmYXVsdEVuY1R5cGU7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSwgdGFyZ2V0KTtcbiAgICBpZiAoIWlzRm9ybURhdGFTdWJtaXR0ZXJTdXBwb3J0ZWQoKSkge1xuICAgICAgbGV0IHsgbmFtZSwgdHlwZSwgdmFsdWUgfSA9IHRhcmdldDtcbiAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9IG5hbWUgPyBgJHtuYW1lfS5gIDogXCJcIjtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGAke3ByZWZpeH14YCwgXCIwXCIpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoYCR7cHJlZml4fXlgLCBcIjBcIik7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gI
25114H0gZWxzZSBpZiAoaXNIdG1sRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCBzdWJtaXQgZWxlbWVudCB0aGF0IGlzIG5vdCA8Zm9ybT4sIDxidXR0b24+LCBvciA8aW5wdXQgdHlwZT1cInN1Ym1pdHxpbWFnZVwiPmBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG1ldGhvZCA9IGRlZmF1bHRNZXRob2Q7XG4gICAgYWN0aW9uID0gbnVsbDtcbiAgICBlbmNUeXBlID0gZGVmYXVsdEVuY1R5cGU7XG4gICAgYm9keSA9IHRhcmdldDtcbiAgfVxuICBpZiAoZm9ybURhdGEgJiYgZW5jVHlwZSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcbiAgICBib2R5ID0gZm9ybURhdGE7XG4gICAgZm9ybURhdGEgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIHsgYWN0aW9uLCBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLCBlbmNUeXBlLCBmb3JtRGF0YSwgYm9keSB9O1xufVxuXG4vLyBsaWIvZG9tL3Nzci9zaW5nbGUtZmV0Y2gudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDQgZnJvbSBcInJlYWN0XCI7XG5cbi8vIHZlbmRvci90dXJiby1zdHJlYW0tdjIvdXRpbHMudHNcbnZhciBIT0xFID0gLTE7XG52YXIgTkFOID0gLTI7XG52YXIgTkVHQVRJVkVfSU5GSU5JVFkgPSAtMztcbnZhciBORUdBVElWRV9aRVJPID0gLTQ7XG52YXIgTlVMTCA9IC01O1xudmFyIFBPU0lUSVZFX0lORklOSVRZID0gLTY7XG52YXIgVU5ERUZJTkVEID0gLTc7XG52YXIgVFlQRV9CSUdJTlQgPSBcIkJcIjtcbnZhciBUWVBFX0RBVEUgPSBcIkRcIjtcbnZhciBUWVBFX0VSUk9SID0gXCJFXCI7XG52YXIgVFlQRV9NQVAgPSBcIk1cIjtcbnZhciBUWVBFX05VTExfT0JKRUNUID0gXCJOXCI7XG52YXIgVFlQRV9QUk9NSVNFID0gXCJQXCI7XG52YXIgVFlQRV9SRUdFWFAgPSBcIlJcIjtcbnZhciBUWVBFX1NFVCA9IFwiU1wiO1xudmFyIFRZUEVfU1lNQk9MID0gXCJZXCI7XG52YXIgVFlQRV9VUkwgPSBcIlVcIjtcbnZhciBUWVBFX1BSRVZJT1VTX1JFU09MVkVEID0gXCJaXCI7XG52YXIgRGVmZXJyZWQyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVMaW5lU3BsaXR0aW5nVHJhbnNmb3JtKCkge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBsZWZ0b3ZlciA9IFwiXCI7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnN0IHN0ciA9IGRlY29kZXIuZGVjb2RlKGNodW5rLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHBhcnRzID0gKGxlZnRvdmVyICsgc3RyKS5zcGxpdChcIlxcblwiKTtcbiAgICAgIGxlZnRvdmVyID0gcGFydHMucG9wKCkgfHwgXCJcIjtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFydCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICBpZiAobGVmdG92ZXIpIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGxlZnRvdmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vLyB2ZW5kb3IvdHVyYm8tc3RyZWFtLXYyL2ZsYXR0ZW4udHNcbmZ1bmN0aW9uIGZsYXR0ZW4oaW5wdXQpIHtcbiAgY29uc3QgeyBpbmRpY2VzIH0gPSB0aGlzO1xuICBjb25zdCBleGlzdGluZyA9IGluZGljZXMuZ2V0KGlucHV0KTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gW2V4aXN0aW5nXTtcbiAgaWYgKGlucHV0ID09PSB2b2lkIDApIHJldHVybiBVTkRFRklORUQ7XG4gIGlmIChpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIE5VTEw7XG4gIGlmIChOdW1iZXIuaXNOYU4oaW5wdXQpKSByZXR1cm4gTkFOO1xuICBpZiAoaW5wdXQgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgcmV0dXJuIFBPU0lUSVZFX0lORklOSVRZO1xuICBpZiAoaW5wdXQgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZO1xuICBpZiAoaW5wdXQgPT09IDAgJiYgMSAvIGlucHV0IDwgMCkgcmV0dXJuIE5FR0FUSVZFX1pFUk87XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCsrO1xuICBpbmRpY2VzLnNldChpbnB1dCwgaW5kZXgpO1xuICBzdHJpbmdpZnkuY2FsbCh0aGlzLCBpbnB1dCwgaW5kZXgpO1xuICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQsIGluZGV4KSB7XG4gIGNvbnN0IHsgZGVmZXJyZWQsIHBsdWdpbnMsIHBvc3RQbHVnaW5zIH0gPSB0aGlzO1xuICBjb25zdCBzdHIgPSB0aGlzLnN0cmluZ2lmaWVkO1xuICBjb25zdCBzdGFjayA9IFtbaW5wdXQsIGluZGV4XV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgW2lucHV0MiwgaW5kZXgyXSA9IHN0YWNrLnBvcCgpO1xuICAgIGNvbnN0IHBhcnRzRm9yT2JqID0gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKS5tYXAoKGspID0+IGBcIl8ke2ZsYXR0ZW4uY2FsbCh0aGlzLCBrKX1cIjoke2ZsYXR0ZW4uY2FsbCh0aGlzLCBvYmpba10pfWApLmpvaW4oXCIsXCIpO1xuICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgc3dpdGNoICh0eXBlb2YgaW5wdXQyKSB7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBzdHJbaW5kZXgyXSA9IEpTT04uc3RyaW5naWZ5KGlucHV0Mik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfQklHSU5UfVwiLFwiJHtpbnB1dDJ9XCJdYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic3ltYm9sXCI6IHtcbiAgICAgICAgY29uc3Qga2V5Rm9yID0gU3ltYm9sLmtleUZvcihpbnB1dDIpO1xuICAgICAgICBpZiAoIWtleUZvcikge1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZW5jb2RlIHN5bWJvbCB1bmxlc3MgY3JlYXRlZCB3aXRoIFN5bWJvbC5mb3IoKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfU1lNQk9MfVwiLCR7SlNPTi5zdHJpbmdpZnkoa2V5Rm9yKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICBpZiAoIWlucHV0Mikge1xuICAgICAgICAgI
25114HN0cltpbmRleDJdID0gYCR7TlVMTH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGlucHV0Mik7XG4gICAgICAgIGxldCBwbHVnaW5IYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIGlmICghaXNBcnJheSAmJiBwbHVnaW5zKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luUmVzdWx0ID0gcGx1Z2luKGlucHV0Mik7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW5SZXN1bHQpKSB7XG4gICAgICAgICAgICAgIHBsdWdpbkhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBjb25zdCBbcGx1Z2luSWRlbnRpZmllciwgLi4ucmVzdF0gPSBwbHVnaW5SZXN1bHQ7XG4gICAgICAgICAgICAgIHN0cltpbmRleDJdID0gYFske0pTT04uc3RyaW5naWZ5KHBsdWdpbklkZW50aWZpZXIpfWA7XG4gICAgICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBgLCR7cmVzdC5tYXAoKHYpID0+IGZsYXR0ZW4uY2FsbCh0aGlzLCB2KSkuam9pbihcIixcIil9YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBcIl1cIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcGx1Z2luSGFuZGxlZCkge1xuICAgICAgICAgIGxldCByZXN1bHQgPSBpc0FycmF5ID8gXCJbXCIgOiBcIntcIjtcbiAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dDIubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgIHJlc3VsdCArPSAoaSA/IFwiLFwiIDogXCJcIikgKyAoaSBpbiBpbnB1dDIgPyBmbGF0dGVuLmNhbGwodGhpcywgaW5wdXQyW2ldKSA6IEhPTEUpO1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgJHtyZXN1bHR9XWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZSA9IGlucHV0Mi5nZXRUaW1lKCk7XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfREFURX1cIiwke051bWJlci5pc05hTihkYXRlVGltZSkgPyBKU09OLnN0cmluZ2lmeShcImludmFsaWRcIikgOiBkYXRlVGltZX1dYDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0MiBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX1VSTH1cIiwke0pTT04uc3RyaW5naWZ5KGlucHV0Mi5ocmVmKX1dYDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0MiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX1JFR0VYUH1cIiwke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBpbnB1dDIuc291cmNlXG4gICAgICAgICAgICApfSwke0pTT04uc3RyaW5naWZ5KGlucHV0Mi5mbGFncyl9XWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dDIuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX1NFVH1cIiwke1suLi5pbnB1dDJdLm1hcCgodmFsKSA9PiBmbGF0dGVuLmNhbGwodGhpcywgdmFsKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfU0VUfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmIChpbnB1dDIuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX01BUH1cIiwke1suLi5pbnB1dDJdLmZsYXRNYXAoKFtrLCB2XSkgPT4gW1xuICAgICAgICAgICAgICAgIGZsYXR0ZW4uY2FsbCh0aGlzLCBrKSxcbiAgICAgICAgICAgICAgICBmbGF0dGVuLmNhbGwodGhpcywgdilcbiAgICAgICAgICAgICAgXSkuam9pbihcIixcIil9XWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfTUFQfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfUFJPTUlTRX1cIiwke2luZGV4Mn1dYDtcbiAgICAgICAgICAgIGRlZmVycmVkW2luZGV4Ml0gPSBpbnB1dDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dDIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgW1wiJHtUWVBFX0VSUk9SfVwiLCR7SlNPTi5zdHJpbmdpZnkoaW5wdXQyLm1lc3NhZ2UpfWA7XG4gICAgICAgICAgICBpZiAoaW5wdXQyLm5hbWUgIT09IFwiRXJyb3JcIikge1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBgLCR7SlNPTi5zdHJpbmdpZnkoaW5wdXQyLm5hbWUpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBcIl1cIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnB1dDIpID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbXCIke1RZUEVfTlVMTF9PQkpFQ1R9XCIseyR7cGFydHNGb3JPYmooaW5wdXQyKX19XWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGlucHV0MikpIHtcbiAgICAgICAgICAgIHN0cltpbmRleDJdID0gYHske3BhcnRzRm9yT2JqKGlucHV0Mil9fWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQ2Fubm90IGVuY29kZSBvYmplY3Qgd2l0aCBwcm90b3R5cGVcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBpc0FycmF
251145ID0gQXJyYXkuaXNBcnJheShpbnB1dDIpO1xuICAgICAgICBsZXQgcGx1Z2luSGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzQXJyYXkgJiYgcGx1Z2lucykge1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpblJlc3VsdCA9IHBsdWdpbihpbnB1dDIpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2luUmVzdWx0KSkge1xuICAgICAgICAgICAgICBwbHVnaW5IYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc3QgW3BsdWdpbklkZW50aWZpZXIsIC4uLnJlc3RdID0gcGx1Z2luUmVzdWx0O1xuICAgICAgICAgICAgICBzdHJbaW5kZXgyXSA9IGBbJHtKU09OLnN0cmluZ2lmeShwbHVnaW5JZGVudGlmaWVyKX1gO1xuICAgICAgICAgICAgICBpZiAocmVzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gKz0gYCwke3Jlc3QubWFwKCh2KSA9PiBmbGF0dGVuLmNhbGwodGhpcywgdikpLmpvaW4oXCIsXCIpfWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gKz0gXCJdXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBsdWdpbkhhbmRsZWQpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkNhbm5vdCBlbmNvZGUgZnVuY3Rpb24gb3IgdW5leHBlY3RlZCB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgbGV0IHBsdWdpbkhhbmRsZWQgPSBmYWxzZTtcbiAgICAgIGlmIChwb3N0UGx1Z2lucykge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwb3N0UGx1Z2lucykge1xuICAgICAgICAgIGNvbnN0IHBsdWdpblJlc3VsdCA9IHBsdWdpbihpbnB1dDIpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBsdWdpblJlc3VsdCkpIHtcbiAgICAgICAgICAgIHBsdWdpbkhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgW3BsdWdpbklkZW50aWZpZXIsIC4uLnJlc3RdID0gcGx1Z2luUmVzdWx0O1xuICAgICAgICAgICAgc3RyW2luZGV4Ml0gPSBgWyR7SlNPTi5zdHJpbmdpZnkocGx1Z2luSWRlbnRpZmllcil9YDtcbiAgICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc3RyW2luZGV4Ml0gKz0gYCwke3Jlc3QubWFwKCh2KSA9PiBmbGF0dGVuLmNhbGwodGhpcywgdikpLmpvaW4oXCIsXCIpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJbaW5kZXgyXSArPSBcIl1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFwbHVnaW5IYW5kbGVkKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIG9iamVjdFByb3RvTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QucHJvdG90eXBlKS5zb3J0KCkuam9pbihcIlxcMFwiKTtcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodGhpbmcpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpbmcpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwgfHwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pLnNvcnQoKS5qb2luKFwiXFwwXCIpID09PSBvYmplY3RQcm90b05hbWVzO1xufVxuXG4vLyB2ZW5kb3IvdHVyYm8tc3RyZWFtLXYyL3VuZmxhdHRlbi50c1xudmFyIGdsb2JhbE9iaiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB2b2lkIDA7XG5mdW5jdGlvbiB1bmZsYXR0ZW4ocGFyc2VkKSB7XG4gIGNvbnN0IHsgaHlkcmF0ZWQsIHZhbHVlcyB9ID0gdGhpcztcbiAgaWYgKHR5cGVvZiBwYXJzZWQgPT09IFwibnVtYmVyXCIpIHJldHVybiBoeWRyYXRlLmNhbGwodGhpcywgcGFyc2VkKTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkgfHwgIXBhcnNlZC5sZW5ndGgpIHRocm93IG5ldyBTeW50YXhFcnJvcigpO1xuICBjb25zdCBzdGFydEluZGV4ID0gdmFsdWVzLmxlbmd0aDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBwYXJzZWQpIHtcbiAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gIH1cbiAgaHlkcmF0ZWQubGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGh5ZHJhdGUuY2FsbCh0aGlzLCBzdGFydEluZGV4KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoaW5kZXgpIHtcbiAgY29uc3QgeyBoeWRyYXRlZCwgdmFsdWVzLCBkZWZlcnJlZCwgcGx1Z2lucyB9ID0gdGhpcztcbiAgbGV0IHJlc3VsdDtcbiAgY29uc3Qgc3RhY2sgPSBbXG4gICAgW1xuICAgICAgaW5kZXgsXG4gICAgICAodikgPT4ge1xuICAgICAgICByZXN1bHQgPSB2O1xuICAgICAgfVxuICAgIF1cbiAgXTtcbiAgbGV0IHBvc3RSdW4gPSBbXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbaW5kZXgyLCBzZXRdID0gc3RhY2sucG9wKCk7XG4gICAgc3dpdGNoIChpbmRleDIpIHtcbiAgICAgIGNhc2UgVU5ERUZJTkVEOlxuICAgICAgICBzZXQodm9pZCAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5VTEw6XG4gICAgICAgIHNldChudWxsKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5BTjpcbiAgICAgICAgc2V0KE5hTik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY2FzZSBQT1NJVElWRV9JTkZJTklUWTpcbiAgICAgICAgc2V0KEluZmluaXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5FR0FUSVZFX0lORklOSVRZOlxuICAgICAgICBzZXQoLUluZmluaXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICBjYXNlIE5FR0FUSVZFX1pFUk86XG4gICAgICAgIHNldCgtMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaHlkcmF0ZWRbaW5kZXgyXSkge1xuICAgICAgc2V0KGh5ZHJhdGVkW2luZGV4Ml0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2luZGV4Ml07XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGh5ZHJhdGVkW2luZGV4Ml0gPSB2YWx1ZTtcbiAgICAgIHNldCh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBiLCBjXSA9IHZhbHVlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFRZUEVfREFURTpcbiAgICAgICAgICAgI
25114HNldChoeWRyYXRlZFtpbmRleDJdID0gbmV3IERhdGUoYikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBUWVBFX1VSTDpcbiAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gbmV3IFVSTChiKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfQklHSU5UOlxuICAgICAgICAgICAgc2V0KGh5ZHJhdGVkW2luZGV4Ml0gPSBCaWdJbnQoYikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBUWVBFX1JFR0VYUDpcbiAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gbmV3IFJlZ0V4cChiLCBjKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfU1lNQk9MOlxuICAgICAgICAgICAgc2V0KGh5ZHJhdGVkW2luZGV4Ml0gPSBTeW1ib2wuZm9yKGIpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9TRVQ6XG4gICAgICAgICAgICBjb25zdCBuZXdTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IG5ld1NldDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKVxuICAgICAgICAgICAgICBzdGFjay5wdXNoKFtcbiAgICAgICAgICAgICAgICB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgbmV3U2V0LmFkZCh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgc2V0KG5ld1NldCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfTUFQOlxuICAgICAgICAgICAgY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGh5ZHJhdGVkW2luZGV4Ml0gPSBtYXA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdmFsdWUubGVuZ3RoIC0gMjsgaSA+IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgICAgICAgIHZhbHVlW2kgKyAxXSxcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgclsxXSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChbXG4gICAgICAgICAgICAgICAgdmFsdWVbaV0sXG4gICAgICAgICAgICAgICAgKGspID0+IHtcbiAgICAgICAgICAgICAgICAgIHJbMF0gPSBrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHBvc3RSdW4ucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWFwLnNldChyWzBdLCByWzFdKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQobWFwKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9OVUxMX09CSkVDVDpcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IG9iajtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgICAgICAgIGJba2V5XSxcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgclsxXSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChbXG4gICAgICAgICAgICAgICAgTnVtYmVyKGtleS5zbGljZSgxKSksXG4gICAgICAgICAgICAgICAgKGspID0+IHtcbiAgICAgICAgICAgICAgICAgIHJbMF0gPSBrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHBvc3RSdW4ucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JqW3JbMF1dID0gclsxXTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXQob2JqKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9QUk9NSVNFOlxuICAgICAgICAgICAgaWYgKGh5ZHJhdGVkW2JdKSB7XG4gICAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gaHlkcmF0ZWRbYl0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEZWZlcnJlZDIoKTtcbiAgICAgICAgICAgICAgZGVmZXJyZWRbYl0gPSBkO1xuICAgICAgICAgICAgICBzZXQoaHlkcmF0ZWRbaW5kZXgyXSA9IGQucHJvbWlzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRZUEVfRVJST1I6XG4gICAgICAgICAgICBjb25zdCBbLCBtZXNzYWdlLCBlcnJvclR5cGVdID0gdmFsdWU7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBlcnJvclR5cGUgJiYgZ2xvYmFsT2JqICYmIGdsb2JhbE9ialtlcnJvclR5cGVdID8gbmV3IGdsb2JhbE9ialtlcnJvclR5cGVdKG1lc3NhZ2UpIDogbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IGVycm9yO1xuICAgICAgICAgICAgc2V0KGVycm9yKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgVFlQRV9QUkVWSU9VU19SRVNPTFZFRDpcbiAgICAgICAgICAgIHNldChoeWRyYXRlZFtpbmRleDJdID0gaHlkcmF0ZWRbYl0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgICAgICAgICAgY29uc3QgdmFscyA9IHZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdmFsc1tpXTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKFtcbiAgICAgICAgICAgICAgICAgI
25114HYsXG4gICAgICAgICAgICAgICAgICAodjIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcltpXSA9IHYyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBvc3RSdW4ucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IHBsdWdpbih2YWx1ZVswXSwgLi4ucik7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Mikge1xuICAgICAgICAgICAgICAgICAgICBzZXQoaHlkcmF0ZWRbaW5kZXgyXSA9IHJlc3VsdDIudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICAgICAgaHlkcmF0ZWRbaW5kZXgyXSA9IGFycmF5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHZhbHVlW2ldO1xuICAgICAgICAgIGlmIChuICE9PSBIT0xFKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKFtcbiAgICAgICAgICAgICAgbixcbiAgICAgICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXQoYXJyYXkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqZWN0ID0ge307XG4gICAgICBoeWRyYXRlZFtpbmRleDJdID0gb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnJldmVyc2UoKSkge1xuICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgIHZhbHVlW2tleV0sXG4gICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgIHJbMV0gPSB2O1xuICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHN0YWNrLnB1c2goW1xuICAgICAgICAgIE51bWJlcihrZXkuc2xpY2UoMSkpLFxuICAgICAgICAgIChrKSA9PiB7XG4gICAgICAgICAgICByWzBdID0gaztcbiAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgICAgICBwb3N0UnVuLnB1c2goKCkgPT4ge1xuICAgICAgICAgIG9iamVjdFtyWzBdXSA9IHJbMV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2V0KG9iamVjdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKHBvc3RSdW4ubGVuZ3RoID4gMCkge1xuICAgIHBvc3RSdW4ucG9wKCkoKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyB2ZW5kb3IvdHVyYm8tc3RyZWFtLXYyL3R1cmJvLXN0cmVhbS50c1xuYXN5bmMgZnVuY3Rpb24gZGVjb2RlKHJlYWRhYmxlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHsgcGx1Z2lucyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgY29uc3QgZG9uZSA9IG5ldyBEZWZlcnJlZDIoKTtcbiAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUucGlwZVRocm91Z2goY3JlYXRlTGluZVNwbGl0dGluZ1RyYW5zZm9ybSgpKS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgZGVjb2RlciA9IHtcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGh5ZHJhdGVkOiBbXSxcbiAgICBkZWZlcnJlZDoge30sXG4gICAgcGx1Z2luc1xuICB9O1xuICBjb25zdCBkZWNvZGVkID0gYXdhaXQgZGVjb2RlSW5pdGlhbC5jYWxsKGRlY29kZXIsIHJlYWRlcik7XG4gIGxldCBkb25lUHJvbWlzZSA9IGRvbmUucHJvbWlzZTtcbiAgaWYgKGRlY29kZWQuZG9uZSkge1xuICAgIGRvbmUucmVzb2x2ZSgpO1xuICB9IGVsc2Uge1xuICAgIGRvbmVQcm9taXNlID0gZGVjb2RlRGVmZXJyZWQuY2FsbChkZWNvZGVyLCByZWFkZXIpLnRoZW4oZG9uZS5yZXNvbHZlKS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGRlZmVycmVkIG9mIE9iamVjdC52YWx1ZXMoZGVjb2Rlci5kZWZlcnJlZCkpIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7XG4gICAgICB9XG4gICAgICBkb25lLnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgZG9uZTogZG9uZVByb21pc2UudGhlbigoKSA9PiByZWFkZXIuY2xvc2VkKSxcbiAgICB2YWx1ZTogZGVjb2RlZC52YWx1ZVxuICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gZGVjb2RlSW5pdGlhbChyZWFkZXIpIHtcbiAgY29uc3QgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gIGlmICghcmVhZC52YWx1ZSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigpO1xuICB9XG4gIGxldCBsaW5lO1xuICB0cnkge1xuICAgIGxpbmUgPSBKU09OLnBhcnNlKHJlYWQudmFsdWUpO1xuICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRvbmU6IHJlYWQuZG9uZSxcbiAgICB2YWx1ZTogdW5mbGF0dGVuLmNhbGwodGhpcywgbGluZSlcbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGRlY29kZURlZmVycmVkKHJlYWRlcikge1xuICBsZXQgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gIHdoaWxlICghcmVhZC5kb25lKSB7XG4gICAgaWYgKCFyZWFkLnZhbHVlKSBjb250aW51ZTtcbiAgICBjb25zdCBsaW5lID0gcmVhZC52YWx1ZTtcbiAgICBzd2l0Y2ggKGxpbmVbMF0pIHtcbiAgICAgIGNhc2UgVFlQRV9QUk9NSVNFOiB7XG4gICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBsaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZElkID0gTnVtYmVyKGxpbmUuc2xpY2UoMSwgY29sb25JbmRleCkpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IHRoaXMuZGVmZXJyZWRbZGVmZXJyZWRJZF07XG4gICAgICAgIGlmICghZGVmZXJyZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmVycmVkIElEICR7ZGVmZXJyZWRJZH0gbm90IGZvdW5kIGluIHN0cmVhbWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVEYXRhID0gbGluZS5zbGljZShjb2xvbkluZGV4ICsgMSk7XG4gICAgICAgIGxldCBqc29uTGluZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBqc29uTGluZSA9IEpTT04ucGFyc2UobGluZURhdGEpO1xuICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuZmxhdHRlbi5jYWxsKHRoaXMsIGpzb25MaW5lKTtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUWVBFX0VSUk9SOiB7XG4gICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBsaW5lLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZElkID0gTnVtYmVyKGxpbmUuc2xpY2UoMSwgY29sb25JbmRleCkpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IHRoaXMuZGVmZXJyZWRbZGVmZXJyZWRJZF07XG4gICAgICAgIGlmICghZGVmZXJyZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmVycmVkIElEICR7ZGVmZXJyZWRJZH0gbm90IGZvdW5kIGluIHN0cmVhbWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVEYXRhID0gbGluZS5zbGljZShjb2xvbkluZGV4ICsgMSk7XG4gICAgICAgIGxldCBqc29uTGluZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBqc29uTGluZSA9IEpTT04ucGFyc2UobGluZURhdGEpO1xuICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuZmxhdHRlbi5jYWxsKHRoaXMsIGpzb25MaW5lKTtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICB9XG4gICAgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuY29kZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCB7IHBsdWdpbnMsIHBvc3RQbHVnaW5zLCBzaWduYWwgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGVuY29kZXIgPSB7XG4gICAgZGVmZXJyZWQ6IHt9LFxuICAgIGluZGV4OiAwLFxuICAgIGluZGljZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgc3RyaW5naWZpZWQ6IFtdLFxuICAgIHBsdWdpbnMsXG4gICAgcG9zdFBsdWdpbnMsXG4gICAgc2lnbmFsXG4gIH07XG4gIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGxldCBsYXN0U2VudEluZGV4ID0gMDtcbiAgY29uc3QgcmVhZGFibGUgPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnN0IGlkID0gZmxhdHRlbi5jYWxsKGVuY29kZXIsIGlucHV0KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF
251145KGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gICAgICB9XG4gICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh0ZXh0RW5jb2Rlci5lbmNvZGUoYCR7aWR9XG5gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoXG4gICAgICAgICAgdGV4dEVuY29kZXIuZW5jb2RlKGBbJHtlbmNvZGVyLnN0cmluZ2lmaWVkLmpvaW4oXCIsXCIpfV1cbmApXG4gICAgICAgICk7XG4gICAgICAgIGxhc3RTZW50SW5kZXggPSBlbmNvZGVyLnN0cmluZ2lmaWVkLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWVuUHJvbWlzZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhlbmNvZGVyLmRlZmVycmVkKS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHJhY2VEb25lO1xuICAgICAgICBjb25zdCByYWNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByYWNlRG9uZSA9IHJlc29sdmU7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgY29uc3QgcmVqZWN0UHJvbWlzZSA9ICgpID0+IHJlamVjdChzaWduYWwucmVhc29uIHx8IG5ldyBFcnJvcihcIlNpZ25hbCB3YXMgYWJvcnRlZC5cIikpO1xuICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHJlamVjdFByb21pc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0UHJvbWlzZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZSAoT2JqZWN0LmtleXMoZW5jb2Rlci5kZWZlcnJlZCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3QgW2RlZmVycmVkSWQsIGRlZmVycmVkXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgIGVuY29kZXIuZGVmZXJyZWRcbiAgICAgICAgICApKSB7XG4gICAgICAgICAgICBpZiAoc2VlblByb21pc2VzLmhhcyhkZWZlcnJlZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2VlblByb21pc2VzLmFkZChcbiAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgICAgZW5jb2Rlci5kZWZlcnJlZFtOdW1iZXIoZGVmZXJyZWRJZCldID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICByYWNlUHJvbWlzZSxcbiAgICAgICAgICAgICAgICBkZWZlcnJlZFxuICAgICAgICAgICAgICBdKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXNvbHZlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaWQyID0gZmxhdHRlbi5jYWxsKGVuY29kZXIsIHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkMikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfUFJPTUlTRX0ke2RlZmVycmVkSWR9OltbXCIke1RZUEVfUFJFVklPVVNfUkVTT0xWRUR9XCIsJHtpZDJbMF19XV1cbmBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNlbnRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZDIgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtUWVBFX1BST01JU0V9JHtkZWZlcnJlZElkfToke2lkMn1cbmBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBlbmNvZGVyLnN0cmluZ2lmaWVkLnNsaWNlKGxhc3RTZW50SW5kZXggKyAxKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfUFJPTUlTRX0ke2RlZmVycmVkSWR9Olske3ZhbHVlc31dXG5gXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VudEluZGV4ID0gZW5jb2Rlci5zdHJpbmdpZmllZC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFyZWFzb24gfHwgdHlwZW9mIHJlYXNvbiAhPT0gXCJvYmplY3RcIiB8fCAhKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBuZXcgRXJyb3IoXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkXCIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgaWQyID0gZmxhdHRlbi5jYWxsKGVuY29kZXIsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtUWVBFX0VSUk9SfSR7ZGVmZXJyZWRJZH06W1tcIiR7VFlQRV9QUkVWSU9VU19SRVNPTFZFRH1cIiwke2lkMlswXX1dXVxuYFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkMiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgI
25114HRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfRVJST1J9JHtkZWZlcnJlZElkfToke2lkMn1cbmBcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBlbmNvZGVyLnN0cmluZ2lmaWVkLnNsaWNlKGxhc3RTZW50SW5kZXggKyAxKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGVyLmVuY29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke1RZUEVfRVJST1J9JHtkZWZlcnJlZElkfTpbJHt2YWx1ZXN9XVxuYFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNlbnRJbmRleCA9IGVuY29kZXIuc3RyaW5naWZpZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVuY29kZXIuZGVmZXJyZWRbTnVtYmVyKGRlZmVycmVkSWQpXTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShPYmplY3QudmFsdWVzKGVuY29kZXIuZGVmZXJyZWQpKTtcbiAgICAgICAgfVxuICAgICAgICByYWNlRG9uZSgpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LnZhbHVlcyhlbmNvZGVyLmRlZmVycmVkKSk7XG4gICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlYWRhYmxlO1xufVxuXG4vLyBsaWIvZG9tL3Nzci9kYXRhLnRzXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0SW5pdChyZXF1ZXN0KSB7XG4gIGxldCBpbml0ID0geyBzaWduYWw6IHJlcXVlc3Quc2lnbmFsIH07XG4gIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGluaXQubWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG4gICAgbGV0IGNvbnRlbnRUeXBlID0gcmVxdWVzdC5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKTtcbiAgICBpZiAoY29udGVudFR5cGUgJiYgL1xcYmFwcGxpY2F0aW9uXFwvanNvblxcYi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIGluaXQuaGVhZGVycyA9IHsgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUgfTtcbiAgICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlcXVlc3QuanNvbigpKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlICYmIC9cXGJ0ZXh0XFwvcGxhaW5cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICBpbml0LmhlYWRlcnMgPSB7IFwiQ29udGVudC1UeXBlXCI6IGNvbnRlbnRUeXBlIH07XG4gICAgICBpbml0LmJvZHkgPSBhd2FpdCByZXF1ZXN0LnRleHQoKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlICYmIC9cXGJhcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcYi8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIGluaXQuYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYXdhaXQgcmVxdWVzdC50ZXh0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0LmJvZHkgPSBhd2FpdCByZXF1ZXN0LmZvcm1EYXRhKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbml0O1xufVxuXG4vLyBsaWIvZG9tL3Nzci9tYXJrdXAudHNcbnZhciBFU0NBUEVfTE9PS1VQID0ge1xuICBcIiZcIjogXCJcXFxcdTAwMjZcIixcbiAgXCI+XCI6IFwiXFxcXHUwMDNlXCIsXG4gIFwiPFwiOiBcIlxcXFx1MDAzY1wiLFxuICBcIlxcdTIwMjhcIjogXCJcXFxcdTIwMjhcIixcbiAgXCJcXHUyMDI5XCI6IFwiXFxcXHUyMDI5XCJcbn07XG52YXIgRVNDQVBFX1JFR0VYID0gL1smPjxcXHUyMDI4XFx1MjAyOV0vZztcbmZ1bmN0aW9uIGVzY2FwZUh0bWwoaHRtbCkge1xuICByZXR1cm4gaHRtbC5yZXBsYWNlKEVTQ0FQRV9SRUdFWCwgKG1hdGNoKSA9PiBFU0NBUEVfTE9PS1VQW21hdGNoXSk7XG59XG5cbi8vIGxpYi9kb20vc3NyL2ludmFyaWFudC50c1xuZnVuY3Rpb24gaW52YXJpYW50Mih2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vLyBsaWIvZG9tL3Nzci9zaW5nbGUtZmV0Y2gudHN4XG52YXIgU2luZ2xlRmV0Y2hSZWRpcmVjdFN5bWJvbCA9IFN5bWJvbChcIlNpbmdsZUZldGNoUmVkaXJlY3RcIik7XG52YXIgU2luZ2xlRmV0Y2hOb1Jlc3VsdEVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG59O1xudmFyIFNJTkdMRV9GRVRDSF9SRURJUkVDVF9TVEFUVVMgPSAyMDI7XG52YXIgTk9fQk9EWV9TVEFUVVNfQ09ERVMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbMTAwLCAxMDEsIDIwNCwgMjA1XSk7XG5mdW5jdGlvbiBTdHJlYW1UcmFuc2Zlcih7XG4gIGNvbnRleHQsXG4gIGlkZW50aWZpZXIsXG4gIHJlYWRlcixcbiAgdGV4dERlY29kZXIsXG4gIG5vbmNlXG59KSB7XG4gIGlmICghY29udGV4dC5yZW5kZXJNZXRhIHx8ICFjb250ZXh0LnJlbmRlck1ldGEuZGlkUmVuZGVyU2NyaXB0cykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghY29udGV4dC5yZW5kZXJNZXRhLnN0cmVhbUNhY2hlKSB7XG4gICAgY29udGV4dC5yZW5kZXJNZXRhLnN0cmVhbUNhY2hlID0ge307XG4gIH1cbiAgbGV0IHsgc3RyZWFtQ2FjaGUgfSA9IGNvbnRleHQucmVuZGVyTWV0YTtcbiAgbGV0IHByb21pc2UgPSBzdHJlYW1DYWNoZVtpZGVudGlmaWVyXTtcbiAgaWYgKCFwcm9taXNlKSB7XG4gICAgcHJvbWlzZSA9IHN0cmVhbUNhY2hlW2lkZW50aWZpZXJdID0gcmVhZGVyLnJlYWQoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHN0cmVhbUNhY2hlW2lkZW50aWZpZXJdLnJlc3VsdCA9IHtcbiAgICAgICAgZG9uZTogcmVzdWx0LmRvbmUsXG4gICAgICAgI
25114HZhbHVlOiB0ZXh0RGVjb2Rlci5kZWNvZGUocmVzdWx0LnZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KVxuICAgICAgfTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgc3RyZWFtQ2FjaGVbaWRlbnRpZmllcl0uZXJyb3IgPSBlO1xuICAgIH0pO1xuICB9XG4gIGlmIChwcm9taXNlLmVycm9yKSB7XG4gICAgdGhyb3cgcHJvbWlzZS5lcnJvcjtcbiAgfVxuICBpZiAocHJvbWlzZS5yZXN1bHQgPT09IHZvaWQgMCkge1xuICAgIHRocm93IHByb21pc2U7XG4gIH1cbiAgbGV0IHsgZG9uZSwgdmFsdWUgfSA9IHByb21pc2UucmVzdWx0O1xuICBsZXQgc2NyaXB0VGFnID0gdmFsdWUgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q0LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJzY3JpcHRcIixcbiAgICB7XG4gICAgICBub25jZSxcbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgIF9faHRtbDogYHdpbmRvdy5fX3JlYWN0Um91dGVyQ29udGV4dC5zdHJlYW1Db250cm9sbGVyLmVucXVldWUoJHtlc2NhcGVIdG1sKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICApfSk7YFxuICAgICAgfVxuICAgIH1cbiAgKSA6IG51bGw7XG4gIGlmIChkb25lKSB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDQuY3JlYXRlRWxlbWVudChSZWFjdDQuRnJhZ21lbnQsIG51bGwsIHNjcmlwdFRhZywgLyogQF9fUFVSRV9fICovIFJlYWN0NC5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJzY3JpcHRcIixcbiAgICAgIHtcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgX19odG1sOiBgd2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0LnN0cmVhbUNvbnRyb2xsZXIuY2xvc2UoKTtgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0NC5jcmVhdGVFbGVtZW50KFJlYWN0NC5GcmFnbWVudCwgbnVsbCwgc2NyaXB0VGFnLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q0LmNyZWF0ZUVsZW1lbnQoUmVhY3Q0LlN1c3BlbnNlLCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBTdHJlYW1UcmFuc2ZlcixcbiAgICAgIHtcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllciArIDEsXG4gICAgICAgIHJlYWRlcixcbiAgICAgICAgdGV4dERlY29kZXIsXG4gICAgICAgIG5vbmNlXG4gICAgICB9XG4gICAgKSkpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUdXJib1N0cmVhbVNpbmdsZUZldGNoRGF0YVN0cmF0ZWd5KGdldFJvdXRlciwgbWFuaWZlc3QsIHJvdXRlTW9kdWxlcywgc3NyLCBiYXNlbmFtZSkge1xuICBsZXQgZGF0YVN0cmF0ZWd5ID0gZ2V0U2luZ2xlRmV0Y2hEYXRhU3RyYXRlZ3lJbXBsKFxuICAgIGdldFJvdXRlcixcbiAgICAobWF0Y2gpID0+IHtcbiAgICAgIGxldCBtYW5pZmVzdFJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGludmFyaWFudDIobWFuaWZlc3RSb3V0ZSwgXCJSb3V0ZSBub3QgZm91bmQgaW4gbWFuaWZlc3RcIik7XG4gICAgICBsZXQgcm91dGVNb2R1bGUgPSByb3V0ZU1vZHVsZXNbbWF0Y2gucm91dGUuaWRdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzTG9hZGVyOiBtYW5pZmVzdFJvdXRlLmhhc0xvYWRlcixcbiAgICAgICAgaGFzQ2xpZW50TG9hZGVyOiBtYW5pZmVzdFJvdXRlLmhhc0NsaWVudExvYWRlcixcbiAgICAgICAgaGFzU2hvdWxkUmV2YWxpZGF0ZTogQm9vbGVhbihyb3V0ZU1vZHVsZT8uc2hvdWxkUmV2YWxpZGF0ZSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBmZXRjaEFuZERlY29kZVZpYVR1cmJvU3RyZWFtLFxuICAgIHNzcixcbiAgICBiYXNlbmFtZVxuICApO1xuICByZXR1cm4gYXN5bmMgKGFyZ3MpID0+IGFyZ3MucnVuQ2xpZW50TWlkZGxld2FyZShkYXRhU3RyYXRlZ3kpO1xufVxuZnVuY3Rpb24gZ2V0U2luZ2xlRmV0Y2hEYXRhU3RyYXRlZ3lJbXBsKGdldFJvdXRlciwgZ2V0Um91dGVJbmZvLCBmZXRjaEFuZERlY29kZSwgc3NyLCBiYXNlbmFtZSwgc2hvdWxkQWxsb3dPcHRPdXQgPSAoKSA9PiB0cnVlKSB7XG4gIHJldHVybiBhc3luYyAoYXJncykgPT4ge1xuICAgIGxldCB7IHJlcXVlc3QsIG1hdGNoZXMsIGZldGNoZXJLZXkgfSA9IGFyZ3M7XG4gICAgbGV0IHJvdXRlciA9IGdldFJvdXRlcigpO1xuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIHNpbmdsZUZldGNoQWN0aW9uU3RyYXRlZ3koYXJncywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kUmV2YWxpZGF0aW5nU2VydmVyTG9hZGVyID0gbWF0Y2hlcy5zb21lKChtKSA9PiB7XG4gICAgICBsZXQgeyBoYXNMb2FkZXIsIGhhc0NsaWVudExvYWRlciB9ID0gZ2V0Um91dGVJbmZvKG0pO1xuICAgICAgcmV0dXJuIG0udW5zdGFibGVfc2hvdWxkQ2FsbEhhbmRsZXIoKSAmJiBoYXNMb2FkZXIgJiYgIWhhc0NsaWVudExvYWRlcjtcbiAgICB9KTtcbiAgICBpZiAoIXNzciAmJiAhZm91bmRSZXZhbGlkYXRpbmdTZXJ2ZXJMb2FkZXIpIHtcbiAgICAgIHJldHVybiBub25Tc3JTdHJhdGVneShhcmdzLCBnZXRSb3V0ZUluZm8sIGZldGNoQW5kRGVjb2RlLCBiYXNlbmFtZSk7XG4gICAgfVxuICAgIGlmIChmZXRjaGVyS2V5KSB7XG4gICAgICByZXR1cm4gc2luZ2xlRmV0Y2hMb2FkZXJGZXRjaGVyU3RyYXRlZ3koYXJncywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbmdsZUZldGNoTG9hZGVyTmF2aWdhdGlvblN0cmF0ZWd5KFxuICAgICAgYXJncyxcbiAgICAgIHJvdXRlcixcbiAgICAgIGdldFJvdXRlSW5mbyxcbiAgICAgIGZldGNoQW5kRGVjb2RlLFxuICAgICAgc3NyLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICBzaG91bGRBbGxvd09wdE91dFxuICAgICk7XG4gIH07XG59XG5hc3luYyBmdW5jdGlvbiBzaW5nbGVGZXRjaEFjdGlvblN0cmF0ZWd5KGFyZ3MsIGZldGNoQW5kRGVjb2RlLCBiYXNlbmFtZSkge1xuICBsZXQgYWN0aW9uTWF0Y2ggPSBhcmdzLm1hdGNoZXMuZmluZCgobSkgPT4gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcigpKTtcbiAgaW52YXJpYW50MihhY3Rpb25NYXRjaCwgXCJObyBhY3Rpb24gbWF0Y2ggZm91bmRcIik7XG4gIGxldCBhY3Rpb25TdGF0dXMgPSB2b2lkIDA7XG4gIGxldCByZXN1bHQgPSBhd2FpdCBhY3Rpb25NYXRjaC5yZXNvbHZlKGFzeW5jIChoYW5kbGVyKSA9PiB7XG4gICAgbGV0IHJlc3VsdDIgPSBhd2FpdCBoYW5kbGVyKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB7IGRhdGE6IGRhdGEyLCBzdGF0dXMgfSA9IGF3YWl0IGZldGNoQW5kRGVjb2RlKGFyZ3MsIGJhc2VuYW1lLCBbXG4gICAgICAgIGFjdGlvbk1hdGNoLnJvdXRlLmlkXG4gICAgICBdKTtcbiAgICAgIGFjdGlvblN0YXR1cyA9IHN0YXR1cztcbiAgICAgIHJldHVybi
25114B1bndyYXBTaW5nbGVGZXRjaFJlc3VsdChkYXRhMiwgYWN0aW9uTWF0Y2gucm91dGUuaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQyO1xuICB9KTtcbiAgaWYgKGlzUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkgfHwgaXNSb3V0ZUVycm9yUmVzcG9uc2UocmVzdWx0LnJlc3VsdCkgfHwgaXNEYXRhV2l0aFJlc3BvbnNlSW5pdChyZXN1bHQucmVzdWx0KSkge1xuICAgIHJldHVybiB7IFthY3Rpb25NYXRjaC5yb3V0ZS5pZF06IHJlc3VsdCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW2FjdGlvbk1hdGNoLnJvdXRlLmlkXToge1xuICAgICAgdHlwZTogcmVzdWx0LnR5cGUsXG4gICAgICByZXN1bHQ6IGRhdGEocmVzdWx0LnJlc3VsdCwgYWN0aW9uU3RhdHVzKVxuICAgIH1cbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIG5vblNzclN0cmF0ZWd5KGFyZ3MsIGdldFJvdXRlSW5mbywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKSB7XG4gIGxldCBtYXRjaGVzVG9Mb2FkID0gYXJncy5tYXRjaGVzLmZpbHRlcihcbiAgICAobSkgPT4gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcigpXG4gICk7XG4gIGxldCByZXN1bHRzID0ge307XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIG1hdGNoZXNUb0xvYWQubWFwKFxuICAgICAgKG0pID0+IG0ucmVzb2x2ZShhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB7IGhhc0NsaWVudExvYWRlciB9ID0gZ2V0Um91dGVJbmZvKG0pO1xuICAgICAgICAgIGxldCByb3V0ZUlkID0gbS5yb3V0ZS5pZDtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gaGFzQ2xpZW50TG9hZGVyID8gYXdhaXQgaGFuZGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBkYXRhOiBkYXRhMiB9ID0gYXdhaXQgZmV0Y2hBbmREZWNvZGUoYXJncywgYmFzZW5hbWUsIFtyb3V0ZUlkXSk7XG4gICAgICAgICAgICByZXR1cm4gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQoZGF0YTIsIHJvdXRlSWQpO1xuICAgICAgICAgIH0pIDogYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgIHJlc3VsdHNbbS5yb3V0ZS5pZF0gPSB7IHR5cGU6IFwiZGF0YVwiLCByZXN1bHQgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlc3VsdHNbbS5yb3V0ZS5pZF0gPSB7IHR5cGU6IFwiZXJyb3JcIiwgcmVzdWx0OiBlIH07XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVzdWx0cztcbn1cbmFzeW5jIGZ1bmN0aW9uIHNpbmdsZUZldGNoTG9hZGVyTmF2aWdhdGlvblN0cmF0ZWd5KGFyZ3MsIHJvdXRlciwgZ2V0Um91dGVJbmZvLCBmZXRjaEFuZERlY29kZSwgc3NyLCBiYXNlbmFtZSwgc2hvdWxkQWxsb3dPcHRPdXQgPSAoKSA9PiB0cnVlKSB7XG4gIGxldCByb3V0ZXNQYXJhbXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgZm91bmRPcHRPdXRSb3V0ZSA9IGZhbHNlO1xuICBsZXQgcm91dGVEZmRzID0gYXJncy5tYXRjaGVzLm1hcCgoKSA9PiBjcmVhdGVEZWZlcnJlZDIoKSk7XG4gIGxldCBzaW5nbGVGZXRjaERmZCA9IGNyZWF0ZURlZmVycmVkMigpO1xuICBsZXQgcmVzdWx0cyA9IHt9O1xuICBsZXQgcmVzb2x2ZVByb21pc2UgPSBQcm9taXNlLmFsbChcbiAgICBhcmdzLm1hdGNoZXMubWFwKFxuICAgICAgYXN5bmMgKG0sIGkpID0+IG0ucmVzb2x2ZShhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICByb3V0ZURmZHNbaV0ucmVzb2x2ZSgpO1xuICAgICAgICBsZXQgcm91dGVJZCA9IG0ucm91dGUuaWQ7XG4gICAgICAgIGxldCB7IGhhc0xvYWRlciwgaGFzQ2xpZW50TG9hZGVyLCBoYXNTaG91bGRSZXZhbGlkYXRlIH0gPSBnZXRSb3V0ZUluZm8obSk7XG4gICAgICAgIGxldCBkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZSA9ICFtLnVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzIHx8IG0udW5zdGFibGVfc2hvdWxkUmV2YWxpZGF0ZUFyZ3MuYWN0aW9uU3RhdHVzID09IG51bGwgfHwgbS51bnN0YWJsZV9zaG91bGRSZXZhbGlkYXRlQXJncy5hY3Rpb25TdGF0dXMgPCA0MDA7XG4gICAgICAgIGxldCBzaG91bGRDYWxsID0gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcihkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZSk7XG4gICAgICAgIGlmICghc2hvdWxkQ2FsbCkge1xuICAgICAgICAgIGZvdW5kT3B0T3V0Um91dGUgfHwgKGZvdW5kT3B0T3V0Um91dGUgPSBtLnVuc3RhYmxlX3Nob3VsZFJldmFsaWRhdGVBcmdzICE9IG51bGwgJiYgLy8gVGhpcyBpcyBhIHJldmFsaWRhdGlvbixcbiAgICAgICAgICBoYXNMb2FkZXIgJiYgLy8gZm9yIGEgcm91dGUgd2l0aCBhIHNlcnZlciBsb2FkZXIsXG4gICAgICAgICAgaGFzU2hvdWxkUmV2YWxpZGF0ZSA9PT0gdHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRBbGxvd09wdE91dChtKSAmJiBoYXNDbGllbnRMb2FkZXIpIHtcbiAgICAgICAgICBpZiAoaGFzTG9hZGVyKSB7XG4gICAgICAgICAgICBmb3VuZE9wdE91dFJvdXRlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YTogZGF0YTIgfSA9IGF3YWl0IGZldGNoQW5kRGVjb2RlKGFyZ3MsIGJhc2VuYW1lLCBbcm91dGVJZF0pO1xuICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQoZGF0YTIsIHJvdXRlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHRzW3JvdXRlSWRdID0geyB0eXBlOiBcImRhdGFcIiwgcmVzdWx0IH07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0c1tyb3V0ZUlkXSA9IHsgdHlwZTogXCJlcnJvclwiLCByZXN1bHQ6IGUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNMb2FkZXIpIHtcbiAgICAgICAgICByb3V0ZXNQYXJhbXMuYWRkKHJvdXRlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEyID0gYXdhaXQgc2luZ2xlRmV0Y2hEZmQucHJvbWlzZTtcbiAgICAgICAgICAgI
25114HJldHVybiB1bndyYXBTaW5nbGVGZXRjaFJlc3VsdChkYXRhMiwgcm91dGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0c1tyb3V0ZUlkXSA9IHsgdHlwZTogXCJkYXRhXCIsIHJlc3VsdCB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVzdWx0c1tyb3V0ZUlkXSA9IHsgdHlwZTogXCJlcnJvclwiLCByZXN1bHQ6IGUgfTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG4gICk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHJvdXRlRGZkcy5tYXAoKGQpID0+IGQucHJvbWlzZSkpO1xuICBsZXQgaXNJbml0aWFsTG9hZCA9ICFyb3V0ZXIuc3RhdGUuaW5pdGlhbGl6ZWQgJiYgcm91dGVyLnN0YXRlLm5hdmlnYXRpb24uc3RhdGUgPT09IFwiaWRsZVwiO1xuICBpZiAoKGlzSW5pdGlhbExvYWQgfHwgcm91dGVzUGFyYW1zLnNpemUgPT09IDApICYmICF3aW5kb3cuX19yZWFjdFJvdXRlckhkckFjdGl2ZSkge1xuICAgIHNpbmdsZUZldGNoRGZkLnJlc29sdmUoeyByb3V0ZXM6IHt9IH0pO1xuICB9IGVsc2Uge1xuICAgIGxldCB0YXJnZXRSb3V0ZXMgPSBzc3IgJiYgZm91bmRPcHRPdXRSb3V0ZSAmJiByb3V0ZXNQYXJhbXMuc2l6ZSA+IDAgPyBbLi4ucm91dGVzUGFyYW1zLmtleXMoKV0gOiB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhMiA9IGF3YWl0IGZldGNoQW5kRGVjb2RlKGFyZ3MsIGJhc2VuYW1lLCB0YXJnZXRSb3V0ZXMpO1xuICAgICAgc2luZ2xlRmV0Y2hEZmQucmVzb2x2ZShkYXRhMi5kYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaW5nbGVGZXRjaERmZC5yZWplY3QoZSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHJlc29sdmVQcm9taXNlO1xuICBhd2FpdCBidWJibGVNaWRkbGV3YXJlRXJyb3JzKFxuICAgIHNpbmdsZUZldGNoRGZkLnByb21pc2UsXG4gICAgYXJncy5tYXRjaGVzLFxuICAgIHJvdXRlc1BhcmFtcyxcbiAgICByZXN1bHRzXG4gICk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuYXN5bmMgZnVuY3Rpb24gYnViYmxlTWlkZGxld2FyZUVycm9ycyhzaW5nbGVGZXRjaFByb21pc2UsIG1hdGNoZXMsIHJvdXRlc1BhcmFtcywgcmVzdWx0cykge1xuICB0cnkge1xuICAgIGxldCBtaWRkbGV3YXJlRXJyb3I7XG4gICAgbGV0IGZldGNoZWREYXRhID0gYXdhaXQgc2luZ2xlRmV0Y2hQcm9taXNlO1xuICAgIGlmIChcInJvdXRlc1wiIGluIGZldGNoZWREYXRhKSB7XG4gICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgIGlmIChtYXRjaC5yb3V0ZS5pZCBpbiBmZXRjaGVkRGF0YS5yb3V0ZXMpIHtcbiAgICAgICAgICBsZXQgcm91dGVSZXN1bHQgPSBmZXRjaGVkRGF0YS5yb3V0ZXNbbWF0Y2gucm91dGUuaWRdO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcm91dGVSZXN1bHQpIHtcbiAgICAgICAgICAgIG1pZGRsZXdhcmVFcnJvciA9IHJvdXRlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgaWYgKHJlc3VsdHNbbWF0Y2gucm91dGUuaWRdPy5yZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXN1bHRzW21hdGNoLnJvdXRlLmlkXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBtaWRkbGV3YXJlRXJyb3JcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWlkZGxld2FyZUVycm9yICE9PSB2b2lkIDApIHtcbiAgICAgIEFycmF5LmZyb20ocm91dGVzUGFyYW1zLnZhbHVlcygpKS5mb3JFYWNoKChyb3V0ZUlkKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzW3JvdXRlSWRdLnJlc3VsdCBpbnN0YW5jZW9mIFNpbmdsZUZldGNoTm9SZXN1bHRFcnJvcikge1xuICAgICAgICAgIHJlc3VsdHNbcm91dGVJZF0ucmVzdWx0ID0gbWlkZGxld2FyZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gc2luZ2xlRmV0Y2hMb2FkZXJGZXRjaGVyU3RyYXRlZ3koYXJncywgZmV0Y2hBbmREZWNvZGUsIGJhc2VuYW1lKSB7XG4gIGxldCBmZXRjaGVyTWF0Y2ggPSBhcmdzLm1hdGNoZXMuZmluZCgobSkgPT4gbS51bnN0YWJsZV9zaG91bGRDYWxsSGFuZGxlcigpKTtcbiAgaW52YXJpYW50MihmZXRjaGVyTWF0Y2gsIFwiTm8gZmV0Y2hlciBtYXRjaCBmb3VuZFwiKTtcbiAgbGV0IHJvdXRlSWQgPSBmZXRjaGVyTWF0Y2gucm91dGUuaWQ7XG4gIGxldCByZXN1bHQgPSBhd2FpdCBmZXRjaGVyTWF0Y2gucmVzb2x2ZShcbiAgICBhc3luYyAoaGFuZGxlcikgPT4gaGFuZGxlcihhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgeyBkYXRhOiBkYXRhMiB9ID0gYXdhaXQgZmV0Y2hBbmREZWNvZGUoYXJncywgYmFzZW5hbWUsIFtyb3V0ZUlkXSk7XG4gICAgICByZXR1cm4gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQoZGF0YTIsIHJvdXRlSWQpO1xuICAgIH0pXG4gICk7XG4gIHJldHVybiB7IFtmZXRjaGVyTWF0Y2gucm91dGUuaWRdOiByZXN1bHQgfTtcbn1cbmZ1bmN0aW9uIHN0cmlwSW5kZXhQYXJhbSh1cmwpIHtcbiAgbGV0IGluZGV4VmFsdWVzID0gdXJsLnNlYXJjaFBhcmFtcy5nZXRBbGwoXCJpbmRleFwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoXCJpbmRleFwiKTtcbiAgbGV0IGluZGV4VmFsdWVzVG9LZWVwID0gW107XG4gIGZvciAobGV0IGluZGV4VmFsdWUgb2YgaW5kZXhWYWx1ZXMpIHtcbiAgICBpZiAoaW5kZXhWYWx1ZSkge1xuICAgICAgaW5kZXhWYWx1ZXNUb0tlZXAucHVzaChpbmRleFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZm9yIChsZXQgdG9LZWVwIG9mIGluZGV4VmFsdWVzVG9LZWVwKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJpbmRleFwiLCB0b0tlZXApO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5mdW5jdGlvbiBzaW5nbGVGZXRjaFVybChyZXFVcmwsIGJhc2VuYW1lLCBleHRlbnNpb24pIHtcbiAgbGV0IHVybCA9IHR5cGVvZiByZXFVcmwgPT09IFwic3RyaW5nXCIgPyBuZXcgVVJMKFxuICAgIHJlcVVybCxcbiAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgZHVyaW5nIHRoZSBTU1IgZmxvdyB2aWEgUHJlZmV0Y2hQYWdlTGlua3NJbXBsIHNvXG4gICAgLy8gZG9uJ3QgYXNzdW1lIH
25114dpbmRvdyBpcyBhdmFpbGFibGVcbiAgICB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJzZXJ2ZXI6Ly9zaW5nbGVmZXRjaC9cIiA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgKSA6IHJlcVVybDtcbiAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICB1cmwucGF0aG5hbWUgPSBgX3Jvb3QuJHtleHRlbnNpb259YDtcbiAgfSBlbHNlIGlmIChiYXNlbmFtZSAmJiBzdHJpcEJhc2VuYW1lKHVybC5wYXRobmFtZSwgYmFzZW5hbWUpID09PSBcIi9cIikge1xuICAgIHVybC5wYXRobmFtZSA9IGAke2Jhc2VuYW1lLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vX3Jvb3QuJHtleHRlbnNpb259YDtcbiAgfSBlbHNlIHtcbiAgICB1cmwucGF0aG5hbWUgPSBgJHt1cmwucGF0aG5hbWUucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS4ke2V4dGVuc2lvbn1gO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5hc3luYyBmdW5jdGlvbiBmZXRjaEFuZERlY29kZVZpYVR1cmJvU3RyZWFtKGFyZ3MsIGJhc2VuYW1lLCB0YXJnZXRSb3V0ZXMpIHtcbiAgbGV0IHsgcmVxdWVzdCB9ID0gYXJncztcbiAgbGV0IHVybCA9IHNpbmdsZUZldGNoVXJsKHJlcXVlc3QudXJsLCBiYXNlbmFtZSwgXCJkYXRhXCIpO1xuICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICB1cmwgPSBzdHJpcEluZGV4UGFyYW0odXJsKTtcbiAgICBpZiAodGFyZ2V0Um91dGVzKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcIl9yb3V0ZXNcIiwgdGFyZ2V0Um91dGVzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG4gIH1cbiAgbGV0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgYXdhaXQgY3JlYXRlUmVxdWVzdEluaXQocmVxdWVzdCkpO1xuICBpZiAocmVzLnN0YXR1cyA+PSA0MDAgJiYgIXJlcy5oZWFkZXJzLmhhcyhcIlgtUmVtaXgtUmVzcG9uc2VcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JSZXNwb25zZUltcGwocmVzLnN0YXR1cywgcmVzLnN0YXR1c1RleHQsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICB9XG4gIGlmIChyZXMuc3RhdHVzID09PSAyMDQgJiYgcmVzLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZWRpcmVjdFwiKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFNJTkdMRV9GRVRDSF9SRURJUkVDVF9TVEFUVVMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlZGlyZWN0OiB7XG4gICAgICAgICAgcmVkaXJlY3Q6IHJlcy5oZWFkZXJzLmdldChcIlgtUmVtaXgtUmVkaXJlY3RcIiksXG4gICAgICAgICAgc3RhdHVzOiBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KFwiWC1SZW1peC1TdGF0dXNcIikgfHwgXCIzMDJcIiksXG4gICAgICAgICAgcmV2YWxpZGF0ZTogcmVzLmhlYWRlcnMuZ2V0KFwiWC1SZW1peC1SZXZhbGlkYXRlXCIpID09PSBcInRydWVcIixcbiAgICAgICAgICByZWxvYWQ6IHJlcy5oZWFkZXJzLmdldChcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCIpID09PSBcInRydWVcIixcbiAgICAgICAgICByZXBsYWNlOiByZXMuaGVhZGVycy5nZXQoXCJYLVJlbWl4LVJlcGxhY2VcIikgPT09IFwidHJ1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGlmIChOT19CT0RZX1NUQVRVU19DT0RFUy5oYXMocmVzLnN0YXR1cykpIHtcbiAgICBsZXQgcm91dGVzID0ge307XG4gICAgaWYgKHRhcmdldFJvdXRlcyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgICAgcm91dGVzW3RhcmdldFJvdXRlc1swXV0gPSB7IGRhdGE6IHZvaWQgMCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgZGF0YTogeyByb3V0ZXMgfVxuICAgIH07XG4gIH1cbiAgaW52YXJpYW50MihyZXMuYm9keSwgXCJObyByZXNwb25zZSBib2R5IHRvIGRlY29kZVwiKTtcbiAgdHJ5IHtcbiAgICBsZXQgZGVjb2RlZCA9IGF3YWl0IGRlY29kZVZpYVR1cmJvU3RyZWFtKHJlcy5ib2R5LCB3aW5kb3cpO1xuICAgIGxldCBkYXRhMjtcbiAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGxldCB0eXBlZCA9IGRlY29kZWQudmFsdWU7XG4gICAgICBpZiAoU2luZ2xlRmV0Y2hSZWRpcmVjdFN5bWJvbCBpbiB0eXBlZCkge1xuICAgICAgICBkYXRhMiA9IHsgcmVkaXJlY3Q6IHR5cGVkW1NpbmdsZUZldGNoUmVkaXJlY3RTeW1ib2xdIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhMiA9IHsgcm91dGVzOiB0eXBlZCB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdHlwZWQgPSBkZWNvZGVkLnZhbHVlO1xuICAgICAgbGV0IHJvdXRlSWQgPSB0YXJnZXRSb3V0ZXM/LlswXTtcbiAgICAgIGludmFyaWFudDIocm91dGVJZCwgXCJObyByb3V0ZUlkIGZvdW5kIGZvciBzaW5nbGUgZmV0Y2ggY2FsbCBkZWNvZGluZ1wiKTtcbiAgICAgIGlmIChcInJlZGlyZWN0XCIgaW4gdHlwZWQpIHtcbiAgICAgICAgZGF0YTIgPSB7IHJlZGlyZWN0OiB0eXBlZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YTIgPSB7IHJvdXRlczogeyBbcm91dGVJZF06IHR5cGVkIH0gfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBkYXRhOiBkYXRhMiB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGRlY29kZSB0dXJiby1zdHJlYW0gcmVzcG9uc2VcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlY29kZVZpYVR1cmJvU3RyZWFtKGJvZHksIGdsb2JhbCkge1xuICByZXR1cm4gZGVjb2RlKGJvZHksIHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAodHlwZSwgLi4ucmVzdCkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJTYW5pdGl6ZWRFcnJvclwiKSB7XG4gICAgICAgICAgbGV0IFtuYW1lLCBtZXNzYWdlLCBzdGFja10gPSByZXN0O1xuICAgICAgICAgIGxldCBDb25zdHJ1Y3RvciA9IEVycm9yO1xuICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgaW4gZ2xvYmFsICYmIHR5cGVvZiBnbG9iYWxbbmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgQ29uc3RydWN0b3IgPSBnbG9iYWxbbmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBDb25zdHJ1Y3RvcihtZXNzYWdlKTtcbiAgICAgICAgICBlcnJvci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgI
25114HJldHVybiB7IHZhbHVlOiBlcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcIkVycm9yUmVzcG9uc2VcIikge1xuICAgICAgICAgIGxldCBbZGF0YTIsIHN0YXR1cywgc3RhdHVzVGV4dF0gPSByZXN0O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IEVycm9yUmVzcG9uc2VJbXBsKHN0YXR1cywgc3RhdHVzVGV4dCwgZGF0YTIpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJTaW5nbGVGZXRjaFJlZGlyZWN0XCIpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogeyBbU2luZ2xlRmV0Y2hSZWRpcmVjdFN5bWJvbF06IHJlc3RbMF0gfSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcIlNpbmdsZUZldGNoQ2xhc3NJbnN0YW5jZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3RbMF0gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJTaW5nbGVGZXRjaEZhbGxiYWNrXCIpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdm9pZCAwIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH0pO1xufVxuZnVuY3Rpb24gdW53cmFwU2luZ2xlRmV0Y2hSZXN1bHQocmVzdWx0LCByb3V0ZUlkKSB7XG4gIGlmIChcInJlZGlyZWN0XCIgaW4gcmVzdWx0KSB7XG4gICAgbGV0IHtcbiAgICAgIHJlZGlyZWN0OiBsb2NhdGlvbixcbiAgICAgIHJldmFsaWRhdGUsXG4gICAgICByZWxvYWQsXG4gICAgICByZXBsYWNlOiByZXBsYWNlMixcbiAgICAgIHN0YXR1c1xuICAgIH0gPSByZXN1bHQucmVkaXJlY3Q7XG4gICAgdGhyb3cgcmVkaXJlY3QobG9jYXRpb24sIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLy8gVGhyZWUgUidzIG9mIHJlZGlyZWN0aW5nIChsb2wgVmVlcClcbiAgICAgICAgLi4ucmV2YWxpZGF0ZSA/IHsgXCJYLVJlbWl4LVJldmFsaWRhdGVcIjogXCJ5ZXNcIiB9IDogbnVsbCxcbiAgICAgICAgLi4ucmVsb2FkID8geyBcIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50XCI6IFwieWVzXCIgfSA6IG51bGwsXG4gICAgICAgIC4uLnJlcGxhY2UyID8geyBcIlgtUmVtaXgtUmVwbGFjZVwiOiBcInllc1wiIH0gOiBudWxsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgbGV0IHJvdXRlUmVzdWx0ID0gcmVzdWx0LnJvdXRlc1tyb3V0ZUlkXTtcbiAgaWYgKHJvdXRlUmVzdWx0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgU2luZ2xlRmV0Y2hOb1Jlc3VsdEVycm9yKFxuICAgICAgYE5vIHJlc3VsdCBmb3VuZCBmb3Igcm91dGVJZCBcIiR7cm91dGVJZH1cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKFwiZXJyb3JcIiBpbiByb3V0ZVJlc3VsdCkge1xuICAgIHRocm93IHJvdXRlUmVzdWx0LmVycm9yO1xuICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIHJvdXRlUmVzdWx0KSB7XG4gICAgcmV0dXJuIHJvdXRlUmVzdWx0LmRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlc3BvbnNlIGZvdW5kIGZvciByb3V0ZUlkIFwiJHtyb3V0ZUlkfVwiYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkMigpIHtcbiAgbGV0IHJlc29sdmU7XG4gIGxldCByZWplY3Q7XG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IGFzeW5jICh2YWwpID0+IHtcbiAgICAgIHJlcyh2YWwpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlamVjdCA9IGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgcmVqKGVycm9yKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZSxcbiAgICAvL0B0cy1pZ25vcmVcbiAgICByZXNvbHZlLFxuICAgIC8vQHRzLWlnbm9yZVxuICAgIHJlamVjdFxuICB9O1xufVxuXG4vLyBsaWIvZG9tL3Nzci9lcnJvckJvdW5kYXJpZXMudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDkgZnJvbSBcInJlYW
25114N0XCI7XG5cbi8vIGxpYi9kb20vc3NyL2NvbXBvbmVudHMudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDggZnJvbSBcInJlYWN0XCI7XG5cbi8vIGxpYi9kb20vc3NyL3JvdXRlTW9kdWxlcy50c1xuYXN5bmMgZnVuY3Rpb24gbG9hZFJvdXRlTW9kdWxlKHJvdXRlLCByb3V0ZU1vZHVsZXNDYWNoZSkge1xuICBpZiAocm91dGUuaWQgaW4gcm91dGVNb2R1bGVzQ2FjaGUpIHtcbiAgICByZXR1cm4gcm91dGVNb2R1bGVzQ2FjaGVbcm91dGUuaWRdO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHJvdXRlTW9kdWxlID0gYXdhaXQgaW1wb3J0KFxuICAgICAgLyogQHZpdGUtaWdub3JlICovXG4gICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICByb3V0ZS5tb2R1bGVcbiAgICApO1xuICAgIHJvdXRlTW9kdWxlc0NhY2hlW3JvdXRlLmlkXSA9IHJvdXRlTW9kdWxlO1xuICAgIHJldHVybiByb3V0ZU1vZHVsZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYEVycm9yIGxvYWRpbmcgcm91dGUgbW9kdWxlIFxcYCR7cm91dGUubW9kdWxlfVxcYCwgcmVsb2FkaW5nIHBhZ2UuLi5gXG4gICAgKTtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICBpZiAod2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0ICYmIHdpbmRvdy5fX3JlYWN0Um91dGVyQ29udGV4dC5pc1NwYU1vZGUgJiYgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGltcG9ydC5tZXRhLmhvdCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIH0pO1xuICB9XG59XG5cbi8vIGxpYi9kb20vc3NyL2xpbmtzLnRzXG5mdW5jdGlvbiBnZXRLZXllZExpbmtzRm9yTWF0Y2hlcyhtYXRjaGVzLCByb3V0ZU1vZHVsZXMsIG1hbmlmZXN0KSB7XG4gIGxldCBkZXNjcmlwdG9ycyA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4ge1xuICAgIGxldCBtb2R1bGUgPSByb3V0ZU1vZHVsZXNbbWF0Y2gucm91dGUuaWRdO1xuICAgIGxldCByb3V0ZSA9IG1hbmlmZXN0LnJvdXRlc1ttYXRjaC5yb3V0ZS5pZF07XG4gICAgcmV0dXJuIFtcbiAgICAgIHJvdXRlICYmIHJvdXRlLmNzcyA/IHJvdXRlLmNzcy5tYXAoKGhyZWYpID0+ICh7IHJlbDogXCJzdHlsZXNoZWV0XCIsIGhyZWYgfSkpIDogW10sXG4gICAgICBtb2R1bGU/LmxpbmtzPy4oKSB8fCBbXVxuICAgIF07XG4gIH0pLmZsYXQoMik7XG4gIGxldCBwcmVsb2FkcyA9IGdldE1vZHVsZUxpbmtIcmVmcyhtYXRjaGVzLCBtYW5pZmVzdCk7XG4gIHJldHVybiBkZWR1cGVMaW5rRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIHByZWxvYWRzKTtcbn1cbmZ1bmN0aW9uIGdldFJvdXRlQ3NzRGVzY3JpcHRvcnMocm91dGUpIHtcbiAgaWYgKCFyb3V0ZS5jc3MpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJvdXRlLmNzcy5tYXAoKGhyZWYpID0+ICh7IHJlbDogXCJzdHlsZXNoZWV0XCIsIGhyZWYgfSkpO1xufVxuYXN5bmMgZnVuY3Rpb24gcHJlZmV0Y2hSb3V0ZUNzcyhyb3V0ZSkge1xuICBpZiAoIXJvdXRlLmNzcykgcmV0dXJuO1xuICBsZXQgZGVzY3JpcHRvcnMgPSBnZXRSb3V0ZUNzc0Rlc2NyaXB0b3JzKHJvdXRlKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoZGVzY3JpcHRvcnMubWFwKHByZWZldGNoU3R5bGVMaW5rKSk7XG59XG5hc3luYyBmdW5jdGlvbiBwcmVmZXRjaFN0eWxlTGlua3Mocm91dGUsIHJvdXRlTW9kdWxlKSB7XG4gIGlmICghcm91dGUuY3NzICYmICFyb3V0ZU1vZHVsZS5saW5rcyB8fCAhaXNQcmVsb2FkU3VwcG9ydGVkKCkpIHJldHVybjtcbiAgbGV0IGRlc2NyaXB0b3JzID0gW107XG4gIGlmIChyb3V0ZS5jc3MpIHtcbiAgICBkZXNjcmlwdG9ycy5wdXNoKC4uLmdldFJvdXRlQ3NzRGVzY3JpcHRvcnMocm91dGUpKTtcbiAgfVxuICBpZiAocm91dGVNb2R1bGUubGlua3MpIHtcbiAgICBkZXNjcmlwdG9ycy5wdXNoKC4uLnJvdXRlTW9kdWxlLmxpbmtzKCkpO1xuICB9XG4gIGlmIChkZXNjcmlwdG9ycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgbGV0IHN0eWxlTGlua3MgPSBbXTtcbiAgZm9yIChsZXQgZGVzY3JpcHRvciBvZiBkZXNjcmlwdG9ycykge1xuICAgIGlmICghaXNQYWdlTGlua0Rlc2NyaXB0b3IoZGVzY3JpcHRvcikgJiYgZGVzY3JpcHRvci
251145yZWwgPT09IFwic3R5bGVzaGVldFwiKSB7XG4gICAgICBzdHlsZUxpbmtzLnB1c2goe1xuICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICByZWw6IFwicHJlbG9hZFwiLFxuICAgICAgICBhczogXCJzdHlsZVwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoc3R5bGVMaW5rcy5tYXAocHJlZmV0Y2hTdHlsZUxpbmspKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHByZWZldGNoU3R5bGVMaW5rKGRlc2NyaXB0b3IpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IubWVkaWEgJiYgIXdpbmRvdy5tYXRjaE1lZGlhKGRlc2NyaXB0b3IubWVkaWEpLm1hdGNoZXMgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1baHJlZj1cIiR7ZGVzY3JpcHRvci5ocmVmfVwiXWBcbiAgICApKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH1cbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgIE9iamVjdC5hc3NpZ24obGluaywgZGVzY3JpcHRvcik7XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGluaygpIHtcbiAgICAgIGlmIChkb2N1bWVudC5oZWFkLmNvbnRhaW5zKGxpbmspKSB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICB9XG4gICAgfVxuICAgIGxpbmsub25sb2FkID0gKCkgPT4ge1xuICAgICAgcmVtb3ZlTGluaygpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgbGluay5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgcmVtb3ZlTGluaygpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1BhZ2VM
25114aW5rRGVzY3JpcHRvcihvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIHR5cGVvZiBvYmplY3QucGFnZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGlzSHRtbExpbmtEZXNjcmlwdG9yKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG9iamVjdC5ocmVmID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqZWN0LnJlbCA9PT0gXCJwcmVsb2FkXCIgJiYgdHlwZW9mIG9iamVjdC5pbWFnZVNyY1NldCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2Ygb2JqZWN0LmltYWdlU2l6ZXMgPT09IFwic3RyaW5nXCI7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QucmVsID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBvYmplY3QuaHJlZiA9PT0gXCJzdHJpbmdcIjtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEtleWVkUHJlZmV0Y2hMaW5rcyhtYXRjaGVzLCBtYW5pZmVzdCwgcm91dGVNb2R1bGVzKSB7XG4gIGxldCBsaW5rcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIG1hdGNoZXMubWFwKGFzeW5jIChtYXRjaCkgPT4ge1xuICAgICAgbGV0IHJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICBsZXQgbW9kID0gYXdhaXQgbG9hZFJvdXRlTW9kdWxlKHJvdXRlLCByb3V0ZU1vZHVsZXMpO1xuICAgICAgICByZXR1cm4gbW9kLmxpbmtzID8gbW9kLmxpbmtzKCkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICApO1xuICByZXR1cm4gZGVkdXBlTGlua0Rlc2NyaXB0b3JzKFxuICAgIGxpbmtzLmZsYXQoMSkuZmlsdGVyKGlzSHRtbExpbmtEZXNjcmlwdG9yKS5maWx0ZXIoKGxpbmspID0+IGxpbmsucmVsID09PSBcInN0eWxlc2hlZXRcIiB8fCBsaW5rLnJlbCA9PT0gXCJwcmVsb2FkXCIpLm1hcChcbiAgICAgIChsaW5rKSA9PiBsaW5rLnJlbCA9PT0gXCJzdHlsZXNoZWV0XCIgPyB7IC4uLmxpbmssIHJlbDogXCJwcmVmZXRjaFwiLCBhczogXCJzdHlsZVwiIH0gOiB7IC4uLmxpbmssIHJlbDogXCJwcmVmZXRjaFwiIH1cbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBnZXROZXdNYXRjaGVzRm9yTGlua3MocGFnZSwgbmV4dE1hdGNoZXMsIGN1cnJlbnRNYXRjaGVzLCBtYW5pZmVzdCwgbG9jYXRpb24sIG1vZGUpIHtcbiAgbGV0IGlzTmV3ID0gKG1hdGNoLCBpbmRleCkgPT4ge1xuICAgIGlmICghY3VycmVudE1hdGNoZXNbaW5kZXhdKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gbWF0Y2gucm91dGUuaWQgIT09IGN1cnJlbnRNYXRjaGVzW2luZGV4XS5yb3V0ZS5pZDtcbiAgfTtcbiAgbGV0IG1hdGNoUGF0aENoYW5nZWQgPSAobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIHBhcmFtIGNoYW5nZSwgL3VzZXJzLzEyMyAtPiAvdXNlcnMvNDU2XG4gICAgICBjdXJyZW50TWF0Y2hlc1tpbmRleF0ucGF0aG5hbWUgIT09IG1hdGNoLnBhdGhuYW1lIHx8IC8vIHNwbGF0IHBhcmFtIGNoYW5nZWQsIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIG1hdGNoLnBhdGhcbiAgICAgIC8vIGUuZy4gL2ZpbGVzL2ltYWdlcy9hdmF0YXIuanBnIC0+IGZpbGVzL2ZpbmFuY2VzLnhsc1xuICAgICAgY3VycmVudE1hdGNoZXNbaW5kZXhdLnJvdXRlLnBhdGg/LmVuZHNXaXRoKFwiKlwiKSAmJiBjdXJyZW50TWF0Y2hlc1tpbmRleF0ucGFyYW1zW1wiKlwiXSAhPT0gbWF0Y2gucGFyYW1zW1wiKlwiXVxuICAgICk7XG4gIH07XG4gIGlmIChtb2RlID09PSBcImFzc2V0c1wiKSB7XG4gICAgcmV0dXJuIG5leHRNYXRjaGVzLmZpbHRlcihcbiAgICAgIChtYXRjaCwgaW5kZXgpID0+IGlzTmV3KG1hdGNoLCBpbmRleCkgfHwgbWF0Y2hQYXRoQ2hhbmdlZChtYXRjaCwgaW5kZXgpXG4gICAgKTtcbiAgfVxuICBpZiAobW9kZSA9PT0gXCJkYXRhXCIpIHtcbiAgICByZXR1cm4gbmV4dE1hdGNoZXMuZmlsdGVyKChtYXRjaCwgaW5kZXgpID0+IHtcbiAgICAgIGxldCBtYW5pZmVzdFJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmICghbWFuaWZlc3RSb3V0ZSB8fCAhbWFuaWZlc3RSb3V0ZS5oYXNMb2FkZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzTmV3KG1hdGNoLCBpbmRleCkgfHwgbWF0Y2hQYXRoQ2hhbmdlZChtYXRjaCwgaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG1hdGNoLnJvdXRlLnNob3VsZFJldmFsaWRhdGUpIHtcbiAgICAgICAgbGV0IHJvdXRlQ2hvaWNlID0gbWF0Y2gucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSh7XG4gICAgICAgICAgY3VycmVudFVybDogbmV3IFVSTChcbiAgICAgICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoICsgbG9jYXRpb24uaGFzaCxcbiAgICAgICAgICAgIHdpbmRvdy5vcmlnaW5cbiAgICAgICAgICApLFxuICAgICAgICAgIGN1cnJlbnRQYXJhbXM6IGN1cnJlbnRNYXRjaGVzWzBdPy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgbmV4dFVybDogbmV3IFVSTChwYWdlLCB3aW5kb3cub3JpZ2luKSxcbiAgICAgICAgICBuZXh0UGFyYW1zOiBtYXRjaC5wYXJhbXMsXG4gICAgICAgICAgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm91dGVDaG9pY2UgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdXRlQ2hvaWNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW107XG59XG5mdW5jdGlvbiBnZXRNb2R1bGVMaW5rSHJlZnMobWF0Y2hlcywgbWFuaWZlc3QsIHsgaW5jbHVkZUh5ZHJhdGVGYWxsYmFjayB9ID0ge30pIHtcbiAgcmV0dXJuIGRlZHVwZUhyZWZzKFxuICAgIG1hdGNoZXMubWFwKChtYXRjaCkgPT4ge1xuICAgICAgbGV0IHJvdXRlID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGlmICghcm91dGUpIHJldHVybiBbXTtcbiAgICAgIGxldCBocmVmcyA9IFtyb3V0ZS5tb2R1bGVdO1xuICAgICAgaWYgKHJvdXRlLmNsaWVudEFjdGlvbk1vZHVsZSkge1xuICAgICAgICBocmVmcyA9IGhyZWZzLmNvbmNhdChyb3V0ZS5jbGllbnRBY3Rpb25Nb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLmNsaWVudExvYWRlck1vZHVsZSkge1xuICAgICAgICBocmVmcyA9IGhyZWZzLmNvbmNhdChyb3V0ZS5jbGllbnRMb2FkZXJNb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKGluY2x1ZGVIeWRyYXRlRmFsbGJhY2sgJiYgcm91dGUuaHlkcmF0ZUZhbGxiYWNrTW9kdWxlKSB7XG4gICAgICAgIGhyZWZzID0gaHJlZnMuY29uY2F0KHJvdXRlLmh5ZHJhdGVGYWxsYmFja01vZHVsZSk7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUuaW1wb3J0cykge1xuICAgICAgICBocmVmcyA9IGhyZWZzLmNvbmNhdChyb3V0ZS5pbXBvcnRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybi
25114BocmVmcztcbiAgICB9KS5mbGF0KDEpXG4gICk7XG59XG5mdW5jdGlvbiBkZWR1cGVIcmVmcyhocmVmcykge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoaHJlZnMpXTtcbn1cbmZ1bmN0aW9uIHNvcnRLZXlzKG9iaikge1xuICBsZXQgc29ydGVkID0ge307XG4gIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KCk7XG4gIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgc29ydGVkW2tleV0gPSBvYmpba2V5XTtcbiAgfVxuICByZXR1cm4gc29ydGVkO1xufVxuZnVuY3Rpb24gZGVkdXBlTGlua0Rlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBwcmVsb2Fkcykge1xuICBsZXQgc2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IHByZWxvYWRzU2V0ID0gbmV3IFNldChwcmVsb2Fkcyk7XG4gIHJldHVybiBkZXNjcmlwdG9ycy5yZWR1Y2UoKGRlZHVwZWQsIGRlc2NyaXB0b3IpID0+IHtcbiAgICBsZXQgYWxyZWFkeU1vZHVsZVByZWxvYWQgPSBwcmVsb2FkcyAmJiAhaXNQYWdlTGlua0Rlc2NyaXB0b3IoZGVzY3JpcHRvcikgJiYgZGVzY3JpcHRvci5hcyA9PT0gXCJzY3JpcHRcIiAmJiBkZXNjcmlwdG9yLmhyZWYgJiYgcHJlbG9hZHNTZXQuaGFzKGRlc2NyaXB0b3IuaHJlZik7XG4gICAgaWYgKGFscmVhZHlNb2R1bGVQcmVsb2FkKSB7XG4gICAgICByZXR1cm4gZGVkdXBlZDtcbiAgICB9XG4gICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKGRlc2NyaXB0b3IpKTtcbiAgICBpZiAoIXNldC5oYXMoa2V5KSkge1xuICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgZGVkdXBlZC5wdXNoKHsga2V5LCBsaW5rOiBkZXNjcmlwdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVkdXBlZDtcbiAgfSwgW10pO1xufVxudmFyIF9pc1ByZWxvYWRTdXBwb3J0ZWQ7XG5mdW5jdGlvbiBpc1ByZWxvYWRTdXBwb3J0ZWQoKSB7XG4gIGlmIChfaXNQcmVsb2FkU3VwcG9ydGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gX2lzUHJlbG9hZFN1cHBvcnRlZDtcbiAgfVxuICBsZXQgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgX2lzUHJlbG9hZFN1cHBvcnRlZCA9IGVsLnJlbExpc3Quc3VwcG9ydHMoXCJwcmVsb2FkXCIpO1xuICBlbCA9IG51bGw7XG4gIHJldHVybiBfaXNQcmVsb2FkU3VwcG9ydGVkO1xufVxuXG4vLyBsaWIvZG9tL3Nzci9mb2ctb2Ytd2FyLnRzXG5pbXBvcnQgKiBhcyBSZWFjdDcgZnJvbSBcInJlYW
25114N0XCI7XG5cbi8vIGxpYi9kb20vc3NyL3JvdXRlcy50c3hcbmltcG9ydCAqIGFzIFJlYWN0NiBmcm9tIFwicmVhY3RcIjtcblxuLy8gbGliL2RvbS9zc3IvZmFsbGJhY2sudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDUgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBSZW1peFJvb3REZWZhdWx0SHlkcmF0ZUZhbGxiYWNrKCkge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0NS5jcmVhdGVFbGVtZW50KEJvdW5kYXJ5U2hlbGwsIHsgdGl0bGU6IFwiTG9hZGluZy4uLlwiLCByZW5kZXJTY3JpcHRzOiB0cnVlIH0sIEVOQUJMRV9ERVZfV0FSTklOR1MgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q1LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJzY3JpcHRcIixcbiAgICB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICBfX2h0bWw6IGBcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJcXHV7MUY0QkZ9IEhleSBkZXZlbG9wZXIgXFx1ezFGNDRCfS4gWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgXCIgK1xuICAgICAgICAgICAgICAgIFwid2hlbiB5b3VyIGFwcCBpcyBsb2FkaW5nIEpTIG1vZHVsZXMgYW5kL29yIHJ1bm5pbmcgXFxgY2xpZW50TG9hZGVyXFxgIFwiICtcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9ucy4gQ2hlY2sgb3V0IGh0dHBzOi8vcmVhY3Ryb3V0ZXIuY29tL3N0YXJ0L2ZyYW1ld29yay9yb3V0ZS1tb2R1bGUjaHlkcmF0ZWZhbGxiYWNrIFwiICtcbiAgICAgICAgICAgICAgICBcImZvciBtb3JlIGluZm9ybWF0aW9uLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBgXG4gICAgICB9XG4gICAgfVxuICApIDogbnVsbCk7XG59XG5cbi8vIGxpYi9kb20vc3NyL3JvdXRlcy50c3hcbmZ1bmN0aW9uIGdyb3VwUm91dGVzQnlQYXJlbnRJZChtYW5pZmVzdCkge1xuICBsZXQgcm91dGVzID0ge307XG4gIE9iamVjdC52YWx1ZXMobWFuaWZlc3QpLmZvckVhY2goKHJvdXRlKSA9PiB7XG4gICAgaWYgKHJvdXRlKSB7XG4gICAgICBsZXQgcGFyZW50SWQgPSByb3V0ZS5wYXJlbnRJZCB8fCBcIlwiO1xuICAgICAgaWYgKCFyb3V0ZXNbcGFyZW50SWRdKSB7XG4gICAgICAgIHJvdXRlc1twYXJlbnRJZF0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHJvdXRlc1twYXJlbnRJZF0ucHVzaChyb3V0ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJvdXRlcztcbn1cbmZ1bmN0aW9uIGdldFJvdXRlQ29tcG9uZW50cyhyb3V0ZSwgcm91dGVNb2R1bGUsIGlzU3BhTW9kZSkge1xuICBsZXQgQ29tcG9uZW50NCA9IGdldFJvdXRlTW9kdWxlQ29tcG9uZW50KHJvdXRlTW9kdWxlKTtcbiAgbGV0IEh5ZHJhdGVGYWxsYmFjayA9IHJvdXRlTW9kdWxlLkh5ZHJhdGVGYWxsYmFjayAmJiAoIWlzU3BhTW9kZSB8fCByb3V0ZS5pZCA9PT0gXCJyb290XCIpID8gcm91dGVNb2R1bGUuSHlkcmF0ZUZhbGxiYWNrIDogcm91dGUuaWQgPT09IFwicm9vdFwiID8gUmVtaXhSb290RGVmYXVsdEh5ZHJhdGVGYWxsYmFjayA6IHZvaWQgMDtcbiAgbGV0IEVycm9yQm91bmRhcnkgPSByb3V0ZU1vZHVsZS5FcnJvckJvdW5kYXJ5ID8gcm91dGVNb2R1bGUuRXJyb3JCb3VuZGFyeSA6IHJvdXRlLmlkID09PSBcInJvb3RcIiA/ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDYuY3JlYXRlRWxlbWVudChSZW1peFJvb3REZWZhdWx0RXJyb3JCb3VuZGFyeSwgeyBlcnJvcjogdXNlUm91dGVFcnJvcigpIH0pIDogdm9pZCAwO1xuICBpZiAocm91dGUuaWQgPT09IFwicm9vdFwiICYmIHJvdXRlTW9kdWxlLkxheW91dCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5Db21wb25lbnQ0ID8ge1xuICAgICAgICBlbGVtZW50OiAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQocm91dGVNb2R1bGUuTGF5b3V0LCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50NCwgbnVsbCkpXG4gICAgICB9IDogeyBDb21wb25lbnQ6IENvbXBvbmVudDQgfSxcbiAgICAgIC4uLkVycm9yQm91bmRhcnkgPyB7XG4gICAgICAgIGVycm9yRWxlbWVudDogLyogQF9fUFVSRV9fICovIFJlYWN0Ni5jcmVhdGVFbGVtZW50KHJvdXRlTW9kdWxlLkxheW91dCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0Ni5jcmVhdGVFbGVtZW50KEVycm9yQm91bmRhcnksIG51bGwpKVxuICAgICAgfSA6IHsgRXJyb3JCb3VuZGFyeSB9LFxuICAgICAgLi4uSHlkcmF0ZUZhbGxiYWNrID8ge1xuICAgICAgICBoeWRyYXRlRmFsbGJhY2tFbGVtZW50OiAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQocm91dGVNb2R1bGUuTGF5b3V0LCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q2LmNyZWF0ZUVsZW1lbnQoSHlkcmF0ZUZhbGxiYWNrLCBudWxsKSlcbiAgICAgIH0gOiB7IEh5ZHJhdGVGYWxsYmFjayB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBDb21wb25lbnQ6IENvbXBvbmVudDQsIEVycm9yQm91bmRhcnksIEh5ZHJhdGVGYWxsYmFjayB9O1xufVxuZnVuY3Rpb24gY3JlYXRlU2VydmVyUm91dGVzKG1hbmlmZXN0LCByb3V0ZU1vZHVsZXMsIGZ1dHVyZSwgaXNTcGFNb2RlLCBwYXJlbnRJZCA9IFwiXCIsIHJvdXRlc0J5UGFyZW50SWQgPSBncm91cFJvdXRlc0J5UGFyZW50SWQobWFuaWZlc3QpLCBzcGFNb2RlTGF6eVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoeyBDb21wb25lbnQ6ICgpID0+IG51bGwgfSkpIHtcbiAgcmV0dXJuIChyb3V0ZXNCeVBhcmVudElkW3BhcmVudElkXSB8fCBbXSkubWFwKChyb3V0ZSkgPT4ge1xuICAgIGxldCByb3V0ZU1vZHVsZSA9IHJvdXRlTW9kdWxlc1tyb3V0ZS5pZF07XG4gICAgaW52YXJpYW50MihcbiAgICAgIHJvdXRlTW9kdWxlLFxuICAgICAgXCJObyBgcm91dGVNb2R1bGVgIGF2YWlsYWJsZSB0byBjcmVhdGUgc2VydmVyIHJvdXRlc1wiXG4gICAgKTtcbiAgICBsZXQgZGF0YVJvdXRlID0ge1xuICAgICAgLi4uZ2V0Um91dGVDb21wb25lbnRzKHJvdXRlLCByb3V0ZU1vZHVsZSwgaXNTcGFNb2RlKSxcbiAgICAgIGNhc2VTZW5zaXRpdmU6IHJvdXRlLmNhc2VTZW5zaXRpdmUsXG4gICAgICBpZDogcm91dGUuaWQsXG4gICAgICBpbmRleDogcm91dGUuaW5kZXgsXG4gICAgICBwYXRoOiByb3V0ZS5wYXRoLFxuICAgICAgaGFuZGxlOiByb3V0ZU1vZHVsZS5oYW5kbGUsXG4gICAgICAvLyBGb3IgU1BBIE1vZGUsIGFsbCByb3V0ZXMgYXJlIGxhenkgZXhjZXB0IHJvb3QuICBIb3dldmVyIHdlIHRlbGwgdGhlXG4gICAgICAvLyByb3V0ZXIgcm9vdCBpcyBhbHNvIGxhenkgaGVyZSB0b28gc2luY2Ugd2UgZG9uJ3QgbmVlZCBhIGZ1bGxcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIC0gd2UganVzdCBuZWVkIGEgYGxhenlgIHByb3AgdG8gdGVsbCB0aGUgUlIgcmVuZGVyaW5nXG4gICAgICAvLyB3aGVyZSB0byBzdG9wIHdoaWNoIGlzIGFsd2F5cyBhdCB0aGUgcm9vdCByb3V0ZSBpbiBTUEEgbW9kZVxuICAgICAgbGF6eTogaXNTcGFNb2RlID8gKCkgPT4gc3B
25114hTW9kZUxhenlQcm9taXNlIDogdm9pZCAwLFxuICAgICAgLy8gRm9yIHBhcnRpYWwgaHlkcmF0aW9uIHJlbmRlcmluZywgd2UgbmVlZCB0byBpbmRpY2F0ZSB3aGVuIHRoZSByb3V0ZVxuICAgICAgLy8gaGFzIGEgbG9hZGVyL2NsaWVudExvYWRlciwgYnV0IGl0IHdvbid0IGV2ZXIgYmUgY2FsbGVkIGR1cmluZyB0aGUgc3RhdGljXG4gICAgICAvLyByZW5kZXIsIHNvIGp1c3QgZ2l2ZSBpdCBhIG5vLW9wIGZ1bmN0aW9uIHNvIHdlIGNhbiByZW5kZXIgZG93biB0byB0aGVcbiAgICAgIC8vIHByb3BlciBmYWxsYmFja1xuICAgICAgbG9hZGVyOiByb3V0ZS5oYXNMb2FkZXIgfHwgcm91dGUuaGFzQ2xpZW50TG9hZGVyID8gKCkgPT4gbnVsbCA6IHZvaWQgMFxuICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBtaWRkbGV3YXJlL2FjdGlvbi9zaG91bGRSZXZhbGlkYXRlIG9uIHRoZXNlIHJvdXRlcyBzaW5jZVxuICAgICAgLy8gdGhleSdyZSBmb3IgYSBzdGF0aWMgcmVuZGVyXG4gICAgfTtcbiAgICBsZXQgY2hpbGRyZW4gPSBjcmVhdGVTZXJ2ZXJSb3V0ZXMoXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHJvdXRlTW9kdWxlcyxcbiAgICAgIGZ1dHVyZSxcbiAgICAgIGlzU3BhTW9kZSxcbiAgICAgIHJvdXRlLmlkLFxuICAgICAgcm91dGVzQnlQYXJlbnRJZCxcbiAgICAgIHNwYU1vZGVMYXp5UHJvbWlzZVxuICAgICk7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIGRhdGFSb3V0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIHJldHVybiBkYXRhUm91dGU7XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2xpZW50Um91dGVzV2l0aEhNUlJldmFsaWRhdGlvbk9wdE91dChuZWVkc1JldmFsaWRhdGlvbiwgbWFuaWZlc3QsIHJvdXRlTW9kdWxlc0NhY2hlLCBpbml0aWFsU3RhdGUsIHNzciwgaXNTcGFNb2RlKSB7XG4gIHJldHVybiBjcmVhdGVDbGllbnRSb3V0ZXMoXG4gICAgbWFuaWZlc3QsXG4gICAgcm91dGVNb2R1bGVzQ2FjaGUsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHNzcixcbiAgICBpc1NwYU1vZGUsXG4gICAgXCJcIixcbiAgICBncm91cFJvdXRlc0J5UGFyZW50SWQobWFuaWZlc3QpLFxuICAgIG5lZWRzUmV2YWxpZGF0aW9uXG4gICk7XG59XG5mdW5jdGlvbiBwcmV2ZW50SW52YWxpZFNlcnZlckhhbmRsZXJDYWxsKHR5cGUsIHJvdXRlKSB7XG4gIGlmICh0eXBlID09PSBcImxvYWRlclwiICYmICFyb3V0ZS5oYXNMb2FkZXIgfHwgdHlwZSA9PT0gXCJhY3Rpb25cIiAmJiAhcm91dGUuaGFzQWN0aW9uKSB7XG4gICAgbGV0IGZuID0gdHlwZSA9PT0gXCJhY3Rpb25cIiA/IFwic2VydmVyQWN0aW9uKClcIiA6IFwic2VydmVyTG9hZGVyKClcIjtcbiAgICBsZXQgbXNnID0gYFlvdSBhcmUgdHJ5aW5nIHRvIGNhbGwgJHtmbn0gb24gYSByb3V0ZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBzZXJ2ZXIgJHt0eXBlfSAocm91dGVJZDogXCIke3JvdXRlLmlkfVwiKWA7XG4gICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgIHRocm93IG5ldyBFcnJvclJlc3BvbnNlSW1wbCg0MDAsIFwiQmFkIFJlcXVlc3RcIiwgbmV3IEVycm9yKG1zZyksIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBub0FjdGlvbkRlZmluZWRFcnJvcih0eXBlLCByb3V0ZUlkKSB7XG4gIGxldCBhcnRpY2xlID0gdHlwZSA9PT0gXCJjbGllbnRBY3Rpb25cIiA/IFwiYVwiIDogXCJhblwiO1xuICBsZXQgbXNnID0gYFJvdXRlIFwiJHtyb3V0ZUlkfVwiIGRvZXMgbm90IGhhdmUgJHthcnRpY2xlfSAke3R5cGV9LCBidXQgeW91IGFyZSB0cnlpbmcgdG8gc3VibWl0IHRvIGl0LiBUbyBmaXggdGhpcywgcGxlYXNlIGFkZCAke2FydGljbGV9IFxcYCR7dHlwZX1cXGAgZnVuY3Rpb24gdG8gdGhlIHJvdXRlYDtcbiAgY29uc29sZS5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3JSZXNwb25zZUltcGwoNDA1LCBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLCBuZXcgRXJyb3IobXNnKSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVDbGllbnRSb3V0ZXMobWFuaWZlc3QsIHJvdXRlTW9kdWxlc0NhY2hlLCBpbml0aWFsU3RhdGUsIHNzciwgaXNTcGFNb2RlLCBwYXJlbnRJZCA9IFwiXCIsIHJvdXRlc0J5UGFyZW50SWQgPSBncm91cFJvdXRlc0J5UGFyZW50SWQobWFuaWZlc3QpLCBuZWVkc1JldmFsaWRhdGlvbikge1xuICByZXR1cm4gKHJvdXRlc0J5UGFyZW50SWRbcGFyZW50SWRdIHx8IFtdKS5tYXAoKHJvdXRlKSA9PiB7XG4gICAgbGV0IHJvdXRlTW9kdWxlID0gcm91dGVNb2R1bGVzQ2FjaGVbcm91dGUuaWRdO1xuICAgIGZ1bmN0aW9uIGZldGNoU2VydmVySGFuZGxlcihzaW5nbGVGZXRjaCkge1xuICAgICAgaW52YXJpYW50MihcbiAgICAgICAgdHlwZW9mIHNpbmdsZUZldGNoID09PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIFwiTm8gc2luZ2xlIGZldGNoIGZ1bmN0aW9uIGF2YWlsYWJsZSBmb3Igcm91dGUgaGFuZGxlclwiXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpbmdsZUZldGNoKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZldGNoU2VydmVyTG9hZGVyKHNpbmdsZUZldGNoKSB7XG4gICAgICBpZiAoIXJvdXRlLmhhc0xvYWRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgIHJldHVybiBmZXRjaFNlcnZlckhhbmRsZXIoc2luZ2xlRmV0Y2gpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmZXRjaFNlcnZlckFjdGlvbihzaW5nbGVGZXRjaCkge1xuICAgICAgaWYgKCFyb3V0ZS5oYXNBY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbm9BY3Rpb25EZWZpbmVkRXJyb3IoXCJhY3Rpb25cIiwgcm91dGUuaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZldGNoU2VydmVySGFuZGxlcihzaW5nbGVGZXRjaCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZWZldGNoTW9kdWxlKG1vZHVsZVBhdGgpIHtcbiAgICAgIGltcG9ydChcbiAgICAgICAgLyogQHZpdGUtaWdub3JlICovXG4gICAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgICAgbW9kdWxlUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlZmV0Y2hSb3V0ZU1vZHVsZUNodW5rcyhyb3V0ZTIpIHtcbiAgICAgIGlmIChyb3V0ZTIuY2xpZW50QWN0aW9uTW9kdWxlKSB7XG4gICAgICAgI
25114HByZWZldGNoTW9kdWxlKHJvdXRlMi5jbGllbnRBY3Rpb25Nb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlMi5jbGllbnRMb2FkZXJNb2R1bGUpIHtcbiAgICAgICAgcHJlZmV0Y2hNb2R1bGUocm91dGUyLmNsaWVudExvYWRlck1vZHVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHByZWZldGNoU3R5bGVzQW5kQ2FsbEhhbmRsZXIoaGFuZGxlcikge1xuICAgICAgbGV0IGNhY2hlZE1vZHVsZSA9IHJvdXRlTW9kdWxlc0NhY2hlW3JvdXRlLmlkXTtcbiAgICAgIGxldCBsaW5rUHJlZmV0Y2hQcm9taXNlID0gY2FjaGVkTW9kdWxlID8gcHJlZmV0Y2hTdHlsZUxpbmtzKHJvdXRlLCBjYWNoZWRNb2R1bGUpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gaGFuZGxlcigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgbGlua1ByZWZldGNoUHJvbWlzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRhdGFSb3V0ZSA9IHtcbiAgICAgIGlkOiByb3V0ZS5pZCxcbiAgICAgIGluZGV4OiByb3V0ZS5pbmRleCxcbiAgICAgIHBhdGg6IHJvdXRlLnBhdGhcbiAgICB9O1xuICAgIGlmIChyb3V0ZU1vZHVsZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihkYXRhUm91dGUsIHtcbiAgICAgICAgLi4uZGF0YVJvdXRlLFxuICAgICAgICAuLi5nZXRSb3V0ZUNvbXBvbmVudHMocm91dGUsIHJvdXRlTW9kdWxlLCBpc1NwYU1vZGUpLFxuICAgICAgICBtaWRkbGV3YXJlOiByb3V0ZU1vZHVsZS5jbGllbnRNaWRkbGV3YXJlLFxuICAgICAgICBoYW5kbGU6IHJvdXRlTW9kdWxlLmhhbmRsZSxcbiAgICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogZ2V0U2hvdWxkUmV2YWxpZGF0ZUZ1bmN0aW9uKFxuICAgICAgICAgIGRhdGFSb3V0ZS5wYXRoLFxuICAgICAgICAgIHJvdXRlTW9kdWxlLFxuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIHNzcixcbiAgICAgICAgICBuZWVkc1JldmFsaWRhdGlvblxuICAgICAgICApXG4gICAgICB9KTtcbiAgICAgIGxldCBoYXNJbml0aWFsRGF0YSA9IGluaXRpYWxTdGF0ZSAmJiBpbml0aWFsU3RhdGUubG9hZGVyRGF0YSAmJiByb3V0ZS5pZCBpbiBpbml0aWFsU3RhdGUubG9hZGVyRGF0YTtcbiAgICAgIGxldCBpbml0aWFsRGF0YSA9IGhhc0luaXRpYWxEYXRhID8gaW5pdGlhbFN0YXRlPy5sb2FkZXJEYXRhPy5bcm91dGUuaWRdIDogdm9pZCAwO1xuICAgICAgbGV0IGhhc0luaXRpYWxFcnJvciA9IGluaXRpYWxTdGF0ZSAmJiBpbml0aWFsU3RhdGUuZXJyb3JzICYmIHJvdXRlLmlkIGluIGluaXRpYWxTdGF0ZS5lcnJvcnM7XG4gICAgICBsZXQgaW5pdGlhbEVycm9yID0gaGFzSW5pdGlhbEVycm9yID8gaW5pdGlhbFN0YXRlPy5lcnJvcnM/Lltyb3V0ZS5pZF0gOiB2b2lkIDA7XG4gICAgICBsZXQgaXNIeWRyYXRpb25SZXF1ZXN0ID0gbmVlZHNSZXZhbGlkYXRpb24gPT0gbnVsbCAmJiAocm91dGVNb2R1bGUuY2xpZW50TG9hZGVyPy5oeWRyYXRlID09PSB0cnVlIHx8ICFyb3V0ZS5oYXNMb2FkZXIpO1xuICAgICAgZGF0YVJvdXRlLmxvYWRlciA9IGFzeW5jICh7IHJlcXVlc3QsIHBhcmFtcywgY29udGV4dCB9LCBzaW5nbGVGZXRjaCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBwcmVmZXRjaFN0eWxlc0FuZENhbGxIYW5kbGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGludmFyaWFudDIoXG4gICAgICAgICAgICAgIHJvdXRlTW9kdWxlLFxuICAgICAgICAgICAgICBcIk5vIGByb3V0ZU1vZHVsZWAgYXZhaWxhYmxlIGZvciBjcml0aWNhbC1yb3V0ZSBsb2FkZXJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcm91dGVNb2R1bGUuY2xpZW50TG9hZGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmZXRjaFNlcnZlckxvYWRlcihzaW5nbGVGZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcm91dGVNb2R1bGUuY2xpZW50TG9hZGVyKHtcbiAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBhc3luYyBzZXJ2ZXJMb2FkZXIoKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudEludmFsaWRTZXJ2ZXJIYW5kbGVyQ2FsbChcImxvYWRlclwiLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzSHlkcmF0aW9uUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGhhc0luaXRpYWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0aWFsRGF0YTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChoYXNJbml0aWFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW5pdGlhbEVycm9yO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJMb2FkZXIoc2luZ2xlRmV0Y2gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlzSHlkcmF0aW9uUmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZGF0YVJvdXRlLmxvYWRlci5oeWRyYXRlID0gc2hvdWxkSHlkcmF0ZVJvdXRlTG9hZGVyKFxuICAgICAgICByb3V0ZS5pZCxcbiAgICAgICAgcm91dGVNb2R1bGUuY2xpZW50TG9hZGVyLFxuICAgICAgICByb3V0ZS5oYXNMb2FkZXIsXG4gICAgICAgIGlzU3BhTW9kZVxuICAgICAgKTtcbiAgICAgIGRhdGFSb3V0ZS5hY3Rpb24gPSAoeyByZXF1ZXN0LCBwYXJhbXMsIGNvbnRleHQgfSwgc2luZ2xlRmV0Y2gpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZWZldGNoU3R5bGVzQW5kQ2FsbEhhbmRsZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGludmFyaWFudDIoXG4gICAgICAgICAgICByb3V0ZU1vZHVsZSxcbiAgICAgICAgICAgIFwiTm8gYHJvdXRlTW9kdWxlYCBhdmFpbGFibGUgZm9yIGNyaXRpY2FsLXJvdXRlIGFjdGlvblwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXJvdXRlTW9kdWxlLmNsaWVudEFjdGlvbikge1xuICAgICAgICAgICAgaWYgKGlzU3BhTW9kZSkge1xuICAgICAgICAgICAgICB0aHJvdyBub0FjdGlvbkRlZmluZWRFcnJvcihcImNsaWVudEFjdGlvblwiLCByb3V0ZS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJBY3Rpb24oc2luZ2xlRmV0Y2gpO1xuICAgICAgICAgI
25114H1cbiAgICAgICAgICByZXR1cm4gcm91dGVNb2R1bGUuY2xpZW50QWN0aW9uKHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYXN5bmMgc2VydmVyQWN0aW9uKCkge1xuICAgICAgICAgICAgICBwcmV2ZW50SW52YWxpZFNlcnZlckhhbmRsZXJDYWxsKFwiYWN0aW9uXCIsIHJvdXRlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZldGNoU2VydmVyQWN0aW9uKHNpbmdsZUZldGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXJvdXRlLmhhc0NsaWVudExvYWRlcikge1xuICAgICAgICBkYXRhUm91dGUubG9hZGVyID0gKF8sIHNpbmdsZUZldGNoKSA9PiBwcmVmZXRjaFN0eWxlc0FuZENhbGxIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hTZXJ2ZXJMb2FkZXIoc2luZ2xlRmV0Y2gpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUuaGFzQ2xpZW50QWN0aW9uKSB7XG4gICAgICAgIGRhdGFSb3V0ZS5hY3Rpb24gPSAoXywgc2luZ2xlRmV0Y2gpID0+IHByZWZldGNoU3R5bGVzQW5kQ2FsbEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICAgIGlmIChpc1NwYU1vZGUpIHtcbiAgICAgICAgICAgIHRocm93IG5vQWN0aW9uRGVmaW5lZEVycm9yKFwiY2xpZW50QWN0aW9uXCIsIHJvdXRlLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZldGNoU2VydmVyQWN0aW9uKHNpbmdsZUZldGNoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgbGF6eVJvdXRlUHJvbWlzZTtcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldExhenlSb3V0ZSgpIHtcbiAgICAgICAgaWYgKGxhenlSb3V0ZVByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgbGF6eVJvdXRlUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBsYXp5Um91dGVQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAocm91dGUuY2xpZW50TG9hZGVyTW9kdWxlIHx8IHJvdXRlLmNsaWVudEFjdGlvbk1vZHVsZSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgcm91dGVNb2R1bGVQcm9taXNlID0gbG9hZFJvdXRlTW9kdWxlV2l0aEJsb2NraW5nTGlua3MoXG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgIHJvdXRlTW9kdWxlc0NhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmZXRjaFJvdXRlTW9kdWxlQ2h1bmtzKHJvdXRlKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcm91dGVNb2R1bGVQcm9taXNlO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbGF6eVJvdXRlUHJvbWlzZTtcbiAgICAgIH1cbiAgICAgIGRhdGFSb3V0ZS5sYXp5ID0ge1xuICAgICAgICBsb2FkZXI6IHJvdXRlLmhhc0NsaWVudExvYWRlciA/IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBsZXQgeyBjbGllbnRMb2FkZXIgfSA9IHJvdXRlLmNsaWVudExvYWRlck1vZHVsZSA/IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqL1xuICAgICAgICAgICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgICAgICAgcm91dGUuY2xpZW50TG9hZGVyTW9kdWxlXG4gICAgICAgICAgKSA6IGF3YWl0IGdldExhenlSb3V0ZSgpO1xuICAgICAgICAgIGludmFyaWFudDIoY2xpZW50TG9hZGVyLCBcIk5vIGBjbGllbnRMb2FkZXJgIGV4cG9ydCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gKGFyZ3MsIHNpbmdsZUZldGNoKSA9PiBjbGllbnRMb2FkZXIoe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgIGFzeW5jIHNlcnZlckxvYWRlcigpIHtcbiAgICAgICAgICAgICAgcHJldmVudEludmFsaWRTZXJ2ZXJIYW5kbGVyQ2FsbChcImxvYWRlclwiLCByb3V0ZSk7XG4gICAgICAgICAgICAgIHJldHVybiBmZXRjaFNlcnZlckxvYWRlcihzaW5nbGVGZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgIGFjdGlvbjogcm91dGUuaGFzQ2xpZW50QWN0aW9uID8gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCBjbGllbnRBY3Rpb25Qcm9taXNlID0gcm91dGUuY2xpZW50QWN0aW9uTW9kdWxlID8gaW1wb3J0KFxuICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovXG4gICAgICAgICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovXG4gICAgICAgICAgICByb3V0ZS5jbGllbnRBY3Rpb25Nb2R1bGVcbiAgICAgICAgICApIDogZ2V0TGF6eVJvdXRlKCk7XG4gICAgICAgICAgcHJlZmV0Y2hSb3V0ZU1vZHVsZUNodW5rcyhyb3V0ZSk7XG4gICAgICAgICAgbGV0IHsgY2xpZW50QWN0aW9uIH0gPSBhd2FpdCBjbGllbnRBY3Rpb25Qcm9taXNlO1xuICAgICAgICAgIGludmFyaWFudDIoY2xpZW50QWN0aW9uLCBcIk5vIGBjbGllbnRBY3Rpb25gIGV4cG9ydCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gKGFyZ3MsIHNpbmdsZUZldGNoKSA9PiBjbGllbnRBY3Rpb24oe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgIGFzeW5jIHNlcnZlckFjdGlvbigpIHtcbiAgICAgICAgICAgICAgcHJldmVudEludmFsaWRTZXJ2ZXJIYW5kbGVyQ2FsbChcImFjdGlvblwiLCByb3V0ZSk7XG4gICAgICAgICAgICAgIHJldHVybiBmZXRjaFNlcnZlckFjdGlvbihzaW5nbGVGZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgIG1pZGRsZXdhcmU6IHJvdXRlLmhhc0NsaWVudE1pZGRsZXdhcmUgPyBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IHsgY2xpZW50TWlkZGxld2FyZSB9ID0gcm91dGUuY2xpZW50TWlkZGxld2FyZU1vZHVsZSA/IGF3YWl0IGltcG9ydChcbiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqL1xuICAgICAgICAgICAgLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqL1xuICAgICAgICAgICAgcm91dGUuY2xpZW50TWlkZGxld2FyZU1vZHVsZVxuICAgICAgICAgICkgOiBhd2FpdCBnZXRMYXp5Um91dGUoKTtcbiAgICAgICAgICBpbnZhcmlhbnQyKGNsaWVudE1pZGRsZXdhcmUsIFwiTm8gYGNsaWVudE1pZGRsZXdhcmVgIGV4cG9ydCBmb3VuZFwiKTtcbiAgICAgICAgICByZXR1cm4gY2xpZW50TWlkZGxld2FyZTtcbiAgICAgICAgfSA6IHZvaWQgMCxcbiAgICAgICAgc2hvdWxkUmV2YWxpZGF0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCBsYXp5Um91dGUgPSBhd2FpdCBnZXRMYXp5Um91dGUoKTtcbiAgICAgICAgICByZXR1cm4gZ2V0U2hvdWxkUmV2YWxpZGF0ZUZ1bmN0aW9uKFxuICAgICAgICAgICAgZGF0YVJvdXRlLnBhdGgsXG4gICAgICAgICAgICBsYXp5Um91dGUsXG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgI
25114HNzcixcbiAgICAgICAgICAgIG5lZWRzUmV2YWxpZGF0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlOiBhc3luYyAoKSA9PiAoYXdhaXQgZ2V0TGF6eVJvdXRlKCkpLmhhbmRsZSxcbiAgICAgICAgLy8gTm8gbmVlZCB0byB3cmFwIHRoZXNlIGluIGxheW91dCBzaW5jZSB0aGUgcm9vdCByb3V0ZSBpcyBuZXZlclxuICAgICAgICAvLyBsb2FkZWQgdmlhIHJvdXRlLmxhenkoKVxuICAgICAgICBDb21wb25lbnQ6IGFzeW5jICgpID0+IChhd2FpdCBnZXRMYXp5Um91dGUoKSkuQ29tcG9uZW50LFxuICAgICAgICBFcnJvckJvdW5kYXJ5OiByb3V0ZS5oYXNFcnJvckJvdW5kYXJ5ID8gYXN5bmMgKCkgPT4gKGF3YWl0IGdldExhenlSb3V0ZSgpKS5FcnJvckJvdW5kYXJ5IDogdm9pZCAwXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgY2hpbGRyZW4gPSBjcmVhdGVDbGllbnRSb3V0ZXMoXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHJvdXRlTW9kdWxlc0NhY2hlLFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgc3NyLFxuICAgICAgaXNTcGFNb2RlLFxuICAgICAgcm91dGUuaWQsXG4gICAgICByb3V0ZXNCeVBhcmVudElkLFxuICAgICAgbmVlZHNSZXZhbGlkYXRpb25cbiAgICApO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSBkYXRhUm91dGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICByZXR1cm4gZGF0YVJvdXRlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFNob3VsZFJldmFsaWRhdGVGdW5jdGlvbihwYXRoLCByb3V0ZSwgbWFuaWZlc3RSb3V0ZSwgc3NyLCBuZWVkc1JldmFsaWRhdGlvbikge1xuICBpZiAobmVlZHNSZXZhbGlkYXRpb24pIHtcbiAgICByZXR1cm4gd3JhcFNob3VsZFJldmFsaWRhdGVGb3JIZHIoXG4gICAgICBtYW5pZmVzdFJvdXRlLmlkLFxuICAgICAgcm91dGUuc2hvdWxkUmV2YWxpZGF0ZSxcbiAgICAgIG5lZWRzUmV2YWxpZGF0aW9uXG4gICAgKTtcbiAgfVxuICBpZiAoIXNzciAmJiBtYW5pZmVzdFJvdXRlLmhhc0xvYWRlciAmJiAhbWFuaWZlc3RSb3V0ZS5oYXNDbGllbnRMb2FkZXIpIHtcbiAgICBsZXQgbXlQYXJhbXMgPSBwYXRoID8gY29tcGlsZVBhdGgocGF0aClbMV0ubWFwKChwKSA9PiBwLnBhcmFtTmFtZSkgOiBbXTtcbiAgICBjb25zdCBkaWRQYXJhbXNDaGFuZ2UgPSAob3B0cykgPT4gbXlQYXJhbXMuc29tZSgocCkgPT4gb3B0cy5jdXJyZW50UGFyYW1zW3BdICE9PSBvcHRzLm5leHRQYXJhbXNbcF0pO1xuICAgIGlmIChyb3V0ZS5zaG91bGRSZXZhbGlkYXRlKSB7XG4gICAgICBsZXQgZm4gPSByb3V0ZS5zaG91bGRSZXZhbGlkYXRlO1xuICAgICAgcmV0dXJuIChvcHRzKSA9PiBmbih7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOiBkaWRQYXJhbXNDaGFuZ2Uob3B0cylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKG9wdHMpID0+IGRpZFBhcmFtc0NoYW5nZShvcHRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNzciAmJiByb3V0ZS5zaG91bGRSZXZhbGlkYXRlKSB7XG4gICAgbGV0IGZuID0gcm91dGUuc2hvdWxkUmV2YWxpZGF0ZTtcbiAgICByZXR1cm4gKG9wdHMpID0+IGZuKHsgLi4ub3B0cywgZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHJvdXRlLnNob3VsZFJldmFsaWRhdGU7XG59XG5mdW5jdGlvbiB3cmFwU2hvdWxkUmV2YWxpZGF0ZUZvckhkcihyb3V0ZUlkLCByb3V0ZVNob3VsZFJldmFsaWRhdGUsIG5lZWRzUmV2YWxpZGF0aW9uKSB7XG4gIGxldCBoYW5kbGVkUmV2YWxpZGF0aW9uID0gZmFsc2U7XG4gIHJldHVybiAoYXJnKSA9PiB7XG4gICAgaWYgKCFoYW5kbGVkUmV2YWxpZGF0aW9uKSB7XG4gICAgICBoYW5kbGVkUmV2YWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZWVkc1JldmFsaWRhdGlvbi5oYXMocm91dGVJZCk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZVNob3VsZFJldmFsaWRhdGUgPyByb3V0ZVNob3VsZFJldmFsaWRhdGUoYXJnKSA6IGFyZy5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTtcbiAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGxvYWRSb3V0ZU1vZHVsZVdpdGhCbG9ja2luZ0xpbmtzKHJvdXRlLCByb3V0ZU1vZHVsZXMpIHtcbiAgbGV0IHJvdXRlTW9kdWxlUHJvbWlzZSA9IGxvYWRSb3V0ZU1vZHVsZShyb3V0ZSwgcm91dGVNb2R1bGVzKTtcbiAgbGV0IHByZWZldGNoUm91dGVDc3NQcm9taXNlID0gcHJlZmV0Y2hSb3V0ZUNzcyhyb3V0ZSk7XG4gIGxldCByb3V0ZU1vZHVsZSA9IGF3YWl0IHJvdXRlTW9kdWxlUHJvbWlzZTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHByZWZldGNoUm91dGVDc3NQcm9taXNlLFxuICAgIHByZWZldGNoU3R5bGVMaW5rcyhyb3V0ZSwgcm91dGVNb2R1bGUpXG4gIF0pO1xuICByZXR1cm4ge1xuICAgIENvbXBvbmVudDogZ2V0Um91dGVNb2R1bGVDb21wb25lbnQocm91dGVNb2R1bGUpLFxuICAgIEVycm9yQm91bmRhcnk6IHJvdXRlTW9kdWxlLkVycm9yQm91bmRhcnksXG4gICAgY2xpZW50TWlkZGxld2FyZTogcm91dGVNb2R1bGUuY2xpZW50TWlkZGxld2FyZSxcbiAgICBjbGllbnRBY3Rpb246IHJvdXRlTW9kdWxlLmNsaWVudEFjdGlvbixcbiAgICBjbGllbnRMb2FkZXI6IHJvdXRlTW9kdWxlLmNsaWVudExvYWRlcixcbiAgICBoYW5kbGU6IHJvdXRlTW9kdWxlLmhhbmRsZSxcbiAgICBsaW5rczogcm91dGVNb2R1bGUubGlua3MsXG4gICAgbWV0YTogcm91dGVNb2R1bGUubWV0YSxcbiAgICBzaG91bGRSZXZhbGlkYXRlOiByb3V0ZU1vZHVsZS5zaG91bGRSZXZhbGlkYXRlXG4gIH07XG59XG5mdW5jdGlvbiBnZXRSb3V0ZU1vZHVsZUNvbXBvbmVudChyb3V0ZU1vZHVsZSkge1xuICBpZiAocm91dGVNb2R1bGUuZGVmYXVsdCA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICBsZXQgaXNFbXB0eU9iamVjdCA9IHR5cGVvZiByb3V0ZU1vZHVsZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKHJvdXRlTW9kdWxlLmRlZmF1bHQpLmxlbmd0aCA9PT0gMDtcbiAgaWYgKCFpc0VtcHR5T2JqZWN0KSB7XG4gICAgcmV0dXJuIHJvdXRlTW9kdWxlLmRlZmF1bHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVSb3V0ZUxvYWRlcihyb3V0ZUlkLCBjbGllbnRMb2FkZXIsIGhhc0xvYWRlciwgaXNTcGFNb2RlKSB7XG4gIHJldHVybi
25114Bpc1NwYU1vZGUgJiYgcm91dGVJZCAhPT0gXCJyb290XCIgfHwgY2xpZW50TG9hZGVyICE9IG51bGwgJiYgKGNsaWVudExvYWRlci5oeWRyYXRlID09PSB0cnVlIHx8IGhhc0xvYWRlciAhPT0gdHJ1ZSk7XG59XG5cbi8vIGxpYi9kb20vc3NyL2ZvZy1vZi13YXIudHNcbnZhciBuZXh0UGF0aHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xudmFyIGRpc2NvdmVyZWRQYXRoc01heFNpemUgPSAxZTM7XG52YXIgZGlzY292ZXJlZFBhdGhzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbnZhciBVUkxfTElNSVQgPSA3NjgwO1xuZnVuY3Rpb24gaXNGb2dPZldhckVuYWJsZWQocm91dGVEaXNjb3ZlcnksIHNzcikge1xuICByZXR1cm4gcm91dGVEaXNjb3ZlcnkubW9kZSA9PT0gXCJsYXp5XCIgJiYgc3NyID09PSB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0UGFydGlhbE1hbmlmZXN0KHsgc3JpLCAuLi5tYW5pZmVzdCB9LCByb3V0ZXIpIHtcbiAgbGV0IHJvdXRlSWRzID0gbmV3IFNldChyb3V0ZXIuc3RhdGUubWF0Y2hlcy5tYXAoKG0pID0+IG0ucm91dGUuaWQpKTtcbiAgbGV0IHNlZ21lbnRzID0gcm91dGVyLnN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGxldCBwYXRocyA9IFtcIi9cIl07XG4gIHNlZ21lbnRzLnBvcCgpO1xuICB3aGlsZSAoc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgIHBhdGhzLnB1c2goYC8ke3NlZ21lbnRzLmpvaW4oXCIvXCIpfWApO1xuICAgIHNlZ21lbnRzLnBvcCgpO1xuICB9XG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoUm91dGVzKHJvdXRlci5yb3V0ZXMsIHBhdGgsIHJvdXRlci5iYXNlbmFtZSk7XG4gICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgIG1hdGNoZXMuZm9yRWFjaCgobSkgPT4gcm91dGVJZHMuYWRkKG0ucm91dGUuaWQpKTtcbiAgICB9XG4gIH0pO1xuICBsZXQgaW5pdGlhbFJvdXRlcyA9IFsuLi5yb3V0ZUlkc10ucmVkdWNlKFxuICAgIChhY2MsIGlkKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBbaWRdOiBtYW5pZmVzdC5yb3V0ZXNbaWRdIH0pLFxuICAgIHt9XG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4ubWFuaWZlc3QsXG4gICAgcm91dGVzOiBpbml0aWFsUm91dGVzLFxuICAgIHNyaTogc3JpID8gdHJ1ZSA6IHZvaWQgMFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb25GdW5jdGlvbihtYW5pZmVzdCwgcm91dGVNb2R1bGVzLCBzc3IsIHJvdXRlRGlzY292ZXJ5LCBpc1NwYU1vZGUsIGJhc2VuYW1lKSB7XG4gIGlmICghaXNGb2dPZldhckVuYWJsZWQocm91dGVEaXNjb3ZlcnksIHNzcikpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHJldHVybiBhc3luYyAoeyBwYXRoLCBwYXRjaCwgc2lnbmFsLCBmZXRjaGVyS2V5IH0pID0+IHtcbiAgICBpZiAoZGlzY292ZXJlZFBhdGhzLmhhcyhwYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmZXRjaEFuZEFwcGx5TWFuaWZlc3RQYXRjaGVzKFxuICAgICAgW3BhdGhdLFxuICAgICAgZmV0Y2hlcktleSA/IHdpbmRvdy5sb2NhdGlvbi5ocmVmIDogcGF0aCxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgcm91dGVNb2R1bGVzLFxuICAgICAgc3NyLFxuICAgICAgaXNTcGFNb2RlLFxuICAgICAgYmFzZW5hbWUsXG4gICAgICByb3V0ZURpc2NvdmVyeS5tYW5pZmVzdFBhdGgsXG4gICAgICBwYXRjaCxcbiAgICAgIHNpZ25hbFxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiB1c2VGb2dPRldhckRpc2NvdmVyeShyb3V0ZXIsIG1hbmlmZXN0LCByb3V0ZU1vZHVsZXMsIHNzciwgcm91dGVEaXNjb3ZlcnksIGlzU3BhTW9kZSkge1xuICBSZWFjdDcudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRm9nT2ZXYXJFbmFibGVkKHJvdXRlRGlzY292ZXJ5LCBzc3IpIHx8IC8vIEB0cy1leHBlY3QtZXJyb3IgLSBUUyBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyB5ZXRcbiAgICB3aW5kb3cubmF2aWdhdG9yPy5jb25uZWN0aW9uPy5zYXZlRGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoZWwpIHtcbiAgICAgIGxldCBwYXRoID0gZWwudGFnTmFtZSA9PT0gXCJGT1JNXCIgPyBlbC5nZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIikgOiBlbC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRobmFtZSA9IGVsLnRhZ05hbWUgPT09IFwiQVwiID8gZWwucGF0aG5hbWUgOiBuZXcgVVJMKHBhdGgsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pLnBhdGhuYW1lO1xuICAgICAgaWYgKCFkaXNjb3ZlcmVkUGF0aHMuaGFzKHBhdGhuYW1lKSkge1xuICAgICAgICBuZXh0UGF0aHMuYWRkKHBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQYXRjaGVzKCkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFbZGF0YS1kaXNjb3Zlcl0sIGZvcm1bZGF0YS1kaXNjb3Zlcl1cIikuZm9yRWFjaChyZWdpc3RlckVsZW1lbnQpO1xuICAgICAgbGV0IGxhenlQYXRocyA9IEFycmF5LmZyb20obmV4dFBhdGhzLmtleXMoKSkuZmlsdGVyKChwYXRoKSA9PiB7XG4gICAgICAgIGlmIChkaXNjb3ZlcmVkUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgbmV4dFBhdGhzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChsYXp5UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZldGNoQW5kQXBwbHlNYW5pZmVzdFBhdGNoZXMoXG4gICAgICAgICAgbGF6eVBhdGhzLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgcm91dGVNb2R1bGVzLFxuICAgICAgICAgIHNzcixcbiAgICAgICAgICBpc1NwYU1vZGUsXG4gICAgICAgICAgcm91dGVyLmJhc2VuYW1lLFxuICAgICAgICAgI
25114HJvdXRlRGlzY292ZXJ5Lm1hbmlmZXN0UGF0aCxcbiAgICAgICAgICByb3V0ZXIucGF0Y2hSb3V0ZXNcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBtYW5pZmVzdCBwYXRjaGVzXCIsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgZGVib3VuY2VkRmV0Y2hQYXRjaGVzID0gZGVib3VuY2UoZmV0Y2hQYXRjaGVzLCAxMDApO1xuICAgIGZldGNoUGF0Y2hlcygpO1xuICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IGRlYm91bmNlZEZldGNoUGF0Y2hlcygpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFtcImRhdGEtZGlzY292ZXJcIiwgXCJocmVmXCIsIFwiYWN0aW9uXCJdXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW3NzciwgaXNTcGFNb2RlLCBtYW5pZmVzdCwgcm91dGVNb2R1bGVzLCByb3V0ZXIsIHJvdXRlRGlzY292ZXJ5XSk7XG59XG5mdW5jdGlvbiBnZXRNYW5pZmVzdFBhdGgoX21hbmlmZXN0UGF0aCwgYmFzZW5hbWUpIHtcbiAgbGV0IG1hbmlmZXN0UGF0aCA9IF9tYW5pZmVzdFBhdGggfHwgXCIvX19tYW5pZmVzdFwiO1xuICBpZiAoYmFzZW5hbWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBtYW5pZmVzdFBhdGg7XG4gIH1cbiAgcmV0dXJuIGAke2Jhc2VuYW1lfSR7bWFuaWZlc3RQYXRofWAucmVwbGFjZSgvXFwvKy9nLCBcIi9cIik7XG59XG52YXIgTUFOSUZFU1RfVkVSU0lPTl9TVE9SQUdFX0tFWSA9IFwicmVhY3Qtcm91dGVyLW1hbmlmZXN0LXZlcnNpb25cIjtcbmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kQXBwbHlNYW5pZmVzdFBhdGNoZXMocGF0aHMsIGVycm9yUmVsb2FkUGF0aCwgbWFuaWZlc3QsIHJvdXRlTW9kdWxlcywgc3NyLCBpc1NwYU1vZGUsIGJhc2VuYW1lLCBtYW5pZmVzdFBhdGgsIHBhdGNoUm91dGVzLCBzaWduYWwpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBzZWFyY2hQYXJhbXMuc2V0KFwicGF0aHNcIiwgcGF0aHMuc29ydCgpLmpvaW4oXCIsXCIpKTtcbiAgc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgbWFuaWZlc3QudmVyc2lvbik7XG4gIGxldCB1cmwgPSBuZXcgVVJMKFxuICAgIGdldE1hbmlmZXN0UGF0aChtYW5pZmVzdFBhdGgsIGJhc2VuYW1lKSxcbiAgICB3aW5kb3cubG9jYXRpb24ub3JpZ2luXG4gICk7XG4gIHVybC5zZWFyY2ggPSBzZWFyY2hQYXJhbXMudG9TdHJpbmcoKTtcbiAgaWYgKHVybC50b1N0cmluZygpLmxlbmd0aCA+IFVSTF9MSU1JVCkge1xuICAgIG5leHRQYXRocy5jbGVhcigpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgc2VydmVyUGF0Y2hlcztcbiAgdHJ5IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSAyMDQgJiYgcmVzLmhlYWRlcnMuaGFzKFwiWC1SZW1peC1SZWxvYWQtRG9jdW1lbnRcIikpIHtcbiAgICAgIGlmICghZXJyb3JSZWxvYWRQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIkRldGVjdGVkIGEgbWFuaWZlc3QgdmVyc2lvbiBtaXNtYXRjaCBkdXJpbmcgZWFnZXIgcm91dGUgZGlzY292ZXJ5LiBUaGUgbmV4dCBuYXZpZ2F0aW9uL2ZldGNoIHRvIGFuIHVuZGlzY292ZXJlZCByb3V0ZSB3aWxsIHJlc3VsdCBpbiBhIG5ldyBkb2N1bWVudCBuYXZpZ2F0aW9uIHRvIHN5bmMgdXAgd2l0aCB0aGUgbGF0ZXN0IG1hbmlmZXN0LlwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKE1BTklGRVNUX1ZFUlNJT05fU1RPUkFHRV9LRVkpID09PSBtYW5pZmVzdC52ZXJzaW9uKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiVW5hYmxlIHRvIGRpc2NvdmVyIHJvdXRlcyBkdWUgdG8gbWFuaWZlc3QgdmVyc2lvbiBtaXNtYXRjaC5cIlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTUFOSUZFU1RfVkVSU0lPTl9TVE9SQUdFX0tFWSwgbWFuaWZlc3QudmVyc2lvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZXJyb3JSZWxvYWRQYXRoO1xuICAgICAgY29uc29sZS53YXJuKFwiRGV0ZWN0ZWQgbWFuaWZlc3QgdmVyc2lvbiBtaXNtYXRjaCwgcmVsb2FkaW5nLi4uXCIpO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID49IDQwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShNQU5JRkVTVF9WRVJTSU9OX1NUT1JBR0VfS0VZKTtcbiAgICB9IGNhdGNoIHtcbiAgICB9XG4gICAgc2VydmVyUGF0Y2hlcyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhyb3cgZTtcbiAgfVxuICBsZXQga25vd25Sb3V0ZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0LnJvdXRlcykpO1xuICBsZXQgcGF0Y2hlcyA9IE9iamVjdC52YWx1ZXMoc2VydmVyUGF0Y2hlcykucmVkdWNlKChhY2MsIHJvdXRlKSA9PiB7XG4gICAgaWYgKHJvdXRlICYmICFrbm93blJvdXRlcy5oYXMocm91dGUuaWQpKSB7XG4gICAgICBhY2Nbcm91dGUuaWRdID0gcm91dGU7XG4gICAgfVxuICAgIHJldHVybi
25114BhY2M7XG4gIH0sIHt9KTtcbiAgT2JqZWN0LmFzc2lnbihtYW5pZmVzdC5yb3V0ZXMsIHBhdGNoZXMpO1xuICBwYXRocy5mb3JFYWNoKChwKSA9PiBhZGRUb0ZpZm9RdWV1ZShwLCBkaXNjb3ZlcmVkUGF0aHMpKTtcbiAgbGV0IHBhcmVudElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIE9iamVjdC52YWx1ZXMocGF0Y2hlcykuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICBpZiAocGF0Y2ggJiYgKCFwYXRjaC5wYXJlbnRJZCB8fCAhcGF0Y2hlc1twYXRjaC5wYXJlbnRJZF0pKSB7XG4gICAgICBwYXJlbnRJZHMuYWRkKHBhdGNoLnBhcmVudElkKTtcbiAgICB9XG4gIH0pO1xuICBwYXJlbnRJZHMuZm9yRWFjaChcbiAgICAocGFyZW50SWQpID0+IHBhdGNoUm91dGVzKFxuICAgICAgcGFyZW50SWQgfHwgbnVsbCxcbiAgICAgIGNyZWF0ZUNsaWVudFJvdXRlcyhwYXRjaGVzLCByb3V0ZU1vZHVsZXMsIG51bGwsIHNzciwgaXNTcGFNb2RlLCBwYXJlbnRJZClcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBhZGRUb0ZpZm9RdWV1ZShwYXRoLCBxdWV1ZSkge1xuICBpZiAocXVldWUuc2l6ZSA+PSBkaXNjb3ZlcmVkUGF0aHNNYXhTaXplKSB7XG4gICAgbGV0IGZpcnN0ID0gcXVldWUudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgIHF1ZXVlLmRlbGV0ZShmaXJzdCk7XG4gIH1cbiAgcXVldWUuYWRkKHBhdGgpO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoY2FsbGJhY2ssIHdhaXQpIHtcbiAgbGV0IHRpbWVvdXRJZDtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKC4uLmFyZ3MpLCB3YWl0KTtcbiAgfTtcbn1cblxuLy8gbGliL2RvbS9zc3IvY29tcG9uZW50cy50c3hcbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJDb250ZXh0MigpIHtcbiAgbGV0IGNvbnRleHQgPSBSZWFjdDgudXNlQ29udGV4dChEYXRhUm91dGVyQ29udGV4dCk7XG4gIGludmFyaWFudDIoXG4gICAgY29udGV4dCxcbiAgICBcIllvdSBtdXN0IHJlbmRlciB0aGlzIGVsZW1lbnQgaW5zaWRlIGEgPERhdGFSb3V0ZXJDb250ZXh0LlByb3ZpZGVyPiBlbGVtZW50XCJcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5mdW5jdGlvbiB1c2VEYXRhUm91dGVyU3RhdGVDb250ZXh0KCkge1xuICBsZXQgY29udGV4dCA9IFJlYWN0OC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQyKFxuICAgIGNvbnRleHQsXG4gICAgXCJZb3UgbXVzdCByZW5kZXIgdGhpcyBlbGVtZW50IGluc2lkZSBhIDxEYXRhUm91dGVyU3RhdGVDb250ZXh0LlByb3ZpZGVyPiBlbGVtZW50XCJcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG52YXIgRnJhbWV3b3JrQ29udGV4dCA9IFJlYWN0OC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7XG5GcmFtZXdvcmtDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJGcmFtZXdvcmtDb250ZXh0XCI7XG5mdW5jdGlvbiB1c2VGcmFtZXdvcmtDb250ZXh0KCkge1xuICBsZXQgY29udGV4dCA9IFJlYWN0OC51c2VDb250ZXh0KEZyYW1ld29ya0NvbnRleHQpO1xuICBpbnZhcmlhbnQyKFxuICAgIGNvbnRleHQsXG4gICAgXCJZb3UgbXVzdCByZW5kZXIgdGhpcyBlbGVtZW50IGluc2lkZSBhIDxIeWRyYXRlZFJvdXRlcj4gZWxlbWVudFwiXG4gICk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuZnVuY3Rpb24gdXNlUHJlZmV0Y2hCZWhhdmlvcihwcmVmZXRjaCwgdGhlaXJFbGVtZW50UHJvcHMpIHtcbiAgbGV0IGZyYW1ld29ya0NvbnRleHQgPSBSZWFjdDgudXNlQ29udGV4dChGcmFtZXdvcmtDb250ZXh0KTtcbiAgbGV0IFttYXliZVByZWZldGNoLCBzZXRNYXliZVByZWZldGNoXSA9IFJlYWN0OC51c2VTdGF0ZShmYWxzZSk7XG4gIGxldCBbc2hvdWxkUHJlZmV0Y2gsIHNldFNob3VsZFByZWZldGNoXSA9IFJlYWN0OC51c2VTdGF0ZShmYWxzZSk7XG4gIGxldCB7IG9uRm9jdXMsIG9uQmx1ciwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUsIG9uVG91Y2hTdGFydCB9ID0gdGhlaXJFbGVtZW50UHJvcHM7XG4gIGxldCByZWYgPSBSZWFjdDgudXNlUmVmKG51bGwpO1xuICBSZWFjdDgudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJlZmV0Y2ggPT
2511409IFwicmVuZGVyXCIpIHtcbiAgICAgIHNldFNob3VsZFByZWZldGNoKHRydWUpO1xuICAgIH1cbiAgICBpZiAocHJlZmV0Y2ggPT09IFwidmlld3BvcnRcIikge1xuICAgICAgbGV0IGNhbGxiYWNrID0gKGVudHJpZXMpID0+IHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHNldFNob3VsZFByZWZldGNoKGVudHJ5LmlzSW50ZXJzZWN0aW5nKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCB7IHRocmVzaG9sZDogMC41IH0pO1xuICAgICAgaWYgKHJlZi5jdXJyZW50KSBvYnNlcnZlci5vYnNlcnZlKHJlZi5jdXJyZW50KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbcHJlZmV0Y2hdKTtcbiAgUmVhY3Q4LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1heWJlUHJlZmV0Y2gpIHtcbiAgICAgIGxldCBpZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRTaG91bGRQcmVmZXRjaCh0cnVlKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFttYXliZVByZWZldGNoXSk7XG4gIGxldCBzZXRJbnRlbnQgPSAoKSA9PiB7XG4gICAgc2V0TWF5YmVQcmVmZXRjaCh0cnVlKTtcbiAgfTtcbiAgbGV0IGNhbmNlbEludGVudCA9ICgpID0+IHtcbiAgICBzZXRNYXliZVByZWZldGNoKGZhbHNlKTtcbiAgICBzZXRTaG91bGRQcmVmZXRjaChmYWxzZSk7XG4gIH07XG4gIGlmICghZnJhbWV3b3JrQ29udGV4dCkge1xuICAgIHJldHVybiBbZmFsc2UsIHJlZiwge31dO1xuICB9XG4gIGlmIChwcmVmZXRjaCAhPT0gXCJpbnRlbnRcIikge1xuICAgIHJldHVybiBbc2hvdWxkUHJlZmV0Y2gsIHJlZiwge31dO1xuICB9XG4gIHJldHVybiBbXG4gICAgc2hvdWxkUHJlZmV0Y2gsXG4gICAgcmVmLFxuICAgIHtcbiAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRm9jdXMsIHNldEludGVudCksXG4gICAgICBvbkJsdXI6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQmx1ciwgY2FuY2VsSW50ZW50KSxcbiAgICAgIG9uTW91c2VFbnRlcjogY29tcG9zZUV2ZW50SGFuZGxlcnMob25Nb3VzZUVudGVyLCBzZXRJbnRlbnQpLFxuICAgICAgb25Nb3VzZUxlYXZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhvbk1vdXNlTGVhdmUsIGNhbmNlbEludGVudCksXG4gICAgICBvblRvdWNoU3RhcnQ6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uVG91Y2hTdGFydCwgc2V0SW50ZW50KVxuICAgIH1cbiAgXTtcbn1cbmZ1bmN0aW9uIGNvbXBvc2VFdmVudEhhbmRsZXJzKHRoZWlySGFuZGxlciwgb3VySGFuZGxlcikge1xuICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgdGhlaXJIYW5kbGVyICYmIHRoZWlySGFuZGxlcihldmVudCk7XG4gICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICBvdXJIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBnZXRBY3RpdmVNYXRjaGVzKG1hdGNoZXMsIGVycm9ycywgaXNTcGFNb2RlKSB7XG4gIGlmIChpc1NwYU1vZGUgJiYgIWlzSHlkcmF0ZWQpIHtcbiAgICByZXR1cm4gW21hdGNoZXNbMF1dO1xuICB9XG4gIGlmIChlcnJvcnMpIHtcbiAgICBsZXQgZXJyb3JJZHggPSBtYXRjaGVzLmZpbmRJbmRleCgobSkgPT4gZXJyb3JzW20ucm91dGUuaWRdICE9PSB2b2lkIDApO1xuICAgIHJldHVybiBtYXRjaGVzLnNsaWNlKDAsIGVycm9ySWR4ICsgMSk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59XG52YXIgQ1JJVElDQUxfQ1NTX0RBVEFfQVRUUklCVVRFID0gXCJkYXRhLXJlYWN0LXJvdXRlci1jcml0aWNhbC1jc3NcIjtcbmZ1bmN0aW9uIExpbmtzKHsgbm9uY2UgfSkge1xuICBsZXQgeyBpc1NwYU1vZGUsIG1hbmlmZXN0LCByb3V0ZU1vZHVsZXMsIGNyaXRpY2FsQ3NzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCB7IGVycm9ycywgbWF0Y2hlczogcm91dGVyTWF0Y2hlcyB9ID0gdXNlRGF0YVJvdXRlclN0YXRlQ29udGV4dCgpO1xuICBsZXQgbWF0Y2hlcyA9IGdldEFjdGl2ZU1hdGNoZXMocm91dGVyTWF0Y2hlcywgZXJyb3JzLCBpc1NwYU1vZGUpO1xuICBsZXQga2V5ZWRMaW5rcyA9IFJlYWN0OC51c2VNZW1vKFxuICAgICgpID0+IGdldEtleWVkTGlua3NGb3JNYXRjaGVzKG1hdGNoZXMsIHJvdXRlTW9kdWxlcywgbWFuaWZlc3QpLFxuICAgIFttYXRjaGVzLCByb3V0ZU1vZHVsZXMsIG1hbmlmZXN0XVxuICApO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgdHlwZW9mIGNyaXRpY2FsQ3NzID09PSBcInN0cmluZ1wiID8gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgIFwic3R5bGVcIixcbiAgICB7XG4gICAgICAuLi57IFtDUklUSUNBTF9DU1NfREFUQV9BVFRSSUJVVEVdOiBcIlwiIH0sXG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IGNyaXRpY2FsQ3NzIH1cbiAgICB9XG4gICkgOiBudWxsLCB0eXBlb2YgY3JpdGljYWxDc3MgPT09IFwib2JqZWN0XCIgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJsaW5rXCIsXG4gICAge1xuICAgICAgLi4ueyBbQ1JJVElDQUxfQ1NTX0RBVEFfQVRUUklCVVRFXTogXCJcIiB9LFxuICAgICAgcmVsOiBcInN0eWxlc2hlZXRcIixcbiAgICAgIGhyZWY6IGNyaXRpY2FsQ3NzLmhyZWYsXG4gICAgICBub25jZVxuICAgIH1cbiAgKSA6IG51bGwsIGtleWVkTGlua3MubWFwKFxuICAgICh7IGtleSwgbGluayB9KSA9PiBpc1BhZ2VM
25114aW5rRGVzY3JpcHRvcihsaW5rKSA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChQcmVmZXRjaFBhZ2VMaW5rcywgeyBrZXksIG5vbmNlLCAuLi5saW5rIH0pIDogLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibGlua1wiLCB7IGtleSwgbm9uY2UsIC4uLmxpbmsgfSlcbiAgKSk7XG59XG5mdW5jdGlvbiBQcmVmZXRjaFBhZ2VMaW5rcyh7IHBhZ2UsIC4uLmxpbmtQcm9wcyB9KSB7XG4gIGxldCB7IHJvdXRlciB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQyKCk7XG4gIGxldCBtYXRjaGVzID0gUmVhY3Q4LnVzZU1lbW8oXG4gICAgKCkgPT4gbWF0Y2hSb3V0ZXMocm91dGVyLnJvdXRlcywgcGFnZSwgcm91dGVyLmJhc2VuYW1lKSxcbiAgICBbcm91dGVyLnJvdXRlcywgcGFnZSwgcm91dGVyLmJhc2VuYW1lXVxuICApO1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFByZWZldGNoUGFnZUxpbmtzSW1wbCwgeyBwYWdlLCBtYXRjaGVzLCAuLi5saW5rUHJvcHMgfSk7XG59XG5mdW5jdGlvbiB1c2VLZXllZFByZWZldGNoTGlua3MobWF0Y2hlcykge1xuICBsZXQgeyBtYW5pZmVzdCwgcm91dGVNb2R1bGVzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCBba2V5ZWRQcmVmZXRjaExpbmtzLCBzZXRLZXllZFByZWZldGNoTGlua3NdID0gUmVhY3Q4LnVzZVN0YXRlKFtdKTtcbiAgUmVhY3Q4LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGludGVycnVwdGVkID0gZmFsc2U7XG4gICAgdm9pZCBnZXRLZXllZFByZWZldGNoTGlua3MobWF0Y2hlcywgbWFuaWZlc3QsIHJvdXRlTW9kdWxlcykudGhlbihcbiAgICAgIChsaW5rcykgPT4ge1xuICAgICAgICBpZiAoIWludGVycnVwdGVkKSB7XG4gICAgICAgICAgc2V0S2V5ZWRQcmVmZXRjaExpbmtzKGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGludGVycnVwdGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbbWF0Y2hlcywgbWFuaWZlc3QsIHJvdXRlTW9kdWxlc10pO1xuICByZXR1cm4ga2V5ZWRQcmVmZXRjaExpbmtzO1xufVxuZnVuY3Rpb24gUHJlZmV0Y2hQYWdlTGlua3NJbXBsKHtcbiAgcGFnZSxcbiAgbWF0Y2hlczogbmV4dE1hdGNoZXMsXG4gIC4uLmxpbmtQcm9wc1xufSkge1xuICBsZXQgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgeyBtYW5pZmVzdCwgcm91dGVNb2R1bGVzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCB7IGJhc2VuYW1lIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dDIoKTtcbiAgbGV0IHsgbG9hZGVyRGF0YSwgbWF0Y2hlcyB9ID0gdXNlRGF0YVJvdXRlclN0YXRlQ29udGV4dCgpO1xuICBsZXQgbmV3TWF0Y2hlc0ZvckRhdGEgPSBSZWFjdDgudXNlTWVtbyhcbiAgICAoKSA9PiBnZXROZXdNYXRjaGVzRm9yTGlua3MoXG4gICAgICBwYWdlLFxuICAgICAgbmV4dE1hdGNoZXMsXG4gICAgICBtYXRjaGVzLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIFwiZGF0YVwiXG4gICAgKSxcbiAgICBbcGFnZSwgbmV4dE1hdGNoZXMsIG1hdGNoZXMsIG1hbmlmZXN0LCBsb2NhdGlvbl1cbiAgKTtcbiAgbGV0IG5ld01hdGNoZXNGb3JBc3NldHMgPSBSZWFjdDgudXNlTWVtbyhcbiAgICAoKSA9PiBnZXROZXdNYXRjaGVzRm9yTGlua3MoXG4gICAgICBwYWdlLFxuICAgICAgbmV4dE1hdGNoZXMsXG4gICAgICBtYXRjaGVzLFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIFwiYXNzZXRzXCJcbiAgICApLFxuICAgIFtwYWdlLCBuZXh0TWF0Y2hlcywgbWF0Y2hlcywgbWFuaWZlc3QsIGxvY2F0aW9uXVxuICApO1xuICBsZXQgZGF0YUhyZWZzID0gUmVhY3Q4LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChwYWdlID09PSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCArIGxvY2F0aW9uLmhhc2gpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJvdXRlc1BhcmFtcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgbGV0IGZvdW5kT3B0T3V0Um91dGUgPSBmYWxzZTtcbiAgICBuZXh0TWF0Y2hlcy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICBsZXQgbWFuaWZlc3RSb3V0ZSA9IG1hbmlmZXN0LnJvdXRlc1ttLnJvdXRlLmlkXTtcbiAgICAgIGlmICghbWFuaWZlc3RSb3V0ZSB8fCAhbWFuaWZlc3RSb3V0ZS5oYXNMb2FkZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFuZXdNYXRjaGVzRm9yRGF0YS5zb21lKChtMikgPT4gbTIucm91dGUuaWQgPT09IG0ucm91dGUuaWQpICYmIG0ucm91dGUuaWQgaW4gbG9hZGVyRGF0YSAmJiByb3V0ZU1vZHVsZXNbbS5yb3V0ZS5pZF0/LnNob3VsZFJldmFsaWRhdGUpIHtcbiAgICAgICAgZm91bmRPcHRPdXRSb3V0ZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG1hbmlmZXN0Um91dGUuaGFzQ2xpZW50TG9hZGVyKSB7XG4gICAgICAgIGZvdW5kT3B0T3V0Um91dGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm91dGVzUGFyYW1zLmFkZChtLnJvdXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocm91dGVzUGFyYW1zLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHVybCA9IHNpbmdsZUZldGNoVXJsKHBhZ2UsIGJhc2VuYW1lLCBcImRhdGFcIik7XG4gICAgaWYgKGZvdW5kT3B0T3V0Um91dGUgJiYgcm91dGVzUGFyYW1zLnNpemUgPiAwKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcbiAgICAgICAgXCJfcm91dGVzXCIsXG4gICAgICAgIG5leHRNYXRjaGVzLmZpbHRlcigobSkgPT4gcm91dGVzUGFyYW1zLmhhcyhtLnJvdXRlLmlkKSkubWFwKChtKSA9PiBtLnJvdXRlLmlkKS5qb2luKFwiLFwiKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFt1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXTtcbiAgfSwgW1xuICAgIGJhc2VuYW1lLFxuICAgIGxvYWRlckRhdGEsXG4gICAgbG9jYXRpb24sXG4gICAgbWFuaWZlc3QsXG4gICAgbmV3TWF0Y2hlc0ZvckRhdGEsXG4gICAgbmV4dE1hdGNoZXMsXG4gICAgcGFnZSxcbiAgICByb3V0ZU1vZHVsZXNcbiAgXSk7XG4gIGxldCBtb2R1bGVIcmVmcyA9IFJlYWN0OC51c2VNZW1vKFxuICAgICgpID0+IGdldE1vZHVsZUxpbmtIcmVmcyhuZXdNYXRjaGVzRm9yQXNzZXRzLCBtYW5pZmVzdCksXG4gICAgW25ld01hdGNoZXNGb3JBc3NldHMsIG1hbmlmZXN0XVxuICApO1xuICBsZXQga2V5ZWRQcmVmZXRjaExpbmtzID0gdXNlS2V5ZWRQcmVmZXRjaExpbmtzKG5ld01hdGNoZXNGb3JBc3NldHMpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgZGF0YUhyZWZzLm1hcCgoaHJlZikgPT4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibGlua1wiLCB7IGtleTogaHJlZiwgcmVsOiBcInByZWZldGNoXCIsIGFzOiBcImZldGNoXCIsIGhyZWYsIC4uLmxpbmtQcm9wcyB9KSksIG1vZHVsZUhyZWZzLm1hcCgoaHJlZikgPT4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibGlua1wiLCB7IGtleTogaHJlZiwgcmVsOiBcIm1vZHVsZXByZWxvYWRcIiwgaHJlZiwgLi4ubGlua1Byb3BzIH0pKSwga2V5ZWRQcmVmZXRjaExpbmtzLm1hcCgoeyBrZXksIGxpbmsgfSkgPT4gKFxuICAgIC8vIHRoZXNlIGRvbid0IHNwcmVhZCBgbGlua1Byb3BzYCBiZWNhdXNlIHRoZXkgYXJlIGZ1bGwgbGluayBkZXNjcmlwdG9yc1xuICAgIC8vIGFscmVhZHkgd2l0aCB0aGVpciBvd24gcHJvcHNcbiAgICAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIsIHsga2V5LCBub25jZTogbGlua1Byb3BzLm5vbmNlLCAuLi5saW5rIH0pXG4gICkpKTtcbn1cbmZ1bmN0aW9uIE1ldGEoKSB7XG4gIGxldCB7IGlzU3BhTW9kZSwgcm91dGVNb2R1bGVzIH0gPSB1c2VGcmFtZXdvcmtDb250ZXh0KCk7XG4gIGxldCB7XG4gICAgZXJyb3JzLFxuICAgIG1hdGNoZXM6IHJvdXRlck1hdGNoZXMsXG4gICAgbG9hZGVyRGF0YVxuICB9ID0gdXNlRGF0YVJvdXRlclN0YXRlQ29udGV4dCgpO1xuICBsZXQgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBsZXQgX21hdGNoZXMgPSBnZXRBY3RpdmVNYXRjaGVzKHJvdXRlck1hdGNoZXMsIGVycm9ycywgaXNTcGFNb2RlKTtcbiAgbGV0IGVycm9yID0gbnVsbDtcbiAgaWYgKGVycm9ycykge1xuICAgIGVycm9yID0gZXJyb3JzW19tYXRjaGVzW19tYXRjaGVzLmxlbmd0aCAtIDFdLnJvdXRlLmlkXTtcbiAgfVxuICBsZXQgbWV0YSA9IFtdO1xuICBsZXQgbGVhZk1ldGEgPSBudWxsO1xuICBsZXQgbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IF9tYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IF9tYXRjaCA9IF9tYXRjaGVzW2ldO1xuICAgIGxldCByb3V0ZUlkID0gX21hdGNoLnJvdXRlLmlkO1xuICAgIGxldCBkYXRhMiA9IGxvYWRlckRhdGFbcm91dGVJZF07XG4gICAgbGV0IHBhcmFtcyA9IF9tYXRjaC5wYXJhbXM7XG4gICAgbGV0IHJvdXRlTW9kdWxlID0gcm91dGVNb2R1bGVzW3JvdXRlSWRdO1xuICAgIGxldCByb3V0ZU1ldGEgPSBbXTtcbiAgICBsZXQgbWF0Y2ggPSB7XG4gICAgICBpZDogcm91dGVJZCxcbiAgICAgIGRhdGE6IGRhdGEyLFxuICAgICAgbG9hZGVyRGF0YTogZGF0YTIsXG4gICAgICBtZXRhOiBbXSxcbiAgICAgIHBhcmFtczogX21hdGNoLnBhcmFtcyxcbiAgICAgIHBhdGhuYW1lOiBfbWF0Y2gucGF0aG5hbWUsXG4gICAgICBoYW5kbGU6IF9tYXRjaC5yb3V0ZS5oYW5kbGUsXG4gICAgICBlcnJvclxuICAgIH07XG4gICAgbWF0Y2hlc1tpXSA9IG1hdGNoO1xuICAgIGlmIChyb3V0ZU1vZHVsZT8ubWV0YSkge1xuICAgICAgcm91dGVNZXRhID0gdHlwZW9mIHJvdXRlTW9kdWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIiA/IHJvdXRlTW9kdWxlLm1ldGEoe1xuICAgICAgICBkYXRhOiBkYXRhMixcbiAgICAgICAgbG9hZGVyRGF0YTogZGF0YTIsXG4gICAgICAgI
25114HBhcmFtcyxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGVycm9yXG4gICAgICB9KSA6IEFycmF5LmlzQXJyYXkocm91dGVNb2R1bGUubWV0YSkgPyBbLi4ucm91dGVNb2R1bGUubWV0YV0gOiByb3V0ZU1vZHVsZS5tZXRhO1xuICAgIH0gZWxzZSBpZiAobGVhZk1ldGEpIHtcbiAgICAgIHJvdXRlTWV0YSA9IFsuLi5sZWFmTWV0YV07XG4gICAgfVxuICAgIHJvdXRlTWV0YSA9IHJvdXRlTWV0YSB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocm91dGVNZXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSByb3V0ZSBhdCBcIiArIF9tYXRjaC5yb3V0ZS5wYXRoICsgXCIgcmV0dXJucyBhbiBpbnZhbGlkIHZhbHVlLiBBbGwgcm91dGUgbWV0YSBmdW5jdGlvbnMgbXVzdCByZXR1cm4gYW4gYXJyYXkgb2YgbWV0YSBvYmplY3RzLlxcblxcblRvIHJlZmVyZW5jZSB0aGUgbWV0YSBmdW5jdGlvbiBBUEksIHNlZSBodHRwczovL3JlbWl4LnJ1bi9yb3V0ZS9tZXRhXCJcbiAgICAgICk7XG4gICAgfVxuICAgIG1hdGNoLm1ldGEgPSByb3V0ZU1ldGE7XG4gICAgbWF0Y2hlc1tpXSA9IG1hdGNoO1xuICAgIG1ldGEgPSBbLi4ucm91dGVNZXRhXTtcbiAgICBsZWFmTWV0YSA9IG1ldGE7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChSZWFjdDguRnJhZ21lbnQsIG51bGwsIG1ldGEuZmxhdCgpLm1hcCgobWV0YVByb3BzKSA9PiB7XG4gICAgaWYgKCFtZXRhUHJvcHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoXCJ0YWdOYW1lXCIgaW4gbWV0YVByb3BzKSB7XG4gICAgICBsZXQgeyB0YWdOYW1lLCAuLi5yZXN0IH0gPSBtZXRhUHJvcHM7XG4gICAgICBpZiAoIWlzVmFsaWRNZXRhVGFnKHRhZ05hbWUpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgQSBtZXRhIG9iamVjdCB1c2VzIGFuIGludmFsaWQgdGFnTmFtZTogJHt0YWdOYW1lfS4gRXhwZWN0ZWQgZWl0aGVyICdsaW5rJyBvciAnbWV0YSdgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGV0IENvbXAgPSB0YWdOYW1lO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChDb21wLCB7IGtleTogSlNPTi5zdHJpbmdpZnkocmVzdCksIC4uLnJlc3QgfSk7XG4gICAgfVxuICAgIGlmIChcInRpdGxlXCIgaW4gbWV0YVByb3BzKSB7XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgeyBrZXk6IFwidGl0bGVcIiB9LCBTdHJpbmcobWV0YVByb3BzLnRpdGxlKSk7XG4gICAgfVxuICAgIGlmIChcImNoYXJzZXRcIiBpbiBtZXRhUHJvcHMpIHtcbiAgICAgIG1ldGFQcm9wcy5jaGFyU2V0ID8/IChtZXRhUHJvcHMuY2hhclNldCA9IG1ldGFQcm9wcy5jaGFyc2V0KTtcbiAgICAgIGRlbGV0ZSBtZXRhUHJvcHMuY2hhcnNldDtcbiAgICB9XG4gICAgaWYgKFwiY2hhclNldFwiIGluIG1ldGFQcm9wcyAmJiBtZXRhUHJvcHMuY2hhclNldCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG1ldGFQcm9wcy5jaGFyU2V0ID09PSBcInN0cmluZ1wiID8gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibWV0YVwiLCB7IGtleTogXCJjaGFyU2V0XCIsIGNoYXJTZXQ6IG1ldGFQcm9wcy5jaGFyU2V0IH0pIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKFwic2NyaXB0OmxkK2pzb25cIiBpbiBtZXRhUHJvcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkobWV0YVByb3BzW1wic2NyaXB0OmxkK2pzb25cIl0pO1xuICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFwic2NyaXB0XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiBgc2NyaXB0OmxkK2pzb246JHtqc29ufWAsXG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL2xkK2pzb25cIixcbiAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogZXNjYXBlSHRtbChqc29uKSB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFwibWV0YVwiLCB7IGtleTogSlNPTi5zdHJpbmdpZnkobWV0YVByb3BzKSwgLi4ubWV0YVByb3BzIH0pO1xuICB9KSk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkTWV0YVRhZyh0YWdOYW1lKSB7XG4gIHJldHVybiB0eXBlb2YgdGFnTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAvXihtZXRhfGxpbmspJC8udGVzdCh0YWdOYW1lKTtcbn1cbnZhciBpc0h5ZHJhdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBzZXRJc0h5ZHJhdGVkKCkge1xuICBpc0h5ZHJhdGVkID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIFNjcmlwdHMoc2NyaXB0UHJvcHMpIHtcbiAgbGV0IHtcbiAgICBtYW5pZmVzdCxcbiAgICBzZXJ2ZXJIYW5kb2ZmU3RyaW5nLFxuICAgIGlzU3BhTW9kZSxcbiAgICByZW5kZXJNZXRhLFxuICAgIHJvdXRlRGlzY292ZXJ5LFxuICAgIHNzclxuICB9ID0gdXNlRnJhbWV3b3JrQ29udGV4dCgpO1xuICBsZXQgeyByb3V0ZXIsIHN0YXRpYzogaXNTdGF0aWMsIHN0YXRpY0NvbnRleHQgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0MigpO1xuICBsZXQgeyBtYXRjaGVzOiByb3V0ZXJNYXRjaGVzIH0gPSB1c2VEYXRhUm91dGVyU3RhdGVDb250ZXh0KCk7XG4gIGxldCBpc1JTQ1JvdXRlckNvbnRleHQgPSB1c2VJc1JTQ1JvdXRlckNvbnRleHQoKTtcbiAgbGV0IGVuYWJsZUZvZ09mV2FyID0gaXNGb2dPZldhckVuYWJsZWQocm91dGVEaXNjb3ZlcnksIHNzcik7XG4gIGlmIChyZW5kZXJNZXRhKSB7XG4gICAgcmVuZGVyTWV0YS5kaWRSZW5kZXJTY3JpcHRzID0gdHJ1ZTtcbiAgfVxuICBsZXQgbWF0Y2hlcyA9IGdldEFjdGl2ZU1hdGNoZXMocm91dGVyTWF0Y2hlcywgbnVsbCwgaXNTcGFNb2RlKTtcbiAgUmVhY3Q4LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0SXNIeWRyYXRlZCgpO1xuICB9LCBbXSk7XG4gIGxldCBpbml0aWFsU2NyaXB0cyA9IFJlYWN0OC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoaXNSU0NSb3V0ZXJDb250ZXh0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHN0cmVhbVNjcmlwdCA9IFwid2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0LnN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQoY29udHJvbGxlcil7d2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0LnN0cmVhbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO319KS5waXBlVGhyb3VnaChuZXcgVGV4dEVuY29kZXJTdHJlYW0oKSk7XCI7XG4gICAgbGV0IGNvbnRleHRTY3JpcHQgPSBzdGF0aWNDb250ZXh0ID8gYHdpbmRvdy5fX3JlYWN0Um91dGVyQ29udGV4dCA9ICR7c2VydmVySGFuZG9mZlN0cmluZ307JHtzdHJlYW1TY3JpcHR9YCA6IFwiIFwiO1xuICAgIGxldCByb3V0ZU1vZHVsZXNTY3JpcHQgPSAhaXNTdGF0aWMgPyBcIiBcIiA6IGAke21hbmlmZXN0Lmhtcj8ucnVudGltZSA/IGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5obXIucnVudGltZSl9O2AgOiBcIlwifSR7IWVuYWJsZUZvZ09mV2FyID8gYGltcG9ydCAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LnVybCl9YCA6IFwiXCJ9O1xuJHttYXRjaGVzLm1hcCgobWF0Y2gsIHJvdXRlSW5kZXgpID0+IHtcbiAgICAgIGxldCByb3V0ZVZhck5hbWUgPSBgcm91dGUke3JvdXRlSW5kZXh9YDtcbiAgICAgIGxldCBtYW5pZmVzdEVudHJ5ID0gbWFuaWZlc3Qucm91dGVzW21hdGNoLnJvdXRlLmlkXTtcbiAgICAgIGludmFyaWFudDIobWFuaWZlc3RFbnRyeSwgYFJvdXRlICR7bWF0Y2gucm91dGUuaWR9IG5vdCBmb3VuZCBpbiBtYW5pZmVzdGApO1xuICAgICAgbGV0IHtcbiAgICAgICAgY2xpZW50QWN0aW9uTW9kdWxlLFxuICAgICAgICBjbGllbnRMb2FkZXJNb2R1bGUsXG4gICAgICAgIGNsaWVudE1pZGRsZXdhcmVNb2R1bGUsXG4gICAgICAgIGh5ZHJhdGVGYWxsYmFja01vZHVsZSxcbiAgICAgICAgbW9kdWxlXG4gICAgICB9ID0gbWFuaWZlc3RFbnRyeTtcbiAgICAgIGxldCBjaHVua3MgPSBbXG4gICAgICAgIC4uLmNsaWVudEFjdGlvbk1vZHVsZSA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGU6IGNsaWVudEFjdGlvbk1vZHVsZSxcbiAgICAgICAgICAgI
25114HZhck5hbWU6IGAke3JvdXRlVmFyTmFtZX1fY2xpZW50QWN0aW9uYFxuICAgICAgICAgIH1cbiAgICAgICAgXSA6IFtdLFxuICAgICAgICAuLi5jbGllbnRMb2FkZXJNb2R1bGUgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlOiBjbGllbnRMb2FkZXJNb2R1bGUsXG4gICAgICAgICAgICB2YXJOYW1lOiBgJHtyb3V0ZVZhck5hbWV9X2NsaWVudExvYWRlcmBcbiAgICAgICAgICB9XG4gICAgICAgIF0gOiBbXSxcbiAgICAgICAgLi4uY2xpZW50TWlkZGxld2FyZU1vZHVsZSA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGU6IGNsaWVudE1pZGRsZXdhcmVNb2R1bGUsXG4gICAgICAgICAgICB2YXJOYW1lOiBgJHtyb3V0ZVZhck5hbWV9X2NsaWVudE1pZGRsZXdhcmVgXG4gICAgICAgICAgfVxuICAgICAgICBdIDogW10sXG4gICAgICAgIC4uLmh5ZHJhdGVGYWxsYmFja01vZHVsZSA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGU6IGh5ZHJhdGVGYWxsYmFja01vZHVsZSxcbiAgICAgICAgICAgIHZhck5hbWU6IGAke3JvdXRlVmFyTmFtZX1fSHlkcmF0ZUZhbGxiYWNrYFxuICAgICAgICAgIH1cbiAgICAgICAgXSA6IFtdLFxuICAgICAgICB7IG1vZHVsZSwgdmFyTmFtZTogYCR7cm91dGVWYXJOYW1lfV9tYWluYCB9XG4gICAgICBdO1xuICAgICAgaWYgKGNodW5rcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgKiBhcyAke3JvdXRlVmFyTmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KG1vZHVsZSl9O2A7XG4gICAgICB9XG4gICAgICBsZXQgY2h1bmtJbXBvcnRzU25pcHBldCA9IGNodW5rcy5tYXAoKGNodW5rKSA9PiBgaW1wb3J0ICogYXMgJHtjaHVuay52YXJOYW1lfSBmcm9tIFwiJHtjaHVuay5tb2R1bGV9XCI7YCkuam9pbihcIlxcblwiKTtcbiAgICAgIGxldCBtZXJnZWRDaHVua3NTbmlwcGV0ID0gYGNvbnN0ICR7cm91dGVWYXJOYW1lfSA9IHske2NodW5rcy5tYXAoKGNodW5rKSA9PiBgLi4uJHtjaHVuay52YXJOYW1lfWApLmpvaW4oXCIsXCIpfX07YDtcbiAgICAgIHJldHVybiBbY2h1bmtJbXBvcnRzU25pcHBldCwgbWVyZ2VkQ2h1bmtzU25pcHBldF0uam9pbihcIlxcblwiKTtcbiAgICB9KS5qb2luKFwiXFxuXCIpfVxuICAke2VuYWJsZUZvZ09mV2FyID8gKFxuICAgICAgLy8gSW5saW5lIGEgbWluaW1hbCBtYW5pZmVzdCB3aXRoIHRoZSBTU1IgbWF0Y2hlc1xuICAgICAgYHdpbmRvdy5fX3JlYWN0Um91dGVyTWFuaWZlc3QgPSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBnZXRQYXJ0aWFsTWFuaWZlc3QobWFuaWZlc3QsIHJvdXRlciksXG4gICAgICAgIG51bGwsXG4gICAgICAgIDJcbiAgICAgICl9O2BcbiAgICApIDogXCJcIn1cbiAgd2luZG93Ll9fcmVhY3RSb3V0ZXJSb3V0ZU1vZHVsZXMgPSB7JHttYXRjaGVzLm1hcCgobWF0Y2gsIGluZGV4KSA9PiBgJHtKU09OLnN0cmluZ2lmeShtYXRjaC5yb3V0ZS5pZCl9OnJvdXRlJHtpbmRleH1gKS5qb2luKFwiLFwiKX19O1xuXG5pbXBvcnQoJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdC5lbn
25114RyeS5tb2R1bGUpfSk7YDtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgICAgXCJzY3JpcHRcIixcbiAgICAgIHtcbiAgICAgICAgLi4uc2NyaXB0UHJvcHMsXG4gICAgICAgIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZzogdHJ1ZSxcbiAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBjb250ZXh0U2NyaXB0IH0sXG4gICAgICAgIHR5cGU6IHZvaWQgMFxuICAgICAgfVxuICAgICksIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChcbiAgICAgIFwic2NyaXB0XCIsXG4gICAgICB7XG4gICAgICAgIC4uLnNjcmlwdFByb3BzLFxuICAgICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWUsXG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogcm91dGVNb2R1bGVzU2NyaXB0IH0sXG4gICAgICAgIHR5cGU6IFwibW9kdWxlXCIsXG4gICAgICAgIGFzeW5jOiB0cnVlXG4gICAgICB9XG4gICAgKSk7XG4gIH0sIFtdKTtcbiAgbGV0IHByZWxvYWRzID0gaXNIeWRyYXRlZCB8fCBpc1JTQ1JvdXRlckNvbnRleHQgPyBbXSA6IGRlZHVwZShcbiAgICBtYW5pZmVzdC5lbnRyeS5pbXBvcnRzLmNvbmNhdChcbiAgICAgIGdldE1vZHVsZUxpbmtIcmVmcyhtYXRjaGVzLCBtYW5pZmVzdCwge1xuICAgICAgICBpbmNsdWRlSHlkcmF0ZUZhbGxiYWNrOiB0cnVlXG4gICAgICB9KVxuICAgIClcbiAgKTtcbiAgbGV0IHNyaSA9IHR5cGVvZiBtYW5pZmVzdC5zcmkgPT09IFwib2JqZWN0XCIgPyBtYW5pZmVzdC5zcmkgOiB7fTtcbiAgd2Fybk9uY2UoXG4gICAgIWlzUlNDUm91dGVyQ29udGV4dCxcbiAgICBcIlRoZSA8U2NyaXB0cyAvPiBlbGVtZW50IGlzIGEgbm8tb3Agd2hlbiB1c2luZyBSU0MgYW5kIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZC5cIlxuICApO1xuICByZXR1cm4gaXNIeWRyYXRlZCB8fCBpc1JTQ1JvdXRlckNvbnRleHQgPyBudWxsIDogLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFJlYWN0OC5GcmFnbWVudCwgbnVsbCwgdHlwZW9mIG1hbmlmZXN0LnNyaSA9PT0gXCJvYmplY3RcIiA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDguY3JlYXRlRWxlbWVudChcbiAgICBcInNjcmlwdFwiLFxuICAgIHtcbiAgICAgIFwicnItaW1wb3J0bWFwXCI6IFwiXCIsXG4gICAgICB0eXBlOiBcImltcG9ydG1hcFwiLFxuICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlLFxuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgICAgX19odG1sOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaW50ZWdyaXR5OiBzcmlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICkgOiBudWxsLCAhZW5hYmxlRm9nT2ZXYXIgPyAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJsaW5rXCIsXG4gICAge1xuICAgICAgcmVsOiBcIm1vZHVsZXByZWxvYWRcIixcbiAgICAgIGhyZWY6IG1hbmlmZXN0LnVybCxcbiAgICAgIGNyb3NzT3JpZ2luOiBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbixcbiAgICAgIGludGVncml0eTogc3JpW21hbmlmZXN0LnVybF0sXG4gICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWVcbiAgICB9XG4gICkgOiBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q4LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJsaW5rXCIsXG4gICAge1xuICAgICAgcmVsOiBcIm1vZHVsZXByZWxvYWRcIixcbiAgICAgIGhyZWY6IG1hbmlmZXN0LmVudHJ5Lm1vZHVsZSxcbiAgICAgIGNyb3NzT3JpZ2luOiBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbixcbiAgICAgIGludGVncml0eTogc3JpW21hbmlmZXN0LmVudHJ5Lm1vZHVsZV0sXG4gICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWVcbiAgICB9XG4gICksIHByZWxvYWRzLm1hcCgocGF0aCkgPT4gLyogQF9fUFVSRV9fICovIFJlYWN0OC5jcmVhdGVFbGVtZW50KFxuICAgIFwibGlua1wiLFxuICAgIHtcbiAgICAgIGtleTogcGF0aCxcbiAgICAgIHJlbDogXCJtb2R1bGVwcmVsb2FkXCIsXG4gICAgICBocmVmOiBwYXRoLFxuICAgICAgY3Jvc3NPcmlnaW46IHNjcmlwdFByb3BzLmNyb3NzT3JpZ2luLFxuICAgICAgaW50ZWdyaXR5OiBzcmlbcGF0aF0sXG4gICAgICBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc6IHRydWVcbiAgICB9XG4gICkpLCBpbml0aWFsU2NyaXB0cyk7XG59XG5mdW5jdGlvbiBkZWR1cGUoYXJyYXkpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGFycmF5KV07XG59XG5mdW5jdGlvbiBtZXJnZVJlZnMoLi4ucmVmcykge1xuICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmVmKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gbGliL2RvbS9zc3IvZXJyb3JCb3VuZGFyaWVzLnRzeFxudmFyIFJlbWl4RXJyb3JCb3VuZGFyeSA9IGNsYXNzIGV4dGVuZHMgUmVhY3Q5LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGVycm9yOiBwcm9wcy5lcnJvciB8fCBudWxsLCBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24gfTtcbiAgfVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgfVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5sb2NhdGlvbiAhPT0gcHJvcHMubG9jYXRpb24pIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBwcm9wcy5lcnJvciB8fCBudWxsLCBsb2NhdGlvbjogcHJvcHMubG9jYXRpb24gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZXJyb3I6IHByb3BzLmVycm9yIHx8IHN0YXRlLmVycm9yLCBsb2NhdGlvbjogc3RhdGUubG9jYXRpb24gfTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFJlbWl4Um9vdERlZmF1bHRFcnJvckJvdW5kYXJ5LFxuICAgICAgICB7XG4gICAgICAgICAgZXJyb3I6IHRoaXMuc3RhdGUuZXJyb3IsXG4gICAgICAgICAgaXNPdXRzaWRlUmVtaXhBcHA6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gUmVtaXhSb290RGVmYXVsdEVycm9yQm91bmRhcnkoe1xuICBlcnJvcixcbiAgaXNPdXRzaWRlUmVtaXhBcHBcbn0pIHtcbiAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIGxldCBoZXlEZXZlbG9wZXIgPSAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXG4gICAgXCJzY3JpcHRcIixcbiAgICB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICBfX2h0bWw6IGBcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgXCJcXHV7MUY0QkZ9IEhleSBkZXZlbG9wZXIgXFx1ezFGNDRCfS4gWW91IGNhbiBwcm92aWRlIGEgd2F5IGJldHRlciBVWCB0aGFuIHRoaXMgd2hlbiB5b3VyIGFwcCB0aHJvd3MgZXJyb3JzLiBDaGVjayBvdXQgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vaG93LXRvL2Vycm9yLWJvdW5kYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uLlwiXG4gICAgICAgICk7XG4gICAgICBgXG4gICAgICB9XG4gICAgfVxuICApO1xuICBpZiAoaXNSb3V0ZUVycm9yUmVzcG9uc2UoZXJyb3IpKSB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChCb3VuZGFyeVNoZWxsLCB7IHRpdGxlOiBcIlVuaGFuZGxlZCBUaHJvd24gUmVzcG9uc2UhXCIgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwiaDFcIiwgeyBzdHlsZTogeyBmb250U2l6ZTogXCIyNHB4XCIgfSB9LCBlcnJvci5zdGF0dXMsIFwiIFwiLCBlcnJvci5zdGF0dXNUZXh0KSwgRU5BQkxFX0RFVl9XQVJOSU5HUyA/IGhleURldmVsb3BlciA6IG51bGwpO1xuICB9XG4gIGxldCBlcnJvckluc3RhbmNlO1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGVycm9ySW5zdGFuY2UgPSBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgZXJyb3JTdHJpbmcgPSBlcnJvciA9PSBudWxsID8gXCJVbmtub3duIEVycm9yXCIgOiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJ0b1N0cmluZ1wiIGluIGVycm9yID8gZXJyb3IudG9TdHJpbmc
25114oKSA6IEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICBlcnJvckluc3RhbmNlID0gbmV3IEVycm9yKGVycm9yU3RyaW5nKTtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFxuICAgIEJvdW5kYXJ5U2hlbGwsXG4gICAge1xuICAgICAgdGl0bGU6IFwiQXBwbGljYXRpb24gRXJyb3IhXCIsXG4gICAgICBpc091dHNpZGVSZW1peEFwcFxuICAgIH0sXG4gICAgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwiaDFcIiwgeyBzdHlsZTogeyBmb250U2l6ZTogXCIyNHB4XCIgfSB9LCBcIkFwcGxpY2F0aW9uIEVycm9yXCIpLFxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChcbiAgICAgIFwicHJlXCIsXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcGFkZGluZzogXCIycmVtXCIsXG4gICAgICAgICAgYmFja2dyb3VuZDogXCJoc2xhKDEwLCA1MCUsIDUwJSwgMC4xKVwiLFxuICAgICAgICAgIGNvbG9yOiBcInJlZFwiLFxuICAgICAgICAgIG92ZXJmbG93OiBcImF1dG9cIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3JJbnN0YW5jZS5zdGFja1xuICAgICksXG4gICAgaGV5RGV2ZWxvcGVyXG4gICk7XG59XG5mdW5jdGlvbiBCb3VuZGFyeVNoZWxsKHtcbiAgdGl0bGUsXG4gIHJlbmRlclNjcmlwdHMsXG4gIGlzT3V0c2lkZVJlbWl4QXBwLFxuICBjaGlsZHJlblxufSkge1xuICBsZXQgeyByb3V0ZU1vZHVsZXMgfSA9IHVzZUZyYW1ld29ya0NvbnRleHQoKTtcbiAgaWYgKHJvdXRlTW9kdWxlcy5yb290Py5MYXlvdXQgJiYgIWlzT3V0c2lkZVJlbWl4QXBwKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXCJodG1sXCIsIHsgbGFuZzogXCJlblwiIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChcImhlYWRcIiwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwibWV0YVwiLCB7IGNoYXJTZXQ6IFwidXRmLThcIiB9KSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFxuICAgIFwibWV0YVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmlld3BvcnRcIixcbiAgICAgIGNvbnRlbnQ6IFwid2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSx2aWV3cG9ydC1maXQ9Y292ZXJcIlxuICAgIH1cbiAgKSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgdGl0bGUpKSwgLyogQF9fUFVSRV9fICovIFJlYWN0OS5jcmVhdGVFbGVtZW50KFwiYm9keVwiLCBudWxsLCAvKiBAX19QVVJFX18gKi8gUmVhY3Q5LmNyZWF0ZUVsZW1lbnQoXCJtYWluXCIsIHsgc3R5bGU6IHsgZm9udEZhbWlseTogXCJzeXN0ZW0tdWksIHNhbnMtc2VyaWZcIiwgcGFkZGluZzogXCIycmVtXCIgfSB9LCBjaGlsZHJlbiwgcmVuZGVyU2NyaXB0cyA/IC8qIEBfX1BVUkVfXyAqLyBSZWFjdDkuY3JlYXRlRWxlbWVudChTY3JpcHRzLCBudWxsKSA6IG51bGwpKSk7XG59XG5cbi8vIGxpYi9kb20vbGliLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QxMCBmcm9tIFwicmVhY3RcIjtcbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xudHJ5IHtcbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHdpbmRvdy5fX3JlYWN0Um91dGVyVmVyc2lvbiA9IC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBcIjcuOS4zXCI7XG4gIH1cbn0gY2F0Y2ggKGUpIHtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJSb3V0ZXIocm91dGVzLCBvcHRzKSB7XG4gIHJldHVybiBjcmVhdGVSb3V0ZXIoe1xuICAgIGJhc2VuYW1lOiBvcHRzPy5iYXNlbmFtZSxcbiAgICBnZXRDb250ZXh0OiBvcHRzPy5nZXRDb250ZXh0LFxuICAgIGZ1dHVyZTogb3B0cz8uZnV0dXJlLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KHsgd2luZG93OiBvcHRzPy53aW5kb3cgfSksXG4gICAgaHlkcmF0aW9uRGF0YTogb3B0cz8uaHlkcmF0aW9uRGF0YSB8fCBwYXJzZUh5ZHJhdGlvbkRhdGEoKSxcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzLFxuICAgIGh5ZHJhdGlvblJvdXRlUHJvcGVydGllcyxcbiAgICBkYXRhU3RyYXRlZ3k6IG9wdHM/LmRhdGFTdHJhdGVneSxcbiAgICBwYXRjaFJvdXRlc09uTmF2aWdhdGlvbjogb3B0cz8ucGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb24sXG4gICAgd2luZG93OiBvcHRzPy53aW5kb3dcbiAgfSkuaW5pdGlhbGl6ZSgpO1xufVxuZnVuY3Rpb24gY3JlYXRlSGFzaFJvdXRlcihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlcih7XG4gICAgYmFzZW5hbWU6IG9wdHM/LmJhc2VuYW1lLFxuICAgIGdldENvbnRleHQ6IG9wdHM/LmdldENvbnRleHQsXG4gICAgZnV0dXJlOiBvcHRzPy5mdXR1cmUsXG4gICAgaGlzdG9yeTogY3JlYXRlSGFzaEhpc3RvcnkoeyB3aW5kb3c6IG9wdHM/LndpbmRvdyB9KSxcbiAgICBoeWRyYXRpb25EYXRhOiBvcHRzPy5oeWRyYXRpb25EYXRhIHx8IHBhcnNlSHlkcmF0aW9uRGF0YSgpLFxuICAgIHJvdXRlcyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXMsXG4gICAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzLFxuICAgIGRhdGFTdHJhdGVneTogb3B0cz8uZGF0YVN0cmF0ZWd5LFxuICAgIHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uOiBvcHRzPy5wYXRjaFJvdXRlc09uTmF2aWdhdGlvbixcbiAgICB3aW5kb3c6IG9wdHM/LndpbmRvd1xuICB9KS5pbml0aWFsaXplKCk7XG59XG5mdW5jdGlvbiBwYXJzZUh5ZHJhdGlvbkRhdGEoKSB7XG4gIGxldCBzdGF0ZSA9IHdpbmRvdz8uX19zdGF0aWNSb3V0ZXJIeWRyYXRpb25EYXRhO1xuICBpZiAoc3RhdGUgJiYgc3RhdGUuZXJyb3JzKSB7XG4gICAgc3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGVycm9yczogZGVzZXJpYWxpemVFcnJvcnMoc3RhdGUuZXJyb3JzKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlcnJvcnMpO1xuICBsZXQgc2VyaWFsaXplZCA9IHt9O1xuICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIGVudHJpZXMpIHtcbiAgICBpZiAodmFsICYmIHZhbC5fX3R5cGUgPT09IFwiUm91dGVFcnJvclJlc3BvbnNlXCIpIHtcbiAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IG5ldyBFcnJvclJlc3BvbnNlSW1wbChcbiAgICAgICAgdmFsLnN0YXR1cyxcbiAgICAgICAgdmFsLnN0YXR1c1RleHQsXG4gICAgICAgI
25114HZhbC5kYXRhLFxuICAgICAgICB2YWwuaW50ZXJuYWwgPT09IHRydWVcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh2YWwgJiYgdmFsLl9fdHlwZSA9PT0gXCJFcnJvclwiKSB7XG4gICAgICBpZiAodmFsLl9fc3ViVHlwZSkge1xuICAgICAgICBsZXQgRXJyb3JDb25zdHJ1Y3RvciA9IHdpbmRvd1t2YWwuX19zdWJUeXBlXTtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvckNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yQ29uc3RydWN0b3IodmFsLm1lc3NhZ2UpO1xuICAgICAgICAgICAgZXJyb3Iuc3RhY2sgPSBcIlwiO1xuICAgICAgICAgICAgc2VyaWFsaXplZFtrZXldID0gZXJyb3I7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlcmlhbGl6ZWRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcih2YWwubWVzc2FnZSk7XG4gICAgICAgIGVycm9yLnN0YWNrID0gXCJcIjtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59XG5mdW5jdGlvbiBCcm93c2VyUm91dGVyKHtcbiAgYmFzZW5hbWUsXG4gIGNoaWxkcmVuLFxuICB3aW5kb3c6IHdpbmRvdzJcbn0pIHtcbiAgbGV0IGhpc3RvcnlSZWYgPSBSZWFjdDEwLnVzZVJlZigpO1xuICBpZiAoaGlzdG9yeVJlZi5jdXJyZW50ID09IG51bGwpIHtcbiAgICBoaXN0b3J5UmVmLmN1cnJlbnQgPSBjcmVhdGVCcm93c2VySGlzdG9yeSh7IHdpbmRvdzogd2luZG93MiwgdjVDb21wYXQ6IHRydWUgfSk7XG4gIH1cbiAgbGV0IGhpc3RvcnkgPSBoaXN0b3J5UmVmLmN1cnJlbnQ7XG4gIGxldCBbc3RhdGUsIHNldFN0YXRlSW1wbF0gPSBSZWFjdDEwLnVzZVN0YXRlKHtcbiAgICBhY3Rpb246IGhpc3RvcnkuYWN0aW9uLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uXG4gIH0pO1xuICBsZXQgc2V0U3RhdGUgPSBSZWFjdDEwLnVzZUNhbGxiYWNrKFxuICAgIChuZXdTdGF0ZSkgPT4ge1xuICAgICAgUmVhY3QxMC5zdGFydFRyYW5zaXRpb24oKCkgPT4gc2V0U3RhdGVJbXBsKG5ld1N0YXRlKSk7XG4gICAgfSxcbiAgICBbc2V0U3RhdGVJbXBsXVxuICApO1xuICBSZWFjdDEwLnVzZUxheW91dEVmZmVjdCgoKSA9PiBoaXN0b3J5Lmxpc3RlbihzZXRTdGF0ZSksIFtoaXN0b3J5LCBzZXRTdGF0ZV0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGxvY2F0aW9uOiBzdGF0ZS5sb2NhdGlvbixcbiAgICAgIG5hdmlnYXRpb25UeXBlOiBzdGF0ZS5hY3Rpb24sXG4gICAgICBuYXZpZ2F0b3I6IGhpc3RvcnlcbiAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBIYXNoUm91dGVyKHsgYmFzZW5hbWUsIGNoaWxkcmVuLCB3aW5kb3c6IHdpbmRvdzIgfSkge1xuICBsZXQgaGlzdG9yeVJlZiA9IFJlYWN0MTAudXNlUmVmKCk7XG4gIGlmIChoaXN0b3J5UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgIGhpc3RvcnlSZWYuY3VycmVudCA9IGNyZWF0ZUhhc2hIaXN0b3J5KHsgd2luZG93OiB3aW5kb3cyLCB2NUNvbXBhdDogdHJ1ZSB9KTtcbiAgfVxuICBsZXQgaGlzdG9yeSA9IGhpc3RvcnlSZWYuY3VycmVudDtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0MTAudXNlU3RhdGUoe1xuICAgIGFjdGlvbjogaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb25cbiAgfSk7XG4gIGxldCBzZXRTdGF0ZSA9IFJlYWN0MTAudXNlQ2FsbGJhY2soXG4gICAgKG5ld1N0YXRlKSA9PiB7XG4gICAgICBSZWFjdDEwLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9LFxuICAgIFtzZXRTdGF0ZUltcGxdXG4gICk7XG4gIFJlYWN0MTAudXNlTGF5b3V0RWZmZWN0KCgpID0+IGhpc3RvcnkubGlzdGVuKHNldFN0YXRlKSwgW2hpc3RvcnksIHNldFN0YXRlXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMC5jcmVhdGVFbGVtZW50KFxuICAgIFJvdXRlcixcbiAgICB7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICAgIG5hdmlnYXRvcjogaGlzdG9yeVxuICAgIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIEhpc3RvcnlSb3V0ZXIoe1xuICBiYXNlbmFtZSxcbiAgY2hpbGRyZW4sXG4gIGhpc3Rvcnlcbn0pIHtcbiAgbGV0IFtzdGF0ZSwgc2V0U3RhdGVJbXBsXSA9IFJlYWN0MTAudXNlU3RhdGUoe1xuICAgIGFjdGlvbjogaGlzdG9yeS5hY3Rpb24sXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb25cbiAgfSk7XG4gIGxldCBzZXRTdGF0ZSA9IFJlYWN0MTAudXNlQ2FsbGJhY2soXG4gICAgKG5ld1N0YXRlKSA9PiB7XG4gICAgICBSZWFjdDEwLnN0YXJ0VHJhbnNpdGlvbigoKSA9PiBzZXRTdGF0ZUltcGwobmV3U3RhdGUpKTtcbiAgICB9LFxuICAgIFtzZXRTdGF0ZUltcGxdXG4gICk7XG4gIFJlYWN0MTAudXNlTGF5b3V0RWZmZWN0KCgpID0+IGhpc3RvcnkubGlzdGVuKHNldFN0YXRlKSwgW2hpc3RvcnksIHNldFN0YXRlXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMC5jcmVhdGVFbGVtZW50KFxuICAgIFJvdXRlcixcbiAgICB7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmFjdGlvbixcbiAgICAgIG5hdmlnYXRvcjogaGlzdG9yeVxuICAgIH1cbiAgKTtcbn1cbkhpc3RvcnlSb3V0ZXIuZGlzcGxheU5hbWUgPSBcInVuc3RhYmxlX0hpc3RvcnlSb3V0ZXJcIjtcbnZhciBBQlNPTFVURV9VUkxfUkVHRVgyID0gL14oPzpbYS16XVthLXowLTkrLi1dKjp8XFwvXFwvKS9pO1xudmFyIExpbmsgPSBSZWFjdDEwLmZvcndhcmRSZWYoXG4gIGZ1bmN0aW9uIExpbmtXaXRoUmVmKHtcbiAgICBvbkNsaWNrLFxuICAgIGRpc2NvdmVyID0gXCJyZW5kZXJcIixcbiAgICBwcmVmZXRjaCA9IFwibm9uZVwiLFxuICAgIHJlbGF0aXZlLFxuICAgIHJlbG9hZERvY3VtZW50LFxuICAgIHJlcGxhY2U6IHJlcGxhY2UyLFxuICAgIHN0YXRlLFxuICAgIHRhcmdldCxcbiAgICB0byxcbiAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgdmlld1RyYW5zaXRpb24sXG4gICAgLi4ucmVzdFxuICB9LCBmb3J3YXJkZWRSZWYpIHtcbiAgICBsZXQgeyBiYXNlbmFtZSB9ID0gUmVhY3QxMC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgICBsZXQgaXNBYnNvbHV0ZSA9IHR5cGVvZiB0byA9PT0gXCJzdHJpbmdcIiAmJiBBQlNPTFVURV9VUkxfUkVHRVgyLnRlc3QodG8pO1xuICAgIGxldCBhYnNvbHV0ZUhyZWY7XG4gICAgbGV0IGlzRXh0ZXJuYWwgPSBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRvID09PSBcInN0cmluZ1wiICYmIGlzQWJzb2x1dGUpIHtcbiAgICAgIGFic29sdXRlSHJlZiA9IHRvO1xuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCBjdXJyZW50VXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgbGV0IHRhcmdldFVybCA9IHRvLnN0YXJ0c1dpdGgoXCIvL1wiKSA/IG5ldyBVUkwoY3VycmVudFVybC5wcm90b2NvbCArIHRvKSA6IG5ldyBVUkwodG8pO1xuICAgICAgICAgIGxldCBwYXRoID0gc3RyaXBCYXNlbmFtZSh0YXJnZXRVcmwucGF0aG5hbWUsIGJhc2VuYW1lKTtcbiAgICAgICAgICBpZiAodGFyZ2V0VXJsLm9yaWdpbiA9PT0gY3VycmVudFVybC5vcmlnaW4gJiYgcGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0byA9IHBhdGggKyB0YXJnZXRVcmwuc2VhcmNoICsgdGFyZ2V0VXJsLmhhc2g7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzRXh0ZXJuYWwgPSB0cnVlO1xuICAgICAgICAgI
25114H1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGA8TGluayB0bz1cIiR7dG99XCI+IGNvbnRhaW5zIGFuIGludmFsaWQgVVJMIHdoaWNoIHdpbGwgcHJvYmFibHkgYnJlYWsgd2hlbiBjbGlja2VkIC0gcGxlYXNlIHVwZGF0ZSB0byBhIHZhbGlkIFVSTCBwYXRoLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBocmVmID0gdXNlSHJlZih0bywgeyByZWxhdGl2ZSB9KTtcbiAgICBsZXQgW3Nob3VsZFByZWZldGNoLCBwcmVmZXRjaFJlZiwgcHJlZmV0Y2hIYW5kbGVyc10gPSB1c2VQcmVmZXRjaEJlaGF2aW9yKFxuICAgICAgcHJlZmV0Y2gsXG4gICAgICByZXN0XG4gICAgKTtcbiAgICBsZXQgaW50ZXJuYWxPbkNsaWNrID0gdXNlTGlua0NsaWNrSGFuZGxlcih0bywge1xuICAgICAgcmVwbGFjZTogcmVwbGFjZTIsXG4gICAgICBzdGF0ZSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgIHJlbGF0aXZlLFxuICAgICAgdmlld1RyYW5zaXRpb25cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgICAgaWYgKG9uQ2xpY2spIG9uQ2xpY2soZXZlbnQpO1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIGludGVybmFsT25DbGljayhldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBsaW5rID0gKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzeC1hMTF5L2FuY2hvci1oYXMtY29udGVudFxuICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICAgICAgXCJhXCIsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICAgIC4uLnByZWZldGNoSGFuZGxlcnMsXG4gICAgICAgICAgaHJlZjogYWJzb2x1dGVIcmVmIHx8IGhyZWYsXG4gICAgICAgICAgb25DbGljazogaXNFeHRlcm5hbCB8fCByZWxvYWREb2N1bWVudCA/IG9uQ2xpY2sgOiBoYW5kbGVDbGljayxcbiAgICAgICAgICByZWY6IG1lcmdlUmVmcyhmb3J3YXJkZWRSZWYsIHByZWZldGNoUmVmKSxcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgXCJkYXRhLWRpc2NvdmVyXCI6ICFpc0Fic29sdXRlICYmIGRpc2NvdmVyID09PSBcInJlbmRlclwiID8gXCJ0cnVlXCIgOiB2b2lkIDBcbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHNob3VsZFByZWZldGNoICYmICFpc0Fic29sdXRlID8gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChSZWFjdDEwLkZyYWdtZW50LCBudWxsLCBsaW5rLCAvKiBAX19QVVJFX18gKi8gUmVhY3QxMC5jcmVhdGVFbGVtZW50KFByZWZldGNoUGFnZUxpbmtzLCB7IHBhZ2U6IGhyZWYgfSkpIDogbGluaztcbiAgfVxuKTtcbkxpbmsuZGlzcGxheU5hbWUgPSBcIkxpbmtcIjtcbnZhciBOYXZMaW5rID0gUmVhY3QxMC5mb3J3YXJkUmVmKFxuICBmdW5jdGlvbiBOYXZMaW5rV2l0aFJlZih7XG4gICAgXCJhcmlhLWN1cnJlbnRcIjogYXJpYUN1cnJlbnRQcm9wID0gXCJwYWdlXCIsXG4gICAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lUHJvcCA9IFwiXCIsXG4gICAgZW5kID0gZmFsc2UsXG4gICAgc3R5bGU6IHN0eWxlUHJvcCxcbiAgICB0byxcbiAgICB2aWV3VHJhbnNpdGlvbixcbiAgICBjaGlsZHJlbixcbiAgICAuLi5yZXN0XG4gIH0sIHJlZikge1xuICAgIGxldCBwYXRoID0gdXNlUmVzb2x2ZWRQYXRoKHRvLCB7IHJlbGF0aXZlOiByZXN0LnJlbGF0aXZlIH0pO1xuICAgIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gICAgbGV0IHJvdXRlclN0YXRlID0gUmVhY3QxMC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICAgIGxldCB7IG5hdmlnYXRvciwgYmFzZW5hbWUgfSA9IFJlYWN0MTAudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gICAgbGV0IGlzVHJhbnNpdGlvbmluZyA9IHJvdXRlclN0YXRlICE9IG51bGwgJiYgLy8gQ29uZGl0aW9uYWwgdXNhZ2UgaXMgT0sgaGVyZSBiZWNhdXNlIHRoZSB1c2FnZSBvZiBhIGRhdGEgcm91dGVyIGlzIHN0YXRpY1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIHVzZVZpZXdUcmFuc2l0aW9uU3RhdGUocGF0aCkgJiYgdmlld1RyYW5zaXRpb24gPT09IHRydWU7XG4gICAgbGV0IHRvUGF0aG5hbWUgPSBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24gPyBuYXZpZ2F0b3IuZW5jb2RlTG9jYXRpb24ocGF0aCkucGF0aG5hbWUgOiBwYXRoLnBhdGhuYW1lO1xuICAgIGxldCBsb2NhdGlvblBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgbGV0IG5leHRMb2NhdGlvblBhdGhuYW1lID0gcm91dGVyU3RhdGUgJiYgcm91dGVyU3RhdGUubmF2aWdhdGlvbiAmJiByb3V0ZXJTdGF0ZS5uYXZpZ2F0aW9uLmxvY2F0aW9uID8gcm91dGVyU3RhdGUubmF2aWdhdGlvbi5sb2NhdGlvbi5wYXRobmFtZSA6IG51bGw7XG4gICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XG4gICAgICBsb2NhdGlvblBhdGhuYW1lID0gbG9jYXRpb25QYXRobmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgbmV4dExvY2F0aW9uUGF0aG5hbWUgPSBuZXh0TG9jYXRpb25QYXRobmFtZSA/IG5leHRMb2NhdGlvblBhdGhuYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgdG9QYXRobmFtZSA9IHRvUGF0aG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKG5leHRMb2NhdGlvblBhdGhuYW1lICYmIGJhc2VuYW1lKSB7XG4gICAgICBuZXh0TG9jYXRpb25QYXRobmFtZSA9IHN0cmlwQmFzZW5hbWUobmV4dExvY2F0aW9uUGF0aG5hbWUsIGJhc2VuYW1lKSB8fCBuZXh0TG9jYXRpb25QYXRobmFtZTtcbiAgICB9XG4gICAgY29uc3QgZW5kU2xhc2hQb3NpdGlvbiA9IHRvUGF0aG5hbWUgIT09IFwiL1wiICYmIHRvUGF0aG5hbWUuZW5kc1dpdGgoXCIvXCIpID8gdG9QYXRobmFtZS5sZW5ndGggLSAxIDogdG9QYXRobmFtZS5sZW5ndGg7XG4gICAgbGV0IGlzQWN0aXZlID0gbG9jYXRpb25QYXRobmFtZSA9PT0gdG9QYXRobmFtZSB8fCAhZW5kICYmIGxvY2F0aW9uUGF0aG5hbWUuc3RhcnRzV2l0aCh0b1BhdGhuYW1lKSAmJiBsb2NhdGlvblBhdGhuYW1lLmNoYXJBdChlbmRTbGFzaFBvc2l0aW9uKSA9PT0gXCIvXCI7XG4gICAgbGV0IGlzUGVuZGluZyA9IG5leHRMb2NhdGlvblBhdGhuYW1lICE9IG51bGwgJiYgKG5leHR
25114Mb2NhdGlvblBhdGhuYW1lID09PSB0b1BhdGhuYW1lIHx8ICFlbmQgJiYgbmV4dExvY2F0aW9uUGF0aG5hbWUuc3RhcnRzV2l0aCh0b1BhdGhuYW1lKSAmJiBuZXh0TG9jYXRpb25QYXRobmFtZS5jaGFyQXQodG9QYXRobmFtZS5sZW5ndGgpID09PSBcIi9cIik7XG4gICAgbGV0IHJlbmRlclByb3BzID0ge1xuICAgICAgaXNBY3RpdmUsXG4gICAgICBpc1BlbmRpbmcsXG4gICAgICBpc1RyYW5zaXRpb25pbmdcbiAgICB9O1xuICAgIGxldCBhcmlhQ3VycmVudCA9IGlzQWN0aXZlID8gYXJpYUN1cnJlbnRQcm9wIDogdm9pZCAwO1xuICAgIGxldCBjbGFzc05hbWU7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWVQcm9wID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZVByb3AocmVuZGVyUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc05hbWUgPSBbXG4gICAgICAgIGNsYXNzTmFtZVByb3AsXG4gICAgICAgIGlzQWN0aXZlID8gXCJhY3RpdmVcIiA6IG51bGwsXG4gICAgICAgIGlzUGVuZGluZyA/IFwicGVuZGluZ1wiIDogbnVsbCxcbiAgICAgICAgaXNUcmFuc2l0aW9uaW5nID8gXCJ0cmFuc2l0aW9uaW5nXCIgOiBudWxsXG4gICAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgbGV0IHN0eWxlID0gdHlwZW9mIHN0eWxlUHJvcCA9PT0gXCJmdW5jdGlvblwiID8gc3R5bGVQcm9wKHJlbmRlclByb3BzKSA6IHN0eWxlUHJvcDtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICAgIExpbmssXG4gICAgICB7XG4gICAgICAgIC4uLnJlc3QsXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IGFyaWFDdXJyZW50LFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHJlZixcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIHRvLFxuICAgICAgICB2aWV3VHJhbnNpdGlvblxuICAgICAgfSxcbiAgICAgIHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gY2hpbGRyZW4ocmVuZGVyUHJvcHMpIDogY2hpbGRyZW5cbiAgICApO1xuICB9XG4pO1xuTmF2TGluay5kaXNwbGF5TmFtZSA9IFwiTmF2TGlua1wiO1xudmFyIEZvcm0gPSBSZWFjdDEwLmZvcndhcmRSZWYoXG4gICh7XG4gICAgZGlzY292ZXIgPSBcInJlbmRlclwiLFxuICAgIGZldGNoZXJLZXksXG4gICAgbmF2aWdhdGUsXG4gICAgcmVsb2FkRG9jdW1lbnQsXG4gICAgcmVwbGFjZTogcmVwbGFjZTIsXG4gICAgc3RhdGUsXG4gICAgbWV0aG9kID0gZGVmYXVsdE1ldGhvZCxcbiAgICBhY3Rpb24sXG4gICAgb25TdWJtaXQsXG4gICAgcmVsYXRpdmUsXG4gICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgIHZpZXdUcmFuc2l0aW9uLFxuICAgIC4uLnByb3BzXG4gIH0sIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGxldCBzdWJtaXQgPSB1c2VTdWJtaXQoKTtcbiAgICBsZXQgZm9ybUFjdGlvbiA9IHVzZUZvcm1BY3Rpb24oYWN0aW9uLCB7IHJlbGF0aXZlIH0pO1xuICAgIGxldCBmb3JtTWV0aG9kID0gbWV0aG9kLnRvTG93ZXJDYXNlKCkgPT09IFwiZ2V0XCIgPyBcImdldFwiIDogXCJwb3N0XCI7XG4gICAgbGV0IGlzQWJzb2x1dGUgPSB0eXBlb2YgYWN0aW9uID09PSBcInN0cmluZ1wiICYmIEFCU09MVVRFX1VSTF9SRUdFWDIudGVzdChhY3Rpb24pO1xuICAgIGxldCBzdWJtaXRIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICBvblN1Ym1pdCAmJiBvblN1Ym1pdChldmVudCk7XG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCBzdWJtaXR0ZXIgPSBldmVudC5uYXRpdmVFdmVudC5zdWJtaXR0ZXI7XG4gICAgICBsZXQgc3VibWl0TWV0aG9kID0gc3VibWl0dGVyPy5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpIHx8IG1ldGhvZDtcbiAgICAgIHN1Ym1pdChzdWJtaXR0ZXIgfHwgZXZlbnQuY3VycmVudFRhcmdldCwge1xuICAgICAgICBmZXRjaGVyS2V5LFxuICAgICAgICBtZXRob2Q6IHN1Ym1pdE1ldGhvZCxcbiAgICAgICAgbmF2aWdhdGUsXG4gICAgICAgIHJlcGxhY2U6IHJlcGxhY2UyLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmVsYXRpdmUsXG4gICAgICAgIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgICAgICAgdmlld1RyYW5zaXRpb25cbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDEwLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImZvcm1cIixcbiAgICAgIHtcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgIG1ldGhvZDogZm9ybU1ldGhvZCxcbiAgICAgICAgYWN0aW9uOiBmb3JtQWN0aW9uLFxuICAgICAgICBvblN1Ym1pdDogcmVsb2FkRG9jdW1lbnQgPyBvblN1Ym1pdCA6IHN1Ym1pdEhhbmRsZXIsXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBcImRhdGEtZGlzY292ZXJcIjogIWlzQWJzb2x1dGUgJiYgZGlzY292ZXIgPT09IFwicmVuZGVyXCIgPyBcInRydWVcIiA6IHZvaWQgMFxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Gb3JtLmRpc3BsYXlOYW1lID0gXCJGb3JtXCI7XG5mdW5jdGlvbiBTY3JvbGxSZXN0b3JhdGlvbih7XG4gIGdldEtleSxcbiAgc3RvcmFnZUtleSxcbiAgLi4ucHJvcHNcbn0pIHtcbiAgbGV0IHJlbWl4Q29udGV4dCA9IFJlYWN0MTAudXNlQ29udGV4dChGcmFtZXdvcmtDb250ZXh0KTtcbiAgbGV0IHsgYmFzZW5hbWUgfSA9IFJlYWN0MTAudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBtYXRjaGVzID0gdXNlTWF0Y2hlcygpO1xuICB1c2VTY3JvbGxSZXN0b3JhdGlvbih7IGdldEtleSwgc3RvcmFnZUtleSB9KTtcbiAgbGV0IHNzcktleSA9IFJlYWN0MTAudXNlTWVtbyhcbiAgICAoKSA9PiB7XG4gICAgICBpZiAoIXJlbWl4Q29udGV4dCB8fCAhZ2V0S2V5KSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCB1c2VyS2V5ID0gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkoXG4gICAgICAgIGxvY2F0aW9uLFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgZ2V0S2V5XG4gICAgICApO1xuICAgICAgcmV0dXJuIHVzZXJLZXkgIT09IGxvY2F0aW9uLmtleSA/IHVzZXJLZXkgOiBudWxsO1xuICAgIH0sXG4gICAgLy8gTmFoLCB3ZSBvbmx5IG5lZWQgdGhpcyB0aGUgZmlyc3QgdGltZSBmb3IgdGhlIFNTUiByZW5kZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW11cbiAgKTtcbiAgaWYgKCFyZW1peENvbnRleHQgfHwgcmVtaXhDb250ZXh0LmlzU3BhTW9kZSkge1xuICAgIHJldHVybi
25114BudWxsO1xuICB9XG4gIGxldCByZXN0b3JlU2Nyb2xsID0gKChzdG9yYWdlS2V5MiwgcmVzdG9yZUtleSkgPT4ge1xuICAgIGlmICghd2luZG93Lmhpc3Rvcnkuc3RhdGUgfHwgIXdpbmRvdy5oaXN0b3J5LnN0YXRlLmtleSkge1xuICAgICAgbGV0IGtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzIpLnNsaWNlKDIpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHsga2V5IH0sIFwiXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5MikgfHwgXCJ7fVwiKTtcbiAgICAgIGxldCBzdG9yZWRZID0gcG9zaXRpb25zW3Jlc3RvcmVLZXkgfHwgd2luZG93Lmhpc3Rvcnkuc3RhdGUua2V5XTtcbiAgICAgIGlmICh0eXBlb2Ygc3RvcmVkWSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc3RvcmVkWSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5Mik7XG4gICAgfVxuICB9KS50b1N0cmluZygpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0MTAuY3JlYXRlRWxlbWVudChcbiAgICBcInNjcmlwdFwiLFxuICAgIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlLFxuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgICAgX19odG1sOiBgKCR7cmVzdG9yZVNjcm9sbH0pKCR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVlcbiAgICAgICAgKX0sICR7SlNPTi5zdHJpbmdpZnkoc3NyS2V5KX0pYFxuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblNjcm9sbFJlc3RvcmF0aW9uLmRpc3BsYXlOYW1lID0gXCJTY3JvbGxSZXN0b3JhdGlvblwiO1xuZnVuY3Rpb24gZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcjIoaG9va05hbWUpIHtcbiAgcmV0dXJuIGAke2hvb2tOYW1lfSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgZGF0YSByb3V0ZXIuICBTZWUgaHR0cHM6Ly9yZWFjdHJvdXRlci5jb20vZW4vbWFpbi9yb3V0ZXJzL3BpY2tpbmctYS1yb3V0ZXIuYDtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJDb250ZXh0Myhob29rTmFtZSkge1xuICBsZXQgY3R4ID0gUmVhY3QxMC51c2VDb250ZXh0KERhdGFSb3V0ZXJDb250ZXh0KTtcbiAgaW52YXJpYW50KGN0eCwgZ2V0RGF0YVJvdXRlckNvbnNvbGVFcnJvcjIoaG9va05hbWUpKTtcbiAgcmV0dXJuIGN0eDtcbn1cbmZ1bmN0aW9uIHVzZURhdGFSb3V0ZXJTdGF0ZTIoaG9va05hbWUpIHtcbiAgbGV0IHN0YXRlID0gUmVhY3QxMC51c2VDb250ZXh0KERhdGFSb3V0ZXJTdGF0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQoc3RhdGUsIGdldERhdGFSb3V0ZXJDb25zb2xlRXJyb3IyKGhvb2tOYW1lKSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHVzZUxpbmtDbGlja0hhbmRsZXIodG8sIHtcbiAgdGFyZ2V0LFxuICByZXBsYWNlOiByZXBsYWNlUHJvcCxcbiAgc3RhdGUsXG4gIHByZXZlbnRTY3JvbGxSZXNldCxcbiAgcmVsYXRpdmUsXG4gIHZpZXdUcmFuc2l0aW9uXG59ID0ge30pIHtcbiAgbGV0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHBhdGggPSB1c2VSZXNvbHZlZFBhdGgodG8sIHsgcmVsYXRpdmUgfSk7XG4gIHJldHVybiBSZWFjdDEwLnVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFByb2Nlc3NMaW5rQ2xpY2soZXZlbnQsIHRhcmdldCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IHJlcGxhY2UyID0gcmVwbGFjZVByb3AgIT09IHZvaWQgMCA/IHJlcGxhY2VQcm9wIDogY3JlYXRlUGF0aChsb2NhdGlvbikgPT09IGNyZWF0ZVBhdGgocGF0aCk7XG4gICAgICAgIG5hdmlnYXRlKHRvLCB7XG4gICAgICAgICAgcmVwbGFjZTogcmVwbGFjZTIsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICAgIHJlbGF0aXZlLFxuICAgICAgICAgIHZpZXdUcmFuc2l0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgbG9jYXRpb24sXG4gICAgICBuYXZpZ2F0ZSxcbiAgICAgIHBhdGgsXG4gICAgICByZXBsYWNlUHJvcCxcbiAgICAgIHN0YXRlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdG8sXG4gICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICByZWxhdGl2ZSxcbiAgICAgIHZpZXdUcmFuc2l0aW9uXG4gICAgXVxuICApO1xufVxuZnVuY3Rpb24gdXNlU2VhcmNoUGFyYW1zKGRlZmF1bHRJbml0KSB7XG4gIHdhcm5pbmcoXG4gICAgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gXCJ1bmRlZmluZWRcIixcbiAgICBgWW91IGNhbm5vdCB1c2UgdGhlIFxcYHVzZVNlYXJjaFBhcmFtc1xcYCBob29rIGluIGEgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFVSTFNlYXJjaFBhcmFtcyBBUEkuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgSW50ZXJuZXQgRXhwbG9yZXIgMTEsIHdlIHJlY29tbWVuZCB5b3UgbG9hZCBhIHBvbHlmaWxsIHN1Y2ggYXMgaHR0cHM6Ly9naXRodWIuY29tL3VuZ2FwL3VybC1zZWFyY2gtcGFyYW1zLmBcbiAgKTtcbiAgbGV0IGRlZmF1bHRTZWFyY2hQYXJhbXNSZWYgPSBSZWFjdDEwLnVzZVJlZihjcmVhdGVTZWFyY2hQYXJhbXMoZGVmYXVsdEluaXQpKTtcbiAgbGV0IGhhc1NldFNlYXJjaFBhcmFtc1JlZiA9IFJlYWN0MTAudXNlUmVmKGZhbHNlKTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgbGV0IHNlYXJjaFBhcmFtcyA9IFJlYWN0MTAudXNlTWVtbyhcbiAgICAoKSA9PiAoXG4gICAgICAvLyBPbmx5IG1lcmdlIGluIHRoZSBkZWZhdWx0cyBpZiB3ZSBoYXZlbid0IHlldCBjYWxsZWQgc2V0U2VhcmNoUGFyYW1zLlxuICAgICAgLy8gT25jZSB3ZSBjYWxsIHRoYXQgd2Ugd2FudCB0aG9zZSB0byB0YWtlIHByZWNlZGVuY2UsIG90aGVyd2lzZSB5b3UgY2FuJ3RcbiAgICAgIC8vIHJlbW92ZSBhIHBhcmFtIHdpdGggc2V0U2VhcmNoUGFyYW1zKHt9KSBpZiBpdCBoYXMgYW4gaW5pdGlhbCB2YWx1ZVxuICAgICAgZ2V0U2VhcmNoUGFyYW1zRm9yTG9jYXRpb24oXG4gICAgICAgIGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgaGFzU2V0U2VhcmNoUGFyYW1zUmVmLmN1cnJlbnQgPyBudWxsIDogZGVmYXVsdFNlYXJjaFBhcmFtc1JlZi5jdXJyZW50XG4gICAgICApXG4gICAgKSxcbiAgICBbbG9jYXRpb24uc2VhcmNoXVxuICApO1xuICBsZXQgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBsZXQgc2V0U2VhcmNoUGFyYW1zID0gUmVhY3QxMC51c2VDYWxsYmFjayhcbiAgICAobmV4dEluaX
25114QsIG5hdmlnYXRlT3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgbmV3U2VhcmNoUGFyYW1zID0gY3JlYXRlU2VhcmNoUGFyYW1zKFxuICAgICAgICB0eXBlb2YgbmV4dEluaXQgPT09IFwiZnVuY3Rpb25cIiA/IG5leHRJbml0KG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoUGFyYW1zKSkgOiBuZXh0SW5pdFxuICAgICAgKTtcbiAgICAgIGhhc1NldFNlYXJjaFBhcmFtc1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIG5hdmlnYXRlKFwiP1wiICsgbmV3U2VhcmNoUGFyYW1zLCBuYXZpZ2F0ZU9wdGlvbnMpO1xuICAgIH0sXG4gICAgW25hdmlnYXRlLCBzZWFyY2hQYXJhbXNdXG4gICk7XG4gIHJldHVybiBbc2VhcmNoUGFyYW1zLCBzZXRTZWFyY2hQYXJhbXNdO1xufVxudmFyIGZldGNoZXJJZCA9IDA7XG52YXIgZ2V0VW5pcXVlRmV0Y2hlcklkID0gKCkgPT4gYF9fJHtTdHJpbmcoKytmZXRjaGVySWQpfV9fYDtcbmZ1bmN0aW9uIHVzZVN1Ym1pdCgpIHtcbiAgbGV0IHsgcm91dGVyIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dDMoXCJ1c2VTdWJtaXRcIiAvKiBVc2VTdWJtaXQgKi8pO1xuICBsZXQgeyBiYXNlbmFtZSB9ID0gUmVhY3QxMC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IGN1cnJlbnRSb3V0ZUlkID0gdXNlUm91dGVJZCgpO1xuICByZXR1cm4gUmVhY3QxMC51c2VDYWxsYmFjayhcbiAgICBhc3luYyAodGFyZ2V0LCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB7IGFjdGlvbiwgbWV0aG9kLCBlbmNUeXBlLCBmb3JtRGF0YSwgYm9keSB9ID0gZ2V0Rm9ybVN1Ym1pc3Npb25JbmZvKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGJhc2VuYW1lXG4gICAgICApO1xuICAgICAgaWYgKG9wdGlvbnMubmF2aWdhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCBrZXkgPSBvcHRpb25zLmZldGNoZXJLZXkgfHwgZ2V0VW5pcXVlRmV0Y2hlcklkKCk7XG4gICAgICAgIGF3YWl0IHJvdXRlci5mZXRjaChrZXksIGN1cnJlbnRSb3V0ZUlkLCBvcHRpb25zLmFjdGlvbiB8fCBhY3Rpb24sIHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsUmVzZXQ6IG9wdGlvbnMucHJldmVudFNjcm9sbFJlc2V0LFxuICAgICAgICAgIGZvcm1EYXRhLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgZm9ybU1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgbWV0aG9kLFxuICAgICAgICAgIGZvcm1FbmNUeXBlOiBvcHRpb25zLmVuY1R5cGUgfHwgZW5jVHlwZSxcbiAgICAgICAgICBmbHVzaFN5bmM6IG9wdGlvbnMuZmx1c2hTeW5jXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlKG9wdGlvbnMuYWN0aW9uIHx8IGFjdGlvbiwge1xuICAgICAgICAgIHByZXZlbnRTY3JvbGxSZXNldDogb3B0aW9ucy5wcmV2ZW50U2Nyb2xsUmVzZXQsXG4gICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBmb3JtTWV0aG9kOiBvcHRpb25zLm1ldGhvZCB8fCBtZXRob2QsXG4gICAgICAgICAgZm9ybUVuY1R5cGU6IG9wdGlvbnMuZW5jVHlwZSB8fCBlbmNUeXBlLFxuICAgICAgICAgIHJlcGxhY2U6IG9wdGlvbnMucmVwbGFjZSxcbiAgICAgICAgICBzdGF0ZTogb3B0aW9ucy5zdGF0ZSxcbiAgICAgICAgICBmcm9tUm91dGVJZDogY3VycmVudFJvdXRlSWQsXG4gICAgICAgICAgZmx1c2hTeW5jOiBvcHRpb25zLmZsdXNoU3luYyxcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbjogb3B0aW9ucy52aWV3VHJhbnNpdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb3V0ZXIsIGJhc2VuYW1lLCBjdXJyZW50Um91dGVJZF1cbiAgKTtcbn1cbmZ1bmN0aW9uIHVzZUZvcm1BY3Rpb24oYWN0aW9uLCB7IHJlbGF0aXZlIH0gPSB7fSkge1xuICBsZXQgeyBiYXNlbmFtZSB9ID0gUmVhY3QxMC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgbGV0IHJvdXRlQ29udGV4dCA9IFJlYWN0MTAudXNlQ29udGV4dChSb3V0ZUNvbnRleHQpO1xuICBpbnZhcmlhbnQocm91dGVDb250ZXh0LCBcInVzZUZvcm1BY3Rpb24gbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dFwiKTtcbiAgbGV0IFttYXRjaF0gPSByb3V0ZUNvbnRleHQubWF0Y2hlcy5zbGljZSgtMSk7XG4gIGxldCBwYXRoID0geyAuLi51c2VSZXNvbHZlZFBhdGgoYWN0aW9uID8gYWN0aW9uIDogXCIuXCIsIHsgcmVsYXRpdmUgfSkgfTtcbiAgbGV0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgaWYgKGFjdGlvbiA9PSBudWxsKSB7XG4gICAgcGF0aC5zZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGF0aC5zZWFyY2gpO1xuICAgIGxldCBpbmRleFZhbHVlcyA9IHBhcmFtcy5nZXRBbGwoXCJpbmRleFwiKTtcbiAgICBsZXQgaGFzTmFrZWRJbmRleFBhcmFtID0gaW5kZXhWYWx1ZXMuc29tZSgodikgPT4gdiA9PT0gXCJcIik7XG4gICAgaWYgKGhhc05ha2VkSW5kZXhQYXJhbSkge1xuICAgICAgcGFyYW1zLmRlbGV0ZShcImluZGV4XCIpO1xuICAgICAgaW5kZXhWYWx1ZXMuZmlsdGVyKCh2KSA9PiB2KS5mb3JFYWNoKCh2KSA9PiBwYXJhbXMuYXBwZW5kKFwiaW5kZXhcIiwgdikpO1xuICAgICAgbGV0IHFzID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICBwYXRoLnNlYXJjaCA9IHFzID8gYD8ke3FzfWAgOiBcIlwiO1xuICAgIH1cbiAgfVxuICBpZiAoKCFhY3Rpb24gfHwgYWN0aW9uID09PSBcIi5cIikgJiYgbWF0Y2gucm91dGUuaW5kZXgpIHtcbiAgICBwYXRoLnNlYXJjaCA9IHBhdGguc2VhcmNoID8gcGF0aC5zZWFyY2gucmVwbGFjZSgvXlxcPy8sIFwiP2luZGV4JlwiKSA6IFwiP2luZGV4XCI7XG4gIH1cbiAgaWYgKGJhc2VuYW1lICE9PSBcIi9cIikge1xuICAgIHBhdGgucGF0aG5hbWUgPSBwYXRoLnBhdGhuYW1lID09PSBcIi9cIiA/IGJhc2VuYW1lIDogam9pblBhdGhzKFtiYXNlbmFtZSwgcGF0aC5wYXRobmFtZV0pO1xuICB9XG4gIHJldHVybiBjcmVhdGVQYXRoKHBhdGgpO1xufVxuZnVuY3Rpb24gdXNlRmV0Y2hlcih7XG4gIGtleVxufSA9IHt9KSB7XG4gIGxldCB7IHJvdXRlciB9ID0gdXNlRGF0YVJvdXRlckNvbnRleHQzKFwidXNlRmV0Y2hlclwiIC8qIFVzZUZldGNoZXIgKi8pO1xuICBsZXQgc3RhdGUgPSB1c2VEYXRhUm91dGVyU3RhdGUyKFwidXNlRmV0Y2hlclwiIC8qIFVzZUZldGNoZXIgKi8pO1xuICBsZXQgZmV0Y2hlckRhdGEgPSBSZWFjdDEwLnVzZUNvbnRleHQoRmV0Y2hlcnNDb250ZXh0KTtcbiAgbGV0IHJvdXRlID0gUmVhY3QxMC51c2VDb250ZXh0KFJvdXRlQ29udGV4dCk7XG4gIGxldCByb3V0ZUlkID0gcm91dGUubWF0Y2hlc1tyb3V0ZS5tYXRjaGVzLmxlbmd0aCAtIDFdPy5yb3V0ZS5pZDtcbiAgaW52YXJpYW50KGZldGNoZXJEYXRhLCBgdXNlRmV0Y2hlciBtdXN0IGJlIHVzZWQgaW5zaWRlIGEgRmV0Y2hlcnNDb250ZXh0YCk7XG4gIGludmFyaWFudChyb3V0ZSwgYHVzZUZldGNoZXIgbXVzdCBiZSB1c2VkIGluc2lkZSBhIFJvdXRlQ29udGV4dGApO1xuICBpbnZhcmlhbnQoXG4gICAgcm91dGVJZCAhPSBudWxsLFxuICAgIGB1c2VGZXRjaGVyIGNhbiBvbmx5IGJlIHVzZWQgb24gcm91dGVzIHRoYXQgY29udGFpbiBhIHVuaXF1ZSBcImlkXCJgXG4gICk7XG4gIGxldCBkZWZhdWx0S2V5ID0gUmVhY3QxMC51c2VJZCgpO1xuICBsZXQgW2ZldGNoZXJLZXksIHNldEZldGNoZXJLZXldID0gUmVhY3QxMC51c2VTdGF0ZShrZXkgfHwgZGVmYXVsdEtleSk7XG4gIGlmIChrZXkgJiYga2V5ICE9PSBmZXRjaGVyS2V5KSB7XG4gICAgc2V0RmV0Y2hlcktleShrZXkpO1xuICB9XG4gIFJlYWN0MTAudXNlRWZmZWN0KCgpID0+IHtcbiAgICByb3V0ZXIuZ2V0RmV0Y2hlcihmZXRjaGVyS2V5KTtcbiAgICByZXR1cm4gKCkgPT4gcm91dGVyLmRlbGV0ZUZldGNoZXIoZmV0Y2hlcktleSk7XG4gIH0sIFtyb3V0ZXIsIGZldGNoZXJLZXldKTtcbiAgbGV0IGxvYWQgPSBSZWFjdDEwLnVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChocmVmLCBvcHRzKSA9PiB7XG4gICAgICBpbnZhcmlhbnQocm91dGVJZCwgXCJObyByb3V0ZUlkIGF2YWlsYWJsZSBmb3IgZmV0Y2hlci5sb2FkKClcIik7XG4gICAgICBhd2FpdCByb3V0ZXIuZmV0Y2goZmV0Y2hlcktleSwgcm91dGVJZCwgaHJlZiwgb3B0cyk7XG4gICAgfSxcbiAgICBbZmV0Y2hlcktleSwgcm91dGVJZCwgcm91dGVyXVxuICApO1xuICBsZXQgc3VibWl0SW1wbCA9IHVzZVN1Ym1pdCgpO1xuICBsZXQgc3VibWl0ID0gUmVhY3QxMC51c2VDYWxsYmFjayhcbiAgICBhc3luYyAodGFyZ2V0LCBvcHRzKSA9PiB7XG4gICAgICBhd2FpdCBzdWJtaXRJbXBsKHRhcmdldCwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBuYXZpZ2F0ZTogZmFsc2UsXG4gICAgICAgIGZldGNoZXJLZXlcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2ZldGNoZXJLZXksIHN1Ym1pdEltcGxdXG4gICk7XG4gIGxldCB1bnN0YWJsZV9yZXNldCA9IFJlYWN0MTAudXNlQ2FsbGJhY2soKG9wdHMpID0+IHJvdXRlci5yZXNldEZldGNoZXIoZmV0Y2hlcktleSwgb3B0cyksIFtyb3V0ZXIsIGZldGNoZXJLZXldKTtcbiAgbGV0IEZldGNoZXJGb3JtID0gUmVhY3QxMC51c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgRmV0Y2hlck
25114Zvcm0yID0gUmVhY3QxMC5mb3J3YXJkUmVmKFxuICAgICAgKHByb3BzLCByZWYpID0+IHtcbiAgICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDEwLmNyZWF0ZUVsZW1lbnQoRm9ybSwgeyAuLi5wcm9wcywgbmF2aWdhdGU6IGZhbHNlLCBmZXRjaGVyS2V5LCByZWYgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgICBGZXRjaGVyRm9ybTIuZGlzcGxheU5hbWUgPSBcImZldGNoZXIuRm9ybVwiO1xuICAgIHJldHVybiBGZXRjaGVyRm9ybTI7XG4gIH0sIFtmZXRjaGVyS2V5XSk7XG4gIGxldCBmZXRjaGVyID0gc3RhdGUuZmV0Y2hlcnMuZ2V0KGZldGNoZXJLZXkpIHx8IElETEVfRkVUQ0hFUjtcbiAgbGV0IGRhdGEyID0gZmV0Y2hlckRhdGEuZ2V0KGZldGNoZXJLZXkpO1xuICBsZXQgZmV0Y2hlcldpdGhDb21wb25lbnRzID0gUmVhY3QxMC51c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBGb3JtOiBGZXRjaGVyRm9ybSxcbiAgICAgIHN1Ym1pdCxcbiAgICAgIGxvYWQsXG4gICAgICB1bnN0YWJsZV9yZXNldCxcbiAgICAgIC4uLmZldGNoZXIsXG4gICAgICBkYXRhOiBkYXRhMlxuICAgIH0pLFxuICAgIFtGZXRjaGVyRm9ybSwgc3VibWl0LCBsb2FkLCB1bnN0YWJsZV9yZXNldCwgZmV0Y2hlciwgZGF0YTJdXG4gICk7XG4gIHJldHVybiBmZXRjaGVyV2l0aENvbXBvbmVudHM7XG59XG5mdW5jdGlvbiB1c2VGZXRjaGVycygpIHtcbiAgbGV0IHN0YXRlID0gdXNlRGF0YVJvdXRlclN0YXRlMihcInVzZUZldGNoZXJzXCIgLyogVXNlRmV0Y2hlcnMgKi8pO1xuICByZXR1cm4gQXJyYXkuZnJvbShzdGF0ZS5mZXRjaGVycy5lbnRyaWVzKCkpLm1hcCgoW2tleSwgZmV0Y2hlcl0pID0+ICh7XG4gICAgLi4uZmV0Y2hlcixcbiAgICBrZXlcbiAgfSkpO1xufVxudmFyIFNDUk9MTF9SRVNUT1JBVElPTl9TVE9SQUdFX0tFWSA9IFwicmVhY3Qtcm91dGVyLXNjcm9sbC1wb3NpdGlvbnNcIjtcbnZhciBzYXZlZFNjcm9sbFBvc2l0aW9ucyA9IHt9O1xuZnVuY3Rpb24gZ2V0U2Nyb2xsUmVzdG9yYXRpb25LZXkobG9jYXRpb24sIG1hdGNoZXMsIGJhc2VuYW1lLCBnZXRLZXkpIHtcbiAgbGV0IGtleSA9IG51bGw7XG4gIGlmIChnZXRLZXkpIHtcbiAgICBpZiAoYmFzZW5hbWUgIT09IFwiL1wiKSB7XG4gICAgICBrZXkgPSBnZXRLZXkoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5sb2NhdGlvbixcbiAgICAgICAgICBwYXRobmFtZTogc3RyaXBCYXNlbmFtZShsb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IGxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleSA9IGdldEtleShsb2NhdGlvbiwgbWF0Y2hlcyk7XG4gICAgfVxuICB9XG4gIGlmIChrZXkgPT0gbnVsbCkge1xuICAgIGtleSA9IGxvY2F0aW9uLmtleTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gdXNlU2Nyb2xsUmVzdG9yYXRpb24oe1xuICBnZXRLZXksXG4gIHN0b3JhZ2VLZXlcbn0gPSB7fSkge1xuICBsZXQgeyByb3V0ZXIgfSA9IHVzZURhdGFSb3V0ZXJDb250ZXh0MyhcInVzZVNjcm9sbFJlc3RvcmF0aW9uXCIgLyogVXNlU2Nyb2xsUmVzdG9yYXRpb24gKi8pO1xuICBsZXQgeyByZXN0b3JlU2Nyb2xsUG9zaXRpb24sIHByZXZlbnRTY3JvbGxSZXNldCB9ID0gdXNlRGF0YVJvdXRlclN0YXRlMihcbiAgICBcInVzZVNjcm9sbFJlc3RvcmF0aW9uXCIgLyogVXNlU2Nyb2xsUmVzdG9yYXRpb24gKi9cbiAgKTtcbiAgbGV0IHsgYmFzZW5hbWUgfSA9IFJlYWN0MTAudXNlQ29udGV4dChOYXZpZ2F0aW9uQ29udGV4dCk7XG4gIGxldCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGxldCBtYXRjaGVzID0gdXNlTWF0Y2hlcygpO1xuICBsZXQgbmF2aWdhdGlvbiA9IHVzZU5hdmlnYXRpb24oKTtcbiAgUmVhY3QxMC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIjtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcImF1dG9cIjtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHVzZVBhZ2VIaWRlKFxuICAgIFJlYWN0MTAudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKG5hdmlnYXRpb24uc3RhdGUgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgIGxldCBrZXkgPSBnZXRTY3JvbGxSZXN0b3JhdGlvbktleShsb2NhdGlvbiwgbWF0Y2hlcywgYmFzZW5hbWUsIGdldEtleSk7XG4gICAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zW2tleV0gPSB3aW5kb3cuc2Nyb2xsWTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgc3RvcmFnZUtleSB8fCBTQ1JPTExfUkVTVE9SQVRJT05fU1RPUkFHRV9LRVksXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc2F2ZWRTY3JvbGxQb3NpdGlvbnMpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gc2F2ZSBzY3JvbGwgcG9zaXRpb25zIGluIHNlc3Npb25TdG9yYWdlLCA8U2Nyb2xsUmVzdG9yYXRpb24gLz4gd2lsbCBub3Qgd29yayBwcm9wZXJseSAoJHtlcnJvcn0pLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJhdXRvXCI7XG4gICAgfSwgW25hdmlnYXRpb24uc3RhdGUsIGdldEtleSwgYmFzZW5hbWUsIGxvY2F0aW9uLCBtYXRjaGVzLCBzdG9yYWdlS2V5XSlcbiAgKTtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIFJlYWN0MTAudXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBzZXNzaW9uUG9zaXRpb25zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICBzdG9yYWdlS2V5IHx8IFNDUk9MTF9SRVNUT1JBVElPTl9TVE9SQUdFX0tFWVxuICAgICAgICApO1xuICAgICAgICBpZiAoc2Vzc2lvblBvc2l0aW9ucykge1xuICAgICAgICAgI
25114HNhdmVkU2Nyb2xsUG9zaXRpb25zID0gSlNPTi5wYXJzZShzZXNzaW9uUG9zaXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgfVxuICAgIH0sIFtzdG9yYWdlS2V5XSk7XG4gICAgUmVhY3QxMC51c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgbGV0IGRpc2FibGVTY3JvbGxSZXN0b3JhdGlvbiA9IHJvdXRlcj8uZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb24oXG4gICAgICAgIHNhdmVkU2Nyb2xsUG9zaXRpb25zLFxuICAgICAgICAoKSA9PiB3aW5kb3cuc2Nyb2xsWSxcbiAgICAgICAgZ2V0S2V5ID8gKGxvY2F0aW9uMiwgbWF0Y2hlczIpID0+IGdldFNjcm9sbFJlc3RvcmF0aW9uS2V5KGxvY2F0aW9uMiwgbWF0Y2hlczIsIGJhc2VuYW1lLCBnZXRLZXkpIDogdm9pZCAwXG4gICAgICApO1xuICAgICAgcmV0dXJuICgpID0+IGRpc2FibGVTY3JvbGxSZXN0b3JhdGlvbiAmJiBkaXNhYmxlU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9LCBbcm91dGVyLCBiYXNlbmFtZSwgZ2V0S2V5XSk7XG4gICAgUmVhY3QxMC51c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHJlc3RvcmVTY3JvbGxQb3NpdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXN0b3JlU2Nyb2xsUG9zaXRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHJlc3RvcmVTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChsb2NhdGlvbi5oYXNoKSB7XG4gICAgICAgICAgbGV0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zbGljZSgxKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGBcIiR7bG9jYXRpb24uaGFzaC5zbGljZShcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApfVwiIGlzIG5vdCBhIGRlY29kYWJsZSBlbGVtZW50IElELiBUaGUgdmlldyB3aWxsIG5vdCBzY3JvbGwgdG8gaXQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZlbnRTY3JvbGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfSwgW2xvY2F0aW9uLCByZXN0b3JlU2Nyb2xsUG9zaXRpb24sIHByZXZlbnRTY3JvbGxSZXNldF0pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VCZWZvcmVVbmxvYWQoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgbGV0IHsgY2FwdHVyZSB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgUmVhY3QxMC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBvcHRzID0gY2FwdHVyZSAhPSBudWxsID8geyBjYXB0dXJlIH0gOiB2b2lkIDA7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgY2FsbGJhY2ssIG9wdHMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgfTtcbiAgfSwgW2NhbGxiYWNrLCBjYXB0dXJlXSk7XG59XG5mdW5jdGlvbiB1c2VQYWdlSGlkZShjYWxsYmFjaywgb3B0aW9ucykge1xuICBsZXQgeyBjYXB0dXJlIH0gPSBvcHRpb25zIHx8IHt9O1xuICBSZWFjdDEwLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IG9wdHMgPSBjYXB0dXJlICE9IG51bGwgPyB7IGNhcHR1cmUgfSA6IHZvaWQgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIGNhbGxiYWNrLCBvcHRzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBjYWxsYmFjaywgb3B0cyk7XG4gICAgfTtcbiAgfSwgW2NhbGxiYWNrLCBjYXB0dXJlXSk7XG59XG5mdW5jdGlvbiB1c2VQcm9tcHQoe1xuICB3aGVuLFxuICBtZXNzYWdlXG59KSB7XG4gIGxldCBibG9ja2VyID0gdXNlQmxvY2tlcih3aGVuKTtcbiAgUmVhY3QxMC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChibG9ja2VyLnN0YXRlID09PSBcImJsb2NrZWRcIikge1xuICAgICAgbGV0IHByb2NlZWQgPSB3aW5kb3cuY29uZmlybShtZXNzYWdlKTtcbiAgICAgIGlmIChwcm9jZWVkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYmxvY2tlci5wcm9jZWVkLCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJsb2NrZXIucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtibG9ja2VyLCBtZXNzYWdlXSk7XG4gIFJlYWN0MTAudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoYmxvY2tlci5zdGF0ZSA9PT0gXCJibG9ja2VkXCIgJiYgIXdoZW4pIHtcbiAgICAgIGJsb2NrZXIucmVzZXQoKTtcbiAgICB9XG4gIH0sIFtibG9ja2VyLCB3aGVuXSk7XG59XG5mdW5jdGlvbiB1c2VWaWV3VHJhbnNpdGlvblN0YXRlKHRvLCB7IHJlbGF0aXZlIH0gPSB7fSkge1xuICBsZXQgdnRDb250ZXh0ID0gUmVhY3QxMC51c2VDb250ZXh0KFZpZXdUcmFuc2l0aW9uQ29udGV4dCk7XG4gIGludmFyaWFudChcbiAgICB2dENvbnRleHQgIT0gbnVsbCxcbiAgICBcImB1c2VWaWV3VHJhbnNpdGlvblN0YXRlYCBtdXN0IGJlIHVzZWQgd2l0aGluIGByZWFjdC1yb3V0ZXItZG9tYCdzIGBSb3V0ZXJQcm92aWRlcmAuICBEaWQgeW91IGFjY2lkZW50YWxseSBpbXBvcnQgYFJvdXRlclByb3ZpZGVyYCBmcm9tIGByZWFjdC1yb3V0ZXJgP1wiXG4gICk7XG4gIGxldCB7IGJhc2VuYW1lIH0gPSB1c2VEYXRhUm91dGVyQ29udGV4dDMoXG4gICAgXCJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlXCIgLyogdXNlVmlld1RyYW5zaXRpb25TdGF0ZSAqL1xuICApO1xuICBsZXQgcGF0aCA9IHVzZVJlc29sdmVkUGF0aCh0bywgeyByZWxhdGl2ZSB9KTtcbiAgaWYgKCF2dENvbnRleHQuaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBjdXJyZW50UGF0aCA9IHN0cmlwQmFzZW5hbWUodnRDb250ZXh0LmN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IHZ0Q29udGV4dC5jdXJyZW50TG9jYXRpb24ucGF0aG5hbWU7XG4gIGxldCBuZXh0UGF0aCA9IHN0cmlwQmFzZW5hbWUodnRDb250ZXh0Lm5leHRMb2NhdGlvbi5wYXRobmFtZSwgYmFzZW5hbWUpIHx8IHZ0Q29udGV4dC5uZXh0TG9jYXRpb24ucGF0aG5hbWU7XG4gIHJldHVybi
25114BtYXRjaFBhdGgocGF0aC5wYXRobmFtZSwgbmV4dFBhdGgpICE9IG51bGwgfHwgbWF0Y2hQYXRoKHBhdGgucGF0aG5hbWUsIGN1cnJlbnRQYXRoKSAhPSBudWxsO1xufVxuXG4vLyBsaWIvZG9tL3NlcnZlci50c3hcbmltcG9ydCAqIGFzIFJlYWN0MTEgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBTdGF0aWNSb3V0ZXIoe1xuICBiYXNlbmFtZSxcbiAgY2hpbGRyZW4sXG4gIGxvY2F0aW9uOiBsb2NhdGlvblByb3AgPSBcIi9cIlxufSkge1xuICBpZiAodHlwZW9mIGxvY2F0aW9uUHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxvY2F0aW9uUHJvcCA9IHBhcnNlUGF0aChsb2NhdGlvblByb3ApO1xuICB9XG4gIGxldCBhY3Rpb24gPSBcIlBPUFwiIC8qIFBvcCAqLztcbiAgbGV0IGxvY2F0aW9uID0ge1xuICAgIHBhdGhuYW1lOiBsb2NhdGlvblByb3AucGF0aG5hbWUgfHwgXCIvXCIsXG4gICAgc2VhcmNoOiBsb2NhdGlvblByb3Auc2VhcmNoIHx8IFwiXCIsXG4gICAgaGFzaDogbG9jYXRpb25Qcm9wLmhhc2ggfHwgXCJcIixcbiAgICBzdGF0ZTogbG9jYXRpb25Qcm9wLnN0YXRlICE9IG51bGwgPyBsb2NhdGlvblByb3Auc3RhdGUgOiBudWxsLFxuICAgIGtleTogbG9jYXRpb25Qcm9wLmtleSB8fCBcImRlZmF1bHRcIlxuICB9O1xuICBsZXQgc3RhdGljTmF2aWdhdG9yID0gZ2V0U3RhdGVsZXNzTmF2aWdhdG9yKCk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFxuICAgIFJvdXRlcixcbiAgICB7XG4gICAgICBiYXNlbmFtZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBuYXZpZ2F0aW9uVHlwZTogYWN0aW9uLFxuICAgICAgbmF2aWdhdG9yOiBzdGF0aWNOYXZpZ2F0b3IsXG4gICAgICBzdGF0aWM6IHRydWVcbiAgICB9XG4gICk7XG59XG5mdW5jdGlvbiBTdGF0aWNSb3V0ZXJQcm92aWRlcih7XG4gIGNvbnRleHQsXG4gIHJvdXRlcixcbiAgaHlkcmF0ZTogaHlkcmF0ZTIgPSB0cnVlLFxuICBub25jZVxufSkge1xuICBpbnZhcmlhbnQoXG4gICAgcm91dGVyICYmIGNvbnRleHQsXG4gICAgXCJZb3UgbXVzdCBwcm92aWRlIGByb3V0ZXJgIGFuZCBgY29udGV4dGAgdG8gPFN0YXRpY1JvdXRlclByb3ZpZGVyPlwiXG4gICk7XG4gIGxldCBkYXRhUm91dGVyQ29udGV4dCA9IHtcbiAgICByb3V0ZXIsXG4gICAgbmF2aWdhdG9yOiBnZXRTdGF0ZWxlc3NOYXZpZ2F0b3IoKSxcbiAgICBzdGF0aWM6IHRydWUsXG4gICAgc3RhdGljQ29udGV4dDogY29udGV4dCxcbiAgICBiYXNlbmFtZTogY29udGV4dC5iYXNlbmFtZSB8fCBcIi9cIlxuICB9O1xuICBsZXQgZmV0Y2hlcnNDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IGh5ZHJhdGVTY3JpcHQgPSBcIlwiO1xuICBpZiAoaHlkcmF0ZTIgIT09IGZhbHNlKSB7XG4gICAgbGV0IGRhdGEyID0ge1xuICAgICAgbG9hZGVyRGF0YTogY29udGV4dC5sb2FkZXJEYXRhLFxuICAgICAgYWN0aW9uRGF0YTogY29udGV4dC5hY3Rpb25EYXRhLFxuICAgICAgZXJyb3JzOiBzZXJpYWxpemVFcnJvcnMoY29udGV4dC5lcnJvcnMpXG4gICAgfTtcbiAgICBsZXQganNvbiA9IGh0bWxFc2NhcGUoSlNPTi5zdHJpbmdpZnkoSlNPTi5zdHJpbmdpZnkoZGF0YTIpKSk7XG4gICAgaHlkcmF0ZVNjcmlwdCA9IGB3aW5kb3cuX19zdGF0aWNSb3V0ZXJIeWRyYXRpb25EYXRhID0gSlNPTi5wYXJzZSgke2pzb259KTtgO1xuICB9XG4gIGxldCB7IHN0YXRlIH0gPSBkYXRhUm91dGVyQ29udGV4dC5yb3V0ZXI7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFJlYWN0MTEuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDExLmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGRhdGFSb3V0ZXJDb250ZXh0IH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDExLmNyZWF0ZUVsZW1lbnQoRGF0YVJvdXRlclN0YXRlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogc3RhdGUgfSwgLyogQF9fUFVSRV9fICovIFJlYWN0MTEuY3JlYXRlRWxlbWVudChGZXRjaGVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGZldGNoZXJzQ29udGV4dCB9LCAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFZpZXdUcmFuc2l0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBpc1RyYW5zaXRpb25pbmc6IGZhbHNlIH0gfSwgLyogQF9fUFVSRV9fICovIFJlYWN0MTEuY3JlYXRlRWxlbWVudChcbiAgICBSb3V0ZXIsXG4gICAge1xuICAgICAgYmFzZW5hbWU6IGRhdGFSb3V0ZXJDb250ZXh0LmJhc2VuYW1lLFxuICAgICAgbG9jYXRpb246IHN0YXRlLmxvY2F0aW9uLFxuICAgICAgbmF2aWdhdGlvblR5cGU6IHN0YXRlLmhpc3RvcnlBY3Rpb24sXG4gICAgICBuYXZpZ2F0b3I6IGRhdGFSb3V0ZXJDb250ZXh0Lm5hdmlnYXRvcixcbiAgICAgIHN0YXRpYzogZGF0YVJvdXRlckNvbnRleHQuc3RhdGljXG4gICAgfSxcbiAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFxuICAgICAgRGF0YVJvdXRlczIsXG4gICAgICB7XG4gICAgICAgIHJvdXRlczogcm91dGVyLnJvdXRlcyxcbiAgICAgICAgZnV0dXJlOiByb3V0ZXIuZnV0dXJlLFxuICAgICAgICBzdGF0ZVxuICAgICAgfVxuICAgIClcbiAgKSkpKSksIGh5ZHJhdGVTY3JpcHQgPyAvKiBAX19QVVJFX18gKi8gUmVhY3QxMS5jcmVhdGVFbGVtZW50KFxuICAgIFwic2NyaXB0XCIsXG4gICAge1xuICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlLFxuICAgICAgbm9uY2UsXG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IGh5ZHJhdGVTY3JpcHQgfVxuICAgIH1cbiAgKSA6IG51bGwpO1xufVxuZnVuY3Rpb24gRGF0YVJvdXRlczIoe1xuICByb3V0ZXMsXG4gIGZ1dHVyZSxcbiAgc3RhdGVcbn0pIHtcbiAgcmV0dXJuIHVzZVJvdXRlc0ltcGwocm91dGVzLCB2b2lkIDAsIHN0YXRlLCB2b2lkIDAsIGZ1dHVyZSk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlcnJvcnMpO1xuICBsZXQgc2VyaWFsaXplZCA9IHt9O1xuICBmb3IgKGxldCBba2V5LCB2YWxdIG9mIGVudHJpZXMpIHtcbiAgICBpZiAoaXNSb3V0ZUVycm9yUmVzcG9uc2UodmFsKSkge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0geyAuLi52YWwsIF9fdHlwZTogXCJSb3V0
25114ZUVycm9yUmVzcG9uc2VcIiB9O1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IHtcbiAgICAgICAgbWVzc2FnZTogdmFsLm1lc3NhZ2UsXG4gICAgICAgIF9fdHlwZTogXCJFcnJvclwiLFxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViY2xhc3MgKGkuZS4sIFJlZmVyZW5jZUVycm9yKSwgc2VuZCB1cCB0aGUgdHlwZSBzbyB3ZVxuICAgICAgICAvLyBjYW4gcmUtY3JlYXRlIHRoZSBzYW1lIHR5cGUgZHVyaW5nIGh5ZHJhdGlvbi5cbiAgICAgICAgLi4udmFsLm5hbWUgIT09IFwiRXJyb3JcIiA/IHtcbiAgICAgICAgICBfX3N1YlR5cGU6IHZhbC5uYW1lXG4gICAgICAgIH0gOiB7fVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cbmZ1bmN0aW9uIGdldFN0YXRlbGVzc05hdmlnYXRvcigpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVIcmVmLFxuICAgIGVuY29kZUxvY2F0aW9uLFxuICAgIHB1c2godG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgdXNlIG5hdmlnYXRvci5wdXNoKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LiBUaGlzIGVycm9yIHdhcyBwcm9iYWJseSB0cmlnZ2VyZWQgd2hlbiB5b3UgZGlkIGEgXFxgbmF2aWdhdGUoJHtKU09OLnN0cmluZ2lmeSh0byl9KVxcYCBzb21ld2hlcmUgaW4geW91ciBhcHAuYFxuICAgICAgKTtcbiAgICB9LFxuICAgIHJlcGxhY2UodG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgdXNlIG5hdmlnYXRvci5yZXBsYWNlKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LiBUaGlzIGVycm9yIHdhcyBwcm9iYWJseSB0cmlnZ2VyZWQgd2hlbiB5b3UgZGlkIGEgXFxgbmF2aWdhdGUoJHtKU09OLnN0cmluZ2lmeSh0byl9LCB7IHJlcGxhY2U6IHRydWUgfSlcXGAgc29tZXdoZXJlIGluIHlvdXIgYXBwLmBcbiAgICAgICk7XG4gICAgfSxcbiAgICBnbyhkZWx0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbm5vdCB1c2UgbmF2aWdhdG9yLmdvKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LiBUaGlzIGVycm9yIHdhcyBwcm9iYWJseSB0cmlnZ2VyZWQgd2hlbiB5b3UgZGlkIGEgXFxgbmF2aWdhdGUoJHtkZWx0YX0pXFxgIHNvbWV3aGVyZSBpbiB5b3VyIGFwcC5gXG4gICAgICApO1xuICAgIH0sXG4gICAgYmFjaygpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW5ub3QgdXNlIG5hdmlnYXRvci5iYWNrKCkgb24gdGhlIHNlcnZlciBiZWNhdXNlIGl0IGlzIGEgc3RhdGVsZXNzIGVudmlyb25tZW50LmBcbiAgICAgICk7XG4gICAgfSxcbiAgICBmb3J3YXJkKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbm5vdCB1c2UgbmF2aWdhdG9yLmZvcndhcmQoKSBvbiB0aGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgYSBzdGF0ZWxlc3MgZW52aXJvbm1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNIYW5kbGVyMihyb3V0ZXMsIG9wdHMpIHtcbiAgcmV0dXJuIGNyZWF0ZVN0YXRpY0hhbmRsZXIocm91dGVzLCB7XG4gICAgLi4ub3B0cyxcbiAgICBtYXBSb3V0ZVByb3BlcnRpZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNSb3V0ZXIocm91dGVzLCBjb250ZXh0LCBvcHRzID0ge30pIHtcbiAgbGV0IG1hbmlmZXN0ID0ge307XG4gIGxldCBkYXRhUm91dGVzID0gY29udmVydFJvdXRlc1RvRGF0YVJvdXRlcyhcbiAgICByb3V0ZXMsXG4gICAgbWFwUm91dGVQcm9wZXJ0aWVzLFxuICAgIHZvaWQgMCxcbiAgICBtYW5pZmVzdFxuICApO1xuICBsZXQgbWF0Y2hlcyA9IGNvbnRleHQubWF0Y2hlcy5tYXAoKG1hdGNoKSA9PiB7XG4gICAgbGV0IHJvdXRlID0gbWFuaWZlc3RbbWF0Y2gucm91dGUuaWRdIHx8IG1hdGNoLnJvdXRlO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tYXRjaCxcbiAgICAgIHJvdXRlXG4gICAgfTtcbiAgfSk7XG4gIGxldCBtc2cgPSAobWV0aG9kKSA9PiBgWW91IGNhbm5vdCB1c2Ugcm91dGVyLiR7bWV0aG9kfSgpIG9uIHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBhIHN0YXRlbGVzcyBlbnZpcm9ubWVudGA7XG4gIHJldHVybiB7XG4gICAgZ2V0IGJhc2VuYW1lKCkge1xuICAgICAgcmV0dXJuIGNvbnRleHQuYmFzZW5hbWU7XG4gICAgfSxcbiAgICBnZXQgZnV0dXJlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjhfbWlkZGxld2FyZTogZmFsc2UsXG4gICAgICAgIC4uLm9wdHM/LmZ1dHVyZVxuICAgICAgfTtcbiAgICB9LFxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhpc3RvcnlBY3Rpb246IFwiUE9QXCIgLyogUG9wICovLFxuICAgICAgICBsb2NhdGlvbjogY29udGV4dC5sb2NhdGlvbixcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgbG9hZGVyRGF0YTogY29udGV4dC5sb2FkZXJEYXRhLFxuICAgICAgICBhY3Rpb25EYXRhOiBjb250ZXh0LmFjdGlvbkRhdGEsXG4gICAgICAgIGVycm9yczogY29udGV4dC5lcnJvcnMsXG4gICAgICAgIGluaXRpYWxpemVkOiB0cnVlLFxuICAgICAgICBuYXZpZ2F0aW9uOiBJRExFX05BVklHQVRJT04sXG4gICAgICAgIHJlc3RvcmVTY3JvbGxQb3NpdGlvbjogbnVsbCxcbiAgICAgICAgcHJldmVudFNjcm9sbFJlc2V0OiBmYWxzZSxcbiAgICAgICAgcmV2YWxpZGF0aW9uOiBcImlkbGVcIixcbiAgICAgICAgZmV0Y2hlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICAgIGJsb2NrZXJzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG4gICAgICB9O1xuICAgIH0sXG4gICAgZ2V0IHJvdXRlcygpIHtcbiAgICAgIHJldHVybiBkYXRhUm91dGVzO1xuICAgIH0sXG4gICAgZ2V0IHdpbmRvdygpIHtcbiAgICAgIHJldHVybi
25114B2b2lkIDA7XG4gICAgfSxcbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgdGhyb3cgbXNnKFwiaW5pdGlhbGl6ZVwiKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZSgpIHtcbiAgICAgIHRocm93IG1zZyhcInN1YnNjcmliZVwiKTtcbiAgICB9LFxuICAgIGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uKCkge1xuICAgICAgdGhyb3cgbXNnKFwiZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb25cIik7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSgpIHtcbiAgICAgIHRocm93IG1zZyhcIm5hdmlnYXRlXCIpO1xuICAgIH0sXG4gICAgZmV0Y2goKSB7XG4gICAgICB0aHJvdyBtc2coXCJmZXRjaFwiKTtcbiAgICB9LFxuICAgIHJldmFsaWRhdGUoKSB7XG4gICAgICB0aHJvdyBtc2coXCJyZXZhbGlkYXRlXCIpO1xuICAgIH0sXG4gICAgY3JlYXRlSHJlZixcbiAgICBlbmNvZGVMb2NhdGlvbixcbiAgICBnZXRGZXRjaGVyKCkge1xuICAgICAgcmV0dXJuIElETEVfRkVUQ0hFUjtcbiAgICB9LFxuICAgIGRlbGV0ZUZldGNoZXIoKSB7XG4gICAgICB0aHJvdyBtc2coXCJkZWxldGVGZXRjaGVyXCIpO1xuICAgIH0sXG4gICAgcmVzZXRGZXRjaGVyKCkge1xuICAgICAgdGhyb3cgbXNnKFwicmVzZXRGZXRjaGVyXCIpO1xuICAgIH0sXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIHRocm93IG1zZyhcImRpc3Bvc2VcIik7XG4gICAgfSxcbiAgICBnZXRCbG9ja2VyKCkge1xuICAgICAgcmV0dXJuIElETEVfQkxPQ0tFUjtcbiAgICB9LFxuICAgIGRlbGV0ZUJsb2NrZXIoKSB7XG4gICAgICB0aHJvdyBtc2coXCJkZWxldGVCbG9ja2VyXCIpO1xuICAgIH0sXG4gICAgcGF0Y2hSb3V0ZXMoKSB7XG4gICAgICB0aHJvdyBtc2coXCJwYXRjaFJvdXRlc1wiKTtcbiAgICB9LFxuICAgIF9pbnRlcm5hbEZldGNoQ29udHJvbGxlcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgX2ludGVybmFsU2V0Um91dGVzKCkge1xuICAgICAgdGhyb3cgbXNnKFwiX2ludGVybmFsU2V0Um91dGVzXCIpO1xuICAgIH0sXG4gICAgX2ludGVybmFsU2V0U3RhdGVEb05vdFVzZU9yWW91V2lsbEJyZWFrWW91ckFwcCgpIHtcbiAgICAgIHRocm93IG1zZyhcIl9pbnRlcm5hbFNldFN0YXRlRG9Ob3RVc2VPcllvdVdpbGxCcmVha1lvdXJBcHBcIik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSHJlZih0bykge1xuICByZXR1cm4gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gdG8gOiBjcmVhdGVQYXRoKHRvKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUxvY2F0aW9uKHRvKSB7XG4gIGxldCBocmVmID0gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gdG8gOiBjcmVhdGVQYXRoKHRvKTtcbiAgaHJlZiA9IGhyZWYucmVwbGFjZSgvICQvLCBcIiUyMFwiKTtcbiAgbGV0IGVuY29kZWQgPSBBQlNPTFVURV9VUkxfUkVHRVgzLnRlc3QoaHJlZikgPyBuZXcgVVJMKGhyZWYpIDogbmV3IFVSTChocmVmLCBcImh0dHA6Ly9sb2NhbGhvc3RcIik7XG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IGVuY29kZWQucGF0aG5hbWUsXG4gICAgc2VhcmNoOiBlbmNvZGVkLnNlYXJjaCxcbiAgICBoYXNoOiBlbmNvZGVkLmhhc2hcbiAgfTtcbn1cbnZhciBBQlNPTFVURV9VUkxfUkVHRVgzID0gL14oPzpbYS16XVthLXowLTkrLi1dKjp8XFwvXFwvKS9pO1xudmFyIEVTQ0FQRV9MT09LVVAyID0ge1xuICBcIiZcIjogXCJcXFxcdTAwMjZcIixcbiAgXCI+XCI6IFwiXFxcXHUwMDNlXCIsXG4gIFwiPFwiOiBcIlxcXFx1MDAzY1wiLFxuICBcIlxcdTIwMjhcIjogXCJcXFxcdTIwMjhcIixcbiAgXCJcXHUyMDI5XCI6IFwiXFxcXHUyMDI5XCJcbn07XG52YXIgRVNDQVBFX1JFR0VYMiA9IC9bJj48XFx1MjAyOFxcdTIwMjldL2c7XG5mdW5jdGlvbiBodG1sRXNjYXBlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoRVNDQVBFX1JFR0VYMiwgKG1hdGNoKSA9PiBFU0NBUEVfTE9PS1VQMlttYXRjaF0pO1xufVxuXG5leHBvcnQge1xuICBBY3Rpb24sXG4gIGNyZWF0ZUJyb3dzZXJIaXN0b3J5LFxuICBpbnZhcmlhbnQsXG4gIGNyZWF0ZVBhdGgsXG4gIHBhcnNlUGF0aCxcbiAgY3JlYXRlQ29udGV4dCxcbiAgUm91dGVyQ29udGV4dFByb3ZpZGVyLFxuICBjb252ZXJ0Um91dGVzVG9EYXRhUm91dGVzLFxuICBtYXRjaFJvdXRlcyxcbiAgZ2VuZXJhdGVQYXRoLFxuICBtYXRjaFBhdGgsXG4gIHN0cmlwQmFzZW5hbWUsXG4gIHJlc29sdmVQYXRoLFxuICBkYXRhLFxuICByZWRpcmVjdCxcbiAgcmVkaXJlY3REb2N1bWVudCxcbiAgcmVwbGFjZSxcbiAgRXJyb3JSZXNwb25zZUltcGwsXG4gIGlzUm91dGVFcnJvclJlc3BvbnNlLFxuICBJRExFX05BVklHQVRJT04sXG4gIElETEVfRkVUQ0hFUixcbiAgSURMRV9CTE9DS0VSLFxuICBjcmVhdGVSb3V0ZXIsXG4gIGNyZWF0ZVN0YXRpY0hhbmRsZXIsXG4gIGdldFN0YXRpY0NvbnRleHRGcm9tRXJyb3IsXG4gIGlzRGF0YVdpdGhSZXNwb25zZUluaXQsXG4gIGlzUmVzcG9uc2UsXG4gIGlzUmVkaXJlY3RTdGF0dXNDb2RlLFxuICBpc1JlZGlyZWN0UmVzcG9uc2UsXG4gIGlzTXV0YXRpb25NZXRob2QsXG4gIERhdGFSb3V0ZXJDb250ZXh0LFxuICBEYXRhUm91dGVyU3RhdGVDb250ZXh0LFxuICBSU0NSb3V0ZXJDb250ZXh0LFxuICBWaWV3VHJhbnNpdGlvbkNvbnRleHQsXG4gIEZldGNoZXJzQ29udGV4dCxcbiAgQXdhaXRDb250ZXh0UHJvdmlkZXIsXG4gIE5hdmlnYXRpb25Db250ZXh0LFxuICBMb2NhdGlvbkNvbnRleHQsXG4gIFJvdXRlQ29udGV4dCxcbiAgRU5BQkxFX0RFVl9XQVJOSU5HUyxcbiAgdXNlSHJlZixcbiAgdXNlSW5Sb3V0ZXJDb250ZXh0LFxuICB1c2VMb2NhdGlvbixcbiAgdXNlTmF2aWdhdGlvblR5cGUsXG4gIHVzZU1hdGNoLFxuICB1c2VOYXZpZ2F0ZSxcbiAgdXNlT3V0bGV0Q29udGV4dCxcbiAgdXNlT3V0bGV0LFxuICB1c2VQYXJhbXMsXG4gIHVzZVJlc29sdmVkUGF0aCxcbiAgdXNlUm91dGVzLFxuICB1c2VOYXZpZ2F0aW9uLFxuICB1c2VSZXZhbGlkYXRvcixcbiAgdXNlTWF0Y2hlcyxcbiAgdXNlTG9hZGVyRGF0YSxcbiAgdXNlUm91dGVMb2FkZXJEYXRhLFxuICB1c2VBY3Rpb25EYXRhLFxuICB1c2VSb3V0ZUVycm9yLFxuICB1c2VBc3luY1ZhbHVlLFxuICB1c2VBc3luY0Vycm9yLFxuICB1c2VCbG9ja2VyLFxuICB3YXJuT25jZSxcbiAgbWFwUm91dGVQcm9wZXJ0aWVzLFxuICBoeWRyYXRpb25Sb3V0ZVByb3BlcnRpZXMsXG4gIGNyZWF0ZU1lbW9yeVJvdXRlcixcbiAgVU5TVEFCTEVfVHJhbnNpdGlvbkVuYWJsZWRSb3V0ZXJQcm92aWRlcixcbiAgUm91dGVyUHJvdmlkZXIsXG4gIE1lbW9yeVJvdXRlcixcbiAgTmF2aWdhdGUsXG4gIE91dGxldCxcbiAgUm91dGUsXG4gIFJvdXRlcixcbiAgUm91dGVzLFxuICBBd2FpdCxcbiAgY3JlYXRlUm91dGVzRnJvbUNoaWxkcmVuLFxuICBjcmVhdGVSb3V0ZXNGcm9tRWxlbWVudHMsXG4gIHJlbmRlck1hdGNoZXMsXG4gIFdpdGhDb21wb25lbnRQcm9wcyxcbiAgd2l0aENvbXBvbmVudFByb3BzLFxuICBXaXRoSHlkcmF0ZUZhbGxiYWNrUHJvcHMsXG4gIHdpdGhIeWRyYXRlRmFsbGJhY2tQcm9wcyxcbiAgV2l0aEVycm9yQm91bmRhcnlQcm9wcyxcbiAgd2l0aEVycm9yQm91bmRhcnlQcm9wcyxcbiAgY3JlYXRlU2VhcmNoUGFyYW1zLFxuICBlc2NhcGVIdG1sLFxuICBlbmNvZGUsXG4gIGNyZWF0ZVJlcXVlc3RJbml0LFxuICBTaW5nbGVGZXRjaFJlZGlyZWN0U3ltYm9sLFxuICBTSU5HTEVfRkVUQ0hfUkVESVJFQ1RfU1RBVFVTLFxuICBOT19CT0RZX1NUQVRVU19DT0RFUyxcbiAgU3RyZWFtVHJhbnNmZXIsXG4gIGdldFR1cmJvU3RyZWFtU2luZ2xlRmV0Y2hEYXRhU3RyYXRlZ3ksXG4gIGdldFNpbmdsZUZldGNoRGF0YVN0cmF0ZWd5SW1wbCxcbiAgc3RyaXBJbmRleFBhcmFtLFxuICBzaW5nbGVGZXRjaFVybCxcbiAgZGVjb2RlVmlhVHVyYm9TdHJlYW0sXG4gIFJlbWl4RXJyb3JCb3VuZGFyeSxcbiAgY3JlYXRlU2VydmVyUm91dGVzLFxuICBjcmVhdGVDbGllbnRSb3V0ZXNXaXRoSE1SUmV2YWxpZGF0aW9uT3B0T3V0LFxuICBub0FjdGlvbkRlZmluZWRFcnJvcixcbiAgY3JlYXRlQ2xpZW50Um91dGVzLFxuICBzaG91bGRIeWRyYXRlUm91dGVMb2FkZXIsXG4gIGdldFBhdGNoUm91dGVzT25OYXZpZ2F0aW9uRnVuY3Rpb24sXG4gIHVzZUZvZ09GV2FyRGlzY292ZXJ5LFxuICBnZXRNYW5pZmVzdFBhdGgsXG4gIEZyYW1ld29ya0NvbnRleHQsXG4gIENSSVRJQ0FMX0NTU19EQVRBX0FUVFJJQlVURSxcbiAgTGlua3MsXG4gIFByZWZldGNoUGFnZUxpbmtzLFxuICBNZXRhLFxuICBzZXRJc0h5ZHJhdGVkLFxuICBTY3JpcHRzLFxuICBjcmVhdGVCcm93c2VyUm91dGVyLFxuICBjcmVhdGVIYXNoUm91dGVyLFxuICBCcm93c2VyUm91dGVyLFxuICBIYXNoUm91dGVyLFxuICBIaXN0b3J5Um91dGVyLFxuICBMaW5rLFxuICBOYXZMaW5rLFxuICBGb3JtLFxuICBTY3JvbGxSZXN0b3JhdGlvbixcbiAgdXNlTGlua0NsaWNrSGFuZGxlcixcbiAgdXNlU2VhcmNoUGFyYW1zLFxuICB1c2VTdWJtaXQsXG4gIHVzZUZvcm1BY3Rpb24sXG4gIHVzZUZldGNoZXIsXG4gIHVzZUZldGNoZXJzLF
25114xuICB1c2VTY3JvbGxSZXN0b3JhdGlvbixcbiAgdXNlQmVmb3JlVW5sb2FkLFxuICB1c2VQcm9tcHQsXG4gIHVzZVZpZXdUcmFuc2l0aW9uU3RhdGUsXG4gIFN0YXRpY1JvdXRlcixcbiAgU3RhdGljUm91dGVyUHJvdmlkZXIsXG4gIGNyZWF0ZVN0YXRpY0hhbmRsZXIyLFxuICBjcmVhdGVTdGF0aWNSb3V0ZXJcbn07XG4iLCIvKipcbiAqIHJlYWN0LXJvdXRlciB2Ny45LjNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXCJ1c2UgY2xpZW50XCI7XG5pbXBvcnQge1xuICBkZXNlcmlhbGl6ZUVycm9ycyxcbiAgZ2V0SHlkcmF0aW9uRGF0YVxufSBmcm9tIFwiLi9jaHVuay02NVhKTU1MTy5tanNcIjtcbmltcG9ydCB7XG4gIENSSVRJQ0FMX0NTU19EQVRBX0FUVFJJQlVURSxcbiAgRnJhbWV3b3JrQ29udGV4dCxcbiAgUmVtaXhFcnJvckJvdW5kYXJ5LFxuICBSb3V0ZXJQcm92aWRlcixcbiAgY3JlYXRlQnJvd3Nlckhpc3RvcnksXG4gIGNyZWF0ZUNsaWVudFJvdXRlcyxcbiAgY3JlYXRlQ2xpZW50Um91dGVzV2l0aEhNUlJldmFsaWRhdGlvbk9wdE91dCxcbiAgY3JlYXRlUm91dGVyLFxuICBkZWNvZGVWaWFUdXJib1N0cmVhbSxcbiAgZ2V0UGF0Y2hSb3V0ZXNPbk5hdmlnYXRpb25GdW5jdGlvbixcbiAgZ2V0VHVyYm9TdHJlYW1TaW5nbGVGZXRjaERhdGFTdHJhdGVneSxcbiAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzLFxuICBpbnZhcmlhbnQsXG4gIG1hcFJvdXRlUHJvcGVydGllcyxcbiAgdXNlRm9nT0ZXYXJEaXNjb3Zlcnlcbn0gZnJvbSBcIi4vY2h1bmstTklTSFlSSUsubWpzXCI7XG5cbi8vIGxpYi9kb20tZXhwb3J0L2RvbS1yb3V0ZXItcHJvdmlkZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmZ1bmN0aW9uIFJvdXRlclByb3ZpZGVyMihwcm9wcykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyUHJvdmlkZXIsIHsgZmx1c2hTeW5jOiBSZWFjdERPTS5mbHVzaFN5bmMsIC4uLnByb3BzIH0pO1xufVxuXG4vLyBsaWIvZG9tLWV4cG9ydC9oeWRyYXRlZC1yb3V0ZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDIgZnJvbSBcInJlYW
25114N0XCI7XG52YXIgc3NySW5mbyA9IG51bGw7XG52YXIgcm91dGVyID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRTc3JJbmZvKCkge1xuICBpZiAoIXNzckluZm8gJiYgd2luZG93Ll9fcmVhY3RSb3V0ZXJDb250ZXh0ICYmIHdpbmRvdy5fX3JlYWN0Um91dGVyTWFuaWZlc3QgJiYgd2luZG93Ll9fcmVhY3RSb3V0ZXJSb3V0ZU1vZHVsZXMpIHtcbiAgICBpZiAod2luZG93Ll9fcmVhY3RSb3V0ZXJNYW5pZmVzdC5zcmkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGltcG9ydE1hcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzY3JpcHRbcnItaW1wb3J0bWFwXVwiKTtcbiAgICAgIGlmIChpbXBvcnRNYXA/LnRleHRDb250ZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd2luZG93Ll9fcmVhY3RSb3V0ZXJNYW5pZmVzdC5zcmkgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgaW1wb3J0TWFwLnRleHRDb250ZW50XG4gICAgICAgICAgKS5pbnRlZ3JpdHk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaW1wb3J0IG1hcFwiLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNzckluZm8gPSB7XG4gICAgICBjb250ZXh0OiB3aW5kb3cuX19yZWFjdFJvdXRlckNvbnRleHQsXG4gICAgICBtYW5pZmVzdDogd2luZG93Ll9fcmVhY3RSb3V0ZXJNYW5pZmVzdCxcbiAgICAgIHJvdXRlTW9kdWxlczogd2luZG93Ll9fcmVhY3RSb3V0ZXJSb3V0ZU1vZHVsZXMsXG4gICAgICBzdGF0ZURlY29kaW5nUHJvbWlzZTogdm9pZCAwLFxuICAgICAgcm91dGVyOiB2b2lkIDAsXG4gICAgICByb3V0ZXJJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRlZFJvdXRlcih7XG4gIGdldENvbnRleHRcbn0pIHtcbiAgaW5pdFNzckluZm8oKTtcbiAgaWYgKCFzc3JJbmZvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJZb3UgbXVzdCBiZSB1c2luZyB0aGUgU1NSIGZlYXR1cmVzIG9mIFJlYWN0IFJvdXRlciBpbiBvcmRlciB0byBza2lwIHBhc3NpbmcgYSBgcm91dGVyYCBwcm9wIHRvIGA8Um91dGVyUHJvdmlkZXI+YFwiXG4gICAgKTtcbiAgfVxuICBsZXQgbG9jYWxTc3JJbmZvID0gc3NySW5mbztcbiAgaWYgKCFzc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlKSB7XG4gICAgbGV0IHN0cmVhbSA9IHNzckluZm8uY29udGV4dC5zdHJlYW07XG4gICAgaW52YXJpYW50KHN0cmVhbSwgXCJObyBzdHJlYW0gZm91bmQgZm9yIHNpbmdsZSBmZXRjaCBkZWNvZGluZ1wiKTtcbiAgICBzc3JJbmZvLmNvbnRleHQuc3RyZWFtID0gdm9pZCAwO1xuICAgIHNzckluZm8uc3RhdGVEZWNvZGluZ1Byb21pc2UgPSBkZWNvZGVWaWFUdXJib1N0cmVhbShzdHJlYW0sIHdpbmRvdykudGhlbigodmFsdWUpID0+IHtcbiAgICAgIHNzckluZm8uY29udGV4dC5zdGF0ZSA9IHZhbHVlLnZhbHVlO1xuICAgICAgbG9jYWxTc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlLnZhbHVlID0gdHJ1ZTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgbG9jYWxTc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlLmVycm9yID0gZTtcbiAgICB9KTtcbiAgfVxuICBpZiAoc3NySW5mby5zdGF0ZURlY29kaW5nUHJvbWlzZS5lcnJvcikge1xuICAgIHRocm93IHNzckluZm8uc3RhdGVEZWNvZGluZ1Byb21pc2UuZXJyb3I7XG4gIH1cbiAgaWYgKCFzc3JJbmZvLnN0YXRlRGVjb2RpbmdQcm9taXNlLnZhbHVlKSB7XG4gICAgdGhyb3cgc3NySW5mby5zdGF0ZURlY29kaW5nUHJvbWlzZTtcbiAgfVxuICBsZXQgcm91dGVzID0gY3JlYXRlQ2xpZW50Um91dGVzKFxuICAgIHNzckluZm8ubWFuaWZlc3Qucm91dGVzLFxuICAgIHNzckluZm8ucm91dGVNb2R1bGVzLFxuICAgIHNzckluZm8uY29udGV4dC5zdGF0ZSxcbiAgICBzc3JJbmZvLmNvbnRleHQuc3NyLFxuICAgIHNzckluZm8uY29udGV4dC5pc1NwYU1vZGVcbiAgKTtcbiAgbGV0IGh5ZHJhdGlvbkRhdGEgPSB2b2lkIDA7XG4gIGlmIChzc3JJbmZvLmNvbnRleHQuaXNTcGFNb2RlKSB7XG4gICAgbGV0IHsgbG9hZGVyRGF0YSB9ID0gc3NySW5mby5jb250ZXh0LnN0YXRlO1xuICAgIGlmIChzc3JJbmZvLm1hbmlmZXN0LnJvdXRlcy5yb290Py5oYXNMb2FkZXIgJiYgbG9hZGVyRGF0YSAmJiBcInJvb3RcIiBpbiBsb2FkZXJEYXRhKSB7XG4gICAgICBoeWRyYXRpb25EYXRhID0ge1xuICAgICAgICBsb2FkZXJEYXRhOiB7XG4gICAgICAgICAgcm9vdDogbG9hZGVyRGF0YS5yb290XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkRhdGEgPSBnZXRIeWRyYXRpb25EYXRhKHtcbiAgICAgIHN0YXRlOiBzc3JJbmZvLmNvbnRleHQuc3RhdGUsXG4gICAgICByb3V0ZXMsXG4gICAgICBnZXRSb3V0ZUluZm86IChyb3V0ZUlkKSA9PiAoe1xuICAgICAgICBjbGllbnRMb2FkZXI6IHNzckluZm8ucm91dGVNb2R1bGVzW3JvdXRlSWRdPy5jbGllbnRMb2FkZXIsXG4gICAgICAgIGhhc0xvYWRlcjogc3NySW5mby5tYW5pZmVzdC5yb3V0ZXNbcm91dGVJZF0/Lmhhc0xvYWRlciA9PT0gdHJ1ZSxcbiAgICAgICAgaGFzSHlkcmF0ZUZhbGxiYWNrOiBzc3JJbmZvLnJvdXRlTW9kdWxlc1tyb3V0ZUlkXT8uSHlkcmF0ZUZhbGxiYWNrICE9IG51bGxcbiAgICAgIH0pLFxuICAgICAgbG9jYXRpb246IHdpbmRvdy5sb2NhdGlvbixcbiAgICAgIGJhc2VuYW1lOiB3aW5kb3cuX19yZWFjdFJvdXRlckNvbnRleHQ/LmJhc2VuYW1lLFxuICAgICAgaXNTcGFNb2RlOiBzc3JJbmZvLmNvbnRleHQuaXNTcGFNb2RlXG4gICAgfSk7XG4gICAgaWYgKGh5ZHJhdGlvbkRhdGEgJiYgaHlkcmF0aW9uRGF0YS5lcnJvcnMpIHtcbiAgICAgIGh5ZHJhdGlvbkRhdGEuZXJyb3JzID0gZGVzZXJpYWxpemVFcnJvcnMoaHlkcmF0aW9uRGF0YS5lcnJvcnMpO1xuICAgIH1cbiAgfVxuICBsZXQgcm91dGVyMiA9IGNyZWF0ZVJvdXRlcih7XG4gICAgcm91dGVzLFxuICAgIGhpc3Rvcnk6IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KCksXG4gICAgYmFzZW5hbWU6IHNzckluZm8uY29udGV4dC5iYXNlbmFtZSxcbiAgICBnZXRDb250ZXh0LFxuICAgIGh5ZHJhdGlvbkRhdGEsXG4gICAgaHlkcmF0aW9uUm91dGVQcm9wZXJ0aWVzLFxuICAgIG1hcFJvdXRlUHJvcGVydGllcyxcbiAgICBmdXR1cmU6IHtcbiAgICAgIG1pZGRsZXdhcmU6IHNzckluZm8uY29udGV4dC5mdXR1cmUudjhfbWlkZGxld2FyZVxuICAgIH0sXG4gICAgZGF0YVN0cmF0ZWd5OiBnZXRUdXJib1N0cmVhbVNpbmdsZUZldGNoRGF0YVN0cmF0ZWd5KFxuICAgICAgKCkgPT4gcm91dGVyMixcbiAgICAgIHNzckluZm8ubWFuaWZlc3QsXG4gICAgICBzc3JJbmZvLnJvdXRlTW9kdWxlcyxcbiAgICAgIHNzckluZm8uY29udGV4dC5zc3IsXG4gICAgICBzc3JJbmZvLmNvbnRleHQuYmFzZW5hbWVcbiAgICApLFxuICAgIHBhdGNoUm91dGVzT25OYXZpZ2F0aW9uOiBnZXRQYXRjaFJvdXRlc09uTmF2aWdhdGlvbkZ1bmN0aW9uKFxuICAgICAgc3NySW5mby5tYW5pZmVzdCxcbiAgICAgIHNzckluZm8ucm91dGVNb2R1bGVzLFxuICAgICAgc3NySW5mby5jb250ZXh0LnNzcixcbiAgICAgIHNzckluZm8uY29udGV4dC5yb3V0ZURpc2NvdmVyeSxcbiAgICAgIHNzckluZm8uY29udGV4dC5pc1NwYU1vZGUsXG4gICAgICBzc3JJbmZvLmNvbnRleHQuYmFzZW5hbWVcbiAgICApXG4gIH0pO1xuICBzc3JJbmZvLnJvdXRlciA9IHJvdXRlcjI7XG4gIGlmIChyb3V0ZXIyLnN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgc3NySW5mby5yb3V0ZXJJbml0aWFsaXplZCA9IHRydWU7XG4gICAgcm91dGVyMi5pbml0aWFsaXplKCk7XG4gIH1cbiAgcm91dGVyMi5jcmVhdGVSb3V0ZXNGb3JITVIgPSAvKiBzcGFjZXIgc28gdHMtaWdub3JlIGRvZXMgbm90IGFmZmVjdCB0aGUgcmlnaHQgaGFuZCBvZiB0aGUgYXNzaWdubWVudCAqL1xuICBjcmVhdGVDbGllbnRSb3V0ZXNXaXRoSE1SUmV2YWxpZGF0aW9uT3B0T3V0O1xuICB3aW5kb3cuX19yZWFjdFJvdXRlckRhdGFSb3V0ZXIgPSByb3V0ZXIyO1xuICByZXR1cm4gcm91dGVyMjtcbn1cbmZ1bmN0aW9uIEh5ZHJhdGVkUm91dGVyKHByb3BzKSB7XG4gIGlmICghcm91dGVyKSB7XG4gICAgcm91dGVyID0gY3JlYXRlSHlkcmF0ZWRSb3V0ZXIoe1xuICAgICAgZ2V0Q29udGV4dDogcHJvcHMuZ2V0Q29udGV4dFxuICAgIH0pO1xuICB9XG4gIGxldCBbY3JpdGljYWxDc3MsIHNldENyaXRpY2FsQ3NzXSA9IFJlYWN0Mi51c2VTdGF0ZShcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiID8gc3NySW5mbz8uY29udGV4dC5jcml0aWNhbENzcyA6IHZvaWQgMFxuICApO1xuICBSZWFjdDIudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgc2V0Q3JpdGljYWxDc3Modm9pZCAwKTtcbiAgICB9XG4gI
25114H0sIFtdKTtcbiAgUmVhY3QyLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIgJiYgY3JpdGljYWxDc3MgPT09IHZvaWQgMCkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7Q1JJVElDQUxfQ1NTX0RBVEFfQVRUUklCVVRFfV1gKS5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50LnJlbW92ZSgpKTtcbiAgICB9XG4gIH0sIFtjcml0aWNhbENzc10pO1xuICBsZXQgW2xvY2F0aW9uLCBzZXRMb2NhdGlvbl0gPSBSZWFjdDIudXNlU3RhdGUocm91dGVyLnN0YXRlLmxvY2F0aW9uKTtcbiAgUmVhY3QyLnVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNzckluZm8gJiYgc3NySW5mby5yb3V0ZXIgJiYgIXNzckluZm8ucm91dGVySW5pdGlhbGl6ZWQpIHtcbiAgICAgIHNzckluZm8ucm91dGVySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgc3NySW5mby5yb3V0ZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgfSwgW10pO1xuICBSZWFjdDIudXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3NySW5mbyAmJiBzc3JJbmZvLnJvdXRlcikge1xuICAgICAgcmV0dXJuIHNzckluZm8ucm91dGVyLnN1YnNjcmliZSgobmV3U3RhdGUpID0+IHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLmxvY2F0aW9uICE9PSBsb2NhdGlvbikge1xuICAgICAgICAgIHNldExvY2F0aW9uKG5ld1N0YXRlLmxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbbG9jYXRpb25dKTtcbiAgaW52YXJpYW50KHNzckluZm8sIFwic3NySW5mbyB1bmF2YWlsYWJsZSBmb3IgSHlkcmF0ZWRSb3V0ZXJcIik7XG4gIHVzZUZvZ09GV2FyRGlzY292ZXJ5KFxuICAgIHJvdXRlcixcbiAgICBzc3JJbmZvLm1hbmlmZXN0LFxuICAgIHNzckluZm8ucm91dGVNb2R1bGVzLFxuICAgIHNzckluZm8uY29udGV4dC5zc3IsXG4gICAgc3NySW5mby5jb250ZXh0LnJvdXRlRGlzY292ZXJ5LFxuICAgIHNzckluZm8uY29udGV4dC5pc1NwYU1vZGVcbiAgKTtcbiAgcmV0dXJuIChcbiAgICAvLyBUaGlzIGZyYWdtZW50IGlzIGltcG9ydGFudCB0byBlbnN1cmUgd2UgbWF0Y2ggdGhlIDxTZXJ2ZXJSb3V0ZXI+IEpTWFxuICAgIC8vIHN0cnVjdHVyZSBzbyB0aGF0IHVzZUlkIHZhbHVlcyBoeWRyYXRlIGNvcnJlY3RseVxuICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChSZWFjdDIuRnJhZ21lbnQsIG51bGwsIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcbiAgICAgIEZyYW1ld29ya0NvbnRleHQuUHJvdmlkZXIsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgbWFuaWZlc3Q6IHNzckluZm8ubWFuaWZlc3QsXG4gICAgICAgICAgcm91dGVNb2R1bGVzOiBzc3JJbmZvLnJvdXRlTW9kdWxlcyxcbiAgICAgICAgICBmdXR1cmU6IHNzckluZm8uY29udGV4dC5mdXR1cmUsXG4gICAgICAgICAgY3JpdGljYWxDc3MsXG4gICAgICAgICAgc3NyOiBzc3JJbmZvLmNvbnRleHQuc3NyLFxuICAgICAgICAgIGlzU3BhTW9kZTogc3NySW5mby5jb250ZXh0LmlzU3BhTW9kZSxcbiAgICAgICAgICByb3V0ZURpc2NvdmVyeTogc3NySW5mby5jb250ZXh0LnJvdXRlRGlzY292ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoUmVtaXhFcnJvckJvdW5kYXJ5LCB7IGxvY2F0aW9uIH0sIC8qIEBfX1BVUkVfXyAqLyBSZWFjdDIuY3JlYXRlRWxlbWVudChcbiAgICAgICAgUm91dGVyUHJvdmlkZXIyLFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGVyLFxuICAgICAgICAgIHVuc3RhYmxlX29uRXJyb3I6IHByb3BzLnVuc3RhYmxlX29uRXJyb3JcbiAgICAgICAgfVxuICAgICAgKSlcbiAgICApLCAvKiBAX19QVVJFX18gKi8gUmVhY3QyLmNyZWF0ZUVsZW1lbnQoUmVhY3QyLkZyYWdtZW50LCBudWxsKSlcbiAgKTtcbn1cbmV4cG9ydCB7XG4gIEh5ZHJhdGVkUm91dGVyLFxuICBSb3V0ZXJQcm92aWRlcjIgYXMgUm91dGVyUHJvdmlkZXJcbn07XG4iLCJjb25zdCBjcmVhdGVTdG9yZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgbGV0IHN0YXRlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBzZXRTdGF0ZSA9IChwYXJ0aWFsLCByZXBsYWNlKSA9PiB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09IFwiZnVuY3Rpb25cIiA/IHBhcnRpYWwoc3RhdGUpIDogcGFydGlhbDtcbiAgICBpZiAoIU9iamVjdC5pcyhuZXh0U3RhdGUsIHN0YXRlKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHN0YXRlO1xuICAgICAgc3RhdGUgPSAocmVwbGFjZSAhPSBudWxsID8gcmVwbGFjZSA6IHR5cGVvZiBuZXh0U3RhdGUgIT09IFwib2JqZWN0XCIgfHwgbmV4dFN0YXRlID09PSBudWxsKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3QgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBzdWJzY3JpYmUgPSAobGlzdGVuZXIpID0+IHtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG4gIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0RFUFJFQ0FURURdIFR
25114oZSBgZGVzdHJveWAgbWV0aG9kIHdpbGwgYmUgdW5zdXBwb3J0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gSW5zdGVhZCB1c2UgdW5zdWJzY3JpYmUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgc3Vic2NyaWJlLiBFdmVyeXRoaW5nIHdpbGwgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQgaWYgc3RvcmUgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICB9O1xuICBjb25zdCBhcGkgPSB7IHNldFN0YXRlLCBnZXRTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBzdWJzY3JpYmUsIGRlc3Ryb3kgfTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gc3RhdGUgPSBjcmVhdGVTdGF0ZShzZXRTdGF0ZSwgZ2V0U3RhdGUsIGFwaSk7XG4gIHJldHVybiBhcGk7XG59O1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoY3JlYXRlU3RhdGUpID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlU3RvcmVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZVN0b3JlSW1wbDtcbnZhciB2YW5pbGxhID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIERlZmF1bHQgZXhwb3J0IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAnenVzdGFuZC92YW5pbGxhJy5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKGNyZWF0ZVN0YXRlKTtcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVN0b3JlLCB2YW5pbGxhIGFzIGRlZmF1bHQgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbn1cbnZhciBvYmplY3RJcyA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIE9iamVjdC5pcyA/IE9iamVjdC5pcyA6IGlzLFxuICB1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlLFxuICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCA9IFJlYWN0LnVzZUxheW91dEVmZmVjdCxcbiAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgdmFyIHZhbHVlID0gZ2V0U25hcHNob3QoKSxcbiAgICBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7IGluc3Q6IHsgdmFsdWU6IHZhbHVlLCBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QgfSB9KSxcbiAgICBpbnN0ID0gX3VzZVN0YXRlWzBdLmluc3QsXG4gICAgZm9yY2VVcGRhdGUgPSBfdXNlU3RhdGVbMV07XG4gIHVzZUxheW91dEVmZmVjdChcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICB9LFxuICAgIFtzdWJzY3JpYmUsIHZhbHVlLCBnZXRTbmFwc2hvdF1cbiAgKTtcbiAgdXNlRWZmZWN0KFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgcmV0dXJuIHN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbc3Vic2NyaWJlXVxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIGluc3QgPSBpbnN0LnZhbHVlO1xuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMoaW5zdCwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gITA7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCkge1xuICByZXR1cm4gZ2V0U25hcHNob3QoKTtcbn1cbnZhciBzaGltID1cbiAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdyB8fFxuICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50IHx8XG4gIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudFxuICAgID8gdXNlU3luY0V4dGVybmFsU3RvcmUkMVxuICAgIDogdXNlU3luY0V4dGVybmFsU3RvcmUkMjtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPVxuICB2b2lkIDAgIT09IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlID8gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgOiBzaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aG
25114VcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgc2hpbSA9IHJlcXVpcmUoXCJ1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltXCIpO1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4gKHggPT09IHkgJiYgKDAgIT09IHggfHwgMSAvIHggPT09IDEgLyB5KSkgfHwgKHggIT09IHggJiYgeSAhPT0geSk7XG59XG52YXIgb2JqZWN0SXMgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBPYmplY3QuaXMgPyBPYmplY3QuaXMgOiBpcyxcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBzaGltLnVzZVN5bmNFeHRlcm5hbFN0b3JlLFxuICB1c2VSZWYgPSBSZWFjdC51c2VSZWYsXG4gIHVzZUVmZmVjdCA9IFJlYWN0LnVzZUVmZmVjdCxcbiAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZ1bmN0aW9uIChcbiAgc3Vic2NyaWJlLFxuICBnZXRTbmFwc2hvdCxcbiAgZ2V0U2VydmVyU25hcHNob3QsXG4gIHNlbGVjdG9yLFxuICBpc0VxdWFsXG4pIHtcbiAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGlmIChudWxsID09PSBpbnN0UmVmLmN1cnJlbnQpIHtcbiAgICB2YXIgaW5zdCA9IHsgaGFzVmFsdWU6ICExLCB2YWx1ZTogbnVsbCB9O1xuICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gIH0gZWxzZSBpbnN0ID0gaW5zdFJlZi5jdXJyZW50O1xuICBpbnN0UmVmID0gdXNlTWVtbyhcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBtZW1vaXplZFNlbGVjdG9yKG5leHRTbmFwc2hvdCkge1xuICAgICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgICBoYXNNZW1vID0gITA7XG4gICAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgICBuZXh0U25hcHNob3QgPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlzRXF1YWwgJiYgaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBpbnN0LnZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgbmV4dFNuYXBzaG90KSlcbiAgICAgICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU2VsZWN0aW9uID0gbmV4dFNuYXBzaG90KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U2VsZWN0aW9uID0gbWVtb2l6ZWRTZWxlY3Rpb247XG4gICAgICAgIGlmIChvYmplY3RJcyhtZW1vaXplZFNuYXBzaG90LCBuZXh0U25hcHNob3QpKSByZXR1cm4gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICBpZiAodm9pZCAwICE9PSBpc0VxdWFsICYmIGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgbmV4dFNlbGVjdGlvbikpXG4gICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90KSwgY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb24pO1xuICAgICAgfVxuICAgICAgdmFyIGhhc01lbW8gPSAhMSxcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCxcbiAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24sXG4gICAgICAgIG1heWJlR2V0U2VydmVyU25hcHNob3QgPVxuICAgICAgICAgIHZvaWQgMCA9PT0gZ2V0U2VydmVyU25hcHNob3QgPyBudWxsIDogZ2V0U2VydmVyU25hcHNob3Q7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IoZ2V0U25hcHNob3QoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG51bGwgPT09IG1heWJlR2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgICA/IHZvaWQgMFxuICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgXTtcbiAgICB9LFxuICAgIFtnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsXVxuICApO1xuICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGluc3RSZWZbMF0sIGluc3RSZWZbMV0pO1xuICB1c2VFZmZlY3QoXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgaW5zdC5oYXNWYWx1ZSA9ICEwO1xuICAgICAgaW5zdC52YWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgW3ZhbHVlXVxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnO1xuZXhwb3J0ICogZnJvbSAnenVzdGFuZC92YW5pbGxhJztcbmltcG9ydCBSZWFjdEV4cG9ydHMgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVN5bmNFeHRlcm5hbFN0b3JlRXhwb3J0cyBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMnO1xuXG5jb25zdCB7IHVzZURlYnVnVmFsdWUgfSA9IFJlYWN0RXhwb3J0cztcbmNvbnN0IHsgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgfSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlRXhwb3J0cztcbmxldCBkaWRXYXJuQWJvdXRFcXVhbGl0eUZuID0gZmFsc2U7XG5jb25zdCBpZGVudGl0eSA9IChhcmcpID0+IGFyZztcbmZ1bmN0aW9uIHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IgPSBpZGVudGl0eSwgZXF1YWxpdHlGbikge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9k
25114dWN0aW9uXCIgJiYgZXF1YWxpdHlGbiAmJiAhZGlkV2FybkFib3V0RXF1YWxpdHlGbikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIFVzZSBgY3JlYXRlV2l0aEVxdWFsaXR5Rm5gIGluc3RlYWQgb2YgYGNyZWF0ZWAgb3IgdXNlIGB1c2VTdG9yZVdpdGhFcXVhbGl0eUZuYCBpbnN0ZWFkIG9mIGB1c2VTdG9yZWAuIFRoZXkgY2FuIGJlIGltcG9ydGVkIGZyb20gJ3p1c3RhbmQvdHJhZGl0aW9uYWwnLiBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3p1c3RhbmQvZGlzY3Vzc2lvbnMvMTkzN1wiXG4gICAgKTtcbiAgICBkaWRXYXJuQWJvdXRFcXVhbGl0eUZuID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzbGljZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgYXBpLmdldFN0YXRlLFxuICAgIGFwaS5nZXRTZXJ2ZXJTdGF0ZSB8fCBhcGkuZ2V0SW5pdGlhbFN0YXRlLFxuICAgIHNlbGVjdG9yLFxuICAgIGVxdWFsaXR5Rm5cbiAgKTtcbiAgdXNlRGVidWdWYWx1ZShzbGljZSk7XG4gIHJldHVybiBzbGljZTtcbn1cbmNvbnN0IGNyZWF0ZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmIHR5cGVvZiBjcmVhdGVTdGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gUGFzc2luZyBhIHZhbmlsbGEgc3RvcmUgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSBgaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IGFwaSA9IHR5cGVvZiBjcmVhdGVTdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RhdGU7XG4gIGNvbnN0IHVzZUJvdW5kU3RvcmUgPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm4pID0+IHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICBPYmplY3QuYXNzaWduKHVzZUJvdW5kU3RvcmUsIGFwaSk7XG4gIHJldHVybiB1c2VCb3VuZFN0b3JlO1xufTtcbmNvbnN0IGNyZWF0ZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZUltcGw7XG52YXIgcmVhY3QgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gRGVmYXVsdCBleHBvcnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCB1c2UgYGltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnYC5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZShjcmVhdGVTdGF0ZSk7XG59O1xuXG5leHBvcnQgeyBjcmVhdGUsIHJlYWN0IGFzIGRlZmF1bHQsIHVzZVN0b3JlIH07XG4iLCJjb25zdCByZWR1eEltcGwgPSAocmVkdWNlciwgaW5pdGlhbCkgPT4gKHNldCwgX2dldCwgYXBpKSA9PiB7XG4gIGFwaS5kaXNwYXRjaCA9IChhY3Rpb24pID0+IHtcbiAgICBzZXQoKHN0YXRlKSA9PiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pLCBmYWxzZSwgYWN0aW9uKTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9O1xuICBhcGkuZGlzcGF0Y2hGcm9tRGV2dG9vbHMgPSB0cnVlO1xuICByZXR1cm4geyBkaXNwYXRjaDogKC4uLmEpID0+IGFwaS5kaXNwYXRjaCguLi5hKSwgLi4uaW5pdGlhbCB9O1xufTtcbmNvbnN0IHJlZHV4ID0gcmVkdXhJbXBsO1xuXG5jb25zdCB0cmFja2VkQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuY29uc3QgZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZSA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGFwaSA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQobmFtZSk7XG4gIGlmICghYXBpKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVud
25114HJpZXMoYXBpLnN0b3JlcykubWFwKChba2V5LCBhcGkyXSkgPT4gW2tleSwgYXBpMi5nZXRTdGF0ZSgpXSlcbiAgKTtcbn07XG5jb25zdCBleHRyYWN0Q29ubmVjdGlvbkluZm9ybWF0aW9uID0gKHN0b3JlLCBleHRlbnNpb25Db25uZWN0b3IsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1bnRyYWNrZWRcIixcbiAgICAgIGNvbm5lY3Rpb246IGV4dGVuc2lvbkNvbm5lY3Rvci5jb25uZWN0KG9wdGlvbnMpXG4gICAgfTtcbiAgfVxuICBjb25zdCBleGlzdGluZ0Nvbm5lY3Rpb24gPSB0cmFja2VkQ29ubmVjdGlvbnMuZ2V0KG9wdGlvbnMubmFtZSk7XG4gIGlmIChleGlzdGluZ0Nvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInRyYWNrZWRcIiwgc3RvcmUsIC4uLmV4aXN0aW5nQ29ubmVjdGlvbiB9O1xuICB9XG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSB7XG4gICAgY29ubmVjdGlvbjogZXh0ZW5zaW9uQ29ubmVjdG9yLmNvbm5lY3Qob3B0aW9ucyksXG4gICAgc3RvcmVzOiB7fVxuICB9O1xuICB0cmFja2VkQ29ubmVjdGlvbnMuc2V0KG9wdGlvbnMubmFtZSwgbmV3Q29ubmVjdGlvbik7XG4gIHJldHVybiB7IHR5cGU6IFwidHJhY2tlZFwiLCBzdG9yZSwgLi4ubmV3Q29ubmVjdGlvbiB9O1xufTtcbmNvbnN0IGRldnRvb2xzSW1wbCA9IChmbiwgZGV2dG9vbHNPcHRpb25zID0ge30pID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGNvbnN0IHsgZW5hYmxlZCwgYW5vbnltb3VzQWN0aW9uVHlwZSwgc3RvcmUsIC4uLm9wdGlvbnMgfSA9IGRldnRvb2xzT3B0aW9ucztcbiAgbGV0IGV4dGVuc2lvbkNvbm5lY3RvcjtcbiAgdHJ5IHtcbiAgICBleHRlbnNpb25Db25uZWN0b3IgPSAoZW5hYmxlZCAhPSBudWxsID8gZW5hYmxlZCA6IChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXztcbiAgfSBjYXRjaCAoX2UpIHtcbiAgfVxuICBpZiAoIWV4dGVuc2lvbkNvbm5lY3Rvcikge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiBlbmFibGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gUGxlYXNlIGluc3RhbGwvZW5hYmxlIFJlZHV4IGRldnRvb2xzIGV4dGVuc2lvblwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZm4oc2V0LCBnZXQsIGFwaSk7XG4gIH1cbiAgY29uc3QgeyBjb25uZWN0aW9uLCAuLi5jb25uZWN0aW9uSW5mb3JtYXRpb24gfSA9IGV4dHJhY3RDb25uZWN0aW9uSW5mb3JtYXRpb24oc3RvcmUsIGV4dGVuc2lvbkNvbm5lY3Rvciwgb3B0aW9ucyk7XG4gIGxldCBpc1JlY29yZGluZyA9IHRydWU7XG4gIGFwaS5zZXRTdGF0ZSA9IChzdGF0ZSwgcmVwbGFjZSwgbmFtZU9yQWN0aW9uKSA9PiB7XG4gICAgY29uc3QgciA9IHNldChzdGF0ZSwgcmVwbGFjZSk7XG4gICAgaWYgKCFpc1JlY29yZGluZykgcmV0dXJuIHI7XG4gICAgY29uc3QgYWN0aW9uID0gbmFtZU9yQWN0aW9uID09PSB2b2lkIDAgPyB7IHR5cGU6IGFub255bW91c0FjdGlvblR5cGUgfHwgXCJhbm9ueW1vdXNcIiB9IDogdHlwZW9mIG5hbWVPckFjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IHsgdHlwZTogbmFtZU9yQWN0aW9uIH0gOiBuYW1lT3JBY3Rpb247XG4gICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uc2VuZChhY3Rpb24sIGdldCgpKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgdHlwZTogYCR7c3RvcmV9LyR7YWN0aW9uLnR5cGV9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpLFxuICAgICAgICBbc3RvcmVdOiBhcGkuZ2V0U3RhdGUoKVxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHI7XG4gIH07XG4gIGNvbnN0IHNldFN0YXRlRnJvbURldnRvb2xzID0gKC4uLmEpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbElzUmVjb3JkaW5nID0gaXNSZWNvcmRpbmc7XG4gICAgaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICBzZXQoLi4uYSk7XG4gICAgaXNSZWNvcmRpbmcgPSBvcmlnaW5hbElzUmVjb3JkaW5nO1xuICB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBmbihhcGkuc2V0U3RhdGUsIGdldCwgYXBpKTtcbiAgaWYgKGNvbm5lY3Rpb25JbmZvcm1hdGlvbi50eXBlID09PSBcInVudHJhY2tlZFwiKSB7XG4gICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KGluaXRpYWxTdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3Jlc1tjb25uZWN0aW9uSW5mb3JtYXRpb24uc3RvcmVdID0gYXBpO1xuICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVud
25114HJpZXMoY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3JlcykubWFwKChba2V5LCBzdG9yZTJdKSA9PiBbXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGtleSA9PT0gY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3JlID8gaW5pdGlhbFN0YXRlIDogc3RvcmUyLmdldFN0YXRlKClcbiAgICAgICAgXSlcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGlmIChhcGkuZGlzcGF0Y2hGcm9tRGV2dG9vbHMgJiYgdHlwZW9mIGFwaS5kaXNwYXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbGV0IGRpZFdhcm5BYm91dFJlc2VydmVkQWN0aW9uVHlwZSA9IGZhbHNlO1xuICAgIGNvbnN0IG9yaWdpbmFsRGlzcGF0Y2ggPSBhcGkuZGlzcGF0Y2g7XG4gICAgYXBpLmRpc3BhdGNoID0gKC4uLmEpID0+IHtcbiAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiBhWzBdLnR5cGUgPT09IFwiX19zZXRTdGF0ZVwiICYmICFkaWRXYXJuQWJvdXRSZXNlcnZlZEFjdGlvblR5cGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBcIl9fc2V0U3RhdGVcIiBhY3Rpb24gdHlwZSBpcyByZXNlcnZlZCB0byBzZXQgc3RhdGUgZnJvbSB0aGUgZGV2dG9vbHMuIEF2b2lkIHVzaW5nIGl0LidcbiAgICAgICAgKTtcbiAgICAgICAgZGlkV2FybkFib3V0UmVzZXJ2ZWRBY3Rpb25UeXBlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsRGlzcGF0Y2goLi4uYSk7XG4gICAgfTtcbiAgfVxuICBjb25uZWN0aW9uLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgY2FzZSBcIkFDVElPTlwiOlxuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UucGF5bG9hZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlt6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIFVuc3VwcG9ydGVkIGFjdGlvbiBmb3JtYXRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZUpzb25UaGVuKFxuICAgICAgICAgIG1lc3NhZ2UucGF5bG9hZCxcbiAgICAgICAgICAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFwiX19zZXRTdGF0ZVwiKSB7XG4gICAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoYWN0aW9uLnN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFjdGlvbi5zdGF0ZSkubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gVW5zdXBwb3J0ZWQgX19zZXRTdGF0ZSBhY3Rpb24gZm9ybWF0LiBcbiAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyAnc3RvcmUnIG9wdGlvbiBpbiBkZXZ0b29scygpLCB0aGUgJ3N0YXRlJyBzaG91bGQgaGF2ZSBvbmx5IG9uZSBrZXksIHdoaWNoIGlzIGEgdmFsdWUgb2YgJ3N0b3JlJyB0aGF0IHdhcyBwYXNzZWQgaW4gZGV2dG9vbHMoKSxcbiAgICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlIG9mIHRoaXMgb25seSBrZXkgc2hvdWxkIGJlIGEgc3RhdGUgb2JqZWN0LiBFeGFtcGxlOiB7IFwidHlwZVwiOiBcIl9fc2V0U3RhdGVcIiwgXCJzdGF0ZVwiOiB7IFwiYWJjMTIzU3RvcmVcIjogeyBcImZvb1wiOiBcImJhclwiIH0gfSB9XG4gICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlRnJvbURldnRvb2xzID0gYWN0aW9uLnN0YXRlW3N0b3JlXTtcbiAgICAgICAgICAgICAgaWYgKHN0YXRlRnJvbURldnRvb2xzID09PSB2b2lkIDAgfHwgc3RhdGVGcm9tRGV2dG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFwaS5nZXRTdGF0ZSgpKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RhdGVGcm9tRGV2dG9vbHMpKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGVGcm9tRGV2dG9vbHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXBpLmRpc3BhdGNoRnJvbURldnRvb2xzKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFwaS5kaXNwYXRjaCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgICAgICAgICBhcGkuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiRElTUEFUQ0hcIjpcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnBheWxvYWQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJSRVNFVFwiOlxuICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChnZXRUcmFja2VkQ29ubmVjdGlvblN0YXRlKG9wdGlvbnMubmFtZSkpO1xuICAgICAgICAgIGNhc2UgXCJDT01NSVRcIjpcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChhcGkuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICAgI
25114HJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICBjYXNlIFwiUk9MTEJBQ0tcIjpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUpzb25UaGVuKG1lc3NhZ2Uuc3RhdGUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhc2UgXCJKVU1QX1RPX1NUQVRFXCI6XG4gICAgICAgICAgY2FzZSBcIkpVTVBfVE9fQUNUSU9OXCI6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihtZXNzYWdlLnN0YXRlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcGkuZ2V0U3RhdGUoKSkgIT09IEpTT04uc3RyaW5naWZ5KHN0YXRlW3N0b3JlXSkpIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBjYXNlIFwiSU1QT1JUX1NUQVRFXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dExpZnRlZFN0YXRlIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBsYXN0Q29tcHV0ZWRTdGF0ZSA9IChfYSA9IG5leHRMaWZ0ZWRTdGF0ZS5jb21wdXRlZFN0YXRlcy5zbGljZSgtMSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfYS5zdGF0ZTtcbiAgICAgICAgICAgIGlmICghbGFzdENvbXB1dGVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlW3N0b3JlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIC8vIEZJWE1FIG5vLWFueVxuICAgICAgICAgICAgICBuZXh0TGlmdGVkU3RhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJQQVVTRV9SRUNPUkRJTkdcIjpcbiAgICAgICAgICAgIHJldHVybiBpc1JlY29yZGluZyA9ICFpc1JlY29yZGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5jb25zdCBkZXZ0b29scyA9IGRldnRvb2xzSW1wbDtcbmNvbnN0IHBhcnNlSnNvblRoZW4gPSAoc3RyaW5naWZpZWQsIGYpID0+IHtcbiAgbGV0IHBhcnNlZDtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cmluZ2lmaWVkKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIlt6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIENvdWxkIG5vdCBwYXJzZSB0aGUgcmVjZWl2ZWQganNvblwiLFxuICAgICAgZVxuICAgICk7XG4gIH1cbiAgaWYgKHBhcnNlZCAhPT0gdm9pZCAwKSBmKHBhcnNlZCk7XG59O1xuXG5jb25zdCBzdWJzY3JpYmVXaXRoU2VsZWN0b3JJbXBsID0gKGZuKSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBjb25zdCBvcmlnU3Vic2NyaWJlID0gYXBpLnN1YnNjcmliZTtcbiAgYXBpLnN1YnNjcmliZSA9IChzZWxlY3Rvciwgb3B0TGlzdGVuZXIsIG9wdGlvbnMpID0+IHtcbiAgICBsZXQgbGlzdGVuZXIgPSBzZWxlY3RvcjtcbiAgICBpZiAob3B0TGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5Rm4gPSAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5lcXVhbGl0eUZuKSB8fCBPYmplY3QuaXM7XG4gICAgICBsZXQgY3VycmVudFNsaWNlID0gc2VsZWN0b3IoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgbGlzdGVuZXIgPSAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFNsaWNlID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oY3VycmVudFNsaWNlLCBuZXh0U2xpY2UpKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNTbGljZSA9IGN1cnJlbnRTbGljZTtcbiAgICAgICAgICBvcHRMaXN0ZW5lcihjdXJyZW50U2xpY2UgPSBuZXh0U2xpY2UsIHByZXZpb3VzU2xpY2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIG9wdExpc3RlbmVyKGN1cnJlbnRTbGljZSwgY3VycmVudFNsaWNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWdTdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBmbihzZXQsIGdldCwgYXBpKTtcbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5jb25zdCBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgPSBzdWJzY3JpYmVXaXRoU2VsZWN0b3JJbXBsO1xuXG5jb25zdCBjb21iaW5lID0gKGluaXRpYWxTdGF0ZSwgY3JlYXRlKSA9PiAoLi4uYSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgaW5pdGlhbFN0YXRlLCBjcmVhdGUoLi4uYSk
25114pO1xuXG5mdW5jdGlvbiBjcmVhdGVKU09OU3RvcmFnZShnZXRTdG9yYWdlLCBvcHRpb25zKSB7XG4gIGxldCBzdG9yYWdlO1xuICB0cnkge1xuICAgIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKCk7XG4gIH0gY2F0Y2ggKF9lKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBlcnNpc3RTdG9yYWdlID0ge1xuICAgIGdldEl0ZW06IChuYW1lKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCBwYXJzZSA9IChzdHIyKSA9PiB7XG4gICAgICAgIGlmIChzdHIyID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyMiwgb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yZXZpdmVyKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdHIgPSAoX2EgPSBzdG9yYWdlLmdldEl0ZW0obmFtZSkpICE9IG51bGwgPyBfYSA6IG51bGw7XG4gICAgICBpZiAoc3RyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gc3RyLnRoZW4ocGFyc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlKHN0cik7XG4gICAgfSxcbiAgICBzZXRJdGVtOiAobmFtZSwgbmV3VmFsdWUpID0+IHN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgIG5hbWUsXG4gICAgICBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSwgb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yZXBsYWNlcilcbiAgICApLFxuICAgIHJlbW92ZUl0ZW06IChuYW1lKSA9PiBzdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSlcbiAgfTtcbiAgcmV0dXJuIHBlcnNpc3RTdG9yYWdlO1xufVxuY29uc3QgdG9UaGVuYWJsZSA9IChmbikgPT4gKGlucHV0KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oaW5wdXQpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGhlbihvbkZ1bGZpbGxlZCkge1xuICAgICAgICByZXR1cm4gdG9UaGVuYWJsZShvbkZ1bGZpbGxlZCkocmVzdWx0KTtcbiAgICAgIH0sXG4gICAgICBjYXRjaChfb25SZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW4oX29uRnVsZmlsbGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvVGhlbmFibGUob25SZWplY3RlZCkoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IG9sZEltcGwgPSAoY29uZmlnLCBiYXNlT3B0aW9ucykgPT4gKHNldCwgZ2V0LCBhcGkpID0+IHtcbiAgbGV0IG9wdGlvbnMgPSB7XG4gICAgZ2V0U3RvcmFnZTogKCkgPT4gbG9jYWxTdG9yYWdlLFxuICAgIHNlcmlhbGl6ZTogSlNPTi5zdHJpbmdpZnksXG4gICAgZGVzZXJpYWxpemU6IEpTT04ucGFyc2UsXG4gICAgcGFydGlhbGl6ZTogKHN0YXRlKSA9PiBzdGF0ZSxcbiAgICB2ZXJzaW9uOiAwLFxuICAgIG1lcmdlOiAocGVyc2lzdGVkU3RhdGUsIGN1cnJlbnRTdGF0ZSkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIC4uLnBlcnNpc3RlZFN0YXRlXG4gICAgfSksXG4gICAgLi4uYmFzZU9wdGlvbnNcbiAgfTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzdG9yYWdlO1xuICB0cnkge1xuICAgIHN0b3JhZ2UgPSBvcHRpb25zLmdldFN0b3JhZ2UoKTtcbiAgfSBjYXRjaCAoX2UpIHtcbiAgfVxuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4gY29uZmlnKFxuICAgICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbenVzdGFuZCBwZXJzaXN0IG1pZGRsZXdhcmVdIFVuYWJsZSB0byB1cGRhdGUgaXRlbSAnJHtvcHRpb25zLm5hbWV9JywgdGhlIGdpdmVuIHN0b3JhZ2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlLmBcbiAgICAgICAgKTtcbiAgICAgICAgc2V0KC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGdldCxcbiAgICAgIGFwaVxuICAgICk7XG4gIH1cbiAgY29uc3QgdGhlbmFibGVTZXJpYWxpemUgPSB0b1RoZW5hYmxlKG9wdGlvbnMuc2VyaWFsaXplKTtcbiAgY29uc3Qgc2V0SXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG9wdGlvbnMucGFydGlhbGl6ZSh7IC4uLmdldCgpIH0pO1xuICAgIGxldCBlcnJvckluU3luYztcbiAgICBjb25zdCB0aGVuYWJsZSA9IHRoZW5hYmxlU2VyaWFsaXplKHsgc3RhdGUsIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB9KS50aGVuKFxuICAgICAgKHNlcmlhbGl6ZWRWYWx1ZSkgPT4gc3RvcmFnZS5zZXRJdGVtKG9wdGlvbnMubmFtZSwgc2VyaWFsaXplZFZhbHVlKVxuICAgICkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGVycm9ySW5TeW5jID0gZTtcbiAgICB9KTtcbiAgICBpZiAoZXJyb3JJblN5bmMpIHtcbiAgICAgIHRocm93IGVycm9ySW5TeW5jO1xuICAgIH1cbiAgICByZXR1cm4gdGhlbmFibGU7XG4gIH07XG4gIGNvbnN0IHNhdmVkU2V0U3RhdGUgPSBhcGkuc2V0U3RhdGU7XG4gIGFwaS5zZXRTdGF0ZSA9IChzdGF0ZSwgcmVwbGFjZSkgPT4ge1xuICAgIHNhdmVkU2V0U3RhdGUoc3RhdGUsIHJlcGxhY2UpO1xuICAgIHZvaWQgc2V0SXRlbSgpO1xuICB9O1xuICBjb25zdCBjb25maWdSZXN1bHQgPSBjb25maWcoXG4gICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgIHNldCguLi5hcmdzKTtcbiAgICAgIHZvaWQgc2V0SXRlbSgpO1xuICAgIH0sXG4gICAgZ2V0LFxuICAgIGFwaVxuICApO1xuICBsZXQgc3RhdGVGcm9tU3RvcmFnZTtcbiAgY29uc3QgaHlkcmF0ZSA9ICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFzdG9yYWdlKSByZXR1cm47XG4gICAgaGFzSHlkcmF0ZWQgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IGNiKGdldCgpKSk7XG4gICAgY29uc3QgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPSAoKF9hID0gb3B0aW9ucy5vblJlaHlkcmF0ZVN0b3JhZ2UpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKG9wdGlvbnMsIGdldCgpKSkgfHwgdm9pZCAwO1xuICAgIHJldHVybi
25114B0b1RoZW5hYmxlKHN0b3JhZ2UuZ2V0SXRlbS5iaW5kKHN0b3JhZ2UpKShvcHRpb25zLm5hbWUpLnRoZW4oKHN0b3JhZ2VWYWx1ZSkgPT4ge1xuICAgICAgaWYgKHN0b3JhZ2VWYWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kZXNlcmlhbGl6ZShzdG9yYWdlVmFsdWUpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uID09PSBcIm51bWJlclwiICYmIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uICE9PSBvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5taWdyYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5taWdyYXRlKFxuICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUuc3RhdGUsXG4gICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFN0YXRlIGxvYWRlZCBmcm9tIHN0b3JhZ2UgY291bGRuJ3QgYmUgbWlncmF0ZWQgc2luY2Ugbm8gbWlncmF0ZSBmdW5jdGlvbiB3YXMgcHJvdmlkZWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkudGhlbigobWlncmF0ZWRTdGF0ZSkgPT4ge1xuICAgICAgdmFyIF9hMjtcbiAgICAgIHN0YXRlRnJvbVN0b3JhZ2UgPSBvcHRpb25zLm1lcmdlKFxuICAgICAgICBtaWdyYXRlZFN0YXRlLFxuICAgICAgICAoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHRcbiAgICAgICk7XG4gICAgICBzZXQoc3RhdGVGcm9tU3RvcmFnZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gc2V0SXRlbSgpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHN0YXRlRnJvbVN0b3JhZ2UsIHZvaWQgMCk7XG4gICAgICBoYXNIeWRyYXRlZCA9IHRydWU7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IGNiKHN0YXRlRnJvbVN0b3JhZ2UpKTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHZvaWQgMCwgZSk7XG4gICAgfSk7XG4gIH07XG4gIGFwaS5wZXJzaXN0ID0ge1xuICAgIHNldE9wdGlvbnM6IChuZXdPcHRpb25zKSA9PiB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi5uZXdPcHRpb25zXG4gICAgICB9O1xuICAgICAgaWYgKG5ld09wdGlvbnMuZ2V0U3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gbmV3T3B0aW9ucy5nZXRTdG9yYWdlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbGVhclN0b3JhZ2U6ICgpID0+IHtcbiAgICAgIHN0b3JhZ2UgPT0gbnVsbCA/IHZvaWQgMCA6IHN0b3JhZ2UucmVtb3ZlSXRlbShvcHRpb25zLm5hbWUpO1xuICAgIH0sXG4gICAgZ2V0T3B0aW9uczogKCkgPT4gb3B0aW9ucyxcbiAgICByZWh5ZHJhdGU6ICgpID0+IGh5ZHJhdGUoKSxcbiAgICBoYXNIeWRyYXRlZDogKCkgPT4gaGFzSHlkcmF0ZWQsXG4gICAgb25IeWRyYXRlOiAoY2IpID0+IHtcbiAgICAgIGh5ZHJhdGlvbkxpc3RlbmVycy5hZGQoY2IpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaHlkcmF0aW9uTGlzdGVuZXJzLmRlbGV0ZShjYik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgb25GaW5pc2hIeWRyYXRpb246IChjYikgPT4ge1xuICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmFkZChjYik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuZGVsZXRlKGNiKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBoeWRyYXRlKCk7XG4gIHJldHVybiBzdGF0ZUZyb21TdG9yYWdlIHx8IGNvbmZpZ1Jlc3VsdDtcbn07XG5jb25zdCBuZXdJbXBsID0gKGNvbmZpZywgYmFzZU9wdGlvbnMpID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGxldCBvcHRpb25zID0ge1xuICAgIHN0b3JhZ2U6IGNyZWF0ZUpTT05TdG9yYWdlKCgpID0+IGxvY2FsU3RvcmFnZSksXG4gICAgcGFydGlhbGl6ZTogKHN0YXRlKSA9PiBzdGF0ZSxcbiAgICB2ZXJzaW9uOiAwLFxuICAgIG1lcmdlOiAocGVyc2lzdGVkU3RhdGUsIGN1cnJlbnRTdGF0ZSkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIC4uLnBlcnNpc3RlZFN0YXRlXG4gICAgfSksXG4gICAgLi4uYmFzZU9wdGlvbnNcbiAgfTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlO1xuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4gY29uZmlnKFxuICAgICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbenVzdGFuZCBwZXJzaXN0IG1pZGRsZXdhcmVdIFVuYWJsZSB0byB1cGRhdGUgaXRlbSAnJHtvcHRpb25zLm5hbWV9JywgdGhlIGdpdmVuIHN0b3JhZ2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlLmBcbiAgICAgICAgKTtcbiAgICAgICAgc2V0KC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGdldCxcbiAgICAgIGFwaVxuICAgICk7XG4gIH1cbiAgY29uc3Qgc2V0SXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG9wdGlvbnMucGFydGlhbGl6ZSh7IC4uLmdldCgpIH0pO1xuICAgIHJldHVybiBzdG9yYWdlLnNldEl0ZW0ob3B0aW9ucy5uYW1lLCB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvblxuICAgI
25114H0pO1xuICB9O1xuICBjb25zdCBzYXZlZFNldFN0YXRlID0gYXBpLnNldFN0YXRlO1xuICBhcGkuc2V0U3RhdGUgPSAoc3RhdGUsIHJlcGxhY2UpID0+IHtcbiAgICBzYXZlZFNldFN0YXRlKHN0YXRlLCByZXBsYWNlKTtcbiAgICB2b2lkIHNldEl0ZW0oKTtcbiAgfTtcbiAgY29uc3QgY29uZmlnUmVzdWx0ID0gY29uZmlnKFxuICAgICguLi5hcmdzKSA9PiB7XG4gICAgICBzZXQoLi4uYXJncyk7XG4gICAgICB2b2lkIHNldEl0ZW0oKTtcbiAgICB9LFxuICAgIGdldCxcbiAgICBhcGlcbiAgKTtcbiAgYXBpLmdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGNvbmZpZ1Jlc3VsdDtcbiAgbGV0IHN0YXRlRnJvbVN0b3JhZ2U7XG4gIGNvbnN0IGh5ZHJhdGUgPSAoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoIXN0b3JhZ2UpIHJldHVybjtcbiAgICBoYXNIeWRyYXRlZCA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvbkxpc3RlbmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgdmFyIF9hMjtcbiAgICAgIHJldHVybiBjYigoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHQpO1xuICAgIH0pO1xuICAgIGNvbnN0IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID0gKChfYiA9IG9wdGlvbnMub25SZWh5ZHJhdGVTdG9yYWdlKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zLCAoX2EgPSBnZXQoKSkgIT0gbnVsbCA/IF9hIDogY29uZmlnUmVzdWx0KSkgfHwgdm9pZCAwO1xuICAgIHJldHVybiB0b1RoZW5hYmxlKHN0b3JhZ2UuZ2V0SXRlbS5iaW5kKHN0b3JhZ2UpKShvcHRpb25zLm5hbWUpLnRoZW4oKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uID09PSBcIm51bWJlclwiICYmIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uICE9PSBvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5taWdyYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICBvcHRpb25zLm1pZ3JhdGUoXG4gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlLFxuICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgU3RhdGUgbG9hZGVkIGZyb20gc3RvcmFnZSBjb3VsZG4ndCBiZSBtaWdyYXRlZCBzaW5jZSBubyBtaWdyYXRlIGZ1bmN0aW9uIHdhcyBwcm92aWRlZGBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbZmFsc2UsIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS5zdGF0ZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmFsc2UsIHZvaWQgMF07XG4gICAgfSkudGhlbigobWlncmF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICB2Y
25114XIgX2EyO1xuICAgICAgY29uc3QgW21pZ3JhdGVkLCBtaWdyYXRlZFN0YXRlXSA9IG1pZ3JhdGlvblJlc3VsdDtcbiAgICAgIHN0YXRlRnJvbVN0b3JhZ2UgPSBvcHRpb25zLm1lcmdlKFxuICAgICAgICBtaWdyYXRlZFN0YXRlLFxuICAgICAgICAoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHRcbiAgICAgICk7XG4gICAgICBzZXQoc3RhdGVGcm9tU3RvcmFnZSwgdHJ1ZSk7XG4gICAgICBpZiAobWlncmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHNldEl0ZW0oKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID09IG51bGwgPyB2b2lkIDAgOiBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayhzdGF0ZUZyb21TdG9yYWdlLCB2b2lkIDApO1xuICAgICAgc3RhdGVGcm9tU3RvcmFnZSA9IGdldCgpO1xuICAgICAgaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmZvckVhY2goKGNiKSA9PiBjYihzdGF0ZUZyb21TdG9yYWdlKSk7XG4gICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID09IG51bGwgPyB2b2lkIDAgOiBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayh2b2lkIDAsIGUpO1xuICAgIH0pO1xuICB9O1xuICBhcGkucGVyc2lzdCA9IHtcbiAgICBzZXRPcHRpb25zOiAobmV3T3B0aW9ucykgPT4ge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLi4ubmV3T3B0aW9uc1xuICAgICAgfTtcbiAgICAgIGlmIChuZXdPcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IG5ld09wdGlvbnMuc3RvcmFnZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyU3RvcmFnZTogKCkgPT4ge1xuICAgICAgc3RvcmFnZSA9PSBudWxsID8gdm9pZCAwIDogc3RvcmFnZS5yZW1vdmVJdGVtKG9wdGlvbnMubmFtZSk7XG4gICAgfSxcbiAgICBnZXRPcHRpb25zOiAoKSA9PiBvcHRpb25zLFxuICAgIHJlaHlkcmF0ZTogKCkgPT4gaHlkcmF0ZSgpLFxuICAgIGhhc0h5ZHJhdGVkOiAoKSA9PiBoYXNIeWRyYXRlZCxcbiAgICBvbkh5ZHJhdGU6IChjYikgPT4ge1xuICAgICAgaHlkcmF0aW9uTGlzdGVuZXJzLmFkZChjYik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZGVsZXRlKGNiKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBvbkZpbmlzaEh5ZHJhdGlvbjogKGNiKSA9PiB7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuYWRkKGNiKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycy5kZWxldGUoY2IpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIGlmICghb3B0aW9ucy5za2lwSHlkcmF0aW9uKSB7XG4gICAgaHlkcmF0ZSgpO1xuICB9XG4gIHJldHVybiBzdGF0ZUZyb21TdG9yYWdlIHx8IGNvbmZpZ1Jlc3VsdDtcbn07XG5jb25zdCBwZXJzaXN0SW1wbCA9IChjb25maWcsIGJhc2VPcHRpb25zKSA9PiB7XG4gIGlmIChcImdldFN0b3JhZ2VcIiBpbiBiYXNlT3B0aW9ucyB8fCBcInNlcmlhbGl6ZVwiIGluIGJhc2VPcHRpb25zIHx8IFwiZGVzZXJpYWxpemVcIiBpbiBiYXNlT3B0aW9ucykge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltERVBSRUNBVEVEXSBgZ2V0U3RvcmFnZWAsIGBzZXJpYWxpemVgIGFuZCBgZGVzZXJpYWxpemVgIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIFVzZSBgc3RvcmFnZWAgb3B0aW9uIGluc3RlYWQuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvbGRJbXBsKGNvbmZpZywgYmFzZU9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXdJbXBsKGNvbmZpZywgYmFzZU9wdGlvbnMpO1xufTtcbmNvbnN0IHBlcnNpc3QgPSBwZXJzaXN0SW1wbDtcblxuZXhwb3J0IHsgY29tYmluZSwgY3JlYXRlSlNPTlN0b3JhZ2UsIGRldnRvb2xzLCBwZXJzaXN0LCByZWR1eCwgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH07XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJ1xuaW1wb3J0IHsgZGV2dG9vbHMsIHN1YnNjcmliZVdpdGhTZWxlY3RvciwgcGVyc2lzdCB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSdcbmltcG9ydCB0eXBlIHsgQXBwU3RhdGUsIEFwcEFjdGlvbnMgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcblxuLy8gQ29tYmluZWQgc3RvcmUgaW50ZXJmYWNlXG5pbnRlcmZhY2UgQXBwU3RvcmUgZXh0ZW5kcyBBcHBTdGF0ZSwgQXBwQWN0aW9ucyB7fVxuXG4vLyBJbml0aWFsIHN0YXRlXG5jb25zdCBpbml0aWFsU3RhdGU6IEFwcFN0YXRlID0ge1xuICAvLyBVSSBTdGF0ZVxuICBzZWxlY3RlZExvY2F0aW9uSWQ6IG51bGwsXG4gIHNlbGVjdGVkQ29udGFjdDogbnVsbCxcbiAgaXNMb2NhdGlvbk1vZGFsT3BlbjogZmFsc2UsXG4gIGlzQ29udGFjdE1vZGFsT3BlbjogZmFsc2UsXG4gIFxuICAvLyBGaWx0ZXJzXG4gIHNlYXJjaFF1ZXJ5OiAnJyxcbiAgc2VsZWN0ZWREZXBhcnRtZW50czogW10sXG4gIHNlbGVjdGVkTGFuZ3VhZ2VzOiBbXSxcbiAgc2VsZWN0ZWRTdGF0ZXM6IFtdLFxuICBzZWxlY3RlZFNlcnZpY2VzOiBbXSxcbiAgXG4gIC8vIFZpZXcgcHJlZmVyZW5jZXNcbiAgbWFwVmlldzogJ2xpc3QnLFxuICBjb250YWN0TGF5b3V0OiAnZ3JpZCcsXG4gIGFjdGl2ZVRhYjogJ2xvY2F0aW9ucycgYXMgJ2xvY2F0aW9ucycgfCAnY29udGFjdHMnLFxuXG4gIC8vIExvYWRpbmcgc3RhdGVzXG4gIGlzTG9hZGluZzogZmFsc2UsXG4gIGVycm9yOiBudWxsXG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChmb3IgaWZyYW1lIGNvbXBhdGliaWxpdHkpXG5jb25zdCBpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0ZXN0ID0gJ19fbG9jYWxTdG9yYWdlX3Rlc3RfXydcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vLyBDcmVhdGUgdGhlIHN0b3JlIHdpdGggY29uZGl0aW9uYWwgcGVyc2lzdGVuY2VcbmNvbnN0IGNyZWF0ZVN0b3JlID0gKCkgPT4ge1xuICBjb25zdCBzdG9yZUNvbmZpZyA9IHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+ICh7XG4gICAgLy8gSW5pdGlhbCBzdGF0ZVxuICAgIC4uLmluaXRpYWxTdGF0ZSxcblxuICAgIC8vIExvY2F0aW9uIGFjdGlvbnNcbiAgICBzZXRTZWxlY3RlZExvY2F0aW9uOiAobG9jYXRpb25JZCkgPT4ge1xuICAgICAgc2V0KHsgc2VsZWN0ZWRMb2NhdGlvbklkOiBsb2NhdGlvbklkIH0pXG4gICAgfSxcblxuICAgICAgb3BlbkxvY2F0aW9uTW9kYWw6IChsb2NhdGlvbklkKSA9PiB7XG4gICAgICAgI
25114HNldCh7XG4gICAgICAgICAgc2VsZWN0ZWRMb2NhdGlvbklkOiBsb2NhdGlvbklkLFxuICAgICAgICAgIGlzTG9jYXRpb25Nb2RhbE9wZW46IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIGNsb3NlTG9jYXRpb25Nb2RhbDogKCkgPT4ge1xuICAgICAgICBzZXQoe1xuICAgICAgICAgIGlzTG9jYXRpb25Nb2RhbE9wZW46IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICAvLyBDb250YWN0IGFjdGlvbnNcbiAgICAgIHNldFNlbGVjdGVkQ29udGFjdDogKGNvbnRhY3QpID0+IHtcbiAgICAgICAgc2V0KHsgc2VsZWN0ZWRDb250YWN0OiBjb250YWN0IH0pXG4gICAgICB9LFxuXG4gICAgICBvcGVuQ29udGFjdE1vZGFsOiAoY29udGFjdCkgPT4ge1xuICAgICAgICBzZXQoe1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFjdDogY29udGFjdCxcbiAgICAgICAgICBpc0NvbnRhY3RNb2RhbE9wZW46IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIGNsb3NlQ29udGFjdE1vZGFsOiAoKSA9PiB7XG4gICAgICAgIHNldCh7XG4gICAgICAgICAgaXNDb250YWN0TW9kYWxPcGVuOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3RlZENvbnRhY3Q6IG51bGxcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZpbHRlciBhY3Rpb25zXG4gICAgICBzZXRTZWFyY2hRdWVyeTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHNldCh7IHNlYXJjaFF1ZXJ5OiBxdWVyeSB9KVxuICAgICAgfSxcblxuICAgICAgc2V0U2VsZWN0ZWREZXBhcnRtZW50czogKGRlcGFydG1lbnRzKSA9PiB7XG4gICAgICAgIHNldCh7IHNlbGVjdGVkRGVwYXJ0bWVudHM6IGRlcGFydG1lbnRzIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXRTZWxlY3RlZExhbmd1YWdlczogKGxhbmd1YWdlcykgPT4ge1xuICAgICAgICBzZXQoeyBzZWxlY3RlZExhbmd1YWdlczogbGFuZ3VhZ2VzIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXRTZWxlY3RlZFN0YXRlczogKHN0YXRlcykgPT4ge1xuICAgICAgICBzZXQoeyBzZWxlY3RlZFN0YXRlczogc3RhdGVzIH0pXG4gICAgICB9LFxuXG4gICAgICBzZXRTZWxlY3RlZFNlcnZpY2VzOiAoc2VydmljZXMpID0+IHtcbiAgICAgICAgc2V0KHsgc2VsZWN0ZWRTZXJ2aWNlczogc2VydmljZXMgfSlcbiAgICAgIH0sXG5cbiAgICAgIC8vIFZpZXcgYWN0aW9uc1xuICAgICAgc2V0TWFwVmlldzogKHZpZXcpID0+IHtcbiAgICAgICAgc2V0KHsgbWFwVmlldzogdmlldyB9KVxuICAgICAgfSxcblxuICAgICAgc2V0Q29udGFjdExheW91dDogKGxheW91dCkgPT4ge1xuICAgICAgICBzZXQoeyBjb250YWN0TGF5b3V0OiBsYXlvdXQgfSlcbiAgICAgIH0sXG5cbiAgICAgIHNldEFjdGl2ZVRhYjogKHRhYikgPT4ge1xuICAgICAgICBzZXQoeyBhY3RpdmVUYWI6IHRhYiB9KVxuICAgICAgfSxcblxuICAgICAgLy8gTG9hZGluZyBhY3Rpb25zXG4gICAgICBzZXRMb2FkaW5nOiAobG9hZGluZykgPT4ge1xuICAgICAgICBzZXQoeyBpc0xvYWRpbmc6IGxvYWRpbmcgfSlcbiAgICAgIH0sXG5cbiAgICAgIHNldEVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgc2V0KHsgZXJyb3IgfSlcbiAgICAgIH1cbiAgICB9KSlcblxuICAvLyBBcHBseSBkZXZ0b29scyBhbmQgY29uZGl0aW9uYWwgcGVyc2lzdGVuY2VcbiAgdHJ5IHtcbiAgICBpZiAoaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIGRldnRvb2xzKFxuICAgICAgICBwZXJzaXN0KHN0b3JlQ29uZmlnLCB7XG4gICAgICAgICAgbmFtZTogJ21lYy1wb3J0Zm9saW8tc3RvcmUnLFxuICAgICAgICAgIC8vIE9ubHkgc2VyaWFsaXplIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBzdGF0ZVxuICAgICAgICAgIHBhcnRpYWxpemU6IChzdGF0ZTogYW55KSA9PiAoe1xuICAgICAgICAgICAgbWFwVmlldzogc3RhdGUubWFwVmlldyxcbiAgICAgICAgICAgIGNvbnRhY3RMYXlvdXQ6IHN0YXRlLmNvbnRhY3RMYXlvdXQsXG4gICAgICAgICAgICBzZWxlY3RlZERlcGFydG1lbnRzOiBzdGF0ZS5zZWxlY3RlZERlcGFydG1lbnRzLFxuICAgICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZXM6IHN0YXRlLnNlbGVjdGVkTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgc2VsZWN0ZWRTdGF0ZXM6IHN0YXRlLnNlbGVjdGVkU3RhdGVzLFxuICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2aWNlczogc3RhdGUuc2VsZWN0ZWRTZXJ2aWNlc1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICB7IG5hbWU6ICdtZWMtcG9ydGZvbGlvLXN0b3JlJyB9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIHBlcnNpc3RlbmNlIGluIGlmcmFtZSBtb2RlXG4gICAgICBjb25zb2xlLmxvZygn4pqg77iPIGxvY2FsU3RvcmFnZSBub3QgYXZhaWxhYmxlIC0gcnVubmluZyB3aXRob3V0IHBlcnNpc3RlbmNlIChpZnJhbWUgbW9kZSknKVxuICAgICAgcmV0dXJuIGRldnRvb2xzKHN0b3JlQ29uZmlnLCB7IG5hbWU6ICdtZWMtcG9ydGZvbGlvLXN0b3JlLW5vLXBlcnNpc3QnIH0pXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZhbGxiYWNrOiBubyBwZXJzaXN0ZW5jZSwgbm8gZGV2dG9vbHNcbiAgICBjb25zb2xlLmVycm9yKCfimqDvuI8gU3RvcmUgY3JlYXRpb24gZmFpbGVkLCB1c2luZyBiYXNpYyBzdG9yZTonLCBlcnJvcilcbiAgICByZXR1cm4gc3RvcmVDb25maWdcbiAgfVxufVxuXG4vLyBDcmVhdGUgc3RvcmUgd2l0aCBlcnJvciBoYW5kbGluZ1xubGV0IHN0b3JlOiBhbnlcbnRyeSB7XG4gIHN0b3JlID0gY3JlYXRlU3RvcmUoKVxufSBjYXRjaCAoZXJyb3IpIHtcbiAgY29uc29sZS5lcnJvcign4pqg77iPIFN0b3JlIGNyZWF0aW9uIGZhaWxlZCwgdXNpbmcgYmFzaWMgc3RvcmU6JywgZXJyb3IpXG4gIC8vIEZhbGxiYWNrOiBiYXNpYyBzdG9yZSB3aXRob3V0IHBlcnNpc3RlbmNlIG9yIGRldnRvb2xzXG4gIHN0b3JlID0gc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4gKHtcbiAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgc2V0U2VsZWN0ZWRMb2NhdGlvbjogKGxvY2F0aW9uSWQpID0+IHNldCh7IHNlbGVjdGVkTG9jYXRpb25JZDogbG9jYXRpb25JZCB9KSxcbiAgICBzZXRTZWxlY3RlZENvbnRhY3Q6IChjb250YWN0SWQpID0+IHNldCh7IHNlbGVjdGVkQ29udGFjdElkOiBjb250YWN0SWQgfSksXG4gICAgc2V0TWFwVmlldzogKHZpZXcpID0+IHNldCh7IG1hcFZpZXc6IHZpZXcgfSksXG4gICAgc2V0Q29udGFjdExheW91dDogKGxheW91dCkgPT4gc2V0KHsgY29udGFjdExheW91dDogbGF5b3V0IH0pLFxuICAgIHNldFNlYXJjaFF1ZXJ5OiAocXVlcnkpID0+IHNldCh7IHNlYXJjaFF1ZXJ5OiBxdWVyeSB9KSxcbiAgICBzZXRTZWxlY3RlZERlcGFydG1lbnRzOiAoZGVwYXJ0bWVudHMpID0+IHNldCh7IHNlbGVjdGVkRGVwYXJ0bWVudHM6IGRlcGFydG1lbnRzIH0pLFxuICAgIHNldFNlbGVjdGVkTGFuZ3VhZ2VzOiAobGFuZ3VhZ2VzKSA9PiBzZXQoeyBzZWxlY3RlZExhbmd1YWdlczogbGFuZ3VhZ2VzIH0pLFxuICAgIHNldFNlbGVjdGVkU3RhdGVzOiAoc3RhdGVzKSA9PiBzZXQoeyBzZWxlY3RlZFN0YXRlczogc3RhdGVzIH0pLFxuICAgIHNldFNlbGVjdGVkU2VydmljZXM6IChzZXJ2aWNlcykgPT4gc2V0KHsgc2VsZWN0ZWRTZXJ2aWNlczogc2VydmljZXMgfSksXG4gICAgc2V0RXJyb3I6IChlcnJvcikgPT4gc2V0KHsgZXJyb3IgfSlcbiAgfSkpXG59XG5cbmV4cG9ydCBjb25zdCB1c2VBcHBTdG9yZSA9IGNyZWF0ZTxBcHBTdG9yZT4oKShzdG9yZSlcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGVjdG9ycyAoZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFVJIHNlbGVjdG9yc1xuZXhwb3J0IGNvbnN0IHVzZVNlbGVjdGVkTG9jYXRpb24gPSAoKSA9PiB1c2VBcHBTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZExvY2F0aW9uSWQpXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0ZWRDb250YWN0ID0gKCkgPT4gdXNlQXBwU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2VsZWN0ZWRDb250YWN0KVxuZXhwb3J0IGNvbnN0IHVzZUxvY2F0aW9uTW9kYWwgPSAoKSA9PiB1c2VBcHBTdG9yZShzdGF0ZSA9PiAoe1xuICBpc09wZW46IHN0YXRlLmlzTG9jYXRpb25Nb2RhbE9wZW4sXG4gIGxvY2F0aW9uSWQ6IHN0YXRlLnNlbGVjdGVkTG9jYXRpb25JZCxcbiAgb3Blbjogc3RhdGUub3BlbkxvY2F0aW9uTW9kYWwsXG4gIGNsb3NlOiBzdGF0ZS5jbG9zZUxvY2F0aW9uTW9kYWxcbn0pKVxuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RNb2RhbCA9ICgpID0+IHVzZUFwcFN0b3JlKHN0YXRlID0+ICh7XG4gIGlzT3Blbjogc3RhdGUuaXNDb250YWN0TW9kYWxPcGVuLFxuICBjb250YWN0OiBzdGF0ZS5zZWxlY3RlZENvbnRhY3QsXG4gIG9wZW46IHN0YXRlLm9wZW5Db250YWN0TW9kYWwsXG4gIGNsb3NlOiBzdGF0ZS5jbG9zZUNvbnRhY3RNb2RhbFxufSkpXG5cbi8vIEZpbHRlciBzZWxlY3RvcnNcbmV4cG9ydCBjb25zdCB1c2VGaWx0ZXJzID0gKCkgPT4gdXNlQXBwU3RvcmUoc3RhdGUgPT4gKHtcbiAgc2VhcmNoUXVlcnk6IHN0YXRlLnNlYXJjaFF1ZXJ5LFxuICBzZWxlY3RlZERlcGFydG1lbnRzOiBzdGF0ZS5zZWxlY3RlZERlcGFydG1lbnRzLFxuICBzZWxlY3RlZExhbmd1YWdlczogc3RhdGUuc2VsZWN0ZWRMYW5ndWFnZXMsXG4gIHNlbGVjdGVkU3RhdGVzOiBzdGF0ZS5zZWxlY3RlZFN0YXRlcyxcbiAgc2VsZWN0ZWRTZXJ2aWNlczogc3RhdGUuc2VsZWN0ZWRTZXJ2aWNlcyxcbiAgc2V0U2VhcmNoUXVlcnk6IHN0YXRlLnNldFNlYXJjaFF1ZXJ5LFxuICBzZXRTZWxlY3RlZERlcGFydG1lbnRzOiBzdGF0ZS5zZXRTZWxlY3RlZERlcGFydG1lbnRzLFxuICBzZXRTZWxlY3RlZExhbmd1YWdlczogc3RhdGUuc2V0U2VsZWN0ZWRMYW5ndWFnZXMsXG4gIHNldFNlbGVjdGVkU3RhdGVzOiBzdGF0ZS5zZXRTZWxlY3RlZFN0YXRlcyxcbiAgc2V0U2VsZWN0ZWRTZXJ2aWNlczogc3RhdGUuc2V0U2VsZWN0ZWRTZXJ2aWNlc1xufSkpXG5cbi8vIFZpZXcgc2VsZWN0b3JzXG5leHBvcnQgY29uc3QgdXNlVmlld1ByZWZlcmVuY2VzID0gKCkgPT4gdXNlQXBwU3RvcmUoc3RhdGUgPT4gKHtcbiAgbWFwVmlldzogc3Rh
25114dGUubWFwVmlldyxcbiAgY29udGFjdExheW91dDogc3RhdGUuY29udGFjdExheW91dCxcbiAgYWN0aXZlVGFiOiBzdGF0ZS5hY3RpdmVUYWIsXG4gIHNldE1hcFZpZXc6IHN0YXRlLnNldE1hcFZpZXcsXG4gIHNldENvbnRhY3RMYXlvdXQ6IHN0YXRlLnNldENvbnRhY3RMYXlvdXQsXG4gIHNldEFjdGl2ZVRhYjogc3RhdGUuc2V0QWN0aXZlVGFiXG59KSlcblxuLy8gTG9hZGluZyBzZWxlY3RvcnNcbmV4cG9ydCBjb25zdCB1c2VMb2FkaW5nU3RhdGUgPSAoKSA9PiB1c2VBcHBTdG9yZShzdGF0ZSA9PiAoe1xuICBpc0xvYWRpbmc6IHN0YXRlLmlzTG9hZGluZyxcbiAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICBzZXRMb2FkaW5nOiBzdGF0ZS5zZXRMb2FkaW5nLFxuICBzZXRFcnJvcjogc3RhdGUuc2V0RXJyb3Jcbn0pKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RvcmUgc3Vic2NyaXB0aW9ucyAoZm9yIHNpZGUgZWZmZWN0cylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFN1YnNjcmliZSB0byBsb2NhdGlvbiBjaGFuZ2VzIHRvIHVwZGF0ZSBVUkxcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBsZXQgcHJldmlvdXNMb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gIHVzZUFwcFN0b3JlLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICBjb25zdCBjdXJyZW50TG9jYXRpb25JZCA9IHN0YXRlLnNlbGVjdGVkTG9jYXRpb25JZFxuICAgIGlmIChjdXJyZW50TG9jYXRpb25JZCAhPT0gcHJldmlvdXNMb2NhdGlvbklkKSB7XG4gICAgICBwcmV2aW91c0xvY2F0aW9uSWQgPSBjdXJyZW50TG9jYXRpb25JZFxuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgICAgIGlmIChjdXJyZW50TG9jYXRpb25JZCkge1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnbG9jYXRpb24nLCBjdXJyZW50TG9jYXRpb25JZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdsb2NhdGlvbicpXG4gICAgICB9XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB1cmwudG9TdHJpbmcoKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gU3Vic2NyaWJlIHRvIGVycm9ycyBmb3IgbG9nZ2luZ1xuICBsZXQgcHJldmlvdXNFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICB1c2VBcHBTdG9yZS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEVycm9yID0gc3RhdGUuZXJyb3JcbiAgICBpZiAoY3VycmVudEVycm9yICE9PSBwcmV2aW91c0Vycm9yKSB7XG4gICAgICBwcmV2aW91c0Vycm9yID0gY3VycmVudEVycm9yXG4gICAgICBpZiAoY3VycmVudEVycm9yICYmIGltcG9ydC5tZXRhLmVudi5QUk9EKSB7XG4gICAgICAgIC8vIFNlbmQgdG8gZXJyb3IgcmVwb3J0aW5nIHNlcnZpY2VcbiAgICAgICAgY29uc29sZS5lcnJvcignTUVDIFBvcnRmb2xpbyBFcnJvcjonLCBjdXJyZW50RXJyb3IpXG4gICAgICAgIC8vIFRPRE86IFNlbmQgdG8gU2VudHJ5IG9yIHNpbWlsYXJcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTdG9yZSB1dGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFJlc2V0IHN0b3JlIHRvIGluaXRpYWwgc3RhdGVcbmV4cG9ydCBjb25zdCByZXNldEFwcFN0b3JlID0gKCkgPT4ge1xuICB1c2VBcHBTdG9yZS5zZXRTdGF0ZShpbml0aWFsU3RhdGUpXG59XG5cbi8vIEdldCBjdXJyZW50IHN0YXRlIChmb3IgdXNlIG91dHNpZGUgUmVhY3QgY29tcG9uZW50cylcbmV4cG9ydCBjb25zdCBnZXRBcHBTdGF0ZSA9ICgpID0+IHVzZUFwcFN0b3JlLmdldFN0YXRlKClcblxuLy8gU3Vic2NyaWJlIHRvIHN0b3JlIGNoYW5nZXMgKGZvciB1c2Ugb3V0c2lkZSBSZWFjdCBjb21wb25lbnRzKVxuZXhwb3J0IGNvbnN0IHN1YnNjcmliZVRvU3RvcmUgPSB1c2VBcHBTdG9yZS5zdWJzY3JpYmVcbiIsImltcG9ydCB0eXBlIHsgTG9jYXRpb24sIENvbnRhY3QsIEFwaVJlc3BvbnNlLCBQYWdpbmF0ZWRSZXNwb25zZSB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVBJIENvbmZpZ3VyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9IGltcG9ydC5tZXRhLmVudi5WSVRFX0FQSV9VUkwgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMSdcbmNvbnN0IEFQSV9WRVJTSU9OID0gJ3YxJ1xuY29uc3QgQVBJX1VSTCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpLyR7QVBJX1ZFUlNJT059YFxuXG4vLyBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBSRVFVRVNUX1RJTUVPVVQgPSAxMDAwMFxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSFRUUCBDbGllbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNsYXNzIEFwaUNsaWVudCB7XG4gIHByaXZhdGUgYmFzZVVSTDogc3RyaW5nXG4gIHByaXZhdGUgdGltZW91dDogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IoYmFzZVVSTDogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIgPSBSRVFVRVNUX1RJTUVPVVQpIHtcbiAgICB0aGlzLmJhc2VVUkwgPSBiYXNlVVJMXG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dFxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXF1
25114ZXN0PFQ+KFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVUkx9JHtlbmRwb2ludH1gXG4gICAgXG4gICAgLy8gQ3JlYXRlIGFib3J0IGNvbnRyb2xsZXIgZm9yIHRpbWVvdXRcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRoaXMudGltZW91dClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKVxuICAgICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoXG4gICAgICAgICAgZXJyb3JEYXRhLm1lc3NhZ2UgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgZXJyb3JEYXRhXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKCdSZXF1ZXN0IHRpbWVvdXQnLCA0MDgpXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKGVycm9yLm1lc3NhZ2UsIDApXG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IG5ldyBBcGlFcnJvcignVW5rbm93biBlcnJvciBvY2N1cnJlZCcsIDApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KGVuZHBvaW50LCB7IG1ldGhvZDogJ0dFVCcgfSlcbiAgfVxuXG4gIGFzeW5jIHBvc3Q8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogZGF0YSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogdW5kZWZpbmVkLFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBwdXQ8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oZW5kcG9pbnQsIHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBib2R5OiBkYXRhID8gSlNPTi5zdHJpbmdpZnkoZGF0YSkgOiB1bmRlZmluZWQsXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxUPihlbmRwb2ludDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihlbmRwb2ludCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pXG4gIH1cbn1cblxuLy8gQ3VzdG9tIGVycm9yIGNsYXNzXG5jbGFzcyBBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHN0YXR1czogbnVtYmVyXG4gIHB1YmxpYyBkYXRhPzogYW55XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciA9IDAsIGRhdGE/OiBhbnkpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdBcGlFcnJvcidcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgfVxufVxuXG4vLyBDcmVhdGUgQVBJIGNsaWVudCBpbnN0YW5jZVxuY29uc3QgYXBpQ2xpZW50ID0gbmV3IEFwaUNsaWVudChBUElfVVJMKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVBJIEZ1bmN0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gTG9jYXRpb25zIEFQSVxuZXhwb3J0IGNvbnN0IGxvY2F0aW9uc0FwaSA9IHtcbiAgLy8gR2V0IGFsbCBsb2NhdGlvbnNcbiAgZ2V0QWxsOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMb2NhdGlvbltdPj4gPT5cbiAgICBhcGlDbGllbnQuZ2V0KCcvbG9jYXRpb25zP2xpbWl0PTEwMCcpLFxuXG4gIC8vIEdldCBsb2NhdGlvbiBieSBJRFxuICBnZXRCeUlkOiAoaWQ6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8TG9jYXRpb24+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoYC9sb2NhdGlvbnMvJHtpZH1gKSxcblxuICAvLyBTZWFyY2ggbG9jYXRpb25zXG4gIHNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPExvY2F0aW9uW10+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoYC9sb2NhdGlvbnMvc2VhcmNoP3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApLFxuXG4gIC8vIEdldCBzZXJ2aWNlcyBmb3IgZmlsdGVyaW5nXG4gIGdldFNlcnZpY2VzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IHNlcnZpY2U6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2xvY2F0aW9ucy9zZXJ2aWNlcycpLFxuXG4gIC8vIEdldCBzdGF0ZXMvcmVnaW9ucyBmb3IgZmlsdGVyaW5nXG4gIGdldFN0YXRlczogKCk6IFByb21pc2U8QXBpUmVzcG9uc2U8QXJyYXk8ey
25114BzdGF0ZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+Pj4gPT5cbiAgICBhcGlDbGllbnQuZ2V0KCcvbG9jYXRpb25zL3N0YXRlcycpLFxuXG4gIC8vIEdldCBvcGVuaW5nIHllYXJzIGZvciBmaWx0ZXJpbmdcbiAgZ2V0T3BlbmluZ1llYXJzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTx7IHllYXJzOiBBcnJheTx7IHllYXI6IG51bWJlcjsgY291bnQ6IG51bWJlciB9PjsgZGVjYWRlczogQXJyYXk8eyBkZWNhZGU6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgeWVhcnM6IEFycmF5PHsgeWVhcjogbnVtYmVyOyBjb3VudDogbnVtYmVyIH0+IH0+IH0+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoJy9sb2NhdGlvbnMvb3BlbmluZy15ZWFycycpLFxufVxuXG4vLyBDb250YWN0cyBBUElcbmV4cG9ydCBjb25zdCBjb250YWN0c0FwaSA9IHtcbiAgLy8gR2V0IGFsbCBjb250YWN0c1xuICBnZXRBbGw6IChwYXJhbXM/OiB7XG4gICAgcGFnZT86IG51bWJlclxuICAgIGxpbWl0PzogbnVtYmVyXG4gICAgbG9jYXRpb25JZD86IHN0cmluZ1xuICAgIGRlcGFydG1lbnQ/OiBzdHJpbmdcbiAgICBzZWFyY2g/OiBzdHJpbmdcbiAgfSk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8Q29udGFjdD4+ID0+IHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBcbiAgICBpZiAocGFyYW1zPy5wYWdlKSBzZWFyY2hQYXJhbXMuc2V0KCdwYWdlJywgcGFyYW1zLnBhZ2UudG9TdHJpbmcoKSlcbiAgICBpZiAocGFyYW1zPy5saW1pdCkgc2VhcmNoUGFyYW1zLnNldCgnbGltaXQnLCBwYXJhbXMubGltaXQudG9TdHJpbmcoKSlcbiAgICBpZiAocGFyYW1zPy5sb2NhdGlvbklkKSBzZWFyY2hQYXJhbXMuc2V0KCdsb2NhdGlvbklkJywgcGFyYW1zLmxvY2F0aW9uSWQpXG4gICAgaWYgKHBhcmFtcz8uZGVwYXJ0bWVudCkgc2VhcmNoUGFyYW1zLnNldCgnZGVwYXJ0bWVudCcsIHBhcmFtcy5kZXBhcnRtZW50KVxuICAgIGlmIChwYXJhbXM/LnNlYXJjaCkgc2VhcmNoUGFyYW1zLnNldCgnc2VhcmNoJywgcGFyYW1zLnNlYXJjaClcblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKClcbiAgICByZXR1cm4gYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzJHtxdWVyeVN0cmluZyA/IGA/JHtxdWVyeVN0cmluZ31gIDogJyd9YClcbiAgfSxcblxuICAvLyBHZXQgY29udGFjdCBieSBJRFxuICBnZXRCeUlkOiAoaWQ6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q29udGFjdD4+ID0+XG4gICAgYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzLyR7aWR9YCksXG5cbiAgLy8gR2V0IGFsbCBsb2NhdGlvbnMgZm9yIGEgY29udGFjdFxuICBnZXRDb250YWN0TG9jYXRpb25zOiAoY29udGFjdElkOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPExvY2F0aW9uW10+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoYC9jb250YWN0cy8ke2NvbnRhY3RJZH0vbG9jYXRpb25zYCksXG5cbiAgLy8gR2V0IGNvbnRhY3RzIGJ5IGxvY2F0aW9uXG4gIGdldEJ5TG9jYXRpb246IChsb2NhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPENvbnRhY3RbXT4+ID0+XG4gICAgYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzL2xvY2F0aW9uLyR7bG9jYXRpb25JZH1gKSxcblxuICAvLyBTZWFyY2ggY29udGFjdHNcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgbG9jYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q29udGFjdFtdPj4gPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBxOiBxdWVyeSB9KVxuICAgIGlmIChsb2NhdGlvbklkKSBwYXJhbXMuc2V0KCdsb2NhdGlvbklkJywgbG9jYXRpb25JZClcbiAgICByZXR1cm4gYXBpQ2xpZW50LmdldChgL2NvbnRhY3RzL3NlYXJjaD8ke3BhcmFtcy50b1N0cmluZygpfWApXG4gIH0sXG5cbiAgLy8gR2V0IGRlcGFydG1lbnRzXG4gIGdldERlcGFydG1lbnRzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IGRlcGFydG1lbnQ6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2NvbnRhY3RzL2RlcGFydG1lbnRzJyksXG5cbiAgLy8gR2V0IGxhbmd1YWdlc1xuICBnZXRMYW5ndWFnZXM6ICgpOiBQcm9taXNlPEFwaVJlc3BvbnNlPEFycmF5PHsgbGFuZ3VhZ2U6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2NvbnRhY3RzL2xhbmd1YWdlcycpLFxuXG4gIC8vIEdldCBwb3NpdGlvbnNcbiAgZ2V0UG9zaXRpb25zOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IHBvc2l0aW9uOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4+PiA9PlxuICAgIGFwaUNsaWVudC5nZXQoJy9jb250YWN0cy9wb3NpdGlvbnMnKSxcblxuICAvLyBHZXQgYXZhaWxhYmlsaXR5IHR5cGVzXG4gIGdldEF2YWlsYWJpbGl0eVR5cGVzOiAoKTogUHJvbWlzZTxBcGlSZXNwb25zZTxBcnJheTx7IHR5cGU6IHN0cmluZzsgY291bnQ6IG51bWJlciB9Pj4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2NvbnRhY3RzL2F2YWlsYWJpbGl0eS10eXBlcycpLFxufVxuXG4vLyBIZWFsdGggY2hlY2sgQVBJXG5leHBvcnQgY29uc3QgaGVhbHRoQXBpID0ge1xuICBjaGVjazogKCk6IFByb21pc2U8QXBpUmVzcG9uc2U8eyBzdGF0dXM6IHN0cmluZzsgdGltZXN0YW1wOiBzdHJpbmcgfT4+ID0+XG4gICAgYXBpQ2xpZW50LmdldCgnL2hlYWx0aCcpLFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENoZWNrIGlmIGVycm9yIGlzIGFuIEFQSSBlcnJvclxuZXhwb3J0IGNvbnN0IGlzQXBpRXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBBcGlFcnJvciA9PiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEFwaUVycm9yXG59XG5cbi8vIEdldCBlcnJvciBtZXNzYWdlIGZyb20gYW55IGVycm9yIHR5cGVcbmV4cG9ydCBjb25zdCBnZXRFcnJvck1lc3NhZ2UgPSAoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoaXNBcGlFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG4gIFxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybi
25114BlcnJvci5tZXNzYWdlXG4gIH1cbiAgXG4gIHJldHVybiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCdcbn1cblxuLy8gUmV0cnkgZnVuY3Rpb24gZm9yIGZhaWxlZCByZXF1ZXN0c1xuZXhwb3J0IGNvbnN0IHJldHJ5UmVxdWVzdCA9IGFzeW5jIDxUPihcbiAgcmVxdWVzdEZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXhSZXRyaWVzOiBudW1iZXIgPSAzLFxuICBkZWxheTogbnVtYmVyID0gMTAwMFxuKTogUHJvbWlzZTxUPiA9PiB7XG4gIGxldCBsYXN0RXJyb3I6IHVua25vd25cblxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhSZXRyaWVzOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RGbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICBcbiAgICAgIC8vIERvbid0IHJldHJ5IG9uIGNsaWVudCBlcnJvcnMgKDR4eClcbiAgICAgIGlmIChpc0FwaUVycm9yKGVycm9yKSAmJiBlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMCkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEb24ndCByZXRyeSBvbiBsYXN0IGF0dGVtcHRcbiAgICAgIGlmIChpID09PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFdhaXQgYmVmb3JlIHJldHJ5aW5nXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkgKiBNYXRoLnBvdygyLCBpKSkpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbGFzdEVycm9yXG59XG5cbi8vIEV4cG9ydCB0aGUgQVBJIGNsaWVudCBmb3IgYWR2YW5jZWQgdXNhZ2VcbmV4cG9ydCB7IGFwaUNsaWVudCwgQXBpRXJyb3IgfVxuIiwiaW1wb3J0IHsgdXNlUXVlcnksIHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcbmltcG9ydCB7IGxvY2F0aW9uc0FwaSwgaXNBcGlFcnJvciwgZ2V0RXJyb3JNZXNzYWdlIH0gZnJvbSAnQHNlcnZpY2VzL2FwaSdcbmltcG9ydCB7IHVzZUFwcFN0b3JlIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcbmltcG9ydCB0eXBlIHsgTG9jYXRpb24sIFF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVlcnkgS2V5c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IGxvY2F0aW9uS2V5cyA9IHtcbiAgYWxsOiBbJ2xvY2F0aW9ucyddIGFzIGNvbnN0LFxuICBsaXN0czogKCkgPT4gWy4uLmxvY2F0aW9uS2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBbLi4ubG9jYXRpb25LZXlzLmxpc3RzKCksIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBkZXRhaWxzOiAoKSA9PiBbLi4ubG9jYXRpb25LZXlzLmFsbCwgJ2RldGFpbCddIGFzIGNvbnN0LFxuICBkZXRhaWw6IChpZDogc3RyaW5nKSA9PiBbLi4ubG9jYXRpb25LZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBzZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiBbLi4ubG9jYXRpb25LZXlzLmFsbCwgJ3NlYXJjaCcsIHF1ZXJ5XSBhcyBjb25zdCxcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEhvb2sgdG8gZmV0Y2ggYWxsIGxvY2F0aW9uc1xuICovXG5leHBvcnQgY29uc3QgdXNlTG9jYXRpb25zID0gKG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBzZXRFcnJvciB9ID0gdXNlQXBwU3RvcmUoKVxuXG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGxvY2F0aW9uS2V5cy5saXN0cygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9jYXRpb25zQXBpLmdldEFsbCgpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0YWxlVGltZTogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXNcbiAgICBnY1RpbWU6IDMwICogNjAgKiAxMDAwLCAvLyAzMCBtaW51dGVzXG4gICAgcmV0cnk6IChmYWlsdXJlQ291bnQsIGVycm9yKSA9PiB7XG4gICAgICAvLyBEb24ndCByZXRyeSBvbiBjbGllbnQgZXJyb3JzXG4gICAgICBpZiAoaXNBcGlFcnJvcihlcnJvcikgJiYgZXJyb3Iuc3RhdHVzID49IDQwMCAmJiBlcnJvci5zdGF0dXMgPCA1MDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVy
25114ZUNvdW50IDwgM1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSlcbn1cblxuLyoqXG4gKiBIb29rIHRvIGZldGNoIGEgc2luZ2xlIGxvY2F0aW9uIGJ5IElEXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VMb2NhdGlvbiA9IChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbG9jYXRpb25LZXlzLmRldGFpbChpZCB8fCAnJyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKCdMb2NhdGlvbiBJRCBpcyByZXF1aXJlZCcpXG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9jYXRpb25zQXBpLmdldEJ5SWQoaWQpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgc3RhbGVUaW1lOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgIGdjVGltZTogMzAgKiA2MCAqIDEwMDAsIC8vIDMwIG1pbnV0ZXNcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gc2VhcmNoIGxvY2F0aW9uc1xuICovXG5leHBvcnQgY29uc3QgdXNlTG9jYXRpb25TZWFyY2ggPSAocXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbG9jYXRpb25LZXlzLnNlYXJjaChxdWVyeSksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFxdWVyeS50cmltKCkpIHJldHVybiBbXVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxvY2F0aW9uc0FwaS5zZWFyY2gocXVlcnkpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIGVuYWJsZWQ6IHF1ZXJ5LnRyaW0oKS5sZW5ndGggPiAwLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCwgLy8gNSBtaW51dGVzXG4gICAgZ2NUaW1lOiAxMCAqIDYwICogMTAwMCwgLy8gMTAgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogSG9vayB0byBnZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsb2NhdGlvblxuICovXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0ZWRMb2NhdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbklkID0gdXNlQXBwU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2VsZWN0ZWRMb2NhdGlvbklkKVxuICBjb25zdCBsb2NhdGlvblF1ZXJ5ID0gdXNlTG9jYXRpb24oc2VsZWN0ZWRMb2NhdGlvbklkKVxuXG4gIHJldHVybiB7XG4gICAgbG9jYXRpb246IGxvY2F0aW9uUXVlcnkuZGF0YSxcbiAgICBpc0xvYWRpbmc6IGxvY2F0aW9uUXVlcnkuaXNMb2FkaW5nLFxuICAgIGVycm9yOiBsb2NhdGlvblF1ZXJ5LmVycm9yLFxuICAgIHJlZmV0Y2g6IGxvY2F0aW9uUXVlcnkucmVmZXRjaCxcbiAgfVxufVxuXG4vKipcbiAqIEhvb2sgdG8gcHJlZmV0Y2ggbG9jYXRpb24gZGF0YVxuICovXG5leHBvcnQgY29uc3QgdXNlUHJlZmV0Y2hMb2NhdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpXG5cbiAgcmV0dXJuIChpZDogc3RyaW5nKSA9PiB7XG4gICAgcXVlcnlDbGllbnQucHJlZmV0Y2hRdWVyeSh7XG4gICAgICBxdWVyeUtleTogbG9jYXRpb25LZXlzLmRldGFpbChpZCksXG4gICAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9jYXRpb25zQXBpLmdldEJ5SWQoaWQpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9LFxuICAgICAgc3RhbGVUaW1lOiAxNSAqIDYwICogMTAwMCxcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogSG9vayBmb3IgbG9jYXRpb24tcmVsYXRlZCBtdXRhdGlvbnMgKGlmIG5lZWRlZCBpbiB0aGUgZnV0dXJlKVxuICovXG5leHBvcnQgY29uc3QgdXNlTG9jYXRpb25NdXRhdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgLy8gRXhhbXBsZTogVXBkYXRlIGxvY2F0aW9uIChmb3IgZnV0dXJlIHVzZSlcbiAgY29uc3QgdXBkYXRlTG9jYXRpb24gPSB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHsgaWQsIGRhdGEgfTogeyBpZDogc3RyaW5nOyBkYXRhOiBQYXJ0aWFsPExvY2F0aW9uPiB9KSA9PiB7XG4gICAgICAvLyBUaGlzIHdvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gd2UgaGF2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgeWV0JylcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcykgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBhbmQgcmVmZXRjaCBsb2NhdGlvbiBxdWVyaWVzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBsb2NhdGlvbktleXMuZGV0YWlsKHZhcmlhYmxlcy5pZCkgfSlcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGxvY2F0aW9uS2V5cy5saXN0cygpIH0pXG4gICAgfSxcbiAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybi
25114B7XG4gICAgdXBkYXRlTG9jYXRpb24sXG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFV0aWxpdHkgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBsb2NhdGlvbiBmcm9tIGNhY2hlIHdpdGhvdXQgdHJpZ2dlcmluZyBhIHJlcXVlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldExvY2F0aW9uRnJvbUNhY2hlID0gKGlkOiBzdHJpbmcpOiBMb2NhdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICByZXR1cm4gcXVlcnlDbGllbnQuZ2V0UXVlcnlEYXRhKGxvY2F0aW9uS2V5cy5kZXRhaWwoaWQpKVxufVxuXG4vKipcbiAqIFNldCBsb2NhdGlvbiBkYXRhIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMb2NhdGlvbkluQ2FjaGUgPSAobG9jYXRpb246IExvY2F0aW9uKTogdm9pZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBxdWVyeUNsaWVudC5zZXRRdWVyeURhdGEobG9jYXRpb25LZXlzLmRldGFpbChsb2NhdGlvbi5pZCksIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIEludmFsaWRhdGUgYWxsIGxvY2F0aW9uIHF1ZXJpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVMb2NhdGlvblF1ZXJpZXMgPSAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBsb2NhdGlvbktleXMuYWxsIH0pXG59XG5cbi8qKlxuICogUHJlZmV0Y2ggYWxsIGxvY2F0aW9ucyAodXNlZnVsIGZvciBpbml0aWFsIGxvYWQpXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVmZXRjaExvY2F0aW9ucyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpXG4gIGF3YWl0IHF1ZXJ5Q2xpZW50LnByZWZldGNoUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBsb2NhdGlvbktleXMubGlzdHMoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxvY2F0aW9uc0FwaS5nZXRBbGwoKVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFcbiAgICB9LFxuICAgIHN0YWxlVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG4iLCJpbXBvcnQgeyB1c2VRdWVyeSwgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5J1xuaW1wb3J0IHsgY29udGFjdHNBcGksIGlzQXBpRXJyb3IsIGdldEVycm9yTWVzc2FnZSB9IGZyb20gJ0BzZXJ2aWNlcy9hcGknXG5pbXBvcnQgeyB1c2VBcHBTdG9yZSB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgdHlwZSB7IENvbnRhY3QsIFF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVlcnkgS2V5c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IGNvbnRhY3RLZXlzID0ge1xuICBhbGw6IFsnY29udGFjdHMnXSBhcyBjb25zdCxcbiAgbGlzdHM6ICgpID0+IFsuLi5jb250YWN0S2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBbLi4uY29udGFjdEtleXMubGlzdHMoKSwgZmlsdGVyc10gYXMgY29uc3QsXG4gIGRldGFpbHM6ICgpID0+IFsuLi5jb250YWN0S2V5cy5hbGwsICdkZXRhaWwnXSBhcyBjb25zdCxcbiAgZGV0YWlsOiAoaWQ6IHN0cmluZykgPT4gWy4uLmNvbnRhY3RLZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBieUxvY2F0aW9uOiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiBbLi4uY29udGFjdEtleXMuYWxsLCAnbG9jYXRpb24nLCBsb2NhdGlvbklkXSBhcyBjb25zdCxcbiAgY29udGFjdExvY2F0aW9uczogKGNvbnRhY3RJZDogc3RyaW5nKSA9PiBbLi4uY29udGFjdEtleXMuYWxsLCAnY29udGFjdC1sb2NhdGlvbnMnLCBjb250YWN0SWRdIGFzIGNvbnN0LFxuICBzZWFyY2g6IChxdWVyeTogc3RyaW5nLCBsb2NhdGlvbklkPzogc3RyaW5nKSA9PiBbLi4uY29udGFjdEtleXMuYWxsLCAnc2VhcmNoJywgcXVlcnksIGxvY2F0aW9uSWRdIGFzIGNvbnN0LFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSG9va3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogSG9vayB0byBmZXRjaCBhbGwgY29udGFjdHMgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RzID0gKHBhcmFtcz86IHtcbiAgcGFnZT86IG51bWJlclxuICBsaW1pdD86IG51bWJlclxuICBsb2NhdGlvbklkPzogc3RyaW5nXG4gIGRlcGFydG1lbnQ/OiBzdHJpbmdcbiAgc2VhcmNoPzogc3RyaW5nXG59LCBvcHRpb25zPzogUXVlcnlPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgc2V0RXJyb3IgfSA9IHVzZUFwcFN0b3JlKClcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBjb250YWN0S2V5cy5saXN0KHBhcmFtcyB8fCB7fSksXG4gICAgcXVlcnlGbjogYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250YWN0c0FwaS5nZXRBbGwocGFyYW1zKVxuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBjb250YWN0IGRhdGEgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZmllbGQgbmFtZXNcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSkge1xuICAgICAgICAgI
25114HJlc3BvbnNlLmRhdGEgPSByZXNwb25zZS5kYXRhLm1hcCgoY29udGFjdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uY29udGFjdCxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiAoY29udGFjdCBhcyBhbnkpLmZ1bGxuYW1lIHx8IGAkeyhjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnfSAkeyhjb250YWN0IGFzIGFueSkubGFzdG5hbWUgfHwgY29udGFjdC5sYXN0TmFtZSB8fCAnJ31gLnRyaW0oKSB8fCBjb250YWN0LmZ1bGxOYW1lLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9uaWQgfHwgY29udGFjdC5sb2NhdGlvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLmNyZWF0ZWRhdCB8fCBjb250YWN0LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgICAgICAgICBpc0FjdGl2ZTogKGNvbnRhY3QgYXMgYW55KS5pc19hY3RpdmUgIT09IGZhbHNlLFxuICAgICAgICAgICAgc29jaWFsTGlua3M6IGNvbnRhY3Quc29jaWFsTGlua3MgfHwgW11cbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlKGVycm9yKVxuICAgICAgICBzZXRFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsIC8vIDUgbWludXRlc1xuICAgIGdjVGltZTogMTUgKiA2MCAqIDEwMDAsIC8vIDE1IG1pbnV0ZXNcbiAgICByZXRyeTogKGZhaWx1cmVDb3VudCwgZXJyb3IpID0+IHtcbiAgICAgIGlmIChpc0FwaUVycm9yKGVycm9yKSAmJiBlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWlsdXJlQ291bnQgPCAzXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZmV0Y2ggYSBzaW5nbGUgY29udGFjdCBieSBJRFxuICovXG5leHBvcnQgY29uc3QgdXNlQ29udGFjdCA9IChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuZGV0YWlsKGlkIHx8ICcnKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRhY3QgSUQgaXMgcmVxdWlyZWQnKVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRhY3RzQXBpLmdldEJ5SWQoaWQpXG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpXG4gICAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgc3RhbGVUaW1lOiAxMCAqIDYwICogMTAwMCwgLy8gMTAgbWludXRlc1xuICAgIGdjVGltZTogMzAgKiA2MCAqIDEwMDAsIC8vIDMwIG1pbnV0ZXNcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZmV0Y2ggYWxsIGxvY2F0aW9ucyBmb3IgYSBjb250YWN0XG4gKi9cbmV4cG9ydCBjb25zdCB1c2VDb250YWN0TG9jYXRpb25zID0gKGNvbnRhY3RJZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuY29udGFjdExvY2F0aW9ucyhjb250YWN0SWQgfHwgJycpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghY29udGFjdElkKSByZXR1cm4gW11cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250YWN0c0FwaS5nZXRDb250YWN0TG9jYXRpb25zKGNvbnRhY3RJZClcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEgfHwgW11cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgICAgc2V0RXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjb250YWN0IGxvY2F0aW9uczonLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIFtdIC8vIFJldHVybiBlbXB0eSBhcnJheSBvbiBlcnJvciBpbnN0ZWFkIG9mIHRocm93aW5nXG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWNvbnRhY3RJZCxcbiAgICBzdGFsZVRpbWU6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgZ2NUaW1lOiAzMCAqIDYwICogMTAwMCwgLy8gMzAgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogSG9vayB0byBmZXRjaCBjb250YWN0cyBieSBsb2NhdGlvbiAoaW5jbHVkZXMgbWFuYWdlbWVudCBjb250YWN0cylcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RzQnlMb2NhdGlvbiA9IChsb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogUXVlcnlPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgc2V0RXJyb3IgfSA9IHVzZUFwcFN0b3JlKClcblxuICAvLyBOb3JtYWxpemUgbG9jYXRpb25JZCB0byBlbnN1cmUgd3AtIHByZWZpeFxuICBjb25zdCBub3JtYWxpem
25114VkTG9jYXRpb25JZCA9IGxvY2F0aW9uSWRcbiAgICA/IChsb2NhdGlvbklkLnN0YXJ0c1dpdGgoJ3dwLScpID8gbG9jYXRpb25JZCA6IGB3cC0ke2xvY2F0aW9uSWR9YClcbiAgICA6IG51bGxcblxuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBjb250YWN0S2V5cy5ieUxvY2F0aW9uKG5vcm1hbGl6ZWRMb2NhdGlvbklkIHx8ICcnKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWRMb2NhdGlvbklkKSByZXR1cm4gW11cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250YWN0c0FwaS5nZXRCeUxvY2F0aW9uKG5vcm1hbGl6ZWRMb2NhdGlvbklkKVxuXG4gICAgICAgIC8vIEhhbmRsZSBib3RoIG9sZCBhbmQgbmV3IEFQSSByZXNwb25zZSBzdHJ1Y3R1cmVzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICAgICAgLy8gT2xkIEFQSSBzdHJ1Y3R1cmU6IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogQ29udGFjdFtdLCBicmVha2Rvd24/OiB7Li4ufSB9XG4gICAgICAgICAgLy8gTWFwIGJhY2tlbmQgZmllbGQgbmFtZXMgdG8gZnJvbnRlbmQgZXhwZWN0ZWQgbmFtZXNcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkQ29udGFjdHMgPSByZXNwb25zZS5kYXRhLm1hcCgoY29udGFjdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uY29udGFjdCxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiAoY29udGFjdCBhcyBhbnkpLmZ1bGxuYW1lIHx8IGAkeyhjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnfSAkeyhjb250YWN0IGFzIGFueSkubGFzdG5hbWUgfHwgY29udGFjdC5sYXN0TmFtZSB8fCAnJ31gLnRyaW0oKSB8fCBjb250YWN0LmZ1bGxOYW1lLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9uaWQgfHwgY29udGFjdC5sb2NhdGlvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLmNyZWF0ZWRhdCB8fCBjb250YWN0LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgICAgICAgICBpc0FjdGl2ZTogKGNvbnRhY3QgYXMgYW55KS5pc19hY3RpdmUgIT09IGZhbHNlLCAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgICAgIHNvY2lhbExpbmtzOiBjb250YWN0LnNvY2lhbExpbmtzIHx8IFtdLCAvLyBBbHJlYWR5IHRyYW5zZm9ybWVkIGJ5IGJhY2tlbmRcbiAgICAgICAgICAgIC8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gYmFja2VuZCBqb2luc1xuICAgICAgICAgICAgbG9jYXRpb25OYW1lOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9ubmFtZSB8fCBjb250YWN0LmxvY2F0aW9uTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uQ2l0eTogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmNpdHkgfHwgY29udGFjdC5sb2NhdGlvbkNpdHksXG4gICAgICAgICAgICBsb2NhdGlvbkFkZHJlc3M6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25hZGRyZXNzIHx8IGNvbnRhY3QubG9jYXRpb25BZGRyZXNzXG4gICAgICAgICAgfSkpXG5cbiAgICAgICAgICAvLyBGb3IgbG9jYXRpb24tc3BlY2lmaWMgcXVlcmllcywgd2Ugd2FudCB0byBzaG93IGFsbCBjb250YWN0cyBhc3NpZ25lZCB0byB0aGlzIGxvY2F0aW9uXG4gICAgICAgICAgLy8gTm8gZGVkdXBsaWNhdGlvbiBuZWVkZWQgaGVyZSBzaW5jZSB3ZSdyZSBzaG93aW5nIGNvbnRhY3RzIEZPUiB0aGlzIHNwZWNpZmljIGxvY2F0aW9uXG4gICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRDb250YWN0c1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmRhdGEgJiYgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnICYmICdsb2NhdGlvbkNvbnRhY3RzJyBpbiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgLy8gTkVXIEFQSSBzdHJ1Y3R1cmU6IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBsb2NhdGlvbkNvbnRhY3RzOiBDb250YWN0W10sIG1hbmFnZW1lbnRDb250YWN0czogQ29udGFjdFtdIH0gfVxuICAgICAgICAgIGNvbnN0IGFwaURhdGEgPSByZXNwb25zZS5kYXRhIGFzIGFueVxuICAgICAgICAgIGNvbnN0IGFsbENvbnRhY3RzID0gW1xuICAgICAgICAgICAgLi4uKGFwaURhdGEubG9jYXRpb25Db250YWN0cyB8fCBbXSksXG4gICAgICAgICAgICAuLi4oYXBpRGF0YS5tYW5hZ2VtZW50Q29udGFjdHMgfHwgW10pXG4gICAgICAgICAgXVxuXG4gICAgICAgICAgcmV0dXJuIGFsbENvbnRhY3RzLm1hcCgoY29udGFjdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uY29udGFjdCxcbiAgICAgICAgICAgIGZ1bGxOYW1lOiAoY29udGFjdCBhcyBhbnkpLmZ1bGxuYW1lIHx8IGNvbnRhY3QuZnVsbE5hbWUgfHwgYCR7KGNvbnRhY3QgYXMgYW55KS5maXJzdG5hbWUgfHwgY29udGFjdC5maXJzdE5hbWUgfHwgJyd9ICR7KGNvbnRhY3QgYXMgYW55KS5sYXN0bmFtZSB8fCBjb250YWN0Lmxhc3ROYW1lIHx8ICcnfWAudHJpbSgpLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9uaWQgfHwgY29udGFjdC5sb2NhdGlvbklkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLmNyZWF0ZWRhdCB8fCBjb250YWN0LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgICAgICAgICBpc0FjdGl2ZTogKGNvbnRhY3QgYXMgYW55KS5pc19hY3RpdmUgIT09IGZhbHNlLCAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgICAgI
25114HNvY2lhbExpbmtzOiBjb250YWN0LnNvY2lhbExpbmtzIHx8IFtdLCAvLyBBbHJlYWR5IHRyYW5zZm9ybWVkIGJ5IGJhY2tlbmRcbiAgICAgICAgICAgIC8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gYmFja2VuZCBqb2luc1xuICAgICAgICAgICAgbG9jYXRpb25OYW1lOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9ubmFtZSB8fCBjb250YWN0LmxvY2F0aW9uTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uQ2l0eTogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmNpdHkgfHwgY29udGFjdC5sb2NhdGlvbkNpdHksXG4gICAgICAgICAgICBsb2NhdGlvbkFkZHJlc3M6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25hZGRyZXNzIHx8IGNvbnRhY3QubG9jYXRpb25BZGRyZXNzXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZGF0YSAmJiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEgJiYgQXJyYXkuaXNBcnJheSgocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEpKSB7XG4gICAgICAgICAgLy8gT2xkIEFQSSBzdHJ1Y3R1cmU6IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBkYXRhOiBDb250YWN0W10sIHBhZ2luYXRpb246IHsuLi59IH0gfVxuICAgICAgICAgIHJldHVybiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEubWFwKChjb250YWN0OiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5jb250YWN0LFxuICAgICAgICAgICAgZnVsbE5hbWU6IChjb250YWN0IGFzIGFueSkuZnVsbG5hbWUgfHwgY29udGFjdC5mdWxsTmFtZSB8fCBgJHsoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSB8fCAnJ30gJHsoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUgfHwgJyd9YC50cmltKCksXG4gICAgICAgICAgICBmaXJzdE5hbWU6IChjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgICAgICAgICAgbGFzdE5hbWU6IChjb250YWN0IGFzIGFueSkubGFzdG5hbWUgfHwgY29udGFjdC5sYXN0TmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uSWQ6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25pZCB8fCBjb250YWN0LmxvY2F0aW9uSWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IChjb250YWN0IGFzIGFueSkuY3JlYXRlZGF0IHx8IGNvbnRhY3QuY3JlYXRlZEF0LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiAoY29udGFjdCBhcyBhbnkpLnVwZGF0ZWRhdCB8fCBjb250YWN0LnVwZGF0ZWRBdCxcbiAgICAgICAgICAgIGlzQWN0aXZlOiAoY29udGFjdCBhcyBhbnkpLmlzX2FjdGl2ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgICBzb2NpYWxMaW5rczogY29udGFjdC5zb2NpYWxMaW5rcyB8fCBbXSxcbiAgICAgICAgICAgIC8vIExvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gYmFja2VuZCBqb2luc1xuICAgICAgICAgICAgbG9jYXRpb25OYW1lOiAoY29udGFjdCBhcyBhbnkpLmxvY2F0aW9ubmFtZSB8fCBjb250YWN0LmxvY2F0aW9uTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uQ2l0eTogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmNpdHkgfHwgY29udGFjdC5sb2NhdGlvbkNpdHksXG4gICAgICAgICAgICBsb2NhdGlvbkFkZHJlc3M6IChjb250YWN0IGFzIGFueSkubG9jYXRpb25hZGRyZXNzIHx8IGNvbnRhY3QubG9jYXRpb25BZGRyZXNzXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZGF0YSAmJiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLnBhZ2luYXRpb24gJiYgKHJlc3BvbnNlLmRhdGEgYXMgYW55KS5wYWdpbmF0aW9uLnRvdGFsID09PSAwKSB7XG4gICAgICAgICAgLy8gRW1wdHkgcmVzcG9uc2UgZnJvbSBvbGQgQVBJIHN0cnVjdHVyZVxuICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIC0gdHJ5IHRvIGV4dHJhY3QgZGF0YVxuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhIHx8IFtdXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgICAgc2V0RXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0sXG4gICAgZW5hYmxlZDogISFsb2NhdGlvbklkLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCwgLy8gNSBtaW51dGVzXG4gICAgZ2NUaW1lOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pXG59XG5cbi8qKlxuICogSG9vayB0byBzZWFyY2ggY29udGFjdHNcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RTZWFyY2ggPSAocXVlcnk6IHN0cmluZywgbG9jYXRpb25JZD86IHN0cmluZywgb3B0aW9ucz86IFF1ZXJ5T3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuc2VhcmNoKHF1ZXJ5LCBsb2NhdGlvbklkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXF1ZXJ5LnRyaW0oKSkgcmV0dXJuIFtdXG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGFjdHNBcGkuc2VhcmNoKHF1ZXJ5LCBsb2NhdGlvbklkKVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlKGVycm9yKVxuICAgICAgICBzZXRFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSxcbiAgICBlbmFibGVkOiBxdWVyeS50cmltKCkubGVuZ3RoID4gMCxcbiAgICBzdGFsZVRpbWU6IDMgKiA2MCAqIDEwMDAsIC8vIDMgbWludXRlc1xuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXNcbiAgICAuLi5vcHRpb25zLFxuICB9KVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZ2V0IGZpbHRlcmVkIGNvbnRhY3RzIGJhc2VkIG9uIGN1cnJlbnQgYXBwIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VGaWx0ZXJlZENvbnRhY3RzID0gKGxvY2F0aW9uSWQ/OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgeyBzZWFyY2hRdWVyeSwgc2VsZWN0ZWREZXBhcnRtZW50cywgc2VsZWN0ZWRMYW5ndWFnZXMgfSA9IHVzZUFwcFN0b3JlKClcblxuICAvLyBOb3JtYWxpemUgbG9jYXRpb25JZCB0byBlbnN1cmUgd3AtIHByZWZpeFxuICBjb25zdCBub3JtYWxpem
25114VkTG9jYXRpb25JZCA9IGxvY2F0aW9uSWRcbiAgICA/IChsb2NhdGlvbklkLnN0YXJ0c1dpdGgoJ3dwLScpID8gbG9jYXRpb25JZCA6IGB3cC0ke2xvY2F0aW9uSWR9YClcbiAgICA6IHVuZGVmaW5lZFxuXG4gIC8vIElmIGxvY2F0aW9uSWQgaXMgcHJvdmlkZWQsIHVzZSB1c2VDb250YWN0c0J5TG9jYXRpb24gdG8gZ2V0IG1hbmFnZW1lbnQgY29udGFjdHMgdG9vXG4gIC8vIE90aGVyd2lzZSB1c2UgdXNlQ29udGFjdHMgZm9yIGdlbmVyYWwgZmlsdGVyaW5nXG4gIGNvbnN0IGNvbnRhY3RzQnlMb2NhdGlvblF1ZXJ5ID0gdXNlQ29udGFjdHNCeUxvY2F0aW9uKG5vcm1hbGl6ZWRMb2NhdGlvbklkIHx8IG51bGwpXG5cbiAgLy8gQnVpbGQgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIGdlbmVyYWwgY29udGFjdHMgcXVlcnlcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGxvY2F0aW9uSWQ6IG5vcm1hbGl6ZWRMb2NhdGlvbklkLFxuICAgIHNlYXJjaDogc2VhcmNoUXVlcnkgfHwgdW5kZWZpbmVkLFxuICAgIGRlcGFydG1lbnQ6IHNlbGVjdGVkRGVwYXJ0bWVudHMubGVuZ3RoID4gMCA/IHNlbGVjdGVkRGVwYXJ0bWVudHNbMF0gOiB1bmRlZmluZWQsIC8vIFNpbXBsaWZpZWQgZm9yIG5vd1xuICAgIGxpbWl0OiAxMDAwLCAvLyBIaWdoIGxpbWl0IHRvIGdldCBhbGwgY29udGFjdHMgKG5vIHBhZ2luYXRpb24pXG4gIH1cblxuICBjb25zdCBjb250YWN0c1F1ZXJ5ID0gdXNlQ29udGFjdHMocGFyYW1zKVxuXG4gIC8vIFVzZSB0aGUgYXBwcm9wcmlhdGUgcXVlcnkgYmFzZWQgb24gd2hldGhlciBsb2NhdGlvbklkIGlzIHByb3ZpZGVkXG4gIGNvbnN0IGFjdGl2ZVF1ZXJ5ID0gbm9ybWFsaXplZExvY2F0aW9uSWQgPyBjb250YWN0c0J5TG9jYXRpb25RdWVyeSA6IGNvbnRhY3RzUXVlcnlcblxuICAvLyBBZGRpdGlvbmFsIGNsaWVudC1zaWRlIGZpbHRlcmluZyBmb3IgbGFuZ3VhZ2VzIChpZiBuZWVkZWQpIGFuZCBuYW1lIG5vcm1hbGl6YXRpb25cbiAgLy8gRm9yIGxvY2F0aW9uSWQgcXVlcmllcywgYWN0aXZlUXVlcnkuZGF0YSBpcyBhbHJlYWR5IGFuIGFycmF5XG4gIC8vIEZvciBnZW5lcmFsIHF1ZXJpZXMsIGFjdGl2ZVF1ZXJ5LmRhdGEuZGF0YSBpcyB0aGUgYXJyYXlcbiAgY29uc3QgcmF3Q29udGFjdHMgPSBub3JtYWxpemVkTG9jYXRpb25JZFxuICAgID8gKGFjdGl2ZVF1ZXJ5LmRhdGEgfHwgW10pXG4gICAgOiAoY29udGFjdHNRdWVyeS5kYXRhPy5kYXRhIHx8IFtdKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250YWN0cyA9IHJhd0NvbnRhY3RzLm1hcChjb250YWN0ID0+ICh7XG4gICAgLi4uY29udGFjdCxcbiAgICAvLyBOb3JtYWxpemUgZnVsbE5hbWUgZmllbGQgbGlrZSBpbiB1c2VDb250YWN0c0J5TG9jYXRpb25cbiAgICBmdWxsTmFtZTogKGNvbnRhY3QgYXMgYW55KS5mdWxsbmFtZSB8fCBgJHsoY29udGFjdCBhcyBhbnkpLmZpcnN0bmFtZSB8fCBjb250YWN0LmZpcnN0TmFtZSB8fCAnJ30gJHsoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUgfHwgJyd9YC50cmltKCkgfHwgY29udGFjdC5mdWxsTmFtZSxcbiAgICBmaXJzdE5hbWU6IChjb250YWN0IGFzIGFueSkuZmlyc3RuYW1lIHx8IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lOiAoY29udGFjdCBhcyBhbnkpLmxhc3RuYW1lIHx8IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgbG9jYXRpb25JZDogKGNvbnRhY3QgYXMgYW55KS5sb2NhdGlvbmlkIHx8IGNvbnRhY3QubG9jYXRpb25JZCxcbiAgICBjcmVhdGVkQXQ6IChjb250YWN0IGFzIGFueSkuY3JlYXRlZGF0IHx8IGNvbnRhY3QuY3JlYXRlZEF0LFxuICAgIHVwZGF0ZWRBdDogKGNvbnRhY3QgYXMgYW55KS51cGRhdGVkYXQgfHwgY29udGFjdC51cGRhdGVkQXQsXG4gICAgaXNBY3RpdmU6IChjb250YWN0IGFzIGFueSkuaXNfYWN0aXZlICE9PSBmYWxzZSxcbiAgICBzb2NpYWxMaW5rczogY29udGFjdC5zb2NpYWxMaW5rcyB8fCBbXVxuICB9KSlcblxuICAvLyBEZWR1cGxpY2F0ZSBjb250YWN0cyBieSB3cF9pZCAoc2FtZSBwZXJzb24sIG11bHRpcGxlIGxvY2F0aW9ucylcbiAgLy8gQUxXQVlTIGRlZHVwbGljYXRlIC0gYSBwZXJzb24gc2hvdWxkIG9ubHkgYXBwZWFyIG9uY2VcbiAgY29uc3QgZGVkdXBsaWNhdGVkQ29udGFjdHMgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHNlZW5XcElkcyA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRDb250YWN0cy5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgICBsZXQgd3BJZCA9IChjb250YWN0IGFzIGFueSkud3BfaWRcblxuICAgICAgLy8gRmFsbGJhY2s6IEV4dHJhY3Qgd3BfaWQgZnJvbSBjb250YWN0IElEIGlmIHdwX2lkIGlzIG51bGwvdW5kZWZpbmVkXG4gICAgICAvLyBJRCBmb3JtYXQ6IFwid3AtNTQ4OC00MTdcIiAtPiB3cF9pZCA9IDU0ODhcbiAgICAgIGlmICghd3BJZCAmJiBjb250YWN0LmlkLnN0YXJ0c1dpdGgoJ3dwLScpKSB7XG4gICAgICAgIGNvbnN0IGlkUGFydHMgPSBjb250YWN0LmlkLnNwbGl0KCctJylcbiAgICAgICAgaWYgKGlkUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICB3cElkID0gcGFyc2VJbnQoaWRQYXJ0c1sxXSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDwn5SNIERFQlVHOiBMb2cgZGVkdXBsaWNhdGlvbiBwcm9jZXNzXG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogRGVkdXBsaWNhdGlvbiAtIGNvbnRhY3Q6JywgY29udGFjdC5pZCwgJ3dwX2lkOicsIHdwSWQsICdmdWxsTmFtZTonLCBjb250YWN0LmZ1bGxOYW1lKVxuXG4gICAgICAvLyBJZiBubyB3cF9pZCwga2VlcCB0aGUgY29udGFjdCAoZmFsbGJhY2sgZm9yIG9sZCBkYXRhKVxuICAgICAgaWYgKCF3cElkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBLZWVwaW5nIGNvbnRhY3Qgd2l0aG91dCB3cF9pZDonLCBjb250YWN0LmlkKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSd2ZSBzZWVuIHRoaXMgd3BfaWQgYmVmb3JlLCBza2lwIGl0XG4gICAgICBpZiAoc2VlbldwSWRzLmhhcyh3cElkKSkge1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogU2tpcHBpbmcgZHVwbGljYXRlIHdwX2lkOicsIHdwSWQsICdmb3IgY29udGFjdDonLCBjb250YWN0LmlkKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyB3cF9pZCwga2VlcCBpdFxuICAgICAgc2VlbldwSWRzLmFkZCh3cElkKVxuICAgICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEtlZXBpbmcgZmlyc3Qgb2NjdXJyZW5jZSBvZiB3cF9pZDonLCB3cElkLCAnZm9yIGNvbnRhY3Q6JywgY29udGFjdC5pZClcbiAgICAgIHJldHVybi
25114B0cnVlXG4gICAgfSlcbiAgfSkoKVxuXG4gIC8vIEFwcGx5IGxhbmd1YWdlIGZpbHRlcmluZyBhZnRlciBkZWR1cGxpY2F0aW9uXG4gIGNvbnN0IGZpbHRlcmVkQ29udGFjdHMgPSBkZWR1cGxpY2F0ZWRDb250YWN0cy5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgaWYgKHNlbGVjdGVkTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gY29udGFjdC5sYW5ndWFnZXM/LnNvbWUobGFuZyA9PiBzZWxlY3RlZExhbmd1YWdlcy5pbmNsdWRlcyhsYW5nKSlcbiAgfSlcblxuICAvLyBTZXBhcmF0ZSBsb2NhdGlvbi1zcGVjaWZpYyBjb250YWN0cyBmcm9tIG1hbmFnZW1lbnQgY29udGFjdHNcbiAgLy8gTG9jYXRpb24tc3BlY2lmaWM6IGhhdmUgbG9jYXRpb25JZCBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIGxvY2F0aW9uXG4gIC8vIE1hbmFnZW1lbnQ6IGhhdmUgbG9jYXRpb25JZCA9IG51bGxcbiAgY29uc3QgbG9jYXRpb25TcGVjaWZpY0NvbnRhY3RzID0gbm9ybWFsaXplZExvY2F0aW9uSWRcbiAgICA/IGZpbHRlcmVkQ29udGFjdHMuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgICAgICBjb25zdCBjb250YWN0TG9jYXRpb25JZCA9IChjb250YWN0IGFzIGFueSkubG9jYXRpb25pZCB8fCBjb250YWN0LmxvY2F0aW9uSWRcbiAgICAgICAgcmV0dXJuIGNvbnRhY3RMb2NhdGlvbklkID09PSBub3JtYWxpemVkTG9jYXRpb25JZFxuICAgICAgfSlcbiAgICA6IFtdXG5cbiAgLy8g8J+UjSBERUJVRzogTG9nIGNvbnRhY3QgcHJvY2Vzc2luZ1xuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogdXNlRmlsdGVyZWRDb250YWN0cyAtIFJhdyBBUEkgZGF0YTonLCByYXdDb250YWN0cylcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBGaXJzdCByYXcgY29udGFjdDonLCByYXdDb250YWN0cz8uWzBdKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogdXNlRmlsdGVyZWRDb250YWN0cyAtIE5vcm1hbGl6ZWQgY29udGFjdHM6Jywgbm9ybWFsaXplZENvbnRhY3RzPy5sZW5ndGggfHwgMClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBGaXJzdCBub3JtYWxpemVkIGNvbnRhY3Q6Jywgbm9ybWFsaXplZENvbnRhY3RzPy5bMF0pXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB1c2VGaWx0ZXJlZENvbnRhY3RzIC0gRGVkdXBsaWNhdGVkIGNvbnRhY3RzOicsIGRlZHVwbGljYXRlZENvbnRhY3RzPy5sZW5ndGggfHwgMClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBGaW5hbCBmaWx0ZXJlZCBjb250YWN0czonLCBmaWx0ZXJlZENvbnRhY3RzPy5sZW5ndGggfHwgMClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBMb2NhdGlvbi1zcGVjaWZpYyBjb250YWN0czonLCBsb2NhdGlvblNwZWNpZmljQ29udGFjdHM/Lmxlbmd0aCB8fCAwKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogdXNlRmlsdGVyZWRDb250YWN0cyAtIG9yaWdpbmFsIGxvY2F0aW9uSWQ6JywgbG9jYXRpb25JZClcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IHVzZUZpbHRlcmVkQ29udGFjdHMgLSBub3JtYWxpemVkIGxvY2F0aW9uSWQ6Jywgbm9ybWFsaXplZExvY2F0aW9uSWQpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB1c2VGaWx0ZXJlZENvbnRhY3RzIC0gc2VhcmNoUXVlcnk6Jywgc2VhcmNoUXVlcnkpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB1c2VGaWx0ZXJlZENvbnRhY3RzIC0gc2VsZWN0ZWRMYW5ndWFnZXM6Jywgc2VsZWN0ZWRMYW5ndWFnZXMpXG5cbiAgcmV0dXJuIHtcbiAgICBjb250YWN0czogZmlsdGVyZWRDb250YWN0cyxcbiAgICBsb2NhdGlvblNwZWNpZmljQ29udGFjdHM6IGxvY2F0aW9uU3BlY2lmaWNDb250YWN0cywgLy8gTkVXOiBPbmx5IGxvY2F0aW9uLXNwZWNpZmljIGNvbnRhY3RzXG4gICAgbG9jYXRpb25TcGVjaWZpY0NvdW50OiBsb2NhdGlvblNwZWNpZmljQ29udGFjdHMubGVuZ3RoLCAvLyBORVc6IENvdW50IG9mIGxvY2F0aW9uLXNwZWNpZmljIGNvbnRhY3RzIG9ubHlcbiAgICBwYWdpbmF0aW9uOiBub3JtYWxpemVkTG9jYXRpb25JZCA/IHVuZGVmaW5lZCA6IGNvbnRhY3RzUXVlcnkuZGF0YT8ucGFnaW5hdGlvbixcbiAgICBpc0xvYWRpbmc6IGFjdGl2ZVF1ZXJ5LmlzTG9hZGluZyxcbiAgICBlcnJvcjogYWN0aXZlUXVlcnkuZXJyb3IsXG4gICAgcmVmZXRjaDogYWN0aXZlUXVlcnkucmVmZXRjaCxcbiAgfVxufVxuXG4vKipcbiAqIEhvb2sgdG8gZ2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29udGFjdFxuICovXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0ZWRDb250YWN0ID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3RlZENvbnRhY3QgPSB1c2VBcHBTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZWxlY3RlZENvbnRhY3QpXG4gIFxuICAvLyBJZiB3ZSBoYXZlIGEgc2VsZWN0ZWQgY29udGFjdCBidXQgb25seSBwYXJ0aWFsIGRhdGEsIGZldGNoIGZ1bGwgZGV0YWlsc1xuICBjb25zdCBjb250YWN0UXVlcnkgPSB1c2VDb250YWN0KFxuICAgIHNlbGVjdGVkQ29udGFjdD8uaWQgfHwgbnVsbCxcbiAgICB7IGVuYWJsZWQ6ICEhc2VsZWN0ZWRDb250YWN0Py5pZCB9XG4gIClcblxuICByZXR1cm4ge1xuICAgIGNvbnRhY3Q6IGNvbnRhY3RRdWVyeS5kYXRhIHx8IHNlbGVjdGVkQ29udGFjdCxcbiAgICBpc0xvYWRpbmc6IGNvbnRhY3RRdWVyeS5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IGNvbnRhY3RRdWVyeS5lcnJvcixcbiAgICByZWZldGNoOiBjb250YWN0UXVlcnkucmVmZXRjaCxcbiAgfVxufVxuXG4vKipcbiAqIEhvb2sgdG8gcHJlZmV0Y2ggY29udGFjdCBkYXRhXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VQcmVmZXRjaENvbnRhY3QgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuXG4gIHJldHVybiAoaWQ6IHN0cmluZykgPT4ge1xuICAgIHF1ZXJ5Q2xpZW50LnByZWZldGNoUXVlcnkoe1xuICAgICAgcXVlcnlLZXk6IGNvbnRhY3RLZXlzLmRldGFpbChpZCksXG4gICAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGFjdHNBcGkuZ2V0QnlJZChpZClcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFcbiAgICAgIH0sXG4gICAgICBzdGFsZVRpbWU6IDEwICogNjAgKiAxMDAwLFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBIb29rIGZvciBjb250YWN0LXJlbGF0ZWQgbXV0YXRpb25zIChpZiBuZWVkZWQgaW4gdGhlIGZ1dHVyZSlcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUNvbnRhY3RNdXRhdGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VBcHBTdG9yZSgpXG5cbiAgLy8gRXhhbXBsZTogVXBkYXRlIGNvbnRhY3QgKGZvciBmdXR1cmUgdXNlKVxuICBjb25zdCB1cGRhdGVDb250YWN0ID0gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jICh7IGlkLCBkYXRhIH06IHsgaWQ6IHN0cmluZzsgZGF0YTogUGFydGlhbDxDb250YWN0PiB9KSA9PiB7XG4gICAgICAvLyBUaGlzIHdvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gd2UgaGF2ZSB1cGRhdGUgZnVuY3Rpb25hbGl0eVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgeWV0JylcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGE6IGFueSwgdmFyaWFibGVzOiBhbnkpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgYW5kIHJlZmV0Y2ggY29udGFjdCBxdWVyaWVzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBjb250YWN0S2V5cy5kZXRhaWwodmFyaWFibGVzLmlkKSB9KVxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogY29udGFjdEtleXMubGlzdHMoKSB9KVxuICAgICAgaWYgKGRhdGE/LmxvY2F0aW9uSWQpIHtcbiAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogY29udGFjdEtleXMuYnlMb2NhdGlvbihkYXRhLmxvY2F0aW9uSWQpIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybi
25114B7XG4gICAgdXBkYXRlQ29udGFjdCxcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGNvbnRhY3QgZnJvbSBjYWNoZSB3aXRob3V0IHRyaWdnZXJpbmcgYSByZXF1ZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb250YWN0RnJvbUNhY2hlID0gKGlkOiBzdHJpbmcpOiBDb250YWN0IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpXG4gIHJldHVybiBxdWVyeUNsaWVudC5nZXRRdWVyeURhdGEoY29udGFjdEtleXMuZGV0YWlsKGlkKSlcbn1cblxuLyoqXG4gKiBTZXQgY29udGFjdCBkYXRhIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDb250YWN0SW5DYWNoZSA9IChjb250YWN0OiBDb250YWN0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBxdWVyeUNsaWVudC5zZXRRdWVyeURhdGEoY29udGFjdEtleXMuZGV0YWlsKGNvbnRhY3QuaWQpLCBjb250YWN0KVxufVxuXG4vKipcbiAqIEludmFsaWRhdGUgYWxsIGNvbnRhY3QgcXVlcmllc1xuICovXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZUNvbnRhY3RRdWVyaWVzID0gKCk6IHZvaWQgPT4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KClcbiAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogY29udGFjdEtleXMuYWxsIH0pXG59XG5cbi8qKlxuICogUHJlZmV0Y2ggY29udGFjdHMgZm9yIGEgbG9jYXRpb24gKHVzZWZ1bCBmb3IgaG92ZXIgc3RhdGVzKVxuICovXG5leHBvcnQgY29uc3QgcHJlZmV0Y2hDb250YWN0c0J5TG9jYXRpb24gPSBhc3luYyAobG9jYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKVxuICBhd2FpdCBxdWVyeUNsaWVudC5wcmVmZXRjaFF1ZXJ5KHtcbiAgICBxdWVyeUtleTogY29udGFjdEtleXMuYnlMb2NhdGlvbihsb2NhdGlvbklkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRhY3RzQXBpLmdldEJ5TG9jYXRpb24obG9jYXRpb25JZClcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhXG4gICAgfSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG4iLCJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKX1lbHNlIGZvcihmIGluIGUpZVtmXSYmKG4mJihuKz1cIiBcIiksbis9Zik7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiLG89YXJndW1lbnRzLmxlbmd0aDtmPG87ZisrKShlPWFyZ3VtZW50c1tmXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgTG9hZGluZ1NwaW5uZXJQcm9wcyB7XG4gIHNpemU/OiAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnXG4gIGNvbG9yPzogJ3ByaW1hcnknIHwgJ3NlY29uZGFyeScgfCAnd2hpdGUnXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBsYWJlbD86IHN0cmluZ1xufVxuXG5jb25zdCBzaXplQ2xhc3NlcyA9IHtcbiAgc206ICd3LTQgaC00IGJvcmRlci0yJyxcbiAgbWQ6ICd3LTYgaC02IGJvcmRlci0yJyxcbiAgbGc6ICd3LTggaC04IGJvcmRlci0zJyxcbiAgeGw6ICd3LTEyIGgtMTIgYm9yZGVyLTQnXG59XG5cbmNvbnN0IGNvbG9yQ2xhc3NlcyA9IHtcbiAgcHJpbWFyeTogJ2JvcmRlci1tZWMtcHJpbWFyeS8yMCBib3JkZXItdC1tZWMtcHJpbWFyeScsXG4gIHNlY29uZGFyeTogJ2JvcmRlci10ZXh0LW11dGVkLzIwIGJvcmRlci10LXRleHQtbXV0ZWQnLFxuICB3aGl0ZTogJ2JvcmRlci13aGl0ZS8yMCBib3JkZXItdC13aGl0ZSdcbn1cblxuZXhwb3J0IGNvbnN0IExvYWRpbmdTcGlubmVyOiBSZWFjdC5GQzxMb2FkaW5nU3Bpbm5lclByb3BzPiA9ICh7XG4gIHNpemUgPSAnbWQnLFxuICBjb2xvciA9ICdwcmltYXJ5JyxcbiAgY2xhc3NOYW1lLFxuICBsYWJlbCA9ICdMw6RkdC4uLidcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IFxuICAgICAgY2xhc3NOYW1lPXtjbHN4KCdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTInLCBjbGFzc05hbWUpfVxuICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAnYW5pbWF0ZS1zcGluIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgY29sb3JDbGFzc2VzW2NvbG9yXVxuICAgICAgICApfVxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgLz5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gU2tlbGV0b24gbG9hZGluZyBjb21wb25lbnQgZm9yIGNvbnRlbnQgcGxhY2Vob2xkZXJzXG5pbnRlcmZhY2UgU2tlbGV0b25Qcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICB2YXJpYW50PzogJ3RleHQnIHwgJ3JlY3Rhbmd1bGFyJyB8ICdjaXJjdWxhcidcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXJcbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyXG4gIGxpbmVzPzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBTa2VsZXRvbjogUmVhY3QuRkM8U2tlbGV0b25Qcm9wcz4gPSAoe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQgPSAndGV4dCcsXG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIGxpbmVzID0gMVxufSkgPT4ge1xuICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdsb2FkaW5nLXNrZWxldG9uJ1xuICBcbiAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB7XG4gICAgdGV4dDogJ2gtNCByb3VuZGVkJyxcbiAgICByZWN0YW5ndWxhcjogJ3JvdW5kZWQtbWVjJyxcbiAgICBjaXJj
25114dWxhcjogJ3JvdW5kZWQtZnVsbCdcbiAgfVxuXG4gIGNvbnN0IHN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge31cbiAgaWYgKHdpZHRoKSBzdHlsZS53aWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgPyBgJHt3aWR0aH1weGAgOiB3aWR0aFxuICBpZiAoaGVpZ2h0KSBzdHlsZS5oZWlnaHQgPSB0eXBlb2YgaGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke2hlaWdodH1weGAgOiBoZWlnaHRcblxuICBpZiAodmFyaWFudCA9PT0gJ3RleHQnICYmIGxpbmVzID4gMSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeCgnc3BhY2UteS0yJywgY2xhc3NOYW1lKX0+XG4gICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiBsaW5lcyB9KS5tYXAoKF8sIGluZGV4KSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChiYXNlQ2xhc3NlcywgdmFyaWFudENsYXNzZXNbdmFyaWFudF0pfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgIHdpZHRoOiBpbmRleCA9PT0gbGluZXMgLSAxID8gJzc1JScgOiAnMTAwJSdcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChiYXNlQ2xhc3NlcywgdmFyaWFudENsYXNzZXNbdmFyaWFudF0sIGNsYXNzTmFtZSl9XG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgLz5cbiAgKVxufVxuXG4vLyBMb2FkaW5nIG92ZXJsYXkgY29tcG9uZW50XG5pbnRlcmZhY2UgTG9hZGluZ092ZXJsYXlQcm9wcyB7XG4gIGlzVmlzaWJsZTogYm9vbGVhblxuICBtZXNzYWdlPzogc3RyaW5nXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTG9hZGluZ092ZXJsYXk6IFJlYWN0LkZDPExvYWRpbmdPdmVybGF5UHJvcHM+ID0gKHtcbiAgaXNWaXNpYmxlLFxuICBtZXNzYWdlID0gJ0zDpGR0Li4uJyxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGlmICghaXNWaXNpYmxlKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAnYWJzb2x1dGUgaW5zZXQtMCBiZy13aGl0ZS84MCBiYWNrZHJvcC1ibHVyLXNtJyxcbiAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHotNTAnLFxuICAgICAgICAnYW5pbWF0ZS1pbiBmYWRlLWluIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPVwibGdcIiAvPlxuICAgICAgICB7bWVzc2FnZSAmJiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMyB0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgIHttZXNzYWdlfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbi8vIExvYWRpbmcgY2FyZCBjb21wb25lbnQgZm9yIGdyaWQgbGF5b3V0c1xuaW50ZXJmYWNlIExvYWRpbmdDYXJkUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc2hvd0ltYWdlPzogYm9vbGVhblxuICBzaG93VGl0bGU/OiBib29sZWFuXG4gIHNob3dEZXNjcmlwdGlvbj86IGJvb2xlYW5cbiAgbGluZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGNvbnN0IExvYWRpbmdDYXJkOiBSZWFjdC5GQzxMb2FkaW5nQ2FyZFByb3BzPiA9ICh7XG4gIGNsYXNzTmFtZSxcbiAgc2hvd0ltYWdlID0gdHJ1ZSxcbiAgc2hvd1RpdGxlID0gdHJ1ZSxcbiAgc2hvd0Rlc2NyaXB0aW9uID0gdHJ1ZSxcbiAgbGluZXMgPSAyXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2NhcmQgcC00IHNwYWNlLXktMycsIGNsYXNzTmFtZSl9PlxuICAgICAge3Nob3dJbWFnZSAmJiAoXG4gICAgICAgIDxTa2VsZXRvbiB2YXJpYW50PVwicmVjdGFuZ3VsYXJcIiBoZWlnaHQ9ezEyMH0gLz5cbiAgICAgICl9XG4gICAgICBcbiAgICAgIHtzaG93VGl0bGUgJiYgKFxuICAgICAgICA8U2tlbGV0b24gdmFyaWFudD1cInRleHRcIiB3aWR0aD1cIjc1JVwiIC8+XG4gICAgICApfVxuICAgICAgXG4gICAgICB7c2hvd0Rlc2NyaXB0aW9uICYmIChcbiAgICAgICAgPFNrZWxldG9uIHZhcmlhbnQ9XCJ0ZXh0XCIgbGluZXM9e2xpbmVzfSAvPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyBMb2FkaW5nIGxpc3QgY29tcG9uZW50XG5pbnRlcmZhY2UgTG9hZGluZ0xpc3RQcm9wcyB7XG4gIGl0ZW1zPzogbnVtYmVyXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTG9hZGluZ0xpc3Q6IFJlYWN0LkZDPExvYWRpbmdMaXN0UHJvcHM+ID0gKHtcbiAgaXRlbXMgPSAzLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeCgnc3BhY2UteS0zJywgY2xhc3NOYW1lKX0+XG4gICAgICB7QXJyYXkuZnJvbSh7IGxlbmd0aDogaXRlbXMgfSkubWFwKChfLCBpbmRleCkgPT4gKFxuICAgICAgICA8ZGl2IGtleT17aW5kZXh9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyBwLTMgYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHJvdW5kZWQtbWVjXCI+XG4gICAgICAgICAgPFNrZWxldG9uIHZhcmlhbnQ9XCJjaXJjdWxhclwiIHdpZHRoPXs0MH0gaGVpZ2h0PXs0MH0gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBzcGFjZS15LTJcIj5cbiAgICAgICAgICAgIDxTa2VsZXRvbiB2YXJpYW50PVwidGV4dFwiIHdpZHRoPVwiNjAlXCIgLz5cbiAgICAgICAgICAgIDxTa2VsZXRvbiB2YXJpYW50PVwidGV4dFwiIHdpZHRoPVwiNDAlXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBkZWZhdWx0QXR0cmlidXRlcyA9IHtcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgd2lkdGg6IDI0LFxuICBoZWlnaHQ6IDI0LFxuICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICBzdHJva2VXaWR0aDogMixcbiAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG59O1xuXG5leHBvcnQgeyBkZWZhdWx0QXR0cmlidXRlcyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZhdWx0QXR0cmlidXRlcy5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgeyBmb3J3YXJkUmVmLCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRlZmF1bHRBdHRyaWJ1dGVzIGZyb20gJy4vZGVmYXVsdEF0dHJpYnV0ZXMuanMnO1xuXG5jb25zdCB0b0tlYmFiQ2FzZSA9IChzdHJpbmcpID0+IHN0cmluZy5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuY29uc3QgY3JlYXRlTHVjaWRlSWNvbiA9IChpY29uTmFtZSwgaWNvbk5vZGUpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gZm9yd2FyZFJlZihcbiAgICAoeyBjb2xvciA9IFwiY3VycmVudENvbG9yXCIsIHNpemUgPSAyNCwgc3Ryb2tlV2lkdGggPSAyLCBhYnNvbHV0ZVN0cm9rZVdpZHRoLCBjbGFzc05hbWUgPSBcIlwiLCBjaGlsZHJlbiwgLi4ucmVzdCB9
25114LCByZWYpID0+IGNyZWF0ZUVsZW1lbnQoXG4gICAgICBcInN2Z1wiLFxuICAgICAge1xuICAgICAgICByZWYsXG4gICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGVzLFxuICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICBzdHJva2U6IGNvbG9yLFxuICAgICAgICBzdHJva2VXaWR0aDogYWJzb2x1dGVTdHJva2VXaWR0aCA/IE51bWJlcihzdHJva2VXaWR0aCkgKiAyNCAvIE51bWJlcihzaXplKSA6IHN0cm9rZVdpZHRoLFxuICAgICAgICBjbGFzc05hbWU6IFtcImx1Y2lkZVwiLCBgbHVjaWRlLSR7dG9LZWJhYkNhc2UoaWNvbk5hbWUpfWAsIGNsYXNzTmFtZV0uam9pbihcIiBcIiksXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIC4uLmljb25Ob2RlLm1hcCgoW3RhZywgYXR0cnNdKSA9PiBjcmVhdGVFbGVtZW50KHRhZywgYXR0cnMpKSxcbiAgICAgICAgLi4uQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbiA6IFtjaGlsZHJlbl1cbiAgICAgIF1cbiAgICApXG4gICk7XG4gIENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGAke2ljb25OYW1lfWA7XG4gIHJldHVybiBDb21wb25lbnQ7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVMdWNpZGVJY29uIGFzIGRlZmF1bHQsIHRvS2ViYWJDYXNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVMdWNpZGVJY29uLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBBbGVydENpcmNsZSA9IGNyZWF0ZUx1Y2lkZUljb24oXCJBbGVydENpcmNsZVwiLCBbXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEyXCIsIHI6IFwiMTBcIiwga2V5OiBcIjFtZ2xheVwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeDI6IFwiMTJcIiwgeTE6IFwiOFwiLCB5MjogXCIxMlwiLCBrZXk6IFwiMXBrZXVoXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMlwiLCB4MjogXCIxMi4wMVwiLCB5MTogXCIxNlwiLCB5MjogXCIxNlwiLCBrZXk6IFwiNGRmcTkwXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBBbGVydENpcmNsZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGVydC1jaXJjbGUuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IEFsZXJ0VHJpYW5nbGUgPSBjcmVhdGVMdWNpZGVJY29uKFwiQWxlcnRUcmlhbmdsZVwiLCBbXG4gIFtcbiAgICBcInBhdGhcIixcbiAgICB7XG4gICAgICBkOiBcIm0yMS43MyAxOC04LTE0YTIgMiAwIDAgMC0zLjQ4IDBsLTggMTRBMiAyIDAgMCAwIDQgMjFoMTZhMiAyIDAgMCAwIDEuNzMtM1pcIixcbiAgICAgIGtleTogXCJjM3NraTRcIlxuICAgIH1cbiAgXSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTEyIDl2NFwiLCBrZXk6IFwianV6cHU3XCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xMiAxN2guMDFcIiwga2V5OiBcInAzMnAwNVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgQWxlcnRUcmlhbmdsZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGVydC10cmlhbmdsZS5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgQXJyb3dSaWdodCA9IGNyZWF0ZUx1Y2lkZUljb24oXCJBcnJvd1JpZ2h0XCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTUgMTJoMTRcIiwga2V5OiBcIjFheXMwaFwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJtMTIgNSA3IDctNyA3XCIsIGtleTogXCJ4cXV6NGNcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEFycm93UmlnaHQgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyb3ctcmlnaHQuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IEJ1aWxkaW5nMiA9IGNyZWF0ZUx1Y2lkZUljb24oXCJCdWlsZGluZzJcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNNiAyMlY0YTIgMiAwIDAgMSAyLTJoOGEyIDIgMCAwIDEgMiAydjE4WlwiLCBrZXk6IFwiMWI0cW1mXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk02IDEySDRhMiAyIDAgMCAwLTIgMnY2YTIgMiAwIDAgMCAyIDJoMlwiLCBrZXk6IFwiaTcxcHpkXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xOCA5aDJhMiAyIDAgMCAxIDIgMnY5YTIgMiAwIDAgMS0yIDJoLTJcIiwga2V5OiBcIjEwamVmc1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTAgNmg0XCIsIGtleTogXCIxaXR1bmtcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTEwIDEwaDRcIiwga2V5OiBcInRjZHZyZlwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTAgMTRoNFwiLCBrZXk6IFwia2VscHhyXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xMCAxOGg0XCIsIGtleTogXCIxdWxxNjhcIiB9XVxuXSk7XG5cbmV4cG9ydCB7
25114IEJ1aWxkaW5nMiBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWlsZGluZy0yLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBDaGVja0NpcmNsZSA9IGNyZWF0ZUx1Y2lkZUljb24oXCJDaGVja0NpcmNsZVwiLCBbXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0yMiAxMS4wOFYxMmExMCAxMCAwIDEgMS01LjkzLTkuMTRcIiwga2V5OiBcImc3NzR2cVwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJtOSAxMSAzIDNMMjIgNFwiLCBrZXk6IFwiMXBmbHpsXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBDaGVja0NpcmNsZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVjay1jaXJjbGUuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENoZXZyb25Eb3duID0gY3JlYXRlTHVjaWRlSWNvbihcIkNoZXZyb25Eb3duXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTYgOSA2IDYgNi02XCIsIGtleTogXCJxcnVuc2xcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IENoZXZyb25Eb3duIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoZXZyb24tZG93bi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgQ2hldnJvbkxlZnQgPSBjcmVhdGVMdWNpZGVJY29uKFwiQ2hldnJvbkxlZnRcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJtMTUgMTgtNi02IDYtNlwiLCBrZXk6IFwiMXduZmczXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBDaGV2cm9uTGVmdCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGV2cm9uLWxlZnQuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENoZXZyb25SaWdodCA9IGNyZWF0ZUx1Y2lkZUljb24oXCJDaGV2cm9uUmlnaHRcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJtOSAxOCA2LTYtNi02XCIsIGtleTogXCJtdGhod3FcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IENoZXZyb25SaWdodCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGV2cm9uLXJpZ2h0LmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBDaGV2cm9uVXAgPSBjcmVhdGVMdWNpZGVJY29uKFwiQ2hldnJvblVwXCIsIFtbXCJwYXRoXCIsIHsgZDogXCJtMTggMTUtNi02LTYgNlwiLCBrZXk6IFwiMTUzdWR6XCIgfV1dKTtcblxuZXhwb3J0IHsgQ2hldnJvblVwIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoZXZyb24tdXAuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENsb2NrID0gY3JlYXRlTHVjaWRlSWNvbihcIkNsb2NrXCIsIFtcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiMTJcIiwgY3k6IFwiMTJcIiwgcjogXCIxMFwiLCBrZXk6IFwiMW1nbGF5XCIgfV0sXG4gIFtcInBvbHlsaW5lXCIsIHsgcG9pbnRzOiBcIjEyIDYgMTIgMTIgMTYgMTRcIiwga2V5OiBcIjY4ZXNndlwiIH1dXG5dKTtcblxuZXhwb3J0IHsgQ2xvY2sgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvY2suanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IENyb3NzaGFpciA9IGNyZWF0ZUx1Y2lkZUljb24oXCJDcm9zc2hhaXJcIiwgW1xuICBbXCJjaXJjbGVcIiwgeyBjeDogXCIxMlwiLCBjeTogXCIxMlwiLCByOiBcIjEwXCIsIGtleTogXCIxbWdsYXlcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjIyXCIsIHgyOiBcIjE4XCIsIHkxOiBcIjEyXCIsIHkyOiBcIjEyXCIsIGtleTogXCJsOWJjc2lcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjZcIiwgeDI6IFwiMlwiLCB5MTogXCIxMlwiLCB5MjogXCIxMlwiLCBrZXk6IFwiMTNoaGt4XCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMlwiLCB4MjogXCIxMlwiLCB5MTogXCI2XCIsIHkyOiBcIjJcIiwga2V5OiBcIjEwdzNmM1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeDI6IFwiMTJcIiwgeTE6IFwiMjJcIiwgeTI6IFwiMThcIiwga2V5OiBcIjE1ZzlrcVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgQ3Jvc3NoYWlyIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyb3NzaGFpci5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgRGF0YWJhc2UgPSBjcmVhdGVMdWNpZGVJY29uKFwiRGF0YWJhc2VcIiwgW1xuICBbXCJlbGxpcHNlXCIsIHsgY3g6IFwiMTJcIiwgY3k6IFwiNVwiLCByeDogXCI5XCIsIHJ5OiBcIjNcIiwga2V5OiBcIm1zc2x3elwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMyA1VjE5QTkgMyAwIDAgMCAyMSAxOVY1XCIsIGtleTogXCIxd2xlbDdcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTMgMTJBOSAzIDAgMCAwIDIxIDEyXCIsIGtleTogXCJtdjdrZTRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7
25114IERhdGFiYXNlIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGFiYXNlLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBFeHRlcm5hbExpbmsgPSBjcmVhdGVMdWNpZGVJY29uKFwiRXh0ZXJuYWxMaW5rXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDZcIiwga2V5OiBcImE2eHFxcFwiIH1dLFxuICBbXCJwb2x5bGluZVwiLCB7IHBvaW50czogXCIxNSAzIDIxIDMgMjEgOVwiLCBrZXk6IFwibXpueWFkXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMFwiLCB4MjogXCIyMVwiLCB5MTogXCIxNFwiLCB5MjogXCIzXCIsIGtleTogXCIxOGMzczRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEV4dGVybmFsTGluayBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHRlcm5hbC1saW5rLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBHbG9iZSA9IGNyZWF0ZUx1Y2lkZUljb24oXCJHbG9iZVwiLCBbXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEyXCIsIHI6IFwiMTBcIiwga2V5OiBcIjFtZ2xheVwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTIgMmExNC41IDE0LjUgMCAwIDAgMCAyMCAxNC41IDE0LjUgMCAwIDAgMC0yMFwiLCBrZXk6IFwiMTNvMXpsXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0yIDEyaDIwXCIsIGtleTogXCI5aTRwdTRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEdsb2JlIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JlLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBHcmlkM3gzID0gY3JlYXRlTHVjaWRlSWNvbihcIkdyaWQzeDNcIiwgW1xuICBbXCJyZWN0XCIsIHsgd2lkdGg6IFwiMThcIiwgaGVpZ2h0OiBcIjE4XCIsIHg6IFwiM1wiLCB5OiBcIjNcIiwgcng6IFwiMlwiLCBrZXk6IFwiYWZpdHY3XCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0zIDloMThcIiwga2V5OiBcIjFwdWRjdFwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMyAxNWgxOFwiLCBrZXk6IFwiNXhzaHVwXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk05IDN2MThcIiwga2V5OiBcImZoM2hxYVwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTUgM3YxOFwiLCBrZXk6IFwiMTRudnAwXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBHcmlkM3gzIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyaWQtM3gzLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBIb21lID0gY3JlYXRlTHVjaWRlSWNvbihcIkhvbWVcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJtMyA5IDktNyA5IDd2MTFhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6XCIsIGtleTogXCJ5NWRrYTRcIiB9XSxcbiAgW1wicG9seWxpbmVcIiwgeyBwb2ludHM6IFwiOSAyMiA5IDEyIDE1IDEyIDE1IDIyXCIsIGtleTogXCJlMnVzMDhcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IEhvbWUgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aG9tZS5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgTGF5ZXJzID0gY3JlYXRlTHVjaWRlSWNvbihcIkxheWVyc1wiLCBbXG4gIFtcbiAgICBcInBhdGhcIixcbiAgICB7XG4gICAgICBkOiBcIm0xMi44MyAyLjE4YTIgMiAwIDAgMC0xLjY2IDBMMi42IDYuMDhhMSAxIDAgMCAwIDAgMS44M2w4LjU4IDMuOTFhMiAyIDAgMCAwIDEuNjYgMGw4LjU4LTMuOWExIDEgMCAwIDAgMC0xLjgzWlwiLFxuICAgICAga2V5OiBcIjhiOTd4d1wiXG4gICAgfVxuICBdLFxuICBbXCJwYXRoXCIsIHsgZDogXCJtMjIgMTcuNjUtOS4xNyA0LjE2YTIgMiAwIDAgMS0xLjY2IDBMMiAxNy42NVwiLCBrZXk6IFwiZGQ2enNxXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIm0yMiAxMi42NS05LjE3IDQuMTZhMiAyIDAgMCAxLTEuNjYgMEwyIDEyLjY1XCIsIGtleTogXCJlcDlmcnVcIiB9XVxuXSk7XG5cbmV4cG9ydCB7
25114IExheWVycyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXllcnMuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IExpc3QgPSBjcmVhdGVMdWNpZGVJY29uKFwiTGlzdFwiLCBbXG4gIFtcImxpbmVcIiwgeyB4MTogXCI4XCIsIHgyOiBcIjIxXCIsIHkxOiBcIjZcIiwgeTI6IFwiNlwiLCBrZXk6IFwiN2V5OHBjXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCI4XCIsIHgyOiBcIjIxXCIsIHkxOiBcIjEyXCIsIHkyOiBcIjEyXCIsIGtleTogXCJyamZibGNcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjhcIiwgeDI6IFwiMjFcIiwgeTE6IFwiMThcIiwgeTI6IFwiMThcIiwga2V5OiBcImMzYjFtOFwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiM1wiLCB4MjogXCIzLjAxXCIsIHkxOiBcIjZcIiwgeTI6IFwiNlwiLCBrZXk6IFwiMWc3Z3EzXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIzXCIsIHgyOiBcIjMuMDFcIiwgeTE6IFwiMTJcIiwgeTI6IFwiMTJcIiwga2V5OiBcIjFwamx2a1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiM1wiLCB4MjogXCIzLjAxXCIsIHkxOiBcIjE4XCIsIHkyOiBcIjE4XCIsIGtleTogXCIyOHQybWNcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IExpc3QgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlzdC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgTG9hZGVyMiA9IGNyZWF0ZUx1Y2lkZUljb24oXCJMb2FkZXIyXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIxIDEyYTkgOSAwIDEgMS02LjIxOS04LjU2XCIsIGtleTogXCIxM3phbGRcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IExvYWRlcjIgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9hZGVyLTIuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IE1haWwgPSBjcmVhdGVMdWNpZGVJY29uKFwiTWFpbFwiLCBbXG4gIFtcInJlY3RcIiwgeyB3aWR0aDogXCIyMFwiLCBoZWlnaHQ6IFwiMTZcIiwgeDogXCIyXCIsIHk6IFwiNFwiLCByeDogXCIyXCIsIGtleTogXCIxOG4zazFcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDdcIiwga2V5OiBcIjFvY3JnM1wiIH1dXG5dKTtcblxuZXhwb3J0IHsgTWFpbCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWlsLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBNYXBQaW4gPSBjcmVhdGVMdWNpZGVJY29uKFwiTWFwUGluXCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIwIDEwYzAgNi04IDEyLTggMTJzLTgtNi04LTEyYTggOCAwIDAgMSAxNiAwWlwiLCBrZXk6IFwiMm9lOWZ1XCIgfV0sXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEwXCIsIHI6IFwiM1wiLCBrZXk6IFwiaWxxaHI3XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBNYXBQaW4gYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwLXBpbi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgTWFwID0gY3JlYXRlTHVjaWRlSWNvbihcIk1hcFwiLCBbXG4gIFtcInBvbHlnb25cIiwgeyBwb2ludHM6IFwiMyA2IDkgMyAxNSA2IDIxIDMgMjEgMTggMTUgMjEgOSAxOCAzIDIxXCIsIGtleTogXCJvazJpZThcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjlcIiwgeDI6IFwiOVwiLCB5MTogXCIzXCIsIHkyOiBcIjE4XCIsIGtleTogXCJ3MzRxejVcIiB9XSxcbiAgW1wibGluZVwiLCB7IHgxOiBcIjE1XCIsIHgyOiBcIjE1XCIsIHkxOiBcIjZcIiwgeTI6IFwiMjFcIiwga2V5OiBcInZvbHY5YVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgTWFwIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgUGhvbmUgPSBjcmVhdGVMdWNpZGVJY29uKFwiUGhvbmVcIiwgW1xuICBbXG4gICAgXCJwYXRoXCIsXG4gICAge1xuICAgICAgZDogXCJNMjIgMTYuOTJ2M2EyIDIgMCAwIDEtMi4xOCA
25114yIDE5Ljc5IDE5Ljc5IDAgMCAxLTguNjMtMy4wNyAxOS41IDE5LjUgMCAwIDEtNi02IDE5Ljc5IDE5Ljc5IDAgMCAxLTMuMDctOC42N0EyIDIgMCAwIDEgNC4xMSAyaDNhMiAyIDAgMCAxIDIgMS43MiAxMi44NCAxMi44NCAwIDAgMCAuNyAyLjgxIDIgMiAwIDAgMS0uNDUgMi4xMUw4LjA5IDkuOTFhMTYgMTYgMCAwIDAgNiA2bDEuMjctMS4yN2EyIDIgMCAwIDEgMi4xMS0uNDUgMTIuODQgMTIuODQgMCAwIDAgMi44MS43QTIgMiAwIDAgMSAyMiAxNi45MnpcIixcbiAgICAgIGtleTogXCJmb2lxcjVcIlxuICAgIH1cbiAgXVxuXSk7XG5cbmV4cG9ydCB7IFBob25lIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBob25lLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBSZWZyZXNoQ3cgPSBjcmVhdGVMdWNpZGVJY29uKFwiUmVmcmVzaEN3XCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTMgMTJhOSA5IDAgMCAxIDktOSA5Ljc1IDkuNzUgMCAwIDEgNi43NCAyLjc0TDIxIDhcIiwga2V5OiBcInY5aDV2Y1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMjEgM3Y1aC01XCIsIGtleTogXCIxcTd0bzBcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIxIDEyYTkgOSAwIDAgMS05IDkgOS43NSA5Ljc1IDAgMCAxLTYuNzQtMi43NEwzIDE2XCIsIGtleTogXCIzdWlmbDNcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTggMTZIM3Y1XCIsIGtleTogXCIxY3Y2NzhcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFJlZnJlc2hDdyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWZyZXNoLWN3LmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBSb3RhdGVDY3cgPSBjcmVhdGVMdWNpZGVJY29uKFwiUm90YXRlQ2N3XCIsIFtcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTMgMTJhOSA5IDAgMSAwIDktOSA5Ljc1IDkuNzUgMCAwIDAtNi43NCAyLjc0TDMgOFwiLCBrZXk6IFwiMTM1N2UzXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0zIDN2NWg1XCIsIGtleTogXCIxeGhxOGFcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFJvdGF0ZUNjdyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGUtY2N3LmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBTZWFyY2ggPSBjcmVhdGVMdWNpZGVJY29uKFwiU2VhcmNoXCIsIFtcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiMTFcIiwgY3k6IFwiMTFcIiwgcjogXCI4XCIsIGtleTogXCI0ZWo5N3VcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTIxIDIxLTQuMy00LjNcIiwga2V5OiBcIjFxaWUzcVwiIH1dXG5dKTtcblxuZXhwb3J0IHsgU2VhcmNoIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlYXJjaC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgU2V0dGluZ3MgPSBjcmVhdGVMdWNpZGVJY29uKFwiU2V0dGluZ3NcIiwgW1xuICBbXG4gICAgXCJwYXRoXCIsXG4gICAge1xuICAgICAgZDogXCJNMTIuMjIgMmgtLjQ0YTIgMiAwIDAgMC0yIDJ2LjE4YTIgMiAwIDAgMS0xIDEuNzNsLS40My4yNWEyIDIgMCAwIDEtMiAwbC0uMTUtLjA4YTIgMiAwIDAgMC0yLjczLjczbC0uMjIuMzhhMiAyIDAgMCAwIC43MyAyLjczbC4xNS4xYTIgMiAwIDAgMSAxIDEuNzJ2LjUxYTIgMiAwIDAgMS0xIDEuNzRsLS4xNS4wOWEyIDIgMCAwIDAtLjczIDIuNzNsLjIyLjM4YTIgMiAwIDAgMCAyLjczLjczbC4xNS0uMDhhMiAyIDAgMCAxIDIgMGwuNDMuMjVhMiAyIDAgMCAxIDEgMS43M1YyMGEyIDIgMCAwIDAgMiAyaC40NGEyIDIgMCAwIDAgMi0ydi0uMThhMiAyIDAgMCAxIDEtMS43M2wuNDMtLjI1YTIgMiAwIDAgMSAyIDBsLjE1LjA4YTIgMiAwIDAgMCAyLjczLS43M2wuMjItLjM5YTIgMiAwIDAgMC0uNzMtMi43M2wtLjE1LS4wOGEyIDIgMCAwIDEtMS0xLjc0di0uNWEyIDIgMCAwIDEgMS0xLjc0bC4xNS0uMDlhMiAyIDAgMCAwIC43My0yLjczbC0uMjItLjM4YTIgMiAwIDAgMC0yLjczLS43M2wtLjE1LjA4YTIgMiAwIDAgMS0yIDBsLS40My0uMjVhMiAyIDAgMCAxLTEtMS43M1Y0YTIgMiAwIDAgMC0yLTJ6XCIsXG4gICAgICBrZXk6IFwiMXFtZTJmXCJcbiAgICB9XG4gIF0sXG4gIFtcImNpcmNsZVwiLCB7IGN4OiBcIjEyXCIsIGN5OiBcIjEyXCIsIHI6IFwiM1wiLCBrZXk6IFwiMXY3enJkXCIgfV1cbl0pO1xuXG5leHBvcnQgeyBTZXR0aW5ncyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXR0aW5ncy5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgbHVjaWRlLXJlYWN0IHYwLjI5NC4wIC0gSVNDXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuXG4gKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uLmpzJztcblxuY29uc3QgU2hvcHBpbmdCYWcgPSBjcmVhdGVMdWNpZGVJY29uKFwiU2hvcHBpbmdCYWdcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNNiAyIDMgNnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiA
25114wIDAgMCAyLTJWNmwtMy00WlwiLCBrZXk6IFwiaG91OXAwXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0zIDZoMThcIiwga2V5OiBcImQwd20walwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTYgMTBhNCA0IDAgMCAxLTggMFwiLCBrZXk6IFwiMWx0dml3XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBTaG9wcGluZ0JhZyBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaG9wcGluZy1iYWcuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IFVzZXIgPSBjcmVhdGVMdWNpZGVJY29uKFwiVXNlclwiLCBbXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyXCIsIGtleTogXCI5NzVrZWxcIiB9XSxcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiMTJcIiwgY3k6IFwiN1wiLCByOiBcIjRcIiwga2V5OiBcIjE3eXMwZFwiIH1dXG5dKTtcblxuZXhwb3J0IHsgVXNlciBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VyLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBVc2VycyA9IGNyZWF0ZUx1Y2lkZUljb24oXCJVc2Vyc1wiLCBbXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xNiAyMXYtMmE0IDQgMCAwIDAtNC00SDZhNCA0IDAgMCAwLTQgNHYyXCIsIGtleTogXCIxeXlpdHFcIiB9XSxcbiAgW1wiY2lyY2xlXCIsIHsgY3g6IFwiOVwiLCBjeTogXCI3XCIsIHI6IFwiNFwiLCBrZXk6IFwibnVmazhcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODdcIiwga2V5OiBcImtzaGVnZFwiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMTYgMy4xM2E0IDQgMCAwIDEgMCA3Ljc1XCIsIGtleTogXCIxZGE5Y2VcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFVzZXJzIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZXJzLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBXaWZpT2ZmID0gY3JlYXRlTHVjaWRlSWNvbihcIldpZmlPZmZcIiwgW1xuICBbXCJsaW5lXCIsIHsgeDE6IFwiMlwiLCB4MjogXCIyMlwiLCB5MTogXCIyXCIsIHkyOiBcIjIyXCIsIGtleTogXCJhNnA2dWpcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTguNSAxNi41YTUgNSAwIDAgMSA3IDBcIiwga2V5OiBcInNlajUyN1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMiA4LjgyYTE1IDE1IDAgMCAxIDQuMTctMi42NVwiLCBrZXk6IFwiMTF1dHExXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk0xMC42NiA1YzQuMDEtLjM2IDguMTQuOSAxMS4zNCAzLjc2XCIsIGtleTogXCJoeGVmZHVcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTE2Ljg1IDExLjI1YTEwIDEwIDAgMCAxIDIuMjIgMS42OFwiLCBrZXk6IFwicTczNGtuXCIgfV0sXG4gIFtcInBhdGhcIiwgeyBkOiBcIk01IDEzYTEwIDEwIDAgMCAxIDUuMjQtMi43NlwiLCBrZXk6IFwicGlxNHlsXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCIxMlwiLCB4MjogXCIxMi4wMVwiLCB5MTogXCIyMFwiLCB5MjogXCIyMFwiLCBrZXk6IFwib2Y0YmM0XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBXaWZpT2ZmIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdpZmktb2ZmLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBXaWZpID0gY3JlYXRlTHVjaWRlSWNvbihcIldpZmlcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNNSAxM2ExMCAxMCAwIDAgMSAxNCAwXCIsIGtleTogXCI2djhqNTFcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwiTTguNSAxNi41YTUgNSAwIDAgMSA3IDBcIiwga2V5OiBcInNlajUyN1wiIH1dLFxuICBbXCJwYXRoXCIsIHsgZDogXCJNMiA4LjgyYTE1IDE1IDAgMCAxIDIwIDBcIiwga2V5OiBcImRucHIyelwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeDI6IFwiMTIuMDFcIiwgeTE6IFwiMjBcIiwgeTI6IFwiMjBcIiwga2V5OiBcIm9mNGJjNFwiIH1dXG5dKTtcblxuZXhwb3J0IHsgV2lmaSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aWZpLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBYID0gY3JlYXRlTHVjaWRlSWNvbihcIlhcIiwgW1xuICBbXCJwYXRoXCIsIHsgZDogXCJNMTggNiA2IDE4XCIsIGtleTogXCIxYmw1ZjhcIiB9XSxcbiAgW1wicGF0aFwiLCB7IGQ6IFwibTYgNiAxMiAxMlwiLCBrZXk6IFwiZDhiazZ2XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBYIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXguanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIGx1Y2lkZS1yZWFjdCB2MC4yOTQuMCAtIElTQ1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlLlxuICogU2VlIH
25114RoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbi5qcyc7XG5cbmNvbnN0IFpvb21JbiA9IGNyZWF0ZUx1Y2lkZUljb24oXCJab29tSW5cIiwgW1xuICBbXCJjaXJjbGVcIiwgeyBjeDogXCIxMVwiLCBjeTogXCIxMVwiLCByOiBcIjhcIiwga2V5OiBcIjRlajk3dVwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMjFcIiwgeDI6IFwiMTYuNjVcIiwgeTE6IFwiMjFcIiwgeTI6IFwiMTYuNjVcIiwga2V5OiBcIjEzZ2o3Y1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMTFcIiwgeDI6IFwiMTFcIiwgeTE6IFwiOFwiLCB5MjogXCIxNFwiLCBrZXk6IFwiMXZtc2twXCIgfV0sXG4gIFtcImxpbmVcIiwgeyB4MTogXCI4XCIsIHgyOiBcIjE0XCIsIHkxOiBcIjExXCIsIHkyOiBcIjExXCIsIGtleTogXCJkdXJ5bXVcIiB9XVxuXSk7XG5cbmV4cG9ydCB7IFpvb21JbiBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD16b29tLWluLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBsdWNpZGUtcmVhY3QgdjAuMjk0LjAgLSBJU0NcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS5cbiAqIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24uanMnO1xuXG5jb25zdCBab29tT3V0ID0gY3JlYXRlTHVjaWRlSWNvbihcIlpvb21PdXRcIiwgW1xuICBbXCJjaXJjbGVcIiwgeyBjeDogXCIxMVwiLCBjeTogXCIxMVwiLCByOiBcIjhcIiwga2V5OiBcIjRlajk3dVwiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiMjFcIiwgeDI6IFwiMTYuNjVcIiwgeTE6IFwiMjFcIiwgeTI6IFwiMTYuNjVcIiwga2V5OiBcIjEzZ2o3Y1wiIH1dLFxuICBbXCJsaW5lXCIsIHsgeDE6IFwiOFwiLCB4MjogXCIxNFwiLCB5MTogXCIxMVwiLCB5MjogXCIxMVwiLCBrZXk6IFwiZHVyeW11XCIgfV1cbl0pO1xuXG5leHBvcnQgeyBab29tT3V0IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXpvb20tb3V0LmpzLm1hcFxuIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBBbGVydFRyaWFuZ2xlLCBSZWZyZXNoQ3cgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmludGVyZmFjZSBFcnJvckJvdW5kYXJ5UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gIGZhbGxiYWNrPzogUmVhY3ROb2RlXG4gIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBlcnJvckluZm86IFJlYWN0LkVycm9ySW5mbykgPT4gdm9pZFxuICBzaG93RGV0YWlscz86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBFcnJvckJvdW5kYXJ5U3RhdGUge1xuICBoYXNFcnJvcjogYm9vbGVhblxuICBlcnJvcj86IEVycm9yXG4gIGVycm9ySW5mbz86IFJlYWN0LkVycm9ySW5mb1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudDxFcnJvckJvdW5kYXJ5UHJvcHMsIEVycm9yQm91bmRhcnlTdGF0ZT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogRXJyb3JCb3VuZGFyeVByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5zdGF0ZSA9IHsgaGFzRXJyb3I6IGZhbHNlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogRXJyb3JCb3VuZGFyeVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3I6IHRydWUsXG4gICAgICBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZENhdGNoKGVycm9yOiBFcnJvciwgZXJyb3JJbmZvOiBSZWFjdC5FcnJvckluZm8pIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGVycm9yLFxuICAgICAgZXJyb3JJbmZvXG4gICAgfSlcblxuICAgIC8vIExvZyBlcnJvclxuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yQm91bmRhcnkgY2F1Z2h0IGFuIGVycm9yOicsIGVycm9yLCBlcnJvckluZm8pXG5cbiAgICAvLyBDYWxsIGN1c3RvbSBlcnJvciBoYW5kbGVyXG4gICAgdGhpcy5wcm9wcy5vbkVycm9yPy4oZXJyb3IsIGVycm9ySW5mbylcblxuICAgIC8vIEluIHByb2R1Y3Rpb24sIHNlbmQgdG8gZXJyb3IgcmVwb3J0aW5nIHNlcnZpY2VcbiAgICBpZiAoaW1wb3J0Lm1ldGEuZW52LlBST0QpIHtcbiAgICAgIC8vIFRPRE86IFNlbmQgdG8gU2VudHJ5IG9yIHNpbWlsYXJcbiAgICAgIC8vIFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKGVycm9yLCB7IGNvbnRleHRzOiB7IHJlYWN0OiBlcnJvckluZm8gfSB9KVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVJldHJ5ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBoYXNFcnJvcjogZmFsc2UsIGVycm9yOiB1bmRlZmluZWQsIGVycm9ySW5mbzogdW5kZWZpbmVkIH0pXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHtcbiAgICAgIC8vIEN1c3RvbSBmYWxsYmFjayBVSVxuICAgICAgaWYgKHRoaXMucHJvcHMuZmFsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZmFsbGJhY2tcbiAgICAgIH1cblxuICAgICAgLy8gRGVmYXVsdCBlcnJvciBVSVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BwLTYgdGV4dC1jZW50ZXIgYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1tZWMgYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5ICR7dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJyd9YH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBzcGFjZS15LTRcIj5cbiAgICAgICAgICAgIDxBbGVydFRyaWFuZ2xlIGNsYXNzTmFtZT1cInctMTIgaC0xMiB0ZXh0LXJlZC01MDBcIiAvPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgICAgICAgICBPb3BzISBFdHdhcyBpc3Qgc2NoaWVmZ2VsYXVmZW5cbiAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgIERpZXNlIEtvbXBvbmVudGUga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAge3RoaXMucHJvcHMuc2hvd0RldGFpbHMgJiYgdGhpcy5zdGF0ZS5lcnJvciAmJiAoXG4gICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cInctZnVsbCBtYXgtdy1tZFwiPlxuICAgICAgICAgICAgICAgIDxzdW1tYXJ5IGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIHRleHQtc20gdGV4dC10ZXh0LW11dGVkIGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgIFRlY2huaXNjaGUgRGV0YWlscyBhbnplaWdlblxuICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgcC0zIGJnLXJlZC01MCByb3VuZGVkIGJvcmRlciB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1tb25vIHRleHQtcmVkLTgwMCBicmVhay1hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUuZXJyb3IubWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgI
25114Ht0aGlzLnN0YXRlLmVycm9ySW5mbz8uY29tcG9uZW50U3RhY2sgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzTmFtZT1cIm10LTIgdGV4dC14cyB0ZXh0LXJlZC03MDAgb3ZlcmZsb3ctYXV0byBtYXgtaC0zMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9ySW5mby5jb21wb25lbnRTdGFja31cbiAgICAgICAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlUmV0cnl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxSZWZyZXNoQ3cgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICAgIEVybmV1dCB2ZXJzdWNoZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlblxuICB9XG59XG5cbi8vIEZ1bmN0aW9uYWwgZXJyb3IgYm91bmRhcnkgaG9vayAoZm9yIHVzZSB3aXRoIFJlYWN0IDE4KyBlcnJvciBib3VuZGFyaWVzKVxuZXhwb3J0IGNvbnN0IHVzZUVycm9ySGFuZGxlciA9ICgpID0+IHtcbiAgcmV0dXJuIChlcnJvcjogRXJyb3IsIGVycm9ySW5mbz86IFJlYWN0LkVycm9ySW5mbykgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNhdWdodCBieSBlcnJvciBoYW5kbGVyOicsIGVycm9yLCBlcnJvckluZm8pXG4gICAgXG4gICAgaWYgKGltcG9ydC5tZXRhLmVudi5QUk9EKSB7XG4gICAgICAvLyBUT0RPOiBTZW5kIHRvIGVycm9yIHJlcG9ydGluZyBzZXJ2aWNlXG4gICAgfVxuICB9XG59XG5cbi8vIFNpbXBsZSBlcnJvciBmYWxsYmFjayBjb21wb25lbnRzXG5leHBvcnQgY29uc3QgU2ltcGxlRXJyb3JGYWxsYmFjazogUmVhY3QuRkM8eyBcbiAgZXJyb3I/OiBFcnJvclxuICBvblJldHJ5PzogKCkgPT4gdm9pZCBcbiAgbWVzc2FnZT86IHN0cmluZ1xufT4gPSAoeyBcbiAgZXJyb3IsIFxuICBvblJldHJ5LCBcbiAgbWVzc2FnZSA9ICdFdHdhcyBpc3Qgc2NoaWVmZ2VsYXVmZW4nIFxufSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cInAtNCB0ZXh0LWNlbnRlciBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBib3JkZXIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnkgcm91bmRlZC1tZWNcIj5cbiAgICA8QWxlcnRUcmlhbmdsZSBjbGFzc05hbWU9XCJ3LTggaC04IHRleHQtcmVkLTUwMCBteC1hdXRvIG1iLTJcIiAvPlxuICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtODAwIG1iLTNcIj57bWVzc2FnZX08L3A+XG4gICAge2Vycm9yICYmIChcbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1yZWQtNjAwIG1iLTMgZm9udC1tb25vXCI+XG4gICAgICAgIHtlcnJvci5tZXNzYWdlfVxuICAgICAgPC9wPlxuICAgICl9XG4gICAge29uUmV0cnkgJiYgKFxuICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtvblJldHJ5fSBjbGFzc05hbWU9XCJidG4tc2Vjb25kYXJ5IHRleHQteHNcIj5cbiAgICAgICAgRXJuZXV0IHZlcnN1Y2hlblxuICAgICAgPC9idXR0b24+XG4gICAgKX1cbiAgPC9kaXY+XG4pXG5cbmV4cG9ydCBjb25zdCBNaW5pbWFsRXJyb3JGYWxsYmFjazogUmVhY3QuRkM8eyBtZXNzYWdlPzogc3RyaW5nIH0+ID0gKHsgXG4gIG1lc3NhZ2UgPSAnRmVobGVyIGJlaW0gTGFkZW4nIFxufSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICA8QWxlcnRUcmlhbmdsZSBjbGFzc05hbWU9XCJ3LTQgaC00IG1yLTJcIiAvPlxuICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc21cIj57bWVzc2FnZX08L3NwYW4+XG4gIDwvZGl2PlxuKVxuIiwiaW1wb3J0IHR5cGUgeyBMb2NhdGlvbiwgQ29udGFjdCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG5pbnRlcmZhY2UgVG9vbHRpcERhdGEge1xuICBsb2NhdGlvbk5hbWU6IHN0cmluZ1xuICBjb250YWN0TmFtZT86IHN0cmluZ1xuICBjb250YWN0Um9sZT86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVG9vbHRpcFBvc2l0aW9uIHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxufVxuXG5leHBvcnQgY2xhc3MgTWFwVG9vbHRpcEhhbmRsZXIge1xuICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgcHJpdmF0ZSBsb2NhdGlvbnM6IExvY2F0aW9uW11cbiAgcHJpdmF0ZSBjb250YWN0czogQ29udGFjdFtdID0gW11cbiAgcHJpdmF0ZSB0b29sdGlwRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGN1cnJlbnRMb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIHNob3dUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgaGlkZVRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBpc1RvdWNoOiBib29sZWFuID0gZmFsc2VcblxuICBjb25zdHJ1Y3Rvcihjb250YWluZXI6IEhUTUxFbGVtZW50LCBsb2NhdGlvbnM6IExvY2F0aW9uW10sIGNvbnRhY3RzOiBDb250YWN0W10gPSBbXSkge1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyXG4gICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnNcbiAgICB0aGlzLmNvbnRhY3RzID0gY29udGFjdHNcbiAgICB0aGlzLmNyZWF0ZVRvb2x0aXBFbGVtZW50KClcbiAgICB0aGlzLmJpbmRFdmVudHMoKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwRWxlbWVudCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGBcbiAgICAgIGZpeGVkIHotNTAgcHgtMyBweS0yIHRleHQtc20gdGV4dC13aGl0ZSBiZy1ncmF5LTkwMCByb3VuZGVkLWxnIHNoYWRvdy1sZ1xuICAgICAgcG9pbnRlci1ldmVud
25114HMtbm9uZSBvcGFjaXR5LTAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTIwMFxuICAgICAgbWF4LXctWzI4MHB4XVxuICAgIGAudHJpbSgpXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBFbGVtZW50KVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIC8vIERldGVjdCB0b3VjaCBkZXZpY2VcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5pc1RvdWNoID0gdHJ1ZVxuICAgIH0sIHsgb25jZTogdHJ1ZSwgcGFzc2l2ZTogdHJ1ZSB9KVxuXG4gICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5oYW5kbGVNb3VzZU92ZXIuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuaGFuZGxlTW91c2VPdXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpKVxuXG4gICAgLy8gQ2xlYW51cCBvbiB3aW5kb3cgcmVzaXplXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGlkZVRvb2x0aXAuYmluZCh0aGlzKSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VPdmVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2tpcCBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKHRoaXMuaXNUb3VjaCkgcmV0dXJuXG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudFxuICAgIGNvbnN0IGxvY2F0aW9uRWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1sb2NhdGlvbi1pZF0nKVxuICAgIFxuICAgIGlmIChsb2NhdGlvbkVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uSWQgPSBsb2NhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxvY2F0aW9uLWlkJylcbiAgICAgIGlmIChsb2NhdGlvbklkICYmIGxvY2F0aW9uSWQgIT09IHRoaXMuY3VycmVudExvY2F0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb25JZCA9IGxvY2F0aW9uSWRcbiAgICAgICAgdGhpcy5zaG93VG9vbHRpcChsb2NhdGlvbklkLCBldmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3V0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNUb3VjaCkgcmV0dXJuXG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudFxuICAgIGNvbnN0IGxvY2F0aW9uRWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1sb2NhdGlvbi1pZF0nKVxuICAgIFxuICAgIGlmICghbG9jYXRpb25FbGVtZW50KSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSGlkZVRvb2x0aXAoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNUb3VjaCB8fCAhdGhpcy50b29sdGlwRWxlbWVudCB8fCAhdGhpcy5jdXJyZW50TG9jYXRpb25JZCkgcmV0dXJuXG5cbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcChsb2NhdGlvbklkOiBzdHJpbmcsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBFbGVtZW50KSByZXR1cm5cblxuICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGhpZGVcbiAgICBpZiAodGhpcy5oaWRlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVvdXQpXG4gICAgICB0aGlzLmhpZGVUaW1lb3V0ID0gbnVsbFxuICAgIH1cblxuICAgIC8vIEdldCBsb2NhdGlvbiBkYXRhXG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmxvY2F0aW9ucy5maW5kKGxvYyA9PiBsb2MuaWQgPT09IGxvY2F0aW9uSWQpXG4gICAgaWYgKCFsb2NhdGlvbikgcmV0dXJuXG5cbiAgICAvLyBHZXQgZmlyc3QgYWN0aXZlIGNvbnRhY3QgZm9yIHRoaXMgbG9jYXRpb25cbiAgICBjb25zdCBwcmltYXJ5Q29udGFjdCA9IHRoaXMuY29udGFjdHMuZmluZChjb250YWN0ID0+XG4gICAgICBjb250YWN0LmxvY2F0aW9uSWQgPT09IGxvY2F0aW9uSWQgJiYgY29udGFjdC5pc0FjdGl2ZVxuICAgIClcblxuICAgIC8vIENyZWF0ZSB0b29sdGlwIGNvbnRlbnRcbiAgICBjb25zdCB0b29sdGlwRGF0YTogVG9vbHRpcERhdGEgPSB7XG4gICAgICBsb2NhdGlvbk5hbWU6IGxvY2F0aW9uLm5hbWUsXG4gICAgICBjb250YWN0TmFtZTogcHJpbWFyeUNvbnRhY3Q/LmZ1bGxOYW1lLFxuICAgICAgY29udGFjdFJvbGU6IHByaW1hcnlDb250YWN0Py5wb3NpdGlvblxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodG9vbHRpcERhdGEpXG5cbiAgICAvLyBTaG93IHdpdGggZGVsYXlcbiAgICB0aGlzLnNob3dUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b29sdGlwRWxlbWVudCkge1xuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSdcbiAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSlcbiAgICAgIH1cbiAgICB9LCAzMDApIC8vIDMwMG1zIGRlbGF5XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlSGlkZVRvb2x0aXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lb3V0KVxuICAgICAgdGhpcy5zaG93VGltZW91dCA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLmhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGVUb29sdGlwKClcbiAgICB9LCAxMDApIC8vIFNtYWxsIGRlbGF5IHRvIHByZXZlbnQgZmxpY2tlcmluZ1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sdGlwRWxlbWVudCkge1xuICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnXG4gICAgfVxuICAgIHRoaXMuY3VycmVudExvY2F0aW9uSWQgPSBudWxsXG5cbiAgICBpZiAodGhpcy5zaG93VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd1RpbWVvdXQpXG4gICAgICB0aGlzLnNob3dUaW1lb3V0ID0gbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5oaWRlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVvdXQpXG4gICAgICB0aGlzLmhpZGVUaW1lb3V0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcENvbnRlbnQoZGF0YTogVG9vbHRpcERhdGEpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcEVsZW1lbnQpIHJldHVyblxuXG4gICAgbGV0IGNvbnRlbnQgPSBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+YFxuICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtd2hpdGUgbWItMVwiPiR7ZGF0YS5sb2NhdGlvbk5hbWV9PC9kaXY+YFxuXG4gICAgaWYgKGRhdGEuY29udGFjdE5hbWUpIHtcbiAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktMzAwIHRleHQteHNcIj
251145gXG4gICAgICBjb250ZW50ICs9IGA8ZGl2PiR7ZGF0YS5jb250YWN0TmFtZX08L2Rpdj5gXG4gICAgICBpZiAoZGF0YS5jb250YWN0Um9sZSkge1xuICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPVwidGV4dC1ncmF5LTQwMFwiPiR7ZGF0YS5jb250YWN0Um9sZX08L2Rpdj5gXG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGA8L2Rpdj5gXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNDAwIHRleHQteHNcIj5LZWluIEFuc3ByZWNocGFydG5lciB6dWdld2llc2VuPC9kaXY+YFxuICAgIH1cbiAgICBjb250ZW50ICs9IGA8L2Rpdj5gXG5cbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnRcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKG1vdXNlWDogbnVtYmVyLCBtb3VzZVk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy50b29sdGlwRWxlbWVudCkgcmV0dXJuXG5cbiAgICBjb25zdCB0b29sdGlwID0gdGhpcy50b29sdGlwRWxlbWVudFxuICAgIGNvbnN0IHJlY3QgPSB0b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3Qgdmlld3BvcnQgPSB7XG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIH1cblxuICAgIGNvbnN0IHNwYWNpbmcgPSAxMlxuICAgIGxldCB4ID0gbW91c2VYICsgc3BhY2luZ1xuICAgIGxldCB5ID0gbW91c2VZIC0gcmVjdC5oZWlnaHQgLSBzcGFjaW5nXG5cbiAgICAvLyBLZWVwIHRvb2x0aXAgd2l0aGluIHZpZXdwb3J0XG4gICAgaWYgKHggKyByZWN0LndpZHRoID4gdmlld3BvcnQud2lkdGgpIHtcbiAgICAgIHggPSBtb3VzZVggLSByZWN0LndpZHRoIC0gc3BhY2luZ1xuICAgIH1cbiAgICBpZiAoeSA8IDApIHtcbiAgICAgIHkgPSBtb3VzZVkgKyBzcGFjaW5nXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGlzdGFuY2UgZnJvbSBlZGdlc1xuICAgIHggPSBNYXRoLm1heChzcGFjaW5nLCBNYXRoLm1pbih4LCB2aWV3cG9ydC53aWR0aCAtIHJlY3Qud2lkdGggLSBzcGFjaW5nKSlcbiAgICB5ID0gTWF0aC5tYXgoc3BhY2luZywgTWF0aC5taW4oeSwgdmlld3BvcnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQgLSBzcGFjaW5nKSlcblxuICAgIHRvb2x0aXAuc3R5bGUubGVmdCA9IGAke3h9cHhgXG4gICAgdG9vbHRpcC5zdHlsZS50b3AgPSBgJHt5fXB4YFxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUxvY2F0aW9ucyhsb2NhdGlvbnM6IExvY2F0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY2F0aW9uc1xuICAgIC8vIEhpZGUgY3VycmVudCB0b29sdGlwIGlmIGxvY2F0aW9uIG5vIGxvbmdlciBleGlzdHNcbiAgICBpZiAodGhpcy5jdXJyZW50TG9jYXRpb25JZCAmJiAhbG9jYXRpb25zLmZpbmQobG9jID0+IGxvYy5pZCA9PT0gdGhpcy5jdXJyZW50TG9jYXRpb25JZCkpIHtcbiAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zaG93VGltZW91dClcbiAgICB9XG4gICAgaWYgKHRoaXMuaGlkZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lb3V0KVxuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy50b29sdGlwRWxlbWVudCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLnRvb2x0aXBFbGVtZW50KVxuICAgICAgdGhpcy50b29sdGlwRWxlbWVudCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5oYW5kbGVNb3VzZU92ZXIuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuaGFuZGxlTW91c2VPdXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpKVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmhpZGVUb29sdGlwLmJpbmQodGhpcykpXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTG9jYXRpb24sIENvbnRhY3QgfSBmcm9tICcuLi8uLi90eXBlcy9pbmRleCdcbmltcG9ydCB7IE1hcFRvb2x0aXBIYW5kbGVyIH0gZnJvbSAnLi9NYXBUb29sdGlwSGFuZGxlcidcblxuaW50ZXJmYWNlIE1hcEhhbmRsZXJPcHRpb25zIHtcbiAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICBsb2NhdGlvbnM6IExvY2F0aW9uW11cbiAgY29udGFjdHM/OiBDb250YWN0W11cbiAgc2VsZWN0ZWRMb2NhdGlvbklkPzogc3RyaW5nIHwgbnVsbFxuICBvbkxvY2F0aW9uU2VsZWN0OiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiB2b2lkXG4gIGVuYWJsZVpvb20/OiBib29sZWFuXG4gIGVuYWJsZVBhbj86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFBhblpvb21JbnN0YW5jZSB7XG4gIHpvb206IChzY2FsZTogbnVtYmVyKSA9PiB2b2lkXG4gIHpvb21CeTogKHNjYWxlOiBudW1iZXIpID0+IHZvaWRcbiAgem9vbUluOiAoKSA9PiB2b2lkXG4gIHpvb21PdXQ6ICgpID0+IHZvaWRcbiAgcGFuOiAocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkgPT4gdm9pZFxuICBmaXQ6ICgpID0+IHZvaWRcbiAgY2VudGVyOiAoKSA9PiB2b2lkXG4gIHJlc2V0OiAoKSA9PiB2b2lkXG4gIGRlc3Ryb3k6ICgpID0+IHZvaWRcbiAgZ2V0Wm9vbTogKCkgPT4gbnVtYmVyXG4gIGdldFBhbjogKCkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlciB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgc3ZnUGFuWm9vbT86IChlbGVtZW50OiBTVkdFbGVtZW50LCBvcHRpb25zPzogYW55KSA9PiBQYW5ab29tSW5zdGFuY2VcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFwSGFuZGxlciB7XG4gIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuICBwcml2YXRlIGxvY2F0aW9uczogTG9jYXRpb25bXVxuICBwcml2YXRlIGNvbnRhY3RzOiBDb250YWN0W11cbiAgcHJpdmF0ZSBzZWxlY3RlZExvY2F0aW9uSWQ6IHN0cmluZyB8IG51bGxcbiAgcHJpdmF0ZSBvbkxvY2F0aW9uU2VsZWN0OiAobG9jYXRpb25JZDogc3RyaW5nKSA9PiB2b2lkXG4gIHByaXZhdGUgZW5hYmxlWm9vbTogYm9vbGVhblxuICBwcml2YXRlIGVuYWJsZVBhbjogYm9vbGVhblxuICBwcml2YXRlIHBhblpvb21JbnN0YW5jZTogUGFuWm9vbUluc3RhbmNlIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBzdmdFbGVtZW50OiBTVkdFbGVtZW50IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBsb2NhdGlvbkVsZW1lbnRzOiBNYXA8c3RyaW5nLCBTVkdFbGVtZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHRvb2x0aXBIYW5kbGVyOiBNYXBUb29sdGlwSGFuZGxlciB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFwSGFuZGxlck9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyXG4gICAgdGhpcy5sb2NhdGlvbnMgPSBvcHRpb25zLmxvY2F0aW9uc1xuICAgIHRoaXMuY29udGFjdHMgPSBvcHRpb25zLmNvbn
25114RhY3RzIHx8IFtdXG4gICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uSWQgPSBvcHRpb25zLnNlbGVjdGVkTG9jYXRpb25JZCB8fCBudWxsXG4gICAgdGhpcy5vbkxvY2F0aW9uU2VsZWN0ID0gb3B0aW9ucy5vbkxvY2F0aW9uU2VsZWN0XG4gICAgdGhpcy5lbmFibGVab29tID0gb3B0aW9ucy5lbmFibGVab29tID8/IHRydWVcbiAgICB0aGlzLmVuYWJsZVBhbiA9IG9wdGlvbnMuZW5hYmxlUGFuID8/IHRydWVcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpbmQgU1ZHIGVsZW1lbnRcbiAgICAgIHRoaXMuc3ZnRWxlbWVudCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpXG4gICAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNWRyBlbGVtZW50IGZvdW5kIGluIGNvbnRhaW5lcicpXG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIFNWRyB2aWV3cG9ydFxuICAgICAgdGhpcy5zZXR1cFNWR1ZpZXdwb3J0KClcblxuICAgICAgLy8gTG9hZCBzdmctcGFuLXpvb20gbGlicmFyeSBpZiBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICAgIGF3YWl0IHRoaXMubG9hZFN2Z1Bhblpvb20oKVxuXG4gICAgICAvLyBTZXR1cCBwYW4vem9vbSAtIGFsd2F5cyBzZXR1cCBmb3IgZml0L2NlbnRlciwgYnV0IGRpc2FibGUgaW50ZXJhY3Rpb25zXG4gICAgICB0aGlzLnNldHVwUGFuWm9vbSgpXG5cbiAgICAgIC8vIFNldHVwIGxvY2F0aW9uIGludGVyYWN0aW9uc1xuICAgICAgdGhpcy5zZXR1cExvY2F0aW9uRWxlbWVudHMoKVxuICAgICAgdGhpcy5iaW5kRXZlbnRzKClcblxuICAgICAgLy8gU2V0dXAgdG9vbHRpcCBzeXN0ZW1cbiAgICAgIHRoaXMuc2V0dXBUb29sdGlwcygpXG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHNlbGVjdGVkIGxvY2F0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRMb2NhdGlvbih0aGlzLnNlbGVjdGVkTG9jYXRpb25JZClcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtYXAgaGFuZGxlcjonLCBlcnJvcilcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNWR1ZpZXdwb3J0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmdFbGVtZW50KSByZXR1cm5cblxuICAgIC8vIEVuc3VyZSBTVkcgc2NhbGVzIHByb3Blcmx5XG4gICAgdGhpcy5zdmdFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnXG4gICAgdGhpcy5zdmdFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJ1xuICAgIHRoaXMuc3ZnRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuXG4gICAgLy8gUHJlc2VydmUgYXNwZWN0IHJhdGlvIGJ1dCBmaXQgdG8gY29udGFpbmVyXG4gICAgdGhpcy5zdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0JylcblxuICAgIC8vIElmIG5vIHZpZXdCb3ggaXMgc2V0LCBjcmVhdGUgb25lIGZyb20gdGhlIFNWRyBkaW1lbnNpb25zXG4gICAgaWYgKCF0aGlzLnN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSAodGhpcy5zdmdFbGVtZW50IGFzIGFueSkuZ2V0QkJveCgpXG4gICAgICAgIHRoaXMuc3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBgJHtiYm94Lnh9ICR7YmJveC55fSAke2Jib3gud2lkdGh9ICR7YmJveC5oZWlnaHR9YClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGdldEJCb3ggZmFpbHNcbiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZ2V0IFNWRyBib3VuZGluZyBib3gsIHVzaW5nIGRlZmF1bHQgdmlld0JveCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU3ZnUGFuWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBzdmctcGFuLXpvb20gaXMgYWxyZWFkeSBsb2FkZWRcbiAgICBpZiAod2luZG93LnN2Z1Bhblpvb20pIHtcbiAgICAgIHJldHVyblxuICAgI
25114H1cblxuICAgIC8vIExvYWQgc3ZnLXBhbi16b29tIGxpYnJhcnlcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICAgIHNjcmlwdC5zcmMgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9zdmctcGFuLXpvb21AMy42LjEvZGlzdC9zdmctcGFuLXpvb20ubWluLmpzJ1xuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKVxuICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBzdmctcGFuLXpvb20gbGlicmFyeScpKVxuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBQYW5ab29tKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmdFbGVtZW50IHx8ICF3aW5kb3cuc3ZnUGFuWm9vbSkgcmV0dXJuXG5cbiAgICB0aGlzLnBhblpvb21JbnN0YW5jZSA9IHdpbmRvdy5zdmdQYW5ab29tKHRoaXMuc3ZnRWxlbWVudCwge1xuICAgICAgem9vbUVuYWJsZWQ6IHRoaXMuZW5hYmxlWm9vbSxcbiAgICAgIHBhbkVuYWJsZWQ6IHRoaXMuZW5hYmxlUGFuLFxuICAgICAgY29udHJvbEljb25zRW5hYmxlZDogZmFsc2UsIC8vIFdlJ2xsIHVzZSBjdXN0b20gY29udHJvbHNcbiAgICAgIGZpdDogdHJ1ZSxcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICAgIG1pblpvb206IDAuOCxcbiAgICAgIG1heFpvb206IDgsXG4gICAgICB6b29tU2NhbGVTZW5zaXRpdml0eTogMC4xNSwgLy8gU21vb3RoZXIgem9vbSBzdGVwc1xuICAgICAgZGJsQ2xpY2tab29tRW5hYmxlZDogdGhpcy5lbmFibGVab29tLFxuICAgICAgbW91c2VXaGVlbFpvb21FbmFibGVkOiB0aGlzLmVuYWJsZVpvb20sXG4gICAgICBwcmV2ZW50TW91c2VFdmVudHNEZWZhdWx0OiB0cnVlLFxuICAgICAgLy8gU21vb3RoIGFuaW1hdGlvbnNcbiAgICAgIGFuaW1hdGlvblRpbWU6IDMwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2VJbk91dEN1YmljJyxcbiAgICAgIGJlZm9yZVpvb206ICgpID0+IHtcbiAgICAgICAgLy8gQWRkIHpvb20gY2xhc3MgZm9yIENTUyB0cmFuc2l0aW9uc1xuICAgICAgICB0aGlzLnN2Z0VsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ3pvb21pbmcnKVxuICAgICAgfSxcbiAgICAgIG9uWm9vbTogKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgem9vbSBjbGFzcyBhZnRlciB0cmFuc2l0aW9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnem9vbWluZycpXG4gICAgICAgIH0sIDM1MClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExvY2F0aW9uRWxlbWVudHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN2Z0VsZW1lbnQpIHJldHVyblxuXG4gICAgdGhpcy5sb2NhdGlvbkVsZW1lbnRzLmNsZWFyKClcblxuICAgIC8vIEZpbmQgbG9jYXRpb24gZWxlbWVudHMgYnkgZGF0YS1sb2NhdGlvbi1pZCBhdHRyaWJ1dGUgT1IgYnkgSUQgcGF0dGVybiAoaW5jbHVkaW5nIGhvdmVyIGFyZWFzKVxuICAgIGNvbnN0IGxvY2F0aW9uRWxlbWVudHMgPSB0aGlzLnN2Z0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbG9jYXRpb24taWRdLCBbaWRePVwibG9jYXRpb24tXCJdLCBbaWRePVwiaG92ZXItbG9jYXRpb24tXCJdJylcblxuICAgIGNvbnNvbGUubG9nKCfwn5e677iPIEZvdW5kJywgbG9jYXRpb25FbGVtZW50cy5sZW5ndGgsICdsb2NhdGlvbiBlbGVtZW50cyBpbiBTVkcnKVxuXG4gICAgbG9jYXRpb25FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBsZXQgbG9jYXRpb25JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxvY2F0aW9uLWlkJylcblxuICAgICAgLy8gSWYgbm8gZGF0YS1sb2NhdGlvbi1pZCwgdHJ5IHRvIGV4dHJhY3QgZnJvbSBJRCAoZS5nLiwgXCJsb2NhdGlvbi0xMjNcIiBvciBcImhvdmVyLWxvY2F0aW9uLTEyM1wiIC0+IFwiMTIzXCIpXG4gICAgICBpZiAoIWxvY2F0aW9uSWQgJiYgZWxlbWVudC5pZCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGVsZW1lbnQuaWQubWF0Y2goL14oPzpob3Zlci0pP2xvY2F0aW9uLShcXGQrKSQvKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsb2NhdGlvbklkID0gbWF0Y2hbMV1cbiAgICAgICAgICAvLyBBZGQgZGF0YS1sb2NhdGlvbi1pZCBhdHRyaWJ1dGUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9jYXRpb24taWQnLCBsb2NhdGlvbklkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2NhdGlvbklkICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgICAgIC8vIE1hcCBXb3JkUHJlc3MgUG9zdCBJRCB0byBvdXIgaW50ZXJuYWwgbG9jYXRpb24gSUQgZm9ybWF0XG4gICAgICAgIGNvbnN0IGludGVybmFsTG9jYXRpb25JZCA9IGB3cC0ke2xvY2F0aW9uSWR9YFxuICAgICAgICB0aGlzLmxvY2F0aW9uRWxlbWVudHMuc2V0KGludGVybmFsTG9jYXRpb25JZCwgZWxlbWVudClcblxuICAgICAgICAvLyBBZGQgQ1NTIGNsYXNzZXMgZm9yIHN0eWxpbmdcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXAtbG9jYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zb2xlLmxvZyhgRm91bmQgJHt0aGlzLmxvY2F0aW9uRWxlbWVudHMuc2l6ZX0gbG9jYXRpb24gZWxlbWVudHMgb24gbWFwYClcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUb29sdGlwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm5cblxuICAgIC8vIEluaXRpYWxpemUgdG9vbHRpcCBoYW5kbGVyIHdpdGggY29udGFjdHNcbiAgICB0aGlzLnRvb2x0aXBIYW5kbGVyID0gbmV3IE1hcFRvb2x0aXBIYW5kbGVyKHRoaXMuY29udGFpbmVyLCB0aGlzLmxvY2F0aW9ucywgdGhpcy5jb250YWN0cylcbiAgfVxuXG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH1cbiAgcHJpdmF0ZSB0b3VjaE1vdmVkID0gZmFsc2VcbiAgcHJpdmF0ZSByZWFkb25seSBUT1VDSF9
25114ERUxBWV9NUyA9IDUwIC8vIE1pbmltdW0gdG91Y2ggZHVyYXRpb24gdG8gcHJldmVudCBhY2NpZGVudGFsIHRhcHNcbiAgcHJpdmF0ZSByZWFkb25seSBUT1VDSF9NT1ZFX1RIUkVTSE9MRCA9IDE1IC8vIE1heCBwaXhlbHMgbW92ZWQgdG8gc3RpbGwgY291bnQgYXMgdGFwXG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVyblxuXG4gICAgLy8gU2VwYXJhdGUgaGFuZGxpbmcgZm9yIHRvdWNoIGFuZCBtb3VzZSBldmVudHNcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIC8vIE1hcmsgYXMgdG91Y2ggaW50ZXJhY3Rpb25cbiAgICB0aGlzLmNvbnRhaW5lci5kYXRhc2V0LnRvdWNoQWN0aXZlID0gJ3RydWUnXG5cbiAgICAvLyBSZWNvcmQgdG91Y2ggc3RhcnQgdGltZSBhbmQgcG9zaXRpb25cbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIHRoaXMudG91Y2hNb3ZlZCA9IGZhbHNlXG5cbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF1cbiAgICAgIHRoaXMudG91Y2hTdGFydFBvc2l0aW9uID0geyB4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlc1swXVxuICAgICAgY29uc3QgZGVsdGFYID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvc2l0aW9uLngpXG4gICAgICBjb25zdCBkZWx0YVkgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9zaXRpb24ueSlcblxuICAgICAgLy8gTWFyayBhcyBtb3ZlZCBpZiB1c2VyIG1vdmVkIGZpbmdlciBtb3JlIHRoYW4gdGhyZXNob2xkXG4gICAgICBpZiAoZGVsdGFYID4gdGhpcy5UT1VDSF9NT1ZFX1RIUkVTSE9MRCB8fCBkZWx0YVkgPiB0aGlzLlRPVUNIX01PVkVfVEhSRVNIT0xEKSB7XG4gICAgICAgIHRoaXMudG91Y2hNb3ZlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBjbGljayBldmVudCBmcm9tIGZpcmluZyBhZnRlciB0b3VjaFxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gdGhpcy50b3VjaFN0YXJ0VGltZVxuICAgIGNvbnNvbGUubG9nKCfwn5GGIFRvdWNoIGVuZCAtIGR1cmF0aW9uOicsIHRvdWNoRHVyYXRpb24sICdtb3ZlZDonLCB0aGlzLnRvdWNoTW92ZWQpXG5cbiAgICAvLyBPbmx5IHRyaWdnZXIgbG9jYXRpb24gc2VsZWN0aW9uIGlmOlxuICAgIC8vIDEuIFRvdWNoIHdhcyBoZWxkIGxvbmcgZW5vdWdoIChwcmV2ZW50cyBhY2NpZGVudGFsIHRhcHMgZHVyaW5nIHNjcm9sbClcbiAgICAvLyAyLiBVc2VyIGRpZG4ndCBtb3ZlIGZpbmdlciBtdWNoIChwcmV2ZW50cyB0cmlnZ2VyaW5nIGR1cmluZyBzY3JvbGwpXG4gICAgaWYgKHRvdWNoRHVyYXRpb24gPj0gdGhpcy5UT1VDSF9ERUxBWV9NUyAmJiAhdGhpcy50b3VjaE1vdmVkKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudFxuICAgICAgY29uc3QgbG9jYXRpb25FbGVtZW50ID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWxvY2F0aW9uLWlkXScpXG5cbiAgICAgIGNvbnNvbGUubG9nKCfwn46vIFRvdWNoIGxvY2F0aW9uIGVsZW1lbnQgZm91bmQ6JywgbG9jYXRpb25FbGVtZW50KVxuXG4gICAgICBpZiAobG9jYXRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uSWQgPSBsb2NhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxvY2F0aW9uLWlkJylcbiAgICAgICAgY29uc29sZS5sb2coJ/Cfk40gVG91Y2ggbG9jYXRpb24gSUQ6JywgbG9jYXRpb25JZClcbiAgICAgICAgaWYgKGxvY2F0aW9uSWQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uVG91Y2gobG9jYXRpb25JZCwgbG9jYXRpb25FbGVtZW50IGFzIFNWR0VsZW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinYwgTm8gbG9jYXRpb24gZWxlbWVudCBmb3VuZCBmb3IgdG91Y2gnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygn4o+t77iPIFRvdWNoIGlnbm9yZWQgLSB0b28gc2hvcnQgb3IgbW92ZWQgdG9vIG11Y2gnKVxuICAgIH1cblxuICAgIC8vIENsZWFyIHRvdWNoIGZsYWcgYWZ0ZXIgYSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZGVsZXRlIHRoaXMuY29udGFpbmVyLmRhdGFzZXQudG91Y2hBY3RpdmVcbiAgICB9LCAzMDApXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ/CflrHvuI8gQ2xpY2sgZXZlbnQ6JywgZXZlbnQudGFyZ2V0KVxuXG4gICAgLy8gU2tpcCBpZiB0aGlzIHdhcyBhIHRvdWNoIGludGVyYWN0aW9uXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmRhdGFzZXQudG91Y2hBY3RpdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfij63vuI8gU2tpcHBpbmcgY2xpY2sgLSB0b3VjaCBhY3RpdmUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnRcbiAgICBjb25zdCBsb2NhdGlvbkVsZW1lbnQgPSB0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbG9jYXRpb24taWRdJylcblxuICAgIGNvbnNvbGUubG9nKCfwn46vIExvY2F0aW9uIGVsZW1lbnQgZm91bmQ6JywgbG9jYXRpb25FbGVtZW50KVxuXG4gICAgaWYgKGxvY2F0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3QgbG9jYXRpb25JZCA9IGxvY2F0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9jYXRpb24taWQnKVxuICAgICAgY29uc29sZS5sb2coJ/Cfk40gTG9jYXRpb24gSUQ6JywgbG9jYXRpb25JZClcbiAgICAgIGlmIChsb2NhdGlvbklkKSB7XG4gICAgICAgI
25114HRoaXMuaGFuZGxlTG9jYXRpb25DbGljayhsb2NhdGlvbklkLCBsb2NhdGlvbkVsZW1lbnQgYXMgU1ZHRWxlbWVudClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ+KdjCBObyBsb2NhdGlvbiBlbGVtZW50IGZvdW5kIGZvciBjbGljaycpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVMb2NhdGlvblRvdWNoKGxvY2F0aW9uSWQ6IHN0cmluZywgZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIEltbWVkaWF0ZSBmZWVkYmFjayBmb3IgdG91Y2hcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21hcC1sb2NhdGlvbi1hY3RpdmUnKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdtYXAtbG9jYXRpb24tYWN0aXZlJylcbiAgICB9LCAxNTApXG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIGFuZCBvcGVuIG1vZGFsIGltbWVkaWF0ZWx5IG9uIG1vYmlsZVxuICAgIHRoaXMuc2V0U2VsZWN0ZWRMb2NhdGlvbihsb2NhdGlvbklkKVxuICAgIHRoaXMub25Mb2NhdGlvblNlbGVjdChsb2NhdGlvbklkKVxuXG4gICAgLy8gTm8gem9vbSBvbiB0b3VjaCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBwaW5jaC16b29tXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvY2F0aW9uQ2xpY2sobG9jYXRpb25JZDogc3RyaW5nLCBlbGVtZW50OiBTVkdFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gU3VidGxlIGZlZWRiYWNrIGZvciBkZXNrdG9wIGNsaWNrc1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwLWxvY2F0aW9uLWFjdGl2ZScpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ21hcC1sb2NhdGlvbi1hY3RpdmUnKVxuICAgIH0sIDIwMClcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb25cbiAgICB0aGlzLnNldFNlbGVjdGVkTG9jYXRpb24obG9jYXRpb25JZClcblxuICAgIC8vIE5vdGlmeSBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5vbkxvY2F0aW9uU2VsZWN0KGxvY2F0aW9uSWQpXG5cbiAgICAvLyBab29tIHRvIGxvY2F0aW9uIG9uIGRlc2t0b3AgKHNtb290aGVyIGV4cGVyaWVuY2UpXG4gICAgaWYgKHRoaXMuZW5hYmxlWm9vbSAmJiB0aGlzLnBhblpvb21JbnN0YW5jZSkge1xuICAgICAgdGhpcy56b29tVG9Mb2NhdGlvbihsb2NhdGlvbklkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0TG9jYXRpb24obG9jYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHByZXZpb3VzIGhpZ2hsaWdodHNcbiAgICB0aGlzLmxvY2F0aW9uRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaWQpID0+IHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbWFwLWxvY2F0aW9uLXNlbGVjdGVkJylcbiAgICB9KVxuXG4gICAgLy8gQWRkIGhpZ2hsaWdodCB0byBzZWxlY3RlZCBsb2NhdGlvblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmxvY2F0aW9uRWxlbWVudHMuZ2V0KGxvY2F0aW9uSWQpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwLWxvY2F0aW9uLXNlbGVjdGVkJylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHpvb21Ub0xvY2F0aW9uKGxvY2F0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmxvY2F0aW9uRWxlbWVudHMuZ2V0KGxvY2F0aW9uSWQpXG4gICAgaWYgKCFlbGVtZW50IHx8ICF0aGlzLnBhblpvb21JbnN0YW5jZSB8fCAhdGhpcy5zdmdFbGVtZW50KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZWxlbWVudCBib3VuZHNcbiAgICAgIGNvbnN0IGJib3ggPSAoZWxlbWVudCBhcyBTVkdHcmFwaGljc0VsZW1lbnQpLmdldEJCb3goKVxuICAgICAgY29uc3Qgc3ZnUmVjdCA9IHRoaXMuc3ZnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgXG4gICAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgICBjb25zdCBjZW50ZXJYID0gYmJveC54ICsgYmJveC53aWR0aCAvIDJcbiAgICAgIGNvbnN0IGNlbnRlclkgPSBiYm94LnkgKyBiYm94LmhlaWdodCAvIDJcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIHpvb20gbGV2ZWwgKGZpdCBlbGVtZW50IHdpdGggc29tZSBwYWRkaW5nKVxuICAgICAgY29uc3QgcGFkZGluZyA9IDUwXG4gICAgICBjb25zdCBzY2FsZVggPSAoc3ZnUmVjdC53aWR0aCAtIHBhZGRpbmcgKiAyKSAvIGJib3gud2lkdGhcbiAgICAgIGNvbnN0IHNjYWxlWSA9IChzdmdSZWN0LmhlaWdodCAtIHBhZGRpbmcgKiAyKSAvIGJib3guaGVpZ2h0XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKHNjYWxlWCwgc2NhbGVZLCAzKSAvLyBNYXggem9vbSBvZiAzeFxuICAgICAgXG4gICAgICAvLyBQYW4gdG8gY2VudGVyIGFuZCB6b29tXG4gICAgICB0aGlzLnBhblpvb21JbnN0YW5jZS56b29tKHNjYWxlKVxuICAgICAgdGhpcy5wYW5ab29tSW5zdGFuY2UucGFuKHtcbiAgICAgICAgeDogc3ZnUmVjdC53aWR0aCAvIDIgLSBjZW50ZXJYICogc2NhbGUsXG4gICAgICAgIHk6IHN2Z1JlY3QuaGVpZ2h0IC8gMiAtIGNlbnRlclkgKiBzY2FsZVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gem9vbSB0byBsb2NhdGlvbjonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBQdWJsaWMgbWV0aG9kc1xuICB1cGRhdGVMb2NhdGlvbnMobG9jYXRpb25zOiBMb2NhdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnNcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnNldHVwTG9jYXRpb25FbGVtZW50cygpXG4gICAgfVxuICAgIGlmICh0aGlzLnRvb2x0aXBIYW5kbGVyKSB7XG4gICAgICB0aGlzLnRvb2x0aXBIYW5kbGVyLnVwZGF0ZUxvY2F0aW9ucyhsb2NhdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRMb2NhdGlvbihsb2NhdGlvbklkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uSWQgPSBsb2NhdGlvbklkXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCAmJiBsb2NhdGlvbklkKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodExvY2F0aW9uKGxvY2F0aW9uSWQpXG4gICAgfVxuICB9XG5cbiAgLy8gUGFuL1pvb20gY29udHJvbHNcbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMucGFuWm9vbUluc3RhbmNlPy56b29tSW4oKVxuICB9XG5cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhblpvb21JbnN0YW5jZT8uem9vbU91dCgpXG4gIH1cblxuICByZXNldFZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5ab29tSW5zdGFuY2U/LnJlc2V0KClcbiAgfVxuXG4gIGZpdFRvVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnBhblpvb21JbnN0YW5jZT8uZml0KClcbiAgfVxuXG4gIGNlbnRlclZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5ab29tSW5zdGFuY2U/LmNlbnRlcigpXG4gIH1cblxuICBnZXRab29tTGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYW5ab29tSW5zdGFuY2U/LmdldFpvb20oKSB8fCAxXG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhblpvb21JbnN0YW5jZSkge1xuICAgICAgdGhpcy5wYW5ab29tSW5zdGFuY2UuZGVzdHJveSgpXG4gICAgICB0aGlzLnBhblpvb21JbnN0YW5jZSA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b29sdGlwSGFuZGxlcikge1xuICAgICAgdGhpcy50b29sdGlwSGFuZGxlci5kZXN0cm95KClcbiAgICAgIHRoaXMudG9vbHRpcEhhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbkVsZW1lbnRzLmNsZWFyKClcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZVxuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgWm9vbUluLCBab29tT3V0LCBSb3RhdGVDY3csIENyb3NzaGFpciB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB0eXBlIHsgTWFwSGFuZGxlciB9IGZyb20gJy4vTWFwSGFuZGxlcidcbmltcG9ydCB7
25114IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgTWFwQ29udHJvbHNQcm9wcyB7XG4gIG1hcEhhbmRsZXI6IE1hcEhhbmRsZXJcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnY29tcGFjdCdcbn1cblxuZXhwb3J0IGNvbnN0IE1hcENvbnRyb2xzOiBSZWFjdC5GQzxNYXBDb250cm9sc1Byb3BzPiA9ICh7XG4gIG1hcEhhbmRsZXIsXG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCA9ICdkZWZhdWx0J1xufSkgPT4ge1xuICBjb25zdCBbem9vbUxldmVsLCBzZXRab29tTGV2ZWxdID0gdXNlU3RhdGUoMSlcblxuICAvLyBVcGRhdGUgem9vbSBsZXZlbCBkaXNwbGF5XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlWm9vbUxldmVsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFpvb20gPSBtYXBIYW5kbGVyLmdldFpvb21MZXZlbCgpXG4gICAgICBzZXRab29tTGV2ZWwoTWF0aC5yb3VuZChjdXJyZW50Wm9vbSAqIDEwMCkgLyAxMDApXG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGluaXRpYWxseVxuICAgIHVwZGF0ZVpvb21MZXZlbCgpXG5cbiAgICAvLyBVcGRhdGUgb24gem9vbSBjaGFuZ2VzICh3ZSBjb3VsZCBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gTWFwSGFuZGxlcilcbiAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZVpvb21MZXZlbCwgNTAwKVxuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGludGVydmFsKVxuICB9LCBbbWFwSGFuZGxlcl0pXG5cbiAgY29uc3QgY29udHJvbEJ1dHRvbkNsYXNzID0gY2xzeChcbiAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy0xMCBoLTEwIGJnLXdoaXRlIGJvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSByb3VuZGVkLW1lYyBzaGFkb3ctc20nLFxuICAgICdob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBob3Zlcjpib3JkZXItbWVjLXByaW1hcnkvMjAgaG92ZXI6c2hhZG93LW1kJyxcbiAgICAnYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCcsXG4gICAgJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC1tZWMtcHJpbWFyeScsXG4gICAgJ3RvdWNoLW1hbmlwdWxhdGlvbiB0YXAtaGlnaGxpZ2h0LW5vbmUnXG4gIClcblxuICBjb25zdCBjb21wYWN0QnV0dG9uQ2xhc3MgPSBjbHN4KFxuICAgICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LTggaC04IGJnLXdoaXRlLzkwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZCBib3JkZXIgYm9yZGVyLXdoaXRlLzIwJyxcbiAgICAnaG92ZXI6Ymctd2hpdGUgaG92ZXI6Ym9yZGVyLW1lYy1wcmltYXJ5LzIwJyxcbiAgICAnYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCcsXG4gICAgJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC1tZWMtcHJpbWFyeScsXG4gICAgJ3RvdWNoLW1hbmlwdWxhdGlvbiB0YXAtaGlnaGxpZ2h0LW5vbmUnXG4gIClcblxuICBjb25zdCBidXR0b25DbGFzcyA9IHZhcmlhbnQgPT09ICdjb21wYWN0JyA/IGNvbXBhY3RCdXR0b25DbGFzcyA6IGNvbnRyb2xCdXR0b25DbGFzc1xuICBjb25zdCBpY29uU2l6ZSA9IHZhcmlhbnQgPT09ICdjb21wYWN0JyA/ICd3LTMgaC0zJyA6ICd3LTQgaC00J1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2ZsZXggZmxleC1jb2wgc3BhY2UteS0yJywgY2xhc3NOYW1lKX0+XG4gICAgICB7LyogWm9vbSBDb250cm9scyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTFcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG1hcEhhbmRsZXIuem9vbUluKCl9XG4gICAgICAgICAgY2xhc3NOYW1lPXtidXR0b25DbGFzc31cbiAgICAgICAgICB0aXRsZT1cIlZlcmdyw7bDn2VyblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlIHZlcmdyw7bDn2VyblwiXG4gICAgICAgID5cbiAgICAgICAgICA8Wm9vbUluIGNsYXNzTmFtZT17aWNvblNpemV9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG1hcEhhbmRsZXIuem9vbU91dCgpfVxuICAgICAgICAgIGNsYXNzTmFtZT17YnV0dG9uQ2xhc3N9XG4gICAgICAgICAgdGl0bGU9XCJWZXJrbGVpbmVyblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlIHZlcmtsZWluZXJuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxab29tT3V0IGNsYXNzTmFtZT17aWNvblNpemV9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBab29tIExldmVsIEluZGljYXRvciAqL31cbiAgICAgIHt2YXJpYW50ID09PSAnZGVmYXVsdCcgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzkwIGJhY2tkcm9wLWJsdXItc20gYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHJvdW5kZWQtbWVjIHB4LTIgcHktMSBzaGFkb3ctc21cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkgZm9udC1tb25vXCI+XG4gICAgICAgICAgICB7TWF0aC5yb3VuZCh6b29tTGV2ZWwgKiAxMDApfSVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIFZpZXcgQ29udHJvbHMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgc3BhY2UteS0xXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBtYXBIYW5kbGVyLmNlbnRlclZpZXcoKX1cbiAgICAgICAgICBjbGFzc05hbWU9e2J1dHRvbkNsYXNzfVxuICAgICAgICAgIHRpdGxlPVwiWmVudHJpZXJlblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlIHplbnRyaWVyZW5cIlxuICAgICAgICA+XG4gICAgICAgICAgPENyb3NzaGFpciBjbGFzc05hbWU9e2ljb25TaXplfSAvPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gbWFwSGFuZGxlci5yZXNldFZpZXcoKX1cbiAgICAgICAgICBjbGFzc05hbWU9e2J1dHRvbkNsYXNzfVxuICAgICAgICAgI
25114HRpdGxlPVwiWnVyw7xja3NldHplblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFuc2ljaHQgenVyw7xja3NldHplblwiXG4gICAgICAgID5cbiAgICAgICAgICA8Um90YXRlQ2N3IGNsYXNzTmFtZT17aWNvblNpemV9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gRmxvYXRpbmcgY29udHJvbHMgZm9yIG1vYmlsZVxuZXhwb3J0IGNvbnN0IEZsb2F0aW5nTWFwQ29udHJvbHM6IFJlYWN0LkZDPHtcbiAgbWFwSGFuZGxlcjogTWFwSGFuZGxlclxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn0+ID0gKHsgbWFwSGFuZGxlciwgY2xhc3NOYW1lIH0pID0+IHtcbiAgY29uc3QgW2lzRXhwYW5kZWQsIHNldElzRXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeCgnZml4ZWQgYm90dG9tLTQgcmlnaHQtNCB6LTQwJywgY2xhc3NOYW1lKX0+XG4gICAgICB7LyogTWFpbiBDb250cm9sIEJ1dHRvbiAtIE9wdGltaXplZCBmb3IgdG91Y2ggKi99XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRXhwYW5kZWQoIWlzRXhwYW5kZWQpfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LTE0IGgtMTQgYmctbWVjLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgc2hhZG93LWxnIGFjdGl2ZTpzY2FsZS05NSB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2gtbWFuaXB1bGF0aW9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkthcnRlbnN0ZXVlcnVuZ1wiXG4gICAgICAgIHN0eWxlPXt7IG1pbkhlaWdodDogJzQ0cHgnLCBtaW5XaWR0aDogJzQ0cHgnIH19XG4gICAgICA+XG4gICAgICAgIDxab29tSW4gY2xhc3NOYW1lPVwidy02IGgtNlwiIC8+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgey8qIEV4cGFuZGVkIENvbnRyb2xzICovfVxuICAgICAge2lzRXhwYW5kZWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGJvdHRvbS0xNCByaWdodC0wIGZsZXggZmxleC1jb2wgc3BhY2UteS0yIGFuaW1hdGUtaW4gc2xpZGUtdXAgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBtYXBIYW5kbGVyLnpvb21JbigpXG4gICAgICAgICAgICAgIHNldElzRXhwYW5kZWQoZmFsc2UpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy0xMiBoLTEyIGJnLXdoaXRlIHRleHQtdGV4dC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIHNoYWRvdy1tZCBhY3RpdmU6c2NhbGUtOTUgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRvdWNoLW1hbmlwdWxhdGlvblwiXG4gICAgICAgICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6ICc0NHB4JywgbWluV2lkdGg6ICc0NHB4JyB9fVxuICAgICAgICAgICAgdGl0bGU9XCJWZXJncsO2w59lcm5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxab29tSW4gY2xhc3NOYW1lPVwidy01IGgtNVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBtYXBIYW5kbGVyLnpvb21PdXQoKVxuICAgICAgICAgICAgICBzZXRJc0V4cGFuZGVkKGZhbHNlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBiZy13aGl0ZSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHJvdW5kZWQtZnVsbCBzaGFkb3ctbWQgYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0b3VjaC1tYW5pcHVsYXRpb25cIlxuICAgICAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiAnNDRweCcsIG1pbldpZHRoOiAnNDRweCcgfX1cbiAgICAgICAgICAgIHRpdGxlPVwiVmVya2xlaW5lcm5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxab29tT3V0IGNsYXNzTmFtZT1cInctNSBoLTVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgbWFwSGFuZGxlci5yZXNldFZpZXcoKVxuICAgICAgICAgICAgICBzZXRJc0V4cGFuZGVkKGZhbHNlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBiZy13aGl0ZSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHJvdW5kZWQtZnVsbCBzaGFkb3ctbWQgYWN0aXZlOnNjYWxlLTk1IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0b3VjaC1tYW5pcHVsYXRpb25cIlxuICAgICAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiAnNDRweCcsIG1pbldpZHRoOiAnNDRweCcgfX1cbiAgICAgICAgICAgIHRpdGxlPVwiWnVyw7xja3NldHplblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFJvdGF0ZUNjdyBjbGFzc05hbWU9XCJ3LTQgaC00XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7LyogQmFja2Ryb3AgKi99XG4gICAgICB7aXNFeHBhbmRlZCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJmaXhlZCBpbnNldC0wIC16LTEwXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0V4cGFuZGVkKGZhbHNlKX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImV4cG9ydCBkZWZhdWx0IFwiX19WSVRFX0FTU0VUX19EQmlYJHpMdl9fXCIiLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VBcHBTdG9yZSB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyBNYXBIYW5kbGVyIH0gZnJvbSAnLi9NYXBIYW5kbGVyJ1xuaW1wb3J0IHsgTWFwQ29udHJvbHMgfSBmcm9tICcuL01hcENvbnRyb2xzJ1xuaW1wb3J0IHsgTG9hZGluZ1NwaW5uZXIgfSBmcm9tICdAY29tcG9uZW50cy9VSS9Mb2FkaW5nU3Bpbm5lcidcbmltcG9ydCB0eXBlIHsgTG9jYXRpb24sIENvbnRhY3QsIE1hcFByb3BzIH0gZnJvbSAnLi4vLi4vdHlwZXMvaW5kZXgnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBtYXBTdmcgZnJvbSAnLi4vLi4vYXNzZXRzL21hcC5zdmcnXG5cbmludGVyZmFjZSBNYXBDb250YWluZXJQcm9wcyBleHRlbmRzIE9taXQ8TWFwUHJvcHMsICdvbkxvY2F0aW9uU2VsZWN0Jz4ge1xuICBjb250YWN0cz86IENvbnRhY3RbXVxuICBzdmdVcmw/OiBzdHJpbmdcbiAgc2hvd0NvbnRyb2xzPzogYm9vbGVhblxuICBzaG93TG9hZGluZ0J1dHRvbj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IE1hcENvbnRhaW5lcjogUmVhY3QuRkM8TWFwQ29udGFpbmVyUHJvcHM+ID0gKHtcbiAgbG9jYXRpb25zLFxuICBjb250YWN0cyA9IFtdLFxuICBzZWxlY3RlZExvY2F0aW9uSWQsXG4gIGNsYXNzTmFtZSxcbiAgaGVpZ2h0ID0gNTAwLFxuICBlbmFibGVab29tID0gdHJ1ZSwgLy8gRW5hYmxlIHpvb20gZm9yIGJldHRlciBwaW4gdGFyZ2V0aW5nXG4gIGVuYWJsZVBhbiA9IHRydWUsIC8vIEVuYWJsZSBwYW4gZm9yIG5hdmlnYXRpb25cbiAgc3ZnVXJsID0gbWFwU3ZnLCAvLyBVc2UgaW1wb3J0ZWQgU1ZHXG4gIHNob3dDb250cm9scyA9IHRydWUsIC8vIFNob3cgem9vbSBjb250cm9sc1xuICBzaG93TG9hZGluZ0J1dHRvbiA9IGZ
25114hbHNlXG59KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3Qgc3ZnQ29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBtYXBIYW5kbGVyUmVmID0gdXNlUmVmPE1hcEhhbmRsZXIgfCBudWxsPihudWxsKVxuICBcbiAgY29uc3QgeyBzZXRTZWxlY3RlZExvY2F0aW9uLCBvcGVuTG9jYXRpb25Nb2RhbCB9ID0gdXNlQXBwU3RvcmUoKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc01hcExvYWRlZCwgc2V0SXNNYXBMb2FkZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICAvLyBIYW5kbGUgbG9jYXRpb24gc2VsZWN0aW9uXG4gIGNvbnN0IGhhbmRsZUxvY2F0aW9uU2VsZWN0ID0gKGxvY2F0aW9uSWQ6IHN0cmluZykgPT4ge1xuICAgIHNldFNlbGVjdGVkTG9jYXRpb24obG9jYXRpb25JZClcbiAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKVxuICB9XG5cbiAgLy8gTG9hZCBTVkcgbWFwXG4gIGNvbnN0IGxvYWRNYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzdmdDb250YWluZXJSZWYuY3VycmVudCB8fCBpc01hcExvYWRlZCkgcmV0dXJuXG5cbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIFNWRyBjb250ZW50XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHN2Z1VybClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtYXA6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdmdDb250ZW50ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICBcbiAgICAgIC8vIEluc2VydCBTVkcgaW50byBjb250YWluZXJcbiAgICAgIGlmIChzdmdDb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgICBzdmdDb250YWluZXJSZWYuY3VycmVudC5pbm5lckhUTUwgPSBzdmdDb250ZW50XG4gICAgICAgIFxuICAgICAgICAvLyBJbml0aWFsaXplIG1hcCBoYW5kbGVyXG4gICAgICAgIGlmIChtYXBIYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBtYXBIYW5kbGVyUmVmLmN1cnJlbnQuZGVzdHJveSgpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG1hcEhhbmRsZXJSZWYuY3VycmVudCA9IG5ldyBNYXBIYW5kbGVyKHtcbiAgICAgICAgICBjb250YWluZXI6IHN2Z0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgICAgIGxvY2F0aW9ucyxcbiAgICAgICAgICBjb250YWN0cyxcbiAgICAgICAgICBzZWxlY3RlZExvY2F0aW9uSWQsXG4gICAgICAgICAgb25Mb2NhdGlvblNlbGVjdDogaGFuZGxlTG9jYXRpb25TZWxlY3QsXG4gICAgICAgICAgZW5hYmxlWm9vbSxcbiAgICAgICAgICBlbmFibGVQYW5cbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBtYXBIYW5kbGVyUmVmLmN1cnJlbnQuaW5pdGlhbGl6ZSgpXG4gICAgICAgIHNldElzTWFwTG9hZGVkKHRydWUpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBsb2FkIG1hcCdcbiAgICAgIHNldEVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ01hcCBsb2FkaW5nIGVycm9yOicsIGVycilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0ZSBtYXAgd2hlbiBsb2NhdGlvbnMgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1hcEhhbmRsZXJSZWYuY3VycmVudCAmJiBpc01hcExvYWRlZCkge1xuICAgICAgbWFwSGFuZGxlclJlZi5jdXJyZW50LnVwZGF0ZUxvY2F0aW9ucyhsb2NhdGlvbnMpXG4gICAgfVxuICB9LCBbbG9jYXRpb25zLCBpc01hcExvYWRlZF0pXG5cbiAgLy8gVXBkYXRlIHNlbGVjdGVkIGxvY2F0aW9uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1hcEhhbmRsZXJSZWYuY3VycmVudCAmJiBpc01hcExvYWRlZCkge1xuICAgICAgbWFwSGFuZGxlclJlZi5jdXJyZW50LnNldFNlbGVjdGVkTG9jYXRpb24oc2VsZWN0ZWRMb2NhdGlvbklkIHx8IG51bGwpXG4gICAgfVxuICB9LCBbc2VsZWN0ZWRMb2NhdGlvbklkLCBpc01hcExvYWRlZF0pXG5cbiAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChtYXBIYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWFwSGFuZGxlclJlZi5jdXJyZW50LmRlc3Ryb3koKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gQXV0by1sb2FkIG1hcCBpbW1lZGlhdGVseVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNNYXBMb2FkZWQgJiYgIWlzTG9hZGluZyAmJiAhZXJyb3IpIHtcbiAgICAgIGxvYWRNYXAoKVxuICAgIH1cbiAgfSwgW2lzTWFwTG9hZGVkLCBpc0xvYWRpbmcsIGVycm9yXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgY2xhc3NOYW1lPXtjbHN4KCdyZWxhdGl2ZSBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeScsIGNsYXNzTmFtZSl9XG4gICAgICBzdHlsZT17e1xuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHRvdWNoQWN0aW9uOiAnbWFuaXB1bGF0aW9uJywgLy8gQWxsb3cgem9vbSBhbmQgcGFuIGdlc3R1cmVzXG4gICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyAvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uIG9uIHRvdWNoXG4gICAgICB9fVxuICAgID5cbiAgICAgIHsvKiBMb2FkaW5nIFN0YXRlICovfVxuICAgICAgeyFpc01hcExvYWRlZCAmJiAhZXJyb3IgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICB7aXNMb2FkaW5nID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8TG9hZGluZ1NwaW5uZXIgc2l6ZT1cImxnXCIgLz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtNCB0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+S2FydGUgd2lyZCBnZWxhZGVuLi4uPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IHNob3dMb2FkaW5nQnV0dG9uID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTYgaC0xNiBiZy1tZWMtcHJpbWFyeS8xMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbXgtYXV0byBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cInctOCBoLTggdGV4dC1tZWMtcHJpbWFyeVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2VMaW5lY2FwPVwicm91bmRcIiBzdHJva2VMaW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlV2lkdGg9ezJ9IGQ9XCJNOSAyMGwtNS40NDctMi43MjRBMSAxIDAgMDEzIDE2LjM4MlY1LjYxOGExIDEgMCAwMTEuNDQ3LS44OTRMOSA3bTAgMTNsNi0zbS02IDNWN202IDEwbDQuNTUzIDIuMjc2QTEgMSAwIDAwMjEgMTguMzgyVjcuNjE4YTEgMSAwIDAwLTEuNDQ3LS44OTRMMTUgNG0wIDEzVjRtLTYgM2w2LTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICBJbnRlcmFrdGl2ZSBLYXJ0ZVxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeSBtYi00XCI+XG4gICAgICAgICAgICAgICAgICBLbGlja2VuIFNpZSBhdWYgXCJLYXJ0ZSBsYWRlblwiIHVtIGRpZSBpbnRlcmFrdGl2ZSBTdGFuZG9ydGthcnRlIGFuenV6ZWlnZW5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17bG9hZE1hcH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZ31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEthcnRlIGxhZGVuXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIHNpemU9XCJsZ1wiIC8+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTQgdGV4dC10ZXh0LXNlY29uZGFyeVwiPkthcnRlIHdpcmQgYXV0b21hdGlzY2ggZ2VsYWRlbi4uLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEVycm9yIFN0YXRlICovfVxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy0xNiBoLTE2IGJnLXJlZC0xMDAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItM1wiPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cInctOCBoLTggdGV4dC1yZWQtNTAwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlTGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZVdpZHRoP
25114XsyfSBkPVwiTTEyIDl2Mm0wIDRoLjAxbS02LjkzOCA0aDEzLjg1NmMxLjU0IDAgMi41MDItMS42NjcgMS43MzItMi41TDEzLjczMiA0Yy0uNzctLjgzMy0xLjk2NC0uODMzLTIuNzMyIDBMMy43MzIgMTYuNWMtLjc3LjgzMy4xOTIgMi41IDEuNzMyIDIuNXpcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgIEthcnRlIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlblxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbWItNCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17bG9hZE1hcH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXNlY29uZGFyeVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEVybmV1dCB2ZXJzdWNoZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBTVkcgQ29udGFpbmVyICovfVxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3N2Z0NvbnRhaW5lclJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICd3LWZ1bGwgaC1mdWxsIG92ZXJmbG93LWhpZGRlbicsXG4gICAgICAgICAgIWlzTWFwTG9hZGVkICYmICdvcGFjaXR5LTAnXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgdHJhbnNpdGlvbjogJ29wYWNpdHkgMC4zcyBlYXNlLWluLW91dCcsXG4gICAgICAgICAgdG91Y2hBY3Rpb246ICdtYW5pcHVsYXRpb24nLCAvLyBBbGxvdyB6b29tIGFuZCBwYW4gZ2VzdHVyZXNcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyAvLyBTaG93IHBvaW50ZXIgY3Vyc29yIGZvciBjbGlja2FibGUgbG9jYXRpb25zXG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICB7LyogTWFwIENvbnRyb2xzICovfVxuICAgICAge3Nob3dDb250cm9scyAmJiBpc01hcExvYWRlZCAmJiBtYXBIYW5kbGVyUmVmLmN1cnJlbnQgJiYgKFxuICAgICAgICA8TWFwQ29udHJvbHNcbiAgICAgICAgICBtYXBIYW5kbGVyPXttYXBIYW5kbGVyUmVmLmN1cnJlbnR9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTQgcmlnaHQtNFwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFpbCwgUGhvbmUsIE1hcFBpbiwgVXNlciB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIENPTlRBQ1QgQ0FSRCAtIFNpbmdsZSBTb3VyY2Ugb2YgVHJ1dGhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBVbmlmaWVkQ29udGFjdENhcmRQcm9wcyB7XG4gIGNvbnRhY3Q6IENvbnRhY3RcbiAgdmFyaWFudD86ICdjb21wYWN0JyB8ICdkZWZhdWx0JyB8ICdkZXRhaWxlZCdcbiAgb25DbGljaz86IChjb250YWN0OiBDb250YWN0KSA9PiB2b2lkXG4gIHNob3dMb2NhdGlvbj86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBVbmlmaWVkQ29udGFjdENhcmQ6IFJlYWN0LkZDPFVuaWZpZWRDb250YWN0Q2FyZFByb3BzPiA9ICh7XG4gIGNvbnRhY3QsXG4gIHZhcmlhbnQgPSAnZGVmYXVsdCcsXG4gIG9uQ2xpY2ssXG4gIHNob3dMb2NhdGlvbiA9IGZhbHNlLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgLy8g8J+UjSBERUJVRzogTG9nIGNvbnRhY3QgZGF0YVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogRnVsbCBjb250YWN0IG9iamVjdDonLCBjb250YWN0KVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogQ29udGFjdCBmaWVsZHM6Jywge1xuICAgIGlkOiBjb250YWN0LmlkLFxuICAgIGZ1bGxOYW1lOiBjb250YWN0LmZ1bGxOYW1lLFxuICAgIHBvc2l0aW9uOiBjb250YWN0LnBvc2l0aW9uLFxuICAgIGRlcGFydG1lbnQ6IGNvbnRhY3QuZGVwYXJ0bWVudCxcbiAgICBlbWFpbDogY29udGFjdC5lbWFpbCxcbiAgICBwaG9uZTogY29udGFjdC5waG9uZSxcbiAgICBtb2JpbGU6IGNvbnRhY3QubW9iaWxlLFxuICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAgIGxvY2F0aW9uTmFtZTogY29udGFjdC5sb2NhdGlvbk5hbWUsXG4gICAgbG9jYXRpb25DaXR5OiBjb250YWN0LmxvY2F0aW9uQ2l0eSxcbiAgICBzcGVjaWFsdGllczogY29udGFjdC5zcGVjaWFsdGllcyxcbiAgICBzb2NpYWxMaW5rczogY29udGFjdC5zb2NpYWxMaW5rc1xuICB9KVxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgIG9uQ2xpY2s/Lihjb250YWN0KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRW1haWxDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYG1haWx0bzoke2NvbnRhY3QuZW1haWx9YFxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGhvbmVDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChjb250YWN0LnBob25lKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGB0ZWw6JHtjb250YWN0LnBob25lfWBcbiAgICB9XG4gIH1cblxuICAvLyBDT01QQUNUIFZBUklBTlQgLSBGb3IgbGlzdHMgYW5kIHNtYWxsIHNwYWNlc1xuICBpZiAodmFyaWFudCA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgcC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSByb3VuZGVkLW1lYycsXG4gICAgICAgICAgJ2hvdmVyOmJvcmRlci1tZWMtcHJpbWFyeS8yMCBob3ZlcjpzaGFkb3ctY2FyZCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAnLFxuICAgICAgICAgICd0b3VjaC10YXJnZXQtbGcnLFxuICAgICAgICAgIG9uQ2xpY2sgJiYgJ2N1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICA+XG4gICAgICAgI
25114HsvKiBBdmF0YXIgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIHtjb250YWN0LmltYWdlID8gKFxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9e2NvbnRhY3QuaW1hZ2V9XG4gICAgICAgICAgICAgIGFsdD17Y29udGFjdC5mdWxsTmFtZX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy0xMCBoLTEwIHJvdW5kZWQtZnVsbCBvYmplY3QtY292ZXIgb2JqZWN0LWNlbnRlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTAgaC0xMCBiZy1tZWMtcHJpbWFyeS8xMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy01IGgtNSB0ZXh0LW1lYy1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBJbmZvICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlXCI+e2NvbnRhY3QuZnVsbE5hbWV9PC9oMz5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgdHJ1bmNhdGVcIj57Y29udGFjdC5wb3NpdGlvbn08L3A+XG4gICAgICAgICAgXG4gICAgICAgICAgey8qIERlcGFydG1lbnQvU3BlY2lhbHRpZXMgKi99XG4gICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMgJiYgY29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC10ZXh0LW11dGVkIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgIHtjb250YWN0LnNwZWNpYWx0aWVzLnNsaWNlKDAsIDIpLmpvaW4oJywgJyl9XG4gICAgICAgICAgICAgIHtjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCA+IDIgJiYgYCArJHtjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCAtIDJ9YH1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICAgIFxuICAgICAgICAgIHtzaG93TG9jYXRpb24gJiYgY29udGFjdC5sb2NhdGlvbk5hbWUgJiYgKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXRleHQtbXV0ZWQgdHJ1bmNhdGUgZmxleCBpdGVtcy1jZW50ZXIgbXQtMVwiPlxuICAgICAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctMyBoLTMgbXItMVwiIC8+XG4gICAgICAgICAgICAgIHtjb250YWN0LmxvY2F0aW9uTmFtZX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogUXVpY2sgQWN0aW9ucyAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIHtjb250YWN0LmVtYWlsICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRW1haWxDbGlja31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicC0xLjUgdGV4dC10ZXh0LW11dGVkIGhvdmVyOnRleHQtbWVjLXByaW1hcnkgaG92ZXI6YmctbWVjLXByaW1hcnkvMTAgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRS1NYWlsIHNlbmRlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7Y29udGFjdC5waG9uZSAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVBob25lQ2xpY2t9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInAtMS41IHRleHQtdGV4dC1tdXRlZCBob3Zlcjp0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOmJnLW1lYy1wcmltYXJ5LzEwIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkFucnVmZW5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIERFVEFJTEVEIFZBUklBTlQgLSBGb3IgZ3JpZHMgd2l0aCBtb3JlIHNwYWNlXG4gIGlmICh2YXJpYW50ID09PSAnZGV0YWlsZWQnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICdiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBib3JkZXIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnkgcC02IGN1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICAnaG92ZXI6Ym9yZGVyLW1lYy1wcmltYXJ5LzIwIGhvdmVyOnNoYWRvdy1jYXJkIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgJ3RvdWNoLXRhcmdldC1sZycsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgc3BhY2UteC00IG1iLTRcIj5cbiAgICAgICAgICB7LyogQXZhdGFyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAge2NvbnRhY3QuaW1hZ2UgPyAoXG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e2NvbnRhY3QuaW1hZ2V9XG4gICAgICAgICAgICAgICAgYWx0PXtjb250YWN0LmZ1bGxOYW1lfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTYgaC0xNiByb3VuZGVkLWZ1bGwgb2JqZWN0LWNvdmVyIG9iamVjdC1jZW50ZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE2IGgtMTYgYmctbWVjLXByaW1hcnkvMTAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy04IGgtOCB0ZXh0LW1lYy1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIEJhc2ljIEluZm8gKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0xXCI+XG4gICAgICAgICAgICAgI
25114Htjb250YWN0LmZ1bGxOYW1lfVxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbWItMVwiPlxuICAgICAgICAgICAgICB7Y29udGFjdC5wb3NpdGlvbn1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIHtjb250YWN0LmRlcGFydG1lbnQgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIHtjb250YWN0LmRlcGFydG1lbnR9XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7c2hvd0xvY2F0aW9uICYmIGNvbnRhY3QubG9jYXRpb25OYW1lICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWQgZmxleCBpdGVtcy1jZW50ZXIgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtci0xXCIgLz5cbiAgICAgICAgICAgICAgICB7Y29udGFjdC5sb2NhdGlvbk5hbWV9LCB7Y29udGFjdC5sb2NhdGlvbkNpdHl9XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBTcGVjaWFsdGllcyAqL31cbiAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMgJiYgY29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMuc2xpY2UoMCwgNCkubWFwKChzcGVjaWFsdHksIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0yIHB5LTEgYmctbWVjLXByaW1hcnkvMTAgdGV4dC1tZWMtcHJpbWFyeSB0ZXh0LXhzIHJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3NwZWNpYWx0eX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICB7Y29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiA0ICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJweC0yIHB5LTEgYmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0ZXh0LXRleHQtbXV0ZWQgdGV4dC14cyByb3VuZGVkLWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICt7Y29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggLSA0fSB3ZWl0ZXJlXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIExhbmd1YWdlcyAqL31cbiAgICAgICAge2NvbnRhY3QubGFuZ3VhZ2VzICYmIGNvbnRhY3QubGFuZ3VhZ2VzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbWItMlwiPlNwcmFjaGVuOjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMVwiPlxuICAgICAgICAgICAgICB7Y29udGFjdC5sYW5ndWFnZXMuc2xpY2UoMCwgMykubWFwKChsYW5ndWFnZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTIgcHktMSBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSB0ZXh0LXRleHQtcHJpbWFyeSB0ZXh0LXhzIHJvdW5kZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtsYW5ndWFnZX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICB7Y29udGFjdC5sYW5ndWFnZXMubGVuZ3RoID4gMyAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicHgtMiBweS0xIGJnLWJhY2tncm91bmQtdGVydGlhcnkgdGV4dC10ZXh0LW11dGVkIHRleHQteHMgcm91bmRlZFwiPlxuICAgICAgICAgICAgICAgICAgK3tjb250YWN0Lmxhbmd1YWdlcy5sZW5ndGggLSAzfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBCaW8gKi99XG4gICAgICAgIHtjb250YWN0LmJpbyAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbGluZS1jbGFtcC0zXCI+XG4gICAgICAgICAgICAgIHtjb250YWN0LmJpb31cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7LyogQ29udGFjdCBBY3Rpb25zICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyBwdC00IGJvcmRlci10IGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5XCI+XG4gICAgICAgICAge2NvbnRhY3QuZW1haWwgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVFbWFpbENsaWNrfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSB0ZXh0LXNtIGZsZXgtMSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TWFpbCBjbGFzc05hbWU9XCJ3LTQgaC00IG1yLTJcIiAvPlxuICAgICAgICAgICAgICBFLU1haWxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICl9XG4gICAgICAgICAge2NvbnRhY3QucGhvbmUgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQaG9uZUNsaWNrfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tc2Vjb25kYXJ5IHRleHQtc20gZmxleC0xIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQaG9uZSBjbGFzc05hbWU9XCJ3LTQgaC00IG1yLTJcIiAvPlxuICAgICAgICAgICAgICB
25114BbnJ1ZmVuXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIERFRkFVTFQgVkFSSUFOVCAtIE1FQyBEZXNpZ24gd2l0aCByZWQgc3RyaXBlLCBzcGVjaWZpYyBjb2xvcnNcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICdiZy13aGl0ZSByb3VuZGVkLWxnIG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlciBzaGFkb3ctc20nLFxuICAgICAgICAnaG92ZXI6c2hhZG93LW1kIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICdoLWZ1bGwgZmxleCBmbGV4LWNvbCcsIC8vIEZ1bGwgaGVpZ2h0ICsgZmxleCBjb2x1bW4gZm9yIGVxdWFsIGhlaWdodCBjYXJkc1xuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgIHN0eWxlPXt7IGZvbnRGYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZSwgQXJpYWwsIHNhbnMtc2VyaWYnIH19XG4gICAgPlxuICAgICAgey8qIFJlZCBTdHJpcGUgLSA1cHggKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLVs1cHhdXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2QyMDAyOCcgfX0+PC9kaXY+XG5cbiAgICAgIHsvKiBMYXJnZSBJbWFnZSAtIFJlc3BvbnNpdmUgSGVpZ2h0ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB3LWZ1bGwgaC1bMjRyZW1dIHNtOmgtWzI2cmVtXSBtZDpoLVsyOHJlbV0gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICB7Y29udGFjdC5pbWFnZSA/IChcbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBzcmM9e2NvbnRhY3QuaW1hZ2V9XG4gICAgICAgICAgICBhbHQ9e2NvbnRhY3QuZnVsbE5hbWV9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlciBvYmplY3QtY2VudGVyXCJcbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBiZy1ncmF5LTIwMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy0xNiBoLTE2IHRleHQtZ3JheS00MDBcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBDb250YWN0IEluZm9ybWF0aW9uIEJveCAtICNFMEU2RUIgQmFja2dyb3VuZCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC02IGZsZXgtMSBmbGV4IGZsZXgtY29sXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI0UwRTZFQicgfX0+XG4gICAgICAgIHsvKiBQb3NpdGlvbiAqL31cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSBtYi0yXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5cbiAgICAgICAgICB7Y29udGFjdC5wb3NpdGlvbn1cbiAgICAgICAgICB7Y29udGFjdC5kZXBhcnRtZW50ICYmIGAg4oCiICR7Y29udGFjdC5kZXBhcnRtZW50fWB9XG4gICAgICAgIDwvcD5cblxuICAgICAgICB7LyogTmFtZSAqL31cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQteGwgZm9udC1zZW1pYm9sZCBtYi00XCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5cbiAgICAgICAgICB7Y29udGFjdC5mdWxsTmFtZX1cbiAgICAgICAgPC9oMz5cblxuICAgICAgICB7LyogQ29udGFjdCBJbmZvICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgIHtjb250YWN0LnBob25lICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlUGhvbmVDbGlja31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC0zIHJvdW5kZWQtbGcgaG92ZXI6Ymctd2hpdGUvNTAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyknIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQaG9uZSBjbGFzc05hbWU9XCJ3LTUgaC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW1cIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19Pntjb250YWN0LnBob25lfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7Y29udGFjdC5lbWFpbCAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUVtYWlsQ2xpY2t9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyB3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzUwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpJyB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8TWFpbCBjbGFzc05hbWU9XCJ3LTUgaC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gYnJlYWstYWxsXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT57Y29udGFjdC5lbWFpbH08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTG9jYXRpb24gKi99XG4gICAgICAgIHtzaG93TG9jYXRpb24gJiYgY29udGFjdC5sb2NhdGlvbk5hbWUgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBwdC00IGJvcmRlci10XCIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICcjYTNiMmMyJyB9fT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHRleHQtc21cIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctNCBoLTRcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj57Y29udGFjdC5sb2NhdGlvbk5hbWV9LCB7Y29udGFjdC5sb2NhdGlvbkNpdHl9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIFNwZWNpYWx0aWVzICovfVxuICAgICAgICB7Y29udGFjdC5zcGVjaWFsdGllcyAmJiBjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBwdC00IGJvcmRlci10XCIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICcjYTNiMmMyJyB9fT5cbiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIG1iLTJcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PkZhY2hiZXJlaWNoZTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0yXCI+XG4gICAgICAgICAgICAgI
25114Htjb250YWN0LnNwZWNpYWx0aWVzLnNsaWNlKDAsIDMpLm1hcCgoc3BlY2lhbHR5LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtMiBweS0xIHRleHQteHMgcm91bmRlZC1sZ1wiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjZDIwMDI4JywgY29sb3I6ICd3aGl0ZScgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c3BlY2lhbHR5fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIHtjb250YWN0LnNwZWNpYWx0aWVzLmxlbmd0aCA+IDMgJiYgKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0yIHB5LTEgdGV4dC14cyByb3VuZGVkLWxnXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNhM2IyYzInLCBjb2xvcjogJ3doaXRlJyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICt7Y29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggLSAzfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBTb2NpYWwgTGlua3MgQmFyIC0gI0VGRjNGNSBCYWNrZ3JvdW5kICovfVxuICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MgJiYgY29udGFjdC5zb2NpYWxMaW5rcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTRcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRUZGM0Y1JyB9fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtNFwiPlxuICAgICAgICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MubWFwKChsaW5rLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc1hpbmcgPSBsaW5rLnBsYXRmb3JtPy50b0xvd2VyQ2FzZSgpID09PSAneGluZycgfHwgbGluay51cmw/LmluY2x1ZGVzKCd4aW5nLmNvbScpXG4gICAgICAgICAgICAgIGNvbnN0IGlzTGlua2VkSW4gPSBsaW5rLnBsYXRmb3JtPy50b0xvd2VyQ2FzZSgpID09PSAnbGlua2VkaW4nIHx8IGxpbmsudXJsPy5pbmNsdWRlcygnbGlua2VkaW4uY29tJylcblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgaHJlZj17bGluay51cmx9XG4gICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOm9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAnI2EzYjJjMicgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7aXNYaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTUgaC01XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMzg0IDUxMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYyLjcgMjEwYy0xLjggMy4zLTI1LjIgNDQuNC03MC4xIDEyMy41LTQuOSA4LjMtMTAuOCAxMi41LTE3LjcgMTIuNUg5LjhjLTcuNyAwLTEyLjEtNy41LTguNS0xNC40bDY5LTEyMS4zYy4yIDAgLjItLjEgMC0uM2wtNDMuOS03NS42Yy00LjMtNy44LjMtMTQuMSA4LjUtMTQuMUgxMDBjNy4zIDAgMTMuMyA0LjEgMTggMTIuMmw0NC43IDc3LjV6TTM4Mi42IDQ2LjFsLTE0NCAyNTN2LjNMMzMwLjIgNDY2YzMuOSA3LjEuMiAxNC4xLTguNSAxNC4xaC02NS4yYy03LjYgMC0xMy42LTQtMTgtMTIuMmwtOTIuNC0xNjguNWMzLjMtNS44IDUxLjUtOTAuOCAxNDQuOC0yNTUuMiA0LjYtOC4xIDEwLjQtMTIuMiAxNy41LTEyLjJoNjUuN2M4IDAgMTIuMyA2LjcgOC41IDE0LjF6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICB7aXNMaW5rZWRJbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy01IGgtNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMC4yOCA0NDhINy40VjE0OC45aDkyLjg4ek01My43OSAxMDguMUMyNC4wOSAxMDguMSAwIDgzLjUgMCA1My44YTUzLjc5IDUzLjc5IDAgMCAxIDEwNy41OCAwYzAgMjkuNy0yNC4xIDU0LjMtNTMuNzkgNTQuM3pNNDQ3LjkgNDQ4aC05Mi42OFYzMDIuNGMwLTM0LjctLjctNzkuMi00OC4yOS03OS4yLTQ4LjI5IDAtNTUuNjkgMzcuNy01NS42OSA3Ni43VjQ0OGgtOTIuNzhWMTQ4LjloODkuMDh2NDAuOGgxLjNjMTIuNC0yMy41IDQyLjY5LTQ4LjMgODcuODgtNDguMyA5NCAwIDExMS4yOCA2MS45IDExMS4yOCAxNDIuM1Y0NDh6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG4iLCIvLyBERVBSRUNBVEVEOiBVc2UgVW5pZmllZENvbnRhY3RDYXJkIGluc3RlYWRcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFVuaWZpZWRDb250YWN0Q2FyZCB9IGZyb20gJy4uL1VJL1VuaWZpZWRDb250YWN0Q2FyZCdcbmltcG9ydCB0eXBlIHsgQ29udGFjdCwgQ29udGFjdENhcmRQcm9wcyB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4J1xuXG5leHBvcnQgY29uc3QgQ29udGFjdENhcmQ6IFJlYWN0LkZDPENvbnRhY3RDYXJkUHJvcHM+ID0gKHtcbiAgY29udGFjdCxcbiAgb25DbGljayxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgc2hvd0xvY2F0aW9uID0gZmFsc2UsXG4gIGNsYXNzTmFtZVxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxVbmlmaWVkQ29udGFjdENhcmRcbiAgICAgIGNvbnRhY3Q9e2NvbnRhY3R9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgdmFyaWFudD17dmFyaWFudH1cbiAgICAgIHNob3dMb2NhdGlvbj17c2hvd0xvY2F0aW9ufVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgLz5cbiAgKVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7
25114IENvbnRhY3RDYXJkIH0gZnJvbSAnLi9Db250YWN0Q2FyZCdcbmltcG9ydCB7IExvYWRpbmdDYXJkLCBMb2FkaW5nTGlzdCB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL0xvYWRpbmdTcGlubmVyJ1xuaW1wb3J0IHsgdXNlRmlsdGVyZWRDb250YWN0cyB9IGZyb20gJ0Bob29rcy91c2VDb250YWN0cydcbmltcG9ydCB7IHVzZVZpZXdQcmVmZXJlbmNlcywgdXNlQ29udGFjdE1vZGFsIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcbmltcG9ydCB7IFVzZXJzLCBTZWFyY2ggfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCB0eXBlIHsgQ29udGFjdEdyaWRQcm9wcyB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4J1xuXG5leHBvcnQgY29uc3QgQ29udGFjdEdyaWQ6IFJlYWN0LkZDPENvbnRhY3RHcmlkUHJvcHM+ID0gKHtcbiAgY29udGFjdHM6IHByb3ZpZGVkQ29udGFjdHMsXG4gIGxvYWRpbmc6IHByb3ZpZGVkTG9hZGluZyxcbiAgb25Db250YWN0Q2xpY2ssXG4gIGxheW91dDogcHJvdmlkZWRMYXlvdXQsXG4gIGNvbHVtbnMgPSAzLFxuICBjbGFzc05hbWUsXG4gIGxvY2F0aW9uSWRcbn0pID0+IHtcbiAgY29uc3QgeyBjb250YWN0TGF5b3V0IH0gPSB1c2VWaWV3UHJlZmVyZW5jZXMoKVxuICBjb25zdCB7IG9wZW46IG9wZW5Db250YWN0TW9kYWwgfSA9IHVzZUNvbnRhY3RNb2RhbCgpXG4gIFxuICAvLyBVc2UgcHJvdmlkZWQgY29udGFjdHMgb3IgZmV0Y2ggZmlsdGVyZWQgY29udGFjdHNcbiAgY29uc3Qge1xuICAgIGNvbnRhY3RzOiBmZXRjaGVkQ29udGFjdHMsXG4gICAgbG9jYXRpb25TcGVjaWZpY0NvbnRhY3RzOiBmZXRjaGVkTG9jYXRpb25TcGVjaWZpY0NvbnRhY3RzLFxuICAgIGlzTG9hZGluZzogZmV0Y2hlZExvYWRpbmcsXG4gICAgZXJyb3JcbiAgfSA9IHVzZUZpbHRlcmVkQ29udGFjdHMobG9jYXRpb25JZClcblxuICAvLyBJZiBsb2NhdGlvbklkIGlzIHByb3ZpZGVkLCB1c2Ugb25seSBsb2NhdGlvbi1zcGVjaWZpYyBjb250YWN0cyAoZm9yIExvY2F0aW9uTW9kYWwpXG4gIC8vIE90aGVyd2lzZSB1c2UgYWxsIGNvbnRhY3RzIChmb3IgbWFpbiBncmlkIHZpZXcpXG4gIGNvbnN0IGNvbnRhY3RzID0gcHJvdmlkZWRDb250YWN0cyB8fCAobG9jYXRpb25JZCA/IGZldGNoZWRMb2NhdGlvblNwZWNpZmljQ29udGFjdHMgOiBmZXRjaGVkQ29udGFjdHMpXG4gIGNvbnN0IGlzTG9hZGluZyA9IHByb3ZpZGVkTG9hZGluZyB8fCBmZXRjaGVkTG9hZGluZ1xuICBjb25zdCBsYXlvdXQgPSBwcm92aWRlZExheW91dCB8fCBjb250YWN0TGF5b3V0XG5cbiAgLy8g8J+UjSBERUJVRzogTG9nIGNvbnRhY3QgZGF0YVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogQ29udGFjdEdyaWQgLSBjb250YWN0cyBhcnJheTonLCBjb250YWN0cylcbiAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IENvbnRhY3RHcmlkIC0gY29udGFjdHMgY291bnQ6JywgY29udGFjdHM/Lmxlbmd0aCB8fCAwKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogQ29udGFjdEdyaWQgLSBsb2NhdGlvbklkOicsIGxvY2F0aW9uSWQpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBDb250YWN0R3JpZCAtIGxheW91dDonLCBsYXlvdXQpXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBDb250YWN0R3JpZCAtIGlzTG9hZGluZzonLCBpc0xvYWRpbmcpXG5cbiAgLy8gSGFuZGxlIGNvbnRhY3QgY2xpY2tcbiAgY29uc3QgaGFuZGxlQ29udGFjdENsaWNrID0gKGNvbnRhY3Q6IGFueSkgPT4ge1xuICAgIGlmIChvbkNvbnRhY3RDbGljaykge1xuICAgICAgb25Db250YWN0Q2xpY2soY29udGFjdClcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlbkNvbnRhY3RNb2RhbChjb250YWN0KVxuICAgIH1cbiAgfVxuXG4gIC8vIExvYWRpbmcgc3RhdGVcbiAgaWYgKGlzTG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgICAge2xheW91dCA9PT0gJ2dyaWQnID8gKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgJ2dyaWQgZ2FwLTQnLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gMSAmJiAnZ3JpZC1jb2xzLTEnLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gMiAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTInLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gMyAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMnLFxuICAgICAgICAgICAgY29sdW1ucyA9PT0gNCAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTQnXG4gICAgICAgICAgKX0+XG4gICAgICAgICAgICB7QXJyYXkuZnJvbSh7IGxlbmd0aDogNiB9KS5tYXAoKF8sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxMb2FkaW5nQ2FyZCBrZXk9e2luZGV4fSAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvYWRpbmdMaXN0IGl0ZW1zPXs2fSAvPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gRXJyb3Igc3RhdGVcbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCd0ZXh0LWNlbnRlciBweS04JywgY2xhc3NOYW1lKX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy0xNiBoLTE2IGJnLXJlZC0xMDAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItNFwiPlxuICAgICAgICAgIDxVc2VycyBjbGFzc05hbWU9XCJ3LTggaC04IHRleHQtcmVkLTUwMFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgICBGZWhsZXIgYmVpbSBMYWRlbiBkZXIgS29udGFrdGVcbiAgICAgICAgPC9oMz5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgIERpZSBBbnNwcmVjaHBhcnRuZXIga29ubnRlbiBuaWNodCBnZWxhZGVuIHdlcmRlbi5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gRW1wdHkgc3RhdGVcbiAgaWYgKCFjb250YWN0cyB8fCBjb250YWN0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3RleHQtY2VudGVyIHB5LTgnLCBjbGFzc05hbWUpfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE2IGgtMTYgYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItNFwiPlxuICAgICAgICAgIDxTZWFyY2ggY2xhc3NOYW1lPVwidy04IGgtOCB0ZXh0LXRleHQtbXV0ZWRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgS2VpbmUgQW5zcHJlY2hwYXJ0bmVyIGdlZnVuZGVuXG4gICAgICAgIDwvaDM+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICB7bG9jYXRpb25JZCBcbiAgICAgICAgICAgID8gJ0bDvHIgZGllc2VuIFN0YW5kb3J0IHNpbmQga2VpbmUgQW5zcHJlY2hwYXJ0bmVyIHZlcmbDvGdiYXIuJ1xuICAgICAgICAgICAgOiAnVmVyc3VjaGVuIFNpZSBhbmRlcmUgU3VjaGtyaXRlcmllbiBvZGVyIEZpbHRlci4nXG4gICAgICAgICAgfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICAvLyBHcmlkIGxheW91dFxuICBpZiAobGF5b3V0ID09PSAnZ3JpZCcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICdncmlkIGdhcC00IGl0ZW
251141zLXN0cmV0Y2gnLFxuICAgICAgICAgIGNvbHVtbnMgPT09IDEgJiYgJ2dyaWQtY29scy0xJyxcbiAgICAgICAgICBjb2x1bW5zID09PSAyICYmICdncmlkLWNvbHMtMSBzbTpncmlkLWNvbHMtMicsXG4gICAgICAgICAgY29sdW1ucyA9PT0gMyAmJiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMnLCAvLyAzIEthY2hlbG4gYXVmIERlc2t0b3BcbiAgICAgICAgICBjb2x1bW5zID09PSA0ICYmICdncmlkLWNvbHMtMSBzbTpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyB4bDpncmlkLWNvbHMtNCdcbiAgICAgICAgKX0+XG4gICAgICAgICAge2NvbnRhY3RzLm1hcCgoY29udGFjdCkgPT4gKFxuICAgICAgICAgICAgPENvbnRhY3RDYXJkXG4gICAgICAgICAgICAgIGtleT17Y29udGFjdC5pZH1cbiAgICAgICAgICAgICAgY29udGFjdD17Y29udGFjdH1cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ29udGFjdENsaWNrfVxuICAgICAgICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgIHNob3dMb2NhdGlvbj17IWxvY2F0aW9uSWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIHsvKiBSZXN1bHRzIGNvdW50ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgdGV4dC1jZW50ZXIgdGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICAgICAgICB7Y29udGFjdHMubGVuZ3RofSBBbnNwcmVjaHBhcnRuZXJ7Y29udGFjdHMubGVuZ3RoICE9PSAxID8gJycgOiAnJ31cbiAgICAgICAgICB7bG9jYXRpb25JZCAmJiAnIGFuIGRpZXNlbSBTdGFuZG9ydCd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gTGlzdCBsYXlvdXRcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgIHtjb250YWN0cy5tYXAoKGNvbnRhY3QpID0+IChcbiAgICAgICAgICA8Q29udGFjdENhcmRcbiAgICAgICAgICAgIGtleT17Y29udGFjdC5pZH1cbiAgICAgICAgICAgIGNvbnRhY3Q9e2NvbnRhY3R9XG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb250YWN0Q2xpY2t9XG4gICAgICAgICAgICB2Y
25114XJpYW50PVwiY29tcGFjdFwiXG4gICAgICAgICAgICBzaG93TG9jYXRpb249eyFsb2NhdGlvbklkfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIHsvKiBSZXN1bHRzIGNvdW50ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IHRleHQtY2VudGVyIHRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgIHtjb250YWN0cy5sZW5ndGh9IEFuc3ByZWNocGFydG5lcntjb250YWN0cy5sZW5ndGggIT09IDEgPyAnJyA6ICcnfVxuICAgICAgICB7bG9jYXRpb25JZCAmJiAnIGFuIGRpZXNlbSBTdGFuZG9ydCd9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyBTcGVjaWFsaXplZCBjb21wb25lbnRzXG5leHBvcnQgY29uc3QgTG9jYXRpb25Db250YWN0R3JpZDogUmVhY3QuRkM8e1xuICBsb2NhdGlvbklkOiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIG1heEl0ZW1zPzogbnVtYmVyXG59PiA9ICh7IGxvY2F0aW9uSWQsIGNsYXNzTmFtZSwgbWF4SXRlbXMgfSkgPT4ge1xuICBjb25zdCB7IGNvbnRhY3RzLCBpc0xvYWRpbmcsIGVycm9yIH0gPSB1c2VGaWx0ZXJlZENvbnRhY3RzKGxvY2F0aW9uSWQpXG4gIFxuICBjb25zdCBkaXNwbGF5Q29udGFjdHMgPSBtYXhJdGVtcyA/IGNvbnRhY3RzLnNsaWNlKDAsIG1heEl0ZW1zKSA6IGNvbnRhY3RzXG4gIGNvbnN0IGhhc01vcmUgPSBtYXhJdGVtcyAmJiBjb250YWN0cy5sZW5ndGggPiBtYXhJdGVtc1xuXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgIDxMb2FkaW5nTGlzdCBpdGVtcz17M30gLz5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGlmIChlcnJvciB8fCAhY29udGFjdHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCd0ZXh0LWNlbnRlciBweS00JywgY2xhc3NOYW1lKX0+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgICAgS2VpbmUgQW5zcHJlY2hwYXJ0bmVyIHZlcmbDvGdiYXJcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtNiBpdGVtcy1zdHJldGNoXCI+XG4gICAgICAgIHtkaXNwbGF5Q29udGFjdHMubWFwKChjb250YWN0KSA9PiAoXG4gICAgICAgICAgPENvbnRhY3RDYXJkXG4gICAgICAgICAgICBrZXk9e2NvbnRhY3QuaWR9XG4gICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtoYXNNb3JlICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtbWVjLXByaW1hcnkgaG92ZXI6dW5kZXJsaW5lXCI+XG4gICAgICAgICAgICB7Y29udGFjdHMubGVuZ3RoIC0gbWF4SXRlbXMhfSB3ZWl0ZXJlIGFuemVpZ2VuXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgY29uc3QgRmVhdHVyZWRDb250YWN0R3JpZDogUmVhY3QuRkM8e1xuICBjb250YWN0czogYW55W11cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59PiA9ICh7IGNvbnRhY3RzLCBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCB7IG9wZW46IG9wZW5Db250YWN0TW9kYWwgfSA9IHVzZUNvbnRhY3RNb2RhbCgpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtNiBpdGVtcy1zdHJldGNoXCI+XG4gICAgICAgIHtjb250YWN0cy5tYXAoKGNvbnRhY3QpID0+IChcbiAgICAgICAgICA8Q29udGFjdENhcmRcbiAgICAgICAgICAgIGtleT17Y29udGFjdC5pZH1cbiAgICAgICAgICAgIGNvbnRhY3Q9e2NvbnRhY3R9XG4gICAgICAgICAgICBvbkNsaWNrPXtvcGVuQ29udGFjdE1vZGFsfVxuICAgICAgICAgICAgdmFyaWFudD1cImRldGFpbGVkXCJcbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBNYXBQaW4sIEJ1aWxkaW5nMiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcblxuaW50ZXJmYWNlIExvY2F0aW9uTWluaUdyaWRDYXJkUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbiAgb25DbGljaz86IChsb2NhdGlvbklkOiBzdHJpbmcpID0+IHZvaWRcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbk1pbmlHcmlkQ2FyZDogUmVhY3QuRkM8TG9jYXRpb25NaW5pR3JpZENhcmRQcm9wcz4gPSAoe1xuICBsb2NhdGlvbixcbiAgb25DbGljayxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgIG9uQ2xpY2s/Lihsb2NhdGlvbi5pZClcbiAgfVxuXG4gIGNvbnN0IGdldEltYWdlVXJsID0gKCkgPT4ge1xuICAgIHJldHVybiBsb2NhdGlvbi5pbWFnZSB8fCBsb2NhdGlvbi5sb2dvIHx8ICcvYXNzZXRzL3BsYWNlaG9sZG
25114VyLWxvY2F0aW9uLmpwZydcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICdiZy13aGl0ZSByb3VuZGVkLWxnIG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICdob3ZlcjpzaGFkb3ctbWQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgJ2JvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSBob3Zlcjpib3JkZXItbWVjLXByaW1hcnkvMzAnLFxuICAgICAgICAnaC1mdWxsIGZsZXggZmxleC1jb2wgdG91Y2gtdGFyZ2V0LWxnJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgID5cbiAgICAgIHsvKiBJbWFnZSAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgdy1mdWxsIGgtMzIgZmxleC1zaHJpbmstMCBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeVwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgc3JjPXtnZXRJbWFnZVVybCgpfVxuICAgICAgICAgIGFsdD17bG9jYXRpb24ubmFtZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAvPlxuICAgICAgICBcbiAgICAgICAgey8qIExvZ28gT3ZlcmxheSAtIEltcHJvdmVkIFNpemUgYW5kIFZpc2liaWxpdHkgKi99XG4gICAgICAgIHtsb2NhdGlvbi5sb2dvICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0zIHJpZ2h0LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUvOTUgYmFja2Ryb3AtYmx1ci1zbSByb3VuZGVkLWxnIHAtMiBzaGFkb3ctc20gYm9yZGVyIGJvcmRlci13aGl0ZS8yMFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPXtsb2NhdGlvbi5sb2dvfVxuICAgICAgICAgICAgICAgIGFsdD17YCR7bG9jYXRpb24ubmFtZX0gTG9nb2B9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHctYXV0byBvYmplY3QtY29udGFpbiBtYXgtdy1bNjBweF1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtMyBmbGV4LTEgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICB7LyogTmFtZSAqL31cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0xIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L2gzPlxuXG4gICAgICAgIHsvKiBDaXR5IHdpdGggUG9zdGFsIENvZGUgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5IG1iLTJcIj5cbiAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctMyBoLTMgbXItMSBmbGV4LXNocmluay0wXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0cnVuY2F0ZVwiPlxuICAgICAgICAgICAge2xvY2F0aW9uLnBvc3RhbENvZGUgJiYgYCR7bG9jYXRpb24ucG9zdGFsQ29kZX0gYH17bG9jYXRpb24uY2l0eX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBBZGRyZXNzICovfVxuICAgICAgICB7bG9jYXRpb24uYWRkcmVzcyAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IHRleHQteHMgdGV4dC10ZXh0LW11dGVkIG10LWF1dG9cIj5cbiAgICAgICAgICAgIDxCdWlsZGluZzIgY2xhc3NOYW1lPVwidy0zIGgtMyBtci0xIGZsZXgtc2hyaW5rLTAgbXQtMC41XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImxpbmUtY2xhbXAtMiBsZWFkaW5nLXRpZ2h0XCI+e2xvY2F0aW9uLmFkZHJlc3N9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFRBQlMgLSBTaW5nbGUgU291cmNlIG9mI
25114FRydXRoXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgVGFiIHtcbiAgaWQ6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIGNvdW50PzogbnVtYmVyXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBpY29uPzogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmludGVyZmFjZSBVbmlmaWVkVGFic1Byb3BzIHtcbiAgdGFiczogVGFiW11cbiAgYWN0aXZlVGFiOiBzdHJpbmdcbiAgb25UYWJDaGFuZ2U6ICh0YWJJZDogc3RyaW5nKSA9PiB2b2lkXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAncGlsbHMnIHwgJ3VuZGVybGluZSdcbiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgZnVsbFdpZHRoPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgVW5pZmllZFRhYnM6IFJlYWN0LkZDPFVuaWZpZWRUYWJzUHJvcHM+ID0gKHtcbiAgdGFicyxcbiAgYWN0aXZlVGFiLFxuICBvblRhYkNoYW5nZSxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgc2l6ZSA9ICdtZCcsXG4gIGNsYXNzTmFtZSxcbiAgZnVsbFdpZHRoID0gZmFsc2Vcbn0pID0+IHtcbiAgY29uc3QgaGFuZGxlVGFiQ2xpY2sgPSAodGFiSWQ6IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgb25UYWJDaGFuZ2UodGFiSWQpXG4gICAgfVxuICB9XG5cbiAgLy8gQmFzZSBzdHlsZXMgZm9yIGRpZmZlcmVudCB2YXJpYW50c1xuICBjb25zdCBnZXRWYXJpYW50U3R5bGVzID0gKCkgPT4ge1xuICAgIHN3aXRjaCAodmFyaWFudCkge1xuICAgICAgY2FzZSAncGlsbHMnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRhaW5lcjogJ2JnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtMScsXG4gICAgICAgICAgdGFiOiAncm91bmRlZC1tZWMtc20gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICBhY3RpdmU6ICdiZy13aGl0ZSBzaGFkb3ctc20gdGV4dC10ZXh0LXByaW1hcnknLFxuICAgICAgICAgIGluYWN0aXZlOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy13aGl0ZS81MCdcbiAgICAgICAgfVxuICAgICAgY2FzZSAndW5kZXJsaW5lJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250YWluZXI6ICdib3JkZXItYiBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeScsXG4gICAgICAgICAgdGFiOiAnYm9yZGVyLWItMiBib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIC1tYi1weCcsXG4gICAgICAgICAgYWN0aXZlOiAnYm9yZGVyLW1lYy1wcmltYXJ5IHRleHQtbWVjLXByaW1hcnknLFxuICAgICAgICAgIGluYWN0aXZlOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItdGV4dC1tdXRlZCdcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250YWluZXI6ICdiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYy1sZyBwLTEnLFxuICAgICAgICAgIHRhYjogJ3JvdW5kZWQtbWVjIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgYWN0aXZlOiAnYmctd2hpdGUgc2hhZG93LWNhcmQgdGV4dC10ZXh0LXByaW1hcnknLFxuICAgICAgICAgIGluYWN0aXZlOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy13aGl0ZS81MCdcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNpemUgc3R5bGVzXG4gIGNvbnN0IGdldFNpemVTdHlsZXMgPSAoKSA9PiB7XG4gICAgc3dpdGNoIChzaXplKSB7XG4gICAgICBjYXNlICdzbSc6XG4gICAgICAgIHJldHVybiAncHgtMyBweS0xLjUgdGV4dC1zbSdcbiAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgcmV0dXJuICdweC02IHB5LTMgdGV4dC1sZydcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncHgtNCBweS0yIHRleHQtYmFzZSdcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHlsZXMgPSBnZXRWYXJpYW50U3R5bGVzKClcbiAgY29uc3Qgc2l6ZVN0eWxlcyA9IGdldFNpemVTdHlsZXMoKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goc3R5bGVzLmNvbnRhaW5lciwgY2xhc3NOYW1lKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgLy8gTW9iaWxlOiBTdGFjayB2ZXJ0aWNhbGx5IGlmIHRhYnMgZG9uJ3QgZml0LCBEZXNrdG9wOiBIb3Jpem9udGFsXG4gICAgICAgICdmbGV4IGZsZXgtd3JhcCBzbTpmbGV4LW5vd3JhcCcsXG4gICAgICAgIGZ1bGxXaWR0aCA/ICd3LWZ1bGwnIDogJ2lubGluZS1mbGV4JyxcbiAgICAgICAgdmFyaWFudCA9PT0gJ3VuZGVybGluZScgPyAnZ2FwLTIgc206Z2FwLTgnIDogJ2dhcC0xJ1xuICAgICAgKX0+XG4gICAgICAgIHt0YWJzLm1hcCgodGFiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVUYWIgPT09IHRhYi5pZFxuICAgICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0YWIuZGlzYWJsZWRcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGtleT17dGFiLmlkfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVUYWJDbGljayh0YWIuaWQsIGlzRGlzYWJsZWQpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICdmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgc206Z2FwLTInLFxuICAgICAgICAgICAgICAgIHN0eWxlcy50YWIsXG4gICAgICAgICAgICAgICAgc2l6ZVN0eWxlcyxcbiAgICAgICAgICAgICAgICAvLyBNb2JpbGU6IEZ1bGwgd2lkdGggb24gc21hbGwgc2NyZWVucywgRGVza3RvcDogRmxleC0xIGlmIGZ1bGxXaWR0aFxuICAgICAgICAgICAgICAgIGZ1bGxXaWR0aCAmJiAndy1mdWxsIHNtOmZsZXgtMSBqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAgICAgICAgICAgLy8gTW9iaWxlOiBFbmhhbmNlZCB0b3VjaCB0YXJnZXRcbiAgICAgICAgICAgICAgICAndG91Y2gtdGFyZ2V0LWxnIG1pbi13LTAnLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlID8gc3R5bGVzLmFjdGl2ZSA6IHN0eWxlcy5pbmFjdGl2ZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkICYmICdvcGFjaXR5LTUwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgey8qIEljb24gKi99XG4gICAgICAgICAgICAgI
25114Ht0YWIuaWNvbiAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAge3RhYi5pY29ufVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICB7LyogTGFiZWwgKi99XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICAgICAndHJ1bmNhdGUgdGV4dC14cyBzbTp0ZXh0LXNtJyxcbiAgICAgICAgICAgICAgICBmdWxsV2lkdGggPyAndGV4dC1jZW50ZXInIDogJ3RleHQtbGVmdCdcbiAgICAgICAgICAgICAgKX0+XG4gICAgICAgICAgICAgICAge3RhYi5sYWJlbH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgIHsvKiBDb3VudCBCYWRnZSAtIEhJRERFTiAobm90IGRlbGV0ZWQsIGp1c3QgaGlkZGVuIHdpdGggQ1NTKSAqL31cbiAgICAgICAgICAgICAge3RhYi5jb3VudCAhPT0gdW5kZWZpbmVkICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgICAgICAgICAnaGlkZGVuJywgLy8gSGlkZGVuIHZpYSBDU1MgLSBjYW4gYmUgcmUtZW5hYmxlZCBieSByZW1vdmluZyB0aGlzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAnaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1pbi13LVsxLjI1cmVtXSBoLTUgcHgtMS41IHJvdW5kZWQtZnVsbCB0ZXh0LXhzIGZvbnQtbWVkaXVtIGZsZXgtc2hyaW5rLTAnLFxuICAgICAgICAgICAgICAgICAgaXNBY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgPyAnYmctbWVjLXByaW1hcnkgdGV4dC13aGl0ZSdcbiAgICAgICAgICAgICAgICAgICAgOiAnYmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0ZXh0LXRleHQtbXV0ZWQnXG4gICAgICAgICAgICAgICAgKX0+XG4gICAgICAgICAgICAgICAgICB7dGFiLmNvdW50fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09OVkVOSUVOQ0UgQ09NUE9ORU5UU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gUGlsbHMgdmFyaWFudFxuZXhwb3J0IGNvbnN0IFBpbGxUYWJzOiBSZWFjdC5GQzxPbWl0PFVuaWZpZWRUYWJzUHJvcHMsICd2YXJpYW50Jz4+ID0gKHByb3BzKSA9PiAoXG4gIDxVbmlmaWVkVGFicyB7Li4ucHJvcHN9IHZhcmlhbnQ9XCJwaWxsc1wiIC8+XG4pXG5cbi8vIFVuZGVybGluZSB2YXJpYW50XG5leHBvcnQgY29uc3QgVW5kZXJsaW5lVGFiczogUmVhY3QuRkM8T21pdDxVbmlmaWVkVGFic1Byb3BzLCAndmFyaWFudCc+PiA9IChwcm9wcykgPT4gKFxuICA8VW5pZmllZFRhYnMgey4uLnByb3BzfSB2YXJpYW50PVwidW5kZXJsaW5lXCIgLz5cbilcblxuLy8gRnVsbCB3aWR0aCB0YWJzXG5leHBvcnQgY29uc3QgRnVsbFdpZHRoVGFiczogUmVhY3QuRkM8T21pdDxVbmlmaWVkVGFic1Byb3BzLCAnZnVsbFdpZHRoJz4+ID0gKHByb3BzKSA9PiAoXG4gIDxVbmlmaWVkVGFicyB7Li4ucHJvcHN9IGZ1bGxXaWR0aD17dHJ1ZX0gLz5cbilcbiIsImltcG9ydCB7IHVzZVF1ZXJ5IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5J1xuaW1wb3J0IHsgY29udGFjdHNBcGksIGxvY2F0aW9uc0FwaSB9IGZyb20gJ0BzZXJ2aWNlcy9hcGknXG5cbi8vIEhvb2sgZm9yIGRlcGFydG1lbnRzXG5leHBvcnQgY29uc3QgdXNlRGVwYXJ0bWVudHMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsnZGVwYXJ0bWVudHMnXSxcbiAgICBxdWVyeUZuOiAoKSA9PiBjb250YWN0c0FwaS5nZXREZXBhcnRtZW50cygpLFxuICAgIHNlbGVjdDogKGRhdGEpID0+IGRhdGEuZGF0YSB8fCBbXSxcbiAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsIC8vIDUgbWludXRlc1xuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXMgKHJlbmFtZWQgZnJvbSBjYWNoZVRpbWUgaW4gbmV3ZXIgdmVyc2lvbnMpXG4gIH0pXG59XG5cbi8vIEhvb2sgZm9yIGxhbmd1YWdlc1xuZXhwb3J0IGNvbnN0IHVzZUxhbmd1YWdlcyA9ICgpID0+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogWydsYW5ndWFnZXMnXSxcbiAgICBxdWVyeUZuOiAoKSA9PiBjb250YWN0c0FwaS5nZXRMYW5ndWFnZXMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgW10sXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLCAvLyA1IG1pbnV0ZXNcbiAgICBnY1RpbWU6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzIChyZW5hbWVkIGZyb20gY2FjaGVUaW1lIGluIG5ld2VyIHZlcnNpb25zKVxuICB9KVxufVxuXG4vLyBBZGRpdGlvbmFsIGZpbHRlciBob29rcyBmb3IgY29udGFjdHNcbmV4cG9ydCBjb25zdCB1c2VQb3NpdGlvbnMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsncG9zaXRpb25zJ10sXG4gICAgcXVlcnlGbjogKCkgPT4gY29udGFjdHNBcGkuZ2V0UG9zaXRpb25zKCksXG4gICAgc2VsZWN0OiAoZGF0YSkgPT4gZGF0YS5kYXRhIHx8IFtdLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCxcbiAgICBnY1RpbWU6IDEwICogNjAgKiAxMDAwLFxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlQXZhaWxhYmlsaXR5VHlwZXMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsnYXZhaWxhYmlsaXR5LXR5cGVzJ10sXG4gICAgcXVlcnlGbjogKCkgPT4gY29udGFjdHNBcGkuZ2V0QXZhaWxhYmlsaXR5VHlwZXMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgW10sXG4gICAgc3RhbGVUaW
251141lOiA1ICogNjAgKiAxMDAwLFxuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG5cbi8vIExvY2F0aW9uIGZpbHRlciBob29rc1xuZXhwb3J0IGNvbnN0IHVzZVNlcnZpY2VzID0gKCkgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbJ3NlcnZpY2VzJ10sXG4gICAgcXVlcnlGbjogKCkgPT4gbG9jYXRpb25zQXBpLmdldFNlcnZpY2VzKCksXG4gICAgc2VsZWN0OiAoZGF0YSkgPT4gZGF0YS5kYXRhIHx8IFtdLFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCxcbiAgICBnY1RpbWU6IDEwICogNjAgKiAxMDAwLFxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlU3RhdGVzID0gKCkgPT4ge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBbJ3N0YXRlcyddLFxuICAgIHF1ZXJ5Rm46ICgpID0+IGxvY2F0aW9uc0FwaS5nZXRTdGF0ZXMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgW10sXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLFxuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1c2VPcGVuaW5nWWVhcnMgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IFsnb3BlbmluZy15ZWFycyddLFxuICAgIHF1ZXJ5Rm46ICgpID0+IGxvY2F0aW9uc0FwaS5nZXRPcGVuaW5nWWVhcnMoKSxcbiAgICBzZWxlY3Q6IChkYXRhKSA9PiBkYXRhLmRhdGEgfHwgeyB5ZWFyczogW10sIGRlY2FkZXM6IFtdIH0sXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLFxuICAgIGdjVGltZTogMTAgKiA2MCAqIDEwMDAsXG4gIH0pXG59XG5cbi8vIENvbWJpbmVkIGhvb2sgZm9yIGFsbCBmaWx0ZXIgZGF0YVxuZXhwb3J0IGNvbnN0IHVzZUZpbHRlckRhdGEgPSAoKSA9PiB7XG4gIGNvbnN0IGRlcGFydG1lbnRzID0gdXNlRGVwYXJ0bWVudHMoKVxuICBjb25zdCBsYW5ndWFnZXMgPSB1c2VMYW5ndWFnZXMoKVxuXG4gIHJldHVybiB7XG4gICAgZGVwYXJ0bWVudHM6IHtcbiAgICAgIGRhdGE6IGRlcGFydG1lbnRzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IGRlcGFydG1lbnRzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBkZXBhcnRtZW50cy5lcnJvcixcbiAgICB9LFxuICAgIGxhbmd1YWdlczoge1xuICAgICAgZGF0YTogbGFuZ3VhZ2VzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IGxhbmd1YWdlcy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogbGFuZ3VhZ2VzLmVycm9yLFxuICAgIH0sXG4gICAgaXNMb2FkaW5nOiBkZXBhcnRtZW50cy5pc0xvYWRpbmcgfHwgbGFuZ3VhZ2VzLmlzTG9hZGluZyxcbiAgICBlcnJvcjogZGVwYXJ0bWVudHMuZXJyb3IgfHwgbGFuZ3VhZ2VzLmVycm9yLFxuICB9XG59XG5cbi8vIEV4dGVuZGVkIGhvb2sgZm9yIGxvY2F0aW9uLXNwZWNpZmljIGZpbHRlcnNcbmV4cG9ydCBjb25zdCB1c2VMb2NhdGlvbkZpbHRlckRhdGEgPSAoKSA9PiB7XG4gIGNvbnN0IHNlcnZpY2VzID0gdXNlU2VydmljZXMoKVxuICBjb25zdCBzdGF0ZXMgPSB1c2VTdGF0ZXMoKVxuICBjb25zdCBvcGVuaW5nWWVhcnMgPSB1c2VPcGVuaW5nWWVhcnMoKVxuXG4gIHJldHVybiB7XG4gICAgc2VydmljZXM6IHtcbiAgICAgIGRhdGE6IHNlcnZpY2VzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IHNlcnZpY2VzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBzZXJ2aWNlcy5lcnJvcixcbiAgICB9LFxuICAgIHN0YXRlczoge1xuICAgICAgZGF0YTogc3RhdGVzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IHN0YXRlcy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogc3RhdGVzLmVycm9yLFxuICAgIH0sXG4gICAgb3BlbmluZ1llYXJzOiB7XG4gICAgICBkYXRhOiBvcGVuaW5nWWVhcnMuZGF0YSxcbiAgICAgIGlzTG9hZGluZzogb3BlbmluZ1llYXJzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBvcGVuaW5nWWVhcnMuZXJyb3IsXG4gICAgfSxcbiAgICBpc0xvYWRpbmc6IHNlcnZpY2VzLmlzTG9hZGluZyB8fCBzdGF0ZXMuaXNMb2FkaW5nIHx8IG9wZW5pbmdZZWFycy5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IHNlcnZpY2VzLmVycm9yIHx8IHN0YXRlcy5lcnJvciB8fCBvcGVuaW5nWWVhcnMuZXJyb3IsXG4gIH1cbn1cblxuLy8gRXh0ZW5kZWQgaG9vayBmb3IgY29udGFjdC1zcGVjaWZpYyBmaWx0ZXJzXG5leHBvcnQgY29uc3QgdXNlQ29udGFjdEZpbHRlckRhdGEgPSAoKSA9PiB7XG4gIGNvbnN0IGRlcGFydG1lbnRzID0gdXNlRGVwYXJ0bWVudHMoKVxuICBjb25zdCBsYW5ndWFnZXMgPSB1c2VMYW5ndWFnZXMoKVxuICBjb25zdCBwb3NpdGlvbnMgPSB1c2VQb3NpdGlvbnMoKVxuICBjb25zdCBhdmFpbGFiaWxpdHlUeXBlcyA9IHVzZUF2YWlsYWJpbGl0eVR5cGVzKClcblxuICByZXR1cm4ge1xuICAgIGRlcGFydG1lbnRzOiB7XG4gICAgICBkYXRhOiBkZXBhcnRtZW50cy5kYXRhLFxuICAgICAgaXNMb2FkaW5nOiBkZXBhcnRtZW50cy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogZGVwYXJ0bWVudHMuZXJyb3IsXG4gICAgfSxcbiAgICBsYW5ndWFnZXM6IHtcbiAgICAgIGRhdGE6IGxhbmd1YWdlcy5kYXRhLFxuICAgICAgaXNMb2FkaW5nOiBsYW5ndWFnZXMuaXNMb2FkaW5nLFxuICAgICAgZXJyb3I6IGxhbmd1YWdlcy5lcnJvcixcbiAgICB9LFxuICAgIHBvc2l0aW9uczoge1xuICAgICAgZGF0YTogcG9zaXRpb25zLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IHBvc2l0aW9ucy5pc0xvYWRpbmcsXG4gICAgICBlcnJvcjogcG9zaXRpb25zLmVycm9yLFxuICAgIH0sXG4gICAgYXZhaWxhYmlsaXR5VHlwZXM6IHtcbiAgICAgIGRhdGE6IGF2YWlsYWJpbGl0eVR5cGVzLmRhdGEsXG4gICAgICBpc0xvYWRpbmc6IGF2YWlsYWJpbGl0eVR5cGVzLmlzTG9hZGluZyxcbiAgICAgIGVycm9yOiBhdmFpbGFiaWxpdHlUeXBlcy5lcnJvcixcbiAgICB9LFxuICAgIGlzTG9hZGluZzogZGVwYXJ0bWVudHMuaXNMb2FkaW5nIHx8IGxhbmd1YWdlcy5pc0xvYWRpbmcgfHwgcG9zaXRpb25zLmlzTG9hZGluZyB8fCBhdmFpbGFiaWxpdHlUeXBlcy5pc0xvYWRpbmcsXG4gICAgZXJyb3I6IGRlcGFydG1lbnRzLmVycm9yIHx8IGxhbmd1YWdlcy5lcnJvciB8fCBwb3NpdGlvbnMuZXJyb3IgfHwgYXZhaWxhYmlsaXR5VHlwZXMuZXJyb3IsXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7
25114IE1hcCwgTGlzdCwgR3JpZDNYMyB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IHVzZVZpZXdQcmVmZXJlbmNlcyB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcblxuaW50ZXJmYWNlIFZpZXdUb2dnbGVQcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBzaXplPzogJ3NtJyB8ICdtZCcgfCAnbGcnXG59XG5cbmV4cG9ydCBjb25zdCBWaWV3VG9nZ2xlOiBSZWFjdC5GQzxWaWV3VG9nZ2xlUHJvcHM+ID0gKHtcbiAgY2xhc3NOYW1lLFxuICBzaXplID0gJ21kJ1xufSkgPT4ge1xuICBjb25zdCB7IG1hcFZpZXcsIGNvbnRhY3RMYXlvdXQsIHNldE1hcFZpZXcsIHNldENvbnRhY3RMYXlvdXQgfSA9IHVzZVZpZXdQcmVmZXJlbmNlcygpXG5cbiAgY29uc3Qgc2l6ZUNsYXNzZXMgPSB7XG4gICAgc206ICd0ZXh0LXhzIHB4LTIgcHktMScsXG4gICAgbWQ6ICd0ZXh0LXNtIHB4LTMgcHktMicsXG4gICAgbGc6ICd0ZXh0LWJhc2UgcHgtNCBweS0zJ1xuICB9XG5cbiAgY29uc3QgaWNvblNpemVzID0ge1xuICAgIHNtOiAndy0zIGgtMycsXG4gICAgbWQ6ICd3LTQgaC00JyxcbiAgICBsZzogJ3ctNSBoLTUnXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCdmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTInLCBjbGFzc05hbWUpfT5cbiAgICAgIHsvKiBNYXAgVmlldyBUb2dnbGUgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1tZWMgcC0xXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRNYXBWaWV3KCdpbnRlcmFjdGl2ZScpfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHJvdW5kZWQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAgIHNpemVDbGFzc2VzW3NpemVdLFxuICAgICAgICAgICAgbWFwVmlldyA9PT0gJ2ludGVyYWN0aXZlJ1xuICAgICAgICAgICAgICA/ICdiZy13aGl0ZSB0ZXh0LW1lYy1wcmltYXJ5IHNoYWRvdy1zbSdcbiAgICAgICAgICAgICAgOiAndGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy13aGl0ZS81MCdcbiAgICAgICAgICApfVxuICAgICAgICAgIHRpdGxlPVwiSW50ZXJha3RpdmUgS2FydGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPE1hcCBjbGFzc05hbWU9e2ljb25TaXplc1tzaXplXX0gLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gc206aW5saW5lXCI+S2FydGU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRNYXBWaWV3KCdsaXN0Jyl9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgcm91bmRlZCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAnLFxuICAgICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgICBtYXBWaWV3ID09PSAnbGlzdCdcbiAgICAgICAgICAgICAgPyAnYmctd2hpdGUgdGV4dC1tZWMtcHJpbWFyeSBzaGFkb3ctc20nXG4gICAgICAgICAgICAgIDogJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC10ZXh0LXByaW1hcnkgaG92ZXI6Ymctd2hpdGUvNTAnXG4gICAgICAgICAgKX1cbiAgICAgICAgICB0aXRsZT1cIkxpc3RlbmFuc2ljaHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPExpc3QgY2xhc3NOYW1lPXtpY29uU2l6ZXNbc2l6ZV19IC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHNtOmlubGluZVwiPkxpc3RlPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ29udGFjdCBMYXlvdXQgVG9nZ2xlIC0gQWx3YXlzIHZpc2libGUsIGJ1dCBvbmx5IGZ1bmN0aW9uYWwgaW4gbGlzdCB2aWV3ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LXB4IGgtNiBiZy1iYWNrZ3JvdW5kLXRlcnRpYXJ5XCIgLz5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtMVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Q29udGFjdExheW91dCgnZ3JpZCcpfVxuICAgICAgICAgIGRpc2FibGVkPXttYXBWaWV3ICE9PSAnbGlzdCd9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgcm91bmRlZCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAnLFxuICAgICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgICBtYXBWaWV3ICE9PSAnbGlzdCdcbiAgICAgICAgICAgICAgPyAndGV4dC10ZXh0LW11dGVkIGN1cnNvci1ub3QtYWxsb3dlZCBvcGFjaXR5LTUwJ1xuICAgICAgICAgICAgICA6IGNvbnRhY3RMYXlvdXQgPT09ICdncmlkJ1xuICAgICAgICAgICAgICAgID8gJ2JnLXdoaXRlIHRleHQtbWVjLXByaW1hcnkgc2hhZG93LXNtJ1xuICAgICAgICAgICAgICAgIDogJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC10ZXh0LXByaW1hcnkgaG92ZXI6Ymctd2hpdGUvNTAnXG4gICAgICAgICAgKX1cbiAgICAgICAgICB0aXRsZT17bWFwVmlldyAhPT0gJ2xpc3QnID8gJ051ciBpbiBMaXN0ZW5hbnNpY2h0IHZlcmbDvGdiYXInIDogJ1Jhc3Rlci1MYXlvdXQnfVxuICAgICAgICA+XG4gICAgICAgICAgPEdyaWQzWDMgY2xhc3NOYW1lPXtpY29uU2l6ZXNbc2l6ZV19IC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmlubGluZVwiPlJhc3Rlcjwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldENvbnRhY3RMYXlvdXQoJ2xpc3QnKX1cbiAgICAgICAgICBkaXNhYmxlZD17bWFwVmlldyAhPT0gJ2xpc3QnfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHJvdW5kZWQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAgI
25114HNpemVDbGFzc2VzW3NpemVdLFxuICAgICAgICAgICAgbWFwVmlldyAhPT0gJ2xpc3QnXG4gICAgICAgICAgICAgID8gJ3RleHQtdGV4dC1tdXRlZCBjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS01MCdcbiAgICAgICAgICAgICAgOiBjb250YWN0TGF5b3V0ID09PSAnbGlzdCdcbiAgICAgICAgICAgICAgICA/ICdiZy13aGl0ZSB0ZXh0LW1lYy1wcmltYXJ5IHNoYWRvdy1zbSdcbiAgICAgICAgICAgICAgICA6ICd0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtdGV4dC1wcmltYXJ5IGhvdmVyOmJnLXdoaXRlLzUwJ1xuICAgICAgICAgICl9XG4gICAgICAgICAgdGl0bGU9e21hcFZpZXcgIT09ICdsaXN0JyA/ICdOdXIgaW4gTGlzdGVuYW5zaWNodCB2ZXJmw7xnYmFyJyA6ICdMaXN0ZW4tTGF5b3V0J31cbiAgICAgICAgPlxuICAgICAgICAgIDxMaXN0IGNsYXNzTmFtZT17aWNvblNpemVzW3NpemVdfSAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBtZDppbmxpbmVcIj5MaXN0ZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vLyBDb21wYWN0IHZlcnNpb24gZm9yIG1vYmlsZVxuZXhwb3J0IGNvbnN0IENvbXBhY3RWaWV3VG9nZ2xlOiBSZWFjdC5GQzx7IGNsYXNzTmFtZT86IHN0cmluZyB9PiA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IHsgbWFwVmlldywgc2V0TWFwVmlldyB9ID0gdXNlVmlld1ByZWZlcmVuY2VzKClcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCdmbGV4JywgY2xhc3NOYW1lKX0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE1hcFZpZXcobWFwVmlldyA9PT0gJ2ludGVyYWN0aXZlJyA/ICdsaXN0JyA6ICdpbnRlcmFjdGl2ZScpfVxuICAgICAgICBjbGFzc05hbWU9XCJidG4tc2Vjb25kYXJ5IGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIlxuICAgICAgPlxuICAgICAgICB7bWFwVmlldyA9PT0gJ2ludGVyYWN0aXZlJyA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPExpc3QgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5adXIgTGlzdGU8L3NwYW4+XG4gICAgICAgICAgPC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxNYXAgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5adXIgS2FydGU8L3NwYW4+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ2hldnJvbkRvd24sIFgsIE1hcFBpbiwgU2VhcmNoIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgdXNlRmlsdGVycywgdXNlVmlld1ByZWZlcmVuY2VzIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcbmltcG9ydCB7IHVzZUZpbHRlckRhdGEsIHVzZUxvY2F0aW9uRmlsdGVyRGF0YSB9IGZyb20gJ0Bob29rcy91c2VGaWx0ZXJEYXRhJ1xuaW1wb3J0IHsgVmlld1RvZ2dsZSB9IGZyb20gJy4vVmlld1RvZ2dsZSdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgRmlsdGVyQmFyUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc2VhcmNoUXVlcnk6IHN0cmluZ1xuICBvblNlYXJjaENoYW5nZTogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIERyb3Bkb3duUHJvcHMge1xuICBsYWJlbDogc3RyaW5nXG4gIGljb246IFJlYWN0LlJlYWN0Tm9kZVxuICBvcHRpb25zOiBzdHJpbmdbXVxuICBzZWxlY3RlZFZhbHVlczogc3RyaW5nW11cbiAgb25TZWxlY3Rpb25DaGFuZ2U6ICh2YWx1ZXM6IHN0cmluZ1tdKSA9PiB2b2lkXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIGxvYWRpbmc/OiBib29sZWFuXG59XG5cbmNvbnN0IEN1c3RvbURyb3Bkb3duOiBSZWFjdC5GQzxEcm9wZG93blByb3BzPiA9ICh7XG4gIGxhYmVsLFxuICBpY29uLFxuICBvcHRpb25zLFxuICBzZWxlY3RlZFZhbHVlcyxcbiAgb25TZWxlY3Rpb25DaGFuZ2UsXG4gIHBsYWNlaG9sZGVyID0gXCJBbGxlXCIsXG4gIGxvYWRpbmcgPSBmYWxzZVxufSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGRyb3Bkb3duUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZHJvcGRvd25SZWYuY3VycmVudCAmJiAhZHJvcGRvd25SZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgc2V0SXNPcGVuKGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSlcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2tPdXRzaWRlKVxuICB9LCBbXSlcblxuICBjb25zdCB0b2dnbGVPcHRpb24gPSAob3B0aW9uOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gb3B0aW9uKSlcbiAgICB9IGVsc2Uge1xuICAgICAgb25TZWxlY3Rpb25DaGFuZ2UoWy4uLnNlbGVjdGVkVmFsdWVzLCBvcHRpb25dKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsZWFyQWxsID0gKCkgPT4ge1xuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKFtdKVxuICB9XG5cbiAgY29uc3QgZGlzcGxheVRleHQgPSBzZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDAgXG4gICAgPyBwbGFjZWhvbGRlciBcbiAgICA6IHNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMSBcbiAgICAgID8gc2VsZWN0ZWRWYWx1ZXNbMF1cbiAgICAgIDogYCR7c2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSBhdXNnZXfDpGhsdGBcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIiByZWY9e2Ryb3Bkb3duUmVmfT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNPcGVuKCFpc09wZW4pfVxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTQgcHktMi41IGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgJ2hvdmVyOmJvcmRlci1tZWMtcHJpbWFyeSB
25114ob3ZlcjpzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW1lYy1wcmltYXJ5LzIwJyxcbiAgICAgICAgICAndy1mdWxsIHNtOnctYXV0byBtaW4tdy1bMTQwcHhdJyxcbiAgICAgICAgICBpc09wZW4gPyAnYm9yZGVyLW1lYy1wcmltYXJ5IHNoYWRvdy1zbScgOiAnYm9yZGVyLWdyYXktMzAwJyxcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwICYmICdib3JkZXItbWVjLXByaW1hcnkgYmctbWVjLXByaW1hcnkvNSdcbiAgICAgICAgKX1cbiAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XG4gICAgICA+XG4gICAgICAgIHtpY29ufVxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWluLXctMCB0cnVuY2F0ZVwiPlxuICAgICAgICAgIHtsb2FkaW5nID8gJ0zDpGR0Li4uJyA6IGRpc3BsYXlUZXh0fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHtzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlIHRleHQteHMgcHgtMiBweS0wLjUgcm91bmRlZC1mdWxsXCI+XG4gICAgICAgICAgICB7c2VsZWN0ZWRWYWx1ZXMubGVuZ3RofVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgICAgPENoZXZyb25Eb3duIFxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICd3LTQgaC00IHRleHQtZ3JheS01MDAgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwIGZsZXgtc2hyaW5rLTAnLFxuICAgICAgICAgICAgaXNPcGVuICYmICdyb3RhdGUtMTgwJ1xuICAgICAgICAgICl9IFxuICAgICAgICAvPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIHtpc09wZW4gJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC1mdWxsIGxlZnQtMCByaWdodC0wIG10LTEgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkLWxnIHNoYWRvdy1sZyB6LTUwIG1pbi13LVsyMDBweF1cIj5cbiAgICAgICAgICB7LyogSGVhZGVyIHdpdGggY2xlYXIgYnV0dG9uICovfVxuICAgICAgICAgIHtzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTMgcHktMiBib3JkZXItYiBib3JkZXItZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgICAge3NlbGVjdGVkVmFsdWVzLmxlbmd0aH0gYXVzZ2V3w6RobHRcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17Y2xlYXJBbGx9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOnRleHQtbWVjLXByaW1hcnkvODAgZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQWxsZSBlbnRmZXJuZW5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIFxuICAgICAgICAgIHsvKiBPcHRpb25zICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LWgtNjAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgICB7b3B0aW9ucy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtMyBweS0yIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgIEtlaW5lIE9wdGlvbmVuIHZlcmbDvGdiYXJcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbn1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIHB4LTMgcHktMiBob3ZlcjpiZy1ncmF5LTUwIGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eygpID0+IHRvZ2dsZU9wdGlvbihvcHRpb24pfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IHRleHQtbWVjLXByaW1hcnkgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQgZm9jdXM6cmluZy1tZWMtcHJpbWFyeS8yMFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNzAwIGZsZXgtMSBtaW4tdy0wIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHtvcHRpb259XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgY29uc3QgRmlsdGVyQmFyOiBSZWFjdC5GQzxGaWx0ZXJCYXJQcm9wcz4gPSAoe1xuICBjbGFzc05hbWUsXG4gIHNlYXJjaFF1ZXJ5LFxuICBvblNlYXJjaENoYW5nZVxufSkgPT4ge1xuICBjb25zdCB7IGFjdGl2ZVRhYiB9ID0gdXNlVmlld1ByZWZlcmVuY2VzKClcblxuICBjb25zdCB7XG4gICAgc2VsZWN0ZWRTdGF0ZXMsXG4gICAgc2V0U2VsZWN0ZWRTdGF0ZXNcbiAgfSA9IHVzZUZpbHRlcnMoKVxuXG4gIC8vIExvY2F0aW9uIGZpbHRlcnNcbiAgY29uc3QgeyBzdGF0ZXMsIGlzTG9hZGluZzogbG9jYXRpb25GaWx0ZXJzTG9hZGluZyB9ID0gdXNlTG9jYXRpb25GaWx0ZXJEYXRhKClcblxuICAvLyBFeHRyYWN0IGFycmF5cyBmcm9tIHRoZSBkYXRhIHN0cnVjdHVyZVxuICBjb25zdCBzdGF0ZXNBcnJheSA9IHN0YXRlcy5kYXRhPy5tYXAoaXRlbSA9PiBpdGVtLnN0YXRlKSB8fCBbXVxuXG4gIC8vIE9ubHkgc2hvdyBmaWx0ZXJzIGZvciBsb2NhdGlvbnMgdGFiXG4gIGNvbnN0IHNob3dGaWx0ZXJzID0gYWN0aXZlVGFiID09PSAnbG9jYXRpb25zJ1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2JnLXdoaXRlIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBwLTMgc206cC00JywgY2xhc3NOYW1lKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTMgc206Z2FwLTQgbGc6ZmxleC1yb3cgbGc6aXRlbXMtY2VudGVyXCI+XG4gICAgICAgI
25114HsvKiBTZWFyY2ggSW5wdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICA8U2VhcmNoIGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMyB0b3AtMS8yIHRyYW5zZm9ybSAtdHJhbnNsYXRlLXktMS8yIHctNCBoLTQgdGV4dC1ncmF5LTQwMFwiIC8+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17YWN0aXZlVGFiID09PSAnbG9jYXRpb25zJyA/ICdTdGFuZG9ydGUgZHVyY2hzdWNoZW4uLi4nIDogJ0Fuc3ByZWNocGFydG5lciBkdXJjaHN1Y2hlbi4uLid9XG4gICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uU2VhcmNoQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBwbC0xMCBwci00IHB5LTIuNSBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctbWVjLXByaW1hcnkvMjAgZm9jdXM6Ym9yZGVyLW1lYy1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogRmlsdGVyIERyb3Bkb3ducyAtIE9ubHkgZm9yIGxvY2F0aW9ucyAqL31cbiAgICAgICAge3Nob3dGaWx0ZXJzICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cgZmxleC13cmFwIGdhcC0zIHctZnVsbCBzbTp3LWF1dG9cIj5cbiAgICAgICAgICAgIDxDdXN0b21Ecm9wZG93blxuICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lvblwiXG4gICAgICAgICAgICAgIGljb249ezxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCB0ZXh0LWdyYXktNTAwXCIgLz59XG4gICAgICAgICAgICAgIG9wdGlvbnM9e3N0YXRlc0FycmF5fVxuICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcz17c2VsZWN0ZWRTdGF0ZXN9XG4gICAgICAgICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlPXtzZXRTZWxlY3RlZFN0YXRlc31cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBbGxlIFJlZ2lvbmVuXCJcbiAgICAgICAgICAgICAgbG9hZGluZz17bG9jYXRpb25GaWx0ZXJzTG9hZGluZ31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIFZpZXcgVG9nZ2xlICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPFZpZXdUb2dnbGUgc2l6ZT1cInNtXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEFjdGl2ZSBGaWx0ZXJzIENvdW50ICovfVxuICAgICAgICB7c2hvd0ZpbHRlcnMgJiYgc2VsZWN0ZWRTdGF0ZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZFN0YXRlcy5sZW5ndGh9IEZpbHRlciBha3RpdlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRTdGF0ZXMoW10pXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1tZWMtcHJpbWFyeSBob3Zlcjp0ZXh0LW1lYy1wcmltYXJ5LzgwIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgWnVyw7xja3NldHplblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRmlsdGVyQmFyIH0gZnJvbSAnLi9GaWx0ZXJCYXInXG5cbmludGVyZmFjZSBTYWZlRmlsdGVyQmFyUHJvcHMge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc2VhcmNoUXVlcnk6IHN0cmluZ1xuICBvblNlYXJjaENoYW5nZTogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWRcbiAgZmFsbGJhY2s
25114/OiBSZWFjdC5SZWFjdE5vZGVcbn1cblxuaW50ZXJmYWNlIFNhZmVGaWx0ZXJCYXJTdGF0ZSB7XG4gIGhhc0Vycm9yOiBib29sZWFuXG4gIGVycm9yPzogRXJyb3Jcbn1cblxuLyoqXG4gKiBFcnJvciBCb3VuZGFyeSB3cmFwcGVyIGZvciBGaWx0ZXJCYXIgdG8gaGFuZGxlIGlmcmFtZS9sb2NhbFN0b3JhZ2UgaXNzdWVzXG4gKi9cbmNsYXNzIFNhZmVGaWx0ZXJCYXJFcnJvckJvdW5kYXJ5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFxuICBTYWZlRmlsdGVyQmFyUHJvcHMsXG4gIFNhZmVGaWx0ZXJCYXJTdGF0ZVxuPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTYWZlRmlsdGVyQmFyUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0geyBoYXNFcnJvcjogZmFsc2UgfVxuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBTYWZlRmlsdGVyQmFyU3RhdGUge1xuICAgIHJldHVybiB7IGhhc0Vycm9yOiB0cnVlLCBlcnJvciB9XG4gIH1cblxuICBjb21wb25lbnREaWRDYXRjaChlcnJvcjogRXJyb3IsIGVycm9ySW5mbzogUmVhY3QuRXJyb3JJbmZvKSB7XG4gICAgY29uc29sZS5lcnJvcignU2FmZUZpbHRlckJhcjogQ2F1Z2h0IGVycm9yIGluIEZpbHRlckJhcjonLCBlcnJvciwgZXJyb3JJbmZvKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBVSSBmb3IgaWZyYW1lIG1vZGUgb3IgbG9jYWxTdG9yYWdlIGlzc3Vlc1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wcm9wcy5mYWxsYmFjayB8fCAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcC0zIHNtOnAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0zIHNtOmdhcC00IGxnOmZsZXgtcm93IGxnOml0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICB7LyogU2VhcmNoIElucHV0ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTdGFuZG9ydGUgZHVyY2hzdWNoZW4uLi5cIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy5zZWFyY2hRdWVyeSB8fCAnJ31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB0aGlzLnByb3BzLm9uU2VhcmNoQ2hhbmdlPy4oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcGwtMTAgcHItNCBweS0yLjUgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLWxnIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1tZWMtcHJpbWFyeS8yMCBmb2N1czpib3JkZXItbWVjLXByaW1hcnkgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LWdyYXktNDAwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlTGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZVdpZHRoP
25114XsyfSBkPVwiTTIxIDIxbC02LTZtMi01YTcgNyAwIDExLTE0IDAgNyA3IDAgMDExNCAwelwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgey8qIFNpbXBsaWZpZWQgbWVzc2FnZSBmb3IgaWZyYW1lIG1vZGUgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgRmlsdGVyIGltIEVtYmVkLU1vZHVzIHZlcmVpbmZhY2h0XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gPEZpbHRlckJhciB7Li4udGhpcy5wcm9wc30gLz5cbiAgfVxufVxuXG4vKipcbiAqIFNhZmUgRmlsdGVyQmFyIGNvbXBvbmVudCB3aXRoIGVycm9yIGJvdW5kYXJ5XG4gKi9cbmV4cG9ydCBjb25zdCBTYWZlRmlsdGVyQmFyOiBSZWFjdC5GQzxTYWZlRmlsdGVyQmFyUHJvcHM+ID0gKHByb3BzKSA9PiB7XG4gIHJldHVybiA8U2FmZUZpbHRlckJhckVycm9yQm91bmRhcnkgey4uLnByb3BzfSAvPlxufVxuXG5leHBvcnQgZGVmYXVsdCBTYWZlRmlsdGVyQmFyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCB7IHVzZUxvY2F0aW9ucyB9IGZyb20gJ0Bob29rcy91c2VMb2NhdGlvbnMnXG5pbXBvcnQgeyB1c2VGaWx0ZXJlZENvbnRhY3RzIH0gZnJvbSAnQGhvb2tzL3VzZUNvbnRhY3RzJ1xuaW1wb3J0IHsgdXNlVmlld1ByZWZlcmVuY2VzLCB1c2VMb2NhdGlvbk1vZGFsLCB1c2VDb250YWN0TW9kYWwsIHVzZUZpbHRlcnMgfSBmcm9tICdAc3RvcmVzL3VzZUFwcFN0b3JlJ1xuaW1wb3J0IHsgTG9jYXRpb25NaW5pR3JpZENhcmQgfSBmcm9tICdAY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlHcmlkQ2FyZCdcbmltcG9ydCB7IFVuaWZpZWRDb250YWN0Q2FyZCB9IGZyb20gJy4vVW5pZmllZENvbnRhY3RDYXJkJ1xuaW1wb3J0IHsgVW5pZmllZFRhYnMgfSBmcm9tICcuL1VuaWZpZWRUYWJzJ1xuaW1wb3J0IHsgU2FmZUZpbHRlckJhciB9IGZyb20gJy4vU2FmZUZpbHRlckJhcidcbmltcG9ydCB7IExvYWRpbmdTcGlubmVyIH0gZnJvbSAnQGNvbXBvbmVudHMvVUkvTG9hZGluZ1NwaW5uZXInXG5pbXBvcnQgeyBCdWlsZGluZzIsIFVzZXJzIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvaW5kZXgnXG5cbmludGVyZmFjZSBVbmlmaWVkTGlzdFZpZXdQcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgVW5pZmllZExpc3RWaWV3OiBSZWFjdC5GQzxVbmlmaWVkTGlzdFZpZXdQcm9wcz4gPSAoeyBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCB7IGNvbnRhY3RMYXlvdXQsIGFjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiIH0gPSB1c2VWaWV3UHJlZmVyZW5jZXMoKVxuICBjb25zdCB7IG9wZW46IG9wZW5Mb2NhdGlvbk1vZGFsIH0gPSB1c2VMb2NhdGlvbk1vZGFsKClcbiAgY29uc3QgeyBvcGVuOiBvcGVuQ29udGFjdE1vZGFsIH0gPSB1c2VDb250YWN0TW9kYWwoKVxuXG4gIC8vIEdldCBhbGwgZmlsdGVyIHN0YXRlIGF0IG9uY2UgKG11c3QgYmUgYmVmb3JlIGNvbmRpdGlvbmFsIHJldHVybnMpXG4gIGNvbnN0IHsgXG4gICAgc2VhcmNoUXVlcnksIFxuICAgIHNldFNlYXJjaFF1ZXJ5LCBcbiAgICBzZWxlY3RlZFN0YXRlcywgXG4gICAgc2VsZWN0ZWRTZXJ2aWNlcyBcbiAgfSA9IHVzZUZpbHRlcnMoKVxuXG4gIC8vIEZldGNoIGRhdGFcbiAgY29uc3QgeyBkYXRhOiBsb2NhdGlvbnMsIGlzTG9hZGluZzogbG9jYXRpb25zTG9hZGluZywgZXJyb3I6IGxvY2F0aW9uc0Vycm9yIH0gPSB1c2VMb2NhdGlvbnMoKVxuICBjb25zdCB7IGNvbnRhY3RzLCBpc0xvYWRpbmc6IGNvbnRhY3RzTG9hZGluZywgZXJyb3I6IGNvbnRhY3RzRXJyb3IgfSA9IHVzZUZpbHRlcmVkQ29udGFjdHMoKVxuXG4gIGNvbnN0IGlzTG9hZGluZyA9IGxvY2F0aW9uc0xvYWRpbmcgfHwgY29udGFjdHNMb2FkaW5nXG4gIGNvbnN0IGhhc0Vycm9yID0gbG9jYXRpb25zRXJyb3IgfHwgY29udGFjdHNFcnJvclxuXG4gIC8vIEhhbmRsZSBjbGlja3NcbiAgY29uc3QgaGFuZGxlTG9jYXRpb25DbGljayA9IChsb2NhdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ29udGFjdENsaWNrID0gKGNvbnRhY3Q6IENvbnRhY3QpID0+IHtcbiAgICBvcGVuQ29udGFjdE1vZGFsKGNvbnRhY3QpXG4gIH1cblxuICAvLyBMb2FkaW5nIHN0YXRlXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3NwYWNlLXktNicsIGNsYXNzTmFtZSl9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtbWVjLWxnIHNoYWRvdy1jYXJkIHAtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIHNpemU9XCJsZ1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gRXJyb3Igc3RhdGVcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KCdzcGFjZS15LTYnLCBjbGFzc05hbWUpfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBzaGFkb3ctY2FyZCBwLTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgRmVobGVyIGJlaW0gTGFkZW4gZGVyIERhdGVuLiBCaXR0ZSB2ZXJzdWNoZW4gU2llIGVzIHNww6R0ZXIgZXJuZXV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIHVzZUxvY2F0aW9ucyByZXR1cm5zIHJlc3BvbnNlLmRhdGEgZGlyZWN0bHksIHVzZUZpbHRlcmVkQ29udGFjdHMgcmV0dXJucyBjb250YWN0cyBhcnJheSBkaXJlY3RseVxuICBjb25zdCBhY3RpdmVMb2NhdGlvbnMgPSBsb2NhdGlvbnMgfHwgW11cbiAgY29uc3QgYWN0aXZlQ29udGFjdHMgPSBjb250YWN0cyB8fCBbXVxuXG4gIC8vIPCflI0gREVCVUc6IExvZyBjb250YWN0c1xuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogVW5pZmllZExpc3RWaWV3IC0gYWN0aXZlQ29udGFjdHM6JywgYWN0aXZlQ29udGFjdHMubGVuZ3RoKVxuICBjb25zb2xlLmxvZygn8J+UjSBERUJVRzogVW5pZmllZExpc3RWaWV3IC0gc2VhcmNoUXVlcnk6Jywgc2VhcmNoUXVlcnkpXG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIG1hcCBwb3N0YWwgY29kZSB0byBzdGF0ZS9yZWdpb25cbiAgY29uc3QgZ2V0U3RhdGVGcm9tUG9zdGFsQ29kZSA9IChwb3N0YWxDb2RlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghcG9zdGFsQ29kZSkgcmV0dXJuICdTb25zdGlnZSdcbiAgICBjb25zdCBmaXJzdENoYXIgPSBwb3N0YWxDb2RlLmNoYXJBdCgwKVxuICAgIHN3aXRjaCAo
25114Zmlyc3RDaGFyKSB7XG4gICAgICBjYXNlICcwJzpcbiAgICAgIGNhc2UgJzEnOlxuICAgICAgICByZXR1cm4gJ0Jlcmxpbi9CcmFuZGVuYnVyZy9TYWNoc2VuJ1xuICAgICAgY2FzZSAnMic6XG4gICAgICAgIHJldHVybiAnSGFtYnVyZy9TY2hsZXN3aWctSG9sc3RlaW4vTmllZGVyc2FjaHNlbidcbiAgICAgIGNhc2UgJzMnOlxuICAgICAgICByZXR1cm4gJ05pZWRlcnNhY2hzZW4vU2FjaHNlbi1BbmhhbHQvVGjDvHJpbmdlbidcbiAgICAgIGNhc2UgJzQnOlxuICAgICAgICByZXR1cm4gJ05vcmRyaGVpbi1XZXN0ZmFsZW4nXG4gICAgICBjYXNlICc1JzpcbiAgICAgICAgcmV0dXJuICdOb3JkcmhlaW4tV2VzdGZhbGVuL1JoZWlubGFuZC1QZmFseidcbiAgICAgIGNhc2UgJzYnOlxuICAgICAgICByZXR1cm4gJ0hlc3Nlbi9SaGVpbmxhbmQtUGZhbHovU2FhcmxhbmQnXG4gICAgICBjYXNlICc3JzpcbiAgICAgICAgcmV0dXJuICdCYWRlbi1Xw7xydHRlbWJlcmcnXG4gICAgICBjYXNlICc4JzpcbiAgICAgICAgcmV0dXJuICdCYXllcm4nXG4gICAgICBjYXNlICc5JzpcbiAgICAgICAgcmV0dXJuICdCYXllcm4vVGjDvHJpbmdlbi9TYWNoc2VuJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdTb25zdGlnZSdcbiAgICB9XG4gIH1cblxuICAvLyBGaWx0ZXIgZGF0YSBiYXNlZCBvbiBzZWFyY2ggcXVlcnkgYW5kIGZpbHRlcnNcbiAgY29uc3QgZmlsdGVyZWRMb2NhdGlvbnMgPSBhY3RpdmVMb2NhdGlvbnMuZmlsdGVyKGxvY2F0aW9uID0+IHtcbiAgICAvLyBTZWFyY2ggZmlsdGVyXG4gICAgY29uc3QgbWF0Y2hlc1NlYXJjaCA9ICFzZWFyY2hRdWVyeSB8fFxuICAgICAgKGxvY2F0aW9uLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoUXVlcnkudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgIChsb2NhdGlvbi5jaXR5IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAobG9jYXRpb24uYWRkcmVzcyB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gU3RhdGUgZmlsdGVyIChiYXNlZCBvbiBwb3N0YWwgY29kZSlcbiAgICBjb25zdCBtYXRjaGVzU3RhdGUgPSBzZWxlY3RlZFN0YXRlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHNlbGVjdGVkU3RhdGVzLmluY2x1ZGVzKGdldFN0YXRlRnJvbVBvc3RhbENvZGUobG9jYXRpb24ucG9zdGFsQ29kZSB8fCAnJykpXG5cbiAgICAvLyBTZXJ2aWNlcyBmaWx0ZXIgKGNoZWNrIGlmIGxvY2F0aW9uIGhhcyBhbnkgb2YgdGhlIHNlbGVjdGVkIHNlcnZpY2VzKVxuICAgIGNvbnN0IG1hdGNoZXNTZXJ2aWNlcyA9IHNlbGVjdGVkU2VydmljZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAobG9jYXRpb24uc2VydmljZXMgJiYgQXJyYXkuaXNBcnJheShsb2NhdGlvbi5zZXJ2aWNlcykgJiZcbiAgICAgICBzZWxlY3RlZFNlcnZpY2VzLnNvbWUoc2VydmljZSA9PiBsb2NhdGlvbi5zZXJ2aWNlcyEuaW5jbHVkZXMoc2VydmljZSkpKVxuXG4gICAgcmV0dXJuIG1hdGNoZXNTZWFyY2ggJiYgbWF0Y2hlc1N0YXRlICYmIG1hdGNoZXNTZXJ2aWNlc1xuICB9KVxuXG4gIGNvbnN0IGZpbHRlcmVkQ29udGFjdHMgPSBhY3RpdmVDb250YWN0cy5maWx0ZXIoY29udGFjdCA9PlxuICAgIChjb250YWN0LmZ1bGxOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgKGNvbnRhY3QucG9zaXRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoUXVlcnkudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAoY29udGFjdC5lbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpKSB8fFxuICAgIChjb250YWN0LnNwZWNpYWx0aWVzICYmIGNvbnRhY3Quc3BlY2lhbHRpZXMuc29tZSgoc3BlY2lhbHR5OiBzdHJpbmcpID0+XG4gICAgICAoc3BlY2lhbHR5IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpXG4gICAgKSlcbiAgKVxuXG4gIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiBVbmlmaWVkTGlzdFZpZXcgLSBmaWx0ZXJlZENvbnRhY3RzOicsIGZpbHRlcmVkQ29udGFjdHMubGVuZ3RoKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3NwYWNlLXktNiBzY3JvbGwtY29udGFpbmVyJywgY2xhc3NOYW1lKX0+XG4gICAgICB7LyogVGFiIE5hdmlnYXRpb24gLSBNb2JpbGUtb3B0aW1pemVkIGxhYmVscyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmRcIj5cbiAgICAgICAgPFVuaWZpZWRUYWJzXG4gICAgICAgICAgdGFicz17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2xvY2F0aW9ucycsXG4gICAgICAgICAgICAgIGxhYmVsOiAnU3RhbmRvcnRlJyxcbiAgICAgICAgICAgICAgY291bnQ6IGZpbHRlcmVkTG9jYXRpb25zLmxlbmd0aCxcbiAgICAgICAgICAgICAgaWNvbjogPEJ1aWxkaW5nMiBjbGFzc05hbWU9XCJ3LTQgaC00IHNtOnctNSBzbTpoLTVcIiAvPlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdjb250YWN0cycsXG4gICAgICAgICAgICAgIGxhYmVsOiAnS29udGFrdGUnLFxuICAgICAgICAgICAgICBjb3VudDogZmlsdGVyZWRDb250YWN0cy5sZW5ndGgsXG4gICAgICAgICAgICAgIGljb246IDxVc2VycyBjbGFzc05hbWU9XCJ3LTQgaC00IHNtOnctNSBzbTpoLTVcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF19XG4gICAgICAgICAgYWN0aXZlVGFiPXthY3RpdmVUYWJ9XG4gICAgICAgICAgb25UYWJDaGFuZ2U9eyh0YWJJZCkgPT4gc2V0QWN0aXZlVGFiKHRhYklkIGFzICdsb2NhdGlvbnMnIHwgJ2NvbnRhY3RzJyl9XG4gICAgICAgICAgdmFyaWFudD1cInVuZGVybGluZVwiXG4gICAgICAgICAgZnVsbFdpZHRoPXt0cnVlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBGaWx0ZXIgQmFyICovfVxuICAgICAgPFNhZmVGaWx0ZXJCYXJcbiAgICAgICAgc2VhcmNoUXVlcnk9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICBvblNlYXJjaENoYW5nZT17c2V0U2VhcmNoUXVlcnl9XG4gICAgICAgIGNsYXNzTmFtZT1cInNoYWRvdy1jYXJkXCJcbiAgICAgIC8+XG5cbiAgICAgIHsvKiBUYWIgQ29udGVudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTYgc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIHthY3RpdmVUYWIgPT09ICdsb2NhdGlvbnMnID8gKFxuICAgICAgICAgICAgLy8gTG9jYXRpb25zIFRhYlxuICAgICAgICAgICAgZmlsdGVyZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTggdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAge3NlYXJjaFF1ZXJ5ID8gJ0tlaW5lIEhhbmRlbHNpbW1vYmlsaWVuIGdlZnVuZGVuJyA6ICdLZWluZSBIYW5kZWxzaW1tb2JpbGllbiB2ZXJmw7xnYmFyJ31cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAgICAgICBjb250YWN0TGF5b3V0ID09PSAnZ3JpZCdcbiAgICAgICAgICAgICAgICAgID8gJ2dyaWQgZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTQgZ2FwLTQgaXRlbXMtc3RyZXRjaCcgLy8gNCBLYWNoZWxuIGF1ZiBEZXNrdG9wXG4gICAgICAgICAgICAgICAgICA6ICdzcGFjZS15LTInXG4gICAgICAgICAgICAgICl9PlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZExvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgICA8TG9jYXRpb25NaW5pR3JpZENhcmRcbiAgICAgICAgICAgICAgICAgICAga2V5PXtsb2NhdGlvbi5pZH1cbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVMb2NhdGlvbkNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8vIENvbnRhY3RzIFRhYlxuICAgICAgICAgICAgZmlsdGVyZWRDb250YWN0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgcHktOCB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgPyAnS2VpbmUgQW5zcHJlY2hwYXJ0bmVyIGdlZnVuZGVuJyA6ICdLZWluZSBBbnNwcmVjaHBhcnRuZXIgdmVyZsO8Z2Jhcid9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgICAgICAgY29udGFjdExheW91dCA9PT0gJ2dyaWQnXG4gICAgICAgICAgICAgICAgICA/ICdncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIGdhcC00IGl0ZW1zLXN0cmV0Y2gnIC8vIDMgS2FjaGVsbiBhdWYgRGVza3RvcFxuICAgICAgICAgICAgICAgICAgOiAnc3BhY2UteS0yJ1xuICAgICAgICAgICAgICApfT5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRDb250YWN0cy5tYXAoKGNvbnRhY3QpID0+IChcbiAgICAgICAgICAgICAgICAgIDxVbmlmaWVkQ29udGFjdENhcmRcbiAgICAgICAgICAgICAgICAgICAga2V5PXtjb250YWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb250YWN0Q2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9e2NvbnRhY3RMYXlvdXQgPT09ICdncmlkJyA/ICdkZWZhdWx0JyA6ICdjb21wYWN0J31cbiAgICAgICAgICAgICAgICAgICAgc2hvd0xvY2F0aW9uPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKVxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IHsgWCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuXG5pbnRlcmZhY2UgTW9kYWxQcm9wcyB7XG4gIGlzT3BlbjogYm9vbGVhblxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG4gIHRpdGxlPzogc3RyaW5nXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnZnVsbCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIGNsb3NlT25PdmVybGF5Q2xpY2s/OiBib29sZWFuXG4gIGNsb3NlT25Fc2NhcGU/OiBib29sZWFuXG4gIHNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IE1vZGFsOiBSZWFjdC5GQzxNb2RhbFByb3BzPiA9ICh7XG4gIGlzT3BlbixcbiAgb25DbG9zZSxcbiAgdGl0bGUsXG4gIGNoaWxkcmVuLFxuICBzaXplID0gJ21kJyxcbiAgY2xhc3NOYW1lLFxuICBjbG9zZU9uT3ZlcmxheUNsaWNrID0gdHJ1ZSxcbiAgY2xvc2VPbkVzY2FwZSA9IHRydWUsXG4gIHNob3dDbG9zZUJ1dHRvbiA9IHRydWVcbn0pID0+IHtcbiAgY29uc3QgbW9kYWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IHByZXZpb3VzQWN0aXZlRWxlbWVudCA9IHVzZVJlZjxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpXG5cbiAgLy8gSGFuZGxlIGVzY2FwZSBrZXlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNsb3NlT25Fc2NhcGUpIHJldHVyblxuXG4gICAgY29uc3QgaGFuZGxlRXNjYXBlID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgaXNPcGVuKSB7XG4gICAgICAgIG9uQ2xvc2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NhcGUpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NhcGUpXG4gIH0sIFtpc09wZW4sIG9uQ2xvc2UsIGNsb3NlT25Fc2NhcGVdKVxuXG4gIC8vIEhhbmRsZSBmb2N1cyBtYW5hZ2VtZW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzT3Blbikge1xuICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgIHByZXZpb3VzQWN0aXZlRWxlbWVudC5jdXJyZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuICAgICAgXG4gICAgICAvLyBGb2N1cyB0aGUgbW9kYWxcbiAgICAgIG1vZGFsUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIFxuICAgICAgLy8gUHJldmVudCBib2R5IHNjcm9sbFxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc3RvcmUgZm9jdXNcbiAgICAgIGlmIChwcmV2aW91c0FjdGl2ZUVsZW1lbnQuY3VycmVudCkge1xuICAgICAgICBwcmV2aW91c0FjdGl2ZUVsZW1lbnQuY3VycmVudC5mb2N1cygpXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlc3RvcmUgYm9keSBzY3JvbGxcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJ1xuICAgIH1cblxuICAgI
25114HJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJydcbiAgICB9XG4gIH0sIFtpc09wZW5dKVxuXG4gIC8vIEhhbmRsZSBvdmVybGF5IGNsaWNrXG4gIGNvbnN0IGhhbmRsZU92ZXJsYXlDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKGNsb3NlT25PdmVybGF5Q2xpY2sgJiYgZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgb25DbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc09wZW4pIHJldHVybiBudWxsXG5cbiAgY29uc3Qgc2l6ZUNsYXNzZXMgPSB7XG4gICAgc206ICdtYXgtdy1tZCcsXG4gICAgbWQ6ICdtYXgtdy1sZycsXG4gICAgbGc6ICdtYXgtdy0yeGwnLFxuICAgIHhsOiAnbWF4LXctNHhsJyxcbiAgICBmdWxsOiAnbWF4LXctZnVsbCdcbiAgfVxuXG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgIFwiZml4ZWQgaW5zZXQtMCB6LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCIsXG4gICAgICAgIC8vIE1vYmlsZTogRnVsbHNjcmVlbiwgRGVza3RvcDogQ2VudGVyZWQgd2l0aCBwYWRkaW5nXG4gICAgICAgIFwicC0wIHNtOnAtNCBtZDpwLTZcIlxuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZU92ZXJsYXlDbGlja31cbiAgICA+XG4gICAgICB7LyogQmFja2Ryb3AgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgYmctYmxhY2svNTAgYmFja2Ryb3AtYmx1ci1zbSBhbmltYXRlLWluIGZhZGUtaW4gZHVyYXRpb24tMjAwXCIgLz5cblxuICAgICAgey8qIE1vZGFsICovfVxuICAgICAgPGRpdlxuICAgICAgICByZWY9e21vZGFsUmVmfVxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIHNoYWRvdy1tb2RhbCBmbGV4IGZsZXgtY29sJyxcbiAgICAgICAgICAnYW5pbWF0ZS1pbiB6b29tLWluLTk1IHNsaWRlLWluLWZyb20tYm90dG9tLTIgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAvLyBGdWxsIHNpemU6IEFsd2F5cyBmdWxsc2NyZWVuLCBPdGhlcnM6IE1vYmlsZSBmdWxsc2NyZWVuLCBEZXNrdG9wIHJvdW5kZWQgd2l0aCBtYXgtaGVpZ2h0XG4gICAgICAgICAgc2l6ZSA9PT0gJ2Z1bGwnXG4gICAgICAgICAgICA/ICdoLWZ1bGwgdy1mdWxsJ1xuICAgICAgICAgICAgOiAnaC1mdWxsIHctZnVsbCBzbTpoLWF1dG8gc206bWF4LWgtW2NhbGMoMTAwdmgtM3JlbSldIHNtOnJvdW5kZWQtbWVjLWxnIG1kOm1heC1oLVtjYWxjKDEwMHZoLTRyZW0pXScsXG4gICAgICAgICAgc2l6ZUNsYXNzZXNbc2l6ZV0sXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXt0aXRsZSA/ICdtb2RhbC10aXRsZScgOiB1bmRlZmluZWR9XG4gICAgICA+XG4gICAgICAgIHsvKiBIZWFkZXIgLSBGaXhlZCBhdCB0b3AgKi99XG4gICAgICAgIHsodGl0bGUgfHwgc2hvd0Nsb3NlQnV0dG9uKSAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwLTQgc206cC02IGJvcmRlci1iIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IGJnLXdoaXRlIHotMTBcIj5cbiAgICAgICAgICAgIHt0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxoMiBpZD1cIm1vZGFsLXRpdGxlXCIgY2xhc3NOYW1lPVwidGV4dC1sZyBzbTp0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7c2hvd0Nsb3NlQnV0dG9uICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicC0yIC1tci0yIHRleHQtdGV4dC1tdXRlZCBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSBob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYyB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vZGFsIHNjaGxpZcOfZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFggY2xhc3NOYW1lPVwidy01IGgtNVwiIC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7LyogQ29udGVudCAtIFNjcm9sbGFibGUgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBvdmVyZmxvdy14LWhpZGRlblwiPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxuXG4gIC8vIFJlbmRlciBpbiBwb3J0YWxcbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChtb2RhbENvbnRlbnQsIGRvY3VtZW50LmJvZHkpXG59XG5cbi8vIFNwZWNpYWxpemVkIG1vZGFsIHZhcmlhbnRzXG5leHBvcnQgY29uc3QgQ29uZmlybU1vZGFsOiBSZWFjdC5GQzx7XG4gIGlzT3BlbjogYm9vbGVhblxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG4gIG9uQ29uZmlybTogKCkgPT4gdm9pZFxuICB0aXRsZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBjb25maXJtVGV4dD86IHN0cmluZ1xuICBjYW5jZWxUZXh0Pzogc3RyaW5nXG4gIHZhcmlhbnQ/OiAnZGFuZ2VyJyB8ICd3YXJuaW5nJyB8ICdpbmZvJ1xufT4gPSAoe1xuICBpc09wZW4sXG4gIG9uQ2xvc2UsXG4gIG9uQ29uZmlybSxcbiAgdGl0bGUsXG4gIG1lc3NhZ2UsXG4gIGNvbmZpcm1UZXh0ID0gJ0Jlc3TDpHRpZ2VuJyxcbiAgY2FuY2VsVGV4dCA9ICdBYmJyZWNoZW4nLFxuICB2YXJpYW50ID0gJ2luZm8nXG59KSA9PiB7XG4gIGNvbnN0IGhhbmRsZUNvbmZpcm0gPSAoKSA9PiB7XG4gICAgb25Db25maXJtKClcbiAgICBvbkNsb3NlKClcbiAgfVxuXG4gIGNvbnN0IHZhcmlhbnRDbGFzc2VzID0ge1xuICAgIGRhbmdlcjogJ2J0bi1kYW5nZXInLFxuICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXG4gICAgaW5mbzogJ2J0bi1wcmltYXJ5J1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8TW9kYWxcbiAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgIHNpemU9XCJzbVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTYgc3BhY2UteS00XCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj57bWVzc2FnZX08L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtMyBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJidG4tZ2hvc3RcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgI
25114HtjYW5jZWxUZXh0fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm19XG4gICAgICAgICAgICBjbGFzc05hbWU9e3ZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtjb25maXJtVGV4dH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L01vZGFsPlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBJbWFnZU1vZGFsOiBSZWFjdC5GQzx7XG4gIGlzT3BlbjogYm9vbGVhblxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG4gIHNyYzogc3RyaW5nXG4gIGFsdDogc3RyaW5nXG4gIHRpdGxlPzogc3RyaW5nXG59PiA9ICh7IGlzT3Blbiwgb25DbG9zZSwgc3JjLCBhbHQsIHRpdGxlIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8TW9kYWxcbiAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgIHNpemU9XCJ4bFwiXG4gICAgICBjbGFzc05hbWU9XCJiZy1ibGFjayBwLTBcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC1mdWxsIHAtNFwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgc3JjPXtzcmN9XG4gICAgICAgICAgYWx0PXthbHR9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibWF4LXctZnVsbCBtYXgtaC1mdWxsIG9iamVjdC1jb250YWluXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvTW9kYWw+XG4gIClcbn1cbiIsIi8qKlxuICogQUNGL1JFU1QgbGllZmVydCBkaWUgdmVybWlldGJhcmUgRmzDpGNoZSBvZnQgbWl0IGVuZ2xpc2NoZW0gRGV6aW1hbHB1bmt0XG4gKiAoMTkuMiBzdGF0dCAxOS4yMDApLiBXZXJ0ZSB1bnRlciAxMDAwIHdlcmRlbiBhbHMgdmVycnV0c2NodGVyIFRhdXNlbmRlclxuICoga29ycmlnaWVydC4gVm9sbGUgbcKyICh6LiBCLiAxNzQ0MykgYmxlaWJlbiB1bnZlcsOkbmRlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1pZXRmbGFlY2hlKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGxcblxuICBsZXQgbnVtOiBudW1iZXJcblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzL2csICcnKVxuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGxcblxuICAgIGlmICgvXlxcZHsxLDN9KFxcLlxcZHszfSkrKCxcXGQrKT8kLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICBudW0gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmltbWVkLnJlcGxhY2UoL1xcLi9nLCAnJykucmVwbGFjZSgnLCcsICcuJykpXG4gICAgfSBlbHNlIGlmICh0cmltbWVkLmluY2x1ZGVzKCcsJykgJiYgIXRyaW1tZWQuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgbnVtID0gTnVtYmVyLnBhcnNlRmxvYXQodHJpbW1lZC5yZXBsYWNlKCcsJywgJy4nKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtID0gTnVtYmVyLnBhcnNlRmxvYXQodHJpbW1lZClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbnVtID0gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtKSB8fCBudW0gPD0gMCkgcmV0dXJuIG51bGxcbiAgaWYgKG51bSA8IDEwMDApIHJldHVybiBNYXRoLnJvdW5kKG51bSAqIDEwMDApXG4gIHJldHVybiBNYXRoLnJvdW5kKG51bSlcbn1cblxuLyoqIERldXRzY2hlIFNjaHJlaWJ3ZWlzZSBvaG5lIEVpbmhlaXQsIHouIEIuIFwiMTkuMjAwXCIgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNaWV0ZmxhZWNoZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHNxbSA9IHBhcnNlTWlldGZsYWVjaGUodmFsdWUpXG4gIGlmIChzcW0gPT0gbnVsbCkgcmV0dXJuICcnXG4gIHJldHVybiBzcW0udG9Mb2NhbGVTdHJpbmcoJ2RlLURFJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAgfSlcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1aWxkaW5nMiwgU2hvcHBpbmdCYWcsIExheWVycywgRXh0ZXJuYWxMaW5rIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi8uLi90eXBlcydcbmltcG9ydCB7IGZvcm1hdE1pZXRmbGFlY2hlIH0gZnJvbSAnQHV0aWxzL2Zvcm1hdEFyZWEnXG5cbmludGVyZmFjZSBMb2NhdGlvbk1vZGFsSGVyb1Byb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uXG4gIGNlbnRlckRhdGE6IHtcbiAgICB2ZXJtaWV0YmFyZUZsYWVjaGU/OiBudW1iZXIgfCBzdHJpbmdcbiAgICBhbnphaGxTaG9wcz86IG51bWJlciB8IHN0cmluZyAgXG4gICAgdmVya2F1ZnNlYmVuZW4/OiBudW1iZXIgfCBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTG9jYXRpb25Nb2RhbEhlcm86IFJlYWN0LkZDPExvY2F0aW9uTW9kYWxIZXJvUHJvcHM+ID0gKHtcbiAgbG9jYXRpb24sXG4gIGNlbnRlckRhdGFcbn0pID0+IHtcbiAgY29uc3QgaGFuZGxlQ2VudGVyTGlua0NsaWNrID0gKCkgPT4ge1xuICAgIGNvbnN0IGNlbnRlckxpbmsgPSAobG9jYXRpb24gYXMgYW55KS5jZW50ZXJsaW5rIHx8IGxvY2F0aW9uLmNlbnRlckxpbmtcbiAgICBpZiAoY2VudGVyTGluaykge1xuICAgICAgd2luZG93Lm9wZW4oY2VudGVyTGluaywgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJylcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRJbWFnZVVybCA9ICgpID0+IHtcbiAgICByZXR1cm4gKGxvY2F0aW9uIGFzIGFueSkuaGVyb2ltYWdlIHx8IGxvY2F0aW9uLmhlcm9JbWFnZSB8fCBsb2NhdGlvbi5pbWFnZSB8fCBsb2NhdGlvbi5sb2dvIHx8ICcvYXNzZXRzL3BsYWNlaG9sZG
25114VyLWxvY2F0aW9uLmpwZydcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLWZ1bGwgZmxleCBmbGV4LWNvbCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgIHsvKiBIZXJvIEltYWdlIC0gU21hbGxlciBvbiBNb2JpbGUgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLVsyNXZoXSBtZDpoLVs0NXZoXSBtaW4taC1bMjAwcHhdIG1kOm1pbi1oLVszMDBweF0gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICA8aW1nXG4gICAgICAgICAgc3JjPXtnZXRJbWFnZVVybCgpfVxuICAgICAgICAgIGFsdD17bG9jYXRpb24ubmFtZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgey8qIExvZ28gaW4gdG9wIHJpZ2h0IC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAge2xvY2F0aW9uLmxvZ28gJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTQgcmlnaHQtNCBtZDp0b3AtNiBtZDpyaWdodC02XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzkwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTIgbWQ6cC0zXCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e2xvY2F0aW9uLmxvZ299XG4gICAgICAgICAgICAgICAgYWx0PXtgJHtsb2NhdGlvbi5uYW1lfSBMb2dvYH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggbWQ6aC0xMiB3LWF1dG8gb2JqZWN0LWNvbnRhaW5cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIFRpdGxlICsgRmFjdHMgU2VjdGlvbiAtIERhcmsgQmx1ZSBCYWNrZ3JvdW5kICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgcC00IG1kOnAtNiBsZzpwLTggZmxleCBmbGV4LWNvbCBiZy1tZWMtc2Vjb25kYXJ5IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICB7LyogTG9jYXRpb24gTmFtZSAmIENpdHkgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBtZDptYi02IGxnOm1iLThcIj5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgbWQ6dGV4dC0zeGwgbGc6dGV4dC00eGwgZm9udC1ib2xkIG1iLTEgbWQ6bWItMiBsZWFkaW5nLXRpZ2h0IHRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1sZyBtZDp0ZXh0LXhsIGxnOnRleHQtMnhsIHRleHQtd2hpdGUvOTBcIj5cbiAgICAgICAgICAgIHtsb2NhdGlvbi5jaXR5fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFN0YXRzIEdyaWQgLSBNb2JpbGUgT3B0aW1pemVkLCBEZXNrdG9wIDMtQ29sdW1uICovfVxuICAgICAgICB7KGNlbnRlckRhdGEudmVybWlldGJhcmVGbGFlY2hlIHx8IGNlbnRlckRhdGEuYW56YWhsU2hvcHMgfHwgY2VudGVyRGF0YS52ZXJrYXVmc2ViZW5lbikgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBtZDptYi02IGxnOm1iLThcIj5cbiAgICAgICAgICAgIHsvKiBNb2JpbGUgTGF5b3V0OiBWZXJtaWV0YmFyZSBGbMOkY2hlIGZ1bGwgd2lkdGgsIG90aGVycyBzaWRlIGJ5IHNpZGUgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJsb2NrIG1kOmhpZGRlbiBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgey8qIFZlcm1pZXRiYXJlIEZsw6RjaGUgLSBGdWxsIFdpZHRoIG9uIE1vYmlsZSAqL31cbiAgICAgICAgICAgICAge2NlbnRlckRhdGEudmVybWlldGJhcmVGbGFlY2hlICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzEwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTQgdGV4dC1jZW50ZXIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPEJ1aWxkaW5nMiBjbGFzc05hbWU9XCJ3LTYgaC02IHRleHQtd2hpdGUgbXgtYXV0byBtYi0yXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LWJvbGQgdGV4dC13aGl0ZSBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHtmb3JtYXRNaWV0ZmxhZWNoZShjZW50ZXJEYXRhLnZlcm1pZXRiYXJlRmxhZWNoZSl9bcKyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXdoaXRlLzgwIGxlYWRpbmctdGlnaHRcIj5WZXJtaWV0YmFyZSBGbMOkY2hlPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgey8qIE1pZXRmbMOkY2hlbiAmIFZlcmthdWZzZWJlbmVuIC0gU2lkZSBieSBTaWRlIG9uIE1vYmlsZSAqL31cbiAgICAgICAgICAgICAgeyhjZW50ZXJEYXRhLmFuemFobFNob3BzIHx8IGNlbnRlckRhdGEudmVya2F1ZnNlYmVuZW4pICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgIHtjZW50ZXJEYXRhLmFuemFobFNob3BzICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZS8xMCBiYWNrZHJvcC1ibHVyLXNtIHJvdW5kZWQtbGcgcC00IHRleHQtY2VudGVyIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2hvcHBpbmdCYWcgY2xhc3NOYW1lPVwidy02IGgtNiB0ZXh0LXdoaXRlIG14LWF1dG8gbWItMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjZW50ZXJEYXRhLmFuemFobFNob3BzfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXdoaXRlLzgwXCI+TWlldGZsw6RjaGVuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgICAge2NlbnRlckRhdGEudmVya2F1ZnNlYmVuZW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzEwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTQgdGV4dC1jZW50ZXIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxMYXllcnMgY2xhc3NOYW1lPVwidy02IGgtNiB0ZXh0LXdoaXRlIG14LWF1dG8gbWItMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgI
25114HtjZW50ZXJEYXRhLnZlcmthdWZzZWJlbmVufVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXdoaXRlLzgwXCI+VmVya2F1ZnNlYmVuZW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBEZXNrdG9wIExheW91dDogQWxsIDMgaW4gb25lIHJvdyAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLTMgbWQ6Z2FwLTQgbGc6Z2FwLTYgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgIHtjZW50ZXJEYXRhLnZlcm1pZXRiYXJlRmxhZWNoZSAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZS8xMCBiYWNrZHJvcC1ibHVyLXNtIHJvdW5kZWQtbGcgcC01IGxnOnAtNiB0ZXh0LWNlbnRlciBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxCdWlsZGluZzIgY2xhc3NOYW1lPVwidy04IGgtOCBsZzp3LTEwIGxnOmgtMTAgdGV4dC13aGl0ZSBteC1hdXRvIG1iLTMgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGxnOnRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTEgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgICAgICAgICAge2Zvcm1hdE1pZXRmbGFlY2hlKGNlbnRlckRhdGEudmVybWlldGJhcmVGbGFlY2hlKX1twrJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGxnOnRleHQtYmFzZSB0ZXh0LXdoaXRlLzgwIGxlYWRpbmctdGlnaHRcIj5WZXJtaWV0YmFyZSBGbMOkY2hlPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAge2NlbnRlckRhdGEuYW56YWhsU2hvcHMgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
25114pdGUvMTAgYmFja2Ryb3AtYmx1ci1zbSByb3VuZGVkLWxnIHAtNSBsZzpwLTYgdGV4dC1jZW50ZXIgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8U2hvcHBpbmdCYWcgY2xhc3NOYW1lPVwidy04IGgtOCBsZzp3LTEwIGxnOmgtMTAgdGV4dC13aGl0ZSBteC1hdXRvIG1iLTMgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGxnOnRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIG1iLTEgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgICAgICAgICAge2NlbnRlckRhdGEuYW56YWhsU2hvcHN9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBsZzp0ZXh0LWJhc2UgdGV4dC13aGl0ZS84MFwiPk1pZXRmbMOkY2hlbjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIHtjZW50ZXJEYXRhLnZlcmthdWZzZWJlbmVuICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlLzEwIGJhY2tkcm9wLWJsdXItc20gcm91bmRlZC1sZyBwLTUgbGc6cC02IHRleHQtY2VudGVyIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPExheWVycyBjbGFzc05hbWU9XCJ3LTggaC04IGxnOnctMTAgbGc6aC0xMCB0ZXh0LXdoaXRlIG14LWF1dG8gbWItMyBmbGV4LXNocmluay0wXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgbGc6dGV4dC0zeGwgZm9udC1ib2xkIHRleHQtd2hpdGUgbWItMSBicmVhay13b3Jkc1wiPlxuICAgICAgICAgICAgICAgICAgICB7Y2VudGVyRGF0YS52ZXJrYXVmc2ViZW5lbn1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGxnOnRleHQtYmFzZSB0ZXh0LXdoaXRlLzgwXCI+VmVya2F1ZnNlYmVuZW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBDZW50ZXIgTGluayBCdXR0b24gLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICB7KChsb2NhdGlvbiBhcyBhbnkpLmNlbnRlcmxpbmsgfHwgbG9jYXRpb24uY2VudGVyTGluaykgJiYgKFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNlbnRlckxpbmtDbGlja31cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgbWQ6dy1hdXRvIHB4LTYgcHktMy41IG1kOnB5LTMgYmctbWVjLXByaW1hcnkgaG92ZXI6YmctbWVjLXByaW1hcnktZGFyayBhY3RpdmU6YmctbWVjLXByaW1hcnktZGFyayB0ZXh0LXdoaXRlIGZvbnQtc2VtaWJvbGQgcm91bmRlZC1sZyB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0yMDAgbWluLWgtWzQ4cHhdIHRleHQtYmFzZSBtZDp0ZXh0LWJhc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuPlp1bSBDZW50ZXI8L3NwYW4+XG4gICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInctNSBoLTUgbWQ6dy00IG1kOmgtNCBtbC0yXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1hcFBpbiwgTWFpbCwgUGhvbmUsIEdsb2JlLCBDaGV2cm9uRG93biwgQ2hldnJvblVwIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICcuLi8uLi90eXBlcydcblxuaW50ZXJmYWNlIExvY2F0aW9uTW9kYWxJbmZvUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbn1cblxuZXhwb3J0IGNvbnN0IExvY2F0aW9uTW9kYWxJbmZvOiBSZWFjdC5GQzxMb2NhdGlvbk1vZGFsSW5mb1Byb3BzPiA9ICh7XG4gIGxvY2F0aW9uXG59KSA9PiB7XG4gIGNvbnN0IFtzaG93RnVsbERlc2NyaXB0aW9uLCBzZXRTaG93RnVsbERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IGhhbmRsZUVtYWlsQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGxvY2F0aW9uLmVtYWlsKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGBtYWlsdG86JHtsb2NhdGlvbi5lbWFpbH1gXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGhvbmVDbGljayA9ICgpID0+IHtcbiAgICBpZiAobG9jYXRpb24ucGhvbmUpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYHRlbDoke2xvY2F0aW9uLnBob25lfWBcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVXZWJzaXRlQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGxvY2F0aW9uLndlYnNpdGUpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGxvY2F0aW9uLndlYnNpdGUsICdfYmxhbmsnLCAnbm9vcGVuZXIsbm9yZWZlcnJlcicpXG4gICAgfVxuICB9XG5cbiAgLy8gRGVzY3JpcHRpb24gaGFuZGxpbmdcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBsb2NhdGlvbi5kZXNjcmlwdGlvbiB8fCAnJ1xuICBjb25zdCBzaG91bGRUcnVuY2F0ZSA9IGRlc2NyaXB0aW9uLmxlbmd0aCA+IDIwMFxuICBjb25zdCBkaXNwbGF5RGVzY3JpcHRpb24gPSBzaG91bGRUcnVuY2F0ZSAmJiAhc2hvd0Z1bGxEZXNjcmlwdGlvbiBcbiAgICA/IGRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCAyMDApICsgJy4uLicgXG4gICAgOiBkZXNjcmlwdGlvblxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCBwLTYgYm9yZGVyLWIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnlcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgI
25114Htsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L2gyPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWxnIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgIHtsb2NhdGlvbi5jaXR5fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIFNjcm9sbGFibGUgQ29udGVudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBwLTYgc3BhY2UteS04XCI+XG4gICAgICAgIHsvKiBBZGRyZXNzIFNlY3Rpb24gKi99XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi00IGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8TWFwUGluIGNsYXNzTmFtZT1cInctNSBoLTUgbXItMiB0ZXh0LW1lYy1wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgIEFkcmVzc2VcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1sZyBwLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5XCI+e2xvY2F0aW9uLm5hbWV9PC9wPlxuICAgICAgICAgICAgICB7bG9jYXRpb24uYWRkcmVzcyAmJiAoXG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPntsb2NhdGlvbi5hZGRyZXNzfTwvcD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgIHsoKGxvY2F0aW9uIGFzIGFueSkucG9zdGFsY29kZSB8fCBsb2NhdGlvbi5wb3N0YWxDb2RlKSAmJiBgJHsobG9jYXRpb24gYXMgYW55KS5wb3N0YWxjb2RlIHx8IGxvY2F0aW9uLnBvc3RhbENvZGV9IGB9XG4gICAgICAgICAgICAgICAge2xvY2F0aW9uLmNpdHl9XG4gICAgICAgICAgICAgICAge2xvY2F0aW9uLmNvdW50cnkgJiYgbG9jYXRpb24uY291bnRyeSAhPT0gJ0RldXRzY2hsYW5kJyAmJiBgLCAke2xvY2F0aW9uLmNvdW50cnl9YH1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBDb250YWN0IEluZm9ybWF0aW9uICovfVxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNFwiPlxuICAgICAgICAgICAgS29udGFrdFxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgIHsvKiBFbWFpbCAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgICAgICB7bG9jYXRpb24uZW1haWwgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRW1haWxDbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgdy1mdWxsIHRleHQtbGVmdCBwLTMgcm91bmRlZC1sZyBob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBhY3RpdmU6YmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjBweF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTEyIGgtMTIgYmctbWVjLXByaW1hcnkvMTAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNiBoLTYgdGV4dC1tZWMtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWQgbWItMC41XCI+RS1NYWlsPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1tZWMtcHJpbWFyeSBmb250LW1lZGl1bSB0cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7bG9jYXRpb24uZW1haWx9XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIFBob25lIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICAgIHtsb2NhdGlvbi5waG9uZSAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQaG9uZUNsaWNrfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyB3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGhvdmVyOmJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IGFjdGl2ZTpiZy1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHRyYW5zaXRpb24tY29sb3JzIG1pbi1oLVs2MHB4XVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTIgaC0xMiBiZy1tZWMtcHJpbWFyeS8xMCByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAgPFBob25lIGNsYXNzTmFtZT1cInctNiBoLTYgdGV4dC1tZWMtcHJpbWFyeVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWQgbWItMC41XCI+VGVsZWZvbjwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtbWVjLXByaW1hcnkgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgICAge2xvY2F0aW9uLnBob25lfVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgI
25114HsvKiBXZWJzaXRlIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICAgIHtsb2NhdGlvbi53ZWJzaXRlICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVdlYnNpdGVDbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgdy1mdWxsIHRleHQtbGVmdCBwLTMgcm91bmRlZC1sZyBob3ZlcjpiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSBhY3RpdmU6YmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjBweF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTEyIGgtMTIgYmctbWVjLXByaW1hcnkvMTAgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgIDxHbG9iZSBjbGFzc05hbWU9XCJ3LTYgaC02IHRleHQtbWVjLXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LW11dGVkIG1iLTAuNVwiPldlYnNpdGU8L3A+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LW1lYy1wcmltYXJ5IGZvbnQtbWVkaXVtIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi53ZWJzaXRlLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgJycpfVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBEZXNjcmlwdGlvbiAqL31cbiAgICAgICAge2Rlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi00XCI+XG4gICAgICAgICAgICAgIEJlc2NocmVpYnVuZ1xuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1sZyBwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtc2Vjb25kYXJ5IGxlYWRpbmctcmVsYXhlZFwiXG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBkaXNwbGF5RGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHtzaG91bGRUcnVuY2F0ZSAmJiAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd0Z1bGxEZXNjcmlwdGlvbighc2hvd0Z1bGxEZXNjcmlwdGlvbil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC0zIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOnRleHQtbWVjLXByaW1hcnktZGFyayBmb250LW1lZGl1bSB0ZXh0LXNtIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c2hvd0Z1bGxEZXNjcmlwdGlvbiA/IChcbiAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5XZW5pZ2VyIGFuemVpZ2VuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGV2cm9uVXAgY2xhc3NOYW1lPVwidy00IGgtNCBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1laHIgYW56ZWlnZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cInctNCBoLTQgbWwtMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBBZGRpdGlvbmFsIEluZm8gKi99XG4gICAgICAgIHsoKGxvY2F0aW9uIGFzIGFueSkub3BlbmluZ2RhdGUgfHwgbG9jYXRpb24ub3BlbmluZ0RhdGUgfHwgKGxvY2F0aW9uIGFzIGFueSkucGFya2luZ3NwYWNlcyB8fCBsb2NhdGlvbi5wYXJraW5nU3BhY2VzKSAmJiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNFwiPlxuICAgICAgICAgICAgICBXZWl0ZXJlIEluZm9ybWF0aW9uZW5cbiAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbGcgcC00IHNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICB7KChsb2NhdGlvbiBhcyBhbnkpLm9wZW5pbmdkYXRlIHx8IGxvY2F0aW9uLm9wZW5pbmdEYXRlKSAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+RXLDtmZmbnVuZzwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIHtuZXcgRGF0ZSgobG9jYXRpb24gYXMgYW55KS5vcGVuaW5nZGF0ZSB8fCBsb2NhdGlvbi5vcGVuaW5nRGF0ZSkuZ2V0RnVsbFllYXIoKX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICB7KChsb2NhdGlvbiBhcyBhbnkpLnBhcmtpbmdzcGFjZXMgfHwgbG9jYXRpb24ucGFya2luZ1NwYWNlcykgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1tdXRlZFwiPlBhcmtwbMOkdHplPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgeyhsb2NhdGlvbiBhcyBhbnkpLnBhcmtpbmdzcGFjZXMgfHwgbG9jYXRpb24ucGFya2luZ1NwYWNlc31cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7
25114IE1hcFBpbiwgVXNlcnMgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBMb2NhdGlvbiwgQ29udGFjdCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgQ29udGFjdENhcmQgfSBmcm9tICcuLi9Db250YWN0L0NvbnRhY3RDYXJkJ1xuaW1wb3J0IHsgdXNlQ29udGFjdE1vZGFsIH0gZnJvbSAnQHN0b3Jlcy91c2VBcHBTdG9yZSdcblxuaW50ZXJmYWNlIExvY2F0aW9uTW9kYWxDb250YWN0c1Byb3BzIHtcbiAgbG9jYXRpb246IExvY2F0aW9uXG4gIGNvbnRhY3RzOiBDb250YWN0W11cbiAgaXNMb2FkaW5nOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbk1vZGFsQ29udGFjdHM6IFJlYWN0LkZDPExvY2F0aW9uTW9kYWxDb250YWN0c1Byb3BzPiA9ICh7XG4gIGxvY2F0aW9uLFxuICBjb250YWN0cyxcbiAgaXNMb2FkaW5nXG59KSA9PiB7XG4gIGNvbnN0IHsgb3Blbjogb3BlbkNvbnRhY3RNb2RhbCB9ID0gdXNlQ29udGFjdE1vZGFsKClcbiAgLy8gU2hvdyBBTEwgbG9jYXRpb24tc3BlY2lmaWMgY29udGFjdHMgKGluY2x1ZGluZyBtYW5hZ2VtZW50KVxuICBjb25zdCBsb2NhdGlvbkNvbnRhY3RzID0gY29udGFjdHMuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgIGNvbnN0IGhhc0xvY2F0aW9uSWQgPSBjb250YWN0LmxvY2F0aW9uSWQgPT09IGxvY2F0aW9uLmlkXG4gICAgcmV0dXJuIGhhc0xvY2F0aW9uSWRcbiAgfSlcblxuICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIHAtNiBib3JkZXItYiBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeVwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgIEFuc3ByZWNocGFydG5lclxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1sZyB0ZXh0LXRleHQtc2Vjb25kYXJ5IG10LTFcIj5cbiAgICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIExvYWRpbmcgU3RhdGUgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhbmltYXRlLXNwaW4gcm91bmRlZC1mdWxsIGgtMTIgdy0xMiBib3JkZXItYi0yIGJvcmRlci1tZWMtcHJpbWFyeSBteC1hdXRvIG1iLTRcIj48L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1tdXRlZFwiPkxhZGUgQW5zcHJlY2hwYXJ0bmVyLi4uPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCBwLTYgYm9yZGVyLWIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnlcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgIEtvbnRha3RlICh7bG9jYXRpb25Db250YWN0cy5sZW5ndGh9KVxuICAgICAgICA8L2gyPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWxnIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAge2xvY2F0aW9uQ29udGFjdHMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNCBtZDpwLTZcIj5cbiAgICAgICAgICAgIHsvKiBTZWN0aW9uIEhlYWRlciAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBtZDptYi02XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItMiBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy01IGgtNSBtci0yIHRleHQtbWVjLXByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgIElociBBbnNwcmVjaHBhcnRuZXJcbiAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICB7bG9jYXRpb25Db250YWN0cy5sZW5ndGh9IEFuc3ByZWNocGFydG5lciBhbiBkaWVzZW0gU3RhbmRvcnRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDb250YWN0cyBHcmlkIC0gTW9iaWxlLUZpcnN0ICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIGdhcC0zIG1kOmdhcC00IGl0ZW1zLXN0cmV0Y2hcIj5cbiAgICAgICAgICAgICAge2xvY2F0aW9uQ29udGFjdHMubWFwKChjb250YWN0KSA9PiAoXG4gICAgICAgICAgICAgICAgPENvbnRhY3RDYXJkXG4gICAgICAgICAgICAgICAgICBrZXk9e2NvbnRhY3QuaWR9XG4gICAgICAgICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17b3BlbkNvbnRhY3RNb2RhbH1cbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICBzaG93TG9jYXRpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgLyogRW1wdHkgU3RhdGUgKi9cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgbWF4LXctbWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE2IGgtMTYgYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG14LWF1dG8gbWItNFwiPlxuICAgICAgICAgICAgICAgIDxVc2VycyBjbGFzc05hbWU9XCJ3LTggaC04IHRleHQtdGV4dC1tdXRlZFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgICAgICAgICBLZWluZSBBbnNwcmVjaHBhcnRuZXIgdmVyZsO8Z2JhclxuICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtbXV0ZWQgdGV4dC1zbSBsZWFkaW5nLXJlbGF4ZWRcIj5cbiAgICAgICAgICAgICAgICBGw7xyIGRpZXNlbiBTdGFuZG9ydCBzaW5kIGFrdHVlbGwga2VpbmUgZGlyZWt0ZW4gQW5zcHJlY2hwYXJ0bmVyIGhpbnRlcmxlZ3QuIFxuICAgICAgICAgICAgICAgIE51dHplbiBTaWUgZGllIGFsbGdlbWVpbmVuIEtvbnRha3RkYXRlbiBkZXMgU3RhbmRvcnRzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBXaWZpT2ZmLCBSZWZyZXNoQ3cgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmludGVyZmFjZSBPZmZsaW5lRmFsbGJhY2tQcm9wcyB7XG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgb25SZXRyeT86ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBPZmZsaW5lIEZhbGxiYWNrIENvbXBvbmVudFxuICogU2hvd3Mgd2hlbiBkYXRhIGlzIG5vdCBhdmFpbGFibGUgb2ZmbGluZVxuICovXG5leHBvcnQgY29uc3QgT2ZmbGluZUZhbGxiYWNrOiBSZWFjdC5GQzxPZmZsaW5lRmFsbGJhY2tQcm9wcz4gPSAoe1xuICBtZXNzYWdlID0gJ0RpZXNlIERhdGVuIHNpbmQgb2ZmbGluZSBuaWNodCB2ZXJmw7xnYmFyJyxcbiAgb25SZXRyeVxufSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcC04IHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTYgaC0xNiBiZy15ZWxsb3ctMTAwIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYi00XCI+XG4gICAgICAgIDxXaWZpT2ZmIGNsYXNzTmFtZT1cInctOCBoLTggdGV4dC15ZWxsb3ctNjAwXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj5cbiAgICAgICAgT2ZmbGluZS1Nb2R1c1xuICAgICAgPC9oMz5cbiAgICAgIFxuICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeSBtYi00IG1heC13LW1kXCI+XG4gICAgICAgI
25114HttZXNzYWdlfVxuICAgICAgPC9wPlxuXG4gICAgICB7b25SZXRyeSAmJiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXtvblJldHJ5fVxuICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBweC00IHB5LTIgYmctbWVjLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLWxnIGhvdmVyOmJnLW1lYy1wcmltYXJ5LWRhcmsgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPFJlZnJlc2hDdyBjbGFzc05hbWU9XCJ3LTQgaC00XCIgLz5cbiAgICAgICAgICA8c3Bhbj5Fcm5ldXQgdmVyc3VjaGVuPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICl9XG5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC10ZXh0LW11dGVkIG10LTRcIj5cbiAgICAgICAgw5ZmZm5lbiBTaWUgZGllc2UgU2VpdGUgb25saW5lLCB1bSBkaWUgRGF0ZW4genUgbGFkZW5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vKipcbiAqIENvbXBhY3QgT2ZmbGluZSBNZXNzYWdlXG4gKiBGb3IgaW5saW5lIHVzZSBpbiBsaXN0c1xuICovXG5leHBvcnQgY29uc3QgT2ZmbGluZU1lc3NhZ2U6IFJlYWN0LkZDPHsgbWVzc2FnZT86IHN0cmluZyB9PiA9ICh7IFxuICBtZXNzYWdlID0gJ09mZmxpbmUgbmljaHQgdmVyZsO8Z2JhcicgXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgcC0zIGJnLXllbGxvdy01MCBib3JkZXIgYm9yZGVyLXllbGxvdy0yMDAgcm91bmRlZC1sZyB0ZXh0LXNtXCI+XG4gICAgICA8V2lmaU9mZiBjbGFzc05hbWU9XCJ3LTQgaC00IHRleHQteWVsbG93LTYwMCBmbGV4LXNocmluay0wXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteWVsbG93LTgwMFwiPnttZXNzYWdlfTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgWCwgQnVpbGRpbmcyLCBVc2VycywgSG9tZSwgQ2hldnJvbkxlZnQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uL1VJL01vZGFsJ1xuaW1wb3J0IHsgdXNlTG9jYXRpb24gfSBmcm9tICcuLi8uLi9ob29rcy91c2VMb2NhdGlvbnMnXG5pbXBvcnQgeyB1c2VGaWx0ZXJlZENvbnRhY3RzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlQ29udGFjdHMnXG5pbXBvcnQgeyB1c2VMb2NhdGlvbk1vZGFsIH0gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZUFwcFN0b3JlJ1xuaW1wb3J0IHsgTG9jYXRpb25Nb2RhbEhlcm8gfSBmcm9tICcuL0xvY2F0aW9uTW9kYWxIZXJvJ1xuaW1wb3J0IHsgTG9jYXRpb25Nb2RhbEluZm8gfSBmcm9tICcuL0xvY2F0aW9uTW9kYWxJbmZvJ1xuaW1wb3J0IHsgTG9jYXRpb25Nb2RhbENvbnRhY3RzIH0gZnJvbSAnLi9Mb2NhdGlvbk1vZGFsQ29udGFjdHMnXG5pbXBvcnQgeyBPZmZsaW5lRmFsbGJhY2sgfSBmcm9tICcuLi9VSS9PZmZsaW5lRmFsbGJhY2snXG5cbnR5cGUgVmlld1R5cGUgPSAnaGVybycgfCAnaW5mbycgfCAnY29udGFjdHMnXG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbkNvbnRhY3RNb2RhbDogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IHsgaXNPcGVuLCBsb2NhdGlvbklkLCBjbG9zZSB9ID0gdXNlTG9jYXRpb25Nb2RhbCgpXG4gIGNvbnN0IFthY3RpdmVWaWV3LCBzZXRBY3RpdmVWaWV3XSA9IHVzZVN0YXRlPFZpZXdUeXBlPignaGVybycpXG5cbiAgLy8gUmVzZXQgdmlldyB0byAnaGVybycgd2hlbiBsb2NhdGlvbklkIGNoYW5nZXMgKG5ldyBtb2RhbCBvcGVucylcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobG9jYXRpb25JZCkge1xuICAgICAgc2V0QWN0aXZlVmlldygnaGVybycpXG4gICAgfVxuICB9LCBbbG9jYXRpb25JZF0pXG5cbiAgY29uc3Qgb25DbG9zZSA9IGNsb3NlXG4gIGNvbnN0IHsgZGF0YTogbG9jYXRpb24sIGlzTG9hZGluZzogbG9jYXRpb25Mb2FkaW5nLCBlcnJvcjogbG9jYXRpb25FcnJvciB9ID0gdXNlTG9jYXRpb24obG9jYXRpb25JZClcbiAgY29uc3QgeyBjb250YWN0cywgbG9jYXRpb25TcGVjaWZpY0NvdW50LCBpc0xvYWRpbmc6IGNvbnRhY3RzTG9hZGluZyB9ID0gdXNlRmlsdGVyZWRDb250YWN0cyhsb2NhdGlvbklkIHx8IHVuZGVmaW5lZClcblxuICBpZiAoIWlzT3BlbiB8fCAhbG9jYXRpb25JZCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBpc0xvYWRpbmcgPSBsb2NhdGlvbkxvYWRpbmcgfHwgY29udGFjdHNMb2FkaW5nXG4gIGNvbnN0IGhhc0Vycm9yID0gbG9jYXRpb25FcnJvciB8fCAhbG9jYXRpb25cblxuICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNb2RhbFxuICAgICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgdGl0bGU9XCJMYWRlIFN0YW5kb3J0Li4uXCJcbiAgICAgICAgc2l6ZT1cImZ1bGxcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtOTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiByb3VuZGVkLWZ1bGwgaC0xMiB3LTEyIGJvcmRlci1iLTIgYm9yZGVyLW1lYy1wcmltYXJ5XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Nb2RhbD5cbiAgICApXG4gIH1cblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGFuIG9mZmxpbmUgZXJyb3JcbiAgICBjb25zdCBpc09mZmxpbmVFcnJvciA9ICFuYXZpZ2F0b3Iub25MaW5lIHx8IChsb2NhdGlvbkVycm9yIGFzIGFueSk/LnN0YXR1cyA9PT0gNTAzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPE1vZGFsXG4gICAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgICBvbkNsb3NlPXtvbkNsb3NlfVxuICAgICAgICB0aXRsZT17aXNPZmZsaW5lRXJyb3IgPyBcIk9mZmxpbmUtTW9kdXNcIiA6IFwiRmVobGVyXCJ9XG4gICAgICAgIHNpemU9XCJmdWxsXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBoLTk2XCI+XG4gICAgICAgICAge2lzT2ZmbGluZUVycm9yID8gKFxuICAgICAgICAgICAgPE9mZmxpbmVGYWxsYmFja1xuICAgICAgICAgICAgICBtZXNzYWdlPVwiRGllc2VyIFN0YW5kb3J0IHd1cmRlIG5vY2ggbmljaHQgb2ZmbGluZSBnZXNwZWljaGVydC4gw5ZmZm5lbiBTaWUgaWhuIG9ubGluZSwgdW0gZGllIERhdGVuIHp1IGNhY2hlbi5cIlxuICAgICAgICAgICAgICBvblJldHJ5PXsoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1tdXRlZCBtYi00XCI+U3RhbmRvcnQga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLjwvcD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2NobGllw59lblxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Nb2RhbD5cbiAgICApXG4gIH1cblxuICAvLyBHZXQgY2VudGVyIGRhdGEgZm9yIHN0YXRzXG4gIGNvbnN0IGdldENlbnRlckRhdGEgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEZ1bGwgbG9jYXRpb24gb2JqZWN0OicsIGxvY2F0aW9uKVxuICAgIFxuICAgIC8vIEZpcnN0IHRyeSBkYXRhYmFzZSBmaWVsZHMgKEFQSSByZXR1cm5zIGNhbWVsQ2FzZSBmaWVsZCBuYW1lcylcbiAgICBjb25zdCByZW50YWJsZUFyZWEgPSAobG9jYXRpb24gYXMgYW55KS5yZW50YWJsZUFyZWEgfHwgKGxvY2F0aW9uIGFzIGFueSkucmVudGFibGVhcmVhXG4gICAgY29uc3Qgc2hvcENvdW50ID0gKGxvY2F0aW9uIGFzIGFueSkuc2hvcENvdW50IHx8IChsb2NhdGlvbiBhcyBhbnkpLnNob3Bjb3VudFxuICAgIGNvbnN0IHNhbGVzTGV2ZWxzID0gKGxvY2F0aW9uIGFzIGFueSkuc2FsZXNMZXZlbHMgfHwgKGxvY2F0aW9uIGFzIGFueSkuc2FsZXNsZXZlbHNcbiAgICBcbiAgICBpZiAocmVudGFibGVBcmVhIHx8IHNob3BDb3VudCB8fCBzYWxlc0xldmVscykge1xuICAgICAgY29uc29sZS5sb2coJ+KchSBVc2luZyBkYXRhYmFzZSBmaWVsZHM6Jywge1xuICAgICAgICByZW50YWJsZUFyZWEsXG4gICAgICAgI
25114HNob3BDb3VudCxcbiAgICAgICAgc2FsZXNMZXZlbHNcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZXJtaWV0YmFyZUZsYWVjaGU6IHJlbnRhYmxlQXJlYSxcbiAgICAgICAgYW56YWhsU2hvcHM6IHNob3BDb3VudCxcbiAgICAgICAgdmVya2F1ZnNlYmVuZW46IHNhbGVzTGV2ZWxzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gV29yZFByZXNzIEFDRiBmaWVsZHNcbiAgICBjb25zdCB3cERhdGEgPSAobG9jYXRpb24gYXMgYW55KS53cERhdGFcbiAgICBpZiAod3BEYXRhICYmIHdwRGF0YS5hY2YpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIERFQlVHOiB3cERhdGE6Jywgd3BEYXRhKVxuICAgICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEFDRiBmaWVsZHM6Jywgd3BEYXRhLmFjZilcbiAgICAgIFxuICAgICAgY29uc3QgYWNmID0gd3BEYXRhLmFjZlxuICAgICAgY29uc3QgY2VudGVyRGF0YSA9IHtcbiAgICAgICAgdmVybWlldGJhcmVGbGFlY2hlOiBhY2ZbJ2NlbnRlci1ncnVuZGRhdGVuLXZlcm1pZXRiYXJlLWZsYWVjaGUnXSxcbiAgICAgICAgYW56YWhsU2hvcHM6IGFjZlsnY2VudGVyLWdydW5kZGF0ZW4tYW56YWhsLXNob3BzJ10sXG4gICAgICAgIHZlcmthdWZzZWJlbmVuOiBhY2ZbJ2NlbnRlci1ncnVuZGRhdGVuLXZlcmthdWZzZWJlbmVuJ11cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ/CflI0gREVCVUc6IEV4dHJhY3RlZCBjZW50ZXIgZGF0YTonLCBjZW50ZXJEYXRhKVxuICAgICAgcmV0dXJuIGNlbnRlckRhdGFcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygn4p2MIE5vIHdwRGF0YSBhbmQgbm8gZGF0YWJhc2UgZmllbGRzIGZvdW5kJylcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGNvbnN0IGNlbnRlckRhdGEgPSBnZXRDZW50ZXJEYXRhKCkgYXMge1xuICAgIHZlcm1pZXRiYXJlRmxhZWNoZT86IG51bWJlciB8IHN0cmluZ1xuICAgIGFuemFobFNob3BzPzogbnVtYmVyIHwgc3RyaW5nICBcbiAgICB2ZXJrYXVmc2ViZW5lbj86IG51bWJlciB8IHN0cmluZ1xuICB9XG5cbiAgLy8gdXNlRmlsdGVyZWRDb250YWN0cyByZXR1cm5zIGNvbnRhY3RzIGFycmF5IGRpcmVjdGx5XG4gIGNvbnN0IGxvY2F0aW9uQ29udGFjdHMgPSBjb250YWN0cyB8fCBbXVxuXG4gIC8vIE5hdmlnYXRpb24gaXRlbXMgLSBNb2JpbGUtb3B0aW1pemVkIGxhYmVsc1xuICAvLyBTaG93IE9OTFkgbG9jYXRpb24tc3BlY2lmaWMgY29udGFjdHMgY291bnQgKG5vdCBtYW5hZ2VtZW50KVxuICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSBbXG4gICAge1xuICAgICAgaWQ6ICdoZXJvJyBhcyBWaWV3VHlwZSxcbiAgICAgIGxhYmVsOiAnw5xiZXJzaWNodCcsXG4gICAgICBpY29uOiBIb21lLFxuICAgICAgZGVzY3JpcHRpb246ICdIZXJvLUFuc2ljaHQgbWl0IFN0YXRzJ1xuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdpbmZvJyBhcyBWaWV3VHlwZSxcbiAgICAgIGxhYmVsOiAnSW5mbycsXG4gICAgICBpY29uOiBCdWlsZGluZzIsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FkcmVzc2UgdW5kIERldGFpbHMnXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2NvbnRhY3RzJyBhcyBWaWV3VHlwZSxcbiAgICAgIGxhYmVsOiAnS29udGFrdGUnLFxuICAgICAgaWNvbjogVXNlcnMsXG4gICAgICBjb3VudDogbG9jYXRpb25TcGVjaWZpY0NvdW50LCAvLyBVc2UgbG9jYXRpb24tc3BlY2lmaWMgY291bnQgaW5zdGVhZCBvZiB0b3RhbFxuICAgICAgZGVzY3JpcHRpb246ICdMb2thbGUgS29udGFrdGUnXG4gICAgfVxuICBdXG5cbiAgY29uc3QgY3VycmVudE5hdkl0ZW0gPSBuYXZpZ2F0aW9uSXRlbXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGl2ZVZpZXcpXG5cbiAgcmV0dXJuIChcbiAgICA8TW9kYWxcbiAgICAgIGlzT3Blbj17aXNPcGVufVxuICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgIHRpdGxlPVwiXCJcbiAgICAgIHNpemU9XCJmdWxsXCJcbiAgICAgIGNsYXNzTmFtZT1cInAtMFwiXG4gICAgICBzaG93Q2xvc2VCdXR0b249e2ZhbHNlfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgey8qIEN1c3RvbSBIZWFkZXIgd2l0aCBOYXZpZ2F0aW9uIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIGJnLXdoaXRlIGJvcmRlci1iIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IHJlbGF0aXZlIHotMjBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwLTQgbWluLWgtWzYwcHhdXCI+XG4gICAgICAgICAgICB7LyogQmFjayBCdXR0b24gKG9ubHkgc2hvdyB3aGVuIG5vdCBvbiBoZXJvKSAtIExhcmdlciB0b3VjaCB0YXJnZXQgKi99XG4gICAgICAgICAgICB7YWN0aXZlVmlldyAhPT0gJ2hlcm8nICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVZpZXcoJ2hlcm8nKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LW1lYy1wcmltYXJ5IGhvdmVyOnRleHQtbWVjLXByaW1hcnktZGFyayB0cmFuc2l0aW9uLWNvbG9ycyBwLTIgLW1sLTIgbWluLXctWzQ0cHhdIG1pbi1oLVs0NHB4XVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2hldnJvbkxlZnQgY2xhc3NOYW1lPVwidy02IGgtNiBtci0xXCIgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LWJhc2VcIj5adXLDvGNrPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsvKiBUaXRsZSAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIHRleHQtY2VudGVyIHB4LTJcIj5cbiAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtbGcgbWQ6dGV4dC14bCBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAge2N1cnJlbnROYXZJdGVtPy5sYWJlbH1cbiAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAge2N1cnJlbnROYXZJdGVtPy5jb3VudCAhPT0gdW5kZWZpbmVkICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgKHtjdXJyZW50TmF2SXRlbS5jb3VudH0pXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgI
25114HsvKiBDbG9zZSBCdXR0b24gLSBMYXJnZXIgdG91Y2ggdGFyZ2V0ICovfVxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsb3NlfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwLTIgaG92ZXI6YmctYmFja2dyb3VuZC1zZWNvbmRhcnkgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tY29sb3JzIG1pbi13LVs0NHB4XSBtaW4taC1bNDRweF0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2NobGllw59lblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxYIGNsYXNzTmFtZT1cInctNiBoLTZcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogTmF2aWdhdGlvbiBUYWJzIChvbmx5IHNob3cgb24gaGVybyB2aWV3KSAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgICAge2FjdGl2ZVZpZXcgPT09ICdoZXJvJyAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTMgcGItMyBtZDpweC00IG1kOnBiLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIG1kOmdhcC0zXCI+XG4gICAgICAgICAgICAgICAge25hdmlnYXRpb25JdGVtcy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PXtpdGVtLmlkfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRBY3RpdmVWaWV3KGl0ZW0uaWQpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BcbiAgICAgICAgICAgICAgICAgICAgICBwLTMgbWQ6cC0zIHJvdW5kZWQtbGcgdGV4dC1jZW50ZXIgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXG4gICAgICAgICAgICAgICAgICAgICAgbWluLWgtWzY4cHhdIG1kOm1pbi1oLVthdXRvXVxuICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTpzY2FsZS05NSB0b3VjaC1tYW5pcHVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAke2l0ZW0uaWQgPT09IGFjdGl2ZVZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLW1lYy1wcmltYXJ5IHRleHQtd2hpdGUgc2hhZG93LW1kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctYmFja2dyb3VuZC1zZWNvbmRhcnkgaG92ZXI6YmctYmFja2dyb3VuZC10ZXJ0aWFyeSB0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtdGV4dC1wcmltYXJ5J1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGl0ZW0uaWNvbiBjbGFzc05hbWU9XCJ3LTUgaC01IG1kOnctNSBtZDpoLTUgbXgtYXV0byBtYi0xXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gZm9udC1tZWRpdW0gbGVhZGluZy10aWdodCBweC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAge2l0ZW0uY291bnQgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIG10LTAuNVwiPih7aXRlbS5jb3VudH0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIENvbnRlbnQgQXJlYSAtIEZ1bGwgSGVpZ2h0ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4taC0wIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgIHthY3RpdmVWaWV3ID09PSAnaGVybycgJiYgKFxuICAgICAgICAgICAgPExvY2F0aW9uTW9kYWxIZXJvXG4gICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgY2VudGVyRGF0YT17Y2VudGVyRGF0YX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHthY3RpdmVWaWV3ID09PSAnaW5mbycgJiYgKFxuICAgICAgICAgICAgPExvY2F0aW9uTW9kYWxJbmZvXG4gICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHthY3RpdmVWaWV3ID09PSAnY29udGFjdHMnICYmIChcbiAgICAgICAgICAgIDxMb2NhdGlvbk1vZGFsQ29udGFjdHNcbiAgICAgICAgICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgICAgICAgICBjb250YWN0cz17bG9jYXRpb25Db250YWN0c31cbiAgICAgICAgICAgICAgaXNMb2FkaW5nPXtjb250YWN0c0xvYWRpbmd9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9Nb2RhbD5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFwUGluLCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmludGVyZmFjZSBMb2NhdGlvbk1pbmlDYXJkUHJvcHMge1xuICBsb2NhdGlvbjoge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjaXR5OiBzdHJpbmdcbiAgICBhZGRyZXNzPzogc3RyaW5nXG4gICAgbG9nbz86IHN0cmluZ1xuICAgIGhlcm9JbWFnZT86IHN0cmluZ1xuICB9XG4gIG9uQ2xpY2s6ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBNaW5pIExvY2F0aW9uIENhcmQgZm9yIENvbnRhY3QgTW9kYWxcbiAqIE1vYmlsZS1GaXJzdCBEZXNpZ24gd2l0aCA0NHB4IG1pbmltdW0gdG91Y2ggdGFyZ2V0XG4gKi9cbmV4cG9ydCBjb25zdCBMb2NhdGlvbk1pbmlDYXJkOiBSZWFjdC5GQzxMb2NhdGlvbk1pbmlDYXJkUHJvcHM+ID0gKHsgbG9jYXRpb24sIG9uQ2xpY2sgfSkgPT4ge1xuICBjb25zdCBoYW5kbGVDbGljayA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygn8J+PoiBMb2NhdGlvbk1pbmlDYXJkIC0gY2xpY2tlZDonLCBsb2NhdGlvbi5uYW1lLCBsb2NhdGlvbi5pZClcbiAgICBvbkNsaWNrKClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgcC00IHJvdW5kZWQtbGcgdHJhbnNpdGlvbi1hbGwgaG92ZXI6Ymctd2h
25114pdGUvNzAgYWN0aXZlOmJnLXdoaXRlLzkwIG1pbi1oLVs2MHB4XVwiXG4gICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSknIH19XG4gICAgPlxuICAgICAgey8qIExvY2F0aW9uIEltYWdlL0xvZ28gLSBJbXByb3ZlZCBTaXplIGFuZCBEaXNwbGF5ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LXNocmluay0wIHctMTYgaC0xNiBtZDp3LTIwIG1kOmgtMjAgcm91bmRlZC1sZyBvdmVyZmxvdy1oaWRkZW4gYmctd2hpdGUgc2hhZG93LXNtIGJvcmRlciBib3JkZXItZ3JheS0xMDBcIj5cbiAgICAgICAge2xvY2F0aW9uLmxvZ28gfHwgbG9jYXRpb24uaGVyb0ltYWdlID8gKFxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHNyYz17bG9jYXRpb24ubG9nbyB8fCBsb2NhdGlvbi5oZXJvSW1hZ2V9XG4gICAgICAgICAgICBhbHQ9e2xvY2F0aW9uLm5hbWV9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb250YWluIHAtMlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRTBFNkVCJyB9fT5cbiAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy04IGgtOCBtZDp3LTEwIG1kOmgtMTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIExvY2F0aW9uIEluZm8gLSBCZXR0ZXIgVHlwb2dyYXBoeSAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTAgdGV4dC1sZWZ0XCI+XG4gICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHRleHQtYmFzZSBtZDp0ZXh0LWxnIHRydW5jYXRlIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgIHtsb2NhdGlvbi5uYW1lfVxuICAgICAgICA8L2g0PlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSB0cnVuY2F0ZVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+XG4gICAgICAgICAge2xvY2F0aW9uLmNpdHl9XG4gICAgICAgICAge2xvY2F0aW9uLmFkZHJlc3MgJiYgYCDigKIgJHtsb2NhdGlvbi5hZGRyZXNzfWB9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQXJyb3cgSWNvbiAqL31cbiAgICAgIDxDaGV2cm9uUmlnaHQgY2xhc3NOYW1lPVwiZmxleC1zaHJpbmstMCB3LTUgaC01IG1kOnctNiBtZDpoLTZcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgPC9idXR0b24+XG4gIClcbn1cblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFpbCwgUGhvbmUsIE1hcFBpbiwgVXNlciB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IHVzZUNvbnRhY3RNb2RhbCwgdXNlTG9jYXRpb25Nb2RhbCB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL01vZGFsJ1xuaW1wb3J0IHsgdXNlQ29udGFjdExvY2F0aW9ucyB9IGZyb20gJ0Bob29rcy91c2VDb250YWN0cydcbmltcG9ydCB7IExvY2F0aW9uTWluaUNhcmQgfSBmcm9tICdAY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbk1pbmlDYXJkJ1xuXG5cbmV4cG9ydCBjb25zdCBDb250YWN0TW9kYWw6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGlzT3BlbiwgY29udGFjdCwgY2xvc2UgfSA9IHVzZUNvbnRhY3RNb2RhbCgpXG4gIGNvbnN0IHsgb3Blbjogb3BlbkxvY2F0aW9uTW9kYWwgfSA9IHVzZUxvY2F0aW9uTW9kYWwoKVxuXG4gIC8vIEZldGNoIGFsbCBsb2NhdGlvbnMgZm9yIHRoaXMgY29udGFjdFxuICBjb25zdCB7IGRhdGE6IGNvbnRhY3RMb2NhdGlvbnMsIGlzTG9hZGluZzogbG9jYXRpb25zTG9hZGluZywgZXJyb3I6IGxvY2F0aW9uc0Vycm9yIH0gPSB1c2VDb250YWN0TG9jYXRpb25zKGNvbnRhY3Q/LmlkIHx8IG51bGwpXG5cbiAgLy8gRGVidWcgbG9nZ2luZ1xuICBjb25zb2xlLmxvZygn8J+UjSBDb250YWN0TW9kYWwgLSBjb250YWN0OicsIGNvbnRhY3QpXG4gIGNvbnNvbGUubG9nKCfwn5SNIENvbnRhY3RNb2RhbCAtIGNvbnRhY3RMb2NhdGlvbnM6JywgY29udGFjdExvY2F0aW9ucylcbiAgY29uc29sZS5sb2coJ/CflI0gQ29udGFjdE1vZGFsIC0gbG9jYXRpb25zTG9hZGluZzonLCBsb2NhdGlvbnNMb2FkaW5nKVxuICBjb25zb2xlLmxvZygn8J+UjSBDb250YWN0TW9kYWwgLSBsb2NhdGlvbnNFcnJvcjonLCBsb2NhdGlvbnNFcnJvcilcblxuICBpZiAoIWNvbnRhY3QpIHJldHVybiBudWxsXG5cbiAgY29uc3QgaGFuZGxlRW1haWxDbGljayA9IChlPzogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgbWFpbHRvOiR7Y29udGFjdC5lbWFpbH1gXG4gIH1cblxuICBjb25zdCBoYW5kbGVQaG9uZUNsaWNrID0gKGU/OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoY29udGFjdC5waG9uZSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgdGVsOiR7Y29udGFjdC5waG9uZX1gXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlTG9jYXRpb25DbGljayA9IChsb2NhdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLmxvZygn8J+OryBDb250YWN0TW9kYWwgLSBoYW5kbGVMb2NhdGlvbkNsaWNrIGNhbGxlZCB3aXRoOicsIGxvY2F0aW9uSWQpXG4gICAgY29uc29sZS5sb2coJ/CflIQgQ29udGFjdE1vZGFsIC0gY2xvc2luZyBjb250YWN0IG1vZGFsLi4uJylcbiAgICBjbG9zZSgpIC8vIENsb3NlIGNvbnRhY3QgbW9kYWwgZmlyc3RcbiAgICBjb25zb2xlLmxvZygn8J+agCBDb250YWN0TW9kYWwgLSBvcGVuaW5nIGxvY2F0aW9uIG1vZGFsLi4uJylcbiAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKSAvLyBPcGVuIGxvY2F0aW9uIG1vZGFsXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHNob3cgbXVsdGlwbGUgbG9jYXRpb25zIG9yIHNpbmdsZSBsb2NhdGlvblxuICBjb25zdCBoYXNNdWx0aXBsZUxvY2F0aW9ucyA9IGNvbnRhY3RMb2NhdGlvbnMgJiYgY29udGFjdExvY2F0aW9ucy5sZW5ndGggPiAxXG4gIGNvbnN0IGhhc1NpbmdsZUxvY2F0aW9uID0gY29udGFjdExvY2F0aW9ucyAmJiBjb250YWN0TG9jYXRpb25zLmxlbmd0aCA9PT0gMVxuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsXG4gICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgIG9uQ2xvc2U9e2Nsb3NlfVxuICAgICAgdGl0bGU9XCJcIlxuICAgICAgc2l6ZT1cImxnXCJcbiAgICAgIGNsYXNzTmFtZT1cInAtMFwiXG4gICAgICBzaG93Q2xvc2VCdXR0b249e3RydWV9XG4gICAgPlxuICAgICAgey8qIE1FQyBEZXNpZ24gTGF5b3V0IC0gQ29udGVudCBpcyBub3cgc2Nyb2xsYWJsZSB2aWEgTW9kYWwgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlXCIgc3R5bGU9e3sgZm9udEZhbWlseTogJ0hlbHZldGljYSBOZXVlLCBBcmlhbCwgc2Fucy1zZXJpZicgfX0+XG4gICAgICAgI
25114HsvKiBSZWQgU3RyaXBlIC0gNXB4ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLVs1cHhdXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2QyMDAyOCcgfX0+PC9kaXY+XG5cbiAgICAgICAgey8qIExhcmdlIEltYWdlIC0gUmVzcG9uc2l2ZSBIZWlnaHQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgdy1mdWxsIGgtWzI0cmVtXSBzbTpoLVsyNnJlbV0gbWQ6aC1bMjhyZW1dXCI+XG4gICAgICAgICAge2NvbnRhY3QuaW1hZ2UgPyAoXG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz17Y29udGFjdC5pbWFnZX1cbiAgICAgICAgICAgICAgYWx0PXtjb250YWN0LmZ1bGxOYW1lfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgYmctZ3JheS0yMDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPFVzZXIgY2xhc3NOYW1lPVwidy0xMiBoLTEyIG1kOnctMTYgbWQ6aC0xNiB0ZXh0LWdyYXktNDAwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBDb250YWN0IEluZm9ybWF0aW9uIEJveCAtICNFMEU2RUIgQmFja2dyb3VuZCAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC00IG1kOnAtNiBsZzpwLThcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRTBFNkVCJyB9fT5cbiAgICAgICAgICB7LyogUG9zaXRpb24gLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1iYXNlIG1iLTJcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAge2NvbnRhY3QucG9zaXRpb259XG4gICAgICAgICAgICB7Y29udGFjdC5kZXBhcnRtZW50ICYmIGAg4oCiICR7Y29udGFjdC5kZXBhcnRtZW50fWB9XG4gICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgey8qIE5hbWUgLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBsZzp0ZXh0LTR4bCBmb250LXNlbWlib2xkIG1iLTQgbWQ6bWItNlwiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX0+XG4gICAgICAgICAgICB7Y29udGFjdC5mdWxsTmFtZX1cbiAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgey8qIFp1Z2V3aWVzZW5lIEhhbmRlbHNpbW1vYmlsaWUobikgLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIHtsb2NhdGlvbnNMb2FkaW5nID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IHAtNCBtZDpwLTUgcm91bmRlZC1sZ1wiIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC41KScgfX0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhbmltYXRlLXNwaW4gcm91bmRlZC1mdWxsIGgtNSB3LTUgYm9yZGVyLWItMlwiIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAnI2QyMDAyOCcgfX0+PC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+TGFkZSBTdGFuZG9ydGUuLi48L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IGxvY2F0aW9uc0Vycm9yID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IHAtNCBtZDpwLTUgcm91bmRlZC1sZ1wiIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAwLCAwLCAwLjEpJyB9fT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbVwiIHN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX0+XG4gICAgICAgICAgICAgICAgRmVobGVyIGJlaW0gTGFkZW4gZGVyIFN0YW5kb3J0ZVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogaGFzTXVsdGlwbGVMb2NhdGlvbnMgPyAoXG4gICAgICAgICAgICAvKiBNdWx0aXBsZSBMb2NhdGlvbnMgLSBTaG93IGFzIE1pbmkgQ2FyZHMgKi9cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPE1hcFBpbiBjbGFzc05hbWU9XCJ3LTUgaC01IG1kOnctNiBtZDpoLTZcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC1iYXNlIG1kOnRleHQtbGdcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICAgICAgWnVnZXdpZXNlbmUgU3RhbmRvcnRlICh7Y29udGFjdExvY2F0aW9ucy5sZW5ndGh9KVxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtjb250YWN0TG9jYXRpb25zLm1hcCgobG9jYXRpb24pID0+IChcbiAgICAgICAgICAgICAgICAgIDxMb2NhdGlvbk1pbmlDYXJkXG4gICAgICAgICAgICAgICAgICAgIGtleT17bG9jYXRpb24uaWR9XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTG9jYXRpb25DbGljayhsb2NhdGlvbi5pZCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBoYXNTaW5nbGVMb2NhdGlvbiA/IChcbiAgICAgICAgICAgIC8qIFNpbmdsZSBMb2NhdGlvbiAtIFNob3cgYXMgYmVmb3JlICovXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTYgcC00IG1kOnAtNSByb3VuZGVkLWxnXCIgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJyB9fT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IHNwYWNlLXgtM1wiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy01IGgtNSBtZDp3LTYgbWQ6aC02IGZsZXgtc2hyaW5rLTAgbXQtMVwiIHN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX0gLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gbWItMS41IG1kOm1iLTJcIiBzdHlsZT17eyBjb2xvcjogJyM2YjcyODAnIH19PlxuICAgICAgICAgICAgICAgICAgICBadWdld2llc2VuZXIgU3RhbmRvcnRcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIG1iLTEgdGV4dC1iYXNlIG1kOnRleHQtbGdcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICAgICAgICB7Y29udGFjdExvY2F0aW9uc1swXS5uYW1lfVxuICAgICAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1iYXNlIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PlxuICAgICAgICAgICAgICAgICAgICB7Y29udGFjdExvY2F0aW9uc1swXS5jaXR5fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAge2NvbnRhY3RMb2NhdGlvbnNbMF0uYWRkcmVzcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgbWQ6dGV4dC1zbVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+XG4gICAgICAgICAgICAgICAgICAgICAge2NvbnRhY3RMb2NhdGlvbnNbMF0uYWRkcmVzc31cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTG9jYXRpb25DbGljayhjb250YWN0TG9jYXRpb25zWzBdLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMyBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBtZDp0ZXh0LWJhc2UgZm9udC1tZWRpdW0gaG92ZXI6dW5kZXJsaW5lIGFjdGl2ZTpvcGFjaXR5LTcwIG1pbi1oLVs0NHB4XSBtZDptaW4taC0wIHB5LTIgbWQ6cHktMFwiXG4gICAgICAgICAgICAgICAgICAgI
25114HN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RhbmRvcnQgYW56ZWlnZW48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgICAgey8qIEZhY2hiZXJlaWNoZSAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMgJiYgY29udGFjdC5zcGVjaWFsdGllcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNSBtZDptYi02XCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSBmb250LW1lZGl1bSBtYi0zXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5GYWNoYmVyZWljaGU8L2g0PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAge2NvbnRhY3Quc3BlY2lhbHRpZXMubWFwKChzcGVjaWFsdHksIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0zIHB5LTIgdGV4dC1zbSBtZDp0ZXh0LWJhc2UgZm9udC1tZWRpdW0gcm91bmRlZC1sZ1wiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNkMjAwMjgnLCBjb2xvcjogJ3doaXRlJyB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7c3BlY2lhbHR5fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7LyogU3ByYWNoZW4gLSBNb2JpbGUgT3B0aW1pemVkICovfVxuICAgICAgICAgIHtjb250YWN0Lmxhbmd1YWdlcyAmJiBjb250YWN0Lmxhbmd1YWdlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNSBtZDptYi02XCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSBmb250LW1lZGl1bSBtYi0zXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5TcHJhY2hlbjwvaDQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICB7Y29udGFjdC5sYW5ndWFnZXMubWFwKChsYW5ndWFnZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LXNtIG1kOnRleHQtYmFzZSByb3VuZGVkLWxnXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2EzYjJjMicsIGNvbG9yOiAnd2hpdGUnIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtsYW5ndWFnZX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgey8qIEJpbyBTZWN0aW9uIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICB7Y29udGFjdC5iaW8gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi01IG1kOm1iLTZcIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1iYXNlIGZvbnQtbWVkaXVtIG1iLTNcIiBzdHlsZT17eyBjb2xvcjogJyMyODMyM2MnIH19PsOcYmVyIG1pY2g8L2g0PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbSBtZDp0ZXh0LWJhc2UgbGVhZGluZy1yZWxheGVkIHByb3NlIHByb3NlLXNtIG1heC13LW5vbmVcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX1cbiAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGNvbnRhY3QuYmlvIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgey8qIEtvbnRha3RpbmZvcm1hdGlvbmVuIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMiBtZDpzcGFjZS15LTNcIj5cbiAgICAgICAgICAgIHsvKiBUZWxlZm9uIC0gTGFyZ2VyIHRvdWNoIHRhcmdldCAqL31cbiAgICAgICAgICAgIHtjb250YWN0LnBob25lICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVBob25lQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC00IG1kOnAtNCByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzcwIGFjdGl2ZTpiZy13aGl0ZS84MCB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjRweF0gbWQ6bWluLWgtWzYwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy02IGgtNiBtZDp3LTUgbWQ6aC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXhzIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyM2YjcyODAnIH19PlRlbGVmb248L3A+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LWJhc2UgbWQ6dGV4dC1iYXNlXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT57Y29udGFjdC5waG9uZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIE1vYmlsIC0gTGFyZ2VyIHRvdWNoIHRhcmdldCAqL31cbiAgICAgICAgICAgI
25114Htjb250YWN0Lm1vYmlsZSAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgdGVsOiR7Y29udGFjdC5tb2JpbGV9YFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC00IG1kOnAtNCByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzcwIGFjdGl2ZTpiZy13aGl0ZS84MCB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjRweF0gbWQ6bWluLWgtWzYwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy02IGgtNiBtZDp3LTUgbWQ6aC01IGZsZXgtc2hyaW5rLTBcIiBzdHlsZT17eyBjb2xvcjogJyNkMjAwMjgnIH19IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXhzIG1iLTFcIiBzdHlsZT17eyBjb2xvcjogJyM2YjcyODAnIH19Pk1vYmlsPC9wPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC1iYXNlIG1kOnRleHQtYmFzZVwiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX0+e2NvbnRhY3QubW9iaWxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogRS1NYWlsIC0gTGFyZ2VyIHRvdWNoIHRhcmdldCAqL31cbiAgICAgICAgICAgIHtjb250YWN0LmVtYWlsICYmIChcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUVtYWlsQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0zIHctZnVsbCB0ZXh0LWxlZnQgcC00IG1kOnAtNCByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzcwIGFjdGl2ZTpiZy13aGl0ZS84MCB0cmFuc2l0aW9uLWNvbG9ycyBtaW4taC1bNjRweF0gbWQ6bWluLWgtWzYwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8TWFpbCBjbGFzc05hbWU9XCJ3LTYgaC02IG1kOnctNSBtZDpoLTUgZmxleC1zaHJpbmstMFwiIHN0eWxlPXt7IGNvbG9yOiAnI2QyMDAyOCcgfX0gLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQteHMgbWItMVwiIHN0eWxlPXt7IGNvbG9yOiAnIzZiNzI4MCcgfX0+RS1NYWlsPC9wPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC1iYXNlIG1kOnRleHQtYmFzZSB0cnVuY2F0ZSBibG9ja1wiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycgfX0+e2NvbnRhY3QuZW1haWx9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG5cblxuXG4gICAgICAgIHsvKiBTb2NpYWwgTGlua3MgQmFyIC0gI0VGRjNGNSBCYWNrZ3JvdW5kIC0gTW9iaWxlIE9wdGltaXplZCAqL31cbiAgICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MgJiYgY29udGFjdC5zb2NpYWxMaW5rcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTQgcHktNSBtZDpweC04IG1kOnB5LTZcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6ICcjRUZGM0Y1JyB9fT5cbiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtYmFzZSBmb250LW1lZGl1bSBtYi00XCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJyB9fT5Tb2NpYWwgTWVkaWE8L2g0PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTQgbWQ6Z2FwLTZcIj5cbiAgICAgICAgICAgICAge2NvbnRhY3Quc29jaWFsTGlua3MubWFwKChsaW5rLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzWGluZyA9IGxpbmsucGxhdGZvcm0/LnRvTG93ZXJDYXNlKCkgPT09ICd4aW5nJyB8fCBsaW5rLnVybD8uaW5jbHVkZXMoJ3hpbmcuY29tJylcbiAgICAgICAgICAgICAgICBjb25zdCBpc0xpbmtlZEluID0gbGluay5wbGF0Zm9ybT8udG9Mb3dlckNhc2UoKSA9PT0gJ2xpbmtlZGluJyB8fCBsaW5rLnVybD8uaW5jbHVkZXMoJ2xpbmtlZGluLmNvbScpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgaHJlZj17bGluay51cmx9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIGhvdmVyOm9wYWNpdHktNzAgYWN0aXZlOm9wYWNpdHktNTAgdHJhbnNpdGlvbi1vcGFjaXR5IG1pbi1oLVs0NHB4XSBweS0yXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICcjYTNiMmMyJyB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7aXNYaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTcgaC03IG1kOnctNiBtZDpoLTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAzODQgNTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYyLjcgMjEwYy0xLjggMy4zLTI1LjIgNDQuNC03MC4xIDEyMy41LTQuOSA4LjMtMTAuOCAxMi41LTE3LjcgMTIuNUg5LjhjLTcuNyAwLTEyLjEtNy41LTguNS0xNC40bDY5LTEyMS4zYy4yIDAgLjItLjEgMC0uM2wtNDMuOS03NS42Yy00LjMtNy44LjMtMTQuMSA4LjUtMTQuMUgxMDBjNy4zIDAgMTMuMyA0LjEgMTggMTIuMmw0NC43IDc3LjV6TTM4Mi42IDQ2LjFsLTE0NCAyNTN2LjNMMzMwLjIgNDY2YzMuOSA3LjEuMiAxNC4xLTguNSAxNC4xaC02NS4yYy03LjYgMC0xMy42LTQtMTgtMTIuMmwtOTIuNC0xNjguNWMzLjMtNS44IDUxLjUtOTAuOCAxNDQuOC0yNTUuMiA0LjYtOC4xIDEwLjQtMTIuMiAxNy41LTEyLjJoNjUuN2M4IDAgMTIuMyA2LjcgOC41IDE0LjF6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtc20gZm9udC1tZWRpdW1cIj5YaW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICB7aXNMaW5rZWRJbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy03IGgtNyBtZDp3LTYgbWQ6aC02XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMC4yOCA0NDhINy40VjE0OC45aDkyLjg4ek01My43OSAxMDguMUMyNC4wOSAxMDguMSAwIDgzLjUgMCA1My44YTUzLjc5IDUzLjc5IDAgMCAxIDEwNy41OCAwYzAgMjkuNy0yNC4xIDU0LjMtNTMuNzkgNTQuM3pNNDQ3LjkgNDQ4aC05Mi42OFYzMDIuNGMwLTM0LjctLjctNzkuMi00OC4yOS03OS4yLTQ4LjI5IDAtNTUuNjkgMzcuNy01NS42OSA3Ni43VjQ0OGgtOTIuNzhWMTQ4LjloODkuMDh2NDAuOGgxLjNjMTIuNC0yMy41IDQyLjY5LTQ4LjMgODcuODgtNDguMyA5NCAwIDExMS4yOCA2MS45IDExMS4yOCAxNDIuM1Y0NDh6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtc20gZm9udC1tZWRpdW1cIj5MaW5rZWRJbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgI
25114H0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgey8qIFByb21pbmVudCBBY3Rpb24gQnV0dG9ucyAtIE1vYmlsZSBPcHRpbWl6ZWQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNCBweS01IG1kOnB4LTggbWQ6cHktNiBiZy13aGl0ZSBib3JkZXItdFwiIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAnI0UwRTZFQicgfX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIGdhcC0zIG1kOmdhcC00XCI+XG4gICAgICAgICAgICB7LyogRS1NYWlsIEJ1dHRvbiAtIExhcmdlciB0b3VjaCB0YXJnZXQgKi99XG4gICAgICAgICAgICB7Y29udGFjdC5lbWFpbCAmJiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVFbWFpbENsaWNrfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHNwYWNlLXgtMyBweC02IHB5LTQgbWQ6cHktNCByb3VuZGVkLWxnIGZvbnQtc2VtaWJvbGQgdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWFsbCBob3ZlcjpvcGFjaXR5LTkwIGFjdGl2ZTpvcGFjaXR5LTgwIHNoYWRvdy1tZCBtaW4taC1bNTZweF0gdGV4dC1iYXNlIG1kOnRleHQtYmFzZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnI2QyMDAyOCcgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNSBoLTUgbWQ6dy01IG1kOmgtNVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+RS1NYWlsIHNlbmRlbjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogQW5ydWZlbiBCdXR0b24gLSBMYXJnZXIgdG91Y2ggdGFyZ2V0ICovfVxuICAgICAgICAgICAge2NvbnRhY3QucGhvbmUgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlUGhvbmVDbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTMgcHgtNiBweS00IG1kOnB5LTQgcm91bmRlZC1sZyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tYWxsIGhvdmVyOmJnLWdyYXktMTAwIGFjdGl2ZTpiZy1ncmF5LTIwMCBzaGFkb3ctbWQgbWluLWgtWzU2cHhdIHRleHQtYmFzZSBtZDp0ZXh0LWJhc2VcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyNFMEU2RUInLCBjb2xvcjogJyMyODMyM2MnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8UGhvbmUgY2xhc3NOYW1lPVwidy01IGgtNSBtZDp3LTUgbWQ6aC01XCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5BbnJ1ZmVuPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9Nb2RhbD5cbiAgKVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnJTIweG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUyMHdpZHRoPScxODAnJTIwaGVpZ2h0PSc2NS4wMzMnJTIwdmlld0JveD0nMCUyMDAlMjAxODAlMjA2NS4wMzMnJTNlJTNjZyUyMGlkPSdNRUNfTG9nbyclMjBkYXRhLW5hbWU9J01FQyUyMExvZ28nJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMCUyMDApJyUzZSUzY2clMjBpZD0nTUVDX0xvZ28tMiclMjBkYXRhLW5hbWU9J01FQyUyMExvZ28nJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMCUyMDApJyUzZSUzY3BhdGglMjBpZD0nRmlsbF8xJyUyMGRhdGEtbmFtZT0nRmlsbCUyMDEnJTIwZD0nTTAsNC45OTQsOC41NDIsOS45NTZWMFonJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMjQuODk1KSclMjBmaWxsPSclMjNiMzAwMjInJTNlJTNjL3BhdGglM2UlM2NwYXRoJTIwaWQ9J0ZpbGxfMiclMjBkYXRhLW5hbWU9J0ZpbGwlMjAyJyUyMGQ9J00wLDBWOS45NTZsOC4wMjMsNC42NjFWNDEuOGw5Ljg4OCw1Ljc0NFYxMC40MDZaJyUyMHRyYW5zZm9ybT0ndHJhbnNsYXRlKDMzLjQzOCknJTIwZmlsbD0nJTIzZDIwMDI4JyUzZSUzYy9wYXRoJTNlJTNjcGF0aCUyMGlkPSdGaWxsXzMnJTIwZGF0YS1uYW1lPSdGaWxsJTIwMyclMjBkPSdNMCw1LjU5Mmw5LjU3Myw1LjU1OVYwWiclMjB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgxMC42NjUlMjA3LjcxOSknJTIwZmlsbD0nJTIzYjMwMDIyJyUzZSUzYy9wYXRoJTNlJTNjcGF0aCUyMGlkPSdGaWxsXzQnJTIwZGF0YS1uYW1lPSdGaWxsJTIwNCclMjBkPSdNMTYuNTcsOS42MjIsMCwwVjExLjE1Mkw4LjY1LDE2LjE3NFY0Mi4xNjFsNy45MTgsNC42WiclMjB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgyMC4yMzYlMjA3LjcxOCknJTIwZmlsbD0nJTIzZDIwMDI4JyUzZSUzYy9wYXRoJTNlJTNjcGF0aCUyMGlkPSdGaWxsXzUnJTIwZGF0YS1uYW1lPSdGaWxsJTIwNSclMjBkPSdNMCwzNy4xMzUsMjMuOTU0LDUxLjA0VjEzLjkxMUwwLDBaJyUyMHRyYW5zZm9ybT0ndHJhbnNsYXRlKDAlMjAxMi44NzIpJyUyMGZpbGw9JyUyM2QyMDAyOCclM2UlM2MvcGF0aCUzZSUzY3BhdGglMjBpZD0nRmlsbF82JyUyMGRhdGEtbmFtZT0nRmlsbCUyMDYnJTIwZD0nTTExLjQ0LDBsOC42NDEsMjUuNTYzaC4xMDZMMjguMzYzLDBIMzkuOFYzNy4xNzRIMzIuMTkzVjEwLjgzaC0uMUwyMy4wMzMsMzcuMTc0SDE2Ljc3TDcuNzEyLDExLjA5aC0uMVYzNy4xNzRIMFYwWiclMjB0cmFuc2Zvcm09J3RyYW5zbGF0ZSg2NS44NTclMjAxMC4zNTkpJyUyMGZpbGw9JyUyMzI4MzIzYyclM2UlM2MvcGF0aCUzZSUzY3BhdGglMjBpZD0nRmlsbF83JyUyMGRhdGEtbmFtZT0nRmlsbCUyMDcnJTIwZD0nTTI3LjYzOSwwVjYuODcxSDguMTI3djcuOTY2SDI2LjAzNFYyMS4xOUg4LjEyN1YzMC4zSDI4LjA1MnY2Ljg3NEgwVjBaJyUyMHRyYW5zZm9ybT0ndHJhbnNsYXRlKDExMi44MDIlMjAxMC4zNTkpJyUyMGZpbGw9JyUyMzI4MzIzYyclM2UlM2MvcGF0aCUzZSUzY3BhdGglMjBpZD0nRmlsbF84JyUyMGRhdGEtbmFtZT0nRmlsbCUyMDgnJTIwZD0nTTI1LjMwOSwxMC44QTguMjYxLDguMjYxLDAsMCwwLDIzLjUsOC43NDZhOC40NDMsOC40NDMsMCwwLDAtNS4zMzEtMS44NzMsOS40NCw5LjQ0LDAsMCwwLTQuNjU4LDEuMDY2QTguODQ2LDguODQ2LDAsMCwwLDEwLjQsMTAuOGExMi41NzgsMTIuNTc4LDAsMCwwLTEuNzMzLDQuMDg3LDIwLjUzMywyMC41MzMsMCwwLDAtLjU0Miw0LjczOCwxOS4wNzksMTkuMDc5LDAsMCwwLC41NDIsNC41NTZBMTIuMzA2LDEyLjMwNiwwLDAsMCwxMC40LDI4LjE2NSw4LjkwNyw4LjkwNywwLDAsMCwxMy41MDcsMzFhOS40MTUsOS40MTUsMCwwLDAsNC42NTgsMS4wNjgsNy40OTIsNy40OTIsMCwwLDAsNS44Mi0yLjI5MSwxMC42MDYsMTAuNjA2LDAsMCwwLDIuNTYzLTYuMDM5aDcuODdhMTkuMTUxLDE5LjE1MSwwLDAsMS0xLjYsNi4zQTE1LjEyOSwxNS4xMjksMCwwLDEsMjkuNCwzNC44MjlhMTQuNDc4LDE0LjQ3OCwwLDAsMS00Ljk2OCwzLjAyMSwxOC4xLDE4LjEsMCwwLDEtNi4yNjMsMS4wNDEsMTguODc1LDE4Ljg3NSwwLDAsMS03LjYzNS0xLjQ4MiwxNi4zNzQsMTYuMzc0LDAsMCwxLTUuNzE3LTQuMDg4QTE4LjEsMTguMSwwLDAsMSwxLjI0LDI3LjIsMjIuNiwyMi42LDAsMCwxLDAsMTkuNjI3LDIzLjM5MSwyMy4zOTEsMCwwLDEsMS4yNCwxMS45LDE4LjU4OSwxOC41ODksMCwwLDEsNC44MTIsNS42NzQsMTYuMzQzLDE2LjM0MywwLDAsMSwxMC41MjksMS41MSwxOC41OTIsMTguNTkyLDAsMCwxLDE4LjE2NSwwYTE4LjU1LDE4LjU1LDAsMCwxLDUuNzcyLjg4NEExNS42MDgsMTUuNjA4LDAsMCwxLDI4LjgsMy40NjJhMTMuOTEzLDEzLjkxMywwLDAsMSwzLjU0Nyw0LjE5MSwxNS4xLDE1LjEsMCwwLDEsMS43NTksNS43MjZIMjYuMjM5YTYuNzYsNi43NiwwLDAsMC0uOTMtMi41NzcnJTIwdHJhbnNmb3JtPSd0cmFuc2xhdGUoMTQ0LjczOSUyMDkuNDc1KSclMjBmaWxsPSclMjMyODMyM2MnJTNlJTNjL3BhdGglM2UlM2MvZyUzZSUzYy9nJTNlJTNjL3N2ZyUzZVwiIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFwUGluIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IE1FQ0xvZ28gZnJvbSAnLi4vLi4vYXNzZXRzL01FQy1Mb2dvLnN2ZydcblxuaW50ZXJmYWNlIEhlYWRlclByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBIZWFkZXI6IFJlYWN0LkZDPEhlYWRlclByb3BzPiA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IGhhbmRsZUxvZ29DbGljayA9ICgpID0+IHtcbiAgICAvLyBTY3JvbGwgdG8gdG9wIGFuZCByZXNldCB2aWV3XG4gICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHdlJ3JlIGluIGVtYmVkIG1vZGVcbiAgY29uc3QgaXNFbWJlZE1vZGUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnZW1iZWQnKSA9PT0gJ3RydWUnXG5cbiAgcmV0dXJuIChcbiAgICA8aGVhZGVyIGNsYXNzTmFtZT17YGJnLXdoaXRlIGJvcmRlci1iIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5ICR7Y2xhc3NOYW1lIHx8ICcnfWB9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2lzRW1iZWRNb2RlID8gJ3B4LTMgc206cHgtNCBweS0zIHNtOnB5LTQnIDogJ2Nvbn
25114RhaW5lciBteC1hdXRvIHB4LTMgc206cHgtNCBweS0zIHNtOnB5LTQnfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICB7LyogTUVDIExvZ28gJiBUaXRsZSAtIE1vYmlsZSBPcHRpbWl6ZWQgLSBDbGlja2FibGUgKi99XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTG9nb0NsaWNrfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHNtOnNwYWNlLXgtNCBtaW4tdy0wIGZsZXgtMSBob3ZlcjpvcGFjaXR5LTgwIHRyYW5zaXRpb24tb3BhY2l0eSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9e01FQ0xvZ299XG4gICAgICAgICAgICAgIGFsdD1cIk1FQyBMb2dvXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0xMCBzbTpoLTEyIHctYXV0byBvYmplY3QtY29udGFpbiBmbGV4LXNocmluay0wXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgZm9udEZhbWlseTogJ0hlbHZldGljYSBOZXVlLCBBcmlhbCwgc2Fucy1zZXJpZicgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LWJhc2Ugc206dGV4dC14bCBmb250LXNlbWlib2xkIHRydW5jYXRlXCIgc3R5bGU9e3sgY29sb3I6ICcjMjgzMjNjJywgZm9udEZhbWlseTogJ0hlbHZldGljYSBOZXVlLCBBcmlhbCwgc2Fucy1zZXJpZicgfX0+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHNtOmlubGluZVwiPlBvcnRmb2xpbyBMZWFzaW5nIE1hbmFnZW1lbnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic206aGlkZGVuXCI+UG9ydGZvbGlvIExlYXNpbmc8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbSB0cnVuY2F0ZVwiIHN0eWxlPXt7IGNvbG9yOiAnIzI4MzIzYycsIGZvbnRGYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZSwgQXJpYWwsIHNhbnMtc2VyaWYnIH19PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBzbTppbmxpbmVcIj5GaW5kZW4gU2llIElocmVuIEFuc3ByZWNocGFydG5lcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzbTpoaWRkZW5cIj5BbnNwcmVjaHBhcnRuZXI8L3NwYW4+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRXh0ZXJuYWxMaW5rLCBNYWlsLCBQaG9uZSwgTWFwUGluIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5leHBvcnQgY29uc3QgRm9vdGVyOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcblxuICByZXR1cm4gKFxuICAgIDxmb290ZXIgY2xhc3NOYW1lPVwiYmctc2xhdGUtODAwIHRleHQtd2hpdGUgbXQtOFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBweC00IHB5LTQgbWQ6cHktNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLTQgbWQ6Z2FwLTZcIj5cbiAgICAgICAgICB7LyogQ29tcGFueSBJbmZvICYgQWRkcmVzcyAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgbWQ6dGV4dC14bCBmb250LWJvbGQgbWItMiBtZDptYi0zXCI+TUVDIE1FVFJPLUVDRSBDZW50ZXJtYW5hZ2VtZW50PC9oMz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS0zMDAgdGV4dC1zbSBzcGFjZS15LTFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtdC0wLjUgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+RnJpdHotVm9tZmVsZGUtU3RyYcOfZSAxODwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj40MDU0NyBEw7xzc2VsZG9yZjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFF1aWNrIExpbmtzICovfVxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwidGV4dC1iYXNlIG1kOnRleHQtbGcgZm9udC1zZW1pYm9sZCBtYi0yIG1kOm1iLTNcIj5RdWljayBMaW5rczwvaDQ+XG4gICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9tZWMtY20uY29tXCJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtMzAwIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBNRUMgV2Vic2l0ZVxuICAgICAgICAgICAgICAgICAgPEV4dGVybmFsTGluayBjbGFzc05hbWU9XCJ3LTMgaC0zIG1sLTFcIiAvPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9tZWMtY20uY29tL2hhbmRlbHNpbW1vYmlsaWVuLW92ZXJ2aWV3L1wiXG4gICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXNsYXRlLTMwMCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgSGFuZGVsc2ltbW9iaWxpZW5cbiAgICAgICAgICAgICAgICAgIDxFeHRlcm5hbExpbmsgY2xhc3NOYW1lPVwidy0zIGgtMyBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vbWVjLWNtLmNvbS91bnRlcm5laG1lbi9tYW5hZ2VtZW50LXRlYW0vXCJcbiAgICAgICAgICAgICAgICAgI
25114HRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtMzAwIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBNYW5hZ2VtZW50LVRlYW1cbiAgICAgICAgICAgICAgICAgIDxFeHRlcm5hbExpbmsgY2xhc3NOYW1lPVwidy0zIGgtMyBtbC0xXCIgLz5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIENvbnRhY3QgSW5mbyAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cInRleHQtYmFzZSBtZDp0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgbWItMiBtZDptYi0zXCI+S29udGFrdDwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMSB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yIHRleHQtc2xhdGUtMzAwXCI+XG4gICAgICAgICAgICAgICAgPFBob25lIGNsYXNzTmFtZT1cInctNCBoLTQgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCJ0ZWw6KzQ5MjExMzAxNTMtMFwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICArNDkgKDApMjExIDMwMTUzLTBcbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiB0ZXh0LXNsYXRlLTMwMFwiPlxuICAgICAgICAgICAgICAgIDxNYWlsIGNsYXNzTmFtZT1cInctNCBoLTQgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCJtYWlsdG86aW5mb0BtZWMtY20uY29tXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIGluZm9AbWVjLWNtLmNvbVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEJvdHRvbSBCYXIgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLXQgYm9yZGVyLXNsYXRlLTcwMCBtdC00IG1kOm10LTYgcHQtMyBtZDpwdC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgdGV4dC14cyBtZDp0ZXh0LXNtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwXCI+XG4gICAgICAgICAgICAgIMKpIHtjdXJyZW50WWVhcn0gTUVDIE1FVFJPLUVDRSBDZW50ZXJtYW5hZ2VtZW50LiBBbGxlIFJlY2h0ZSB2b3JiZWhhbHRlbi5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtNCBtZDpzcGFjZS14LTYgbXQtMiBtZDptdC0wXCI+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vbWVjLWNtLmNvbS9kYXRlbnNjaHV0emVya2xhZXJ1bmdcIlxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS00MDAgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEYXRlbnNjaHV0emVya2zDpHJ1bmdcbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL21lYy1jbS5jb20vaW1wcmVzc3VtXCJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgSW1wcmVzc3VtXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9vdGVyPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvb3RlclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5cbmludGVyZmFjZSBDb250YWluZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnZnVsbCdcbiAgcGFkZGluZz86ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFNlY3Rpb25Qcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbiAgc3BhY2luZz86ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBGbGV4UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIGRpcmVjdGlvbj86ICdyb3cnIHwgJ2NvbCdcbiAgYWxpZ24/OiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdzdHJldGNoJ1xuICBqdXN0aWZ5PzogJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCAnYmV0d2VlbicgfCAnYXJvdW5kJyB8ICdldmVubHknXG4gIHdyYXA/OiBib29sZWFuXG4gIGdhcD86ICdub25lJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBHcmlkUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIGNvbHM/OiAxIHwgMiB8IDMgfCA0IHwgNSB8IDZcbiAgZ2FwPzogJ25vbmUnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJ1xuICByZXNwb25zaXZlPzogYm9vbGVhblxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxuLy8gUmV1c2FibGUgQ29udGFpbmVyIENvbXBvbmVudFxuZXhwb3J0IGNvbnN0IENvbnRhaW5lcjogUmVhY3QuRkM8Q29udGFpbmVyUHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIHNpemUgPSAnbGcnLFxuICBwYWRkaW5nID0gJ21kJyxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGNvbnN0IHNpemVDbGFzc2VzID0ge1xuICAgIHNtOiAnbWF4LXctc20nLFxuICAgIG1kOiAnbWF4LXctMnhsJyxcbiAgICBsZzogJ21heC13LTR4bCcsXG4gICAgeGw6ICdtYXgtdy02eGwnLFxuICAgIGZ1bGw6ICdtYXgtdy1mdWxsJ1xuICB9XG5cbiAgY29uc3QgcGFkZGluZ0NsYXNzZXMgPSB7XG4gICAgbm9uZTogJycsXG4gICAgc206ICdweC0yJyxcbiAgICBtZDogJ3B4LTQnLFxuICAgIGxnOiAncHgtNidcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAnbXgtYXV0bycsXG4gICAgICBzaXplQ2xhc3Nlc1tzaXplXSxcbiAgICAgIHBhZGRpbmdDbGFzc2VzW3BhZGRpbmddLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gU2VjdGlvbiB3aXRoIGNvbnNpc3RlbnQgc3BhY2luZ1xuZXhwb3J0IGNvbnN0IFNlY3Rpb246IFJlYWN0LkZDPFNlY3Rpb25Qcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgc3BhY2luZyA9ICdtZCcsXG4gIGNsYXNzTmFtZVxufSkgPT4ge1xuICBjb25zdCBzcGFjaW5nQ2xhc3NlcyA9IHtcbiAgICBub25lOiAnJyxcbiAgICBzbTogJ3NwYWNlLXktMicsXG4gICAgbWQ6ICdzcGFjZS15LTQnLFxuICAgIGxnOiAnc3BhY2UteS02JyxcbiAgICB4bDogJ3NwYWNlLXktOCdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goc3BhY2luZ0NsYXNzZXNbc3BhY2luZ10sIGNsYXNzTmFtZSl9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbi8vIEZsZXhpYmxlIEZsZXggQ29udGFpbmVyXG5leHBvcnQgY29uc3QgRmxleDogUmVhY3QuRkM8RmxleFByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICBkaXJlY3Rpb24gPSAncm93JyxcbiAgYWxpZ24gPSAnc3RhcnQnLFxuICBqdXN0aWZ5ID0gJ3N0YXJ0JyxcbiAgd3JhcCA9IGZhbHNlLFxuICBnYXAgPSAnbWQnLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgY29uc3QgZGlyZWN0aW9uQ2xhc3NlcyA9IHtcbiAgICByb3c6ICdmbGV4LXJvdycsXG4gICAgY29sOiAnZmxleC1jb2wnXG4gIH1cblxuICBjb25zdCBhbGlnbkNsYXNzZXMgPSB7XG4gICAgc3RhcnQ6ICdpdGVtcy1zdGFydCcsXG4gICAgY2VudGVyOiAnaXRlbXMtY2VudGVyJyxcbiAgICBlbmQ6ICdpdGVtcy1lbmQnLFxuICAgIHN0cmV0Y2g6ICdpdGVtcy1zdHJldGNoJ1xuICB9XG5cbiAgY29uc3QganVzdGlmeUNsYXNzZXMgPSB7XG4gICAgc3RhcnQ6ICdqdXN0aWZ5LXN0YXJ0JyxcbiAgICBjZW50ZXI6ICdqdXN0aWZ5LWNlbnRlcicsXG4gICAgZW5kOiAnanVzdGlmeS1lbmQnLFxuICAgIGJldHdlZW46ICdqdXN0aWZ5LWJldHdlZW4nLFxuICAgIGFyb3VuZDogJ2p1c3RpZnktYXJvdW5kJyxcbiAgICBldmVubHk6ICdqdXN0aWZ5LWV2ZW5seSdcbiAgfVxuXG4gIGNvbnN0IGdhcENsYXNzZXMgPSB7XG4gICAgbm9uZTogJycsXG4gICAgc206ICdnYXAtMicsXG4gICAgbWQ6ICdnYXAtNCcsXG4gICAgbGc6ICdnYXAtNicsXG4gICAgeGw6ICdnYXAtOCdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAnZmxleCcsXG4gICAgICBkaXJlY3Rpb25DbGFzc2VzW2RpcmVjdGlvbl0sXG4gICAgICBhbGlnbkNsYXNzZXNbYWxpZ25dLFxuICAgICAganVzdGlmeUNsYXNzZXNbanVzdGlmeV0sXG4gICAgICB3cmFwICYmICdmbGV4LXdyYXAnLFxuICAgICAgZ2FwQ2xhc3Nlc1tnYXBdLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gUmVzcG9uc2l2ZSBHcmlkIENvbnRhaW5lclxuZXhwb3J0IGNvbnN0IEdyaWQ6IFJlYWN0LkZDPEdyaWRQcm9wcz4gPSAoe1xuICBjaGlsZHJlbixcbiAgY29scyA9IDEsXG4gIGdhcCA9ICdtZCcsXG4gIHJlc3BvbnNpdmUgPSB0cnVlLFxuICBjbGFzc05hbWVcbn0pID0+IHtcbiAgY29uc3QgZ2FwQ2xhc3NlcyA9IHtcbiAgICBub25lOiAnJyxcbiAgICBzbTogJ2dhcC0yJyxcbiAgICBtZDogJ2dhcC00JyxcbiAgICBsZzogJ2dhcC02JyxcbiAgICB4bDogJ2dhcC04J1xuICB9XG5cbiAgY29uc3QgZ2V0R3JpZENvbHMgPSAoKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zaXZlKSB7XG4gICAgICByZXR1cm4gYGdyaWQtY29scy0ke2NvbHN9YFxuICAgIH1cblxuICAgIC8vIFJlc3BvbnNpdmUgZ3JpZCBjbGFzc2VzXG4gICAgc3dpdGNoIChjb2xzKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgI
25114HJldHVybiAnZ3JpZC1jb2xzLTEnXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTInXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMnXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTQnXG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTUnXG4gICAgICBjYXNlIDY6XG4gICAgICAgIHJldHVybiAnZ3JpZC1jb2xzLTEgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgeGw6Z3JpZC1jb2xzLTYnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2dyaWQtY29scy0xJ1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAnZ3JpZCcsXG4gICAgICBnZXRHcmlkQ29scygpLFxuICAgICAgZ2FwQ2xhc3Nlc1tnYXBdLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuLy8gQ2FyZCBDb250YWluZXIgd2l0aCBjb25zaXN0ZW50IHN0eWxpbmdcbmludGVyZmFjZSBDYXJkQ29udGFpbmVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZWxldmF0ZWQnIHwgJ291dGxpbmVkJ1xuICBwYWRkaW5nPzogJ25vbmUnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBvbkNsaWNrPzogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgQ2FyZENvbnRhaW5lcjogUmVhY3QuRkM8Q2FyZENvbnRhaW5lclByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBwYWRkaW5nID0gJ21kJyxcbiAgY2xhc3NOYW1lLFxuICBvbkNsaWNrXG59KSA9PiB7XG4gIGNvbnN0IHZhcmlhbnRDbGFzc2VzID0ge1xuICAgIGRlZmF1bHQ6ICdiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBzaGFkb3ctY2FyZCBib3JkZXIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnknLFxuICAgIGVsZXZhdGVkOiAnYmctd2hpdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmQtaG92ZXInLFxuICAgIG91dGxpbmVkOiAnYmctd2hpdGUgcm91bmRlZC1tZWMtbGcgYm9yZGVyLTIgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnknXG4gIH1cblxuICBjb25zdCBwYWRkaW5nQ2xhc3NlcyA9IHtcbiAgICBub25lOiAnJyxcbiAgICBzbTogJ3AtMycsXG4gICAgbWQ6ICdwLTQnLFxuICAgIGxnOiAncC02J1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgIHZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLFxuICAgICAgICBwYWRkaW5nQ2xhc3Nlc1twYWRkaW5nXSxcbiAgICAgICAgb25DbGljayAmJiAnY3Vyc29yLXBvaW50ZXIgaG92ZXI6c2hhZG93LWNhcmQtaG92ZXIgdHJhbnNpdGlvbi1zaGFkb3cgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgJ292ZXJmbG93LWhpZGRlbicsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbi8vIFBhZ2UgTGF5b3V0IHdpdGggY29uc2lzdGVudCBzdHJ1Y3R1cmVcbmludGVyZmFjZSBQYWdlTGF5b3V0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIHRpdGxlPzogc3RyaW5nXG4gIHN1YnRpdGxlPzogc3RyaW5nXG4gIGFjdGlvbnM/OiBSZWFjdC5SZWFjdE5vZGVcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBQYWdlTGF5b3V0OiBSZWFjdC5GQzxQYWdlTGF5b3V0UHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBzdWJ0aXRsZSxcbiAgYWN0aW9ucyxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ3NwYWNlLXktNicsIGNsYXNzTmFtZSl9PlxuICAgICAgeyh0aXRsZSB8fCBzdWJ0aXRsZSB8fCBhY3Rpb25zKSAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBnYXAtNCBpdGVtcy1zdGFydCBzbTppdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHt0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtzdWJ0aXRsZSAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgICAgICAgIHtzdWJ0aXRsZX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7YWN0aW9ucyAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSB3LWZ1bGwgc206ZmxleC1zaHJpbmstMCBzbTp3LWF1dG9cIj5cbiAgICAgICAgICAgICAge2FjdGlvbnN9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBXaWZpT2ZmLCBXaWZpIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5cbi8qKlxuICogT2ZmbGluZSBJbmRpY2F0b3IgQ29tcG9uZW50XG4gKiBTaG93cyBhIGJhbm5lciB3aGVuIHRoZSBhcHAgaXMgb2ZmbGluZSBhbmQgdXNpbmcgY2FjaGVkIGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IE9mZmxpbmVJbmRpY2F0b3I6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbaXNPbmxpbmUsIHNldElzT25saW5lXSA9IHVzZVN0YXRlKG5hdmlnYXRvci5vbkxpbmUpXG4gIGNvbnN0IFtzaG93QmFubmVyLCBzZXRTaG93QmFubmVyXSA9IHVzZVN0YXRlKCFuYXZpZ2F0b3Iub25MaW5lKVxuICBjb25zdCBbanVzdENhbWVPbmxpbmUsIHNldEp1c3RDYW1lT25saW5lXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlT25saW5lID0gKCkgPT4ge1xuICAgICAgc2V0SXNPbmxpbmUodHJ1ZSlcbiAgICAgIHNldEp1c3RDYW1lT25saW5lKHRydWUpXG4gICAgICBzZXRTaG93QmFubmVyKH
25114RydWUpXG4gICAgICBcbiAgICAgIC8vIEhpZGUgdGhlIFwiYmFjayBvbmxpbmVcIiBiYW5uZXIgYWZ0ZXIgMyBzZWNvbmRzXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2V0U2hvd0Jhbm5lcihmYWxzZSlcbiAgICAgICAgc2V0SnVzdENhbWVPbmxpbmUoZmFsc2UpXG4gICAgICB9LCAzMDAwKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZU9mZmxpbmUgPSAoKSA9PiB7XG4gICAgICBzZXRJc09ubGluZShmYWxzZSlcbiAgICAgIHNldFNob3dCYW5uZXIodHJ1ZSlcbiAgICAgIHNldEp1c3RDYW1lT25saW5lKGZhbHNlKVxuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCBoYW5kbGVPbmxpbmUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBoYW5kbGVPZmZsaW5lKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbmxpbmUnLCBoYW5kbGVPbmxpbmUpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIGhhbmRsZU9mZmxpbmUpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBEb24ndCBzaG93IGFueXRoaW5nIGlmIG9ubGluZSBhbmQgbm90IGp1c3QgY2FtZSBvbmxpbmVcbiAgaWYgKGlzT25saW5lICYmICFqdXN0Q2FtZU9ubGluZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBEb24ndCBzaG93IGlmIGJhbm5lciBpcyBoaWRkZW5cbiAgaWYgKCFzaG93QmFubmVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAnZml4ZWQgdG9wLTAgbGVmdC0wIHJpZ2h0LTAgei01MCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICAnc2hhZG93LWxnJ1xuICAgICAgKX1cbiAgICA+XG4gICAgICB7LyogT2ZmbGluZSBCYW5uZXIgKi99XG4gICAgICB7IWlzT25saW5lICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy15ZWxsb3ctNTAwIHRleHQtd2hpdGUgcHgtNCBweS0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTNcIj5cbiAgICAgICAgICAgIDxXaWZpT2ZmIGNsYXNzTmFtZT1cInctNSBoLTUgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LXNtIG1kOnRleHQtYmFzZVwiPlxuICAgICAgICAgICAgICAgIE9mZmxpbmUtTW9kdXNcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gb3BhY2l0eS05MFwiPlxuICAgICAgICAgICAgICAgIFNpZSB2ZXJ3ZW5kZW4gZ2VzcGVpY2hlcnRlIERhdGVuLiBFaW5pZ2UgRnVua3Rpb25lbiBzaW5kIG3DtmdsaWNoZXJ3ZWlzZSBlaW5nZXNjaHLDpG5rdC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEJhY2sgT25saW5lIEJhbm5lciAqL31cbiAgICAgIHtpc09ubGluZSAmJiBqdXN0Q2FtZU9ubGluZSAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JlZW4tNTAwIHRleHQtd2hpdGUgcHgtNCBweS0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzcGFjZS14LTNcIj5cbiAgICAgICAgICAgIDxXaWZpIGNsYXNzTmFtZT1cInctNSBoLTUgZmxleC1zaHJpbmstMFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LXNtIG1kOnRleHQtYmFzZVwiPlxuICAgICAgICAgICAgICAgIFZlcmJpbmR1bmcgd2llZGVyaGVyZ2VzdGVsbHRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gb3BhY2l0eS05MFwiPlxuICAgICAgICAgICAgICAgIERhdGVuIHdlcmRlbiBha3R1YWxpc2llcnQuLi5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4vKipcbiAqIENvbXBhY3QgT2ZmbGluZSBCYWRnZVxuICogU2hvd3MgYSBzbWFsbCBiYWRnZSBpbiB0aGUgY29ybmVyIHdoZW4gb2ZmbGluZVxuICovXG5leHBvcnQgY29uc3QgT2ZmbGluZUJhZGdlOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgW2lzT25saW5lLCBzZXRJc09ubGluZV0gPSB1c2VTdGF0ZShuYXZpZ2F0b3Iub25MaW5lKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlT25saW5lID0gKCkgPT4gc2V0SXNPbmxpbmUodHJ1ZSlcbiAgICBjb25zdCBoYW5kbGVPZmZsaW5lID0gKCkgPT4gc2V0SXNPbmxpbmUoZmFsc2UpXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgaGFuZGxlT25saW5lKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgaGFuZGxlT2ZmbGluZSlcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb25saW5lJywgaGFuZGxlT25saW5lKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBoYW5kbGVPZmZsaW5lKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgaWYgKGlzT25saW5lKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCBib3R0b20tNCByaWdodC00IHotNDBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmcteWVsbG93LTUwMCB0ZXh0LXdoaXRlIHB4LTMgcHktMiByb3VuZGVkLWZ1bGwgc2hhZG93LWxnIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMlwiPlxuICAgICAgICA8V2lmaU9mZiBjbGFzc05hbWU9XCJ3LTQgaC00XCIgLz5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bVwiPk9mZmxpbmU8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VBcHBTdG9yZSB9IGZyb20gJ0BzdG9yZXMvdXNlQXBwU3RvcmUnXG5pbXBvcnQgeyB1c2VMb2NhdGlvbnMgfSBmcm9tICdAaG9va3MvdXNlTG9jYXRpb25zJ1xuaW1wb3J0IHsgdXNlQ29udGFjdHMgfSBmcm9tICdAaG9va3MvdXNlQ29udGFjdHMnXG5pbXBvcnQgeyBMb2FkaW5nU3Bpbm5lciB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL0xvYWRpbmdTcGlubmVyJ1xuaW1wb3J0IHsgRXJyb3JCb3VuZGFyeSB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnknXG5pbXBvcnQgeyBNYXBDb250YWluZXIgfSBmcm9tICdAY29tcG9uZW50cy9NYXAvTWFwQ29udGFpbmVyJ1xuaW1wb3J0IHsgQ29udGFjdEdyaWQgfSBmcm9tICdAY29tcG9uZW50cy9Db250YWN0L0NvbnRhY3RHcmlkJ1xuaW1wb3J0IHsgVW5pZmllZExpc3RWaWV3IH0gZnJvbSAnQGNvbXBvbmVudHMvVUkvVW5pZmllZExpc3RWaWV3J1xuaW1wb3J0IHsgTG9jYXRpb25Db250YWN0TW9kYWwgfSBmcm9tICdAY29tcG9uZW50cy9Mb2NhdGlvbi9Mb2NhdGlvbkNvbnRhY3RNb2RhbCdcbmltcG9ydCB7
25114IENvbnRhY3RNb2RhbCB9IGZyb20gJ0Bjb21wb25lbnRzL0NvbnRhY3QvQ29udGFjdE1vZGFsJ1xuaW1wb3J0IHsgSGVhZGVyIH0gZnJvbSAnQGNvbXBvbmVudHMvTGF5b3V0L0hlYWRlcidcbmltcG9ydCB7IEZvb3RlciB9IGZyb20gJ0Bjb21wb25lbnRzL0xheW91dC9Gb290ZXInXG5pbXBvcnQgeyBWaWV3VG9nZ2xlIH0gZnJvbSAnQGNvbXBvbmVudHMvVUkvVmlld1RvZ2dsZSdcblxuaW1wb3J0IHsgQ29udGFpbmVyLCBTZWN0aW9uLCBDYXJkQ29udGFpbmVyLCBQYWdlTGF5b3V0IH0gZnJvbSAnQGNvbXBvbmVudHMvTGF5b3V0L0NvbnRhaW5lcidcblxuaW1wb3J0IHsgT2ZmbGluZUluZGljYXRvciB9IGZyb20gJ0Bjb21wb25lbnRzL1VJL09mZmxpbmVJbmRpY2F0b3InXG5cbmZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3Qge1xuICAgIG1hcFZpZXcsXG4gICAgc2VsZWN0ZWRMb2NhdGlvbklkLFxuICAgIG9wZW5Mb2NhdGlvbk1vZGFsLFxuICAgIGlzQ29udGFjdE1vZGFsT3BlblxuICB9ID0gdXNlQXBwU3RvcmUoKVxuXG5cblxuICBjb25zdCB7IGRhdGE6IGxvY2F0aW9ucywgaXNMb2FkaW5nLCBlcnJvciB9ID0gdXNlTG9jYXRpb25zKClcbiAgY29uc3QgeyBkYXRhOiBjb250YWN0cyB9ID0gdXNlQ29udGFjdHMoKVxuXG4gIC8vIENoZWNrIGVtYmVkIG1vZGUgYW5kIGluZGl2aWR1YWwgY29tcG9uZW50IHZpc2liaWxpdHlcbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKVxuICBjb25zdCBlbWJlZFBhcmFtID0gdXJsUGFyYW1zLmdldCgnZW1iZWQnKVxuICBjb25zdCBoaWRlSGVhZGVyUGFyYW0gPSB1cmxQYXJhbXMuZ2V0KCdoaWRlSGVhZGVyJylcbiAgY29uc3QgaGlkZUZvb3RlclBhcmFtID0gdXJsUGFyYW1zLmdldCgnaGlkZUZvb3RlcicpXG5cbiAgLy8gRGV0ZXJtaW5lIHZpc2liaWxpdHkgZm9yIGhlYWRlciBhbmQgZm9vdGVyXG4gIGNvbnN0IGlzRW1iZWRNb2RlID0gZW1iZWRQYXJhbSA9PT0gJ3RydWUnXG5cbiAgLy8gSGVhZGVyIHZpc2liaWxpdHkgbG9naWM6XG4gIC8vIC0gSWYgaGlkZUhlYWRlcj10cnVlOiBhbHdheXMgaGlkZVxuICAvLyAtIElmIGVtYmVkPXRydWU6IGhpZGVcbiAgLy8gLSBPdGhlcndpc2U6IHNob3cgKGV2ZW4gaW4gaWZyYW1lKVxuICBjb25zdCBzaG93SGVhZGVyID0gaGlkZUhlYWRlclBhcmFtID09PSAndHJ1ZScgPyBmYWxzZSA6IGVtYmVkUGFyYW0gIT09ICd0cnVlJ1xuXG4gIC8vIEZvb3RlciB2aXNpYmlsaXR5IGxvZ2ljOlxuICAvLyAtIElmIGhpZGVGb290ZXI9dHJ1ZTogYWx3YXlzIGhpZGVcbiAgLy8gLSBJZiBlbWJlZD10cnVlOiBoaWRlXG4gIC8vIC0gT3RoZXJ3aXNlOiBzaG93IChldmVuIGluIGlmcmFtZSlcbiAgY29uc3Qgc2hvd0Zvb3RlciA9IGhpZGVGb290ZXJQYXJhbSA9PT0gJ3RydWUnID8gZmFsc2UgOiBlbWJlZFBhcmFtICE9PSAndHJ1ZSdcblxuICAvLyBJbml0aWFsaXplIGFwcCBmcm9tIFVSTCBwYXJhbWV0ZXJzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbSA9IHVybFBhcmFtcy5nZXQoJ2xvY2F0aW9uJylcblxuICAgIGlmIChsb2NhdGlvblBhcmFtICYmICFzZWxlY3RlZExvY2F0aW9uSWQpIHtcbiAgICAgIC8vIENvbnZlcnQgdG8gd3AtcHJlZml4ZWQgZm9ybWF0IGlmIG5lZWRlZFxuICAgICAgY29uc3QgbG9jYXRpb25JZCA9IGxvY2F0aW9uUGFyYW0uc3RhcnRzV2l0aCgnd3AtJykgPyBsb2NhdGlvblBhcmFtIDogYHdwLSR7bG9jYXRpb25QYXJhbX1gXG4gICAgICBvcGVuTG9jYXRpb25Nb2RhbChsb2NhdGlvbklkKVxuICAgIH1cbiAgfSwgW3NlbGVjdGVkTG9jYXRpb25JZCwgb3BlbkxvY2F0aW9uTW9kYWxdKVxuXG4gIC8vIEhhbmRsZSBsb2FkaW5nIHN0YXRlXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmFja2dyb3VuZC1zZWNvbmRhcnlcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPVwibGdcIiAvPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTQgdGV4dC10ZXh0LXNlY29uZGFyeVwiPkxhZGUgUG9ydGZvbGlvLURhdGVuLi4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSBlcnJvciBzdGF0ZVxuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmFja2dyb3VuZC1zZWNvbmRhcnlcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBwLThcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtNnhsIG1iLTRcIj7imqDvuI88L2Rpdj5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICBGZWhsZXIgYmVpbSBMYWRlblxuICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC10ZXh0LXNlY29uZGFyeSBtYi00XCI+XG4gICAgICAgICAgICBEaWUgUG9ydGZvbGlvLURhdGVuIGtvbm50ZW4gbmljaHQgZ2VsYWRlbiB3ZXJkZW4uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBFcm5ldXQgdmVyc3VjaGVuXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YG1pbi1oLXNjcmVlbiBiZy1iYWNrZ3JvdW5kLXByaW1hcnkgc2Nyb2xsLXNtb290aCAke2lzRW1iZWRNb2RlID8gJ2VtYmVkLW1vZGUnIDogJyd9YH0+XG4gICAgICB7LyogT2ZmbGluZSBJbmRpY2F0b3IgKi99XG4gICAgICA8T2ZmbGluZUluZGljYXRvciAvPlxuXG4gICAgICB7LyogSGVhZGVyIC0gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eSAqL31cbiAgICAgIHtzaG93SGVhZGVyICYmIDxIZWFkZXIgLz59XG5cbiAgICAgIHsvKiBNYWluIENvbnRlbnQgKi99XG4gICAgICA8bWFpbiBjbGFzc05hbWU9e2lzRW1iZWRNb2RlID8gJ3B5LTInIDogJ3B5LTYnfT5cbiAgICAgICAgPENvbnRhaW5lciBzaXplPXtpc0VtYmVkTW9kZSA/ICdmdWxsJyA6ICd4bCd9IHBhZGRpbmc9e2lzRW1iZWRNb2RlID8gJ25vbmUnIDogJ21kJ30+XG4gICAgICAgICAgPFBhZ2VMYXlvdXQ+XG5cbiAgICAgICAgICAgI
25114HsvKiBDb250ZW50IGJhc2VkIG9uIHZpZXcgbW9kZSAqL31cbiAgICAgICAgICAgIDxTZWN0aW9uIHNwYWNpbmc9XCJsZ1wiPlxuICAgICAgICAgIHttYXBWaWV3ID09PSAnaW50ZXJhY3RpdmUnID8gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIEludGVyYWN0aXZlIE1hcCBWaWV3ICovfVxuICAgICAgICAgICAgICA8Q2FyZENvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNCBib3JkZXItYiBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBGaW5kZW4gU2llIElocmVuIEFuc3ByZWNocGFydG5lclxuICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEtsaWNrZW4gU2llIGF1ZiBlaW5lbiBTdGFuZG9ydCBhdWYgZGVyIEthcnRlXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgey8qIFZpZXcgVG9nZ2xlIGluIE1hcCBWaWV3ICovfVxuICAgICAgICAgICAgICAgICAgPFZpZXdUb2dnbGUgc2l6ZT1cInNtXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC04IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBLYXJ0ZSBrb25udGUgbmljaHQgZ2VsYWRlbiB3ZXJkZW5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgICAgIDxNYXBDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zPXtsb2NhdGlvbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3RzPXtjb250YWN0cz8uZGF0YSB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXs1MDB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvRXJyb3JCb3VuZGFyeT5cbiAgICAgICAgICAgICAgPC9DYXJkQ29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIHsvKiBTZWxlY3RlZCBMb2NhdGlvbiBDb250YWN0cyAqL31cbiAgICAgICAgICAgICAge3NlbGVjdGVkTG9jYXRpb25JZCAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLW1lYy1sZyBzaGFkb3ctY2FyZCBwLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICBBbnNwcmVjaHBhcnRuZXIgYW0gYXVzZ2V3w6RobHRlbiBTdGFuZG9ydFxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxDb250YWN0R3JpZCBsb2NhdGlvbklkPXtzZWxlY3RlZExvY2F0aW9uSWR9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIExpc3QgVmlldyAtIFNob3dzIGJvdGggTG9jYXRpb25zIGFuZCBDb250YWN0cyAqL31cbiAgICAgICAgICAgICAgPFVuaWZpZWRMaXN0VmlldyAvPlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICA8L1BhZ2VMYXlvdXQ+XG4gICAgICAgIDwvQ29udGFpbmVyPlxuICAgICAgPC9tYWluPlxuXG4gICAgICB7LyogTW9kYWxzICovfVxuICAgICAgPExvY2F0aW9uQ29udGFjdE1vZGFsIC8+XG4gICAgICBcbiAgICAgIHtpc0NvbnRhY3RNb2RhbE9wZW4gJiYgKFxuICAgICAgICA8Q29udGFjdE1vZGFsIC8+XG4gICAgICApfVxuXG4gICAgICB7LyogRm9vdGVyIC0gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eSAqL31cbiAgICAgIHtzaG93Rm9vdGVyICYmIDxGb290ZXIgLz59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwXG4iLCJjb25zdCBDTEFTU19QQVJUX1NFUEFSQVRPUiA9ICctJztcbmNvbnN0IGNyZWF0ZUNsYXNzR3JvdXBVdGlscyA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IGNsYXNzTWFwID0gY3JlYXRlQ2xhc3NNYXAoY29uZmlnKTtcbiAgY29uc3Qge1xuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cHMsXG4gICAgY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzXG4gI
25114H0gPSBjb25maWc7XG4gIGNvbnN0IGdldENsYXNzR3JvdXBJZCA9IGNsYXNzTmFtZSA9PiB7XG4gICAgY29uc3QgY2xhc3NQYXJ0cyA9IGNsYXNzTmFtZS5zcGxpdChDTEFTU19QQVJUX1NFUEFSQVRPUik7XG4gICAgLy8gQ2xhc3NlcyBsaWtlIGAtaW5zZXQtMWAgcHJvZHVjZSBhbiBlbXB0eSBzdHJpbmcgYXMgZmlyc3QgY2xhc3NQYXJ0LiBXZSBhc3N1bWUgdGhhdCBjbGFzc2VzIGZvciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgY29ycmVjdGx5IGFuZCByZW1vdmUgaXQgZnJvbSBjbGFzc1BhcnRzLlxuICAgIGlmIChjbGFzc1BhcnRzWzBdID09PSAnJyAmJiBjbGFzc1BhcnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY2xhc3NQYXJ0cy5zaGlmdCgpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0R3JvdXBSZWN1cnNpdmUoY2xhc3NQYXJ0cywgY2xhc3NNYXApIHx8IGdldEdyb3VwSWRGb3JBcmJpdHJhcnlQcm9wZXJ0eShjbGFzc05hbWUpO1xuICB9O1xuICBjb25zdCBnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHMgPSAoY2xhc3NHcm91cElkLCBoYXNQb3N0Zml4TW9kaWZpZXIpID0+IHtcbiAgICBjb25zdCBjb25mbGljdHMgPSBjb25mbGljdGluZ0NsYXNzR3JvdXBzW2NsYXNzR3JvdXBJZF0gfHwgW107XG4gICAgaWYgKGhhc1Bvc3RmaXhNb2RpZmllciAmJiBjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnNbY2xhc3NHcm91cElkXSkge1xuICAgICAgcmV0dXJuIFsuLi5jb25mbGljdHMsIC4uLmNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyc1tjbGFzc0dyb3VwSWRdXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZsaWN0cztcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXRDbGFzc0dyb3VwSWQsXG4gICAgZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzXG4gIH07XG59O1xuY29uc3QgZ2V0R3JvdXBSZWN1cnNpdmUgPSAoY2xhc3NQYXJ0cywgY2xhc3NQYXJ0T2JqZWN0KSA9PiB7XG4gIGlmIChjbGFzc1BhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjbGFzc1BhcnRPYmplY3QuY2xhc3NHcm91cElkO1xuICB9XG4gIGNvbnN0IGN1cnJlbnRDbGFzc1BhcnQgPSBjbGFzc1BhcnRzWzBdO1xuICBjb25zdCBuZXh0Q2xhc3NQYXJ0T2JqZWN0ID0gY2xhc3NQYXJ0T2JqZWN0Lm5leHRQYXJ0LmdldChjdXJyZW50Q2xhc3NQYXJ0KTtcbiAgY29uc3QgY2xhc3NHcm91cEZyb21OZXh0Q2xhc3NQYXJ0ID0gbmV4dENsYXNzUGFydE9iamVjdCA/IGdldEdyb3VwUmVjdXJzaXZlKGNsYXNzUGFydHMuc2xpY2UoMSksIG5leHRDbGFzc1BhcnRPYmplY3QpIDogdW5kZWZpbmVkO1xuICBpZiAoY2xhc3NHcm91cEZyb21OZXh0Q2xhc3NQYXJ0KSB7XG4gICAgcmV0dXJuIGNsYXNzR3JvdXBGcm9tTmV4dENsYXNzUGFydDtcbiAgfVxuICBpZiAoY2xhc3NQYXJ0T2JqZWN0LnZhbGlkYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBjbGFzc1Jlc3QgPSBjbGFzc1BhcnRzLmpvaW4oQ0xBU1NfUEFSVF9TRVBBUkFUT1IpO1xuICByZXR1cm4gY2xhc3NQYXJ0T2JqZWN0LnZhbGlkYXRvcnMuZmluZCgoe1xuICAgIHZhbGlkYXRvclxuICB9KSA9PiB2YWxpZGF0b3IoY2xhc3NSZXN0KSk/LmNsYXNzR3JvdXBJZDtcbn07XG5jb25zdCBhcmJpdHJhcnlQcm9wZXJ0eVJlZ2V4ID0gL15cXFsoLispXFxdJC87XG5jb25zdCBnZXRHcm91cElkRm9yQXJiaXRyYXJ5UHJvcGVydHkgPSBjbGFzc05hbWUgPT4ge1xuICBpZiAoYXJiaXRyYXJ5UHJvcGVydHlSZWdleC50ZXN0KGNsYXNzTmFtZSkpIHtcbiAgICBjb25zdCBhcmJpdHJhcnlQcm9wZXJ0eUNsYXNzTmFtZSA9IGFyYml0cmFyeVByb3BlcnR5UmVnZXguZXhlYyhjbGFzc05hbWUpWzFdO1xuICAgIGNvbnN0IHByb3BlcnR5ID0gYXJiaXRyYXJ5UHJvcGVydHlDbGFzc05hbWU/LnN1YnN0cmluZygwLCBhcmJpdHJhcnlQcm9wZXJ0eUNsYXNzTmFtZS5pbmRleE9mKCc6JykpO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgLy8gSSB1c2UgdHdvIGRvdHMgaGVyZSBiZWNhdXNlIG9uZSBkb3QgaXMgdXNlZCBhcyBwcmVmaXggZm9yIGNsYXNzIGdyb3VwcyBpbiBwbHVnaW5zXG4gICAgICByZXR1cm4gJ2FyYml0cmFyeS4uJyArIHByb3BlcnR5O1xuICAgIH1cbiAgfVxufTtcbi8qKlxuICogRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5jb25zdCBjcmVhdGVDbGFzc01hcCA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IHtcbiAgICB0aGVtZSxcbiAgICBjbGFzc0dyb3Vwc1xuICB9ID0gY29uZmlnO1xuICBjb25zdCBjbGFzc01hcCA9IHtcbiAgICBuZXh0UGFydDogbmV3IE1hcCgpLFxuICAgIHZhbGlkYXRvcnM6IFtdXG4gIH07XG4gIGZvciAoY29uc3QgY2xhc3NHcm91cElkIGluIGNsYXNzR3JvdXBzKSB7XG4gICAgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseShjbGFzc0dyb3Vwc1tjbGFzc0dyb3VwSWRdLCBjbGFzc01hcCwgY2xhc3NHcm91cElkLCB0aGVtZSk7XG4gIH1cbiAgcmV0dXJuIGNsYXNzTWFwO1xufTtcbmNvbnN0IHByb2Nlc3NDbGFzc2VzUmVjdXJzaXZlbHkgPSAoY2xhc3NHcm91cCwgY2xhc3NQYXJ0T2JqZWN0LCBjbGFzc0dyb3VwSWQsIHRoZW1lKSA9PiB7XG4gIGNsYXNzR3JvdXAuZm9yRWFjaChjbGFzc0RlZmluaXRpb24gPT4ge1xuICAgIGlmICh0eXBlb2YgY2xhc3NEZWZpbml0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgY2xhc3NQYXJ0T2JqZWN0VG9FZGl0ID0gY2xhc3NEZWZpbml0aW9uID09PSAnJyA/IGNsYXNzUGFydE9iamVjdCA6IGdldFBhcnQoY2xhc3NQYXJ0T2JqZWN0LCBjbGFzc0RlZmluaXRpb24pO1xuICAgICAgY2xhc3NQYXJ0T2JqZWN0VG9FZGl0LmNsYXNzR3JvdXBJZCA9IGNsYXNzR3JvdXBJZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjbGFzc0RlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChpc1RoZW1lR2V0dGVyKGNsYXNzRGVmaW5pdGlvbikpIHtcbiAgICAgICAgcHJvY2Vzc0NsYXNzZXNSZWN1cnNpdmVseShjbGFzc0RlZmluaXRpb24odGhlbWUpLCBjbGFzc1BhcnRPYmplY3QsIGNsYXNzR3JvdXBJZCwgdGhlbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjbGFzc1BhcnRPYmplY3QudmFsaWRhdG9ycy5wdXNoKHtcbiAgICAgICAgdmFsaWRhdG9yOiBjbGFzc0RlZmluaXRpb24sXG4gICAgICAgIGNsYXNzR3JvdXBJZFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGNsYXNzRGVmaW5pdGlvbikuZm9yRWFjaCgoW2tleSwgY2xhc3NHcm91cF0pID0+IHtcbiAgICAgIHByb2Nlc3NDbGFzc2VzUmVjdXJzaXZlbHkoY2xhc3NHcm91cCwgZ2V0UGFydChjbGFzc1BhcnRPYmplY3QsIGtleSksIGNsYXNzR3JvdXBJZCwgdGhlbWUpO1xuICAgIH0pO1xuICB9KTtcbn07XG5jb25zdCBnZXRQYXJ0ID0gKGNsYXNzUGFydE9iamVjdCwgcGF0aCkgPT4ge1xuICBsZXQgY3VycmVudENsYXNzUGFydE9iamVjdCA9IGNsYXNzUGFydE9iamVjdDtcbiAgcGF0aC5zcGxpdChDTEFTU19QQVJUX1NFUEFSQVRPUikuZm9yRWFjaChwYXRoUGFydCA9PiB7XG4gICAgaWYgKCFjdXJyZW50Q2xhc3NQYXJ0T2JqZWN0Lm5leHRQYXJ0LmhhcyhwYXRoUGFydCkpIHtcbiAgICAgIGN1cnJlbnRDbGFzc1BhcnRPYmplY3QubmV4dFBhcnQuc2
25114V0KHBhdGhQYXJ0LCB7XG4gICAgICAgIG5leHRQYXJ0OiBuZXcgTWFwKCksXG4gICAgICAgIHZhbGlkYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgY3VycmVudENsYXNzUGFydE9iamVjdCA9IGN1cnJlbnRDbGFzc1BhcnRPYmplY3QubmV4dFBhcnQuZ2V0KHBhdGhQYXJ0KTtcbiAgfSk7XG4gIHJldHVybiBjdXJyZW50Q2xhc3NQYXJ0T2JqZWN0O1xufTtcbmNvbnN0IGlzVGhlbWVHZXR0ZXIgPSBmdW5jID0+IGZ1bmMuaXNUaGVtZUdldHRlcjtcblxuLy8gTFJVIGNhY2hlIGluc3BpcmVkIGZyb20gaGFzaGxydSAoaHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWN0YXJyL2hhc2hscnUvYmxvYi92MS4wLjQvaW5kZXguanMpIGJ1dCBvYmplY3QgcmVwbGFjZWQgd2l0aCBNYXAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuY29uc3QgY3JlYXRlTHJ1Q2FjaGUgPSBtYXhDYWNoZVNpemUgPT4ge1xuICBpZiAobWF4Q2FjaGVTaXplIDwgMSkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXQ6ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgIHNldDogKCkgPT4ge31cbiAgICB9O1xuICB9XG4gIGxldCBjYWNoZVNpemUgPSAwO1xuICBsZXQgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGxldCBwcmV2aW91c0NhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdCB1cGRhdGUgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIGNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICBjYWNoZVNpemUrKztcbiAgICBpZiAoY2FjaGVTaXplID4gbWF4Q2FjaGVTaXplKSB7XG4gICAgICBjYWNoZVNpemUgPSAwO1xuICAgICAgcHJldmlvdXNDYWNoZSA9IGNhY2hlO1xuICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCh2YWx1ZSA9IHByZXZpb3VzQ2FjaGUuZ2V0KGtleSkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlKGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgIGNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZShrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuY29uc3QgSU1QT1JUQU5UX01PRElGSUVSID0gJyEnO1xuY29uc3QgTU9ESUZJRVJfU0VQQVJBVE9SID0gJzonO1xuY29uc3QgTU9ESUZJRVJfU0VQQVJBVE9SX0xFTkdUSCA9IE1PRElGSUVSX1NFUEFSQVRPUi5sZW5ndGg7XG5jb25zdCBjcmVhdGVQYXJzZUNsYXNzTmFtZSA9IGNvbmZpZyA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXgsXG4gICAgZXhwZXJpbWVudGFsUGFyc2VDbGFzc05hbWVcbiAgfSA9IGNvbmZpZztcbiAgLyoqXG4gICAqIFBhcnNlIGNsYXNzIG5hbWUgaW50byBwYXJ0cy5cbiAgICpcbiAgICogSW5zcGlyZWQgYnkgYHNwbGl0QXRUb3BMZXZlbE9ubHlgIHVzZWQgaW4gVGFpbHdpbmQgQ1NTXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9ibG9iL3YzLjIuMi9zcmMvdXRpbC9zcGxpdEF0VG9wTGV2ZWxPbmx5LmpzXG4gICAqL1xuICBsZXQgcGFyc2VDbGFzc05hbWUgPSBjbGFzc05hbWUgPT4ge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtdO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgbW9kaWZpZXJTdGFydCA9IDA7XG4gICAgbGV0IHBvc3RmaXhNb2RpZmllclBvc2l0aW9uO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjbGFzc05hbWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBsZXQgY3VycmVudENoYXJhY3RlciA9IGNsYXNzTmFtZVtpbmRleF07XG4gICAgICBpZiAoYnJhY2tldERlcHRoID09PSAwICYmIHBhcmVuRGVwdGggPT09IDApIHtcbiAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09IE1PRElGSUVSX1NFUEFSQVRPUikge1xuICAgICAgICAgIG1vZGlmaWVycy5wdXNoKGNsYXNzTmFtZS5zbGljZShtb2RpZmllclN0YXJ0LCBpbmRleCkpO1xuICAgICAgICAgIG1vZGlmaWVyU3RhcnQgPSBpbmRleCArIE1PRElGSUVSX1NFUEFSQVRPUl9MRU5HVEg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09ICcvJykge1xuICAgICAgICAgIHBvc3RmaXhNb2RpZmllclBvc2l0aW9uID0gaW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyID09PSAnWycpIHtcbiAgICAgICAgYnJhY2tldERlcHRoKys7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT09ICddJykge1xuICAgICAgICBicmFja2V0RGVwdGgtLTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENoYXJhY3RlciA9PT0gJygnKSB7XG4gICAgICAgIHBhcmVuRGVwdGgrKztcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENoYXJhY3RlciA9PT0gJyknKSB7XG4gICAgICAgIHBhcmVuRGVwdGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYmFzZUNsYXNzTmFtZVdpdGhJbXBvcnRhbnRNb2RpZmllciA9IG1vZGlmaWVycy5sZW5ndGggPT09IDAgPyBjbGFzc05hbWUgOiBjbGFzc05hbWUuc3Vic3RyaW5nKG1vZGlmaWVyU3RhcnQpO1xuICAgIGNvbnN0IGJhc2VDbGFzc05hbWUgPSBzdHJpcEltcG9ydGFudE1vZGlmaWVyKGJhc2VDbGFzc05hbWVXaXRoSW1wb3J0YW50TW9kaWZpZXIpO1xuICAgIGNvbnN0IGhhc0ltcG9ydGFudE1vZGlmaWVyID0gYmFzZUNsYXNzTmFtZSAhPT0gYmFzZUNsYXNzTmFtZVdpdGhJbXBvcnRhbnRNb2RpZmllcjtcbiAgICBjb25zdCBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uID0gcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gJiYgcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gPiBtb2RpZmllclN0YXJ0ID8gcG9zdGZpeE1vZGlmaWVyUG9zaXRpb24gLSBtb2RpZmllclN0YXJ0IDogdW5kZWZpbmVkO1xuICAgIHJldHVybi
25114B7XG4gICAgICBtb2RpZmllcnMsXG4gICAgICBoYXNJbXBvcnRhbnRNb2RpZmllcixcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uXG4gICAgfTtcbiAgfTtcbiAgaWYgKHByZWZpeCkge1xuICAgIGNvbnN0IGZ1bGxQcmVmaXggPSBwcmVmaXggKyBNT0RJRklFUl9TRVBBUkFUT1I7XG4gICAgY29uc3QgcGFyc2VDbGFzc05hbWVPcmlnaW5hbCA9IHBhcnNlQ2xhc3NOYW1lO1xuICAgIHBhcnNlQ2xhc3NOYW1lID0gY2xhc3NOYW1lID0+IGNsYXNzTmFtZS5zdGFydHNXaXRoKGZ1bGxQcmVmaXgpID8gcGFyc2VDbGFzc05hbWVPcmlnaW5hbChjbGFzc05hbWUuc3Vic3RyaW5nKGZ1bGxQcmVmaXgubGVuZ3RoKSkgOiB7XG4gICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgbW9kaWZpZXJzOiBbXSxcbiAgICAgIGhhc0ltcG9ydGFudE1vZGlmaWVyOiBmYWxzZSxcbiAgICAgIGJhc2VDbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgaWYgKGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lKSB7XG4gICAgY29uc3QgcGFyc2VDbGFzc05hbWVPcmlnaW5hbCA9IHBhcnNlQ2xhc3NOYW1lO1xuICAgIHBhcnNlQ2xhc3NOYW1lID0gY2xhc3NOYW1lID0+IGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lKHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHBhcnNlQ2xhc3NOYW1lOiBwYXJzZUNsYXNzTmFtZU9yaWdpbmFsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlQ2xhc3NOYW1lO1xufTtcbmNvbnN0IHN0cmlwSW1wb3J0YW50TW9kaWZpZXIgPSBiYXNlQ2xhc3NOYW1lID0+IHtcbiAgaWYgKGJhc2VDbGFzc05hbWUuZW5kc1dpdGgoSU1QT1JUQU5UX01PRElGSUVSKSkge1xuICAgIHJldHVybiBiYXNlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBiYXNlQ2xhc3NOYW1lLmxlbmd0aCAtIDEpO1xuICB9XG4gIC8qKlxuICAgKiBJbiBUYWlsd2luZCBDU1MgdjMgdGhlIGltcG9ydGFudCBtb2RpZmllciB3YXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBiYXNlIGNsYXNzIG5hbWUuIFRoaXMgaXMgc3RpbGwgc3VwcG9ydGVkIGZvciBsZWdhY3kgcmVhc29ucy5cbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZGNhc3RpbC90YWlsd2luZC1tZXJnZS9pc3N1ZXMvNTEzI2lzc3VlY29tbWVudC0yNjE0MDI5ODY0XG4gICAqL1xuICBpZiAoYmFzZUNsYXNzTmFtZS5zdGFydHNXaXRoKElNUE9SVEFOVF9NT0RJRklFUikpIHtcbiAgICByZXR1cm4gYmFzZUNsYXNzTmFtZS5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgcmV0dXJuIGJhc2VDbGFzc05hbWU7XG59O1xuXG4vKipcbiAqIFNvcnRzIG1vZGlmaWVycyBhY2NvcmRpbmcgdG8gZm9sbG93aW5nIHNjaGVtYTpcbiAqIC0gUHJlZGVmaW5lZCBtb2RpZmllcnMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseVxuICogLSBXaGVuIGFuIGFyYml0cmFyeSB2YXJpYW50IGFwcGVhcnMsIGl0IG11c3QgYmUgcHJlc2VydmVkIHdoaWNoIG1vZGlmaWVycyBhcmUgYmVmb3JlIGFuZCBhZnRlciBpdFxuICovXG5jb25zdCBjcmVhdGVTb3J0TW9kaWZpZXJzID0gY29uZmlnID0+IHtcbiAgY29uc3Qgb3JkZXJTZW5zaXRpdmVNb2RpZmllcnMgPSBPYmplY3QuZnJvbUVudHJpZXMoY29uZmlnLm9yZGVyU2Vuc2l0aXZlTW9kaWZpZXJzLm1hcChtb2RpZmllciA9PiBbbW9kaWZpZXIsIHRydWVdKSk7XG4gIGNvbnN0IHNvcnRNb2RpZmllcnMgPSBtb2RpZmllcnMgPT4ge1xuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybiBtb2RpZmllcnM7XG4gICAgfVxuICAgIGNvbnN0IHNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgIGxldCB1bnNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgIG1vZGlmaWVycy5mb3JFYWNoKG1vZGlmaWVyID0+IHtcbiAgICAgIGNvbnN0IGlzUG9zaXRpb25TZW5zaXRpdmUgPSBtb2RpZmllclswXSA9PT0gJ1snIHx8IG9yZGVyU2Vuc2l0aXZlTW9kaWZpZXJzW21vZGlmaWVyXTtcbiAgICAgIGlmIChpc1Bvc2l0aW9uU2Vuc2l0aXZlKSB7XG4gICAgICAgIHNvcnRlZE1vZGlmaWVycy5wdXNoKC4uLnVuc29ydGVkTW9kaWZpZXJzLnNvcnQoKSwgbW9kaWZpZXIpO1xuICAgICAgICB1bnNvcnRlZE1vZGlmaWVycyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5zb3J0ZWRNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc29ydGVkTW9kaWZpZXJzLnB1c2goLi4udW5zb3J0ZWRNb2RpZmllcnMuc29ydCgpKTtcbiAgICByZXR1cm4gc29ydGVkTW9kaWZpZXJzO1xuICB9O1xuICByZXR1cm4gc29ydE1vZGlmaWVycztcbn07XG5jb25zdCBjcmVhdGVDb25maWdVdGlscyA9IGNvbmZpZyA9PiAoe1xuICBjYWNoZTogY3JlYXRlTHJ1Q2FjaGUoY29uZmlnLmNhY2hlU2l6ZSksXG4gIHBhcnNlQ2xhc3NOYW1lOiBjcmVhdGVQYXJzZUNsYXNzTmFtZShjb25maWcpLFxuICBzb3J0TW9kaWZpZXJzOiBjcmVhdGVTb3J0TW9kaWZpZXJzKGNvbmZpZyksXG4gIC4uLmNyZWF0ZUNsYXNzR3JvdXBVdGlscyhjb25maWcpXG59KTtcbmNvbnN0IFNQTElUX0NMQVNTRVNfUkVHRVggPSAvXFxzKy87XG5jb25zdCBtZXJnZUNsYXNzTGlzdCA9IChjbGFzc0xpc3QsIGNvbmZpZ1V0aWxzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUNsYXNzTmFtZSxcbiAgICBnZXRDbGFzc0dyb3VwSWQsXG4gICAgZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzLFxuICAgIHNvcnRNb2RpZmllcnNcbiAgfSA9IGNvbmZpZ1V0aWxzO1xuICAvKipcbiAgICogU2V0IG9mIGNsYXNzR3JvdXBJZHMgaW4gZm9sbG93aW5nIGZvcm1hdDpcbiAgICogYHtpbXBvcnRhbnRNb2RpZmllcn17dmFyaWFudE1vZGlmaWVyc317Y2xhc3NHcm91cElkfWBcbiAgICogQGV4YW1wbGUgJ2Zsb2F0J1xuICAgKiBAZXhhbXBsZSAnaG92ZXI6Zm9jdXM6YmctY29sb3InXG4gICAqIEBleGFtcGxlICdtZDohcHInXG4gICAqL1xuICBjb25zdCBjbGFzc0dyb3Vwc0luQ29uZmxpY3QgPSBbXTtcbiAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzTGlzdC50cmltKCkuc3BsaXQoU1BMSVRfQ0xBU1NFU19SRUdFWCk7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSBjbGFzc05hbWVzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4IC09IDEpIHtcbiAgICBjb25zdCBvcmlnaW5hbENsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaW5kZXhdO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzRXh0ZXJuYWwsXG4gICAgICBtb2RpZmllcnMsXG4gICAgICBoYXNJbXBvcnRhbnRNb2RpZmllcixcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uXG4gICAgfSA9IHBhcnNlQ2xhc3NOYW1lKG9yaWdpbmFsQ2xhc3NOYW1lKTtcbiAgICBpZiAoaXNFeHRlcm5hbCkge1xuICAgICAgcmVzdWx0ID0gb3JpZ2luYWxDbGFzc05hbWUgKyAocmVzdWx0Lmxlbmd0aCA+IDAgPyAnICcgKyByZXN1bHQgOiByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBoYXNQb3N0Zml4TW9kaWZpZXIgPSAhIW1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb247XG4gICAgbGV0IGNsYXNzR3JvdXBJZCA9IGdldENsYXNzR3JvdXBJZChoYXNQb3N0Zml4TW9kaWZpZXIgPyBiYXNlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uKSA6IGJhc2VDbGFzc05hbWUpO1xuICAgIGlmICghY2xhc3NHcm91cElkKSB7XG4gICAgICBpZiAoIWhhc1Bvc3RmaXhNb2RpZmllcikge1xuICAgICAgICAvLyBOb3QgYSBUYWlsd2luZCBjbGFzc1xuICAgICAgICByZXN1bHQgPSBvcmlnaW5hbENsYXNzTmFtZSArIChyZXN1bHQubGVuZ3RoID4gMCA/ICcgJyArIHJlc3VsdCA6IHJlc3VsdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2xhc3NHcm91cElkID0gZ2V0Q2xhc3NHcm91cElkKGJhc2VDbGFzc05hbWUpO1xuICAgICAgaWYgKCFjbGFzc0dyb3VwSWQpIHtcbiAgICAgICAgLy8gTm90IGEgVGFpbHdpbmQgY2xhc3NcbiAgICAgICAgcmVzdWx0ID0gb3JpZ2luYWxDbGFzc05hbWUgKyAocmVzdWx0Lmxlbmd0aCA+IDAgPyAnICcgKyByZXN1bHQgOiByZXN1bHQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGhhc1Bvc3RmaXhNb2RpZmllciA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YXJpYW50TW9kaWZpZXIgPSBzb3J0TW9kaWZpZXJzKG1vZGlmaWVycykuam9pbignOicpO1xuICAgIGNvbnN0IG1vZGlmaWVySWQgPSBoYXNJbXBvcnRhbnRNb2RpZmllciA/IHZhcmlhbnRNb2RpZmllciArIElNUE9SVEFOVF9NT0RJRklFUiA6IHZhcmlhbnRNb2RpZmllcjtcbiAgICBjb25zdCBjbGFzc0lkID0gbW9kaWZpZXJJZCArIGNsYXNzR3JvdXBJZDtcbiAgICBpZiAoY2xhc3NHcm91cHNJbkNvbmZsaWN0LmluY2x1ZGVzKGNsYXNzSWQpKSB7XG4gICAgICAvLyBUYWlsd2luZCBjbGFzcyBvbWl0dGVkIGR1ZSB0byBjb25mbGljdFxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNsYXNzR3JvdXBzSW5Db25mbGljdC5wdXNoKGNsYXNzSWQpO1xuICAgIGNvbnN0IGNvbmZsaWN0R3JvdXBzID0gZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzKGNsYXNzR3JvdXBJZCwgaGFzUG9zdGZpeE1vZGlmaWVyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmZsaWN0R3JvdXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBncm91cCA9IGNvbmZsaWN0R3JvdXBzW2ldO1xuICAgICAgY2xhc3NHcm91cHNJbkNvbmZsaWN0LnB1c2gobW9kaWZpZXJJZCArIGdyb3VwKTtcbiAgICB9XG4gICAgLy8gVGFpbHdpbmQgY2xhc3Mgbm90IGluIGNvbmZsaWN0XG4gICAgcmVzdWx0ID0gb3JpZ2luYWxDbGFzc05hbWUgKyAocmVzdWx0Lmxlbmd0aCA+IDAgPyAnICcgKyByZXN1bHQgOiByZXN1bHQpO1xuICB9XG4gI
25114HJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL2Nsc3ggYW5kIG1vZGlmaWVkIHRvIHN1aXQgdGhlIG5lZWRzIG9mIHRhaWx3aW5kLW1lcmdlIGJldHRlci5cbiAqXG4gKiBTcGVjaWZpY2FsbHk6XG4gKiAtIFJ1bnRpbWUgY29kZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvY2xzeC9ibG9iL3YxLjIuMS9zcmMvaW5kZXguanNcbiAqIC0gVHlwZVNjcmlwdCB0eXBlcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvY2xzeC9ibG9iL3YxLjIuMS9jbHN4LmQudHNcbiAqXG4gKiBPcmlnaW5hbCBjb2RlIGhhcyBNSVQgbGljZW5zZTogQ29weXJpZ2h0IChjKSBMdWtlIEVkd2FyZHMgPGx1a2UuZWR3YXJkczA1QGdtYWlsLmNvbT4gKGx1a2VlZC5jb20pXG4gKi9cbmZ1bmN0aW9uIHR3Sm9pbigpIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGFyZ3VtZW50O1xuICBsZXQgcmVzb2x2ZWRWYWx1ZTtcbiAgbGV0IHN0cmluZyA9ICcnO1xuICB3aGlsZSAoaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgaWYgKGFyZ3VtZW50ID0gYXJndW1lbnRzW2luZGV4KytdKSB7XG4gICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9IHRvVmFsdWUoYXJndW1lbnQpKSB7XG4gICAgICAgIHN0cmluZyAmJiAoc3RyaW5nICs9ICcgJyk7XG4gICAgICAgIHN0cmluZyArPSByZXNvbHZlZFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5nO1xufVxuY29uc3QgdG9WYWx1ZSA9IG1peCA9PiB7XG4gIGlmICh0eXBlb2YgbWl4ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtaXg7XG4gIH1cbiAgbGV0IHJlc29sdmVkVmFsdWU7XG4gIGxldCBzdHJpbmcgPSAnJztcbiAgZm9yIChsZXQgayA9IDA7IGsgPCBtaXgubGVuZ3RoOyBrKyspIHtcbiAgICBpZiAobWl4W2tdKSB7XG4gICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9IHRvVmFsdWUobWl4W2tdKSkge1xuICAgICAgICBzdHJpbmcgJiYgKHN0cmluZyArPSAnICcpO1xuICAgICAgICBzdHJpbmcgKz0gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5mdW5jdGlvbiBjcmVhdGVUYWlsd2luZE1lcmdlKGNyZWF0ZUNvbmZpZ0ZpcnN0LCAuLi5jcmVhdGVDb25maWdSZXN0KSB7XG4gIGxldCBjb25maWdVdGlscztcbiAgbGV0IGNhY2hlR2V0O1xuICBsZXQgY2FjaGVTZXQ7XG4gIGxldCBmdW5jdGlvblRvQ2FsbCA9IGluaXRUYWlsd2luZE1lcmdlO1xuICBmdW5jdGlvbiBpbml0VGFpbHdpbmRNZXJnZShjbGFzc0xpc3QpIHtcbiAgICBjb25zdCBjb25maWcgPSBjcmVhdGVDb25maWdSZXN0LnJlZHVjZSgocHJldmlvdXNDb25maWcsIGNyZWF0ZUNvbmZpZ0N1cnJlbnQpID0+IGNyZWF0ZUNvbmZpZ0N1cnJlbnQocHJldmlvdXNDb25maWcpLCBjcmVhdGVDb25maWdGaXJzdCgpKTtcbiAgICBjb25maWdVdGlscyA9IGNyZWF0ZUNvbmZpZ1V0aWxzKGNvbmZpZyk7XG4gICAgY2FjaGVHZXQgPSBjb25maWdVdGlscy5jYWNoZS5nZXQ7XG4gICAgY2FjaGVTZXQgPSBjb25maWdVdGlscy5jYWNoZS5zZXQ7XG4gICAgZnVuY3Rpb25Ub0NhbGwgPSB0YWlsd2luZE1lcmdlO1xuICAgIHJldHVybiB0YWlsd2luZE1lcmdlKGNsYXNzTGlzdCk7XG4gIH1cbiAgZnVuY3Rpb24gdGFpbHdpbmRNZXJnZShjbGFzc0xpc3QpIHtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBjYWNoZUdldChjbGFzc0xpc3QpO1xuICAgIGlmIChjYWNoZWRSZXN1bHQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlQ2xhc3NMaXN0KGNsYXNzTGlzdCwgY29uZmlnVXRpbHMpO1xuICAgIGNhY2hlU2V0KGNsYXNzTGlzdCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjYWxsVGFpbHdpbmRNZXJnZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub0NhbGwodHdKb2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuY29uc3QgZnJvbVRoZW1lID0ga2V5ID0+IHtcbiAgY29uc3QgdGhlbWVHZXR0ZXIgPSB0aGVtZSA9PiB0aGVtZVtrZXldIHx8IFtdO1xuICB0aGVtZUdldHRlci5pc1RoZW1lR2V0dGVyID0gdHJ1ZTtcbiAgcmV0dXJuIHRoZW1lR2V0dGVyO1xufTtcbmNvbnN0IGFyYml0cmFyeVZhbHVlUmVnZXggPSAvXlxcWyg/OihcXHdbXFx3LV0qKTopPyguKylcXF0kL2k7XG5jb25zdCBhcmJpdHJhcnlWYXJpYWJsZVJlZ2V4ID0gL15cXCgoPzooXFx3W1xcdy1dKik6KT8oLispXFwpJC9pO1xuY29uc3QgZnJhY3Rpb25SZWdleCA9IC9eXFxkK1xcL1xcZCskLztcbmNvbnN0IHRzaGlydFVuaXRSZWdleCA9IC9eKFxcZCsoXFwuXFxkKyk/KT8oeHN8c218bWR8bGd8eGwpJC87XG5jb25zdCBsZW5ndGhVbml0UmVnZXggPSAvXFxkKyglfHB4fHI/ZW18W3NkbF0/dihbaHdpYl18bWlufG1heCl8cHR8cGN8aW58Y218bW18Y2FwfGNofGV4fHI/bGh8Y3Eod3xofGl8YnxtaW58bWF4KSl8XFxiKGNhbGN8bWlufG1heHxjbGFtcClcXCguK1xcKXxeMCQvO1xuY29uc3QgY29sb3JGdW5jdGlvblJlZ2V4ID0gL14ocmdiYT98aHNsYT98aHdifChvayk/KGxhYnxsY2gpfGNvbG9yLW1peClcXCguK1xcKSQvO1xuLy8gU2hhZG93IGFsd2F5cyBiZWdpbnMgd2l0aCB4IGFuZCB5IG9mZnNldCBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZSBvcHRpb25hbGx5IHByZXBlbmRlZCBieSBpbnNldFxuY29uc3Qgc2hhZG93UmVnZXggPSAvXihpbnNldF8pPy0/KChcXGQrKT9cXC4/KFxcZCspW2Etel0rfDApXy0/KChcXGQrKT9cXC4/KFxcZCspW2Etel0rfDApLztcbmNvbnN0IGltYWdlUmVnZXggPSAvXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVxcKC4rXFwpJC87XG5jb25zdCBpc0ZyYWN0aW9uID0gdmFsdWUgPT4gZnJhY3Rpb25SZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4gISF2YWx1ZSAmJiAhTnVtYmVyLmlzTmFOKE51bWJlcih2YWx1ZSkpO1xuY29uc3QgaXNJbnRlZ2VyID0gdmFsdWUgPT4gISF2YWx1ZSAmJiBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcih2YWx1ZSkpO1xuY29uc3QgaXNQZXJjZW50ID0gdmFsdWUgPT4gdmFsdWUuZW5kc1dpdGgoJyUnKSAmJiBpc051bWJlcih2YWx1ZS
251145zbGljZSgwLCAtMSkpO1xuY29uc3QgaXNUc2hpcnRTaXplID0gdmFsdWUgPT4gdHNoaXJ0VW5pdFJlZ2V4LnRlc3QodmFsdWUpO1xuY29uc3QgaXNBbnkgPSAoKSA9PiB0cnVlO1xuY29uc3QgaXNMZW5ndGhPbmx5ID0gdmFsdWUgPT5cbi8vIGBjb2xvckZ1bmN0aW9uUmVnZXhgIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNvbG9yIGZ1bmN0aW9ucyBjYW4gaGF2ZSBwZXJjZW50YWdlcyBpbiB0aGVtIHdoaWNoIHdoaWNoIHdvdWxkIGJlIGluY29ycmVjdGx5IGNsYXNzaWZpZWQgYXMgbGVuZ3Rocy5cbi8vIEZvciBleGFtcGxlLCBgaHNsKDAgMCUgMCUpYCB3b3VsZCBiZSBjbGFzc2lmaWVkIGFzIGEgbGVuZ3RoIHdpdGhvdXQgdGhpcyBjaGVjay5cbi8vIEkgY291bGQgYWxzbyB1c2UgbG9va2JlaGluZCBhc3NlcnRpb24gaW4gYGxlbmd0aFVuaXRSZWdleGAgYnV0IHRoYXQgaXNuJ3Qgc3VwcG9ydGVkIHdpZGVseSBlbm91Z2guXG5sZW5ndGhVbml0UmVnZXgudGVzdCh2YWx1ZSkgJiYgIWNvbG9yRnVuY3Rpb25SZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzTmV2ZXIgPSAoKSA9PiBmYWxzZTtcbmNvbnN0IGlzU2hhZG93ID0gdmFsdWUgPT4gc2hhZG93UmVnZXgudGVzdCh2YWx1ZSk7XG5jb25zdCBpc0ltYWdlID0gdmFsdWUgPT4gaW1hZ2VSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzQW55Tm9uQXJiaXRyYXJ5ID0gdmFsdWUgPT4gIWlzQXJiaXRyYXJ5VmFsdWUodmFsdWUpICYmICFpc0FyYml0cmFyeVZhcmlhYmxlKHZhbHVlKTtcbmNvbnN0IGlzQXJiaXRyYXJ5U2l6ZSA9IHZhbHVlID0+IGdldElzQXJiaXRyYXJ5VmFsdWUodmFsdWUsIGlzTGFiZWxTaXplLCBpc05ldmVyKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFsdWUgPSB2YWx1ZSA9PiBhcmJpdHJhcnlWYWx1ZVJlZ2V4LnRlc3QodmFsdWUpO1xuY29uc3QgaXNBcmJpdHJhcnlMZW5ndGggPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsTGVuZ3RoLCBpc0xlbmd0aE9ubHkpO1xuY29uc3QgaXNBcmJpdHJhcnlOdW1iZXIgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsTnVtYmVyLCBpc051bWJlcik7XG5jb25zdCBpc0FyYml0cmFyeVBvc2l0aW9uID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYWx1ZSh2YWx1ZSwgaXNMYWJlbFBvc2l0aW9uLCBpc05ldmVyKTtcbmNvbnN0IGlzQXJiaXRyYXJ5SW1hZ2UgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsSW1hZ2UsIGlzSW1hZ2UpO1xuY29uc3QgaXNBcmJpdHJhcnlTaGFkb3cgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhbHVlKHZhbHVlLCBpc0xhYmVsU2hhZG93LCBpc1NoYWRvdyk7XG5jb25zdCBpc0FyYml0cmFyeVZhcmlhYmxlID0gdmFsdWUgPT4gYXJiaXRyYXJ5VmFyaWFibGVSZWdleC50ZXN0KHZhbHVlKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVMZW5ndGggPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhcmlhYmxlKHZhbHVlLCBpc0xhYmVsTGVuZ3RoKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVGYW1pbHlOYW1lID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbEZhbWlseU5hbWUpO1xuY29uc3QgaXNBcmJpdHJhcnlWYXJpYWJsZVBvc2l0aW9uID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbFBvc2l0aW9uKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVTaXplID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbFNpemUpO1xuY29uc3QgaXNBcmJpdHJhcnlWYXJpYWJsZUltYWdlID0gdmFsdWUgPT4gZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSh2YWx1ZSwgaXNMYWJlbEltYWdlKTtcbmNvbnN0IGlzQXJiaXRyYXJ5VmFyaWFibGVTaGFkb3cgPSB2YWx1ZSA9PiBnZXRJc0FyYml0cmFyeVZhcmlhYmxlKHZhbHVlLCBpc0xhYmVsU2hhZG93LCB0cnVlKTtcbi8vIEhlbHBlcnNcbmNvbnN0IGdldElzQXJiaXRyYXJ5VmFsdWUgPSAodmFsdWUsIHRlc3RMYWJlbCwgdGVzdFZhbHVlKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGFyYml0cmFyeVZhbHVlUmVnZXguZXhlYyh2YWx1ZSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBpZiAocmVzdWx0WzFdKSB7XG4gICAgICByZXR1cm4gdGVzdExhYmVsKHJlc3VsdFsxXSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0VmFsdWUocmVzdWx0WzJdKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgZ2V0SXNBcmJpdHJhcnlWYXJpYWJsZSA9ICh2YWx1ZSwgdGVzdExhYmVsLCBzaG91bGRNYXRjaE5vTGFiZWwgPSBmYWxzZSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhcmJpdHJhcnlWYXJpYWJsZVJlZ2V4LmV4ZWModmFsdWUpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdFsxXSkge1xuICAgICAgcmV0dXJuIHRlc3RMYWJlbChyZXN1bHRbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkTWF0Y2hOb0xhYmVsO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG4vLyBMYWJlbHNcbmNvbnN0IGlzTGFiZWxQb3NpdGlvbiA9IGxhYmVsID0+IGxhYmVsID09PSAncG9zaXRpb24nIHx8IGxhYmVsID09PSAncGVyY2VudGFnZSc7XG5jb25zdCBpc0xhYmVsSW1hZ2UgPSBsYWJlbCA9PiBsYWJlbCA9PT0gJ2ltYWdlJyB8fCBsYWJlbCA9PT0gJ3VybCc7XG5jb25zdCBpc0xhYmVsU2l6ZSA9IGxhYmVsID0+IGxhYmVsID09PSAnbGVuZ3RoJyB8fCBsYWJlbCA9PT0gJ3NpemUnIHx8IGxhYmVsID09PSAnYmctc2l6ZSc7XG5jb25zdCBpc0xhYmVsTGVuZ3RoID0gbGFiZWwgPT4gbGFiZWwgPT09ICdsZW5ndGgnO1xuY29uc3QgaXNMYWJlbE51bWJlciA9IGxhYmVsID0+IGxhYmVsID09PSAnbnVtYmVyJztcbmNvbnN0IGlzTGFiZWxGYW1pbHlOYW1lID0gbGFiZWwgPT4gbGFiZWwgPT09ICdmYW1pbHktbmFtZSc7XG5jb25zdCBpc0xhYmVsU2hhZG93ID0gbGFiZWwgPT4gbGFiZWwgPT09ICdzaGFkb3cnO1xuY29uc3QgdmFsaWRhdG9ycyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIGlzQW55LFxuICBpc0FueU5vbkFyYml0cmFyeSxcbiAgaXNBcmJpdHJhcnlJbWFnZSxcbiAgaXNBcmJpdHJhcnlMZW5ndGgsXG4gIGlzQXJiaXRyYXJ5TnVtYmVyLFxuICBpc0FyYml0cmFyeVBvc2l0aW9uLFxuICBpc0FyYml0cmFyeVNoYWRvdyxcbiAgaXNBcmJpdHJhcnlTaXplLFxuICBpc0FyYml0cmFyeVZhbHVlLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlRmFtaWx5TmFtZSxcbiAgaXNBcmJpdHJhcnlWYXJpYWJsZUltYWdlLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlTGVuZ3RoLFxuICBpc0FyYml0cmFyeVZhcmlhYmxlUG9zaXRpb24sXG4gIGlzQXJiaXRyYXJ5VmFyaWFibGVTaGFkb3csXG4gIGlzQXJiaXRyYXJ5VmFyaWFibGVTaXplLFxuICBpc0ZyYWN0aW9uLFxuICBpc0ludGVnZXIsXG4gIGlzTnVtYmVyLFxuICBpc1BlcmNlbnQsXG4gIGlzVHNoaXJ0U2l6ZVxufSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gIHZhbHVlOiAnTW9kdWxlJ
251141xufSk7XG5jb25zdCBnZXREZWZhdWx0Q29uZmlnID0gKCkgPT4ge1xuICAvKipcbiAgICogVGhlbWUgZ2V0dGVycyBmb3IgdGhlbWUgdmFyaWFibGUgbmFtZXNwYWNlc1xuICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGhlbWUjdGhlbWUtdmFyaWFibGUtbmFtZXNwYWNlc1xuICAgKi9cbiAgLyoqKi9cbiAgY29uc3QgdGhlbWVDb2xvciA9IGZyb21UaGVtZSgnY29sb3InKTtcbiAgY29uc3QgdGhlbWVGb250ID0gZnJvbVRoZW1lKCdmb250Jyk7XG4gIGNvbnN0IHRoZW1lVGV4dCA9IGZyb21UaGVtZSgndGV4dCcpO1xuICBjb25zdCB0aGVtZUZvbnRXZWlnaHQgPSBmcm9tVGhlbWUoJ2ZvbnQtd2VpZ2h0Jyk7XG4gIGNvbnN0IHRoZW1lVHJhY2tpbmcgPSBmcm9tVGhlbWUoJ3RyYWNraW5nJyk7XG4gIGNvbnN0IHRoZW1lTGVhZGluZyA9IGZyb21UaGVtZSgnbGVhZGluZycpO1xuICBjb25zdCB0aGVtZUJyZWFrcG9pbnQgPSBmcm9tVGhlbWUoJ2JyZWFrcG9pbnQnKTtcbiAgY29uc3QgdGhlbWVDb250YWluZXIgPSBmcm9tVGhlbWUoJ2NvbnRhaW5lcicpO1xuICBjb25zdCB0aGVtZVNwYWNpbmcgPSBmcm9tVGhlbWUoJ3NwYWNpbmcnKTtcbiAgY29uc3QgdGhlbWVSYWRpdXMgPSBmcm9tVGhlbWUoJ3JhZGl1cycpO1xuICBjb25zdCB0aGVtZVNoYWRvdyA9IGZyb21UaGVtZSgnc2hhZG93Jyk7XG4gIGNvbnN0IHRoZW1lSW5zZXRTaGFkb3cgPSBmcm9tVGhlbWUoJ2luc2V0LXNoYWRvdycpO1xuICBjb25zdCB0aGVtZVRleHRTaGFkb3cgPSBmcm9tVGhlbWUoJ3RleHQtc2hhZG93Jyk7XG4gIGNvbnN0IHRoZW1lRHJvcFNoYWRvdyA9IGZyb21UaGVtZSgnZHJvcC1zaGFkb3cnKTtcbiAgY29uc3QgdGhlbWVCbHVyID0gZnJvbVRoZW1lKCdibHVyJyk7XG4gIGNvbnN0IHRoZW1lUGVyc3BlY3RpdmUgPSBmcm9tVGhlbWUoJ3BlcnNwZWN0aXZlJyk7XG4gIGNvbnN0IHRoZW1lQXNwZWN0ID0gZnJvbVRoZW1lKCdhc3BlY3QnKTtcbiAgY29uc3QgdGhlbWVFYXNlID0gZnJvbVRoZW1lKCdlYXNlJyk7XG4gIGNvbnN0IHRoZW1lQW5pbWF0ZSA9IGZyb21UaGVtZSgnYW5pbWF0ZScpO1xuICAvKipcbiAgICogSGVscGVycyB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHNhbWUgc2NhbGVzXG4gICAqXG4gICAqIFdlIHVzZSBmdW5jdGlvbnMgdGhhdCBjcmVhdGUgYSBuZXcgYXJyYXkgZXZlcnkgdGltZSB0aGV5J3JlIGNhbGxlZCBpbnN0ZWFkIG9mIHN0YXRpYyBhcnJheXMuXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IHVzZXJzIHdobyBtb2RpZnkgYW55IHNjYWxlIGJ5IG11dGF0aW5nIHRoZSBhcnJheSAoZS5nLiB3aXRoIGBhcnJheS5wdXNoKGVsZW1lbnQpYCkgZG9uJ3QgYWNjaWRlbnRhbGx5IG11dGF0ZSBhcnJheXMgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvbmZpZy5cbiAgICovXG4gIC8qKiovXG4gIGNvbnN0IHNjYWxlQnJlYWsgPSAoKSA9PiBbJ2F1dG8nLCAnYXZvaWQnLCAnYWxsJywgJ2F2b2lkLXBhZ2UnLCAncGFnZScsICdsZWZ0JywgJ3JpZ2h0JywgJ2NvbHVtbiddO1xuICBjb25zdCBzY2FsZVBvc2l0aW9uID0gKCkgPT4gWydjZW50ZXInLCAndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcC1sZWZ0JyxcbiAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMS4wLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9wdWxsLzE3Mzc4XG4gICdsZWZ0LXRvcCcsICd0b3AtcmlnaHQnLFxuICAvLyBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4xLjAsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL3B1bGwvMTczNzhcbiAgJ3JpZ2h0LXRvcCcsICdib3R0b20tcmlnaHQnLFxuICAvLyBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4xLjAsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL3B1bGwvMTczNzhcbiAgJ3JpZ2h0LWJvdHRvbScsICdib3R0b20tbGVmdCcsXG4gIC8vIERlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjEuMCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MvcHVsbC8xNzM3OFxuICAnbGVmdC1ib3R0b20nXTtcbiAgY29uc3Qgc2NhbGVQb3NpdGlvbldpdGhBcmJpdHJhcnkgPSAoKSA9PiBbLi4uc2NhbGVQb3NpdGlvbigpLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXTtcbiAgY29uc3Qgc2NhbGVPdmVyZmxvdyA9ICgpID0+IFsnYXV0bycsICdoaWRkZW4nLCAnY2xpcCcsICd2aXNpYmxlJywgJ3Njcm9sbCddO1xuICBjb25zdCBzY2FsZU92ZXJzY3JvbGwgPSAoKSA9PiBbJ2F1dG8nLCAnY29udGFpbicsICdub25lJ107XG4gIGNvbnN0IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nID0gKCkgPT4gW2lzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWUsIHRoZW1lU3BhY2luZ107XG4gIGNvbnN0IHNjYWxlSW5zZXQgPSAoKSA9PiBbaXNGcmFjdGlvbiwgJ2Z1bGwnLCAnYXV0bycsIC4uLnNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKCldO1xuICBjb25zdCBzY2FsZUdyaWRUZW1wbGF0ZUNvbHNSb3dzID0gKCkgPT4gW2lzSW50ZWdlciwgJ25vbmUnLCAnc3ViZ3JpZCcsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZUdyaWRDb2xSb3dTdGFydEFuZEVuZCA9ICgpID0+IFsnYXV0bycsIHtcbiAgICBzcGFuOiBbJ2Z1bGwnLCBpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gIH0sIGlzSW50ZWdlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IHNjYWxlR3JpZENvbFJvd1N0YXJ0T3JFbmQgPSAoKSA9PiBbaXNJbnRlZ2VyLCAnYXV0bycsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZUdyaWRBdXRvQ29sc1Jvd3MgPSAoKSA9PiBbJ2F1dG8nLCAnbWluJywgJ21heCcsICdmcicsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZUFsaWduUHJpbWFyeUF4aXMgPSAoKSA9PiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYmV0d2VlbicsICdhcm91bmQnLCAnZXZlbmx5JywgJ3N0cmV0Y2gnLCAnYmFzZWxpbmUnLCAnY2VudGVyLXNhZmUnLCAnZW5kLXNhZmUnXTtcbiAgY29uc3Qgc2NhbGVBbGlnblNlY29uZGFyeUF4aXMgPSAoKSA9PiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnc3RyZXRjaCcsICdjZW50ZXItc2FmZScsICdlbmQtc2FmZSddO1xuICBjb25zdCBzY2FsZU1hcmdpbiA9ICgpID0+IFsnYXV0bycsIC4uLnNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKCldO1xuICBjb25zdCBzY2FsZVNpemluZyA9ICgpID0+IFtpc0ZyYWN0aW9uLCAnYXV0bycsICdmdWxsJywgJ2R2dycsICdkdmgnLCA
25114nbHZ3JywgJ2x2aCcsICdzdncnLCAnc3ZoJywgJ21pbicsICdtYXgnLCAnZml0JywgLi4uc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKV07XG4gIGNvbnN0IHNjYWxlQ29sb3IgPSAoKSA9PiBbdGhlbWVDb2xvciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IHNjYWxlQmdQb3NpdGlvbiA9ICgpID0+IFsuLi5zY2FsZVBvc2l0aW9uKCksIGlzQXJiaXRyYXJ5VmFyaWFibGVQb3NpdGlvbiwgaXNBcmJpdHJhcnlQb3NpdGlvbiwge1xuICAgIHBvc2l0aW9uOiBbaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgfV07XG4gIGNvbnN0IHNjYWxlQmdSZXBlYXQgPSAoKSA9PiBbJ25vLXJlcGVhdCcsIHtcbiAgICByZXBlYXQ6IFsnJywgJ3gnLCAneScsICdzcGFjZScsICdyb3VuZCddXG4gIH1dO1xuICBjb25zdCBzY2FsZUJnU2l6ZSA9ICgpID0+IFsnYXV0bycsICdjb3ZlcicsICdjb250YWluJywgaXNBcmJpdHJhcnlWYXJpYWJsZVNpemUsIGlzQXJiaXRyYXJ5U2l6ZSwge1xuICAgIHNpemU6IFtpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICB9XTtcbiAgY29uc3Qgc2NhbGVHcmFkaWVudFN0b3BQb3NpdGlvbiA9ICgpID0+IFtpc1BlcmNlbnQsIGlzQXJiaXRyYXJ5VmFyaWFibGVMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXTtcbiAgY29uc3Qgc2NhbGVSYWRpdXMgPSAoKSA9PiBbXG4gIC8vIERlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAnJywgJ25vbmUnLCAnZnVsbCcsIHRoZW1lUmFkaXVzLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXTtcbiAgY29uc3Qgc2NhbGVCb3JkZXJXaWR0aCA9ICgpID0+IFsnJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGVMZW5ndGgsIGlzQXJiaXRyYXJ5TGVuZ3RoXTtcbiAgY29uc3Qgc2NhbGVMaW5lU3R5bGUgPSAoKSA9PiBbJ3NvbGlkJywgJ2Rhc2hlZCcsICdkb3R0ZWQnLCAnZG91YmxlJ107XG4gIGNvbnN0IHNjYWxlQmxlbmRNb2RlID0gKCkgPT4gWydub3JtYWwnLCAnbXVsdGlwbHknLCAnc2NyZWVuJywgJ292ZXJsYXknLCAnZGFya2VuJywgJ2xpZ2h0ZW4nLCAnY29sb3ItZG9kZ2UnLCAnY29sb3ItYnVybicsICdoYXJkLWxpZ2h0JywgJ3NvZnQtbGlnaHQnLCAnZGlmZmVyZW5jZScsICdleGNsdXNpb24nLCAnaHVlJywgJ3NhdHVyYXRpb24nLCAnY29sb3InLCAnbHVtaW5vc2l0eSddO1xuICBjb25zdCBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uID0gKCkgPT4gW2lzTnVtYmVyLCBpc1BlcmNlbnQsIGlzQXJiaXRyYXJ5VmFyaWFibGVQb3NpdGlvbiwgaXNBcmJpdHJhcnlQb3NpdGlvbl07XG4gIGNvbnN0IHNjYWxlQmx1ciA9ICgpID0+IFtcbiAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMC4wXG4gICcnLCAnbm9uZScsIHRoZW1lQmx1ciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV07XG4gIGNvbnN0IHNjYWxlUm90YXRlID0gKCkgPT4gWydub25lJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZVNjYWxlID0gKCkgPT4gWydub25lJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZVNrZXcgPSAoKSA9PiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdO1xuICBjb25zdCBzY2FsZVRyYW5zbGF0ZSA9ICgpID0+IFtpc0ZyYWN0aW9uLCAnZnVsbCcsIC4uLnNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKCldO1xuICByZXR1cm4ge1xuICAgIGNhY2hlU2l6ZTogNTAwLFxuICAgIHRoZW1lOiB7XG4gICAgICBhbmltYXRlOiBbJ3NwaW4nLCAncGluZycsICdwdWxzZScsICdib3VuY2UnXSxcbiAgICAgIGFzcGVjdDogWyd2aWRlbyddLFxuICAgICAgYmx1cjogW2lzVHNoaXJ0U2l6ZV0sXG4gICAgICBicmVha3BvaW50OiBbaXNUc2hpcnRTaXplXSxcbiAgICAgIGNvbG9yOiBbaXNBbnldLFxuICAgICAgY29udGFpbmVyOiBbaXNUc2hpcnRTaXplXSxcbiAgICAgICdkcm9wLXNoYWRvdyc6IFtpc1RzaGlydFNpemVdLFxuICAgICAgZWFzZTogWydpbicsICdvdXQnLCAnaW4tb3V0J10sXG4gICAgICBmb250OiBbaXNBbnlOb25BcmJpdHJhcnldLFxuICAgICAgJ2ZvbnQtd2VpZ2h0JzogWyd0aGluJywgJ2V4dHJhbGlnaHQnLCAnbGlnaHQnLCAnbm9ybWFsJywgJ21lZGl1bScsICdzZW1pYm9sZCcsICdib2xkJywgJ2V4dHJhYm9sZCcsICdibGFjayddLFxuICAgICAgJ2luc2V0LXNoYWRvdyc6IFtpc1RzaGlydFNpemVdLFxuICAgICAgbGVhZGluZzogWydub25lJywgJ3RpZ2h0JywgJ3NudWcnLCAnbm9ybWFsJywgJ3JlbGF4ZWQnLCAnbG9vc2UnXSxcbiAgICAgIHBlcnNwZWN0aXZlOiBbJ2RyYW1hdGljJywgJ25lYXInLCAnbm9ybWFsJywgJ21pZHJhbmdlJywgJ2Rpc3RhbnQnLCAnbm9uZSddLFxuICAgICAgcmFkaXVzOiBbaXNUc2hpcnRTaXplXSxcbiAgICAgIHNoYWRvdzogW2lzVHNoaXJ0U2l6ZV0sXG4gICAgICBzcGFjaW5nOiBbJ3B4JywgaXNOdW1iZXJdLFxuICAgICAgdGV4dDogW2lzVHNoaXJ0U2l6ZV0sXG4gICAgICAndGV4dC1zaGFkb3cnOiBbaXNUc2hpcnRTaXplXSxcbiAgICAgIHRyYWNraW5nOiBbJ3RpZ2h0ZXInLCAndGlnaHQnLCAnbm9ybWFsJywgJ3dpZGUnLCAnd2lkZXInLCAnd2lkZXN0J11cbiAgICB9LFxuICAgIGNsYXNzR3JvdXBzOiB7XG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gLS0tIExheW91dCAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEFzcGVjdCBSYXRpb1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FzcGVjdC1yYXRpb1xuICAgICAgICovXG4gICAgICBhc3BlY3Q6IFt7XG4gICAgICAgIGFzcGVjdDogWydhdXRvJywgJ3NxdWFyZScsIGlzRnJhY3Rpb24sIGlzQXJiaXRyYXJ5VmFsdWUsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIHRoZW1lQXNwZWN0XVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIENvbnRhaW5lclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NvbnRhaW5lclxuICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICovXG4gICAgICBjb250YWluZXI6IFsnY29udGFpbmVyJ10sXG4gICAgICAvKipcbiAgICAgICAqIENvbHVtbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jb2x1bW5zXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbnM6IFt7XG4gICAgICAgIGNvbHVtbnM6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYWx1ZSwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgdGhlbWVDb250YWluZXJdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQnJlYWsgQWZ0ZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1hZnRlclxuICAgICAgICovXG4gICAgICAnYnJlYWstYWZ0ZXInOiBbe1xuICAgICAgICAnYnJlYWstYWZ0ZXInOiBzY2FsZUJyZWFrKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmVhayBCZWZvcmVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1iZWZvcmVcbiAgICAgICAqL1xuICAgICAgJ2JyZWFrLWJlZm9yZSc6IFt7XG4gICAgICAgICdicmVhay1iZWZvcmUnOiBzY2FsZUJyZWFrKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmVhayBJbnNpZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9icmVhay1pbnNpZGVcbiAgICAgICAqL1xuICAgICAgJ2JyZWFrLWluc2lkZSc6IFt7XG4gICAgICAgICdicmVhay1pbnNpZGUnOiBbJ2F1dG8nLCAnYXZvaWQnLCAnYXZvaWQtcGFnZScsICdhdm9pZC1jb2x1bW4nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJveCBEZWNvcmF0aW9uIEJyZWFrXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LWRlY29yYXRpb24tYnJlYWtcbiAgICAgICAqL1xuICAgICAgJ2JveC1kZWNvcmF0aW9uJzogW3tcbiAgICAgICAgJ2JveC1kZWNvcmF0aW9uJzogWydzbGljZScsICdjbG9uZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm94IFNpemluZ1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JveC1zaXppbmdcbiAgICAgICAqL1xuICAgICAgYm94OiBbe1xuICAgICAgICBib3g6IFsnYm9yZGVyJywgJ2NvbnRlbnQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpc3BsYXlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9kaXNwbGF5XG4gICAgICAgKi9cbiAgICAgIGRpc3BsYXk6IFsnYmxvY2snLCAnaW5saW5lLWJsb2NrJywgJ2lubGluZScsICdmbGV4JywgJ2lubGluZS1mbGV4JywgJ3RhYmxlJywgJ2lubGluZS10YWJsZScsICd0YWJsZS1jYXB0aW9uJywgJ3RhYmxlLWNlbGwnLCAndGFibGUtY29sdW1uJywgJ3RhYmxlLWNvbHVtbi1ncm91cCcsICd0YWJsZS1mb290ZXItZ3JvdXAnLCAndGFibGUtaGVhZGVyLWdyb3VwJywgJ3RhYmxlLXJvdy1ncm91cCcsICd0YWJsZS1yb3cnLCAnZmxvdy1yb290JywgJ2dyaWQnLCAnaW5saW5lLWdyaWQnLCAnY29udGVudHMnLCAnbGlzdC1pdGVtJywgJ2hpZGRlbiddLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JlZW4gUmVhZGVyIE9ubHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9kaXNwbGF5I3
25114NjcmVlbi1yZWFkZXItb25seVxuICAgICAgICovXG4gICAgICBzcjogWydzci1vbmx5JywgJ25vdC1zci1vbmx5J10sXG4gICAgICAvKipcbiAgICAgICAqIEZsb2F0c1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2Zsb2F0XG4gICAgICAgKi9cbiAgICAgIGZsb2F0OiBbe1xuICAgICAgICBmbG9hdDogWydyaWdodCcsICdsZWZ0JywgJ25vbmUnLCAnc3RhcnQnLCAnZW5kJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2NsZWFyXG4gICAgICAgKi9cbiAgICAgIGNsZWFyOiBbe1xuICAgICAgICBjbGVhcjogWydsZWZ0JywgJ3JpZ2h0JywgJ2JvdGgnLCAnbm9uZScsICdzdGFydCcsICdlbmQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIElzb2xhdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2lzb2xhdGlvblxuICAgICAgICovXG4gICAgICBpc29sYXRpb246IFsnaXNvbGF0ZScsICdpc29sYXRpb24tYXV0byddLFxuICAgICAgLyoqXG4gICAgICAgKiBPYmplY3QgRml0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb2JqZWN0LWZpdFxuICAgICAgICovXG4gICAgICAnb2JqZWN0LWZpdCc6IFt7XG4gICAgICAgIG9iamVjdDogWydjb250YWluJywgJ2NvdmVyJywgJ2ZpbGwnLCAnbm9uZScsICdzY2FsZS1kb3duJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPYmplY3QgUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vYmplY3QtcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgJ29iamVjdC1wb3NpdGlvbic6IFt7XG4gICAgICAgIG9iamVjdDogc2NhbGVQb3NpdGlvbldpdGhBcmJpdHJhcnkoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJmbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgb3ZlcmZsb3c6IFt7XG4gICAgICAgIG92ZXJmbG93OiBzY2FsZU92ZXJmbG93KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyZmxvdyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3ZlcmZsb3dcbiAgICAgICAqL1xuICAgICAgJ292ZXJmbG93LXgnOiBbe1xuICAgICAgICAnb3ZlcmZsb3cteCc6IHNjYWxlT3ZlcmZsb3coKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJmbG93IFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyZmxvd1xuICAgICAgICovXG4gICAgICAnb3ZlcmZsb3cteSc6IFt7XG4gICAgICAgICdvdmVyZmxvdy15Jzogc2NhbGVPdmVyZmxvdygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnNjcm9sbCBCZWhhdmlvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL292ZXJzY3JvbGwtYmVoYXZpb3JcbiAgICAgICAqL1xuICAgICAgb3ZlcnNjcm9sbDogW3tcbiAgICAgICAgb3ZlcnNjcm9sbDogc2NhbGVPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyc2Nyb2xsIEJlaGF2aW9yIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyc2Nyb2xsLWJlaGF2aW9yXG4gICAgICAgKi9cbiAgICAgICdvdmVyc2Nyb2xsLXgnOiBbe1xuICAgICAgICAnb3ZlcnNjcm9sbC14Jzogc2NhbGVPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVyc2Nyb2xsIEJlaGF2aW9yIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdmVyc2Nyb2xsLWJlaGF2aW9yXG4gICAgICAgKi9cbiAgICAgICdvdmVyc2Nyb2xsLXknOiBbe1xuICAgICAgICAnb3ZlcnNjcm9sbC15Jzogc2NhbGVPdmVyc2Nyb2xsKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Bvc2l0aW9uXG4gICAgICAgKi9cbiAgICAgIHBvc2l0aW9uOiBbJ3N0YXRpYycsICdmaXhlZCcsICdhYnNvbHV0ZScsICdyZWxhdGl2ZScsICdzdGlja3knXSxcbiAgICAgIC8qKlxuICAgICAgICogVG9wIC8gUmlnaHQgLyBCb3R0b20gLyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGluc2V0OiBbe1xuICAgICAgICBpbnNldDogc2NhbGVJbnNldCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUmlnaHQgLyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgICdpbnNldC14JzogW3tcbiAgICAgICAgJ2luc2V0LXgnOiBzY2FsZUluc2V0KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3AgLyBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXknOiBbe1xuICAgICAgICAnaW5zZXQteSc6IHNjYWxlSW5zZXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIHN0YXJ0OiBbe1xuICAgICAgICBzdGFydDogc2NhbGVJbnNldCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGVuZDogW3tcbiAgICAgICAgZW5kOiBzY2FsZUluc2V0KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3BcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3AtcmlnaHQtYm90dG9tLWxlZnRcbiAgICAgICAqL1xuICAgICAgdG9wOiBbe1xuICAgICAgICB0b3A6IHNjYWxlSW5zZXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIHJpZ2h0OiBbe1xuICAgICAgICByaWdodDogc2NhbGVJbnNldCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGJvdHRvbTogW3tcbiAgICAgICAgYm90dG9tOiBzY2FsZUluc2V0KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG9wLXJpZ2h0LWJvdHRvbS1sZWZ0XG4gICAgICAgKi9cbiAgICAgIGxlZnQ6IFt7XG4gICAgICAgIGxlZnQ6IHNjYWxlSW5zZXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFZpc2liaWxpdHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy92aXNpYmlsaXR5XG4gICAgICAgKi9cbiAgICAgIHZpc2liaWxpdHk6IFsndmlzaWJsZScsICdpbnZpc2libGUnLCAnY29sbGFwc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogWi1JbmRleFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3otaW5kZXhcbiAgICAgICAqL1xuICAgICAgejogW3tcbiAgICAgICAgejogW2lzSW50ZWdlciwgJ2F1dG8nLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBGbGV4Ym94IGFuZCBHcmlkIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggQmFzaXNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mbGV4LWJhc2lzXG4gICAgICAgKi9cbiAgICAgIGJhc2lzOiBbe1xuICAgICAgICBiYXNpczogW2lzRnJhY3Rpb24sICdmdWxsJywgJ2F1dG8nLCB0aGVtZUNvbnRhaW5lciwgLi4uc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGbGV4IERpcmVjdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXgtZGlyZWN0aW9uXG4gICAgICAgKi9cbiAgICAgICdmbGV4LWRpcmVjdGlvbic6IFt7XG4gICAgICAgIGZsZXg6IFsncm93JywgJ3Jvdy1yZXZlcnNlJywgJ2NvbCcsICdjb2wtcmV2ZXJzZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRmxleCBXcmFwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleC13cmFwXG4gICAgICAgKi9cbiAgICAgICdmbGV4LXdyYXAnOiBbe1xuICAgICAgICBmbGV4OiBbJ25vd3JhcCcsICd3cmFwJywgJ3dyYXAtcmV2ZXJzZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRmxleFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXhcbiAgICAgICAqL1xuICAgICAgZmxleDogW3tcbiAgICAgICAgZmxleDogW2lzTnVtYmVyLCBpc0ZyYWN0aW9uLCAnYXV0bycsICdpbml0aWFsJywgJ25vbmUnLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggR3Jvd1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZsZXgtZ3Jvd1xuICAgICAgICovXG4gICAgICBncm93OiBbe1xuICAgICAgICBncm93OiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZsZXggU2hyaW5rXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmxleC1zaHJpbmtcbiAgICAgICAqL1xuICAgICAgc2hyaW5rOiBbe1xuICAgICAgICBzaHJpbms6IFsnJywgaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3JkZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vcmRlclxuICAgICAgICovXG4gICAgICBvcmRlcjogW3tcbiAgICAgICAgb3JkZXI6IFtpc0ludGVnZXIsICdmaXJzdCcsICdsYXN0JywgJ25vbmUnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgVGVtcGxhdGUgQ29sdW1uc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtdGVtcGxhdGUtY29sdW1uc1xuICAgICAgICovXG4gICAgICAnZ3JpZC1jb2xzJzogW3tcbiAgICAgICAgJ2dyaWQtY29scyc6IHNjYWxlR3JpZFRlbXBsYXRlQ29sc1Jvd3MoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgQ29sdW1uIFN0YXJ0IC8gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1jb2x1bW5cbiAgICAgICAqL1xuICAgICAgJ2NvbC1zdGFydC1lbmQnOiBbe1xuICAgICAgICBjb2w6IHNjYWxlR3JpZENvbFJvd1N0YXJ0QW5kRW5kKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIENvbHVtbiBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtY29sdW1uXG4gICAgICAgKi9cbiAgICAgICdjb2wtc3RhcnQnOiBbe1xuICAgICAgICAnY29sLXN0YXJ0Jzogc2NhbGVHcmlkQ29sUm93U3RhcnRPckVuZCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBDb2x1bW4gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1jb2x1bW5cbiAgICAgICAqL1xuICAgICAgJ2NvbC1lbmQnOiBbe1xuICAgICAgICAnY29sLWVuZCc6IHNjYWxlR3JpZENvbFJvd1N0YXJ0T3JFbmQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgVGVtcGxhdGUgUm93c1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtdGVtcGxhdGUtcm93c1xuICAgICAgICovXG4gICAgICAnZ3JpZC1yb3dzJzogW3tcbiAgICAgICAgJ2dyaWQtcm93cyc6IHNjYWxlR3JpZFRlbXBsYXRlQ29sc1Jvd3MoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgUm93IFN0YXJ0IC8gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1yb3dcbiAgICAgICAqL1xuICAgICAgJ3Jvdy1zdGFydC1lbmQnOiBbe1xuICAgICAgICByb3c6IHNjYWxlR3JpZENvbFJvd1N0YXJ0QW5kRW5kKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmlkIFJvdyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyaWQtcm93XG4gICAgICAgKi9cbiAgICAgICdyb3ctc3RhcnQnOiBbe1xuICAgICAgICAncm93LXN0YXJ0Jzogc2NhbGVHcmlkQ29sUm93U3RhcnRPckVuZCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBSb3cgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1yb3dcbiAgICAgICAqL1xuICAgICAgJ3Jvdy1lbmQnOiBbe1xuICAgICAgICAncm93LWVuZCc6IHNjYWxlR3JpZENvbFJvd1N0YXJ0T3JFbmQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyaWQgQXV0byBGbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JpZC1hdXRvLWZsb3dcbiAgICAgICAqL1xuICAgICAgJ2dyaWQtZmxvdyc6IFt7XG4gICAgICAgICdncmlkLWZsb3cnOiBbJ3JvdycsICdjb2wnLCAnZGVuc2UnLCAncm93LWRlbnNlJywgJ2NvbC1kZW5zZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBBdXRvIENvbHVtbnNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLWF1dG8tY29sdW1uc1xuICAgICAgICovXG4gICAgICAnYXV0by1jb2xzJzogW3tcbiAgICAgICAgJ2F1dG8tY29scyc6IHNjYWxlR3JpZEF1dG9Db2xzUm93cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JpZCBBdXRvIFJvd3NcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmlkLWF1dG8tcm93c1xuICAgICAgICovXG4gICAgICAnYXV0by1yb3dzJzogW3tcbiAgICAgICAgJ2F1dG8tcm93cyc6IHNjYWxlR3JpZEF1dG9Db2xzUm93cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR2FwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ2FwXG4gICAgICAgKi9cbiAgICAgIGdhcDogW3tcbiAgICAgICAgZ2FwOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR2FwIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9nYXBcbiAgICAgICAqL1xuICAgICAgJ2dhcC14JzogW3tcbiAgICAgICAgJ2dhcC14Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdhcCBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ2FwXG4gICAgICAgKi9cbiAgICAgICdnYXAteSc6IFt7XG4gICAgICAgICdnYXAteSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBKdXN0aWZ5IENvbnRlbnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9qdXN0aWZ5LWNvbnRlbn
25114RcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktY29udGVudCc6IFt7XG4gICAgICAgIGp1c3RpZnk6IFsuLi5zY2FsZUFsaWduUHJpbWFyeUF4aXMoKSwgJ25vcm1hbCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSnVzdGlmeSBJdGVtc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2p1c3RpZnktaXRlbXNcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktaXRlbXMnOiBbe1xuICAgICAgICAnanVzdGlmeS1pdGVtcyc6IFsuLi5zY2FsZUFsaWduU2Vjb25kYXJ5QXhpcygpLCAnbm9ybWFsJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBKdXN0aWZ5IFNlbGZcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9qdXN0aWZ5LXNlbGZcbiAgICAgICAqL1xuICAgICAgJ2p1c3RpZnktc2VsZic6IFt7XG4gICAgICAgICdqdXN0aWZ5LXNlbGYnOiBbJ2F1dG8nLCAuLi5zY2FsZUFsaWduU2Vjb25kYXJ5QXhpcygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEFsaWduIENvbnRlbnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hbGlnbi1jb250ZW50XG4gICAgICAgKi9cbiAgICAgICdhbGlnbi1jb250ZW50JzogW3tcbiAgICAgICAgY29udGVudDogWydub3JtYWwnLCAuLi5zY2FsZUFsaWduUHJpbWFyeUF4aXMoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGlnbiBJdGVtc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2FsaWduLWl0ZW1zXG4gICAgICAgKi9cbiAgICAgICdhbGlnbi1pdGVtcyc6IFt7XG4gICAgICAgIGl0ZW1zOiBbLi4uc2NhbGVBbGlnblNlY29uZGFyeUF4aXMoKSwge1xuICAgICAgICAgIGJhc2VsaW5lOiBbJycsICdsYXN0J11cbiAgICAgICAgfV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGlnbiBTZWxmXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYWxpZ24tc2VsZlxuICAgICAgICovXG4gICAgICAnYWxpZ24tc2VsZic6IFt7XG4gICAgICAgIHNlbGY6IFsnYXV0bycsIC4uLnNjYWxlQWxpZ25TZWNvbmRhcnlBeGlzKCksIHtcbiAgICAgICAgICBiYXNlbGluZTogWycnLCAnbGFzdCddXG4gICAgICAgIH1dXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2UgQ29udGVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BsYWNlLWNvbnRlbnRcbiAgICAgICAqL1xuICAgICAgJ3BsYWNlLWNvbnRlbnQnOiBbe1xuICAgICAgICAncGxhY2UtY29udGVudCc6IHNjYWxlQWxpZ25QcmltYXJ5QXhpcygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2UgSXRlbXNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wbGFjZS1pdGVtc1xuICAgICAgICovXG4gICAgICAncGxhY2UtaXRlbXMnOiBbe1xuICAgICAgICAncGxhY2UtaXRlbXMnOiBbLi4uc2NhbGVBbGlnblNlY29uZGFyeUF4aXMoKSwgJ2Jhc2VsaW5lJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQbGFjZSBTZWxmXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGxhY2Utc2VsZlxuICAgICAgICovXG4gICAgICAncGxhY2Utc2VsZic6IFt7XG4gICAgICAgICdwbGFjZS1zZWxmJzogWydhdXRvJywgLi4uc2NhbGVBbGlnblNlY29uZGFyeUF4aXMoKV1cbiAgICAgIH1dLFxuICAgICAgLy8gU3BhY2luZ1xuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBwOiBbe1xuICAgICAgICBwOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBweDogW3tcbiAgICAgICAgcHg6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHB5OiBbe1xuICAgICAgICBweTogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHBzOiBbe1xuICAgICAgICBwczogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcGFkZGluZ1xuICAgICAgICovXG4gICAgICBwZTogW3tcbiAgICAgICAgcGU6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBQYWRkaW5nIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHQ6IFt7XG4gICAgICAgIHB0OiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcHI6IFt7XG4gICAgICAgIHByOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGFkZGluZyBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgIHBiOiBbe1xuICAgICAgICBwYjogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBhZGRpbmcgTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BhZGRpbmdcbiAgICAgICAqL1xuICAgICAgcGw6IFt7XG4gICAgICAgI
25114HBsOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG06IFt7XG4gICAgICAgIG06IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBteDogW3tcbiAgICAgICAgbXg6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBteTogW3tcbiAgICAgICAgbXk6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXJnaW5cbiAgICAgICAqL1xuICAgICAgbXM6IFt7XG4gICAgICAgIG1zOiBzY2FsZU1hcmdpbigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFyZ2luIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtZTogW3tcbiAgICAgICAgbWU6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG10OiBbe1xuICAgICAgICBtdDogc2NhbGVNYXJnaW4oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hcmdpbiBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpblxuICAgICAgICovXG4gICAgICBtcjogW3tcbiAgICAgICAgbXI6IHNjYWxlTWFyZ2luKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXJnaW4gQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG1iOiBbe1xuICAgICAgICBtYjogc2NhbGVNYXJnaW4oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hcmdpbiBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luXG4gICAgICAgKi9cbiAgICAgIG1sOiBbe1xuICAgICAgICBtbDogc2NhbGVNYXJnaW4oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNwYWNlIEJldHdlZW4gWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpbiNhZGRpbmctc3BhY2UtYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnc3BhY2UteCc6IFt7XG4gICAgICAgICdzcGFjZS14Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNwYWNlIEJldHdlZW4gWCBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFyZ2luI2FkZGluZy1zcGFjZS1iZXR3ZWVuLWNoaWxkcmVuXG4gICAgICAgKi9cbiAgICAgICdzcGFjZS14LXJldmVyc2UnOiBbJ3NwYWNlLXgtcmV2ZXJzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBTcGFjZSBCZXR3ZWVuIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXJnaW4jYWRkaW5nLXNwYWNlLWJldHdlZW4tY2hpbGRyZW5cbiAgICAgICAqL1xuICAgICAgJ3NwYWNlLXknOiBbe1xuICAgICAgICAnc3BhY2UteSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTcGFjZSBCZXR3ZWVuIFkgUmV2ZXJzZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hcmdpbiNhZGRpbmctc3BhY2UtYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnc3BhY2UteS1yZXZlcnNlJzogWydzcGFjZS15LXJldmVyc2UnXSxcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gU2l6aW5nIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8qKlxuICAgICAgICogU2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dpZHRoI3NldHRpbmctYm90aC13aWR0aC1hbmQtaGVpZ2h0XG4gICAgICAgKi9cbiAgICAgIHNpemU6IFt7XG4gICAgICAgIHNpemU6IHNjYWxlU2l6aW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBXaWR0aFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dpZHRoXG4gICAgICAgKi9cbiAgICAgIHc6IFt7XG4gICAgICAgIHc6IFt0aGVtZUNvbnRhaW5lciwgJ3NjcmVlbicsIC4uLnNjYWxlU2l6aW5nKCldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWluLVdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWluLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdtaW4tdyc6IFt7XG4gICAgICAgICdtaW4tdyc6IFt0aGVtZUNvbnRhaW5lciwgJ3NjcmVlbicsIC8qKiBEZXByZWNhdGVkLiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MuY29tL2lzc3Vlcy8yMDI3I2lzc3VlY29tbWVudC0yNjIwMTUyNzU3ICovXG4gICAgICAgICdub25lJywgLi4uc2NhbGVTaXppbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXgtV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXgtd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ21heC13JzogW3tcbiAgICAgICAgJ21heC13JzogW3RoZW1lQ29udGFpbmVyLCAnc2NyZWVuJywgJ25vbmUnLCAvKiogRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMC4wLiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGxhYnMvdGFpbHdpbmRjc3MuY29tL2lzc3Vlcy8yMDI3I2lzc3VlY29tbWVudC0yNjIwMTUyNzU3ICovXG4gICAgICAgICdwcm9zZScsIC8qKiBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4wLjAuIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy5jb20vaXNzdWVzLzIwMjcjaXNzdWVjb21tZW50LTI2MjAxNTI3NTcgKi9cbiAgICAgICAge1xuICAgICAgICAgI
25114HNjcmVlbjogW3RoZW1lQnJlYWtwb2ludF1cbiAgICAgICAgfSwgLi4uc2NhbGVTaXppbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBIZWlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9oZWlnaHRcbiAgICAgICAqL1xuICAgICAgaDogW3tcbiAgICAgICAgaDogWydzY3JlZW4nLCAnbGgnLCAuLi5zY2FsZVNpemluZygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1pbi1IZWlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9taW4taGVpZ2h0XG4gICAgICAgKi9cbiAgICAgICdtaW4taCc6IFt7XG4gICAgICAgICdtaW4taCc6IFsnc2NyZWVuJywgJ2xoJywgJ25vbmUnLCAuLi5zY2FsZVNpemluZygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1heC1IZWlnaHRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXgtaGVpZ2h0XG4gICAgICAgKi9cbiAgICAgICdtYXgtaCc6IFt7XG4gICAgICAgICdtYXgtaCc6IFsnc2NyZWVuJywgJ2xoJywgLi4uc2NhbGVTaXppbmcoKV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gVHlwb2dyYXBoeSAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFNpemVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXNpemVcbiAgICAgICAqL1xuICAgICAgJ2ZvbnQtc2l6ZSc6IFt7XG4gICAgICAgIHRleHQ6IFsnYmFzZScsIHRoZW1lVGV4dCwgaXNBcmJpdHJhcnlWYXJpYWJsZUxlbmd0aCwgaXNBcmJpdHJhcnlMZW5ndGhdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBTbW9vdGhpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXNtb290aGluZ1xuICAgICAgICovXG4gICAgICAnZm9udC1zbW9vdGhpbmcnOiBbJ2FudGlhbGlhc2VkJywgJ3N1YnBpeGVsLWFudGlhbGlhc2VkJ10sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgU3R5bGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdmb250LXN0eWxlJzogWydpdGFsaWMnLCAnbm90LWl0YWxpYyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFdlaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtd2VpZ2h0XG4gICAgICAgKi9cbiAgICAgICdmb250LXdlaWdodCc6IFt7XG4gICAgICAgIGZvbnQ6IFt0aGVtZUZvbnRXZWlnaHQsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5TnVtYmVyXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgU3RyZXRjaFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtc3RyZXRjaFxuICAgICAgICovXG4gICAgICAnZm9udC1zdHJldGNoJzogW3tcbiAgICAgICAgJ2ZvbnQtc3RyZXRjaCc6IFsndWx0cmEtY29uZGVuc2VkJywgJ2V4dHJhLWNvbmRlbnNlZCcsICdjb25kZW5zZWQnLCAnc2VtaS1jb25kZW5zZWQnLCAnbm9ybWFsJywgJ3NlbWktZXhwYW5kZWQnLCAnZXhwYW5kZWQnLCAnZXh0cmEtZXhwYW5kZWQnLCAndWx0cmEtZXhwYW5kZWQnLCBpc1BlcmNlbnQsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBGYW1pbHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LWZhbWlseVxuICAgICAgICovXG4gICAgICAnZm9udC1mYW1pbHknOiBbe1xuICAgICAgICBmb250OiBbaXNBcmJpdHJhcnlWYXJpYWJsZUZhbWlseU5hbWUsIGlzQXJiaXRyYXJ5VmFsdWUsIHRoZW1lRm9udF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tbm9ybWFsJzogWydub3JtYWwtbnVtcyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tb3JkaW5hbCc6IFsnb3JkaW5hbCddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tc2xhc2hlZC16ZXJvJzogWydzbGFzaGVkLXplcm8nXSxcbiAgICAgIC8qKlxuICAgICAgICogRm9udCBWYXJpYW50IE51bWVyaWNcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9mb250LXZhcmlhbnQtbnVtZXJpY1xuICAgICAgICovXG4gICAgICAnZnZuLWZpZ3VyZSc6IFsnbGluaW5nLW51bXMnLCAnb2xkc3R5bGUtbnVtcyddLFxuICAgICAgLyoqXG4gICAgICAgKiBGb250IFZhcmlhbnQgTnVtZXJpY1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvbnQtdmFyaWFudC1udW1lcmljXG4gICAgICAgKi9cbiAgICAgICdmdm4tc3BhY2luZyc6IFsncHJvcG9ydGlvbmFsLW51bXMnLCAndGFidWxhci1udW1zJ10sXG4gICAgICAvKipcbiAgICAgICAqIEZvbnQgVmFyaWFudCBOdW1lcmljXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZm9udC12YXJpYW50LW51bWVyaWNcbiAgICAgICAqL1xuICAgICAgJ2Z2bi1mcmFjdGlvbic6IFsnZGlhZ29uYWwtZnJhY3Rpb25zJywgJ3N0YWNrZWQtZnJhY3Rpb25zJ10sXG4gICAgICAvKipcbiAgICAgICAqIExldHRlciBTcGFjaW5nXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGV0dGVyLXNwYWNpbmdcbiAgICAgICAqL1xuICAgICAgdHJhY2tpbmc6IFt7XG4gICAgICAgI
25114HRyYWNraW5nOiBbdGhlbWVUcmFja2luZywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBMaW5lIENsYW1wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGluZS1jbGFtcFxuICAgICAgICovXG4gICAgICAnbGluZS1jbGFtcCc6IFt7XG4gICAgICAgICdsaW5lLWNsYW1wJzogW2lzTnVtYmVyLCAnbm9uZScsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5TnVtYmVyXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpbmUgSGVpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGluZS1oZWlnaHRcbiAgICAgICAqL1xuICAgICAgbGVhZGluZzogW3tcbiAgICAgICAgbGVhZGluZzogWy8qKiBEZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4wLjAuIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy5jb20vaXNzdWVzLzIwMjcjaXNzdWVjb21tZW50LTI2MjAxNTI3NTcgKi9cbiAgICAgICAgdGhlbWVMZWFkaW5nLCAuLi5zY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpc3QgU3R5bGUgSW1hZ2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9saXN0LXN0eWxlLWltYWdlXG4gICAgICAgKi9cbiAgICAgICdsaXN0LWltYWdlJzogW3tcbiAgICAgICAgJ2xpc3QtaW1hZ2UnOiBbJ25vbmUnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIExpc3QgU3R5bGUgUG9zaXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9saXN0LXN0eWxlLXBvc2l0aW9uXG4gICAgICAgKi9cbiAgICAgICdsaXN0LXN0eWxlLXBvc2l0aW9uJzogW3tcbiAgICAgICAgbGlzdDogWydpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTGlzdCBTd
25114HlsZSBUeXBlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbGlzdC1zdHlsZS10eXBlXG4gICAgICAgKi9cbiAgICAgICdsaXN0LXN0eWxlLXR5cGUnOiBbe1xuICAgICAgICBsaXN0OiBbJ2Rpc2MnLCAnZGVjaW1hbCcsICdub25lJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IEFsaWdubWVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtYWxpZ25cbiAgICAgICAqL1xuICAgICAgJ3RleHQtYWxpZ25tZW50JzogW3tcbiAgICAgICAgdGV4dDogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdqdXN0aWZ5JywgJ3N0YXJ0JywgJ2VuZCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGxhY2Vob2xkZXIgQ29sb3JcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2My4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly92My50YWlsd2luZGNzcy5jb20vZG9jcy9wbGFjZWhvbGRlci1jb2xvclxuICAgICAgICovXG4gICAgICAncGxhY2Vob2xkZXItY29sb3InOiBbe1xuICAgICAgICBwbGFjZWhvbGRlcjogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3RleHQtY29sb3InOiBbe1xuICAgICAgICB0ZXh0OiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IERlY29yYXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb25cbiAgICAgICAqL1xuICAgICAgJ3RleHQtZGVjb3JhdGlvbic6IFsndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCcsICduby11bmRlcmxpbmUnXSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBEZWNvcmF0aW9uIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1kZWNvcmF0aW9uLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnOiBbe1xuICAgICAgICBkZWNvcmF0aW9uOiBbLi4uc2NhbGVMaW5lU3R5bGUoKSwgJ3dhdnknXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgRGVjb3JhdGlvbiBUaGlja25lc3NcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzJzogW3tcbiAgICAgICAgZGVjb3JhdGlvbjogW2lzTnVtYmVyLCAnZnJvbS1mb250JywgJ2F1dG8nLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeUxlbmd0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IERlY29yYXRpb24gQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LWRlY29yYXRpb24tY29sb3JcbiAgICAgICAqL1xuICAgICAgJ3RleHQtZGVjb3JhdGlvbi1jb2xvcic6IFt7XG4gICAgICAgIGRlY29yYXRpb246IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgVW5kZXJsaW5lIE9mZnNldFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtdW5kZXJsaW5lLW9mZnNldFxuICAgICAgICovXG4gICAgICAndW5kZXJsaW5lLW9mZnNldCc6IFt7XG4gICAgICAgICd1bmRlcmxpbmUtb2Zmc2V0JzogW2lzTnVtYmVyLCAnYXV0bycsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBUcmFuc2Zvcm1cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90ZXh0LXRyYW5zZm9ybVxuICAgICAgICovXG4gICAgICAndGV4dC10cmFuc2Zvcm0nOiBbJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnLCAnY2FwaXRhbGl6ZScsICdub3JtYWwtY2FzZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IE92ZXJmbG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1vdmVyZmxvd1xuICAgICAgICovXG4gICAgICAndGV4dC1vdmVyZmxvdyc6IFsndHJ1bmNhdGUnLCAndGV4dC1lbGxpcHNpcycsICd0ZXh0LWNsaXAnXSxcbiAgICAgIC8qKlxuICAgICAgICogVGV4dCBXcmFwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC13cmFwXG4gICAgICAgKi9cbiAgICAgICd0ZXh0LXdyYXAnOiBbe1xuICAgICAgICB0ZXh0OiBbJ3dyYXAnLCAnbm93cmFwJywgJ2JhbGFuY2UnLCAncHJldHR5J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IEluZGVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtaW5kZW50XG4gICAgICAgKi9cbiAgICAgIGluZGVudDogW3tcbiAgICAgICAgaW5kZW50OiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVmVydGljYWwgQWxpZ25tZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdmVydGljYWwtYWxpZ25cbiAgICAgICAqL1xuICAgICAgJ3ZlcnRpY2FsLWFsaWduJzogW3tcbiAgICAgICAgYWxpZ246IFsnYmFzZWxpbmUnLCAndG9wJywgJ21pZGRsZScsICdib3R0b20nLCAndGV4dC10b3AnLCAndGV4dC1ib3R0b20nLCAnc3ViJywgJ3N1cGVyJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGl0ZXNwYWNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvd2hpdGVzcGFjZVxuICAgICAgICovXG4gICAgICB3aGl0ZXNwYWNlOiBbe1xuICAgICAgICB3aGl0ZXNwYWNlOiBbJ25vcm1hbCcsICdub3dyYXAnLCAncHJlJywgJ3ByZS1saW5lJywgJ3ByZS13cmFwJywgJ2JyZWFrLXNwYWNlcyddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogV29yZCBCcmVha1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dvcmQtYnJlYWtcbiAgICAgICAqL1xuICAgICAgYnJlYWs6IFt7XG4gICAgICAgIGJyZWFrOiBbJ25vcm1hbCcsICd3b3JkcycsICdhbGwnLCAna2VlcCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcmZsb3cgV3JhcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL292ZXJmbG93LXdyYXBcbiAgICAgICAqL1xuICAgICAgd3JhcDogW3tcbiAgICAgICAgd3JhcDogWydicmVhay13b3JkJywgJ2FueXdoZXJlJywgJ25vcm1hbCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogSHlwaGVuc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2h5cGhlbnNcbiAgICAgICAqL1xuICAgICAgaHlwaGVuczogW3tcbiAgICAgICAgaHlwaGVuczogWydub25lJywgJ21hbnVhbCcsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDb250ZW50XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY29udGVudFxuICAgICAgICovXG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICBjb250ZW50OiBbJ25vbmUnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gQmFja2dyb3VuZHMgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgQXR0YWNobWVudFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtYXR0YWNobWVudFxuICAgICAgICovXG4gICAgICAnYmctYXR0YWNobWVudCc6IFt7XG4gICAgICAgIGJnOiBbJ2ZpeGVkJywgJ2xvY2FsJywgJ3Njcm9sbCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBDbGlwXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2dyb3VuZC1jbGlwXG4gICAgICAgKi9cbiAgICAgICdiZy1jbGlwJzogW3tcbiAgICAgICAgJ2JnLWNsaXAnOiBbJ2JvcmRlcicsICdwYWRkaW5nJywgJ2NvbnRlbnQnLCAndGV4dCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBPcmlnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLW9yaWdpblxuICAgICAgICovXG4gICAgICAnYmctb3Jp
25114Z2luJzogW3tcbiAgICAgICAgJ2JnLW9yaWdpbic6IFsnYm9yZGVyJywgJ3BhZGRpbmcnLCAnY29udGVudCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgJ2JnLXBvc2l0aW9uJzogW3tcbiAgICAgICAgYmc6IHNjYWxlQmdQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBSZXBlYXRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLXJlcGVhdFxuICAgICAgICovXG4gICAgICAnYmctcmVwZWF0JzogW3tcbiAgICAgICAgYmc6IHNjYWxlQmdSZXBlYXQoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgU2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtc2l6ZVxuICAgICAgICovXG4gICAgICAnYmctc2l6ZSc6IFt7XG4gICAgICAgIGJnOiBzY2FsZUJnU2l6ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2dyb3VuZCBJbWFnZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tncm91bmQtaW1hZ2VcbiAgICAgICAqL1xuICAgICAgJ2JnLWltYWdlJzogW3tcbiAgICAgICAgYmc6IFsnbm9uZScsIHtcbiAgICAgICAgICBsaW5lYXI6IFt7XG4gICAgICAgICAgICB0bzogWyd0JywgJ3RyJywgJ3InLCAnYnInLCAnYicsICdibCcsICdsJywgJ3RsJ11cbiAgICAgICAgICB9LCBpc0ludGVnZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdLFxuICAgICAgICAgIHJhZGlhbDogWycnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXSxcbiAgICAgICAgICBjb25pYzogW2lzSW50ZWdlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgICAgfSwgaXNBcmJpdHJhcnlWYXJpYWJsZUltYWdlLCBpc0FyYml0cmFyeUltYWdlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tncm91bmQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdiZy1jb2xvcic6IFt7XG4gICAgICAgIGJnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBGcm9tIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LWZyb20tcG9zJzogW3tcbiAgICAgICAgZnJvbTogc2NhbGVHcmFkaWVudFN0b3BQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogR3JhZGllbnQgQ29sb3IgU3RvcHMgVmlhIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LXZpYS1wb3MnOiBbe1xuICAgICAgICB2aWE6IHNjYWxlR3JhZGllbnRTdG9wUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyYWRpZW50IENvbG9yIFN0b3BzIFRvIFBvc2l0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LXRvLXBvcyc6IFt7XG4gICAgICAgIHRvOiBzY2FsZUdyYWRpZW50U3RvcFBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBGcm9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZ3JhZGllbnQtY29sb3Itc3RvcHNcbiAgICAgICAqL1xuICAgICAgJ2dyYWRpZW50LWZyb20nOiBbe1xuICAgICAgICBmcm9tOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBWaWFcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ncmFkaWVudC1jb2xvci1zdG9wc1xuICAgICAgICovXG4gICAgICAnZ3JhZGllbnQtdmlhJzogW3tcbiAgICAgICAgdmlhOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBHcmFkaWVudCBDb2xvciBTdG9wcyBUb1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyYWRpZW50LWNvbG9yLXN0b3BzXG4gICAgICAgKi9cbiAgICAgICdncmFkaWVudC10byc6IFt7XG4gICAgICAgIHRvOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gQm9yZGVycyAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICByb3VuZGVkOiBbe1xuICAgICAgICByb3VuZGVkOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtcyc6IFt7XG4gICAgICAgICdyb3VuZGVkLXMnOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLWUnOiBbe1xuICAgICAgICAncm91bmRlZC1lJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC10JzogW3tcbiAgICAgICAgJ3JvdW5kZWQtdCc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1yJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtcic6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIEJvdHRvbVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtYic6IFt7XG4gICAgICAgICdyb3VuZGVkLWInOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFJhZGl1cyBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1sJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtbCc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFN0YXJ0IFN0YXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1zcyc6IFt7XG4gICAgICAgICdyb3VuZGVkLXNzJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgU3RhcnQgRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1zZSc6IFt7XG4gICAgICAgICdyb3VuZGVkLXNlJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgRW5kIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtZWUnOiBbe1xuICAgICAgICAncm91bmRlZC1lZSc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIEVuZCBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1yYWRpdXNcbiAgICAgICAqL1xuICAgICAgJ3JvdW5kZWQtZXMnOiBbe1xuICAgICAgICAncm91bmRlZC1lcyc6IHNjYWxlUmFkaXVzKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgUmFkaXVzIFRvcCBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC10bCc6IFt7XG4gICAgICAgICdyb3VuZGVkLXRsJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgVG9wIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC10cic6IFt7XG4gICAgICAgICdyb3VuZGVkLXRyJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgQm90dG9tIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXJhZGl1c1xuICAgICAgICovXG4gICAgICAncm91bmRlZC1icic6IFt7XG4gICAgICAgICdyb3VuZGVkLWJyJzogc2NhbGVSYWRpdXMoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBSYWRpdXMgQm90dG9tIExlZnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItcmFkaXVzXG4gICAgICAgKi9cbiAgICAgICdyb3VuZGVkLWJsJzogW3tcbiAgICAgICAgJ3JvdW5kZWQtYmwnOiBzY2FsZVJhZGl1cygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdyc6IFt7XG4gICAgICAgIGJvcmRlcjogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LXgnOiBbe1xuICAgICAgICAnYm9yZGVyLXgnOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGggWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXcteSc6IFt7XG4gICAgICAgICdib3JkZXIteSc6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctcyc6IFt7XG4gICAgICAgICdib3JkZXItcyc6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBFbmRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGhcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci13LWUnOiBbe1xuICAgICAgICAnYm9yZGVyLWUnOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgV2lkdGggVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy10JzogW3tcbiAgICAgICAgJ2JvcmRlci10Jzogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy1yJzogW3tcbiAgICAgICAgJ2JvcmRlci1yJzogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFdpZHRoIEJvdHRvbVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci13aWR0aFxuICAgICAgICovXG4gICAgICAnYm9yZGVyLXctYic6IFt7XG4gICAgICAgICdib3JkZXItYic6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBXaWR0aCBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItdy1sJzogW3tcbiAgICAgICAgJ2JvcmRlci1sJzogc2NhbGVCb3JkZXJXaWR0aCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRGl2aWRlIFdpZHRoIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGgjYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXgnOiBbe1xuICAgICAgICAnZGl2aWRlLXgnOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgV2lkdGggWCBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoI2JldHdlZW4tY2hpbGRyZW5cbiAgICAgICAqL1xuICAgICAgJ2RpdmlkZS14LXJldmVyc2UnOiBbJ2RpdmlkZS14LXJldmVyc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogRGl2aWRlIFdpZHRoIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItd2lkdGgjYmV0d2Vlbi1jaGlsZHJlblxuICAgICAgICovXG4gICAgICAnZGl2aWRlLXknOiBbe1xuICAgICAgICAnZGl2aWRlLXknOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEaXZpZGUgV2lkdGggWSBSZXZlcnNlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXdpZHRoI2JldHdlZW4tY2hpbGRyZW5cbiAgICAgICAqL1xuICAgICAgJ2RpdmlkZS15LXJldmVyc2UnOiBbJ2RpdmlkZS15LXJldmVyc2UnXSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItc3R5bGUnOiBbe1xuICAgICAgICBib3JkZXI6IFsuLi5zY2FsZUxpbmVTdHlsZSgpLCAnaGlkZGVuJywgJ25vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpdmlkZSBTdHlsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zdHlsZSNzZXR0aW5nLXRoZS1kaXZpZG
25114VyLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICdkaXZpZGUtc3R5bGUnOiBbe1xuICAgICAgICBkaXZpZGU6IFsuLi5zY2FsZUxpbmVTdHlsZSgpLCAnaGlkZGVuJywgJ25vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yJzogW3tcbiAgICAgICAgYm9yZGVyOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXgnOiBbe1xuICAgICAgICAnYm9yZGVyLXgnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXknOiBbe1xuICAgICAgICAnYm9yZGVyLXknOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgU1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXMnOiBbe1xuICAgICAgICAnYm9yZGVyLXMnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgRVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLWUnOiBbe1xuICAgICAgICAnYm9yZGVyLWUnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgVG9wXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItdCc6IFt7XG4gICAgICAgICdib3JkZXItdCc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1jb2xvclxuICAgICAgICovXG4gICAgICAnYm9yZGVyLWNvbG9yLXInOiBbe1xuICAgICAgICAnYm9yZGVyLXInOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sb3IgQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItYic6IFt7XG4gICAgICAgICdib3JkZXItYic6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJvcmRlciBDb2xvciBMZWZ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm9yZGVyLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItY29sb3ItbCc6IFt7XG4gICAgICAgICdib3JkZXItbCc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIERpdmlkZSBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2RpdmlkZS1jb2xvclxuICAgICAgICovXG4gICAgICAnZGl2aWRlLWNvbG9yJzogW3tcbiAgICAgICAgZGl2aWRlOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdXRsaW5lIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3V0bGluZS1zdHlsZVxuICAgICAgICovXG4gICAgICAnb3V0bGluZS1zdHlsZSc6IFt7XG4gICAgICAgIG91dGxpbmU6IFsuLi5zY2FsZUxpbmVTdHlsZSgpLCAnbm9uZScsICdoaWRkZW4nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE91dGxpbmUgT2Zmc2V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3V0bGluZS1vZmZzZXRcbiAgICAgICAqL1xuICAgICAgJ291dGxpbmUtb2Zmc2V0JzogW3tcbiAgICAgICAgJ291dGxpbmUtb2Zmc2V0JzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE91dGxpbmUgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9vdXRsaW5lLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdvdXRsaW5lLXcnOiBbe1xuICAgICAgICBvdXRsaW5lOiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlTGVuZ3RoLCBpc0FyYml0cmFyeUxlbmd0aF1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPdXRsaW5lIENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3V0bGluZS1jb2xvclxuICAgICAgICovXG4gICAgICAnb3V0bGluZS1jb2xvcic6IFt7XG4gICAgICAgIG91dGxpbmU6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBFZmZlY3RzIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEJveCBTaGFkb3dcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93XG4gICAgICAgKi9cbiAgICAgIHNoYWRvdzogW3tcbiAgICAgICAgc2hhZG93OiBbXG4gICAgICAgIC8vIERlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICAnJywgJ25vbmUnLCB0aGVtZVNoYWRvdywgaXNBcmJpdHJhcnlWYXJpYWJsZVNoYWRvdywgaXNBcmJpdHJhcnlTaGFkb3ddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm94IFNoYWRvdyBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JveC1zaGFkb3cjc2V0dGluZy10aGUtc2hhZG93LWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdzaGFkb3ctY29sb3InOiBbe1xuICAgICAgICBzaGFkb3c6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEluc2V0IEJveCBTaGFkb3dcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93I2FkZGluZy1hbi1pbnNldC1zaGFkb3dcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXNoYWRvdyc6IFt7XG4gICAgICAgICdpbnNldC1zaGFkb3cnOiBbJ25vbmUnLCB0aGVtZUluc2V0U2hhZG93LCBpc0FyYml0cmFyeVZhcmlhYmxlU2hhZG93LCBpc0FyYml0cmFyeVNoYWRvd11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBJbnNldCBCb3ggU2hhZG93IENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvdyNzZXR0aW5nLXRoZS1pbnNldC1zaGFkb3ctY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXNoYWRvdy1jb2xvcic6IFt7XG4gICAgICAgICdpbnNldC1zaGFkb3cnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSaW5nIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvdyNhZGRpbmctYS1yaW5nXG4gICAgICAgKi9cbiAgICAgICdyaW5nLXcnOiBbe1xuICAgICAgICByaW5nOiBzY2FsZUJvcmRlcldpZHRoKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSaW5nIFdpZHRoIEluc2V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdjMudGFpbHdpbmRjc3MuY29tL2RvY3MvcmluZy13aWR0aCNpbnNldC1yaW5nc1xuICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL2Jsb2IvdjQuMC4wL3BhY2thZ2VzL3RhaWx3aW5kY3NzL3NyYy91dGlsaXRpZXMudHMjTDQxNThcbiAgICAgICAqL1xuICAgICAgJ3Jpbmctdy1pbnNldCc6IFsncmluZy1pbnNldCddLFxuICAgICAgLyoqXG4gICAgICAgKiBSaW5nIENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYm94LXNoYWRvdyNzZXR0aW5nLXRoZS1yaW5nLWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdyaW5nLWNvbG9yJzogW3tcbiAgICAgICAgcmluZzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUmluZyBPZmZzZXQgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly92My50YWlsd2luZGNzcy5jb20vZG9jcy9yaW5nLW9mZnNldC13aWR0aFxuICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgVGFpbHdpbmQgQ1NTIHY0LjAuMFxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL2Jsb2IvdjQuMC4wL3BhY2thZ2VzL3RhaWx3aW5kY3NzL3NyYy91dGlsaXRpZXMudHMjTDQxNThcbiAgICAgICAqL1xuICAgICAgJ3Jpbmctb2Zmc2V0LXcnOiBbe1xuICAgICAgICAncmluZy1vZmZzZXQnOiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5TGVuZ3RoXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJpbmcgT2Zmc2V0IENvbG9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdjMudGFpbHdpbmRjc3MuY29tL2RvY3MvcmluZy1vZmZzZXQtY29sb3JcbiAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIFRhaWx3aW5kIENTUyB2NC4wLjBcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9ibG9iL3Y0LjAuMC9wYWNrYWdlcy90YWlsd2luZGNzcy9zcmMvdXRpbGl0aWVzLnRzI0w0MT
25114U4XG4gICAgICAgKi9cbiAgICAgICdyaW5nLW9mZnNldC1jb2xvcic6IFt7XG4gICAgICAgICdyaW5nLW9mZnNldCc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEluc2V0IFJpbmcgV2lkdGhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93I2FkZGluZy1hbi1pbnNldC1yaW5nXG4gICAgICAgKi9cbiAgICAgICdpbnNldC1yaW5nLXcnOiBbe1xuICAgICAgICAnaW5zZXQtcmluZyc6IHNjYWxlQm9yZGVyV2lkdGgoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEluc2V0IFJpbmcgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3gtc2hhZG93I3NldHRpbmctdGhlLWluc2V0LXJpbmctY29sb3JcbiAgICAgICAqL1xuICAgICAgJ2luc2V0LXJpbmctY29sb3InOiBbe1xuICAgICAgICAnaW5zZXQtcmluZyc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRleHQgU2hhZG93XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGV4dC1zaGFkb3dcbiAgICAgICAqL1xuICAgICAgJ3RleHQtc2hhZG93JzogW3tcbiAgICAgICAgJ3RleHQtc2hhZG93JzogWydub25lJywgdGhlbWVUZXh0U2hhZG93LCBpc0FyYml0cmFyeVZhcmlhYmxlU2hhZG93LCBpc0FyYml0cmFyeVNoYWRvd11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUZXh0IFNoYWRvdyBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RleHQtc2hhZG93I3NldHRpbmctdGhlLXNoYWRvdy1jb2xvclxuICAgICAgICovXG4gICAgICAndGV4dC1zaGFkb3ctY29sb3InOiBbe1xuICAgICAgICAndGV4dC1zaGFkb3cnOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBPcGFjaXR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvb3BhY2l0eVxuICAgICAgICovXG4gICAgICBvcGFjaXR5OiBbe1xuICAgICAgICBvcGFjaXR5OiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWl4IEJsZW5kIE1vZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9taXgtYmxlbmQtbW9kZVxuICAgICAgICovXG4gICAgICAnbWl4LWJsZW5kJzogW3tcbiAgICAgICAgJ21peC1ibGVuZCc6IFsuLi5zY2FsZUJsZW5kTW9kZSgpLCAncGx1cy1kYXJrZXInLCAncGx1cy1saWdodGVyJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZ3JvdW5kIEJsZW5kIE1vZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZ3JvdW5kLWJsZW5kLW1vZGVcbiAgICAgICAqL1xuICAgICAgJ2JnLWJsZW5kJzogW3tcbiAgICAgICAgJ2JnLWJsZW5kJzogc2NhbGVCbGVuZE1vZGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hc2sgQ2xpcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hc2stY2xpcFxuICAgICAgICovXG4gICAgICAnbWFzay1jbGlwJzogW3tcbiAgICAgICAgJ21hc2stY2xpcCc6IFsnYm9yZGVyJywgJ3BhZGRpbmcnLCAnY29udGVudCcsICdmaWxsJywgJ3N0cm9rZScsICd2aWV3J11cbiAgICAgIH0sICdtYXNrLW5vLWNsaXAnXSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBDb21wb3NpdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXNrLWNvbXBvc2l0ZVxuICAgICAgICovXG4gICAgICAnbWFzay1jb21wb3NpdGUnOiBbe1xuICAgICAgICBtYXNrOiBbJ2FkZCcsICdzdWJ0cmFjdCcsICdpbnRlcnNlY3QnLCAnZXhjbHVkZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBJbWFnZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hc2staW1hZ2VcbiAgICAgICAqL1xuICAgICAgJ21hc2staW1hZ2UtbGluZWFyLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhcic6IFtpc051bWJlcl1cbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtbGluZWFyLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stbGluZWFyLWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtbGluZWFyLXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhci10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1saW5lYXItZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhci1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWxpbmVhci10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWxpbmVhci10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS10LWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stdC1mcm9tJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXQtdG8tcG9zJzogW3tcbiAgICAgICAgJ21hc2stdC10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS10LWZyb20tY29sb3InOiBbe1xuICAgICAgICAnbWFzay10LWZyb20nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtdC10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXQtdG8nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2Utci1mcm9tLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXItZnJvbSc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yLXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXItdG8nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2Utci1mcm9tLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2stci1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXItdG8tY29sb3InOiBbe1xuICAgICAgICAnbWFzay1yLXRvJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWItZnJvbS1wb3MnOiBbe1xuICAgICAgICAnbWFzay1iLWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtYi10by1wb3MnOiBbe1xuICAgICAgICAnbWFzay1iLXRvJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWItZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWItZnJvbSc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1iLXRvLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2stYi10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1sLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stbC1mcm9tJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWwtdG8tcG9zJzogW3tcbiAgICAgICAgJ21hc2stbC10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1sLWZyb20tY29sb3InOiBbe1xuICAgICAgICAnbWFzay1sLWZyb20nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtbC10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWwtdG8nOiBzY2FsZUNvbG9yKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UteC1mcm9tLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXgtZnJvbSc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS14LXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXgtdG8nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UteC1mcm9tLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2steC1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXgtdG8tY29sb3InOiBbe1xuICAgICAgICAnbWFzay14LXRvJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXktZnJvbS1wb3MnOiBbe1xuICAgICAgICAnbWFzay15LWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UteS10by1wb3MnOiBbe1xuICAgICAgICAnbWFzay15LXRvJzogc2NhbGVNYXNrSW1hZ2VQb3NpdGlvbigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXktZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXktZnJvbSc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS15LXRvLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2steS10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yYWRpYWwnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwnOiBbaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtcmFkaWFsLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stcmFkaWFsLWZyb20nOiBzY2FsZU1hc2tJbWFnZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtcmFkaWFsLXRvLXBvcyc6IFt7XG4gICAgICAgICdtYXNrLXJhZGlhbC10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yYWRpYWwtZnJvbS1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXJhZGlhbC1mcm9tJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXJhZGlhbC10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLXJhZGlhbC10byc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1yYWRpYWwtc2hhcGUnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwnOiBbJ2NpcmNsZScsICdlbGxpcHNlJ11cbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtcmFkaWFsLXNpemUnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwnOiBbe1xuICAgICAgICAgIGNsb3Nlc3Q6IFsnc2lkZScsICdjb3JuZXInXSxcbiAgICAgICAgICBmYXJ0aGVzdDogWydzaWRlJywgJ2Nvcm5lciddXG4gICAgICAgI
25114H1dXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLXJhZGlhbC1wb3MnOiBbe1xuICAgICAgICAnbWFzay1yYWRpYWwtYXQnOiBzY2FsZVBvc2l0aW9uKClcbiAgICAgIH1dLFxuICAgICAgJ21hc2staW1hZ2UtY29uaWMtcG9zJzogW3tcbiAgICAgICAgJ21hc2stY29uaWMnOiBbaXNOdW1iZXJdXG4gICAgICB9XSxcbiAgICAgICdtYXNrLWltYWdlLWNvbmljLWZyb20tcG9zJzogW3tcbiAgICAgICAgJ21hc2stY29uaWMtZnJvbSc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1jb25pYy10by1wb3MnOiBbe1xuICAgICAgICAnbWFzay1jb25pYy10byc6IHNjYWxlTWFza0ltYWdlUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1jb25pYy1mcm9tLWNvbG9yJzogW3tcbiAgICAgICAgJ21hc2stY29uaWMtZnJvbSc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAnbWFzay1pbWFnZS1jb25pYy10by1jb2xvcic6IFt7XG4gICAgICAgICdtYXNrLWNvbmljLXRvJzogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBNb2RlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay1tb2RlXG4gICAgICAgKi9cbiAgICAgICdtYXNrLW1vZGUnOiBbe1xuICAgICAgICBtYXNrOiBbJ2FscGhhJywgJ2x1bWluYW5jZScsICdtYXRjaCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBPcmlnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXNrLW9yaWdpblxuICAgICAgICovXG4gICAgICAnbWFzay1vcmlnaW4nOiBbe1xuICAgICAgICAnbWFzay1vcmlnaW4nOiBbJ2JvcmRlcicsICdwYWRkaW5nJywgJ2NvbnRlbnQnLCAnZmlsbCcsICdzdHJva2UnLCAndmlldyddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBQb3NpdGlvblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL21hc2stcG9zaXRpb25cbiAgICAgICAqL1xuICAgICAgJ21hc2stcG9zaXRpb24nOiBbe1xuICAgICAgICBtYXNrOiBzY2FsZUJnUG9zaXRpb24oKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hc2sgUmVwZWF0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay1yZXBlYXRcbiAgICAgICAqL1xuICAgICAgJ21hc2stcmVwZWF0JzogW3tcbiAgICAgICAgbWFzazogc2NhbGVCZ1JlcGVhdCgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBTaXplXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay1zaXplXG4gICAgICAgKi9cbiAgICAgICdtYXNrLXNpemUnOiBbe1xuICAgICAgICBtYXNrOiBzY2FsZUJnU2l6ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogTWFzayBUeXBlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvbWFzay10eXBlXG4gICAgICAgKi9cbiAgICAgICdtYXNrLXR5cGUnOiBbe1xuICAgICAgICAnbWFzay10eXBlJzogWydhbHBoYScsICdsdW1pbmFuY2UnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIE1hc2sgSW1hZ2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9tYXNrLWltYWdlXG4gICAgICAgKi9cbiAgICAgICdtYXNrLWltYWdlJzogW3tcbiAgICAgICAgbWFzazogWydub25lJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gRmlsdGVycyAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBGaWx0ZXJcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9maWx0ZXJcbiAgICAgICAqL1xuICAgICAgZmlsdGVyOiBbe1xuICAgICAgICBmaWx0ZXI6IFtcbiAgICAgICAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjMuMC4wXG4gICAgICAgICcnLCAnbm9uZScsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmx1clxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JsdXJcbiAgICAgICAqL1xuICAgICAgYmx1cjogW3tcbiAgICAgICAgYmx1cjogc2NhbGVCbHVyKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCcmlnaHRuZXNzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJpZ2h0bmVzc1xuICAgICAgICovXG4gICAgICBicmlnaHRuZXNzOiBbe1xuICAgICAgICBicmlnaHRuZXNzOiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJhc3RcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jb250cmFzdFxuICAgICAgICovXG4gICAgICBjb250cmFzdDogW3tcbiAgICAgICAgY29udHJhc3Q6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBEcm9wIFNoYWRvd1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2Ryb3Atc2hhZG93XG4gICAgICAgKi9cbiAgICAgICdkcm9wLXNoYWRvdyc6IFt7XG4gICAgICAgICdkcm9wLXNoYWRvdyc6IFtcbiAgICAgICAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjQuMC4wXG4gICAgICAgICcnLCAnbm9uZScsIHRoZW1lRHJvcFNoYWRvdywgaXNBcmJpdHJhcnlWYXJpYWJsZVNoYWRvdywgaXNBcmJpdHJhcnlTaGFkb3ddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogRHJvcCBTaGFkb3cgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9maWx0ZXItZHJvcC1zaGFkb3cjc2V0dGluZy10aGUtc2hhZG93LWNvbG9yXG4gICAgICAgKi9cbiAgICAgICdkcm9wLXNoYWRvdy1jb2xvcic6IFt7XG4gICAgICAgICdkcm9wLXNoYWRvdyc6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEdyYXlzY2FsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2dyYXlzY2FsZVxuICAgICAgICovXG4gICAgICBncmF5c2NhbGU6IFt7XG4gICAgICAgIGdyYXlzY2FsZTogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBIdWUgUm90YXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaHVlLXJvdGF0ZVxuICAgICAgICovXG4gICAgICAnaHVlLXJvdGF0ZSc6IFt7XG4gICAgICAgICdodWUtcm90YXRlJzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEludmVydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ludmVydFxuICAgICAgICovXG4gICAgICBpbnZlcnQ6IFt7XG4gICAgICAgIGludmVydDogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTYXR1cmF0ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NhdHVyYXRlXG4gICAgICAgKi9cbiAgICAgIHNhdHVyYXRlOiBbe1xuICAgICAgICBzYXR1cmF0ZTogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNlcGlhXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2VwaWFcbiAgICAgICAqL1xuICAgICAgc2VwaWE6IFt7XG4gICAgICAgI
25114HNlcGlhOiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIEZpbHRlclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWZpbHRlclxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3AtZmlsdGVyJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLWZpbHRlcic6IFtcbiAgICAgICAgLy8gRGVwcmVjYXRlZCBzaW5jZSBUYWlsd2luZCBDU1MgdjMuMC4wXG4gICAgICAgICcnLCAnbm9uZScsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgQmx1clxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWJsdXJcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWJsdXInOiBbe1xuICAgICAgICAnYmFja2Ryb3AtYmx1cic6IHNjYWxlQmx1cigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgQnJpZ2h0bmVzc1xuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWJyaWdodG5lc3NcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWJyaWdodG5lc3MnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtYnJpZ2h0bmVzcyc6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBDb250cmFzdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JhY2tkcm9wLWNvbnRyYXN0XG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1jb250cmFzdCc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1jb250cmFzdCc6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBHcmF5c2NhbGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1ncmF5c2NhbGVcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLWdyYXlzY2FsZSc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1ncmF5c2NhbGUnOiBbJycsIGlzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIEh1ZSBSb3RhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZHJvcC1odWUtcm90YXRlXG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1odWUtcm90YXRlJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLWh1ZS1yb3RhdGUnOiBbaXNOdW1iZXIsIGlzQXJiaXRyYXJ5VmFyaWFibGUsIGlzQXJiaXRyYXJ5VmFsdWVdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQmFja2Ryb3AgSW52ZXJ0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3AtaW52ZXJ0XG4gICAgICAgKi9cbiAgICAgICdiYWNrZHJvcC1pbnZlcnQnOiBbe1xuICAgICAgICAnYmFja2Ryb3AtaW52ZXJ0JzogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBCYWNrZHJvcCBPcGFjaXR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atb3BhY2l0eVxuICAgICAgICovXG4gICAgICAnYmFja2Ryb3Atb3BhY2l0eSc6IFt7XG4gICAgICAgICdiYWNrZHJvcC1vcGFjaXR5JzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIFNhdHVyYXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atc2F0dXJhdGVcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLXNhdHVyYXRlJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLXNhdHVyYXRlJzogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tkcm9wIFNlcGlhXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYmFja2Ryb3Atc2VwaWFcbiAgICAgICAqL1xuICAgICAgJ2JhY2tkcm9wLXNlcGlhJzogW3tcbiAgICAgICAgJ2JhY2tkcm9wLXNlcGlhJzogWycnLCBpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBUYWJsZXMgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBCb3JkZXIgQ29sbGFwc2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItY29sbGFwc2VcbiAgICAgICAqL1xuICAgICAgJ2JvcmRlci1jb2xsYXBzZSc6IFt7XG4gICAgICAgIGJvcmRlcjogWydjb2xsYXBzZScsICdzZXBhcmF0ZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9ib3JkZXItc3BhY2luZ1xuICAgICAgICovXG4gICAgICAnYm9yZGVyLXNwYWNpbmcnOiBbe1xuICAgICAgICAnYm9yZGVyLXNwYWNpbmcnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmcgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zcGFjaW5nXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItc3BhY2luZy14JzogW3tcbiAgICAgICAgJ2JvcmRlci1zcGFjaW5nLXgnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQm9yZGVyIFNwYWNpbmcgWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JvcmRlci1zcGFjaW5nXG4gICAgICAgKi9cbiAgICAgICdib3JkZXItc3BhY2luZy15JzogW3tcbiAgICAgICAgJ2JvcmRlci1zcGFjaW5nLXknOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVGFibGUgTGF5b3V0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdGFibGUtbGF5b3V0XG4gICAgICAgKi9cbiAgICAgICd0YWJsZS1sYXlvdXQnOiBbe1xuICAgICAgICB0YWJsZTogWydhdXRvJywgJ2ZpeGVkJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDYXB0aW9uIFNpZGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9jYXB0aW9uLXNpZGVcbiAgICAgICAqL1xuICAgICAgY2FwdGlvbjogW3tcbiAgICAgICAgY2FwdGlvbjogWyd0b3AnLCAnYm90dG9tJ11cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gVHJhbnNpdGlvbnMgYW5kIEFuaW1hdGlvbiAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIFByb3BlcnR5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1wcm9wZXJ0eVxuICAgICAgICovXG4gICAgICB0cmFuc2l0aW9uOiBbe1xuICAgICAgICB0cmFuc2l0aW9uOiBbJycsICdhbGwnLCAnY29sb3JzJywgJ29wYWNpdHknLCAnc2hhZG93JywgJ3RyYW5zZm9ybScsICdub25lJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIEJlaGF2aW9yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1iZWhhdmlvclxuICAgICAgICovXG4gICAgICAndHJhbnNpdGlvbi1iZWhhdmlvcic6IFt7XG4gICAgICAgI
25114HRyYW5zaXRpb246IFsnbm9ybWFsJywgJ2Rpc2NyZXRlJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIER1cmF0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1kdXJhdGlvblxuICAgICAgICovXG4gICAgICBkdXJhdGlvbjogW3tcbiAgICAgICAgZHVyYXRpb246IFtpc051bWJlciwgJ2luaXRpYWwnLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zaXRpb24gVGltaW5nIEZ1bmN0aW9uXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgZWFzZTogW3tcbiAgICAgICAgZWFzZTogWydsaW5lYXInLCAnaW5pdGlhbCcsIHRoZW1lRWFzZSwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2l0aW9uIERlbGF5XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNpdGlvbi1kZWxheVxuICAgICAgICovXG4gICAgICBkZWxheTogW3tcbiAgICAgICAgZGVsYXk6IFtpc051bWJlciwgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBBbmltYXRpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hbmltYXRpb25cbiAgICAgICAqL1xuICAgICAgYW5pbWF0ZTogW3tcbiAgICAgICAgYW5pbWF0ZTogWydub25lJywgdGhlbWVBbmltYXRlLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBUcmFuc2Zvcm1zIC0tLVxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvKipcbiAgICAgICAqIEJhY2tmYWNlIFZpc2liaWxpdHlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9iYWNrZmFjZS12aXNpYmlsaXR5XG4gICAgICAgKi9cbiAgICAgIGJhY2tmYWNlOiBbe1xuICAgICAgICBiYWNrZmFjZTogWydoaWRkZW4nLCAndmlzaWJsZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUGVyc3BlY3RpdmVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9wZXJzcGVjdGl2ZVxuICAgICAgICovXG4gICAgICBwZXJzcGVjdGl2ZTogW3tcbiAgICAgICAgcGVyc3BlY3RpdmU6IFt0aGVtZVBlcnNwZWN0aXZlLCBpc0FyYml0cmFyeVZhcmlhYmxlLCBpc0FyYml0cmFyeVZhbHVlXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBlcnNwZWN0aXZlIE9yaWdpblxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3BlcnNwZWN0aXZlLW9yaWdpblxuICAgICAgICovXG4gICAgICAncGVyc3BlY3RpdmUtb3JpZ2luJzogW3tcbiAgICAgICAgJ3BlcnNwZWN0aXZlLW9yaWdpbic6IHNjYWxlUG9zaXRpb25XaXRoQXJiaXRyYXJ5KClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSb3RhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yb3RhdGVcbiAgICAgICAqL1xuICAgICAgcm90YXRlOiBbe1xuICAgICAgICByb3RhdGU6IHNjYWxlUm90YXRlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBSb3RhdGUgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3JvdGF0ZVxuICAgICAgICovXG4gICAgICAncm90YXRlLXgnOiBbe1xuICAgICAgICAncm90YXRlLXgnOiBzY2FsZVJvdGF0ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogUm90YXRlIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9yb3RhdGVcbiAgICAgICAqL1xuICAgICAgJ3JvdGF0ZS15JzogW3tcbiAgICAgICAgJ3JvdGF0ZS15Jzogc2NhbGVSb3RhdGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJvdGF0ZSBaXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvcm90YXRlXG4gICAgICAgKi9cbiAgICAgICdyb3RhdGUteic6IFt7XG4gICAgICAgICdyb3RhdGUteic6IHNjYWxlUm90YXRlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY2FsZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NjYWxlXG4gICAgICAgKi9cbiAgICAgIHNjYWxlOiBbe1xuICAgICAgICBzY2FsZTogc2NhbGVTY2FsZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2NhbGUgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3NjYWxlXG4gICAgICAgKi9cbiAgICAgICdzY2FsZS14JzogW3tcbiAgICAgICAgJ3NjYWxlLXgnOiBzY2FsZVNjYWxlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY2FsZSBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2NhbGVcbiAgICAgICAqL1xuICAgICAgJ3NjYWxlLXknOiBbe1xuICAgICAgICAnc2NhbGUteSc6IHNjYWxlU2NhbGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjYWxlIFpcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY2FsZVxuICAgICAgICovXG4gICAgICAnc2NhbGUteic6IFt7XG4gICAgICAgICdzY2FsZS16Jzogc2NhbGVTY2FsZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2NhbGUgM0RcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY2FsZVxuICAgICAgICovXG4gICAgICAnc2NhbGUtM2QnOiBbJ3NjYWxlLTNkJ10sXG4gICAgICAvKipcbiAgICAgICAqIFNrZXdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9za2V3XG4gICAgICAgKi9cbiAgICAgIHNrZXc6IFt7XG4gICAgICAgI
25114HNrZXc6IHNjYWxlU2tldygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2tldyBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2tld1xuICAgICAgICovXG4gICAgICAnc2tldy14JzogW3tcbiAgICAgICAgJ3NrZXcteCc6IHNjYWxlU2tldygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2tldyBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2tld1xuICAgICAgICovXG4gICAgICAnc2tldy15JzogW3tcbiAgICAgICAgJ3NrZXcteSc6IHNjYWxlU2tldygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNmb3JtXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNmb3JtXG4gICAgICAgKi9cbiAgICAgIHRyYW5zZm9ybTogW3tcbiAgICAgICAgdHJhbnNmb3JtOiBbaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZSwgJycsICdub25lJywgJ2dwdScsICdjcHUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zZm9ybSBPcmlnaW5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2Zvcm0tb3JpZ2luXG4gICAgICAgKi9cbiAgICAgICd0cmFuc2Zvcm0tb3JpZ2luJzogW3tcbiAgICAgICAgb3JpZ2luOiBzY2FsZVBvc2l0aW9uV2l0aEFyYml0cmFyeSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNmb3JtIFN0eWxlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNmb3JtLXN0eWxlXG4gICAgICAgKi9cbiAgICAgICd0cmFuc2Zvcm0tc3R5bGUnOiBbe1xuICAgICAgICB0cmFuc2Zvcm06IFsnM2QnLCAnZmxhdCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNsYXRlXG4gICAgICAgKi9cbiAgICAgIHRyYW5zbGF0ZTogW3tcbiAgICAgICAgdHJhbnNsYXRlOiBzY2FsZVRyYW5zbGF0ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlIFhcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2xhdGVcbiAgICAgICAqL1xuICAgICAgJ3RyYW5zbGF0ZS14JzogW3tcbiAgICAgICAgJ3RyYW5zbGF0ZS14Jzogc2NhbGVUcmFuc2xhdGUoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRyYW5zbGF0ZSBZXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdHJhbnNsYXRlXG4gICAgICAgKi9cbiAgICAgICd0cmFuc2xhdGUteSc6IFt7XG4gICAgICAgICd0cmFuc2xhdGUteSc6IHNjYWxlVHJhbnNsYXRlKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUcmFuc2xhdGUgWlxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RyYW5zbGF0ZVxuICAgICAgICovXG4gICAgICAndHJhbnNsYXRlLXonOiBbe1xuICAgICAgICAndHJhbnNsYXRlLXonOiBzY2FsZVRyYW5zbGF0ZSgpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVHJhbnNsYXRlIE5vbmVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90cmFuc2xhdGVcbiAgICAgICAqL1xuICAgICAgJ3RyYW5zbGF0ZS1ub25lJzogWyd0cmFuc2xhdGUtbm9uZSddLFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAvLyAtLS0gSW50ZXJhY3Rpdml0eSAtLS1cbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBBY2NlbnQgQ29sb3JcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hY2NlbnQtY29sb3JcbiAgICAgICAqL1xuICAgICAgYWNjZW50OiBbe1xuICAgICAgICBhY2NlbnQ6IHNjYWxlQ29sb3IoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIEFwcGVhcmFuY2VcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9hcHBlYXJhbmNlXG4gICAgICAgKi9cbiAgICAgIGFwcGVhcmFuY2U6IFt7XG4gICAgICAgIGFwcGVhcmFuY2U6IFsnbm9uZScsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBDYXJldCBDb2xvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2p1c3QtaW4tdGltZS1tb2RlI2NhcmV0LWNvbG9yLXV0aWxpdGllc1xuICAgICAgICovXG4gICAgICAnY2FyZXQtY29sb3InOiBbe1xuICAgICAgICBjYXJldDogc2NhbGVDb2xvcigpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ29sb3IgU2NoZW1lXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY29sb3Itc2NoZW1lXG4gICAgICAgKi9cbiAgICAgICdjb2xvci1zY2hlbWUnOiBbe1xuICAgICAgICBzY2hlbWU6IFsnbm9ybWFsJywgJ2RhcmsnLCAnbGlnaHQnLCAnbGlnaHQtZGFyaycsICdvbmx5LWRhcmsnLCAnb25seS1saWdodCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogQ3Vyc29yXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvY3Vyc29yXG4gICAgICAgKi9cbiAgICAgIGN1cnNvcjogW3tcbiAgICAgICAgY3Vyc29yOiBbJ2F1dG8nLCAnZGVmYXVsdCcsICdwb2ludGVyJywgJ3dhaXQnLCAndGV4dCcsICdtb3ZlJywgJ2hlbHAnLCAnbm90LWFsbG93ZWQnLCAnbm9uZScsICdjb250ZXh0LW1lbnUnLCAncHJvZ3Jlc3MnLCAnY2VsbCcsICdjcm9zc2hhaXInLCAndmVydGljYWwtdGV4dCcsICdhbGlhcycsICdjb3B5JywgJ25vLWRyb3AnLCAnZ3JhYicsICdncmFiYmluZycsICdhbGwtc2Nyb2xsJywgJ2NvbC1yZXNpemUnLCAncm93LXJlc2l6ZScsICduLXJlc2l6ZScsICdlLXJlc2l6ZScsICdzLXJlc2l6ZScsICd3LXJlc2l6ZScsICduZS1yZXNpemUnLCAnbnctcmVzaXplJywgJ3NlLXJlc2l6ZScsICdzdy1yZXNpemUnLCAnZXctcmVzaXplJywgJ25zLXJlc2l6ZScsICduZXN3LXJlc2l6ZScsICdud3NlLXJlc2l6ZScsICd6b29tLWluJywgJ3pvb20tb3V0JywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBGaWVsZCBTaXppbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9maWVsZC1zaXppbmdcbiAgICAgICAqL1xuICAgICAgJ2ZpZWxkLXNpemluZyc6IFt7XG4gICAgICAgICdmaWVsZC1zaXppbmcnOiBbJ2ZpeGVkJywgJ2NvbnRlbnQnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFBvaW50ZXIgRXZlbnRzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvcG9pbnRlci1ldmVud
25114HNcbiAgICAgICAqL1xuICAgICAgJ3BvaW50ZXItZXZlbnRzJzogW3tcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzJzogWydhdXRvJywgJ25vbmUnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFJlc2l6ZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Jlc2l6ZVxuICAgICAgICovXG4gICAgICByZXNpemU6IFt7XG4gICAgICAgIHJlc2l6ZTogWydub25lJywgJycsICd5JywgJ3gnXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBCZWhhdmlvclxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1iZWhhdmlvclxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLWJlaGF2aW9yJzogW3tcbiAgICAgICAgc2Nyb2xsOiBbJ2F1dG8nLCAnc21vb3RoJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW0nOiBbe1xuICAgICAgICAnc2Nyb2xsLW0nOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW14JzogW3tcbiAgICAgICAgJ3Njcm9sbC1teCc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbXknOiBbe1xuICAgICAgICAnc2Nyb2xsLW15Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gU3RhcnRcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbXMnOiBbe1xuICAgICAgICAnc2Nyb2xsLW1zJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gRW5kXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLW1hcmdpblxuICAgICAgICovXG4gICAgICAnc2Nyb2xsLW1lJzogW3tcbiAgICAgICAgJ3Njcm9sbC1tZSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgTWFyZ2luIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tdCc6IFt7XG4gICAgICAgICdzY3JvbGwtbXQnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBSaWdodFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tcic6IFt7XG4gICAgICAgICdzY3JvbGwtbXInOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIE1hcmdpbiBCb3R0b21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtbWFyZ2luXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtbWInOiBbe1xuICAgICAgICAnc2Nyb2xsLW1iJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBNYXJnaW4gTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1tYXJnaW5cbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1tbCc6IFt7XG4gICAgICAgICdzY3JvbGwtbWwnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmdcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXAnOiBbe1xuICAgICAgICAnc2Nyb2xsLXAnOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgWFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHgnOiBbe1xuICAgICAgICAnc2Nyb2xsLXB4Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFlcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9zY3JvbGwtcGFkZGluZ1xuICAgICAgICovXG4gICAgICAnc2Nyb2xsLXB5JzogW3tcbiAgICAgICAgJ3Njcm9sbC1weSc6IHNjYWxlVW5hbWJpZ3VvdXNTcGFjaW5nKClcbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgUGFkZGluZyBTdGFydFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHMnOiBbe1xuICAgICAgICAnc2Nyb2xsLXBzJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIEVuZFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcGUnOiBbe1xuICAgICAgICAnc2Nyb2xsLXBlJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFRvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcHQnOiBbe1xuICAgICAgICAnc2Nyb2xsLXB0Jzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBQYWRkaW5nIFJpZ2h0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXBhZGRpbmdcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1wcic6IFt7XG4gICAgICAgICdzY3JvbGwtcHInOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgQm90dG9tXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXBhZGRpbmdcbiAgICAgICAqL1xuICAgICAgJ3Njcm9sbC1wYic6IFt7XG4gICAgICAgICdzY3JvbGwtcGInOiBzY2FsZVVuYW1iaWd1b3VzU3BhY2luZygpXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFBhZGRpbmcgTGVmdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1wYWRkaW5nXG4gICAgICAgKi9cbiAgICAgICdzY3JvbGwtcGwnOiBbe1xuICAgICAgICAnc2Nyb2xsLXBsJzogc2NhbGVVbmFtYmlndW91c1NwYWNpbmcoKVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFNjcm9sbCBTbmFwIEFsaWduXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXNuYXAtYWxpZ25cbiAgICAgICAqL1xuICAgICAgJ3NuYXAtYWxpZ24nOiBbe1xuICAgICAgICBzbmFwOiBbJ3N0YXJ0JywgJ2VuZCcsICdjZW50ZXInLCAnYWxpZ24tbm9uZSddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFNuYXAgU3RvcFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1zbmFwLXN0b3BcbiAgICAgICAqL1xuICAgICAgJ3NuYXAtc3RvcCc6IFt7XG4gICAgICAgI
25114HNuYXA6IFsnbm9ybWFsJywgJ2Fsd2F5cyddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFNuYXAgVHlwZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3Njcm9sbC1zbmFwLXR5cGVcbiAgICAgICAqL1xuICAgICAgJ3NuYXAtdHlwZSc6IFt7XG4gICAgICAgIHNuYXA6IFsnbm9uZScsICd4JywgJ3knLCAnYm90aCddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIFNuYXAgVHlwZSBTdHJpY3RuZXNzXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc2Nyb2xsLXNuYXAtdHlwZVxuICAgICAgICovXG4gICAgICAnc25hcC1zdHJpY3RuZXNzJzogW3tcbiAgICAgICAgc25hcDogWydtYW5kYXRvcnknLCAncHJveGltaXR5J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3VjaCBBY3Rpb25cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3VjaC1hY3Rpb25cbiAgICAgICAqL1xuICAgICAgdG91Y2g6IFt7XG4gICAgICAgIHRvdWNoOiBbJ2F1dG8nLCAnbm9uZScsICdtYW5pcHVsYXRpb24nXVxuICAgICAgfV0sXG4gICAgICAvKipcbiAgICAgICAqIFRvdWNoIEFjdGlvbiBYXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdG91Y2gtYWN0aW9uXG4gICAgICAgKi9cbiAgICAgICd0b3VjaC14JzogW3tcbiAgICAgICAgJ3RvdWNoLXBhbic6IFsneCcsICdsZWZ0JywgJ3JpZ2h0J11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBUb3VjaCBBY3Rpb24gWVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3RvdWNoLWFjdGlvblxuICAgICAgICovXG4gICAgICAndG91Y2gteSc6IFt7XG4gICAgICAgICd0b3VjaC1wYW4nOiBbJ3knLCAndXAnLCAnZG93biddXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogVG91Y2ggQWN0aW9uIFBpbmNoIFpvb21cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy90b3VjaC1hY3Rpb25cbiAgICAgICAqL1xuICAgICAgJ3RvdWNoLXB6JzogWyd0b3VjaC1waW5jaC16b29tJ10sXG4gICAgICAvKipcbiAgICAgICAqIFVzZXIgU2VsZWN0XG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvdXNlci1zZWxlY3RcbiAgICAgICAqL1xuICAgICAgc2VsZWN0OiBbe1xuICAgICAgICBzZWxlY3Q6IFsnbm9uZScsICd0ZXh0JywgJ2FsbCcsICdhdXRvJ11cbiAgICAgIH1dLFxuICAgICAgLyoqXG4gICAgICAgKiBXaWxsIENoYW5nZVxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL3dpbGwtY2hhbmdlXG4gICAgICAgKi9cbiAgICAgICd3aWxsLWNoYW5nZSc6IFt7XG4gICAgICAgICd3aWxsLWNoYW5nZSc6IFsnYXV0bycsICdzY3JvbGwnLCAnY29udGVudHMnLCAndHJhbnNmb3JtJywgaXNBcmJpdHJhcnlWYXJpYWJsZSwgaXNBcmJpdHJhcnlWYWx1ZV1cbiAgICAgIH1dLFxuICAgICAgLy8gLS0tLS0tLS0tLS1cbiAgICAgIC8vIC0tLSBTVkcgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLVxuICAgICAgLyoqXG4gICAgICAgKiBGaWxsXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZmlsbFxuICAgICAgICovXG4gICAgICBmaWxsOiBbe1xuICAgICAgICBmaWxsOiBbJ25vbmUnLCAuLi5zY2FsZUNvbG9yKCldXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3Ryb2tlIFdpZHRoXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3Ryb2tlLXdpZHRoXG4gICAgICAgKi9cbiAgICAgICdzdHJva2Utdyc6IFt7XG4gICAgICAgIHN0cm9rZTogW2lzTnVtYmVyLCBpc0FyYml0cmFyeVZhcmlhYmxlTGVuZ3RoLCBpc0FyYml0cmFyeUxlbmd0aCwgaXNBcmJpdHJhcnlOdW1iZXJdXG4gICAgICB9XSxcbiAgICAgIC8qKlxuICAgICAgICogU3Ryb2tlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3Mvc3Ryb2tlXG4gICAgICAgKi9cbiAgICAgIHN0cm9rZTogW3tcbiAgICAgICAgc3Ryb2tlOiBbJ25vbmUnLCAuLi5zY2FsZUNvbG9yKCldXG4gICAgICB9XSxcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gLS0tIEFjY2Vzc2liaWxpdHkgLS0tXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8qKlxuICAgICAgICogRm9yY2VkIENvbG9yIEFkanVzdFxuICAgICAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2ZvcmNlZC1jb2xvci1hZGp1c3RcbiAgICAgICAqL1xuICAgICAgJ2ZvcmNlZC1jb2xvci1hZGp1c3QnOiBbe1xuICAgICAgICAnZm9yY2VkLWNvbG9yLWFkanVzdCc6IFsnYXV0bycsICdub25lJ11cbiAgICAgIH1dXG4gICAgfSxcbiAgICBjb25mbGljdGluZ0NsYXNzR3JvdXBzOiB7XG4gICAgICBvdmVyZmxvdzogWydvdmVyZmxvdy14JywgJ292ZXJmbG93LXknXSxcbiAgICAgIG92ZXJzY3JvbGw6IFsnb3ZlcnNjcm9sbC14JywgJ292ZXJzY3JvbGwteSddLFxuICAgICAgaW5zZXQ6IFsnaW5zZXQteCcsICdpbnNldC15JywgJ3N0YXJ0JywgJ2VuZCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgICAgICdpbnNldC14JzogWydyaWdodCcsICdsZWZ0J10sXG4gICAgICAnaW5zZXQteSc6IFsndG9wJywgJ2JvdHRvbSddLFxuICAgICAgZmxleDogWydiYXNpcycsICdncm93JywgJ3NocmluayddLFxuICAgICAgZ2FwOiBbJ2dhcC14JywgJ2dhcC15J10sXG4gICAgICBwOiBbJ3B4JywgJ3B5JywgJ3BzJywgJ3BlJywgJ3B0JywgJ3ByJywgJ3BiJywgJ3BsJ10sXG4gICAgICBweDogWydwcicsICdwbCddLFxuICAgICAgcHk6IFsncHQnLCAncGInXSxcbiAgICAgIG06IFsnbXgnLCAnbXknLCAnbXMnLCAnbWUnLCAnbXQnLCAnbXInLCAnbWInLCAnbWwnXSxcbiAgICAgIG14OiBbJ21yJywgJ21sJ10sXG4gICAgICBteTogWydtdCcsICdtYiddLFxuICAgICAgc2l6ZTogWyd3JywgJ2gnXSxcbiAgICAgICdmb250LXNpemUnOiBbJ2xlYWRpbmcnXSxcbiAgICAgICdmdm4tbm9ybWFsJzogWydmdm4tb3JkaW5hbCcsICdmdm4tc2xhc2hlZC16ZXJvJywgJ2Z2bi1maWd1cmUnLCAnZnZuLXNwYWNpbmcnLCAnZnZuLWZyYWN0aW9uJ10sXG4gICAgICAnZnZuLW9yZGluYWwnOiBbJ2Z2bi1ub3JtYWwnXSxcbiAgICAgICdmdm4tc2xhc2hlZC16ZXJvJzogW
25114ydmdm4tbm9ybWFsJ10sXG4gICAgICAnZnZuLWZpZ3VyZSc6IFsnZnZuLW5vcm1hbCddLFxuICAgICAgJ2Z2bi1zcGFjaW5nJzogWydmdm4tbm9ybWFsJ10sXG4gICAgICAnZnZuLWZyYWN0aW9uJzogWydmdm4tbm9ybWFsJ10sXG4gICAgICAnbGluZS1jbGFtcCc6IFsnZGlzcGxheScsICdvdmVyZmxvdyddLFxuICAgICAgcm91bmRlZDogWydyb3VuZGVkLXMnLCAncm91bmRlZC1lJywgJ3JvdW5kZWQtdCcsICdyb3VuZGVkLXInLCAncm91bmRlZC1iJywgJ3JvdW5kZWQtbCcsICdyb3VuZGVkLXNzJywgJ3JvdW5kZWQtc2UnLCAncm91bmRlZC1lZScsICdyb3VuZGVkLWVzJywgJ3JvdW5kZWQtdGwnLCAncm91bmRlZC10cicsICdyb3VuZGVkLWJyJywgJ3JvdW5kZWQtYmwnXSxcbiAgICAgICdyb3VuZGVkLXMnOiBbJ3JvdW5kZWQtc3MnLCAncm91bmRlZC1lcyddLFxuICAgICAgJ3JvdW5kZWQtZSc6IFsncm91bmRlZC1zZScsICdyb3VuZGVkLWVlJ10sXG4gICAgICAncm91bmRlZC10JzogWydyb3VuZGVkLXRsJywgJ3JvdW5kZWQtdHInXSxcbiAgICAgICdyb3VuZGVkLXInOiBbJ3JvdW5kZWQtdHInLCAncm91bmRlZC1iciddLFxuICAgICAgJ3JvdW5kZWQtYic6IFsncm91bmRlZC1icicsICdyb3VuZGVkLWJsJ10sXG4gICAgICAncm91bmRlZC1sJzogWydyb3VuZGVkLXRsJywgJ3JvdW5kZWQtYmwnXSxcbiAgICAgICdib3JkZXItc3BhY2luZyc6IFsnYm9yZGVyLXNwYWNpbmcteCcsICdib3JkZXItc3BhY2luZy15J10sXG4gICAgICAnYm9yZGVyLXcnOiBbJ2JvcmRlci13LXgnLCAnYm9yZGVyLXcteScsICdib3JkZXItdy1zJywgJ2JvcmRlci13LWUnLCAnYm9yZGVyLXctdCcsICdib3JkZXItdy1yJywgJ2JvcmRlci13LWInLCAnYm9yZGVyLXctbCddLFxuICAgICAgJ2JvcmRlci13LXgnOiBbJ2JvcmRlci13LXInLCAnYm9yZGVyLXctbCddLFxuICAgICAgJ2JvcmRlci13LXknOiBbJ2JvcmRlci13LXQnLCAnYm9yZGVyLXctYiddLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IFsnYm9yZGVyLWNvbG9yLXgnLCAnYm9yZGVyLWNvbG9yLXknLCAnYm9yZGVyLWNvbG9yLXMnLCAnYm9yZGVyLWNvbG9yLWUnLCAnYm9yZGVyLWNvbG9yLXQnLCAnYm9yZGVyLWNvbG9yLXInLCAnYm9yZGVyLWNvbG9yLWInLCAnYm9yZGVyLWNvbG9yLWwnXSxcbiAgICAgICdib3JkZXItY29sb3IteCc6IFsnYm9yZGVyLWNvbG9yLXInLCAnYm9yZGVyLWNvbG9yLWwnXSxcbiAgICAgICdib3JkZXItY29sb3IteSc6IFsnYm9yZGVyLWNvbG9yLXQnLCAnYm9yZGVyLWNvbG9yLWInXSxcbiAgICAgIHRyYW5zbGF0ZTogWyd0cmFuc2xhdGUteCcsICd0cmFuc2xhdGUteScsICd0cmFuc2xhdGUtbm9uZSddLFxuICAgICAgJ3RyYW5zbGF0ZS1ub25lJzogWyd0cmFuc2xhdGUnLCAndHJhbnNsYXRlLXgnLCAndHJhbnNsYXRlLXknLCAndHJhbnNsYXRlLXonXSxcbiAgICAgICdzY3JvbGwtbSc6IFsnc2Nyb2xsLW14JywgJ3Njcm9sbC1teScsICdzY3JvbGwtbXMnLCAnc2Nyb2xsLW1lJywgJ3Njcm9sbC1tdCcsICdzY3JvbGwtbXInLCAnc2Nyb2xsLW1iJywgJ3Njcm9sbC1tbCddLFxuICAgICAgJ3Njcm9sbC1teCc6IFsnc2Nyb2xsLW1yJywgJ3Njcm9sbC1tbCddLFxuICAgICAgJ3Njcm9sbC1teSc6IFsnc2Nyb2xsLW10JywgJ3Njcm9sbC1tYiddLFxuICAgICAgJ3Njcm9sbC1wJzogWydzY3JvbGwtcHgnLCAnc2Nyb2xsLXB5JywgJ3Njcm9sbC1wcycsICdzY3JvbGwtcGUnLCAnc2Nyb2xsLXB0JywgJ3Njcm9sbC1wcicsICdzY3JvbGwtcGInLCAnc2Nyb2xsLXBsJ10sXG4gICAgICAnc2Nyb2xsLXB4JzogWydzY3JvbGwtcHInLCAnc2Nyb2xsLXBsJ10sXG4gICAgICAnc2Nyb2xsLXB5JzogWydzY3JvbGwtcHQnLCAnc2Nyb2xsLXBiJ10sXG4gICAgICB0b3VjaDogWyd0b3VjaC14JywgJ3RvdWNoLXknLCAndG91Y2gtcHonXSxcbiAgICAgICd0b3VjaC14JzogWyd0b3VjaCddLFxuICAgICAgJ3RvdWNoLXknOiBbJ3RvdWNoJ10sXG4gICAgICAndG91Y2gtcHonOiBbJ3RvdWNoJ11cbiAgICB9LFxuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczoge1xuICAgICAgJ2ZvbnQtc2l6ZSc6IFsnbGVhZGluZyddXG4gICAgfSxcbiAgICBvcmRlclNlbnNpdGl2ZU1vZGlmaWVyczogWycqJywgJyoqJywgJ2FmdGVyJywgJ2JhY2tkcm9wJywgJ2JlZm9yZScsICdkZXRhaWxzLWNvbnRlbnQnLCAnZmlsZScsICdmaXJzdC1sZXR0ZXInLCAnZmlyc3QtbGluZScsICdtYXJrZXInLCAncGxhY2Vob2xkZXInLCAnc2VsZWN0aW9uJ11cbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGJhc2VDb25maWcgQ29uZmlnIHdoZXJlIG90aGVyIGNvbmZpZyB3aWxsIGJlIG1lcmdlZCBpbnRvLiBUaGlzIG9iamVjdCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcGFyYW0gY29uZmlnRXh0ZW5zaW9uIFBhcnRpYWwgY29uZmlnIHRvIG1lcmdlIGludG8gdGhlIGBiYXNlQ29uZmlnYC5cbiAqL1xuY29uc3QgbWVyZ2VDb25maWdzID0gKGJhc2VDb25maWcsIHtcbiAgY2FjaGVTaXplLFxuICBwcmVmaXgsXG4gIGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lLFxuICBleHRlbmQgPSB7fSxcbiAgb3ZlcnJpZGUgPSB7fVxufSkgPT4ge1xuICBvdmVycmlkZVByb3BlcnR5KGJhc2VDb25maWcsICdjYWNoZVNpemUnLCBjYWNoZVNpemUpO1xuICBvdmVycmlkZVByb3BlcnR5KGJhc2VDb25maWcsICdwcmVmaXgnLCBwcmVmaXgpO1xuICBvdmVycmlkZVByb3BlcnR5KGJhc2VDb25maWcsICdleHBlcmltZW50YWxQYXJzZUNsYXNzTmFtZScsIGV4cGVyaW1lbnRhbFBhcnNlQ2xhc3NOYW1lKTtcbiAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcudGhlbWUsIG92ZXJyaWRlLnRoZW1lKTtcbiAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcuY2xhc3NHcm91cHMsIG92ZXJyaWRlLmNsYXNzR3JvdXBzKTtcbiAgb3ZlcnJpZGVDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcuY29uZmxpY3RpbmdDbGFzc0dyb3Vwcywgb3ZlcnJpZGUuY29uZmxpY3RpbmdDbGFzc0dyb3Vwcyk7XG4gIG92ZXJyaWRlQ29uZmlnUHJvcGVydGllcyhiYXNlQ29uZmlnLmNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVycywgb3ZlcnJpZGUuY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzKTtcbiAgb3ZlcnJpZGVQcm9wZXJ0eShiYXNlQ29uZmlnLCAnb3JkZXJTZW5zaXRpdmVNb2RpZmllcnMnLCBvdmVycmlkZS5vcmRlclNlbnNpdGl2ZU1vZGlmaWVycyk7XG4gIG1lcmdlQ29uZmlnUHJvcGVydGllcyhiYXNlQ29uZmlnLnRoZW1lLCBleHRlbmQudGhlbWUpO1xuICBtZXJnZUNvbmZpZ1Byb3BlcnRpZXMoYmFzZUNvbmZpZy5jbGFzc0dyb3VwcywgZXh0ZW5kLmNsYXNzR3JvdXBzKTtcbiAgbWVyZ2VDb25maWdQcm9wZXJ0aWVzKGJhc2VDb25maWcuY29uZmxpY3RpbmdDbGFzc0dyb3VwcywgZXh0ZW5kLmNvbmZsaWN0aW5nQ2xhc3NHcm91cHMpO1xuICBtZXJnZUNvbmZpZ1Byb3BlcnRpZXMoYmFzZUNvbmZpZy5jb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnMsIGV4dGVuZC5jb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnMpO1xuICBtZXJnZUFycmF5UHJvcGVydGllcyhiYXNlQ29uZmlnLCBleHRlbmQsICdvcmRlclNlbnNpdGl2ZU1vZGlmaWVycycpO1xuICByZXR1cm4gYmFzZUNvbmZpZztcbn07XG5jb25zdCBvdmVycmlkZVByb3BlcnR5ID0gKGJhc2VPYmplY3QsIG92ZXJyaWRlS2V5LCBvdmVycmlkZVZhbHVlKSA9PiB7XG4gIGlmIChvdmVycmlkZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBiYXNlT2JqZWN0W292ZXJyaWRlS2V5XSA9IG92ZXJyaWRlVmFsdWU7XG4gIH1cbn07XG5jb25zdCBvdmVycmlkZUNvbmZpZ1Byb3BlcnRpZXMgPSAoYmFzZU9iamVjdCwgb3ZlcnJpZGVPYmplY3QpID0+IHtcbiAgaWYgKG92ZXJyaWRlT2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3ZlcnJpZGVPYmplY3QpIHtcbiAgICAgIG92ZXJyaWRlUHJvcGVydHkoYmFzZU9iamVjdCwga2V5LCBvdmVycmlkZU9iamVjdFtrZXldKTtcbiAgICB9XG4gI
25114H1cbn07XG5jb25zdCBtZXJnZUNvbmZpZ1Byb3BlcnRpZXMgPSAoYmFzZU9iamVjdCwgbWVyZ2VPYmplY3QpID0+IHtcbiAgaWYgKG1lcmdlT2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VPYmplY3QpIHtcbiAgICAgIG1lcmdlQXJyYXlQcm9wZXJ0aWVzKGJhc2VPYmplY3QsIG1lcmdlT2JqZWN0LCBrZXkpO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG1lcmdlQXJyYXlQcm9wZXJ0aWVzID0gKGJhc2VPYmplY3QsIG1lcmdlT2JqZWN0LCBrZXkpID0+IHtcbiAgY29uc3QgbWVyZ2VWYWx1ZSA9IG1lcmdlT2JqZWN0W2tleV07XG4gIGlmIChtZXJnZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBiYXNlT2JqZWN0W2tleV0gPSBiYXNlT2JqZWN0W2tleV0gPyBiYXNlT2JqZWN0W2tleV0uY29uY2F0KG1lcmdlVmFsdWUpIDogbWVyZ2VWYWx1ZTtcbiAgfVxufTtcbmNvbnN0IGV4dGVuZFRhaWx3aW5kTWVyZ2UgPSAoY29uZmlnRXh0ZW5zaW9uLCAuLi5jcmVhdGVDb25maWcpID0+IHR5cGVvZiBjb25maWdFeHRlbnNpb24gPT09ICdmdW5jdGlvbicgPyBjcmVhdGVUYWlsd2luZE1lcmdlKGdldERlZmF1bHRDb25maWcsIGNvbmZpZ0V4dGVuc2lvbiwgLi4uY3JlYXRlQ29uZmlnKSA6IGNyZWF0ZVRhaWx3aW5kTWVyZ2UoKCkgPT4gbWVyZ2VDb25maWdzKGdldERlZmF1bHRDb25maWcoKSwgY29uZmlnRXh0ZW5zaW9uKSwgLi4uY3JlYXRlQ29uZmlnKTtcbmNvbnN0IHR3TWVyZ2UgPSAvKiNfX1BVUkVfXyovY3JlYXRlVGFpbHdpbmRNZXJnZShnZXREZWZhdWx0Q29uZmlnKTtcbmV4cG9ydCB7IGNyZWF0ZVRhaWx3aW5kTWVyZ2UsIGV4dGVuZFRhaWx3aW5kTWVyZ2UsIGZyb21UaGVtZSwgZ2V0RGVmYXVsdENvbmZpZywgbWVyZ2VDb25maWdzLCB0d0pvaW4sIHR3TWVyZ2UsIHZhbGlkYXRvcnMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1bmRsZS1tanMubWpzLm1hcFxuIiwiaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCB7IHR3TWVyZ2UgfSBmcm9tICd0YWlsd2luZC1tZXJnZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNuKC4uLmlucHV0czogQ2xhc3NWYWx1ZVtdKSB7XG4gIHJldHVybiB0d01lcmdlKGNsc3goaW5wdXRzKSlcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vdXRpbHMvY24nXG5cbmNvbnN0IENhcmQgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxkaXZcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgJ3JvdW5kZWQtbGcgYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQgc2hhZG93LXNtJyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkNhcmQuZGlzcGxheU5hbWUgPSAnQ2FyZCdcblxuY29uc3QgQ2FyZEhlYWRlciA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgc3BhY2UteS0xLjUgcC02JywgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZEhlYWRlci5kaXNwbGF5TmFtZSA9ICdDYXJkSGVhZGVyJ1xuXG5jb25zdCBDYXJkVGl0bGUgPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MUGFyYWdyYXBoRWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTEhlYWRpbmdFbGVtZW50PlxuPigoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0sIHJlZikgPT4gKFxuICA8aDNcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgJ3RleHQtMnhsIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lIHRyYWNraW5nLXRpZ2h0JyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkNhcmRUaXRsZS5kaXNwbGF5TmFtZSA9ICdDYXJkVGl0bGUnXG5cbmNvbnN0IENhcmREZXNjcmlwdGlvbiA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxQYXJhZ3JhcGhFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MUGFyYWdyYXBoRWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPHBcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsIGNsYXNzTmFtZSl9XG4gICAgey4uLnByb3BzfVxuICAvPlxuKSlcbkNhcmREZXNjcmlwdGlvbi5kaXNwbGF5TmFtZSA9ICdDYXJkRGVzY3JpcHRpb24nXG5cbmNvbnN0IENhcmRDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PlxuPigoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0sIHJlZikgPT4gKFxuICA8ZGl2IHJlZj17cmVmfSBjbGFzc05hbWU9e2NuKCdwLTYgcHQtMCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbikpXG5DYXJkQ29udGVudC5kaXNwbGF5TmFtZSA9ICdDYXJkQ29udGVudCdcblxuY29uc3QgQ2FyZEZvb3RlciA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD5cbj4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggaXRlbXMtY2VudGVyIHAtNiBwdC0wJywgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKVxuQ2FyZEZvb3Rlci5kaXNwbGF5TmFtZSA9ICdDYXJkRm9vdGVyJ1xuXG5leHBvcnQgeyBDYXJkLCBDYXJkSGVhZGVyLCBDYXJkRm9vdGVyLCBDYXJkVGl0bGUsIENhcmREZXNjcmlwdGlvbiwgQ2FyZENvbnRlbnQgfVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnXG5pbXBvcnQgeyBBcnJvd1JpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1dHRvblByb3BzIGV4dGVuZHMgUmVhY3QuQnV0dG9uSFRNTEF0dHJpYnV0ZXM8SFRNTEJ1dHRvbkVsZW1lbnQ+IHtcbiAgdmFyaWFudD86ICdwcmltYXJ5JyB8ICdzZWNvbmRhcnknIHwgJ2FjY2VudCcgfCAnZ2hvc3QnXG4gIHNpemU/OiAnc20nIHwgJ21kJyB8ICdsZydcbiAgc2hvd0Fycm93PzogYm9vbGVhblxuICBmdWxsV2lkdGg/OiBib29sZWFuXG4gIGxvYWRpbmc/OiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbn1cblxuZXhwb3J0IGNvbnN0IEJ1dHRvbjogUmVhY3QuRkM8QnV0dG9uUHJvcHM+ID0gKHtcbiAgdmFyaWFudCA9ICdwcmltYXJ5JyxcbiAgc2l6ZSA9ICdtZCcsXG4gIHNob3dBcnJvdyA9IGZhbHNlLFxuICBmdWxsV2lkdGggPSBmYWxzZSxcbiAgbG9hZGluZyA9IGZhbHNlLFxuICBjbGFzc05hbWUsXG4gIGRpc2FibGVkLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn0pID0+IHtcbiAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgLy8gQmFzZSBzdHlsZXNcbiAgICAnaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAnZm9udC1oZWx2ZXRpY2Etbm93IGZvbnQtYm9sZCcsXG4gICAgJ3RyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCcsXG4gICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMicsXG4gICAgJ2Rpc2FibGVkOm9wYWNpdHktNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkJyxcbiAgICAndXBwZXJjYXNlIHRyYWNraW5nLXdpZGUnLFxuICAgIC8vIE5vIHJvdW5kZWQgY29ybmVycyBmb3IgTUVDXG4gICAgJ2JvcmRlci0wJ1xuICBdXG5cbiAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB7XG4gICAgLy8gRGFyayBiYWNrZ3JvdW5kIChsaWtlIFwiQWxsZSBOYWNocmljaHRlblwiKVxuICAgIHByaW1hcnk6IFtcbiAgICAgICdiZy1tZWMtc2Vjb25kYXJ5IHRleHQtd2hpdGUnLFxuICAgICAgJ2hvdmVyOmJnLW1lYy1zZWNvbmRhcnkvOTAnLFxuICAgICAgJ2ZvY3VzOnJpbmctbWVjLXNlY29uZGFyeSdcbiAgICBdLFxuICAgIC8vIExpZ2h0IGJhY2tncm91bmQgKGxpa2UgXCJKZXR6dCBiZXdlcmJlblwiKVxuICAgIHNlY29uZGFyeTogW1xuICAgICAgJ2JnLWdyYXktNDAwIHRleHQtd2hpdGUnLFxuICAgICAgJ2hvdmVyOmJnLWdyYXktNTAwJyxcbiAgICAgICdmb2N1czpyaW5nLWdyYXktNDAwJ1xuICAgIF0sXG4gICAgLy8gUmVkIGJhY2tncm91bmQgKGxpa2UgXCJXZWl0ZXJlIEluZm9ybWF0aW9uZW5cIilcbiAgICBhY2NlbnQ6IFtcbiAgICAgICdiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlJyxcbiAgICAgICdob3ZlcjpiZy1tZWMtcHJpbWFyeS85MCcsXG4gICAgICAnZm9jdXM6cmluZy1tZWMtcHJpbWFyeSdcbiAgICBdLFxuICAgIC8vIFRyYW5zcGFyZW50L0dob3N0IGJ1dHRvbnNcbiAgICBnaG9zdDogW1xuICAgICAgJ2JnLXRyYW5zcGFyZW50IGJvcmRlci0yJyxcbiAgICAgICd0ZXh0LW1lYy1zZWNvbmRhcnkgYm9yZGVyLW1lYy1zZWNvbmRhcnknLFxuICAgICAgJ2hvdmVyOmJnLW1lYy1zZWNvbmRhcnkgaG92ZXI6dGV4dC13aGl0ZScsXG4gICAgICAnZm9jdXM6cmluZy1tZWMtc2Vjb25kYXJ5J1xuICAgIF1cbiAgfVxuXG4gIGNvbnN0IHNpemVDbGFzc2VzID0ge1xuICAgIHNtOiAncHgtNCBweS0yIHRleHQtc20nLFxuICAgIG1kOiAncHgtNiBweS0zIHRleHQtYmFzZScsXG4gICAgbGc6ICdweC04IHB5LTQgdGV4dC1sZydcbiAgfVxuXG4gIGNvbnN0IHdpZHRoQ2xhc3NlcyA9IGZ1bGxXaWR0aCA/ICd3LWZ1bGwnIDogJydcblxuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgYmFzZUNsYXNzZXMsXG4gICAgICAgI
25114HZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLFxuICAgICAgICBzaXplQ2xhc3Nlc1tzaXplXSxcbiAgICAgICAgd2lkdGhDbGFzc2VzLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgbG9hZGluZ31cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctNCBoLTQgYm9yZGVyLTIgYm9yZGVyLWN1cnJlbnQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgYW5pbWF0ZS1zcGluIHJvdW5kZWQtZnVsbFwiIC8+XG4gICAgICAgICAgPHNwYW4+TGFkZW4uLi48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICA8c3Bhbj57Y2hpbGRyZW59PC9zcGFuPlxuICAgICAgICAgIHtzaG93QXJyb3cgJiYgKFxuICAgICAgICAgICAgPEFycm93UmlnaHQgY2xhc3NOYW1lPVwidy01IGgtNSBtbC0yXCIgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9idXR0b24+XG4gIClcbn1cblxuLy8gQ29udmVuaWVuY2UgY29tcG9uZW50cyBmb3Igc3BlY2lmaWMgTUVDIGJ1dHRvbiBzdHlsZXNcbmV4cG9ydCBjb25zdCBNRUNCdXR0b25QcmltYXJ5OiBSZWFjdC5GQzxPbWl0PEJ1dHRvblByb3BzLCAndmFyaWFudCc+PiA9IChwcm9wcykgPT4gKFxuICA8QnV0dG9uIHZhcmlhbnQ9XCJwcmltYXJ5XCIgc2hvd0Fycm93IHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGNvbnN0IE1FQ0J1dHRvblNlY29uZGFyeTogUmVhY3QuRkM8T21pdDxCdXR0b25Qcm9wcywgJ3ZhcmlhbnQnPj4gPSAocHJvcHMpID0+IChcbiAgPEJ1dHRvbiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgc2hvd0Fycm93IHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGNvbnN0IE1FQ0J1dHRvbkFjY2VudDogUmVhY3QuRkM8T21pdDxCdXR0b25Qcm9wcywgJ3ZhcmlhbnQnPj4gPSAocHJvcHMpID0+IChcbiAgPEJ1dHRvbiB2YXJpYW50PVwiYWNjZW50XCIgc2hvd0Fycm93IHsuLi5wcm9wc30gLz5cbilcblxuZXhwb3J0IGNvbnN0IE1FQ0J1dHRvbkdob3N0OiBSZWFjdC5GQzxPbWl0PEJ1dHRvblByb3BzLCAndmFyaWFudCc+PiA9IChwcm9wcykgPT4gKFxuICA8QnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNob3dBcnJvdyB7Li4ucHJvcHN9IC8+XG4pXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjbHN4IH0gZnJvbSAnY2xzeCdcblxuaW50ZXJmYWNlIEJhZGdlUHJvcHMgZXh0ZW5kcyBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4ge1xuICB2YXJpYW50PzogJ2RlZmF1bHQnIHwgJ3NlY29uZGFyeScgfCAnZGVzdHJ1Y3RpdmUnIHwgJ291dGxpbmUnXG59XG5cbmNvbnN0IEJhZGdlOiBSZWFjdC5GQzxCYWRnZVByb3BzPiA9ICh7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgLi4ucHJvcHNcbn0pID0+IHtcbiAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyIHB4LTIuNSBweS0wLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzJ1xuICBdXG5cbiAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB7XG4gICAgZGVmYXVsdDogJ2JvcmRlci10cmFuc3BhcmVudCBiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlJyxcbiAgICBzZWNvbmRhcnk6ICdib3JkZXItdHJhbnNwYXJlbnQgYmctZ3JheS0xMDAgdGV4dC1ncmF5LTgwMCcsXG4gICAgZGVzdHJ1Y3RpdmU6ICdib3JkZXItdHJhbnNwYXJlbnQgYmctcmVkLTUwMCB0ZXh0LXdoaXRlJyxcbiAgICBvdXRsaW5lOiAndGV4dC1ncmF5LTcwMCBib3JkZXItZ3JheS0zMDAnXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgYmFzZUNsYXNzZXMsXG4gICAgICAgIHZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBCYWRnZSB9XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIsIENhcmRUaXRsZSB9IGZyb20gJy4uL1VJL0NhcmQnXG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi9VSS9CdXR0b24nXG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gJy4uL1VJL0JhZGdlJ1xuaW1wb3J0IHsgTG9hZGVyMiwgUmVmcmVzaEN3LCBEYXRhYmFzZSwgQ2xvY2ssIENoZWNrQ2lyY2xlLCBBbGVydENpcmNsZSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW50ZXJmYWNlIFN5bmNTdGF0dXMge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIGxhc3RTeW5jVGltZTogc3RyaW5nIHwgbnVsbFxuICBzdGF0aXN0aWNzOiB7XG4gICAgY29udGFjdHM/OiB7XG4gICAgICB0b3RhbFJlY29yZHM6IG51bWJlclxuICAgICAgbGFzdFVwZGF0ZWQ6IHN0cmluZ1xuICAgICAgZmlyc3RDcmVhdGVkOiBzdHJpbmdcbiAgICB9XG4gICAgbG9jYXRpb25zPzoge1xuICAgICAgdG90YWxSZWNvcmRzOiBudW1iZXJcbiAgICAgIGxhc3RVcGRhdGVkOiBzdHJpbmdcbiAgICAgIGZpcnN0Q3JlYXRlZDogc3RyaW5nXG4gICAgfVxuICB9XG4gIG5lZWRzSW5pdGlhbFN5bmM6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFN5bmNSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuXG4gIHN5bmNUeXBlOiAnaW5jcmVtZW50YWwnIHwgJ2Z1bGwnXG4gIHN0YXJ0VGltZTogc3RyaW5nXG4gIGVuZFRpbWU/OiBzdHJpbmdcbiAgZHVyYXRpb24/OiBudW1iZXJcbiAgbG9jYXRpb25zOiB7XG4gICAgY2hlY2tlZDogbnVtYmVyXG4gICAgbmV3OiBudW1iZXJcbiAgICB1cGRhdGVkOiBudW1iZXJcbiAgICBkZWxldGVkOiBudW1iZXJcbiAgICBlcnJvcnM6IHN0cmluZ1tdXG4gIH1cbiAgY29udGFjdHM6IHtcbiAgICBjaGVja2VkOiBudW1iZXJcbiAgICBuZXc6IG51bWJlclxuICAgIHVwZGF0ZWQ6IG51bWJlclxuICAgIGRlbGV0ZWQ6IG51bWJlclxuICAgIGVycm9yczogc3RyaW5nW11cbiAgfVxuICBtZWRpYToge1xuICAgIGRvd25sb2FkZWQ6IG51bWJlclxuICAgIGVycm9yczogc3RyaW5nW11cbiAgfVxufVxuXG5jb25zdCBTeW5jTWFuYWdlcjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IFtzeW5jU3RhdHVzLCBzZXRTeW5jU3RhdHVzXSA9IHVzZVN0YXRlPFN5bmNTdGF0dXMgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1N5bmNpbmcsIHNldElzU3luY2luZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RTeW5jUmVzdWx0LCBzZXRMYXN0U3luY1Jlc3VsdF0gPSB1c2VTdGF0ZTxTeW5jUmVzdWx0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIC8vIExvYWQgc3luYyBzdGF0dXMgb24gY29tcG9uZW50IG1vdW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFN5bmNTdGF0dXMoKVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkU3luY1N0YXR1cyA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhY3RzL3N5bmMvc3RhdHVzJylcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzZXRTeW5jU3RhdHVzKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBzeW5jIHN0YXR1cycpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXRFcnJvcignTmV0d29yayBlcnJvciBsb2FkaW5nIHN5bmMgc3RhdHVzJylcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgc3luYyBzdGF0dXM6JywgZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGVyZm9ybUluY3JlbWVudGFsU3luYyA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRJc1N5bmNpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIHNldExhc3RTeW5jUmVzdWx0KG51bGwpXG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29udGFjdHMvc3luYy9pbmNyZW1lbnRhbCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgI
25114H1cbiAgICAgIH0pXG4gICAgICBcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzZXRMYXN0U3luY1Jlc3VsdChkYXRhKVxuICAgICAgICAvLyBSZWxvYWQgc3luYyBzdGF0dXMgdG8gZ2V0IHVwZGF0ZWQgaW5mb3JtYXRpb25cbiAgICAgICAgYXdhaXQgbG9hZFN5bmNTdGF0dXMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RXJyb3IoZGF0YS5lcnJvciB8fCAnU3luYyBmYWlsZWQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2V0RXJyb3IoJ05ldHdvcmsgZXJyb3IgZHVyaW5nIHN5bmMnKVxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHN5bmM6JywgZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc1N5bmNpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGVyZm9ybUZ1bGxTeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgIHNldElzU3luY2luZyh0cnVlKVxuICAgIHNldEVycm9yKG51bGwpXG4gICAgc2V0TGFzdFN5bmNSZXN1bHQobnVsbClcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb250YWN0cy9kZWJ1Zy91bHRpbWF0ZS13b3JkcHJlc3Mtc3luYycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAvLyBDb252ZXJ0IHVsdGltYXRlIHN5bmMgcmVzcG9uc2UgdG8gb3VyIGZvcm1hdFxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRSZXN1bHQ6IFN5bmNSZXN1bHQgPSB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBzeW5jVHlwZTogJ2Z1bGwnLFxuICAgICAgICAgIHN0YXJ0VGltZTogZGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgZW5kVGltZTogZGF0YS50aW1lc3RhbXAsXG4gICAgICAgICAgbG9jYXRpb25zOiB7XG4gICAgICAgICAgICBjaGVja2VkOiBkYXRhLnN1bW1hcnk/LmxvY2F0aW9uc0NoZWNrZWQgfHwgMCxcbiAgICAgICAgICAgIG5ldzogZGF0YS5yZXN1bHRzPy5sb2NhdGlvbnM/LnN5bmNlZCB8fCAwLFxuICAgICAgICAgICAgdXBkYXRlZDogMCxcbiAgICAgICAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICAgICAgICBlcnJvcnM6IGRhdGEucmVzdWx0cz8ubG9jYXRpb25zPy5lcnJvcnMgfHwgW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnRhY3RzOiB7XG4gICAgICAgICAgICBjaGVja2VkOiBkYXRhLnN1bW1hcnk/LmNvbnRhY3RzUHJvY2Vzc2VkIHx8IDAsXG4gICAgICAgICAgICBuZXc6IGRhdGEucmVzdWx0cz8uY29udGFjdHM/LnN5bmNlZCB8fCAwLFxuICAgICAgICAgICAgdXBkYXRlZDogMCxcbiAgICAgICAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICAgICAgICBlcnJvcnM6IGRhdGEucmVzdWx0cz8uY29udGFjdHM/LmVycm9ycyB8fCBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVkaWE6IHtcbiAgICAgICAgICAgIGRvd25sb2FkZWQ6IGRhdGEucmVzdWx0cz8ubWVkaWE/LmRvd25sb2FkZWQgfHwgMCxcbiAgICAgICAgICAgIGVycm9yczogZGF0YS5yZXN1bHRzPy5tZWRpYT8uZXJyb3JzIHx8IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBzZXRMYXN0U3luY1Jlc3VsdChjb252ZXJ0ZWRSZXN1bHQpXG4gICAgICAgIC8vIFJlbG9hZCBzeW5jIHN0YXR1cyB0byBnZXQgdXBkYXRlZCBpbmZvcm1hdGlvblxuICAgICAgICBhd2FpdCBsb2FkU3luY1N0YXR1cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRFcnJvcihkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnRnVsbCBzeW5jIGZhaWxlZCcpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXRFcnJvcignTmV0d29yayBlcnJvciBkdXJpbmcgZnVsbCBzeW5jJylcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBmdWxsIHN5bmM6JywgZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc1N5bmNpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZm9ybWF0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFkYXRlU3RyaW5nKSByZXR1cm4gJ05ldmVyJ1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlU3RyaW5nKS50b0xvY2FsZVN0cmluZygnZGUtREUnKVxuICB9XG5cbiAgY29uc3QgZm9ybWF0RHVyYXRpb24gPSAobXM6IG51bWJlcikgPT4ge1xuICAgIGlmIChtcyA8IDEwMDApIHJldHVybiBgJHttc31tc2BcbiAgICBpZiAobXMgPCA2MDAwMCkgcmV0dXJuIGAkeyhtcyAvIDEwMDApLnRvRml4ZWQoMSl9c2BcbiAgICByZXR1cm4gYCR7KG1zIC8gNjAwMDApLnRvRml4ZWQoMSl9bWluYFxuICB9XG5cbiAgaWYgKGlzTG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8Q2FyZD5cbiAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtOFwiPlxuICAgICAgICAgIDxMb2FkZXIyIGNsYXNzTmFtZT1cImgtOCB3LTggYW5pbWF0ZS1zcGluXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtbC0yXCI+TG9hZGluZyBzeW5jIHN0YXR1cy4uLjwvc3Bhbj5cbiAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgIDwvQ2FyZD5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02XCI+XG4gICAgICA8Q2FyZD5cbiAgICAgICAgPENhcmRIZWFkZXI+XG4gICAgICAgICAgPENhcmRUaXRsZSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPERhdGFiYXNlIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgV29yZFByZXNzIFN5bmMgTWFuYWdlclxuICAgICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1yZWQtNTAgYm9yZGVyIGJvcmRlci1yZWQtMjAwIHJvdW5kZWQtbWQgcC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1yZWQtODAwXCI+XG4gICAgICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+RXJyb3I8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXJlZC03MDAgbXQtMVwiPntlcnJvcn08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge3N5bmNTdGF0dXMgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGdhcC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8Q2xvY2sgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgICAgICAgICAgICBTeW5jIFN0YXR1c1xuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTEgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5MYXN0IFN5bmM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57Zm9ybWF0RGF0ZShzeW5jU3RhdHVzLmxhc3RTeW5jVGltZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXR1czo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgI
25114HtzeW5jU3RhdHVzLm5lZWRzSW5pdGlhbFN5bmMgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPEJhZGdlIHZhcmlhbnQ9XCJvdXRsaW5lXCIgY2xhc3NOYW1lPVwidGV4dC1vcmFuZ2UtNjAwIGJvcmRlci1vcmFuZ2UtMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBOZWVkcyBJbml0aWFsIFN5bmNcbiAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwib3V0bGluZVwiIGNsYXNzTmFtZT1cInRleHQtZ3JlZW4tNjAwIGJvcmRlci1ncmVlbi0yMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja0NpcmNsZSBjbGFzc05hbWU9XCJoLTMgdy0zIG1yLTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgVXAgdG8gRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5EYXRhIFN0YXRpc3RpY3M8L2gzPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q29udGFjdHM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57c3luY1N0YXR1cy5zdGF0aXN0aWNzLmNvbnRhY3RzPy50b3RhbFJlY29yZHMgfHwgMH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TG9jYXRpb25zOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vXCI+e3N5bmNTdGF0dXMuc3RhdGlzdGljcy5sb2NhdGlvbnM/LnRvdGFsUmVjb3JkcyB8fCAwfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTMgcHQtNCBib3JkZXItdFwiPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtwZXJmb3JtSW5jcmVtZW50YWxTeW5jfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTeW5jaW5nfVxuICAgICAgICAgICAgICB2Y
25114XJpYW50PVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2lzU3luY2luZyA/IChcbiAgICAgICAgICAgICAgICA8TG9hZGVyMiBjbGFzc05hbWU9XCJoLTQgdy00IGFuaW1hdGUtc3BpblwiIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFJlZnJlc2hDdyBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge3N5bmNTdGF0dXM/Lm5lZWRzSW5pdGlhbFN5bmMgPyAnSW5pdGlhbCBTeW5jJyA6ICdJbmNyZW1lbnRhbCBTeW5jJ31cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3BlcmZvcm1GdWxsU3luY31cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzU3luY2luZ31cbiAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2lzU3luY2luZyA/IChcbiAgICAgICAgICAgICAgICA8TG9hZGVyMiBjbGFzc05hbWU9XCJoLTQgdy00IGFuaW1hdGUtc3BpblwiIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPERhdGFiYXNlIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICBGdWxsIFN5bmNcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2xvYWRTeW5jU3RhdHVzfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nIHx8IGlzU3luY2luZ31cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmVmcmVzaFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICA8L0NhcmQ+XG5cbiAgICAgIHtsYXN0U3luY1Jlc3VsdCAmJiAoXG4gICAgICAgIDxDYXJkPlxuICAgICAgICAgIDxDYXJkSGVhZGVyPlxuICAgICAgICAgICAgPENhcmRUaXRsZSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICA8Q2hlY2tDaXJjbGUgY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LWdyZWVuLTYwMFwiIC8+XG4gICAgICAgICAgICAgIExhc3QgU3luYyBSZXN1bHRcbiAgICAgICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cbiAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5Mb2NhdGlvbnM8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hlY2tlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbW9ub1wiPntsYXN0U3luY1Jlc3VsdC5sb2NhdGlvbnMuY2hlY2tlZH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TmV3Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRleHQtZ3JlZW4tNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5uZXd9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlVwZGF0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm8gdGV4dC1ibHVlLTYwMFwiPntsYXN0U3luY1Jlc3VsdC5sb2NhdGlvbnMudXBkYXRlZH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIHtsYXN0U3luY1Jlc3VsdC5sb2NhdGlvbnMuZXJyb3JzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3JzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm8gdGV4dC1yZWQtNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5lcnJvcnMubGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkNvbnRhY3RzPC9oND5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMSB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoZWNrZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57bGFzdFN5bmNSZXN1bHQuY29udGFjdHMuY2hlY2tlZH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+TmV3Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRleHQtZ3JlZW4tNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLm5ld308L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VXBkYXRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbW9ubyB0ZXh0LWJsdWUtNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLnVwZGF0ZWR9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7bGFzdFN5bmNSZXN1bHQuY29udGFjdHMuZXJyb3JzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3JzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm8gdGV4dC1yZWQtNjAwXCI+e2xhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLmVycm9ycy5sZW5ndGh9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+TWVkaWE8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbW9ubyB0ZXh0LWdyZWVuLTYwMFwiPntsYXN0U3luY1Jlc3VsdC5tZWRpYS5kb3dubG9hZGVkfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAge2xhc3RTeW5jUmVzdWx0Lm1lZGlhLmVycm9ycy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkVycm9yczo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tb25vIHRleHQtcmVkLTYwMFwiPntsYXN0U3luY1Jlc3VsdC5tZWRpYS5lcnJvcnMubGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAge2xhc3RTeW5jUmVzdWx0LmR1cmF0aW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkR1cmF0aW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj57Zm9ybWF0RHVyYXRpb24obGFzdFN
251145bmNSZXN1bHQuZHVyYXRpb24pfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7KGxhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5lcnJvcnMubGVuZ3RoID4gMCB8fCBcbiAgICAgICAgICAgICAgbGFzdFN5bmNSZXN1bHQuY29udGFjdHMuZXJyb3JzLmxlbmd0aCA+IDAgfHwgXG4gICAgICAgICAgICAgIGxhc3RTeW5jUmVzdWx0Lm1lZGlhLmVycm9ycy5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBwdC00IGJvcmRlci10XCI+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtcmVkLTYwMCBtYi0yXCI+RXJyb3JzPC9oND5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMSB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICB7Wy4uLmxhc3RTeW5jUmVzdWx0LmxvY2F0aW9ucy5lcnJvcnMsIC4uLmxhc3RTeW5jUmVzdWx0LmNvbnRhY3RzLmVycm9ycywgLi4ubGFzdFN5bmNSZXN1bHQubWVkaWEuZXJyb3JzXS5tYXAoKGVycm9yLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kZXh9IGNsYXNzTmFtZT1cInRleHQtcmVkLTYwMCBmb250LW1vbm8gdGV4dC14cyBiZy1yZWQtNTAgcC0yIHJvdW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICA8L0NhcmQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bmNNYW5hZ2VyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDYXJkLCBDYXJkQ29udGVudCwgQ2FyZEhlYWRlciwgQ2FyZFRpdGxlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9VSS9DYXJkJ1xuaW1wb3J0IFN5bmNNYW5hZ2VyIGZyb20gJy4uL2NvbXBvbmVudHMvQWRtaW4vU3luY01hbmFnZXInXG5pbXBvcnQgeyBTZXR0aW5ncywgRGF0YWJhc2UsIFVzZXJzLCBNYXBQaW4gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmNvbnN0IEFkbWluUGFnZTogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctZ3JheS01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBweC00IHB5LThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi04XCI+XG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTJcIj5BZG1pbiBEYXNoYm9hcmQ8L2gxPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtZ3JheS02MDBcIj5NYW5hZ2UgeW91ciBNRUMgUG9ydGZvbGlvIGFwcGxpY2F0aW9uPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbGc6Z3JpZC1jb2xzLTMgZ2FwLTYgbWItOFwiPlxuICAgICAgICAgIDxDYXJkPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHNwYWNlLXktMCBwYi0yXCI+XG4gICAgICAgICAgICAgIDxDYXJkVGl0bGUgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bVwiPlRvdGFsIENvbnRhY3RzPC9DYXJkVGl0bGU+XG4gICAgICAgICAgICAgIDxVc2VycyBjbGFzc05hbWU9XCJoLTQgdy00IHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgIEFjdGl2ZSBjb250YWN0IGVudHJpZXNcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICA8L0NhcmQ+XG5cbiAgICAgICAgICA8Q2FyZD5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBzcGFjZS15LTAgcGItMlwiPlxuICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW1cIj5Ub3RhbCBMb2NhdGlvbnM8L0NhcmRUaXRsZT5cbiAgICAgICAgICAgICAgPE1hcFBpbiBjbGFzc05hbWU9XCJoLTQgdy00IHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgIEFjdGl2ZSBsb2NhdGlvbnNcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICA8L0NhcmQ+XG5cbiAgICAgICAgICA8Q2FyZD5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBzcGFjZS15LTAgcGItMlwiPlxuICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW1cIj5TeW5jIFN0YXR1czwvQ2FyZFRpdGxlPlxuICAgICAgICAgICAgICA8RGF0YWJhc2UgY2xhc3NOYW1lPVwiaC00IHctNCB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiAvPlxuICAgICAgICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAgICAgICAgPENhcmRDb250ZW50PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZFwiPkFjdGl2ZTwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgIFdvcmRQcmVzcyBpbnRlZ3JhdGlvblxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIHhsOmdyaWQtY29scy0yIGdhcC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgIDxTeW5jTWFuYWdlciAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgIDxDYXJkPlxuICAgICAgICAgICAgICA8Q2FyZEhlYWRlcj5cbiAgICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8U2V0dGluZ3MgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgICAgICAgICBTeXN0ZW0gU2V0dGluZ3NcbiAgICAgICAgICAgICAgICA8L0NhcmRUaXRsZT5cbiAgICAgICAgICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAgICAgICAgICA8Q2FyZENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+QXV0byBTeW5jPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5BdXRvbWF0aWNhbGx5IHN5bmMgZGF0YSBldmVyeSAxNSBtaW51dGVzPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1yZWQtMTAwIHRleHQtcmVkLTgwMCBweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5SYXRlIExpbWl0aW5nPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5QcmV2ZW50IFdvcmRQcmVzcyBBUEkgcmF0ZSBsaW1pdHM8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyZWVuLTEwMCB0ZXh0LWdyZWVuLTgwMCBweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+TWVkaWEgRG93bmxvYWRzPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5Eb3dubG9hZCBhbmQgY2FjaGUgY29udGFjdCBpbWFnZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyZWVuLTEwMCB0ZXh0LWdyZWVuLTgwMCBweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+SW5jcmVtZW50YWwgU3luYzwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+T25seSBzeW5jIGNoYW5nZWQgZGF0YTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctZ3JlZW4tMTAwIHRleHQtZ3JlZW4tODAwIHB4LTIgcHktMSByb3VuZGVkIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICB
25114BY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICAgIDwvQ2FyZD5cblxuICAgICAgICAgICAgPENhcmQ+XG4gICAgICAgICAgICAgIDxDYXJkSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxDYXJkVGl0bGU+UXVpY2sgQWN0aW9uczwvQ2FyZFRpdGxlPlxuICAgICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICAgIDxDYXJkQ29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGJvcmRlciBob3ZlcjpiZy1ncmF5LTUwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPlZpZXcgU3luYyBMb2dzPC9oND5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+Q2hlY2sgZGV0YWlsZWQgc3luYyBoaXN0b3J5IGFuZCBlcnJvcnM8L3A+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGJvcmRlciBob3ZlcjpiZy1ncmF5LTUwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkNsZWFyIENhY2hlPC9oND5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+Q2xlYXIgYWxsIGNhY2hlZCBtZWRpYSBmaWxlczwvcD5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInctZnVsbCB0ZXh0LWxlZnQgcC0zIHJvdW5kZWQtbGcgYm9yZGVyIGhvdmVyOmJnLWdyYXktNTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+RXhwb3J0IERhdGE8L2g0PlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5FeHBvcnQgY29udGFjdHMgYW5kIGxvY2F0aW9ucyBhcyBDU1Y8L3A+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0IHAtMyByb3VuZGVkLWxnIGJvcmRlciBob3ZlcjpiZy1ncmF5LTUwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPlN5c3RlbSBIZWFsdGg8L2g0PlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5DaGVjayBBUEkgc3RhdHVzIGFuZCBwZXJmb3JtYW5jZTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgICAgPC9DYXJkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFkbWluUGFnZVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5cbmV4cG9ydCBjb25zdCBUZXN0T3ZlcnZpZXc6IFJlYWN0LkZDID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWdyYXktNTAgcHktOFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXgtdy00eGwgbXgtYXV0byBweC00IHNtOnB4LTYgbGc6cHgtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLThcIj5cbiAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC00eGwgZm9udC1ib2xkIHRleHQtZ3JheS05MDAgbWItNFwiPlxuICAgICAgICAgICAgTUVDIFBvcnRmb2xpbyBNYW5hZ2VtZW50XG4gICAgICAgICAgPC9oMT5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhsIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIFRlc3Qtw5xiZXJzaWNodCBmw7xyIGRpZSBuZXVlbiBDYXJkLURlc2lnbnNcbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtOFwiPlxuICAgICAgICAgIHsvKiBMb2NhdGlvbiBDYXJkcyAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtbGcgc2hhZG93LWxnIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLTQ4IGJnLWdyYWRpZW50LXRvLWJyIGZyb20tYmx1ZS01MDAgdG8tYmx1ZS02MDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciB0ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTZ4bCBtYi00XCI+8J+PojwvZGl2PlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGRcIj5Mb2NhdGlvbiBDYXJkczwvaDI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwIG1iLTRcIj5cbiAgICAgICAgICAgICAgICBOZXVlIExvY2F0aW9uIENhcmRzIGltIERlc2lnbiBkZXIgVm9ybGFnZSBtaXQgSGVyby1JbWFnZXMsIFxuICAgICAgICAgICAgICAgIENlbnRlci1TdGF0aXN0aWtlbiB1bmQgXCJadW0gQ2VudGVyXCIgQnV0dG9uLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yIG1iLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBIZXJvLUltYWdlIChvYmVyZSBIw6RsZnRlKVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIER1bmtsZXIgQ29udGVudC1CZXJlaWNoXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInctMiBoLTIgYmctZ3JlZW4tNTAwIHJvdW5kZWQtZnVsbCBtci0yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQ2VudGVyLVN0YXRpc3Rpa2VuIG1pdCBJY29uc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIFJlc3BvbnNpdmUgR3JpZCBMYXlvdXRcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgdG89XCIvdGVzdC9sb2NhdGlvbi1jYXJkc1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctYmx1ZS03MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgTG9jYXRpb24gQ2FyZHMgdGVzdGVuXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTQgaC00IG1sLTJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xNyA4bDQgNG0wIDBsLTQgNG00LTRIM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIENvbnRhY3QgQ2FyZHMgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1sZyBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC00OCBiZy1ncmFkaWVudC10by1iciBmcm9tLXBpbmstNTAwIHRvLXBpbmstNjAwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC02eGwgbWItNFwiPvCfkaQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+Q29udGFjdCBDYXJkczwvaDI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwIG1iLTRcIj5cbiAgICAgICAgICAgICAgICBOZXVlIENvbnRhY3QgQ2FyZHMgaW0gRGVzaWduIGRlciBWb3JsYWdlIG1pdCBQb3J0cmFpdC1JbWFnZXMsIFxuICAgICAgICAgICAgICAgIEtvbnRha3RkYXRlbiB1bmQgU29jaWFsIE1lZGlhIExpbmtzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yIG1iLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBQb3J0cmFpdC1JbWFnZSAob2JlcmUgSMOkbGZ0ZSlcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBIZWxsZXIgQ29udGVudC1CZXJlaWNoXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInctMiBoLTIgYmctZ3JlZW4tNTAwIHJvdW5kZWQtZnVsbCBtci0yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgS29udGFrdGRhdGVuIG1pdCBJY29uc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIFhJTkcgJiBMaW5rZWRJbiBMaW5rc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICB0bz1cIi90ZXN0L2NvbnRhY3QtY2FyZHNcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgYmctcGluay02MDAgdGV4dC13aGl0ZSByb3VuZGVkLWxnIGhvdmVyOmJnLXBpbmstNzAwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENvbnRhY3QgQ2FyZHMgdGVzdGVuXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTQgaC00IG1sLTJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xNyA4bDQgNG0wIDBsLTQgNG00LTRIM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIEJ1dHRvbiBTdHlsZXMgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1sZyBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC00OCBiZy1ncmFkaWVudC10by1iciBmcm9tLXJlZC01MDAgdG8tcmVkLTYwMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtNnhsIG1iLTRcIj7wn5SYPC9kaXY+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZFwiPkJ1dHRvbiBTdHlsZXM8L2gyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTZcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMCBtYi00XCI+XG4gICAgICAgICAgICAgICAgTUVDIEJ1dHRvbi1TdHlsZXMgbWl0IEhlbHZldGljYSBOb3cgRGlzcGxheSBTY2hyaWZ0YXJ0XG4gICAgICAgICAgICAgICAgdW5kIGRlbiBvcmlnaW5hbGVuIE1FQy1GYXJiZW4uXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTIgbWItNlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIEhlbHZldGljYSBOb3cgRGlzcGxheSBGb250XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInctMiBoLTIgYmctZ3JlZW4tNTAwIHJvdW5kZWQtZnVsbCBtci0yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgTUVDIEZhcmJlbiAoI2QyMDAyOCwgIzI4MzIzQylcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidy0yIGgtMiBiZy1ncmVlbi01MDAgcm91bmRlZC1mdWxsIG1yLTJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBLZWluZSBSdW5kdW5nZW4gKGVja2lnZXMgRGVzaWduKVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ3LTIgaC0yIGJnLWdyZWVuLTUwMCByb3VuZGVkLWZ1bGwgbXItMlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIFBmZWlsLUljb25zIHdpZSBpbSBPcmlnaW5hbFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICB0bz1cIi90ZXN0L2J1dHRvbnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgYmctcmVkLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctcmVkLTcwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCdXR0b24gU3R5bGVzIHRlc3RlblxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy00IGgtNCBtbC0yXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2VMaW5lY2FwPVwicm91bmRcIiBzdHJva2VMaW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlV2lkdGg9ezJ9IGQ9XCJNMTcgOGw0IDRtMCAwbC00IDRtNC00SDNcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgI
25114HsvKiBPcmlnaW5hbCBBcHAgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1sZyBvdmVyZmxvdy1oaWRkZW4gbGc6Y29sLXNwYW4tM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLTMyIGJnLWdyYWRpZW50LXRvLWJyIGZyb20tZ3JheS03MDAgdG8tZ3JheS04MDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciB0ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTR4bCBtYi0yXCI+8J+Xuu+4jzwvZGl2PlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhsIGZvbnQtYm9sZFwiPk9yaWdpbmFsIFBvcnRmb2xpbyBBcHA8L2gyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTZcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMCBtYi00XCI+XG4gICAgICAgICAgICAgICAgRGllIHVyc3Byw7xuZ2xpY2hlIFBvcnRmb2xpbyBNYW5hZ2VtZW50IEFwcCBtaXQgaW50ZXJha3RpdmVyIEthcnRlIFxuICAgICAgICAgICAgICAgIHVuZCBBbnNwcmVjaHBhcnRuZXItU3VjaGUuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICB0bz1cIi9hcHBcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC00IHB5LTIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSByb3VuZGVkLWxnIGhvdmVyOmJnLWdyYXktODAwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIE9yaWdpbmFsIEFwcCDDtmZmbmVuXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJ3LTQgaC00IG1sLTJcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xNyA4bDQgNG0wIDBsLTQgNG00LTRIM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogRm9vdGVyICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEyIHRleHQtY2VudGVyIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtXCI+XG4gICAgICAgICAgICBNRUMgUG9ydGZvbGlvIE1hbmFnZW1lbnQgdntpbXBvcnQubWV0YS5lbnYuVklURV9BUFBfVkVSU0lPTiB8fCAnMS4wLjAnfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG10LTFcIj5cbiAgICAgICAgICAgIFBvd2VyZWQgYnkgUmVhY3QgKyBUeXBlU2NyaXB0ICsgVGFpbHdpbmQgQ1NTXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBNYXBQaW4sIEV4dGVybmFsTGluayB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNsc3ggfSBmcm9tICdjbHN4J1xuaW1wb3J0IHR5cGUgeyBMb2NhdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgZm9ybWF0TWlldGZsYWVjaGUgfSBmcm9tICdAdXRpbHMvZm9ybWF0QXJlYSdcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgTE9DQVRJT04gQ0FSRCAtIFNpbmdsZSBTb3VyY2Ugb2YgVHJ1dGhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBVbmlmaWVkTG9jYXRpb25DYXJkUHJvcHMge1xuICBsb2NhdGlvbjogTG9jYXRpb25cbiAgdmFyaWFudD86ICdjb21wYWN0JyB8ICdkZWZhdWx0JyB8ICdkZXRhaWxlZCdcbiAgb25TZWxlY3Q/OiAobG9jYXRpb246IExvY2F0aW9uKSA9PiB2b2lkXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgVW5pZmllZExvY2F0aW9uQ2FyZDogUmVhY3QuRkM8VW5pZmllZExvY2F0aW9uQ2FyZFByb3BzPiA9ICh7XG4gIGxvY2F0aW9uLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBvblNlbGVjdCxcbiAgY2xhc3NOYW1lXG59KSA9PiB7XG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9ICgpID0+IHtcbiAgICBvblNlbGVjdD8uKGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2VudGVyQ2xpY2sgPSAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAobG9jYXRpb24uY2VudGVyTGluaykge1xuICAgICAgd2luZG93Lm9wZW4obG9jYXRpb24uY2VudGVyTGluaywgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJylcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRJbWFnZVVybCA9ICgpID0+IHtcbiAgICByZXR1cm4gbG9jYXRpb24uaGVyb0ltYWdlIHx8IGxvY2F0aW9uLmltYWdlIHx8IGxvY2F0aW9uLmxvZ28gfHwgJy9hc3NldHMvcGxhY2Vob2xkZXItbG9jYXRpb24uanBnJ1xuICB9XG5cbiAgLy8gQ09NUEFDVCBWQVJJQU5UIC0gRm9yIGxpc3RzIGFuZCBzbWFsbCBzcGFjZXNcbiAgaWYgKHZhcmlhbnQgPT09ICdjb21wYWN0Jykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IFxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgJ2JnLXdoaXRlIHJvdW5kZWQtbWVjIGJvcmRlciBib3JkZXItYmFja2dyb3VuZC10ZXJ0aWFyeSBwLTQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICdob3Zlcjpib3JkZXItbWVjLXByaW1hcnkvMjAgaG92ZXI6c2hhZG93LWNhcmQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlU2VsZWN0fVxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtM1wiPlxuICAgICAgICAgI
25114Htsb2NhdGlvbi5sb2dvICYmIChcbiAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgIHNyYz17bG9jYXRpb24ubG9nb30gXG4gICAgICAgICAgICAgIGFsdD17YCR7bG9jYXRpb24ubmFtZX0gTG9nb2B9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBvYmplY3QtY29udGFpbiByb3VuZGVkIGZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlXCI+e2xvY2F0aW9uLm5hbWV9PC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSB0cnVuY2F0ZVwiPntsb2NhdGlvbi5jaXR5fTwvcD5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgey8qIEtleSBTdGF0cyAtIEFMV0FZUyBTSE9XIEFWQUlMQUJMRSBEQVRBICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgbXQtMSB0ZXh0LXhzIHRleHQtdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICB7bG9jYXRpb24ucmVudGFibGVBcmVhICYmIChcbiAgICAgICAgICAgICAgICA8c3Bhbj57Zm9ybWF0TWlldGZsYWVjaGUobG9jYXRpb24ucmVudGFibGVBcmVhKX1twrI8L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtsb2NhdGlvbi5zaG9wQ291bnQgJiYgKFxuICAgICAgICAgICAgICAgIDxzcGFuPntsb2NhdGlvbi5zaG9wQ291bnR9IFNob3BzPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7bG9jYXRpb24ucGFya2luZ1NwYWNlcyAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4+e2xvY2F0aW9uLnBhcmtpbmdTcGFjZXN9IFBhcmtwbMOkdHplPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAge2xvY2F0aW9uLmNlbnRlckxpbmsgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDZW50ZXJDbGlja31cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlIHB4LTIgcHktMSByb3VuZGVkIGhvdmVyOmJnLW1lYy1wcmltYXJ5LzgwIHRyYW5zaXRpb24tY29sb3JzIGZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBadW0gQ2VudGVyXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIC8vIERFVEFJTEVEIFZBUklBTlQgLSBGb3IgZ3JpZHMgd2l0aCBtb3JlIHNwYWNlXG4gIGlmICh2YXJpYW50ID09PSAnZGV0YWlsZWQnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgXG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICAnYmctd2hpdGUgcm91bmRlZC1tZWMtbGcgc2hhZG93LWNhcmQgYm9yZGVyIGJvcmRlci1iYWNrZ3JvdW5kLXRlcnRpYXJ5IG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgJ2hvdmVyOnNoYWRvdy1jYXJkLWhvdmVyIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNlbGVjdH1cbiAgICAgID5cbiAgICAgICAgey8qIEhlcm8gSW1hZ2UgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC00OFwiPlxuICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICBzcmM9e2dldEltYWdlVXJsKCl9IFxuICAgICAgICAgICAgYWx0PXtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBvYmplY3QtY292ZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAge2xvY2F0aW9uLmxvZ28gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtNCBsZWZ0LTQgYmctd2hpdGUgcC0yIHJvdW5kZWQtbWVjIHNoYWRvdy1jYXJkXCI+XG4gICAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgICAgc3JjPXtsb2NhdGlvbi5sb2dvfSBcbiAgICAgICAgICAgICAgICBhbHQ9e2Ake2xvY2F0aW9uLm5hbWV9IExvZ29gfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctMTIgaC0xMiBvYmplY3QtY29udGFpblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIHsvKiBDb250ZW50ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtc3RhcnQgbWItNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQteGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTJcIj57bG9jYXRpb24ubmFtZX08L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgc3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxNYXBQaW4gY2xhc3NOYW1lPVwidy00IGgtNCBtci0yXCIgLz5cbiAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5hZGRyZXNzfVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtbC02XCI+e2xvY2F0aW9uLnBvc3RhbENvZGV9IHtsb2NhdGlvbi5jaXR5fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBLZXkgU3RhdGlzdGljcyAtIENPTVBSRUhFTlNJVkUgREFUQSBESVNQTEFZICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCBtYi00XCI+XG4gICAgICAgICAgICB7bG9jYXRpb24ucmVudGFibGVBcmVhICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYyBwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeVwiPlZlcm1pZXRiYXJlIEZsw6RjaGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgI
25114Htmb3JtYXRNaWV0ZmxhZWNoZShsb2NhdGlvbi5yZW50YWJsZUFyZWEpfW3CslxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7bG9jYXRpb24uc2hvcENvdW50ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeSByb3VuZGVkLW1lYyBwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeVwiPkFuemFobCBTaG9wczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAge2xvY2F0aW9uLnNob3BDb3VudH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2xvY2F0aW9uLnBhcmtpbmdTcGFjZXMgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+UGFya3Bsw6R0emU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5wYXJraW5nU3BhY2VzfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7bG9jYXRpb24uc2FsZXNMZXZlbHMgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWJhY2tncm91bmQtc2Vjb25kYXJ5IHJvdW5kZWQtbWVjIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+VmVya2F1ZnNlYmVuZW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIHtsb2NhdGlvbi5zYWxlc0xldmVsc31cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAge2xvY2F0aW9uLmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgdGV4dC1zbSBtYi00IGxpbmUtY2xhbXAtM1wiPlxuICAgICAgICAgICAgICB7bG9jYXRpb24uZGVzY3JpcHRpb24ucmVwbGFjZSgvPFtePl0qPi9nLCAnJyl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHsvKiBBZGRpdGlvbmFsIEluZm8gKi99XG4gICAgICAgICAgeyhsb2NhdGlvbi5hbmNob3JUZW5hbnRzIHx8IGxvY2F0aW9uLmNhdGNobWVudEFyZWFQb3B1bGF0aW9uKSAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMiBtYi00IHRleHQtc21cIj5cbiAgICAgICAgICAgICAge2xvY2F0aW9uLmFuY2hvclRlbmFudHMgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+QW5rZXJtaWV0ZXI6IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtdGV4dC1wcmltYXJ5XCI+e2xvY2F0aW9uLmFuY2hvclRlbmFudHN9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7bG9jYXRpb24uY2F0Y2htZW50QXJlYVBvcHVsYXRpb24gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXRleHQtc2Vjb25kYXJ5XCI+RWluenVnc2dlYmlldDogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge2xvY2F0aW9uLmNhdGNobWVudEFyZWFQb3B1bGF0aW9uLnRvTG9jYWxlU3RyaW5nKCl9IEVpbndvaG5lclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHsvKiBBY3Rpb25zICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTQgYm9yZGVyLXQgYm9yZGVyLWJhY2tncm91bmQtdGVydGlhcnlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC00IHRleHQtc20gdGV4dC10ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgIHtsb2NhdGlvbi5vcGVuaW5nRGF0ZSAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4+RXLDtmZmbmV0IHtuZXcgRGF0ZShsb2NhdGlvbi5vcGVuaW5nRGF0ZSkuZ2V0RnVsbFllYXIoKX08L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtsb2NhdGlvbi50eXBlICYmIChcbiAgICAgICAgICAgICAgICA8c3Bhbj57bG9jYXRpb24udHlwZX08L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAge2xvY2F0aW9uLmNlbnRlckxpbmsgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ2VudGVyQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLXNlY29uZGFyeSB0ZXh0LXNtIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInctNCBoLTQgbXItMVwiIC8+XG4gICAgICAgICAgICAgICAgWnVtIENlbnRlclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgLy8gREVGQVVMVCBWQVJJQU5UIC0gRGVzaWduIG5hY2ggVm9ybGFnZSAoU2Nod2FiZW5HYWxlcmllLVN0eWxlKVxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgJ2JnLXdoaXRlIHJvdW5kZWQtbWVjLWxnIHNoYWRvdy1jYXJk
25114IG92ZXJmbG93LWhpZGRlbiBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICdob3ZlcjpzaGFkb3ctY2FyZC1ob3ZlciB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVTZWxlY3R9XG4gICAgPlxuICAgICAgey8qIEhlcm8gSW1hZ2UgLSBvYmVyZSBIw6RsZnRlICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLTgwXCI+XG4gICAgICAgIDxpbWdcbiAgICAgICAgICBzcmM9e2dldEltYWdlVXJsKCl9XG4gICAgICAgICAgYWx0PXtsb2NhdGlvbi5uYW1lfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvdmVyXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ29udGVudCBBcmVhIC0gdW50ZXJlIEjDpGxmdGUgbWl0IGR1bmtsZW0gSGludGVyZ3J1bmQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXNsYXRlLTcwMCB0ZXh0LXdoaXRlIHAtNiBtaW4taC1bMjAwcHhdIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgey8qIENlbnRlciBOYW1lICYgQ2l0eSAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCBtYi0yIGxlYWRpbmctdGlnaHRcIj57bG9jYXRpb24ubmFtZX08L2gzPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteGwgdGV4dC1zbGF0ZS0zMDBcIj57bG9jYXRpb24uY2l0eX08L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBLZXkgU3RhdGlzdGljcyAtIENPTVBSRUhFTlNJVkUgRElTUExBWSAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0yIGdhcC00IG1iLTYgZmxleC0xXCI+XG4gICAgICAgICAge2xvY2F0aW9uLnJlbnRhYmxlQXJlYSAmJiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1zbGF0ZS00MDBcIj5WZXJtaWV0YmFyZSBGbMOkY2hlPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAge2Zvcm1hdE1pZXRmbGFlY2hlKGxvY2F0aW9uLnJlbnRhYmxlQXJlYSl9bcKyXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7bG9jYXRpb24uc2hvcENvdW50ICYmIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTQwMFwiPkFuemFobCBTaG9wczwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZFwiPntsb2NhdGlvbi5zaG9wQ291bnR9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtsb2NhdGlvbi5wYXJraW5nU3BhY2VzICYmIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTQwMFwiPlBhcmtwbMOkdHplPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkXCI+e2xvY2F0aW9uLnBhcmtpbmdTcGFjZXN9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtsb2NhdGlvbi5zYWxlc0xldmVscyAmJiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1zbGF0ZS00MDBcIj5WZXJrYXVmc2ViZW5lbjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZFwiPntsb2NhdGlvbi5zYWxlc0xldmVsc308L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge2xvY2F0aW9uLmFuY2hvclRlbmFudHMgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTQwMFwiPkFua2VybWlldGVyPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0cnVuY2F0ZVwiPntsb2NhdGlvbi5hbmNob3JUZW5hbnRzfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEFjdGlvbiBCdXR0b24gKi99XG4gICAgICAgIHtsb2NhdGlvbi5jZW50ZXJMaW5rICYmIChcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDZW50ZXJDbGlja31cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXdoaXRlIHRleHQtc2xhdGUtNzAwIHB4LTQgcHktMiByb3VuZGVkLW1lYyBmb250LW1lZGl1bSBob3ZlcjpiZy1zbGF0ZS0xMDAgdHJhbnNpdGlvbi1jb2xvcnMgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInctNCBoLTQgbXItMlwiIC8+XG4gICAgICAgICAgICBadW0gQ2VudGVyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiLy8gREVQUkVDQVRFRDogVXNlIFVuaWZpZWRMb2NhdGlvbkNhcmQgaW5zdGVhZFxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgVW5pZmllZExvY2F0aW9uQ2FyZCB9IGZyb20gJy4uL1VJL1VuaWZpZWRMb2NhdGlvbkNhcmQnXG5pbXBvcnQgdHlwZSB7IExvY2F0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvaW5kZXgnXG5cbmludGVyZmFjZSBMb2NhdGlvbkNhcmRQcm9wcyB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvblxuICB2Y
25114XJpYW50PzogJ2RlZmF1bHQnIHwgJ2NvbXBhY3QnIHwgJ2RldGFpbGVkJ1xuICBvblNlbGVjdD86IChsb2NhdGlvbjogTG9jYXRpb24pID0+IHZvaWRcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbkNhcmQ6IFJlYWN0LkZDPExvY2F0aW9uQ2FyZFByb3BzPiA9ICh7XG4gIGxvY2F0aW9uLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBvblNlbGVjdCxcbiAgY2xhc3NOYW1lID0gJydcbn0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8VW5pZmllZExvY2F0aW9uQ2FyZFxuICAgICAgbG9jYXRpb249e2xvY2F0aW9ufVxuICAgICAgb25TZWxlY3Q9e29uU2VsZWN0fVxuICAgICAgdmFyaWFudD17dmFyaWFudH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9jYXRpb25DYXJkXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IExvY2F0aW9uQ2FyZCB9IGZyb20gJy4vTG9jYXRpb25DYXJkJ1xuaW1wb3J0IHR5cGUgeyBMb2NhdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL2luZGV4J1xuXG5pbnRlcmZhY2UgTG9jYXRpb25HcmlkUHJvcHMge1xuICBsb2NhdGlvbnM6IExvY2F0aW9uW11cbiAgb25Mb2NhdGlvblNlbGVjdD86IChsb2NhdGlvbjogTG9jYXRpb24pID0+IHZvaWRcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBMb2NhdGlvbkdyaWQ6IFJlYWN0LkZDPExvY2F0aW9uR3JpZFByb3BzPiA9ICh7XG4gIGxvY2F0aW9ucyxcbiAgb25Mb2NhdGlvblNlbGVjdCxcbiAgY2xhc3NOYW1lID0gJydcbn0pID0+IHtcbiAgY29uc3QgW3NlYXJjaFRlcm0sIHNldFNlYXJjaFRlcm1dID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtzZWxlY3RlZENpdHksIHNldFNlbGVjdGVkQ2l0eV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW3NlbGVjdGVkVHlwZSwgc2V0U2VsZWN0ZWRUeXBlXSA9IHVzZVN0YXRlKCcnKVxuXG4gIC8vIEV4dHJhY3QgdW5pcXVlIGNpdGllcyBhbmQgdHlwZXMgZm9yIGZpbHRlcnNcbiAgY29uc3QgY2l0aWVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2l0eVNldCA9IG5ldyBTZXQobG9jYXRpb25zLm1hcChsb2MgPT4gbG9jLmNpdHkpLmZpbHRlcihCb29sZWFuKSlcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjaXR5U2V0KS5zb3J0KClcbiAgfSwgW2xvY2F0aW9uc10pXG5cbiAgY29uc3QgdHlwZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB0eXBlU2V0ID0gbmV3IFNldChsb2NhdGlvbnMubWFwKGxvYyA9PiBsb2MudHlwZSkuZmlsdGVyKEJvb2xlYW4pKVxuICAgIHJldHVybiBBcnJheS5mcm9tKHR5cGVTZXQpLnNvcnQoKVxuICB9LCBbbG9jYXRpb25zXSlcblxuICAvLyBGaWx0ZXIgbG9jYXRpb25zIGJhc2VkIG9uIHNlYXJjaCBhbmQgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJlZExvY2F0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBsb2NhdGlvbnMuZmlsdGVyKGxvY2F0aW9uID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAhc2VhcmNoVGVybSB8fCBcbiAgICAgICAgbG9jYXRpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgbG9jYXRpb24uY2l0eT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAgIGxvY2F0aW9uLmFkZHJlc3M/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgICBjb25zdCBtYXRjaGVzQ2l0eSA9ICFzZWxlY3RlZENpdHkgfHwgbG9jYXRpb24uY2l0eSA9PT0gc2VsZWN0ZWRDaXR5XG4gICAgICBjb25zdCBtYXRjaGVzVHlwZSA9ICFzZWxlY3RlZFR5cGUgfHwgbG9jYXRpb24udHlwZSA9PT0gc2VsZWN0ZWRUeXBlXG5cbiAgICAgIHJldHVybiBtYXRjaGVzU2VhcmNoICYmIG1hdGNoZXNDaXR5ICYmIG1hdGNoZXNUeXBlXG4gICAgfSlcbiAgfSwgW2xvY2F0aW9ucywgc2VhcmNoVGVybSwgc2VsZWN0ZWRDaXR5LCBzZWxlY3RlZFR5cGVdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e2BzcGFjZS15LTYgJHtjbGFzc05hbWV9YH0+XG4gICAgICB7LyogU2VhcmNoIGFuZCBGaWx0ZXIgQmFyICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGdhcC00IGl0ZW1zLXN0YXJ0IHNtOml0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWF4LXctbWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlN0YW5kb3J0ZSBkdXJjaHN1Y2hlbi4uLlwiXG4gICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2hUZXJtfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFRlcm0oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcGwtMTAgcHItNCBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1sZyBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1tZWMtYmx1ZSBmb2N1czpib3JkZXItdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCBwbC0zIGZsZXggaXRlbXMtY2VudGVyIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzc05hbWU9XCJoLTUgdy01IHRleHQtZ3JheS00MDBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2VMaW5lY2FwPVwicm91bmRcIiBzdHJva2VMaW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlV2lkdGg9ezJ9IGQ9XCJNMjEgMjFsLTYtNm0yLTVhNyA3IDAgMTEtMTQgMCA3IDcgMCAwMTE0IDB6XCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRDaXR5fVxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRTZWxlY3RlZENpdHkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1sZyBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1tZWMtYmx1ZSBmb2N1czpib3JkZXItdHJhbnNwYXJlbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGxlIFN0w6RkdGU8L29wdGlvbj5cbiAgICAgICAgICAgI
25114HtjaXRpZXMubWFwKGNpdHkgPT4gKFxuICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Y2l0eX0gdmFsdWU9e2NpdHl9PntjaXR5fTwvb3B0aW9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgXG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkVHlwZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VsZWN0ZWRUeXBlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbGcgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctbWVjLWJsdWUgZm9jdXM6Ym9yZGVyLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsZSBUeXBlbjwvb3B0aW9uPlxuICAgICAgICAgICAge3R5cGVzLm1hcCh0eXBlID0+IChcbiAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e3R5cGV9IHZhbHVlPXt0eXBlfT57dHlwZX08L29wdGlvbj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogUmVzdWx0cyBDb3VudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgIHtmaWx0ZXJlZExvY2F0aW9ucy5sZW5ndGh9IHZvbiB7bG9jYXRpb25zLmxlbmd0aH0gU3RhbmRvcnRlblxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBMb2NhdGlvbiBHcmlkIC0gNCBLYWNoZWxuIGF1ZiBEZXNrdG9wICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIHNtOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIHhsOmdyaWQtY29scy00IGdhcC04XCI+XG4gICAgICAgIHtmaWx0ZXJlZExvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiAoXG4gICAgICAgICAgPExvY2F0aW9uQ2FyZFxuICAgICAgICAgICAga2V5PXtsb2NhdGlvbi5pZH1cbiAgICAgICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgICAgIG9uU2VsZWN0PXtvbkxvY2F0aW9uU2VsZWN0fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1mdWxsXCJcbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRW1wdHkgU3RhdGUgKi99XG4gICAgICB7ZmlsdGVyZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBweS0xMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTQwMCBtYi00XCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cIm14LWF1dG8gaC0xMiB3LTEyXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgIDxwYXRoIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIiBzdHJva2VXaWR0aD17Mn0gZD1cIk0xOSAyMVY1YTIgMiAwIDAwLTItMkg3YTIgMiAwIDAwLTIgMnYxNm0xNCAwaDJtLTIgMGgtNW0tOSAwSDNtMiAwaDVNOSA3aDFtLTEgNGgxbTQtNGgxbS0xIDRoMW0tNSAxMHYtNWExIDEgMCAwMTEtMWgyYTEgMSAwIDAxMSAxdjVtLTQgMGg0XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDAgbWItMlwiPktlaW5lIFN0YW5kb3J0ZSBnZWZ1bmRlbjwvaDM+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTUwMFwiPlZlcnN1Y2hlbiBTaWUgYW5kZXJlIFN1Y2hiZWdyaWZmZSBvZGVyIEZpbHRlci48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTG9jYXRpb25HcmlkIH0gZnJvbSAnQGNvbXBvbmVudHMvTG9jYXRpb24nXG5pbXBvcnQgdHlwZSB7IExvY2F0aW9uIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXG5cbi8vIFRlc3QtRGF0ZW4gYmFzaWVyZW5kIGF1ZiBkZW0gU2llYmVuIFNlZW4gQ2VudGVyIEJlaXNwaWVsXG5jb25zdCB0ZXN0TG9jYXRpb25zOiBMb2NhdGlvbltdID0gW1xuICB7XG4gICAgaWQ6ICcxJyxcbiAgICBuYW1lOiAnU2llYmVuIFNlZW4gQ2VudGVyJyxcbiAgICBjaXR5OiAnU2Nod2VyaW4nLFxuICAgIGFkZHJlc3M6ICdQbGF0eiBkZXIgRnJlaWhlaXQgMScsXG4gICAgcG9zdGFsQ29kZTogJzE5MDUzJyxcbiAgICBjb3VudHJ5OiAnRGV1dHNjaGxhbmQnLFxuICAgIGNvb3JkaW5hdGVzOiB7IGxhdDogNTMuNjM1NSwgbG5nOiAxMS40MDEwIH0sXG4gICAgaGVyb0ltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDE5ODYzMDA5MTctNjQ2NzRiZDYwMGQ4P3c9ODAwJmg9NDAwJmZpdD1jcm9wJyxcbiAgICBjZW50ZXJMaW5rOiAnaHR0cHM6Ly9zaWViZW4tc2Vlbi1jZW50ZXIuZGUnLFxuICAgIHR5cGU6ICdTaG9wcGluZyBDZW50ZXInLFxuICAgIHdwRGF0YToge1xuICAgICAgaWQ6IDEsXG4gICAgICBzbHVnOiAnc2llYmVuLXNlZW4tY2VudGVyJyxcbiAgICAgIGFjZjoge1xuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tdmVybWlldGJhcmUtZmxhZWNoZSc6IDI2NDk2LFxuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tYW56YWhsLXNob3BzLWZhY2htYWVya3RlJzogNTQsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfSxcbiAge1xuICAgIGlkOiAnMicsXG4gICAgbmFtZTogJ0FsbGVlLUNlbnRlcicsXG4gICAgY2l0eTogJ01hZ2RlYnVyZycsXG4gICAgYWRkcmVzczogJ0pvaGFubmVzLUfDtmRlcml0ei1TdHJhw59lIDEwMycsXG4gICAgcG9zdGFsQ29kZTogJzM5MTA4JyxcbiAgICBjb3VudHJ5OiAnRGV1dHNjaGxhbmQnLFxuICAgIGNvb3JkaW5hdGVzOiB7IGxhdDogNTIuMTIwNSwgbG5nOiAxMS42Mjc2IH0sXG4gICAgaGVyb0ltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1NTU1Mjk2NjktZTY5ZTdhYTBiYTlhP3c9ODAwJmg9NDAwJmZp
25114dD1jcm9wJyxcbiAgICBjZW50ZXJMaW5rOiAnaHR0cHM6Ly9hbGxlZS1jZW50ZXItbWFnZGVidXJnLmRlJyxcbiAgICB0eXBlOiAnU2hvcHBpbmcgQ2VudGVyJyxcbiAgICB3cERhdGE6IHtcbiAgICAgIGlkOiAyLFxuICAgICAgc2x1ZzogJ2FsbGVlLWNlbnRlci1tYWdkZWJ1cmcnLFxuICAgICAgYWNmOiB7XG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJtaWV0YmFyZS1mbGFlY2hlJzogNDUwMDAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi1hbnphaGwtc2hvcHMtZmFjaG1hZXJrdGUnOiAxMjAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDJcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfSxcbiAge1xuICAgIGlkOiAnMycsXG4gICAgbmFtZTogJ0VsYmUgUGFyaycsXG4gICAgY2l0eTogJ0RyZXNkZW4nLFxuICAgIGFkZHJlc3M6ICdCdWRhcGVzdGVyIFN0cmHDn2UgMjVhJyxcbiAgICBwb3N0YWxDb2RlOiAnMDEwNjknLFxuICAgIGNvdW50cnk6ICdEZXV0c2NobGFuZCcsXG4gICAgY29vcmRpbmF0ZXM6IHsgbGF0OiA1MS4wNTA0LCBsbmc6IDEzLjczNzMgfSxcbiAgICBoZXJvSW1hZ2U6ICdodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxOTU2NzI0MTA0Ni03ZjU3MGVlZTNjZTY/dz04MDAmaD00MDAmZml0PWNyb3AnLFxuICAgIGNlbnRlckxpbms6ICdodHRwczovL2VsYmVwYXJrLWRyZXNkZW4uZGUnLFxuICAgIHR5cGU6ICdTaG9wcGluZyBDZW50ZXInLFxuICAgIHdwRGF0YToge1xuICAgICAgaWQ6IDMsXG4gICAgICBzbHVnOiAnZWxiZS1wYXJrLWRyZXNkZW4nLFxuICAgICAgYWNmOiB7XG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJtaWV0YmFyZS1mbGFlY2hlJzogNjUwMDAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi1hbnphaGwtc2hvcHMtZmFjaG1hZXJrdGUnOiAxODAsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDNcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfSxcbiAge1xuICAgIGlkOiAnNCcsXG4gICAgbmFtZTogJ0ZhY2htYXJrdHplbnRydW0gTm9yZCcsXG4gICAgY2l0eTogJ0hhbWJ1cmcnLFxuICAgIGFkZHJlc3M6ICdMYW5nZW5ob3JuZXIgQ2hhdXNzZWUgMjAwJyxcbiAgICBwb3N0YWxDb2RlOiAnMjI0MTUnLFxuICAgIGNvdW50cnk6ICdEZXV0c2NobGFuZCcsXG4gICAgY29vcmRpbmF0ZXM6IHsgbGF0OiA1My42MzU1LCBsbmc6IDEwLjAwMTAgfSxcbiAgICBoZXJvSW1hZ2U6ICdodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ4NjQwNjE0NjkyNi1jNjI3YTkyYWQxYWI/dz04MDAmaD00MDAmZml0PWNyb3AnLFxuICAgIGNlbnRlckxpbms6ICdodHRwczovL2ZhY2htYXJrdHplbnRydW0tbm9yZC5kZScsXG4gICAgdHlwZTogJ0ZhY2htYXJrdHplbnRydW0nLFxuICAgIHdwRGF0YToge1xuICAgICAgaWQ6IDQsXG4gICAgICBzbHVnOiAnZmFjaG1hcmt0emVudHJ1bS1ub3JkJyxcbiAgICAgIGFjZjoge1xuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tdmVybWlldGJhcmUtZmxhZWNoZSc6IDE4NTAwLFxuICAgICAgICAnY2VudGVyLWdydW5kZGF0ZW4tYW56YWhsLXNob3BzLWZhY2htYWVya3RlJzogMTIsXG4gICAgICAgICdjZW50ZXItZ3J1bmRkYXRlbi12ZXJrYXVmc2ViZW5lbic6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICB1cGRhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWidcbiAgfVxuXVxuXG5leHBvcnQgY29uc3QgTG9jYXRpb25DYXJkc1Rlc3Q6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBoYW5kbGVMb2NhdGlvblNlbGVjdCA9IChsb2NhdGlvbjogTG9jYXRpb24pID0+IHtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgbG9jYXRpb246JywgbG9jYXRpb24pXG4gICAgYWxlcnQoYExvY2F0aW9uIHNlbGVjdGVkOiAke2xvY2F0aW9uLm5hbWV9IGluICR7bG9jYXRpb24uY2l0eX1gKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ncmF5LTUwIHB5LThcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctN3hsIG14LWF1dG8gcHgtNCBzbTpweC02IGxnOnB4LThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi04XCI+XG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTJcIj5cbiAgICAgICAgICAgIExvY2F0aW9uIENhcmRzIFRlc3RcbiAgICAgICAgICA8L2gxPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIFRlc3QgZGVyIG5ldWVuIExvY2F0aW9uIENhcmRzIGltIERlc2lnbiBkZXIgVm9ybGFnZVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPExvY2F0aW9uR3JpZCBcbiAgICAgICAgICBsb2NhdGlvbnM9e3Rlc3RMb2NhdGlvbnN9XG4gICAgICAgICAgb25Mb2NhdGlvblNlbGVjdD17aGFuZGxlTG9jYXRpb25TZWxlY3R9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ29udGFjdENhcmQgfSBmcm9tICdAY29tcG9uZW50cy9Db250YWN0J1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXG5cbi8vIFRlc3QtRGF0ZW4gYmFzaWVyZW5kIGF1ZiBkZW0gVHljaG8gSm9oYW5uc2VuIEJlaXNwaWVsXG5jb25zdCB0ZXN0Q29udGFjdHM6IENvbnRhY3RbXSA9IFtcbiAge1xuICAgIGlkOiAnMScsXG4gICAgbG9jYXRpb25JZDogJzEnLFxuICAgIGZpcnN0TmFtZTogJ1R5Y2hvJyxcbiAgICBsYXN0TmFtZTogJ0pvaGFubnNlbicsXG4gICAgZnVsbE5hbWU6ICdUeWNobyBKb2hhbm5zZW4nLFxuICAgIHBvc2l0aW9uOiAnSGVhZCBvZiBDZW50ZXIgTWFuYWdlbWVudCBSZWdpb24gTm9ydGgnLFxuICAgIGRlcGFydG1lbnQ6ICcnLFxuICAgIGVtYWlsOiAndHljaG8uam9oYW5uc2VuQG1lYy5kZScsXG4gICAgcGhvbmU6ICcrNDkgKDApIDQzMjEgNTU3NyA2MCcsXG4gICAgaW1hZ2U6ICdodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNzAwMzIxMTE2OS0wYTFkZDcyMjhmMmQ/dz00MDAmaD01MDAmZml0PWNyb3AmY3JvcD1mYWNlJyxcbiAgICBiaW86ICdFcmZhaHJlbmVyIENlbnRlciBNYW5hZ2VyIG1pdCDDvGJlciAxNSBKYWhyZW4gRXhwZXJ0aXNlIGltIEVpbnplbGhhbmRlbHNpbW1vYmlsaWVubWFuYWdlbWVudC4nLFxuICAgIHNwZWNpYWx0aWVzOiBbJ0NlbnRlciBNYW5hZ2VtZW50JywgJ1Zlcm1pZXR1bmcnLCAnS3VuZGVuYmV0cmV1dW5nJ10sXG4gICAgbGFuZ3VhZ2VzOiBbJ0RldXRzY2gnLCAnRW5nbGlzY2gnLCA
25114nRMOkbmlzY2gnXSxcbiAgICBzb2NpYWxMaW5rczogW1xuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ3hpbmcnLFxuICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aW5nLmNvbS9wcm9maWxlL1R5Y2hvX0pvaGFubnNlbicsXG4gICAgICAgIGxhYmVsOiAnWElORyBQcm9maWwnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ2xpbmtlZGluJyxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL3R5Y2hvLWpvaGFubnNlbicsXG4gICAgICAgIGxhYmVsOiAnTGlua2VkSW4gUHJvZmlsJ1xuICAgICAgfVxuICAgIF0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gICAgY3JlYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICAgIHVwZGF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJ1xuICB9LFxuICB7XG4gICAgaWQ6ICcyJyxcbiAgICBsb2NhdGlvbklkOiAnMicsXG4gICAgZmlyc3ROYW1lOiAnU2FyYWgnLFxuICAgIGxhc3ROYW1lOiAnTcO8bGxlcicsXG4gICAgZnVsbE5hbWU6ICdTYXJhaCBNw7xsbGVyJyxcbiAgICBwb3NpdGlvbjogJ0NlbnRlciBNYW5hZ2VyaW4nLFxuICAgIGRlcGFydG1lbnQ6ICdBbGxlZS1DZW50ZXIgTWFnZGVidXJnJyxcbiAgICBlbWFpbDogJ3NhcmFoLm11ZWxsZXJAbWVjLmRlJyxcbiAgICBwaG9uZTogJys0OSAoMCkgMzkxIDEyMyA0NTYnLFxuICAgIGltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTQ3OTAxMDg3NTUtMjYxNmI2MTJiNzg2P3c9NDAwJmg9NTAwJmZpdD1jcm9wJmNyb3A9ZmFjZScsXG4gICAgYmlvOiAnU3BlemlhbGlzdGluIGbDvHIgS3VuZGVuYmV0cmV1dW5nIHVuZCBWZXJtaWV0dW5nc21hbmFnZW1lbnQgbWl0IEZva3VzIGF1ZiBuYWNoaGFsdGlnZSBDZW50ZXJsw7ZzdW5nZW4uJyxcbiAgICBzcGVjaWFsdGllczogWydWZXJtaWV0dW5nJywgJ01hcmtldGluZycsICdOYWNoaGFsdGlna2VpdCddLFxuICAgIGxhbmd1YWdlczogWydEZXV0c2NoJywgJ0VuZ2xpc2NoJ10sXG4gICAgc29jaWFsTGlua3M6IFtcbiAgICAgIHtcbiAgICAgICAgcGxhdGZvcm06ICdsaW5rZWRpbicsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9zYXJhaC1tdWVsbGVyJyxcbiAgICAgICAgbGFiZWw6ICdMaW5rZWRJbiBQcm9maWwnXG4gICAgICB9XG4gICAgXSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICBjcmVhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWicsXG4gICAgdXBkYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonXG4gIH0sXG4gIHtcbiAgICBpZDogJzMnLFxuICAgIGxvY2F0aW9uSWQ6ICczJyxcbiAgICBmaXJzdE5hbWU6ICdNaWNoYWVsJyxcbiAgICBsYXN0TmFtZTogJ1NjaG1pZHQnLFxuICAgIGZ1bGxOYW1lOiAnTWljaGFlbCBTY2htaWR0JyxcbiAgICBwb3NpdGlvbjogJ0xlaXRlciBUZWNobmlzY2hlcyBNYW5hZ2VtZW50JyxcbiAgICBkZXBhcnRtZW50OiAnRWxiZSBQYXJrIERyZXNkZW4nLFxuICAgIGVtYWlsOiAnbWljaGFlbC5zY2htaWR0QG1lYy5kZScsXG4gICAgcGhvbmU6ICcrNDkgKDApIDM1MSA3ODkgMDEyJyxcbiAgICBpbWFnZTogJ2h0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNDcyMDk5NjQ1Nzg1LTU2NThhYmY0ZmY0ZT93PTQwMCZoPTUwMCZmaXQ9Y3JvcCZjcm9wPWZhY2UnLFxuICAgIGJpbzogJ0V4cGVydGUgZsO8ciB0ZWNobmlzY2hlIEluZnJhc3RydWt0dXIgdW5kIEZhY2lsaXR5IE1hbmFnZW1lbnQgaW4gU2hvcHBpbmcgQ2VudGVybi4nLFxuICAgIHNwZWNpYWx0aWVzOiBbJ1RlY2huaXNjaGVzIE1hbmFnZW1lbnQnLCAnRmFjaWxpdHkgTWFuYWdlbWVudCcsICdFbmVyZ2llZWZmaXppZW56J10sXG4gICAgbGFuZ3VhZ2VzOiBbJ0RldXRzY2gnLCAnRW5nbGlzY2gnLCAnVHNjaGVjaGlzY2gnXSxcbiAgICBzb2NpYWxMaW5rczogW1xuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ3hpbmcnLFxuICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aW5nLmNvbS9wcm9maWxlL01pY2hhZWxfU2NobWlkdCcsXG4gICAgICAgIGxhYmVsOiAnWElORyBQcm9maWwnXG4gICAgICB9XG4gICAgXSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICBjcmVhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWicsXG4gICAgdXBkYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonXG4gIH0sXG4gIHtcbiAgICBpZDogJzQnLFxuICAgIGxvY2F0aW9uSWQ6ICc0JyxcbiAgICBmaXJzdE5hbWU6ICdBbm5hJyxcbiAgICBsYXN0TmFtZTogJ1dlYmVyJyxcbiAgICBmdWxsTmFtZTogJ0FubmEgV2ViZXInLFxuICAgIHBvc2l0aW9uOiAnTWFya2V0aW5nICYgRXZlbnRzIE1hbmFnZXJpbicsXG4gICAgZGVwYXJ0bWVudDogJ0ZhY2htYXJrdHplbnRydW0gTm9yZCcsXG4gICAgZW1haWw6ICdhbm5hLndlYmVyQG1lYy5kZScsXG4gICAgcGhvbmU6ICcrNDkgKDApIDQwIDU2NyA4OTAnLFxuICAgIGltYWdlOiAnaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Mzg3NjE2ODEwMzMtNjQ2MWZmYWQ4ZDgwP3c9NDAwJmg9NTAwJmZpdD1jcm9wJmNyb3A9ZmFjZScsXG4gICAgYmlvOiAnS3JlYXRpdmUgTWFya2V0aW5nZXhwZXJ0aW4gbWl0IExlaWRlbnNjaGFmdCBmw7xyIGlubm92YXRpdmUgS3VuZGVuZXJsZWJuaXNzZSB1bmQgRXZlbnRzLicsXG4gICAgc3BlY2lhbHRpZXM6IFsnTWFya2V0aW5nJywgJ0V2ZW50IE1hbmFnZW1lbnQnLCAnU29jaWFsIE1lZGlhJ10sXG4gICAgbGFuZ3VhZ2VzOiBbJ0RldXRzY2gnLCAnRW5nbGlzY2gnLCAnRnJhbnrDtnNpc2NoJ10sXG4gICAgc29jaWFsTGlua3M6IFtcbiAgICAgIHtcbiAgICAgICAgcGxhdGZvcm06ICdsaW5rZWRpbicsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hbm5hLXdlYmVyJyxcbiAgICAgICAgbGFiZWw6ICdMaW5rZWRJbiBQcm9maWwnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwbGF0Zm9ybTogJ3hpbmcnLFxuICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aW5nLmNvbS9wcm9maWxlL0FubmFfV2ViZXInLFxuICAgICAgICBsYWJlbDogJ1hJTkcgUHJvZmlsJ1xuICAgICAgfVxuICAgIF0sXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gICAgY3JlYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICAgIHVwZGF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJ1xuICB9XG5dXG5cbmV4cG9ydCBjb25zdCBDb250YWN0Q2FyZHNUZXN0OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgaGFuZGxlQ29udGFjdFNlbGVjdCA9IChjb250YWN0OiBDb250YWN0KSA9PiB7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIGNvbnRhY3Q6JywgY29udGFjdClcbiAgICBhbGVydChgQ29udGFjdCBzZWxlY3RlZDogJHtjb250YWN0LmZ1bGxOYW1lfSAtICR7Y29udGFjdC5wb3NpdGlvbn1gKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ncmF5LTUwIHB5LThcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctN3hsIG14LWF1dG8gcHgtNCBzbTpweC02IGxnOnB4LThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi04XCI+XG4gICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTJcIj5cbiAgICAgICAgICAgIENvbnRhY3QgQ2FyZHMgVGVzdFxuICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAgVGVzdCBkZXIgbmV1ZW4gQ29udGFjdCBDYXJkcyBpbSBEZXNpZ24gZGVyIFZvcmxhZ2VcbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgI
25114HsvKiBDb250YWN0IEdyaWQgLSBBbmdlcGFzc3QgZsO8ciBncsO2w59lcmUgQ2FyZHMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyB4bDpncmlkLWNvbHMtNCBnYXAtOFwiPlxuICAgICAgICAgIHt0ZXN0Q29udGFjdHMubWFwKChjb250YWN0KSA9PiAoXG4gICAgICAgICAgICA8Q29udGFjdENhcmRcbiAgICAgICAgICAgICAga2V5PXtjb250YWN0LmlkfVxuICAgICAgICAgICAgICBjb250YWN0PXtjb250YWN0fVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDb250YWN0U2VsZWN0fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQnV0dG9uLCBNRUNCdXR0b25QcmltYXJ5LCBNRUNCdXR0b25TZWNvbmRhcnksIE1FQ0J1dHRvbkFjY2VudCwgTUVDQnV0dG9uR2hvc3QgfSBmcm9tICdAY29tcG9uZW50cy9VSS9CdXR0b24nXG5cbmV4cG9ydCBjb25zdCBCdXR0b25UZXN0OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1iYWNrZ3JvdW5kLXByaW1hcnkgcC04XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LTR4bCBteC1hdXRvIHNwYWNlLXktMTJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTR4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgbWItNCBmb250LWhlbHZldGljYS1ub3dcIj5cbiAgICAgICAgICAgIE1FQyBCdXR0b24gU3R5bGVzIFRlc3RcbiAgICAgICAgICA8L2gxPlxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgIEJhc2llcmVuZCBhdWYgZGVuIE1FQy1EZXNpZ25zIG1pdCBIZWx2ZXRpY2EgTm93IERpc3BsYXkgU2NocmlmdGFydFxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIE1FQyBCdXR0b24gVmFyaWFudHMgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInNwYWNlLXktOFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZm9udC1oZWx2ZXRpY2Etbm93XCI+XG4gICAgICAgICAgICBNRUMgQnV0dG9uIFZhcmlhbnRlblxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy00IGdhcC02XCI+XG4gICAgICAgICAgICB7LyogUHJpbWFyeSAtIERhcmsgQmFja2dyb3VuZCAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5QcmltYXJ5IChEYXJrKTwvaDM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvblByaW1hcnkgc2l6ZT1cInNtXCI+QWxsZSBOYWNocmljaHRlbjwvTUVDQnV0dG9uUHJpbWFyeT5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uUHJpbWFyeSBzaXplPVwibWRcIj5BbGxlIE5hY2hyaWNodGVuPC9NRUNCdXR0b25QcmltYXJ5PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25QcmltYXJ5IHNpemU9XCJsZ1wiPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBTZWNvbmRhcnkgLSBMaWdodCBCYWNrZ3JvdW5kICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPlNlY29uZGFyeSAoTGlnaHQpPC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uU2Vjb25kYXJ5IHNpemU9XCJzbVwiPkpldHp0IGJld2VyYmVuPC9NRUNCdXR0b25TZWNvbmRhcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvblNlY29uZGFyeSBzaXplPVwibWRcIj5KZXR6dCBiZXdlcmJlbjwvTUVDQnV0dG9uU2Vjb25kYXJ5PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25TZWNvbmRhcnkgc2l6ZT1cImxnXCI+SmV0enQgYmV3ZXJiZW48L01FQ0J1dHRvblNlY29uZGFyeT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIEFjY2VudCAtIFJlZCBCYWNrZ3JvdW5kICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPkFjY2VudCAoUmVkKTwvaDM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBzaXplPVwic21cIj5XZWl0ZXJlIEluZm9ybWF0aW9uZW48L01FQ0J1dHRvbkFjY2VudD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uQWNjZW50IHNpemU9XCJtZFwiPldlaXRlcmUgSW5mb3JtYXRpb25lbjwvTUVDQnV0dG9uQWNjZW50PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25BY2NlbnQgc2l6ZT1cImxnXCI+V2VpdGVyZSBJbmZvcm1hdGlvbmVuPC9NRUNCdXR0b25BY2NlbnQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBHaG9zdCAtIFRyYW5zcGFyZW50ICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeVwiPkdob3N0IChUcmFuc3B
25114hcmVudCk8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25HaG9zdCBzaXplPVwic21cIj5NZWhyIGVyZmFocmVuPC9NRUNCdXR0b25HaG9zdD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3Qgc2l6ZT1cIm1kXCI+TWVociBlcmZhaHJlbjwvTUVDQnV0dG9uR2hvc3Q+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkdob3N0IHNpemU9XCJsZ1wiPk1laHIgZXJmYWhyZW48L01FQ0J1dHRvbkdob3N0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIEJ1dHRvbiBTdGF0ZXMgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInNwYWNlLXktOFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZm9udC1oZWx2ZXRpY2Etbm93XCI+XG4gICAgICAgICAgICBCdXR0b24gU3RhdGVzXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5Ob3JtYWw8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25QcmltYXJ5PkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudD5XZWl0ZXJlIEluZm9ybWF0aW9uZW48L01FQ0J1dHRvbkFjY2VudD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3Q+TWVociBlcmZhaHJlbjwvTUVDQnV0dG9uR2hvc3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnlcIj5Mb2FkaW5nPC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uUHJpbWFyeSBsb2FkaW5nPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBsb2FkaW5nPldlaXRlcmUgSW5mb3JtYXRpb25lbjwvTUVDQnV0dG9uQWNjZW50PlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25HaG9zdCBsb2FkaW5nPk1laHIgZXJmYWhyZW48L01FQ0J1dHRvbkdob3N0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5XCI+RGlzYWJsZWQ8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxNRUNCdXR0b25QcmltYXJ5IGRpc2FibGVkPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBkaXNhYmxlZD5XZWl0ZXJlIEluZm9ybWF0aW9uZW48L01FQ0J1dHRvbkFjY2VudD5cbiAgICAgICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3QgZGlzYWJsZWQ+TWVociBlcmZhaHJlbjwvTUVDQnV0dG9uR2hvc3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICB7LyogRnVsbCBXaWR0aCBCdXR0b25zICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJzcGFjZS15LThcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZvbnQtaGVsdmV0aWNhLW5vd1wiPlxuICAgICAgICAgICAgRnVsbCBXaWR0aCBCdXR0b25zXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNCBtYXgtdy1tZFwiPlxuICAgICAgICAgICAgPE1FQ0J1dHRvblByaW1hcnkgZnVsbFdpZHRoPkFsbGUgTmFjaHJpY2h0ZW48L01FQ0J1dHRvblByaW1hcnk+XG4gICAgICAgICAgICA8TUVDQnV0dG9uU2Vjb25kYXJ5IGZ1bGxXaWR0aD5KZXR6dCBiZXdlcmJlbjwvTUVDQnV0dG9uU2Vjb25kYXJ5PlxuICAgICAgICAgICAgPE1FQ0J1dHRvbkFjY2VudCBmdWxsV2lkdGg+V2VpdGVyZSBJbmZvcm1hdGlvbmVuPC9NRUNCdXR0b25BY2NlbnQ+XG4gICAgICAgICAgICA8TUVDQnV0dG9uR2hvc3QgZnVsbFdpZHRoPk1laHIgZXJmYWhyZW48L01FQ0J1dHRvbkdob3N0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIFR5cG9ncmFwaHkgVGVzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwic3BhY2UteS04XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBmb250LWhlbHZldGljYS1ub3dcIj5cbiAgICAgICAgICAgIEhlbHZldGljYSBOb3cgRGlzcGxheSBUeXBvZ3JhcGh5XG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LWhlbHZldGljYS1ub3cgZm9udC1ub3JtYWwgdGV4dC1sZyB0ZXh0LXRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICBSZWd1bGFyOiBEaWVzIGlzdCBlaW4gVGVzdCBkZXIgSGVsdmV0aWNhIE5vdyBEaXNwbGF5IFJlZ3VsYXIgU2NocmlmdGFydC5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LWhlbHZldGljYS1ub3cgZm9udC1ib2xkIHRleHQtbGcgdGV4dC10ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgQm9sZDogRGllcyBpc3QgZWluIFRlc3QgZGVyIEhlbHZldGljYSBOb3cgRGlzcGxheSBCb2xkIFNjaHJpZnRhcnQuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1oZWx2ZXRpY2Etbm93IGZvbnQtYm9sZCB0ZXh0LTN4bCB0ZXh0LW1lYy1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgIEdyb8OfZSDDnGJlcnNjaHJpZnQgaW4gTUVDIFJvdFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtaGVsdmV0aWNhLW5vdyBmb250LWJvbGQgdGV4dC0yeGwgdGV4dC1tZWMtc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgIE1pdHRsZXJlIMOcYmVyc2NocmlmdCBpbiBNRUMgR3JhdVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyUm91dGVyLCBSb3V0ZXJQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgQXBwIGZyb20gJy4uL0FwcCdcbmltcG9ydCBBZG1pblBhZ2UgZnJvbSAnLi4vcGFnZXMvQWRtaW5QYWdlJ1xuaW1wb3J0IHsgVGVzdE92ZXJ2aWV3IH0gZnJvbSAnLi4vcGFnZXMvVGVzdE92ZXJ2aWV3J1xuaW1wb3J0IHsgTG9jYXRpb25DYXJkc1Rlc3QgfSBmcm9tICcuLi9wYWdlcy9Mb2NhdGlvbkNhcmRzVGVzdCdcbmltcG9ydCB7
25114IENvbnRhY3RDYXJkc1Rlc3QgfSBmcm9tICcuLi9wYWdlcy9Db250YWN0Q2FyZHNUZXN0J1xuaW1wb3J0IHsgQnV0dG9uVGVzdCB9IGZyb20gJy4uL3BhZ2VzL0J1dHRvblRlc3QnXG5cbmNvbnN0IHJvdXRlciA9IGNyZWF0ZUJyb3dzZXJSb3V0ZXIoW1xuICB7XG4gICAgcGF0aDogJy8nLFxuICAgIGVsZW1lbnQ6IDxBcHAgLz5cbiAgfSxcbiAge1xuICAgIHBhdGg6ICcvYWRtaW4nLFxuICAgIGVsZW1lbnQ6IDxBZG1pblBhZ2UgLz5cbiAgfSxcbiAge1xuICAgIHBhdGg6ICcvdGVzdCcsXG4gICAgZWxlbWVudDogPFRlc3RPdmVydmlldyAvPlxuICB9LFxuICB7XG4gICAgcGF0aDogJy90ZXN0L2xvY2F0aW9uLWNhcmRzJyxcbiAgICBlbGVtZW50OiA8TG9jYXRpb25DYXJkc1Rlc3QgLz5cbiAgfSxcbiAge1xuICAgIHBhdGg6ICcvdGVzdC9jb250YWN0LWNhcmRzJyxcbiAgICBlbGVtZW50OiA8Q29udGFjdENhcmRzVGVzdCAvPlxuICB9LFxuICB7XG4gICAgcGF0aDogJy90ZXN0L2J1dHRvbnMnLFxuICAgIGVsZW1lbnQ6IDxCdXR0b25UZXN0IC8+XG4gIH1cbl0pXG5cbmV4cG9ydCBjb25zdCBBcHBSb3V0ZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICByZXR1cm4gPFJvdXRlclByb3ZpZGVyIHJvdXRlcj17cm91dGVyfSAvPlxufVxuIiwiLy8gc3JjL3BlcnNpc3QudHNcbmltcG9ydCB7IGRlaHlkcmF0ZSwgaHlkcmF0ZSB9IGZyb20gXCJAdGFuc3RhY2svcXVlcnktY29yZVwiO1xudmFyIGNhY2hlRXZlbnRUeXBlcyA9IFtcImFkZGVkXCIsIFwicmVtb3ZlZFwiLCBcInVwZGF0ZWRcIl07XG5mdW5jdGlvbiBpc0NhY2hlRXZlbnRUeXBlKGV2ZW50VHlwZSkge1xuICByZXR1cm4gY2FjaGVFdmVudFR5cGVzLmluY2x1ZGVzKGV2ZW50VHlwZSk7XG59XG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0UXVlcnlDbGllbnRSZXN0b3JlKHtcbiAgcXVlcnlDbGllbnQsXG4gIHBlcnNpc3RlcixcbiAgbWF4QWdlID0gMWUzICogNjAgKiA2MCAqIDI0LFxuICBidXN0ZXIgPSBcIlwiLFxuICBoeWRyYXRlT3B0aW9uc1xufSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBlcnNpc3RlZENsaWVudCA9IGF3YWl0IHBlcnNpc3Rlci5yZXN0b3JlQ2xpZW50KCk7XG4gICAgaWYgKHBlcnNpc3RlZENsaWVudCkge1xuICAgICAgaWYgKHBlcnNpc3RlZENsaWVudC50aW1lc3RhbXApIHtcbiAgICAgICAgY29uc3QgZXhwaXJlZCA9IERhdGUubm93KCkgLSBwZXJzaXN0ZWRDbGllbnQudGltZXN0YW1wID4gbWF4QWdlO1xuICAgICAgICBjb25zdCBidXN0ZWQgPSBwZXJzaXN0ZWRDbGllbnQuYnVzdGVyICE9PSBidXN0ZXI7XG4gICAgICAgIGlmIChleHBpcmVkIHx8IGJ1c3RlZCkge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZXIucmVtb3ZlQ2xpZW50KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHlkcmF0ZShxdWVyeUNsaWVudCwgcGVyc2lzdGVkQ2xpZW50LmNsaWVudFN0YXRlLCBoeWRyYXRlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZXIucmVtb3ZlQ2xpZW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgYXR0ZW1wdGluZyB0byByZXN0b3JlIGNsaWVudCBjYWNoZSBmcm9tIHBlcnNpc3RlZCBsb2NhdGlvbi4gQXMgYSBwcmVjYXV0aW9uLCB0aGUgcGVyc2lzdGVkIGNhY2hlIHdpbGwgYmUgZGlzY2FyZGVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBwZXJzaXN0ZXIucmVtb3ZlQ2xpZW50KCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0UXVlcnlDbGllbnRTYXZlKHtcbiAgcXVlcnlDbGllbnQsXG4gIHBlcnNpc3RlcixcbiAgYnVzdGVyID0gXCJcIixcbiAgZGVoeWRyYXRlT3B0aW9uc1xufSkge1xuICBjb25zdCBwZXJzaXN0Q2xpZW50ID0ge1xuICAgIGJ1c3RlcixcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgY2xpZW50U3RhdGU6IGRlaHlkcmF0ZShxdWVyeUNsaWVudCwgZGVoeWRyYXRlT3B0aW9ucylcbiAgfTtcbiAgYXdhaXQgcGVyc2lzdGVyLnBlcnNpc3RDbGllbnQocGVyc2lzdENsaWVudCk7XG59XG5mdW5jdGlvbiBwZXJzaXN0UXVlcnlDbGllbnRTdWJzY3JpYmUocHJvcHMpIHtcbiAgY29uc3QgdW5zdWJzY3JpYmVRdWVyeUNhY2hlID0gcHJvcHMucXVlcnlDbGllbnQuZ2V0UXVlcnlDYWNoZSgpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICBpZiAoaXNDYWNoZUV2ZW50VHlwZShldmVudC50eXBlKSkge1xuICAgICAgcGVyc2lzdFF1ZXJ5Q2xpZW50U2F2ZShwcm9wcyk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgdW5zdWJzY3JpYmVNdXRhdGlvbkNhY2hlID0gcHJvcHMucXVlcnlDbGllbnQuZ2V0TXV0YXRpb25DYWNoZSgpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICBpZiAoaXNDYWNoZUV2ZW50VHlwZShldmVudC50eXBlKSkge1xuICAgICAgcGVyc2lzdFF1ZXJ5Q2xpZW50U2F2ZShwcm9wcyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB1bnN1YnNjcmliZVF1ZXJ5Q2FjaGUoKTtcbiAgICB1bnN1YnNjcmliZU11dGF0aW9uQ2FjaGUoKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHBlcnNpc3RRdWVyeUNsaWVudChwcm9wcykge1xuICBsZXQgaGFzVW5zdWJzY3JpYmVkID0gZmFsc2U7XG4gIGxldCBwZXJzaXN0UXVlcnlDbGllbnRVbnN1YnNjcmliZTtcbiAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgaGFzVW5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBwZXJzaXN0UXVlcnlDbGllbnRVbnN1YnNjcmliZT8uKCk7XG4gIH07XG4gIGNvbnN0IHJlc3RvcmVQcm9taXNlID0gcGVyc2lzdFF1ZXJ5Q2xpZW50UmVzdG9yZShwcm9wcykudGhlbigoKSA9PiB7XG4gICAgaWYgKCFoYXNVbnN1YnNjcmliZWQpIHtcbiAgICAgIHBlcnNpc3RRdWVyeUNsaWVudFVuc3Vic2NyaWJlID0gcGVyc2lzdFF1ZXJ5Q2xpZW50U3Vic2NyaWJlKHByb3BzKTtcbiAgICB9XG4gI
25114H0pO1xuICByZXR1cm4gW3Vuc3Vic2NyaWJlLCByZXN0b3JlUHJvbWlzZV07XG59XG5leHBvcnQge1xuICBwZXJzaXN0UXVlcnlDbGllbnQsXG4gIHBlcnNpc3RRdWVyeUNsaWVudFJlc3RvcmUsXG4gIHBlcnNpc3RRdWVyeUNsaWVudFNhdmUsXG4gIHBlcnNpc3RRdWVyeUNsaWVudFN1YnNjcmliZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcnNpc3QuanMubWFwIiwiLy8gc3JjL3V0aWxzLnRzXG5mdW5jdGlvbiBub29wKCkge1xufVxuZXhwb3J0IHtcbiAgbm9vcFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuaW1wb3J0IHsgdGltZW91dE1hbmFnZXIgfSBmcm9tIFwiQHRhbnN0YWNrL3F1ZXJ5LWNvcmVcIjtcbmltcG9ydCB7IG5vb3AgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuZnVuY3Rpb24gY3JlYXRlU3luY1N0b3JhZ2VQZXJzaXN0ZXIoe1xuICBzdG9yYWdlLFxuICBrZXkgPSBgUkVBQ1RfUVVFUllfT0ZGTElORV9DQUNIRWAsXG4gIHRocm90dGxlVGltZSA9IDFlMyxcbiAgc2VyaWFsaXplID0gSlNPTi5zdHJpbmdpZnksXG4gIGRlc2VyaWFsaXplID0gSlNPTi5wYXJzZSxcbiAgcmV0cnlcbn0pIHtcbiAgaWYgKHN0b3JhZ2UpIHtcbiAgICBjb25zdCB0cnlTYXZlID0gKHBlcnNpc3RlZENsaWVudCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgc2VyaWFsaXplKHBlcnNpc3RlZENsaWVudCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyc2lzdENsaWVudDogdGhyb3R0bGUoKHBlcnNpc3RlZENsaWVudCkgPT4ge1xuICAgICAgICBsZXQgY2xpZW50ID0gcGVyc2lzdGVkQ2xpZW50O1xuICAgICAgICBsZXQgZXJyb3IgPSB0cnlTYXZlKGNsaWVudCk7XG4gICAgICAgIGxldCBlcnJvckNvdW50ID0gMDtcbiAgICAgICAgd2hpbGUgKGVycm9yICYmIGNsaWVudCkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICBjbGllbnQgPSByZXRyeT8uKHtcbiAgICAgICAgICAgIHBlcnNpc3RlZENsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBlcnJvckNvdW50XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgZXJyb3IgPSB0cnlTYXZlKGNsaWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aHJvdHRsZVRpbWUpLFxuICAgICAgcmVzdG9yZUNsaWVudDogKCkgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVN0cmluZyA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBpZiAoIWNhY2hlU3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZShjYWNoZVN0cmluZyk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlQ2xpZW50OiAoKSA9PiB7XG4gICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwZXJzaXN0Q2xpZW50OiBub29wLFxuICAgIHJlc3RvcmVDbGllbnQ6IG5vb3AsXG4gICAgcmVtb3ZlQ2xpZW50OiBub29wXG4gIH07XG59XG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0ID0gMTAwKSB7XG4gIGxldCB0aW1lciA9IG51bGw7XG4gIGxldCBwYXJhbXM7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgcGFyYW1zID0gYXJncztcbiAgICBpZiAodGltZXIgPT09IG51bGwpIHtcbiAgICAgIHRpbWVyID0gdGltZW91dE1hbmFnZXIuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZ1bmMoLi4ucGFyYW1zKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfSwgd2FpdCk7XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IHtcbiAgY3JlYXRlU3luY1N0b3JhZ2VQZXJzaXN0ZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcbmltcG9ydCB7IHBlcnNpc3RRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeS1wZXJzaXN0LWNsaWVudCdcbmltcG9ydCB7IGNyZWF0ZVN5bmNTdG9yYWdlUGVyc2lzdGVyIH0gZnJvbSAnQHRhbnN0YWNrL3F1ZXJ5LXN5bmMtc3RvcmFnZS1wZXJzaXN0ZXInXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBDTElFTlQgV0lUSCBPRkZMSU5FIFBFUlNJU1RFTkNFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChmb3IgaWZyYW1lIGNvbXBhdGliaWxpdHkpXG4gKi9cbmNvbnN0IGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRlc3QgPSAnX19sb2NhbFN0b3JhZ2VfdGVzdF9fJ1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGVyc2lzdGVyIHRoYXQgc3RvcmVzIGRhdGEgaW4gbG9jYWxTdG9yYWdlXG4gKiBUaGlzIGFsbG93cyB0aGUgYXBwIHRvIHdvcmsgb2ZmbGluZSB3aXRoIHByZXZpb3VzbHkgbG9hZGVkIGRhdGFcbiAqIE9ubHkgZW5hYmxlZCBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChpZnJhbWUgY29tcGF0aWJpbGl0eSlcbiAqL1xuY29uc3QgbG9jYWxTdG9yYWdlUGVyc2lzdGVyID0gaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSA/IGNyZWF0ZVN5bmNTdG9yYWdlUGVyc2lzdGVyKHtcbiAgc3RvcmFnZTogd2luZG93LmxvY2FsU3RvcmFnZSxcbiAga2V5OiAnTUVDX1BPUlRGT0xJT19DQUNIRScsXG4gIC8vIFNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSB0byBoYW5kbGUgY29tcGxleCBkYXRhIHN0cnVjdHVyZXNcbiAgc2VyaWFsaXplOiBKU09OLnN0cmluZ2lmeSxcbiAgZGVzZXJpYWxpemU6IEpTT04ucGFyc2UsXG59KSA6IG51bGxcblxuLyoqXG4gKiBRdWVyeSBDbGllbnQgQ29uZmlndXJhdGlvbiB3aXRoIE9mZmxpbmUgU3VwcG9ydFxuICovXG5leHBvcnQgY29uc3QgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnQoe1xuICBkZWZhdWx0T3B0aW9uczoge1xuICAgIHF1ZXJpZXM6IHtcbiAgICAgIC8vIFN0YWxlIHRpbWU6IDUgbWludXRlcyAoZGF0YSBpcyBjb25zaWRlcmVkIGZyZXNoIGZvciA1
25114IG1pbnV0ZXMpXG4gICAgICBzdGFsZVRpbWU6IDUgKiA2MCAqIDEwMDAsXG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRpbWU6IDI0IGhvdXJzIChkYXRhIHN0YXlzIGluIGNhY2hlIGZvciAyNCBob3VycylcbiAgICAgIGdjVGltZTogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICAgIFxuICAgICAgLy8gUmV0cnkgZmFpbGVkIHJlcXVlc3RzXG4gICAgICByZXRyeTogKGZhaWx1cmVDb3VudCwgZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAvLyBEb24ndCByZXRyeSBvbiA0eHggZXJyb3JzIChjbGllbnQgZXJyb3JzKVxuICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA+PSA0MDAgJiYgZXJyb3I/LnN0YXR1cyA8IDUwMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IHJldHJ5IGlmIG9mZmxpbmUgYW5kIG5vIGNhY2hlZCBkYXRhXG4gICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSA1MDMgJiYgIW5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXRyeSB1cCB0byAzIHRpbWVzIGZvciBuZXR3b3JrIGVycm9yc1xuICAgICAgICByZXR1cm4gZmFpbHVyZUNvdW50IDwgM1xuICAgICAgfSxcbiAgICAgIFxuICAgICAgLy8gRG9uJ3QgcmVmZXRjaCBvbiB3aW5kb3cgZm9jdXMgKHRvIHNhdmUgYmFuZHdpZHRoKVxuICAgICAgcmVmZXRjaE9uV2luZG93Rm9jdXM6IGZhbHNlLFxuICAgICAgXG4gICAgICAvLyBSZWZldGNoIG9uIHJlY29ubmVjdCAod2hlbiBpbnRlcm5ldCBjb21lcyBiYWNrKVxuICAgICAgcmVmZXRjaE9uUmVjb25uZWN0OiB0cnVlLFxuICAgICAgXG4gICAgICAvLyBOZXR3b3JrIG1vZGU6IG9mZmxpbmVGaXJzdFxuICAgICAgLy8gVGhpcyBhbGxvd3MgcXVlcmllcyB0byBzdWNjZWVkIHdpdGggY2FjaGVkIGRhdGEgZXZlbiB3aGVuIG9mZmxpbmVcbiAgICAgIG5ldHdvcmtNb2RlOiAnb2ZmbGluZUZpcnN0JyxcbiAgICB9LFxuICAgIG11dGF0aW9uczoge1xuICAgICAgLy8gUmV0cnkgbXV0YXRpb25zIG9uY2VcbiAgICAgIHJldHJ5OiAxLFxuICAgICAgLy8gTmV0d29yayBtb2RlIGZvciBtdXRhdGlvbnNcbiAgICAgIG5ldHdvcmtNb2RlOiAnb2ZmbGluZUZpcnN0JyxcbiAgICB9XG4gIH1cbn0pXG5cbi8qKlxuICogU2V0dXAgcGVyc2lzdGVuY2UgZm9yIHRoZSBxdWVyeSBjbGllbnRcbiAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHNhdmUgYW5kIHJlc3RvcmUgcXVlcnkgY2FjaGUgdG8vZnJvbSBsb2NhbFN0b3JhZ2VcbiAqIE9ubHkgZW5hYmxlZCBpZiBsb2NhbFN0b3JhZ2UgaXMgYXZhaWxhYmxlIChpZnJhbWUgY29tcGF0aWJpbGl0eSlcbiAqL1xuaWYgKGxvY2FsU3RvcmFnZVBlcnNpc3Rlcikge1xuICBwZXJzaXN0UXVlcnlDbGllbnQoe1xuICAgIHF1ZXJ5Q2xpZW50LFxuICAgIHBlcnNpc3RlcjogbG9jYWxTdG9yYWdlUGVyc2lzdGVyLFxuICAgIC8vIE1heGltdW0gYWdlIG9mIGNhY2hlZCBkYXRhOiAyNCBob3Vyc1xuICAgIG1heEFnZTogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICAvLyBEZWh5ZHJhdGUgb3B0aW9ucyAtIHdoYXQgdG8gcGVyc2lzdFxuICAgIGRlaHlkcmF0ZU9wdGlvbnM6IHtcbiAgICAgIC8vIERvbid0IHBlcnNpc3QgcXVlcmllcyB0aGF0IGhhdmUgZXJyb3JzXG4gICAgICBzaG91bGREZWh5ZHJhdGVRdWVyeTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHJldHVybiBxdWVyeS5zdGF0ZS5zdGF0dXMgPT09ICdzdWNjZXNzJ1xuICAgICAgfSxcbiAgICB9LFxuICB9KVxufSBlbHNlIHtcbiAgY29uc29sZS5sb2coJ+KaoO+4jyBsb2NhbFN0b3JhZ2Ugbm90IGF2YWlsYWJsZSAtIHBlcnNpc3RlbmNlIGRpc2FibGVkIChpZnJhbWUgbW9kZSknKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT0ZGTElORSBERVRFQ1RJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGFwcCBpcyBjdXJyZW50bHkgb25saW5lXG4gKi9cbmV4cG9ydCBjb25zdCBpc09ubGluZSA9ICgpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmVcbn1cblxuLyoqXG4gKiBTZXR1cCBvbmxpbmUvb2ZmbGluZSBldmVudCBsaXN0ZW5lcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwT25saW5lRGV0ZWN0aW9uID0gKFxuICBvbk9ubGluZT86ICgpID0+IHZvaWQsXG4gIG9uT2ZmbGluZT86ICgpID0+IHZvaWRcbikgPT4ge1xuICBjb25zdCBoYW5kbGVPbmxpbmUgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ/Cfn6IgQXBwIGlzIG9ubGluZSAtIHJlZmV0Y2hpbmcgZGF0YScpXG4gICAgLy8gUmVmZXRjaCBhbGwgcXVlcmllcyB3aGVuIGNvbWluZyBiYWNrIG9ubGluZVxuICAgIHF1ZXJ5Q2xpZW50LnJlZmV0Y2hRdWVyaWVzKClcbiAgICBvbk9ubGluZT8uKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9mZmxpbmUgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ/CflLQgQXBwIGlzIG9mZmxpbmUgLSB1c2luZyBjYWNoZWQgZGF0YScpXG4gICAgb25PZmZsaW5lPy4oKVxuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGhhbmRsZU9ubGluZSlcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCBoYW5kbGVPZmZsaW5lKVxuXG4gIC8vIFJldHVybiBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiAoKSA9PiB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29ubGluZScsIGhhbmRsZU9ubGluZSlcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIGhhbmRsZU9mZmxpbmUpXG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBQ0hFIE1BTkFHRU1FTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2xlYXIgYWxsIGNhY2hlZCBkYXRhXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhckNhY2hlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBxdWVyeUNsaWVudC5jbGVhcigpXG4gIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdNRUNfUE9SVEZPTElPX0NBQ0hFJylcbiAgY29uc29sZS5sb2coJ/Cfl5HvuI8gQ2FjaGUgY2xlYXJlZCcpXG59XG5cbi8qKlxuICogR2V0IGNhY2hlIHNpemUgKGFwcHJveGltYXRlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0Q2FjaGVTaXplID0gKCk6IG51bWJlciA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ01FQ19QT1JURk9MSU9fQ0FDSEUnKVxuICBpZiAoIWNhY2hlKSByZXR1cm4gMFxuICAvLyBSZXR1cm4gc2l6ZSBpbiBLQlxuICByZXR1cm4gbmV3IEJsb2IoW2NhY2hlXSkuc2l6ZSAvIDEwMjRcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBjYWNoZSBleGlzdHNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0NhY2hlZERhdGEgPSAoKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybi
25114Bsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTUVDX1BPUlRGT0xJT19DQUNIRScpICE9PSBudWxsXG59XG5cbiIsIi8qKlxuICogU2VydmljZSBXb3JrZXIgUmVnaXN0cmF0aW9uXG4gKiBIYW5kbGVzIFBXQSBmdW5jdGlvbmFsaXR5IGFuZCBvZmZsaW5lIHN1cHBvcnRcbiAqL1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTZXJ2aWNlV29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAvLyBPbmx5IHJlZ2lzdGVyIGluIHByb2R1Y3Rpb25cbiAgaWYgKGltcG9ydC5tZXRhLmVudi5ERVYpIHtcbiAgICBjb25zb2xlLmxvZygnW1NXXSBTZXJ2aWNlIFdvcmtlciBkaXNhYmxlZCBpbiBkZXZlbG9wbWVudCcpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBDaGVjayBpZiBzZXJ2aWNlIHdvcmtlcnMgYXJlIHN1cHBvcnRlZFxuICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkge1xuICAgIGNvbnNvbGUubG9nKCdbU1ddIFNlcnZpY2UgV29ya2VycyBub3Qgc3VwcG9ydGVkJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZpY2Ugd29ya2VyXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoJy9zdy5qcycsIHtcbiAgICAgIHNjb3BlOiAnLycsXG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKCdbU1ddIFNlcnZpY2UgV29ya2VyIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5OicsIHJlZ2lzdHJhdGlvbi5zY29wZSlcblxuICAgIC8vIENoZWNrIGZvciB1cGRhdGVzIHBlcmlvZGljYWxseVxuICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHJlZ2lzdHJhdGlvbi51cGRhdGUoKVxuICAgIH0sIDYwICogNjAgKiAxMDAwKSAvLyBDaGVjayBldmVyeSBob3VyXG5cbiAgICAvLyBIYW5kbGUgdXBkYXRlc1xuICAgIHJlZ2lzdHJhdGlvbi5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGVmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG5ld1dvcmtlciA9IHJlZ2lzdHJhdGlvbi5pbnN0YWxsaW5nXG4gICAgICBcbiAgICAgIGlmICghbmV3V29ya2VyKSByZXR1cm5cblxuICAgICAgbmV3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRlY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBpZiAobmV3V29ya2VyLnN0YXRlID09PSAnaW5zdGFsbGVkJyAmJiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyKSB7XG4gICAgICAgICAgLy8gTmV3IHNlcnZpY2Ugd29ya2VyIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU1ddIE5ldyB2ZXJzaW9uIGF2YWlsYWJsZScpXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTm90aWZ5IHVzZXIgYWJvdXQgdXBkYXRlXG4gICAgICAgICAgaWYgKGNvbmZpcm0oJ0VpbmUgbmV1ZSBWZXJzaW9uIGlzdCB2ZXJmw7xnYmFyLiBKZXR6dCBha3R1YWxpc2llcmVuPycpKSB7XG4gICAgICAgICAgICBuZXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiAnU0tJUF9XQUlUSU5HJyB9KVxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBIYW5kbGUgY29udHJvbGxlciBjaGFuZ2VcbiAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdjb250cm9sbGVyY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1tTV10gQ29udHJvbGxlciBjaGFuZ2VkLCByZWxvYWRpbmcgcGFnZScpXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICB9KVxuXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignW1NXXSBTZXJ2aWNlIFdvcmtlciByZWdpc3RyYXRpb24gZmFpbGVkOicsIGVycm9yKVxuICB9XG59XG5cbi8qKlxuICogVW5yZWdpc3RlciBzZXJ2aWNlIHdvcmtlciAoZm9yIGRldmVsb3BtZW50L3Rlc3RpbmcpXG4gKi9cbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyU2VydmljZVdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKCEoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHlcbiAgICBhd2FpdCByZWdpc3RyYXRpb24udW5yZWdpc3RlcigpXG4gICAgY29uc29sZS5sb2coJ1tTV10gU2VydmljZSBXb3JrZXIgdW5yZWdpc3RlcmVkJylcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbU1ddIFNlcnZpY2UgV29ya2VyIHVucmVnaXN0cmF0aW9uIGZhaWxlZDonLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBjYWNoZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWFyU2VydmljZVdvcmtlckNhY2hlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeVxuICAgIGlmIChyZWdpc3RyYXRpb24uYWN0aXZlKSB7XG4gICAgICByZWdpc3RyYXRpb24uYWN0aXZlLnBvc3RNZXNzYWdlKHsgdHlwZTogJ0NMRUFSX0NBQ0hFJyB9KVxuICAgICAgY29uc29sZS5sb2coJ1tTV10gQ2FjaGUgY2xlYXJlZCcpXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tTV10gRmFpbGVkIHRvIGNsZWFyIGNhY2hlOicsIGVycm9yKVxuICB9XG59XG5cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20vY2xpZW50J1xuaW1wb3J0IHsgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSdcbmltcG9ydCB7IFJlYWN0UXVlcnlEZXZ0b29scyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeS1kZXZ0b29scydcbmltcG9ydCB7IEFwcFJvdXRlciB9IGZyb20gJy4vcm91dGVyJ1xuaW1wb3J0IHsgcXVlcnlDbGllbnQsIHNldHVwT25saW5lRGV0ZWN0aW9uIH0gZnJvbSAnLi9saWIvcXVlcnlDbGllbnQnXG5pbXBvcnQgeyByZWdpc3RlclNlcnZpY2VXb3JrZXIgfSBmcm9tICcuL2xpYi9zZXJ2aWNlV29ya2VyJ1xuaW1wb3J0ICcuL3N0eWxlcy9pbmRleC5jc3MnXG5pbXBvcnQgJy4vc3R5bGVzL2ZvbnRzLmNzcydcblxuLy8gU2V0dXAgb25saW5lL29mZmxpbmUgZGV0ZWN0aW9uXG5zZXR1cE9ubGluZURldGVjdGlvbihcbiAgKCkgPT4ge1xuICAgIC8vIFdoZW4gY29taW5nIGJhY2sgb25saW5lXG4gICAgY29uc29sZS5sb2coJ+KchSBWZXJiaW5kdW5nIHdpZWRlcmhlcmdlc3RlbGx0JylcbiAgfSxcbiAgKCkgPT4ge1xuICAgIC8vIFdoZW4gZ29pbmcgb2ZmbGluZVxuICAgIGNvbnNvbGUubG9nKCfimqDvuI8gT2ZmbGluZS1Nb2R1cyAtIFZlcndlbmRlIGdlc3BlaWNoZXJ0ZSBEYXRlbicpXG4gIH1cbilcblxuLy8gUmVnaXN0ZXIgc2VydmljZSB3b3JrZXIgZm9yIFBXQSBmdW5jdGlvbmFsaXR5XG5yZWdpc3RlclNlcnZpY2VXb3JrZXIoKVxuXG4vLyBFcnJvciBib3VuZGFyeSBmb3IgdGhlIGVudGlyZSBhcHBcbmNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8XG4gIHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9LFxuICB7IGhhc0Vycm9yOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH1cbj4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0geyBoYXNFcnJvcjogZmFsc2UgfVxuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgICByZXR1cm4geyBoYXNFcnJvcjogdHJ1ZSwgZXJyb3IgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3I6IEVycm9yLCBlcnJvckluZm86IFJlYWN0LkVycm9ySW5mbykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ01FQyBQb3J0Zm9saW8gRXJyb3I6JywgZXJyb3IsIGVycm9ySW5mbylcbiAgICBcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCBzZW5kIHRvIGVycm9yIHJlcG9ydGluZyBzZXJ2aWNlXG4gICAgaWYgKGltcG9ydC5tZXRhLmVudi5QUk9EKSB7XG4gICAgICAvLyBUT0RPOiBTZW5kIHRvIFNlbnRyeSBvciBzaW1pbGFyXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBiZy1iYWNrZ3JvdW5kLXNlY29uZGFyeVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgcC04XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtNnhsIG1iLTRcIj7wn5i1PC9kaXY+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0yXCI+XG4gICAgICAgICAgICAgIE9vcHMhIEV0d2FzIGlzdCBzY2hpZWZnZWxhdWZlblxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtdGV4dC1zZWNvbmRhcnkgbWItNFwiPlxuICAgICAgICAgICAgICBEaWUgQW53ZW5kdW5nIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbi5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy1tZWMtcHJpbWFyeSB0ZXh0LXdoaXRlIHB4LTQgcHktMiByb3VuZGVkLW1lYyBob3ZlcjpiZy1tZWMtcHJpbWFyeS1kYXJrIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2VpdGUgbmV1IGxhZGVuXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgfVxufVxuXG4vLyBNb3VudCB0aGUgYXBwXG5SZWFjdERPTS5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290JykhKS5yZW5kZXIoXG4gIDxSZWFjdC5TdHJpY3RNb2RlPlxuICAgIDxFcnJvckJvdW5kYXJ5PlxuICAgICAgPFF1ZXJ5Q2xpZW50UHJvdmlkZXIgY2xpZW50PXtxdWVyeUNsaWVudH0+XG4gICAgICAgIDxBcHBSb3V0ZXIgLz5cbiAgICAgICAgey8qIERldiB0b29scyBvbmx5IGluIGRldmVsb3BtZW50ICovfVxuICAgICAgICB7aW1wb3J0Lm1ldGEuZW52LkRFViAmJiA8UmVhY3RRdWVyeURldnRvb2xzIGluaXRpYWxJc09wZW49e2ZhbHNlfSAvPn1cbiAgICAgIDwvUXVlcnlDbGllbnRQcm92aWRlcj
251145cbiAgICA8L0Vycm9yQm91bmRhcnk+XG4gIDwvUmVhY3QuU3RyaWN0TW9kZT5cbilcbiJdLCJuYW1lcyI6WyJsIiwibiIsInAiLCJxIiwiciIsInYiLCJ6IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJHIiwiSCIsIkkiLCJLIiwiTCIsIk0iLCJrIiwiZiIsIm0iLCJOIiwiTyIsImEiLCJQIiwiUSIsIlIiLCJTIiwiVCIsImIiLCJVIiwiViIsIlciLCJYIiwicmVhY3RNb2R1bGUiLCJyZXF1aXJlJCQwIiwianN4UnVudGltZU1vZHVsZSIsInciLCJ4IiwidCIsInUiLCJ5IiwiRiIsIkoiLCJzY2hlZHVsZXJNb2R1bGUiLCJyZXF1aXJlJCQxIiwiZCIsImUiLCJnIiwiaCIsImMiLCJyZWFjdERvbU1vZHVsZSIsIm5vb3AiLCJfYSIsImNsaWVudCIsIl9jbGVhbnVwIiwiX3NldHVwIiwiZ2V0RGVmYXVsdFN0YXRlIiwiX2NsaWVudCIsIl9yZXRyeWVyIiwiZGlzcGF0Y2hfZm4iLCJfbXV0YXRpb25DYWNoZSIsIl9kZWZhdWx0T3B0aW9ucyIsIl9iIiwiUmVhY3QuY3JlYXRlQ29udGV4dCIsInF1ZXJ5Q2xpZW50IiwiUmVhY3QudXNlQ29udGV4dCIsIlJlYWN0LnVzZUVmZmVjdCIsImpzeCIsIlJlYWN0LnVzZVN0YXRlIiwiUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUiLCJSZWFjdC51c2VDYWxsYmFjayIsIl9fdHlwZUVycm9yIiwiX19hY2Nlc3NDaGVjayIsIl9fcHJpdmF0ZUdldCIsIl9fcHJpdmF0ZUFkZCIsImlkIiwicm91dGVyIiwicmYiLCJjYiIsIm5hdmlnYXRvciIsIlJlYWN0Mi51c2VDb250ZXh0IiwidXNlTG9jYXRpb24iLCJSZWFjdDIudXNlTGF5b3V0RWZmZWN0IiwiUmVhY3QyLnVzZVJlZiIsIlJlYWN0Mi51c2VDYWxsYmFjayIsIlJlYWN0Mi5jcmVhdGVDb250ZXh0IiwiUmVhY3QyLnVzZU1lbW8iLCJSZWFjdDIuRnJhZ21lbnQiLCJSZWFjdDIuY3JlYXRlRWxlbWVudCIsIlJlYWN0Mi5Db21wb25lbnQiLCJSZWFjdDMuY3JlYXRlRWxlbWVudCIsIlJlYWN0My51c2VTdGF0ZSIsIlJlYWN0My51c2VSZWYiLCJSZWFjdDMudXNlQ2FsbGJhY2siLCJSZWFjdDMuc3RhcnRUcmFuc2l0aW9uIiwiUmVhY3QzLnVzZUxheW91dEVmZmVjdCIsIlJlYWN0My51c2VFZmZlY3QiLCJSZWFjdDMudXNlTWVtbyIsIlJlYWN0My5GcmFnbWVudCIsIlJlYWN0My5tZW1vIiwiUmVhY3Q4LnVzZUNvbnRleHQiLCJSZWFjdDguY3JlYXRlQ29udGV4dCIsIlJlYWN0OC51c2VTdGF0ZSIsIlJlYWN0OC51c2VSZWYiLCJSZWFjdDgudXNlRWZmZWN0IiwiUmVhY3Q4LnVzZU1lbW8iLCJSZWFjdDguY3JlYXRlRWxlbWVudCIsIm0yIiwiUmVhY3Q4LkZyYWdtZW50IiwiUmVhY3QxMC5mb3J3YXJkUmVmIiwiUmVhY3QxMC51c2VDb250ZXh0IiwiUmVhY3QxMC5jcmVhdGVFbGVtZW50IiwiUmVhY3QxMC5GcmFnbWVudCIsIlJlYWN0MTAudXNlQ2FsbGJhY2siLCJSZWFjdC5jcmVhdGVFbGVtZW50IiwiUmVhY3RET00uZmx1c2hTeW5jIiwiaW5pdGlhbFN0YXRlIiwiX192aXRlX2ltcG9ydF9tZXRhX2Vudl9fIiwiY3JlYXRlU3RvcmUiLCJSZWFjdCIsImlzIiwib2JqZWN0SXMiLCJ1c2VFZmZlY3QiLCJ1c2VEZWJ1Z1ZhbHVlIiwic2hpbSIsInNoaW1Nb2R1bGUiLCJ3aXRoU2VsZWN0b3JNb2R1bGUiLCJSZWFjdEV4cG9ydHMiLCJzdG9yZSIsIl9lIiwic3RvcmUyIiwiaHlkcmF0ZSIsIl9hMiIsImlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlIiwiZXJyb3IiLCJqc3hzIiwiZm9yd2FyZFJlZiIsImNyZWF0ZUVsZW1lbnQiLCJNYXAiLCJDb21wb25lbnQiLCJlbGVtZW50IiwidXNlU3RhdGUiLCJ1c2VSZWYiLCJzaXplQ2xhc3NlcyIsIkdyaWQzWDMiLCJjcmVhdGVQb3J0YWwiLCJGcmFnbWVudCIsImNlbnRlckRhdGEiLCJFcnJvckJvdW5kYXJ5IiwiY2xhc3NHcm91cCIsInVzZU1lbW8iLCJSb3V0ZXJQcm92aWRlciIsIlJlYWN0RE9NIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU2EsSUFBSUEsTUFBRSxPQUFPLElBQUksZUFBZSxHQUFFQyxNQUFFLE9BQU8sSUFBSSxjQUFjLEdBQUVDLE1BQUUsT0FBTyxJQUFJLGdCQUFnQixHQUFFQyxNQUFFLE9BQU8sSUFBSSxtQkFBbUIsR0FBRUMsTUFBRSxPQUFPLElBQUksZ0JBQWdCLEdBQUUsSUFBRSxPQUFPLElBQUksZ0JBQWdCLEdBQUUsSUFBRSxPQUFPLElBQUksZUFBZSxHQUFFQyxNQUFFLE9BQU8sSUFBSSxtQkFBbUIsR0FBRSxJQUFFLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRSxJQUFFLE9BQU8sSUFBSSxZQUFZLEdBQUUsSUFBRSxPQUFPLElBQUksWUFBWSxHQUFFQyxNQUFFLE9BQU87QUFBUyxTQUFTQyxJQUFFLEdBQUU7QUFBQyxNQUFHLFNBQU8sS0FBRyxhQUFXLE9BQU8sRUFBRSxRQUFPO0FBQUssTUFBRUQsT0FBRyxFQUFFQSxHQUFDLEtBQUcsRUFBRSxZQUFZO0FBQUUsU0FBTSxlQUFhLE9BQU8sSUFBRSxJQUFFO0FBQUk7QUFDMWUsSUFBSUUsTUFBRSxFQUFDLFdBQVUsV0FBVTtBQUFDLFNBQU07QUFBRSxHQUFFLG9CQUFtQixXQUFVO0FBQUEsR0FBRyxxQkFBb0IsV0FBVTtBQUFBLEdBQUcsaUJBQWdCLFdBQVU7QUFBQSxFQUFFLEdBQUVDLE1BQUUsT0FBTyxRQUFPQyxNQUFFO0FBQUcsU0FBU0MsSUFBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE9BQUssUUFBTTtBQUFFLE9BQUssVUFBUTtBQUFFLE9BQUssT0FBS0Q7QUFBRSxPQUFLLFVBQVEsS0FBR0Y7QUFBQztBQUFDRyxJQUFFLFVBQVUsbUJBQWlCLENBQUE7QUFDblFBLElBQUUsVUFBVSxXQUFTLFNBQVMsR0FBRSxHQUFFO0FBQUMsTUFBRyxhQUFXLE9BQU8sS0FBRyxlQUFhLE9BQU8sS0FBRyxRQUFNLEVBQUUsT0FBTSxNQUFNLHVIQUF1SDtBQUFFLE9BQUssUUFBUSxnQkFBZ0IsTUFBSyxHQUFFLEdBQUUsVUFBVTtBQUFDO0FBQUVBLElBQUUsVUFBVSxjQUFZLFNBQVMsR0FBRTtBQUFDLE9BQUssUUFBUSxtQkFBbUIsTUFBSyxHQUFFLGFBQWE7QUFBQztBQUFFLFNBQVMsSUFBRztBQUFBO0FBQUUsRUFBRSxZQUFVQSxJQUFFO0FBQVUsU0FBU0MsSUFBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE9BQUssUUFBTTtBQUFFLE9BQUssVUFBUTtBQUFFLE9BQUssT0FBS0Y7QUFBRSxPQUFLLFVBQVEsS0FBR0Y7QUFBQztBQUFDLElBQUlLLE1BQUVELElBQUUsWUFBVSxJQUFJO0FBQ3JmQyxJQUFFLGNBQVlEO0FBQUVILElBQUVJLEtBQUVGLElBQUUsU0FBUztBQUFFRSxJQUFFLHVCQUFxQjtBQUFHLElBQUlDLE1BQUUsTUFBTSxTQUFRLElBQUUsT0FBTyxVQUFVLGdCQUFlQyxNQUFFLEVBQUMsU0FBUSxLQUFJLEdBQUVDLE1BQUUsRUFBQyxLQUFJLE1BQUcsS0FBSSxNQUFHLFFBQU8sTUFBRyxVQUFTLEtBQUU7QUFDeEssU0FBU0MsSUFBRSxHQU
25114FFLEdBQUUsR0FBRTtBQUFDLE1BQUksR0FBRSxJQUFFLENBQUEsR0FBR0MsS0FBRSxNQUFLLElBQUU7QUFBSyxNQUFHLFFBQU0sRUFBRSxNQUFJLEtBQUssV0FBUyxFQUFFLFFBQU0sSUFBRSxFQUFFLE1BQUssV0FBUyxFQUFFLFFBQU1BLEtBQUUsS0FBRyxFQUFFLE1BQUssRUFBRSxHQUFFLEtBQUssR0FBRSxDQUFDLEtBQUcsQ0FBQ0YsSUFBRSxlQUFlLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUM7QUFBRyxNQUFJLElBQUUsVUFBVSxTQUFPO0FBQUUsTUFBRyxNQUFJLEVBQUUsR0FBRSxXQUFTO0FBQUEsV0FBVSxJQUFFLEdBQUU7QUFBQyxhQUFRRyxLQUFFLE1BQU0sQ0FBQyxHQUFFQyxLQUFFLEdBQUVBLEtBQUUsR0FBRUEsS0FBSSxDQUFBRCxHQUFFQyxFQUFDLElBQUUsVUFBVUEsS0FBRSxDQUFDO0FBQUUsTUFBRSxXQUFTRDtBQUFBLEVBQUM7QUFBQyxNQUFHLEtBQUcsRUFBRSxhQUFhLE1BQUksS0FBSyxJQUFFLEVBQUUsY0FBYSxFQUFFLFlBQVMsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUcsU0FBTSxFQUFDLFVBQVNuQixLQUFFLE1BQUssR0FBRSxLQUFJa0IsSUFBRSxLQUFJLEdBQUUsT0FBTSxHQUFFLFFBQU9ILElBQUUsUUFBTztBQUFDO0FBQzdhLFNBQVNNLElBQUUsR0FBRSxHQUFFO0FBQUMsU0FBTSxFQUFDLFVBQVNyQixLQUFFLE1BQUssRUFBRSxNQUFLLEtBQUksR0FBRSxLQUFJLEVBQUUsS0FBSSxPQUFNLEVBQUUsT0FBTSxRQUFPLEVBQUUsT0FBTTtBQUFDO0FBQUMsU0FBU3NCLElBQUUsR0FBRTtBQUFDLFNBQU0sYUFBVyxPQUFPLEtBQUcsU0FBTyxLQUFHLEVBQUUsYUFBV3RCO0FBQUM7QUFBQyxTQUFTLE9BQU8sR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFDLEtBQUksTUFBSyxLQUFJLEtBQUk7QUFBRSxTQUFNLE1BQUksRUFBRSxRQUFRLFNBQVEsU0FBU3VCLElBQUU7QUFBQyxXQUFPLEVBQUVBLEVBQUM7QUFBQSxFQUFDLENBQUM7QUFBQztBQUFDLElBQUlDLE1BQUU7QUFBTyxTQUFTQyxJQUFFLEdBQUUsR0FBRTtBQUFDLFNBQU0sYUFBVyxPQUFPLEtBQUcsU0FBTyxLQUFHLFFBQU0sRUFBRSxNQUFJLE9BQU8sS0FBRyxFQUFFLEdBQUcsSUFBRSxFQUFFLFNBQVMsRUFBRTtBQUFDO0FBQy9XLFNBQVNDLElBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSVIsS0FBRSxPQUFPO0FBQUUsTUFBRyxnQkFBY0EsTUFBRyxjQUFZQSxHQUFFLEtBQUU7QUFBSyxNQUFJLElBQUU7QUFBRyxNQUFHLFNBQU8sRUFBRSxLQUFFO0FBQUEsTUFBUSxTQUFPQSxJQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBUyxLQUFLO0FBQVMsVUFBRTtBQUFHO0FBQUEsSUFBTSxLQUFLO0FBQVMsY0FBTyxFQUFFLFVBQVE7QUFBQSxRQUFFLEtBQUtsQjtBQUFBQSxRQUFFLEtBQUtDO0FBQUUsY0FBRTtBQUFBLE1BQUU7QUFBQSxFQUFDO0FBQUMsTUFBRyxFQUFFLFFBQU8sSUFBRSxHQUFFLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxPQUFLLElBQUUsTUFBSXdCLElBQUUsR0FBRSxDQUFDLElBQUUsR0FBRVgsSUFBRSxDQUFDLEtBQUcsSUFBRSxJQUFHLFFBQU0sTUFBSSxJQUFFLEVBQUUsUUFBUVUsS0FBRSxLQUFLLElBQUUsTUFBS0UsSUFBRSxHQUFFLEdBQUUsR0FBRSxJQUFHLFNBQVNILElBQUU7QUFBQyxXQUFPQTtBQUFBLEVBQUMsQ0FBQyxLQUFHLFFBQU0sTUFBSUQsSUFBRSxDQUFDLE1BQUksSUFBRUQsSUFBRSxHQUFFLEtBQUcsQ0FBQyxFQUFFLE9BQUssS0FBRyxFQUFFLFFBQU0sRUFBRSxNQUFJLE1BQUksS0FBRyxFQUFFLEtBQUssUUFBUUcsS0FBRSxLQUFLLElBQUUsT0FBSyxDQUFDLElBQUcsRUFBRSxLQUFLLENBQUMsSUFBRztBQUFFLE1BQUU7QUFBRSxNQUFFLE9BQUssSUFBRSxNQUFJLElBQUU7QUFBSSxNQUFHVixJQUFFLENBQUMsRUFBRSxVQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUMsSUFBQUksS0FDcmYsRUFBRSxDQUFDO0FBQUUsUUFBSUMsS0FBRSxJQUFFTSxJQUFFUCxJQUFFLENBQUM7QUFBRSxTQUFHUSxJQUFFUixJQUFFLEdBQUUsR0FBRUMsSUFBRSxDQUFDO0FBQUEsRUFBQztBQUFBLFdBQVNBLEtBQUVaLElBQUUsQ0FBQyxHQUFFLGVBQWEsT0FBT1ksR0FBRSxNQUFJLElBQUVBLEdBQUUsS0FBSyxDQUFDLEdBQUUsSUFBRSxHQUFFLEVBQUVELEtBQUUsRUFBRSxRQUFRLE9BQU0sQ0FBQUEsS0FBRUEsR0FBRSxPQUFNQyxLQUFFLElBQUVNLElBQUVQLElBQUUsR0FBRyxHQUFFLEtBQUdRLElBQUVSLElBQUUsR0FBRSxHQUFFQyxJQUFFLENBQUM7QUFBQSxXQUFVLGFBQVdELEdBQUUsT0FBTSxJQUFFLE9BQU8sQ0FBQyxHQUFFLE1BQU0scURBQW1ELHNCQUFvQixJQUFFLHVCQUFxQixPQUFPLEtBQUssQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFFLE1BQUksS0FBRywyRUFBMkU7QUFBRSxTQUFPO0FBQUM7QUFDelosU0FBU1MsSUFBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUcsUUFBTSxFQUFFLFFBQU87QUFBRSxNQUFJLElBQUUsQ0FBQSxHQUFHLElBQUU7QUFBRUQsTUFBRSxHQUFFLEdBQUUsSUFBRyxJQUFHLFNBQVNILElBQUU7QUFBQyxXQUFPLEVBQUUsS0FBSyxHQUFFQSxJQUFFLEdBQUc7QUFBQSxFQUFDLENBQUM7QUFBRSxTQUFPO0FBQUM7QUFBQyxTQUFTSyxJQUFFLEdBQUU7QUFBQyxNQUFHLE9BQUssRUFBRSxTQUFRO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBUSxRQUFFLEVBQUM7QUFBRyxNQUFFLEtBQUssU0FBU0MsSUFBRTtBQUFDLFVBQUcsTUFBSSxFQUFFLFdBQVMsT0FBSyxFQUFFLFFBQVEsR0FBRSxVQUFRLEdBQUUsRUFBRSxVQUFRQTtBQUFBLElBQUMsR0FBRSxTQUFTQSxJQUFFO0FBQUMsVUFBRyxNQUFJLEVBQUUsV0FBUyxPQUFLLEVBQUUsUUFBUSxHQUFFLFVBQVEsR0FBRSxFQUFFLFVBQVFBO0FBQUEsSUFBQyxDQUFDO0FBQUUsV0FBSyxFQUFFLFlBQVUsRUFBRSxVQUFRLEdBQUUsRUFBRSxVQUFRO0FBQUEsRUFBRTtBQUFDLE1BQUcsTUFBSSxFQUFFLFFBQVEsUUFBTyxFQUFFLFFBQVE7QUFBUSxRQUFNLEVBQUU7QUFBUTtBQUM1WixJQUFJQyxNQUFFLEVBQUMsU0FBUSxLQUFJLEdBQUVDLE1BQUUsRUFBQyxZQUFXLEtBQUksR0FBRUMsTUFBRSxFQUFDLHdCQUF1QkYsS0FBRSx5QkFBd0JDLEtBQUUsbUJBQWtCaEIsSUFBQztBQUFFLFNBQVNrQixNQUFHO0FBQUMsUUFBTSxNQUFNLDBE
25114QUEwRDtBQUFFO0FBQ3pNLHFCQUFBLFdBQWlCLEVBQUMsS0FBSU4sS0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQ0EsTUFBRSxHQUFFLFdBQVU7QUFBQyxNQUFFLE1BQU0sTUFBSyxTQUFTO0FBQUEsRUFBQyxHQUFFLENBQUM7QUFBQyxHQUFFLE9BQU0sU0FBUyxHQUFFO0FBQUMsTUFBSSxJQUFFO0FBQUVBLE1BQUUsR0FBRSxXQUFVO0FBQUM7QUFBQSxFQUFHLENBQUM7QUFBRSxTQUFPO0FBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRTtBQUFDLFNBQU9BLElBQUUsR0FBRSxTQUFTSixJQUFFO0FBQUMsV0FBT0E7QUFBQSxFQUFDLENBQUMsS0FBRyxDQUFBO0FBQUUsR0FBRSxNQUFLLFNBQVMsR0FBRTtBQUFDLE1BQUcsQ0FBQ0QsSUFBRSxDQUFDLEVBQUUsT0FBTSxNQUFNLHVFQUF1RTtBQUFFLFNBQU87QUFBQyxFQUFDO0FBQUUscUJBQUEsWUFBa0JYO0FBQUUscUJBQUEsV0FBaUJUO0FBQUUscUJBQUEsV0FBaUJFO0FBQUUscUJBQUEsZ0JBQXNCUTtBQUFFLHFCQUFBLGFBQW1CVDtBQUFFLHFCQUFBLFdBQWlCO0FBQ2xjLHFCQUFBLHFEQUEyRDZCO0FBQUUscUJBQUEsTUFBWUM7QUFDekUscUJBQUEsZUFBcUIsU0FBUyxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUcsU0FBTyxLQUFHLFdBQVMsRUFBRSxPQUFNLE1BQU0sbUZBQWlGLElBQUUsR0FBRztBQUFFLE1BQUksSUFBRXhCLElBQUUsQ0FBQSxHQUFHLEVBQUUsS0FBSyxHQUFFLElBQUUsRUFBRSxLQUFJUyxLQUFFLEVBQUUsS0FBSSxJQUFFLEVBQUU7QUFBTyxNQUFHLFFBQU0sR0FBRTtBQUFDLGVBQVMsRUFBRSxRQUFNQSxLQUFFLEVBQUUsS0FBSSxJQUFFSCxJQUFFO0FBQVMsZUFBUyxFQUFFLFFBQU0sSUFBRSxLQUFHLEVBQUU7QUFBSyxRQUFHLEVBQUUsUUFBTSxFQUFFLEtBQUssYUFBYSxLQUFJLElBQUUsRUFBRSxLQUFLO0FBQWEsU0FBSUksTUFBSyxFQUFFLEdBQUUsS0FBSyxHQUFFQSxFQUFDLEtBQUcsQ0FBQ0gsSUFBRSxlQUFlRyxFQUFDLE1BQUksRUFBRUEsRUFBQyxJQUFFLFdBQVMsRUFBRUEsRUFBQyxLQUFHLFdBQVMsSUFBRSxFQUFFQSxFQUFDLElBQUUsRUFBRUEsRUFBQztBQUFBLEVBQUU7QUFBQyxNQUFJQSxLQUFFLFVBQVUsU0FBTztBQUFFLE1BQUcsTUFBSUEsR0FBRSxHQUFFLFdBQVM7QUFBQSxXQUFVLElBQUVBLElBQUU7QUFBQyxRQUFFLE1BQU1BLEVBQUM7QUFDdGYsYUFBUUMsS0FBRSxHQUFFQSxLQUFFRCxJQUFFQyxLQUFJLEdBQUVBLEVBQUMsSUFBRSxVQUFVQSxLQUFFLENBQUM7QUFBRSxNQUFFLFdBQVM7QUFBQSxFQUFDO0FBQUMsU0FBTSxFQUFDLFVBQVNwQixLQUFFLE1BQUssRUFBRSxNQUFLLEtBQUksR0FBRSxLQUFJa0IsSUFBRSxPQUFNLEdBQUUsUUFBTyxFQUFDO0FBQUM7QUFBRSxxQkFBQSxnQkFBc0IsU0FBUyxHQUFFO0FBQUMsTUFBRSxFQUFDLFVBQVMsR0FBRSxlQUFjLEdBQUUsZ0JBQWUsR0FBRSxjQUFhLEdBQUUsVUFBUyxNQUFLLFVBQVMsTUFBSyxlQUFjLE1BQUssYUFBWSxLQUFJO0FBQUUsSUFBRSxXQUFTLEVBQUMsVUFBUyxHQUFFLFVBQVMsRUFBQztBQUFFLFNBQU8sRUFBRSxXQUFTO0FBQUM7QUFBRSxxQkFBQSxnQkFBc0JEO3FDQUF3QixTQUFTLEdBQUU7QUFBQyxNQUFJLElBQUVBLElBQUUsS0FBSyxNQUFLLENBQUM7QUFBRSxJQUFFLE9BQUs7QUFBRSxTQUFPO0FBQUM7QUFBRSxxQkFBQSxZQUFrQixXQUFVO0FBQUMsU0FBTSxFQUFDLFNBQVEsS0FBSTtBQUFDO0FBQzlkLHFCQUFBLGFBQW1CLFNBQVMsR0FBRTtBQUFDLFNBQU0sRUFBQyxVQUFTWixLQUFFLFFBQU8sRUFBQztBQUFDO0FBQUUscUJBQUEsaUJBQXVCaUI7QUFBRSxxQkFBQSxPQUFhLFNBQVMsR0FBRTtBQUFDLFNBQU0sRUFBQyxVQUFTLEdBQUUsVUFBUyxFQUFDLFNBQVEsSUFBRyxTQUFRLEVBQUMsR0FBRSxPQUFNTSxJQUFDO0FBQUM7QUFBRSxxQkFBQSxPQUFhLFNBQVMsR0FBRSxHQUFFO0FBQUMsU0FBTSxFQUFDLFVBQVMsR0FBRSxNQUFLLEdBQUUsU0FBUSxXQUFTLElBQUUsT0FBSyxFQUFDO0FBQUM7QUFBRSxxQkFBQSxrQkFBd0IsU0FBUyxHQUFFO0FBQUMsTUFBSSxJQUFFRyxJQUFFO0FBQVdBLE1BQUUsYUFBVztBQUFHLE1BQUc7QUFBQztFQUFHLFVBQUM7QUFBUUEsUUFBRSxhQUFXO0FBQUEsRUFBQztBQUFDO0FBQUUscUJBQUEsZUFBcUJFO21DQUFzQixTQUFTLEdBQUUsR0FBRTtBQUFDLFNBQU9ILElBQUUsUUFBUSxZQUFZLEdBQUUsQ0FBQztBQUFDO0FBQUUscUJBQUEsYUFBbUIsU0FBUyxHQUFFO0FBQUMsU0FBT0EsSUFBRSxRQUFRLFdBQVcsQ0FBQztBQUFDO0FBQzNmLHFCQUFBLGdCQUFzQixXQUFVO0FBQUE7QUFBRyxxQkFBQSxtQkFBeUIsU0FBUyxHQUFFO0FBQUMsU0FBT0EsSUFBRSxRQUFRLGlCQUFpQixDQUFDO0FBQUM7QUFBRSxxQkFBQSxZQUFrQixTQUFTLEdBQUUsR0FBRTtBQUFDLFNBQU9BLElBQUUsUUFBUSxVQUFVLEdBQUUsQ0FBQztBQUFDO0FBQUUscUJBQUEsUUFBYyxXQUFVO0FBQUMsU0FBT0EsSUFBRSxRQUFRLE1BQUs7QUFBRTtBQUFFLHFCQUFBLHNCQUE0QixTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsU0FBT0EsSUFBRSxRQUFRLG9CQUFvQixHQUFFLEdBQUUsQ0FBQztBQUFDO0FBQUUscUJBQUEscUJBQTJCLFNBQVMsR0FBRSxHQUFFO0FBQUMsU0FBT0EsSUFBRSxRQUFRLG1CQUFtQixHQUFFLENBQUM7QUFBQztBQUFFLHFCQUFBLGtCQUF3QixTQUFTLEdBQUUsR0FBRTtBQUFDLFNBQU9BLElBQUUsUUFBUSxnQkFBZ0IsR0FBRSxDQUFDO0FBQUM7QUFDemQscUJBQUEsVUFBZ0IsU0FBUyxHQUFFLEdBQUU7QUFBQyxTQUFPQSxJQUFFLFFBQVEsUUFBUSxHQUFFLENBQUM7QUFBQztBQUFFLHFCQUFBLGFBQW1CLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxTQUFPQSxJQUFFLFFBQVEsV0FBVyxHQUFFLEdBQUUsQ0FBQztBQUFDO0FBQUUscUJBQUEsU0FBZSxTQUFTLEdBQUU7QUFBQyxTQUFPQSxJQUFFLFFBQVEsT0FBTyxDQUFDO0FBQUM7QUFBRSxxQkFBQSxXQUFpQixTQUFTLEdBQUU7QUFBQyxTQUFPQSxJQUFFLFFBQVEsU0FBUyxDQUFDO0FBQUM7QUFBRSxxQkFBQSx1QkFBNkIsU0FBUyxHQUFFLEdBQUUsR0FBRTtBQUFDLFNBQU9BLElBQUUsUUFBUSxxQkFBcUIsR0FBRSxHQUFFLENBQUM7QUFBQztBQUFFLHFCQUFBLGdCQUFzQixXQUFVO0FBQUMsU0FBT0EsSUFBRSxRQUFRLGNBQWE7QUFBRTtBQUFFLHFCQUFBLFVBQWdCO0FD
25114dkJ6WDtBQUN6Q0ksUUFBQSxVQUFpQkM7QUFDbkI7Ozs7Ozs7Ozs7OztBQ0thLElBQUksSUFBRUEsY0FBaUIsSUFBRSxPQUFPLElBQUksZUFBZSxHQUFFLElBQUUsT0FBTyxJQUFJLGdCQUFnQixHQUFFZixNQUFFLE9BQU8sVUFBVSxnQkFBZSxJQUFFLEVBQUUsbURBQW1ELG1CQUFrQmxCLE1BQUUsRUFBQyxLQUFJLE1BQUcsS0FBSSxNQUFHLFFBQU8sTUFBRyxVQUFTLEtBQUU7QUFDbFAsU0FBUyxFQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxHQUFFLElBQUUsSUFBRyxJQUFFLE1BQUssSUFBRTtBQUFLLGFBQVMsTUFBSSxJQUFFLEtBQUc7QUFBRyxhQUFTLEVBQUUsUUFBTSxJQUFFLEtBQUcsRUFBRTtBQUFLLGFBQVMsRUFBRSxRQUFNLElBQUUsRUFBRTtBQUFLLE9BQUksS0FBSyxFQUFFa0IsS0FBRSxLQUFLLEdBQUUsQ0FBQyxLQUFHLENBQUNsQixJQUFFLGVBQWUsQ0FBQyxNQUFJLEVBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQztBQUFHLE1BQUcsS0FBRyxFQUFFLGFBQWEsTUFBSSxLQUFLLElBQUUsRUFBRSxjQUFhLGNBQVcsRUFBRSxDQUFDLE1BQUksRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUcsU0FBTSxFQUFDLFVBQVMsR0FBRSxNQUFLLEdBQUUsS0FBSSxHQUFFLEtBQUksR0FBRSxPQUFNLEdBQUUsUUFBTyxFQUFFLFFBQU87QUFBQzswQ0FBa0I7QUFBRSwrQkFBQSxNQUFZO0FBQUUsK0JBQUEsT0FBYTtBQ1IvVDtBQUN6Q2tDLGFBQUEsVUFBaUJEO0FBQ25COzs7Ozs7Ozs7Ozs7Ozs7OztBQ0thLFdBQVNoQixHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxFQUFFO0FBQU8sTUFBRSxLQUFLLENBQUM7QUFBRSxNQUFFLFFBQUssSUFBRSxLQUFHO0FBQUMsVUFBSSxJQUFFLElBQUUsTUFBSSxHQUFFLElBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRyxJQUFFLEVBQUUsR0FBRSxDQUFDLEVBQUUsR0FBRSxDQUFDLElBQUUsR0FBRSxFQUFFLENBQUMsSUFBRSxHQUFFLElBQUU7QUFBQSxVQUFPLE9BQU07QUFBQSxJQUFDO0FBQUEsRUFBQztBQUFDLFdBQVMsRUFBRSxHQU
25114FFO0FBQUMsV0FBTyxNQUFJLEVBQUUsU0FBTyxPQUFLLEVBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxXQUFTRCxHQUFFLEdBQUU7QUFBQyxRQUFHLE1BQUksRUFBRSxPQUFPLFFBQU87QUFBSyxRQUFJLElBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxFQUFFO0FBQU0sUUFBRyxNQUFJLEdBQUU7QUFBQyxRQUFFLENBQUMsSUFBRTtBQUFFLFFBQUUsVUFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU9tQixLQUFFLE1BQUksR0FBRSxJQUFFQSxNQUFHO0FBQUMsWUFBSWpCLEtBQUUsS0FBRyxJQUFFLEtBQUcsR0FBRVgsS0FBRSxFQUFFVyxFQUFDLEdBQUVuQixLQUFFbUIsS0FBRSxHQUFFa0IsS0FBRSxFQUFFckMsRUFBQztBQUFFLFlBQUcsSUFBRSxFQUFFUSxJQUFFLENBQUMsRUFBRSxDQUFBUixLQUFFLEtBQUcsSUFBRSxFQUFFcUMsSUFBRTdCLEVBQUMsS0FBRyxFQUFFLENBQUMsSUFBRTZCLElBQUUsRUFBRXJDLEVBQUMsSUFBRSxHQUFFLElBQUVBLE9BQUksRUFBRSxDQUFDLElBQUVRLElBQUUsRUFBRVcsRUFBQyxJQUFFLEdBQUUsSUFBRUE7QUFBQSxpQkFBV25CLEtBQUUsS0FBRyxJQUFFLEVBQUVxQyxJQUFFLENBQUMsRUFBRSxHQUFFLENBQUMsSUFBRUEsSUFBRSxFQUFFckMsRUFBQyxJQUFFLEdBQUUsSUFBRUE7QUFBQSxZQUFPLE9BQU07QUFBQSxNQUFDO0FBQUEsSUFBQztBQUFDLFdBQU87QUFBQSxFQUFDO0FBQzNjLFdBQVMsRUFBRSxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBRSxZQUFVLEVBQUU7QUFBVSxXQUFPLE1BQUksSUFBRSxJQUFFLEVBQUUsS0FBRyxFQUFFO0FBQUEsRUFBRTtBQUFDLE1BQUcsYUFBVyxPQUFPLGVBQWEsZUFBYSxPQUFPLFlBQVksS0FBSTtBQUFDLFFBQUlELEtBQUU7QUFBWSxZQUFBLGVBQXFCLFdBQVU7QUFBQyxhQUFPQSxHQUFFLElBQUc7QUFBQSxJQUFFO0FBQUEsRUFBQyxPQUFLO0FBQUMsUUFBSUUsS0FBRSxNQUFLQyxLQUFFRCxHQUFFLElBQUc7QUFBRyxZQUFBLGVBQXFCLFdBQVU7QUFBQyxhQUFPQSxHQUFFLElBQUcsSUFBR0M7QUFBQSxJQUFDO0FBQUEsRUFBQztBQUFDLE1BQUlDLEtBQUUsQ0FBQSxHQUFHbUMsS0FBRSxDQUFBLEdBQUdDLEtBQUUsR0FBRW5DLEtBQUUsTUFBS29DLEtBQUUsR0FBRW5DLEtBQUUsT0FBR0MsS0FBRSxPQUFHQyxLQUFFLE9BQUdFLEtBQUUsZUFBYSxPQUFPLGFBQVcsYUFBVyxNQUFLQyxLQUFFLGVBQWEsT0FBTyxlQUFhLGVBQWEsTUFBSytCLEtBQUUsZ0JBQWMsT0FBTyxlQUFhLGVBQWE7QUFDL2Qsa0JBQWMsT0FBTyxhQUFXLFdBQVMsVUFBVSxjQUFZLFdBQVMsVUFBVSxXQUFXLGtCQUFnQixVQUFVLFdBQVcsZUFBZSxLQUFLLFVBQVUsVUFBVTtBQUFFLFdBQVM5QixHQUFFLEdBQUU7QUFBQyxhQUFRLElBQUUsRUFBRTJCLEVBQUMsR0FBRSxTQUFPLEtBQUc7QUFBQyxVQUFHLFNBQU8sRUFBRSxTQUFTLENBQUFyQixHQUFFcUIsRUFBQztBQUFBLGVBQVUsRUFBRSxhQUFXLEVBQUUsQ0FBQXJCLEdBQUVxQixFQUFDLEdBQUUsRUFBRSxZQUFVLEVBQUUsZ0JBQWVwQixHQUFFZixJQUFFLENBQUM7QUFBQSxVQUFPO0FBQU0sVUFBRSxFQUFFbUMsRUFBQztBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUMsV0FBUzFCLEdBQUUsR0FBRTtBQUFDLElBQUFMLEtBQUU7QUFBRyxJQUFBSSxHQUFFLENBQUM7QUFBRSxRQUFHLENBQUNMLEdBQUUsS0FBRyxTQUFPLEVBQUVILEVBQUMsRUFBRSxDQUFBRyxLQUFFLE1BQUdPLEdBQUU2QixFQUFDO0FBQUEsU0FBTTtBQUFDLFVBQUksSUFBRSxFQUFFSixFQUFDO0FBQUUsZUFBTyxLQUFHeEIsR0FBRUYsSUFBRSxFQUFFLFlBQVUsQ0FBQztBQUFBLElBQUM7QUFBQSxFQUFDO0FBQ3JhLFdBQVM4QixHQUFFLEdBQUUsR0FBRTtBQUFDLElBQUFwQyxLQUFFO0FBQUcsSUFBQUMsT0FBSUEsS0FBRSxPQUFHRyxHQUFFSyxFQUFDLEdBQUVBLEtBQUU7QUFBSSxJQUFBVixLQUFFO0FBQUcsUUFBSSxJQUFFbUM7QUFBRSxRQUFHO0FBQUMsTUFBQTdCLEdBQUUsQ0FBQztBQUFFLFdBQUlQLEtBQUUsRUFBRUQsRUFBQyxHQUFFLFNBQU9DLE9BQUksRUFBRUEsR0FBRSxpQkFBZSxNQUFJLEtBQUcsQ0FBQ1ksR0FBQyxNQUFLO0FBQUMsWUFBSSxJQUFFWixHQUFFO0FBQVMsWUFBRyxlQUFhLE9BQU8sR0FBRTtBQUFDLFVBQUFBLEdBQUUsV0FBUztBQUFLLFVBQUFvQyxLQUFFcEMsR0FBRTtBQUFjLGNBQUksSUFBRSxFQUFFQSxHQUFFLGtCQUFnQixDQUFDO0FBQUUsY0FBRSxRQUFRLGFBQVk7QUFBRyx5QkFBYSxPQUFPLElBQUVBLEdBQUUsV0FBUyxJQUFFQSxPQUFJLEVBQUVELEVBQUMsS0FBR2MsR0FBRWQsRUFBQztBQUFFLFVBQUFRLEdBQUUsQ0FBQztBQUFBLFFBQUMsTUFBTSxDQUFBTSxHQUFFZCxFQUFDO0FBQUUsUUFBQUMsS0FBRSxFQUFFRCxFQUFDO0FBQUEsTUFBQztBQUFDLFVBQUcsU0FBT0MsR0FBRSxLQUFJZ0MsS0FBRTtBQUFBLFdBQU87QUFBQyxZQUFJakIsS0FBRSxFQUFFbUIsRUFBQztBQUFFLGlCQUFPbkIsTUFBR0wsR0FBRUYsSUFBRU8sR0FBRSxZQUFVLENBQUM7QUFBRSxRQUFBaUIsS0FBRTtBQUFBLE1BQUU7QUFBQyxhQUFPQTtBQUFBLElBQUMsVUFBQztBQUFRLE1BQUFoQyxLQUFFLE1BQUtvQyxLQUFFLEdBQUVuQyxLQUFFO0FBQUEsSUFBRTtBQUFBLEVBQUM7QUFBQyxNQUFJZSxLQUFFLE9BQUdDLEtBQUUsTUFBS04sS0FBRSxJQUFHUSxLQUFFLEdBQUVDLEtBQUU7QUFDdGMsV0
25114FBU1IsS0FBRztBQUFDLFdBQU8sUUFBUSxhQUFZLElBQUdRLEtBQUVELEtBQUUsUUFBRztBQUFBLEVBQUU7QUFBQyxXQUFTRSxLQUFHO0FBQUMsUUFBRyxTQUFPSixJQUFFO0FBQUMsVUFBSSxJQUFFLFFBQVE7QUFBZSxNQUFBRyxLQUFFO0FBQUUsVUFBSSxJQUFFO0FBQUcsVUFBRztBQUFDLFlBQUVILEdBQUUsTUFBRyxDQUFDO0FBQUEsTUFBQyxVQUFDO0FBQVEsWUFBRUssUUFBS04sS0FBRSxPQUFHQyxLQUFFO0FBQUEsTUFBSztBQUFBLElBQUMsTUFBTSxDQUFBRCxLQUFFO0FBQUEsRUFBRTtBQUFDLE1BQUlNO0FBQUUsTUFBRyxlQUFhLE9BQU9lLEdBQUUsQ0FBQWYsS0FBRSxXQUFVO0FBQUMsSUFBQWUsR0FBRWhCLEVBQUM7QUFBQSxFQUFDO0FBQUEsV0FBVSxnQkFBYyxPQUFPLGdCQUFlO0FBQUMsUUFBSUUsS0FBRSxJQUFJLGtCQUFlRSxLQUFFRixHQUFFO0FBQU0sSUFBQUEsR0FBRSxNQUFNLFlBQVVGO0FBQUUsSUFBQUMsS0FBRSxXQUFVO0FBQUMsTUFBQUcsR0FBRSxZQUFZLElBQUk7QUFBQSxJQUFDO0FBQUEsRUFBQyxNQUFNLENBQUFILEtBQUUsV0FBVTtBQUFDLElBQUFqQixHQUFFZ0IsSUFBRSxDQUFDO0FBQUEsRUFBQztBQUFFLFdBQVNaLEdBQUUsR0FBRTtBQUFDLElBQUFRLEtBQUU7QUFBRSxJQUFBRCxPQUFJQSxLQUFFLE1BQUdNLEdBQUM7QUFBQSxFQUFHO0FBQUMsV0FBU1osR0FBRSxHQUFFLEdBQUU7QUFBQyxJQUFBQyxLQUFFTixHQUFFLFdBQVU7QUFBQyxRQUFFLFFBQVEsY0FBYztBQUFBLElBQUMsR0FBRSxDQUFDO0FBQUEsRUFBQztBQUM1ZCxVQUFBLHdCQUE4QjtBQUFFLFVBQUEsNkJBQW1DO0FBQUUsVUFBQSx1QkFBNkI7QUFBRSxVQUFBLDBCQUFnQztBQUFFLFVBQUEscUJBQTJCO0FBQUssVUFBQSxnQ0FBc0M7QUFBRSxVQUFBLDBCQUFnQyxTQUFTLEdBQUU7QUFBQyxNQUFFLFdBQVM7QUFBQSxFQUFJO0FBQUUsdUNBQW1DLFdBQVU7QUFBQyxJQUFBSCxNQUFHRCxPQUFJQyxLQUFFLE1BQUdPLEdBQUU2QixFQUFDO0FBQUEsRUFBRTtBQUMxVSxVQUFBLDBCQUFnQyxTQUFTLEdBQUU7QUFBQyxRQUFFLEtBQUcsTUFBSSxJQUFFLFFBQVEsTUFBTSxpSEFBaUgsSUFBRW5CLEtBQUUsSUFBRSxJQUFFLEtBQUssTUFBTSxNQUFJLENBQUMsSUFBRTtBQUFBLEVBQUM7QUFBRSxVQUFBLG1DQUF5QyxXQUFVO0FBQUMsV0FBT2lCO0FBQUEsRUFBQztBQUFFLFVBQUEsZ0NBQXNDLFdBQVU7QUFBQyxXQUFPLEVBQUVyQyxFQUFDO0FBQUEsRUFBQztBQUFFLDBCQUFzQixTQUFTLEdBQUU7QUFBQyxZQUFPcUMsSUFBQztBQUFBLE1BQUUsS0FBSztBQUFBLE1BQUUsS0FBSztBQUFBLE1BQUUsS0FBSztBQUFFLFlBQUksSUFBRTtBQUFFO0FBQUEsTUFBTTtBQUFRLFlBQUVBO0FBQUEsSUFBQztBQUFDLFFBQUksSUFBRUE7QUFBRSxJQUFBQSxLQUFFO0FBQUUsUUFBRztBQUFDLGFBQU8sRUFBQztBQUFBLElBQUUsVUFBQztBQUFRLE1BQUFBLEtBQUU7QUFBQSxJQUFDO0FBQUEsRUFBQztBQUFFLFVBQUEsMEJBQWdDLFdBQVU7QUFBQSxFQUFBO0FBQzdmLFVBQUEsd0JBQThCLFdBQVU7QUFBQSxFQUFBO0FBQUcsVUFBQSwyQkFBaUMsU0FBUyxHQUFFLEdBQUU7QUFBQyxZQUFPLEdBQUM7QUFBQSxNQUFFLEtBQUs7QUFBQSxNQUFFLEtBQUs7QUFBQSxNQUFFLEtBQUs7QUFBQSxNQUFFLEtBQUs7QUFBQSxNQUFFLEtBQUs7QUFBRTtBQUFBLE1BQU07QUFBUSxZQUFFO0FBQUEsSUFBQztBQUFDLFFBQUksSUFBRUE7QUFBRSxJQUFBQSxLQUFFO0FBQUUsUUFBRztBQUFDLGFBQU8sRUFBQztBQUFBLElBQUUsVUFBQztBQUFRLE1BQUFBLEtBQUU7QUFBQSxJQUFDO0FBQUEsRUFBQztBQUNoTSxVQUFBLDRCQUFrQyxTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLFFBQVE7QUFBZSxpQkFBVyxPQUFPLEtBQUcsU0FBTyxLQUFHLElBQUUsRUFBRSxPQUFNLElBQUUsYUFBVyxPQUFPLEtBQUcsSUFBRSxJQUFFLElBQUUsSUFBRSxLQUFHLElBQUU7QUFBRSxZQUFPLEdBQUM7QUFBQSxNQUFFLEtBQUs7QUFBRSxZQUFJLElBQUU7QUFBRztBQUFBLE1BQU0sS0FBSztBQUFFLFlBQUU7QUFBSTtBQUFBLE1BQU0sS0FBSztBQUFFLFlBQUU7QUFBVztBQUFBLE1BQU0sS0FBSztBQUFFLFlBQUU7QUFBSTtBQUFBLE1BQU07QUFBUSxZQUFFO0FBQUEsSUFBRztBQUFDLFFBQUUsSUFBRTtBQUFFLFFBQUUsRUFBQyxJQUFHRCxNQUFJLFVBQVMsR0FBRSxlQUFjLEdBQUUsV0FBVSxHQUFFLGdCQUFlLEdBQUUsV0FBVSxHQUFFO0FBQUUsUUFBRSxLQUFHLEVBQUUsWUFBVSxHQUFFckIsR0FBRW9CLElBQUUsQ0FBQyxHQUFFLFNBQU8sRUFBRW5DLEVBQUMsS0FBRyxNQUFJLEVBQUVtQyxFQUFDLE1BQUkvQixNQUFHRyxHQUFFSyxFQUFDLEdBQUVBLEtBQUUsTUFBSVIsS0FBRSxNQUFHTyxHQUFFRixJQUFFLElBQUUsQ0FBQyxPQUFLLEVBQUUsWUFBVSxHQUFFTSxHQUFFZixJQUFFLENBQUMsR0FBRUcsTUFBR0QsT0FBSUMsS0FBRSxNQUFHTyxHQUFFNkIsRUFBQztBQUFJLFdBQU87QUFBQSxFQUFDO0FBQ25lLFVBQUEsdUJBQTZCMUI7QUFBRSxVQUFBLHdCQUE4QixTQUFTLEdBQUU7QUFBQyxRQUFJLElBQUV3QjtBQUFFLFdBQU8sV0FBVTtBQUFDLFVBQUksSUFBRUE7QUFBRSxNQUFBQSxLQUFFO0FBQUUsVUFBRztBQUFDLGVBQU8sRUFBRSxNQUFNLE1BQUssU0FBUztBQUFBLE1BQUMsVUFBQztBQUFRLFFBQUFBLEtBQUU7QUFBQSxNQUFDO0FBQUEsSUFBQztBQUFBLEVBQUM7O0FDaEJwSDtBQUN6Q0csWUFBQSxVQUFpQlQ7QUFDbkI7Ozs7Ozs7Ozs7O0FDUWEsSUFBSSxLQUFHQSxjQUFpQixLQUFHVTtBQUFxQixTQUFTLEVBQUUsR0FBRTtBQUFDLFdBQVEsSUFBRSwyREFBeUQsR0FBRSxJQUFFLEdBQUUsSUFBRSxVQUFVLFFBQU8sSUFBSSxNQUFHLGFBQVcsbUJBQW1CLFVBQVUsQ0FBQyxDQUFDO0FBQUUsU0FBTSwyQkFBeUIsSUFBRSxhQUFXLElBQUU7QUFBZ0g7QUFBQyxJQUFJLEtBQUcsb0JBQUksT0FBSSxLQUFHLENBQUE7QUFBRyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsS0FBRyxHQUFFLENBQUM7QUFBRSxLQUFHLElBQUUsV0FBVSxDQUFDO0FBQUM7QUFDeGIsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLEtBQUcsQ0FBQyxJQUFFO0FBQUUsT0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxJQUFHLElBQUksRUFBRSxDQUFDLENBQUM7QUFBQztBQUM1RCxJQUFJLEtBQUcsRUFBRSxnQkFBYyxPQUFPLFVBQVEsZ0JBQWMsT0FBTyxPQUFPLFlBQVUsZ0JBQWMsT0FBTyxPQUFPLFNBQVMsZ0JBQWUsS0FBRyxPQUFPLFVBQVUsZ0JBQWUsS0FBRywrVkFBOFYsS0FDcGdCLENBQUEsR0FBRyxLQUFHLENBQUE7QUFBRyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUcsR0FBRyxLQUFLLElBQUcsQ0FBQyxFQUFFLFFBQU07QUFBRyxNQUFHLEdBQUcsS0FBSyxJQUFHLENBQUMsRUFBRSxRQUFNO0FBQUcsTUFBRyxHQU
25114FHLEtBQUssQ0FBQyxFQUFFLFFBQU8sR0FBRyxDQUFDLElBQUU7QUFBRyxLQUFHLENBQUMsSUFBRTtBQUFHO0FBQVE7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUcsU0FBTyxLQUFHLE1BQUksRUFBRSxLQUFLLFFBQU07QUFBRyxVQUFPLE9BQU8sR0FBQztBQUFBLElBQUUsS0FBSztBQUFBLElBQVcsS0FBSztBQUFTLGFBQU07QUFBQSxJQUFHLEtBQUs7QUFBVSxVQUFHLEVBQUU7QUFBUyxVQUFHLFNBQU8sRUFBRSxRQUFNLENBQUMsRUFBRTtBQUFnQixVQUFFLEVBQUUsWUFBVyxFQUFHLE1BQU0sR0FBRSxDQUFDO0FBQUUsYUFBTSxZQUFVLEtBQUcsWUFBVTtBQUFBLElBQUU7QUFBUTtFQUFRO0FBQUM7QUFDelgsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLFNBQU8sS0FBRyxnQkFBYyxPQUFPLEtBQUcsR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEVBQUUsUUFBTTtBQUFHLE1BQUcsRUFBRSxRQUFNO0FBQUcsTUFBRyxTQUFPLEVBQUUsU0FBTyxFQUFFLE1BQUk7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFNLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFNLFVBQUs7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPLE1BQU0sQ0FBQztBQUFBLElBQUUsS0FBSztBQUFFLGFBQU8sTUFBTSxDQUFDLEtBQUcsSUFBRTtBQUFBLEVBQUM7QUFBQyxTQUFNO0FBQUU7QUFBQyxTQUFTLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFMUIsSUFBRSxHQUFFO0FBQUMsT0FBSyxrQkFBZ0IsTUFBSSxLQUFHLE1BQUksS0FBRyxNQUFJO0FBQUUsT0FBSyxnQkFBYztBQUFFLE9BQUsscUJBQW1CO0FBQUUsT0FBSyxrQkFBZ0I7QUFBRSxPQUFLLGVBQWE7QUFBRSxPQUFLLE9BQUs7QUFBRSxPQUFLLGNBQVlBO0FBQUUsT0FBSyxvQkFBa0I7QUFBQztBQUFDLElBQUksSUFBRSxDQUFBO0FBQ25iLHVJQUF1SSxNQUFNLEdBQUcsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxHQUFFLE1BQUssT0FBRyxLQUFFO0FBQUMsQ0FBQztBQUFFLENBQUMsQ0FBQyxpQkFBZ0IsZ0JBQWdCLEdBQUUsQ0FBQyxhQUFZLE9BQU8sR0FBRSxDQUFDLFdBQVUsS0FBSyxHQUFFLENBQUMsYUFBWSxZQUFZLENBQUMsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFLENBQUM7QUFBRSxJQUFFLENBQUMsSUFBRSxJQUFJLEVBQUUsR0FBRSxHQUFFLE9BQUcsRUFBRSxDQUFDLEdBQUUsTUFBSyxPQUFHLEtBQUU7QUFBQyxDQUFDO0FBQUUsQ0FBQyxtQkFBa0IsYUFBWSxjQUFhLE9BQU8sRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxFQUFFLFlBQVcsR0FBRyxNQUFLLE9BQUcsS0FBRTtBQUFDLENBQUM7QUFDM2UsQ0FBQyxlQUFjLDZCQUE0QixhQUFZLGVBQWUsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxHQUFFLE1BQUssT0FBRyxLQUFFO0FBQUMsQ0FBQztBQUFFLDhPQUE4TyxNQUFNLEdBQUcsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxFQUFFLFlBQVcsR0FBRyxNQUFLLE9BQUcsS0FBRTtBQUFDLENBQUM7QUFDemIsQ0FBQyxXQUFVLFlBQVcsU0FBUSxVQUFVLEVBQUUsUUFBUSxTQUFTLEdBQUU7QUFBQyxJQUFFLENBQUMsSUFBRSxJQUFJLEVBQUUsR0FBRSxHQUFFLE1BQUcsR0FBRSxNQUFLLE9BQUcsS0FBRTtBQUFDLENBQUM7QUFBRSxDQUFDLFdBQVUsVUFBVSxFQUFFLFFBQVEsU0FBUyxHQUFFO0FBQUMsSUFBRSxDQUFDLElBQUUsSUFBSSxFQUFFLEdBQUUsR0FBRSxPQUFHLEdBQUUsTUFBSyxPQUFHLEtBQUU7QUFBQyxDQUFDO0FBQUUsQ0FBQyxRQUFPLFFBQU8sUUFBTyxNQUFNLEVBQUUsUUFBUSxTQUFTLEdBQUU7QUFBQyxJQUFFLENBQUMsSUFBRSxJQUFJLEVBQUUsR0FBRSxHQUFFLE9BQUcsR0FBRSxNQUFLLE9BQUcsS0FBRTtBQUFDLENBQUM7QUFBRSxDQUFDLFdBQVUsT0FBTyxFQUFFLFFBQVEsU0FBUyxHQUFFO0FBQUMsSUFBRSxDQUFDLElBQUUsSUFBSSxFQUFFLEdBQUUsR0FBRSxPQUFHLEVBQUUsWUFBVyxHQUFHLE1BQUssT0FBRyxLQUFFO0FBQUMsQ0FBQztBQUFFLElBQUksS0FBRztBQUFnQixTQUFTLEdBQUcsR0FBRTtBQUFDLFNBQU8sRUFBRSxDQUFDLEVBQUUsWUFBVztBQUFFO0FBQ3haLDBqQ0FBMGpDLE1BQU0sR0FBRyxFQUFFLFFBQVEsU0FBUyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBQSxJQUFRO0FBQUEsSUFDem1DO0FBQUEsRUFBRTtBQUFFLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxHQUFFLE1BQUssT0FBRyxLQUFFO0FBQUMsQ0FBQztBQUFFLDJFQUEyRSxNQUFNLEdBQUcsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFLFFBQVEsSUFBRyxFQUFFO0FBQUUsSUFBRSxDQUFDLElBQUUsSUFBSSxFQUFFLEdBQUUsR0FBRSxPQUFHLEdBQUUsZ0NBQStCLE9BQUcsS0FBRTtBQUFDLENBQUM7QUFBRSxDQUFDLFlBQVcsWUFBVyxXQUFXLEVBQUUsUUFBUSxTQUFTLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRSxRQUFRLElBQUcsRUFBRTtBQUFFLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxHQUFFLHdDQUF1QyxPQUFHLEtBQUU7QUFBQyxDQUFDO0FBQUUsQ0FBQyxZQUFXLGFBQWEsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxFQUFFLFlBQVcsR0FBRyxNQUFLLE9BQUcsS0FBRTtBQUFDLENBQUM7QUFDbmQsRUFBRSxZQUFVLElBQUksRUFBRSxhQUFZLEdBQUUsT0FBRyxjQUFhLGdDQUErQixNQUFHLEtBQUU7QUFBRSxDQUFDLE9BQU0sUUFBTyxVQUFTLFlBQVksRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLElBQUUsQ0FBQyxJQUFFLElBQUksRUFBRSxHQUFFLEdBQUUsT0FBRyxFQUFFLFlBQVcsR0FBRyxNQUFLLE1BQUcsSUFBRTtBQUFDLENBQUM7QUFDN0wsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRSxlQUFlLENBQUMsSUFBRSxFQUFFLENBQUMsSUFBRTtBQUFLLE1BQUcsU0FBTyxJQUFFLE1BQUksRUFBRSxPQUFLLEtBQUcsRUFBRSxJQUFFLEVBQUUsV0FBUyxRQUFNLEVBQUUsQ0FBQyxLQUFHLFFBQU0sRUFBRSxDQUFDLEtBQUcsUUFBTSxFQUFFLENBQUMsS0FBRyxRQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUcsR0FBRSxHQU
25114FFLEdBQUUsQ0FBQyxNQUFJLElBQUUsT0FBTSxLQUFHLFNBQU8sSUFBRSxHQUFHLENBQUMsTUFBSSxTQUFPLElBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFFLEVBQUUsYUFBYSxHQUFFLEtBQUcsQ0FBQyxLQUFHLEVBQUUsa0JBQWdCLEVBQUUsRUFBRSxZQUFZLElBQUUsU0FBTyxJQUFFLE1BQUksRUFBRSxPQUFLLFFBQUcsS0FBRyxLQUFHLElBQUUsRUFBRSxlQUFjLElBQUUsRUFBRSxvQkFBbUIsU0FBTyxJQUFFLEVBQUUsZ0JBQWdCLENBQUMsS0FBRyxJQUFFLEVBQUUsTUFBSyxJQUFFLE1BQUksS0FBRyxNQUFJLEtBQUcsU0FBSyxJQUFFLEtBQUcsS0FBRyxHQUFFLElBQUUsRUFBRSxlQUFlLEdBQUUsR0FBRSxDQUFDLElBQUUsRUFBRSxhQUFhLEdBQUUsQ0FBQztBQUFHO0FBQ2pkLElBQUksS0FBRyxHQUFHLG9EQUFtRCxLQUFHLE9BQU8sSUFBSSxlQUFlLEdBQUUsS0FBRyxPQUFPLElBQUksY0FBYyxHQUFFLEtBQUcsT0FBTyxJQUFJLGdCQUFnQixHQUFFLEtBQUcsT0FBTyxJQUFJLG1CQUFtQixHQUFFLEtBQUcsT0FBTyxJQUFJLGdCQUFnQixHQUFFLEtBQUcsT0FBTyxJQUFJLGdCQUFnQixHQUFFLEtBQUcsT0FBTyxJQUFJLGVBQWUsR0FBRSxLQUFHLE9BQU8sSUFBSSxtQkFBbUIsR0FBRSxLQUFHLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRSxLQUFHLE9BQU8sSUFBSSxxQkFBcUIsR0FBRSxLQUFHLE9BQU8sSUFBSSxZQUFZLEdBQUUsS0FBRyxPQUFPLElBQUksWUFBWTtBQUMxYixJQUFJLEtBQUcsT0FBTyxJQUFJLGlCQUFpQjtBQUFpRyxJQUFJLEtBQUcsT0FBTztBQUFTLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRyxTQUFPLEtBQUcsYUFBVyxPQUFPLEVBQUUsUUFBTztBQUFLLE1BQUUsTUFBSSxFQUFFLEVBQUUsS0FBRyxFQUFFLFlBQVk7QUFBRSxTQUFNLGVBQWEsT0FBTyxJQUFFLElBQUU7QUFBSTtBQUFDLElBQUksSUFBRSxPQUFPLFFBQU87QUFBRyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUcsV0FBUyxHQUFHLEtBQUc7QUFBQyxVQUFNLE1BQUs7QUFBQSxFQUFHLFNBQU8sR0FBRTtBQUFDLFFBQUksSUFBRSxFQUFFLE1BQU0sS0FBSSxFQUFHLE1BQU0sY0FBYztBQUFFLFNBQUcsS0FBRyxFQUFFLENBQUMsS0FBRztBQUFBLEVBQUU7QUFBQyxTQUFNLE9BQUssS0FBRztBQUFDO0FBQUMsSUFBSSxLQUFHO0FBQ3piLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFHLENBQUMsS0FBRyxHQUFHLFFBQU07QUFBRyxPQUFHO0FBQUcsTUFBSSxJQUFFLE1BQU07QUFBa0IsUUFBTSxvQkFBa0I7QUFBTyxNQUFHO0FBQUMsUUFBRyxFQUFFLEtBQUcsSUFBRSxXQUFVO0FBQUMsWUFBTSxNQUFLO0FBQUEsSUFBRyxHQUFFLE9BQU8sZUFBZSxFQUFFLFdBQVUsU0FBUSxFQUFDLEtBQUksV0FBVTtBQUFDLFlBQU0sTUFBSztBQUFBLElBQUcsRUFBQyxDQUFDLEdBQUUsYUFBVyxPQUFPLFdBQVMsUUFBUSxXQUFVO0FBQUMsVUFBRztBQUFDLGdCQUFRLFVBQVUsR0FBRSxDQUFBLENBQUU7QUFBQSxNQUFDLFNBQU9uQixJQUFFO0FBQUMsWUFBSSxJQUFFQTtBQUFBLE1BQUM7QUFBQyxjQUFRLFVBQVUsR0FBRSxDQUFBLEdBQUcsQ0FBQztBQUFBLElBQUMsT0FBSztBQUFDLFVBQUc7QUFBQyxVQUFFLEtBQUk7QUFBQSxNQUFFLFNBQU9BLElBQUU7QUFBQyxZQUFFQTtBQUFBLE1BQUM7QUFBQyxRQUFFLEtBQUssRUFBRSxTQUFTO0FBQUEsSUFBQztBQUFBLFNBQUs7QUFBQyxVQUFHO0FBQUMsY0FBTTtNQUFRLFNBQU9BLElBQUU7QUFBQyxZQUFFQTtBQUFBLE1BQUM7QUFBQztJQUFHO0FBQUEsRUFBQyxTQUFPQSxJQUFFO0FBQUMsUUFBR0EsTUFBRyxLQUFHLGFBQVcsT0FBT0EsR0FBRSxPQUFNO0FBQUMsZUFBUSxJQUFFQSxHQUFFLE1BQU0sTUFBTSxJQUFJLEdBQ3ZmbUIsS0FBRSxFQUFFLE1BQU0sTUFBTSxJQUFJLEdBQUUsSUFBRSxFQUFFLFNBQU8sR0FBRSxJQUFFQSxHQUFFLFNBQU8sR0FBRSxLQUFHLEtBQUcsS0FBRyxLQUFHLEVBQUUsQ0FBQyxNQUFJQSxHQUFFLENBQUMsSUFBRztBQUFJLGFBQUssS0FBRyxLQUFHLEtBQUcsR0FBRSxLQUFJLElBQUksS0FBRyxFQUFFLENBQUMsTUFBSUEsR0FBRSxDQUFDLEdBQUU7QUFBQyxZQUFHLE1BQUksS0FBRyxNQUFJLEdBQUU7QUFBQztBQUFHLGdCQUFHLEtBQUksS0FBSSxJQUFFLEtBQUcsRUFBRSxDQUFDLE1BQUlBLEdBQUUsQ0FBQyxHQUFFO0FBQUMsa0JBQUlELEtBQUUsT0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLFlBQVcsTUFBTTtBQUFFLGdCQUFFLGVBQWFBLEdBQUUsU0FBUyxhQUFhLE1BQUlBLEtBQUVBLEdBQUUsUUFBUSxlQUFjLEVBQUUsV0FBVztBQUFHLHFCQUFPQTtBQUFBLFlBQUM7QUFBQSxpQkFBTyxLQUFHLEtBQUcsS0FBRztBQUFBLFFBQUU7QUFBQztBQUFBLE1BQUs7QUFBQSxJQUFDO0FBQUEsRUFBQyxVQUFDO0FBQVEsU0FBRyxPQUFHLE1BQU0sb0JBQWtCO0FBQUEsRUFBQztBQUFDLFVBQU8sSUFBRSxJQUFFLEVBQUUsZUFBYSxFQUFFLE9BQUssTUFBSSxHQUFHLENBQUMsSUFBRTtBQUFFO0FBQzlaLFNBQVMsR0FBRyxHQUFFO0FBQUMsVUFBTyxFQUFFLEtBQUc7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPLEdBQUcsRUFBRSxJQUFJO0FBQUEsSUFBRSxLQUFLO0FBQUcsYUFBTyxHQUFHLE1BQU07QUFBQSxJQUFFLEtBQUs7QUFBRyxhQUFPLEdBQUcsVUFBVTtBQUFBLElBQUUsS0FBSztBQUFHLGFBQU8sR0FBRyxjQUFjO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBRSxLQUFLO0FBQUcsYUFBTyxJQUFFLEdBQUcsRUFBRSxNQUFLLEtBQUUsR0FBRTtBQUFBLElBQUUsS0FBSztBQUFHLGFBQU8sSUFBRSxHQUFHLEVBQUUsS0FBSyxRQUFPLEtBQUUsR0FBRTtBQUFBLElBQUUsS0FBSztBQUFFLGFBQU8sSUFBRSxHQUFHLEVBQUUsTUFBSyxJQUFFLEdBQUU7QUFBQSxJQUFFO0FBQVEsYUFBTTtBQUFBLEVBQUU7QUFBQztBQUN4UixTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUcsUUFBTSxFQUFFLFFBQU87QUFBSyxNQUFHLGVBQWEsT0FBTyxFQUFFLFFBQU8sRUFBRSxlQUFhLEVBQUUsUUFBTTtBQUFLLE1BQUcsYUFBVyxPQUFPLEVBQUUsUUFBTztBQUFFLFVBQU8sR0FBQztBQUFBLElBQUUsS0FBSztBQUFHLGFBQU07QUFBQSxJQUFXLEtBQUs7QUFBRyxhQUFNO0FBQUEsSUFBUyxLQUFLO0FBQUcsYUFBTTtBQUFBLElBQVcsS0FBSztBQUFHLGFBQU07QUFBQSxJQUFhLEtBQUs7QUFBRyxhQUFNO0FBQUEsSUFBVyxLQUFLO0FBQUcsYUFBTTtBQUFBLEVBQWM7QUFBQyxNQUFHLGFBQVcsT0FBTyxFQUFFLFNBQU8sRUFBRSxVQUFRO0F
25114BQUEsSUFBRSxLQUFLO0FBQUcsY0FBTyxFQUFFLGVBQWEsYUFBVztBQUFBLElBQVksS0FBSztBQUFHLGNBQU8sRUFBRSxTQUFTLGVBQWEsYUFBVztBQUFBLElBQVksS0FBSztBQUFHLFVBQUksSUFBRSxFQUFFO0FBQU8sVUFBRSxFQUFFO0FBQVksWUFBSSxJQUFFLEVBQUUsZUFDbGYsRUFBRSxRQUFNLElBQUcsSUFBRSxPQUFLLElBQUUsZ0JBQWMsSUFBRSxNQUFJO0FBQWMsYUFBTztBQUFBLElBQUUsS0FBSztBQUFHLGFBQU8sSUFBRSxFQUFFLGVBQWEsTUFBSyxTQUFPLElBQUUsSUFBRSxHQUFHLEVBQUUsSUFBSSxLQUFHO0FBQUEsSUFBTyxLQUFLO0FBQUcsVUFBRSxFQUFFO0FBQVMsVUFBRSxFQUFFO0FBQU0sVUFBRztBQUFDLGVBQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztBQUFBLE1BQUMsU0FBTyxHQUFFO0FBQUE7RUFBRTtBQUFDLFNBQU87QUFBSTtBQUMzTSxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQUssVUFBTyxFQUFFLEtBQUc7QUFBQSxJQUFFLEtBQUs7QUFBRyxhQUFNO0FBQUEsSUFBUSxLQUFLO0FBQUUsY0FBTyxFQUFFLGVBQWEsYUFBVztBQUFBLElBQVksS0FBSztBQUFHLGNBQU8sRUFBRSxTQUFTLGVBQWEsYUFBVztBQUFBLElBQVksS0FBSztBQUFHLGFBQU07QUFBQSxJQUFxQixLQUFLO0FBQUcsYUFBTyxJQUFFLEVBQUUsUUFBTyxJQUFFLEVBQUUsZUFBYSxFQUFFLFFBQU0sSUFBRyxFQUFFLGdCQUFjLE9BQUssSUFBRSxnQkFBYyxJQUFFLE1BQUk7QUFBQSxJQUFjLEtBQUs7QUFBRSxhQUFNO0FBQUEsSUFBVyxLQUFLO0FBQUUsYUFBTztBQUFBLElBQUUsS0FBSztBQUFFLGFBQU07QUFBQSxJQUFTLEtBQUs7QUFBRSxhQUFNO0FBQUEsSUFBTyxLQUFLO0FBQUUsYUFBTTtBQUFBLElBQU8sS0FBSztBQUFHLGFBQU8sR0FBRyxDQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUUsYUFBTyxNQUFJLEtBQUcsZUFBYTtBQUFBLElBQU8sS0FBSztBQUFHLGFBQU07QUFBQSxJQUN0ZixLQUFLO0FBQUcsYUFBTTtBQUFBLElBQVcsS0FBSztBQUFHLGFBQU07QUFBQSxJQUFRLEtBQUs7QUFBRyxhQUFNO0FBQUEsSUFBVyxLQUFLO0FBQUcsYUFBTTtBQUFBLElBQWUsS0FBSztBQUFHLGFBQU07QUFBQSxJQUFnQixLQUFLO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBRyxLQUFLO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBRyxLQUFLO0FBQUcsVUFBRyxlQUFhLE9BQU8sRUFBRSxRQUFPLEVBQUUsZUFBYSxFQUFFLFFBQU07QUFBSyxVQUFHLGFBQVcsT0FBTyxFQUFFLFFBQU87QUFBQSxFQUFDO0FBQUMsU0FBTztBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxVQUFPLE9BQU8sR0FBQztBQUFBLElBQUUsS0FBSztBQUFBLElBQVUsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQVMsS0FBSztBQUFZLGFBQU87QUFBQSxJQUFFLEtBQUs7QUFBUyxhQUFPO0FBQUEsSUFBRTtBQUFRLGFBQU07QUFBQSxFQUFFO0FBQUM7QUFDcmEsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFLLFVBQU8sSUFBRSxFQUFFLGFBQVcsWUFBVSxFQUFFLFlBQVcsTUFBSyxlQUFhLEtBQUcsWUFBVTtBQUFFO0FBQzFHLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUcsQ0FBQyxJQUFFLFlBQVUsU0FBUSxJQUFFLE9BQU8seUJBQXlCLEVBQUUsWUFBWSxXQUFVLENBQUMsR0FBRSxJQUFFLEtBQUcsRUFBRSxDQUFDO0FBQUUsTUFBRyxDQUFDLEVBQUUsZUFBZSxDQUFDLEtBQUcsZ0JBQWMsT0FBTyxLQUFHLGVBQWEsT0FBTyxFQUFFLE9BQUssZUFBYSxPQUFPLEVBQUUsS0FBSTtBQUFDLFFBQUksSUFBRSxFQUFFLEtBQUlDLEtBQUUsRUFBRTtBQUFJLFdBQU8sZUFBZSxHQUFFLEdBQUUsRUFBQyxjQUFhLE1BQUcsS0FBSSxXQUFVO0FBQUMsYUFBTyxFQUFFLEtBQUssSUFBSTtBQUFBLElBQUMsR0FBRSxLQUFJLFNBQVNJLElBQUU7QUFBQyxVQUFFLEtBQUdBO0FBQUUsTUFBQUosR0FBRSxLQUFLLE1BQUtJLEVBQUM7QUFBQSxJQUFDLEVBQUMsQ0FBQztBQUFFLFdBQU8sZUFBZSxHQUFFLEdBQUUsRUFBQyxZQUFXLEVBQUUsV0FBVSxDQUFDO0FBQUUsV0FBTSxFQUFDLFVBQVMsV0FBVTtBQUFDLGFBQU87QUFBQSxJQUFDLEdBQUUsVUFBUyxTQUFTQSxJQUFFO0FBQUMsVUFBRSxLQUFHQTtBQUFBLElBQUMsR0FBRSxjQUFhLFdBQVU7QUFBQyxRQUFFLGdCQUN4ZjtBQUFLLGFBQU8sRUFBRSxDQUFDO0FBQUEsSUFBQyxFQUFDO0FBQUEsRUFBQztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxJQUFFLGtCQUFnQixFQUFFLGdCQUFjLEdBQUcsQ0FBQztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFHLENBQUMsRUFBRTtBQUFTLE1BQUksSUFBRSxFQUFFO0FBQWMsTUFBRyxDQUFDLEVBQUUsUUFBTTtBQUFHLE1BQUksSUFBRSxFQUFFLFNBQVE7QUFBRyxNQUFJLElBQUU7QUFBRyxRQUFJLElBQUUsR0FBRyxDQUFDLElBQUUsRUFBRSxVQUFRLFNBQU8sVUFBUSxFQUFFO0FBQU8sTUFBRTtBQUFFLFNBQU8sTUFBSSxLQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUUsUUFBSTtBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFFLE1BQUksZ0JBQWMsT0FBTyxXQUFTLFdBQVM7QUFBUSxNQUFHLGdCQUFjLE9BQU8sRUFBRSxRQUFPO0FBQUssTUFBRztBQUFDLFdBQU8sRUFBRSxpQkFBZSxFQUFFO0FBQUEsRUFBSSxTQUFPLEdBQUU7QUFBQyxXQUFPLEVBQUU7QUFBQSxFQUFJO0FBQUM7QUFDcGEsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQVEsU0FBTyxFQUFFLElBQUcsR0FBRSxFQUFDLGdCQUFlLFFBQU8sY0FBYSxRQUFPLE9BQU0sUUFBTyxTQUFRLFFBQU0sSUFBRSxJQUFFLEVBQUUsY0FBYyxlQUFjLENBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsUUFBTSxFQUFFLGVBQWEsS0FBRyxFQUFFLGNBQWEsSUFBRSxRQUFNLEVBQUUsVUFBUSxFQUFFLFVBQVEsRUFBRTtBQUFlLE1BQUUsR0FBRyxRQUFNLEVBQUUsUUFBTSxFQUFFLFFBQU0sQ0FBQztBQUFFLElBQUUsZ0JBQWMsRUFBQyxnQkFBZSxHQUFFLGNBQWEsR0FBRSxZQUFXLGVBQWEsRUFBRSxRQUFNLFlBQVUsRUFBRSxPQUFLLFFBQU0sRUFBRSxVQUFRLFFBQU0sRUFBRSxNQUFLO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQU
25114FFO0FBQUMsTUFBRSxFQUFFO0FBQVEsVUFBTSxLQUFHLEdBQUcsR0FBRSxXQUFVLEdBQUUsS0FBRTtBQUFDO0FBQzlkLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxLQUFHLEdBQUUsQ0FBQztBQUFFLE1BQUksSUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFFLElBQUUsRUFBRTtBQUFLLE1BQUcsUUFBTSxFQUFFLEtBQUcsYUFBVyxHQUFFO0FBQUMsUUFBRyxNQUFJLEtBQUcsT0FBSyxFQUFFLFNBQU8sRUFBRSxTQUFPLEVBQUUsR0FBRSxRQUFNLEtBQUc7QUFBQSxFQUFDLE1BQU0sR0FBRSxVQUFRLEtBQUcsTUFBSSxFQUFFLFFBQU0sS0FBRztBQUFBLFdBQVcsYUFBVyxLQUFHLFlBQVUsR0FBRTtBQUFDLE1BQUUsZ0JBQWdCLE9BQU87QUFBRTtBQUFBLEVBQU07QUFBQyxJQUFFLGVBQWUsT0FBTyxJQUFFLEdBQUcsR0FBRSxFQUFFLE1BQUssQ0FBQyxJQUFFLEVBQUUsZUFBZSxjQUFjLEtBQUcsR0FBRyxHQUFFLEVBQUUsTUFBSyxHQUFHLEVBQUUsWUFBWSxDQUFDO0FBQUUsVUFBTSxFQUFFLFdBQVMsUUFBTSxFQUFFLG1CQUFpQixFQUFFLGlCQUFlLENBQUMsQ0FBQyxFQUFFO0FBQWU7QUFDbGEsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxFQUFFLGVBQWUsT0FBTyxLQUFHLEVBQUUsZUFBZSxjQUFjLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFLLFFBQUcsRUFBRSxhQUFXLEtBQUcsWUFBVSxLQUFHLFdBQVMsRUFBRSxTQUFPLFNBQU8sRUFBRSxPQUFPO0FBQU8sUUFBRSxLQUFHLEVBQUUsY0FBYztBQUFhLFNBQUcsTUFBSSxFQUFFLFVBQVEsRUFBRSxRQUFNO0FBQUcsTUFBRSxlQUFhO0FBQUEsRUFBQztBQUFDLE1BQUUsRUFBRTtBQUFLLFNBQUssTUFBSSxFQUFFLE9BQUs7QUFBSSxJQUFFLGlCQUFlLENBQUMsQ0FBQyxFQUFFLGNBQWM7QUFBZSxTQUFLLE1BQUksRUFBRSxPQUFLO0FBQUU7QUFDelYsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxhQUFXLEtBQUcsR0FBRyxFQUFFLGFBQWEsTUFBSSxFQUFFLFNBQU0sSUFBRSxFQUFFLGVBQWEsS0FBRyxFQUFFLGNBQWMsZUFBYSxFQUFFLGlCQUFlLEtBQUcsTUFBSSxFQUFFLGVBQWEsS0FBRztBQUFFO0FBQUMsSUFBSSxLQUFHLE1BQU07QUFDN0ssU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLEVBQUU7QUFBUSxNQUFHLEdBQUU7QUFBQyxRQUFFLENBQUE7QUFBRyxhQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLEdBQUUsTUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFFO0FBQUcsU0FBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFFLEVBQUUsZUFBZSxNQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRSxFQUFFLENBQUMsRUFBRSxhQUFXLE1BQUksRUFBRSxDQUFDLEVBQUUsV0FBUyxJQUFHLEtBQUcsTUFBSSxFQUFFLENBQUMsRUFBRSxrQkFBZ0I7QUFBQSxFQUFHLE9BQUs7QUFBQyxRQUFFLEtBQUcsR0FBRyxDQUFDO0FBQUUsUUFBRTtBQUFLLFNBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQyxVQUFHLEVBQUUsQ0FBQyxFQUFFLFVBQVEsR0FBRTtBQUFDLFVBQUUsQ0FBQyxFQUFFLFdBQVM7QUFBRyxjQUFJLEVBQUUsQ0FBQyxFQUFFLGtCQUFnQjtBQUFJO0FBQUEsTUFBTTtBQUFDLGVBQU8sS0FBRyxFQUFFLENBQUMsRUFBRSxhQUFXLElBQUUsRUFBRSxDQUFDO0FBQUEsSUFBRTtBQUFDLGFBQU8sTUFBSSxFQUFFLFdBQVM7QUFBQSxFQUFHO0FBQUM7QUFDeFksU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUcsUUFBTSxFQUFFLHdCQUF3QixPQUFNLE1BQU0sRUFBRSxFQUFFLENBQUM7QUFBRSxTQUFPLEVBQUUsQ0FBQSxHQUFHLEdBQUUsRUFBQyxPQUFNLFFBQU8sY0FBYSxRQUFPLFVBQVMsS0FBRyxFQUFFLGNBQWMsYUFBWSxDQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBTSxNQUFHLFFBQU0sR0FBRTtBQUFDLFFBQUUsRUFBRTtBQUFTLFFBQUUsRUFBRTtBQUFhLFFBQUcsUUFBTSxHQUFFO0FBQUMsVUFBRyxRQUFNLEVBQUUsT0FBTSxNQUFNLEVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRyxHQU
25114FHLENBQUMsR0FBRTtBQUFDLFlBQUcsSUFBRSxFQUFFLE9BQU8sT0FBTSxNQUFNLEVBQUUsRUFBRSxDQUFDO0FBQUUsWUFBRSxFQUFFLENBQUM7QUFBQSxNQUFDO0FBQUMsVUFBRTtBQUFBLElBQUM7QUFBQyxZQUFNLE1BQUksSUFBRTtBQUFJLFFBQUU7QUFBQSxFQUFDO0FBQUMsSUFBRSxnQkFBYyxFQUFDLGNBQWEsR0FBRyxDQUFDLEVBQUM7QUFBQztBQUNuWSxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUUsSUFBRSxHQUFHLEVBQUUsWUFBWTtBQUFFLFVBQU0sTUFBSSxJQUFFLEtBQUcsR0FBRSxNQUFJLEVBQUUsVUFBUSxFQUFFLFFBQU0sSUFBRyxRQUFNLEVBQUUsZ0JBQWMsRUFBRSxpQkFBZSxNQUFJLEVBQUUsZUFBYTtBQUFJLFVBQU0sTUFBSSxFQUFFLGVBQWEsS0FBRztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFZLFFBQUksRUFBRSxjQUFjLGdCQUFjLE9BQUssS0FBRyxTQUFPLE1BQUksRUFBRSxRQUFNO0FBQUU7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLFVBQU8sR0FBQztBQUFBLElBQUUsS0FBSztBQUFNLGFBQU07QUFBQSxJQUE2QixLQUFLO0FBQU8sYUFBTTtBQUFBLElBQXFDO0FBQVEsYUFBTTtBQUFBLEVBQThCO0FBQUM7QUFDN2MsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFNBQU8sUUFBTSxLQUFHLG1DQUFpQyxJQUFFLEdBQUcsQ0FBQyxJQUFFLGlDQUErQixLQUFHLG9CQUFrQixJQUFFLGlDQUErQjtBQUFDO0FBQ2hLLElBQUksSUFBRyxLQUFHLFNBQVMsR0FBRTtBQUFDLFNBQU0sZ0JBQWMsT0FBTyxTQUFPLE1BQU0sMEJBQXdCLFNBQVMsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQU0sd0JBQXdCLFdBQVU7QUFBQyxhQUFPLEVBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLElBQUMsQ0FBQztBQUFBLEVBQUMsSUFBRTtBQUFDLEVBQUUsU0FBUyxHQUFFLEdBQUU7QUFBQyxNQUFHLGlDQUErQixFQUFFLGdCQUFjLGVBQWMsRUFBRSxHQUFFLFlBQVU7QUFBQSxPQUFNO0FBQUMsU0FBRyxNQUFJLFNBQVMsY0FBYyxLQUFLO0FBQUUsT0FBRyxZQUFVLFVBQVEsRUFBRSxRQUFPLEVBQUcsU0FBUSxJQUFHO0FBQVMsU0FBSSxJQUFFLEdBQUcsWUFBVyxFQUFFLGFBQVksR0FBRSxZQUFZLEVBQUUsVUFBVTtBQUFFLFdBQUssRUFBRSxhQUFZLEdBQUUsWUFBWSxFQUFFLFVBQVU7QUFBQSxFQUFDO0FBQUMsQ0FBQztBQUNwZCxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBRyxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBVyxRQUFHLEtBQUcsTUFBSSxFQUFFLGFBQVcsTUFBSSxFQUFFLFVBQVM7QUFBQyxRQUFFLFlBQVU7QUFBRTtBQUFBLElBQU07QUFBQSxFQUFDO0FBQUMsSUFBRSxjQUFZO0FBQUM7QUFDdEgsSUFBSSxLQUFHO0FBQUEsRUFBQyx5QkFBd0I7QUFBQSxFQUFHLGFBQVk7QUFBQSxFQUFHLG1CQUFrQjtBQUFBLEVBQUcsa0JBQWlCO0FBQUEsRUFBRyxrQkFBaUI7QUFBQSxFQUFHLFNBQVE7QUFBQSxFQUFHLGNBQWE7QUFBQSxFQUFHLGlCQUFnQjtBQUFBLEVBQUcsYUFBWTtBQUFBLEVBQUcsU0FBUTtBQUFBLEVBQUcsTUFBSztBQUFBLEVBQUcsVUFBUztBQUFBLEVBQUcsY0FBYTtBQUFBLEVBQUcsWUFBVztBQUFBLEVBQUcsY0FBYTtBQUFBLEVBQUcsV0FBVTtBQUFBLEVBQUcsVUFBUztBQUFBLEVBQUcsU0FBUTtBQUFBLEVBQUcsWUFBVztBQUFBLEVBQUcsYUFBWTtBQUFBLEVBQUcsY0FBYTtBQUFBLEVBQUcsWUFBVztBQUFBLEVBQUcsZUFBYztBQUFBLEVBQUcsZ0JBQWU7QUFBQSxFQUFHLGlCQUFnQjtBQUFBLEVBQUcsWUFBVztBQUFBLEVBQUcsV0FBVTtBQUFBLEVBQUcsWUFBVztBQUFBLEVBQUcsU0FBUTtBQUFBLEVBQUcsT0FBTTtBQUFBLEVBQUcsU0FBUTtBQUFBLEVBQUcsU0FBUTtBQUFBLEVBQUcsUUFBTztBQUFBLEVBQUcsUUFBTztBQUFBLEVBQ2xmLE1BQUs7QUFBQSxFQUFHLGFBQVk7QUFBQSxFQUFHLGNBQWE7QUFBQSxFQUFHLGFBQVk7QUFBQSxFQUFHLGlCQUFnQjtBQUFBLEVBQUcsa0JBQWlCO0FBQUEsRUFBRyxrQkFBaUI7QUFBQSxFQUFHLGVBQWM7QUFBQSxFQUFHLGFBQVk7QUFBRSxHQUFFLEtBQUcsQ0FBQyxVQUFTLE1BQUssT0FBTSxHQUFHO0FBQUUsT0FBTyxLQUFLLEVBQUUsRUFBRSxRQUFRLFNBQVMsR0FBRTtBQUFDLEtBQUcsUUFBUSxTQUFTLEdBQUU7QUFBQyxRQUFFLElBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxZQUFXLElBQUcsRUFBRSxVQUFVLENBQUM7QUFBRSxPQUFHLENBQUMsSUFBRSxHQUFHLENBQUM7QUFBQSxFQUFDLENBQUM7QUFBQyxDQUFDO0FBQUUsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsU0FBTyxRQUFNLEtBQUcsY0FBWSxPQUFPLEtBQUcsT0FBSyxJQUFFLEtBQUcsS0FBRyxhQUFXLE9BQU8sS0FBRyxNQUFJLEtBQUcsR0FBRyxlQUFlLENBQUMsS0FBRyxHQUFHLENBQUMsS0FBRyxLQUFHLEdBQUcsU0FBTyxJQUFFO0FBQUk7QUFDemIsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUUsRUFBRTtBQUFNLFdBQVEsS0FBSyxFQUFFLEtBQUcsRUFBRSxlQUFlLENBQUMsR0FBRTtBQUFDLFFBQUksSUFBRSxNQUFJLEVBQUUsUUFBUSxJQUFJLEdBQUUsSUFBRSxHQUFHLEdBQUUsRUFBRSxDQUFDLEdBQUUsQ0FBQztBQUFFLGdCQUFVLE1BQUksSUFBRTtBQUFZLFFBQUUsRUFBRSxZQUFZLEdBQUUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQUEsRUFBQztBQUFDO0FBQUMsSUFBSSxLQUFHLEVBQUUsRUFBQyxVQUFTLEtBQUUsR0FBRSxFQUFDLE1BQUssTUFBRyxNQUFLLE1BQUcsSUFBRyxNQUFHLEtBQUksTUFBRyxPQUFNLE1BQUcsSUFBRyxNQUFHLEtBQUksTUFBRyxPQUFNLE1BQUcsUUFBTyxNQUFHLE1BQUssTUFBRyxNQUFLLE1BQUcsT0FBTSxNQUFHLFFBQU8sTUFBRyxPQUFNLE1BQUcsS0FBSSxLQUFFLENBQUM7QUFDclQsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUcsR0FBRTtBQUFDLFFBQUcsR0FBRyxDQUFDLE1BQUksUUFBTSxFQUFFLFlBQVUsUUFBTSxFQUFFLHlCQUF5QixPQUFNLE1BQU0sRUFBRSxLQUFJLENBQUMsQ0FBQztBQUFFLFFBQUcsUUFBTSxFQUFFLHlCQUF3QjtBQUFDLFVBQUcsUUFBTSxFQUFFLFNBQVMsT0FBTSxNQUFNLEVBQUUsRUFBRSxDQUFDO0FBQUUsVUFBRyxhQUFXLE9BQU8sRUFBRSwyQkFBeUIsRUFBRSxZQUFXLEVBQUUseUJBQXlCLE9BQU0sTUFBTSxFQUFFLEVBQUUsQ0FBQztBQUFBLElBQUU7QUFBQyxRQUFHLFFBQU0sRUFBRSxTQUFPLGFBQVcsT0FBTyxFQUFFLE1BQU0sT0FBTSxNQUFNLEVBQUUsRUFBRSxDQUFDO0FBQUEsRUFBRTtBQUFDO0FBQ2xXLFNBQVMsR0FBRyxHQU
25114FFLEdBQUU7QUFBQyxNQUFHLE9BQUssRUFBRSxRQUFRLEdBQUcsRUFBRSxRQUFNLGFBQVcsT0FBTyxFQUFFO0FBQUcsVUFBTyxHQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBaUIsS0FBSztBQUFBLElBQWdCLEtBQUs7QUFBQSxJQUFZLEtBQUs7QUFBQSxJQUFnQixLQUFLO0FBQUEsSUFBZ0IsS0FBSztBQUFBLElBQW1CLEtBQUs7QUFBQSxJQUFpQixLQUFLO0FBQWdCLGFBQU07QUFBQSxJQUFHO0FBQVEsYUFBTTtBQUFBLEVBQUU7QUFBQztBQUFDLElBQUksS0FBRztBQUFLLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRSxFQUFFLFVBQVEsRUFBRSxjQUFZO0FBQU8sSUFBRSw0QkFBMEIsSUFBRSxFQUFFO0FBQXlCLFNBQU8sTUFBSSxFQUFFLFdBQVMsRUFBRSxhQUFXO0FBQUM7QUFBQyxJQUFJLEtBQUcsTUFBSyxLQUFHLE1BQUssS0FBRztBQUNwYyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUcsSUFBRSxHQUFHLENBQUMsR0FBRTtBQUFDLFFBQUcsZUFBYSxPQUFPLEdBQUcsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsUUFBSSxJQUFFLEVBQUU7QUFBVSxVQUFJLElBQUUsR0FBRyxDQUFDLEdBQUUsR0FBRyxFQUFFLFdBQVUsRUFBRSxNQUFLLENBQUM7QUFBQSxFQUFFO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE9BQUcsS0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFFLEtBQUcsQ0FBQyxDQUFDLElBQUUsS0FBRztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUMsTUFBRyxJQUFHO0FBQUMsUUFBSSxJQUFFLElBQUcsSUFBRTtBQUFHLFNBQUcsS0FBRztBQUFLLE9BQUcsQ0FBQztBQUFFLFFBQUcsRUFBRSxNQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFJLElBQUcsRUFBRSxDQUFDLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsU0FBTyxFQUFFLENBQUM7QUFBQztBQUFDLFNBQVMsS0FBSTtBQUFBO0FBQUUsSUFBSSxLQUFHO0FBQUcsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxHQUFHLFFBQU8sRUFBRSxHQUFFLENBQUM7QUFBRSxPQUFHO0FBQUcsTUFBRztBQUFDLFdBQU8sR0FBRyxHQU
25114FFLEdBQUUsQ0FBQztBQUFBLEVBQUMsVUFBQztBQUFRLFFBQUcsS0FBRyxPQUFHLFNBQU8sTUFBSSxTQUFPLEdBQUcsSUFBRSxHQUFHLEdBQUU7QUFBQSxFQUFFO0FBQUM7QUFDaGIsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQVUsTUFBRyxTQUFPLEVBQUUsUUFBTztBQUFLLE1BQUksSUFBRSxHQUFHLENBQUM7QUFBRSxNQUFHLFNBQU8sRUFBRSxRQUFPO0FBQUssTUFBRSxFQUFFLENBQUM7QUFBRSxJQUFFLFNBQU87SUFBRyxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBaUIsS0FBSztBQUFBLElBQWdCLEtBQUs7QUFBQSxJQUF1QixLQUFLO0FBQUEsSUFBYyxLQUFLO0FBQUEsSUFBcUIsS0FBSztBQUFBLElBQWMsS0FBSztBQUFBLElBQXFCLEtBQUs7QUFBQSxJQUFZLEtBQUs7QUFBQSxJQUFtQixLQUFLO0FBQWUsT0FBQyxJQUFFLENBQUMsRUFBRSxjQUFZLElBQUUsRUFBRSxNQUFLLElBQUUsRUFBRSxhQUFXLEtBQUcsWUFBVSxLQUFHLGFBQVcsS0FBRyxlQUFhO0FBQUksVUFBRSxDQUFDO0FBQUUsWUFBTTtBQUFBLElBQUU7QUFBUSxVQUFFO0FBQUEsRUFBRTtBQUFDLE1BQUcsRUFBRSxRQUFPO0FBQUssTUFBRyxLQUFHLGVBQ3plLE9BQU8sRUFBRSxPQUFNLE1BQU0sRUFBRSxLQUFJLEdBQUUsT0FBTyxDQUFDLENBQUM7QUFBRSxTQUFPO0FBQUM7QUFBQyxJQUFJLEtBQUc7QUFBRyxJQUFHLEdBQUcsS0FBRztBQUFDLE1BQUksS0FBRztBQUFHLFNBQU8sZUFBZSxJQUFHLFdBQVUsRUFBQyxLQUFJLFdBQVU7QUFBQyxTQUFHO0FBQUEsRUFBRSxFQUFDLENBQUM7QUFBRSxTQUFPLGlCQUFpQixRQUFPLElBQUcsRUFBRTtBQUFFLFNBQU8sb0JBQW9CLFFBQU8sSUFBRyxFQUFFO0FBQUMsU0FBTyxHQUFFO0FBQUMsT0FBRztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRUosSUFBRSxHQUFFLEdBQUVELElBQUU7QUFBQyxNQUFJbEIsS0FBRSxNQUFNLFVBQVUsTUFBTSxLQUFLLFdBQVUsQ0FBQztBQUFFLE1BQUc7QUFBQyxNQUFFLE1BQU0sR0FBRUEsRUFBQztBQUFBLEVBQUMsU0FBT29CLElBQUU7QUFBQyxTQUFLLFFBQVFBLEVBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxJQUFJLEtBQUcsT0FBRyxLQUFHLE1BQUssS0FBRyxPQUFHLEtBQUcsTUFBSyxLQUFHLEVBQUMsU0FBUSxTQUFTLEdBQUU7QUFBQyxPQUFHO0FBQUcsT0FBRztBQUFDLEVBQUM7QUFBRSxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFRCxJQUFFLEdBQUUsR0FBRUQsSUFBRTtBQUFDLE9BQUc7QUFBRyxPQUFHO0FBQUssS0FBRyxNQUFNLElBQUcsU0FBUztBQUFDO0FBQ3plLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUVDLElBQUUsR0FBRSxHQUFFRCxJQUFFO0FBQUMsS0FBRyxNQUFNLE1BQUssU0FBUztBQUFFLE1BQUcsSUFBRztBQUFDLFFBQUcsSUFBRztBQUFDLFVBQUlsQixLQUFFO0FBQUcsV0FBRztBQUFHLFdBQUc7QUFBQSxJQUFJLE1BQU0sT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsV0FBSyxLQUFHLE1BQUcsS0FBR0E7QUFBQSxFQUFFO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFFLElBQUU7QUFBRSxNQUFHLEVBQUUsVUFBVSxRQUFLLEVBQUUsU0FBUSxLQUFFLEVBQUU7QUFBQSxPQUFXO0FBQUMsUUFBRTtBQUFFO0FBQUcsVUFBRSxHQUFFLE9BQUssRUFBRSxRQUFNLFVBQVEsSUFBRSxFQUFFLFNBQVEsSUFBRSxFQUFFO0FBQUEsV0FBYTtBQUFBLEVBQUU7QUFBQyxTQUFPLE1BQUksRUFBRSxNQUFJLElBQUU7QUFBSTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRyxPQUFLLEVBQUUsS0FBSTtBQUFDLFFBQUksSUFBRSxFQUFFO0FBQWMsYUFBTyxNQUFJLElBQUUsRUFBRSxXQUFVLFNBQU8sTUFBSSxJQUFFLEVBQUU7QUFBZ0IsUUFBRyxTQUFPLEVBQUUsUUFBTyxFQUFFO0FBQUEsRUFBVTtBQUFDLFNBQU87QUFBSTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRyxHQUFHLENBQUMsTUFBSSxFQUFFLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFO0FBQ2pmLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBVSxNQUFHLENBQUMsR0FBRTtBQUFDLFFBQUUsR0FBRyxDQUFDO0FBQUUsUUFBRyxTQUFPLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsV0FBTyxNQUFJLElBQUUsT0FBSztBQUFBLEVBQUM7QUFBQyxXQUFRLElBQUUsR0FBRSxJQUFFLE9BQUk7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFPLFFBQUcsU0FBTyxFQUFFO0FBQU0sUUFBSW1CLEtBQUUsRUFBRTtBQUFVLFFBQUcsU0FBT0EsSUFBRTtBQUFDLFVBQUUsRUFBRTtBQUFPLFVBQUcsU0FBTyxHQUFFO0FBQUMsWUFBRTtBQUFFO0FBQUEsTUFBUTtBQUFDO0FBQUEsSUFBSztBQUFDLFFBQUcsRUFBRSxVQUFRQSxHQUFFLE9BQU07QUFBQyxXQUFJQSxLQUFFLEVBQUUsT0FBTUEsTUFBRztBQUFDLFlBQUdBLE9BQUksRUFBRSxRQUFPLEdBQUcsQ0FBQyxHQUFFO0FBQUUsWUFBR0EsT0FBSSxFQUFFLFFBQU8sR0FBRyxDQUFDLEdBQUU7QUFBRSxRQUFBQSxLQUFFQSxHQUFFO0FBQUEsTUFBTztBQUFDLFlBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLElBQUU7QUFBQyxRQUFHLEVBQUUsV0FBUyxFQUFFLE9BQU8sS0FBRSxHQU
25114FFLElBQUVBO0FBQUEsU0FBTTtBQUFDLGVBQVEsSUFBRSxPQUFHLElBQUUsRUFBRSxPQUFNLEtBQUc7QUFBQyxZQUFHLE1BQUksR0FBRTtBQUFDLGNBQUU7QUFBRyxjQUFFO0FBQUUsY0FBRUE7QUFBRTtBQUFBLFFBQUs7QUFBQyxZQUFHLE1BQUksR0FBRTtBQUFDLGNBQUU7QUFBRyxjQUFFO0FBQUUsY0FBRUE7QUFBRTtBQUFBLFFBQUs7QUFBQyxZQUFFLEVBQUU7QUFBQSxNQUFPO0FBQUMsVUFBRyxDQUFDLEdBQUU7QUFBQyxhQUFJLElBQUVBLEdBQUUsT0FBTSxLQUFHO0FBQUMsY0FBRyxNQUM1ZixHQUFFO0FBQUMsZ0JBQUU7QUFBRyxnQkFBRUE7QUFBRSxnQkFBRTtBQUFFO0FBQUEsVUFBSztBQUFDLGNBQUcsTUFBSSxHQUFFO0FBQUMsZ0JBQUU7QUFBRyxnQkFBRUE7QUFBRSxnQkFBRTtBQUFFO0FBQUEsVUFBSztBQUFDLGNBQUUsRUFBRTtBQUFBLFFBQU87QUFBQyxZQUFHLENBQUMsRUFBRSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBQSxNQUFFO0FBQUEsSUFBQztBQUFDLFFBQUcsRUFBRSxjQUFZLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUEsRUFBRTtBQUFDLE1BQUcsTUFBSSxFQUFFLElBQUksT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsU0FBTyxFQUFFLFVBQVUsWUFBVSxJQUFFLElBQUU7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRSxHQUFHLENBQUM7QUFBRSxTQUFPLFNBQU8sSUFBRSxHQUFHLENBQUMsSUFBRTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFHLE1BQUksRUFBRSxPQUFLLE1BQUksRUFBRSxJQUFJLFFBQU87QUFBRSxPQUFJLElBQUUsRUFBRSxPQUFNLFNBQU8sS0FBRztBQUFDLFFBQUksSUFBRSxHQUFHLENBQUM7QUFBRSxRQUFHLFNBQU8sRUFBRSxRQUFPO0FBQUUsUUFBRSxFQUFFO0FBQUEsRUFBTztBQUFDLFNBQU87QUFBSTtBQUMxWCxJQUFJLEtBQUcsR0FBRywyQkFBMEIsS0FBRyxHQUFHLHlCQUF3QixLQUFHLEdBQUcsc0JBQXFCLEtBQUcsR0FBRyx1QkFBc0IsSUFBRSxHQUFHLGNBQWEsS0FBRyxHQUFHLGtDQUFpQyxLQUFHLEdBQUcsNEJBQTJCLEtBQUcsR0FBRywrQkFBOEIsS0FBRyxHQUFHLHlCQUF3QixLQUFHLEdBQUcsc0JBQXFCLEtBQUcsR0FBRyx1QkFBc0IsS0FBRyxNQUFLLEtBQUc7QUFBSyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUcsTUFBSSxlQUFhLE9BQU8sR0FBRyxrQkFBa0IsS0FBRztBQUFDLE9BQUcsa0JBQWtCLElBQUcsR0FBRSxRQUFPLFNBQU8sRUFBRSxRQUFRLFFBQU0sSUFBSTtBQUFBLEVBQUMsU0FBTyxHQUFFO0FBQUEsRUFBQTtBQUFFO0FBQ3ZlLElBQUksS0FBRyxLQUFLLFFBQU0sS0FBSyxRQUFNLElBQUcsS0FBRyxLQUFLLEtBQUksS0FBRyxLQUFLO0FBQUksU0FBUyxHQUFHLEdBQUU7QUFBQyxTQUFLO0FBQUUsU0FBTyxNQUFJLElBQUUsS0FBRyxNQUFJLEdBQUcsQ0FBQyxJQUFFLEtBQUcsS0FBRztBQUFDO0FBQUMsSUFBSSxLQUFHLElBQUcsS0FBRztBQUM3SCxTQUFTLEdBQUcsR0FBRTtBQUFDLFVBQU8sSUFBRSxDQUFDLEdBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPO0FBQUEsSUFBRSxLQUFLO0FBQUUsYUFBTztBQUFBLElBQUUsS0FBSztBQUFFLGFBQU87QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPO0FBQUEsSUFBRSxLQUFLO0FBQUcsYUFBTztBQUFBLElBQUcsS0FBSztBQUFHLGFBQU87QUFBQSxJQUFHLEtBQUs7QUFBQSxJQUFHLEtBQUs7QUFBQSxJQUFJLEtBQUs7QUFBQSxJQUFJLEtBQUs7QUFBQSxJQUFJLEtBQUs7QUFBQSxJQUFLLEtBQUs7QUFBQSxJQUFLLEtBQUs7QUFBQSxJQUFLLEtBQUs7QUFBQSxJQUFLLEtBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFPLEtBQUs7QUFBQSxJQUFPLEtBQUs7QUFBQSxJQUFPLEtBQUs7QUFBQSxJQUFRLEtBQUs7QUFBUSxhQUFPLElBQUU7QUFBQSxJQUFRLEtBQUs7QUFBQSxJQUFRLEtBQUs7QUFBQSxJQUFRLEtBQUs7QUFBQSxJQUFTLEtBQUs7QUFBQSxJQUFTLEtBQUs7QUFBUyxhQUFPLElBQUU7QUFBQSxJQUFVLEtBQUs7QUFBVSxhQUFPO0FBQUEsSUFBVSxLQUFLO0FBQVUsYUFBTztBQUFBLElBQVUsS0FBSztBQUFVLGFBQU87QUFBQSxJQUFVLEtBQUs7QUFBVyxhQUFPO0FBQUEsSUFDemdCO0FBQVEsYUFBTztBQUFBLEVBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFhLE1BQUcsTUFBSSxFQUFFLFFBQU87QUFBRSxNQUFJLElBQUUsR0FBRSxJQUFFLEVBQUUsZ0JBQWVBLEtBQUUsRUFBRSxhQUFZLElBQUUsSUFBRTtBQUFVLE1BQUcsTUFBSSxHQUFFO0FBQUMsUUFBSSxJQUFFLElBQUUsQ0FBQztBQUFFLFVBQUksSUFBRSxJQUFFLEdBQUcsQ0FBQyxLQUFHQSxNQUFHLEdBQUUsTUFBSUEsT0FBSSxJQUFFLEdBQUdBLEVBQUM7QUFBQSxFQUFHLE1BQU0sS0FBRSxJQUFFLENBQUMsR0FBRSxNQUFJLElBQUUsSUFBRSxHQUFHLENBQUMsSUFBRSxNQUFJQSxPQUFJLElBQUUsR0FBR0EsRUFBQztBQUFHLE1BQUcsTUFBSSxFQUFFLFFBQU87QUFBRSxNQUFHLE1BQUksS0FBRyxNQUFJLEtBQUcsT0FBSyxJQUFFLE9BQUssSUFBRSxJQUFFLENBQUMsR0FBRUEsS0FBRSxJQUFFLENBQUMsR0FBRSxLQUFHQSxNQUFHLE9BQUssS0FBRyxPQUFLQSxLQUFFLFVBQVUsUUFBTztBQUFFLFNBQUssSUFBRSxPQUFLLEtBQUcsSUFBRTtBQUFJLE1BQUUsRUFBRTtBQUFlLE1BQUcsTUFBSSxFQUFFLE1BQUksSUFBRSxFQUFFLGVBQWMsS0FBRyxHQUFFLElBQUUsSUFBRyxLQUFFLEtBQUcsR0FBRyxDQUFDLEdBQUUsSUFBRSxLQUFHLEdBQUUsS0FBRyxFQUFFLENBQUMsR0FBRSxLQUFHLENBQUM7QUFBRSxTQUFPO0FBQUM7QUFDdmMsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFVBQU8sR0FBQztBQUFBLElBQUUsS0FBSztBQUFBLElBQUUsS0FBSztBQUFBLElBQUUsS0FBSztBQUFFLGFBQU8sSUFBRTtBQUFBLElBQUksS0FBSztBQUFBLElBQUUsS0FBSztBQUFBLElBQUcsS0FBSztBQUFBLElBQUcsS0FBSztBQUFBLElBQUcsS0FBSztBQUFBLElBQUksS0FBSztBQUFBLElBQUksS0FBSztBQUFBLElBQUksS0FBSztBQUFBLElBQUssS0FBSztBQUFBLElBQUssS0FBSztBQUFBLElBQUssS0FBSztBQUFBLElBQUssS0FBSztBQUFBLElBQU0sS0FBSztBQUFBLElBQU0sS0FBSztBQUFBLElBQU0sS0FBSztBQUFBLElBQU8sS0FBSztBQUFBLElBQU8sS0FBSztBQUFBLElBQU8sS0FBSztBQUFBLElBQVEsS0FBSztBQUF
25114RLGFBQU8sSUFBRTtBQUFBLElBQUksS0FBSztBQUFBLElBQVEsS0FBSztBQUFBLElBQVEsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQVMsS0FBSztBQUFTLGFBQU07QUFBQSxJQUFHLEtBQUs7QUFBQSxJQUFVLEtBQUs7QUFBQSxJQUFVLEtBQUs7QUFBQSxJQUFVLEtBQUs7QUFBVyxhQUFNO0FBQUEsSUFBRztBQUFRLGFBQU07QUFBQSxFQUFFO0FBQUM7QUFDL2EsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFdBQVEsSUFBRSxFQUFFLGdCQUFlLElBQUUsRUFBRSxhQUFZLElBQUUsRUFBRSxpQkFBZ0JBLEtBQUUsRUFBRSxjQUFhLElBQUVBLE1BQUc7QUFBQyxRQUFJLElBQUUsS0FBRyxHQUFHQSxFQUFDLEdBQUUsSUFBRSxLQUFHLEdBQUVELEtBQUUsRUFBRSxDQUFDO0FBQUUsUUFBRyxPQUFLQSxJQUFFO0FBQUMsVUFBRyxPQUFLLElBQUUsTUFBSSxPQUFLLElBQUUsR0FBRyxHQUFFLENBQUMsSUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFBLElBQUMsTUFBTSxDQUFBQSxNQUFHLE1BQUksRUFBRSxnQkFBYztBQUFHLElBQUFDLE1BQUcsQ0FBQztBQUFBLEVBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBRSxFQUFFLGVBQWE7QUFBWSxTQUFPLE1BQUksSUFBRSxJQUFFLElBQUUsYUFBVyxhQUFXO0FBQUM7QUFBQyxTQUFTLEtBQUk7QUFBQyxNQUFJLElBQUU7QUFBRyxTQUFLO0FBQUUsU0FBSyxLQUFHLGFBQVcsS0FBRztBQUFJLFNBQU87QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsV0FBUSxJQUFFLElBQUcsSUFBRSxHQUFFLEtBQUcsR0FBRSxJQUFJLEdBQUUsS0FBSyxDQUFDO0FBQUUsU0FBTztBQUFDO0FBQzNhLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLElBQUUsZ0JBQWM7QUFBRSxnQkFBWSxNQUFJLEVBQUUsaUJBQWUsR0FBRSxFQUFFLGNBQVk7QUFBRyxNQUFFLEVBQUU7QUFBVyxNQUFFLEtBQUcsR0FBRyxDQUFDO0FBQUUsSUFBRSxDQUFDLElBQUU7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRSxlQUFhLENBQUM7QUFBRSxJQUFFLGVBQWE7QUFBRSxJQUFFLGlCQUFlO0FBQUUsSUFBRSxjQUFZO0FBQUUsSUFBRSxnQkFBYztBQUFFLElBQUUsb0JBQWtCO0FBQUUsSUFBRSxrQkFBZ0I7QUFBRSxNQUFFLEVBQUU7QUFBYyxNQUFJLElBQUUsRUFBRTtBQUFXLE9BQUksSUFBRSxFQUFFLGlCQUFnQixJQUFFLEtBQUc7QUFBQyxRQUFJLElBQUUsS0FBRyxHQUFHLENBQUMsR0FBRUEsS0FBRSxLQUFHO0FBQUUsTUFBRSxDQUFDLElBQUU7QUFBRSxNQUFFLENBQUMsSUFBRTtBQUFHLE1BQUUsQ0FBQyxJQUFFO0FBQUcsU0FBRyxDQUFDQTtBQUFBLEVBQUM7QUFBQztBQUN6WSxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUUsa0JBQWdCO0FBQUUsT0FBSSxJQUFFLEVBQUUsZUFBYyxLQUFHO0FBQUMsUUFBSSxJQUFFLEtBQUcsR0FBRyxDQUFDLEdBQUUsSUFBRSxLQUFHO0FBQUUsUUFBRSxJQUFFLEVBQUUsQ0FBQyxJQUFFLE1BQUksRUFBRSxDQUFDLEtBQUc7QUFBRyxTQUFHLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxJQUFJLElBQUU7QUFBRSxTQUFTLEdBQUcsR0FBRTtBQUFDLE9BQUcsQ0FBQztBQUFFLFNBQU8sSUFBRSxJQUFFLElBQUUsSUFBRSxPQUFLLElBQUUsYUFBVyxLQUFHLFlBQVUsSUFBRTtBQUFDO0FBQUMsSUFBSSxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsS0FBRyxPQUFHLEtBQUcsQ0FBQSxHQUFHLEtBQUcsTUFBSyxLQUFHLE1BQUssS0FBRyxNQUFLLEtBQUcsb0JBQUksT0FBSSxLQUFHLG9CQUFJLE9BQUksS0FBRyxDQUFBLEdBQUcsS0FBRyw2UEFBNlAsTUFBTSxHQUFHO0FBQ25pQixTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsVUFBTztJQUFHLEtBQUs7QUFBQSxJQUFVLEtBQUs7QUFBVyxXQUFHO0FBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFZLEtBQUs7QUFBWSxXQUFHO0FBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFZLEtBQUs7QUFBVyxXQUFHO0FBQUs7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFjLEtBQUs7QUFBYSxTQUFHLE9BQU8sRUFBRSxTQUFTO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFvQixLQUFLO0FBQXFCLFNBQUcsT0FBTyxFQUFFLFNBQVM7QUFBQSxFQUFDO0FBQUM7QUFDblQsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRUEsSUFBRTtBQUFDLE1BQUcsU0FBTyxLQUFHLEVBQUUsZ0JBQWNBLEdBQUUsUUFBTyxJQUFFLEVBQUMsV0FBVSxHQUFFLGNBQWEsR0FBRSxrQkFBaUIsR0FBRSxhQUFZQSxJQUFFLGtCQUFpQixDQUFDLENBQUMsRUFBQyxHQUFFLFNBQU8sTUFBSSxJQUFFLEdBQUcsQ0FBQyxHQUFFLFNBQU8sS0FBRyxHQUFHLENBQUMsSUFBRztBQUFFLElBQUUsb0JBQWtCO0FBQUUsTUFBRSxFQUFFO0FBQWlCLFdBQU8sS0FBRyxPQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUcsRUFBRSxLQUFLLENBQUM7QUFBRSxTQUFPO0FBQUM7QUFDcFIsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFVBQU8sR0FBQztBQUFBLElBQUUsS0FBSztBQUFVLGFBQU8sS0FBRyxHQUFHLElBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUU7QUFBQSxJQUFHLEtBQUs7QUFBWSxhQUFPLEtBQUcsR0FBRyxJQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQyxHQUFFO0FBQUEsSUFBRyxLQUFLO0FBQVksYUFBTyxLQUFHLEdBQUcsSUFBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUMsR0FBRTtBQUFBLElBQUcsS0FBSztBQUFjLFVBQUlBLEtBQUUsRUFBRTtBQUFVLFNBQUcsSUFBSUEsSUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBQyxLQUFHLE1BQUssR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLENBQUM7QUFBRSxhQUFNO0FBQUEsSUFBRyxLQUFLO0FBQW9CLGFBQU9BLEtBQUUsRUFBRSxXQUFVLEdBQUcsSUFBSUEsSUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBQyxLQUFHLE1BQUssR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLENBQUMsR0FBRTtBQUFBLEVBQUU7QUFBQyxTQUFNO0FBQUU7QUFDblcsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRyxFQUFFLE1BQU07QUFBRSxNQUFHLFNBQU8sR0FBRTtBQUFDLFFBQUksSUFBRSxHQUFHLENBQUM7QUFBRSxRQUFHLFNBQU87QUFBRSxVQUFHLElBQUUsRUFBRSxLQUFJLE9BQUssR0FBRTtBQUFDLFlBQUcsSUFBRSxHQU
25114FHLENBQUMsR0FBRSxTQUFPLEdBQUU7QUFBQyxZQUFFLFlBQVU7QUFBRSxhQUFHLEVBQUUsVUFBUyxXQUFVO0FBQUMsZUFBRyxDQUFDO0FBQUEsVUFBQyxDQUFDO0FBQUU7QUFBQSxRQUFNO0FBQUEsTUFBQyxXQUFTLE1BQUksS0FBRyxFQUFFLFVBQVUsUUFBUSxjQUFjLGNBQWE7QUFBQyxVQUFFLFlBQVUsTUFBSSxFQUFFLE1BQUksRUFBRSxVQUFVLGdCQUFjO0FBQUs7QUFBQSxNQUFNO0FBQUE7QUFBQSxFQUFDO0FBQUMsSUFBRSxZQUFVO0FBQUk7QUFDbFQsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFHLFNBQU8sRUFBRSxVQUFVLFFBQU07QUFBRyxXQUFRLElBQUUsRUFBRSxrQkFBaUIsSUFBRSxFQUFFLFVBQVE7QUFBQyxRQUFJLElBQUUsR0FBRyxFQUFFLGNBQWEsRUFBRSxrQkFBaUIsRUFBRSxDQUFDLEdBQUUsRUFBRSxXQUFXO0FBQUUsUUFBRyxTQUFPLEdBQUU7QUFBQyxVQUFFLEVBQUU7QUFBWSxVQUFJLElBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFLLENBQUM7QUFBRSxXQUFHO0FBQUUsUUFBRSxPQUFPLGNBQWMsQ0FBQztBQUFFLFdBQUc7QUFBQSxJQUFJLE1BQU0sUUFBTyxJQUFFLEdBQUcsQ0FBQyxHQUFFLFNBQU8sS0FBRyxHQUFHLENBQUMsR0FBRSxFQUFFLFlBQVUsR0FBRTtBQUFHLE1BQUUsTUFBSztBQUFBLEVBQUU7QUFBQyxTQUFNO0FBQUU7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxLQUFHLENBQUMsS0FBRyxFQUFFLE9BQU8sQ0FBQztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUMsT0FBRztBQUFHLFdBQU8sTUFBSSxHQUFHLEVBQUUsTUFBSSxLQUFHO0FBQU0sV0FBTyxNQUFJLEdBQUcsRUFBRSxNQUFJLEtBQUc7QUFBTSxXQUFPLE1BQUksR0FBRyxFQUFFLE1BQUksS0FBRztBQUFNLEtBQUcsUUFBUSxFQUFFO0FBQUUsS0FBRyxRQUFRLEVBQUU7QUFBQztBQUNuZixTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsSUFBRSxjQUFZLE1BQUksRUFBRSxZQUFVLE1BQUssT0FBSyxLQUFHLE1BQUcsR0FBRywwQkFBMEIsR0FBRyx5QkFBd0IsRUFBRTtBQUFHO0FBQzVILFNBQVMsR0FBRyxHQUFFO0FBQUMsV0FBUyxFQUFFVSxJQUFFO0FBQUMsV0FBTyxHQUFHQSxJQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsTUFBRyxJQUFFLEdBQUcsUUFBTztBQUFDLE9BQUcsR0FBRyxDQUFDLEdBQUUsQ0FBQztBQUFFLGFBQVEsSUFBRSxHQUFFLElBQUUsR0FBRyxRQUFPLEtBQUk7QUFBQyxVQUFJLElBQUUsR0FBRyxDQUFDO0FBQUUsUUFBRSxjQUFZLE1BQUksRUFBRSxZQUFVO0FBQUEsSUFBSztBQUFBLEVBQUM7QUFBQyxXQUFPLE1BQUksR0FBRyxJQUFHLENBQUM7QUFBRSxXQUFPLE1BQUksR0FBRyxJQUFHLENBQUM7QUFBRSxXQUFPLE1BQUksR0FBRyxJQUFHLENBQUM7QUFBRSxLQUFHLFFBQVEsQ0FBQztBQUFFLEtBQUcsUUFBUSxDQUFDO0FBQUUsT0FBSSxJQUFFLEdBQUUsSUFBRSxHQUFHLFFBQU8sSUFBSSxLQUFFLEdBQUcsQ0FBQyxHQUFFLEVBQUUsY0FBWSxNQUFJLEVBQUUsWUFBVTtBQUFNLFNBQUssSUFBRSxHQUFHLFdBQVMsSUFBRSxHQUFHLENBQUMsR0FBRSxTQUFPLEVBQUUsYUFBWSxJQUFHLENBQUMsR0FBRSxTQUFPLEVBQUUsYUFBVyxHQUFHO0FBQU87QUFBQyxJQUFJLEtBQUcsR0FBRyx5QkFBd0IsS0FBRztBQUM1YSxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFFVixLQUFFLEdBQUc7QUFBVyxLQUFHLGFBQVc7QUFBSyxNQUFHO0FBQUMsUUFBRSxHQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUMsVUFBQztBQUFRLFFBQUUsR0FBRSxHQUFHLGFBQVdBO0F
25114BQUEsRUFBQztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRUEsS0FBRSxHQUFHO0FBQVcsS0FBRyxhQUFXO0FBQUssTUFBRztBQUFDLFFBQUUsR0FBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDLFVBQUM7QUFBUSxRQUFFLEdBQUUsR0FBRyxhQUFXQTtBQUFBLEVBQUM7QUFBQztBQUNqTyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUcsSUFBRztBQUFDLFFBQUksSUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxRQUFHLFNBQU8sRUFBRSxJQUFHLEdBQUUsR0FBRSxHQUFFLElBQUcsQ0FBQyxHQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUEsYUFBVSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQyxFQUFFLEdBQUU7YUFBMEIsR0FBRyxHQUFFLENBQUMsR0FBRSxJQUFFLEtBQUcsS0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFFO0FBQUMsYUFBSyxTQUFPLEtBQUc7QUFBQyxZQUFJQSxLQUFFLEdBQUcsQ0FBQztBQUFFLGlCQUFPQSxNQUFHLEdBQUdBLEVBQUM7QUFBRSxRQUFBQSxLQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLGlCQUFPQSxNQUFHLEdBQUcsR0FBRSxHQUFFLEdBQUUsSUFBRyxDQUFDO0FBQUUsWUFBR0EsT0FBSSxFQUFFO0FBQU0sWUFBRUE7QUFBQSxNQUFDO0FBQUMsZUFBTyxLQUFHLEVBQUUsZ0JBQWU7QUFBQSxJQUFFLE1BQU0sSUFBRyxHQUFFLEdBQUUsR0FBRSxNQUFLLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxJQUFJLEtBQUc7QUFDcFUsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxPQUFHO0FBQUssTUFBRSxHQUFHLENBQUM7QUFBRSxNQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUcsU0FBTyxFQUFFLEtBQUcsSUFBRSxHQUFHLENBQUMsR0FBRSxTQUFPLEVBQUUsS0FBRTtBQUFBLFdBQWEsSUFBRSxFQUFFLEtBQUksT0FBSyxHQUFFO0FBQUMsUUFBRSxHQUFHLENBQUM7QUFBRSxRQUFHLFNBQU8sRUFBRSxRQUFPO0FBQUUsUUFBRTtBQUFBLEVBQUksV0FBUyxNQUFJLEdBQUU7QUFBQyxRQUFHLEVBQUUsVUFBVSxRQUFRLGNBQWMsYUFBYSxRQUFPLE1BQUksRUFBRSxNQUFJLEVBQUUsVUFBVSxnQkFBYztBQUFLLFFBQUU7QUFBQSxFQUFJLE1BQU0sT0FBSSxNQUFJLElBQUU7QUFBTSxPQUFHO0FBQUUsU0FBTztBQUFJO0FBQzdTLFNBQVMsR0FBRyxHQUFFO0FBQUMsVUFBTyxHQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUEsSUFBUyxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBYyxLQUFLO0FBQUEsSUFBTyxLQUFLO0FBQUEsSUFBTSxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBWSxLQUFLO0FBQUEsSUFBTyxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBVyxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBWSxLQUFLO0FBQUEsSUFBVSxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBUSxLQUFLO0FBQUEsSUFBTyxLQUFLO0FBQUEsSUFBZ0IsS0FBSztBQUFBLElBQWMsS0FBSztBQUFBLElBQVksS0FBSztBQUFBLElBQWEsS0FBSztBQUFBLElBQVEsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQWMsS0FBSztBQUFBLElBQVcsS0FBSztBQUFBLElBQWEsS0FBSztBQUFBLElBQWUsS0FBSztBQUFBLElBQVMsS0FBSztBQUFBLElBQWtCLEtBQUs7QUFBQSxJQUFZLEtBQU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UFFLEdBQUUsS0FBRyxFQUFFLENBQUEsR0FBRyxJQUFHLEVBQUMsTUFBSyxFQUFDLENBQUMsR0FBRSxLQUFHLEdBQUcsRUFBRSxHQUFFLEtBQUc7QUFBQSxFQUFDLEtBQUk7QUFBQSxFQUN4ZixVQUFTO0FBQUEsRUFBSSxNQUFLO0FBQUEsRUFBWSxJQUFHO0FBQUEsRUFBVSxPQUFNO0FBQUEsRUFBYSxNQUFLO0FBQUEsRUFBWSxLQUFJO0FBQUEsRUFBUyxLQUFJO0FBQUEsRUFBSyxNQUFLO0FBQUEsRUFBYyxNQUFLO0FBQUEsRUFBYyxRQUFPO0FBQUEsRUFBYSxpQkFBZ0I7QUFBYyxHQUFFLEtBQUc7QUFBQSxFQUFDLEdBQUU7QUFBQSxFQUFZLEdBQUU7QUFBQSxFQUFNLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFVLElBQUc7QUFBQSxFQUFNLElBQUc7QUFBQSxFQUFRLElBQUc7QUFBQSxFQUFXLElBQUc7QUFBQSxFQUFTLElBQUc7QUFBQSxFQUFJLElBQUc7QUFBQSxFQUFTLElBQUc7QUFBQSxFQUFXLElBQUc7QUFBQSxFQUFNLElBQUc7QUFBQSxFQUFPLElBQUc7QUFBQSxFQUFZLElBQUc7QUFBQSxFQUFVLElBQUc7QUFBQSxFQUFhLElBQUc7QUFBQSxFQUFZLElBQUc7QUFBQSxFQUFTLElBQUc7QUFBQSxFQUFTLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUFLLEtBQUk7QUFBQSxFQUN0ZixLQUFJO0FBQUEsRUFBSyxLQUFJO0FBQUEsRUFBSyxLQUFJO0FBQUEsRUFBTSxLQUFJO0FBQUEsRUFBTSxLQUFJO0FBQUEsRUFBTSxLQUFJO0FBQUEsRUFBVSxLQUFJO0FBQUEsRUFBYSxLQUFJO0FBQU0sR0FBRSxLQUFHLEVBQUMsS0FBSSxVQUFTLFNBQVEsV0FBVSxNQUFLLFdBQVUsT0FBTSxXQUFVO0FBQUUsU0FBUyxHQUFHLEdBQ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UM7QUFBQyxhQUFPO0FBQUEsSUFBSyxLQUFLO0FBQWlCLGFBQU8sTUFBSSxTQUFPLEVBQUUsU0FBTyxPQUFLLEVBQUU7QUFBQSxJQUFLO0FBQVEsYUFBTztBQUFBLEVBQUk7QUFBQztBQUN2WSxJQUFJLEtBQUcsRUFBQyxPQUFNLE1BQUcsTUFBSyxNQUFHLFVBQVMsTUFBRyxrQkFBaUIsTUFBRyxPQUFNLE1BQUcsT0FBTSxNQUFHLFFBQU8sTUFBRyxVQUFTLE1BQUcsT0FBTSxNQUFHLFFBQU8sTUFBRyxLQUFJLE1BQUcsTUFBSyxNQUFHLE1BQUssTUFBRyxLQUFJLE1BQUcsTUFBSyxLQUFFO0FBQUUsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsS0FBRyxFQUFFLFlBQVUsRUFBRSxTQUFTLFlBQVc7QUFBRyxTQUFNLFlBQVUsSUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBRSxlQUFhLElBQUUsT0FBRztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxLQUFHLENBQUM7QUFBRSxNQUFFLEdBQUcsR0FBRSxVQUFVO0FBQUUsTUFBRSxFQUFFLFdBQVMsSUFBRSxJQUFJLEdBQUcsWUFBVyxVQUFTLE1BQUssR0FBRSxDQUFDLEdBQUUsRUFBRSxLQUFLLEVBQUMsT0FBTSxHQUFFLFdBQVUsRUFBQyxDQUFDO0FBQUU7QUFBQyxJQUFJLEtBQUcsTUFBSyxLQUFHO0FBQUssU0FBUyxHQUFHLEdBQUU7QUFBQyxLQUFHLEdBQUUsQ0FBQztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRyxDQUFDO0FBQUUsTUFBRyxHQUFHLENBQUMsRUFBRSxRQUFPO0FBQUM7QUFDcGUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUcsYUFBVyxFQUFFLFFBQU87QUFBQztBQUFDLElBQUksS0FBRztBQUFHLElBQUcsSUFBRztBQUFDLE1BQUk7QUFBRyxNQUFHLElBQUc7QUFBQyxRQUFJLEtBQUcsYUFBWTtBQUFTLFFBQUcsQ0FBQyxJQUFHO0FBQ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UFBRyxLQUFHQSxJQUFFO0FBQUMsUUFBSSxJQUFFLElBQUUsSUFBRTtBQUFFLElBQUFBLE1BQUcsS0FBRyxLQUFHLEtBQUcsR0FBRyxTQUFTLEVBQUU7QUFBRSxVQUFJO0FBQUUsU0FBRztBQUFFLFNBQUcsS0FBRyxLQUFHLEdBQUcsQ0FBQyxJQUFFLElBQUUsS0FBRyxJQUFFO0FBQUUsU0FBR0EsS0FBRTtBQUFBLEVBQUMsTUFBTSxNQUFHLEtBQUdBLEtBQUUsS0FBRyxJQUFFLEdBQUUsS0FBRztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxXQUFPLEVBQUUsV0FBUyxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBRTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsU0FBSyxNQUFJLEtBQUksTUFBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFLE1BQUssS0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFO0FBQUssU0FBSyxNQUFJLEtBQUksTUFBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFLE1BQUssS0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFLE1BQUssS0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxJQUFFO0FBQUk7QUFBQyxJQUFJLEtBQUcsTUFBSyxLQUFHLE1BQUssSUFBRSxPQUFHLEtBQUc7QUFDamUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFHLEdBQUUsTUFBSyxNQUFLLENBQUM7QUFBRSxJQUFFLGNBQVk7QUFBVSxJQUFFLFlBQVU7QUFBRSxJQUFFLFNBQU87QUFBRSxNQUFFLEVBQUU7QUFBVSxXQUFPLEtBQUcsRUFBRSxZQUFVLENBQUMsQ0FBQyxHQUFFLEVBQUUsU0FBTyxNQUFJLEVBQUUsS0FBSyxDQUFDO0FBQUM7QUFDeEosU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFVBQU8sRUFBRTtJQUFLLEtBQUs7QUFBRSxVQUFJLElBQUUsRUFBRTtBQUFLLFVBQUUsTUFBSSxFQUFFLFlBQVUsRUFBRSxZQUFXLE1BQUssRUFBRSxTQUFTLFlBQVcsSUFBRyxPQUFLO0FBQUUsYUFBTyxTQUFPLEtBQUcsRUFBRSxZQUFVLEdBQUUsS0FBRyxHQUFFLEtBQUcsR0FBRyxFQUFFLFVBQVUsR0FBRSxRQUFJO0FBQUEsSUFBRyxLQUFLO0FBQUUsYUFBTyxJQUFFLE9BQUssRUFBRSxnQkFBYyxNQUFJLEVBQUUsV0FBUyxPQUFLLEdBQUUsU0FBTyxLQUFHLEVBQUUsWUFBVSxHQUFFLEtBQUcsR0FBRSxLQUFHLE1BQUssUUFBSTtBQUFBLElBQUcsS0FBSztBQUFHLGFBQU8sSUFBRSxNQUFJLEVBQUUsV0FBUyxPQUFLLEdBQUUsU0FBTyxLQUFHLElBQUUsU0FBTyxLQUFHLEVBQUMsSUFBRyxJQUFHLFVBQVMsR0FBRSxJQUFFLE1BQUssRUFBRSxnQkFBYyxFQUFDLFlBQVcsR0FBRSxhQUFZLEdBQUUsV0FBVSxXQUFVLEdBQUUsSUFBRSxHQUFHLElBQUcsTUFBSyxNQUFLLENBQUMsR0FBRSxFQUFFLFlBQVUsR0FBRSxFQUFFLFNBQU8sR0FBRSxFQUFFLFFBQU0sR0FBRSxLQUFHLEdBQUUsS0FDbGYsTUFBSyxRQUFJO0FBQUEsSUFBRztBQUFRLGFBQU07QUFBQSxFQUFFO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLFNBQU8sT0FBSyxFQUFFLE9BQUssTUFBSSxPQUFLLEVBQUUsUUFBTTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFHLEdBQUU7QUFBQyxRQUFJLElBQUU7QUFBRyxRQUFHLEdBQUU7QUFBQyxVQUFJLElBQUU7QUFBRSxVQUFHLENBQUMsR0FBRyxHQUFFLENBQUMsR0FBRTtBQUFDLFlBQUcsR0FBRyxDQUFDLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsWUFBRSxHQUFHLEVBQUUsV0FBVztBQUFFLFlBQUksSUFBRTtBQUFHLGFBQUcsR0FBRyxHQUFFLENBQUMsSUFBRSxHQUFHLEdBQUUsQ0FBQyxLQ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NBQVMsS0FBSTtBQUFDLElBQUUsRUFBRTtBQUFFLElBQUUsRUFBRTtBQUFFLElBQUUsRUFBRTtBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxLQUFHLEdBQUcsT0FBTztBQUFFLE1BQUksSUFBRSxHQUFHLEdBQUcsT0FBTztBQUFFLE1BQUksSUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJO0FBQUUsUUFBSSxNQUFJLEVBQUUsSUFBRyxDQUFDLEdBQUUsRUFBRSxJQUFHLENBQUM7QUFBRTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsS0FBRyxZQUFVLE1BQUksRUFBRSxFQUFFLEdBQUUsRUFBRSxFQUFFO0FBQUU7QUFBQyxJQUFJLElBQUUsR0FBRyxDQUFDO0FBQ3paLFNBQVMsR0FBRyxHQUFFO0FBQUMsV0FBUSxJQUFFLEdBQUUsU0FBTyxLQUFHO0FBQUMsUUFBRyxPQUFLLEVBQUUsS0FBSTtBQUFDLFVBQUksSUFBRSxFQUFFO0FBQWMsVUFBRyxTQUFPLE1BQUksSUFBRSxFQUFFLFlBQVcsU0FBTyxLQUFHLFNBQU8sRUFBRSxRQUFNLFNBQU8sRUFBRSxNQUFNLFFBQU87QUFBQSxJQUFDLFdBQVMsT0FBSyxFQUFFLE9BQUssV0FBUyxFQUFFLGNBQWMsYUFBWTtBQUFDLFVBQUcsT0FBSyxFQUFFLFFBQU0sS0FBSyxRQUFPO0FBQUEsSUFBQyxXQUFTLFNBQU8sRUFBRSxPQUFNO0FBQUMsUUFBRSxNQUFNLFNBQU87QUFBRSxVQUFFLEVBQUU7QUFBTTtBQUFBLElBQVE7QUFBQyxRQUFHLE1BQUksRUFBRTtBQUFNLFdBQUssU0FBTyxFQUFFLFdBQVM7QUFBQyxVQUFHLFNBQU8sRUFBRSxVQUFRLEVBQUUsV0FBUyxFQUFFLFFBQU87QUFBSyxVQUFFLEVBQUU7QUFBQSxJQUFNO0FBQUMsTUFBRSxRQUFRLFNBQU8sRUFBRTtBQUFPLFFBQUUsRUFBRTtBQUFBLEVBQU87QUFBQyxTQUFPO0FBQUk7QUFBQyxJQUFJLEtBQUcsQ0FBQTtBQUNyYyxTQUFTLEtBQUk7QUFBQyxXQUFRLElBQUUsR0FBRSxJQUFFLEdBQUcsUUFBTyxJQUFJLElBQUcsQ0FBQyxFQUFFLGdDQUE4QjtBQUFLLEtBQUcsU0FBTztBQUFDO0FBQUMsSUFBSSxLQUFHLEdBQUcsd0JBQXVCLEtBQUcsR0FBRyx5QkFBd0IsS0FBRyxHQUFFLElBQUUsTUFBSyxJQUFFLE1BQUssSUFBRSxNQUFLLEtBQUcsT0FBRyxLQUFHLE9BQUcsS0FBRyxHQUFFLEtBQUc7QUFBRSxTQUFTLElBQUc7QUFBQyxRQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRTtBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFHLFNBQU8sRUFBRSxRQUFNO0FBQUcsV0FBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFVBQVEsSUFBRSxFQUFFLFFBQU8sSUFBSSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQU07QUFBRyxTQUFNO0FBQUU7QUFDaFcsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQU
25114FFLEdBQUUsR0FBRWdCLElBQUU7QUFBQyxPQUFHQTtBQUFFLE1BQUU7QUFBRSxJQUFFLGdCQUFjO0FBQUssSUFBRSxjQUFZO0FBQUssSUFBRSxRQUFNO0FBQUUsS0FBRyxVQUFRLFNBQU8sS0FBRyxTQUFPLEVBQUUsZ0JBQWMsS0FBRztBQUFHLE1BQUUsRUFBRSxHQUFFLENBQUM7QUFBRSxNQUFHLElBQUc7QUFBQyxJQUFBQSxLQUFFO0FBQUUsT0FBRTtBQUFDLFdBQUc7QUFBRyxXQUFHO0FBQUUsVUFBRyxNQUFJQSxHQUFFLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUFBLE1BQUc7QUFBRSxVQUFFLElBQUU7QUFBSyxRQUFFLGNBQVk7QUFBSyxTQUFHLFVBQVE7QUFBRyxVQUFFLEVBQUUsR0FBRSxDQUFDO0FBQUEsSUFBQyxTQUFPO0FBQUEsRUFBRztBQUFDLEtBQUcsVUFBUTtBQUFHLE1BQUUsU0FBTyxLQUFHLFNBQU8sRUFBRTtBQUFLLE9BQUc7QUFBRSxNQUFFLElBQUUsSUFBRTtBQUFLLE9BQUc7QUFBRyxNQUFHLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsU0FBTztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUMsTUFBSSxJQUFFLE1BQUk7QUFBRyxPQUFHO0FBQUUsU0FBTztBQUFDO0FBQy9ZLFNBQVMsS0FBSTtBQUFDLE1BQUksSUFBRSxFQUFDLGVBQWMsTUFBSyxXQUFVLE1BQUssV0FBVSxNQUFLLE9BQU0sTUFBSyxNQUFLLEtBQUk7QUFBRSxXQUFPLElBQUUsRUFBRSxnQkFBYyxJQUFFLElBQUUsSUFBRSxFQUFFLE9BQUs7QUFBRSxTQUFPO0FBQUM7QUFBQyxTQUFTLEtBQUk7QUFBQyxNQUFHLFNBQU8sR0FBRTtBQUFDLFFBQUksSUFBRSxFQUFFO0FBQVUsUUFBRSxTQUFPLElBQUUsRUFBRSxnQkFBYztBQUFBLEVBQUksTUFBTSxLQUFFLEVBQUU7QUFBSyxNQUFJLElBQUUsU0FBTyxJQUFFLEVBQUUsZ0JBQWMsRUFBRTtBQUFLLE1BQUcsU0FBTyxFQUFFLEtBQUUsR0FBRSxJQUFFO0FBQUEsT0FBTTtBQUFDLFFBQUcsU0FBTyxFQUFFLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLFFBQUU7QUFBRSxRQUFFLEVBQUMsZUFBYyxFQUFFLGVBQWMsV0FBVSxFQUFFLFdBQVUsV0FBVSxFQUFFLFdBQVUsT0FBTSxFQUFFLE9BQU0sTUFBSyxLQUFJO0FBQUUsYUFBTyxJQUFFLEVBQUUsZ0JBQWMsSUFBRSxJQUFFLElBQUUsRUFBRSxPQUFLO0FBQUEsRUFBQztBQUFDLFNBQU87QUFBQztBQUNqZSxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsU0FBTSxlQUFhLE9BQU8sSUFBRSxFQUFFLENBQUMsSUFBRTtBQUFDO0FBQ25ELFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUUsR0FBRyxJQUFFLEVBQUU7QUFBTSxNQUFHLFNBQU8sRUFBRSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxJQUFFLHNCQUFvQjtBQUFFLE1BQUksSUFBRSxHQUFFLElBQUUsRUFBRSxXQUFVQSxLQUFFLEVBQUU7QUFBUSxNQUFHLFNBQU9BLElBQUU7QUFBQyxRQUFHLFNBQU8sR0FBRTtBQUFDLFVBQUksSUFBRSxFQUFFO0FBQUssUUFBRSxPQUFLQSxHQUFFO0FBQUssTUFBQUEsR0FBRSxPQUFLO0FBQUEsSUFBQztBQUFDLE1BQUUsWUFBVSxJQUFFQTtBQUFFLE1BQUUsVUFBUTtBQUFBLEVBQUk7QUFBQyxNQUFHLFNBQU8sR0FBRTtBQUFDLElBQUFBLEtBQUUsRUFBRTtBQUFLLFFBQUUsRUFBRTtBQUFVLFFBQUksSUFBRSxJQUFFLE1BQUtELEtBQUUsTUFBS2xCLEtBQUVtQjtBQUFFLE9BQUU7QUFBQyxVQUFJQyxLQUFFcEIsR0FBRTtBQUFLLFdBQUksS0FBR29CLFFBQUtBLEdBQUUsVUFBT0YsT0FBSUEsS0FBRUEsR0FBRSxPQUFLLEVBQUMsTUFBSyxHQUFFLFFBQU9sQixHQU
25114FFLFFBQU8sZUFBY0EsR0FBRSxlQUFjLFlBQVdBLEdBQUUsWUFBVyxNQUFLLEtBQUksSUFBRyxJQUFFQSxHQUFFLGdCQUFjQSxHQUFFLGFBQVcsRUFBRSxHQUFFQSxHQUFFLE1BQU07QUFBQSxXQUFNO0FBQUMsWUFBSUcsS0FBRTtBQUFBLFVBQUMsTUFBS2lCO0FBQUEsVUFBRSxRQUFPcEIsR0FBRTtBQUFBLFVBQU8sZUFBY0EsR0FBRTtBQUFBLFVBQ25nQixZQUFXQSxHQUFFO0FBQUEsVUFBVyxNQUFLO0FBQUEsUUFBSTtBQUFFLGlCQUFPa0IsTUFBRyxJQUFFQSxLQUFFZixJQUFFLElBQUUsS0FBR2UsS0FBRUEsR0FBRSxPQUFLZjtBQUFFLFVBQUUsU0FBT2lCO0FBQUUsY0FBSUE7QUFBQSxNQUFDO0FBQUMsTUFBQXBCLEtBQUVBLEdBQUU7QUFBQSxJQUFJLFNBQU8sU0FBT0EsTUFBR0EsT0FBSW1CO0FBQUcsYUFBT0QsS0FBRSxJQUFFLElBQUVBLEdBQUUsT0FBSztBQUFFLE9BQUcsR0FBRSxFQUFFLGFBQWEsTUFBSSxLQUFHO0FBQUksTUFBRSxnQkFBYztBQUFFLE1BQUUsWUFBVTtBQUFFLE1BQUUsWUFBVUE7QUFBRSxNQUFFLG9CQUFrQjtBQUFBLEVBQUM7QUFBQyxNQUFFLEVBQUU7QUFBWSxNQUFHLFNBQU8sR0FBRTtBQUFDLFFBQUU7QUFBRTtBQUFHLE1BQUFDLEtBQUUsRUFBRSxNQUFLLEVBQUUsU0FBT0EsSUFBRSxNQUFJQSxJQUFFLElBQUUsRUFBRTtBQUFBLFdBQVcsTUFBSTtBQUFBLEVBQUUsTUFBTSxVQUFPLE1BQUksRUFBRSxRQUFNO0FBQUcsU0FBTSxDQUFDLEVBQUUsZUFBYyxFQUFFLFFBQVE7QUFBQztBQUM5WCxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRSxNQUFLLElBQUUsRUFBRTtBQUFNLE1BQUcsU0FBTyxFQUFFLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLElBQUUsc0JBQW9CO0FBQUUsTUFBSSxJQUFFLEVBQUUsVUFBUyxJQUFFLEVBQUUsU0FBUUEsS0FBRSxFQUFFO0FBQWMsTUFBRyxTQUFPLEdBQUU7QUFBQyxNQUFFLFVBQVE7QUFBSyxRQUFJLElBQUUsSUFBRSxFQUFFO0FBQUs7QUFBRyxNQUFBQSxLQUFFLEVBQUVBLElBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxFQUFFO0FBQUEsV0FBVyxNQUFJO0FBQUcsT0FBR0EsSUFBRSxFQUFFLGFBQWEsTUFBSSxLQUFHO0FBQUksTUFBRSxnQkFBY0E7QUFBRSxhQUFPLEVBQUUsY0FBWSxFQUFFLFlBQVVBO0FBQUcsTUFBRSxvQkFBa0JBO0FBQUEsRUFBQztBQUFDLFNBQU0sQ0FBQ0EsSUFBRSxDQUFDO0FBQUM7QUFBQyxTQUFTLEtBQUk7QUFBQTtBQUNuVyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFLEdBQUcsSUFBRSxFQUFDLEdBQUdBLEtBQUUsQ0FBQyxHQUFHLEVBQUUsZUFBYyxDQUFDO0FBQUUsRUFBQUEsT0FBSSxFQUFFLGdCQUFjLEdBQUUsS0FBRztBQUFJLE1BQUUsRUFBRTtBQUFNLEtBQUcsR0FBRyxLQUFLLE1BQUssR0FBRSxHQUFFLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLE1BQUcsRUFBRSxnQkFBYyxLQUFHQSxNQUFHLFNBQU8sS0FBRyxFQUFFLGNBQWMsTUFBSSxHQUFFO0FBQUMsTUFBRSxTQUFPO0FBQUssT0FBRyxHQUFFLEdBQUcsS0FBSyxNQUFLLEdBQUUsR0FBRSxHQUFFLENBQUMsR0FBRSxRQUFPLElBQUk7QUFBRSxRQUFHLFNBQU8sRUFBRSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxXQUFLLEtBQUcsT0FBSyxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUEsRUFBQztBQUFDLFNBQU87QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLElBQUUsU0FBTztBQUFNLE1BQUUsRUFBQyxhQUFZLEdBQUUsT0FBTSxFQUFDO0FBQUUsTUFBRSxFQUFFO0FBQVksV0FBTyxLQUFHLElBQUUsRUFBQyxZQUFXLE1BQUssUUFBTyxLQUFJLEdBQUUsRUFBRSxjQUFZLEdBQUUsRUFBRSxTQUFPLENBQUMsQ0FBQyxNQUFJLElBQUUsRUFBRSxRQUFPLFNBQU8sSUFBRSxFQUFFLFNBQU8sQ0FBQyxDQUFDLElBQUUsRUFBRSxLQUFLLENBQUM7QUFBRTtBQUNsZixTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLElBQUUsUUFBTTtBQUFFLElBQUUsY0FBWTtBQUFFLEtBQUcsQ0FBQyxLQUFHLEdBQUcsQ0FBQztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsU0FBTyxFQUFFLFdBQVU7QUFBQyxPQUFHLENBQUMsS0FBRyxHQUFHLENBQUM7QUFBQSxFQUFDLENBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBWSxNQUFFLEVBQUU7QUFBTSxNQUFHO0FBQUMsUUFBSSxJQUFFLEVBQUM7QUFBRyxXQUFNLENBQUMsR0FBRyxHQUFFLENBQUM7QUFBQSxFQUFDLFNBQU8sR0FBRTtBQUFDLFdBQU07QUFBQSxFQUFFO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLFdBQU8sS0FBRyxHQUFHLEdBQUUsR0FBRSxHQUFFLEVBQUU7QUFBQztBQUNsUSxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRTtBQUFLLGlCQUFhLE9BQU8sTUFBSSxJQUFFLEVBQUM7QUFBSSxJQUFFLGdCQUFjLEVBQUUsWUFBVTtBQUFFLE1BQUUsRUFBQyxTQUFRLE1BQUssYUFBWSxNQUFLLE9BQU0sR0FBRSxVQUFTLE1BQUsscUJBQW9CLElBQUcsbUJBQWtCLEVBQUM7QUFBRSxJQUFFLFFBQU07QUFBRSxNQUFFLEVBQUUsV0FBUyxHQUFHLEtBQUssTUFBSyxHQUFFLENBQUM7QUFBRSxTQUFNLENBQUMsRUFBRSxlQUFjLENBQUM7QUFBQztBQUM1UCxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsRUFBQyxLQUFJLEdBQUUsUUFBTyxHQUFFLFNBQVEsR0FBRSxNQUFLLEdBQUUsTUFBSyxLQUFJO0FBQUUsTUFBRSxFQUFFO0FBQVksV0FBTyxLQUFHLElBQUUsRUFBQyxZQUFXLE1BQUssUUFBTyxLQUFJLEdBQUUsRUFBRSxjQUFZLEdBQUUsRUFBRSxhQUFXLEVBQUUsT0FBSyxNQUFJLElBQUUsRUFBRSxZQUFXLFNBQU8sSUFBRSxFQUFFLGFBQVcsRUFBRSxPQUFLLEtBQUcsSUFBRSxFQUFFLE1BQUssRUFBRSxPQUFLLEdBQUUsRUFBRSxPQUFLLEdBQUUsRUFBRSxhQUFXO0FBQUksU0FBTztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUMsU0FBTyxHQUFFLEVBQUc7QUFBYTtBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUU7QUFBRyxJQUFFLFNBQU87QUFBRSxJQUFFLGdCQUFjLEdBQUcsSUFBRSxHQU
25114FFLEdBQUUsUUFBTyxXQUFTLElBQUUsT0FBSyxDQUFDO0FBQUM7QUFDOVksU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUU7QUFBSyxNQUFFLFdBQVMsSUFBRSxPQUFLO0FBQUUsTUFBSUEsS0FBRTtBQUFPLE1BQUcsU0FBTyxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBYyxJQUFBQSxLQUFFLEVBQUU7QUFBUSxRQUFHLFNBQU8sS0FBRyxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUU7QUFBQyxRQUFFLGdCQUFjLEdBQUcsR0FBRSxHQUFFQSxJQUFFLENBQUM7QUFBRTtBQUFBLElBQU07QUFBQSxFQUFDO0FBQUMsSUFBRSxTQUFPO0FBQUUsSUFBRSxnQkFBYyxHQUFHLElBQUUsR0FBRSxHQUFFQSxJQUFFLENBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxTQUFPLEdBQUcsU0FBUSxHQUFFLEdBQUUsQ0FBQztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFNBQU8sR0FBRyxNQUFLLEdBQUUsR0FBRSxDQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsU0FBTyxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxTQUFPLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFDO0FBQ2hYLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFHLGVBQWEsT0FBTyxFQUFFLFFBQU8sSUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUUsV0FBVTtBQUFDLE1BQUUsSUFBSTtBQUFBLEVBQUM7QUFBRSxNQUFHLFNBQU8sS0FBRyxXQUFTLEVBQUUsUUFBTyxJQUFFLEtBQUksRUFBRSxVQUFRLEdBQUUsV0FBVTtBQUFDLE1BQUUsVUFBUTtBQUFBLEVBQUk7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsU0FBTyxLQUFHLFdBQVMsSUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBRTtBQUFLLFNBQU8sR0FBRyxHQU
25114FFLEdBQUUsR0FBRyxLQUFLLE1BQUssR0FBRSxDQUFDLEdBQUUsQ0FBQztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUE7QUFBRSxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFO0FBQUssTUFBRSxXQUFTLElBQUUsT0FBSztBQUFFLE1BQUksSUFBRSxFQUFFO0FBQWMsTUFBRyxTQUFPLEtBQUcsU0FBTyxLQUFHLEdBQUcsR0FBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQU8sRUFBRSxDQUFDO0FBQUUsSUFBRSxnQkFBYyxDQUFDLEdBQUUsQ0FBQztBQUFFLFNBQU87QUFBQztBQUM3WixTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUU7QUFBRyxNQUFFLFdBQVMsSUFBRSxPQUFLO0FBQUUsTUFBSSxJQUFFLEVBQUU7QUFBYyxNQUFHLFNBQU8sS0FBRyxTQUFPLEtBQUcsR0FBRyxHQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBTyxFQUFFLENBQUM7QUFBRSxNQUFFLEVBQUM7QUFBRyxJQUFFLGdCQUFjLENBQUMsR0FBRSxDQUFDO0FBQUUsU0FBTztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxPQUFLLEtBQUcsSUFBSSxRQUFPLEVBQUUsY0FBWSxFQUFFLFlBQVUsT0FBRyxLQUFHLE9BQUksRUFBRSxnQkFBYztBQUFFLEtBQUcsR0FBRSxDQUFDLE1BQUksSUFBRSxHQUFFLEdBQUcsRUFBRSxTQUFPLEdBQUUsTUFBSSxHQUFFLEVBQUUsWUFBVTtBQUFJLFNBQU87QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUU7QUFBRSxNQUFFLE1BQUksS0FBRyxJQUFFLElBQUUsSUFBRTtBQUFFLElBQUUsSUFBRTtBQUFFLE1BQUksSUFBRSxHQUFHO0FBQVcsS0FBRyxhQUFXO0FBQUcsTUFBRztBQUFDLE1BQUUsS0FBRSxHQUFFLEVBQUM7QUFBQSxFQUFFLFVBQUM7QUFBUSxRQUFFLEdBQUUsR0FBRyxhQUFXO0FBQUEsRUFBQztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUMsU0FBTyxHQUFFLEVBQUc7QUFBYTtBQUMxZCxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRyxDQUFDO0FBQUUsTUFBRSxFQUFDLE1BQUssR0FBRSxRQUFPLEdBQUUsZUFBYyxPQUFHLFlBQVcsTUFBSyxNQUFLLEtBQUk7QUFBRSxNQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUcsR0FBRSxDQUFDO0FBQUEsV0FBVSxJQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQyxHQUFFLFNBQU8sR0FBRTtBQUFDLFFBQUksSUFBRTtBQUFJLE9BQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLE9BQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFDL0ssU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUcsQ0FBQyxHQUFFLElBQUUsRUFBQyxNQUFLLEdBQUUsUUFBTyxHQUFFLGVBQWMsT0FBRyxZQUFXLE1BQUssTUFBSyxLQUFJO0FBQUUsTUFBRyxHQUFHLENBQUMsRUFBRSxJQUFHLEdBQUUsQ0FBQztBQUFBLE9BQU07QUFBQyxRQUFJQSxLQUFFLEVBQUU7QUFBVSxRQUFHLE1BQUksRUFBRSxVQUFRLFNBQU9BLE1BQUcsTUFBSUEsR0FBRSxXQUFTQSxLQUFFLEVBQUUscUJBQW9CLFNBQU9BLElBQUcsS0FBRztBQUFDLFVBQUksSUFBRSxFQUFFLG1CQUFrQixJQUFFQSxHQUFFLEdBQUUsQ0FBQztBQUFFLFFBQUUsZ0JBQWM7QUFBRyxRQUFFLGFBQVc7QUFBRSxVQUFHLEdBQUcsR0FBRSxDQUFDLEdBQUU7QUFBQyxZQUFJRCxLQUFFLEVBQUU7QUFBWSxpQkFBT0EsTUFBRyxFQUFFLE9BQUssR0FBRSxHQUFHLENBQUMsTUFBSSxFQUFFLE9BQUtBLEdBQUUsTUFBS0EsR0FBRSxPQUFLO0FBQUcsVUFBRSxjQUFZO0FBQUU7QUFBQSxNQUFNO0FBQUEsSUFBQyxTQUFPbEIsSUFBRTtBQUFBLElBQUEsVUFBRTtBQUFBLElBQU87QUFBRSxRQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLGFBQU8sTUFBSSxJQUFFLEVBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUEsRUFBRTtBQUFDO0FBQy9jLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBVSxTQUFPLE1BQUksS0FBRyxTQUFPLEtBQUcsTUFBSTtBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE9BQUcsS0FBRztBQUFHLE1BQUksSUFBRSxFQUFFO0FBQVEsV0FBTyxJQUFFLEVBQUUsT0FBSyxLQUFHLEVBQUUsT0FBSyxFQUFFLE1BQUssRUFBRSxPQUFLO0FBQUcsSUFBRSxVQUFRO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLE9BQUssSUFBRSxVQUFTO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBTSxTQUFHLEVBQUU7QUFBYSxTQUFHO0FBQUUsTUFBRSxRQUFNO0FBQUUsT0FBRyxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFDOVAsSUFBSSxLQUFHLEVBQUMsYUFBWSxJQUFHLGFBQVksR0FBRSxZQUFXLEdBQUUsV0FBVSxHQUFFLHFCQUFvQixHQUFFLG9CQUFtQixHQUFFLGlCQUFnQixHQUFFLFNBQVEsR0FBRSxZQUFXLEdBQUUsUUFBTyxHQUFFLFVBQVMsR0FBRSxlQUFjLEdBQUUsa0JBQWlCLEdBQUUsZUFBYyxHQUFFLGtCQUFpQixHQUFFLHNCQUFxQixHQUFFLE9BQU0sR0FBRSwwQkFBeUIsTUFBRSxHQUFFLEtBQUcsRUFBQyxhQUFZLElBQUcsYUFBWSxTQUFTLEdBQUUsR0FBRTtBQUFDLEtBQUUsRUFBRyxnQkFBYyxDQUFDLEdBQUUsV0FBUyxJQUFFLE9BQUssQ0FBQztBQUFFLFNBQU87QUFBQyxHQUFFLFlBQVcsSUFBRyxXQUFVLElBQUcscUJBQW9CLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLFNBQU8sS0FBRyxXQUFTLElBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUU7QUFBSyxTQUFPO0FBQUEsSUFBRztBQUFBLElBQzNmO0FBQUEsSUFBRSxHQUFHLEtBQUssTUFBSyxHQUFFLENBQUM7QUFBQSxJQUFFO0FBQUEsRUFBQztBQUFDLEdBQUUsaUJBQWdCLFNBQVMsR0FBRSxHQUFFO0FBQUMsU0FBTyxHQUFHLFNBQVEsR0FBRSxHQUFFLENBQUM7QUFBQyxHQUFFLG9CQUFtQixTQUFTLEdBQUUsR0FBRTtBQUFDLFNBQU8sR0FBRyxHQU
25114FFLEdBQUUsR0FBRSxDQUFDO0FBQUMsR0FBRSxTQUFRLFNBQVMsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFO0FBQUssTUFBRSxXQUFTLElBQUUsT0FBSztBQUFFLE1BQUUsRUFBQztBQUFHLElBQUUsZ0JBQWMsQ0FBQyxHQUFFLENBQUM7QUFBRSxTQUFPO0FBQUMsR0FBRSxZQUFXLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRTtBQUFHLE1BQUUsV0FBUyxJQUFFLEVBQUUsQ0FBQyxJQUFFO0FBQUUsSUFBRSxnQkFBYyxFQUFFLFlBQVU7QUFBRSxNQUFFLEVBQUMsU0FBUSxNQUFLLGFBQVksTUFBSyxPQUFNLEdBQUUsVUFBUyxNQUFLLHFCQUFvQixHQUFFLG1CQUFrQixFQUFDO0FBQUUsSUFBRSxRQUFNO0FBQUUsTUFBRSxFQUFFLFdBQVMsR0FBRyxLQUFLLE1BQUssR0FBRSxDQUFDO0FBQUUsU0FBTSxDQUFDLEVBQUUsZUFBYyxDQUFDO0FBQUMsR0FBRSxRQUFPLFNBQVMsR0FBRTtBQUFDLE1BQUksSUFDcmYsR0FBRTtBQUFHLE1BQUUsRUFBQyxTQUFRLEVBQUM7QUFBRSxTQUFPLEVBQUUsZ0JBQWM7QUFBQyxHQUFFLFVBQVMsSUFBRyxlQUFjLElBQUcsa0JBQWlCLFNBQVMsR0FBRTtBQUFDLFNBQU8sR0FBRSxFQUFHLGdCQUFjO0FBQUMsR0FBRSxlQUFjLFdBQVU7QUFBQyxNQUFJLElBQUUsR0FBRyxLQUFFLEdBQUUsSUFBRSxFQUFFLENBQUM7QUFBRSxNQUFFLEdBQUcsS0FBSyxNQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQUUsS0FBRSxFQUFHLGdCQUFjO0FBQUUsU0FBTSxDQUFDLEdBQUUsQ0FBQztBQUFDLEdBQUUsa0JBQWlCLFdBQVU7QUFBQSxHQUFHLHNCQUFxQixTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEdBQUUsSUFBRSxHQUFFO0FBQUcsTUFBRyxHQUFFO0FBQUMsUUFBRyxXQUFTLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsUUFBRTtFQUFHLE9BQUs7QUFBQyxRQUFFO0FBQUksUUFBRyxTQUFPLEVBQUUsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsV0FBSyxLQUFHLE9BQUssR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQyxJQUFFLGdCQUFjO0FBQUUsTUFBSW1CLEtBQUUsRUFBQyxPQUFNLEdBQUUsYUFBWSxFQUFDO0FBQUUsSUFBRSxRQUFNQTtBQUFFLEtBQUcsR0FBRztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFDcGZBO0FBQUEsSUFBRTtBQUFBLEVBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztBQUFFLElBQUUsU0FBTztBQUFLLEtBQUcsR0FBRSxHQUFHLEtBQUssTUFBSyxHQUFFQSxJQUFFLEdBQUUsQ0FBQyxHQUFFLFFBQU8sSUFBSTtBQUFFLFNBQU87QUFBQyxHQUFFLE9BQU0sV0FBVTtBQUFDLE1BQUksSUFBRSxHQUFFLEdBQUcsSUFBRSxFQUFFO0FBQWlCLE1BQUcsR0FBRTtBQUFDLFFBQUksSUFBRTtBQUFHLFFBQUksSUFBRTtBQUFHLFNBQUcsSUFBRSxFQUFFLEtBQUcsS0FBRyxHQUFHLENBQUMsSUFBRSxJQUFJLFNBQVMsRUFBRSxJQUFFO0FBQUUsUUFBRSxNQUFJLElBQUUsTUFBSTtBQUFFLFFBQUU7QUFBSyxRQUFFLE1BQUksS0FBRyxNQUFJLEVBQUUsU0FBUyxFQUFFO0FBQUcsU0FBRztBQUFBLEVBQUcsTUFBTSxLQUFFLE1BQUssSUFBRSxNQUFJLElBQUUsTUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFFO0FBQUksU0FBTyxFQUFFLGdCQUFjO0FBQUMsR0FBRSwwQkFBeUIsTUFBRSxHQUFFLEtBQUc7QUFBQSxFQUFDLGFBQVk7QUFBQSxFQUFHLGFBQVk7QUFBQSxFQUFHLFlBQVc7QUFBQSxFQUFHLFdBQVU7QUFBQSxFQUFHLHFCQUFvQjtBQUFBLEVBQUcsb0JBQW1CO0FBQUEsRUFBRyxpQkFBZ0I7QUFBQSxFQUFHLFNBQVE7QUFBQSxFQUFHLFlBQVc7QUFBQSxFQUFHLFFBQU87QUFBQSxFQUFHLFVBQVMsV0FBVTtBQUFDLFdBQU8sR0FBRyxFQUFFO0FBQUEsRUFBQztBQUFBLEVBQ3JoQixlQUFjO0FBQUEsRUFBRyxrQkFBaUIsU0FBUyxHQUFFO0FBQUMsUUFBSSxJQUFFO0FBQUssV0FBTyxHQUFHLEdBQUUsRUFBRSxlQUFjLENBQUM7QUFBQSxFQUFDO0FBQUEsRUFBRSxlQUFjLFdBQVU7QUFBQyxRQUFJLElBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBSztBQUFjLFdBQU0sQ0FBQyxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUEsRUFBRSxrQkFBaUI7QUFBQSxFQUFHLHNCQUFxQjtBQUFBLEVBQUcsT0FBTTtBQUFBLEVBQUcsMEJBQXlCO0FBQUUsR0FBRSxLQUFHLEVBQUMsYUFBWSxJQUFHLGFBQVksSUFBRyxZQUFXLElBQUcsV0FBVSxJQUFHLHFCQUFvQixJQUFHLG9CQUFtQixJQUFHLGlCQUFnQixJQUFHLFNBQVEsSUFBRyxZQUFXLElBQUcsUUFBTyxJQUFHLFVBQVMsV0FBVTtBQUFDLFNBQU8sR0FBRyxFQUFFO0FBQUMsR0FBRSxlQUFjLElBQUcsa0JBQWlCLFNBQVMsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFFO0FBQUcsU0FBTyxTQUN6ZixJQUFFLEVBQUUsZ0JBQWMsSUFBRSxHQUFHLEdBQUUsRUFBRSxlQUFjLENBQUM7QUFBQyxHQUFFLGVBQWMsV0FBVTtBQUFDLE1BQUksSUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUUsSUFBRSxLQUFLO0FBQWMsU0FBTSxDQUFDLEdBQUUsQ0FBQztBQUFDLEdBQUUsa0JBQWlCLElBQUcsc0JBQXFCLElBQUcsT0FBTSxJQUFHLDBCQUF5QixNQUFFO0FBQUUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUcsS0FBRyxFQUFFLGNBQWE7QUFBQyxRQUFFLEVBQUUsQ0FBQSxHQUFHLENBQUM7QUFBRSxRQUFFLEVBQUU7QUFBYSxhQUFRLEtBQUssY0FBVyxFQUFFLENBQUMsTUFBSSxFQUFFLENBQUMsSUFBRSxFQUFFLENBQUM7QUFBRyxXQUFPO0FBQUEsRUFBQztBQUFDLFNBQU87QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRSxFQUFFO0FBQWMsTUFBRSxFQUFFLEdBQUUsQ0FBQztBQUFFLE1BQUUsU0FBTyxLQUFHLFdBQVMsSUFBRSxJQUFFLEVBQUUsQ0FBQSxHQUFHLEdBQUUsQ0FBQztBQUFFLElBQUUsZ0JBQWM7QUFBRSxRQUFJLEVBQUUsVUFBUSxFQUFFLFlBQVksWUFBVTtBQUFFO0FBQ3JkLElBQUksS0FBRyxFQUFDLFdBQVUsU0FBUyxHQUFFO0FBQUMsVUFBTyxJQUFFLEVBQUUsbUJBQWlCLEdBQUcsQ0FBQyxNQUFJLElBQUU7QUFBRSxHQUFFLGlCQUFnQixTQUFTLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRSxFQUFFO0FBQWdCLE1BQUksSUFBRSxFQUFDLEdBQUcsSUFBRSxHQU
25114FHLENBQUMsR0FBRUEsS0FBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLEVBQUFBLEdBQUUsVUFBUTtBQUFFLGFBQVMsS0FBRyxTQUFPLE1BQUlBLEdBQUUsV0FBUztBQUFHLE1BQUUsR0FBRyxHQUFFQSxJQUFFLENBQUM7QUFBRSxXQUFPLE1BQUksR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLEdBQUUscUJBQW9CLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLEVBQUU7QUFBZ0IsTUFBSSxJQUFFLEVBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxHQUFFQSxLQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUUsRUFBQUEsR0FBRSxNQUFJO0FBQUUsRUFBQUEsR0FBRSxVQUFRO0FBQUUsYUFBUyxLQUFHLFNBQU8sTUFBSUEsR0FBRSxXQUFTO0FBQUcsTUFBRSxHQUFHLEdBQUVBLElBQUUsQ0FBQztBQUFFLFdBQU8sTUFBSSxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsR0FBRSxvQkFBbUIsU0FBUyxHQUFFLEdBQUU7QUFBQyxNQUFFLEVBQUU7QUFBZ0IsTUFBSSxJQUFFLEVBQUMsR0FBRyxJQUNuZixHQUFHLENBQUMsR0FBRSxJQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUUsSUFBRSxNQUFJO0FBQUUsYUFBUyxLQUFHLFNBQU8sTUFBSSxFQUFFLFdBQVM7QUFBRyxNQUFFLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBRSxXQUFPLE1BQUksR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLEVBQUM7QUFBRSxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFQSxJQUFFLEdBQUU7QUFBQyxNQUFFLEVBQUU7QUFBVSxTQUFNLGVBQWEsT0FBTyxFQUFFLHdCQUFzQixFQUFFLHNCQUFzQixHQUFFQSxJQUFFLENBQUMsSUFBRSxFQUFFLGFBQVcsRUFBRSxVQUFVLHVCQUFxQixDQUFDLEdBQUcsR0FBRSxDQUFDLEtBQUcsQ0FBQyxHQUFHLEdBQUVBLEVBQUMsSUFBRTtBQUFFO0FBQzFTLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxPQUFHLElBQUU7QUFBRyxNQUFJQSxLQUFFLEVBQUU7QUFBWSxlQUFXLE9BQU9BLE1BQUcsU0FBT0EsS0FBRUEsS0FBRSxHQUFHQSxFQUFDLEtBQUcsSUFBRSxHQUFHLENBQUMsSUFBRSxLQUFHLEVBQUUsU0FBUSxJQUFFLEVBQUUsY0FBYUEsTUFBRyxJQUFFLFNBQU8sS0FBRyxXQUFTLEtBQUcsR0FBRyxHQUFFLENBQUMsSUFBRTtBQUFJLE1BQUUsSUFBSSxFQUFFLEdBQUVBLEVBQUM7QUFBRSxJQUFFLGdCQUFjLFNBQU8sRUFBRSxTQUFPLFdBQVMsRUFBRSxRQUFNLEVBQUUsUUFBTTtBQUFLLElBQUUsVUFBUTtBQUFHLElBQUUsWUFBVTtBQUFFLElBQUUsa0JBQWdCO0FBQUUsUUFBSSxJQUFFLEVBQUUsV0FBVSxFQUFFLDhDQUE0QyxHQUFFLEVBQUUsNENBQTBDQTtBQUFHLFNBQU87QUFBQztBQUM1WixTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsRUFBRTtBQUFNLGlCQUFhLE9BQU8sRUFBRSw2QkFBMkIsRU
25114FBRSwwQkFBMEIsR0FBRSxDQUFDO0FBQUUsaUJBQWEsT0FBTyxFQUFFLG9DQUFrQyxFQUFFLGlDQUFpQyxHQUFFLENBQUM7QUFBRSxJQUFFLFVBQVEsS0FBRyxHQUFHLG9CQUFvQixHQUFFLEVBQUUsT0FBTSxJQUFJO0FBQUM7QUFDcFEsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFVLElBQUUsUUFBTTtBQUFFLElBQUUsUUFBTSxFQUFFO0FBQWMsSUFBRSxPQUFLLENBQUE7QUFBRyxLQUFHLENBQUM7QUFBRSxNQUFJQSxLQUFFLEVBQUU7QUFBWSxlQUFXLE9BQU9BLE1BQUcsU0FBT0EsS0FBRSxFQUFFLFVBQVEsR0FBR0EsRUFBQyxLQUFHQSxLQUFFLEdBQUcsQ0FBQyxJQUFFLEtBQUcsRUFBRSxTQUFRLEVBQUUsVUFBUSxHQUFHLEdBQUVBLEVBQUM7QUFBRyxJQUFFLFFBQU0sRUFBRTtBQUFjLEVBQUFBLEtBQUUsRUFBRTtBQUF5QixpQkFBYSxPQUFPQSxPQUFJLEdBQUcsR0FBRSxHQUFFQSxJQUFFLENBQUMsR0FBRSxFQUFFLFFBQU0sRUFBRTtBQUFlLGlCQUFhLE9BQU8sRUFBRSw0QkFBMEIsZUFBYSxPQUFPLEVBQUUsMkJBQXlCLGVBQWEsT0FBTyxFQUFFLDZCQUEyQixlQUFhLE9BQU8sRUFBRSx1QkFBcUIsSUFBRSxFQUFFLE9BQ3JmLGVBQWEsT0FBTyxFQUFFLHNCQUFvQixFQUFFLHNCQUFxQixlQUFhLE9BQU8sRUFBRSw2QkFBMkIsRUFBRSwwQkFBeUIsR0FBRyxNQUFJLEVBQUUsU0FBTyxHQUFHLG9CQUFvQixHQUFFLEVBQUUsT0FBTSxJQUFJLEdBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsRUFBRSxRQUFNLEVBQUU7QUFBZSxpQkFBYSxPQUFPLEVBQUUsc0JBQW9CLEVBQUUsU0FBTztBQUFRO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUc7QUFBQyxRQUFJLElBQUUsSUFBRyxJQUFFO0FBQUU7QUFBRyxXQUFHLEdBQUcsQ0FBQyxHQUFFLElBQUUsRUFBRTtBQUFBLFdBQWE7QUFBRyxRQUFJLElBQUU7QUFBQSxFQUFDLFNBQU9BLElBQUU7QUFBQyxRQUFFLCtCQUE2QkEsR0FBRSxVQUFRLE9BQUtBLEdBQUU7QUFBQSxFQUFLO0FBQUMsU0FBTSxFQUFDLE9BQU0sR0FBRSxRQUFPLEdBQUUsT0FBTSxHQUFFLFFBQU8sS0FBSTtBQUFDO0FBQzFkLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFNBQU0sRUFBQyxPQUFNLEdBQUUsUUFBTyxNQUFLLE9BQU0sUUFBTSxJQUFFLElBQUUsTUFBSyxRQUFPLFFBQU0sSUFBRSxJQUFFLEtBQUk7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFHO0FBQUMsWUFBUSxNQUFNLEVBQUUsS0FBSztBQUFBLEVBQUMsU0FBTyxHQUFFO0FBQUMsZUFBVyxXQUFVO0FBQUMsWUFBTTtBQUFBLElBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQztBQUFDLElBQUksS0FBRyxlQUFhLE9BQU8sVUFBUSxVQUFRO0FBQUksU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRSxHQUFHLElBQUcsQ0FBQztBQUFFLElBQUUsTUFBSTtBQUFFLElBQUUsVUFBUSxFQUFDLFNBQVEsS0FBSTtBQUFFLE1BQUksSUFBRSxFQUFFO0FBQU0sSUFBRSxXQUFTLFdBQVU7QUFBQyxXQUFLLEtBQUcsTUFBRyxLQUFHO0FBQUcsT0FBRyxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUUsU0FBTztBQUFDO0FBQ3JXLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLE1BQUUsR0FBRyxJQUFHLENBQUM7QUFBRSxJQUFFLE1BQUk7QUFBRSxNQUFJLElBQUUsRUFBRSxLQUFLO0FBQXlCLE1BQUcsZUFBYSxPQUFPLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFNLE1BQUUsVUFBUSxXQUFVO0FBQUMsYUFBTyxFQUFFLENBQUM7QUFBQSxJQUFDO0FBQUUsTUFBRSxXQUFTLFdBQVU7Q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UUsU0FBT0EsS0FBRUEsR0FBRSxZQUFVO0FBQUUsTUFBRSxJQUFHLEVBQUU7QUFBRSxVQUFJO0FBQUEsRUFBQztBQUFBLE1BQU0sVUFDdGZBLE1BQUcsSUFBRUEsR0FBRSxZQUFVLEdBQUUsRUFBRSxnQkFBYyxRQUFNLElBQUUsR0FBRSxFQUFFLElBQUcsRUFBRSxHQUFFLE1BQUk7QUFBRSxLQUFHLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxTQUFPLEVBQUU7QUFBSztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFJLE1BQUcsU0FBTyxLQUFHLFNBQU8sS0FBRyxTQUFPLEtBQUcsRUFBRSxRQUFNLEVBQUUsR0FBRSxTQUFPLEtBQUksRUFBRSxTQUFPO0FBQU87QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSUEsS0FBRSxHQUFHLENBQUMsSUFBRSxLQUFHLEVBQUU7QUFBUSxFQUFBQSxLQUFFLEdBQUcsR0FBRUEsRUFBQztBQUFFLEtBQUcsR0FBRSxDQUFDO0FBQUUsTUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUVBLElBQUUsQ0FBQztBQUFFLE1BQUUsR0FBRTtBQUFHLE1BQUcsU0FBTyxLQUFHLENBQUMsR0FBRyxRQUFPLEVBQUUsY0FBWSxFQUFFLGFBQVksRUFBRSxTQUFPLE9BQU0sRUFBRSxTQUFPLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsT0FBRyxLQUFHLEdBQUcsQ0FBQztBQUFFLElBQUUsU0FBTztBQUFFLEtBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLFNBQU8sRUFBRTtBQUFLO0FBQ2xhLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLEdBQUcsQ0FBQyxHQUFFO0FBQUMsUUFBSUEsS0FBRTtBQUFHLE9BQUcsQ0FBQztBQUFBLEVBQUMsTUFBTSxDQUFBQSxLQUFFO0FBQUcsS0FBRyxHQUFFLENBQUM7QUFBRSxNQUFHLFNBQU8sRUFBRSxVQUFVL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UFRLE1BQUcsT0FBSyxJQUFFLEdBQUcsS0FBRSxJQUFFLElBQUUsR0FBRSxFQUFFLFNBQU87QUFBQSxPQUFRO0FBQUMsUUFBRyxTQUFPLEtBQUcsT0FBSyxFQUFFLFFBQU0sS0FBSyxHQUFFLE1BQUksSUFBRSxFQUFFLE9BQU0sU0FBTyxLQUFHO0FBQUMsVUFBRyxPQUFLLEVBQUUsSUFBSSxVQUFPLEVBQUUsaUJBQWUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLGVBQVUsT0FBSyxFQUFFLElBQUksSUFBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLGVBQVUsU0FBTyxFQUFFLE9BQU07QUFBQyxVQUFFLE1BQU0sU0FBTztBQUFFLFlBQUUsRUFBRTtBQUFNO0FBQUEsTUFBUTtBQUFDLFVBQUcsTUFBSSxFQUFFLE9BQU07QUFBRSxhQUFLLFNBQU8sRUFBRSxXQUFTO0FBQUMsWUFBRyxTQUFPLEVBQUUsVUFBUSxFQUFFLFdBQVMsRUFBRSxPQUFNO0FBQUUsWUFBRSxFQUFFO0FBQUEsTUFBTTtBQUFDLFFBQUUsUUFBUSxTQUFPLEVBQUU7QUFBTyxVQUFFLEVBQUU7QUFBQSxJQUFPO0FBQUMsU0FBRztBQUFBLEVBQUM7QUFBQyxJQUFFLEdBQUUsQ0FBQztBQUFFLE1BQUcsT0FBSyxFQUFFLE9BQUssR0FBRyxHQUFFLGdCQUMvZTtBQUFBLE1BQVUsU0FBTztJQUFHLEtBQUs7QUFBVyxVQUFFLEVBQUU7QUFBTSxXQUFJLElBQUUsTUFBSyxTQUFPLElBQUcsS0FBRSxFQUFFLFdBQVUsU0FBTyxLQUFHLFNBQU8sR0FBRyxDQUFDLE1BQUksSUFBRSxJQUFHLElBQUUsRUFBRTtBQUFRLFVBQUU7QUFBRSxlQUFPLEtBQUcsSUFBRSxFQUFFLE9BQU0sRUFBRSxRQUFNLFNBQU8sSUFBRSxFQUFFLFNBQVEsRUFBRSxVQUFRO0FBQU0sU0FBRyxHQUFFLE9BQUcsR0FBRSxHQUFFQSxFQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBWSxVQUFFO0FBQUssVUFBRSxFQUFFO0FBQU0sV0FBSSxFQUFFLFFBQU0sTUFBSyxTQUFPLEtBQUc7QUFBQyxZQUFFLEVBQUU7QUFBVSxZQUFHLFNBQU8sS0FBRyxTQUFPLEdBQUcsQ0FBQyxHQUFFO0FBQUMsWUFBRSxRQUFNO0FBQUU7QUFBQSxRQUFLO0FBQUMsWUFBRSxFQUFFO0FBQVEsVUFBRSxVQUFRO0FBQUUsWUFBRTtBQUFFLFlBQUU7QUFBQSxNQUFDO0FBQUMsU0FBRyxHQUFFLE1BQUcsR0FBRSxNQUFLQSxFQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBVyxTQUFHLEdBQUUsT0FBRyxNQUFLLE1BQUssTUFBTTtBQUFFO0FBQUEsSUFBTTtBQUFRLFFBQUUsZ0JBQWM7QUFBQSxFQUFJO0FBQUMsU0FBTyxFQUFFO0FBQUs7QUFDN2QsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLFNBQUssRUFBRSxPQUFLLE1BQUksU0FBTyxNQUFJLEVBQUUsWUFBVSxNQUFLLEVBQUUsWUFBVSxNQUFLLEVBQUUsU0FBTztBQUFFO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsV0FBTyxNQUFJLEVBQUUsZUFBYSxFQUFFO0FBQWMsUUFBSSxFQUFFO0FBQU0sTUFBRyxPQUFLLElBQUUsRUFBRSxZQUFZLFFBQU87QUFBSyxNQUFHLFNBQU8sS0FBRyxFQUFFLFVBQVEsRUFBRSxNQUFNLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUcsU0FBTyxFQUFFLE9BQU07QUFBQyxRQUFFLEVBQUU7QUFBTSxRQUFFLEdBQUcsR0FBRSxFQUFFLFlBQVk7QUFBRSxNQUFFLFFBQU07QUFBRSxTQUFJLEVBQUUsU0FBTyxHQUFFLFNBQU8sRUFBRSxVQUFTLEtBQUUsRUFBRSxTQUFRLElBQUUsRUFBRSxVQUFRLEdBQUcsR0FBRSxFQUFFLFlBQVksR0FBRSxFQUFFLFNBQU87QUFBRSxNQUFFLFVBQVE7QUFBQSxFQUFJO0FBQUMsU0FBTyxFQUFFO0FBQUs7QUFDOWEsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsVUFBTyxFQUFFLEtBQUc7QUFBQSxJQUFFLEtBQUs7QUFBRSxTQUFHLENBQUM7QUFBR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SxFQUFFLENBQUMsR0FBRSxHQUFFLEdBQUcsSUFBRSxFQUFFLE9BQU0sT0FBSyxJQUFFLFVBQVEsT0FBSyxJQUFFLFFBQU0sRUFBRSxRQUFNLElBQUUsU0FBTyxLQUFJLEtBQUc7QUFBQSxJQUFLLEtBQUs7QUFBRSxhQUFPLEdBQUcsQ0FBQyxHQUFFO0FBQUEsSUFBSyxLQUFLO0FBQUcsUUFBRSxDQUFDO0FBQUUsVUFBRSxFQUFFO0FBQWMsVUFBRyxTQUFPLEtBQUcsU0FBTyxFQUFFLFlBQVc7QUFBQyxZQUFHLFNBQU8sRUFBRSxVQUFVLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLFdBQUU7QUFBQSxNQUFFO0FBQUMsVUFBRSxFQUFFO0FBQU0sYUFBTyxJQUFFLFNBQU8sRUFBRSxRQUFNLElBQUUsU0FBTyxLQUFJLEtBQUc7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPLEVBQUUsQ0FBQyxHQUFFO0FBQUEsSUFBSyxLQUFLO0FBQUUsYUFBTyxHQUFFLEdBQUc7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPLEdBQUcsRUFBRSxLQUFLLFFBQVEsR0FBRTtBQUFBLElBQUssS0FBSztBQUFBLElBQUcsS0FBSztBQUFHLGFBQU8sR0FBRSxHQUM1Z0I7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPO0FBQUEsSUFBSztBQUFRLGFBQU87QUFBQSxFQUFJO0FBQUM7QUFBQyxJQUFJLEtBQUcsT0FBRyxJQUFFLE9BQUcsS0FBRyxlQUFhLE9BQU8sVUFBUSxVQUFRLEtBQUksSUFBRTtBQUFLLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFJLE1BQUcsU0FBTyxFQUFFLEtBQUcsZUFBYSxPQUFPLEVBQUUsS0FBRztBQUFDLE1BQUUsSUFBSTtBQUFBLEVBQUMsU0FBTyxHQUFFO0FBQUMsTUFBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQSxNQUFNLEdBQUUsVUFBUTtBQUFJO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRztBQUFDLE1BQUM7QUFBQSxFQUFFLFNBQU8sR0FBRTtBQUFDLE1BQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxJQUFJLEtBQUc7QUFDeFIsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE9BQUc7QUFBRyxNQUFFLEdBQUU7QUFBRyxNQUFHLEdBQUcsQ0FBQyxHQUFFO0FBQUMsUUFBRyxvQkFBbUIsRUFBRSxLQUFJLElBQUUsRUFBQyxPQUFNLEVBQUUsZ0JBQWUsS0FBSSxFQUFFLGFBQVk7QUFBQSxRQUFPLElBQUU7QUFBQyxXQUFHLElBQUUsRUFBRSxrQkFBZ0IsRUFBRSxlQUFhO0FBQU8sVUFBSSxJQUFFLEVBQUUsZ0JBQWMsRUFBRTtBQUFlLFVBQUcsS0FBRyxNQUFJLEVBQUUsWUFBVztBQUFDLFlBQUUsRUFBRTtBQUFXLFlBQUksSUFBRSxFQUFFLGNBQWFBLEtBQUUsRUFBRTtBQUFVLFlBQUUsRUFBRTtBQUFZLFlBQUc7QUFBQyxZQUFFLFVBQVNBLEdBQUU7QUFBQSxRQUFRLFNBQU91QixJQUFFO0FBQUMsY0FBRTtBQUFLLGdCQUFNO0FBQUEsUUFBQztBQUFDLFlBQUksSUFBRSxHQUFFLElBQUUsSUFBR3hCLEtBQUUsSUFBR2xCLEtBQUUsR0FBRW9CLEtBQUUsR0FBRWpCLEtBQUUsR0FBRUMsS0FBRTtBQUFLLFVBQUUsWUFBTztBQUFDLG1CQUFRcUMsUUFBSTtBQUFDLFlBQUF0QyxPQUFJLEtBQUcsTUFBSSxLQUFHLE1BQUlBLEdBQUUsYUFBVyxJQUFFLElBQUU7QUFBRyxZQUFBQSxPQUFJZ0IsTUFBRyxNQUFJLEtBQUcsTUFBSWhCLEdBQUUsYUFBV2UsS0FBRSxJQUFFO0FBQUcsa0JBQUlmLEdBQUUsYUFBVyxLQUNuZkEsR0FBRSxVQUFVO0FBQVEsZ0JBQUcsVUFBUXNDLEtBQUV0QyxHQUFFLFlBQVk7QUFBTSxZQUFBQyxLQUFFRDtBQUFFLFlBQUFBLEtBQUVzQztBQUFBLFVBQUM7QUFBQyxxQkFBTztBQUFDLGdCQUFHdEMsT0FBSSxFQUFFLE9BQU07QUFBRSxZQUFBQyxPQUFJLEtBQUcsRUFBRUosT0FBSSxNQUFJLElBQUU7QUFBRyxZQUFBSSxPQUFJZSxNQUFHLEVBQUVDLE9BQUksTUFBSUYsS0FBRTtBQUFHLGdCQUFHLFVBQVF1QixLQUFFdEMsR0FBRSxhQUFhO0FBQU0sWUFBQUEsS0FBRUM7QUFBRSxZQUFBQSxLQUFFRCxHQUFFO0FBQUEsVUFBVTtBQUFDLFVBQUFBLEtBQUVzQztBQUFBLFFBQUM7QUFBQyxZQUFFLE9BQUssS0FBRyxPQUFLdkIsS0FBRSxPQUFLLEVBQUMsT0FBTSxHQUFFLEtBQUlBLEdBQUM7QUFBQSxNQUFDLE1BQU0sS0FBRTtBQUFBLElBQUk7QUFBQyxRQUFFLEtBQUcsRUFBQyxPQUFNLEdBQUUsS0FBSSxFQUFDO0FBQUEsRUFBQyxNQUFNLEtBQUU7QUFBSyxPQUFHLEVBQUMsYUFBWSxHQUFFLGdCQUFlLEVBQUM7QUFBRSxPQUFHO0FBQUcsT0FBSSxJQUFFLEdBQUUsU0FBTyxJQUFHLEtB
25114QUcsSUFBRSxHQUFFLElBQUUsRUFBRSxPQUFNLE9BQUssRUFBRSxlQUFhLFNBQU8sU0FBTyxFQUFFLEdBQUUsU0FBTyxHQUFFLElBQUU7QUFBQSxNQUFPLFFBQUssU0FBTyxLQUFHO0FBQUMsUUFBRTtBQUFFLFFBQUc7QUFBQyxVQUFJakIsS0FBRSxFQUFFO0FBQVUsVUFBRyxPQUFLLEVBQUUsUUFBTSxNQUFNLFNBQU8sRUFBRSxLQUFHO0FBQUEsUUFBRSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUEsUUFBRyxLQUFLO0FBQUc7QUFBQSxRQUN4ZixLQUFLO0FBQUUsY0FBRyxTQUFPQSxJQUFFO0FBQUMsZ0JBQUlzQyxLQUFFdEMsR0FBRSxlQUFjMEMsS0FBRTFDLEdBQUUsZUFBY3FDLEtBQUUsRUFBRSxXQUFVRCxLQUFFQyxHQUFFLHdCQUF3QixFQUFFLGdCQUFjLEVBQUUsT0FBS0MsS0FBRSxHQUFHLEVBQUUsTUFBS0EsRUFBQyxHQUFFSSxFQUFDO0FBQUUsWUFBQUwsR0FBRSxzQ0FBb0NEO0FBQUEsVUFBQztBQUFDO0FBQUEsUUFBTSxLQUFLO0FBQUUsY0FBSUcsS0FBRSxFQUFFLFVBQVU7QUFBYyxnQkFBSUEsR0FBRSxXQUFTQSxHQUFFLGNBQVksS0FBRyxNQUFJQSxHQUFFLFlBQVVBLEdBQUUsbUJBQWlCQSxHQUFFLFlBQVlBLEdBQUUsZUFBZTtBQUFFO0FBQUEsUUFBTSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUc7QUFBQSxRQUFNO0FBQVEsZ0JBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLE1BQUU7QUFBQSxJQUFDLFNBQU9FLElBQUU7QUFBQyxRQUFFLEdBQUUsRUFBRSxRQUFPQSxFQUFDO0FBQUEsSUFBQztBQUFDLFFBQUUsRUFBRTtBQUFRLFFBQUcsU0FBTyxHQUFFO0FBQUMsUUFBRSxTQUFPLEVBQUU7QUFBTyxVQUFFO0FBQUU7QUFBQSxJQUFLO0FBQUMsUUFBRSxFQUFFO0FBQUEsRUFBTTtBQUFDLEVBQUF6QyxLQUFFO0FBQUcsT0FBRztBQUFHLFNBQU9BO0FBQUM7QUFDM2YsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBWSxNQUFFLFNBQU8sSUFBRSxFQUFFLGFBQVc7QUFBSyxNQUFHLFNBQU8sR0FBRTtBQUFDLFFBQUksSUFBRSxJQUFFLEVBQUU7QUFBSyxPQUFFO0FBQUMsV0FBSSxFQUFFLE1BQUksT0FBSyxHQUFFO0FBQUMsWUFBSWtCLEtBQUUsRUFBRTtBQUFRLFVBQUUsVUFBUTtBQUFPLG1CQUFTQSxNQUFHLEdBQUcsR0FBRSxHQUFFQSxFQUFDO0FBQUEsTUFBQztBQUFDLFVBQUUsRUFBRTtBQUFBLElBQUksU0FBTyxNQUFJO0FBQUEsRUFBRTtBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUUsRUFBRTtBQUFZLE1BQUUsU0FBTyxJQUFFLEVBQUUsYUFBVztBQUFLLE1BQUcsU0FBTyxHQUFFO0FBQUMsUUFBSSxJQUFFLElBQUUsRUFBRTtBQUFLLE9BQUU7QUFBQyxXQUFJLEVBQUUsTUFBSSxPQUFLLEdBQUU7QUFBQyxZQUFJLElBQUUsRUFBRTtBQUFPLFVBQUUsVUFBUSxFQUFDO0FBQUEsTUFBRTtBQUFDLFVBQUUsRUFBRTtBQUFBLElBQUksU0FBTyxNQUFJO0FBQUEsRUFBRTtBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFJLE1BQUcsU0FBTyxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBVSxZQUFPLEVBQUUsS0FBRztBQUFBLE1BQUUsS0FBSztBQUFFLFlBQUU7QUFBRTtBQUFBLE1BQU07QUFBUSxZQUFFO0FBQUEsSUFBQztBQUFDLG1CQUFhLE9BQU8sSUFBRSxFQUFFLENBQUMsSUFBRSxFQUFFLFVBQVE7QUFBQSxFQUFDO0FBQUM7QUFDbGYsU0FBUyxHQUFHLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFVLFdBQU8sTUFBSSxFQUFFLFlBQVUsTUFBSyxHQUFHLENBQUM7QUFBRyxJQUFFLFFBQU07QUFBSyxJQUFFLFlBQVU7QUFBSyxJQUFFLFVBQVE7QUFBSyxRQUFJLEVBQUUsUUFBTSxJQUFFLEVBQUUsV0FBVSxTQUFPLE1BQUksT0FBTyxFQUFFLEVBQUUsR0FBRSxPQUFPLEVBQUUsRUFBRSxHQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRSxPQUFPLEVBQUUsRUFBRTtBQUFJLElBQUUsWUFBVTtBQUFLLElBQUUsU0FBTztBQUFLLElBQUUsZUFBYTtBQUFLLElBQUUsZ0JBQWM7QUFBSyxJQUFFLGdCQUFjO0FBQUssSUFBRSxlQUFhO0FBQUssSUFBRSxZQUFVO0FBQUssSUFBRSxjQUFZO0FBQUk7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLFNBQU8sTUFBSSxFQUFFLE9BQUssTUFBSSxFQUFFLE9BQUssTUFBSSxFQUFFO0FBQUc7QUFDbmEsU0FBUyxHQUFHLEdBQUU7QUFBQyxJQUFFLFlBQU87QUFBQyxXQUFLLFNBQU8sRUFBRSxXQUFTO0FBQUMsVUFBRyxTQUFPLEVBQUUsVUFBUSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQU87QUFBSyxVQUFFLEVBQUU7QUFBQSxJQUFNO0FBQUMsTUFBRSxRQUFRLFNBQU8sRUFBRTtBQUFPLFNBQUksSUFBRSxFQUFFLFNBQVEsTUFBSSxFQUFFLE9BQUssTUFBSSxFQUFFLE9BQUssT0FBSyxFQUFFLE9BQUs7QUFBQyxVQUFHLEVBQUUsUUFBTSxFQUFFLFVBQVM7QUFBRSxVQUFHLFNBQU8sRUFBRSxTQUFPLE1BQUksRUFBRSxJQUFJLFVBQVM7QUFBQSxVQUFPLEdBQUUsTUFBTSxTQUFPLEdBQUUsSUFBRSxFQUFFO0FBQUEsSUFBSztBQUFDLFFBQUcsRUFBRSxFQUFFLFFBQU0sR0FBRyxRQUFPLEVBQUU7QUFBQSxFQUFTO0FBQUM7QUFDelQsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBSSxNQUFHLE1BQUksS0FBRyxNQUFJLEVBQUUsS0FBRSxFQUFFLFdBQVUsSUFBRSxNQUFJLEVBQUUsV0FBUyxFQUFFLFdBQVcsYUFBYSxHQUFFLENBQUMsSUFBRSxFQUFFLGFBQWEsR0FBRSxDQUFDLEtBQUcsTUFBSSxFQUFFLFlBQVUsSUFBRSxFQUFFLFlBQVcsRUFBRSxhQUFhLEdBQUUsQ0FBQyxNQUFJLElBQUUsR0FBRSxFQUFFLFlBQVksQ0FBQyxJQUFHLElBQUUsRUFBRSxxQkFBb0IsU0FBTyxLQUFHLFdBQVMsS0FBRyxTQUFPLEVBQUUsWUFBVSxFQUFFLFVBQVE7QUFBQSxXQUFhLE1BQUksTUFBSSxJQUFFLEVBQUUsT0FBTSxTQUFPLEdBQUcsTUFBSSxHQUFHLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRSxFQUFFLFNBQVEsU0FBTyxJQUFHLElBQUcsR0FBRSxHQUFFLENBQUMsR0FBRSxJQUFFLEVBQUU7QUFBTztBQUMxWCxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFJLE1BQUcsTUFBSSxLQUFHLE1BQUksRUFBRSxLQUFFLEVBQUUsV0FBVSxJQUFFLEVBQUUsYUFBYSxHQUFFLENBQUMsSUFBRSxFQUFFLFlBQVksQ0FBQztBQUFBLFdBQVUsTUFBSSxNQUFJLElBQUUsRUFBRSxPQUFNLFNBQU8sR0FBRyxNQUFJLEdBQUcsR0FBRSxHQU
25114FFLENBQUMsR0FBRSxJQUFFLEVBQUUsU0FBUSxTQUFPLElBQUcsSUFBRyxHQUFFLEdBQUUsQ0FBQyxHQUFFLElBQUUsRUFBRTtBQUFPO0FBQUMsSUFBSWMsTUFBRSxNQUFLLEtBQUc7QUFBRyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxPQUFJLElBQUUsRUFBRSxPQUFNLFNBQU8sSUFBRyxJQUFHLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRSxFQUFFO0FBQU87QUFDblIsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxNQUFJLGVBQWEsT0FBTyxHQUFHLHFCQUFxQixLQUFHO0FBQUMsT0FBRyxxQkFBcUIsSUFBRyxDQUFDO0FBQUEsRUFBQyxTQUFPLEdBQUU7QUFBQSxFQUFBO0FBQUUsVUFBTyxFQUFFO0lBQUssS0FBSztBQUFFLFdBQUcsR0FBRyxHQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRSxVQUFJLElBQUVBLEtBQUUsSUFBRTtBQUFHQSxZQUFFO0FBQUssU0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFQSxZQUFFO0FBQUUsV0FBRztBQUFFLGVBQU9BLFFBQUksTUFBSSxJQUFFQSxLQUFFLElBQUUsRUFBRSxXQUFVLE1BQUksRUFBRSxXQUFTLEVBQUUsV0FBVyxZQUFZLENBQUMsSUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFHQSxJQUFFLFlBQVksRUFBRSxTQUFTO0FBQUc7QUFBQSxJQUFNLEtBQUs7QUFBRyxlQUFPQSxRQUFJLE1BQUksSUFBRUEsS0FBRSxJQUFFLEVBQUUsV0FBVSxNQUFJLEVBQUUsV0FBUyxHQUFHLEVBQUUsWUFBVyxDQUFDLElBQUUsTUFBSSxFQUFFLFlBQVUsR0FBRyxHQUFFLENBQUMsR0FBRSxHQUFHLENBQUMsS0FBRyxHQUFHQSxLQUFFLEVBQUUsU0FBUztBQUFHO0FBQUEsSUFBTSxLQUFLO0FBQUUsVUFBRUE7QUFBRSxVQUFFO0FBQUdBLFlBQUUsRUFBRSxVQUFVO0FBQWMsV0FBRztBQUNsZixTQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUVBLFlBQUU7QUFBRSxXQUFHO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBQSxJQUFFLEtBQUs7QUFBQSxJQUFHLEtBQUs7QUFBQSxJQUFHLEtBQUs7QUFBRyxVQUFHLENBQUMsTUFBSSxJQUFFLEVBQUUsYUFBWSxTQUFPLE1BQUksSUFBRSxFQUFFLFlBQVcsU0FBTyxLQUFJO0FBQUMsWUFBRSxJQUFFLEVBQUU7QUFBSyxXQUFFO0FBQUMsY0FBSWQsS0FBRSxHQUFFLElBQUVBLEdBQUU7QUFBUSxVQUFBQSxLQUFFQSxHQUFFO0FBQUkscUJBQVMsTUFBSSxPQUFLQSxLQUFFLEtBQUcsR0FBRyxHQUFFLEdBQUUsQ0FBQyxJQUFFLE9BQUtBLEtBQUUsTUFBSSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUcsY0FBRSxFQUFFO0FBQUEsUUFBSSxTQUFPLE1BQUk7QUFBQSxNQUFFO0FBQUMsU0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFO0FBQUEsSUFBTSxLQUFLO0FBQUUsVUFBRyxDQUFDLE1BQUksR0FBRyxHQUFFLENBQUMsR0FBRSxJQUFFLEVBQUUsV0FBVSxlQUFhLE9BQU8sRUFBRSxzQkFBc0IsS0FBRztBQUFDLFVBQUUsUUFBTSxFQUFFLGVBQWMsRUFBRSxRQUFNLEVBQUUsZUFBYyxFQUFFLHFCQUFvQjtBQUFBLE1BQUUsU0FBTyxHQUFFO0FBQUMsVUFBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLE1BQUM7QUFBQyxTQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBRyxTQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBRyxRQUFFLE9BQUssS0FBRyxLQUFHLElBQUUsTUFBSSxTQUNoZixFQUFFLGVBQWMsR0FBRyxHQUFFLEdBQUUsQ0FBQyxHQUFFLElBQUUsS0FBRyxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUU7QUFBQSxJQUFNO0FBQVEsU0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUU7QUFBWSxNQUFHLFNBQU8sR0FBRTtBQUFDLE1BQUUsY0FBWTtBQUFLLFFBQUksSUFBRSxFQUFFO0FBQVUsYUFBTyxNQUFJLElBQUUsRUFBRSxZQUFVLElBQUk7QUFBSSxNQUFFLFFBQVEsU0FBU1UsSUFBRTtBQUFDLFVBQUksSUFBRSxHQUFHLEtBQUssTUFBSyxHQUFFQSxFQUFDO0FBQUUsUUFBRSxJQUFJQSxFQUFDLE1BQUksRUFBRSxJQUFJQSxFQUFDLEdBQUVBLEdBQUUsS0FBSyxHQUFFLENBQUM7QUFBQSxJQUFFLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFDelEsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQVUsTUFBRyxTQUFPLEVBQUUsVUFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sS0FBSTtBQUFDLFFBQUksSUFBRSxFQUFFLENBQUM7QUFBRSxRQUFHO0FBQUMsVUFBSVYsS0FBRSxHQU
25114FFLElBQUUsR0FBRSxJQUFFO0FBQUUsUUFBRSxRQUFLLFNBQU8sS0FBRztBQUFDLGdCQUFPLEVBQUU7VUFBSyxLQUFLO0FBQUVjLGtCQUFFLEVBQUU7QUFBVSxpQkFBRztBQUFHLGtCQUFNO0FBQUEsVUFBRSxLQUFLO0FBQUVBLGtCQUFFLEVBQUUsVUFBVTtBQUFjLGlCQUFHO0FBQUcsa0JBQU07QUFBQSxVQUFFLEtBQUs7QUFBRUEsa0JBQUUsRUFBRSxVQUFVO0FBQWMsaUJBQUc7QUFBRyxrQkFBTTtBQUFBLFFBQUM7QUFBQyxZQUFFLEVBQUU7QUFBQSxNQUFNO0FBQUMsVUFBRyxTQUFPQSxJQUFFLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLFNBQUdkLElBQUUsR0FBRSxDQUFDO0FBQUVjLFlBQUU7QUFBSyxXQUFHO0FBQUcsVUFBSWYsS0FBRSxFQUFFO0FBQVUsZUFBT0EsT0FBSUEsR0FBRSxTQUFPO0FBQU0sUUFBRSxTQUFPO0FBQUEsSUFBSSxTQUFPbEIsSUFBRTtBQUFDLFFBQUUsR0FBRSxHQUFFQSxFQUFDO0FBQUEsSUFBQztBQUFBLEVBQUM7QUFBQyxNQUFHLEVBQUUsZUFBYSxNQUFNLE1BQUksSUFBRSxFQUFFLE9BQU0sU0FBTyxJQUFHLElBQUcsR0FBRSxDQUFDLEdBQUUsSUFBRSxFQUFFO0FBQU87QUFDamUsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFLFdBQVUsSUFBRSxFQUFFO0FBQU0sVUFBTyxFQUFFLEtBQUc7QUFBQSxJQUFFLEtBQUs7QUFBQSxJQUFFLEtBQUs7QUFBQSxJQUFHLEtBQUs7QUFBQSxJQUFHLEtBQUs7QUFBRyxTQUFHLEdBQUUsQ0FBQztBQUFFLFNBQUcsQ0FBQztBQUFFLFVBQUcsSUFBRSxHQUFFO0FBQUMsWUFBRztBQUFDLGFBQUcsR0FBRSxHQUFFLEVBQUUsTUFBTSxHQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUEsUUFBQyxTQUFPdUMsSUFBRTtBQUFDLFlBQUUsR0FBRSxFQUFFLFFBQU9BLEVBQUM7QUFBQSxRQUFDO0FBQUMsWUFBRztBQUFDLGFBQUcsR0FBRSxHQUFFLEVBQUUsTUFBTTtBQUFBLFFBQUMsU0FBT0EsSUFBRTtBQUFDLFlBQUUsR0FBRSxFQUFFLFFBQU9BLEVBQUM7QUFBQSxRQUFDO0FBQUEsTUFBQztBQUFDO0FBQUEsSUFBTSxLQUFLO0FBQUUsU0FBRyxHQUFFLENBQUM7QUFBRSxTQUFHLENBQUM7QUFBRSxVQUFFLE9BQUssU0FBTyxLQUFHLEdBQUcsR0FBRSxFQUFFLE1BQU07QUFBRTtBQUFBLElBQU0sS0FBSztBQUFFLFNBQUcsR0FBRSxDQUFDO0FBQUUsU0FBRyxDQUFDO0FBQUUsVUFBRSxPQUFLLFNBQU8sS0FBRyxHQUFHLEdBQUUsRUFBRSxNQUFNO0FBQUUsVUFBRyxFQUFFLFFBQU0sSUFBRztBQUFDLFlBQUksSUFBRSxFQUFFO0FBQVUsWUFBRztBQUFDLGFBQUcsR0FBRSxFQUFFO0FBQUEsUUFBQyxTQUFPQSxJQUFFO0FBQUMsWUFBRSxHQUFFLEVBQUUsUUFBT0EsRUFBQztBQUFBLFFBQUM7QUFBQSxNQUFDO0FBQUMsVUFBRyxJQUFFLE1BQUksSUFBRSxFQUFFLFdBQVUsUUFBTSxJQUFHO0FBQUMsWUFBSXBCLEtBQUUsRUFBRSxlQUFjLElBQUUsU0FBTyxJQUFFLEVBQUUsZ0JBQWNBLElBQUUsSUFBRSxFQUFFLE1BQUtELEtBQUUsRUFBRTtBQUNwZixVQUFFLGNBQVk7QUFBSyxZQUFHLFNBQU9BLEdBQUUsS0FBRztBQUFDLHNCQUFVLEtBQUcsWUFBVUMsR0FBRSxRQUFNLFFBQU1BLEdBQUUsUUFBTSxHQUFHLEdBQUVBLEVBQUM7QUFBRSxhQUFHLEdBQUUsQ0FBQztBQUFFLGNBQUluQixLQUFFLEdBQUcsR0FBRW1CLEVBQUM7QUFBRSxlQUFJLElBQUUsR0FBRSxJQUFFRCxHQUFFLFFBQU8sS0FBRyxHQUFFO0FBQUMsZ0JBQUlFLEtBQUVGLEdBQUUsQ0FBQyxHQUFFZixLQUFFZSxHQUFFLElBQUUsQ0FBQztBQUFFLHdCQUFVRSxLQUFFLEdBQUcsR0FBRWpCLEVBQUMsSUFBRSw4QkFBNEJpQixLQUFFLEdBQUcsR0FBRWpCLEVBQUMsSUFBRSxlQUFhaUIsS0FBRSxHQUFHLEdBQUVqQixFQUFDLElBQUUsR0FBRyxHQUFFaUIsSUFBRWpCLElBQUVILEVBQUM7QUFBQSxVQUFDO0FBQUMsa0JBQU8sR0FBQztBQUFBLFlBQUUsS0FBSztBQUFRLGlCQUFHLEdBQUVtQixFQUFDO0FBQUU7QUFBQSxZQUFNLEtBQUs7QUFBVyxpQkFBRyxHQU
25114FFQSxFQUFDO0FBQUU7QUFBQSxZQUFNLEtBQUs7QUFBUyxrQkFBSWYsS0FBRSxFQUFFLGNBQWM7QUFBWSxnQkFBRSxjQUFjLGNBQVksQ0FBQyxDQUFDZSxHQUFFO0FBQVMsa0JBQUlzQixLQUFFdEIsR0FBRTtBQUFNLHNCQUFNc0IsS0FBRSxHQUFHLEdBQUUsQ0FBQyxDQUFDdEIsR0FBRSxVQUFTc0IsSUFBRSxLQUFFLElBQUVyQyxPQUFJLENBQUMsQ0FBQ2UsR0FBRSxhQUFXLFFBQU1BLEdBQUUsZUFBYTtBQUFBLGdCQUFHO0FBQUEsZ0JBQUUsQ0FBQyxDQUFDQSxHQUFFO0FBQUEsZ0JBQ25mQSxHQUFFO0FBQUEsZ0JBQWE7QUFBQSxjQUFFLElBQUUsR0FBRyxHQUFFLENBQUMsQ0FBQ0EsR0FBRSxVQUFTQSxHQUFFLFdBQVMsQ0FBQSxJQUFHLElBQUcsS0FBRTtBQUFBLFVBQUU7QUFBQyxZQUFFLEVBQUUsSUFBRUE7QUFBQSxRQUFDLFNBQU9vQixJQUFFO0FBQUMsWUFBRSxHQUFFLEVBQUUsUUFBT0EsRUFBQztBQUFBLFFBQUM7QUFBQSxNQUFDO0FBQUM7QUFBQSxJQUFNLEtBQUs7QUFBRSxTQUFHLEdBQUUsQ0FBQztBQUFFLFNBQUcsQ0FBQztBQUFFLFVBQUcsSUFBRSxHQUFFO0FBQUMsWUFBRyxTQUFPLEVBQUUsVUFBVSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxZQUFFLEVBQUU7QUFBVSxRQUFBcEIsS0FBRSxFQUFFO0FBQWMsWUFBRztBQUFDLFlBQUUsWUFBVUE7QUFBQSxRQUFDLFNBQU9vQixJQUFFO0FBQUMsWUFBRSxHQUFFLEVBQUUsUUFBT0EsRUFBQztBQUFBLFFBQUM7QUFBQSxNQUFDO0FBQUM7QUFBQSxJQUFNLEtBQUs7QUFBRSxTQUFHLEdBQUUsQ0FBQztBQUFFLFNBQUcsQ0FBQztBQUFFLFVBQUcsSUFBRSxLQUFHLFNBQU8sS0FBRyxFQUFFLGNBQWMsYUFBYSxLQUFHO0FBQUMsV0FBRyxFQUFFLGFBQWE7QUFBQSxNQUFDLFNBQU9BLElBQUU7QUFBQyxVQUFFLEdBQUUsRUFBRSxRQUFPQSxFQUFDO0FBQUEsTUFBQztBQUFDO0FBQUEsSUFBTSxLQUFLO0FBQUUsU0FBRyxHQUFFLENBQUM7QUFBRSxTQUFHLENBQUM7QUFBRTtBQUFBLElBQU0sS0FBSztBQUFHLFNBQUcsR0FBRSxDQUFDO0FBQUUsU0FBRyxDQUFDO0FBQUUsVUFBRSxFQUFFO0FBQU0sUUFBRSxRQUFNLFNBQU9wQixLQUFFLFNBQU8sRUFBRSxlQUFjLEVBQUUsVUFBVSxXQUFTQSxJQUFFLENBQUNBLE1BQ2xmLFNBQU8sRUFBRSxhQUFXLFNBQU8sRUFBRSxVQUFVLGtCQUFnQixLQUFHLEVBQUM7QUFBSyxVQUFFLEtBQUcsR0FBRyxDQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBRyxNQUFBQyxLQUFFLFNBQU8sS0FBRyxTQUFPLEVBQUU7QUFBYyxRQUFFLE9BQUssS0FBRyxLQUFHcEIsS0FBRSxNQUFJb0IsSUFBRSxHQUFHLEdBQUUsQ0FBQyxHQUFFLElBQUVwQixNQUFHLEdBQUcsR0FBRSxDQUFDO0FBQUUsU0FBRyxDQUFDO0FBQUUsVUFBRyxJQUFFLE1BQUs7QUFBQyxRQUFBQSxLQUFFLFNBQU8sRUFBRTtBQUFjLGFBQUksRUFBRSxVQUFVLFdBQVNBLE9BQUksQ0FBQ29CLE1BQUcsT0FBSyxFQUFFLE9BQUssR0FBRyxNQUFJLElBQUUsR0FBRUEsS0FBRSxFQUFFLE9BQU0sU0FBT0EsTUFBRztBQUFDLGVBQUlqQixLQUFFLElBQUVpQixJQUFFLFNBQU8sS0FBRztBQUFDLFlBQUFoQixLQUFFO0FBQUUsWUFBQXFDLEtBQUVyQyxHQUFFO0FBQU0sb0JBQU9BLEdBQUUsS0FBRztBQUFBLGNBQUUsS0FBSztBQUFBLGNBQUUsS0FBSztBQUFBLGNBQUcsS0FBSztBQUFBLGNBQUcsS0FBSztBQUFHLG1CQUFHLEdBQUVBLElBQUVBLEdBQUUsTUFBTTtBQUFFO0FBQUEsY0FBTSxLQUFLO0FBQUUsbUJBQUdBLElBQUVBLEdBQUUsTUFBTTtBQUFFLG9CQUFJSCxLQUFFRyxHQUFFO0FBQVUsb0JBQUcsZUFBYSxPQUFPSCxHQUFFLHNCQUFxQjtBQUFDLHNCQUFFRztBQUFFLHNCQUFFQSxHQUFFO0FBQU8sc0JBQUc7QUFBQyx3QkFBRSxHQUFFSCxHQUFFLFFBQ3BmLEVBQUUsZUFBY0EsR0FBRSxRQUFNLEVBQUUsZUFBY0EsR0FBRSxxQkFBb0I7QUFBQSxrQkFBRSxTQUFPc0MsSUFBRTtBQUFDLHNCQUFFLEdBQUUsR0FBRUEsRUFBQztBQUFBLGtCQUFDO0FBQUEsZ0JBQUM7QUFBQztBQUFBLGNBQU0sS0FBSztBQUFFLG1CQUFHbkMsSUFBRUEsR0FBRSxNQUFNO0FBQUU7QUFBQSxjQUFNLEtBQUs7QUFBRyxvQkFBRyxTQUFPQSxHQUFFLGVBQWM7QUFBQyxxQkFBR0QsRUFBQztBQUFFO0FBQUEsZ0JBQVE7QUFBQSxZQUFDO0FBQUMscUJBQU9zQyxNQUFHQSxHQUFFLFNBQU9yQyxJQUFFLElBQUVxQyxNQUFHLEdBQUd0QyxFQUFDO0FBQUEsVUFBQztBQUFDLFVBQUFpQixLQUFFQSxHQUFFO0FBQUEsUUFBTztBQUFDLFVBQUUsTUFBSUEsS0FBRSxNQUFLakIsS0FBRSxPQUFJO0FBQUMsY0FBRyxNQUFJQSxHQUFFLEtBQUk7QUFBQyxnQkFBRyxTQUFPaUIsSUFBRTtBQUFDLGNBQUFBLEtBQUVqQjtBQUFFLGtCQUFHO0FBQUMsb0JBQUVBLEdBQUUsV0FBVUgsTUFBR21CLEtBQUUsRUFBRSxPQUFNLGVBQWEsT0FBT0EsR0FBRSxjQUFZQSxHQUFFLFlBQVksV0FBVSxRQUFPLFdBQVcsSUFBRUEsR0FBRSxVQUFRLFdBQVMsSUFBRWhCLEdBQUUsV0FBVWUsS0FBRWYsR0FBRSxjQUFjLE9BQU0sSUFBRSxXQUFTZSxNQUFHLFNBQU9BLE1BQUdBLEdBQUUsZUFBZSxTQUFTLElBQUVBLEdBQUUsVUFBUSxNQUFLLEVBQUUsTUFBTSxVQUN6ZixHQUFHLFdBQVUsQ0FBQztBQUFBLGNBQUUsU0FBT3FCLElBQUU7QUFBQyxrQkFBRSxHQUFFLEVBQUUsUUFBT0EsRUFBQztBQUFBLGNBQUM7QUFBQSxZQUFDO0FBQUEsVUFBQyxXQUFTLE1BQUlwQyxHQUFFLEtBQUk7QUFBQyxnQkFBRyxTQUFPaUIsR0FBRSxLQUFHO0FBQUMsY0FBQWpCLEdBQUUsVUFBVSxZQUFVSCxLQUFFLEtBQUdHLEdBQUU7QUFBQSxZQUFhLFNBQU9vQyxJQUFFO0FBQUMsZ0JBQUUsR0FBRSxFQUFFLFFBQU9BLEVBQUM7QUFBQSxZQUFDO0FBQUEsVUFBQyxZQUFVLE9BQUtwQyxHQUFFLE9BQUssT0FBS0EsR0FBRSxPQUFLLFNBQU9BLEdBQUUsaUJBQWVBLE9BQUksTUFBSSxTQUFPQSxHQUFFLE9BQU07QUFBQyxZQUFBQSxHQUFFLE1BQU0sU0FBT0E7QUFBRSxZQUFBQSxLQUFFQSxHQUFFO0FBQU07QUFBQSxVQUFRO0FBQUMsY0FBR0EsT0FBSSxFQUFFLE9BQU07QUFBRSxpQkFBSyxTQUFPQSxHQUFFLFdBQVM7QUFBQyxnQkFBRyxTQUFPQSxHQUFFLFVBQVFBLEdBQUUsV0FBUyxFQUFFLE9BQU07QUFBRSxZQUFB
25114aUIsT0FBSWpCLE9BQUlpQixLQUFFO0FBQU0sWUFBQWpCLEtBQUVBLEdBQUU7QUFBQSxVQUFNO0FBQUMsVUFBQWlCLE9BQUlqQixPQUFJaUIsS0FBRTtBQUFNLFVBQUFqQixHQUFFLFFBQVEsU0FBT0EsR0FBRTtBQUFPLFVBQUFBLEtBQUVBLEdBQUU7QUFBQSxRQUFPO0FBQUEsTUFBQztBQUFDO0FBQUEsSUFBTSxLQUFLO0FBQUcsU0FBRyxHQUFFLENBQUM7QUFBRSxTQUFHLENBQUM7QUFBRSxVQUFFLEtBQUcsR0FBRyxDQUFDO0FBQUU7QUFBQSxJQUFNLEtBQUs7QUFBRztBQUFBLElBQU07QUFBUTtBQUFBLFFBQUc7QUFBQSxRQUNuZjtBQUFBLE1BQUMsR0FBRSxHQUFHLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQU0sTUFBRyxJQUFFLEdBQUU7QUFBQyxRQUFHO0FBQUMsU0FBRTtBQUFDLGlCQUFRLElBQUUsRUFBRSxRQUFPLFNBQU8sS0FBRztBQUFDLGNBQUcsR0FBRyxDQUFDLEdBQUU7QUFBQyxnQkFBSSxJQUFFO0FBQUUsa0JBQU07QUFBQSxVQUFDO0FBQUMsY0FBRSxFQUFFO0FBQUEsUUFBTTtBQUFDLGNBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLE1BQUU7QUFBQyxjQUFPLEVBQUUsS0FBRztBQUFBLFFBQUUsS0FBSztBQUFFLGNBQUksSUFBRSxFQUFFO0FBQVUsWUFBRSxRQUFNLE9BQUssR0FBRyxHQUFFLEVBQUUsR0FBRSxFQUFFLFNBQU87QUFBSyxjQUFJZ0IsS0FBRSxHQUFHLENBQUM7QUFBRSxhQUFHLEdBQUVBLElBQUUsQ0FBQztBQUFFO0FBQUEsUUFBTSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUUsY0FBSSxJQUFFLEVBQUUsVUFBVSxlQUFjLElBQUUsR0FBRyxDQUFDO0FBQUUsYUFBRyxHQUFFLEdBQUUsQ0FBQztBQUFFO0FBQUEsUUFBTTtBQUFRLGdCQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBQSxNQUFFO0FBQUEsSUFBQyxTQUFPRCxJQUFFO0FBQUMsUUFBRSxHQUFFLEVBQUUsUUFBT0EsRUFBQztBQUFBLElBQUM7QUFBQyxNQUFFLFNBQU87QUFBQSxFQUFFO0FBQUMsTUFBRSxTQUFPLEVBQUUsU0FBTztBQUFNO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRTtBQUFFLEtBQUcsQ0FBSztBQUFDO0FBQ3ZiLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRTtBQUFDLFdBQVEsSUFBRSxPQUFLLEVBQUUsT0FBSyxJQUFHLFNBQU8sS0FBRztBQUFDLFFBQUksSUFBRSxHQUFFQyxLQUFFLEVBQUU7QUFBTSxRQUFHLE9BQUssRUFBRSxPQUFLLEdBQUU7QUFBQyxVQUFJLElBQUUsU0FBTyxFQUFFLGlCQUFlO0FBQUcsVUFBRyxDQUFDLEdBQUU7QUFBQyxZQUFJLElBQUUsRUFBRSxXQUFVRCxLQUFFLFNBQU8sS0FBRyxTQUFPLEVBQUUsaUJBQWU7QUFBRSxZQUFFO0FBQUcsWUFBSWxCLEtBQUU7QUFBRSxhQUFHO0FBQUUsYUFBSSxJQUFFa0IsT0FBSSxDQUFDbEIsR0FBRSxNQUFJLElBQUUsR0FBRSxTQUFPLElBQUcsS0FBRSxHQUFFa0IsS0FBRSxFQUFFLE9BQU0sT0FBSyxFQUFFLE9BQUssU0FBTyxFQUFFLGdCQUFjLEdBQUcsQ0FBQyxJQUFFLFNBQU9BLE1BQUdBLEdBQUUsU0FBTyxHQUFFLElBQUVBLE1BQUcsR0FBRyxDQUFDO0FBQUUsZUFBSyxTQUFPQyxLQUFHLEtBQUVBLElBQUUsR0FBR0EsRUFBSyxHQUFFQSxLQUFFQSxHQUFFO0FBQVEsWUFBRTtBQUFFLGFBQUc7QUFBRSxZQUFFbkI7QUFBQSxNQUFDO0FBQUMsU0FBRyxDQUFLO0FBQUEsSUFBQyxNQUFNLFFBQUssRUFBRSxlQUFhLFNBQU8sU0FBT21CLE1BQUdBLEdBQUUsU0FBTyxHQUFFLElBQUVBLE1BQUcsR0FBRyxDQUFLO0FBQUEsRUFBQztBQUFDO0FBQ3ZjLFNBQVMsR0FBRyxHQUFFO0FBQUMsU0FBSyxTQUFPLEtBQUc7QUFBQyxRQUFJLElBQUU7QUFBRSxRQUFHLE9BQUssRUFBRSxRQUFNLE9BQU07QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFVLFVBQUc7QUFBQyxZQUFHLE9BQUssRUFBRSxRQUFNLE1BQU0sU0FBTyxFQUFFLEtBQUc7QUFBQSxVQUFFLEtBQUs7QUFBQSxVQUFFLEtBQUs7QUFBQSxVQUFHLEtBQUs7QUFBRyxpQkFBRyxHQU
25114FHLEdBQUUsQ0FBQztBQUFFO0FBQUEsVUFBTSxLQUFLO0FBQUUsZ0JBQUksSUFBRSxFQUFFO0FBQVUsZ0JBQUcsRUFBRSxRQUFNLEtBQUcsQ0FBQyxFQUFFLEtBQUcsU0FBTyxFQUFFLEdBQUUsa0JBQWlCO0FBQUEsaUJBQU87QUFBQyxrQkFBSSxJQUFFLEVBQUUsZ0JBQWMsRUFBRSxPQUFLLEVBQUUsZ0JBQWMsR0FBRyxFQUFFLE1BQUssRUFBRSxhQUFhO0FBQUUsZ0JBQUUsbUJBQW1CLEdBQUUsRUFBRSxlQUFjLEVBQUUsbUNBQW1DO0FBQUEsWUFBQztBQUFDLGdCQUFJQSxLQUFFLEVBQUU7QUFBWSxxQkFBT0EsTUFBRyxHQUFHLEdBQUVBLElBQUUsQ0FBQztBQUFFO0FBQUEsVUFBTSxLQUFLO0FBQUUsZ0JBQUksSUFBRSxFQUFFO0FBQVksZ0JBQUcsU0FBTyxHQUFFO0FBQUMsa0JBQUU7QUFBSyxrQkFBRyxTQUFPLEVBQUUsTUFBTSxTQUFPLEVBQUUsTUFBTSxLQUFHO0FBQUEsZ0JBQUUsS0FBSztBQUFFLHNCQUNqaEIsRUFBRSxNQUFNO0FBQVU7QUFBQSxnQkFBTSxLQUFLO0FBQUUsc0JBQUUsRUFBRSxNQUFNO0FBQUEsY0FBUztBQUFDLGlCQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUEsWUFBQztBQUFDO0FBQUEsVUFBTSxLQUFLO0FBQUUsZ0JBQUksSUFBRSxFQUFFO0FBQVUsZ0JBQUcsU0FBTyxLQUFHLEVBQUUsUUFBTSxHQUFFO0FBQUMsa0JBQUU7QUFBRSxrQkFBSUQsS0FBRSxFQUFFO0FBQWMsc0JBQU8sRUFBRTtnQkFBTSxLQUFLO0FBQUEsZ0JBQVMsS0FBSztBQUFBLGdCQUFRLEtBQUs7QUFBQSxnQkFBUyxLQUFLO0FBQVcsa0JBQUFBLEdBQUUsYUFBVyxFQUFFLE1BQUs7QUFBRztBQUFBLGdCQUFNLEtBQUs7QUFBTSxrQkFBQUEsR0FBRSxRQUFNLEVBQUUsTUFBSUEsR0FBRTtBQUFBLGNBQUk7QUFBQSxZQUFDO0FBQUM7QUFBQSxVQUFNLEtBQUs7QUFBRTtBQUFBLFVBQU0sS0FBSztBQUFFO0FBQUEsVUFBTSxLQUFLO0FBQUc7QUFBQSxVQUFNLEtBQUs7QUFBRyxnQkFBRyxTQUFPLEVBQUUsZUFBYztBQUFDLGtCQUFJbEIsS0FBRSxFQUFFO0FBQVUsa0JBQUcsU0FBT0EsSUFBRTtBQUFDLG9CQUFJb0IsS0FBRXBCLEdBQUU7QUFBYyxvQkFBRyxTQUFPb0IsSUFBRTtBQUFDLHNCQUFJakIsS0FBRWlCLEdBQUU7QUFBVywyQkFBT2pCLE1BQUcsR0FBR0EsRUFBQztBQUFBLGdCQUFDO0FBQUEsY0FBQztBQUFBLFlBQUM7QUFBQztBQUFBLFVBQU0sS0FBSztBQUFBLFVBQUcsS0FBSztBQUFBLFVBQUcsS0FBSztBQUFBLFVBQUcsS0FBSztBQUFBLFVBQUcsS0FBSztBQUFBLFVBQUcsS0FBSztBQUFHO0FBQUEsVUFDbGdCO0FBQVEsa0JBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLFFBQUU7QUFBQyxhQUFHLEVBQUUsUUFBTSxPQUFLLEdBQUcsQ0FBQztBQUFBLE1BQUMsU0FBT0MsSUFBRTtBQUFDLFVBQUUsR0FBRSxFQUFFLFFBQU9BLEVBQUM7QUFBQSxNQUFDO0FBQUEsSUFBQztBQUFDLFFBQUcsTUFBSSxHQUFFO0FBQUMsVUFBRTtBQUFLO0FBQUEsSUFBSztBQUFDLFFBQUUsRUFBRTtBQUFRLFFBQUcsU0FBTyxHQUFFO0FBQUMsUUFBRSxTQUFPLEVBQUU7QUFBTyxVQUFFO0FBQUU7QUFBQSxJQUFLO0FBQUMsUUFBRSxFQUFFO0FBQUEsRUFBTTtBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxTQUFLLFNBQU8sS0FBRztBQUFDLFFBQUksSUFBRTtBQUFFLFFBQUcsTUFBSSxHQUFFO0FBQUMsVUFBRTtBQUFLO0FBQUEsSUFBSztBQUFDLFFBQUksSUFBRSxFQUFFO0FBQVEsUUFBRyxTQUFPLEdBQUU7QUFBQyxRQUFFLFNBQU8sRUFBRTtBQUFPLFVBQUU7QUFBRTtBQUFBLElBQUs7QUFBQyxRQUFFLEVBQUU7QUFBQSxFQUFNO0FBQUM7QUFDdlMsU0FBUyxHQUFHLEdBQUU7QUFBQyxTQUFLLFNBQU8sS0FBRztBQUFDLFFBQUksSUFBRTtBQUFFLFFBQUc7QUFBQyxjQUFPLEVBQUUsS0FBRztBQUFBLFFBQUUsS0FBSztBQUFBLFFBQUUsS0FBSztBQUFBLFFBQUcsS0FBSztBQUFHLGNBQUksSUFBRSxFQUFFO0FBQU8sY0FBRztBQUFDLGVBQUcsR0FBRSxDQUFDO0FBQUEsVUFBQyxTQUFPYyxJQUFFO0FBQUMsY0FBRSxHQUFFLEdBQUVBLEVBQUM7QUFBQSxVQUFDO0FBQUM7QUFBQSxRQUFNLEtBQUs7QUFBRSxjQUFJLElBQUUsRUFBRTtBQUFVLGNBQUcsZUFBYSxPQUFPLEVBQUUsbUJBQWtCO0FBQUMsZ0JBQUksSUFBRSxFQUFFO0FBQU8sZ0JBQUc7QUFBQyxnQkFBRSxrQkFBaUI7QUFBQSxZQUFFLFNBQU9BLElBQUU7QUFBQyxnQkFBRSxHQUFFLEdBQUVBLEVBQUM7QUFBQSxZQUFDO0FBQUEsVUFBQztBQUFDLGNBQUlDLEtBQUUsRUFBRTtBQUFPLGNBQUc7QUFBQyxlQUFHLENBQUM7QUFBQSxVQUFDLFNBQU9ELElBQUU7QUFBQyxjQUFFLEdBQUVDLElBQUVELEVBQUM7QUFBQSxVQUFDO0FBQUM7QUFBQSxRQUFNLEtBQUs7QUFBRSxjQUFJLElBQUUsRUFBRTtBQUFPLGNBQUc7QUFBQyxlQUFHLENBQUM7QUFBQSxVQUFDLFNBQU9BLElBQUU7QUFBQyxjQUFFLEdBQUUsR0FBRUEsRUFBQztBQUFBLFVBQUM7QUFBQSxNQUFDO0FBQUEsSUFBQyxTQUFPQSxJQUFFO0FBQUMsUUFBRSxHQUFFLEVBQUUsUUFBT0EsRUFBQztBQUFBLElBQUM7QUFBQyxRQUFHLE1BQUksR0FBRTtBQUFDLFVBQUU7QUFBSztBQUFBLElBQUs7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFRLFFBQUcsU0FBTyxHQUFFO0FBQUMsUUFBRSxTQUFPLEVBQUU7QUFBTyxVQUFFO0FBQUU7QUFBQSxJQUFLO0FBQUMsUUFBRSxFQUFFO0FBQUEsRUFBTTtBQUFDO0FBQzdkLElBQUksS0FBRyxLQUFLLE1BQUssS0FBRyxHQUFHLHdCQUF1QixLQUFHLEdBQUcsbUJBQWtCLEtBQUcsR0FBRyx5QkFBd0IsSUFBRSxHQUFFLElBQUUsTUFBSyxJQUFFLE1BQUssSUFBRSxHQUFFLEtBQUcsR0FBRSxLQUFHLEdBQUcsQ0FBQyxHQUFFLElBQUUsR0FBRSxLQUFHLE1BQUssS0FBRyxHQUFFLEtBQUcsR0FBRSxLQUFHLEdBQUUsS0FBRyxNQUFLLEtBQUcsTUFBSyxLQUFHLEdBQUUsS0FBRyxVQUFTLEtBQUcsTUFBSyxLQUFHLE9BQUcsS0FBRyxNQUFLLEtBQUcsTUFBSyxLQUFHLE9BQUcsS0FBRyxNQUFLLEtBQUcsR0FBRSxLQUFHLEdBQUUsS0FBRyxNQUFLLEtBQUcsSUFBRyxLQUFHO0FBQUUsU0FBUyxJQUFHO0FBQUMsU0FBTyxPQUFLLElBQUUsS0FBRyxNQUFJLE9BQUssS0FBRyxLQUFHLEtBQUcsRUFBQztBQUFFO0FBQ2hVLFNBQVMsR0FBRyxHQU
25114FFO0FBQUMsTUFBRyxPQUFLLEVBQUUsT0FBSyxHQUFHLFFBQU87QUFBRSxNQUFHLE9BQUssSUFBRSxNQUFJLE1BQUksRUFBRSxRQUFPLElBQUUsQ0FBQztBQUFFLE1BQUcsU0FBTyxHQUFHLFdBQVcsUUFBTyxNQUFJLE9BQUssS0FBRyxPQUFNO0FBQUcsTUFBRTtBQUFFLE1BQUcsTUFBSSxFQUFFLFFBQU87QUFBRSxNQUFFLE9BQU87QUFBTSxNQUFFLFdBQVMsSUFBRSxLQUFHLEdBQUcsRUFBRSxJQUFJO0FBQUUsU0FBTztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLEtBQUcsR0FBRyxPQUFNLEtBQUcsR0FBRSxLQUFHLE1BQUssTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLEtBQUcsR0FBRSxHQUFFLENBQUM7QUFBRSxNQUFHLE9BQUssSUFBRSxNQUFJLE1BQUksRUFBRSxPQUFJLE1BQUksT0FBSyxJQUFFLE9BQUssTUFBSSxJQUFHLE1BQUksS0FBRyxHQUFHLEdBQUUsQ0FBQyxJQUFHLEdBQUcsR0FBRSxDQUFDLEdBQUUsTUFBSSxLQUFHLE1BQUksS0FBRyxPQUFLLEVBQUUsT0FBSyxPQUFLLEtBQUcsRUFBQyxJQUFHLEtBQUksTUFBSSxHQUFFO0FBQUc7QUFDMVksU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRSxFQUFFO0FBQWEsS0FBRyxHQUFFLENBQUM7QUFBRSxNQUFJLElBQUUsR0FBRyxHQUFFLE1BQUksSUFBRSxJQUFFLENBQUM7QUFBRSxNQUFHLE1BQUksRUFBRSxVQUFPLEtBQUcsR0FBRyxDQUFDLEdBQUUsRUFBRSxlQUFhLE1BQUssRUFBRSxtQkFBaUI7QUFBQSxXQUFVLElBQUUsSUFBRSxDQUFDLEdBQUUsRUFBRSxxQkFBbUIsR0FBRTtBQUFDLFlBQU0sS0FBRyxHQUFHLENBQUM7QUFBRSxRQUFHLE1BQUksRUFBRSxPQUFJLEVBQUUsTUFBSSxHQUFHLEdBQUcsS0FBSyxNQUFLLENBQUMsQ0FBQyxJQUFFLEdBQUcsR0FBRyxLQUFLLE1BQUssQ0FBQyxDQUFDLEdBQUUsR0FBRyxXQUFVO0FBQUMsYUFBSyxJQUFFLE1BQUksR0FBRTtBQUFBLElBQUUsQ0FBQyxHQUFFLElBQUU7QUFBQSxTQUFTO0FBQUMsY0FBTyxHQUFHLENBQUMsR0FBQztBQUFBLFFBQUUsS0FBSztBQUFFLGNBQUU7QUFBRztBQUFBLFFBQU0sS0FBSztBQUFFLGNBQUU7QUFBRztBQUFBLFFBQU0sS0FBSztBQUFHLGNBQUU7QUFBRztBQUFBLFFBQU0sS0FBSztBQUFVLGNBQUU7QUFBRztBQUFBLFFBQU07QUFBUSxjQUFFO0FBQUEsTUFBRTtBQUFDLFVBQUUsR0FBRyxHQUFFLEdBQUcsS0FBSyxNQUFLLENBQUMsQ0FBQztBQUFBLElBQUM7QUFBQyxNQUFFLG1CQUFpQjtBQUFFLE1BQUUsZUFBYTtBQUFBLEVBQUM7QUFBQztBQUM3YyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsT0FBRztBQUFHLE9BQUc7QUFBRSxNQUFHLE9BQUssSUFBRSxHQUFHLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUksSUFBRSxFQUFFO0FBQWEsTUFBRyxHQUFFLEtBQUksRUFBRSxpQkFBZSxFQUFFLFFBQU87QUFBSyxNQUFJLElBQUUsR0FBRyxHQUFFLE1BQUksSUFBRSxJQUFFLENBQUM7QUFBRSxNQUFHLE1BQUksRUFBRSxRQUFPO0FBQUssTUFBRyxPQUFLLElBQUUsT0FBSyxPQUFLLElBQUUsRUFBRSxpQkFBZSxFQUFFLEtBQUUsR0FBRyxHQUFFLENBQUM7QUFBQSxPQUFNO0FBQUMsUUFBRTtBQUFFLFFBQUksSUFBRTtBQUFFLFNBQUc7QUFBRSxRQUFJQyxLQUFFLEdBQUU7QUFBRyxRQUFHLE1BQUksS0FBRyxNQUFJLEVBQUUsTUFBRyxNQUFLLEtBQUcsTUFBSSxLQUFJLEdBQUcsR0FBRSxDQUFDO0FBQUU7QUFBRyxVQUFHO0FBQUMsV0FBRTtBQUFHO0FBQUEsTUFBSyxTQUFPLEdBQUU7QUFBQyxXQUFHLEdBQUUsQ0FBQztBQUFBLE1BQUM7QUFBQSxXQUFPO0FBQUcsT0FBRTtBQUFHLE9BQUcsVUFBUUE7QUFBRSxRQUFFO0FBQUUsYUFBTyxJQUFFLElBQUUsS0FBRyxJQUFFLE1BQUssSUFBRSxHQUFFLElBQUU7QUFBQSxFQUFFO0FBQUMsTUFBRyxNQUFJLEdBQUU7QUFBQyxVQUFJLE1BQUksSUFBRSxHQUFHLENBQUMsR0FBRSxNQUFJLE1BQUksSUFBRSxHQUFFLElBQUUsR0FBRyxHQUFFLENBQUM7QUFBSSxRQUFHLE1BQUksRUFBRSxPQUFNLElBQUUsSUFBRyxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLEVBQUMsQ0FBRSxHQUFFO0FBQUUsUUFBRyxNQUFJLEVBQUUsSUFBRyxHQUFFLENBQUM7QUFBQSxTQUNqZjtBQUFDLFVBQUUsRUFBRSxRQUFRO0FBQVUsVUFBRyxPQUFLLElBQUUsT0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFJLElBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxNQUFJLE1BQUlBLEtBQUUsR0FBRyxDQUFDLEdBQUUsTUFBSUEsT0FBSSxJQUFFQSxJQUFFLElBQUUsR0FBRyxHQUFFQSxFQUFDLEtBQUksTUFBSSxHQUFHLE9BQU0sSUFBRSxJQUFHLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsRUFBQyxDQUFFLEdBQUU7QUFBRSxRQUFFLGVBQWE7QUFBRSxRQUFFLGdCQUFjO0FBQUUsY0FBTyxHQUFDO0FBQUEsUUFBRSxLQUFLO0FBQUEsUUFBRSxLQUFLO0FBQUUsZ0JBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLFFBQUUsS0FBSztBQUFFLGFBQUcsR0FBRSxJQUFHLEVBQUU7QUFBRTtBQUFBLFFBQU0sS0FBSztBQUFFLGFBQUcsR0FBRSxDQUFDO0FBQUUsZUFBSSxJQUFFLGVBQWEsTUFBSSxJQUFFLEtBQUcsTUFBSSxFQUFDLEdBQUcsS0FBRyxJQUFHO0FBQUMsZ0JBQUcsTUFBSSxHQUFHLEdBQUUsQ0FBQyxFQUFFO0FBQU0sZ0JBQUUsRUFBRTtBQUFlLGlCQUFJLElBQUUsT0FBSyxHQUFFO0FBQUMsZ0JBQUM7QUFBRyxnQkFBRSxlQUFhLEVBQUUsaUJBQWU7QUFBRTtBQUFBLFlBQUs7QUFBQyxjQUFFLGdCQUFjLEdBQUcsR0FBRyxLQUFLLE1BQUssR0FBRSxJQUFHLEVBQUUsR0FBRSxDQUFDO0FBQUU7QUFBQSxVQUFLO0FBQUMsYUFBRyxHQUFFLElBQUcsRUFBRTtBQUFFO0FBQUEsUUFBTSxLQUFLO0FBQUUsYUFBRyxHQUFFLENBQUM7QUFBRSxlQUFJLElBQUUsYUFDaGYsRUFBRTtBQUFNLGNBQUUsRUFBRTtBQUFXLGVBQUksSUFBRSxJQUFHLElBQUUsS0FBRztBQUFDLGdCQUFJLElBQUUsS0FBRyxHQUFHLENBQUM7QUFBRSxZQUFBQSxLQUFFLEtBQUc7QUFBRSxnQkFBRSxFQUFFLENBQUM7QUFBRSxnQkFBRSxNQUFJLElBQUU7QUFBRyxpQkFBRyxDQUFDQTtBQUFBLFVBQUM7QUFBQyxjQUFFO0FBQUUsY0FBRSxFQUFDLElBQUc7QUFBRSxlQUFHLE1BQUksSUFBRSxNQUFJLE1BQUksSUFBRSxNQUFJLE9BQUssSUFBRSxPQUFLLE9BQUssSUFBRSxPQUFLLE1BQUksSUFBRSxNQUFJLE9BQUssSUFBRSxPQUFLLE9BQUssR0FBRyxJQUFFLElBQUksS0FBRztBQUFFLGNBQUcsS0FBRyxHQU
25114FFO0FBQUMsY0FBRSxnQkFBYyxHQUFHLEdBQUcsS0FBSyxNQUFLLEdBQUUsSUFBRyxFQUFFLEdBQUUsQ0FBQztBQUFFO0FBQUEsVUFBSztBQUFDLGFBQUcsR0FBRSxJQUFHLEVBQUU7QUFBRTtBQUFBLFFBQU0sS0FBSztBQUFFLGFBQUcsR0FBRSxJQUFHLEVBQUU7QUFBRTtBQUFBLFFBQU07QUFBUSxnQkFBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUEsTUFBRTtBQUFBLElBQUM7QUFBQSxFQUFDO0FBQUMsS0FBRyxHQUFFLEdBQUc7QUFBRSxTQUFPLEVBQUUsaUJBQWUsSUFBRSxHQUFHLEtBQUssTUFBSyxDQUFDLElBQUU7QUFBSTtBQUNyWCxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsTUFBSSxJQUFFO0FBQUcsSUFBRSxRQUFRLGNBQWMsaUJBQWUsR0FBRyxHQUFFLENBQUMsRUFBRSxTQUFPO0FBQUssTUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLFFBQUksTUFBSSxJQUFFLElBQUcsS0FBRyxHQUFFLFNBQU8sS0FBRyxHQUFHLENBQUM7QUFBRyxTQUFPO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLFdBQU8sS0FBRyxLQUFHLElBQUUsR0FBRyxLQUFLLE1BQU0sSUFBRyxDQUFDO0FBQUM7QUFDNUwsU0FBUyxHQUFHLEdBQUU7QUFBQyxXQUFRLElBQUUsT0FBSTtBQUFDLFFBQUcsRUFBRSxRQUFNLE9BQU07QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFZLFVBQUcsU0FBTyxNQUFJLElBQUUsRUFBRSxRQUFPLFNBQU8sR0FBRyxVQUFRLElBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUMsWUFBSSxJQUFFLEVBQUUsQ0FBQyxHQUFFQSxLQUFFLEVBQUU7QUFBWSxZQUFFLEVBQUU7QUFBTSxZQUFHO0FBQUMsY0FBRyxDQUFDLEdBQUdBLEdBQUMsR0FBRyxDQUFDLEVBQUUsUUFBTTtBQUFBLFFBQUUsU0FBTyxHQUFFO0FBQUMsaUJBQU07QUFBQSxRQUFFO0FBQUEsTUFBQztBQUFBLElBQUM7QUFBQyxRQUFFLEVBQUU7QUFBTSxRQUFHLEVBQUUsZUFBYSxTQUFPLFNBQU8sRUFBRSxHQUFFLFNBQU8sR0FBRSxJQUFFO0FBQUEsU0FBTTtBQUFDLFVBQUcsTUFBSSxFQUFFO0FBQU0sYUFBSyxTQUFPLEVBQUUsV0FBUztBQUFDLFlBQUcsU0FBTyxFQUFFLFVBQVEsRUFBRSxXQUFTLEVBQUUsUUFBTTtBQUFHLFlBQUUsRUFBRTtBQUFBLE1BQU07QUFBQyxRQUFFLFFBQVEsU0FBTyxFQUFFO0FBQU8sVUFBRSxFQUFFO0FBQUEsSUFBTztBQUFBLEVBQUM7QUFBQyxTQUFNO0FBQUU7QUFDbGEsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE9BQUcsQ0FBQztBQUFHLE9BQUcsQ0FBQztBQUFHLElBQUUsa0JBQWdCO0FBQUUsSUFBRSxlQUFhLENBQUM7QUFBRSxPQUFJLElBQUUsRUFBRSxpQkFBZ0IsSUFBRSxLQUFHO0FBQUMsUUFBSSxJQUFFLEtBQUcsR0FBRyxDQUFDLEdBQUUsSUFBRSxLQUFHO0FBQUUsTUFBRSxDQUFDLElBQUU7QUFBRyxTQUFHLENBQUM7QUFBQSxFQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUcsT0FBSyxJQUFFLEdBQUcsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsS0FBRTtBQUFHLE1BQUksSUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLE1BQUcsT0FBSyxJQUFFLEdBQUcsUUFBTyxHQUFHLEdBQUUsRUFBQyxDQUFFLEdBQUU7QUFBSyxNQUFJLElBQUUsR0FBRyxHQUFFLENBQUM7QUFBRSxNQUFHLE1BQUksRUFBRSxPQUFLLE1BQUksR0FBRTtBQUFDLFFBQUksSUFBRSxHQUFHLENBQUM7QUFBRSxVQUFJLE1BQUksSUFBRSxHQUFFLElBQUUsR0FBRyxHQUFFLENBQUM7QUFBQSxFQUFFO0FBQUMsTUFBRyxNQUFJLEVBQUUsT0FBTSxJQUFFLElBQUcsR0FBRyxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxFQUFDLENBQUUsR0FBRTtBQUFFLE1BQUcsTUFBSSxFQUFFLE9BQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFFLElBQUUsZUFBYSxFQUFFLFFBQVE7QUFBVSxJQUFFLGdCQUFjO0FBQUUsS0FBRyxHQUFFLElBQUcsRUFBRTtBQUFFLEtBQUcsR0FBRSxFQUFDLENBQUU7QUFBRSxTQUFPO0FBQUk7QUFDdmQsU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRTtBQUFFLE9BQUc7QUFBRSxNQUFHO0FBQUMsV0FBTyxFQUFFLENBQUM7QUFBQSxFQUFDLFVBQUM7QUFBUSxRQUFFLEdBQUUsTUFBSSxNQUFJLEtBQUcsRUFBQyxJQUFHLEtBQUksTUFBSSxHQUFFO0FBQUEsRUFBRztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUU7QUFBQyxXQUFPLE1BQUksTUFBSSxHQUFHLE9BQUssT0FBSyxJQUFFLE1BQUksR0FBRTtBQUFHLE1BQUksSUFBRTtBQUFFLE9BQUc7QUFBRSxNQUFJLElBQUUsR0FBRyxZQUFXLElBQUU7QUFBRSxNQUFHO0FBQUMsUUFBRyxHQUFHLGFBQVcsTUFBSyxJQUFFLEdBQUUsRUFBRSxRQUFPLEVBQUM7QUFBQSxFQUFFLFVBQUM7QUFBUSxRQUFFLEdBQUUsR0FBRyxhQUFXLEdBQUUsSUFBRSxHQUFFLE9BQUssSUFBRSxNQUFJO0VBQUk7QUFBQztBQUFDLFNBQVMsS0FBSTtBQUFDLE9BQUcsR0FBRztBQUFRLElBQUUsRUFBRTtBQUFDO0FBQ2hULFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxJQUFFLGVBQWE7QUFBSyxJQUFFLGdCQUFjO0FBQUUsTUFBSSxJQUFFLEVBQUU7QUFBYyxTQUFLLE1BQUksRUFBRSxnQkFBYyxJQUFHLEdBQUcsQ0FBQztBQUFHLE1BQUcsU0FBTyxFQUFFLE1BQUksSUFBRSxFQUFFLFFBQU8sU0FBTyxLQUFHO0FBQUMsUUFBSSxJQUFFO0FBQUUsT0FBRyxDQUFDO0FBQUUsWUFBTyxFQUFFLEtBQUc7QUFBQSxNQUFFLEtBQUs7QUFBRSxZQUFFLEVBQUUsS0FBSztBQUFrQixpQkFBTyxLQUFHLFdBQVMsS0FBRyxHQUFFO0FBQUc7QUFBQSxNQUFNLEtBQUs7QUFBRSxXQUFFO0FBQUcsVUFBRSxFQUFFO0FBQUUsVUFBRSxDQUFDO0FBQUUsV0FBRTtBQUFHO0FBQUEsTUFBTSxLQUFLO0FBQUUsV0FBRyxDQUFDO0FBQUU7QUFBQSxNQUFNLEtBQUs7QUFBRSxXQUFFO0FBQUc7QUFBQSxNQUFNLEtBQUs7QUFBRyxVQUFFLENBQUM7QUFBRTtBQUFBLE1BQU0sS0FBSztBQUFHLFVBQUUsQ0FBQztBQUFFO0FBQUEsTUFBTSxLQUFLO0FBQUcsV0FBRyxFQUFFLEtBQUssUUFBUTtBQUFFO0FBQUEsTUFBTSxLQUFLO0FBQUEsTUFBRyxLQUFLO0FBQUcsV0FBRTtBQUFBLElBQUU7QUFBQyxRQUFFLEVBQUU7QUFBQSxFQUFNO0FBQUMsTUFBRTtBQUFFLE1BQUUsSUFBRSxHQU
25114FHLEVBQUUsU0FBUSxJQUFJO0FBQUUsTUFBRSxLQUFHO0FBQUUsTUFBRTtBQUFFLE9BQUc7QUFBSyxPQUFHLEtBQUcsS0FBRztBQUFFLE9BQUcsS0FBRztBQUFLLE1BQUcsU0FBTyxJQUFHO0FBQUMsU0FBSSxJQUMxZixHQUFFLElBQUUsR0FBRyxRQUFPLElBQUksS0FBRyxJQUFFLEdBQUcsQ0FBQyxHQUFFLElBQUUsRUFBRSxhQUFZLFNBQU8sR0FBRTtBQUFDLFFBQUUsY0FBWTtBQUFLLFVBQUksSUFBRSxFQUFFLE1BQUtBLEtBQUUsRUFBRTtBQUFRLFVBQUcsU0FBT0EsSUFBRTtBQUFDLFlBQUksSUFBRUEsR0FBRTtBQUFLLFFBQUFBLEdBQUUsT0FBSztBQUFFLFVBQUUsT0FBSztBQUFBLE1BQUM7QUFBQyxRQUFFLFVBQVE7QUFBQSxJQUFDO0FBQUMsU0FBRztBQUFBLEVBQUk7QUFBQyxTQUFPO0FBQUM7QUFDM0ssU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLEtBQUU7QUFBQyxRQUFJLElBQUU7QUFBRSxRQUFHO0FBQUMsU0FBRTtBQUFHLFNBQUcsVUFBUTtBQUFHLFVBQUcsSUFBRztBQUFDLGlCQUFRLElBQUUsRUFBRSxlQUFjLFNBQU8sS0FBRztBQUFDLGNBQUksSUFBRSxFQUFFO0FBQU0sbUJBQU8sTUFBSSxFQUFFLFVBQVE7QUFBTSxjQUFFLEVBQUU7QUFBQSxRQUFJO0FBQUMsYUFBRztBQUFBLE1BQUU7QUFBQyxXQUFHO0FBQUUsVUFBRSxJQUFFLElBQUU7QUFBSyxXQUFHO0FBQUcsV0FBRztBQUFFLFNBQUcsVUFBUTtBQUFLLFVBQUcsU0FBTyxLQUFHLFNBQU8sRUFBRSxRQUFPO0FBQUMsWUFBRTtBQUFFLGFBQUc7QUFBRSxZQUFFO0FBQUs7QUFBQSxNQUFLO0FBQUMsU0FBRTtBQUFDLFlBQUlBLEtBQUUsR0FBRSxJQUFFLEVBQUUsUUFBTyxJQUFFLEdBQUVELEtBQUU7QUFBRSxZQUFFO0FBQUUsVUFBRSxTQUFPO0FBQU0sWUFBRyxTQUFPQSxNQUFHLGFBQVcsT0FBT0EsTUFBRyxlQUFhLE9BQU9BLEdBQUUsTUFBSztBQUFDLGNBQUlsQixLQUFFa0IsSUFBRUUsS0FBRSxHQUFFakIsS0FBRWlCLEdBQUU7QUFBSSxjQUFHLE9BQUtBLEdBQUUsT0FBSyxPQUFLLE1BQUlqQixNQUFHLE9BQUtBLE1BQUcsT0FBS0EsS0FBRztBQUFDLGdCQUFJQyxLQUFFZ0IsR0FBRTtBQUFVLFlBQUFoQixNQUFHZ0IsR0FBRSxjQUFZaEIsR0FBRSxhQUFZZ0IsR0FBRSxnQkFBY2hCLEdBQUUsZUFDeGVnQixHQUFFLFFBQU1oQixHQUFFLFVBQVFnQixHQUFFLGNBQVksTUFBS0EsR0FBRSxnQkFBYztBQUFBLFVBQUs7QUFBQyxjQUFJcUIsS0FBRSxHQUFHLENBQUM7QUFBRSxjQUFHLFNBQU9BLElBQUU7QUFBQyxZQUFBQSxHQUFFLFNBQU87QUFBSyxlQUFHQSxJQUFFLEdBQUUsR0FBRXRCLElBQUUsQ0FBQztBQUFFLFlBQUFzQixHQUFFLE9BQUssS0FBRyxHQUFHdEIsSUFBRW5CLElBQUUsQ0FBQztBQUFFLGdCQUFFeUM7QUFBRSxZQUFBdkIsS0FBRWxCO0FBQUUsZ0JBQUlDLEtBQUUsRUFBRTtBQUFZLGdCQUFHLFNBQU9BLElBQUU7QUFBQyxrQkFBSXNDLEtBQUUsb0JBQUk7QUFBSSxjQUFBQSxHQUFFLElBQUlyQixFQUFDO0FBQUUsZ0JBQUUsY0FBWXFCO0FBQUEsWUFBQyxNQUFNLENBQUF0QyxHQUFFLElBQUlpQixFQUFDO0FBQUUsa0JBQU07QUFBQSxVQUFDLE9BQUs7QUFBQyxnQkFBRyxPQUFLLElBQUUsSUFBRztBQUFDLGlCQUFHQyxJQUFFbkIsSUFBRSxDQUFDO0FBQUUsaUJBQUU7QUFBRyxvQkFBTTtBQUFBLFlBQUM7QUFBQyxZQUFBa0IsS0FBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUEsVUFBQztBQUFBLFFBQUMsV0FBUyxLQUFHLEVBQUUsT0FBSyxHQUFFO0FBQUMsY0FBSXlCLEtBQUUsR0FBRyxDQUFDO0FBQUUsY0FBRyxTQUFPQSxJQUFFO0FBQUMsbUJBQUtBLEdBQUUsUUFBTSxXQUFTQSxHQUFFLFNBQU87QUFBSyxlQUFHQSxJQUFFLEdBQUUsR0FBRXhCLElBQUUsQ0FBQztBQUFFLGVBQUcsR0FBR0QsSUFBRSxDQUFDLENBQUM7QUFBRSxrQkFBTTtBQUFBLFVBQUM7QUFBQSxRQUFDO0FBQUMsUUFBQUMsS0FBRUQsS0FBRSxHQUFHQSxJQUFFLENBQUM7QUFBRSxjQUFJLE1BQUksSUFBRTtBQUFHLGlCQUFPLEtBQUcsS0FBRyxDQUFDQyxFQUFDLElBQUUsR0FBRyxLQUFLQSxFQUFDO0FBQUUsUUFBQUEsS0FBRTtBQUFFLFdBQUU7QUFBQyxrQkFBT0EsR0FBRSxLQUFHO0FBQUEsWUFBRSxLQUFLO0FBQUUsY0FBQUEsR0FBRSxTQUFPO0FBQ3BmLG1CQUFHLENBQUM7QUFBRSxjQUFBQSxHQUFFLFNBQU87QUFBRSxrQkFBSW1CLEtBQUUsR0FBR25CLElBQUVELElBQUUsQ0FBQztBQUFFLGlCQUFHQyxJQUFFbUIsRUFBQztBQUFFLG9CQUFNO0FBQUEsWUFBRSxLQUFLO0FBQUUsa0JBQUVwQjtBQUFFLGtCQUFJbUIsS0FBRWxCLEdBQUUsTUFBS3FCLEtBQUVyQixHQUFFO0FBQVUsa0JBQUcsT0FBS0EsR0FBRSxRQUFNLFNBQU8sZUFBYSxPQUFPa0IsR0FBRSw0QkFBMEIsU0FBT0csTUFBRyxlQUFhLE9BQU9BLEdBQUUsc0JBQW9CLFNBQU8sTUFBSSxDQUFDLEdBQUcsSUFBSUEsRUFBQyxLQUFJO0FBQUMsZ0JBQUFyQixHQUFFLFNBQU87QUFBTSxxQkFBRyxDQUFDO0FBQUUsZ0JBQUFBLEdBQUUsU0FBTztBQUFFLG9CQUFJdUIsS0FBRSxHQUFHdkIsSUFBRSxHQUFFLENBQUM7QUFBRSxtQkFBR0EsSUFBRXVCLEVBQUM7QUFBRSxzQkFBTTtBQUFBLGNBQUM7QUFBQSxVQUFDO0FBQUMsVUFBQXZCLEtBQUVBLEdBQUU7QUFBQSxRQUFNLFNBQU8sU0FBT0E7QUFBQSxNQUFFO0FBQUMsU0FBRyxDQUFDO0FBQUEsSUFBQyxTQUFPLElBQUc7QUFBQyxVQUFFO0FBQUcsWUFBSSxLQUFHLFNBQU8sTUFBSSxJQUFFLElBQUUsRUFBRTtBQUFRO0FBQUEsSUFBUTtBQUFDO0FBQUEsRUFBSyxTQUFPO0FBQUU7QUFBQyxTQUFTLEtBQUk7QUFBQyxNQUFJLElBQUUsR0FBRztBQUFRLEtBQUcsVUFBUTtBQUFHLFNBQU8sU0FBTyxJQUFFLEtBQUc7QUFBQztBQUNyZCxTQUFTLEtBQUk7QUFBQyxNQUFHLE1BQUksS0FBRyxNQUFJLEtBQUcsTUFBSSxFQUFFLEtBQUU7QUFBRSxXQUFPLEtBQUcsT0FBSyxLQUFHLGNBQVksT0FBSyxLQUFHLGNBQVksR0FBRyxHQUFFLENBQUM7QUFBQztBQUFDLFNBQVMsR0FBRyxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUU7QUFBRSxPQUFHO0FBQUUsTUFBSSxJQUFFLEdBQUU7QUFBRyxNQUFHLE1BQUksS0FBRyxNQUFJLEVBQUUsTUFBRyxNQUFLLEdBQUcsR0FBRSxDQUFDO0FBQUU7QUFBRyxRQUFHO0FBQUMsU0FBRTtBQUFHO0FBQUEsSUFBSyxTQUFPLEdBQUU7QUFBQyxTQUFHLEdBQUUsQ0FBQztBQUFBLElBQUM7QUFBQSxTQUFPO0FBQUcsS0FBRTtBQUFHLE1BQUU7QUFBRSxLQUFHLFVBQVE7QUFBRSxNQUFHLFNBQU8sRUFBRSxPQUFNLE1BQU0sRUFBRSxHQU
25114FHLENBQUM7QUFBRSxNQUFFO0FBQUssTUFBRTtBQUFFLFNBQU87QUFBQztBQUFDLFNBQVMsS0FBSTtBQUFDLFNBQUssU0FBTyxJQUFHLElBQUcsQ0FBQztBQUFDO0FBQUMsU0FBUyxLQUFJO0FBQUMsU0FBSyxTQUFPLEtBQUcsQ0FBQyxHQUFFLElBQUksSUFBRyxDQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRTtBQUFDLE1BQUksSUFBRSxHQUFHLEVBQUUsV0FBVSxHQUFFLEVBQUU7QUFBRSxJQUFFLGdCQUFjLEVBQUU7QUFBYSxXQUFPLElBQUUsR0FBRyxDQUFDLElBQUUsSUFBRTtBQUFFLEtBQUcsVUFBUTtBQUFJO0FBQzFkLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFO0FBQUUsS0FBRTtBQUFDLFFBQUksSUFBRSxFQUFFO0FBQVUsUUFBRSxFQUFFO0FBQU8sUUFBRyxPQUFLLEVBQUUsUUFBTSxRQUFPO0FBQUMsVUFBRyxJQUFFLEdBQUcsR0FBRSxHQUFFLEVBQUUsR0FBRSxTQUFPLEdBQUU7QUFBQyxZQUFFO0FBQUU7QUFBQSxNQUFNO0FBQUEsSUFBQyxPQUFLO0FBQUMsVUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLFVBQUcsU0FBTyxHQUFFO0FBQUMsVUFBRSxTQUFPO0FBQU0sWUFBRTtBQUFFO0FBQUEsTUFBTTtBQUFDLFVBQUcsU0FBTyxFQUFFLEdBQUUsU0FBTyxPQUFNLEVBQUUsZUFBYSxHQUFFLEVBQUUsWUFBVTtBQUFBLFdBQVM7QUFBQyxZQUFFO0FBQUUsWUFBRTtBQUFLO0FBQUEsTUFBTTtBQUFBLElBQUM7QUFBQyxRQUFFLEVBQUU7QUFBUSxRQUFHLFNBQU8sR0FBRTtBQUFDLFVBQUU7QUFBRTtBQUFBLElBQU07QUFBQyxRQUFFLElBQUU7QUFBQSxFQUFDLFNBQU8sU0FBTztBQUFHLFFBQUksTUFBSSxJQUFFO0FBQUU7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsR0FBRSxJQUFFLEdBQUc7QUFBVyxNQUFHO0FBQUMsT0FBRyxhQUFXLE1BQUssSUFBRSxHQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLEVBQUMsVUFBQztBQUFRLE9BQUcsYUFBVyxHQUFFLElBQUU7QUFBQSxFQUFDO0FBQUMsU0FBTztBQUFJO0FBQ2hjLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUM7QUFBRyxPQUFFO0FBQUEsU0FBUyxTQUFPO0FBQUksTUFBRyxPQUFLLElBQUUsR0FBRyxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxNQUFFLEVBQUU7QUFBYSxNQUFJLElBQUUsRUFBRTtBQUFjLE1BQUcsU0FBTyxFQUFFLFFBQU87QUFBSyxJQUFFLGVBQWE7QUFBSyxJQUFFLGdCQUFjO0FBQUUsTUFBRyxNQUFJLEVBQUUsUUFBUSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxJQUFFLGVBQWE7QUFBSyxJQUFFLG1CQUFpQjtBQUFFLE1BQUlBLEtBQUUsRUFBRSxRQUFNLEVBQUU7QUFBVyxLQUFHLEdBQUVBLEVBQUM7QUFBRSxRQUFJLE1BQUksSUFBRSxJQUFFLE1BQUssSUFBRTtBQUFHLFNBQUssRUFBRSxlQUFhLFNBQU8sT0FBSyxFQUFFLFFBQU0sU0FBTyxPQUFLLEtBQUcsTUFBRyxHQUFHLElBQUcsV0FBVTtBQUFDLE9BQUU7QUFBRyxXQUFPO0FBQUEsRUFBSSxDQUFDO0FBQUcsRUFBQUEsS0FBRSxPQUFLLEVBQUUsUUFBTTtBQUFPLE1BQUcsT0FBSyxFQUFFLGVBQWEsVUFBUUEsSUFBRTtBQUFDLElBQUFBLEtBQUUsR0FBRztBQUFXLE9BQUcsYUFBVztBQUNoZixRQUFJLElBQUU7QUFBRSxRQUFFO0FBQUUsUUFBSSxJQUFFO0FBQUUsU0FBRztBQUFFLE9BQUcsVUFBUTtBQUFLLE9BQUcsR0FBRSxDQUFDO0FBQUUsT0FBRyxHQUFFLENBQUM7QUFBRSxPQUFHLEVBQUU7QUFBRSxTQUFHLENBQUMsQ0FBQztBQUFHLFNBQUcsS0FBRztBQUFLLE1BQUUsVUFBUTtBQUFFLE9BQUcsQ0FBSztBQUFFLE9BQUU7QUFBRyxRQUFFO0FBQUUsUUFBRTtBQUFFLE9BQUcsYUFBV0E7QUFBQSxFQUFDLE1BQU0sR0FBRSxVQUFRO0FBQUUsU0FBSyxLQUFHLE9BQUcsS0FBRyxHQUFFLEtBQUc7QUFBRyxFQUFBQSxLQUFFLEVBQUU7QUFBYSxRQUFJQSxPQUFJLEtBQUc7QUFBTSxLQUFHLEVBQUUsU0FBVztBQUFFLEtBQUcsR0FBRSxFQUFDLENBQUU7QUFBRSxNQUFHLFNBQU8sRUFBRSxNQUFJLElBQUUsRUFBRSxvQkFBbUIsSUFBRSxHQUFFLElBQUUsRUFBRSxRQUFPLElBQUksS0FBRSxFQUFFLENBQUMsR0FBRSxFQUFFLEVBQUUsT0FBTSxFQUFDLGdCQUFlLEVBQUUsT0FBTSxRQUFPLEVBQUUsT0FBTSxDQUFDO0FBQUUsTUFBRyxHQUFHLE9BQU0sS0FBRyxPQUFHLElBQUUsSUFBRyxLQUFHLE1BQUs7QUFBRSxTQUFLLEtBQUcsTUFBSSxNQUFJLEVBQUUsT0FBSyxHQUFFO0FBQUcsRUFBQUEsS0FBRSxFQUFFO0FBQWEsU0FBS0EsS0FBRSxLQUFHLE1BQUksS0FBRyxRQUFNLEtBQUcsR0FBRSxLQUFHLEtBQUcsS0FBRztBQUFFLEtBQUU7QUFBRyxTQUFPO0FBQUk7QUFDcmUsU0FBUyxLQUFJO0FBQUMsTUFBRyxTQUFPLElBQUc7QUFBQyxRQUFJLElBQUUsR0FBRyxFQUFFLEdBQUUsSUFBRSxHQUFHLFlBQVcsSUFBRTtBQUFFLFFBQUc7QUFBQyxTQUFHLGFBQVc7QUFBSyxVQUFFLEtBQUcsSUFBRSxLQUFHO0FBQUUsVUFBRyxTQUFPLEdBQUcsS0FBSSxJQUFFO0FBQUEsV0FBTztBQUFDLFlBQUU7QUFBRyxhQUFHO0FBQUssYUFBRztBQUFFLFlBQUcsT0FBSyxJQUFFLEdBQUcsT0FBTSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUUsWUFBSSxJQUFFO0FBQUUsYUFBRztBQUFFLGFBQUksSUFBRSxFQUFFLFNBQVEsU0FBTyxLQUFHO0FBQUMsY0FBSUEsS0FBRSxHQUFFLElBQUVBLEdBQUU7QUFBTSxjQUFHLE9BQUssRUFBRSxRQUFNLEtBQUk7QUFBQyxnQkFBSSxJQUFFQSxHQUFFO0FBQVUsZ0JBQUcsU0FBTyxHQUFFO0FBQUMsdUJBQVFELEtBQUUsR0FBRUEsS0FBRSxFQUFFLFFBQU9BLE1BQUk7QUFBQyxvQkFBSWxCLEtBQUUsRUFBRWtCLEVBQUM7QUFBRSxxQkFBSSxJQUFFbEIsSUFBRSxTQUFPLEtBQUc7QUFBQyxzQkFBSW9CLEtBQUU7QUFBRSwwQkFBT0EsR0FBRSxLQUFHO0FBQUEsb0JBQUUsS0FBSztBQUFBLG9CQUFFLEtBQUs7QUFBQSxvQkFBRyxLQUFLO0FBQUcseUJBQUcsR0FBRUEsSUFBRUQsRUFBQztBQUFBLGtCQUFDO0FBQUMsc0JBQUloQixLQUFFaUIsR0FBRTtBQUFNLHNCQUFHLFNBQU9qQixHQUFFLENBQUFBLEdBQUUsU0FBT2lCLElBQUUsSUFBRWpCO0FBQUEsc0JBQU8sUUFBSyxTQUFPLEtBQUc7QUFBQyxvQkFBQWlCLEtBQUU7QUFBRSx3QkFBSWhCLEtBQUVnQixHQUFFLFNBQVFxQixLQUFFckIsR0FBRTtBQUFPLHVCQUFHQSxFQUFDO0FBQUUsd0JBQUdBLE9BQ25mcEIsSUFBRTtBQUFDLDBCQUFFO0FBQUs7QUFBQSxvQkFBSztBQUFDLHdCQUFHLFNBQU9JLElBQUU7QUFBQyxzQkFBQUEsR0FBRSxTQUFPcUM7QUFBRSwwQkFBRXJDO0FBQUU7QUFBQSxvQkFBSztBQUFDLHdCQUFFcUM7QU
25114FBQSxrQkFBQztBQUFBLGdCQUFDO0FBQUEsY0FBQztBQUFDLGtCQUFJeEMsS0FBRWtCLEdBQUU7QUFBVSxrQkFBRyxTQUFPbEIsSUFBRTtBQUFDLG9CQUFJc0MsS0FBRXRDLEdBQUU7QUFBTSxvQkFBRyxTQUFPc0MsSUFBRTtBQUFDLGtCQUFBdEMsR0FBRSxRQUFNO0FBQUsscUJBQUU7QUFBQyx3QkFBSTBDLEtBQUVKLEdBQUU7QUFBUSxvQkFBQUEsR0FBRSxVQUFRO0FBQUssb0JBQUFBLEtBQUVJO0FBQUEsa0JBQUMsU0FBTyxTQUFPSjtBQUFBLGdCQUFFO0FBQUEsY0FBQztBQUFDLGtCQUFFcEI7QUFBQSxZQUFDO0FBQUEsVUFBQztBQUFDLGNBQUcsT0FBS0EsR0FBRSxlQUFhLFNBQU8sU0FBTyxFQUFFLEdBQUUsU0FBT0EsSUFBRSxJQUFFO0FBQUEsY0FBTyxHQUFFLFFBQUssU0FBTyxLQUFHO0FBQUMsWUFBQUEsS0FBRTtBQUFFLGdCQUFHLE9BQUtBLEdBQUUsUUFBTSxNQUFNLFNBQU9BLEdBQUUsS0FBRztBQUFBLGNBQUUsS0FBSztBQUFBLGNBQUUsS0FBSztBQUFBLGNBQUcsS0FBSztBQUFHLG1CQUFHLEdBQUVBLElBQUVBLEdBQUUsTUFBTTtBQUFBLFlBQUM7QUFBQyxnQkFBSW1CLEtBQUVuQixHQUFFO0FBQVEsZ0JBQUcsU0FBT21CLElBQUU7QUFBQyxjQUFBQSxHQUFFLFNBQU9uQixHQUFFO0FBQU8sa0JBQUVtQjtBQUFFLG9CQUFNO0FBQUEsWUFBQztBQUFDLGdCQUFFbkIsR0FBRTtBQUFBLFVBQU07QUFBQSxRQUFDO0FBQUMsWUFBSWtCLEtBQUUsRUFBRTtBQUFRLGFBQUksSUFBRUEsSUFBRSxTQUFPLEtBQUc7QUFBQyxjQUFFO0FBQUUsY0FBSUcsS0FBRSxFQUFFO0FBQU0sY0FBRyxPQUFLLEVBQUUsZUFBYSxTQUFPLFNBQ2xmQSxHQUFFLENBQUFBLEdBQUUsU0FBTyxHQUFFLElBQUVBO0FBQUEsY0FBTyxHQUFFLE1BQUksSUFBRUgsSUFBRSxTQUFPLEtBQUc7QUFBQyxnQkFBRTtBQUFFLGdCQUFHLE9BQUssRUFBRSxRQUFNLE1BQU0sS0FBRztBQUFDLHNCQUFPLEVBQUUsS0FBRztBQUFBLGdCQUFFLEtBQUs7QUFBQSxnQkFBRSxLQUFLO0FBQUEsZ0JBQUcsS0FBSztBQUFHLHFCQUFHLEdBQUUsQ0FBQztBQUFBLGNBQUM7QUFBQSxZQUFDLFNBQU8sSUFBRztBQUFDLGdCQUFFLEdBQUUsRUFBRSxRQUFPLEVBQUU7QUFBQSxZQUFDO0FBQUMsZ0JBQUcsTUFBSSxHQUFFO0FBQUMsa0JBQUU7QUFBSyxvQkFBTTtBQUFBLFlBQUM7QUFBQyxnQkFBSUssS0FBRSxFQUFFO0FBQVEsZ0JBQUcsU0FBT0EsSUFBRTtBQUFDLGNBQUFBLEdBQUUsU0FBTyxFQUFFO0FBQU8sa0JBQUVBO0FBQUUsb0JBQU07QUFBQSxZQUFDO0FBQUMsZ0JBQUUsRUFBRTtBQUFBLFVBQU07QUFBQSxRQUFDO0FBQUMsWUFBRTtBQUFFLFdBQUU7QUFBRyxZQUFHLE1BQUksZUFBYSxPQUFPLEdBQUcsc0JBQXNCLEtBQUc7QUFBQyxhQUFHLHNCQUFzQixJQUFHLENBQUM7QUFBQSxRQUFDLFNBQU8sSUFBRztBQUFBLFFBQUE7QUFBRSxZQUFFO0FBQUEsTUFBRTtBQUFDLGFBQU87QUFBQSxJQUFDLFVBQUM7QUFBUSxVQUFFLEdBQUUsR0FBRyxhQUFXO0FBQUEsSUFBQztBQUFBLEVBQUM7QUFBQyxTQUFNO0FBQUU7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUUsTUFBRSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsTUFBRSxHQUFHLEdBQUUsR0FBRSxDQUFDO0FBQUUsTUFBRSxFQUFDO0FBQUcsV0FBTyxNQUFJLEdBQUcsR0FBRSxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQ3plLFNBQVMsRUFBRSxHQU
25114FFLEdBQUUsR0FBRTtBQUFDLE1BQUcsTUFBSSxFQUFFLElBQUksSUFBRyxHQUFFLEdBQUUsQ0FBQztBQUFBLE1BQU8sUUFBSyxTQUFPLEtBQUc7QUFBQyxRQUFHLE1BQUksRUFBRSxLQUFJO0FBQUMsU0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFO0FBQUEsSUFBSyxXQUFTLE1BQUksRUFBRSxLQUFJO0FBQUMsVUFBSSxJQUFFLEVBQUU7QUFBVSxVQUFHLGVBQWEsT0FBTyxFQUFFLEtBQUssNEJBQTBCLGVBQWEsT0FBTyxFQUFFLHNCQUFvQixTQUFPLE1BQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFHO0FBQUMsWUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLFlBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLFlBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLFlBQUUsRUFBQztBQUFHLGlCQUFPLE1BQUksR0FBRyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUc7QUFBQSxNQUFLO0FBQUEsSUFBQztBQUFDLFFBQUUsRUFBRTtBQUFBLEVBQU07QUFBQztBQUNuVixTQUFTLEdBQUcsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRTtBQUFVLFdBQU8sS0FBRyxFQUFFLE9BQU8sQ0FBQztBQUFFLE1BQUU7QUFBSSxJQUFFLGVBQWEsRUFBRSxpQkFBZTtBQUFFLFFBQUksTUFBSSxJQUFFLE9BQUssTUFBSSxNQUFJLEtBQUcsTUFBSSxNQUFJLElBQUUsZUFBYSxLQUFHLE1BQUksTUFBSSxLQUFHLEdBQUcsR0FBRSxDQUFDLElBQUUsTUFBSTtBQUFHLEtBQUcsR0FBRSxDQUFDO0FBQUM7QUFBQyxTQUFTLEdBQUcsR0FBRSxHQUFFO0FBQUMsUUFBSSxNQUFJLE9BQUssRUFBRSxPQUFLLEtBQUcsSUFBRSxLQUFHLElBQUUsSUFBRyxPQUFLLEdBQUUsT0FBSyxLQUFHLGVBQWEsS0FBRztBQUFXLE1BQUksSUFBRSxFQUFDO0FBQUcsTUFBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLFdBQU8sTUFBSSxHQUFHLEdBQUUsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLENBQUM7QUFBRTtBQUFDLFNBQVMsR0FBRyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUUsZUFBYyxJQUFFO0FBQUUsV0FBTyxNQUFJLElBQUUsRUFBRTtBQUFXLEtBQUcsR0FBRSxDQUFDO0FBQUM7QUFDalosU0FBUyxHQUFHLEdBQUUsR0FBRTtBQUFDLE1BQUksSUFBRTtBQUFFLFVBQU8sRUFBRSxLQUFHO0FBQUEsSUFBRSxLQUFLO0FBQUcsVUFBSSxJQUFFLEVBQUU7QUFBVSxVQUFJLElBQUUsRUFBRTtBQUFjLGVBQU8sTUFBSSxJQUFFLEVBQUU7QUFBVztBQUFBLElBQU0sS0FBSztBQUFHLFVBQUUsRUFBRTtBQUFVO0FBQUEsSUFBTTtBQUFRLFlBQU0sTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLEVBQUU7QUFBQyxXQUFPLEtBQUcsRUFBRSxPQUFPLENBQUM7QUFBRSxLQUFHLEdBQUUsQ0FBQztBQUFDO0FBQUMsSUFBSTtBQUNsTixLQUFHLFNBQVMsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFHLFNBQU8sRUFBRSxLQUFHLEVBQUUsa0JBQWdCLEVBQUUsZ0JBQWMsR0FBRyxRQUFRLE1BQUc7QUFBQSxPQUFPO0FBQUMsUUFBRyxPQUFLLEVBQUUsUUFBTSxNQUFJLE9BQUssRUFBRSxRQUFNLEtBQUssUUFBTyxLQUFHLE9BQUcsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLFNBQUcsT0FBSyxFQUFFLFFBQU0sVUFBUSxPQUFHO0FBQUEsRUFBRTtBQUFBLE1BQU0sTUFBRyxPQUFHLEtBQUcsT0FBSyxFQUFFLFFBQU0sWUFBVSxHQUFHLEdBQUUsSUFBRyxFQUFFLEtBQUs7QUFBRSxJQUFFLFFBQU07QUFBRSxVQUFPLEVBQUUsS0FBRztBQUFBLElBQUUsS0FBSztBQUFFLFVBQUksSUFBRSxFQUFFO0FBQUssU0FBRyxHQUFFLENBQUM7QUFBRSxVQUFFLEVBQUU7QUFBYSxVQUFJLElBQUUsR0FBRyxHQUFFLEVBQUUsT0FBTztBQUFFLFNBQUcsR0FBRSxDQUFDO0FBQUUsVUFBRSxHQUFHLE1BQUssR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsVUFBSXZCLEtBQUUsR0FBRTtBQUFHLFFBQUUsU0FBTztBQUFFLG1CQUFXLE9BQU8sS0FBRyxTQUFPLEtBQUcsZUFBYSxPQUFPLEVBQUUsVUFBUSxXQUFTLEVBQUUsWUFBVSxFQUFFLE1BQUksR0FBRSxFQUFFLGdCQUFjLE1BQUssRUFBRSxjQUMxZSxNQUFLLEdBQUcsQ0FBQyxLQUFHQSxLQUFFLE1BQUcsR0FBRyxDQUFDLEtBQUdBLEtBQUUsT0FBRyxFQUFFLGdCQUFjLFNBQU8sRUFBRSxTQUFPLFdBQVMsRUFBRSxRQUFNLEVBQUUsUUFBTSxNQUFLLEdBQUcsQ0FBQyxHQUFFLEVBQUUsVUFBUSxJQUFHLEVBQUUsWUFBVSxHQUFFLEVBQUUsa0JBQWdCLEdBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRSxHQUFHLE1BQUssR0FBRSxHQUFFLE1BQUdBLElBQUUsQ0FBQyxNQUFJLEVBQUUsTUFBSSxHQUFFLEtBQUdBLE1BQUcsR0FBRyxDQUFDLEdBQUUsR0FBRyxNQUFLLEdBQUUsR0FBRSxDQUFDLEdBQUUsSUFBRSxFQUFFO0FBQU8sYUFBTztBQUFBLElBQUUsS0FBSztBQUFHLFVBQUUsRUFBRTtBQUFZLFNBQUU7QUFBQyxXQUFHLEdBQUUsQ0FBQztBQUFFLFlBQUUsRUFBRTtBQUFhLFlBQUUsRUFBRTtBQUFNLFlBQUUsRUFBRSxFQUFFLFFBQVE7QUFBRSxVQUFFLE9BQUs7QUFBRSxZQUFFLEVBQUUsTUFBSSxHQUFHLENBQUM7QUFBRSxZQUFFLEdBQUcsR0FBRSxDQUFDO0FBQUUsZ0JBQU8sR0FBQztBQUFBLFVBQUUsS0FBSztBQUFFLGdCQUFFLEdBQUcsTUFBSyxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsa0JBQU07QUFBQSxVQUFFLEtBQUs7QUFBRSxnQkFBRSxHQUFHLE1BQUssR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFFLGtCQUFNO0FBQUEsVUFBRSxLQUFLO0FBQUcsZ0JBQUUsR0FBRyxNQUFLLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxrQkFBTTtBQUFBLFVBQUUsS0FBSztBQUFHLGdCQUFFLEdBQUcsTUFBSyxHQUFFLEdBQUUsR0FBRyxFQUFFLE1BQUssQ0FBQyxHQUFFLENBQUM7QUFBRSxrQkFBTTtBQUFBLFFBQUM7QUFBQyxjQUFNLE1BQU07QUFBQSxVQUFFO0FBQUEsVUFDdmdCO0FBQUEsVUFBRTtBQUFBLFFBQUUsQ0FBQztBQUFBLE1BQUU7QUFBQyxhQUFPO0FBQUEsSUFBRSxLQUFLO0FBQUUsYUFBTyxJQUFFLEVBQUUsTUFBSyxJQUFFLEVBQUUsY0FBYSxJQUFFLEVBQUUsZ0JBQWMsSUFBRSxJQUFFLEdBQUcsR0FBRSxDQUFDLEdBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPLElBQUUsRUFBRSxNQUFLLElBQUUsRUFBRSxjQUFhLElBQUUsRUFBRSxnQkFBYyxJQUFFLElBQUUsR0FBRyxHQU
25114FFLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLElBQUUsS0FBSztBQUFFLFNBQUU7QUFBQyxXQUFHLENBQUM7QUFBRSxZQUFHLFNBQU8sRUFBRSxPQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBRSxZQUFFLEVBQUU7QUFBYSxRQUFBQSxLQUFFLEVBQUU7QUFBYyxZQUFFQSxHQUFFO0FBQVEsV0FBRyxHQUFFLENBQUM7QUFBRSxXQUFHLEdBQUUsR0FBRSxNQUFLLENBQUM7QUFBRSxZQUFJLElBQUUsRUFBRTtBQUFjLFlBQUUsRUFBRTtBQUFRLFlBQUdBLEdBQUUsYUFBYSxLQUFHQSxLQUFFLEVBQUMsU0FBUSxHQUFFLGNBQWEsT0FBRyxPQUFNLEVBQUUsT0FBTSwyQkFBMEIsRUFBRSwyQkFBMEIsYUFBWSxFQUFFLFlBQVcsR0FBRSxFQUFFLFlBQVksWUFDaGZBLElBQUUsRUFBRSxnQkFBY0EsSUFBRSxFQUFFLFFBQU0sS0FBSTtBQUFDLGNBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUUsQ0FBQztBQUFFLGNBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUM7QUFBRSxnQkFBTTtBQUFBLFFBQUMsV0FBUyxNQUFJLEdBQUU7QUFBQyxjQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFFLENBQUM7QUFBRSxjQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUUsZ0JBQU07QUFBQSxRQUFDLE1BQU0sTUFBSSxLQUFHLEdBQUcsRUFBRSxVQUFVLGNBQWMsVUFBVSxHQUFFLEtBQUcsR0FBRSxJQUFFLE1BQUcsS0FBRyxNQUFLLElBQUUsR0FBRyxHQUFFLE1BQUssR0FBRSxDQUFDLEdBQUUsRUFBRSxRQUFNLEdBQUUsSUFBRyxHQUFFLFFBQU0sRUFBRSxRQUFNLEtBQUcsTUFBSyxJQUFFLEVBQUU7QUFBQSxhQUFZO0FBQUMsYUFBRTtBQUFHLGNBQUcsTUFBSSxHQUFFO0FBQUMsZ0JBQUUsR0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLGtCQUFNO0FBQUEsVUFBQztBQUFDLGFBQUcsR0FBRSxHQUFFLEdBQUUsQ0FBQztBQUFBLFFBQUM7QUFBQyxZQUFFLEVBQUU7QUFBQSxNQUFLO0FBQUMsYUFBTztBQUFBLElBQUUsS0FBSztBQUFFLGFBQU8sR0FBRyxDQUFDLEdBQUUsU0FBTyxLQUFHLEdBQUcsQ0FBQyxHQUFFLElBQUUsRUFBRSxNQUFLLElBQUUsRUFBRSxjQUFhQSxLQUFFLFNBQU8sSUFBRSxFQUFFLGdCQUFjLE1BQUssSUFBRSxFQUFFLFVBQVMsR0FBRyxHQUFFLENBQUMsSUFBRSxJQUFFLE9BQUssU0FBT0EsTUFBRyxHQUFHLEdBQUVBLEVBQUMsTUFBSSxFQUFFLFNBQU8sS0FDbmYsR0FBRyxHQUFFLENBQUMsR0FBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLENBQUMsR0FBRSxFQUFFO0FBQUEsSUFBTSxLQUFLO0FBQUUsYUFBTyxTQUFPLEtBQUcsR0FBRyxDQUFDLEdBQUU7QUFBQSxJQUFLLEtBQUs7QUFBRyxhQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxJQUFFLEtBQUs7QUFBRSxhQUFPLEdBQUcsR0FBRSxFQUFFLFVBQVUsYUFBYSxHQUFFLElBQUUsRUFBRSxjQUFhLFNBQU8sSUFBRSxFQUFFLFFBQU0sR0FBRyxHQUFFLE1BQUssR0FBRSxDQUFDLElBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxDQUFDLEdBQUUsRUFBRTtBQUFBLElBQU0sS0FBSztBQUFHLGFBQU8sSUFBRSxFQUFFLE1BQUssSUFBRSxFQUFFLGNBQWEsSUFBRSxFQUFFLGdCQUFjLElBQUUsSUFBRSxHQUFHLEdBQUUsQ0FBQyxHQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDO0FBQUEsSUFBRSxLQUFLO0FBQUUsYUFBTyxHQUFHLEdBQUUsR0FBRSxFQUFFLGNBQWEsQ0FBQyxHQUFFLEVBQUU7QUFBQSxJQUFNLEtBQUs7QUFBRSxhQUFPLEdBQUcsR0FBRSxHQUFFLEVBQUUsYUFBYSxVQUFTLENBQUMsR0FBRSxFQUFFO0FBQUEsSUFBTSxLQ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SxTQUFPLFNBQU87QUFBRyxVQUFNLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFBQSxFQUFFO0FBQUMsTUFBRyxNQUFJLEVBQUUsS0FBSTtBQUFDLFFBQUksSUFBRSxFQUFFO0FBQUssUUFBRyxHQUFHLENBQUMsRUFBRSxRQUFPLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBQSxFQUFDO0FBQUMsU0FBTztBQUFDO0FBQ3BXLFNBQVMsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUVBLElBQUUsR0FBRSxHQUFFRCxJQUFFO0FBQUMsTUFBRSxHQUFHLEdBQUUsR0FBRSxNQUFHLEdBQUUsR0FBRUMsSUFBRSxHQUFFLEdBQUVELEVBQUM7QUFBRSxJQUFFLFVBQVEsR0FBRyxJQUFJO0FBQUUsTUFBRSxFQUFFO0FBQVEsTUFBRTtBQUFJLE1BQUUsR0FBRyxDQUFDO0FBQUUsRUFBQUMsS0FBRSxHQUFHLEdBQUUsQ0FBQztBQUFFLEVBQUFBLEdBQUUsV0FBUyxXQUFTLEtBQUcsU0FBTyxJQUFFLElBQUU7QUFBSyxLQUFHLEdBQUVBLElBQUUsQ0FBQztBQUFFLElBQUUsUUFBUSxRQUFNO0FBQUUsS0FBRyxHQUFFLEdBQUUsQ0FBQztBQUFFLEtBQUcsR0FBRSxDQUFDO0FBQUUsU0FBTztBQUFDO0FBQUMsU0FBUyxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUU7QUFBQyxNQUFJLElBQUUsRUFBRSxTQUFRQSxLQUFFLEVBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQztBQUFFLE1BQUUsR0FBRyxDQUFDO0FBQUUsV0FBTyxFQUFFLFVBQVEsRUFBRSxVQUFRLElBQUUsRUFBRSxpQkFBZTtBQUFFLE1BQUUsR0FBR0EsSUFBRSxDQUFDO0FBQUUsSUFBRSxVQUFRLEVBQUMsU0FBUSxFQUFDO0FBQUUsTUFBRSxXQUFTLElBQUUsT0FBSztBQUFFLFdBQU8sTUFBSSxFQUFFLFdBQVM7QUFBRyxNQUFFLEdBQUcsR0FBRSxHQUFFLENBQUM7QUFBRSxXQUFPLE1BQUksR0FBRyxHQUFFLEdBQUUsR0FBRUEsRUFBQyxHQUFFLEdBQUcsR0FBRSxHQ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ENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsWUFBWSxDQUFDO0FBQUEsUUFDWCxZQUFZLHdCQUF1QjtBQUFBLE1BQzNDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsWUFBWSxDQUFDO0FBQUEsUUFDWCxZQUFZLHdCQUF1QjtBQUFBLE1BQzNDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQUFDO0FBQUEsUUFDWixhQUFhLHdCQUF1QjtBQUFBLE1BQzVDLENBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0QsYUFBYSxDQ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0FBQUEsRUFDQSxNQUFNO0FBRUosWUFBUSxJQUFJLGdEQUFnRDtBQUFBLEVBQzlEO0FBQ0Y7QUFHQSxzQkFBQTtBQUdBLE1BQU0rRix1QkFBc0I3QixRQUFNLFVBR2hDO0FBQUEsRUFDQSxZQUFZLE9BQXNDO0FBQ2hELFVBQU0sS0FBSztBQUNYLFNBQUssUUFBUSxFQUFFLFVBQVUsTUFBQTtBQUFBLEVBQzNCO0FBQUEsRUFFQSxPQUFPLHlCQUF5QixPQUFjO0FBQzVDLFdBQU8sRUFBRSxVQUFVLE1BQU0sTUFBQTtBQUFBLEVBQzNCO0FBQUEsRUFFQSxrQkFBa0IsT0FBYyxXQUE0QjtBQUMxRCxZQUFRLE1BQU0sd0JBQXdCLE9BQU8sU0FBUztBQUFBLEVBTXhEO0FBQUEsRUFFQSxTQUFTO0FBQ1AsUUFBSSxLQUFLLE1BQU0sVUFBVTtBQUN2QixtREFDRyxPQUFBLEVBQUksV0FBVSx5RUFDYixVQUFBZ0Isa0NBQUFBLEtBQUMsT0FBQSxFQUFJLFdBQVUsbUJBQ2IsVUFBQTtBQUFBLDhDQUFDLE9BQUEsRUFBSSxXQUFVLGlCQUFnQixVQUFBLE1BQUU7QUFBQSw4Q0FDaEMsTUFBQSxFQUFHLFdBQVUsaURBQWdELFVBQUEsa0NBRTlEO0FBQUEsOENBQ0MsS0FBQSxFQUFFLFdBQVUsNEJBQTJCLFVBQUEsOENBRXhDO0FBQUEsUUFDQXBFLGtDQUFBQTtBQUFBQSxVQUFDO0FBQUEsVUFBQTtBQUFBLFlBQ0MsU0FBUyxNQUFNLE9BQU8sU0FBUyxPQUFBO0FBQUEsWUFDL0IsV0FBVTtBQUFBLFlBQ1gsVUFBQTtBQUFBLFVBQUE7QUFBQSxRQUFBO0FBQUEsTUFFRCxFQUFBLENBQ0YsRUFBQSxDQUNGO0FBQUEsSUFFSjtB
25114QUVBLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDcEI7QUFDRjtBQUdBcUYsT0FBUyxXQUFXLFNBQVMsZUFBZSxNQUFNLENBQUUsRUFBRTtBQUFBLEVBQ3BEckYsa0NBQUFBLElBQUNvRCxRQUFNLFlBQU4sRUFDQyxnREFBQzZCLGdCQUFBLEVBQ0MsVUFBQWIsa0NBQUFBLEtBQUMscUJBQUEsRUFBb0IsUUFBUSxhQUMzQixVQUFBO0FBQUEsSUFBQXBFLGtDQUFBQSxJQUFDLFdBQUEsRUFBVTtBQUFBLElBRVY7QUFBQSxFQUFBLEVBQWlFLENBQ3BFLEVBQUEsQ0FDRixHQUNGO0FBQ0Y7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDYsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsMTE2LDEzMSwxMzIsMTMzXX0=
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.